<?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=Viegener</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=Viegener"/>
	<link rel="alternate" type="text/html" href="http://wiki.fhem.de/wiki/Spezial:Beitr%C3%A4ge/Viegener"/>
	<updated>2026-04-30T15:48:45Z</updated>
	<subtitle>Benutzerbeiträge</subtitle>
	<generator>MediaWiki 1.43.6</generator>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=TelegramBot&amp;diff=33204</id>
		<title>TelegramBot</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=TelegramBot&amp;diff=33204"/>
		<updated>2020-05-07T13:28:21Z</updated>

		<summary type="html">&lt;p&gt;Viegener: added setjoingroups empfehlung&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Infobox Modul&lt;br /&gt;
|ModPurpose=Senden und Empfangen von Nachrichten (Text und Fotos) mit dem freien Messagingdienst Telegram&lt;br /&gt;
|ModType=d&lt;br /&gt;
|ModForumArea=Unterstützende Dienste&lt;br /&gt;
|ModFTopic=38328&lt;br /&gt;
|ModTechName=[https://github.com/viegener/Telegram-fhem/blob/master/50_TelegramBot.pm 50_TelegramBot.pm]&lt;br /&gt;
|ModOwner=[[Benutzer:Viegener|Viegener]] ({{Link2FU|12772|Forum}} / [[Benutzer Diskussion:Viegener|Wiki]])}}&lt;br /&gt;
&lt;br /&gt;
Das [[TelegramBot]]-Modul ermöglicht das Senden und Empfangen von Nachrichten über den Telegram-instant messaging Dienst (https://telegram.org/).&lt;br /&gt;
Es entsteht eine Möglichkeit Benachrichtungen aus FHEM zu versenden, zum Beispiel Alarmmeldungen.&lt;br /&gt;
Ausserdem können auch Kommandos über Telegram an FHEM gesendet werden um Steuerungsbefehle in FHEM auszulösen.&lt;br /&gt;
&lt;br /&gt;
Das TelegramBot-Modul benötigt keine Zusatzsoftware auf dem FHEM-Server&amp;lt;ref&amp;gt;anders als die Vorläufer-Variante über das [[Telegram - old API method|Telegram-API]]&amp;lt;/ref&amp;gt;, sondern verwendet das [https://core.telegram.org/bots/api TelegramBot-API] über https-Aufrufe. Es muss jedoch das [http://www.fhemwiki.de/wiki/Raspberry_Pi#N.C3.BCtzliche_Zusatzpakete perl JSON modul] installiert sein.&lt;br /&gt;
&lt;br /&gt;
== Über Telegram Instant Messaging ==&lt;br /&gt;
Telegram-IDs und Versand/Empfang von Nachrichten sind kostenfrei.&lt;br /&gt;
Clients sind für gängige Smartphonesysteme erhältlich (iOS iPhone und Tablet, Android, Windows Phone) und&lt;br /&gt;
können auch aus dem WebBrowser verwendet werden.&lt;br /&gt;
Es gibt auch einen Kommandozeilen-Client für Linux, der die Grundlage dieses Moduls darstellt.&lt;br /&gt;
Mehrfachanmeldungen, auch parallel mit verschiedenen Geräten (z.B. Tablet und Smartphone), sind möglich.&lt;br /&gt;
Gruppenchats und Chats mit End-2-End-Verschlüsselung werden ebenfalls unterstützt.&lt;br /&gt;
&lt;br /&gt;
Für die Unterstützung von &#039;&#039;WhatsApp&#039;&#039; siehe Modul [[yowsup]].&lt;br /&gt;
&lt;br /&gt;
Unterstützt werden:&lt;br /&gt;
&lt;br /&gt;
* Versand von Textnachrichten&lt;br /&gt;
* Versand und Empfang von Bildern/Audio/etc&lt;br /&gt;
* Empfang von Textnachrichten von beliebigen Kontakten&lt;br /&gt;
* Kommandos in FHEM über Telegram-Nachrichten von aussen auslösen&lt;br /&gt;
* Ergebnisse der Kommandos zusenden lassen&lt;br /&gt;
&lt;br /&gt;
Eine detaillierte Beschreibung des Moduls ist im FHEM Forum und in der (englischen) Dokumentation zum Modul in der {{Link2CmdRef|Anker=TelegramBot}} und in diesem  {{Link2Forum|Topic=38328|LinkText=Diskussionsthread}} zu finden. Seit Oktober 2015 wird das Modul offiziell über FHEM-Update verteilt.&lt;br /&gt;
&lt;br /&gt;
Die jeweils aktuellste Entwicklungs-Version des Moduls ist in Github [https://github.com/viegener/Telegram-fhem/blob/master/50_TelegramBot.pm 50_TelegramBot.pm] verfügbar.&lt;br /&gt;
&lt;br /&gt;
== TelegramBot Devices in FHEM ==&lt;br /&gt;
=== Define ===&lt;br /&gt;
{{Randnotiz|RNTyp=Info|RNText=Achtung: Dieses Authtoken ist die einzige Authentifizierung für den Bot und sollte deshalb nicht aus der Hand gegeben werden. Die verwendeten Urls sind deshalb auch in den Log-Files nicht enthalten, da diese das Authtoken in Klartext enthalten. Auch im Forum sollte dieses Token nicht aufgenommen werden.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Für die Anlage eines TelegramBot Devices in FHEM ist ein Authtoken erforderlich. Dieses Token wird über Anlegen eines neuen Bots im [https://core.telegram.org/bots#6-botfather BotFather] erzeugt (siehe dazu unten). Dafür muss der BotFather mit einem Telegram-Client kontaktiert werden. Dort mit dem Telegram-Befehl &amp;lt;code&amp;gt;/newbot&amp;lt;/code&amp;gt; einen neuen Bot anlegen und mit einem Namen versehen. Hinweis: Die Namen für Bots müssen auf &amp;quot;Bot&amp;quot; enden.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Das Anlegen eines TelegramBot devices erfolgt durch die Angabe dieses Tokens:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;define &amp;amp;lt;name&amp;amp;gt; TelegramBot  &amp;amp;lt;token&amp;amp;gt; &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Beispiel: &amp;lt;code&amp;gt;define myTelegramBot TelegramBot 110201543:AAHdqTcvCH1vGWJxfSeofSAs0K5PALDsaw&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Das Empfangen von Nachrichten (polling) erfordert die Einstellung des Attributes&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;code&amp;gt;pollingTimeout&amp;lt;/code&amp;gt; &#039;&#039;&#039;auf einen Wert der grösser als Null ist. Beim Wert 0 oder ohne Setzen des Attributes findet kein Polling und damit auch kein Empfang statt.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Beispiel: &amp;lt;code&amp;gt;attr myTelegramBot pollingTimeout 120&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Der TelegramBot kann erst dann Nachrichten an einen telegram user schicken, wenn dieser zuerst an den telegram bot eine Nachricht gesendet hat.&#039;&#039;&#039;&lt;br /&gt;
Dafür muss man in seinem Telegram-Client den Kontakt @botName suchen und dann eine Nachricht daran versenden.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Der TelegramBot kann keine Nachrichten an andere Bots senden. Ein anderer Bot erhält die Nachrichten auch nicht wenn er in einer Gruppe enthalten ist.&#039;&#039;&#039; Dies ist eine Beschränkung in der Bot-Funktion bei Telegram. Das Versenden an einen anderen Bot (wenn man den Kontakt manuell hinzugefügt hat) führt zur Fehlermeldung&lt;br /&gt;
&amp;lt;code&amp;gt;sentMsgResult - Callback returned error :Bad Request: chat not found:&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Randnotiz|RNTyp=Info|RNText=TelegramBot setzt eine aktuelle Version von FHEM voraus, insbesondere Versionen weit vor der Umstellung auf 5.7 (also vor Herbst 2015) können mit einem TelegramBot-Modul nicht funktionieren, da insbesondere das HTTPSRV-Modul dann veraltet ist. Am besten auch den TelegramBot über den offiziellen Update mit dem Rest von FHEM installieren/aktualisieren.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Registrierung eines neuen Bot ===&lt;br /&gt;
Zur Registrierung wird ein funktionierender Telegram-Client (egal ob Web, App oder Programm)benötigt. Hier wird ein Chat zum BotFather gestartet und der Befehl /newbot gesendet. Nun fragt der BotFather die benötigten Angaben ab und liefert am Ende des Dialogs die Informationen für den neuen Bot.&lt;br /&gt;
Hier ein Beispiel, wie so ein Chat aussehen könnte:&lt;br /&gt;
&amp;lt;pre&amp;gt;Client:&lt;br /&gt;
/newbot&lt;br /&gt;
----------------&lt;br /&gt;
BotFather:&lt;br /&gt;
Alright, a new bot. How are we going to call it? Please choose a name for your bot.&lt;br /&gt;
----------------&lt;br /&gt;
Client:&lt;br /&gt;
Mein Name&lt;br /&gt;
----------------&lt;br /&gt;
BotFather:&lt;br /&gt;
Good. Now let&#039;s choose a username for your bot. It must end in `bot`. Like this, for example: TetrisBot or tetris_bot.&lt;br /&gt;
----------------&lt;br /&gt;
Client:&lt;br /&gt;
fhem_bot&lt;br /&gt;
----------------&lt;br /&gt;
BotFather:&lt;br /&gt;
Sorry, this username is already taken. Think of something different.&lt;br /&gt;
----------------&lt;br /&gt;
Client:&lt;br /&gt;
fhem1234_bot&lt;br /&gt;
----------------&lt;br /&gt;
BotFather:&lt;br /&gt;
Done! Congratulations on your new bot.&lt;br /&gt;
You will find it at telegram.me/fhem1234_bot.&lt;br /&gt;
You can now add a description, about section and profile picture for your bot, see /help for a list of commands.&lt;br /&gt;
----------------&lt;br /&gt;
Use this token to access the HTTP API:&lt;br /&gt;
1234567890:AbCdefgHIJklmnOPQRst-uvwxyz&lt;br /&gt;
&lt;br /&gt;
For a description of the Bot API, see this page: https://core.telegram.org/bots/api&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
{{Randnotiz|RNTyp=Info|RNText=Achtung: Da Bots generell für alle Benutzer sichtbar sind und es gelegentlich Problem mit spammern gibt, die fremde bots auch in Gruppen hinzufügen, ist es empfehlenswert die Einstellung /setjoingroups auf false zu setzen, wenn die Zugehörigkeit zu Gruppen (und der Empfang von Meldungen aus gruppen) nicht notwendig ist&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Um einen Chat an einen &amp;quot;Contact&amp;quot; versenden zu können, muss zuerst in Contacts (bei Readings) ein Kontakt auftauchen. Wenn man sich zum allerersten Mal bei Telegram angemeldet hat, gibt es noch keinen Chat mit irgendjemanden. Man muss sich zuerstmal selbst eine Nachricht im Smartphone zusenden, dann taucht unter Readings der Eintrag Contacts auf. Erst dann kann man eine Nachricht mit @msgPeerId (das ist Ziffernfolge des Contacts ) oder mit @msgPeer (das ist der Name nach dem Doppelpunkt) vom TelegramBot auf sein Smartphone senden.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Tipps ==&lt;br /&gt;
&lt;br /&gt;
=== Privacyeinstellungen ===&lt;br /&gt;
&lt;br /&gt;
Damit der TelegramBot auch Meldungen in Gruppen sieht, müssen über den BotFather die Privacy-Einstellungen geändert werden.&amp;lt;br&amp;gt;Beispielchat:&amp;lt;pre&amp;gt;Client:&lt;br /&gt;
/setprivacy&lt;br /&gt;
----------------&lt;br /&gt;
BotFather:&lt;br /&gt;
Choose a bot to change group messages settings.&lt;br /&gt;
----------------&lt;br /&gt;
Client:&lt;br /&gt;
@fhem1234_bot&lt;br /&gt;
----------------&lt;br /&gt;
BotFather:&lt;br /&gt;
&#039;Enable&#039; - your bot will only receive messages that either start with the &#039;/&#039; symbol or mention the bot by username.&lt;br /&gt;
&#039;Disable&#039; - your bot will receive all messages that people send to groups.&lt;br /&gt;
Current status is: ENABLED&lt;br /&gt;
----------------&lt;br /&gt;
Client:&lt;br /&gt;
Disable&lt;br /&gt;
----------------&lt;br /&gt;
BotFather:&lt;br /&gt;
Success! The new status is: DISABLED. /help&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Siehe auch Info zu /setjoingroups oben.&lt;br /&gt;
&lt;br /&gt;
=== Kontakte ===&lt;br /&gt;
&lt;br /&gt;
Der Bot merkt sich die bereits bekannten Kontakte im Reading &amp;lt;code&amp;gt;Contacts&amp;lt;/code&amp;gt;. Dabei werden die einzelnen Kontakte jeweils als 3-teilige Einträge gespeichert - bestehend aus UserID, Vor- und Nachname des Benutzers (mit _ verbunden) und dem Username (mit vorangestelltem @).&lt;br /&gt;
&lt;br /&gt;
Beispiel: &amp;lt;code&amp;gt;123456:Ralf_Mustermann:@ralf&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Verschiedene Einträge werden durch Leerzeichen getrennt.&lt;br /&gt;
&lt;br /&gt;
Man kann die Kontakte auch manuell überschreiben (z.B. wenn das Reading fehlerhaft oder verloren sein sollte). Dazu gibt es den Set-Befehl &amp;lt;code&amp;gt;replaceContacts&amp;lt;/code&amp;gt;. Dieser nimmt die Kontakte ebenfalls in der gleichen Form wie oben beschrieben entgegen.&lt;br /&gt;
&lt;br /&gt;
Die Kontaktliste wird ansonsten nur durch den Empfang von Nachrichten erweitert, da es im TelegramBot-API keine Möglichkeit gibt Kontaktdaten von Telegram abzufragen (siehe auch pollingTimeout)&lt;br /&gt;
&lt;br /&gt;
=== Reset ===&lt;br /&gt;
&lt;br /&gt;
Es ist möglich den Bot im laufenden Betrieb zurückzusetzen (Set-Befehl &amp;lt;code&amp;gt;reset&amp;lt;/code&amp;gt;). Dabei werden noch nicht abgeschlossene Übetragungen entfernt und die internen Zustände des Devices zurückgesetzt.&lt;br /&gt;
&lt;br /&gt;
=== Gruppen ===&lt;br /&gt;
&lt;br /&gt;
Um eine Nachricht von FHEM an eine Gruppe zu senden, muss der BOT in die Gruppe aufgenommen werden. Nach dem Senden einer Nachricht an die Gruppe kann im Modul die Gruppen-ID ermittelt werden und zum Senden von Nachrichten verwendet werden. Die Gruppen-ID ist eine negative Zahl. Wenn die Privacy-Einstellungen nicht auf &#039;Disabled&#039; gesetzt wurden, muss die Nachricht mit einem Slash (/) beginnen.&lt;br /&gt;
&lt;br /&gt;
==== Supergroups / Supergruppen ====&lt;br /&gt;
&lt;br /&gt;
Auch die neuen Supergruppen werden mit dem Bot unterstützt, es ist allerdings zu beachten, dass bei der Umwandlung einer Gruppe in eine Supergruppe eine neue ID in den Kontakten von Telegram vergeben wird. Wenn man also wie empfohlen IDs zur Identifikation von Benutzern einsetzt, muss entsprechend angepasst werden.&lt;br /&gt;
&lt;br /&gt;
==== Fehlermeldungen bei veralteter SSL-Version ====&lt;br /&gt;
Telegram nutzt seit Februar 2020 eine neue Verschlüsselung und dies ruft bei veralteter Installation eine Fehlermeldung hervor:&lt;br /&gt;
&lt;br /&gt;
 NonBlockingGet: returned &amp;lt;hidden&amp;gt;: Can&#039;t connect(2) to &amp;lt;nowiki&amp;gt;https://api.telegram.org:443&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dies deutet auf eine veraltete SSL-Version hin, siehe dazu die Forumsdiskussion ab [https://forum.fhem.de/index.php/topic,38328.msg1021642.html#msg1021642 diesem Eintrag]. Hilfreich hat sich ein upgrade der SSL-Module erwiesen. Zuerst muss uU ein Modul installiert werden&lt;br /&gt;
 sudo apt-get install libssl-dev&lt;br /&gt;
und danach in zwei Schritten&lt;br /&gt;
 sudo cpan &amp;lt;enter&amp;gt;&lt;br /&gt;
 upgrade net::SSLeay&amp;lt;enter&amp;gt;&lt;br /&gt;
Es ist bei Jessie zwingend ein Upgrade von &lt;br /&gt;
 IO::Socket::SSL 2.002 -&amp;gt; 2.066 &lt;br /&gt;
notwendig. Es wird darauf hingewiesen, dass idealerweise nicht einzelne Module, sondern das gesamte OS sowie alle Perlmodule auf den neuesten Stand gebracht werden sollten.&lt;br /&gt;
&lt;br /&gt;
== Beispielszenarien ==&lt;br /&gt;
&lt;br /&gt;
=== Benachrichtigungen über Ereignisse ===&lt;br /&gt;
&lt;br /&gt;
Das einfachste Szenario für die Integration von Messaging-Diensten mit FHEM ist zur Benachrichtigung über Ereignisse. Diese Funktion kann zum Beispiel verwendet werden, um über einen erfolgten Neustart von FHEM zu informieren:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;define notify_fhem_reload notify global:INITIALIZED set myTelegramBot message fhem newly started - just now !&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In diesem Beispiel wird der Nachrichtentext &amp;quot;fhem newly started - just now !&amp;quot; an den als default eingestellten Kontakt (Attribut: defaultPeer) gesendet, sobald FHEM neu gestartet wurde. Natürlich kann man auch beliebige andere Benachrichtigungen einführen.&lt;br /&gt;
&lt;br /&gt;
Nebenbemerkung: hier ist eine erweiterte Strukturierung evt. empfehlenswert: statt jede Notify-Syntax o.ä. direkt auf TelegramBot-Spezifika gehen zu lassen, kann man sich eine Helper-Funktion (zur Vermittlung all solcher &amp;quot;Alarmtexte&amp;quot;) bauen ([[99_myUtils_anlegen]]), die entsprechende Alarm-Meldungen dann nur intern auf (u.a.) einen Messaging-Service wie (momentan!) Telegram schickt.&lt;br /&gt;
&lt;br /&gt;
=== Versand von Bildern ===&lt;br /&gt;
&lt;br /&gt;
Es ist auch möglich Bilder auf dem FHEM-Server, die zum Beispiel von einer Kamera oder einem Wettermodul stammen über Telegram zu versenden. So wäre es z.B. möglich jeweils morgens die aktuelle Wetterkarte zu erhalten.&lt;br /&gt;
&lt;br /&gt;
ACHTUNG: TelegramBot verwendet das HTTPUtils-Modul zur Kommunikation mit dem TelegramBot-API. Erst mit der Version, die seit 22.10.2015&lt;br /&gt;
([r9576] HttpUtils.pm: Async write for POST Requests {{Link2Forum|Topic=41583|LinkText=FHEM-Forum}}) verteilt wird, erlaubt auch den Transfer grösserer Bilder. Die Grenze liegt ansonsten bei ca. 14kb auf Raspberries (Plattformspezifische Grenze).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;define notify_fhem_reload notify wetter:report set myTelegramBot sendImage /opt/fhem/wetter.jpg&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Bei Erreichen des entsprechenden Status am Wetter-Modul wird ein Image über Telegram versendet. Hier sind lokale Pfade (relativ zu fhem) oder absolute Pfade wie oben möglich.&lt;br /&gt;
&lt;br /&gt;
=== Versand von SVG-Plots ===&lt;br /&gt;
&lt;br /&gt;
SVG-Plots können mit dem Befehl&lt;br /&gt;
&amp;lt;code&amp;gt;cmdSend [ @&amp;lt;peer1&amp;gt; ... @&amp;lt;peerN&amp;gt; ] &amp;lt;fhem command&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
verschickt werden.&lt;br /&gt;
&lt;br /&gt;
Das angegebene FHEM-Kommando wird ausgeführt und das Ergebnis an die angegebenen Peers bzw. den Standard-Peer verschickt.&lt;br /&gt;
&lt;br /&gt;
Mit dem folgenden Befehl wird der SVG-Plot SVG_FileLog_Aussen an den Standard-Peer geschickt:&lt;br /&gt;
&amp;lt;code&amp;gt;set myTelegramBot cmdSend { plotAsPng(&#039;SVG_FileLog_Aussen&#039;) }&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nach &amp;lt;code&amp;gt;define cmd_sendTelegramSVG cmdalias TGSVG .* AS set myTelegramBot cmdSend { plotAsPng(&amp;quot;$EVENT&amp;quot;) }&amp;lt;/code&amp;gt;&lt;br /&gt;
kann man mit einem kurzen&lt;br /&gt;
&amp;lt;code&amp;gt;TGSVG SVG_Garten&amp;lt;/code&amp;gt;&lt;br /&gt;
ein beliebiges SVG über die Kommandozeile per Telegram versenden.&lt;br /&gt;
&lt;br /&gt;
Um das SVG nun noch mit einem Text zu versehen, muss eine Textnachricht dazu gesendet werden, was sich am einfachsten durch das Ausführen eines FHEM-Befehls auf Perl-Ebene realisieren lässt:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;{fhem &amp;quot;set myTelegramBot message Bildbeschreibung;; set myTelegramBot cmdSend { plotAsPng(&#039;mein_SVG&#039;) }&amp;quot; }&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Hinweis:&#039;&#039;&#039; früher wurde zum Verschicken von Plots auch die interne Funktion TelegramBot_ExecuteCommand verwendet; mit dem Update Ende Februar 2017 hat diese Funktion einen zusätzlichen Parameter erhalten und lautet nun&lt;br /&gt;
&amp;lt;code&amp;gt;TelegramBot_ExecuteCommand($defs{&amp;quot;myTelegramBot&amp;quot;}, meine_ZielID, undef, &#039;{plotAsPng(&amp;quot;mein_SVG&amp;quot;)}&#039;);&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Voraussetzungen für den Versand von SVG-Plots ====&lt;br /&gt;
Es muss das Modul libimage-librsvg-perl installiert sein:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;sudo apt-get install libimage-librsvg-perl&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Evtl. sind weitere Module erforderlich:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;sudo apt-get install libgd-graph-perl&lt;br /&gt;
&lt;br /&gt;
sudo apt-get install libgd-text-perl&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Empfang von Bildern oder ähnlichem ===&lt;br /&gt;
&lt;br /&gt;
Beim Empfang von Bildern wird zuerst nur eine ID vom Telegram-Server empfangen, diese befindet sich im Reading &amp;lt;code&amp;gt;msgFileId&amp;lt;/code&amp;gt; angelegt (&amp;lt;code&amp;gt;123456:xxxxxxxxxxxxxxxxxxxxxxx-xxxxxxxx&amp;lt;/code&amp;gt;) und im Reading &amp;lt;code&amp;gt;msgText&amp;lt;/code&amp;gt; steht dann so etwas wie&lt;br /&gt;
&amp;lt;code&amp;gt;received photo # Size: 107701&amp;lt;/code&amp;gt;&lt;br /&gt;
	&lt;br /&gt;
Über das Get-Kommando &amp;lt;code&amp;gt;urlForFile&amp;lt;/code&amp;gt; mit der ID aus dem msgFileId Reading lässt sich dann daraus ein URL ableiten, der dann zur eigentlichen Datei führt:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;https://api.telegram.org/file/bot123456:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx/photo/file_25.jpg&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Versand von Emojis (Smileys) ===&lt;br /&gt;
&lt;br /&gt;
Es ist auch möglich Emojis mit den (Text-)Nachrichten zu versenden. Die entsprechenden (Unicode-)Zeichen werden einfach direkt mit in den Text der Nachricht aufgenommen. Um das zu vereinfachen kann man das einfach per Copy und Paste von dieser Seite&lt;br /&gt;
&lt;br /&gt;
http://apps.timwhitlock.info/emoji/tables/unicode (Spalte &amp;quot;Native&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
übernehmen und mit der Nachricht verschicken.&lt;br /&gt;
&lt;br /&gt;
Die Emojis können auch empfangen werden und werden so auch in FHEM / FHEMWeb angezeigt. Plattformspezifische (z.B. von iOS oder Android) Emojis werden dabei nicht unterstützt (gerade mit iOS sind viele neue farbige Emojis hinzugekommen, die wohl leider nur auf Apple-devices funktionieren).&lt;br /&gt;
&lt;br /&gt;
=== Kommandos auslösen ===&lt;br /&gt;
&lt;br /&gt;
Ein wichtiges Szenario ist die Möglichkeit Kommandos in FHEM ausführen zu können, ohne einen Zugang durch die Firewall einrichten zu müssen. Dazu ist die Definition eines Schlüsselwortes (Attribut: &amp;quot;cmdKeyword&amp;quot;)erforderlich, mit dem man die Nachrichten beginnen muss, damit der TelegramBot die Kommandos erkennt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;attr myTelegramBot cmdKeyword doit&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Somit kann man dann durch Nachrichten die mit &amp;quot;doit&amp;quot; beginnen Kommandos an FHEM senden, die ähnlich wie im Kommandoeingabefeld von FHEMweb dann von FHEM ausgeführt werden. Das Ergebnis der Ausführung wird zurück an den Sender (und an den definierten defaultPeer) geschickt.&lt;br /&gt;
&lt;br /&gt;
Somit können nicht nur Aktionen angestossen werden, sondern auch Infos abgefragt werden.&lt;br /&gt;
&lt;br /&gt;
Beispiele&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;doit set schalter on&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;doit list telegrambot&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Randnotiz|RNTyp=Warn|RNText=Achtung: Bei den Kommandos sollten man unbedingt das Attribut &amp;quot;cmdRestrictedPeer&amp;quot; setzen, damit nicht jeder Kommandos auf dem FHEM-Server ausführen kann. Dazu sollten die BenutzerIDs der erlaubten Benutzer (durch Leerzeichen getrennt angeben). Da Benutzernamen selber vergeben werden und nicht unbedingt eindeutig sind, sollten hier auch NUR BenutzerIDs verwendet werden.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== Favoriten für Kommandos anlegen ====&lt;br /&gt;
Grundidee bei den Favoriten ist, dass man lange Befehle, die man häufig braucht auf &amp;quot;Kurzwahl&amp;quot; legt.&lt;br /&gt;
&lt;br /&gt;
Beispiel-Kommandos wie z.B. &amp;lt;code&amp;gt;set TYPE=ROLLLADEN pos 100&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;set TYPE=ROLLLADEN pos 0&amp;lt;/code&amp;gt;, die man immer wieder braucht. Um nicht jedes mal dieses Kommando eintippen zu müssen auf dem Smartphone, kann man auch dafür Favoriten anlegen.&lt;br /&gt;
&lt;br /&gt;
Dazu gibt man erst mal die beiden Kommandos getrennt durch Semikolon im Attribut favorites an:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;attr myTelegramBot favorites set TYPE=ROLLLADEN pos 100;set TYPE=ROLLLADEN pos 0&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Um die Favorites jetzt ausführen zu können braucht man noch ein Schlüsselwort dafür.&lt;br /&gt;
Nehmen wir mal an man möchte die Favoriten mit &amp;lt;code&amp;gt;/short&amp;lt;/code&amp;gt; ausführen können. Dazu muss dann das Attribut &amp;quot;cmdFavorites&amp;quot; setzen&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;attr myTelegramBot cmdFavorites /short&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wenn man nun im Telegram Client&lt;br /&gt;
&amp;lt;code&amp;gt;/short 1&amp;lt;/code&amp;gt; an den Bot schickt führt der Bot den ersten Favoriten aus und das Ergebnis der Ausführung wird zurückgeschickt.&lt;br /&gt;
&lt;br /&gt;
Ausserdem kann man im Telegram Client&lt;br /&gt;
&amp;lt;code&amp;gt;/short&amp;lt;/code&amp;gt; an den Bot schicken, dann antwortet der Bot mit&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Favorites&lt;br /&gt;
&lt;br /&gt;
/short1 = set TYPE=ROLLLADEN pos 100&lt;br /&gt;
&lt;br /&gt;
/short2 = set TYPE=ROLLLADEN pos 0&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Antworten werden als Schaltflächen dargestellt (Telegram inline Keyboard) und können am Mobile-Client direkt angeklickt werden um sie auszuführen.&lt;br /&gt;
Um die Beschriftung der Schaltflächen zu optimieren, können die Befehle im Attribut favorites mit Beschreibungen versehen werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;/[Rolllaeden zu ]=set TYPE=ROLLLADEN pos 100;/[Rolllaeden auf]=set TYPE=ROLLLADEN pos 0&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nun antwortet der Bot auf das Schlüsselwort für die Favoriten mit:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Favorites&lt;br /&gt;
&lt;br /&gt;
/short1 = Rolllaeden zu&lt;br /&gt;
&lt;br /&gt;
/short2 = Rolllaeden auf&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Nützliche Kombinationen mit weiteren Modulen ===&lt;br /&gt;
&lt;br /&gt;
==== msgConfig ====&lt;br /&gt;
{{Link2CmdRef|Anker=msgConfig|Lang=de|Label=msgConfig}}&lt;br /&gt;
&lt;br /&gt;
{{Link2CmdRef|Anker=msgDialog|Lang=de|Label=msgDialog}}&lt;br /&gt;
&lt;br /&gt;
==== msgDialog ====&lt;br /&gt;
[[MsgDialog]]&lt;br /&gt;
&lt;br /&gt;
==== MSG ====&lt;br /&gt;
[[Msg]]&lt;br /&gt;
&lt;br /&gt;
{{Link2CmdRef|Anker=MSG|Lang=en|Label=MSG}}&lt;br /&gt;
&lt;br /&gt;
{{Link2Forum|Topic=39983|LinkText=Forum-Beitrag}}&lt;br /&gt;
&lt;br /&gt;
==== PostMe ====&lt;br /&gt;
[[Modul PostMe#Steuerung per Telegram|PostMe]]&lt;br /&gt;
&lt;br /&gt;
{{Link2CmdRef|Anker=PostMe|Lang=de|Label=PostMe}}&lt;br /&gt;
&lt;br /&gt;
{{Link2CmdRef|Anker=TBot_List|Lang=en|Label=TBot_List}}&lt;br /&gt;
&lt;br /&gt;
==== ROOMATE ====&lt;br /&gt;
{{Link2CmdRef|Anker=ROOMMATE|Lang=de|Label=ROOMMATE}}&lt;br /&gt;
&lt;br /&gt;
==== MAX ====&lt;br /&gt;
[[MAX#Telegram-Benachrichtigung bei dauergeöffnetem Fenster|Dauer-offenes Fenster melden]]&lt;br /&gt;
&lt;br /&gt;
==== SSCAM - Steuerung von Kameras in Synology Surveillance Station - Schnappschüsse mit TelegramBot versenden ====&lt;br /&gt;
[[SSCAM - Steuerung von Kameras in Synology Surveillance Station#Schnappschüsse mit TelegramBot versenden|Schnappschüsse mit TelegramBot versenden]]&lt;br /&gt;
&lt;br /&gt;
==== PRESENCE ====&lt;br /&gt;
[[PRESENCE#Hinweis zur Benutzung / Fehlerhandling|Hinweis zur Benutzung / Fehlerhandling]]&lt;br /&gt;
&lt;br /&gt;
==== AMAD ====&lt;br /&gt;
[[AMAD]]&lt;br /&gt;
&lt;br /&gt;
==== TALKTOME &amp;amp; TALKTOUSER ====&lt;br /&gt;
[[TALKTOME &amp;amp; TALKTOUSER - Sprachverarbeitung für Nutzerinteraktionen#Beleuchtungssteuerung mit Telegram|Beleuchtungssteuerung mit Telegram]]&lt;br /&gt;
&lt;br /&gt;
==== Staumelder ====&lt;br /&gt;
[[Staumelder#telegram|Staumelder]]&lt;br /&gt;
&lt;br /&gt;
==== Grafana ====&lt;br /&gt;
[[Grafana#Speichern und Senden von Grafiken (zB_mit_Telegram)|Grafana-Plots versenden]]&lt;br /&gt;
&lt;br /&gt;
==== Talk2Fhem ====&lt;br /&gt;
[[Talk2Fhem#Messenger Telegram|Talk2Fhem]]&lt;br /&gt;
&lt;br /&gt;
==== Hausüberwachung ====&lt;br /&gt;
[[Hausüberwachung#Nachrichten aus dem Haus|Nachrichten aus dem Haus]]&lt;br /&gt;
&lt;br /&gt;
==== Gäste-WLAN der Fritzbox auswerten und Login per Telegram senden ====&lt;br /&gt;
&lt;br /&gt;
{{Link2Forum|Topic=100119|Message=936495|LinkText=Forum-Beitrag}}&lt;br /&gt;
&lt;br /&gt;
==== Batterieüberwachung nur einmal täglich ====&lt;br /&gt;
{{Link2Forum|Topic=99219|Message=926652|LinkText=Forum-Beitrag}}&lt;br /&gt;
&lt;br /&gt;
==== BOTVAC ====&lt;br /&gt;
[[BOTVAC#MAPS|Saugroboter-Karten]]&lt;br /&gt;
&lt;br /&gt;
==== Unifi Voucher bereistellen über msgDialog ====&lt;br /&gt;
[[Unifi#über Telegram|Unifi Voucher]]&lt;br /&gt;
&lt;br /&gt;
[[Unifi#Erkennung neuer clients|Erkennung unbekannter Clients]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
* Github Repository für die Telegram-FHEM Entwicklung: https://github.com/viegener/Telegram-fhem&lt;br /&gt;
* Infos zum Telegram BotFather: https://core.telegram.org/bots#6-botfather&lt;br /&gt;
&lt;br /&gt;
* Source code für das 50_TelegramBot.pm-Modul: https://github.com/viegener/Telegram-fhem/blob/master/50_TelegramBot.pm&lt;br /&gt;
&lt;br /&gt;
* Forum-Thread in dem das Modul vorgestellt wurde {{Link2Forum|Topic=38328|LinkText=FHEM-Forum}}&lt;br /&gt;
* Telegram messaging system https://telegram.org/&lt;br /&gt;
* TelegramBot API https://core.telegram.org/bots/api&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;br /&gt;
[[Kategorie:Telegram]]&lt;/div&gt;</summary>
		<author><name>Viegener</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=TelegramBot&amp;diff=30125</id>
		<title>TelegramBot</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=TelegramBot&amp;diff=30125"/>
		<updated>2019-04-09T14:17:38Z</updated>

		<summary type="html">&lt;p&gt;Viegener: Added remark on bot to bot not working&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Infobox Modul&lt;br /&gt;
|ModPurpose=Senden und Empfangen von Nachrichten (Text und Fotos) mit dem freien Messagingdienst Telegram&lt;br /&gt;
|ModType=d&lt;br /&gt;
|ModForumArea=Unterstützende Dienste&lt;br /&gt;
|ModFTopic=38328&lt;br /&gt;
|ModTechName=[https://github.com/viegener/Telegram-fhem/blob/master/50_TelegramBot.pm 50_TelegramBot.pm]&lt;br /&gt;
|ModOwner=[[Benutzer:Viegener|Viegener]] ({{Link2FU|12772|Forum}} / [[Benutzer Diskussion:Viegener|Wiki]])}}&lt;br /&gt;
&lt;br /&gt;
Das [[TelegramBot]]-Modul ermöglicht das Senden und Empfangen von Nachrichten über den Telegram-instant messaging Dienst (https://telegram.org/). &lt;br /&gt;
Es entsteht eine Möglichkeit Benachrichtungen aus FHEM zu versenden, zum Beispiel Alarmmeldungen.&lt;br /&gt;
Ausserdem können auch Kommandos über Telegram an FHEM gesendet werden um Steuerungsbefehle in FHEM auszulösen.&lt;br /&gt;
&lt;br /&gt;
Das TelegramBot-Modul benötigt keine Zusatzsoftware auf dem FHEM-Server (anders als die Variante [[Telegram]]), sondern verwendet das [https://core.telegram.org/bots/api TelegramBot-API] über https-Aufrufe. Es muss jedoch das [http://www.fhemwiki.de/wiki/Raspberry_Pi#N.C3.BCtzliche_Zusatzpakete perl JSON modul] installiert sein. &lt;br /&gt;
&lt;br /&gt;
== Über Telegram Instant Messaging ==&lt;br /&gt;
Telegram-IDs und Versand/Empfang von Nachrichten sind kostenfrei. &lt;br /&gt;
Clients sind für gängige Smartphonesysteme erhältlich (iOS iPhone und Tablet, Android, Windows Phone) und &lt;br /&gt;
können auch aus dem WebBrowser verwendet werden. &lt;br /&gt;
Es gibt auch einen Kommandozeilen-Client für Linux, der die Grundlage dieses Moduls darstellt. &lt;br /&gt;
Mehrfachanmeldungen, auch parallel mit verschiedenen Geräten (z.B. Tablet und Smartphone), sind möglich.&lt;br /&gt;
Gruppenchats und Chats mit End-2-End-Verschlüsselung werden ebenfalls unterstützt.&lt;br /&gt;
&lt;br /&gt;
Für die Unterstützung von &#039;&#039;WhatsApp&#039;&#039; siehe Modul [[yowsup]].&lt;br /&gt;
&lt;br /&gt;
== Features ==&lt;br /&gt;
Unterstützt werden:&lt;br /&gt;
&lt;br /&gt;
* Versand von Textnachrichten &lt;br /&gt;
* Versand und Empfang von Bildern/Audio/etc &lt;br /&gt;
* Empfang von Textnachrichten von beliebigen Kontakten&lt;br /&gt;
* Kommandos in FHEM über Telegram-Nachrichten von aussen auslösen&lt;br /&gt;
* Ergebnisse der Kommandos zusenden lassen&lt;br /&gt;
&lt;br /&gt;
Eine detaillierte Beschreibung des Moduls ist im FHEM Forum und in der (englischen) Dokumentation zum Modul in der {{Link2CmdRef|Anker=TelegramBot}} und in diesem  {{Link2Forum|Topic=38328|LinkText=Diskussionsthread}} zu finden. Seit Oktober 2015 wird das Modul offiziell über FHEM-Update verteilt.&lt;br /&gt;
&lt;br /&gt;
Die jeweils aktuellste Entwicklungs-Version des Moduls ist in Github [https://github.com/viegener/Telegram-fhem/blob/master/50_TelegramBot.pm 50_TelegramBot.pm] verfügbar.&lt;br /&gt;
&lt;br /&gt;
== Hinweise zum Betrieb mit FHEM ==&lt;br /&gt;
{{Randnotiz|RNTyp=Info|RNText=Achtung: Dieses Authtoken ist die einzige Authentifizierung für den Bot und sollte deshalb nicht aus der Hand gegeben werden. Die verwendeten Urls sind deshalb auch in den Log-Files nicht enthalten, da diese das Authtoken in Klartext enthalten. Auch im Forum sollte dieses Token nicht aufgenommen werden.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Für die Anlage eines TelegramBot Devices in FHEM ist ein Authtoken erforderlich. Dieses Token wird über Anlegen eines neuen Bots im [https://core.telegram.org/bots#6-botfather BotFather] erzeugt. Dafür muss der BotFather mit einem Telegram-Client kontaktiert werden. Dort mit dem Telegram-Befehl &amp;lt;code&amp;gt;/newbot&amp;lt;/code&amp;gt; einen neuen Bot anlegen und mit einem Namen versehen. Hinweis: Die Namen für Bots müssen auf &amp;quot;Bot&amp;quot; enden.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Das Anlegen eines TelegramBot devices erfolgt durch die Angabe dieses Tokens:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;define &amp;amp;lt;name&amp;amp;gt; TelegramBot  &amp;amp;lt;token&amp;amp;gt; &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Beispiel: &amp;lt;code&amp;gt;define teleBot TelegramBot 110201543:AAHdqTcvCH1vGWJxfSeofSAs0K5PALDsaw&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Das Empfangen von Nachrichten (polling) erfordert die Einstellung des Attributes&#039;&#039;&#039; &lt;br /&gt;
&amp;lt;code&amp;gt;pollingTimeout&amp;lt;/code&amp;gt; &#039;&#039;&#039;auf einen Wert der grösser als Null ist. Beim Wert 0 oder ohne Setzen des Attributes findet kein Polling und damit auch kein Empfang statt.&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
Beispiel: &amp;lt;code&amp;gt;attr teleBot pollingTimeout 120&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Der TelegramBot kann erst dann Nachrichten an einen telegram user schicken, wenn dieser zuerst an den telegram bot eine Nachricht gesendet hat.&#039;&#039;&#039;&lt;br /&gt;
Dafür muss man in seinem Telegram-Client den Kontakt @botName suchen und dann eine Nachricht daran versenden.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Der TelegramBot kann keine Nachrichten an andere Bots senden. Ein anderer Bot erhält die Nachrichten auch nicht wenn er in einer Gruppe enthalten ist.&#039;&#039;&#039; Dies ist eine Beschränkung in der Bot-Funktion bei Telegram. Das Versenden an einen anderen Bot (wenn man den Kontakt manuell hinzugefügt hat) führt zur Fehlermeldung&lt;br /&gt;
&amp;lt;code&amp;gt;sentMsgResult - Callback returned error :Bad Request: chat not found:&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Randnotiz|RNTyp=Info|RNText=TelegramBot setzt eine aktuelle Version von FHEM voraus, insbesondere Versionen weit vor der Umstellung auf 5.7 (also vor Herbst 2015) können mit einem TelegramBot-Modul nicht funktionieren, da insbesondere das HTTPSRV-Modul dann veraltet ist. Am besten auch den TelegramBot über den offiziellen Update mit dem Rest von FHEM installieren/aktualisieren.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Registrierung eines neuen Bot ==&lt;br /&gt;
Zur Registrierung wird ein funktionierender Telegram-Client (egal ob Web, App oder Programm)benötigt. Hier wird ein Chat zum BotFather gestartet und der Befehl /newbot gesendet. Nun fragt der BotFather die benötigten Angaben ab und liefert am Ende des Dialogs die Informationen für den neuen Bot.&lt;br /&gt;
Hier ein Beispiel, wie so ein Chat aussehen könnte:&lt;br /&gt;
&amp;lt;pre&amp;gt;Client: &lt;br /&gt;
/newbot&lt;br /&gt;
----------------&lt;br /&gt;
BotFather:&lt;br /&gt;
Alright, a new bot. How are we going to call it? Please choose a name for your bot. &lt;br /&gt;
----------------&lt;br /&gt;
Client: &lt;br /&gt;
Mein Name &lt;br /&gt;
----------------&lt;br /&gt;
BotFather: &lt;br /&gt;
Good. Now let&#039;s choose a username for your bot. It must end in `bot`. Like this, for example: TetrisBot or tetris_bot.&lt;br /&gt;
----------------&lt;br /&gt;
Client: &lt;br /&gt;
fhem_bot&lt;br /&gt;
----------------&lt;br /&gt;
BotFather: &lt;br /&gt;
Sorry, this username is already taken. Think of something different.&lt;br /&gt;
----------------&lt;br /&gt;
Client: &lt;br /&gt;
fhem1234_bot&lt;br /&gt;
----------------&lt;br /&gt;
BotFather: &lt;br /&gt;
Done! Congratulations on your new bot.&lt;br /&gt;
You will find it at telegram.me/fhem1234_bot.&lt;br /&gt;
You can now add a description, about section and profile picture for your bot, see /help for a list of commands.&lt;br /&gt;
----------------&lt;br /&gt;
Use this token to access the HTTP API:&lt;br /&gt;
1234567890:AbCdefgHIJklmnOPQRst-uvwxyz &lt;br /&gt;
&lt;br /&gt;
For a description of the Bot API, see this page: https://core.telegram.org/bots/api &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Um einen Chat an einen &amp;quot;Contact&amp;quot; versenden zu können, muss zuerst in Contacts (bei Readings) ein Kontakt auftauchen. Wenn man sich zum allerersten Mal bei Telegram angemeldet hat, gibt es noch keinen Chat mit irgendjemanden. Man muss sich zuerstmal selbst eine Nachricht im Smartphone zusenden, dann taucht unter Readings der Eintrag Contacts auf. Erst dann kann man eine Nachricht mit @msgPeerId (das ist Ziffernfolge des Contacts ) oder mit @msgPeer (das ist der Name nach dem Doppelpunkt) vom TelegramBot auf sein Smartphone senden.&lt;br /&gt;
&lt;br /&gt;
== Tipps ==&lt;br /&gt;
&lt;br /&gt;
=== Privacyeinstellungen ===&lt;br /&gt;
&lt;br /&gt;
Damit der TelegramBot auch Meldungen in Gruppen sieht, müssen über den BotFather die Privacy-Einstellungen geändert werden.&amp;lt;br&amp;gt;Beispielchat:&amp;lt;pre&amp;gt;Client:&lt;br /&gt;
/setprivacy&lt;br /&gt;
----------------&lt;br /&gt;
BotFather:&lt;br /&gt;
Choose a bot to change group messages settings.&lt;br /&gt;
----------------&lt;br /&gt;
Client:&lt;br /&gt;
@fhem1234_bot&lt;br /&gt;
----------------&lt;br /&gt;
BotFather:&lt;br /&gt;
&#039;Enable&#039; - your bot will only receive messages that either start with the &#039;/&#039; symbol or mention the bot by username.&lt;br /&gt;
&#039;Disable&#039; - your bot will receive all messages that people send to groups.&lt;br /&gt;
Current status is: ENABLED&lt;br /&gt;
----------------&lt;br /&gt;
Client:&lt;br /&gt;
Disable&lt;br /&gt;
----------------&lt;br /&gt;
BotFather:&lt;br /&gt;
Success! The new status is: DISABLED. /help&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Kontakte ===&lt;br /&gt;
&lt;br /&gt;
Der Bot merkt sich die bereits bekannten Kontakte im Reading &amp;lt;code&amp;gt;Contacts&amp;lt;/code&amp;gt;. Dabei werden die einzelnen Kontakte jeweils als 3-teilige Einträge gespeichert - bestehend aus UserID, Vor- und Nachname des Benutzers (mit _ verbunden) und dem Username (mit vorangestelltem @). &lt;br /&gt;
&lt;br /&gt;
Beispiel: &amp;lt;code&amp;gt;123456:Ralf_Mustermann:@ralf&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Verschiedene Einträge werden durch Leerzeichen getrennt.&lt;br /&gt;
&lt;br /&gt;
Man kann die Kontakte auch manuell überschreiben (z.B. wenn das Reading fehlerhaft oder verloren sein sollte). Dazu gibt es den Set-Befehl &amp;lt;code&amp;gt;replaceContacts&amp;lt;/code&amp;gt;. Dieser nimmt die Kontakte ebenfalls in der gleichen Form wie oben beschrieben entgegen.&lt;br /&gt;
&lt;br /&gt;
Die Kontaktliste wird ansonsten nur durch den Empfang von Nachrichten erweitert, da es im TelegramBot-API keine Möglichkeit gibt Kontaktdaten von Telegram abzufragen (siehe auch pollingTimeout)&lt;br /&gt;
&lt;br /&gt;
=== Reset ===&lt;br /&gt;
&lt;br /&gt;
Es ist möglich den Bot im laufenden Betrieb zurückzusetzen (Set-Befehl &amp;lt;code&amp;gt;reset&amp;lt;/code&amp;gt;). Dabei werden noch nicht abgeschlossene Übetragungen entfernt und die internen Zustände des Devices zurückgesetzt. &lt;br /&gt;
&lt;br /&gt;
=== Gruppen ===&lt;br /&gt;
&lt;br /&gt;
Um eine Nachricht von FHEM an eine Gruppe zu senden, muss der BOT in die Gruppe aufgenommen werden. Nach dem Senden einer Nachricht an die Gruppe kann im Modul die Gruppen-ID ermittelt werden und zum Senden von Nachrichten verwendet werden. Die Gruppen-ID ist eine negative Zahl. Wenn die Privacy-Einstellungen nicht auf &#039;Disabled&#039; gesetzt wurden, muss die Nachricht mit einem Slash (/) beginnen.&lt;br /&gt;
&lt;br /&gt;
==== Supergroups / Supergruppen ====&lt;br /&gt;
&lt;br /&gt;
Auch die neuen Supergruppen werden mit dem Bot unterstützt, es ist allerdings zu beachten, dass bei der Umwandlung einer Gruppe in eine Supergruppe eine neue ID in den Kontakten von Telegram vergeben wird. Wenn man also wie empfohlen IDs zur Identifikation von Benutzern einsetzt, muss entsprechend angepasst werden.&lt;br /&gt;
&lt;br /&gt;
== Beispielszenarien ==&lt;br /&gt;
&lt;br /&gt;
=== Benachrichtigungen über Ereignisse ===&lt;br /&gt;
&lt;br /&gt;
Das einfachste Szenario für die Integration von Messaging-Diensten mit FHEM ist zur Benachrichtigung über Ereignisse. Diese Funktion kann zum Beispiel verwendet werden, um über einen erfolgten Neustart von FHEM zu informieren:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;define notify_fhem_reload notify global:INITIALIZED set telebotdevice message fhem newly started - just now !&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In diesem Beispiel wird der Nachrichtentext &amp;quot;fhem newly started - just now !&amp;quot; an den als default eingestellten Kontakt (Attribut: defaultPeer) gesendet, sobald FHEM neu gestartet wurde. Natürlich kann man auch beliebige andere Benachrichtigungen einführen.&lt;br /&gt;
&lt;br /&gt;
=== Versand von Bildern ===&lt;br /&gt;
&lt;br /&gt;
Es ist auch möglich Bilder auf dem FHEM-Server, die zum Beispiel von einer Kamera oder einem Wettermodul stammen über Telegram zu versenden. So wäre es z.B. möglich jeweils morgens die aktuelle Wetterkarte zu erhalten.&lt;br /&gt;
&lt;br /&gt;
ACHTUNG: TelegramBot verwendet das HTTPUtils-Modul zur Kommunikation mit dem TelegramBot-API. Erst mit der Version, die seit 22.10.2015 &lt;br /&gt;
([r9576] HttpUtils.pm: Async write for POST Requests {{Link2Forum|Topic=41583|LinkText=FHEM-Forum}}) verteilt wird, erlaubt auch den Transfer grösserer Bilder. Die Grenze liegt ansonsten bei ca. 14kb auf Raspberries (Plattformspezifische Grenze).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;define notify_fhem_reload notify wetter:report set telebotdevice sendImage /opt/fhem/wetter.jpg&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Bei Erreichen des entsprechenden Status am Wetter-Modul wird ein Image über Telegram versendet. Hier sind lokale Pfade (relativ zu fhem) oder absolute Pfade wie oben möglich.&lt;br /&gt;
&lt;br /&gt;
=== Versand von SVG-Plots ===&lt;br /&gt;
&lt;br /&gt;
SVG-Plots können mit dem Befehl &lt;br /&gt;
&amp;lt;code&amp;gt;cmdSend [ @&amp;lt;peer1&amp;gt; ... @&amp;lt;peerN&amp;gt; ] &amp;lt;fhem command&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
verschickt werden.&lt;br /&gt;
&lt;br /&gt;
Das angegebene FHEM-Kommando wird ausgeführt und das Ergebnis an die angegebenen Peers bzw. den Standard-Peer verschickt.&lt;br /&gt;
&lt;br /&gt;
Mit dem folgenden Befehl wird der SVG-Plot SVG_FileLog_Aussen an den Standard-Peer geschickt: &lt;br /&gt;
&amp;lt;code&amp;gt;set mein_telegramBot cmdSend { plotAsPng(&#039;SVG_FileLog_Aussen&#039;) }&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nach &amp;lt;code&amp;gt;define cmd_sendTelegramSVG cmdalias TGSVG .* AS set mein_telegramBot cmdSend { plotAsPng(&amp;quot;$EVENT&amp;quot;) }&amp;lt;/code&amp;gt;&lt;br /&gt;
kann man mit einem kurzen &lt;br /&gt;
&amp;lt;code&amp;gt;TGSVG SVG_Garten&amp;lt;/code&amp;gt;&lt;br /&gt;
ein beliebiges SVG über die Kommandozeile per Telegram versenden.&lt;br /&gt;
&lt;br /&gt;
Um das SVG nun noch mit einem Text zu versehen, muss eine Textnachricht dazu gesendet werden, was sich am einfachsten durch das Ausführen eines FHEM-Befehls auf Perl-Ebene realisieren lässt:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;{fhem &amp;quot;set mein_telegramBot message Bildbeschreibung;; set mein_telegramBot cmdSend { plotAsPng(&#039;mein_SVG&#039;) }&amp;quot; }&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Hinweis:&#039;&#039;&#039; früher wurde zum Verschicken von Plots auch die interne Funktion TelegramBot_ExecuteCommand verwendet; mit dem Update Ende Februar 2017 hat diese Funktion einen zusätzlichen Parameter erhalten und lautet nun &lt;br /&gt;
&amp;lt;code&amp;gt;TelegramBot_ExecuteCommand($defs{&amp;quot;mein_telegramBot&amp;quot;}, meine_ZielID, undef, &#039;{plotAsPng(&amp;quot;mein_SVG&amp;quot;)}&#039;);&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Voraussetzungen für den Versand von SVG-Plots ====&lt;br /&gt;
Es muss das Modul libimage-librsvg-perl installiert sein:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;sudo apt-get install libimage-librsvg-perl&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Evtl. sind weitere Module erforderlich:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;sudo apt-get install libgd-graph-perl&lt;br /&gt;
&lt;br /&gt;
sudo apt-get install libgd-text-perl&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Empfang von Bildern oder ähnlichem ===&lt;br /&gt;
&lt;br /&gt;
Beim Empfang von Bildern wird zuerst nur eine ID vom Telegram-Server empfangen, diese befindet sich im Reading &amp;lt;code&amp;gt;msgFileId&amp;lt;/code&amp;gt; angelegt (&amp;lt;code&amp;gt;123456:xxxxxxxxxxxxxxxxxxxxxxx-xxxxxxxx&amp;lt;/code&amp;gt;) und im Reading &amp;lt;code&amp;gt;msgText&amp;lt;/code&amp;gt; steht dann so etwas wie&lt;br /&gt;
&amp;lt;code&amp;gt;received photo # Size: 107701&amp;lt;/code&amp;gt;&lt;br /&gt;
	&lt;br /&gt;
Über das Get-Kommando &amp;lt;code&amp;gt;urlForFile&amp;lt;/code&amp;gt; mit der ID aus dem msgFileId Reading lässt sich dann daraus ein URL ableiten, der dann zur eigentlichen Datei führt: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;https://api.telegram.org/file/bot123456:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx/photo/file_25.jpg&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Versand von Emojis (Smileys) ===&lt;br /&gt;
&lt;br /&gt;
Es ist auch möglich Emojis mit den (Text-)Nachrichten zu versenden. Die entsprechenden (Unicode-)Zeichen werden einfach direkt mit in den Text der Nachricht aufgenommen. Um das zu vereinfachen kann man das einfach per Copy und Paste von dieser Seite &lt;br /&gt;
&lt;br /&gt;
http://apps.timwhitlock.info/emoji/tables/unicode (Spalte &amp;quot;Native&amp;quot;) &lt;br /&gt;
&lt;br /&gt;
übernehmen und mit der Nachricht verschicken. &lt;br /&gt;
&lt;br /&gt;
Die Emojis können auch empfangen werden und werden so auch in FHEM / FHEMWeb angezeigt. Plattformspezifische (z.B. von iOS oder Android) Emojis werden dabei nicht unterstützt (gerade mit iOS sind viele neue farbige Emojis hinzugekommen, die wohl leider nur auf Apple-devices funktionieren).&lt;br /&gt;
&lt;br /&gt;
=== Kommandos auslösen ===&lt;br /&gt;
&lt;br /&gt;
Ein wichtiges Szenario ist die Möglichkeit Kommandos in FHEM ausführen zu können, ohne einen Zugang durch die Firewall einrichten zu müssen. Dazu ist die Definition eines Schlüsselwortes (Attribut: &amp;quot;cmdKeyword&amp;quot;)erforderlich, mit dem man die Nachrichten beginnen muss, damit der TelegramBot die Kommandos erkennt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;attr telebotdevice cmdKeyword doit&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Somit kann man dann durch Nachrichten die mit &amp;quot;doit&amp;quot; beginnen Kommandos an FHEM senden, die ähnlich wie im Kommandoeingabefeld von FHEMweb dann von FHEM ausgeführt werden. Das Ergebnis der Ausführung wird zurück an den Sender (und an den definierten defaultPeer) geschickt.&lt;br /&gt;
&lt;br /&gt;
Somit können nicht nur Aktionen angestossen werden, sondern auch Infos abgefragt werden.&lt;br /&gt;
&lt;br /&gt;
Beispiele&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;doit set schalter on&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;doit list telegrambot&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Randnotiz|RNTyp=Warn|RNText=Achtung: Bei den Kommandos sollten man unbedingt das Attribut &amp;quot;cmdRestrictedPeer&amp;quot; setzen, damit nicht jeder Kommandos auf dem FHEM-Server ausführen kann. Dazu sollten die BenutzerIDs der erlaubten Benutzer (durch Leerzeichen getrennt angeben). Da Benutzernamen selber vergeben werden und nicht unbedingt eindeutig sind, sollten hier auch NUR BenutzerIDs verwendet werden.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== Favoriten für Kommandos anlegen ====&lt;br /&gt;
Grundidee bei den Favoriten ist, dass man lange Befehle, die man häufig braucht auf &amp;quot;Kurzwahl&amp;quot; legt.&lt;br /&gt;
&lt;br /&gt;
Beispiel-Kommandos wie z.B. &amp;lt;code&amp;gt;set TYPE=ROLLLADEN pos 100&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;set TYPE=ROLLLADEN pos 0&amp;lt;/code&amp;gt;, die man immer wieder braucht. Um nicht jedes mal dieses Kommando eintippen zu müssen auf dem Smartphone, kann man auch dafür Favoriten anlegen.&lt;br /&gt;
&lt;br /&gt;
Dazu gibt man erst mal die beiden Kommandos getrennt durch Semikolon im Attribut favorites an:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;attr telegrambotdevice favorites set TYPE=ROLLLADEN pos 100;set TYPE=ROLLLADEN pos 0&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Um die Favorites jetzt ausführen zu können braucht man noch ein Schlüsselwort dafür.&lt;br /&gt;
Nehmen wir mal an man möchte die Favoriten mit &amp;lt;code&amp;gt;/short&amp;lt;/code&amp;gt; ausführen können. Dazu muss dann das Attribut &amp;quot;cmdFavorites&amp;quot; setzen&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;attr telegrambotdevice cmdFavorites /short&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wenn man nun im Telegram Client &lt;br /&gt;
&amp;lt;code&amp;gt;/short 1&amp;lt;/code&amp;gt; an den Bot schickt führt der Bot den ersten Favoriten aus und das Ergebnis der Ausführung wird zurückgeschickt.&lt;br /&gt;
&lt;br /&gt;
Ausserdem kann man im Telegram Client &lt;br /&gt;
&amp;lt;code&amp;gt;/short&amp;lt;/code&amp;gt; an den Bot schicken, dann antwortet der Bot mit&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Favorites&lt;br /&gt;
&lt;br /&gt;
/short1 = set TYPE=ROLLLADEN pos 100&lt;br /&gt;
&lt;br /&gt;
/short2 = set TYPE=ROLLLADEN pos 0&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Antworten werden als Schaltflächen dargestellt (Telegram inline Keyboard) und können am Mobile-Client direkt angeklickt werden um sie auszuführen.&lt;br /&gt;
Um die Beschriftung der Schaltflächen zu optimieren, können die Befehle im Attribut favorites mit Beschreibungen versehen werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;/[Rolllaeden zu ]=set TYPE=ROLLLADEN pos 100;/[Rolllaeden auf]=set TYPE=ROLLLADEN pos 0&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nun antwortet der Bot auf das Schlüsselwort für die Favoriten mit:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Favorites&lt;br /&gt;
&lt;br /&gt;
/short1 = Rolllaeden zu&lt;br /&gt;
&lt;br /&gt;
/short2 = Rolllaeden auf&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
* Github Repository für die Telegram-FHEM Entwicklung: https://github.com/viegener/Telegram-fhem&lt;br /&gt;
* Infos zum Telegram BotFather: https://core.telegram.org/bots#6-botfather&lt;br /&gt;
&lt;br /&gt;
* Source code für das 50_TelegramBot.pm-Modul: https://github.com/viegener/Telegram-fhem/blob/master/50_TelegramBot.pm&lt;br /&gt;
&lt;br /&gt;
* Forum-Thread in dem das Modul vorgestellt wurde {{Link2Forum|Topic=38328|LinkText=FHEM-Forum}}&lt;br /&gt;
* Telegram messaging system https://telegram.org/&lt;br /&gt;
* TelegramBot API https://core.telegram.org/bots/api&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Telegram]]&lt;/div&gt;</summary>
		<author><name>Viegener</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=Benutzer:Viegener&amp;diff=21041</id>
		<title>Benutzer:Viegener</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=Benutzer:Viegener&amp;diff=21041"/>
		<updated>2017-03-26T21:59:36Z</updated>

		<summary type="html">&lt;p&gt;Viegener: aufgefrischt&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
; Erstmal nur ein Überblick über meine FHEM-Beteiligung&lt;br /&gt;
&lt;br /&gt;
== FHEM Benutzung ==&lt;br /&gt;
&lt;br /&gt;
Wunsch war die Zusammenführung der verschiedenen Funksysteme in einem zentralen System.&lt;br /&gt;
Ausdrücklich mit den Zielen&lt;br /&gt;
* Übergreifende Steuerungen und Makros zu ermöglichen&lt;br /&gt;
* Zentrale Bedienungsterminals (tablet)&lt;br /&gt;
* Steuerung von Aussen&lt;br /&gt;
* Am wichtigsten natürlich Spass am Basteln und Programmieren!!!&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
;Komponenten&lt;br /&gt;
* Somfy RTS Rolläden (Aktoren und Handfernbedienungen)&lt;br /&gt;
* FS20 Steckdosen&lt;br /&gt;
* Thermo/Hygro-Sensoren von LaCrosse und Technoline&lt;br /&gt;
* Mehrere Sonos-Komponenten&lt;br /&gt;
* Fritzbox&lt;br /&gt;
* Homematic - Schalter, STeckdosen, Heizkörperthermostate, Fenstersensoren&lt;br /&gt;
* Nextion-Displays&lt;br /&gt;
* und und und&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
;Mein FHEM habe ich im Februar 2015 installiert.&lt;br /&gt;
&lt;br /&gt;
== FHEM Development ==&lt;br /&gt;
&lt;br /&gt;
Aber klar, das macht ja den Spass aus. Gerne in C, C++, Perl, Java, Javascript und vielen anderen, die heute nicht mehr relevant sind.&lt;br /&gt;
Wenns sein muss auch in CSS, HTML etc &lt;br /&gt;
&lt;br /&gt;
* TBot_List modul&lt;br /&gt;
* Nextion Modul&lt;br /&gt;
* [https://github.com/viegener/Telegram-fhem/blob/master/70_Telegram.pm 70_Telegram.pm]&lt;br /&gt;
* [https://github.com/viegener/Telegram-fhem/blob/master/50_TelegramBot.pm 50_TelegramBot.pm]&lt;br /&gt;
* Beiträge zu Somfy&lt;br /&gt;
** Somfy in FHEMDuino (Perl und C)&lt;br /&gt;
** 10_Somfy_PM - Umbau positionsbehandlung&lt;br /&gt;
** Übernahm Somfy-Modul&lt;br /&gt;
* Beiträge zu FHEM Tablet UI&lt;br /&gt;
* FTUISrv Modul&lt;br /&gt;
&lt;br /&gt;
== FHEMWiki ==&lt;br /&gt;
&lt;br /&gt;
* [[TelegramBot]]&lt;br /&gt;
* [[Telegram]]&lt;br /&gt;
* [[DevelopmentModuleAPI]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Projekte und Ideen ==&lt;br /&gt;
&lt;br /&gt;
* Klingeltaster-Modul mit RGB-LEDs und Arduino+Funk&lt;br /&gt;
** Immer noch eine Baustelle, RGB geht, FHEM-Anbindung über Asksin Homematic&lt;br /&gt;
** Eigentlich inzwischen obsolet durch Nextion-Displays&lt;br /&gt;
&lt;br /&gt;
* grösseres (10 Zoll ?) Tablet als zentrale Bedienungskonsole&lt;br /&gt;
** Jetzt realisiert über Acer Iconia 10 - funktioniert recht gut und für den Preis ein gutes Angebot&lt;br /&gt;
&lt;br /&gt;
* Infrarot-Modul als Homematic Aktor (Selbstbau Arduino Nano / Funkmodul-RFM12B? / IR-LEDs&lt;br /&gt;
** Läuft nun als CUL mit WLAN-Interface (ESP8266)&lt;br /&gt;
** [https://forum.fhem.de/index.php/topic,49689.0.html]&lt;/div&gt;</summary>
		<author><name>Viegener</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=Modul_PostMe&amp;diff=21040</id>
		<title>Modul PostMe</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=Modul_PostMe&amp;diff=21040"/>
		<updated>2017-03-26T21:40:42Z</updated>

		<summary type="html">&lt;p&gt;Viegener: Added Info on Tbot_list module for using PostME with TelegramBot&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{&lt;br /&gt;
Infobox Modul&lt;br /&gt;
|ModPurpose=Das Modul stellt eine komfortable Oberfläche bereit, um per Webinterface beliebige Listen ähnlich wie gelbe Klebezettel (Post-It™) zu verwalten. &lt;br /&gt;
|ModType=h&lt;br /&gt;
&amp;lt;!-- |ModCategory= (noch?) nicht verwendet --&amp;gt;&lt;br /&gt;
|ModCmdRef=PostMe&lt;br /&gt;
|ModForumArea=Unterstuetzende Dienste&lt;br /&gt;
|ModTechName=95_PostMe.pm&lt;br /&gt;
|ModOwner=Prof. Dr. Peter A. Henning&lt;br /&gt;
}}&lt;br /&gt;
=Anwendung=&lt;br /&gt;
[[File:Postme2.png |600px]]&lt;br /&gt;
&lt;br /&gt;
Das Modul &#039;&#039;95_PostMe.pm&#039;&#039; stellt eine komfortable Oberfläche bereit, um per Webinterface beliebige Listen ähnlich wie gelbe Klebezettel (Post-It™) zu verwalten.&lt;br /&gt;
Jede dieser Listen wird im Folgenden als PostMe bezeichnet, und wir verwenden zur Vereinfachung den Devicenamen PostIt (der natürlich durch den eigenen Devicenamen zu ersetzen ist).&lt;br /&gt;
==Anwendungsbeispiel==&lt;br /&gt;
Mit dem folgenden Beispiel wird eine Liste &amp;quot;Baumarktliste&amp;quot; erzeugt, auf ihr die Einträge für den Kauf eines Sacks Estrichbeton und einer unbestimmten Menge Sägekettenöl vorgenommen&lt;br /&gt;
 set PostIt create Baumarktliste&lt;br /&gt;
 set PostIt add Baumarktliste Estrichbeton&lt;br /&gt;
 set PostIt add Baumarktliste Sägekettenöl&lt;br /&gt;
 set PostIt modify Baumarktliste Estrichbeton Menge 1 Sack&lt;br /&gt;
und die Liste dann per Instant Messenger an den zugeordneten Empfänger verschickt:&lt;br /&gt;
 get PostIt message Baumarktliste &lt;br /&gt;
Der Empfänger wird dann die folgende Nachricht erhalten:&lt;br /&gt;
 Baumarktliste: Estrichbeton[Menge=&amp;quot;1 Sack&amp;quot;],Sägekettenöl&lt;br /&gt;
&lt;br /&gt;
==Listen==&lt;br /&gt;
[[File:Postme11.png |600px]]&lt;br /&gt;
&lt;br /&gt;
Jedes PostMe besteht aus einem Listennamen (=Überschrift) zur eindeutigen Identifikation (z.B. &amp;quot;Einkaufsliste&amp;quot;), und beliebig vielen Listeneinträgen. Ein PostMe wird dem System mit den folgenden Kommandos hinzugefügt, entfernt oder geleert:&lt;br /&gt;
 set PostIt create &#039;&#039;Listenname&#039;&#039;&lt;br /&gt;
 set PostIt delete &#039;&#039;Listenname&#039;&#039;&lt;br /&gt;
 set PostIt clear &#039;&#039;Listenname&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Ein PostMe kann mit einem &#039;&#039;&#039;get&#039;&#039;&#039;-Befehl ausgegeben oder an eine vordefinierte Adresse geschickt werden. Dazu gibt es die Kommandos&lt;br /&gt;
 get PostIt list &#039;&#039;Listenname&#039;&#039;&lt;br /&gt;
Zur Ausgabe an ein Text-to-Speech-Device, hierzu muss das Attribut postmeTTSFun gesetzt sein:&lt;br /&gt;
 get PostIt ttsSay &#039;&#039;Listenname&#039;&#039; &lt;br /&gt;
Zur Ausgabe per eMail, hierzu muss dass Attribut postme&#039;&#039;&#039;xx&#039;&#039;&#039;MailRec für diese Liste (Nr. &#039;&#039;&#039;xx&#039;&#039;&#039;) auf den Empfängernamen gesetzt sein und das Attribut postmeMailFun auf den Namen der eMail-Funktion gesetzt sein:&lt;br /&gt;
 get PostIt mail &#039;&#039;Listenname&#039;&#039;&lt;br /&gt;
Zur Ausgabe per instant messenger, hierzu muss dass Attribut postme&#039;&#039;&#039;xx&#039;&#039;&#039;MsgRec für diese Liste (Nr. &#039;&#039;&#039;xx&#039;&#039;&#039;) auf den Empfängernamen gesetzt sein und das Attribut postmeMsgFun auf den Namen der messenger-Funktion gesetzt sein:&lt;br /&gt;
 get PostIt message &#039;&#039;Listenname&#039;&#039;&lt;br /&gt;
==Listeneinträge==&lt;br /&gt;
Die Listeneinträge haben das Datenformat&lt;br /&gt;
 &#039;&#039;item&#039;&#039; [&#039;&#039;attribute1&#039;&#039;=&amp;quot;&#039;&#039;data1&#039;&#039;&amp;quot; &#039;&#039;attribute2&#039;&#039;=&amp;quot;&#039;&#039;data2&#039;&#039;&amp;quot; ....]&lt;br /&gt;
und sind in einem einzigen langen String gespeichert. Trennzeichen ist das Komma, es darf also im Listeneintrag selbst nicht auftauchen.&lt;br /&gt;
*&#039;&#039;item&#039;&#039; ist der eigentliche Listeneintrag, es kann sich um einen beliebigen Text (auch mit Leerzeichen) handeln.&lt;br /&gt;
**Ein &#039;&#039;item&#039;&#039; wird dem PostMe mit den folgenden Kommandos hinzugefügt bzw. gelöscht &lt;br /&gt;
  set PostIt add &#039;&#039;Listenname&#039;&#039; &#039;&#039;text&#039;&#039;&lt;br /&gt;
  set PostIt remove &#039;&#039;Listenname&#039;&#039; &#039;&#039;text&#039;&#039;&lt;br /&gt;
**Dabei darf der &#039;&#039;text&#039;&#039; beim Hinzufügen auch Kommata enthalten - dann werden eben mehrere &#039;&#039;items&#039;&#039; erzeugt. Es dürfen kein eckigen Klammern enthalten sein.&lt;br /&gt;
*In eckigen Klammern [...] können einem &#039;&#039;item&#039;&#039; beliebige Metadaten in Form von Attribut-Wert-Paaren hinzugefügt werden. Dafür gibt es das Kommando&lt;br /&gt;
  set PostIt modify &#039;&#039;Listenname&#039;&#039; &#039;&#039;item&#039;&#039; &#039;&#039;attribute&#039;&#039; &#039;&#039;value&#039;&#039;&lt;br /&gt;
**Ist das Attribut &#039;&#039;attribute&#039;&#039; noch nicht vorhanden, wird es angelegt und erhält den Wert &#039;&#039;value&#039;&#039;&lt;br /&gt;
**Ist das Attribut &#039;&#039;attribute&#039;&#039; bereits vorhanden, wird sein Wert mit dem Wert &#039;&#039;value&#039;&#039; überschrieben. Wenn &#039;&#039;value&#039;&#039; leer ist, wird das Attribut entfernt.&lt;br /&gt;
==Definition==&lt;br /&gt;
Die folgende beispielhafte Definition setzt das PostMe-System mit dem Devicenamen &#039;&#039;&#039;PostIt&#039;&#039;&#039; in Betrieb:&lt;br /&gt;
 define PostIt PostMe&lt;br /&gt;
 attr PostIt postmeStd Einkaufsliste,Baumarktliste &#039;&#039;(Standard-Listen, die immer vorhanden sind (nicht löschbar))&#039;&#039;&lt;br /&gt;
 attr PostIt icon &amp;lt;embed src=&amp;quot;/fhem/PostMe_widget?type=pins&amp;amp;postit=PostIt&amp;quot;/&amp;gt; &#039;&#039;(siehe unten)&#039;&#039;&lt;br /&gt;
 attr PostIt postmeTTSFun sendTTS &#039;&#039;(Funktionsname einer Funktion zur Sprachausgabe. Wird mit 1 Parameter (Titelzeile:Inhalt) aufgerufen)&#039;&#039;&lt;br /&gt;
 attr PostIt postmeMailFun DebianMail &#039;&#039;(Funktionsname einer Funktion zum Mailversand. Wird mit 3 Parametern (Empfänger,Titelzeile, Inhalt) aufgerufen)&#039;&#039;&lt;br /&gt;
 attr PostIt postmeMsgFun Telegram &#039;&#039;(Funktionsname einer Funktion zum Versand von Instant messages. Wird mit 3 Parametern (Empfänger,Titelzeile, Inhalt) aufgerufen)&#039;&#039;&lt;br /&gt;
 attr PostIt postme01MailRec &#039;&#039;&amp;lt;mail-Adresse Person 1&amp;gt;&#039;&#039;&lt;br /&gt;
 attr PostIt postme01MsgRec &#039;&#039;&amp;lt;messenger-Adresse Person 1&amp;gt;&#039;&#039;&lt;br /&gt;
 attr PostIt postme02MailRec &#039;&#039;&amp;lt;mail-Adresse Person 2&amp;gt;&#039;&#039;&lt;br /&gt;
 attr PostIt postme02MsgRec &#039;&#039;&amp;lt;messenger-Adresse Person 2&amp;gt;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
 attr PostIt postmeStyle jQuery &#039;&#039;(siehe unten)&#039;&#039;&lt;br /&gt;
 attr PostIt postmeClick 0 &#039;&#039;(siehe unten)&#039;&#039;&lt;br /&gt;
 attr PostIt postmeIcon images/default/pin_red_32.png&lt;br /&gt;
&lt;br /&gt;
In der Weboberfläche sieht das dann so aus: [[File:Postme13.png |600px]]&lt;br /&gt;
==Service-Routinen==&lt;br /&gt;
Das Modul verfügt über zwei Service-Routinen, mit denen ohne Kenntnis von internen Zuständen Listen abgefragt werden können.&lt;br /&gt;
===PostMe_tgi(&#039;&#039;&amp;lt;Devicename&amp;gt;&#039;&#039;,&#039;&#039;&amp;lt;Listenname&amp;gt;&#039;&#039;)=== &lt;br /&gt;
liefert das PostMe &#039;&#039;Listenname&#039;&#039; in einem für &#039;&#039;Inline-Keyboards&#039;&#039; des Instant Messenmgers Telegram geeigneten Format zurück, also z.B.&lt;br /&gt;
 PostMe_tgi(&#039;PostIt&#039;,&#039;Einkaufsliste&#039;); &lt;br /&gt;
 =&amp;gt; (Milch:Einkaufsliste_item00) (Honig:Einkaufsliste_item01) (Streichhölzer:Einkaufsliste_item02) Einkaufsliste&lt;br /&gt;
Zur Weiterverarbeitung siehe das entsprechende Kapitel weiter unten. Die Abfrage dieser Service-Routine kann auch von einem anderen Rechner aus erfolgen, dazu verpackt man das idealerweise in ein kleines Shell-Skript:&lt;br /&gt;
 #!/bin/bash&lt;br /&gt;
 postme=$1&lt;br /&gt;
 liste=$2&lt;br /&gt;
 FHEMIP=&#039;&#039;&amp;lt;IP-Adresse des FHEM-Servers&#039;&#039;&lt;br /&gt;
 echo &amp;quot;{PostMe_tgi(&#039;$postme&#039;,&#039;$liste&#039;)}&amp;quot; | socat -t50 - TCP:$FHEMIP:7072&lt;br /&gt;
===PostMe_tgj(&#039;&#039;&amp;lt;Devicename&amp;gt;&#039;&#039;,&#039;&#039;&amp;lt;Listenname&amp;gt;&#039;&#039;)=== &lt;br /&gt;
liefert das PostMe &#039;&#039;Listenname&#039;&#039; in als &amp;quot;nacktes&amp;quot; Array zurück. Diese Abfrage macht nur Sinn, wenn sie innerhalb eines Perl-Codeblocks ausgeführt wird.&lt;br /&gt;
=Steuerung via Spracherkennung=&lt;br /&gt;
Für die folgende Anwendung gehen wir davon aus, dass auf einem FHEM-Gerät eine Spracherkennung installiert ist. Der erkannte Sprachstring wird an eine Perl-Funktion als Parameter &#039;&#039;$command&#039;&#039; übergeben. Im Nachfolgenden wird die Auswertung nur für das PostMe &#039;&#039;&#039;Einkaufsliste&#039;&#039;&#039; beschrieben&lt;br /&gt;
 &lt;br /&gt;
 }elsif( $command =~ /.*(L|l)iste.*/) {&lt;br /&gt;
    my $liste;&lt;br /&gt;
    if( $command =~ /.*Einkaufs.*/ ){&lt;br /&gt;
      $liste = &amp;quot;Einkaufsliste&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
    if( $command =~ /.*löschen.*/ ){&lt;br /&gt;
      fhem(&amp;quot;set PostIt clear &amp;quot;.$liste);&lt;br /&gt;
      fhem(&amp;quot;set GalaxyTab ttsSay &amp;quot;.$liste.&amp;quot; gelöscht&amp;quot;);&lt;br /&gt;
    }elsif( $command =~ /.*E-Mail.*/ ){&lt;br /&gt;
      fhem(&amp;quot;get PostIt mail &amp;quot;.$liste);&lt;br /&gt;
      fhem(&amp;quot;set GalaxyTab ttsSay &amp;quot;.$liste.&amp;quot; per Email verschickt&amp;quot;);&lt;br /&gt;
    }elsif( $command =~ /.*(T|t)eleg.*/ ){&lt;br /&gt;
      fhem(&amp;quot;get PostIt message &amp;quot;.$liste);&lt;br /&gt;
      fhem(&amp;quot;set GalaxyTab ttsSay &amp;quot;.$liste.&amp;quot; per Telegramm verschickt&amp;quot;);&lt;br /&gt;
    }elsif( $command =~ /.*(H|h)inzufügen.*/ ){&lt;br /&gt;
      $command =~ s/.*(H|h)inzufügen\s+//;&lt;br /&gt;
      fhem(&amp;quot;set PostIt add &amp;quot;.$liste.&amp;quot; &amp;quot;.$command);&lt;br /&gt;
      fhem(&amp;quot;set GalaxyTab ttsSay Zur &amp;quot;.$liste.&amp;quot; hinzugefügt &amp;quot;.$command);&lt;br /&gt;
    }elsif( $command =~ /.*(Ä|ä)ndern.*/ ){&lt;br /&gt;
      $command =~ s/.*(Ä|ä)ndern\s+//;&lt;br /&gt;
      fhem(&amp;quot;set PostIt modify &amp;quot;.$liste.&amp;quot; &amp;quot;.$command);&lt;br /&gt;
      fhem(&amp;quot;set GalaxyTab ttsSay Auf &amp;quot;.$liste.&amp;quot; geändert &amp;quot;.$command);&lt;br /&gt;
    }elsif( $command =~ /.*(E|e)ntfernen.*/ ){&lt;br /&gt;
      $command =~ s/.*(E|e)ntfernen\s+//;&lt;br /&gt;
      my $res=fhem(&amp;quot;set PostIt remove &amp;quot;.$liste.&amp;quot; &amp;quot;.$command);&lt;br /&gt;
      fhem(&amp;quot;set GalaxyTab ttsSay Von der &amp;quot;.$liste.&amp;quot; entfernt &amp;quot;.$command);&lt;br /&gt;
    }else{&lt;br /&gt;
      fhem(&amp;quot;get PostIt ttsSay &amp;quot;.$liste);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
=Einbinden in die FHEM-Anzeige=&lt;br /&gt;
PostMes können in jede beliebige Webseite eingebunden werden. Beispielsweise kann auch das Standard-Attribut &#039;&#039;icon&#039;&#039; des diesem Postme-System zugeordneten Devices durch einen der folgenden Codes ersetzt werden.&lt;br /&gt;
* Mit dem HTML-Code &lt;br /&gt;
 &amp;lt;embed src=&amp;quot;/fhem/PostMe_widget?type=pins&amp;amp;postit=&#039;&#039;&amp;lt;devicename&amp;gt;&#039;&#039;&amp;quot;/&amp;gt;&lt;br /&gt;
wird eine interaktive Liste aller Titelzeilen der PostMes dieses Systems angezeigt.&lt;br /&gt;
* Mit dem Code &lt;br /&gt;
 &amp;lt;embed src=&amp;quot;/fhem/PostMe_widget?type=pin&amp;amp;postit=&#039;&#039;&amp;lt;devicename&amp;gt;&#039;&#039;&amp;amp;name=&#039;&#039;&amp;lt;name&amp;gt;&#039;&#039;&amp;quot;/&amp;gt;&lt;br /&gt;
wird ein einzelnes PostMe mit dem Namen &#039;&#039;&amp;lt;name&amp;gt;&#039;&#039; als Titelzeile angezeigt. Zur Anpassung der Höhe kann man noch ein &#039;&#039;height&#039;&#039;-Attribut einsetzen, z.B.:&lt;br /&gt;
 &amp;lt;embed src=&amp;quot;/fhem/PostMe_widget?type=pin&amp;amp;postit=&#039;&#039;&amp;lt;devicename&amp;gt;&#039;&#039;&amp;amp;name=&#039;&#039;&amp;lt;name&amp;gt;&#039;&#039;&amp;quot; height=&amp;quot;350&amp;quot;/&amp;gt;&lt;br /&gt;
==Art der Widgets==&lt;br /&gt;
In diesen Darstellungen kann durch die Maus erreicht werden, dass zur einzeiligen Anzeige der Titelzeile der volle Inhalt des PostMes angezeigt wird.&lt;br /&gt;
* Wenn das Attribut &#039;&#039;postmeClick&#039;&#039; auf 0 gesetzt ist (Default-Wert), erfolgt die Anzeige und das Löschen des PostMe-Inhaltes durch Überfahren bzw. Wegfahren des Mauszeigers auf die Titelzeile.&lt;br /&gt;
* Wenn das Attribut &#039;&#039;postmeClick&#039;&#039; auf 1 gesetzt ist, muss die Titelzeile angeklickt werden, um den Inhalt zu sehen - und das entsprechens Fenster bzw. die Dialogbock explizit geschlossen werden.&lt;br /&gt;
Welcher Art die Anzeige des PostMe-Inhalte ist, wird durch ein anderes Attribut geregelt.&lt;br /&gt;
* Wenn &#039;&#039;postmeStyle=jQuery&amp;quot; (Default-Wert), erfolgt die Anzeige in einer jQuery-Dialogbox. &lt;br /&gt;
* Wenn &#039;&#039;postmeStyle=HTML&amp;quot;, erfolgt die Anzeige in einem neuen (kleinen) Browser-Fenster.&lt;br /&gt;
* Wenn &#039;&#039;postmeStyle=SVG&amp;quot;, erfolgt die Anzeige in einer SVG-Viewbox.&lt;br /&gt;
&lt;br /&gt;
==Aussehen der Widgets==&lt;br /&gt;
Die oben genannten Widgets werden in ihrem Aussehen über Cascading Stylesheets gesteuert. Drei Klassen sind dafür relevant, sie sollten in die Datei &#039;&#039;&#039;style.css&#039;&#039;&#039; (oder, wenn man einen anderen Stylesheet-Präfix gesetzt hat, &amp;lt;präfix&amp;gt;style.css) eingetragen werden. Mit beispielhafter Farbe für die Widgets:&lt;br /&gt;
 .postmeclass { background-color:#ffee80; padding:10px; border-color:black; border:groove}&lt;br /&gt;
 .postmeclass2 { background-color:#ffee80; padding:10px;}&lt;br /&gt;
&lt;br /&gt;
=Steuerung per Telegram=&lt;br /&gt;
Mit dem Messenger &#039;&#039;Telegram&#039;&#039; kann man Kommandos von außen an FHEM schicken. Dazu pollt der Telegram-Client, der mit Hilfe des [[TelegramBot|TelegramBot-Moduls]] realisiert wird, in regelmäßigen Abständen einen entsprechenden Server im Internet. Nach derzeitigem Stand der Technik ist das sicher, allerdings ist es empfehlenswert, diesen TelegramBot nicht auf dem gleichen Rechner wie das FHEM-Hauptsystem laufen zu lassen (siehe Anleitung [[TelegramBot]]).&lt;br /&gt;
&lt;br /&gt;
Mit einem solchen Kommando kann man z.B. einen Dummy setzen - das löst einen Event aus, der via FHEM2FHEM auch auf entfernten FHEM-Systemen registriert werden kann. Mit einem notify bzw. DOIF kann dieser Event abgefangen und zur Absendung einer Antwort durch das PostMe-Modul verwendet werden:&lt;br /&gt;
  	&lt;br /&gt;
 define Remote.N DOIF ([Task] eq &amp;quot;Einkaufsliste&amp;quot;) (get PostIt Einkaufsliste message,set Remote.Task Einkaufsliste Telegram)&lt;br /&gt;
&lt;br /&gt;
Insgesamt führt dies dazu, dass man z.B. einfach von außen an seinen eigenen TelegramBot die Nachricht &lt;br /&gt;
  &#039;&#039;magisches_Codewort&#039;&#039; set Task Einkaufsliste&lt;br /&gt;
senden kann - und kurz darauf die Einkaufsliste zurückbekommt.&lt;br /&gt;
== Komfortabel verwalten mit &#039;&#039;Favorites&#039;&#039;==&lt;br /&gt;
Komfortabler ist die Bedienung von PostMe mit Telegram, wenn man diesem Messenger so genannte &#039;&#039;Favorites&#039;&#039; beibringt - das sind bevorzugte Kommandos. Beim Absenden dieser Kommandos auf einem Smartphone genügt es, die Kommandoabkürzung mit einem vorangestellten &amp;quot;/&amp;quot; zu senden. Definiert man beispielsweise für das Telegram-Device (&#039;&#039;NICHT für das Postme-Device&#039;&#039;)&lt;br /&gt;
 attr Telegram favorites&lt;br /&gt;
 /H=set Telegram message &amp;quot;/Einkauf &amp;lt;sonstige Listen&amp;gt;&amp;quot;; &lt;br /&gt;
 /Einkauf=set Task get PostIt message Einkaufsliste; &lt;br /&gt;
 /Einkauf+=set Task set PostIt add Einkaufsliste; &lt;br /&gt;
 /Einkauf-=set Task set PostIt remove Einkaufsliste; &lt;br /&gt;
so kann man mit der Telegram-Nachricht&lt;br /&gt;
 /H&lt;br /&gt;
ein auswählbares Menü seiner Listen erhalten, mit&lt;br /&gt;
 /Einkauf&lt;br /&gt;
die Einkaufsliste abrufen und mit&lt;br /&gt;
 /Einkauf+ &amp;lt;Item&amp;gt;&lt;br /&gt;
 /Einkauf- &amp;lt;Item&amp;gt; &lt;br /&gt;
Gegenstände hinzufügen oder entfernen.&lt;br /&gt;
&#039;&#039;&#039;Achtung:&#039;&#039;&#039; Eigentlich ist das eine Sicherheitslücke, weil das magische Codewort nicht nötig ist. Man sollte also erstens die Telegram-User sorgfältig begrenzen, die diese Kommandos ausführen können, und zweitens auf keinen Fall beliebige FHEM-Kommandos über diesen Mechanismus ausführbar machen. Im hier diskutierten Fall (separate FHEM-Instanz und Trennung per FHEM2FHEM, indem hier nur die Task-Variable gesetzt wird) kann das also als sicher gelten.&lt;br /&gt;
== Noch komfortabler verwalten mit &#039;&#039;Inline-Keyboards&#039;&#039;==&lt;br /&gt;
{{Randnotiz|RNTyp=Info|RNText=Inzwischen gibt es für diese Funktionalität ein eigenes Modul [https://fhem.de/commandref.html#TBot_List TBot_List], das die Kopplung von TelegramBot und PostME ohne zusätzlichen perlcode erlaubt }}&lt;br /&gt;
&lt;br /&gt;
Noch komfortabler ist die Bedienung von PostMe mit Telegram, wenn man diesem Messenger so genannte &#039;&#039;Inline-Keyboards&#039;&#039; beibringt. Das geht auf zweierlei Arten, die im Folgenden dokumentiert sind.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|scope=&amp;quot;col&amp;quot; style=&amp;quot;width: 1000px&amp;quot; colspan=&amp;quot;2&amp;quot;|[[File:Pmbot1.png |450px]]&lt;br /&gt;
|-&lt;br /&gt;
|scope=&amp;quot;col&amp;quot; style=&amp;quot;width: 1000px&amp;quot; colspan=&amp;quot;2&amp;quot;|Benutzer tippt im Client auf den Button &amp;quot;PostIt&amp;quot;. Im FHEM wird über ein notify, das auf &#039;&#039;queryData&#039;&#039; triggert, eine Erkennungsroutine aufgerufen, der Benutzer erhält:&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;width: 500px; vertical-align:top&amp;quot; |[[File:Pmbot2.png |450px]]&lt;br /&gt;
|style=&amp;quot;width: 500px; vertical-align:top&amp;quot; |[[File:Pmbot2b.png |450px]]&lt;br /&gt;
|-&lt;br /&gt;
|scope=&amp;quot;col&amp;quot; style=&amp;quot;width: 1000px&amp;quot; colspan=&amp;quot;2&amp;quot;|Benutzer tippt im Client auf den Button &amp;quot;Einkauf&amp;quot;.Im FHEM wird über ein notify, das auf &#039;&#039;queryData&#039;&#039; triggert, eine Erkennungsroutine aufgerufen, der Benutzer erhält:&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;width: 500px; vertical-align:top&amp;quot; |[[File:Pmbot3.png |450px]]&lt;br /&gt;
|style=&amp;quot;width: 500px; vertical-align:top&amp;quot; |[[File:Pmbot3b.png |450px]]&lt;br /&gt;
|-&lt;br /&gt;
|scope=&amp;quot;col&amp;quot; style=&amp;quot;width: 500px; vertical-align:top&amp;quot;|Benutzer tippt im Client auf den Button &amp;quot;Einkauf hinzu&amp;quot;. &lt;br /&gt;
Im FHEM wird wieder über das notify, das auf &#039;&#039;queryData&#039;&#039; triggert, eine Erkennungsroutine aufgerufen. Diese stellt fest, dass etwas hinzugefügt werden soll sendet an den Client eine msgForceReply &amp;quot;Eingabe einzufügender Posten&amp;quot;. Im TelegramBot wird ein Userreading gesetzt auf &amp;quot;add Einkaufsliste&amp;quot;&lt;br /&gt;
|scope=&amp;quot;col&amp;quot; style=&amp;quot;width: 500px; vertical-align:top&amp;quot;|Benutzer tippt im Client auf den Button &amp;quot;hinzufügen&amp;quot;. &lt;br /&gt;
Im FHEM wird wieder über das notify, das auf &#039;&#039;queryData&#039;&#039; triggert, eine Erkennungsroutine aufgerufen. Diese stellt fest, dass etwas hinzugefügt werden soll sendet an den Client eine msgForceReply &amp;quot;Eingabe einzufügender Posten&amp;quot;. Im TelegramBot wird ein Userreading gesetzt auf &amp;quot;add Einkaufsliste&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;width: 1000px&amp;quot; colspan=&amp;quot;2&amp;quot;|[[File:Pmbot4.png |450px]]&lt;br /&gt;
|-&lt;br /&gt;
|scope=&amp;quot;col&amp;quot; style=&amp;quot;width: 1000px&amp;quot; colspan=&amp;quot;2&amp;quot;|Benutzer tippt im Client einen Gegenstand ein und sendet diesen an den TelegramBot. Dasselbe notify triggert AUCH auf msgReplyMsgId und ruft erneut die Erkennungsroutine, diese weiß aus dem Userreading, was sie zu tun hat und führt aus &lt;br /&gt;
 set PostIt add Einkaufsliste Gegenstand&lt;br /&gt;
|-&lt;br /&gt;
|scope=&amp;quot;col&amp;quot; style=&amp;quot;width: 500px; vertical-align:top&amp;quot; |Zur Überprüfung tippt der Benutzer erneut auf den Button &amp;quot;Einkauf&amp;quot;  und erhält&lt;br /&gt;
|scope=&amp;quot;col&amp;quot; style=&amp;quot;width: 500px; vertical-align:top&amp;quot; |Der Benutzer erhält automatisch&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;width: 500px; vertical-align:top&amp;quot; |[[File:Pmbot5.png |450px]]&lt;br /&gt;
|style=&amp;quot;width: 500px; vertical-align:top&amp;quot; |[[File:Pmbot5b.png |450px]]&lt;br /&gt;
|-&lt;br /&gt;
|scope=&amp;quot;col&amp;quot; style=&amp;quot;width: 1000px&amp;quot; colspan=&amp;quot;2&amp;quot;|&lt;br /&gt;
Dazu benötigt man erst einmal, dass die Favorites beim Start eine externe Routine &#039;&#039;&#039;telegramRecognition&#039;&#039;&#039; aufrufen:&lt;br /&gt;
 attr Telegram favorites /start={telegramRecognition(&amp;quot;menuData: Hauptmenü&amp;quot;)};&lt;br /&gt;
Außerdem das notify, das auf die richtigen Events triggert&lt;br /&gt;
 define Telegram.N notify Telegram:((queryData)|(msgReplyMsgId)).* {telegramRecognition(&amp;quot;$EVENT&amp;quot;)}&lt;br /&gt;
|}&lt;br /&gt;
Die Erkennungsroutine ist recht komplex, sie wird im Folgenden komplett dargestellt:&lt;br /&gt;
 #############################################################################&lt;br /&gt;
 #&lt;br /&gt;
 #  TelegramInlineKeyboard&lt;br /&gt;
 #&lt;br /&gt;
 #############################################################################&lt;br /&gt;
 sub telegramRecognition($){&lt;br /&gt;
    my ($event)    = @_;&lt;br /&gt;
    my $querypeer      = ReadingsVal(&amp;quot;TelegramBot&amp;quot;, &amp;quot;queryPeer&amp;quot;, 0);&lt;br /&gt;
    my $msgpeer        = ReadingsVal(&amp;quot;TelegramBot&amp;quot;, &amp;quot;msgPeer&amp;quot;, 0);&lt;br /&gt;
    my $queryReplyMsgId= ReadingsVal(&amp;quot;TelegramBot&amp;quot;, &amp;quot;queryReplyMsgId&amp;quot;, 0);&lt;br /&gt;
    my $MsgId          = ReadingsVal(&amp;quot;TelegramBot&amp;quot;, &amp;quot;MsgId&amp;quot;, 0);&lt;br /&gt;
    my $menuMsgId      = ReadingsVal(&amp;quot;TelegramBot&amp;quot;, &amp;quot;menuMsgId&amp;quot;, $queryReplyMsgId);&lt;br /&gt;
    my $calldata       = ReadingsVal(&amp;quot;TelegramBot&amp;quot;, &amp;quot;callData&amp;quot;, &amp;quot;&amp;quot;);&lt;br /&gt;
    my $tg;&lt;br /&gt;
    my $dp;&lt;br /&gt;
    my $dm;&lt;br /&gt;
    my $res;&lt;br /&gt;
    my $cmd;&lt;br /&gt;
    my $click;&lt;br /&gt;
    my ($cb1,$cb2,$cb1raw);&lt;br /&gt;
    &lt;br /&gt;
    #-- Dieses Flag wird =1 gesetzt, wenn das PostMe-Device auf in derselben FHEM-Instanz läuft, &lt;br /&gt;
    #                    =0, wenn das PostMe-Device auf einer anderen FHEM-Instanz läuft und per FHEM2FHEM &lt;br /&gt;
    #                        bedient wird&lt;br /&gt;
    my $postitlocal=1;&lt;br /&gt;
&lt;br /&gt;
    #-- Hier kann man - ggf. für jeden $querypeer anders ! - einstellen, welcher Bestätigungstext vom Bot &lt;br /&gt;
        gesendet wird, und ob es eine nicht-klickbare Liste (linke Spalte oben) oder eine klickbare Liste&lt;br /&gt;
        (rechte Spalte oben) sein soll&lt;br /&gt;
    if( $querypeer eq &amp;quot;Peter_A._Henning&amp;quot;){&lt;br /&gt;
       fhem(&amp;quot;attr TelegramBot queryAnswerText Gerne zu Diensten, Meister !&amp;quot;);&lt;br /&gt;
       $click=1;&lt;br /&gt;
    }elsif( $querypeer eq &amp;quot;Jacqueline_Henning&amp;quot;){&lt;br /&gt;
       fhem(&amp;quot;attr TelegramBot queryAnswerText Gerne zu Diensten, Jacqueline !&amp;quot;);&lt;br /&gt;
       $click=0;&lt;br /&gt;
    }else{&lt;br /&gt;
       fhem(&amp;quot;attr TelegramBot queryAnswerText Gerne zu Diensten!&amp;quot;);&lt;br /&gt;
       $click=0;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    #-- Klick event from inline keyboard&lt;br /&gt;
    if( $event =~ /queryData\:\s(.*)/ ){&lt;br /&gt;
      ($cb1,$cb2) = split(/ /,$1,2);&lt;br /&gt;
      #-- Level 0/1 =&amp;gt; new menuMsgId after start of Bot&lt;br /&gt;
      if( $cb1 =~ /(PostIt)|(Steuerung)/ ){&lt;br /&gt;
        $menuMsgId = $queryReplyMsgId;&lt;br /&gt;
        fhem(&amp;quot;setreading TelegramBot menuMsgId $menuMsgId&amp;quot;);&lt;br /&gt;
      }&lt;br /&gt;
      #-- Level 0&lt;br /&gt;
      if( $cb1 eq &amp;quot;Hauptmenü&amp;quot;){&lt;br /&gt;
        fhem(&amp;quot;set TelegramBot queryInline \@$querypeer (PostIt) (Steuerung) Hauptmenü&amp;quot;);   &lt;br /&gt;
      #-- Level 1&lt;br /&gt;
      }elsif( $cb1 eq &amp;quot;PostIt&amp;quot;){&lt;br /&gt;
        #-- PostIt-Menü für nicht-klickbare Listen&lt;br /&gt;
        if( $querypeer eq &amp;quot;Jacqueline_Henning&amp;quot;){&lt;br /&gt;
          fhem(&amp;quot;set TelegramBot queryEditInline $menuMsgId \@$querypeer (Hauptmenü) (Einkauf|Einkauf hinzu|Einkauf entf) (Baumarkt|Baumarkt hinzu|Baumarkt entf) PostIt Listenverwaltung;&amp;quot;);&lt;br /&gt;
        #-- PostIt-Menü für nicht-klickbare Listen&lt;br /&gt;
        }elsif( $querypeer eq &amp;quot;Peter_A._Henning&amp;quot;){&lt;br /&gt;
          fhem(&amp;quot;set TelegramBot queryEditInline $menuMsgId \@$querypeer (Hauptmenü) (Einkauf) (Baumarkt) PostIt Listenverwaltung;&amp;quot;);        &lt;br /&gt;
        }&lt;br /&gt;
      }elsif( $cb1 eq &amp;quot;Steuerung&amp;quot;){&lt;br /&gt;
        ... HIER NOCH ANDERE UNTERMENUS FÜR STEUERUNGSZWECKE&lt;br /&gt;
      #-- Level 2/3 PostIt&lt;br /&gt;
      }elsif( $cb1 =~ /((Einkauf)|(Baumarkt)).*/ ){&lt;br /&gt;
        my $cb1raw = $cb1;&lt;br /&gt;
        if( $cb1 =~ /Einkauf.*/){&lt;br /&gt;
          $cb1 = &amp;quot;Einkaufsliste&amp;quot;;&lt;br /&gt;
          $tg  = 1;&lt;br /&gt;
          $dp  = &amp;quot;&amp;lt;hier Adressaten&amp;gt;&amp;quot;;&lt;br /&gt;
          #$click = 0;&lt;br /&gt;
        }elsif( $cb1 =~ /Baumarkt.*/){&lt;br /&gt;
          $cb1 = &amp;quot;Baumarktliste&amp;quot;;&lt;br /&gt;
          $tg  = 2;&lt;br /&gt;
          $dp  = &amp;quot;\&amp;lt;hier Adressaten&amp;gt;&amp;quot;;&lt;br /&gt;
          #$click = 0;&lt;br /&gt;
        }  &lt;br /&gt;
        #-- Level 2/3 for clickable items&lt;br /&gt;
        if( $click==1 ){&lt;br /&gt;
          #-- Level 3 to delete an item&lt;br /&gt;
          if( $cb1raw =~ /.*item\d\d/ ){&lt;br /&gt;
            $cb2 = $cb1raw;&lt;br /&gt;
            $cb2 =~ s/^.*_//;&lt;br /&gt;
            if( $postitlocal==1 ){&lt;br /&gt;
              #-- local version&lt;br /&gt;
              fhem(&amp;quot;set PostIt remove $cb1 $cb2&amp;quot;);&lt;br /&gt;
            }else{&lt;br /&gt;
              #-- remote version&lt;br /&gt;
              fhem(&amp;quot;set Task_90 set PostIt remove $cb1 $cb2&amp;quot;);&lt;br /&gt;
            }&lt;br /&gt;
            #-- redisplay the list - small delay&lt;br /&gt;
            InternalTimer(gettimeofday()+1, &amp;quot;telegramRecognition&amp;quot;,&amp;quot;queryData: $cb1&amp;quot;,0);&lt;br /&gt;
          #-- Level 3 to add an item&lt;br /&gt;
          }elsif( $cb1raw =~ /.*add/ ){&lt;br /&gt;
            fhem(&amp;quot;set TelegramBot msgForceReply \@$querypeer Eingabe hinzuzufügender Posten&amp;quot;);&lt;br /&gt;
            fhem(&amp;quot;setreading TelegramBot prevCmd add $cb1&amp;quot;);&lt;br /&gt;
          #-- Level 2 for clickable items&lt;br /&gt;
          }else{&lt;br /&gt;
            if( $postitlocal==1 ){&lt;br /&gt;
              #-- local version&lt;br /&gt;
              $res = PostMe_tgi(&amp;quot;PostIt&amp;quot;,$cb1);  &lt;br /&gt;
            }else{  &lt;br /&gt;
              #-- remote version&lt;br /&gt;
              $cmd = &amp;quot;/opt/fhem/getList.sh PostIt &amp;quot;.$cb1;&lt;br /&gt;
              $res = `$cmd`;&lt;br /&gt;
            }&lt;br /&gt;
            fhem(&amp;quot;set TelegramBot queryEditInline $menuMsgId \@$querypeer (Hauptmenü|PostIt|hinzufügen:&amp;quot;.$cb1.&amp;quot;_add) &amp;quot;.$res.&amp;quot;\n Klicken zum Entfernen&amp;quot;); &lt;br /&gt;
          }&lt;br /&gt;
        #-- Level 2/3 for non-clickable items&lt;br /&gt;
        }elsif( $click==0 ){  &lt;br /&gt;
          if( $cb2 ){&lt;br /&gt;
            #-- Level 3 to delete an item&lt;br /&gt;
            if( $cb2 eq &amp;quot;entf&amp;quot; ){&lt;br /&gt;
              fhem(&amp;quot;set TelegramBot msgForceReply \@$querypeer Eingabe zu entfernender Posten&amp;quot;);&lt;br /&gt;
              fhem(&amp;quot;setreading TelegramBot prevCmd remove $cb1&amp;quot;);&lt;br /&gt;
            #-- Level 3 to add an item&lt;br /&gt;
            }elsif( $cb2 eq &amp;quot;hinzu&amp;quot; ){&lt;br /&gt;
              fhem(&amp;quot;set TelegramBot msgForceReply \@$querypeer Eingabe hinzuzufügender Posten&amp;quot;);&lt;br /&gt;
              fhem(&amp;quot;setreading TelegramBot prevCmd add $cb1&amp;quot;);&lt;br /&gt;
            }&lt;br /&gt;
          #-- Level 2 for non-clickable items&lt;br /&gt;
          }else{&lt;br /&gt;
            if( $postitlocal==1 ){&lt;br /&gt;
              #-- local version&lt;br /&gt;
              fhem(sprintf(&amp;quot;attr PostIt postme%02dMsgRec \@$querypeer&amp;quot;,$tg));&lt;br /&gt;
              fhem(        &amp;quot;get PostIt  message $cb1&amp;quot;);&lt;br /&gt;
              fhem(sprintf(&amp;quot;attr PostIt postme%02dMsgRec %s&amp;quot;,$tg,$dp));&lt;br /&gt;
            }else{&lt;br /&gt;
              #-- remote version&lt;br /&gt;
              fhem(sprintf(&amp;quot;set Task_90 attr PostIt postme%02dMsgRec \@$querypeer&amp;quot;,$tg));&lt;br /&gt;
              fhem(        &amp;quot;set Task_90 get  PostIt message $cb1&amp;quot;);&lt;br /&gt;
              fhem(sprintf(&amp;quot;set Task_90 attr PostIt postme%02dMsgRec %s&amp;quot;,$tg,$dp));&lt;br /&gt;
            }&lt;br /&gt;
          } &lt;br /&gt;
        }&lt;br /&gt;
      }&lt;br /&gt;
    #-- Level 0 after start of bot&lt;br /&gt;
    }elsif( $event =~ /menuData\:\s*(.*)\s*(.*)/ ){&lt;br /&gt;
      my $cb1 = $1;&lt;br /&gt;
      my $cb2 = $2;&lt;br /&gt;
      if( $cb1 eq &amp;quot;Hauptmenü&amp;quot;){&lt;br /&gt;
        if( $msgpeer eq &amp;quot;Jacqueline_Henning&amp;quot;){&lt;br /&gt;
          fhem(&amp;quot;set TelegramBot queryInline \@$msgpeer (PostIt) (Steuerung) Hauptmenü&amp;quot;);&lt;br /&gt;
        }elsif( $msgpeer eq &amp;quot;Peter_A._Henning&amp;quot;){&lt;br /&gt;
          fhem(&amp;quot;set TelegramBot queryInline \@$msgpeer (PostIt) (Steuerung) Hauptmenü&amp;quot;);&lt;br /&gt;
        }else{&lt;br /&gt;
          fhem(&amp;quot;set TelegramBot queryInline \@$msgpeer (PostIt) Hauptmenü&amp;quot;);&lt;br /&gt;
        }&lt;br /&gt;
      }&lt;br /&gt;
    #-- Process line from forced reply&lt;br /&gt;
    }elsif( $event =~ /msgReplyMsgId\:\s+(\d*)/ ){&lt;br /&gt;
      my $mn = $1;&lt;br /&gt;
      my $mo = ReadingsVal(&amp;quot;TelegramBot&amp;quot;, &amp;quot;prevMsgId&amp;quot;, 0)+1;&lt;br /&gt;
      my $prev = ReadingsVal(&amp;quot;TelegramBot&amp;quot;,&amp;quot;prevCmd&amp;quot;,&amp;quot;none&amp;quot;);&lt;br /&gt;
      if( $prev =~ /((add)|(remove)).*/ ){&lt;br /&gt;
        if( $postitlocal==1 ){&lt;br /&gt;
          #-- local version&lt;br /&gt;
          fhem(&amp;quot;set PostIt $prev &amp;quot;.ReadingsVal(&amp;quot;TelegramBot&amp;quot;,&amp;quot;msgText&amp;quot;,&amp;quot;&amp;quot;));&lt;br /&gt;
        }else{&lt;br /&gt;
          #-- remote version&lt;br /&gt;
          fhem(&amp;quot;set Task_90 set PostIt $prev &amp;quot;.ReadingsVal(&amp;quot;TelegramBot&amp;quot;,&amp;quot;msgText&amp;quot;,&amp;quot;&amp;quot;));&lt;br /&gt;
        }&lt;br /&gt;
        fhem(&amp;quot;setreading TelegramBot prevCmd none&amp;quot;);&lt;br /&gt;
        #-- redisplay the list - small delay&lt;br /&gt;
        $prev =~ s/((add)|(remove))\s*//;&lt;br /&gt;
        InternalTimer(gettimeofday()+1, &amp;quot;telegramRecognition&amp;quot;,&amp;quot;queryData: $prev&amp;quot;,0);&lt;br /&gt;
      } &lt;br /&gt;
    }&lt;br /&gt;
  }&lt;/div&gt;</summary>
		<author><name>Viegener</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=TelegramBot&amp;diff=21039</id>
		<title>TelegramBot</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=TelegramBot&amp;diff=21039"/>
		<updated>2017-03-26T21:31:34Z</updated>

		<summary type="html">&lt;p&gt;Viegener: Changed icon for randnotiz&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Infobox Modul&lt;br /&gt;
|ModPurpose=Senden und Empfangen von Nachrichten (Text und Fotos) mit dem freien Messagingdienst Telegram&lt;br /&gt;
|ModType=d&lt;br /&gt;
|ModForumArea=Unterstützende Dienste&lt;br /&gt;
|ModFTopic=38328&lt;br /&gt;
|ModTechName=[https://github.com/viegener/Telegram-fhem/blob/master/50_TelegramBot.pm 50_TelegramBot.pm]&lt;br /&gt;
|ModOwner=[[Benutzer:Viegener|Viegener]] ({{Link2FU|12772|Forum}} / [[Benutzer Diskussion:Viegener|Wiki]])}}&lt;br /&gt;
&lt;br /&gt;
Das [[TelegramBot]]-Modul ermöglicht das Senden und Empfangen von Nachrichten über den Telegram-instant messaging Dienst (https://telegram.org/). &lt;br /&gt;
Es entsteht eine Möglichkeit Benachrichtungen aus FHEM zu versenden, zum Beispiel Alarmmeldungen.&lt;br /&gt;
Ausserdem können auch Kommandos über Telegram an FHEM gesendet werden um Steuerungsbefehle in FHEM auszulösen.&lt;br /&gt;
&lt;br /&gt;
Das TelegramBot-Modul benötigt keine Zusatzsoftware auf dem FHEM-Server (anders als die Variante [[Telegram]]), sondern verwendet das [https://core.telegram.org/bots/api TelegramBot-API] über https-Aufrufe. Es muss jedoch das [http://www.fhemwiki.de/wiki/Raspberry_Pi#N.C3.BCtzliche_Zusatzpakete perl JSON modul] installiert sein. &lt;br /&gt;
&lt;br /&gt;
== Über Telegram Instant Messaging ==&lt;br /&gt;
Telegram-IDs und Versand/Empfang von Nachrichten sind kostenfrei. &lt;br /&gt;
Clients sind für gängige Smartphonesysteme erhältlich (iOS iPhone und Tablet, Android, Windows Phone) und &lt;br /&gt;
können auch aus dem WebBrowser verwendet werden. &lt;br /&gt;
Es gibt auch einen Kommandozeilen-Client für Linux, der die Grundlage dieses Moduls darstellt. &lt;br /&gt;
Mehrfachanmeldungen, auch parallel mit verschiedenen Geräten (z.B. Tablet und Smartphone), sind möglich.&lt;br /&gt;
Gruppenchats und Chats mit End-2-End-Verschlüsselung werden ebenfalls unterstützt.&lt;br /&gt;
&lt;br /&gt;
Für die Unterstützung von &#039;&#039;WhatsApp&#039;&#039; siehe Modul [[yowsup]].&lt;br /&gt;
&lt;br /&gt;
== Features ==&lt;br /&gt;
Unterstützt werden:&lt;br /&gt;
&lt;br /&gt;
* Versand von Textnachrichten &lt;br /&gt;
* Versand und Empfang von Bildern/Audio/etc &lt;br /&gt;
* Empfang von Textnachrichten von beliebigen Kontakten&lt;br /&gt;
* Kommandos in FHEM über Telegram-Nachrichten von aussen auslösen&lt;br /&gt;
* Ergebnisse der Kommandos zusenden lassen&lt;br /&gt;
&lt;br /&gt;
Eine detaillierte Beschreibung des Moduls ist im FHEM Forum und in der (englischen) Dokumentation zum Modul in der Commandref diesem  {{Link2Forum|Topic=38328|LinkText=Diskussionsthread}} zu finden. Seit Oktober 2015 wird das Modul offiziell über FHEM-Update verteilt.&lt;br /&gt;
&lt;br /&gt;
Die jeweils aktuellste Entwicklungs-Version des Moduls ist in Github [https://github.com/viegener/Telegram-fhem/blob/master/50_TelegramBot.pm 50_TelegramBot.pm] verfügbar.&lt;br /&gt;
&lt;br /&gt;
== Hinweise zum Betrieb mit FHEM ==&lt;br /&gt;
{{Randnotiz|RNTyp=Info|RNText=Achtung: Dieses Authtoken ist die einzige Authentifizierung für den Bot und sollte deshalb nicht aus der Hand gegeben werden. Die verwendeten Urls sind deshalb auch in den Log-Files nicht enthalten, da diese das Authtoken in Klartext enthalten. Auch im Forum sollte dieses Token nicht aufgenommen werden.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Für die Anlage eines TelegramBot Devices in FHEM ist ein Authtoken erforderlich. Dieses Token wird über Anlegen eines neuen Bots im [https://core.telegram.org/bots#botfather BotFather] erzeugt. Dort mit dem Telegram-Befehl &amp;lt;code&amp;gt;/newbot&amp;lt;/code&amp;gt; einen neuen Bot anlegen und mit einem Namen versehen. Hinweis: Die Namen für Bots müssen auf &amp;quot;Bot&amp;quot; enden.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Das Anlegen eines TelegramBot devices erfolgt durch die Angabe dieses Tokens:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;define &amp;amp;lt;name&amp;amp;gt; TelegramBot  &amp;amp;lt;token&amp;amp;gt; &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Beispiel: &amp;lt;code&amp;gt;define teleBot TelegramBot 110201543:AAHdqTcvCH1vGWJxfSeofSAs0K5PALDsaw&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Das Empfangen von Nachrichten (polling) erfordert die Einstellung des Attributes&#039;&#039;&#039; &lt;br /&gt;
&amp;lt;code&amp;gt;pollingTimeout&amp;lt;/code&amp;gt; &#039;&#039;&#039;auf einen Wert der grösser als Null ist. Beim Wert 0 oder ohne Setzen des Attributes findet kein Polling und damit auch kein Empfang statt.&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
Beispiel: &amp;lt;code&amp;gt;attr teleBot pollingTimeout 120&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Der TelegramBot kann erst dann Nachrichten an einen telegram user schicken, wenn dieser zuerst an den telegram bot eine Nachricht gesendet hat.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{{Randnotiz|RNTyp=Info|RNText=TelegramBot setzt eine aktuelle Version von FHEM voraus, insbesondere Versionen weit vor der Umstellung auf 5.7 (also vor Herbst 2015) können mit einem TelegramBot-Modul nicht funktionieren, da insbesondere das HTTPSRV-Modul dann veraltet ist. Am besten auch den TelegramBot über den offiziellen Update mit dem Rest von FHEM installieren/aktualisieren.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Registrierung eines neuen Bot ==&lt;br /&gt;
Zur Registrierung wird ein funktionierender Telegram-Client (egal ob Web, App oder Programm)benötigt. Hier wird ein Chat zum BotFather gestartet und der Befehl /newbot gesendet. Nun fragt der BotFather die benötigten Angaben ab und liefert am Ende des Dialogs die Informationen für den neuen Bot.&lt;br /&gt;
Hier ein Beispiel, wie so ein Chat aussehen könnte:&lt;br /&gt;
&amp;lt;pre&amp;gt;Client: &lt;br /&gt;
/newbot&lt;br /&gt;
----------------&lt;br /&gt;
BotFather:&lt;br /&gt;
Alright, a new bot. How are we going to call it? Please choose a name for your bot. &lt;br /&gt;
----------------&lt;br /&gt;
Client: &lt;br /&gt;
Mein Name &lt;br /&gt;
----------------&lt;br /&gt;
BotFather: &lt;br /&gt;
Good. Now let&#039;s choose a username for your bot. It must end in `bot`. Like this, for example: TetrisBot or tetris_bot.&lt;br /&gt;
----------------&lt;br /&gt;
Client: &lt;br /&gt;
fhem_bot&lt;br /&gt;
----------------&lt;br /&gt;
BotFather: &lt;br /&gt;
Sorry, this username is already taken. Think of something different.&lt;br /&gt;
----------------&lt;br /&gt;
Client: &lt;br /&gt;
fhem1234_bot&lt;br /&gt;
----------------&lt;br /&gt;
BotFather: &lt;br /&gt;
Done! Congratulations on your new bot.&lt;br /&gt;
You will find it at telegram.me/fhem1234_bot.&lt;br /&gt;
You can now add a description, about section and profile picture for your bot, see /help for a list of commands.&lt;br /&gt;
----------------&lt;br /&gt;
Use this token to access the HTTP API:&lt;br /&gt;
1234567890:AbCdefgHIJklmnOPQRst-uvwxyz &lt;br /&gt;
&lt;br /&gt;
For a description of the Bot API, see this page: https://core.telegram.org/bots/api &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Um einen Chat an einen &amp;quot;Contact&amp;quot; versenden zu können, muss zuerst in Contacts (bei Readings) ein Kontakt auftauchen. Wenn man sich zum allerersten Mal bei Telegram angemeldet hat, gibt es noch keinen Chat mit irgendjemanden. Man muss sich zuerstmal selbst eine Nachricht im Smartphone zusenden, dann taucht unter Readings der Eintrag Contacts auf. Erst dann kann man eine Nachricht mit @msgPeerId (das ist Ziffernfolge des Contacts ) oder mit @msgPeer (das ist der Name nach dem Doppelpunkt) vom TelegramBot auf sein Smartphone senden.&lt;br /&gt;
&lt;br /&gt;
== Tipps ==&lt;br /&gt;
&lt;br /&gt;
=== Privacyeinstellungen ===&lt;br /&gt;
&lt;br /&gt;
Damit der TelegramBot auch Meldungen in Gruppen sieht, müssen über den BotFather die Privacy-Einstellungen geändert werden.&amp;lt;br&amp;gt;Beispielchat:&amp;lt;pre&amp;gt;Client:&lt;br /&gt;
/setprivacy&lt;br /&gt;
----------------&lt;br /&gt;
BotFather:&lt;br /&gt;
Choose a bot to change group messages settings.&lt;br /&gt;
----------------&lt;br /&gt;
Client:&lt;br /&gt;
@fhem1234_bot&lt;br /&gt;
----------------&lt;br /&gt;
BotFather:&lt;br /&gt;
&#039;Enable&#039; - your bot will only receive messages that either start with the &#039;/&#039; symbol or mention the bot by username.&lt;br /&gt;
&#039;Disable&#039; - your bot will receive all messages that people send to groups.&lt;br /&gt;
Current status is: ENABLED&lt;br /&gt;
----------------&lt;br /&gt;
Client:&lt;br /&gt;
Disable&lt;br /&gt;
----------------&lt;br /&gt;
BotFather:&lt;br /&gt;
Success! The new status is: DISABLED. /help&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Kontakte ===&lt;br /&gt;
&lt;br /&gt;
Der Bot merkt sich die bereits bekannten Kontakte im Reading &amp;lt;code&amp;gt;Contacts&amp;lt;/code&amp;gt;. Dabei werden die einzelnen Kontakte jeweils als 3-teilige Einträge bestehend aus UserID, Vor- und Nachname des Benutzers (mit _ verbunden) und dem Username (mit vorangestelltem @). &lt;br /&gt;
&lt;br /&gt;
Beispiel: &amp;lt;code&amp;gt;123456:Ralf_Mustermann:@ralf&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Verschiedene Einträge werden durch Leerzeichen getrennt.&lt;br /&gt;
&lt;br /&gt;
Man kann die Kontakte auch manuell überschreiben (z.B. wenn das Reading fehlerhaft oder verloren sein sollte). Dazu gibt es den Set-Befehl &amp;lt;code&amp;gt;replaceContacts&amp;lt;/code&amp;gt;. Dieser nimmt die Kontakte ebenfalls in der gleichen Form wie oben beschrieben entgegen.&lt;br /&gt;
&lt;br /&gt;
Die Kontaktliste wird ansonsten nur durch den Empfang von Nachrichten erweitert, da es im TelegramBot-API keine Möglichkeit gibt Kontaktdaten von Telegram abzufragen (siehe auch pollingTimeout)&lt;br /&gt;
&lt;br /&gt;
=== Reset ===&lt;br /&gt;
&lt;br /&gt;
Es ist möglich den Bot im laufenden Betrieb zurückzusetzen (Set-Befehl &amp;lt;code&amp;gt;reset&amp;lt;/code&amp;gt;). Dabei werden noch nicht abgeschlossene Übetragungen entfernt und die internen Zustände des Devices zurückgesetzt. &lt;br /&gt;
&lt;br /&gt;
=== Gruppen ===&lt;br /&gt;
&lt;br /&gt;
Um eine Nachricht von FHEM an eine Gruppe zu senden, muss der BOT in die Gruppe aufgenommen werden. Nach dem Senden einer Nachricht an die Gruppe kann im Modul die Gruppen-ID ermittelt werden und zum Senden von Nachrichten verwendet werden. Wenn die Privacy-Einstellungen nicht auf &#039;Disabled&#039; gesetzt wurden, muss die Nachricht mit einem Slash (/) beginnen.&lt;br /&gt;
&lt;br /&gt;
==== Supergroups / Supergruppen ====&lt;br /&gt;
&lt;br /&gt;
Auch die neuen Supergruppen werden mit dem Bot unterstützt, es ist allerdings zu beachten, dass bei der Umwandlung einer Gruppe in eine Supergruppe eine neue ID in den Kontakten von Telegram vergeben wird. Wenn man also wie empfohlen IDs zur Identifikation von Benutzern einsetzt, muss entsprechend angepasst werden.&lt;br /&gt;
&lt;br /&gt;
== Beispielszenarien ==&lt;br /&gt;
&lt;br /&gt;
=== Benachrichtigungen über Ereignisse ===&lt;br /&gt;
&lt;br /&gt;
Das einfachste Szenario für die Integration von Messaging-Diensten mit FHEM ist zur Benachrichtigung über Ereignisse. Diese Funktion kann zum Beispiel verwendet werden, um über einen erfolgten Neustart von FHEM zu informieren:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;define notify_fhem_reload notify global:INITIALIZED set telebotdevice message fhem newly started - just now !&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In diesem Beispiel wird der Nachrichtentext &amp;quot;fhem newly started - just now !&amp;quot; an den als default eingestellten Kontakt (Attribut: defaultPeer) gesendet, sobald FHEM neu gestartet wurde. Natürlich kann man auch beliebige andere Benachrichtigungen einführen.&lt;br /&gt;
&lt;br /&gt;
=== Versand von Bildern ===&lt;br /&gt;
&lt;br /&gt;
Es ist auch möglich Bilder auf dem FHEM-Server, die zum Beispiel von einer Kamera oder einem Wettermodul stammen über Telegram zu versenden. So wäre es z.B. möglich jeweils morgens die aktuelle Wetterkarte zu erhalten.&lt;br /&gt;
&lt;br /&gt;
ACHTUNG: TelegramBot verwendet das HTTPUtils-Modul zur Kommunikation mit dem TelegramBot-API. Erst mit der Version, die seit 22.10.2015 &lt;br /&gt;
([r9576] HttpUtils.pm: Async write for POST Requests {{Link2Forum|Topic=41583|LinkText=FHEM-Forum}}) verteilt wird, erlaubt auch den Transfer grösserer Bilder. Die Grenze liegt ansonsten bei ca. 14kb auf Raspberries (Plattformspezifische Grenze).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;define notify_fhem_reload notify wetter:report set telebotdevice sendPhoto /opt/fhem/wetter.jpg&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Bei Erreichen des entsprechenden Status am Wetter-Modul wird ein Image über Telegram versendet. Hier sind lokale Pfade (relativ zu fhem) oder absolute Pfade wie oben möglich.&lt;br /&gt;
&lt;br /&gt;
=== Versand von SVG-Plots ===&lt;br /&gt;
&lt;br /&gt;
Der Versand ist nicht direkt über das Device möglich, jedoch über den Perl-Befehl &#039;TelegramBot_ExecuteCommand&#039;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;{TelegramBot_ExecuteCommand($defs{&amp;quot;mein_telegramBot&amp;quot;}, meine_ZielID, &#039;{plotAsPng(&amp;quot;mein_SVG&amp;quot;)}&#039;);; return;;}&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Hierbei ist die Ziel-ID ohne das @-Zeichen, Anführungszeichen o.ä. anzugeben. Das Ziel kann auch eine Gruppen-ID (beginnend mit dem Minus-Zeichen) sein. &lt;br /&gt;
&lt;br /&gt;
mit &amp;lt;code&amp;gt; define cmd_sendTelegramSVG cmdalias TGSVG .* AS {TelegramBot_ExecuteCommand($defs{&amp;quot;mein_telegramBot&amp;quot;}, meine_ZielID, &#039;{plotAsPng($EVENT)}&#039;);; return;;}&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
kann man mit einem kurzen &lt;br /&gt;
&amp;lt;code&amp;gt; TGSVG SVG_Garten &amp;lt;/code&amp;gt;&lt;br /&gt;
ein beliebiges SVG versenden.&lt;br /&gt;
&lt;br /&gt;
Um das SVG nun noch mit einem Text zu versehen, muss eine Textnachricht dazu gesendet werden, was sich am einfachsten durch das Ausführen eines FHEM-Befehls auf Perl-Ebene realisieren lässt:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;{fhem &amp;quot;set mein_telegramBot message \@meine_ZielID Mein Text&amp;quot; ;; TelegramBot_ExecuteCommand($defs{&amp;quot;mein_telegramBot&amp;quot;}, meine_ZielID, &#039;{plotAsPng(&amp;quot;mein_SVG&amp;quot;)}&#039;);; return;;}&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Hinweis:&#039;&#039;&#039; seit dem Update Ende Februar 2017 hat die Funktion einen Parameter mehr, somit benötigt &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;{TelegramBot_ExecuteCommand($defs{&amp;quot;mein_telegramBot&amp;quot;}, meine_ZielID, &#039;{plotAsPng(&amp;quot;mein_SVG&amp;quot;)}&#039;);; return;;}&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
die folgende Erweiterung&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;{TelegramBot_ExecuteCommand($defs{&amp;quot;mein_telegramBot&amp;quot;}, meine_ZielID, undef, &#039;{plotAsPng(&amp;quot;mein_SVG&amp;quot;)}&#039;);; return;;}&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Voraussetzungen für den Versand von SVG-Plots ====&lt;br /&gt;
Es muss das Modul libimage-librsvg-perl installiert sein:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;sudo apt-get install libimage-librsvg-perl&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Evtl. sind weitere Module erforderlich:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;sudo apt-get install libgd-graph-perl&lt;br /&gt;
&lt;br /&gt;
sudo apt-get install libgd-text-perl&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Empfang von Bildern oder ähnlichem ===&lt;br /&gt;
&lt;br /&gt;
Beim Empfang von Bildern wird zuerst nur eine ID vom Telegram-Server empfangen, diese befindet sich im Reading &amp;lt;code&amp;gt;msgFileId&amp;lt;/code&amp;gt; angelegt (&amp;lt;code&amp;gt;123456:xxxxxxxxxxxxxxxxxxxxxxx-xxxxxxxx&amp;lt;/code&amp;gt;) und im Reading &amp;lt;code&amp;gt;msgText&amp;lt;/code&amp;gt; steht dann so etwas wie&lt;br /&gt;
&amp;lt;code&amp;gt;received photo # Size: 107701&amp;lt;/code&amp;gt;&lt;br /&gt;
	&lt;br /&gt;
Über das Get-Kommando &amp;lt;code&amp;gt;urlForFile&amp;lt;/code&amp;gt; mit der ID aus dem msgFileId Reading lässt sich dann daraus ein URL ableiten, der dann zur eigentlichen Datei führt: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;https://api.telegram.org/file/bot123456:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx/photo/file_25.jpg&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Versand von Emojis (Smileys) ===&lt;br /&gt;
&lt;br /&gt;
Es ist auch möglich Emojis mit den (Text-)Nachrichten zu versenden. Die entsprechenden (Unicode-)Zeichen werden einfach direkt mit in den Text der Nachricht aufgenommen. Um das zu vereinfachen kann man das einfach per Copy und Paste von dieser Seite &lt;br /&gt;
&lt;br /&gt;
http://apps.timwhitlock.info/emoji/tables/unicode (Spalte &amp;quot;Native&amp;quot;) &lt;br /&gt;
&lt;br /&gt;
übernehmen und mit der Nachricht verschicken. &lt;br /&gt;
&lt;br /&gt;
Die Emojis können auch empfangen werden und werden so auch in FHEM / FHEMWeb angezeigt. Plattformspezifische (z.B. von iOS oder Android) Emojis werden dabei nicht unterstützt (gerade mit iOS sind viele neue farbige Emojis hinzugekommen, die wohl leider nur auf Apple-devices funktionieren).&lt;br /&gt;
&lt;br /&gt;
=== Kommandos auslösen ===&lt;br /&gt;
&lt;br /&gt;
Ein wichtiges Szenario ist die Möglichkeit Kommandos in FHEM ausführen zu können, ohne einen Zugang durch die Firewall einrichten zu müssen. Dazu ist die Definition eines Schlüsselwortes (Attribut: &amp;quot;cmdKeyword&amp;quot;)erforderlich, mit dem man die Nachrichten beginnen muss, damit der TelegramBot die Kommandos erkennt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;attr telebotdevice cmdKeyword doit&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Somit kann man dann durch Nachrichten die mit &amp;quot;doit&amp;quot; beginnen Kommandos an FHEM senden, die ähnlich wie im Kommandoeingabefeld von FHEMweb dann von FHEM ausgeführt werden. Das Ergebnis der Ausführung wird zurück an den Sender (und an den definierten defaultPeer) geschickt.&lt;br /&gt;
&lt;br /&gt;
Somit können nicht nur Aktionen angestossen werden, sondern auch Infos abgefragt werden.&lt;br /&gt;
&lt;br /&gt;
Beispiele&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;doit set schalter on&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;doit list telegrambot&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Randnotiz|RNTyp=Warn|RNText=Achtung: Bei den Kommandos sollten man unbedingt das Attribut &amp;quot;cmdRestrictedPeer&amp;quot; setzen, damit nicht jeder Kommandos auf dem FHEM-Server ausführen kann. Dazu sollten die BenutzerIDs der erlaubten Benutzer (durch Leerzeichen getrennt angeben). Da Benutzernamen selber vergeben werden und nicht unbedingt eindeutig sind, sollten hier auch NUR BenutzerIDs verwendet werden.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== Favoriten für Kommandos anlegen ====&lt;br /&gt;
&lt;br /&gt;
Grundidee bei den Favoriten ist, dass man lange Befehle, die man häufig braucht auf &amp;quot;Kurzwahl&amp;quot; legt.&lt;br /&gt;
&lt;br /&gt;
Beispiel-Kommandos wie z.B. &amp;lt;code&amp;gt;set TYPE=ROLLADEN pos 100&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;set TYPE=ROLLADEN pos 0&amp;lt;/code&amp;gt;, die man immer wieder braucht. Um nicht jedes mal dieses Kommando eintippen zu müssen auf dem Smartphone, kann man auch dafür Favoriten anlegen.&lt;br /&gt;
&lt;br /&gt;
Dazu gibt man erst mal die beiden Kommandos getrennt durch Semikolon im Attribut favorites an:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;attr telegrambotdevice favorites set TYPE=ROLLADEN pos 100;set TYPE=ROLLADEN pos 0&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Um die Favorites jetzt ausführen zu können braucht man noch ein Schlüsselwort dafür.&lt;br /&gt;
Nehmen wir mal an man möchte die Favoriten mit &amp;lt;code&amp;gt;/short&amp;lt;/code&amp;gt; ausführen können. Dazu muss dann das Attribut &amp;quot;cmdFavorites&amp;quot; setzen&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;attr telegrambotdevice cmdFavorites /short&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wenn man nun im Telegram Client &lt;br /&gt;
&amp;lt;code&amp;gt;/short 1&amp;lt;/code&amp;gt; an den Bot schickt führt der Bot den ersten Favoriten aus und das Ergebnis der Ausführung wird zurückgeschickt.&lt;br /&gt;
&lt;br /&gt;
Ausserdem kann man im Telegram Client &lt;br /&gt;
&amp;lt;code&amp;gt;/short&amp;lt;/code&amp;gt; an den Bot schicken, dann antwortet der Bot mit&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Favorites&lt;br /&gt;
&lt;br /&gt;
/short1 = set TYPE=ROLLADEN pos 100&lt;br /&gt;
&lt;br /&gt;
/short2 = set TYPE=ROLLADEN pos 0&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Antworten werden als Schaltflächen dargestellt (Telegram inline Keyboard) und können am Mobile-Client direkt angeklickt werden um sie auszuführen.&lt;br /&gt;
Um die Beschriftung der Schaltflächen zu optimieren, können die Befehle im Attribut favorites mit Beschreibungen versehen werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;/[Rollaeden zu ]=set TYPE=ROLLADEN pos 100;/[Rollaeden auf]=set TYPE=ROLLADEN pos 0&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nun antwortet der Bot auf das Schlüsselwort für die Favoriten mit:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Favorites&lt;br /&gt;
&lt;br /&gt;
/short1 = Rollaeden zu&lt;br /&gt;
&lt;br /&gt;
/short2 = Rollaeden auf&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
* Github Repository für die Telegram-FHEM Entwicklung: https://github.com/viegener/Telegram-fhem&lt;br /&gt;
* Infos zum Telegram BotFather: https://core.telegram.org/bots#botfather&lt;br /&gt;
&lt;br /&gt;
* Source code für das 50_TelegramBot.pm-Modul: https://github.com/viegener/Telegram-fhem/blob/master/50_TelegramBot.pm&lt;br /&gt;
&lt;br /&gt;
* Forum-Thread in dem das Modul vorgestellt wurde {{Link2Forum|Topic=38328|LinkText=FHEM-Forum}}&lt;br /&gt;
* Telegram messaging system https://telegram.org/&lt;br /&gt;
* TelegramBot API https://core.telegram.org/bots/api&lt;/div&gt;</summary>
		<author><name>Viegener</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=FTUI_Widget_Readingsgroup&amp;diff=19705</id>
		<title>FTUI Widget Readingsgroup</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=FTUI_Widget_Readingsgroup&amp;diff=19705"/>
		<updated>2017-02-11T15:01:00Z</updated>

		<summary type="html">&lt;p&gt;Viegener: FHEM-Teile hinzugefügt und korrekturen&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Das [[{{PAGENAME}}|readingsgroup Widget]] ist ein Widget für [[FHEM Tablet UI]], mit dem eine in FHEM definierte readingsGroup auch im FHEM Tablet UI angezeigt werden kann&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
File:Ftui_widget_readingsGroup.png&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Attribute==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Attribut&lt;br /&gt;
!Beschreibung&lt;br /&gt;
!Standard-Wert&lt;br /&gt;
!Beispiel&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;data-device&#039;&#039;&#039;||FHEM-Device, dessen HTML-Inhalt angezeigt werden soll||||&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;data-get&#039;&#039;&#039;||Name des Readings, das eine Änderung der ReadingsGroup anzeigt||&#039;STATE&#039;||&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;data-max-update&#039;&#039;&#039;||Maximale Häufigkeit in Sekunden für das Update der ReadingsGoup||60||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Hinweise==&lt;br /&gt;
Im ReadingsGroup widget wird anders als in anderen widgets nicht der angegebene Wert aus dem Device dargestellt, sondern der HTML-Inhalt des angegebenen ReadingsGroup-Devices. Dieser HTML-Inhalt wird ohne Änderungen eingebettet. Das data-get Reading dient nur dazu ein nötiges Update der ReadingsGroup zu erkennen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==CSS-Klassen==&lt;br /&gt;
Keine eigenen CSS-Klassen, im HTML-Rendering können aber Referenzen auf CSS-Klassen aus FHEMWeb enthalten sein&lt;br /&gt;
&lt;br /&gt;
==Beispiele==&lt;br /&gt;
===ReadingsGroup von verschiedenen Thermo/Hygro-Sensoren===&lt;br /&gt;
Hier werden Readings für verschiedene Typen von Sensoren als Tabelle angezeigt.&lt;br /&gt;
&lt;br /&gt;
[[File:Ftui_widget_readingsGroup.png]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;header&amp;gt;THY readings&amp;lt;/header&amp;gt;&lt;br /&gt;
  &amp;lt;div class=&amp;quot;cell&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;div data-type=&amp;quot;readingsgroup&amp;quot; data-device=&amp;quot;MyTHYReadings&amp;quot;&amp;gt;&amp;lt;/div&amp;gt; &lt;br /&gt;
  &amp;lt;/div&amp;gt; &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Der Vollständigkeit halber noch die Definition der readingsGroup in FHEM&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
define MyTHYReadings readingsGroup &amp;lt;%temperature_humidity&amp;gt;,&amp;lt;%temp_temperature&amp;gt;,&amp;lt;&amp;gt;,&amp;lt;%weather_humidity&amp;gt;,&amp;lt;&amp;gt;,&amp;lt;%measure_battery_50&amp;gt;,&amp;lt;&amp;gt;,&amp;lt;Update&amp;gt;&lt;br /&gt;
TYPE=LaCrosse:temperature,&amp;lt;&amp;amp;nbsp;&amp;gt;,humidity,&amp;lt;&amp;amp;nbsp;&amp;gt;,battery,&amp;lt;&amp;amp;nbsp;&amp;gt;,&amp;lt;{getTimeDiffDesc(getNewestTimestamp($DEVICE,&amp;quot;temperature&amp;quot;,&amp;quot;humidity&amp;quot;))}@temperature&amp;gt; &lt;br /&gt;
TYPE=CUL_TX:temperature,&amp;lt;&amp;amp;nbsp;&amp;gt;,humidity,&amp;lt;&amp;amp;nbsp;&amp;gt;,&amp;lt;&amp;gt;,&amp;lt;&amp;amp;nbsp;&amp;gt;,&amp;lt;{getTimeDiffDesc(getNewestTimestamp($DEVICE,&amp;quot;temperature&amp;quot;,&amp;quot;humidity&amp;quot;))}@temperature&amp;gt; &lt;br /&gt;
HMT_wz:measured-temp,&amp;lt;&amp;amp;nbsp;&amp;gt;,humidity,&amp;lt;&amp;amp;nbsp;&amp;gt;,battery,&amp;lt;&amp;amp;nbsp;&amp;gt;,&amp;lt;{getTimeDiffDesc(getNewestTimestamp($DEVICE,&amp;quot;measured-temp&amp;quot;,&amp;quot;humidity&amp;quot;))}@measured-temp&amp;gt; &lt;br /&gt;
HMT_lars:measured-temp,&amp;lt;&amp;amp;nbsp;&amp;gt;,&amp;lt;&amp;gt;,&amp;lt;&amp;amp;nbsp;&amp;gt;,battery,&amp;lt;&amp;amp;nbsp;&amp;gt;,&amp;lt;{getTimeDiffDesc(getNewestTimestamp($DEVICE,&amp;quot;measured-temp&amp;quot;,&amp;quot;battery&amp;quot;))}@measured-temp&amp;gt;&lt;br /&gt;
attr MyTHYReadings noheading 1&lt;br /&gt;
attr MyTHYReadings room TEMP&lt;br /&gt;
attr MyTHYReadings valueStyle style=&amp;quot;text-align:right&amp;quot;&lt;br /&gt;
attr MyTHYReadings valueSuffix { &amp;quot;temperature&amp;quot; =&amp;gt; &#039; C   &#039;, &amp;quot;measured-temp&amp;quot; =&amp;gt; &#039; C   &#039; , &amp;quot;humidity&amp;quot; =&amp;gt; &#039; %   &#039;  } &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Und damit auch alles funktioniert hier noch der Perl-Code (aus 99_myUtils) für die beiden Perl-Routinen&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
##############################################&lt;br /&gt;
# Berechne Zeitdifferenz von String zeit -&amp;gt; als Beschreibung&lt;br /&gt;
#&lt;br /&gt;
sub getTimeDiffDesc($) {&lt;br /&gt;
&lt;br /&gt;
  my ($str) = @_; &lt;br /&gt;
  &lt;br /&gt;
  my $now = time;&lt;br /&gt;
&lt;br /&gt;
  my $td = $now - time_str2num( $str );&lt;br /&gt;
&lt;br /&gt;
  my $tstr = &amp;quot;???&amp;quot;;&lt;br /&gt;
  &lt;br /&gt;
  if ( $td &amp;lt; 1 ) {&lt;br /&gt;
    $tstr = &amp;quot;&amp;lt;1m&amp;quot;;&lt;br /&gt;
  } elsif ( $td &amp;lt; 60 ) {&lt;br /&gt;
    $tstr = &amp;quot;&amp;lt;1m&amp;quot;;&lt;br /&gt;
  } elsif ( $td &amp;lt; 3600 ) {&lt;br /&gt;
    $tstr = sprintf(&amp;quot;%2d&amp;quot;, int(($td/60) + 0.5) ).&amp;quot;m&amp;quot; ;&lt;br /&gt;
  } elsif ( $td &amp;lt; (3600*24) ) {&lt;br /&gt;
    $tstr = sprintf(&amp;quot;%2d&amp;quot;, int(($td/3600) + 0.5) ).&amp;quot;h&amp;quot; ;&lt;br /&gt;
  } else {&lt;br /&gt;
    $tstr = int(($td/(3600*24)) + 0.5).&amp;quot;d&amp;quot; ;&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  return $tstr;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
##############################################&lt;br /&gt;
# Berechne neuesten Zeitstempel von mehreren Stati&lt;br /&gt;
#&lt;br /&gt;
sub getNewestTimestamp($@) {&lt;br /&gt;
&lt;br /&gt;
  my ($device, @args) = @_; &lt;br /&gt;
&lt;br /&gt;
  my $nt = 0;&lt;br /&gt;
  my $nts = &amp;quot;&amp;quot;;&lt;br /&gt;
  &lt;br /&gt;
  for(my $i=0; $i &amp;lt; int(@args); $i++) {&lt;br /&gt;
    my $tds = ReadingsTimestamp($device,$args[$i],&amp;quot;&amp;quot;);&lt;br /&gt;
    if ( $tds ne &amp;quot;&amp;quot; ) {&lt;br /&gt;
      my $td = time_str2num( $tds );&lt;br /&gt;
      if ( $nt == 0 ) {&lt;br /&gt;
        $nt = $td;&lt;br /&gt;
        $nts = $tds;&lt;br /&gt;
      } elsif ( $td &amp;gt; $nt ) {&lt;br /&gt;
        $nt = $td;&lt;br /&gt;
        $nts = $tds;&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  } &lt;br /&gt;
  &lt;br /&gt;
  return $nts;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:FHEM Tablet UI]]&lt;/div&gt;</summary>
		<author><name>Viegener</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=FTUI_Widget_Readingsgroup&amp;diff=19685</id>
		<title>FTUI Widget Readingsgroup</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=FTUI_Widget_Readingsgroup&amp;diff=19685"/>
		<updated>2017-02-11T01:23:26Z</updated>

		<summary type="html">&lt;p&gt;Viegener: Erster Entwurf für readingsGroup widget&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Das [[{{PAGENAME}}|readingsgroup Widget]] ist ein Widget für [[FHEM Tablet UI]], mit dem eine in FHEM definierte readingsGroup auch im tablet UI angezeigt werden kann&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
File:Ftui_widget_readingsGroup.png&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Attribute==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Attribut&lt;br /&gt;
!Beschreibung&lt;br /&gt;
!Standard-Wert&lt;br /&gt;
!Beispiel&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;data-device&#039;&#039;&#039;||FHEM-Device, dessen Reading Reading angezeigt werden soll||||&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;data-get&#039;&#039;&#039;||Name des Readings, das eine Änderung der ReadingsGroup angibt||&#039;STATE&#039;||&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;data-max-update&#039;&#039;&#039;||Maximale Häufigkeit in Sekunden für das Update der ReadingsGoup||60||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Hinweise==&lt;br /&gt;
Im ReadingsGroup widget wird anders als in anderen widgets nicht der angegebene Wert aus dem Device dargestellt, sondern der HTML-Inhalt des angegebenen Devices. Dieser HTML-Inhalt wird ohne Änderungen eingebettet. Das data-get Reading dient nur dazu ein nötiges Update der ReadingsGroup zu erkennen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==CSS-Klassen==&lt;br /&gt;
Keine eigenen CSS-Klassen, im HTML-Rendering können aber Referenzen auf CSS-Klassen aus FHEMWeb enthalten sein&lt;br /&gt;
&lt;br /&gt;
==Beispiele==&lt;br /&gt;
===ReadingsGroup von verschiedenen Thermo/Hygro-Sensoren===&lt;br /&gt;
Hier werden Readings für verschiedene Typen von Sensoren als Tabelle angezeigt.&lt;br /&gt;
&lt;br /&gt;
[[File:Ftui_widget_readingsGroup.png]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;header&amp;gt;THY readings&amp;lt;/header&amp;gt;&lt;br /&gt;
  &amp;lt;div class=&amp;quot;cell&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;div data-type=&amp;quot;readingsgroup&amp;quot; data-device=&amp;quot;MyTHYReadings&amp;quot;&amp;gt;&amp;lt;/div&amp;gt; &lt;br /&gt;
  &amp;lt;/div&amp;gt; &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:FHEM Tablet UI]]&lt;/div&gt;</summary>
		<author><name>Viegener</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=Datei:Ftui_widget_readingsGroup.png&amp;diff=19684</id>
		<title>Datei:Ftui widget readingsGroup.png</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=Datei:Ftui_widget_readingsGroup.png&amp;diff=19684"/>
		<updated>2017-02-11T01:21:22Z</updated>

		<summary type="html">&lt;p&gt;Viegener: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Viegener</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=TelegramBot&amp;diff=15652</id>
		<title>TelegramBot</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=TelegramBot&amp;diff=15652"/>
		<updated>2016-06-23T22:55:52Z</updated>

		<summary type="html">&lt;p&gt;Viegener: Beispiel zu favoriten korrigiert&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Infobox Modul&lt;br /&gt;
|ModPurpose=Senden und Empfangen von Nachrichten (Text und Fotos) mit dem freien Messagingdienst Telegram&lt;br /&gt;
|ModType=d&lt;br /&gt;
|ModForumArea=Unterstützende Dienste&lt;br /&gt;
|ModFTopic=38328&lt;br /&gt;
|ModTechName=[https://github.com/viegener/Telegram-fhem/blob/master/50_TelegramBot.pm 50_TelegramBot.pm]&lt;br /&gt;
|ModOwner=[[Benutzer:Viegener|Viegener]] ({{Link2FU|12772|Forum}} / [[Benutzer Diskussion:Viegener|Wiki]])}}&lt;br /&gt;
&lt;br /&gt;
Das [[TelegramBot]]-Modul ermöglicht das Senden und Empfangen von Nachrichten über den Telegram-instant messaging Dienst (https://telegram.org/). &lt;br /&gt;
Es entsteht eine Möglichkeit Benachrichtungen aus Fhem zu versenden, zum Beispiel Alarmmeldungen.&lt;br /&gt;
Ausserdem können auch Kommandos über Telegram an Fhem gesendet werden um Steuerungsbefehle in Fhem auszulösen.&lt;br /&gt;
&lt;br /&gt;
Das TelegramBot-Modul benötigt keine Zusatzsoftware auf dem Fhem-Server (anders als die Variante [[Telegram]]), sondern verwendet das [https://core.telegram.org/bots/api TelegramBot-API] über https-Aufrufe. Es muss jedoch das perl JSON modul installiert sein. &lt;br /&gt;
&lt;br /&gt;
== Über Telegram Instant Messaging ==&lt;br /&gt;
Telegram-IDs und Versand/Empfang von Nachrichten sind kostenfrei. &lt;br /&gt;
Clients sind für gängige Smartphonesysteme erhältlich (iOS iPhone und Tablet, Android, Windows Phone) und &lt;br /&gt;
können auch aus dem WebBrowser verwendet werden. &lt;br /&gt;
Es gibt auch einen Kommandozeilen-Client für Linux, der die Grundlage dieses Moduls darstellt. &lt;br /&gt;
Mehrfachanmeldungen, auch parallel mit verschiedenen Geräten (z.B. Tablet und Smartphone), sind möglich.&lt;br /&gt;
Gruppenchats und Chats mit End-2-End-Verschlüsselung werden ebenfalls unterstützt.&lt;br /&gt;
&lt;br /&gt;
Für die Unterstützung von &#039;&#039;WhatsApp&#039;&#039; siehe Modul [[yowsup]].&lt;br /&gt;
&lt;br /&gt;
== Features ==&lt;br /&gt;
Unterstützt werden:&lt;br /&gt;
&lt;br /&gt;
* Versand von Textnachrichten &lt;br /&gt;
* Versand und Empfang von Bildern/Audio/etc &lt;br /&gt;
* Empfang von Textnachrichten von beliebigen Kontakten&lt;br /&gt;
* Kommandos in Fhem über Telegram-Nachrichten von aussen auslösen&lt;br /&gt;
* Ergebnisse der Kommandos zusenden lassen&lt;br /&gt;
&lt;br /&gt;
Eine detaillierte Beschreibung des Moduls ist im Fhem Forum und in der (englischen) Dokumentation zum Modul in der Commandref diesem  {{Link2Forum|Topic=38328|LinkText=Diskussionsthread}} zu finden. Seit Oktober 2015 wird das Modul offiziell über Fhem-Update verteilt.&lt;br /&gt;
&lt;br /&gt;
Die jeweils aktuellste Entwicklungs-Version des Moduls ist in Github [https://github.com/viegener/Telegram-fhem/blob/master/50_TelegramBot.pm 50_TelegramBot.pm] verfügbar.&lt;br /&gt;
&lt;br /&gt;
== Hinweise zum Betrieb mit Fhem ==&lt;br /&gt;
{{Randnotiz|RNTyp=Warn|RNText=Achtung: Dieses Authtoken ist die einzige Authentifizierung für den Bot und sollte deshalb nicht aus der Hand gegeben werden. Die verwendeten Urls sind deshalb auch in den Log-Files nicht enthalten, da diese das Authtoken in Klartext enthalten. Auch im Forum sollte dieses Token nicht aufgenommen werden.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Für die Anlage eines TelegramBot Devices in Fhem ist ein Authtoken erforderlich. Dieses Token wird über Anlegen eines neuen Bots im [https://core.telegram.org/bots#botfather BotFather] erzeugt. Dort mit dem Telegram-Befehl &amp;lt;code&amp;gt;/newbot&amp;lt;/code&amp;gt; einen neuen Bot anlegen und mit einem Namen versehen. Hinweis: Die Namen für Bots müssen auf &amp;quot;Bot&amp;quot; enden.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Das Anlegen eines TelegramBot devices erfolgt durch die Angabe dieses Tokens:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;define &amp;amp;lt;name&amp;amp;gt; TelegramBot  &amp;amp;lt;token&amp;amp;gt; &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Beispiel: &amp;lt;code&amp;gt;define teleBot TelegramBot 110201543:AAHdqTcvCH1vGWJxfSeofSAs0K5PALDsaw&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Das Empfangen von Nachrichten (polling) erfordert die Einstellung des Attributes&#039;&#039;&#039; &lt;br /&gt;
&amp;lt;code&amp;gt;pollingTimeout&amp;lt;/code&amp;gt; &#039;&#039;&#039;auf einen Wert der grösser als Null ist. Beim Wert 0 oder ohne Setzen des Attributes findet kein Polling und damit auch kein Empfang statt.&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
Beispiel: &amp;lt;code&amp;gt;attr teleBot pollingTimeout 120&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Der TelegramBot kann erst dann Nachrichten an einen telegram user schicken, wenn dieser zuerst an den telegram bot eine Nachricht gesendet hat.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{{Randnotiz|RNTyp=Warn|RNText=TelegramBot setzt eine aktuelle Version von FHEM voraus, insbesondere Versionen weit vor der Umstellung auf 5.7 (also vor Herbst 2015) können mit einem TelegramBot-Modul nicht funktionieren, da insbesondere das HTTPSRV-Modul dann veraltet ist. Am besten auch den TelegramBot über den offiziellen Update mit dem Rest von FHEM installieren/aktualisieren.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Registrierung eines neuen Bot ==&lt;br /&gt;
Zur Registrierung wird ein funktionierender Telegram-Client (egal ob Web, App oder Programm)benötigt. Hier wird ein Chat zum BotFather gestartet und der Befehl /newbot gesendet. Nun fragt der BotFather die benötigten Angaben ab und liefert am Ende des Dialogs die Informationen für den neuen Bot.&lt;br /&gt;
Hier ein Beispiel, wie so ein Chat aussehen könnte:&lt;br /&gt;
&amp;lt;pre&amp;gt;Client: &lt;br /&gt;
/newbot&lt;br /&gt;
----------------&lt;br /&gt;
BotFather:&lt;br /&gt;
Alright, a new bot. How are we going to call it? Please choose a name for your bot. &lt;br /&gt;
----------------&lt;br /&gt;
Client: &lt;br /&gt;
Mein Name &lt;br /&gt;
----------------&lt;br /&gt;
BotFather: &lt;br /&gt;
Good. Now let&#039;s choose a username for your bot. It must end in `bot`. Like this, for example: TetrisBot or tetris_bot.&lt;br /&gt;
----------------&lt;br /&gt;
Client: &lt;br /&gt;
fhem_bot&lt;br /&gt;
----------------&lt;br /&gt;
BotFather: &lt;br /&gt;
Sorry, this username is already taken. Think of something different.&lt;br /&gt;
----------------&lt;br /&gt;
Client: &lt;br /&gt;
fhem1234_bot&lt;br /&gt;
----------------&lt;br /&gt;
BotFather: &lt;br /&gt;
Done! Congratulations on your new bot.&lt;br /&gt;
You will find it at telegram.me/fhem1234_bot.&lt;br /&gt;
You can now add a description, about section and profile picture for your bot, see /help for a list of commands.&lt;br /&gt;
----------------&lt;br /&gt;
Use this token to access the HTTP API:&lt;br /&gt;
1234567890:AbCdefgHIJklmnOPQRst-uvwxyz &lt;br /&gt;
&lt;br /&gt;
For a description of the Bot API, see this page: https://core.telegram.org/bots/api &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Tipps ==&lt;br /&gt;
&lt;br /&gt;
=== Privacyeinstellungen ===&lt;br /&gt;
&lt;br /&gt;
Damit der TelegramBot auch Meldungen in Gruppen sieht, müssen über den BotFather die Privacy-Einstellungen geändert werden.&amp;lt;br&amp;gt;Beispielchat:&amp;lt;pre&amp;gt;Client:&lt;br /&gt;
/setprivacy&lt;br /&gt;
----------------&lt;br /&gt;
BotFather:&lt;br /&gt;
Choose a bot to change group messages settings.&lt;br /&gt;
----------------&lt;br /&gt;
Client:&lt;br /&gt;
@fhem1234_bot&lt;br /&gt;
----------------&lt;br /&gt;
BotFather:&lt;br /&gt;
&#039;Enable&#039; - your bot will only receive messages that either start with the &#039;/&#039; symbol or mention the bot by username.&lt;br /&gt;
&#039;Disable&#039; - your bot will receive all messages that people send to groups.&lt;br /&gt;
Current status is: ENABLED&lt;br /&gt;
----------------&lt;br /&gt;
Client:&lt;br /&gt;
Disable&lt;br /&gt;
----------------&lt;br /&gt;
BotFather:&lt;br /&gt;
Success! The new status is: DISABLED. /help&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Kontakte ===&lt;br /&gt;
&lt;br /&gt;
Der Bot merkt sich die bereits bekannten Kontakte im Reading &amp;lt;code&amp;gt;Contacts&amp;lt;/code&amp;gt;. Dabei werden die einzelnen Kontakte jeweils als 3-teilige Einträge bestehend aus UserID, Vor- und Nachname des Benutzers (mit _ verbunden) und dem Username (mit vorangestelltem @). &lt;br /&gt;
&lt;br /&gt;
Beispiel: &amp;lt;code&amp;gt;123456:Ralf_Mustermann:@ralf&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Verschiedene Einträge werden durch Leerzeichen getrennt.&lt;br /&gt;
&lt;br /&gt;
Man kann die Kontakte auch manuell überschreiben (z.B. wenn das Reading fehlerhaft oder verloren sein sollte). Dazu gibt es den Set-Befehl &amp;lt;code&amp;gt;replaceContacts&amp;lt;/code&amp;gt;. Dieser nimmt die Kontakte ebenfalls in der gleichen Form wie oben beschrieben entgegen.&lt;br /&gt;
&lt;br /&gt;
Die Kontaktliste wird ansonsten nur durch den Empfang von Nachrichten erweitert, da es im TelegramBot-API keine Möglichkeit gibt Kontaktdaten von Telegram abzufragen (siehe auch pollingTimeout)&lt;br /&gt;
&lt;br /&gt;
=== Reset ===&lt;br /&gt;
&lt;br /&gt;
Es ist möglich den Bot im laufenden Betrieb zurückzusetzen (Set-Befehl &amp;lt;code&amp;gt;reset&amp;lt;/code&amp;gt;). Dabei werden noch nicht abgeschlossene Übetragungen entfernt und die internen Zustände des Devices zurückgesetzt. &lt;br /&gt;
&lt;br /&gt;
=== Gruppen ===&lt;br /&gt;
&lt;br /&gt;
Um eine Nachricht von FHEM an eine Gruppe zu senden, muss der BOT in die Gruppe aufgenommen werden. Nach dem Senden einer Nachricht an die Gruppe kann im Modul die Gruppen-ID ermittelt werden und zum Senden von Nachrichten verwendet werden. Wenn die Privacy-Einstellungen nicht auf &#039;Disabled&#039; gesetzt wurden, muss die Nachricht mit einem Slash (/) beginnen.&lt;br /&gt;
&lt;br /&gt;
==== Supergroups / Supergruppen ====&lt;br /&gt;
&lt;br /&gt;
Auch die neuen Supergruppen werden mit dem Bot unterstützt, es ist allerdings zu beachten, dass bei der Umwandlung einer Gruppe in eine Supergruppe eine neue ID in den Kontakten von Telegram vergeben wird. Wenn man also wie empfohlen IDs zur Identifikation von Benutzern einsetzt, muss entsprechend angepasst werden.&lt;br /&gt;
&lt;br /&gt;
== Beispielszenarien ==&lt;br /&gt;
&lt;br /&gt;
=== Benachrichtigungen über Ereignisse ===&lt;br /&gt;
&lt;br /&gt;
Das einfachste Szenario für die Integration von Messaging-Diensten mit Fhem ist zur Benachrichtigung über Ereignisse. Diese Funktion kann zum Beispiel verwendet werden, um über einen erfolgten Neustart von Fhem zu informieren:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;define notify_fhem_reload notify global:INITIALIZED set telebotdevice message fhem newly started - just now !&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In diesem Beispiel wird der Nachrichtentext &amp;quot;fhem newly started - just now !&amp;quot; an den als default eingestellten Kontakt (Attribut: defaultPeer) gesendet, sobald Fhem neu gestartet wurde. Natürlich kann man auch beliebige andere Benachrichtigungen einführen.&lt;br /&gt;
&lt;br /&gt;
=== Versand von Bildern ===&lt;br /&gt;
&lt;br /&gt;
Es ist auch möglich Bilder auf dem Fhem-Server, die zum Beispiel von einer Kamera oder einem Wettermodul stammen über Telegram zu versenden. So wäre es z.B. möglich jeweils morgens die aktuelle Wetterkarte zu erhalten.&lt;br /&gt;
&lt;br /&gt;
ACHTUNG: TelegramBot verwendet das HTTPUtils-Modul zur Kommunikation mit dem TelegramBot-API. Erst mit der Version, die seit 22.10.2015 &lt;br /&gt;
([r9576] HttpUtils.pm: Async write for POST Requests {{Link2Forum|Topic=41583|LinkText=Fhem-Forum}}) verteilt wird, erlaubt auch den Transfer grösserer Bilder. Die Grenze liegt ansonsten bei ca. 14kb auf Raspberries (Plattformspezifische Grenze).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;define notify_fhem_reload notify wetter:report set telebotdevice sendPhoto /opt/fhem/wetter.jpg&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Bei Erreichen des entsprechenden Status am Wetter-Modul wird ein Image über Telegram versendet. Hier sind lokale Pfade (relativ zu fhem) oder absolute Pfade wie oben möglich.&lt;br /&gt;
&lt;br /&gt;
=== Versand von SVG-Plots ===&lt;br /&gt;
&lt;br /&gt;
Der Versand ist nicht direkt über das Device möglich, jedoch über den Perl-Befehl &#039;TelegramBot_ExecuteCommand&#039;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;{TelegramBot_ExecuteCommand($defs{&amp;quot;mein_telegramBot&amp;quot;}, meine_ZielID, &#039;{plotAsPng(&amp;quot;mein_SVG&amp;quot;)}&#039;);; return;;}&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Hierbei ist die Ziel-ID ohne das @-Zeichen, Anführungszeichen o.ä. anzugeben. Das Ziel kann auch eine Gruppen-ID (beginnend mit dem Minus-Zeichen) sein. Um das SVG nun noch mit einem Text zu versehen, muss eine Textnachricht dazu gesendet werden, was sich am einfachsten durch das Ausführen eines FHEM-Befehls auf Perl-Ebene realisieren lässt:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;{fhem &amp;quot;set mein_telegramBot message \@meine_ZielID Mein Text&amp;quot; ;; TelegramBot_ExecuteCommand($defs{&amp;quot;mein_telegramBot&amp;quot;}, meine_ZielID, &#039;{plotAsPng(&amp;quot;mein_SVG&amp;quot;)}&#039;);; return;;}&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Voraussetzungen für den Versand von SVG-Plots ====&lt;br /&gt;
Es muss das Modul libimage-librsvg-perl installiert sein:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;sudo apt-get install libimage-librsvg-perl&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Evtl. sind weitere Module erforderlich:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;sudo apt-get install libgd-graph-perl&lt;br /&gt;
&lt;br /&gt;
sudo apt-get install libgd-text-perl&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Empfang von Bildern oder ähnlichem ===&lt;br /&gt;
&lt;br /&gt;
Beim Empfang von Bildern wird zuerst nur eine ID vom Telegram-Server empfangen, diese befindet sich im Reading &amp;lt;code&amp;gt;msgFileId&amp;lt;/code&amp;gt; angelegt (&amp;lt;code&amp;gt;123456:xxxxxxxxxxxxxxxxxxxxxxx-xxxxxxxx&amp;lt;/code&amp;gt;) und im Reading &amp;lt;code&amp;gt;msgText&amp;lt;/code&amp;gt; steht dann so etwas wie&lt;br /&gt;
&amp;lt;code&amp;gt;received photo # Size: 107701&amp;lt;/code&amp;gt;&lt;br /&gt;
	&lt;br /&gt;
Über das Get-Kommando &amp;lt;code&amp;gt;urlForFile&amp;lt;/code&amp;gt; mit der ID aus dem msgFileId Reading lässt sich dann daraus ein URL ableiten, der dann zur eigentlichen Datei führt: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;https://api.telegram.org/file/bot123456:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx/photo/file_25.jpg&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Versand von Emojis (Smileys) ===&lt;br /&gt;
&lt;br /&gt;
Es ist auch möglich Emojis mit den (Text-)Nachrichten zu versenden. Die entsprechenden (Unicode-)Zeichen werden einfach direkt mit in den Text der Nachricht aufgenommen. Um das zu vereinfachen kann man das einfach per Copy und Paste von dieser Seite &lt;br /&gt;
&lt;br /&gt;
http://apps.timwhitlock.info/emoji/tables/unicode (Spalte &amp;quot;Native&amp;quot;) &lt;br /&gt;
&lt;br /&gt;
übernehmen und mit der Nachricht verschicken. &lt;br /&gt;
&lt;br /&gt;
Die Emojis können auch empfangen werden und werden so auch in FHEM / FHEMWeb angezeigt. Plattformspezifische (z.B. von iOS oder Android) Emojis werden dabei nicht unterstützt (gerade mit iOS sind viele neue farbige Emojis hinzugekommen, die wohl leider nur auf Apple-devices funktionieren).&lt;br /&gt;
&lt;br /&gt;
=== Kommandos auslösen ===&lt;br /&gt;
&lt;br /&gt;
Ein wichtiges Szenario ist die Möglichkeit Kommandos in Fhem ausführen zu können, ohne einen Zugang durch die Firewall einrichten zu müssen. Dazu ist die Definition eines Schlüsselwortes (Attribut: &amp;quot;cmdKeyword&amp;quot;)erforderlich, mit dem man die Nachrichten beginnen muss, damit der TelegramBot die Kommandos erkennt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;attr telebotdevice cmdKeyword doit&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Somit kann man dann durch Nachrichten die mit &amp;quot;doit&amp;quot; beginnen Kommandos an Fhem senden, die ähnlich wie im Kommandoeingabefeld von Fhemweb dann von Fhem ausgeführt werden. Das Ergebnis der Ausführung wird zurück an den Sender (und an den definierten defaultPeer) geschickt.&lt;br /&gt;
&lt;br /&gt;
Somit können nicht nur Aktionen angestossen werden, sondern auch Infos abgefragt werden.&lt;br /&gt;
&lt;br /&gt;
Beispiele&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;doit set schalter on&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;doit list telegrambot&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Randnotiz|RNTyp=Warn|RNText=Achtung: Bei den Kommandos sollten man unbedingt das Attribut &amp;quot;cmdRestrictedPeer&amp;quot; setzen, damit nicht jeder Kommandos auf dem Fhem-Server ausführen kann. Dazu sollten die BenutzerIDs der erlaubten Benutzer (durch Leerzeichen getrennt angeben). Da Benutzernamen selber vergeben werden und nicht unbedingt eindeutig sind, sollten hier auch NUR BenutzerIDs verwendet werden.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== Favoriten für Kommandos anlegen ====&lt;br /&gt;
&lt;br /&gt;
Grundidee bei den Favoriten ist, dass man lange Befehle, die man häufig braucht auf &amp;quot;Kurzwahl&amp;quot; legt.&lt;br /&gt;
&lt;br /&gt;
Beispiel-Kommandos wie z.B. &amp;lt;code&amp;gt;set TYPE=ROLLADEN pos 100&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;set TYPE=ROLLADEN pos 0&amp;lt;/code&amp;gt;, die man immer wieder braucht. Um nicht jedes mal dieses Kommando eintippen zu müssen auf dem Smartphone, kann man auch dafür Favoriten anlegen.&lt;br /&gt;
&lt;br /&gt;
Dazu gibt man erst mal die beiden Kommandos getrennt durch Semikolon im Attribut favorites an:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;attr telegrambotdevice favorites set TYPE=ROLLADEN pos 100;set TYPE=ROLLADEN pos 0&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Um die Favorites jetzt ausführen zu können braucht man noch ein Schlüsselwort dafür.&lt;br /&gt;
Nehmen wir mal an man möchte die Favoriten mit &amp;lt;code&amp;gt;/short&amp;lt;/code&amp;gt; ausführen können. Dazu muss dann das Attribut &amp;quot;cmdFavorites&amp;quot; setzen&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;attr telegrambotdevice cmdFavorites /short&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wenn man nun im Telegram Client &lt;br /&gt;
&amp;lt;code&amp;gt;/short 1&amp;lt;/code&amp;gt; an den Bot schickt führt der Bot den ersten Favoriten aus und das Ergebnis der Ausführung wird zurückgeschickt.&lt;br /&gt;
&lt;br /&gt;
Ausserdem kann man im Telegram Client &lt;br /&gt;
&amp;lt;code&amp;gt;/short&amp;lt;/code&amp;gt; an den Bot schicken, dann antwortet der Bot mit&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Favorites&lt;br /&gt;
&lt;br /&gt;
/short1 = set TYPE=ROLLADEN pos 100&lt;br /&gt;
&lt;br /&gt;
/short2 = set TYPE=ROLLADEN pos 0&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Antworten werden als Schaltflächen dargestellt (Telegram inline Keyboard) und können am Mobile-Client direkt angeklickt werden um sie auszuführen.&lt;br /&gt;
Um die Beschriftung der Schaltflächen zu optimieren, können die Befehle im Attribut favorites mit Beschreibungen versehen werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;/[Rollaeden zu ]=set TYPE=ROLLADEN pos 100;/[Rollaeden auf]=set TYPE=ROLLADEN pos 0&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nun antwortet der Bot auf das Schlüsselwort für die Favoriten mit:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Favorites&lt;br /&gt;
&lt;br /&gt;
/short1 = Rollaeden zu&lt;br /&gt;
&lt;br /&gt;
/short2 = Rollaeden auf&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
* Github Repository für die Telegram-Fhem Entwicklung: https://github.com/viegener/Telegram-fhem&lt;br /&gt;
* Infos zum Telegram BotFather: https://core.telegram.org/bots#botfather&lt;br /&gt;
&lt;br /&gt;
* Source code für das 50_TelegramBot.pm-Modul: https://github.com/viegener/Telegram-fhem/blob/master/50_TelegramBot.pm&lt;br /&gt;
&lt;br /&gt;
* Forum-Thread in dem das Modul vorgestellt wurde {{Link2Forum|Topic=38328|LinkText=Fhem-Forum}}&lt;br /&gt;
* Telegram messaging system https://telegram.org/&lt;br /&gt;
* TelegramBot API https://core.telegram.org/bots/api&lt;br /&gt;
&lt;br /&gt;
--[[Benutzer:Viegener|Viegener]] ([[Benutzer Diskussion:Viegener|Diskussion]]) 22:49, 11. Okt. 2015 (CEST)&lt;/div&gt;</summary>
		<author><name>Viegener</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=DevelopmentModuleAPI&amp;diff=15293</id>
		<title>DevelopmentModuleAPI</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=DevelopmentModuleAPI&amp;diff=15293"/>
		<updated>2016-05-05T10:31:12Z</updated>

		<summary type="html">&lt;p&gt;Viegener: Added SNAME for AnalyzeCommand&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
&lt;br /&gt;
{{Randnotiz|RNTyp=r|RNText=Bitte beachten: Diese Auflistung von Funktionen wird nicht aktiv durch 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 official maintained by the 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;
Dieses 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 identifiziern 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 einen Funktion stolpert, die auch andere interessieren könnte.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== FHEM-Befehlsausführung ==&lt;br /&gt;
=== AnalyzeCommand ===&lt;br /&gt;
AnalyzeCommand ermöglicht das Parsen und die Ausführung eines FHEM-Befehls, wie in [[FHEMWEB]] im Kommandoeingabefeld enthalten.&lt;br /&gt;
:&amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;$error = AnalyzeCommand($client_hash, $cmd)&amp;lt;/source&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 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;
|| Kommandos, die ausgeführt werden sollen.&amp;lt;br&amp;gt;&lt;br /&gt;
Beispiel:&lt;br /&gt;
* &#039;&#039;define dummy1 dummy&#039;&#039;&lt;br /&gt;
* &#039;&#039;{ Log3(undef, 1, &amp;quot;Hallo&amp;quot;);}&#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;$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;
&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;source lang=&amp;quot;perl&amp;quot;&amp;gt;$errors = AnalyzeCommandChain ($client_hash, $cmds)&amp;lt;/source&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;
&lt;br /&gt;
=== EvalSpecials ===&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;$final_cmd = EvalSpecials($cmd, %specials)&amp;lt;/source&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;
&lt;br /&gt;
=== parseParams ===&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;my($a, $h) = parseParams($cmd, $separator);&amp;lt;/source&amp;gt;&lt;br /&gt;
parseParams() ermöglicht das Parsen von Kommandozeilenargumenten und lässt sich z.b. für die Parameter von define (DefFn), get (GetFn) und 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 gleichen Anzahl öffnender und schliessender Klammern erreicht ist. &lt;br /&gt;
&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 festlegen das parseParams für die define, get und set argumente automatisch aufgerufen und das Ergebniss an die DefFn, GetFn und SetFn übergeben wird.&lt;br /&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;$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 ArrayRef. &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 Separater an dem die Parameterzeile gesplittet werden soll. &lt;br /&gt;
&lt;br /&gt;
Standardwert: &#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 Ref auf ein Array das alle nicht benannten Parameter in der Reihenfolge ihres vorkommen 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 Ref auf einen Hash der die Werte aller benannten Parameter mit ihrem Namen als Key enthält.&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; } }&#039;;&amp;lt;/code&amp;gt;&lt;br /&gt;
wird in die folgenden Elemente geparsed:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
#Die nicht benannten Paramter:&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;/source&amp;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;source lang=&amp;quot;perl&amp;quot;&amp;gt;$timestampGMT = FmtDateTimeRFC1123($timestamp)&amp;lt;/source&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;
&lt;br /&gt;
=== FmtDateTime===&lt;br /&gt;
:&amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;$timestamp = FmtDateTime($time)&amp;lt;/source&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;
&lt;br /&gt;
=== TimeNow ===&lt;br /&gt;
:&amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;$timestamp = TimeNow()&amp;lt;/source&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;
&lt;br /&gt;
=== fhemTimeGm===&lt;br /&gt;
:&amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;$timestamp = fhemTimeGm($sec, $min, $hour, $mday, $month, $year)&amp;lt;/source&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 als 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;
&lt;br /&gt;
=== fhemTimeLocal===&lt;br /&gt;
:&amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;$timestamp = fhemTimeLocal($sec, $min, $hour, $mday, $month, $year)&amp;lt;/source&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 als 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;
&lt;br /&gt;
== Erzeugen von Readings / Events ==&lt;br /&gt;
&lt;br /&gt;
=== readingsBeginUpdate ===&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
readingsBeginUpdate($hash)&lt;br /&gt;
&amp;lt;/source&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;
&lt;br /&gt;
=== readingsBulkUpdate ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ul&amp;gt;&amp;lt;source 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;/source&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;
&lt;br /&gt;
=== readingsEndUpdate ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ul&amp;gt;&amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
readingsEndUpdate($hash, $do_trigger);&lt;br /&gt;
&amp;lt;/source&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;
&lt;br /&gt;
=== readingsSingleUpdate ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ul&amp;gt;&amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
$rv = readingsSingleUpdate($hash, $reading, $value, $do_trigger);&lt;br /&gt;
&amp;lt;/source&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;
&lt;br /&gt;
=== DoTrigger ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ul&amp;gt;&amp;lt;source 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;/source&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;
== 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, $args);&lt;br /&gt;
InternalTimer($timestamp, $functionName, $args, $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 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.&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;
|| VORSICHT! NUR BENUTZEN WENN MAN ES WIRKLICH BENÖTIGT. Wenn dieser Wert auf &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; ist und die Funktion ausgeführt wird, während FHEM startet ($init_done == 0), dann wird InternalTimer direkt solange warten bis der angegebene Zeitpunkt erreicht ist, UND DIE FUNKION DIREKT AUSFÜHREN. Das bedeutet, dass InternalTimer() dann solange läuft, bis der Zeitpunkt erreicht ist und die angegebene Funktion ausgeführt wurde. &lt;br /&gt;
&lt;br /&gt;
Standardwert: 0&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== RemoveInternalTimer ===&lt;br /&gt;
&amp;lt;ul&amp;gt;&amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;RemoveInternalTimer($arg);&lt;br /&gt;
RemoveInternalTimer($arg, $function);&lt;br /&gt;
&amp;lt;/source&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;$function&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 wem 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;$function&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;
&lt;br /&gt;
== Definitionen suchen ==&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 [http://fhem.de/commandref.html#devspec commandref] 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;
&lt;br /&gt;
== Daten abfragen/auslesen ==&lt;br /&gt;
&lt;br /&gt;
=== ReadingsVal ===&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
$value = ReadingsVal($name, $reading, $default)&lt;br /&gt;
&amp;lt;/source&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-Namen 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;
&lt;br /&gt;
=== ReadingsTimestamp===&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
$timestamp = ReadingsTimestamp($name, $reading, $default)&lt;br /&gt;
&amp;lt;/source&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-Namen 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;
&lt;br /&gt;
=== ReadingsAge===&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
$seconds = ReadingsAge($name, $reading, $default)&lt;br /&gt;
&amp;lt;/source&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-Namen 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;
&lt;br /&gt;
=== ReadingsNum ===&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
$number = ReadingsNum($name, $reading, $default)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Die Funktion ReadingsNum() extrahiert einen numerischen Wert aus dem Reading &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. 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.&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-Namen aus dem ein numerischer 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.&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;$number&amp;lt;/code&amp;gt;&#039;&#039;&#039; || Numerischer Wert 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;
&lt;br /&gt;
=== AttrVal ===&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
$value = AttrVal($name, $attribute, $default)&lt;br /&gt;
&amp;lt;/source&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-Namen 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;
&lt;br /&gt;
=== InternalVal ===&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
$value = InternalVal($name, $internal, $default)&lt;br /&gt;
&amp;lt;/source&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-Namen 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;
&lt;br /&gt;
=== Value===&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
$value = Value($name)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Die Funktion Value() gibt den aktuellen Status 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-Namen 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;
&lt;br /&gt;
=== OldValue===&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
$value = OldValue($name)&lt;br /&gt;
&amp;lt;/source&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-Namen 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; || vorherige Status der gewünschten Definition&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== OldTimestamp===&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
$timestamp = OldTimestamp($name)&lt;br /&gt;
&amp;lt;/source&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-Namen 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;source lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
addToAttrList($attrib)&lt;br /&gt;
&amp;lt;/source&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;
&lt;br /&gt;
=== addToDevAttrList ===&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
addToDevAttrList($name, $attrib)&lt;br /&gt;
&amp;lt;/source&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;
&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 wiefolgt ü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;
&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 wiefolgt ü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;
&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 einen 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;
&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;
&lt;br /&gt;
== Logging ==&lt;br /&gt;
&lt;br /&gt;
=== Log ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
Log($verbose, $message)&lt;br /&gt;
&amp;lt;/source&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;
&lt;br /&gt;
=== Log3 ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
Log3($name, $verbose, $message)&lt;br /&gt;
&amp;lt;/source&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;
&lt;br /&gt;
=== Debug ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
Debug($message)&lt;br /&gt;
&amp;lt;/source&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;source 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;/source&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;
&lt;br /&gt;
== Status-Abfragen ==&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; 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;
&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;
&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;
&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;
&lt;br /&gt;
== Sonstiges ==&lt;br /&gt;
&lt;br /&gt;
=== configDBUsed ===&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
$status = configDBUsed()&lt;br /&gt;
&amp;lt;/source&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;
&lt;br /&gt;
=== getUniqueId ===&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
$uniqueID = getUniqueId()&lt;br /&gt;
&amp;lt;/source&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;
[[Kategorie:Development]]&lt;/div&gt;</summary>
		<author><name>Viegener</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=Benutzer:Viegener&amp;diff=14962</id>
		<title>Benutzer:Viegener</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=Benutzer:Viegener&amp;diff=14962"/>
		<updated>2016-04-03T12:22:25Z</updated>

		<summary type="html">&lt;p&gt;Viegener: Aktualisiert : Projekte / Links&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
; Erstmal nur ein Überblick über meine FHEM-Beteiligung&lt;br /&gt;
&lt;br /&gt;
== FHEM Benutzung ==&lt;br /&gt;
&lt;br /&gt;
Wunsch war die Zusammenführung der verschiedenen Funksysteme in einem zentralen System.&lt;br /&gt;
Ausdrücklich mit den Zielen&lt;br /&gt;
* Übergreifende Steuerungen und Makros zu ermöglichen&lt;br /&gt;
* Zentrale Bedienungsterminals (tablet)&lt;br /&gt;
* Steuerung von Aussen&lt;br /&gt;
* Am wichtigsten natürlich Spass am Basteln und Programmieren!!!&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
;Komponenten&lt;br /&gt;
* Somfy RTS Rolläden (Aktoren und Handfernbedienungen)&lt;br /&gt;
* FS20 Steckdosen&lt;br /&gt;
* Thermo/Hygro-Sensoren von LaCrosse und Technoline&lt;br /&gt;
* Mehrere Sonos-Komponenten&lt;br /&gt;
* Fritzbox&lt;br /&gt;
* Neu: Homematic&lt;br /&gt;
* Loewe Fernseher (dafür gibt es noch nichts)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
;Mein FHEM habe ich im Februar 2015 installiert.&lt;br /&gt;
* 03/2015 Umzug Raspberry Pi2&lt;br /&gt;
* 04/2015 Somfy-Einbindung&lt;br /&gt;
* 05/2015 FHEM Tablet UI &lt;br /&gt;
* 06/2015 Entwicklung eines Telegram Moduls für Benachrichtigungen und Kommandos (also bidirektional)&lt;br /&gt;
** Telegram ist frei, plattformübergreifend und erlaubt Gruppenchats&lt;br /&gt;
* 09/2015 Variante der Telegram-Anbindung mit dem  TelegramBot-Modul 50_TelegramBot&lt;br /&gt;
* 11/2015 TelegramBot offizielles FHEM-Modul (erhältlich über update)&lt;br /&gt;
&lt;br /&gt;
== FHEM Development ==&lt;br /&gt;
&lt;br /&gt;
Aber klar, das macht ja den Spass aus. Gerne in C, C++, Perl, Java, Javascript und vielen anderen, die heute nicht mehr relevant sind&lt;br /&gt;
Wenns sein muss auch in CSS, HTML etc &lt;br /&gt;
&lt;br /&gt;
* [https://github.com/viegener/Telegram-fhem/blob/master/70_Telegram.pm 70_Telegram.pm]&lt;br /&gt;
* [https://github.com/viegener/Telegram-fhem/blob/master/50_TelegramBot.pm 50_TelegramBot.pm]&lt;br /&gt;
* Beiträge zu Somfy&lt;br /&gt;
** Somfy in FHEMDuino (Perl und C)&lt;br /&gt;
** 10_Somfy_PM - Umbau positionsbehandlung&lt;br /&gt;
* Beiträge zu FHEM Tablet UI&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== FHEMWiki ==&lt;br /&gt;
&lt;br /&gt;
;Bisher nur wenig&lt;br /&gt;
&lt;br /&gt;
* [[TelegramBot]]&lt;br /&gt;
* [[Telegram]]&lt;br /&gt;
* [[DevelopmentModuleAPI]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Projekte und Ideen ==&lt;br /&gt;
&lt;br /&gt;
* Nextion-Display als kleines touchdisplay zum Einbau in kleine Gehäuse/Kästen&lt;br /&gt;
** Begonnen [https://forum.fhem.de/index.php/topic,51267.0.html]&lt;br /&gt;
** Esp8266 mit Nextion-Display verbunden und mit FHEM gekoppelt&lt;br /&gt;
** Erstes modul erstellt &lt;br /&gt;
** Erweiterungen in Progress / Tutorial und Mitstreiter benötigt&lt;br /&gt;
&lt;br /&gt;
* Klingeltaster-Modul mit RGB-LEDs und Arduino+Funk&lt;br /&gt;
** Immer noch eine Baustelle, RGB geht, FHEM-Anbindung über Asksin Homematic&lt;br /&gt;
&lt;br /&gt;
* grösseres (10 Zoll ?) Tablet als zentrale Bedienungskonsole&lt;br /&gt;
** Jetzt realisiert über Acer Iconia 10 - funktioniert recht gut und für den Preis ein gutes Angebot&lt;br /&gt;
&lt;br /&gt;
* Infrarot-Modul als Homematic Aktor (Selbstbau Arduino Nano / Funkmodul-RFM12B? / IR-LEDs&lt;br /&gt;
** Läuft nun als CUL mit WLAN-Interface (ESP8266)&lt;br /&gt;
** [https://forum.fhem.de/index.php/topic,49689.0.html]&lt;/div&gt;</summary>
		<author><name>Viegener</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=TelegramBot&amp;diff=14858</id>
		<title>TelegramBot</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=TelegramBot&amp;diff=14858"/>
		<updated>2016-03-27T14:38:18Z</updated>

		<summary type="html">&lt;p&gt;Viegener: Empfang von Bildern / Aktuelle FHEM version benötigt&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Infobox Modul&lt;br /&gt;
|ModPurpose=Senden und Empfangen von Nachrichten (Text und Fotos) mit dem freien Messagingdienst Telegram&lt;br /&gt;
|ModType=d&lt;br /&gt;
|ModForumArea=Unterstützende Dienste&lt;br /&gt;
|ModFTopic=38328&lt;br /&gt;
|ModTechName=[https://github.com/viegener/Telegram-fhem/blob/master/50_TelegramBot.pm 50_TelegramBot.pm]&lt;br /&gt;
|ModOwner=[[Benutzer:Viegener|Viegener]] ({{Link2FU|12772|Forum}} / [[Benutzer Diskussion:Viegener|Wiki]])}}&lt;br /&gt;
&lt;br /&gt;
Das [[TelegramBot]]-Modul ermöglicht das Senden und Empfangen von Nachrichten über den Telegram-instant messaging Dienst (https://telegram.org/). &lt;br /&gt;
Es entsteht eine Möglichkeit Benachrichtungen aus Fhem zu versenden, zum Beispiel Alarmmeldungen.&lt;br /&gt;
Ausserdem können auch Kommandos über Telegram an Fhem gesendet werden um Steuerungsbefehle in Fhem auszulösen.&lt;br /&gt;
&lt;br /&gt;
Das TelegramBot-Modul benötigt keine Zusatzsoftware auf dem Fhem-Server (anders als die Variante [[Telegram]]), sondern verwendet das [https://core.telegram.org/bots/api TelegramBot-API] über https-Aufrufe.&lt;br /&gt;
&lt;br /&gt;
== Über Telegram Instant Messaging ==&lt;br /&gt;
Telegram-IDs und Versand/Empfang von Nachrichten sind kostenfrei. &lt;br /&gt;
Clients sind für gängige Smartphonesysteme erhältlich (iOS iPhone und Tablet, Android, Windows Phone) und &lt;br /&gt;
können auch aus dem WebBrowser verwendet werden. &lt;br /&gt;
Es gibt auch einen Kommandozeilen-Client für Linux, der die Grundlage dieses Moduls darstellt. &lt;br /&gt;
Mehrfachanmeldungen, auch parallel mit verschiedenen Geräten (z.B. Tablet und Smartphone), sind möglich.&lt;br /&gt;
Gruppenchats und Chats mit End-2-End-Verschlüsselung werden ebenfalls unterstützt.&lt;br /&gt;
&lt;br /&gt;
Für die Unterstützung von &#039;&#039;WhatsApp&#039;&#039; siehe Modul [[yowsup]].&lt;br /&gt;
&lt;br /&gt;
== Features ==&lt;br /&gt;
Unterstützt werden:&lt;br /&gt;
&lt;br /&gt;
* Versand von Textnachrichten &lt;br /&gt;
* Versand und Empfang von Bildern/Audio/etc &lt;br /&gt;
* Empfang von Textnachrichten von beliebigen Kontakten&lt;br /&gt;
* Kommandos in Fhem über Telegram-Nachrichten von aussen auslösen&lt;br /&gt;
* Ergebnisse der Kommandos zusenden lassen&lt;br /&gt;
&lt;br /&gt;
Eine detaillierte Beschreibung des Moduls ist im Fhem Forum und in der (englischen) Dokumentation zum Modul in der Commandref diesem  {{Link2Forum|Topic=38328|LinkText=Diskussionsthread}} zu finden. Seit Oktober 2015 wird das Modul offiziell über Fhem-Update verteilt.&lt;br /&gt;
&lt;br /&gt;
Die jeweils aktuellste Entwicklungs-Version des Moduls ist in Github [https://github.com/viegener/Telegram-fhem/blob/master/50_TelegramBot.pm 50_TelegramBot.pm] verfügbar.&lt;br /&gt;
&lt;br /&gt;
== Hinweise zum Betrieb mit Fhem ==&lt;br /&gt;
{{Randnotiz|RNTyp=Warn|RNText=Achtung: Dieses Authtoken ist die einzige Authentifizierung für den Bot und sollte deshalb nicht aus der Hand gegeben werden. Die verwendeten Urls sind deshalb auch in den Log-Files nicht enthalten, da diese das Authtoken in Klartext enthalten. Auch im Forum sollte dieses Token nicht aufgenommen werden.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Für die Anlage eines TelegramBot Devices in Fhem ist ein Authtoken erforderlich. Dieses Token wird über Anlegen eines neuen Bots im [https://core.telegram.org/bots#botfather BotFather] erzeugt. Dort mit dem Telegram-Befehl &amp;lt;code&amp;gt;/newbot&amp;lt;/code&amp;gt; einen neuen Bot anlegen und mit einem Namen versehen. Hinweis: Die Namen für Bots müssen auf &amp;quot;Bot&amp;quot; enden.&lt;br /&gt;
&lt;br /&gt;
Das Anlegen eines TelegramBot devices erfolgt durch die Angabe dieses Tokens:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;define &amp;amp;lt;name&amp;amp;gt; TelegramBot  &amp;amp;lt;token&amp;amp;gt; &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Beispiel: &amp;lt;code&amp;gt;define teleBot TelegramBot 110201543:AAHdqTcvCH1vGWJxfSeofSAs0K5PALDsaw&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Das Empfangen von Nachrichten (polling) erfordert die Einstellung des Attributes&#039;&#039;&#039; &lt;br /&gt;
&amp;lt;code&amp;gt;pollingTimeout&amp;lt;/code&amp;gt; &#039;&#039;&#039;auf einen Wert der grösser als Null ist. Beim Wert 0 oder ohne Setzen des Attributes findet kein Polling und damit auch kein Empfang statt.&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Der TelegramBot kann erst dann Nachrichten an einen telegram user schicken, wenn dieser zuerst an den telegram bot eine Nachricht gesendet hat.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{{Randnotiz|RNTyp=Warn|RNText=TelegramBot setzt eine aktuelle Version von FHEM voraus, insbesondere Versionen weit vor der Umstellung auf 5.7 (also vor Herbst 2015) können mit einem TelegramBot-Modul nicht funktionieren, da insbesondere das HTTPSRV-Modul dann veraltet ist. Am besten auch den TelegramBot über den offiziellen Update mit dem Rest von FHEM installieren/aktualisieren.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Tipps ==&lt;br /&gt;
&lt;br /&gt;
=== Privacyeinstellungen ===&lt;br /&gt;
&lt;br /&gt;
Damit der TelegramBot auch Meldungen in Gruppen sieht, müssen über den BotFather die Privacy-Einstellungen geändert werden.&lt;br /&gt;
&lt;br /&gt;
=== Kontakte ===&lt;br /&gt;
&lt;br /&gt;
Der Bot merkt sich die bereits bekannten Kontakte im Reading &amp;lt;code&amp;gt;Contacts&amp;lt;/code&amp;gt;. Dabei werden die einzelnen Kontakte jeweils als 3-teilige Einträge bestehend aus UserID, Vor- und Nachname des Benutzers (mit _ verbunden) und dem Username (mit vorangestelltem @). &lt;br /&gt;
&lt;br /&gt;
Beispiel: &amp;lt;code&amp;gt;123456:Ralf_Mustermann:@ralf&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Verschiedene Einträge werden durch Leerzeichen getrennt.&lt;br /&gt;
&lt;br /&gt;
Man kann die Kontakte auch manuell überschreiben (z.B. wenn das Reading fehlerhaft oder verloren sein sollte). Dazu gibt es den Set-Befehl &amp;lt;code&amp;gt;replaceContacts&amp;lt;/code&amp;gt;. Dieser nimmt die Kontakte ebenfalls in der gleichen Form wie oben beschrieben entgegen.&lt;br /&gt;
&lt;br /&gt;
Die Kontaktliste wird ansonsten nur durch den Empfang von Nachrichten erweitert, da es im TelegramBot-API keine Möglichkeit gibt Kontaktdaten von Telegram abzufragen (siehe auch pollingTimeout)&lt;br /&gt;
&lt;br /&gt;
=== Reset ===&lt;br /&gt;
&lt;br /&gt;
Es ist möglich den Bot im laufenden Betrieb zurückzusetzen (Set-Befehl &amp;lt;code&amp;gt;reset&amp;lt;/code&amp;gt;). Dabei werden noch nicht abgeschlossene Übetragungen entfernt und die internen Zustände des Devices zurückgesetzt. &lt;br /&gt;
&lt;br /&gt;
=== Supergroups / Supergruppen ===&lt;br /&gt;
&lt;br /&gt;
Auch die neuen Supergruppen werden mit dem Bot unterstützt, es ist allerdings zu beachten, dass bei der Umwandlung einer Gruppe in eine Supergruppe eine neue ID in den Kontakten von Telegram vergeben wird. Wenn man also wie empfohlen IDs zur Identifikation von Benutzern einsetzt, muss entsprechend angepasst werden.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Beispielszenarien ==&lt;br /&gt;
&lt;br /&gt;
=== Benachrichtigungen über Ereignisse ===&lt;br /&gt;
&lt;br /&gt;
Das einfachste Szenario für die Integration von Messaging-Diensten mit Fhem ist zur Benachrichtigung über Ereignisse. Diese Funktion kann zum Beispiel verwendet werden, um über einen erfolgten Neustart von Fhem zu informieren:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;define notify_fhem_reload notify global:INITIALIZED set telebotdevice message fhem newly started - just now !&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In diesem Beispiel wird der Nachrichtentext &amp;quot;fhem newly started - just now !&amp;quot; an den als default eingestellten Kontakt (Attribut: defaultPeer) gesendet, sobald Fhem neu gestartet wurde. Natürlich kann man auch beliebige andere Benachrichtigungen einführen.&lt;br /&gt;
&lt;br /&gt;
=== Versand von Bildern ===&lt;br /&gt;
&lt;br /&gt;
Es ist auch möglich Bilder auf dem Fhem-Server, die zum Beispiel von einer Kamera oder einem Wettermodul stammen über Telegram zu versenden. So wäre es z.B. möglich jeweils morgens die aktuelle Wetterkarte zu erhalten.&lt;br /&gt;
&lt;br /&gt;
ACHTUNG: TelegramBot verwendet das HTTPUtils-Modul zur Kommunikation mit dem TelegramBot-API. Erst mit der Version, die seit 22.10.2015 &lt;br /&gt;
([r9576] HttpUtils.pm: Async write for POST Requests {{Link2Forum|Topic=41583|LinkText=Fhem-Forum}}) verteilt wird, erlaubt auch den Transfer grösserer Bilder. Die Grenze liegt ansonsten bei ca. 14kb auf Raspberries (Plattformspezifische Grenze).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;define notify_fhem_reload notify wetter:report set telebotdevice sendPhoto /opt/fhem/wetter.jpg&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Bei Erreichen des entsprechenden Status am Wetter-Modul wird ein Image über Telegram versendet. Hier sind lokale Pfade (relativ zu fhem) oder absolute Pfade wie oben möglich. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Empfang von Bildern oder ähnlichem ===&lt;br /&gt;
&lt;br /&gt;
Beim Empfang von Bildern wird zuerst nur eine ID vom Telegram-Server empfangen, diese befindet sich im Reading &amp;lt;code&amp;gt;msgFileId&amp;lt;/code&amp;gt; angelegt (&amp;lt;code&amp;gt;123456:xxxxxxxxxxxxxxxxxxxxxxx-xxxxxxxx&amp;lt;/code&amp;gt;) und im Reading &amp;lt;code&amp;gt;msgText&amp;lt;/code&amp;gt; steht dann so etwas wie&lt;br /&gt;
&amp;lt;code&amp;gt;received photo # Size: 107701&amp;lt;/code&amp;gt;&lt;br /&gt;
	&lt;br /&gt;
Über das Get-Kommando &amp;lt;code&amp;gt;urlForFile&amp;lt;/code&amp;gt; mit der ID aus dem msgFileId Reading lässt sich dann daraus ein URL ableiten, der dann zur eigentlichen Datei führt: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;https://api.telegram.org/file/bot123456:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx/photo/file_25.jpg&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Versand von Emojis (Smileys) ===&lt;br /&gt;
&lt;br /&gt;
Es ist auch möglich Emojis mit den (Text-)Nachrichten zu versenden. Die entsprechenden (Unicode-)Zeichen werden einfach direkt mit in den Text der Nachricht aufgenommen. Um das zu vereinfachen kann man das einfach per Copy und Paste von dieser Seite &lt;br /&gt;
&lt;br /&gt;
http://apps.timwhitlock.info/emoji/tables/unicode (Spalte &amp;quot;Native&amp;quot;) &lt;br /&gt;
&lt;br /&gt;
übernehmen und mit der Nachricht verschicken. &lt;br /&gt;
&lt;br /&gt;
Die Emojis können auch empfangen werden und werden so auch in FHEM / FHEMWeb angezeigt. Plattformspezifische (z.B. von iOS oder Android) Emojis werden dabei nicht unterstützt (gerade mit iOS sind viele neue farbige Emojis hinzugekommen, die wohl leider nur auf Apple-devices funktionieren).&lt;br /&gt;
&lt;br /&gt;
=== Kommandos auslösen ===&lt;br /&gt;
&lt;br /&gt;
Ein wichtiges Szenario ist die Möglichkeit Kommandos in Fhem ausführen zu können, ohne einen Zugang durch die Firewall einrichten zu müssen. Dazu ist die Definition eines Schlüsselwortes (Attribut: &amp;quot;cmdKeyword&amp;quot;)erforderlich, mit dem man die Nachrichten beginnen muss, damit der TelegramBot die Kommandos erkennt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;attr telebotdevice cmdKeyword doit&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Somit kann man dann durch Nachrichten die mit &amp;quot;doit&amp;quot; beginnen Kommandos an Fhem senden, die ähnlich wie im Kommandoeingabefeld von Fhemweb dann von Fhem ausgeführt werden. Das Ergebnis der Ausführung wird zurück an den Sender (und an den definierten defaultPeer) geschickt.&lt;br /&gt;
&lt;br /&gt;
Somit können nicht nur Aktionen angestossen werden, sondern auch Infos abgefragt werden.&lt;br /&gt;
&lt;br /&gt;
Beispiele&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;doit set schalter on&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;doit list telegrambot&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Randnotiz|RNTyp=Warn|RNText=Achtung: Bei den Kommandos sollten man unbedingt das Attribut &amp;quot;cmdRestrictedPeer&amp;quot; setzen, damit nicht jeder Kommandos auf dem Fhem-Server ausführen kann. Dazu sollten die BenutzerIDs der erlaubten Benutzer (durch Leerzeichen getrennt angeben). Da Benutzernamen selber vergeben werden und nicht unbedingt eindeutig sind, sollten hier auch NUR BenutzerIDs verwendet werden.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Favoriten für Kommandos anlegen ===&lt;br /&gt;
&lt;br /&gt;
Grundidee bei den Favoriten ist, dass man lange Befehle, die man häufig braucht auf &amp;quot;Kurzwahl&amp;quot; legt.&lt;br /&gt;
&lt;br /&gt;
Beispiel-Kommandos wie z.B. &amp;lt;code&amp;gt;set TYPE=ROLLADEN pos 100&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;set TYPE=ROLLADEN pos 0&amp;lt;/code&amp;gt;, die man immer wieder braucht. Um nicht jedes mal dieses Kommando eintippen zu müssen auf dem Smartphone, kann man auch dafür Favoriten anlegen.&lt;br /&gt;
&lt;br /&gt;
Dazu gibt man erst mal die beiden Kommandos getrennt durch Semikolon im Attribut favorites an:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;attr telegrambotdevice favorites set TYPE=ROLLADEN pos 100;set TYPE=ROLLADEN pos 0&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Um die Favorites jetzt ausführen zu können braucht man noch ein Schlüsselwort dafür.&lt;br /&gt;
Nehmen wir mal an man möchte die Favoriten mit &amp;lt;code&amp;gt;/short&amp;lt;/code&amp;gt; ausführen können. Dazu muss dann das Attribut &amp;quot;cmdFavorites&amp;quot; setzen&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;attr telegrambotdevice cmdFavorites /short&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wenn man nun im Telegram Client &lt;br /&gt;
&amp;lt;code&amp;gt;/short 1&amp;lt;/code&amp;gt; an den Bot schickt führt der Bot den ersten Favoriten aus und das Ergebnis der Ausführung wird zurückgeschickt.&lt;br /&gt;
&lt;br /&gt;
Ausserdem kann man im Telegram Client &lt;br /&gt;
&amp;lt;code&amp;gt;/short&amp;lt;/code&amp;gt; an den Bot schicken, dann antwortet der Bot mit&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Favorites&lt;br /&gt;
&lt;br /&gt;
1&lt;br /&gt;
set TYPE=ROLLADEN pos 100&lt;br /&gt;
2&lt;br /&gt;
set TYPE=ROLLADEN pos 0&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
* Github Repository für die Telegram-Fhem Entwicklung: https://github.com/viegener/Telegram-fhem&lt;br /&gt;
* Infos zum Telegram BotFather: https://core.telegram.org/bots#botfather&lt;br /&gt;
&lt;br /&gt;
* Source code für das 50_TelegramBot.pm-Modul: https://github.com/viegener/Telegram-fhem/blob/master/50_TelegramBot.pm&lt;br /&gt;
* Source code für das modifizierte HTTPUtils-Modul zur Übertragung grosser Bilder: https://github.com/viegener/Telegram-fhem/blob/master/HttpUtils.pm&lt;br /&gt;
&lt;br /&gt;
* Forum-Thread in dem das Modul vorgestellt wurde {{Link2Forum|Topic=38328|LinkText=Fhem-Forum}}&lt;br /&gt;
* Telegram messaging system https://telegram.org/&lt;br /&gt;
* TelegramBot API https://core.telegram.org/bots/api&lt;br /&gt;
&lt;br /&gt;
--[[Benutzer:Viegener|Viegener]] ([[Benutzer Diskussion:Viegener|Diskussion]]) 22:49, 11. Okt. 2015 (CEST)&lt;/div&gt;</summary>
		<author><name>Viegener</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=DevelopmentModuleIntro&amp;diff=14397</id>
		<title>DevelopmentModuleIntro</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=DevelopmentModuleIntro&amp;diff=14397"/>
		<updated>2016-02-28T22:16:03Z</updated>

		<summary type="html">&lt;p&gt;Viegener: Erklärung zur Normalisierung/Korrektur von Attributwerten in X_Attr&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Einleitung ==&lt;br /&gt;
Dieser Text ist in Arbeit und muss noch an einigen Stellen ergänzt werden. &lt;br /&gt;
Insbesondere beschreibt der Text derzeit nur einstufige Module. Die Abgrenzung zu zweistufigen Modulen und deren Eigenschaften sollte noch ergänzt werden.&lt;br /&gt;
&lt;br /&gt;
Um neue Geräte in FHEM verfügbar zu machen, kann man ein eigenes Modul in Perl schreiben, das automatisch von FHEM geladen wird, wenn ein passendes Gerät in FHEM definiert wird. Das Modul definiert dann wie mit dem Gerät kommuniziert wird, stellt Werte (&amp;quot;Readings&amp;quot;) innerhalb von FHEM zur Verfügung oder erlaubt es das Gerät mit &amp;quot;Set&amp;quot;-Befehlen zu beeinflussen. Dieser Text soll den Einstieg in die Entwicklung eigener Module erleichtern.&lt;br /&gt;
&lt;br /&gt;
Mit dem FHEM-Befehl &amp;quot;define&amp;quot;, der typischerweise in die zentrale Konfigurationsdatei fhem.cfg  eingetragen wird, werden Geräte in FHEM definiert. Der Befehl sorgt dafür dass ein neues Modul bei Bedarf geladen wird und die Initialisierungsfunktion des Moduls aufgerufen wird. &lt;br /&gt;
&lt;br /&gt;
Damit das funktioniert müssen der Name des Geräts, der Name des Moduls und der Name der Initialisierungsfunktion zueinander passen. Das folgende Beispiel soll dies verdeutlichen:&lt;br /&gt;
&lt;br /&gt;
Ein Jeelink USB-Stick in einer Fritz-Box könnte beispielsweise mit dem Befehl &amp;lt;code&amp;gt;define JeeLink1 JeeLink /dev/ttyUSB0@57600&amp;lt;/code&amp;gt; definiert werden.&lt;br /&gt;
&lt;br /&gt;
In der fhem.pl wird der define-Befehl verarbeitet, geprüft, ob ein Modul mit Namen JeeLink schon geladen ist und falls nicht ein Modul mit Namen XY_JeeLink.pm im Modulverzeichnis (bei einer FritzBox z.B. /var/media/ftp/fhem/FHEM) gesucht und dann geladen. &lt;br /&gt;
Danach wird die Funktion JeeLink_Initialize aufgerufen.&lt;br /&gt;
Die Moduldatei muss also nach dem Namen des Geräts benannt werden und eine Funktion mit dem Namen des Geräts und einer _initialize Funktion enthalten.&lt;br /&gt;
In der Initialisierungsfunktion des Moduls werden dann die Namen der aller weiteren Funktionen des Moduls, die von fhem.pl aus aufgerufen werden, bekannt gemacht. Dazu wird der Hash - das ist die zentrale Datenstruktur für jede Instanz eines Gerätes - mit entsprechenden Werten gefüllt.&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;
&amp;lt;code&amp;gt;$defs{&#039;&#039;Devicename&#039;&#039;}&amp;lt;/code&amp;gt; in fhem.pl verweist auf den Hash der Geräteinstanz. Diesen Verweis (also nur die Adresse) bekommen die Funktionen eines Moduls übergeben, das direkt von fhem.pl aufgerufen wird. In dem Hash stehen beispielsweise die internen Werte des Geräts, die im GUI als &amp;quot;Internals&amp;quot; angezeigt werden oder die Readings des Geräts. Beispiele:&lt;br /&gt;
*&amp;lt;code&amp;gt;$hash{NAME}&amp;lt;/code&amp;gt; enthält den Namen der Geräteinstanz, &lt;br /&gt;
*&amp;lt;code&amp;gt;$hash{TYPE}&amp;lt;/code&amp;gt;  enthält die Typbezeichnung des Geräts &lt;br /&gt;
*&amp;lt;code&amp;gt;$hash-&amp;gt;{INTERVAL}&amp;lt;/code&amp;gt; enthält ein Abfrageintervall&lt;br /&gt;
&lt;br /&gt;
==Ausführung von Modulen==&lt;br /&gt;
FHEM führt Module normalerweise nicht parallel aus. Daher wäre es ungünstig wenn Module Werte von einem Gerät abfragen und dann auf die Antwort des Geräts warten. In dieser Zeit wäre der Rest von FHEM blockiert. Die Ein- und Ausgabe sollte ohne Blockieren erfolgen und die Verarbeitung mehrerer Ein- und Ausgabekanäle quasi parallel 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 sein können. Auf Linux- bzw. Unix-basierten Plattformen wird der select-Befehl des Betriebssystems verwendet und entsprechend gibt es in FHEM eine selectlist, in der die Filedeskriptoren der Geräedateien (z.B. /dev/ttyUSBx etc.) gespeichert sind. &lt;br /&gt;
&lt;br /&gt;
In der zentralen Schleife von fhem.pl wird mit select überwacht, ob über eine der geöffneten Schnittstellen Daten zum Lesen anstehen. Wenn dies der Fall ist, dann wird die Lesefunktion (X_Read) des zuständigen Moduls aufgerufen, damit es die Daten entgegennimmt und die Schleife wird weiter ausgeführt.&lt;br /&gt;
&lt;br /&gt;
Auf Windows-Systemen funktioniert dies anders. Hier können USB/Seriell-Geräte nicht per select ü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) implementieren, die 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 und Werte in Readings geschrieben.&lt;br /&gt;
&lt;br /&gt;
== Readings ==&lt;br /&gt;
Werte, die von einem Gerät gelesen werden und in FHEM zur Verfügung stehen werden Readings genannt. Sie werden als Unterstruktur des Hashes der jeweiligen Geräteinstanz gespeichert, beispielsweise &lt;br /&gt;
*&amp;lt;code&amp;gt;$hash{READINGS}{Temp}{VAL}&amp;lt;/code&amp;gt; für die Temperatur eines Fühlers&lt;br /&gt;
*&amp;lt;code&amp;gt;$hash{READINGS}{Temp}{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 ReadingsVal($$$) zur Verfügung.&lt;br /&gt;
&lt;br /&gt;
Readings werden im statefile von FHEM automatisch zwischengespeichert, damit sie nach einem Neustart sofort wieder zur Verfügung stehen, auch bevor sie vom Modul neu gesetzt oder aktualisiert werden.&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; innerhalb des Moduls genutzt werden.&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;readingsBeginUpdate&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;readingsBulkUpdate&amp;lt;/code&amp;gt; (mehrfach wiederholt), &amp;lt;code&amp;gt;readingsEndUpdate&amp;lt;/code&amp;gt;&lt;br /&gt;
*bei einzelnen Updates die Funktion &amp;lt;code&amp;gt;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 spürbare Last auf dem System (siehe 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;pre&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;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Internals ==&lt;br /&gt;
Werte, die das Modul intern als Teil des Hashes speichert, die aber keine Readings sind, nennt man Internals. Sie werden ebenfalls als Unterstruktur des Hashes der jeweiligen Geräteinstanz gespeichert, beispielswiese &amp;lt;code&amp;gt;$hash-&amp;gt;{INTERVAL}&amp;lt;/code&amp;gt; für ein Abfrageintervall, das beim Define-Befehl übergeben wurde und als Internal gespeichert wird. Internals werden jedoch im Gegensatz zu Readings nicht im statefile zwischengespeichert. &lt;br /&gt;
&lt;br /&gt;
Falls Werte wie das gerade erwähnte Intervall nicht über den Define-Befehl gesetzt werden sollen und im Betrieb einfach änderbar sein sollen, 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 nach dem Define-Befehl zusätzlich den Befehl &amp;lt;code&amp;gt;attr&amp;lt;/code&amp;gt; erwarten.&lt;br /&gt;
&lt;br /&gt;
== Attribute ==&lt;br /&gt;
Parameter einer Geräteinstanz können mit dem Befehl &amp;lt;code&amp;gt;attr&amp;lt;/code&amp;gt; als so genannte Attribute gesetzt und damit dem Modul zur Verfügung gestellt werden. Attribute werden zusammen mit der Definition der Geräte beim Speichern der aktuellen Konfiguration von FHEM in die Konfigurationsdatei geschrieben, die auch bei jedem Neustart von FHEM wieder gelesen wird. Zur Laufzeit werden Attribute in der globalen Datenstruktur &amp;lt;code&amp;gt;$attr{$name}&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 (&amp;lt;code&amp;gt;$attr{$name}-&amp;gt;{&#039;header&#039;}&amp;lt;/code&amp;gt; wäre eine alternative aber unübliche Schreibweise für die selbe Variable). &lt;br /&gt;
&lt;br /&gt;
Zum Auslesen solcher Attribute sollte die Funktion &amp;lt;code&amp;gt;AttrVal($$$)&amp;lt;/code&amp;gt; verwendet werden.&lt;br /&gt;
&lt;br /&gt;
Welche Attribute ein Modul unterstützt sollte in der Funktion &amp;lt;code&amp;gt;[[#X_Initialize|X_Initialize]]&amp;lt;/code&amp;gt; durch Setzen der Variable &amp;lt;code&amp;gt;$hash-&amp;gt;{AttrList}&amp;lt;/code&amp;gt; bekannt gemacht werden (siehe unten). Wenn beim Setzen von Attributen die Werte geprüft werden sollen oder zusätzliche Funktionalität implementiert werden muss, dann kann dies in der Funktion &amp;lt;code&amp;gt;[[#X_Attr|X_Attr]]&amp;lt;/code&amp;gt; ([[#X_Attr|siehe unten]]) implementiert werden.&lt;br /&gt;
&lt;br /&gt;
== Die wichtigsten Funktionen in einem Modul ==&lt;br /&gt;
Eine typische Grundfunktion eines einfachen Moduls ist das Auslesen von Werten von einem physischen Gerät und Bereitstellen dieser Werte innerhalb von FHEM als Readings. Das Geräte könnte beispielsweise an einem USB-Port angeschlossen sein. Folgende Funktionen könnte man beispielsweise in einem Modul mit Namen X implementieren:&lt;br /&gt;
* [[#X_Initialize|X_Initialize]] (initialisiert das Modul und gibt de Namen der zusätzlichen Funktionen bekannt)&lt;br /&gt;
* [[#X_Define|X_Define]] (wird beim &amp;lt;code&amp;gt;define&amp;lt;/code&amp;gt; aufgerufen)&lt;br /&gt;
* [[#X_Undef|X_Undef]] (wird beim &amp;lt;code&amp;gt;delete&amp;lt;/code&amp;gt;, sowie &amp;lt;code&amp;gt;rereadcfg&amp;lt;/code&amp;gt; aufgerufen. Dient zum Abbau von offenen Verbindungen, Timern, etc.)&lt;br /&gt;
* [[#X_Delete|X_Delete]] (wird beim &amp;lt;code&amp;gt;delete&amp;lt;/code&amp;gt; aufgerufen um das Gerät endgültig zu löschen)&lt;br /&gt;
* [[#X_Set|X_Set]] (wird beim Befehl &amp;lt;code&amp;gt;set&amp;lt;/code&amp;gt; aufgerufen um Daten an das Gerät zu senden)&lt;br /&gt;
* [[#X_Get|X_Get]] (wird beim Befehl &amp;lt;code&amp;gt;get&amp;lt;/code&amp;gt; aufgerufen um Daten vom Gerät abzufragen)&lt;br /&gt;
* [[#X_Attr|X_Attr]] (wird beim Befehl &amp;lt;code&amp;gt;attr&amp;lt;/code&amp;gt; aufgerufen um beispielsweise Werte zu prüfen)&lt;br /&gt;
* [[#X_Read|X_Read]] (wird vom globalen select aufgerufen, falls Daten zur Verfuegung stehen)&lt;br /&gt;
* [[#X_Parse|X_Parse]] (wird bei zweistufigen Modulen vom Dispatch aufgerufen und muss hier noch beschrieben werden)&lt;br /&gt;
* [[#X_Ready|X_Ready]] (wird unter windows als ReadFn-Erstatz benoetigt bzw. um zu pruefen, ob ein Geraet wieder eingesteckt ist)&lt;br /&gt;
* [[#X_Notify|X_Notify]] (falls man benachrichtigt werden will)&lt;br /&gt;
* [[#X_Rename|X_Rename]] (falls ein Gerät umbenannt wird)&lt;br /&gt;
&lt;br /&gt;
Die Funktionen werden im folgenden beschrieben (soweit diese Seite inzwischen vollständig ist):&lt;br /&gt;
&lt;br /&gt;
=== X_Initialize ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sub X_Initialize($)&lt;br /&gt;
{&lt;br /&gt;
	my ($hash) = @_;&lt;br /&gt;
	...&lt;br /&gt;
&amp;lt;/pre&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 einen Hash für das Modul als zentrale Datenstruktur übergeben. &lt;br /&gt;
&lt;br /&gt;
Dieser Hash wird im globalen Hash %modules 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 je Modul Werte enthält, beispielsweise auch die Namen der Funktionen, die das Modul implementiert und die fhem.pl aufrufen soll. Die Initialize-Funktion setzt diese Funktionsnamen, in den Hash des Moduls:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&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;{NotifyFn} = &amp;quot;X_Notify&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;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;X&amp;lt;/code&amp;gt; ist wieder durch den Modulnamen ohne die vorangestellte Zahl zu ersetzen. &lt;br /&gt;
Entsprechend können auch die Funktionen &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; etc. bekannt gemacht werden.&lt;br /&gt;
&lt;br /&gt;
Darüber hinaus sollten die vom Modul unterstützen Attribute definiert werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&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;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In Fhem.pl werden dann die entsprechenden Werte 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 Funktion &amp;lt;code&amp;gt;X_Attr&amp;lt;/code&amp;gt; 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 verfügbar werden wenn das Modul zum Setzen von Readings die Funktionen readingsBeginUpdate, readingsBulkUpdate, readingsEndUpdate oder readingsSingleUpdate 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.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Des weiteren ist es möglich, das Verhalten von Autocreate zu beeinflussen.&lt;br /&gt;
&amp;lt;code&amp;gt;x&amp;lt;/code&amp;gt; ist durch den Namen der Geräte zu ersetzen. Legt ihr Geräte mit dem Namen LaCrosse an, dann sollte x durch LaCrosse ersetzt werden.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  $hash-&amp;gt;{AutoCreate} =&lt;br /&gt;
        { &amp;quot;x.*&amp;quot; =&amp;gt; { ATTR =&amp;gt; &amp;quot;event-min-interval:.*:300 event-on-change-reading:.*&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;&amp;lt;count&amp;gt;:&amp;lt;timeout&amp;gt;&amp;quot; &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Mit &amp;lt;code&amp;gt;ATTR =&amp;gt;&amp;lt;/code&amp;gt; können Vordefinierte Attribute beim Anlegen definiert werden.&lt;br /&gt;
Der Wert von &amp;lt;code&amp;gt;FILTER&amp;lt;/code&amp;gt; wird als Regex verwendet, wenn ein Filelog angelegt wird. Damit könnt ihr steuern, welche Events ins Filelog komme. Definiert ihr das Feld &amp;lt;code&amp;gt;FILTER&amp;lt;/code&amp;gt; nicht, gebt jedoch andere Felder an, dann kann kein filelog mehr automatisch durch autocreate angelegt werden!&lt;br /&gt;
Mit Hilfe von &amp;lt;code&amp;gt;GPLOT&amp;lt;/code&amp;gt; kann ein Plot angelegt werden. Mit der Angabe definiert ihr, welcher GPLOT angelegt wird.&lt;br /&gt;
Mittels &amp;lt;code&amp;gt;autocreateThreshold&amp;lt;/code&amp;gt; wird beeinflusst, wie oft &amp;lt;code&amp;gt;count&amp;lt;/code&amp;gt;(default 2) und in welchem Zeitabstand &amp;lt;code&amp;gt;timeout&amp;lt;/code&amp;gt; (default 60 Sekunden) die gleiche Nachricht empfangen werden muss, damit ein Gerät per autocreate angelegt wird. &lt;br /&gt;
Das Verhalten, kann vom Anwender mittels Attribut &amp;lt;code&amp;gt;autocreateThreshold&amp;lt;/code&amp;gt; im device &amp;quot;autocreate&amp;quot; überschrieben werden.&lt;br /&gt;
&lt;br /&gt;
=== X_Define ===&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.ä.)&lt;br /&gt;
Sie beginnt typischerweise mit:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&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;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Als Übergabeparameter bekommt die Define-Funktion den Hash der Geräteinstanz sowie den Rest der Parameter, die im Befehl angegeben wurden. Welche und wie viele Parameter &lt;br /&gt;
akzeptiert werden ist Sache dieser Funktion. Im obigen Beispiel wird alles nach dem übergebenen Hash in ein Array aufgeteilt 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;pre&amp;gt;&lt;br /&gt;
my $name 	= $a[0];&lt;br /&gt;
my $url 	= $a[2];&lt;br /&gt;
my $inter	= 300;&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; 5, default is 300&amp;quot;;&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&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;pre&amp;gt;&lt;br /&gt;
$hash-&amp;gt;{url} 		= $url;&lt;br /&gt;
$hash-&amp;gt;{Interval}	= $inter;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wenn eine physische Schnittstelle geöffnet werden soll und dann bei verfügbaren Eingabedaten eine Lese-Funktion von Fhem aufgerufen werden soll, dann kann man in der Define-Funktion die Funktion DevIo_OpenDev aufrufen, die sich um alles weitere kümmert. Sie öffnet die Schnittstelle und fügt den Filedeskriptor an die globale Liste offener Verbindungen (selectlist / readyfnlist) an. Damit kann Fhem in seiner Hauptschleife erkennen, von welchem Gerät Daten bereit stehen und die zuständigen Funktionen aufrufen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
my $ret = DevIo_OpenDev( $hash, 0, &amp;quot;X_DevInit&amp;quot; );&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die optionale Funktion &amp;lt;code&amp;gt;X_DevInit&amp;lt;/code&amp;gt; wird zur weiteren Initialisierung der Verbindung von &amp;lt;code&amp;gt;DevIo_OpenDev&amp;lt;/code&amp;gt; aufgerufen. Der zweite Übergabeparameter an &amp;lt;code&amp;gt;DevIo_OpenDev&amp;lt;/code&amp;gt; (hier &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt;) steht für reopen und wird benötigt, da die Funktion auch aufgerufen wird, wenn ein USB-Geräte beispielsweise im Betrieb aus- und wieder eingesteckt wird. In diesem Fall wird die Funktion mit &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; aufgerufen.&lt;br /&gt;
&lt;br /&gt;
=== X_Undef ===&lt;br /&gt;
&lt;br /&gt;
Die &amp;lt;code&amp;gt;Undef&amp;lt;/code&amp;gt;-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 rereadcfg, der ebenfalls alle Geräte löscht und danach das Konfigurationsfile neu abarbeitet. 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 später). &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;pre&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;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== X_Delete ===&lt;br /&gt;
&lt;br /&gt;
Die &amp;lt;code&amp;gt;Delete&amp;lt;/code&amp;gt;-Funktion ist das Gegenstück zur &amp;lt;code&amp;gt;Define&amp;lt;/code&amp;gt;-Funktion und wird aufgerufen wenn ein Gerät mit &amp;lt;code&amp;gt;delete&amp;lt;/code&amp;gt; gelöscht wird. &lt;br /&gt;
&lt;br /&gt;
Wenn ein Gerät mittels &amp;lt;code&amp;gt;delete&amp;lt;/code&amp;gt; gelöscht wird, wird zuerst die  &amp;lt;code&amp;gt;[[#X_Undef|Undef]]&amp;lt;/code&amp;gt;-Funktion aufgerufen um offene Verbindungen abzubauen, anschließend wird die &amp;lt;code&amp;gt;Delete&amp;lt;/code&amp;gt;-Funktion aufgerufen. Diese dient eher zum aufräumen von Dateien, 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 Dateien oder Verbindungen zu löschen die mit diesem Gerät 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;pre&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;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== X_Get ===&lt;br /&gt;
Die Get-Funktion wird aufgerufen wenn der Fhem-Befehl &amp;lt;code&amp;gt;get&amp;lt;/code&amp;gt; mit einem Gerät 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. Einige Module verwenden für diese Funktion einen Hash im Modul, der die möglichen &amp;lt;code&amp;gt;get&amp;lt;/code&amp;gt;-Optionen mit zusätzlichen Werten definiert:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
my X_gets = (&lt;br /&gt;
	&amp;quot;TempSoll&amp;quot;	=&amp;gt; &amp;quot;XY&amp;quot;,&lt;br /&gt;
	&amp;quot;Steilheit&amp;quot;	=&amp;gt; &amp;quot;Z&amp;quot;&lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
In der Get-Funktion selbst werden dann die übergebenen Parameter gegen diesen Hash geprüft.&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sub X_Get($@)&lt;br /&gt;
{&lt;br /&gt;
	my ( $hash, @a ) = @_;&lt;br /&gt;
	return &amp;quot;\&amp;quot;get X\&amp;quot; needs at least one argument&amp;quot; if ( @a &amp;lt; 2 );&lt;br /&gt;
	my $name = shift @a;&lt;br /&gt;
	my $opt = shift @a;&lt;br /&gt;
	if(!$X_gets{$opt}) {&lt;br /&gt;
		my @cList = keys %X_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;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Ausgabe der Meldung mit &amp;lt;code&amp;gt;unknown ... choose one of ...&amp;lt;/code&amp;gt; ist dabei wichtig, da sie im GUI-Modul verwendet wird um die möglichen &amp;lt;code&amp;gt;get&amp;lt;/code&amp;gt;-Optionen zu ermitteln und als Auswahl anzubieten. Im weiteren Verlauf der Get-Funktion könnte man dann mit dem physischen Gerät kommunizieren und den gefragten Wert abfragen und diesen als Return-Wert der Get-Funktion zurückgeben.&lt;br /&gt;
&lt;br /&gt;
=== X_Set ===&lt;br /&gt;
Die Set-Funktion ist das Gegenteil zur Get-Funktion. Sie ist dafür gedacht, Werte zum physischen Gerät zu schicken. Falls nur interne Werte im Modul gesetzt werden sollen, so sollte statt Set die Attr-Funktion verwendet werden. Attribute werden bei Save-Config auch in der Fhem.cfg gesichert. Set-Befehle nicht.&lt;br /&gt;
 &lt;br /&gt;
Eine Set-Funktion ist ähnlich aufgebaut wie die Get-Funktion, sie bekommt jedoch nach dem Namen der Option auch den zu setzenden Wert übergeben.&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sub X_Set($@)&lt;br /&gt;
{&lt;br /&gt;
	my ( $hash, @a ) = @_;&lt;br /&gt;
	return &amp;quot;\&amp;quot;set X\&amp;quot; needs at least an argument&amp;quot; if ( @a &amp;lt; 2 );&lt;br /&gt;
	my $name = shift @a;&lt;br /&gt;
	my $opt = shift @a;&lt;br /&gt;
	my $value = join(&amp;quot;&amp;quot;, @a);&lt;br /&gt;
	&lt;br /&gt;
	if(!defined($X_sets{$opt})) {&lt;br /&gt;
		my @cList = keys %X_sets;&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;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Das GUI FHEM-Web kann für die einzelnen Set-Optionen, die das Modul versteht auch automatisch Eingabehilfen wie Drop-Down Boxen oder Slider erzeugen. In der Detailansicht des 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;Unknwon ... choose one of ...&amp;quot;&amp;lt;/code&amp;gt; zurückgeben sondern den einzelnen Set-Optionen in diesem Rückgabetext nach einem Doppelpunkt 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.&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
	if(!defined($X_sets{$opt})) {&lt;br /&gt;
		return &amp;quot;Unknown argument $opt, choose one of mode:verbose,ultra,relaxed turbo:NoArg&amp;quot;;&lt;br /&gt;
	}&lt;br /&gt;
&amp;lt;/pre&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. Bitte dazu auch den Wiki Artikel zum Colorpicker lesen: [[Color#Colorpicker]]&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;multiple&#039;&#039;&#039; || &amp;lt;code&amp;gt;...: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;...:sortable:Montag,Dienstag,...&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 [http://fhem.de/commandref.html#widgetOverride commandref] 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;
&lt;br /&gt;
- bei den üblichen Kommandos wie on off sollte man auf noArg verzichten, da diese durch FHEMWeb automatisch in der Raumübersicht angezeigt werden. Wenn man hier noArg spezifiziert, so werden diese nicht neben dem Modul in der Raumübersicht angezeigt und der User muss sich diese vie webCmd dann erst selbst definieren, was natürlich unschön ist&lt;br /&gt;
&lt;br /&gt;
- der User kann sich in der Raumübersicht nach wie vor via webCmd eine entsprechende Steuerung anlegen.&lt;br /&gt;
&lt;br /&gt;
=== X_Attr ===&lt;br /&gt;
Die Attr-Funktion implementiert Prüfungen der bei einem &amp;lt;code&amp;gt;attr&amp;lt;/code&amp;gt; übergebenen Werte und eventuell zusätzliche Aktionen wenn ein Attribut gesetzt wird. Die Liste der möglichen Attribute wird in der &amp;lt;code&amp;gt;[[#X_Initialize|X_Initialize]]-Funktion&amp;lt;/code&amp;gt; definiert ([[#X_Initialize|siehe oben]]). Fhem ruft bei einem Attr-Befehl die zuständige &amp;lt;code&amp;gt;X-Attr-Funktion&amp;lt;/code&amp;gt; auf und wenn diese keine Fehlermeldung sondern &amp;lt;code&amp;gt;undef&amp;lt;/code&amp;gt; zurückgibt, dann schreibt fhem.pl die bei &amp;lt;code&amp;gt;attr&amp;lt;/code&amp;gt; angegebenen Werte in die jeweilige Datenstruktur &amp;lt;code&amp;gt;$attr{$name}-&amp;gt; ...&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
X_Attr(@)&lt;br /&gt;
{&lt;br /&gt;
	my ($cmd,$name,$aName,$aVal) = @_;&lt;br /&gt;
  	# $cmd can be &amp;quot;del&amp;quot; or &amp;quot;set&amp;quot;&lt;br /&gt;
	# $name is device name&lt;br /&gt;
	# aName and aVal are Attribute name and value&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: 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;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Zusätzlich ist es möglich auch übergebene Attributwerte zu normalisieren und korrigieren, indem man im Parameterhash den ursprünglichen Wert anpasst. Dies erfolgt im Beispiel über die Modifikation des Wertes mit Index 3 im Parameterarray, also &amp;lt;code&amp;gt;$_[3]&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Die Attr-Funktion bekommt nicht den Hash der Geräteinstanz übergeben, da sie ja auch keine Werte dort speichern muss, sondern den Befehl &amp;lt;code&amp;gt;set&amp;lt;/code&amp;gt; oder &amp;lt;code&amp;gt;del&amp;lt;/code&amp;gt; je nachdem ob ein Attribut gesetzt oder gelöscht wird, den Namen der Geräteinstanz sowie den Namen des Attributs und seinen Wert.&lt;br /&gt;
Im obigen Beispiel wird für ein Attribut mit Namen Regex geprüft ob die Regex fehlerhaft ist. Falls sie ok ist, wird &amp;lt;code&amp;gt;undef&amp;lt;/code&amp;gt; zurückgegeben und fhem.pl speichert den Wert des Attributs.&lt;br /&gt;
&lt;br /&gt;
Falls man Attribute mit Platzhaltern definiert (Wildcard-Attribute), z.B. mit&lt;br /&gt;
&amp;lt;pre&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;/pre&amp;gt;&lt;br /&gt;
dann können Anwender Attribute wie reading01Name, reading02Name etc. setzen. Leider funktioniert das bisher nicht durch Klicken, da Fhemweb nicht alle denkbaren Ausprägungen in einem Dropdown anbieten kann. Der Benutzer muß solche Attribute über den &amp;lt;code&amp;gt;attr&amp;lt;/code&amp;gt; Befehl eintippen.&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 von &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
    addToDevAttrList($name, $aName);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
in der Attr-Funktion wenn ein Attribut gesetzt wird.&lt;br /&gt;
&lt;br /&gt;
=== X_Read ===&lt;br /&gt;
&lt;br /&gt;
Die X_Read-Funktion wird aus der Hauptschleife von FHEM aus aufgerufen wenn das Gerät, für das das Modul zuständig ist, Daten bereit gestellt hat, die gelesen werden können. Im folgenden Beispiel wird über eine serielle Schnittstelle (beziehungsweise über einen USB-To-Seriell-Konverter) von einem angeschlossenen Gerät gelesen. Dazu werden die bisher verfügbaren Daten mit der Funktion &amp;lt;code&amp;gt;DevIo_SimpleRead&amp;lt;/code&amp;gt; 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 zwischenspeichern. Es bietet sich an, dies im Hash der Geräteinstanz zu tun. Im Beispiel ist dies &amp;lt;code&amp;gt;$hash-&amp;gt;{buffer}&amp;lt;/code&amp;gt; an den die jeweils gelesenen Daten angehängt werden bis die folgende Prüfung ein für das jeweilige Protokoll passendes Frame identifiziert.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&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;
	# read from serial device&lt;br /&gt;
	my $buf = DevIo_SimpleRead($hash);		&lt;br /&gt;
	return &amp;quot;&amp;quot; if ( !defined($buf) );&lt;br /&gt;
&lt;br /&gt;
	# convert to hex string to make parsing with regex easier&lt;br /&gt;
	$hash-&amp;gt;{buffer} .= unpack (&#039;H*&#039;, $buf);	&lt;br /&gt;
	Log3 $name, 5, &amp;quot;Current buffer content: &amp;quot; . $hash-&amp;gt;{buffer};&lt;br /&gt;
&lt;br /&gt;
	# did we already get a full frame?&lt;br /&gt;
	if ($hash-&amp;gt;{buffer} =~ &amp;quot;ff1002(.{4})(.*)1003(.{4})ff(.*)&amp;quot;) &lt;br /&gt;
	...&lt;br /&gt;
&amp;lt;/pre&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;{buffer}&amp;lt;/code&amp;gt;) stehen oder aus dem Kontext mit einem Regex-Match extrahiert werden und in Readings gespeichert werden (siehe unten).&lt;br /&gt;
&lt;br /&gt;
=== X_Ready ===&lt;br /&gt;
&lt;br /&gt;
muss noch beschrieben werden.&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sub X_Ready($)&lt;br /&gt;
{&lt;br /&gt;
	my ($hash) = @_;&lt;br /&gt;
	return DevIo_OpenDev($hash, 1, undef )&lt;br /&gt;
	  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;
	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;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== X_Notify ===&lt;br /&gt;
&lt;br /&gt;
Die X_Notify-Funktion wird aus der Funktion DoTrigger in fhem.pl heraus aufgerufen wenn ein Modul Events erzeugt hat. Damit kann ein Modul auf Events anderer Module reagieren. Typische Beispiele sind das Filelog-Modul oder das Average-Modul. Average reagiert auf Events anderer Module und erweitert diese mit der Berechnung von Tages- und Monats-Durchschnittswerten.&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äts, das die Events erzeugt hat, kann es die Events verarbeiten. Events werden je Gerät in einem Array, das über das Internal &amp;lt;code&amp;gt;CHANGED&amp;lt;/code&amp;gt; referenziert wird, gespeichert.&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
&amp;lt;pre&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 $count = @{$dev_hash-&amp;gt;{CHANGED}}; # number of events / changes&lt;br /&gt;
&lt;br /&gt;
  foreach my $event (@{$dev_hash-&amp;gt;{CHANGED}}) {&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 device &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;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Da die Notify-Funktion für jedes Gerät mit allen seinen Events aufgerufen wird, muss sie in einer Schleife alle Events prüfen und entscheiden, ob es mit dem jeweiligen Event etwas tun möchte. Ein Gerät, das die Notify-Funktion implementiert sieht dafür typischerweise einen regulären Ausdruck vor, der 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 kommaseparierten Liste von Definitions-Namen in &amp;lt;code&amp;gt;$hash-&amp;gt;{NOTIFYDEV}&amp;lt;/code&amp;gt; angeben. Bspw. kann man in der Define-Funktion dort diesen Wert setzen. Dadurch wird die Notify-Funktion nur aufgerufen wenn eines der dort gelisteten Definitionen 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;pre&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_A,Definition_B&amp;quot;;&lt;br /&gt;
&amp;lt;/pre&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 hier gelisteten Definitionen erhält. Dadurch erfolgen deutlich weniger Aufrufe der Notify-Funktion, was Systemressourcen schont.&lt;br /&gt;
&lt;br /&gt;
Als anschauliches Beispiel und für weitere Details eignet sich das Modul 98_Average.pm&lt;br /&gt;
&lt;br /&gt;
=== X_DbLog_splitFn ===&lt;br /&gt;
Mit der DbLog_SplitFn kann der Modulautor selbst festlegen, wie die Events des Moduls in die Bestandteile Reading/Value/Unit zerlegt werden um ein korrektes Logging per DbLog zu gewährleisten.&amp;lt;br&amp;gt;&lt;br /&gt;
Eingangsparameter: Das generierte Event&amp;lt;br&amp;gt;&lt;br /&gt;
Rückgabewerte: Array: Reading/Value/Unit&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sub X_DbLog_splitFn($)&lt;br /&gt;
{&lt;br /&gt;
	my ($event) = @_;&lt;br /&gt;
	my ($reading, $value, $unit);&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;/pre&amp;gt;&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 &amp;lt;code&amp;gt;InternalTimer&amp;lt;/code&amp;gt; verwenden. Man übergibt ihr den Zeitpunkt für den nächsten Aufruf, den Namen der Funktion, die aufgerufen werden soll, den zu übergebenden Parameter und ein Flag ob der erste Aufruf verzögert werden soll falls die Initialiserung des Geräts noch nicht abgeschlossen ist. 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 Define-Funktion den Timer folgendermassen setzen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# initial request after 2 secs, there timer is set to interval for further update&lt;br /&gt;
InternalTimer(gettimeofday()+2, &amp;quot;X_GetUpdate&amp;quot;, $hash, 0);	&lt;br /&gt;
&amp;lt;/pre&amp;gt;&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;pre&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;
	InternalTimer(gettimeofday()+$hash-&amp;gt;{Interval}, &amp;quot;X_GetUpdate&amp;quot;, $hash, 1);&lt;br /&gt;
	Log3 $name, 4, &amp;quot;X: GetUpdate called ...&amp;quot;;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Im weiteren Verlauf der Funktion könnte man dann 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 Read-Funktion zu implementieren, die beim Anstehen von Daten aufgerufen wird.&lt;br /&gt;
&lt;br /&gt;
== Logging / Debugging ==&lt;br /&gt;
Um Innerhalb eines Moduls eine Protokollmeldung in die Fhem-Logdatei zu schreiben, wird die Funktion Log3 aufgerufen:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Log3 $name, 3, &amp;quot;X: Problem erkannt ...&amp;quot;;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Parameter der Funktion Log3 sind der Name oder der Hash der Geräteinstanz, das Verbose-Level, in dem die Meldung sichtbar sein soll und die Meldung selbst.&lt;br /&gt;
Den Namen der Geräteinstanz kann man in den Funktionen, die den Hash übergeben bekommen einfach aus diesem Hash nehmen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
my $name = $hash-&amp;gt;{NAME};&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Um für ein neues Modul das Verbose-Level zu erhöhen, ohne gleich für das Gesamte FHEM alle Meldungen zu erzeugen kann man den Befehl &lt;br /&gt;
&amp;lt;code&amp;gt;attr gerätename verbose&amp;lt;/code&amp;gt; verwenden. Beispielsweise &amp;lt;code&amp;gt;attr PM verbose 5&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Damit bietet es sich an im Modul Meldungen, die im normalen Betrieb nicht benötigt werden, beim Aufruf von Log3 mit dem Level 4 oder 5 anzugeben. Wenn man dann bei der Fehlersuche mehr Meldungen sehen möchte, erhöht man mit attr X verbose das Level für das betroffene Gerät.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Zweistufiges Modell für Module ==&lt;br /&gt;
siehe auch&lt;br /&gt;
* [http://forum.fhem.de/index.php/topic,18920.msg128100.html#msg128100|The FHEM two-level model]&lt;br /&gt;
* [http://forum.fhem.de/index.php/topic,13438.msg83643.html#msg83643|Zum Initialize bei physikalischen und logischen Geräten]&lt;br /&gt;
&lt;br /&gt;
Das zweistufige Modell besteht aus &lt;br /&gt;
* physisches Modul - z.B. für CUL (00_CUL.pm), der mehrer Protokolle empfängt, u.a. FS20&lt;br /&gt;
* logische Modul(e) - z.B. das Protokoll FS20 (10_FS20.pm)&lt;br /&gt;
&lt;br /&gt;
Das physische Modul öffnet die Datenverbindung zum Gerät. &lt;br /&gt;
&lt;br /&gt;
=== Kommunikation vom Gerät zu den logischen Modulen ===&lt;br /&gt;
Die [[#X_Read|X_Read]]-Funktion wird aus der Hauptschleife von Fhem aufgerufen sobald das Gerät, für das das Modul zuständig ist, Daten bereit gestellt hat, die gelesen werden können.&lt;br /&gt;
&lt;br /&gt;
Unter Windows funktioniert &amp;quot;select&amp;quot; nur für Geräte, die via TCP verbunden sind. Für alle anderen Geräte ist eine [[#X_Ready|X_Ready]]-Funktion von Nöten, die 10x pro Sekunde das Gerät abfrägt und &amp;quot;true&amp;quot; zurück gibt, sollten Daten bereit stehen.&lt;br /&gt;
&lt;br /&gt;
Die X_Read-Funktion stellt sicher, dass die Daten&lt;br /&gt;
* komplett und&lt;br /&gt;
* korrekt&lt;br /&gt;
sind und sie ruft die globale Funktion Dispatch() mit einer Nachricht auf.&lt;br /&gt;
&lt;br /&gt;
Dispatch() sucht nach einem passenden lokalen Modul via &lt;br /&gt;
* $hash-&amp;gt;{Clients} oder $hash-&amp;gt;{MatchList} im physischen Modul&lt;br /&gt;
* $hash-&amp;gt;{Match} in allen passenden logischen Modulen&lt;br /&gt;
und ruft X_Parse in den gefundenen Modulen auf.&lt;br /&gt;
&lt;br /&gt;
X_Parse &lt;br /&gt;
* untersucht die übergebenen Daten (von Dispatch() übergeben)&lt;br /&gt;
* setzt alle [[#Readings|readings]] via readings*update Funktionen&lt;br /&gt;
* gibt den Namen des logischen Device zurück&lt;br /&gt;
&lt;br /&gt;
Es findet kein Event-Triggering statt, wenn die readings*update Funktionen &lt;br /&gt;
* von X_Parse aufgerufen werden und&lt;br /&gt;
* X_Parse wiederum von Dispatch() aufgerufen wurde.&lt;br /&gt;
(Im Gegensatz zum direkten Aufrufen der readings*update Funktionen ohne vorhergehendes Dispatch() )&lt;br /&gt;
&lt;br /&gt;
Dispatch() triggert das Event-Handling für das  von X_Parse zurückgegebene logische Device.&lt;br /&gt;
&lt;br /&gt;
=== Kommunikation von den logischen Modulen zum Gerät ===&lt;br /&gt;
&lt;br /&gt;
Um von einem logischen Modul an ein physisches Gerät zu senden, wird im logischen Modul das Attribut IODev mit dem namen des physischen Devices gesetzt.&lt;br /&gt;
Der Befehl&lt;br /&gt;
&amp;lt;code&amp;gt;AssignIoPort($hash);&amp;lt;/code&amp;gt;&lt;br /&gt;
in der X_Define-Funktion des logischen Devices erledigt das.&lt;br /&gt;
&lt;br /&gt;
Als Befehl zum Schreiben vom logischen ins physische Gerät soll &amp;lt;code&amp;gt;IOWrite()&amp;lt;/code&amp;gt; verwendet werden. IOWrite() ruft im physischen Gerät die X_Write-Funktion auf.&lt;br /&gt;
&lt;br /&gt;
Wenn es keine direkte Kommunikation zwischen dem logischen und dem physischen Gerät gibt(keine direkten Aufrufe von Funktionen, kein direktes überprüfen von $hash Werten,...) so können die Module hintereinander geschaltet werden (z.B. für Routerfunktionen wie in RFR) oder mittels  FHEM2FHEM:RAW zwei Fhem Installationen verbunden werden und die logischen Devices werden dennoch funktionieren.&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 Commandref [http://fhem.de/commandref.html] 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;pre&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 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://www.fhemwiki.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;/pre&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;
== Noch zu beschreiben ==&lt;br /&gt;
* Zweistufiges Modell für Module&lt;br /&gt;
* Funktion X_Ready ...&lt;br /&gt;
* Funktion X_State_Fn: {{Link2Forum|Topic=32680}}, siehe auch [[DevelopmentState]]&lt;br /&gt;
* FW_summaryFn (wird von FHEMWEB aufgerufen fuer Raum-Uebersicht)&lt;br /&gt;
* FW_detailFn (wird von FHEMWEB aufgerufen fuer Detail-Ansicht)&lt;br /&gt;
* DevIO&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Development]]&lt;/div&gt;</summary>
		<author><name>Viegener</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=DevelopmentModuleAPI&amp;diff=14207</id>
		<title>DevelopmentModuleAPI</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=DevelopmentModuleAPI&amp;diff=14207"/>
		<updated>2016-02-15T21:02:43Z</updated>

		<summary type="html">&lt;p&gt;Viegener: Zeitstempel hinzugefügt&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
&lt;br /&gt;
{{Randnotiz|RNTyp=r|RNText=Bitte beachten: letztendlich entscheidend ist immer der Perl-Code, Unstimmigkeiten sollten im Fhem-Forum angemerkt (oder hier berichtigt) werden!&lt;br /&gt;
&amp;lt;hr /&amp;gt;&lt;br /&gt;
Please note: in the end it is always the Perl code itself that is relevant; please report errors and omissions in the fhem forum (or correct them here)!&lt;br /&gt;
}}&lt;br /&gt;
Dieses 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 identifiziern 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 einen Funktion stolpert, die auch andere interessieren könnte.&lt;br /&gt;
&lt;br /&gt;
== Command handling ==&lt;br /&gt;
=== AnalyzeCommand ===&lt;br /&gt;
AnalyzeCommand ermöglicht das Parsen und die Ausführung eines FHEM-Befehls, wie in [[FHEMWEB]] im Kommandoeingabefeld enthalten.&lt;br /&gt;
:&amp;lt;code&amp;gt;AnalyzeCommand ($cl, $cmd)&amp;lt;/code&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Parameter!! Bedeutung&lt;br /&gt;
|-&lt;br /&gt;
|  style=&amp;quot;vertical-align:top&amp;quot; | &#039;&#039;&#039;&amp;lt;code&amp;gt;$cl&amp;lt;/code&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;might be undef&#039;&#039;&lt;br /&gt;
|| Devicehash für die Ausführung des Kommandos in einem spezifischen Kontext eines Devices (Quelle des Befehles z.B. für Berechtigungsprüfung)&amp;lt;br&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|  style=&amp;quot;vertical-align:top&amp;quot; | &#039;&#039;&#039;&amp;lt;code&amp;gt;$cmd&amp;lt;/code&amp;gt;&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;mandatory&#039;&#039;&lt;br /&gt;
|| Kommandos, die ausgeführt werden sollen.&amp;lt;br&amp;gt;&lt;br /&gt;
Beispiel:&lt;br /&gt;
* &#039;&#039;define dummy1 dummy&#039;&#039;&lt;br /&gt;
* &#039;&#039;{ Log3(undef, 1, &amp;quot;Hallo&amp;quot;);}&#039;&#039;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== AnalyzeCommandChain ===&lt;br /&gt;
AnalyzeCommandChain ermöglicht das Parsen und die Ausführung von FHEM-Befehlen, wie in FHEMWeb im Kommandoeingabefeld enthalten.&lt;br /&gt;
:&amp;lt;code&amp;gt;AnalyzeCommandChain ($cl, $cmds)&amp;lt;/code&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Parameter!! Bedeutung&lt;br /&gt;
|-&lt;br /&gt;
|  style=&amp;quot;vertical-align:top&amp;quot; | &#039;&#039;&#039;&amp;lt;code&amp;gt;$cl&amp;lt;/code&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;might be undef&#039;&#039;&lt;br /&gt;
|| Devicehash für die Ausführung des Kommandos in einem spezifischen Kontext eines Devices (Quelle des Befehles z.B. für Berechtigungsprüfung)&amp;lt;br&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|  style=&amp;quot;vertical-align:top&amp;quot; | &#039;&#039;&#039;&amp;lt;code&amp;gt;$cmds&amp;lt;/code&amp;gt;&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;mandatory&#039;&#039;&lt;br /&gt;
|| Kommandos, das ausgeführt werden soll, durch ; getrennt.&amp;lt;br&amp;gt;&lt;br /&gt;
Beispiel:&lt;br /&gt;
* &#039;&#039;define dummy1 dummy; list dummy1&#039;&#039;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Diverse ==&lt;br /&gt;
=== ReplaceSetMagic===&lt;br /&gt;
ReplaceSetMagic &lt;br /&gt;
:&amp;lt;code&amp;gt;($err, @result) = ReplaceSetMagic($hash, $nsplit, @elements)&amp;lt;/code&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Parameter!! Bedeutung&lt;br /&gt;
|-&lt;br /&gt;
|  style=&amp;quot;vertical-align:top&amp;quot; | &#039;&#039;&#039;&amp;lt;code&amp;gt;$hash&amp;lt;/code&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;might be undef&#039;&#039;&lt;br /&gt;
|| Devicehash für die Ausführung des Kommandos in einem spezifischen Kontext eines Devices (Quelle des Befehles z.B. für Berechtigungsprüfung)&amp;lt;br&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|  style=&amp;quot;vertical-align:top&amp;quot; | &#039;&#039;&#039;&amp;lt;code&amp;gt;$nsplit&amp;lt;/code&amp;gt;&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Zahl&#039;&#039;&lt;br /&gt;
|| Begrenzung für den Split des Ergebnisstrings nach erfolgter Ersetzung (siehe elements)&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;@elements&amp;lt;/code&amp;gt;&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;mandatory&#039;&#039;&lt;br /&gt;
|| Parameterarray mit Strings Die Elemente des übergebenen Arrays werden in einem String getrennt duch Leerzeichen zusammengefasst.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&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;$err&amp;lt;/code&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
|| Im Fehlerfall: Fehlermeldung  sonst undef&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;
&lt;br /&gt;
|| Ergebnis der Ersetzung von Readings und Perl Aufrufen im Parameterarray. Die Elemente des übergebenen Arrays werden in einem String, getrennt durch Leerzeichen, zusammengefasst und im Rückgabewert wieder in ein Array (unter Berücksichtigung von nsplit als Begrenzung für den perl-Split-Aufruf) zerlegt.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Time / Timestamp ==&lt;br /&gt;
=== FmtDateTimeRFC1123===&lt;br /&gt;
:&amp;lt;code&amp;gt;$timestampGMT = FmtDateTimeRFC1123($time)&amp;lt;/code&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Parameter!! Bedeutung&lt;br /&gt;
|-&lt;br /&gt;
|  style=&amp;quot;vertical-align:top&amp;quot; | &#039;&#039;&#039;&amp;lt;code&amp;gt;$time&amp;lt;/code&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;might be undef&#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;
&amp;lt;code&amp;gt;Mon, 15 Feb 2016 20:52:20 GMT&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&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 RFC1123 beschrieben wird. Diese werden zum Beispiel bei http verwendet.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;Mon, 15 Feb 2016 20:52:20 GMT&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== FmtDateTime===&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;code&amp;gt;$timestamp = FmtDateTime($time)&amp;lt;/code&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Parameter!! Bedeutung&lt;br /&gt;
|-&lt;br /&gt;
|  style=&amp;quot;vertical-align:top&amp;quot; | &#039;&#039;&#039;&amp;lt;code&amp;gt;$time&amp;lt;/code&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
|| Zeitangabe wie sie von der &amp;lt;code&amp;gt;time&amp;lt;/code&amp;gt; Funktion zurückgegeben wird&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&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;code&amp;gt;$timestamp = TimeNow( )&amp;lt;/code&amp;gt;&lt;br /&gt;
&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;
Benutzt FmtDateTime&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Readings ==&lt;br /&gt;
Die verschiedenen Funktionen zu Readings sind hier beschrieben: &lt;br /&gt;
&lt;br /&gt;
[[DevelopmentIntroduction]] und [[DevelopmentModuleIntro]]&lt;br /&gt;
&lt;br /&gt;
== Fehlt noch ==&lt;br /&gt;
* Log3&lt;br /&gt;
* IsDisabled&lt;br /&gt;
* IsDummy&lt;br /&gt;
* IsIgnored&lt;br /&gt;
* IsIoDummy&lt;br /&gt;
* InternalTimer&lt;br /&gt;
* RemoveInternalTimer&lt;br /&gt;
* configDBUsed&lt;br /&gt;
* devspec2array&lt;br /&gt;
* FmtTime&lt;br /&gt;
* EvalSpecials&lt;br /&gt;
* DoTrigger&lt;br /&gt;
* InternalVal&lt;br /&gt;
* ReadingsVal&lt;br /&gt;
* ReadingsNum&lt;br /&gt;
* ReadingsTimestamp&lt;br /&gt;
* Value&lt;br /&gt;
* OldValue&lt;br /&gt;
* OldTimestamp&lt;br /&gt;
* AttrVal&lt;br /&gt;
* readingsBeginUpdate&lt;br /&gt;
* readingsBulkUpdate&lt;br /&gt;
* readingsEndUpdate&lt;br /&gt;
* readingsSingleUpdate&lt;br /&gt;
* computeClientArray&lt;br /&gt;
* FileRead&lt;br /&gt;
* FileWrite&lt;br /&gt;
* getUniqueId&lt;br /&gt;
* getKeyValue&lt;br /&gt;
* setKeyValue&lt;br /&gt;
* Debug&lt;br /&gt;
[[Kategorie:Development]]&lt;/div&gt;</summary>
		<author><name>Viegener</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=DevelopmentModuleAPI&amp;diff=14118</id>
		<title>DevelopmentModuleAPI</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=DevelopmentModuleAPI&amp;diff=14118"/>
		<updated>2016-02-09T23:30:50Z</updated>

		<summary type="html">&lt;p&gt;Viegener: Erste Version als Einstieg&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Einleitung ==&lt;br /&gt;
Dieses 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 Wiederverwenund mehr Einheitlichkeit zu erzeugen&lt;br /&gt;
* Aufwand zu veringern&lt;br /&gt;
* Bei Änderungen auch betroffene Module leichter identifiziern 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 einen Funktion stolpert, die auch andere interessieren könnte.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Command handling ==&lt;br /&gt;
&lt;br /&gt;
=== AnalyzeCommand ===&lt;br /&gt;
AnalyzeCommand ermöglicht das Parsen und die Ausführung eines FHEM-Befehls, wie in FHEMWeb im Kommandoeingabefeld enthalten.&lt;br /&gt;
:&amp;lt;code&amp;gt;AnalyzeCommand ($cl, $cmd)&amp;lt;/code&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Parameter!! Bedeutung&lt;br /&gt;
|-&lt;br /&gt;
|  style=&amp;quot;vertical-align:top&amp;quot; | &#039;&#039;&#039;&amp;lt;code&amp;gt;$cl&amp;lt;/code&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;might be undef&#039;&#039;&lt;br /&gt;
|| Devicehash für die Ausführung des Kommandos in einem spezifischen Kontext eines Devices (Quelle des Befehles z.B. für Berechtigungsprüfung)&amp;lt;br&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|  style=&amp;quot;vertical-align:top&amp;quot; | &#039;&#039;&#039;&amp;lt;code&amp;gt;$cmd&amp;lt;/code&amp;gt;&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;mandatory&#039;&#039;&lt;br /&gt;
|| Kommandos, die ausgeführt werden sollen.&amp;lt;br&amp;gt;&lt;br /&gt;
Beispiel:&lt;br /&gt;
* &#039;&#039;define dummy1 dummy&#039;&#039;&lt;br /&gt;
* &#039;&#039;{ Log3(undef, 1, &amp;quot;Hallo&amp;quot;);}&#039;&#039;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== AnalyzeCommandChain ===&lt;br /&gt;
AnalyzeCommandChain ermöglicht das Parsen und die Ausführung von FHEM-Befehlen, wie in FHEMWeb im Kommandoeingabefeld enthalten.&lt;br /&gt;
:&amp;lt;code&amp;gt;AnalyzeCommandChain ($cl, $cmds)&amp;lt;/code&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Parameter!! Bedeutung&lt;br /&gt;
|-&lt;br /&gt;
|  style=&amp;quot;vertical-align:top&amp;quot; | &#039;&#039;&#039;&amp;lt;code&amp;gt;$cl&amp;lt;/code&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;might be undef&#039;&#039;&lt;br /&gt;
|| Devicehash für die Ausführung des Kommandos in einem spezifischen Kontext eines Devices (Quelle des Befehles z.B. für Berechtigungsprüfung)&amp;lt;br&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|  style=&amp;quot;vertical-align:top&amp;quot; | &#039;&#039;&#039;&amp;lt;code&amp;gt;$cmds&amp;lt;/code&amp;gt;&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;mandatory&#039;&#039;&lt;br /&gt;
|| Kommandos, das ausgeführt werden soll, durch ; getrennt.&amp;lt;br&amp;gt;&lt;br /&gt;
Beispiel:&lt;br /&gt;
* &#039;&#039;define dummy1 dummy; list dummy1&#039;&#039;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Diverse ==&lt;br /&gt;
&lt;br /&gt;
=== ReplaceSetMagic===&lt;br /&gt;
ReplaceSetMagic &lt;br /&gt;
:&amp;lt;code&amp;gt;($err, @result) = ReplaceSetMagic($hash, $nsplit, @elements)&amp;lt;/code&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Parameter!! Bedeutung&lt;br /&gt;
|-&lt;br /&gt;
|  style=&amp;quot;vertical-align:top&amp;quot; | &#039;&#039;&#039;&amp;lt;code&amp;gt;$hash&amp;lt;/code&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;might be undef&#039;&#039;&lt;br /&gt;
|| Devicehash für die Ausführung des Kommandos in einem spezifischen Kontext eines Devices (Quelle des Befehles z.B. für Berechtigungsprüfung)&amp;lt;br&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|  style=&amp;quot;vertical-align:top&amp;quot; | &#039;&#039;&#039;&amp;lt;code&amp;gt;$nsplit&amp;lt;/code&amp;gt;&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Zahl&#039;&#039;&lt;br /&gt;
|| Begrenzung für den Split des Ergebnisstrings nach erfolgter Ersetzung (siehe elements)&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;@elements&amp;lt;/code&amp;gt;&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;mandatory&#039;&#039;&lt;br /&gt;
|| Parameterarray mit Strings Die Elemente des übergebenen Arrays werden in einem String getrennt duch Leerzeichen zusammengefasst.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&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;$err&amp;lt;/code&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
|| Im Fehlerfall: Fehlermeldung  sonst undef&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;
&lt;br /&gt;
|| Ergebnis der Ersetzung von Readings und perlaufrufen im Parameterarray. Die Elemente des übergebenen Arrays werden in einem String getrennt duch Leerzeichen zusammengefasst und im Rückgabewert wieder in ein Array (unter Berücksichtigung von nsplit als Begrenzung für den perl-Spllit-Aufruf) zerlegt.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Readings ==&lt;br /&gt;
&lt;br /&gt;
Die verschiedenen Funktionen zu Readings sind hier beschieben: &lt;br /&gt;
&lt;br /&gt;
[[DevelopmentIntroduction]] und [[DevelopmentModuleIntro]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Fehlt noch ==&lt;br /&gt;
* Log3&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Development]]&lt;/div&gt;</summary>
		<author><name>Viegener</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=TelegramBot&amp;diff=13362</id>
		<title>TelegramBot</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=TelegramBot&amp;diff=13362"/>
		<updated>2015-12-26T23:15:50Z</updated>

		<summary type="html">&lt;p&gt;Viegener: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Infobox Modul&lt;br /&gt;
|ModPurpose=Senden und Empfangen von Nachrichten (Text und Fotos) mit dem freien Messagingdienst Telegram&lt;br /&gt;
|ModType=d&lt;br /&gt;
|ModForumArea=Unterstützende Dienste&lt;br /&gt;
|ModFTopic=38328&lt;br /&gt;
|ModTechName=[https://github.com/viegener/Telegram-fhem/blob/master/50_TelegramBot.pm 50_TelegramBot.pm]&lt;br /&gt;
|ModOwner=[[Benutzer:Viegener|Viegener]] ({{Link2FU|12772|Forum}} / [[Benutzer Diskussion:Viegener|Wiki]])}}&lt;br /&gt;
&lt;br /&gt;
Das [[TelegramBot]]-Modul ermöglicht das Senden und Empfangen von Nachrichten über den Telegram-instant messaging Dienst (https://telegram.org/). &lt;br /&gt;
Es entsteht eine Möglichkeit Benachrichtungen aus Fhem zu versenden, zum Beispiel Alarmmeldungen.&lt;br /&gt;
Ausserdem können auch Kommandos über Telegram an Fhem gesendet werden um Steuerungsbefehle in Fhem auszulösen.&lt;br /&gt;
&lt;br /&gt;
Das TelegramBot-Modul benötigt keine Zusatzsoftware auf dem Fhem-Server (anders als die Variante [[Telegram]]), sondern verwendet das [https://core.telegram.org/bots/api TelegramBot-API] über https-Aufrufe.&lt;br /&gt;
&lt;br /&gt;
== Über Telegram Instant Messaging ==&lt;br /&gt;
Telegram-IDs und Versand/Empfang von Nachrichten sind kostenfrei. &lt;br /&gt;
Clients sind für gängige Smartphonesysteme erhältlich (iOS iPhone und Tablet, Android, Windows Phone) und &lt;br /&gt;
können auch aus dem WebBrowser verwendet werden. &lt;br /&gt;
Es gibt auch einen Kommandozeilen-Client für Linux, der die Grundlage dieses Moduls darstellt. &lt;br /&gt;
Mehrfachanmeldungen, auch parallel mit verschiedenen Geräten (z.B. Tablet und Smartphone), sind möglich.&lt;br /&gt;
Gruppenchats und Chats mit End-2-End-Verschlüsselung werden ebenfalls unterstützt.&lt;br /&gt;
&lt;br /&gt;
Für die Unterstützung von &#039;&#039;WhatsApp&#039;&#039; siehe Modul [[yowsup]].&lt;br /&gt;
&lt;br /&gt;
== Features ==&lt;br /&gt;
Unterstützt werden:&lt;br /&gt;
&lt;br /&gt;
* Versand von Textnachrichten &lt;br /&gt;
* Versand von Bildern &lt;br /&gt;
* Empfang von Textnachrichten von beliebigen Kontakten&lt;br /&gt;
* Kommandos in Fhem über Telegram-Nachrichten von aussen auslösen&lt;br /&gt;
&lt;br /&gt;
Eine detaillierte Beschreibung des Moduls ist im Fhem Forum und in der (englischen) Dokumentation zum Modul in der Commandref diesem  {{Link2Forum|Topic=38328|LinkText=Diskussionsthread}} zu finden. Seit Oktober 2015 wird das Modul offiziell über Fhem-Update verteilt.&lt;br /&gt;
&lt;br /&gt;
Die jeweils aktuellste Entwicklungs-Version des Moduls ist in Github [https://github.com/viegener/Telegram-fhem/blob/master/50_TelegramBot.pm 50_TelegramBot.pm] verfügbar.&lt;br /&gt;
&lt;br /&gt;
== Hinweise zum Betrieb mit Fhem ==&lt;br /&gt;
{{Randnotiz|RNTyp=Warn|RNText=Achtung: Dieses Authtoken ist die einzige Authentifizierung für den Bot und sollte deshalb nicht aus der Hand gegeben werden. Die verwendeten Urls sind deshalb auch in den Log-Files nicht enthalten, da diese das Authtoken in Klartext enthalten. Auch im Forum sollte dieses Token nicht aufgenommen werden.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Für die Anlage eines TelegramBot Devices in Fhem ist ein Authtoken erforderlich. Dieses Token wird über Anlegen eines neuen Bots im [https://core.telegram.org/bots#botfather BotFather] erzeugt. Dort mit dem Telegram-Befehl &amp;lt;code&amp;gt;/newbot&amp;lt;/code&amp;gt; einen neuen Bot anlegen und mit einem Namen versehen. Hinweis: Die Namen für Bots müssen auf &amp;quot;Bot&amp;quot; enden.&lt;br /&gt;
&lt;br /&gt;
Das Anlegen eines TelegramBot devices erfolgt durch die Angabe dieses Tokens:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;define &amp;amp;lt;name&amp;amp;gt; TelegramBot  &amp;amp;lt;token&amp;amp;gt; &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Beispiel: &amp;lt;code&amp;gt;define teleBot TelegramBot 110201543:AAHdqTcvCH1vGWJxfSeofSAs0K5PALDsaw&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Das Empfangen von Nachrichten (polling) erfordert die Einstellung des Attributes&#039;&#039;&#039; &lt;br /&gt;
&amp;lt;code&amp;gt;pollingTimeout&amp;lt;/code&amp;gt; &#039;&#039;&#039;auf einen Wert der grösser als Null ist. Beim Wert 0 oder ohne Setzen des Attributes findet kein Polling und damit auch kein Empfang statt.&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Der TelegramBot kann erst dann Nachrichten an einen telegram user schicken, wenn dieser zuerst an den telegram bot eine Nachricht gesendet hat.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Tipps ==&lt;br /&gt;
&lt;br /&gt;
=== Privacyeinstellungen ===&lt;br /&gt;
&lt;br /&gt;
Damit der TelegramBot auch Meldungen in Gruppen sieht, müssen über den BotFather die Privacy-Einstellungen geändert werden.&lt;br /&gt;
&lt;br /&gt;
=== Kontakte ===&lt;br /&gt;
&lt;br /&gt;
Der Bot merkt sich die bereits bekannten Kontakte im Reading &amp;lt;code&amp;gt;Contacts&amp;lt;/code&amp;gt;. Dabei werden die einzelnen Kontakte jeweils als 3-teilige Einträge bestehend aus UserID, Vor- und Nachname des Benutzers (mit _ verbunden) und dem Username (mit vorangestelltem @). &lt;br /&gt;
&lt;br /&gt;
Beispiel: &amp;lt;code&amp;gt;123456:Ralf_Mustermann:@ralf&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Verschiedene Einträge werden durch Leerzeichen getrennt.&lt;br /&gt;
&lt;br /&gt;
Man kann die Kontakte auch manuell überschreiben (z.B. wenn das Reading fehlerhaft oder verloren sein sollte). Dazu gibt es den Set-Befehl &amp;lt;code&amp;gt;replaceContacts&amp;lt;/code&amp;gt;. Dieser nimmt die Kontakte ebenfalls in der gleichen Form wie oben beschrieben entgegen.&lt;br /&gt;
&lt;br /&gt;
Die Kontaktliste wird ansonsten nur durch den Empfang von Nachrichten erweitert, da es im TelegramBot-API keine Möglichkeit gibt Kontaktdaten von Telegram abzufragen (siehe auch pollingTimeout)&lt;br /&gt;
&lt;br /&gt;
=== Reset ===&lt;br /&gt;
&lt;br /&gt;
Es ist möglich den Bot im laufenden Betrieb zurückzusetzen (Set-Befehl &amp;lt;code&amp;gt;reset&amp;lt;/code&amp;gt;). Dabei werden noch nicht abgeschlossene Übetragungen entfernt und die internen Zustände des Devices zurückgesetzt. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Beispielszenarien ==&lt;br /&gt;
&lt;br /&gt;
=== Benachrichtigungen über Ereignisse ===&lt;br /&gt;
&lt;br /&gt;
Das einfachste Szenario für die Integration von Messaging-Diensten mit Fhem ist zur Benachrichtigung über Ereignisse. Diese Funktion kann zum Beispiel verwendet werden, um über einen erfolgten Neustart von Fhem zu informieren:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;define notify_fhem_reload notify global:INITIALIZED set telebotdevice message fhem newly started - just now !&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In diesem Beispiel wird der Nachrichtentext &amp;quot;fhem newly started - just now !&amp;quot; an den als default eingestellten Kontakt (Attribut: defaultPeer) gesendet, sobald Fhem neu gestartet wurde. Natürlich kann man auch beliebige andere Benachrichtigungen einführen.&lt;br /&gt;
&lt;br /&gt;
=== Versand von Bildern ===&lt;br /&gt;
&lt;br /&gt;
Es ist auch möglich Bilder auf dem Fhem-Server, die zum Beispiel von einer Kamera oder einem Wettermodul stammen über Telegram zu versenden. So wäre es z.B. möglich jeweils morgens die aktuelle Wetterkarte zu erhalten.&lt;br /&gt;
&lt;br /&gt;
ACHTUNG: TelegramBot verwendet das HTTPUtils-Modul zur Kommunikation mit dem TelegramBot-API. Erst mit der Version, die seit 22.10.2015 &lt;br /&gt;
([r9576] HttpUtils.pm: Async write for POST Requests {{Link2Forum|Topic=41583|LinkText=Fhem-Forum}}) verteilt wird, erlaubt auch den Transfer grösserer Bilder. Die Grenze liegt ansonsten bei ca. 14kb auf Raspberries (Plattformspezifische Grenze).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;define notify_fhem_reload notify wetter:report set telebotdevice sendPhoto /opt/fhem/wetter.jpg&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Bei Erreichen des entsprechenden Status am Wetter-Modul wird ein Image über Telegram versendet. Hier sind lokale Pfade (relativ zu fhem) oder absolute Pfade wie oben möglich. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Versand von Emojis (Smileys) ===&lt;br /&gt;
&lt;br /&gt;
Es ist auch möglich Emojis mit den (Text-)Nachrichten zu versenden. Die entsprechenden (Unicode-)Zeichen werden einfach direkt mit in den Text der Nachricht aufgenommen. Um das zu vereinfachen kann man das einfach per Copy und Paste von dieser Seite &lt;br /&gt;
&lt;br /&gt;
http://apps.timwhitlock.info/emoji/tables/unicode (Spalte &amp;quot;Native&amp;quot;) &lt;br /&gt;
&lt;br /&gt;
übernehmen und mit der Nachricht verschicken. &lt;br /&gt;
&lt;br /&gt;
Die Emojis können auch empfangen werden und werden so auch in FHEM / FHEMWeb angezeigt. Plattformspezifische (z.B. von iOS oder Android) Emojis werden dabei nicht unterstützt (gerade mit iOS sind viele neue farbige Emojis hinzugekommen, die wohl leider nur auf Apple-devices funktionieren).&lt;br /&gt;
&lt;br /&gt;
=== Kommandos auslösen ===&lt;br /&gt;
&lt;br /&gt;
Ein wichtiges Szenario ist die Möglichkeit Kommandos in Fhem ausführen zu können, ohne einen Zugang durch die Firewall einrichten zu müssen. Dazu ist die Definition eines Schlüsselwortes (Attribut: &amp;quot;cmdKeyword&amp;quot;)erforderlich, mit dem man die Nachrichten beginnen muss, damit der TelegramBot die Kommandos erkennt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;attr telebotdevice cmdKeyword doit&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Somit kann man dann durch Nachrichten die mit &amp;quot;doit&amp;quot; beginnen Kommandos an Fhem senden, die ähnlich wie im Kommandoeingabefeld von Fhemweb dann von Fhem ausgeführt werden. Das Ergebnis der Ausführung wird zurück an den Sender (und an den definierten defaultPeer) geschickt.&lt;br /&gt;
&lt;br /&gt;
Somit können nicht nur Aktionen angestossen werden, sondern auch Infos abgefragt werden.&lt;br /&gt;
&lt;br /&gt;
Beispiele&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;doit set schalter on&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;doit list telegrambot&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Randnotiz|RNTyp=Warn|RNText=Achtung: Bei den Kommandos sollten man unbedingt das Attribut &amp;quot;cmdRestrictedPeer&amp;quot; setzen, damit nicht jeder Kommandos auf dem Fhem-Server ausführen kann. Dazu sollten die BenutzerIDs der erlaubten Benutzer (durch Leerzeichen getrennt angeben). Da Benutzernamen selber vergeben werden und nicht unbedingt eindeutig sind, sollten hier auch NUR BenutzerIDs verwendet werden.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Favoriten für Kommandos anlegen ===&lt;br /&gt;
&lt;br /&gt;
Grundidee bei den Favoriten ist, dass man lange Befehle, die man häufig braucht auf &amp;quot;Kurzwahl&amp;quot; legt.&lt;br /&gt;
&lt;br /&gt;
Beispiel-Kommandos wie z.B. &amp;lt;code&amp;gt;set TYPE=ROLLADEN pos 100&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;set TYPE=ROLLADEN pos 0&amp;lt;/code&amp;gt;, die man immer wieder braucht. Um nicht jedes mal dieses Kommando eintippen zu müssen auf dem Smartphone, kann man auch dafür Favoriten anlegen.&lt;br /&gt;
&lt;br /&gt;
Dazu gibt man erst mal die beiden Kommandos getrennt durch Semikolon im Attribut favorites an:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;attr telegrambotdevice favorites set TYPE=ROLLADEN pos 100;set TYPE=ROLLADEN pos 0&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Um die Favorites jetzt ausführen zu können braucht man noch ein Schlüsselwort dafür.&lt;br /&gt;
Nehmen wir mal an man möchte die Favoriten mit &amp;lt;code&amp;gt;/short&amp;lt;/code&amp;gt; ausführen können. Dazu muss dann das Attribut &amp;quot;cmdFavorites&amp;quot; setzen&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;attr telegrambotdevice cmdFavorites /short&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wenn man nun im Telegram Client &lt;br /&gt;
&amp;lt;code&amp;gt;/short 1&amp;lt;/code&amp;gt; an den Bot schickt führt der Bot den ersten Favoriten aus und das Ergebnis der Ausführung wird zurückgeschickt.&lt;br /&gt;
&lt;br /&gt;
Ausserdem kann man im Telegram Client &lt;br /&gt;
&amp;lt;code&amp;gt;/short&amp;lt;/code&amp;gt; an den Bot schicken, dann antwortet der Bot mit&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Favorites&lt;br /&gt;
&lt;br /&gt;
1&lt;br /&gt;
set TYPE=ROLLADEN pos 100&lt;br /&gt;
2&lt;br /&gt;
set TYPE=ROLLADEN pos 0&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
* Github Repository für die Telegram-Fhem Entwicklung: https://github.com/viegener/Telegram-fhem&lt;br /&gt;
* Infos zum Telegram BotFather: https://core.telegram.org/bots#botfather&lt;br /&gt;
&lt;br /&gt;
* Source code für das 50_TelegramBot.pm-Modul: https://github.com/viegener/Telegram-fhem/blob/master/50_TelegramBot.pm&lt;br /&gt;
* Source code für das modifizierte HTTPUtils-Modul zur Übertragung grosser Bilder: https://github.com/viegener/Telegram-fhem/blob/master/HttpUtils.pm&lt;br /&gt;
&lt;br /&gt;
* Forum-Thread in dem das Modul vorgestellt wurde {{Link2Forum|Topic=38328|LinkText=Fhem-Forum}}&lt;br /&gt;
* Telegram messaging system https://telegram.org/&lt;br /&gt;
* TelegramBot API https://core.telegram.org/bots/api&lt;br /&gt;
&lt;br /&gt;
--[[Benutzer:Viegener|Viegener]] ([[Benutzer Diskussion:Viegener|Diskussion]]) 22:49, 11. Okt. 2015 (CEST)&lt;/div&gt;</summary>
		<author><name>Viegener</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=TelegramBot&amp;diff=13291</id>
		<title>TelegramBot</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=TelegramBot&amp;diff=13291"/>
		<updated>2015-12-19T21:02:29Z</updated>

		<summary type="html">&lt;p&gt;Viegener: Rechtschreibkorrekturen&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Infobox Modul&lt;br /&gt;
|ModPurpose=Senden und Empfangen von Nachrichten (Text und Fotos) mit dem freien Messagingdienst Telegram&lt;br /&gt;
|ModType=d&lt;br /&gt;
|ModForumArea=Unterstützende Dienste&lt;br /&gt;
|ModFTopic=38328&lt;br /&gt;
|ModTechName=[https://github.com/viegener/Telegram-fhem/blob/master/50_TelegramBot.pm 50_TelegramBot.pm]&lt;br /&gt;
|ModOwner=[[Benutzer:Viegener|Viegener]] ({{Link2FU|12772|Forum}} / [[Benutzer Diskussion:Viegener|Wiki]])}}&lt;br /&gt;
&lt;br /&gt;
Das [[TelegramBot]]-Modul ermöglicht das Senden und Empfangen von Nachrichten über den Telegram-instant messaging Dienst (https://telegram.org/). &lt;br /&gt;
Es entsteht eine Möglichkeit Benachrichtungen aus Fhem zu versenden, zum Beispiel Alarmmeldungen.&lt;br /&gt;
Ausserdem können auch Kommandos über Telegram an Fhem gesendet werden um Steuerungsbefehle in Fhem auszulösen.&lt;br /&gt;
&lt;br /&gt;
Das TelegramBot-Modul benötigt keine Zusatzsoftware auf dem Fhem-Server (anders als die Variante [[Telegram]]), sondern verwendet das [https://core.telegram.org/bots/api TelegramBot-API] über https-Aufrufe.&lt;br /&gt;
&lt;br /&gt;
== Über Telegram Instant Messaging ==&lt;br /&gt;
Telegram-IDs und Versand/Empfang von Nachrichten sind kostenfrei. &lt;br /&gt;
Clients sind für gängige Smartphonesysteme erhältlich (iOS iPhone und Tablet, Android, Windows Phone) und &lt;br /&gt;
können auch aus dem WebBrowser verwendet werden. &lt;br /&gt;
Es gibt auch einen Kommandozeilen-Client für Linux, der die Grundlage dieses Moduls darstellt. &lt;br /&gt;
Mehrfachanmeldungen, auch parallel mit verschiedenen Geräten (z.B. Tablet und Smartphone), sind möglich.&lt;br /&gt;
Gruppenchats und Chats mit End-2-End-Verschlüsselung werden ebenfalls unterstützt.&lt;br /&gt;
&lt;br /&gt;
Für die Unterstützung von &#039;&#039;WhatsApp&#039;&#039; siehe Modul [[yowsup]].&lt;br /&gt;
&lt;br /&gt;
== Features ==&lt;br /&gt;
Unterstützt werden:&lt;br /&gt;
&lt;br /&gt;
* Versand von Textnachrichten &lt;br /&gt;
* Versand von Bildern &lt;br /&gt;
* Empfang von Textnachrichten von beliebigen Kontakten&lt;br /&gt;
* Kommandos in Fhem über Telegram-Nachrichten von aussen auslösen&lt;br /&gt;
&lt;br /&gt;
Eine detaillierte Beschreibung des Moduls ist im Fhem Forum und in der (englischen) Dokumentation zum Modul in der Commandref diesem  {{Link2Forum|Topic=38328|LinkText=Diskussionsthread}} zu finden. Seit Oktober 2015 wird das Modul offiziell über Fhem-Update verteilt.&lt;br /&gt;
&lt;br /&gt;
Die jeweils aktuellste Entwicklungs-Version des Moduls ist in Github [https://github.com/viegener/Telegram-fhem/blob/master/50_TelegramBot.pm 50_TelegramBot.pm] verfügbar.&lt;br /&gt;
&lt;br /&gt;
== Hinweise zum Betrieb mit Fhem ==&lt;br /&gt;
{{Randnotiz|RNTyp=Warn|RNText=Achtung: Dieses Authtoken ist die einzige Authentifizierung für den Bot und sollte deshalb nicht aus der Hand gegeben werden. Die verwendeten Urls sind deshalb auch in den Log-Files nicht enthalten, da diese das Authtoken in Klartext enthalten. Auch im Forum sollte dieses Token nicht aufgenommen werden.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Für die Anlage eines TelegramBot Devices in Fhem ist ein Authtoken erforderlich. Dieses Token wird über Anlegen eines neuen Bots im [https://core.telegram.org/bots#botfather BotFather] erzeugt. Dort mit dem Telegram-Befehl &amp;lt;code&amp;gt;/newbot&amp;lt;/code&amp;gt; einen neuen Bot anlegen und mit einem Namen versehen. Hinweis: Die Namen für Bots müssen auf &amp;quot;Bot&amp;quot; enden.&lt;br /&gt;
&lt;br /&gt;
Das Anlegen eines TelegramBot devices erfolgt durch die Angabe dieses Tokens:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;define &amp;amp;lt;name&amp;amp;gt; TelegramBot  &amp;amp;lt;token&amp;amp;gt; &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Beispiel: &amp;lt;code&amp;gt;define teleBot TelegramBot 110201543:AAHdqTcvCH1vGWJxfSeofSAs0K5PALDsaw&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Das Empfangen von Nachrichten (polling) erfordert die Einstellung des Attributes&#039;&#039;&#039; &lt;br /&gt;
&amp;lt;code&amp;gt;pollingTimeout&amp;lt;/code&amp;gt; &#039;&#039;&#039;auf einen Wert der grösser als Null ist. Beim Wert 0 oder ohne Setzen des Attributes findet kein Polling und damit auch kein Empfang statt.&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Der TelegramBot kann erst dann Nachrichten an einen telegram user schicken, wenn dieser zuerst an den telegram bot eine Nachricht gesendet hat.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Tipps ==&lt;br /&gt;
&lt;br /&gt;
=== Privacyeinstellungen ===&lt;br /&gt;
&lt;br /&gt;
Damit der TelegramBot auch Meldungen in Gruppen sieht, müssen über den BotFather die Privacy-Einstellungen geändert werden.&lt;br /&gt;
&lt;br /&gt;
=== Kontakte ===&lt;br /&gt;
&lt;br /&gt;
Der Bot merkt sich die bereits bekannten Kontakte im Reading &amp;lt;code&amp;gt;Contacts&amp;lt;/code&amp;gt;. Dabei werden die einzelnen Kontakte jeweils als 3-teilige Einträge bestehend aus UserID, Vor- und Nachname des Benutzers (mit _ verbunden) und dem Username (mit vorangestelltem @). &lt;br /&gt;
&lt;br /&gt;
Beispiel: &amp;lt;code&amp;gt;123456:Ralf_Mustermann:@ralf&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Verschiedene Einträge werden durch Leerzeichen getrennt.&lt;br /&gt;
&lt;br /&gt;
Man kann die Kontakte auch manuell überschreiben (z.B. wenn das Reading fehlerhaft oder verloren sein sollte). Dazu gibt es den Set-Befehl &amp;lt;code&amp;gt;replaceContacts&amp;lt;/code&amp;gt;. Dieser nimmt die Kontakte ebenfalls in der gleichen Form wie oben beschrieben entgegen.&lt;br /&gt;
&lt;br /&gt;
Die Kontaktliste wird ansonsten nur durch den Empfang von Nachrichten erweitert, da es im TelegramBot-API keine Möglichkeit gibt Kontaktdaten von Telegram abzufragen (siehe auch pollingTimeout)&lt;br /&gt;
&lt;br /&gt;
=== Reset ===&lt;br /&gt;
&lt;br /&gt;
Es ist möglich den Bot im laufenden Betrieb zurückzusetzen (Set-Befehl &amp;lt;code&amp;gt;reset&amp;lt;/code&amp;gt;). Dabei werden noch nicht abgeschlossene Übetragungen entfernt und die internen Zustände des Devices zurückgesetzt. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Beispielszenarien ==&lt;br /&gt;
&lt;br /&gt;
=== Benachrichtigungen über Ereignisse ===&lt;br /&gt;
&lt;br /&gt;
Das einfachste Szenario für die Integration von Messaging-Diensten mit Fhem ist zur Benachrichtigung über Ereignisse. Diese Funktion kann zum Beispiel verwendet werden, um über einen erfolgten Neustart von Fhem zu informieren:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;define notify_fhem_reload notify global:INITIALIZED set telebotdevice message fhem newly started - just now !&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In diesem Beispiel wird der Nachrichtentext &amp;quot;fhem newly started - just now !&amp;quot; an den als default eingestellten Kontakt (Attribut: defaultPeer) gesendet, sobald Fhem neu gestartet wurde. Natürlich kann man auch beliebige andere Benachrichtigungen einführen.&lt;br /&gt;
&lt;br /&gt;
=== Versand von Bildern ===&lt;br /&gt;
&lt;br /&gt;
Es ist auch möglich Bilder auf dem Fhem-Server, die zum Beispiel von einer Kamera oder einem Wettermodul stammen über Telegram zu versenden. So wäre es z.B. möglich jeweils morgens die aktuelle Wetterkarte zu erhalten.&lt;br /&gt;
&lt;br /&gt;
ACHTUNG: TelegramBot verwendet das HTTPUtils-Modul zur Kommunikation mit dem TelegramBot-API. Erst mit der Version, die seit 22.10.2015 &lt;br /&gt;
([r9576] HttpUtils.pm: Async write for POST Requests {{Link2Forum|Topic=41583|LinkText=Fhem-Forum}}) verteilt wird, erlaubt auch den Transfer grösserer Bilder. Die Grenze liegt ansonsten bei ca. 14kb auf Raspberries (Plattformspezifische Grenze).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;define notify_fhem_reload notify wetter:report set telebotdevice sendPhoto /opt/fhem/wetter.jpg&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Bei Erreichen des entsprechenden Status am Wetter-Modul wird ein Image über Telegram versendet. Hier sind lokale Pfade (relativ zu fhem) oder absolute Pfade wie oben möglich. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Versand von Emojis (Smileys) ===&lt;br /&gt;
&lt;br /&gt;
Es ist auch möglich Emojis mit den (Text-)Nachrichten zu versenden. Die entsprechenden (Unicode-)Zeichen werden einfach direkt mit in den Text der Nachricht aufgenommen. Um das zu vereinfachen kann man das einfach per Copy und Paste von dieser Seite &lt;br /&gt;
&lt;br /&gt;
http://apps.timwhitlock.info/emoji/tables/unicode (Spalte &amp;quot;Native&amp;quot;) &lt;br /&gt;
&lt;br /&gt;
übernehmen und mit der Nachricht verschicken. &lt;br /&gt;
&lt;br /&gt;
Die Emojis können auch empfangen werden und werden so auch in FHEM / FHEMWeb angezeigt. Plattformspezifische (z.B. von iOS oder Android) Emojis werden dabei nicht unterstützt (gerade mit iOS sind viele neue farbige Emojis hinzugekommen, die wohl leider nur auf Apple-devices funktionieren).&lt;br /&gt;
&lt;br /&gt;
=== Kommandos auslösen ===&lt;br /&gt;
&lt;br /&gt;
Ein wichtiges Szenario ist die Möglichkeit Kommandos in Fhem ausführen zu können, ohne einen Zugang durch die Firewall einrichten zu müssen. Dazu ist die Definition eines Schlüsselwortes (Attribut: &amp;quot;cmdKeyword&amp;quot;)erforderlich, mit dem man die Nachrichten beginnen muss, damit der TelegramBot die Kommandos erkennt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;attr telebotdevice cmdKeyword doit&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Somit kann man dann durch Nachrichten die mit &amp;quot;doit&amp;quot; beginnen Kommandos an Fhem senden, die ähnlich wie im Kommandoeingabefeld von Fhemweb dann von Fhem ausgeführt werden. Das Ergebnis der Ausführung wird zurück an den Sender (und an den definierten defaultPeer) geschickt.&lt;br /&gt;
&lt;br /&gt;
Somit können nicht nur Aktionen angestossen werden, sondern auch Infos abgefragt werden.&lt;br /&gt;
&lt;br /&gt;
Beispiele&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;dofhem set schalter on&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;dofhem list telegrambot&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Randnotiz|RNTyp=Warn|RNText=Achtung: Bei den Kommandos sollten man unbedingt das Attribut &amp;quot;cmdRestrictedPeer&amp;quot; setzen, damit nicht jeder Kommandos auf dem Fhem-Server ausführen kann. Dazu sollten die BenutzerIDs der erlaubten Benutzer (durch Leerzeichen getrennt angeben). Da Benutzernamen selber vergeben werden und nicht unbedingt eindeutig sind, sollten hier auch NUR BenutzerIDs verwendet werden.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Favoriten für Kommandos anlegen ===&lt;br /&gt;
&lt;br /&gt;
Grundidee bei den Favoriten ist, dass man lange Befehle, die man häufig braucht auf &amp;quot;Kurzwahl&amp;quot; legt.&lt;br /&gt;
&lt;br /&gt;
Beispiel-Kommandos wie z.B. &amp;lt;code&amp;gt;set TYPE=ROLLADEN pos 100&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;set TYPE=ROLLADEN pos 0&amp;lt;/code&amp;gt;, die man immer wieder braucht. Um nicht jedes mal dieses Kommando eintippen zu müssen auf dem Smartphone, kann man auch dafür Favoriten anlegen.&lt;br /&gt;
&lt;br /&gt;
Dazu gibt man erst mal die beiden Kommandos getrennt durch Semikolon im Attribut favorites an:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;attr telegrambotdevice favorites set TYPE=ROLLADEN pos 100;set TYPE=ROLLADEN pos 0&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Um die Favorites jetzt ausführen zu können braucht man noch ein Schlüsselwort dafür.&lt;br /&gt;
Nehmen wir mal an man möchte die Favoriten mit &amp;lt;code&amp;gt;/short&amp;lt;/code&amp;gt; ausführen können. Dazu muss dann das Attribut &amp;quot;cmdFavorites&amp;quot; setzen&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;attr telegrambotdevice cmdFavorites /short&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wenn man nun im Telegram Client &lt;br /&gt;
&amp;lt;code&amp;gt;/short 1&amp;lt;/code&amp;gt; an den Bot schickt führt der Bot den ersten Favoriten aus und das Ergebnis der Ausführung wird zurückgeschickt.&lt;br /&gt;
&lt;br /&gt;
Ausserdem kann man im Telegram Client &lt;br /&gt;
&amp;lt;code&amp;gt;/short&amp;lt;/code&amp;gt; an den Bot schicken, dann antwortet der Bot mit&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Favorites&lt;br /&gt;
&lt;br /&gt;
1&lt;br /&gt;
set TYPE=ROLLADEN pos 100&lt;br /&gt;
2&lt;br /&gt;
set TYPE=ROLLADEN pos 0&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
* Github Repository für die Telegram-Fhem Entwicklung: https://github.com/viegener/Telegram-fhem&lt;br /&gt;
* Infos zum Telegram BotFather: https://core.telegram.org/bots#botfather&lt;br /&gt;
&lt;br /&gt;
* Source code für das 50_TelegramBot.pm-Modul: https://github.com/viegener/Telegram-fhem/blob/master/50_TelegramBot.pm&lt;br /&gt;
* Source code für das modifizierte HTTPUtils-Modul zur Übertragung grosser Bilder: https://github.com/viegener/Telegram-fhem/blob/master/HttpUtils.pm&lt;br /&gt;
&lt;br /&gt;
* Forum-Thread in dem das Modul vorgestellt wurde {{Link2Forum|Topic=38328|LinkText=Fhem-Forum}}&lt;br /&gt;
* Telegram messaging system https://telegram.org/&lt;br /&gt;
* TelegramBot API https://core.telegram.org/bots/api&lt;br /&gt;
&lt;br /&gt;
--[[Benutzer:Viegener|Viegener]] ([[Benutzer Diskussion:Viegener|Diskussion]]) 22:49, 11. Okt. 2015 (CEST)&lt;/div&gt;</summary>
		<author><name>Viegener</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=Telegram_-_old_API_method&amp;diff=13290</id>
		<title>Telegram - old API method</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=Telegram_-_old_API_method&amp;diff=13290"/>
		<updated>2015-12-19T15:43:14Z</updated>

		<summary type="html">&lt;p&gt;Viegener: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Infobox Modul&lt;br /&gt;
|ModPurpose=Senden und Empfangen von Nachrichten (Text und Fotos) mit dem freien Messagingdienst Telegram&lt;br /&gt;
|ModType=x&lt;br /&gt;
|ModForumArea=Unterstützende Dienste&lt;br /&gt;
|ModFTopic=38328&lt;br /&gt;
|ModTechName=[https://github.com/viegener/Telegram-fhem/blob/master/70_Telegram.pm 70_Telegram.pm]&lt;br /&gt;
|ModOwner=[[Benutzer:Viegener|Viegener]] ({{Link2FU|12772|Forum}} / [[Benutzer Diskussion:Viegener|Wiki]])}}&lt;br /&gt;
&lt;br /&gt;
Das [[Telegram]]-Modul ermöglicht das Senden und Empfangen von Nachrichten über den Telegram-instant messaging Dienst (https://telegram.org/). &lt;br /&gt;
Es entsteht eine Möglichkeit Benachrichtungen aus Fhem zu versenden, zum Beispiel Alarmmeldungen.&lt;br /&gt;
Ausserdem können auch Kommandos über Telegram an Fhem gesendet werden um Steuerungsbefehle in Fhem auszulösen.&lt;br /&gt;
&lt;br /&gt;
{{Randnotiz|RNTyp=Warn|RNText=Achtung: Für Telegram wird empfohlen das offizielle [[TelegramBot]] Modul zu verwenden, das auch Teil der offiziellen FHEM-Distribution ist. Nur das [[TelegramBot]]-Modul wird weiterentwickelt und benötigt auch anders als dieses Modul keine zusätzliche Software zum Betrieb.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Für den Betrieb des Telegram Moduls ist eine funktionsfähige Installation des inoffiziellen telegram command-line clients für Linux, &#039;&#039;telegram-cli&#039;&#039; (https://github.com/vysheng/tg), erforderlich.&lt;br /&gt;
&lt;br /&gt;
Für die Unterstützung von &#039;&#039;WhatsApp&#039;&#039; siehe Modul [[yowsup]].&lt;br /&gt;
&lt;br /&gt;
== Über Telegram Instant Messaging ==&lt;br /&gt;
Telegram-IDs und Versand/Empfang von Nachrichten sind kostenfrei. &lt;br /&gt;
Clients sind für gängige Smartphonesysteme erhältlich (iOS iPhone und Tablet, Android, Windows Phone) und &lt;br /&gt;
können auch aus dem WebBrowser verwendet werden. &lt;br /&gt;
Es gibt auch einen Kommandozeilen-Client für Linux, der die Grundlage dieses Moduls darstellt. &lt;br /&gt;
Mehrfachanmeldungen, auch parallel mit verschiedenen Geräten (z.B. Tablet und Smartphone), sind möglich.&lt;br /&gt;
Gruppenchats und Chats mit End-2-End-Verschlüsselung werden ebenfalls unterstützt.&lt;br /&gt;
&lt;br /&gt;
== Features ==&lt;br /&gt;
Unterstützt werden:&lt;br /&gt;
&lt;br /&gt;
* Versand von Textnachrichten an einen vordefinierten Kontakt (default peer)&lt;br /&gt;
* Versand von Textnachrichten an einen vordefinierten Kontakt als verschlüsselter Chat (secret chat)&lt;br /&gt;
* Versand von Bildern &lt;br /&gt;
* Empfang von Textnachrichten von beliebigen Kontakten&lt;br /&gt;
* Direkte Befehle an den telegram-client&lt;br /&gt;
&lt;br /&gt;
Eine detaillierte Beschreibung des Moduls ist im Fhem Forum in diesem  {{Link2Forum|Topic=38328|LinkText=Diskussionsthread}} zu finden, die jeweils aktuelle Version des Moduls ist im ersten Beitrag als Anhang verfügbar.&lt;br /&gt;
&lt;br /&gt;
== Hinweise zum Betrieb mit Fhem ==&lt;br /&gt;
{{Randnotiz|RNTyp=Warn|RNText=Achtung: telegram-cli wird momentan NICHT aus Fhem heraus gestartet, sondern muss separat gestartet werden. Ausserdem muss telegram-cli bereits angemeldet sein und entsprechende Kontakte müssen eingerichtet werden. Generell ist auch die Verwendung einer existierenden telegram, empfohlen wird aber die Verwendung einer getrennten ID, zum Beispiel für die eigene Festnetznummer.&lt;br /&gt;
&lt;br /&gt;
telegram-cli kann generell auch auf einem anderen Host betrieben werden, da die Kommunikation mit telegram-cli über Netzwerkprotokolle erfolgt.&lt;br /&gt;
}}&lt;br /&gt;
Das Telegram-Modul basiert auf einem im Hintergrund laufenden telegram-cli (https://github.com/vysheng/tg).&lt;br /&gt;
&lt;br /&gt;
Informationen zu Einrichtung und Betrieb von telegram-cli finden sich im Readme in obigem Repository.&lt;br /&gt;
Weitere Informationen finden sich auch im Wiki des github Repositories: https://github.com/vysheng/tg/wiki&lt;br /&gt;
&lt;br /&gt;
Hinweise zum Start von telegram-cli mit fhem finden sich in der Commandref / Doku zum Modul.&lt;br /&gt;
&lt;br /&gt;
Hier eine Kurzanleitung zur Installation und zum Ausführen auf einem RaspberryPI:&lt;br /&gt;
# Notwendige Pakete installieren mittels &#039;&#039;&amp;lt;nowiki&amp;gt;sudo apt-get install libreadline-dev libconfig-dev libssl-dev libjansson-dev python-dev lua5.2 liblua5.2-dev libevent-dev lua-lgi&amp;lt;/nowiki&amp;gt;&#039;&#039;&lt;br /&gt;
# telegram-cli vom Repository laden: &#039;&#039;git clone --recursive https://github.com/vysheng/tg.git &amp;amp;&amp;amp; cd tg&#039;&#039;&lt;br /&gt;
# Konfigurieren mittels &#039;&#039;./configure&#039;&#039; und anschließend mit &#039;&#039;make&#039;&#039; erstellen. Das dauert ggf ziemlich lange &amp;gt;&amp;gt;20min&lt;br /&gt;
# zum Einrichten einmal Telegram starten: &#039;&#039;bin/telegram-cli -k tg-server.pub&#039;&#039; . Dabei wird die eigene Telefonnummer im Format +49301234567 verlangt. Der Bestätigungscode muss eingegeben werden und evtl der eigene Name. Eventuell mal mit &#039;&#039;msg &amp;lt;Emfänger&amp;gt; &amp;lt;Nachrichttext&amp;gt;&#039;&#039; testen ob alles funktioniert. Telegram beenden.&lt;br /&gt;
# telegram im Hintergrund starten: &#039;&#039;bin/telegram-cli -k tg-server.pub -W -C -d -P &amp;lt;portnummer&amp;gt; -l 20 -N &amp;amp; &#039;&#039; dabei beliebige freie Portnummer vergeben&lt;br /&gt;
# Neuestes FHEM Modul in den /opt/fhem/FHEM Ordner kopieren und mit den nötigen Rechten versehen, FHEM neu starten&lt;br /&gt;
# Telegram in FHEM definieren: define myTelegram Telegram &amp;lt;portnummer&amp;gt;&lt;br /&gt;
# das Attribut defaultPeer setzten damit Messages verschickt werden können (über den set msg Befehl)&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
* Source code für das 70_Telegram.pm-Modul: https://github.com/viegener/Telegram-fhem&lt;br /&gt;
* Forum-Thread in dem das Modul vorgestellt wurde {{Link2Forum|Topic=38328|LinkText=Fhem-Forum}}&lt;br /&gt;
* Repository mit telegram-cli https://github.com/vysheng/tg&lt;br /&gt;
* Telegram messaging system https://telegram.org/&lt;/div&gt;</summary>
		<author><name>Viegener</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=Telegram_-_old_API_method&amp;diff=13289</id>
		<title>Telegram - old API method</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=Telegram_-_old_API_method&amp;diff=13289"/>
		<updated>2015-12-19T15:42:27Z</updated>

		<summary type="html">&lt;p&gt;Viegener: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Infobox Modul&lt;br /&gt;
|ModPurpose=Senden und Empfangen von Nachrichten (Text und Fotos) mit dem freien Messagingdienst Telegram&lt;br /&gt;
|ModType=x&lt;br /&gt;
|ModForumArea=Unterstützende Dienste&lt;br /&gt;
|ModFTopic=38328&lt;br /&gt;
|ModTechName=[https://github.com/viegener/Telegram-fhem/blob/master/70_Telegram.pm 70_Telegram.pm]&lt;br /&gt;
|ModOwner=[[Benutzer:Viegener|Viegener]] ({{Link2FU|12772|Forum}} / [[Benutzer Diskussion:Viegener|Wiki]])}}&lt;br /&gt;
&lt;br /&gt;
Das [[Telegram]]-Modul ermöglicht das Senden und Empfangen von Nachrichten über den Telegram-instant messaging Dienst (https://telegram.org/). &lt;br /&gt;
Es entsteht eine Möglichkeit Benachrichtungen aus Fhem zu versenden, zum Beispiel Alarmmeldungen.&lt;br /&gt;
Ausserdem können auch Kommandos über Telegram an Fhem gesendet werden um Steuerungsbefehle in Fhem auszulösen.&lt;br /&gt;
&lt;br /&gt;
{{Randnotiz|RNTyp=Warn|RNText=Achtung: Für Telegram wird empfohlen das offizielle [[TelegramBot]] Modul zu verwenden, dass auch Teil der offiziellen FHEM-Distribution ist. Nur das [[TelegramBot]]-Modul wird weiterentwickelt und benötigt auch anders als dieses Modul keine zusätzliche Software zum Betrieb.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Für den Betrieb des Telegram Moduls ist eine funktionsfähige Installation des inoffiziellen telegram command-line clients für Linux, &#039;&#039;telegram-cli&#039;&#039; (https://github.com/vysheng/tg), erforderlich.&lt;br /&gt;
&lt;br /&gt;
Für die Unterstützung von &#039;&#039;WhatsApp&#039;&#039; siehe Modul [[yowsup]].&lt;br /&gt;
&lt;br /&gt;
== Über Telegram Instant Messaging ==&lt;br /&gt;
Telegram-IDs und Versand/Empfang von Nachrichten sind kostenfrei. &lt;br /&gt;
Clients sind für gängige Smartphonesysteme erhältlich (iOS iPhone und Tablet, Android, Windows Phone) und &lt;br /&gt;
können auch aus dem WebBrowser verwendet werden. &lt;br /&gt;
Es gibt auch einen Kommandozeilen-Client für Linux, der die Grundlage dieses Moduls darstellt. &lt;br /&gt;
Mehrfachanmeldungen, auch parallel mit verschiedenen Geräten (z.B. Tablet und Smartphone), sind möglich.&lt;br /&gt;
Gruppenchats und Chats mit End-2-End-Verschlüsselung werden ebenfalls unterstützt.&lt;br /&gt;
&lt;br /&gt;
== Features ==&lt;br /&gt;
Unterstützt werden:&lt;br /&gt;
&lt;br /&gt;
* Versand von Textnachrichten an einen vordefinierten Kontakt (default peer)&lt;br /&gt;
* Versand von Textnachrichten an einen vordefinierten Kontakt als verschlüsselter Chat (secret chat)&lt;br /&gt;
* Versand von Bildern &lt;br /&gt;
* Empfang von Textnachrichten von beliebigen Kontakten&lt;br /&gt;
* Direkte Befehle an den telegram-client&lt;br /&gt;
&lt;br /&gt;
Eine detaillierte Beschreibung des Moduls ist im Fhem Forum in diesem  {{Link2Forum|Topic=38328|LinkText=Diskussionsthread}} zu finden, die jeweils aktuelle Version des Moduls ist im ersten Beitrag als Anhang verfügbar.&lt;br /&gt;
&lt;br /&gt;
== Hinweise zum Betrieb mit Fhem ==&lt;br /&gt;
{{Randnotiz|RNTyp=Warn|RNText=Achtung: telegram-cli wird momentan NICHT aus Fhem heraus gestartet, sondern muss separat gestartet werden. Ausserdem muss telegram-cli bereits angemeldet sein und entsprechende Kontakte müssen eingerichtet werden. Generell ist auch die Verwendung einer existierenden telegram, empfohlen wird aber die Verwendung einer getrennten ID, zum Beispiel für die eigene Festnetznummer.&lt;br /&gt;
&lt;br /&gt;
telegram-cli kann generell auch auf einem anderen Host betrieben werden, da die Kommunikation mit telegram-cli über Netzwerkprotokolle erfolgt.&lt;br /&gt;
}}&lt;br /&gt;
Das Telegram-Modul basiert auf einem im Hintergrund laufenden telegram-cli (https://github.com/vysheng/tg).&lt;br /&gt;
&lt;br /&gt;
Informationen zu Einrichtung und Betrieb von telegram-cli finden sich im Readme in obigem Repository.&lt;br /&gt;
Weitere Informationen finden sich auch im Wiki des github Repositories: https://github.com/vysheng/tg/wiki&lt;br /&gt;
&lt;br /&gt;
Hinweise zum Start von telegram-cli mit fhem finden sich in der Commandref / Doku zum Modul.&lt;br /&gt;
&lt;br /&gt;
Hier eine Kurzanleitung zur Installation und zum Ausführen auf einem RaspberryPI:&lt;br /&gt;
# Notwendige Pakete installieren mittels &#039;&#039;&amp;lt;nowiki&amp;gt;sudo apt-get install libreadline-dev libconfig-dev libssl-dev libjansson-dev python-dev lua5.2 liblua5.2-dev libevent-dev lua-lgi&amp;lt;/nowiki&amp;gt;&#039;&#039;&lt;br /&gt;
# telegram-cli vom Repository laden: &#039;&#039;git clone --recursive https://github.com/vysheng/tg.git &amp;amp;&amp;amp; cd tg&#039;&#039;&lt;br /&gt;
# Konfigurieren mittels &#039;&#039;./configure&#039;&#039; und anschließend mit &#039;&#039;make&#039;&#039; erstellen. Das dauert ggf ziemlich lange &amp;gt;&amp;gt;20min&lt;br /&gt;
# zum Einrichten einmal Telegram starten: &#039;&#039;bin/telegram-cli -k tg-server.pub&#039;&#039; . Dabei wird die eigene Telefonnummer im Format +49301234567 verlangt. Der Bestätigungscode muss eingegeben werden und evtl der eigene Name. Eventuell mal mit &#039;&#039;msg &amp;lt;Emfänger&amp;gt; &amp;lt;Nachrichttext&amp;gt;&#039;&#039; testen ob alles funktioniert. Telegram beenden.&lt;br /&gt;
# telegram im Hintergrund starten: &#039;&#039;bin/telegram-cli -k tg-server.pub -W -C -d -P &amp;lt;portnummer&amp;gt; -l 20 -N &amp;amp; &#039;&#039; dabei beliebige freie Portnummer vergeben&lt;br /&gt;
# Neuestes FHEM Modul in den /opt/fhem/FHEM Ordner kopieren und mit den nötigen Rechten versehen, FHEM neu starten&lt;br /&gt;
# Telegram in FHEM definieren: define myTelegram Telegram &amp;lt;portnummer&amp;gt;&lt;br /&gt;
# das Attribut defaultPeer setzten damit Messages verschickt werden können (über den set msg Befehl)&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
* Source code für das 70_Telegram.pm-Modul: https://github.com/viegener/Telegram-fhem&lt;br /&gt;
* Forum-Thread in dem das Modul vorgestellt wurde {{Link2Forum|Topic=38328|LinkText=Fhem-Forum}}&lt;br /&gt;
* Repository mit telegram-cli https://github.com/vysheng/tg&lt;br /&gt;
* Telegram messaging system https://telegram.org/&lt;/div&gt;</summary>
		<author><name>Viegener</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=Telegram_-_old_API_method&amp;diff=13288</id>
		<title>Telegram - old API method</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=Telegram_-_old_API_method&amp;diff=13288"/>
		<updated>2015-12-19T15:41:38Z</updated>

		<summary type="html">&lt;p&gt;Viegener: Verweis auf TelegramBot-Modul as offizielle Version&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Infobox Modul&lt;br /&gt;
|ModPurpose=Senden und Empfangen von Nachrichten (Text und Fotos) mit dem freien Messagingdienst Telegram&lt;br /&gt;
|ModType=x&lt;br /&gt;
|ModForumArea=Unterstützende Dienste&lt;br /&gt;
|ModFTopic=38328&lt;br /&gt;
|ModTechName=[https://github.com/viegener/Telegram-fhem/blob/master/70_Telegram.pm 70_Telegram.pm]&lt;br /&gt;
|ModOwner=[[Benutzer:Viegener|Viegener]] ({{Link2FU|12772|Forum}} / [[Benutzer Diskussion:Viegener|Wiki]])}}&lt;br /&gt;
&lt;br /&gt;
Das [[Telegram]]-Modul ermöglicht das Senden und Empfangen von Nachrichten über den Telegram-instant messaging Dienst (https://telegram.org/). &lt;br /&gt;
Es entsteht eine Möglichkeit Benachrichtungen aus Fhem zu versenden, zum Beispiel Alarmmeldungen.&lt;br /&gt;
Ausserdem können auch Kommandos über Telegram an Fhem gesendet werden um Steuerungsbefehle in Fhem auszulösen.&lt;br /&gt;
&lt;br /&gt;
{{Randnotiz|RNTyp=Warn|RNText=Achtung: Für Telegram wird empfohlen das offizielle [[TelegramBot]] Modul zu verwenden. Nur das [[TelegramBot]]-Modul wird weiterentwickelt und benötigt auch anders als dieses Module keine zusätzliche Software zum Betrieb.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Für den Betrieb des Telegram Moduls ist eine funktionsfähige Installation des inoffiziellen telegram command-line clients für Linux, &#039;&#039;telegram-cli&#039;&#039; (https://github.com/vysheng/tg), erforderlich.&lt;br /&gt;
&lt;br /&gt;
Für die Unterstützung von &#039;&#039;WhatsApp&#039;&#039; siehe Modul [[yowsup]].&lt;br /&gt;
&lt;br /&gt;
== Über Telegram Instant Messaging ==&lt;br /&gt;
Telegram-IDs und Versand/Empfang von Nachrichten sind kostenfrei. &lt;br /&gt;
Clients sind für gängige Smartphonesysteme erhältlich (iOS iPhone und Tablet, Android, Windows Phone) und &lt;br /&gt;
können auch aus dem WebBrowser verwendet werden. &lt;br /&gt;
Es gibt auch einen Kommandozeilen-Client für Linux, der die Grundlage dieses Moduls darstellt. &lt;br /&gt;
Mehrfachanmeldungen, auch parallel mit verschiedenen Geräten (z.B. Tablet und Smartphone), sind möglich.&lt;br /&gt;
Gruppenchats und Chats mit End-2-End-Verschlüsselung werden ebenfalls unterstützt.&lt;br /&gt;
&lt;br /&gt;
== Features ==&lt;br /&gt;
Unterstützt werden:&lt;br /&gt;
&lt;br /&gt;
* Versand von Textnachrichten an einen vordefinierten Kontakt (default peer)&lt;br /&gt;
* Versand von Textnachrichten an einen vordefinierten Kontakt als verschlüsselter Chat (secret chat)&lt;br /&gt;
* Versand von Bildern &lt;br /&gt;
* Empfang von Textnachrichten von beliebigen Kontakten&lt;br /&gt;
* Direkte Befehle an den telegram-client&lt;br /&gt;
&lt;br /&gt;
Eine detaillierte Beschreibung des Moduls ist im Fhem Forum in diesem  {{Link2Forum|Topic=38328|LinkText=Diskussionsthread}} zu finden, die jeweils aktuelle Version des Moduls ist im ersten Beitrag als Anhang verfügbar.&lt;br /&gt;
&lt;br /&gt;
== Hinweise zum Betrieb mit Fhem ==&lt;br /&gt;
{{Randnotiz|RNTyp=Warn|RNText=Achtung: telegram-cli wird momentan NICHT aus Fhem heraus gestartet, sondern muss separat gestartet werden. Ausserdem muss telegram-cli bereits angemeldet sein und entsprechende Kontakte müssen eingerichtet werden. Generell ist auch die Verwendung einer existierenden telegram, empfohlen wird aber die Verwendung einer getrennten ID, zum Beispiel für die eigene Festnetznummer.&lt;br /&gt;
&lt;br /&gt;
telegram-cli kann generell auch auf einem anderen Host betrieben werden, da die Kommunikation mit telegram-cli über Netzwerkprotokolle erfolgt.&lt;br /&gt;
}}&lt;br /&gt;
Das Telegram-Modul basiert auf einem im Hintergrund laufenden telegram-cli (https://github.com/vysheng/tg).&lt;br /&gt;
&lt;br /&gt;
Informationen zu Einrichtung und Betrieb von telegram-cli finden sich im Readme in obigem Repository.&lt;br /&gt;
Weitere Informationen finden sich auch im Wiki des github Repositories: https://github.com/vysheng/tg/wiki&lt;br /&gt;
&lt;br /&gt;
Hinweise zum Start von telegram-cli mit fhem finden sich in der Commandref / Doku zum Modul.&lt;br /&gt;
&lt;br /&gt;
Hier eine Kurzanleitung zur Installation und zum Ausführen auf einem RaspberryPI:&lt;br /&gt;
# Notwendige Pakete installieren mittels &#039;&#039;&amp;lt;nowiki&amp;gt;sudo apt-get install libreadline-dev libconfig-dev libssl-dev libjansson-dev python-dev lua5.2 liblua5.2-dev libevent-dev lua-lgi&amp;lt;/nowiki&amp;gt;&#039;&#039;&lt;br /&gt;
# telegram-cli vom Repository laden: &#039;&#039;git clone --recursive https://github.com/vysheng/tg.git &amp;amp;&amp;amp; cd tg&#039;&#039;&lt;br /&gt;
# Konfigurieren mittels &#039;&#039;./configure&#039;&#039; und anschließend mit &#039;&#039;make&#039;&#039; erstellen. Das dauert ggf ziemlich lange &amp;gt;&amp;gt;20min&lt;br /&gt;
# zum Einrichten einmal Telegram starten: &#039;&#039;bin/telegram-cli -k tg-server.pub&#039;&#039; . Dabei wird die eigene Telefonnummer im Format +49301234567 verlangt. Der Bestätigungscode muss eingegeben werden und evtl der eigene Name. Eventuell mal mit &#039;&#039;msg &amp;lt;Emfänger&amp;gt; &amp;lt;Nachrichttext&amp;gt;&#039;&#039; testen ob alles funktioniert. Telegram beenden.&lt;br /&gt;
# telegram im Hintergrund starten: &#039;&#039;bin/telegram-cli -k tg-server.pub -W -C -d -P &amp;lt;portnummer&amp;gt; -l 20 -N &amp;amp; &#039;&#039; dabei beliebige freie Portnummer vergeben&lt;br /&gt;
# Neuestes FHEM Modul in den /opt/fhem/FHEM Ordner kopieren und mit den nötigen Rechten versehen, FHEM neu starten&lt;br /&gt;
# Telegram in FHEM definieren: define myTelegram Telegram &amp;lt;portnummer&amp;gt;&lt;br /&gt;
# das Attribut defaultPeer setzten damit Messages verschickt werden können (über den set msg Befehl)&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
* Source code für das 70_Telegram.pm-Modul: https://github.com/viegener/Telegram-fhem&lt;br /&gt;
* Forum-Thread in dem das Modul vorgestellt wurde {{Link2Forum|Topic=38328|LinkText=Fhem-Forum}}&lt;br /&gt;
* Repository mit telegram-cli https://github.com/vysheng/tg&lt;br /&gt;
* Telegram messaging system https://telegram.org/&lt;/div&gt;</summary>
		<author><name>Viegener</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=TelegramBot&amp;diff=13287</id>
		<title>TelegramBot</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=TelegramBot&amp;diff=13287"/>
		<updated>2015-12-19T15:36:58Z</updated>

		<summary type="html">&lt;p&gt;Viegener: Emojievrsand hinzugefügt&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Infobox Modul&lt;br /&gt;
|ModPurpose=Senden und Empfangen von Nachrichten (Text und Fotos) mit dem freien Messagingdienst Telegram&lt;br /&gt;
|ModType=d&lt;br /&gt;
|ModForumArea=Unterstützende Dienste&lt;br /&gt;
|ModFTopic=38328&lt;br /&gt;
|ModTechName=[https://github.com/viegener/Telegram-fhem/blob/master/50_TelegramBot.pm 50_TelegramBot.pm]&lt;br /&gt;
|ModOwner=[[Benutzer:Viegener|Viegener]] ({{Link2FU|12772|Forum}} / [[Benutzer Diskussion:Viegener|Wiki]])}}&lt;br /&gt;
&lt;br /&gt;
Das [[TelegramBot]]-Modul ermöglicht das Senden und Empfangen von Nachrichten über den Telegram-instant messaging Dienst (https://telegram.org/). &lt;br /&gt;
Es entsteht eine Möglichkeit Benachrichtungen aus Fhem zu versenden, zum Beispiel Alarmmeldungen.&lt;br /&gt;
Ausserdem können auch Kommandos über Telegram an Fhem gesendet werden um Steuerungsbefehle in Fhem auszulösen.&lt;br /&gt;
&lt;br /&gt;
Das TelegramBot-Modul benötigt keine Zusatzsoftware auf dem Fhem-Server (anders als die Variante [[Telegram]]), sondern verwendet das [https://core.telegram.org/bots/api TelegramBot-API] über https-Aufrufe.&lt;br /&gt;
&lt;br /&gt;
== Über Telegram Instant Messaging ==&lt;br /&gt;
Telegram-IDs und Versand/Empfang von Nachrichten sind kostenfrei. &lt;br /&gt;
Clients sind für gängige Smartphonesysteme erhältlich (iOS iPhone und Tablet, Android, Windows Phone) und &lt;br /&gt;
können auch aus dem WebBrowser verwendet werden. &lt;br /&gt;
Es gibt auch einen Kommandozeilen-Client für Linux, der die Grundlage dieses Moduls darstellt. &lt;br /&gt;
Mehrfachanmeldungen, auch parallel mit verschiedenen Geräten (z.B. Tablet und Smartphone), sind möglich.&lt;br /&gt;
Gruppenchats und Chats mit End-2-End-Verschlüsselung werden ebenfalls unterstützt.&lt;br /&gt;
&lt;br /&gt;
Für die Unterstützung von &#039;&#039;WhatsApp&#039;&#039; siehe Modul [[yowsup]].&lt;br /&gt;
&lt;br /&gt;
== Features ==&lt;br /&gt;
Unterstützt werden:&lt;br /&gt;
&lt;br /&gt;
* Versand von Textnachrichten &lt;br /&gt;
* Versand von Bildern &lt;br /&gt;
* Empfang von Textnachrichten von beliebigen Kontakten&lt;br /&gt;
* Kommandos in Fhem über telegram-Nachrichten von aussen auslösen&lt;br /&gt;
&lt;br /&gt;
Eine detaillierte Beschreibung des Moduls ist im Fhem Forum und in der (englischen) Dokumentation zum Modul in der Commandref diesem  {{Link2Forum|Topic=38328|LinkText=Diskussionsthread}} zu finden. Seit Oktober 2015 wird das Modul offiziell über Fhem-Update verteilt.&lt;br /&gt;
&lt;br /&gt;
Die jeweils aktuellste Entwicklungs-Version des Moduls ist in Github [https://github.com/viegener/Telegram-fhem/blob/master/50_TelegramBot.pm 50_TelegramBot.pm] verfügbar.&lt;br /&gt;
&lt;br /&gt;
== Hinweise zum Betrieb mit Fhem ==&lt;br /&gt;
{{Randnotiz|RNTyp=Warn|RNText=Achtung: Dieses Authtoken ist die einzige Authentifizierung für den Bot und sollte deshalb nicht aus der Hand gegeben werden. Die verwendeten Urls sind deshalb auch in den Log-Files nicht enthalten, da diese das Authtoken in Klartext enthalten. Auch im Forum sollte dieses Token nicht aufgenommen werden.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Für die Anlage eines TelegramBot Devices in Fhem ist ein Authtoken erforderlich. Dieses Token wird über Anlegen eines neuen Bots im [https://core.telegram.org/bots#botfather Botfather] erzeugt. Dort mit dem Telegram-Befehl &amp;lt;code&amp;gt;/newbot&amp;lt;/code&amp;gt; einen neuen Bot anlegen und mit einem Namen versehen. Hinweis: Die Namen für Bots müssen auf &amp;quot;Bot&amp;quot; enden.&lt;br /&gt;
&lt;br /&gt;
Das Anlegen eines TelegramBot devices erfolgt durch die Angabe dieses Tokens:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;define &amp;amp;lt;name&amp;amp;gt; TelegramBot  &amp;amp;lt;token&amp;amp;gt; &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Beispiel: &amp;lt;code&amp;gt;define teleBot TelegramBot 110201543:AAHdqTcvCH1vGWJxfSeofSAs0K5PALDsaw&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Das Empfangen von Nachrichten (polling) erfordert die Einstellung des Attributes&#039;&#039;&#039; &lt;br /&gt;
&amp;lt;code&amp;gt;pollingTimeout&amp;lt;/code&amp;gt; &#039;&#039;&#039;auf einen Wert der grösser als Null ist. Beim Wert 0 oder ohne Setzen des Attributes findet kein Polling und damit auch kein Empfang statt.&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Der TelegramBot kann erst dann Nachrichten an einen telegram user schicken, wenn dieser zuerst an den telegram bot eine Nachricht gesendet hat.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Tipps ==&lt;br /&gt;
&lt;br /&gt;
=== Privacyeinstellungen ===&lt;br /&gt;
&lt;br /&gt;
Damit der TelegramBot auch Meldungen in Gruppen sieht, müssen über den botfather die prviacy-Einstellungen geändert werden.&lt;br /&gt;
&lt;br /&gt;
=== Kontakte ===&lt;br /&gt;
&lt;br /&gt;
Der Bot merkt sich die bereits bekannten Kontakte im Reading &amp;lt;code&amp;gt;Contacts&amp;lt;/code&amp;gt;. Dabei werden die einzelnen Kontakte jeweils als 3-teilige Einträge bestehend aus userid, Vor- und Nachname des Benutzers (mit _ verbunden) und dem usernamen (mit vorangestelltem @). &lt;br /&gt;
&lt;br /&gt;
Beispiel: &amp;lt;code&amp;gt;123456:Ralf_Mustermann:@ralf&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Verschiedene Einträge werden durch Leerzeichen getrennt.&lt;br /&gt;
&lt;br /&gt;
Man kann die Kontakte auch manuell überschreiben (z.B. wenn das Reading fehlerhaft oder verloren sein sollte). Dazu gibt es den Set-Befehl &amp;lt;code&amp;gt;replaceContacts&amp;lt;/code&amp;gt;. Dieser nimmt die Kontakte ebenfalls in der gleichen Form wie oben beschrieben entgegen.&lt;br /&gt;
&lt;br /&gt;
Die Kontaktliste wird ansonsten nur durch den Empfang von Nachrichten erweitert, da es im TelegramBot-API keine Möglichkeit gibt Kontaktdaten von telegram abzufragen (sieje auch pollingTimeout)&lt;br /&gt;
&lt;br /&gt;
=== Reset ===&lt;br /&gt;
&lt;br /&gt;
Es ist möglich den Bot im laufenden Betrieb zurückzusetzen (Set-Befehl &amp;lt;code&amp;gt;reset&amp;lt;/code&amp;gt;). Dabei werden noch nicht abgeschlossene Übetragungen entfernt und die internen Zustände des devices zurückgesetzt. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Beispielszenarien ==&lt;br /&gt;
&lt;br /&gt;
=== Benachrichtigungen über Ereignisse ===&lt;br /&gt;
&lt;br /&gt;
Das einfachste Szenario für die Integration von Messaging-Diensten mit Fhem ist zur Benachrichtigung über Ereignisse. Diese Funktion kann zum Beispiel verwendet werden, um über einen erfolgten Neustart von Fhem zu informieren:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;define notify_fhem_reload notify global:INITIALIZED set telebotdevice message fhem newly started - just now !&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In diesem Beispiel wird der Nachrichtentext &amp;quot;fhem newly started - just now !&amp;quot; an den als default eingestellten Kontakt (Attribut: defaultPeer) gesendet, sobald Fhem neu gestartet wurde. Natürlich kann man auch beliebige andere Benachrichtigungen einführen.&lt;br /&gt;
&lt;br /&gt;
=== Versand von Bildern ===&lt;br /&gt;
&lt;br /&gt;
Es ist auch möglich Bilder auf dem Fhem-Server, die zum Beispiel von einer Kamera oder einem Wettermodul stammen über Telegram zu versenden. So wäre es z.B. möglich jeweils morgens die aktuelle Wetterkarte zu erhalten.&lt;br /&gt;
&lt;br /&gt;
ACHTUNG: TelegramBot verwendet das HTTPUtils-Modul zur Kommunikation mit dem TelegramBot-API. Erst mit der Version, die seit 22.10.2015 &lt;br /&gt;
([r9576] HttpUtils.pm: Async write for POST Requests {{Link2Forum|Topic=41583|LinkText=Fhem-Forum}}) verteilt wird, erlaubt auch den Transfer grösserer Bilder. Die Grenze liegt ansonsten bei ca. 14kb auf Raspberries (Plattformspezifische Grenze).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;define notify_fhem_reload notify wetter:report set telebotdevice sendPhoto /opt/fhem/wetter.jpg&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Bei Erreichen des entsprechenden Status am wetter-Modul wird ein Image über telegram versendet. Hier sind lokale Pfade (relativ zu fhem) oder absolute Pfade wie oben möglich. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Versand von Emojis (smileys) ===&lt;br /&gt;
&lt;br /&gt;
Es ist auch möglich emojis mit den (Text-)Nachrichten zu versenden. Die entsprechenden (Unicode-)Zeichen werden einfach direkt mit in den text der Nachricht aufgenommen. Um das zu vereinfachen kann man das einfach per Copy und paste von dieser Seite &lt;br /&gt;
&lt;br /&gt;
http://apps.timwhitlock.info/emoji/tables/unicode (Spalte native) &lt;br /&gt;
&lt;br /&gt;
übernehmen und mit der Nachricht verschicken. &lt;br /&gt;
&lt;br /&gt;
Die Emojis können auch empfangen werden und werden so auch in FHEM / FHEMWeb angezeigt. Plattformspezifische (z.B. von iOS oder Android) Emojis werden dabei nicht unterstützt (gerade mit iOS sind viele neue farbige Emojis hinzugekommen, die wohl leider nur auf Apple-devices funktionieren).&lt;br /&gt;
&lt;br /&gt;
=== Kommandos auslösen ===&lt;br /&gt;
&lt;br /&gt;
Ein wichtiges Szenario ist die Möglichkeit Kommandos in Fhem ausführen zu können, ohne einen Zugang durch die Firewall einrichten zu müssen. Dazu ist die Definition eines Schlüsselwortes (Attribut: &amp;quot;cmdKeyword&amp;quot;)erforderlich, mit dem man die Nachrichten beginnen muss, damit der TelegramBot die Kommandos erkennt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;attr telebotdevice cmdKeyword doit&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Somit kann man dann durch Nachrichten die mit &amp;quot;doit&amp;quot; beginnen Kommandos an Fhem senden, die ähnlich wie im Kommandoeingabefeld von Fhemweb dann von Fhem ausgeführt werden. Das Ergebnis der Ausführung wird zurück an den Sender (und an den definierten defaultPeer) geschickt.&lt;br /&gt;
&lt;br /&gt;
Somit können nicht nur Aktionen angestossen werden, sondern auch Infos abgefragt werden.&lt;br /&gt;
&lt;br /&gt;
Beispiele&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;dofhem set schalter on&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;dofhem list telegrambot&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Randnotiz|RNTyp=Warn|RNText=Achtung: Bei den Kommandos sollten man unbedingt das Attribut &amp;quot;cmdRestrictedPeer&amp;quot; setzen, damit nicht jeder Kommandos auf dem Fhem-Server ausführen kann. Dazu sollten die Benutzerids der erlaubten Benutzer (durch Leerzeichen getrennt angeben). Da Benutzernamen selber vergeben werden und nicht unbedingt eindeutig sind, sollten hier auch NUR Benutzerids verwendet werden.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Favoriten für Kommandos anlegen ===&lt;br /&gt;
&lt;br /&gt;
Grundidee bei den Favoriten ist, dass man lange Befehle, die man haeufig braucht auf &amp;quot;Kurzwahl&amp;quot; legt.&lt;br /&gt;
&lt;br /&gt;
Beispiel-Kommandos wie z.B. &amp;lt;code&amp;gt;set TYPE=ROLLADEN pos 100&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;set TYPE=ROLLADEN pos 0&amp;lt;/code&amp;gt;, die man immer wieder braucht. Um nicht jedesmal dieses Kommando eintippen zu müssen auf dem Smartphone, kann man auch dafür Favoriten anlegen.&lt;br /&gt;
&lt;br /&gt;
Dazu gibt man erstmal die beiden Kommandos getrennt durch Semikolon im Attribut favorites an:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;attr telegrambotdevice favorites set TYPE=ROLLADEN pos 100;set TYPE=ROLLADEN pos 0&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Um die Favorites jetzt ausführen zu können braucht man noch ein Schlüsselwort dafür.&lt;br /&gt;
Nehmen wir mal an man möchte die Favoriten mit &amp;lt;code&amp;gt;/short&amp;lt;/code&amp;gt; ausführen können. Dazu muss dann das Attribut &amp;quot;cmdFavorites&amp;quot; setzen&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;attr telegrambotdevice cmdFavorites /short&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wenn man nun im Telegram Client &lt;br /&gt;
&amp;lt;code&amp;gt;/short 1&amp;lt;/code&amp;gt; an den Bot schickt führt der Bot den ersten Favoriten aus und das Ergebnis der Ausführung wird zurückgeschickt.&lt;br /&gt;
&lt;br /&gt;
Ausserdem kann man im Telegram Client &lt;br /&gt;
&amp;lt;code&amp;gt;/short&amp;lt;/code&amp;gt; an den Bot schicken, dann antwortet der Bot mit&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Favorites&lt;br /&gt;
&lt;br /&gt;
1&lt;br /&gt;
set TYPE=ROLLADEN pos 100&lt;br /&gt;
2&lt;br /&gt;
set TYPE=ROLLADEN pos 0&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
* Github Repository für die Telegram-Fhem Entwicklung: https://github.com/viegener/Telegram-fhem&lt;br /&gt;
* Infos zum Telegram Botfather: https://core.telegram.org/bots#botfather&lt;br /&gt;
&lt;br /&gt;
* Source code für das 50_TelegramBot.pm-Modul: https://github.com/viegener/Telegram-fhem/blob/master/50_TelegramBot.pm&lt;br /&gt;
* Source code für das modifizierte HTTPUtils-Modul zur Übertragung grosser Bilder: https://github.com/viegener/Telegram-fhem/blob/master/HttpUtils.pm&lt;br /&gt;
&lt;br /&gt;
* Forum-Thread in dem das Modul vorgestellt wurde {{Link2Forum|Topic=38328|LinkText=Fhem-Forum}}&lt;br /&gt;
* Telegram messaging system https://telegram.org/&lt;br /&gt;
* TelegramBot API https://core.telegram.org/bots/api&lt;br /&gt;
&lt;br /&gt;
--[[Benutzer:Viegener|Viegener]] ([[Benutzer Diskussion:Viegener|Diskussion]]) 22:49, 11. Okt. 2015 (CEST)&lt;/div&gt;</summary>
		<author><name>Viegener</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=TelegramBot&amp;diff=13021</id>
		<title>TelegramBot</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=TelegramBot&amp;diff=13021"/>
		<updated>2015-11-25T16:37:51Z</updated>

		<summary type="html">&lt;p&gt;Viegener: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Infobox Modul&lt;br /&gt;
|ModPurpose=Senden und Empfangen von Nachrichten (Text und Fotos) mit dem freien Messagingdienst Telegram&lt;br /&gt;
|ModType=d&lt;br /&gt;
|ModForumArea=Unterstützende Dienste&lt;br /&gt;
|ModFTopic=38328&lt;br /&gt;
|ModTechName=[https://github.com/viegener/Telegram-fhem/blob/master/50_TelegramBot.pm 50_TelegramBot.pm]&lt;br /&gt;
|ModOwner=[[Benutzer:Viegener|Viegener]] ({{Link2FU|12772|Forum}} / [[Benutzer Diskussion:Viegener|Wiki]])}}&lt;br /&gt;
&lt;br /&gt;
Das [[TelegramBot]]-Modul ermöglicht das Senden und Empfangen von Nachrichten über den Telegram-instant messaging Dienst (https://telegram.org/). &lt;br /&gt;
Es entsteht eine Möglichkeit Benachrichtungen aus Fhem zu versenden, zum Beispiel Alarmmeldungen.&lt;br /&gt;
Ausserdem können auch Kommandos über Telegram an Fhem gesendet werden um Steuerungsbefehle in Fhem auszulösen.&lt;br /&gt;
&lt;br /&gt;
Das TelegramBot-Modul benötigt keine Zusatzsoftware auf dem Fhem-Server (anders als die Variante [[Telegram]]), sondern verwendet das [https://core.telegram.org/bots/api TelegramBot-API] über https-Aufrufe.&lt;br /&gt;
&lt;br /&gt;
== Über Telegram Instant Messaging ==&lt;br /&gt;
Telegram-IDs und Versand/Empfang von Nachrichten sind kostenfrei. &lt;br /&gt;
Clients sind für gängige Smartphonesysteme erhältlich (iOS iPhone und Tablet, Android, Windows Phone) und &lt;br /&gt;
können auch aus dem WebBrowser verwendet werden. &lt;br /&gt;
Es gibt auch einen Kommandozeilen-Client für Linux, der die Grundlage dieses Moduls darstellt. &lt;br /&gt;
Mehrfachanmeldungen, auch parallel mit verschiedenen Geräten (z.B. Tablet und Smartphone), sind möglich.&lt;br /&gt;
Gruppenchats und Chats mit End-2-End-Verschlüsselung werden ebenfalls unterstützt.&lt;br /&gt;
&lt;br /&gt;
Für die Unterstützung von &#039;&#039;WhatsApp&#039;&#039; siehe Modul [[yowsup]].&lt;br /&gt;
&lt;br /&gt;
== Features ==&lt;br /&gt;
Unterstützt werden:&lt;br /&gt;
&lt;br /&gt;
* Versand von Textnachrichten &lt;br /&gt;
* Versand von Bildern &lt;br /&gt;
* Empfang von Textnachrichten von beliebigen Kontakten&lt;br /&gt;
* Kommandos in Fhem über telegram-Nachrichten von aussen auslösen&lt;br /&gt;
&lt;br /&gt;
Eine detaillierte Beschreibung des Moduls ist im Fhem Forum und in der (englischen) Dokumentation zum Modul in der Commandref diesem  {{Link2Forum|Topic=38328|LinkText=Diskussionsthread}} zu finden. Seit Oktober 2015 wird das Modul offiziell über Fhem-Update verteilt.&lt;br /&gt;
&lt;br /&gt;
Die jeweils aktuellste Entwicklungs-Version des Moduls ist in Github [https://github.com/viegener/Telegram-fhem/blob/master/50_TelegramBot.pm 50_TelegramBot.pm] verfügbar.&lt;br /&gt;
&lt;br /&gt;
== Hinweise zum Betrieb mit Fhem ==&lt;br /&gt;
{{Randnotiz|RNTyp=Warn|RNText=Achtung: Dieses Authtoken ist die einzige Authentifizierung für den Bot und sollte deshalb nicht aus der Hand gegeben werden. Die verwendeten Urls sind deshalb auch in den Log-Files nicht enthalten, da diese das Authtoken in Klartext enthalten. Auch im Forum sollte dieses Token nicht aufgenommen werden.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Für die Anlage eines TelegramBot Devices in Fhem ist ein Authtoken erforderlich. Dieses Token wird über Anlegen eines neuen Bots im [https://core.telegram.org/bots#botfather Botfather] erzeugt. Die Namen für Bots müssen auf &amp;quot;Bot&amp;quot; enden.&lt;br /&gt;
&lt;br /&gt;
Das Anlegen eines TelegramBot devices erfolgt durch die Angabe dieses Tokens:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;define &amp;amp;lt;name&amp;amp;gt; TelegramBot  &amp;amp;lt;token&amp;amp;gt; &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Beispiel: &amp;lt;code&amp;gt;define teleBot TelegramBot 110201543:AAHdqTcvCH1vGWJxfSeofSAs0K5PALDsaw&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Das Empfangen von Nachrichten (polling) erfordert die Einstellung des Attributes&#039;&#039;&#039; &lt;br /&gt;
&amp;lt;code&amp;gt;pollingTimeout&amp;lt;/code&amp;gt; &#039;&#039;&#039;auf einen Wert der grösser als Null ist. Beim Wert 0 oder ohne Setzen des Attributes findet kein Polling und damit auch kein Empfang statt.&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Der TelegramBot kann erst dann Nachrichten an einen telegram user schicken, wenn dieser zuerst an den telegram bot eine Nachricht gesendet hat.&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Tipps ==&lt;br /&gt;
&lt;br /&gt;
=== Privacyeinstellungen ===&lt;br /&gt;
&lt;br /&gt;
Damit der TelegramBot auch Meldungen in Gruppen sieht, müssen über den botfather die prviacy-Einstellungen geändert werden.&lt;br /&gt;
&lt;br /&gt;
=== Kontakte ===&lt;br /&gt;
&lt;br /&gt;
Der Bot merkt sich die bereits bekannten Kontakte im Reading &amp;lt;code&amp;gt;Contacts&amp;lt;/code&amp;gt;. Dabei werden die einzelnen Kontakte jeweils als 3-teilige Einträge bestehend aus userid, Vor- und Nachname des Benutzers (mit _ verbunden) und dem usernamen (mit vorangestelltem @). &lt;br /&gt;
&lt;br /&gt;
Beispiel: &amp;lt;code&amp;gt;123456:Ralf_Mustermann:@ralf&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Verschiedene Einträge werden durch Leerzeichen getrennt.&lt;br /&gt;
&lt;br /&gt;
Man kann die Kontakte auch manuell überschreiben (z.B. wenn das Reading fehlerhaft oder verloren sein sollte). Dazu gibt es den Set-Befehl &amp;lt;code&amp;gt;replaceContacts&amp;lt;/code&amp;gt;. Dieser nimmt die Kontakte ebenfalls in der gleichen Form wie oben beschrieben entgegen.&lt;br /&gt;
&lt;br /&gt;
Die Kontaktliste wird ansonsten nur durch den Empfang von Nachrichten erweitert, da es im TelegramBot-API keine Möglichkeit gibt Kontaktdaten von telegram abzufragen (sieje auch pollingTimeout)&lt;br /&gt;
&lt;br /&gt;
=== Reset ===&lt;br /&gt;
&lt;br /&gt;
Es ist möglich den Bot im laufenden Betrieb zurückzusetzen (Set-Befehl &amp;lt;code&amp;gt;reset&amp;lt;/code&amp;gt;). Dabei werden noch nicht abgeschlossene Übetragungen entfernt und die internen Zustände des devices zurückgesetzt. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Beispielszenarien ==&lt;br /&gt;
&lt;br /&gt;
=== Benachrichtigungen über Ereignisse ===&lt;br /&gt;
&lt;br /&gt;
Das einfachste Szenario für die Integration von Messaging-Diensten mit Fhem ist zur Benachrichtigung über Ereignisse. Diese Funktion kann zum Beispiel verwendet werden, um über einen erfolgten Neustart von Fhem zu informieren:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;define notify_fhem_reload notify global:INITIALIZED set telebotdevice message fhem newly started - just now !&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In diesem Beispiel wird der Nachrichtentext &amp;quot;fhem newly started - just now !&amp;quot; an den als default eingestellten Kontakt (Attribut: defaultPeer) gesendet, sobald Fhem neu gestartet wurde. Natürlich kann man auch beliebige andere Benachrichtigungen einführen.&lt;br /&gt;
&lt;br /&gt;
=== Versand von Bildern ===&lt;br /&gt;
&lt;br /&gt;
Es ist auch möglich Bilder auf dem Fhem-Server, die zum Beispiel von einer Kamera oder einem Wettermodul stammen über Telegram zu versenden. So wäre es z.B. möglich jeweils morgens die aktuelle Wetterkarte zu erhalten.&lt;br /&gt;
&lt;br /&gt;
ACHTUNG: TelegramBot verwendet das HTTPUtils-Modul zur Kommunikation mit dem TelegramBot-API. Erst mit der Version, die seit 22.10.2015 &lt;br /&gt;
([r9576] HttpUtils.pm: Async write for POST Requests {{Link2Forum|Topic=41583|LinkText=Fhem-Forum}}) verteilt wird, erlaubt auch den Transfer grösserer Bilder. Die Grenze liegt ansonsten bei ca. 14kb auf Raspberries (Plattformspezifische Grenze).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;define notify_fhem_reload notify wetter:report set telebotdevice sendPhoto /opt/fhem/wetter.jpg&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Bei Erreichen des entsprechenden Status am wetter-Modul wird ein Image über telegram versendet. Hier sind lokale Pfade (relativ zu fhem) oder absolute Pfade wie oben möglich. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Kommandos auslösen ===&lt;br /&gt;
&lt;br /&gt;
Ein wichtiges Szenario ist die Möglichkeit Kommandos in Fhem ausführen zu können, ohne einen Zugang durch die Firewall einrichten zu müssen. Dazu ist die Definition eines Schlüsselwortes (Attribut: &amp;quot;cmdKeyword&amp;quot;)erforderlich, mit dem man die Nachrichten beginnen muss, damit der TelegramBot die Kommandos erkennt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;attr telebotdevice cmdKeyword doit&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Somit kann man dann durch Nachrichten die mit &amp;quot;doit&amp;quot; beginnen Kommandos an Fhem senden, die ähnlich wie im Kommandoeingabefeld von Fhemweb dann von Fhem ausgeführt werden. Das Ergebnis der Ausführung wird zurück an den Sender (und an den definierten defaultPeer) geschickt.&lt;br /&gt;
&lt;br /&gt;
Somit können nicht nur Aktionen angestossen werden, sondern auch Infos abgefragt werden.&lt;br /&gt;
&lt;br /&gt;
Beispiele&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;dofhem set schalter on&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;dofhem list telegrambot&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Randnotiz|RNTyp=Warn|RNText=Achtung: Bei den Kommandos sollten man unbedingt das Attribut &amp;quot;cmdRestrictedPeer&amp;quot; setzen, damit nicht jeder Kommandos auf dem Fhem-Server ausführen kann. Dazu sollten die Benutzerids der erlaubten Benutzer (durch Leerzeichen getrennt angeben). Da Benutzernamen selber vergeben werden und nicht unbedingt eindeutig sind, sollten hier auch NUR Benutzerids verwendet werden.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Favoriten für Kommandos anlegen ===&lt;br /&gt;
&lt;br /&gt;
Grundidee bei den Favoriten ist, dass man lange Befehle, die man haeufig braucht auf &amp;quot;Kurzwahl&amp;quot; legt.&lt;br /&gt;
&lt;br /&gt;
Beispiel-Kommandos wie z.B. &amp;lt;code&amp;gt;set TYPE=ROLLADEN pos 100&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;set TYPE=ROLLADEN pos 0&amp;lt;/code&amp;gt;, die man immer wieder braucht. Um nicht jedesmal dieses Kommando eintippen zu müssen auf dem Smartphone, kann man auch dafür Favoriten anlegen.&lt;br /&gt;
&lt;br /&gt;
Dazu gibt man erstmal die beiden Kommandos getrennt durch Semikolon im Attribut favorites an:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;attr telegrambotdevice favorites set TYPE=ROLLADEN pos 100;set TYPE=ROLLADEN pos 0&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Um die Favorites jetzt ausführen zu können braucht man noch ein Schlüsselwort dafür.&lt;br /&gt;
Nehmen wir mal an man möchte die Favoriten mit &amp;lt;code&amp;gt;/short&amp;lt;/code&amp;gt; ausführen können. Dazu muss dann das Attribut &amp;quot;cmdFavorites&amp;quot; setzen&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;attr telegrambotdevice cmdFavorites /short&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wenn man nun im Telegram Client &lt;br /&gt;
&amp;lt;code&amp;gt;/short 1&amp;lt;/code&amp;gt; an den Bot schickt führt der Bot den ersten Favoriten aus und das Ergebnis der Ausführung wird zurückgeschickt.&lt;br /&gt;
&lt;br /&gt;
Ausserdem kann man im Telegram Client &lt;br /&gt;
&amp;lt;code&amp;gt;/short&amp;lt;/code&amp;gt; an den Bot schicken, dann antwortet der Bot mit&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Favorites&lt;br /&gt;
&lt;br /&gt;
1&lt;br /&gt;
set TYPE=ROLLADEN pos 100&lt;br /&gt;
2&lt;br /&gt;
set TYPE=ROLLADEN pos 0&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
* Github Repository für die Telegram-Fhem Entwicklung: https://github.com/viegener/Telegram-fhem&lt;br /&gt;
* Infos zum Telegram Botfather: https://core.telegram.org/bots#botfather&lt;br /&gt;
&lt;br /&gt;
* Source code für das 50_TelegramBot.pm-Modul: https://github.com/viegener/Telegram-fhem/blob/master/50_TelegramBot.pm&lt;br /&gt;
* Source code für das modifizierte HTTPUtils-Modul zur Übertragung grosser Bilder: https://github.com/viegener/Telegram-fhem/blob/master/HttpUtils.pm&lt;br /&gt;
&lt;br /&gt;
* Forum-Thread in dem das Modul vorgestellt wurde {{Link2Forum|Topic=38328|LinkText=Fhem-Forum}}&lt;br /&gt;
* Telegram messaging system https://telegram.org/&lt;br /&gt;
* TelegramBot API https://core.telegram.org/bots/api&lt;br /&gt;
&lt;br /&gt;
--[[Benutzer:Viegener|Viegener]] ([[Benutzer Diskussion:Viegener|Diskussion]]) 22:49, 11. Okt. 2015 (CEST)&lt;/div&gt;</summary>
		<author><name>Viegener</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=Benutzer:Viegener&amp;diff=13020</id>
		<title>Benutzer:Viegener</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=Benutzer:Viegener&amp;diff=13020"/>
		<updated>2015-11-25T16:34:53Z</updated>

		<summary type="html">&lt;p&gt;Viegener: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
; Erstmal nur ein Überblick über meine FHEM-Beteiligung&lt;br /&gt;
&lt;br /&gt;
== FHEM Benutzung ==&lt;br /&gt;
&lt;br /&gt;
Wunsch war die Zusammenführung der verschiedenen Funksysteme in einem zentralen System.&lt;br /&gt;
Ausdrücklich mit den Zielen&lt;br /&gt;
* Übergreifende Steuerungen und Makros zu ermöglichen&lt;br /&gt;
* Zentrale Bedienungsterminals (tablet)&lt;br /&gt;
* Steuerung von Aussen&lt;br /&gt;
* Am wichtigsten natürlich Spass am Basteln und Programmieren!!!&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
;Komponenten&lt;br /&gt;
* Somfy RTS Rolläden (Aktoren und Handfernbedienungen)&lt;br /&gt;
* FS20 Steckdosen&lt;br /&gt;
* Thermo/Hygro-Sensoren von LaCrosse und Technoline&lt;br /&gt;
* Mehrere Sonos-Komponenten&lt;br /&gt;
* Fritzbox&lt;br /&gt;
* Neu: Homematic&lt;br /&gt;
* Loewe Fernseher (dafür gibt es noch nichts)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
;Mein FHEM habe ich im Februar 2015 installiert.&lt;br /&gt;
* 03/2015 Umzug Raspberry Pi2&lt;br /&gt;
* 04/2015 Somfy-Einbindung&lt;br /&gt;
* 05/2015 FHEM Tablet UI &lt;br /&gt;
* 06/2015 Entwicklung eines Telegram Moduls für Benachrichtigungen und Kommandos (also bidirektional)&lt;br /&gt;
** Telegram ist frei, plattformübergreifend und erlaubt Gruppenchats&lt;br /&gt;
* 09/2015 Variante der Telegram-Anbindung mit dem  TelegramBot-Modul 50_TelegramBot&lt;br /&gt;
* 11/2015 TelegramBot offizielles FHEM-Modul (erhältlich über update)&lt;br /&gt;
&lt;br /&gt;
== FHEM Development ==&lt;br /&gt;
&lt;br /&gt;
Aber klar, das macht ja den Spass aus. Gerne in C, C++, Perl, Java, Javascript und vielen anderen, die heute nicht mehr relevant sind&lt;br /&gt;
Wenns sein muss auch in CSS, HTML etc &lt;br /&gt;
&lt;br /&gt;
* [https://github.com/viegener/Telegram-fhem/blob/master/70_Telegram.pm 70_Telegram.pm]&lt;br /&gt;
* [https://github.com/viegener/Telegram-fhem/blob/master/50_TelegramBot.pm 50_TelegramBot.pm]&lt;br /&gt;
* Beiträge zu Somfy&lt;br /&gt;
** Somfy in FHEMDuino (Perl und C)&lt;br /&gt;
** 10_Somfy_PM - Umbau positionsbehandlung&lt;br /&gt;
* Beiträge zu FHEM Tablet UI&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== FHEMWiki ==&lt;br /&gt;
&lt;br /&gt;
;Bisher nur wenig&lt;br /&gt;
&lt;br /&gt;
* [[TelegramBot]]&lt;br /&gt;
* [[Telegram]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
;Was hätte mir geholfen und würde ich gerne schreiben&lt;br /&gt;
* Beschreibung der Perlfunktionen für Developer&lt;br /&gt;
** dev2array&lt;br /&gt;
** Log3 &lt;br /&gt;
** AttrVal&lt;br /&gt;
* Umgang mit timestamps und Zeitberechnungen&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Projekte und Ideen ==&lt;br /&gt;
&lt;br /&gt;
* Infrarot-Modul als Homematic Aktor (Selbstbau Arduino Nano / Funkmodul-RFM12B? / IR-LEDs&lt;br /&gt;
&lt;br /&gt;
* Klingeltaster-Modul mit RGB-LEDs und Arduino+Funk&lt;br /&gt;
&lt;br /&gt;
* grösseres (10 Zoll ?) Tablet als zentrale Bedienungskonsole&lt;br /&gt;
&lt;br /&gt;
* Quadcopter-Steuerung aus FHEM - Nein natürlich nicht, wofür auch?&lt;/div&gt;</summary>
		<author><name>Viegener</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=TelegramBot&amp;diff=12689</id>
		<title>TelegramBot</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=TelegramBot&amp;diff=12689"/>
		<updated>2015-10-27T20:36:16Z</updated>

		<summary type="html">&lt;p&gt;Viegener: forum#msg350873&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Infobox Modul&lt;br /&gt;
|ModPurpose=Senden und Empfangen von Nachrichten (Text und Fotos) mit dem freien Messagingdienst Telegram&lt;br /&gt;
|ModType=d&lt;br /&gt;
|ModForumArea=Unterstützende Dienste&lt;br /&gt;
|ModFTopic=38328&lt;br /&gt;
|ModTechName=[https://github.com/viegener/Telegram-fhem/blob/master/50_TelegramBot.pm 50_TelegramBot.pm]&lt;br /&gt;
|ModOwner=[[Benutzer:Viegener|Viegener]] ({{Link2FU|12772|Forum}} / [[Benutzer Diskussion:Viegener|Wiki]])}}&lt;br /&gt;
&lt;br /&gt;
Das [[TelegramBot]]-Modul ermöglicht das Senden und Empfangen von Nachrichten über den Telegram-instant messaging Dienst (https://telegram.org/). &lt;br /&gt;
Es entsteht eine Möglichkeit Benachrichtungen aus Fhem zu versenden, zum Beispiel Alarmmeldungen.&lt;br /&gt;
Ausserdem können auch Kommandos über Telegram an Fhem gesendet werden um Steuerungsbefehle in Fhem auszulösen.&lt;br /&gt;
&lt;br /&gt;
Das TelegramBot-Modul benötigt keine Zusatzsoftware auf dem Fhem-Server (anders als die Variante [[Telegram]]), sondern verwendet das [https://core.telegram.org/bots/api TelegramBot-API] über https-Aufrufe.&lt;br /&gt;
&lt;br /&gt;
== Über Telegram Instant Messaging ==&lt;br /&gt;
Telegram-IDs und Versand/Empfang von Nachrichten sind kostenfrei. &lt;br /&gt;
Clients sind für gängige Smartphonesysteme erhältlich (iOS iPhone und Tablet, Android, Windows Phone) und &lt;br /&gt;
können auch aus dem WebBrowser verwendet werden. &lt;br /&gt;
Es gibt auch einen Kommandozeilen-Client für Linux, der die Grundlage dieses Moduls darstellt. &lt;br /&gt;
Mehrfachanmeldungen, auch parallel mit verschiedenen Geräten (z.B. Tablet und Smartphone), sind möglich.&lt;br /&gt;
Gruppenchats und Chats mit End-2-End-Verschlüsselung werden ebenfalls unterstützt.&lt;br /&gt;
&lt;br /&gt;
Für die Unterstützung von &#039;&#039;WhatsApp&#039;&#039; siehe Modul [[yowsup]].&lt;br /&gt;
&lt;br /&gt;
== Features ==&lt;br /&gt;
Unterstützt werden:&lt;br /&gt;
&lt;br /&gt;
* Versand von Textnachrichten &lt;br /&gt;
* Versand von Bildern &lt;br /&gt;
* Empfang von Textnachrichten von beliebigen Kontakten&lt;br /&gt;
* Kommandos in Fhem über telegram-Nachrichten von aussen auslösen&lt;br /&gt;
&lt;br /&gt;
Eine detaillierte Beschreibung des Moduls ist im Fhem Forum und in der (englischen) Dokumentation zum Modul in der Commandref diesem  {{Link2Forum|Topic=38328|LinkText=Diskussionsthread}} zu finden. Seit Oktober 2015 wird das Modul offiziell über Fhem-Update verteilt.&lt;br /&gt;
&lt;br /&gt;
Die jeweils aktuellste Entwicklungs-Version des Moduls ist in Github [https://github.com/viegener/Telegram-fhem/blob/master/50_TelegramBot.pm 50_TelegramBot.pm] verfügbar.&lt;br /&gt;
&lt;br /&gt;
== Hinweise zum Betrieb mit Fhem ==&lt;br /&gt;
{{Randnotiz|RNTyp=Warn|RNText=Achtung: Dieses Authtoken ist die einzige Authentifizierung für den Bot und sollte deshalb nicht aus der Hand gegeben werden. Die verwendeten Urls sind deshalb auch in den Log-Files nicht enthalten, da diese das Authtoken in Klartext enthalten. Auch im Forum sollte dieses Token nicht aufgenommen werden.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Für die Anlage eines TelegramBot Devices in Fhem ist ein Authtoken erforderlich. Dieses Token wird über Anlegen eines neuen Bots im [https://core.telegram.org/bots#botfather Botfather] erzeugt. Die Namen für Bots müssen auf &amp;quot;Bot&amp;quot; enden.&lt;br /&gt;
&lt;br /&gt;
Das Anlegen eines TelegramBot devices erfolgt durch die Angabe dieses Tokens:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;define &amp;amp;lt;name&amp;amp;gt; TelegramBot  &amp;amp;lt;token&amp;amp;gt; &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Beispiel: &amp;lt;code&amp;gt;define teleBot TelegramBot 110201543:AAHdqTcvCH1vGWJxfSeofSAs0K5PALDsaw&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Das Empfangen von Nachrichten (polling) erfordert die Einstellung des Attributes&#039;&#039;&#039; &lt;br /&gt;
&amp;lt;code&amp;gt;pollingTimeout&amp;lt;/code&amp;gt; &#039;&#039;&#039;auf einen Wert der grösser als Null ist. Beim Wert 0 oder ohne Setzen des Attributes findet kein Polling und damit auch kein Empfang statt.&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Der TelegramBot kann erst dann Nachrichten an einen telegram user schicken, wenn dieser zuerst an den telegram bot eine Nachricht gesendet hat.&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Tipps ==&lt;br /&gt;
&lt;br /&gt;
=== Privacyeinstellungen ===&lt;br /&gt;
&lt;br /&gt;
Damit der TelegramBot auch Meldungen in Gruppen sieht, müssen über den botfather die prviacy-Einstellungen geändert werden.&lt;br /&gt;
&lt;br /&gt;
=== Kontakte ===&lt;br /&gt;
&lt;br /&gt;
Der Bot merkt sich die bereits bekannten Kontakte im Reading &amp;lt;code&amp;gt;Contacts&amp;lt;/code&amp;gt;. Dabei werden die einzelnen Kontakte jeweils als 3-teilige Einträge bestehend aus userid, Vor- und Nachname des Benutzers (mit _ verbunden) und dem usernamen (mit vorangestelltem @). &lt;br /&gt;
&lt;br /&gt;
Beispiel: &amp;lt;code&amp;gt;123456:Ralf_Mustermann:@ralf&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Verschiedene Einträge werden durch Leerzeichen getrennt.&lt;br /&gt;
&lt;br /&gt;
Man kann die Kontakte auch manuell überschreiben (z.B. wenn das Reading fehlerhaft oder verloren sein sollte). Dazu gibt es den Set-Befehl &amp;lt;code&amp;gt;replaceContacts&amp;lt;/code&amp;gt;. Dieser nimmt die Kontakte ebenfalls in der gleichen Form wie oben beschrieben entgegen.&lt;br /&gt;
&lt;br /&gt;
=== Reset ===&lt;br /&gt;
&lt;br /&gt;
Es ist möglich den Bot im laufenden Betrieb zurückzusetzen (Set-Befehl &amp;lt;code&amp;gt;reset&amp;lt;/code&amp;gt;). Dabei werden noch nicht abgeschlossene Übetragungen entfernt und die internen Zustände des devices zurückgesetzt. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Beispielszenarien ==&lt;br /&gt;
&lt;br /&gt;
=== Benachrichtigungen über Ereignisse ===&lt;br /&gt;
&lt;br /&gt;
Das einfachste Szenario für die Integration von Messaging-Diensten mit Fhem ist zur Benachrichtigung über Ereignisse. Diese Funktion kann zum Beispiel verwendet werden, um über einen erfolgten Neustart von Fhem zu informieren:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;define notify_fhem_reload notify global:INITIALIZED set telebotdevice message fhem newly started - just now !&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In diesem Beispiel wird der Nachrichtentext &amp;quot;fhem newly started - just now !&amp;quot; an den als default eingestellten Kontakt (Attribut: defaultPeer) gesendet, sobald Fhem neu gestartet wurde. Natürlich kann man auch beliebige andere Benachrichtigungen einführen.&lt;br /&gt;
&lt;br /&gt;
=== Versand von Bildern ===&lt;br /&gt;
&lt;br /&gt;
Es ist auch möglich Bilder auf dem Fhem-Server, die zum Beispiel von einer Kamera oder einem Wettermodul stammen über Telegram zu versenden. So wäre es z.B. möglich jeweils morgens die aktuelle Wetterkarte zu erhalten.&lt;br /&gt;
&lt;br /&gt;
ACHTUNG: TelegramBot verwendet das HTTPUtils-Modul zur Kommunikation mit dem TelegramBot-API. Erst mit der Version, die seit 22.10.2015 &lt;br /&gt;
([r9576] HttpUtils.pm: Async write for POST Requests {{Link2Forum|Topic=41583|LinkText=Fhem-Forum}}) verteilt wird, erlaubt auch den Transfer grösserer Bilder. Die Grenze liegt ansonsten bei ca. 14kb auf Raspberries (Plattformspezifische Grenze).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;define notify_fhem_reload notify wetter:report set telebotdevice sendPhoto /opt/fhem/wetter.jpg&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Bei Erreichen des entsprechenden Status am wetter-Modul wird ein Image über telegram versendet. Hier sind lokale Pfade (relativ zu fhem) oder absolute Pfade wie oben möglich. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Kommandos auslösen ===&lt;br /&gt;
&lt;br /&gt;
Ein wichtiges Szenario ist die Möglichkeit Kommandos in Fhem ausführen zu können, ohne einen Zugang durch die Firewall einrichten zu müssen. Dazu ist die Definition eines Schlüsselwortes (Attribut: &amp;quot;cmdKeyword&amp;quot;)erforderlich, mit dem man die Nachrichten beginnen muss, damit der TelegramBot die Kommandos erkennt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;attr telebotdevice cmdKeyword doit&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Somit kann man dann durch Nachrichten die mit &amp;quot;doit&amp;quot; beginnen Kommandos an Fhem senden, die ähnlich wie im Kommandoeingabefeld von Fhemweb dann von Fhem ausgeführt werden. Das Ergebnis der Ausführung wird zurück an den Sender (und an den definierten defaultPeer) geschickt.&lt;br /&gt;
&lt;br /&gt;
Somit können nicht nur Aktionen angestossen werden, sondern auch Infos abgefragt werden.&lt;br /&gt;
&lt;br /&gt;
Beispiele&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;dofhem set schalter on&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;dofhem list telegrambot&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Randnotiz|RNTyp=Warn|RNText=Achtung: Bei den Kommandos sollten man unbedingt das Attribut &amp;quot;cmdRestrictedPeer&amp;quot; setzen, damit nicht jeder Kommandos auf dem Fhem-Server ausführen kann. Dazu sollten die Benutzerids der erlaubten Benutzer (durch Leerzeichen getrennt angeben). Da Benutzernamen selber vergeben werden und nicht unbedingt eindeutig sind, sollten hier auch NUR Benutzerids verwendet werden.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Favoriten für Kommandos anlegen ===&lt;br /&gt;
&lt;br /&gt;
Grundidee bei den Favoriten ist, dass man lange Befehle, die man haeufig braucht auf &amp;quot;Kurzwahl&amp;quot; legt.&lt;br /&gt;
&lt;br /&gt;
Beispiel-Kommandos wie z.B. &amp;lt;code&amp;gt;set TYPE=ROLLADEN pos 100&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;set TYPE=ROLLADEN pos 0&amp;lt;/code&amp;gt;, die man immer wieder braucht. Um nicht jedesmal dieses Kommando eintippen zu müssen auf dem Smartphone, kann man auch dafür Favoriten anlegen.&lt;br /&gt;
&lt;br /&gt;
Dazu gibt man erstmal die beiden Kommandos getrennt durch Semikolon im Attribut favorites an:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;attr telegrambotdevice favorites set TYPE=ROLLADEN pos 100;set TYPE=ROLLADEN pos 0&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Um die Favorites jetzt ausführen zu können braucht man noch ein Schlüsselwort dafür.&lt;br /&gt;
Nehmen wir mal an man möchte die Favoriten mit &amp;lt;code&amp;gt;/short&amp;lt;/code&amp;gt; ausführen können. Dazu muss dann das Attribut &amp;quot;cmdFavorites&amp;quot; setzen&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;attr telegrambotdevice cmdFavorites /short&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wenn man nun im Telegram Client &lt;br /&gt;
&amp;lt;code&amp;gt;/short 1&amp;lt;/code&amp;gt; an den Bot schickt führt der Bot den ersten Favoriten aus und das Ergebnis der Ausführung wird zurückgeschickt.&lt;br /&gt;
&lt;br /&gt;
Ausserdem kann man im Telegram Client &lt;br /&gt;
&amp;lt;code&amp;gt;/short&amp;lt;/code&amp;gt; an den Bot schicken, dann antwortet der Bot mit&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Favorites&lt;br /&gt;
&lt;br /&gt;
1&lt;br /&gt;
set TYPE=ROLLADEN pos 100&lt;br /&gt;
2&lt;br /&gt;
set TYPE=ROLLADEN pos 0&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
* Github Repository für die Telegram-Fhem Entwicklung: https://github.com/viegener/Telegram-fhem&lt;br /&gt;
* Infos zum Telegram Botfather: https://core.telegram.org/bots#botfather&lt;br /&gt;
&lt;br /&gt;
* Source code für das 50_TelegramBot.pm-Modul: https://github.com/viegener/Telegram-fhem/blob/master/50_TelegramBot.pm&lt;br /&gt;
* Source code für das modifizierte HTTPUtils-Modul zur Übertragung grosser Bilder: https://github.com/viegener/Telegram-fhem/blob/master/HttpUtils.pm&lt;br /&gt;
&lt;br /&gt;
* Forum-Thread in dem das Modul vorgestellt wurde {{Link2Forum|Topic=38328|LinkText=Fhem-Forum}}&lt;br /&gt;
* Telegram messaging system https://telegram.org/&lt;br /&gt;
* TelegramBot API https://core.telegram.org/bots/api&lt;br /&gt;
&lt;br /&gt;
--[[Benutzer:Viegener|Viegener]] ([[Benutzer Diskussion:Viegener|Diskussion]]) 22:49, 11. Okt. 2015 (CEST)&lt;/div&gt;</summary>
		<author><name>Viegener</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=TelegramBot&amp;diff=12610</id>
		<title>TelegramBot</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=TelegramBot&amp;diff=12610"/>
		<updated>2015-10-22T18:50:25Z</updated>

		<summary type="html">&lt;p&gt;Viegener: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Infobox Modul&lt;br /&gt;
|ModPurpose=Senden und Empfangen von Nachrichten (Text und Fotos) mit dem freien Messagingdienst Telegram&lt;br /&gt;
|ModType=d&lt;br /&gt;
|ModForumArea=Unterstützende Dienste&lt;br /&gt;
|ModFTopic=38328&lt;br /&gt;
|ModTechName=[https://github.com/viegener/Telegram-fhem/blob/master/50_TelegramBot.pm 50_TelegramBot.pm]&lt;br /&gt;
|ModOwner=[[Benutzer:Viegener|Viegener]] ({{Link2FU|12772|Forum}} / [[Benutzer Diskussion:Viegener|Wiki]])}}&lt;br /&gt;
&lt;br /&gt;
Das [[TelegramBot]]-Modul ermöglicht das Senden und Empfangen von Nachrichten über den Telegram-instant messaging Dienst (https://telegram.org/). &lt;br /&gt;
Es entsteht eine Möglichkeit Benachrichtungen aus Fhem zu versenden, zum Beispiel Alarmmeldungen.&lt;br /&gt;
Ausserdem können auch Kommandos über Telegram an Fhem gesendet werden um Steuerungsbefehle in Fhem auszulösen.&lt;br /&gt;
&lt;br /&gt;
Das TelegramBot-Modul benötigt keine Zusatzsoftware auf dem Fhem-Server (anders als die Variante [[Telegram]]), sondern verwendet das [https://core.telegram.org/bots/api TelegramBot-API] über https-Aufrufe.&lt;br /&gt;
&lt;br /&gt;
== Über Telegram Instant Messaging ==&lt;br /&gt;
Telegram-IDs und Versand/Empfang von Nachrichten sind kostenfrei. &lt;br /&gt;
Clients sind für gängige Smartphonesysteme erhältlich (iOS iPhone und Tablet, Android, Windows Phone) und &lt;br /&gt;
können auch aus dem WebBrowser verwendet werden. &lt;br /&gt;
Es gibt auch einen Kommandozeilen-Client für Linux, der die Grundlage dieses Moduls darstellt. &lt;br /&gt;
Mehrfachanmeldungen, auch parallel mit verschiedenen Geräten (z.B. Tablet und Smartphone), sind möglich.&lt;br /&gt;
Gruppenchats und Chats mit End-2-End-Verschlüsselung werden ebenfalls unterstützt.&lt;br /&gt;
&lt;br /&gt;
Für die Unterstützung von &#039;&#039;WhatsApp&#039;&#039; siehe Modul [[yowsup]].&lt;br /&gt;
&lt;br /&gt;
== Features ==&lt;br /&gt;
Unterstützt werden:&lt;br /&gt;
&lt;br /&gt;
* Versand von Textnachrichten &lt;br /&gt;
* Versand von Bildern &lt;br /&gt;
* Empfang von Textnachrichten von beliebigen Kontakten&lt;br /&gt;
* Kommandos in Fhem über telegram-Nachrichten von aussen auslösen&lt;br /&gt;
&lt;br /&gt;
Eine detaillierte Beschreibung des Moduls ist im Fhem Forum und in der (englischen) Dokumentation zum Modul in der Commandref diesem  {{Link2Forum|Topic=38328|LinkText=Diskussionsthread}} zu finden. Seit Oktober 2015 wird das Modul offiziell über Fhem-Update verteilt.&lt;br /&gt;
&lt;br /&gt;
Die jeweils aktuellste Entwicklungs-Version des Moduls ist in Github [https://github.com/viegener/Telegram-fhem/blob/master/50_TelegramBot.pm 50_TelegramBot.pm] verfügbar.&lt;br /&gt;
&lt;br /&gt;
== Hinweise zum Betrieb mit Fhem ==&lt;br /&gt;
{{Randnotiz|RNTyp=Warn|RNText=Achtung: Dieses Authtoken ist die einzige Authentifizierung für den Bot und sollte deshalb nicht aus der Hand gegeben werden. Die verwendeten Urls sind deshalb auch in den Log-Files nicht enthalten, da diese das Authtoken in Klartext enthalten. Auch im Forum sollte dieses Token nicht aufgenommen werden.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Für die Anlage eines TelegramBot Devices in Fhem ist ein Authtoken erforderlich. Dieses Token wird über Anlegen eines neuen Bots im [https://core.telegram.org/bots#botfather Botfather] erzeugt. Die Namen für Bots müssen auf &amp;quot;Bot&amp;quot; enden.&lt;br /&gt;
&lt;br /&gt;
Das Anlegen eines TelegramBot devices erfolgt durch die Angabe dieses Tokens:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;define &amp;amp;lt;name&amp;amp;gt; TelegramBot  &amp;amp;lt;token&amp;amp;gt; &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Beispiel: &amp;lt;code&amp;gt;define teleBot TelegramBot 110201543:AAHdqTcvCH1vGWJxfSeofSAs0K5PALDsaw&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Das Empfangen von Nachrichten (polling) erfordert die Einstellung des Attributes&#039;&#039;&#039; &lt;br /&gt;
&amp;lt;code&amp;gt;pollingTimeout&amp;lt;/code&amp;gt; &#039;&#039;&#039;auf einen Wert der grösser als Null ist. Beim Wert 0 oder ohne Setzen des Attributes findet kein Polling und damit auch kein Empfang statt.&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Der TelegramBot kann erst dann Nachrichten an einen telegram user schicken, wenn dieser zuerst an den telegram bot eine Nachricht gesendet hat.&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Tipps ==&lt;br /&gt;
&lt;br /&gt;
=== Privacyeinstellungen ===&lt;br /&gt;
&lt;br /&gt;
Damit der TelegramBot auch Meldungen in Gruppen sieht, müssen über den botfather die prviacy-Einstellungen geändert werden.&lt;br /&gt;
&lt;br /&gt;
=== Kontakte ===&lt;br /&gt;
&lt;br /&gt;
Der Bot merkt sich die bereits bekannten Kontakte im Reading &amp;lt;code&amp;gt;Contacts&amp;lt;/code&amp;gt;. Dabei werden die einzelnen Kontakte jeweils als 3-teilige Einträge bestehend aus userid, Vor- und Nachname des Benutzers (mit _ verbunden) und dem usernamen (mit vorangestelltem @). &lt;br /&gt;
&lt;br /&gt;
Beispiel: &amp;lt;code&amp;gt;123456:Ralf_Mustermann:@ralf&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Verschiedene Einträge werden durch Leerzeichen getrennt.&lt;br /&gt;
&lt;br /&gt;
Man kann die Kontakte auch manuell überschreiben (z.B. wenn das Reading fehlerhaft oder verloren sein sollte). Dazu gibt es den Set-Befehl &amp;lt;code&amp;gt;replaceContacts&amp;lt;/code&amp;gt;. Dieser nimmt die Kontakte ebenfalls in der gleichen Form wie oben beschrieben entgegen.&lt;br /&gt;
&lt;br /&gt;
=== Reset ===&lt;br /&gt;
&lt;br /&gt;
Es ist möglich den Bot im laufenden Betrieb zurückzusetzen (Set-Befehl &amp;lt;code&amp;gt;reset&amp;lt;/code&amp;gt;). Dabei werden noch nicht abgeschlossene Übetragungen entfernt und die internen Zustände des devices zurückgesetzt. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Beispielszenarien ==&lt;br /&gt;
&lt;br /&gt;
=== Benachrichtigungen über Ereignisse ===&lt;br /&gt;
&lt;br /&gt;
Das einfachste Szenario für die Integration von Messaging-Diensten mit Fhem ist zur Benachrichtigung über Ereignisse. Diese Funktion kann zum Beispiel verwendet werden, um über einen erfolgten Neustart von Fhem zu informieren:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;define notify_fhem_reload notify global:INITIALIZED set telebotdevice message fhem newly started - just now !&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In diesem Beispiel wird der Nachrichtentext &amp;quot;fhem newly started - just now !&amp;quot; an den als default eingestellten Kontakt (Attribut: defaultPeer) gesendet, sobald Fhem neu gestartet wurde. Natürlich kann man auch beliebige andere Benachrichtigungen einführen.&lt;br /&gt;
&lt;br /&gt;
=== Versand von Bildern ===&lt;br /&gt;
&lt;br /&gt;
Es ist auch möglich Bilder auf dem Fhem-Server, die zum Beispiel von einer Kamera oder einem Wettermodul stammen über Telegram zu versenden. So wäre es z.B. möglich jeweils morgens die aktuelle Wetterkarte zu erhalten.&lt;br /&gt;
&lt;br /&gt;
ACHTUNG: TelegramBot verwendet das HTTPUtils-Modul zur Kommunikation mit dem TelegramBot-API. Erst mit der Version, die seit 22.10.2015 &lt;br /&gt;
([r9576] HttpUtils.pm: Async write for POST Requests {{Link2Forum|Topic=41583|LinkText=Fhem-Forum}}) verteilt wird, erlaubt auch den Transfer grösserer Bilder. Die Grenze liegt ansonsten bei ca. 14kb auf Raspberries (Plattformspezifische Grenze).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;define notify_fhem_reload notify wetter:report set telebotdevice sendPhoto /opt/fhem/wetter.jpg&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Bei Erreichen des entsprechenden Status am wetter-Modul wird ein Image über telegram versendet. Hier sind lokale Pfade (relativ zu fhem) oder absolute Pfade wie oben möglich. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Kommandos auslösen ===&lt;br /&gt;
&lt;br /&gt;
Ein wichtiges Szenario ist die Möglichkeit Kommandos in Fhem ausführen zu können, ohne einen Zugang durch die Firewall einrichten zu müssen. Dazu ist die Definition eines Schlüsselwortes (Attribut: &amp;quot;cmdKeyword&amp;quot;)erforderlich, mit dem man die Nachrichten beginnen muss, damit der TelegramBot die Kommandos erkennt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;attr telebotdevice cmdKeyword doit&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Somit kann man dann durch Nachrichten die mit &amp;quot;doit&amp;quot; beginnen Kommandos an Fhem senden, die ähnlich wie im Kommandoeingabefeld von Fhemweb dann von Fhem ausgeführt werden. Das Ergebnis der Ausführung wird zurück an den Sender (und an den definierten defaultPeer) geschickt.&lt;br /&gt;
&lt;br /&gt;
Somit können nicht nur Aktionen angestossen werden, sondern auch Infos abgefragt werden.&lt;br /&gt;
&lt;br /&gt;
Beispiele&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;dofhem set schalter on&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;dofhem list telegrambot&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Randnotiz|RNTyp=Warn|RNText=Achtung: Bei den Kommandos sollten man unbedingt das Attribut &amp;quot;cmdRestrictedPeer&amp;quot; setzen, damit nicht jeder Kommandos auf dem Fhem-Server ausführen kann. Dazu sollten die Benutzerids der erlaubten Benutzer (durch Leerzeichen getrennt angeben). Da Benutzernamen selber vergeben werden und nicht unbedingt eindeutig sind, sollten hier auch NUR Benutzerids verwendet werden.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Favoriten für Kommandos anlegen ===&lt;br /&gt;
&lt;br /&gt;
Grundidee bei den Favoriten ist, dass man lange Befehle, die man haeufig braucht auf &amp;quot;Kurzwahl&amp;quot; legt.&lt;br /&gt;
&lt;br /&gt;
Beispiel-Kommandos wie z.B. &amp;lt;code&amp;gt;set TYPE=ROLLADEN pos 100&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;set TYPE=ROLLADEN pos 0&amp;lt;/code&amp;gt;, die man immer wieder braucht. Um nicht jedesmal dieses Kommando eintippen zu müssen auf dem Smartphone, kann man auch dafür Favoriten anlegen.&lt;br /&gt;
&lt;br /&gt;
Dazu gibt man erstmal die beiden Kommandos getrennt durch Semikolon im Attribut favorites an:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;attr telegrambotdevice favorites set TYPE=ROLLADEN pos 100;set TYPE=ROLLADEN pos 0&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Um die Favorites jetzt ausführen zu können braucht man noch ein Schlüsselwort dafür.&lt;br /&gt;
Nehhmen wir mal an man möchte die Favoriten mit &amp;lt;code&amp;gt;/short&amp;lt;/code&amp;gt; ausführen können. Dazu muss dann das Attribut &amp;quot;cmdFavorites&amp;quot; setzen&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;attr telegrambotdevice cmdFavorites /short&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wenn man nun im Telegram Client &lt;br /&gt;
&amp;lt;code&amp;gt;/short 1&amp;lt;/code&amp;gt; an den Bot schickt führt der Bot den ersten Favoriten aus und das Ergebnis der Ausführung wird zurückgeschickt.&lt;br /&gt;
&lt;br /&gt;
Ausserdem kann man im Telegram Client &lt;br /&gt;
&amp;lt;code&amp;gt;/short&amp;lt;/code&amp;gt; an den Bot schicken, dann antwortet der Bot mit&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Favorites&lt;br /&gt;
&lt;br /&gt;
1&lt;br /&gt;
set TYPE=ROLLADEN pos 100&lt;br /&gt;
2&lt;br /&gt;
set TYPE=ROLLADEN pos 0&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
* Github Repository für die Telegram-Fhem Entwicklung: https://github.com/viegener/Telegram-fhem&lt;br /&gt;
* Infos zum Telegram Botfather: https://core.telegram.org/bots#botfather&lt;br /&gt;
&lt;br /&gt;
* Source code für das 50_TelegramBot.pm-Modul: https://github.com/viegener/Telegram-fhem/blob/master/50_TelegramBot.pm&lt;br /&gt;
* Source code für das modifizierte HTTPUtils-Modul zur Übertragung grosser Bilder: https://github.com/viegener/Telegram-fhem/blob/master/HttpUtils.pm&lt;br /&gt;
&lt;br /&gt;
* Forum-Thread in dem das Modul vorgestellt wurde {{Link2Forum|Topic=38328|LinkText=Fhem-Forum}}&lt;br /&gt;
* Telegram messaging system https://telegram.org/&lt;br /&gt;
* TelegramBot API https://core.telegram.org/bots/api&lt;br /&gt;
&lt;br /&gt;
--[[Benutzer:Viegener|Viegener]] ([[Benutzer Diskussion:Viegener|Diskussion]]) 22:49, 11. Okt. 2015 (CEST)&lt;/div&gt;</summary>
		<author><name>Viegener</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=TelegramBot&amp;diff=12596</id>
		<title>TelegramBot</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=TelegramBot&amp;diff=12596"/>
		<updated>2015-10-19T13:27:09Z</updated>

		<summary type="html">&lt;p&gt;Viegener: Modul offiziell und verfügbar über SVN&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Infobox Modul&lt;br /&gt;
|ModPurpose=Senden und Empfangen von Nachrichten (Text und Fotos) mit dem freien Messagingdienst Telegram&lt;br /&gt;
|ModType=d&lt;br /&gt;
|ModForumArea=Unterstützende Dienste&lt;br /&gt;
|ModFTopic=38328&lt;br /&gt;
|ModTechName=[https://github.com/viegener/Telegram-fhem/blob/master/50_TelegramBot.pm 50_TelegramBot.pm]&lt;br /&gt;
|ModOwner=[[Benutzer:Viegener|Viegener]] ({{Link2FU|12772|Forum}} / [[Benutzer Diskussion:Viegener|Wiki]])}}&lt;br /&gt;
&lt;br /&gt;
Das [[TelegramBot]]-Modul ermöglicht das Senden und Empfangen von Nachrichten über den Telegram-instant messaging Dienst (https://telegram.org/). &lt;br /&gt;
Es entsteht eine Möglichkeit Benachrichtungen aus Fhem zu versenden, zum Beispiel Alarmmeldungen.&lt;br /&gt;
Ausserdem können auch Kommandos über Telegram an Fhem gesendet werden um Steuerungsbefehle in Fhem auszulösen.&lt;br /&gt;
&lt;br /&gt;
Das TelegramBot-Modul benötigt keine Zusatzsoftware auf dem Fhem-Server (anders als die Variante [[Telegram]]), sondern verwendet das [https://core.telegram.org/bots/api TelegramBot-API] über https-Aufrufe.&lt;br /&gt;
&lt;br /&gt;
== Über Telegram Instant Messaging ==&lt;br /&gt;
Telegram-IDs und Versand/Empfang von Nachrichten sind kostenfrei. &lt;br /&gt;
Clients sind für gängige Smartphonesysteme erhältlich (iOS iPhone und Tablet, Android, Windows Phone) und &lt;br /&gt;
können auch aus dem WebBrowser verwendet werden. &lt;br /&gt;
Es gibt auch einen Kommandozeilen-Client für Linux, der die Grundlage dieses Moduls darstellt. &lt;br /&gt;
Mehrfachanmeldungen, auch parallel mit verschiedenen Geräten (z.B. Tablet und Smartphone), sind möglich.&lt;br /&gt;
Gruppenchats und Chats mit End-2-End-Verschlüsselung werden ebenfalls unterstützt.&lt;br /&gt;
&lt;br /&gt;
Für die Unterstützung von &#039;&#039;WhatsApp&#039;&#039; siehe Modul [[yowsup]].&lt;br /&gt;
&lt;br /&gt;
== Features ==&lt;br /&gt;
Unterstützt werden:&lt;br /&gt;
&lt;br /&gt;
* Versand von Textnachrichten &lt;br /&gt;
* Versand von Bildern &lt;br /&gt;
* Empfang von Textnachrichten von beliebigen Kontakten&lt;br /&gt;
* Kommandos in Fhem über telegram-Nachrichten von aussen auslösen&lt;br /&gt;
&lt;br /&gt;
Eine detaillierte Beschreibung des Moduls ist im Fhem Forum und in der (englischen) Dokumentation zum Modul in der Commandref diesem  {{Link2Forum|Topic=38328|LinkText=Diskussionsthread}} zu finden. Seit Oktober 2015 wird das Modul offiziell über Fhem-Update verteilt.&lt;br /&gt;
&lt;br /&gt;
Die jeweils aktuellste Entwicklungs-Version des Moduls ist in Github [https://github.com/viegener/Telegram-fhem/blob/master/50_TelegramBot.pm 50_TelegramBot.pm] verfügbar.&lt;br /&gt;
&lt;br /&gt;
== Hinweise zum Betrieb mit Fhem ==&lt;br /&gt;
{{Randnotiz|RNTyp=Warn|RNText=Achtung: Dieses Authtoken ist die einzige Authentifizierung für den Bot und sollte deshalb nicht aus der Hand gegeben werden. Die verwendeten Urls sind deshalb auch in den Log-Files nicht enthalten, da diese das Authtoken in Klartext enthalten. Auch im Forum sollte dieses Token nicht aufgenommen werden.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Für die Anlage eines TelegramBot Devices in Fhem ist ein Authtoken erforderlich. Dieses Token wird über Anlegen eines neuen Bots im [https://core.telegram.org/bots#botfather Botfather] erzeugt. Die Namen für Bots müssen auf &amp;quot;Bot&amp;quot; enden.&lt;br /&gt;
&lt;br /&gt;
Das Anlegen eines TelegramBot devices erfolgt durch die Angabe dieses Tokens:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;define &amp;amp;lt;name&amp;amp;gt; TelegramBot  &amp;amp;lt;token&amp;amp;gt; &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Beispiel: &amp;lt;code&amp;gt;define teleBot TelegramBot 110201543:AAHdqTcvCH1vGWJxfSeofSAs0K5PALDsaw&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Das Empfangen von Nachrichten (polling) erfordert die Einstellung des Attributes&#039;&#039;&#039; &lt;br /&gt;
&amp;lt;code&amp;gt;pollingTimeout&amp;lt;/code&amp;gt; &#039;&#039;&#039;auf einen Wert der grösser als Null ist. Beim Wert 0 oder ohne Setzen des Attributes findet kein Polling und damit auch kein Empfang statt.&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Der TelegramBot kann erst dann Nachrichten an einen telegram user schicken, wenn dieser zuerst an den telegram bot eine Nachricht gesendet hat.&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Tipps ==&lt;br /&gt;
&lt;br /&gt;
=== Privacyeinstellungen ===&lt;br /&gt;
&lt;br /&gt;
Damit der TelegramBot auch Meldungen in Gruppen sieht, müssen über den botfather die prviacy-Einstellungen geändert werden.&lt;br /&gt;
&lt;br /&gt;
=== Kontakte ===&lt;br /&gt;
&lt;br /&gt;
Der Bot merkt sich die bereits bekannten Kontakte im Reading &amp;lt;code&amp;gt;Contacts&amp;lt;/code&amp;gt;. Dabei werden die einzelnen Kontakte jeweils als 3-teilige Einträge bestehend aus userid, Vor- und Nachname des Benutzers (mit _ verbunden) und dem usernamen (mit vorangestelltem @). &lt;br /&gt;
&lt;br /&gt;
Beispiel: &amp;lt;code&amp;gt;123456:Ralf_Mustermann:@ralf&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Verschiedene Einträge werden durch Leerzeichen getrennt.&lt;br /&gt;
&lt;br /&gt;
Man kann die Kontakte auch manuell überschreiben (z.B. wenn das Reading fehlerhaft oder verloren sein sollte). Dazu gibt es den Set-Befehl &amp;lt;code&amp;gt;replaceContacts&amp;lt;/code&amp;gt;. Dieser nimmt die Kontakte ebenfalls in der gleichen Form wie oben beschrieben entgegen.&lt;br /&gt;
&lt;br /&gt;
=== Reset ===&lt;br /&gt;
&lt;br /&gt;
Es ist möglich den Bot im laufenden Betrieb zurückzusetzen (Set-Befehl &amp;lt;code&amp;gt;reset&amp;lt;/code&amp;gt;). Dabei werden noch nicht abgeschlossene Übetragungen entfernt und die internen Zustände des devices zurückgesetzt. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Beispielszenarien ==&lt;br /&gt;
&lt;br /&gt;
=== Benachrichtigungen über Ereignisse ===&lt;br /&gt;
&lt;br /&gt;
Das einfachste Szenario für die Integration von Messaging-Diensten mit Fhem ist zur Benachrichtigung über Ereignisse. Diese Funktion kann zum Beispiel verwendet werden, um über einen erfolgten Neustart von Fhem zu informieren:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;define notify_fhem_reload notify global:INITIALIZED set telebotdevice message fhem newly started - just now !&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In diesem Beispiel wird der Nachrichtentext &amp;quot;fhem newly started - just now !&amp;quot; an den als default eingestellten Kontakt (Attribut: defaultPeer) gesendet, sobald Fhem neu gestartet wurde. Natürlich kann man auch beliebige andere Benachrichtigungen einführen.&lt;br /&gt;
&lt;br /&gt;
=== Versand von Bildern ===&lt;br /&gt;
&lt;br /&gt;
Es ist auch möglich Bilder auf dem Fhem-Server, die zum Beispiel von einer Kamera oder einem Wettermodul stammen über Telegram zu versenden. So wäre es z.B. möglich jeweils morgens die aktuelle Wetterkarte zu erhalten.&lt;br /&gt;
&lt;br /&gt;
ACHTUNG: TelegramBot verwendet das HTTPUtils-Modul zur Kommunikation mit dem TelegramBot-API. Das aktuelle HTTPUtils-Modul (Stand Oktober 2015) kann noch keine grossen Dateimengen übertragen, so dass momentan nur Bilder bis zu einer Grösse von etwa 14KB versendet werden können (Plattformspezifische Grenze). Detaillierte Infos finden sich im Forum {{Link2Forum|Topic=41583|LinkText=Fhem-Forum}}.&lt;br /&gt;
Es gibt dazu ein modifiziertes HTTPUtils-Modul, dass diese Beschränkung aufhebt und auch grosse Dateien übertragen kann.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;define notify_fhem_reload notify wetter:report set telebotdevice sendPhoto /opt/fhem/wetter.jpg&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Bei Erreichen des entsprechenden Status am wetter-Modul wird ein Image über telegram versendet. Hier sind lokale Pfade (relativ zu fhem) oder absolute Pfade wie oben möglich. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Kommandos auslösen ===&lt;br /&gt;
&lt;br /&gt;
Ein wichtiges Szenario ist die Möglichkeit Kommandos in Fhem ausführen zu können, ohne einen Zugang durch die Firewall einrichten zu müssen. Dazu ist die Definition eines Schlüsselwortes (Attribut: &amp;quot;cmdKeyword&amp;quot;)erforderlich, mit dem man die Nachrichten beginnen muss, damit der TelegramBot die Kommandos erkennt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;attr telebotdevice cmdKeyword doit&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Somit kann man dann durch Nachrichten die mit &amp;quot;doit&amp;quot; beginnen Kommandos an Fhem senden, die ähnlich wie im Kommandoeingabefeld von Fhemweb dann von Fhem ausgeführt werden. Das Ergebnis der Ausführung wird zurück an den Sender (und an den definierten defaultPeer) geschickt.&lt;br /&gt;
&lt;br /&gt;
Somit können nicht nur Aktionen angestossen werden, sondern auch Infos abgefragt werden.&lt;br /&gt;
&lt;br /&gt;
Beispiele&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;dofhem set schalter on&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;dofhem list telegrambot&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Randnotiz|RNTyp=Warn|RNText=Achtung: Bei den Kommandos sollten man unbedingt das Attribut &amp;quot;cmdRestrictedPeer&amp;quot; setzen, damit nicht jeder Kommandos auf dem Fhem-Server ausführen kann. Dazu sollten die Benutzerids der erlaubten Benutzer (durch Leerzeichen getrennt angeben). Da Benutzernamen selber vergeben werden und nicht unbedingt eindeutig sind, sollten hier auch NUR Benutzerids verwendet werden.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Favoriten für Kommandos anlegen ===&lt;br /&gt;
&lt;br /&gt;
Grundidee bei den Favoriten ist, dass man lange Befehle, die man haeufig braucht auf &amp;quot;Kurzwahl&amp;quot; legt.&lt;br /&gt;
&lt;br /&gt;
Beispiel-Kommandos wie z.B. &amp;lt;code&amp;gt;set TYPE=ROLLADEN pos 100&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;set TYPE=ROLLADEN pos 0&amp;lt;/code&amp;gt;, die man immer wieder braucht. Um nicht jedesmal dieses Kommando eintippen zu müssen auf dem Smartphone, kann man auch dafür Favoriten anlegen.&lt;br /&gt;
&lt;br /&gt;
Dazu gibt man erstmal die beiden Kommandos getrennt durch Semikolon im Attribut favorites an:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;attr telegrambotdevice favorites set TYPE=ROLLADEN pos 100;set TYPE=ROLLADEN pos 0&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Um die Favorites jetzt ausführen zu können braucht man noch ein Schlüsselwort dafür.&lt;br /&gt;
Nehhmen wir mal an man möchte die Favoriten mit &amp;lt;code&amp;gt;/short&amp;lt;/code&amp;gt; ausführen können. Dazu muss dann das Attribut &amp;quot;cmdFavorites&amp;quot; setzen&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;attr telegrambotdevice cmdFavorites /short&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wenn man nun im Telegram Client &lt;br /&gt;
&amp;lt;code&amp;gt;/short 1&amp;lt;/code&amp;gt; an den Bot schickt führt der Bot den ersten Favoriten aus und das Ergebnis der Ausführung wird zurückgeschickt.&lt;br /&gt;
&lt;br /&gt;
Ausserdem kann man im Telegram Client &lt;br /&gt;
&amp;lt;code&amp;gt;/short&amp;lt;/code&amp;gt; an den Bot schicken, dann antwortet der Bot mit&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Favorites&lt;br /&gt;
&lt;br /&gt;
1&lt;br /&gt;
set TYPE=ROLLADEN pos 100&lt;br /&gt;
2&lt;br /&gt;
set TYPE=ROLLADEN pos 0&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
* Github Repository für die Telegram-Fhem Entwicklung: https://github.com/viegener/Telegram-fhem&lt;br /&gt;
* Infos zum Telegram Botfather: https://core.telegram.org/bots#botfather&lt;br /&gt;
&lt;br /&gt;
* Source code für das 50_TelegramBot.pm-Modul: https://github.com/viegener/Telegram-fhem/blob/master/50_TelegramBot.pm&lt;br /&gt;
* Source code für das modifizierte HTTPUtils-Modul zur Übertragung grosser Bilder: https://github.com/viegener/Telegram-fhem/blob/master/HttpUtils.pm&lt;br /&gt;
&lt;br /&gt;
* Forum-Thread in dem das Modul vorgestellt wurde {{Link2Forum|Topic=38328|LinkText=Fhem-Forum}}&lt;br /&gt;
* Telegram messaging system https://telegram.org/&lt;br /&gt;
* TelegramBot API https://core.telegram.org/bots/api&lt;br /&gt;
&lt;br /&gt;
--[[Benutzer:Viegener|Viegener]] ([[Benutzer Diskussion:Viegener|Diskussion]]) 22:49, 11. Okt. 2015 (CEST)&lt;/div&gt;</summary>
		<author><name>Viegener</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=TelegramBot&amp;diff=12491</id>
		<title>TelegramBot</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=TelegramBot&amp;diff=12491"/>
		<updated>2015-10-12T21:00:23Z</updated>

		<summary type="html">&lt;p&gt;Viegener: Tipps hinzugefügt&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Infobox Modul&lt;br /&gt;
|ModPurpose=Senden und Empfangen von Nachrichten (Text und Fotos) mit dem freien Messagingdienst Telegram&lt;br /&gt;
|ModType=x&lt;br /&gt;
|ModForumArea=Unterstützende Dienste&lt;br /&gt;
|ModFTopic=38328&lt;br /&gt;
|ModTechName=[https://github.com/viegener/Telegram-fhem/blob/master/50_TelegramBot.pm 50_TelegramBot.pm]&lt;br /&gt;
|ModOwner=[[Benutzer:Viegener|Viegener]] ({{Link2FU|12772|Forum}} / [[Benutzer Diskussion:Viegener|Wiki]])}}&lt;br /&gt;
&lt;br /&gt;
Das [[TelegramBot]]-Modul ermöglicht das Senden und Empfangen von Nachrichten über den Telegram-instant messaging Dienst (https://telegram.org/). &lt;br /&gt;
Es entsteht eine Möglichkeit Benachrichtungen aus Fhem zu versenden, zum Beispiel Alarmmeldungen.&lt;br /&gt;
Ausserdem können auch Kommandos über Telegram an Fhem gesendet werden um Steuerungsbefehle in Fhem auszulösen.&lt;br /&gt;
&lt;br /&gt;
Das TelegramBot-Modul benötigt keine Zusatzsoftware auf dem Fhem-Server (anders als die Variante [[Telegram]]), sondern verwendet das [https://core.telegram.org/bots/api TelegramBot-API] über https-Aufrufe.&lt;br /&gt;
&lt;br /&gt;
Für die Unterstützung von &#039;&#039;WhatsApp&#039;&#039; siehe Modul [[yowsup]].&lt;br /&gt;
&lt;br /&gt;
== Über Telegram Instant Messaging ==&lt;br /&gt;
Telegram-IDs und Versand/Empfang von Nachrichten sind kostenfrei. &lt;br /&gt;
Clients sind für gängige Smartphonesysteme erhältlich (iOS iPhone und Tablet, Android, Windows Phone) und &lt;br /&gt;
können auch aus dem WebBrowser verwendet werden. &lt;br /&gt;
Es gibt auch einen Kommandozeilen-Client für Linux, der die Grundlage dieses Moduls darstellt. &lt;br /&gt;
Mehrfachanmeldungen, auch parallel mit verschiedenen Geräten (z.B. Tablet und Smartphone), sind möglich.&lt;br /&gt;
Gruppenchats und Chats mit End-2-End-Verschlüsselung werden ebenfalls unterstützt.&lt;br /&gt;
&lt;br /&gt;
== Features ==&lt;br /&gt;
Unterstützt werden:&lt;br /&gt;
&lt;br /&gt;
* Versand von Textnachrichten &lt;br /&gt;
* Versand von Bildern &lt;br /&gt;
* Empfang von Textnachrichten von beliebigen Kontakten&lt;br /&gt;
* Kommandos in Fhem über telegram-Nachrichten von aussen auslösen&lt;br /&gt;
&lt;br /&gt;
Eine detaillierte Beschreibung des Moduls ist im Fhem Forum und in der (englischen) Dokumentation zum Modul in diesem  {{Link2Forum|Topic=38328|LinkText=Diskussionsthread}} zu finden, die jeweils aktuelle Version des Moduls ist im ersten Beitrag als Anhang verfügbar.&lt;br /&gt;
&lt;br /&gt;
== Hinweise zum Betrieb mit Fhem ==&lt;br /&gt;
{{Randnotiz|RNTyp=Warn|RNText=Achtung: Dieses Authtoken ist die einzige Authentifizierung für den Bot und sollte deshalb nicht aus der Hand gegeben werden. Die verwendeten Urls sind deshalb auch in den Log-Files nicht enthalten, da diese das Authtoken in Klartext enthalten. Auch im Forum sollte dieses Token nicht aufgenommen werden.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Für die Anlage eines TelegramBot Devices in Fhem ist ein Authtoken erforderlich. Dieses Token wird über Anlegen eines neuen Bots im [https://core.telegram.org/bots#botfather Botfather] erzeugt. Die Namen für Bots müssen auf &amp;quot;Bot&amp;quot; enden.&lt;br /&gt;
&lt;br /&gt;
Das Anlegen eines TelegramBot devices erfolgt durch die Angabe dieses Tokens:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;define &amp;amp;lt;name&amp;amp;gt; TelegramBot  &amp;amp;lt;token&amp;amp;gt; &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Beispiel: &amp;lt;code&amp;gt;define teleBot TelegramBot 110201543:AAHdqTcvCH1vGWJxfSeofSAs0K5PALDsaw&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Das Empfangen von Nachrichten (polling) erfordert die Einstellung des Attributes&#039;&#039;&#039; &lt;br /&gt;
&amp;lt;code&amp;gt;pollingTimeout&amp;lt;/code&amp;gt; &#039;&#039;&#039;auf einen Wert der grösser als Null ist. Beim Wert 0 oder ohne Setzen des Attributes findet kein Polling und damit auch kein Empfang statt.&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Der TelegramBot kann erst dann Nachrichten an einen telegram user schicken, wenn dieser zuerst an den telegram bot eine Nachricht gesendet hat.&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Tipps ==&lt;br /&gt;
&lt;br /&gt;
=== Privacyeinstellungen ===&lt;br /&gt;
&lt;br /&gt;
Damit der TelegramBot auch Meldungen in Gruppen sieht, müssen über den botfather die prviacy-Einstellungen geändert werden.&lt;br /&gt;
&lt;br /&gt;
=== Kontakte ===&lt;br /&gt;
&lt;br /&gt;
Der Bot merkt sich die bereits bekannten Kontakte im Reading &amp;lt;code&amp;gt;Contacts&amp;lt;/code&amp;gt;. Dabei werden die einzelnen Kontakte jeweils als 3-teilige Einträge bestehend aus userid, Vor- und Nachname des Benutzers (mit _ verbunden) und dem usernamen (mit vorangestelltem @). &lt;br /&gt;
&lt;br /&gt;
Beispiel: &amp;lt;code&amp;gt;123456:Ralf_Mustermann:@ralf&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Verschiedene Einträge werden durch Leerzeichen getrennt.&lt;br /&gt;
&lt;br /&gt;
Man kann die Kontakte auch manuell überschreiben (z.B. wenn das Reading fehlerhaft oder verloren sein sollte). Dazu gibt es den Set-Befehl &amp;lt;code&amp;gt;replaceContacts&amp;lt;/code&amp;gt;. Dieser nimmt die Kontakte ebenfalls in der gleichen Form wie oben beschrieben entgegen.&lt;br /&gt;
&lt;br /&gt;
=== Reset ===&lt;br /&gt;
&lt;br /&gt;
Es ist möglich den Bot im laufenden Betrieb zurückzusetzen (Set-Befehl &amp;lt;code&amp;gt;reset&amp;lt;/code&amp;gt;). Dabei werden noch nicht abgeschlossene Übetragungen entfernt und die internen Zustände des devices zurückgesetzt. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Beispielszenarien ==&lt;br /&gt;
&lt;br /&gt;
=== Benachrichtigungen über Ereignisse ===&lt;br /&gt;
&lt;br /&gt;
Das einfachste Szenario für die Integration von Messaging-Diensten mit Fhem ist zur Benachrichtigung über Ereignisse. Diese Funktion kann zum Beispiel verwendet werden, um über einen erfolgten Neustart von Fhem zu informieren:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;define notify_fhem_reload notify global:INITIALIZED set telebotdevice message fhem newly started - just now !&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In diesem Beispiel wird der Nachrichtentext &amp;quot;fhem newly started - just now !&amp;quot; an den als default eingestellten Kontakt (Attribut: defaultPeer) gesendet, sobald Fhem neu gestartet wurde. Natürlich kann man auch beliebige andere Benachrichtigungen einführen.&lt;br /&gt;
&lt;br /&gt;
=== Versand von Bildern ===&lt;br /&gt;
&lt;br /&gt;
Es ist auch möglich Bilder auf dem Fhem-Server, die zum Beispiel von einer Kamera oder einem Wettermodul stammen über Telegram zu versenden. So wäre es z.B. möglich jeweils morgens die aktuelle Wetterkarte zu erhalten.&lt;br /&gt;
&lt;br /&gt;
ACHTUNG: TelegramBot verwendet das HTTPUtils-Modul zur Kommunikation mit dem TelegramBot-API. Das aktuelle HTTPUtils-Modul (Stand Oktober 2015) kann noch keine grossen Dateimengen übertragen, so dass momentan nur Bilder bis zu einer Grösse von etwa 14KB versendet werden können (Plattformspezifische Grenze). Detaillierte Infos finden sich im Forum {{Link2Forum|Topic=41583|LinkText=Fhem-Forum}}.&lt;br /&gt;
Es gibt dazu ein modifiziertes HTTPUtils-Modul, dass diese Beschränkung aufhebt und auch grosse Dateien übertragen kann.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;define notify_fhem_reload notify wetter:report set telebotdevice sendPhoto /opt/fhem/wetter.jpg&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Bei Erreichen des entsprechenden Status am wetter-Modul wird ein Image über telegram versendet. Hier sind lokale Pfade (relativ zu fhem) oder absolute Pfade wie oben möglich. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Kommandos auslösen ===&lt;br /&gt;
&lt;br /&gt;
Ein wichtiges Szenario ist die Möglichkeit Kommandos in Fhem ausführen zu können, ohne einen Zugang durch die Firewall einrichten zu müssen. Dazu ist die Definition eines Schlüsselwortes (Attribut: &amp;quot;cmdKeyword&amp;quot;)erforderlich, mit dem man die Nachrichten beginnen muss, damit der TelegramBot die Kommandos erkennt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;attr telebotdevice cmdKeyword doit&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Somit kann man dann durch Nachrichten die mit &amp;quot;doit&amp;quot; beginnen Kommandos an Fhem senden, die ähnlich wie im Kommandoeingabefeld von Fhemweb dann von Fhem ausgeführt werden. Das Ergebnis der Ausführung wird zurück an den Sender (und an den definierten defaultPeer) geschickt.&lt;br /&gt;
&lt;br /&gt;
Somit können nicht nur Aktionen angestossen werden, sondern auch Infos abgefragt werden.&lt;br /&gt;
&lt;br /&gt;
Beispiele&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;dofhem set schalter on&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;dofhem list telegrambot&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Randnotiz|RNTyp=Warn|RNText=Achtung: Bei den Kommandos sollten man unbedingt das Attribut &amp;quot;cmdRestrictedPeer&amp;quot; setzen, damit nicht jeder Kommandos auf dem Fhem-Server ausführen kann. Dazu sollten die Benutzerids der erlaubten Benutzer (durch Leerzeichen getrennt angeben). Da Benutzernamen selber vergeben werden und nicht unbedingt eindeutig sind, sollten hier auch NUR Benutzerids verwendet werden.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Favoriten für Kommandos anlegen ===&lt;br /&gt;
&lt;br /&gt;
Grundidee bei den Favoriten ist, dass man lange Befehle, die man haeufig braucht auf &amp;quot;Kurzwahl&amp;quot; legt.&lt;br /&gt;
&lt;br /&gt;
Beispiel-Kommandos wie z.B. &amp;lt;code&amp;gt;set TYPE=ROLLADEN pos 100&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;set TYPE=ROLLADEN pos 0&amp;lt;/code&amp;gt;, die man immer wieder braucht. Um nicht jedesmal dieses Kommando eintippen zu müssen auf dem Smartphone, kann man auch dafür Favoriten anlegen.&lt;br /&gt;
&lt;br /&gt;
Dazu gibt man erstmal die beiden Kommandos getrennt durch Semikolon im Attribut favorites an:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;attr telegrambotdevice favorites set TYPE=ROLLADEN pos 100;set TYPE=ROLLADEN pos 0&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Um die Favorites jetzt ausführen zu können braucht man noch ein Schlüsselwort dafür.&lt;br /&gt;
Nehhmen wir mal an man möchte die Favoriten mit &amp;lt;code&amp;gt;/short&amp;lt;/code&amp;gt; ausführen können. Dazu muss dann das Attribut &amp;quot;cmdFavorites&amp;quot; setzen&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;attr telegrambotdevice cmdFavorites /short&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wenn man nun im Telegram Client &lt;br /&gt;
&amp;lt;code&amp;gt;/short 1&amp;lt;/code&amp;gt; an den Bot schickt führt der Bot den ersten Favoriten aus und das Ergebnis der Ausführung wird zurückgeschickt.&lt;br /&gt;
&lt;br /&gt;
Ausserdem kann man im Telegram Client &lt;br /&gt;
&amp;lt;code&amp;gt;/short&amp;lt;/code&amp;gt; an den Bot schicken, dann antwortet der Bot mit&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Favorites&lt;br /&gt;
&lt;br /&gt;
1&lt;br /&gt;
set TYPE=ROLLADEN pos 100&lt;br /&gt;
2&lt;br /&gt;
set TYPE=ROLLADEN pos 0&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
* Github Repository für die Telegram-Fhem Entwicklung: https://github.com/viegener/Telegram-fhem&lt;br /&gt;
* Infos zum Telegram Botfather: https://core.telegram.org/bots#botfather&lt;br /&gt;
&lt;br /&gt;
* Source code für das 50_TelegramBot.pm-Modul: https://github.com/viegener/Telegram-fhem/blob/master/50_TelegramBot.pm&lt;br /&gt;
* Source code für das modifizierte HTTPUtils-Modul zur Übertragung grosser Bilder: https://github.com/viegener/Telegram-fhem/blob/master/HttpUtils.pm&lt;br /&gt;
&lt;br /&gt;
* Forum-Thread in dem das Modul vorgestellt wurde {{Link2Forum|Topic=38328|LinkText=Fhem-Forum}}&lt;br /&gt;
* Telegram messaging system https://telegram.org/&lt;br /&gt;
* TelegramBot API https://core.telegram.org/bots/api&lt;br /&gt;
&lt;br /&gt;
--[[Benutzer:Viegener|Viegener]] ([[Benutzer Diskussion:Viegener|Diskussion]]) 22:49, 11. Okt. 2015 (CEST)&lt;/div&gt;</summary>
		<author><name>Viegener</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=TelegramBot&amp;diff=12489</id>
		<title>TelegramBot</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=TelegramBot&amp;diff=12489"/>
		<updated>2015-10-11T20:49:50Z</updated>

		<summary type="html">&lt;p&gt;Viegener: Erste Version zum telegramBot Modul&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Infobox Modul&lt;br /&gt;
|ModPurpose=Senden und Empfangen von Nachrichten (Text und Fotos) mit dem freien Messagingdienst Telegram&lt;br /&gt;
|ModType=x&lt;br /&gt;
|ModForumArea=Unterstützende Dienste&lt;br /&gt;
|ModFTopic=38328&lt;br /&gt;
|ModTechName=[https://github.com/viegener/Telegram-fhem/blob/master/50_TelegramBot.pm 50_TelegramBot.pm]&lt;br /&gt;
|ModOwner=[[Benutzer:Viegener|Viegener]] ({{Link2FU|12772|Forum}} / [[Benutzer Diskussion:Viegener|Wiki]])}}&lt;br /&gt;
&lt;br /&gt;
Das [[TelegramBot]]-Modul ermöglicht das Senden und Empfangen von Nachrichten über den Telegram-instant messaging Dienst (https://telegram.org/). &lt;br /&gt;
Es entsteht eine Möglichkeit Benachrichtungen aus Fhem zu versenden, zum Beispiel Alarmmeldungen.&lt;br /&gt;
Ausserdem können auch Kommandos über Telegram an Fhem gesendet werden um Steuerungsbefehle in Fhem auszulösen.&lt;br /&gt;
&lt;br /&gt;
Das TelegramBot-Modul benötigt keine Zusatzsoftware auf dem Fhem-Server (anders als die Variante [[Telegram]]), sondern verwendet das [https://core.telegram.org/bots/api TelegramBot-API] über https-Aufrufe.&lt;br /&gt;
&lt;br /&gt;
Für die Unterstützung von &#039;&#039;WhatsApp&#039;&#039; siehe Modul [[yowsup]].&lt;br /&gt;
&lt;br /&gt;
== Über Telegram Instant Messaging ==&lt;br /&gt;
Telegram-IDs und Versand/Empfang von Nachrichten sind kostenfrei. &lt;br /&gt;
Clients sind für gängige Smartphonesysteme erhältlich (iOS iPhone und Tablet, Android, Windows Phone) und &lt;br /&gt;
können auch aus dem WebBrowser verwendet werden. &lt;br /&gt;
Es gibt auch einen Kommandozeilen-Client für Linux, der die Grundlage dieses Moduls darstellt. &lt;br /&gt;
Mehrfachanmeldungen, auch parallel mit verschiedenen Geräten (z.B. Tablet und Smartphone), sind möglich.&lt;br /&gt;
Gruppenchats und Chats mit End-2-End-Verschlüsselung werden ebenfalls unterstützt.&lt;br /&gt;
&lt;br /&gt;
== Features ==&lt;br /&gt;
Unterstützt werden:&lt;br /&gt;
&lt;br /&gt;
* Versand von Textnachrichten &lt;br /&gt;
* Versand von Bildern &lt;br /&gt;
* Empfang von Textnachrichten von beliebigen Kontakten&lt;br /&gt;
* Kommandos in Fhem über telegram-Nachrichten von aussen auslösen&lt;br /&gt;
&lt;br /&gt;
Eine detaillierte Beschreibung des Moduls ist im Fhem Forum und in der (englischen) Dokumentation zum Modul in diesem  {{Link2Forum|Topic=38328|LinkText=Diskussionsthread}} zu finden, die jeweils aktuelle Version des Moduls ist im ersten Beitrag als Anhang verfügbar.&lt;br /&gt;
&lt;br /&gt;
== Hinweise zum Betrieb mit Fhem ==&lt;br /&gt;
Für die Anlage eines TelegramBot Devices in Fhem ist ein Authtoken erforderlich. Dieses Token wird über Anlegen eines neuen Bots im [https://core.telegram.org/bots#botfather Botfather] erzeugt. Die Namen für Bots müssen auf &amp;quot;Bot&amp;quot; enden.&lt;br /&gt;
&lt;br /&gt;
{{Randnotiz|RNTyp=Warn|RNText=Achtung: Dieses Authtoken ist die einzige Authentifizierung für den Bot und sollte deshalb nicht aus der Hand gegeben werden. Die verwendeten Urls sind deshalb auch in den Log-Files nicht enthalten, da diese das Authtoken in Klartext enthalten. Auch im Forum sollte dieses Token nicht aufgenommen werden.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Der telegram Bot kann erst dann Nachrichten an einen telegram user schicken, wenn dieser zuerst an den telegram bot eine Nachricht gesendet hat. &lt;br /&gt;
&lt;br /&gt;
Damit der telegram bot auch Meldungen in Gruppen sieht, müssen über den botfather die prviacy-Einstellungen geändert werden.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Beispielszenarien ==&lt;br /&gt;
&lt;br /&gt;
=== Benachrichtigungen über Ereignisse ===&lt;br /&gt;
&lt;br /&gt;
Das einfachste Szenario für die Integration von Messaging-Diensten mit Fhem ist zur Benachrichtigung über Ereignisse. Diese Funktion kann zum Beispiel verwendet werden, um über einen erfolgten Neustart von Fhem zu informieren:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;define notify_fhem_reload notify global:INITIALIZED set telebotdevice message fhem newly started - just now !&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In diesem Beispiel wird der Nachrichtentext &amp;quot;fhem newly started - just now !&amp;quot; an den als default eingestellten Kontakt (Attribut: defaultPeer) gesendet, sobald Fhem neu gestartet wurde. Natürlich kann man auch beliebige andere Benachrichtigungen einführen.&lt;br /&gt;
&lt;br /&gt;
=== Versand von Bildern ===&lt;br /&gt;
&lt;br /&gt;
Es ist auch möglich Bilder auf dem Fhem-Server, die zum Beispiel von einer Kamera oder einem Wettermodul stammen über Telegram zu versenden. So wäre es z.B. möglich jeweils morgens die aktuelle Wetterkarte zu erhalten.&lt;br /&gt;
&lt;br /&gt;
ACHTUNG: TelegramBot verwendet das HTTPUtils-Modul zur Kommunikation mit dem TelegramBot-API. Das aktuelle HTTPUtils-Modul (Stand Oktober 2015) kann noch keine grossen Dateimengen übertragen, so dass momentan nur Bilder bis zu einer Grösse von etwa 14KB versendet werden können (Plattformspezifische Grenze). Detaillierte Infos finden sich im Forum {{Link2Forum|Topic=41583|LinkText=Fhem-Forum}}.&lt;br /&gt;
Es gibt dazu ein modifiziertes HTTPUtils-Modul, dass diese Beschränkung aufhebt und auch grosse Dateien übertragen kann.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;define notify_fhem_reload notify wetter:report set telebotdevice sendPhoto /opt/fhem/wetter.jpg&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Bei Erreichen des entsprechenden Status am wetter-Modul wird ein Image über telegram versendet. Hier sind lokale Pfade (relativ zu fhem) oder absolute Pfade wie oben möglich. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Kommandos auslösen ===&lt;br /&gt;
&lt;br /&gt;
Ein wichtiges Szenario ist die Möglichkeit Kommandos in Fhem ausführen zu können, ohne einen Zugang durch die Firewall einrichten zu müssen. Dazu ist die Definition eines Schlüsselwortes (Attribut: &amp;quot;cmdKeyword&amp;quot;)erforderlich, mit dem man die Nachrichten beginnen muss, damit der TelegramBot die Kommandos erkennt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;attr telebotdevice cmdKeyword doit&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Somit kann man dann durch Nachrichten die mit &amp;quot;doit&amp;quot; beginnen Kommandos an Fhem senden, die ähnlich wie im Kommandoeingabefeld von Fhemweb dann von Fhem ausgeführt werden. Das Ergebnis der Ausführung wird zurück an den Sender (und an den definierten defaultPeer) geschickt.&lt;br /&gt;
&lt;br /&gt;
Somit können nicht nur Aktionen angestossen werden, sondern auch Infos abgefragt werden.&lt;br /&gt;
&lt;br /&gt;
Beispiele&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;dofhem set schalter on&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;dofhem list telegrambot&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Randnotiz|RNTyp=Warn|RNText=Achtung: Bei den Kommandos sollten man unbedingt das Attribut &amp;quot;cmdRestrictedPeer&amp;quot; setzen, damit nicht jeder Kommandos auf dem Fhem-Server ausführen kann. Dazu sollten die Benutzerids der erlaubten Benutzer (durch Leerzeichen getrennt angeben). Da Benutzernamen selber vergeben werden und nicht unbedingt eindeutig sind, sollten hier auch NUR Benutzerids verwendet werden.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Favoriten für Kommandos anlegen ===&lt;br /&gt;
&lt;br /&gt;
Grundidee bei den Favoriten ist, dass man lange Befehle, die man haeufig braucht auf &amp;quot;Kurzwahl&amp;quot; legt.&lt;br /&gt;
&lt;br /&gt;
Beispiel-Kommandos wie z.B. &amp;lt;code&amp;gt;set TYPE=ROLLADEN pos 100&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;set TYPE=ROLLADEN pos 0&amp;lt;/code&amp;gt;, die man immer wieder braucht. Um nicht jedesmal dieses Kommando eintippen zu müssen auf dem Smartphone, kann man auch dafür Favoriten anlegen.&lt;br /&gt;
&lt;br /&gt;
Dazu gibt man erstmal die beiden Kommandos getrennt durch Semikolon im Attribut favorites an:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;attr telegrambotdevice favorites set TYPE=ROLLADEN pos 100;set TYPE=ROLLADEN pos 0&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Um die Favorites jetzt ausführen zu können braucht man noch ein Schlüsselwort dafür.&lt;br /&gt;
Nehhmen wir mal an man möchte die Favoriten mit &amp;lt;code&amp;gt;/short&amp;lt;/code&amp;gt; ausführen können. Dazu muss dann das Attribut &amp;quot;cmdFavorites&amp;quot; setzen&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;attr telegrambotdevice cmdFavorites /short&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wenn man nun im Telegram Client &lt;br /&gt;
&amp;lt;code&amp;gt;/short 1&amp;lt;/code&amp;gt; an den Bot schickt führt der Bot den ersten Favoriten aus und das Ergebnis der Ausführung wird zurückgeschickt.&lt;br /&gt;
&lt;br /&gt;
Ausserdem kann man im Telegram Client &lt;br /&gt;
&amp;lt;code&amp;gt;/short&amp;lt;/code&amp;gt; an den Bot schicken, dann antwortet der Bot mit&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Favorites&lt;br /&gt;
&lt;br /&gt;
1&lt;br /&gt;
set TYPE=ROLLADEN pos 100&lt;br /&gt;
2&lt;br /&gt;
set TYPE=ROLLADEN pos 0&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
* Github Repository für die Telegram-Fhem Entwicklung: https://github.com/viegener/Telegram-fhem&lt;br /&gt;
* Infos zum Telegram Botfather: https://core.telegram.org/bots#botfather&lt;br /&gt;
&lt;br /&gt;
* Source code für das 50_TelegramBot.pm-Modul: https://github.com/viegener/Telegram-fhem/blob/master/50_TelegramBot.pm&lt;br /&gt;
* Source code für das modifizierte HTTPUtils-Modul zur Übertragung grosser Bilder: https://github.com/viegener/Telegram-fhem/blob/master/HttpUtils.pm&lt;br /&gt;
&lt;br /&gt;
* Forum-Thread in dem das Modul vorgestellt wurde {{Link2Forum|Topic=38328|LinkText=Fhem-Forum}}&lt;br /&gt;
* Telegram messaging system https://telegram.org/&lt;br /&gt;
* TelegramBot API https://core.telegram.org/bots/api&lt;br /&gt;
&lt;br /&gt;
--[[Benutzer:Viegener|Viegener]] ([[Benutzer Diskussion:Viegener|Diskussion]]) 22:49, 11. Okt. 2015 (CEST)&lt;/div&gt;</summary>
		<author><name>Viegener</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=Benutzer:Viegener&amp;diff=12488</id>
		<title>Benutzer:Viegener</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=Benutzer:Viegener&amp;diff=12488"/>
		<updated>2015-10-11T18:46:33Z</updated>

		<summary type="html">&lt;p&gt;Viegener: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
; Erstmal nur ein Überblick über meine FHEM-Beteiligung&lt;br /&gt;
&lt;br /&gt;
== FHEM Benutzung ==&lt;br /&gt;
&lt;br /&gt;
Wunsch war die Zusammenführung der verschiedenen Funksysteme in einem zentralen System.&lt;br /&gt;
Ausdrücklich mit den Zielen&lt;br /&gt;
* Übergreifende Steuerungen und Makros zu ermöglichen&lt;br /&gt;
* Zentrale Bedienungsterminals (tablet)&lt;br /&gt;
* Steuerung von Aussen&lt;br /&gt;
* Am wichtigsten natürlich Spass am Basteln und Programmieren!!!&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
;Komponenten&lt;br /&gt;
* Somfy RTS Rolläden (Aktoren und Handfernbedienungen)&lt;br /&gt;
* FS20 Steckdosen&lt;br /&gt;
* Thermo/Hygro-Sensoren von LaCrosse und Technoline&lt;br /&gt;
* Mehrere Sonos-Komponenten&lt;br /&gt;
* Fritzbox&lt;br /&gt;
* Neu: Homematic&lt;br /&gt;
* Loewe Fernseher (dafür gibt es noch nichts)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
;Mein FHEM habe ich im Februar 2015 installiert.&lt;br /&gt;
* 03/2015 Umzug Raspberry Pi2&lt;br /&gt;
* 04/2015 Somfy-Einbindung&lt;br /&gt;
* 05/2015 FHEM Tablet UI &lt;br /&gt;
* 06/2015 Entwicklung eines Telegram Moduls für Benachrichtigungen und Kommandos (also bidirektional)&lt;br /&gt;
** Telegram ist frei, plattformübergreifend und erlaubt Gruppenchats&lt;br /&gt;
* 09/2015 Variante der Telegram-Anbindung mit dem  TelegramBot-Modul 50_TelegramBot&lt;br /&gt;
&lt;br /&gt;
== FHEM Development ==&lt;br /&gt;
&lt;br /&gt;
Aber klar, das macht ja den Spass aus. Gerne in C, C++, Perl, Java, Javascript und vielen anderen, die heute nicht mehr relevant sind&lt;br /&gt;
Wenns sein muss auch in CSS, HTML etc &lt;br /&gt;
&lt;br /&gt;
* [https://github.com/viegener/Telegram-fhem/blob/master/70_Telegram.pm 70_Telegram.pm]&lt;br /&gt;
* [https://github.com/viegener/Telegram-fhem/blob/master/50_TelegramBot.pm 50_TelegramBot.pm]&lt;br /&gt;
* Beiträge zu Somfy&lt;br /&gt;
** Somfy in FHEMDuino (Perl und C)&lt;br /&gt;
** 10_Somfy_PM - Umbau positionsbehandlung&lt;br /&gt;
* Beiträge zu FHEM Tablet UI&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== FHEMWiki ==&lt;br /&gt;
&lt;br /&gt;
;Bisher nur wenig&lt;br /&gt;
&lt;br /&gt;
* [[Telegram]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
;Was hätte mir geholfen und würde ich gerne schreiben&lt;br /&gt;
* Beschreibung der Perlfunktionen für Developer&lt;br /&gt;
** dev2array&lt;br /&gt;
** Log3 &lt;br /&gt;
** AttrVal&lt;br /&gt;
* Umgang mit timestamps und Zeitberechnungen&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Projekte und Ideen ==&lt;br /&gt;
&lt;br /&gt;
* Infrarot-Modul als Homematic Aktor (Selbstbau Arduino Nano / Funkmodul-RFM12B? / IR-LEDs&lt;br /&gt;
&lt;br /&gt;
* Klingeltaster-Modul mit RGB-LEDs und Arduino+Funk&lt;br /&gt;
&lt;br /&gt;
* grösseres (10 Zoll ?) Tablet als zentrale Bedienungskonsole&lt;br /&gt;
&lt;br /&gt;
* Quadcopter-Steuerung aus FHEM - Nein natürlich nicht, wofür auch?&lt;/div&gt;</summary>
		<author><name>Viegener</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=HttpUtils&amp;diff=12281</id>
		<title>HttpUtils</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=HttpUtils&amp;diff=12281"/>
		<updated>2015-09-28T10:55:51Z</updated>

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

		<summary type="html">&lt;p&gt;Viegener: Meine Seite&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
; Erstmal nur ein Überblick über meine FHEM-Beteiligung&lt;br /&gt;
&lt;br /&gt;
== FHEM Benutzung ==&lt;br /&gt;
&lt;br /&gt;
Wunsch war die Zusammenführung der verschiedenen Funksysteme in einem zentralen System.&lt;br /&gt;
Ausdrücklich mit den Zielen&lt;br /&gt;
* Übergreifende Steuerungen und Makros zu ermöglichen&lt;br /&gt;
* Zentrale Bedienungsterminals (tablet)&lt;br /&gt;
* Steuerung von Aussen&lt;br /&gt;
* Am wichtigsten natürlich Spass am Basteln und Programmieren!!!&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
;Komponenten&lt;br /&gt;
* Somfy RTS Rolläden (Aktoren und Handfernbedienungen)&lt;br /&gt;
* FS20 Steckdosen&lt;br /&gt;
* Thermo/Hygro-Sensoren von LaCrosse und Technoline&lt;br /&gt;
* Mehrere Sonos-Komponenten&lt;br /&gt;
* Fritzbox&lt;br /&gt;
* Neu: Homematic&lt;br /&gt;
* Loewe Fernseher (dafür gibt es noch nichts)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
;Mein FHEM habe ich im Februar 2015 installiert.&lt;br /&gt;
* 03/2015 Umzug Raspberry Pi2&lt;br /&gt;
* 04/2015 Somfy-Einbindung&lt;br /&gt;
* 05/2015 FHEM Tablet UI &lt;br /&gt;
* 06/2015 Entwicklung eines Telegram Moduls für Benachrichtigungen und Kommandos (also bidirektional)&lt;br /&gt;
** Telegram ist frei, plattformübergreifend und erlaubt Gruppenchats&lt;br /&gt;
&lt;br /&gt;
== FHEM Development ==&lt;br /&gt;
&lt;br /&gt;
Aber klar, das macht ja den Spass aus. Gerne in C, C++, Perl, Java, Javascript und vielen anderen, die heute nicht mehr relevant sind&lt;br /&gt;
Wenns sein muss auch in CSS, HTML etc &lt;br /&gt;
&lt;br /&gt;
* [https://github.com/viegener/Telegram-fhem/blob/master/70_Telegram.pm 70_Telegram.pm]&lt;br /&gt;
* Beiträge zu Somfy&lt;br /&gt;
** Somfy in FHEMDuino (Perl und C)&lt;br /&gt;
** 10_Somfy_PM - Umbau positionsbehandlung&lt;br /&gt;
* Beiträge zu FHEM Tablet UI&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== FHEMWiki ==&lt;br /&gt;
&lt;br /&gt;
;Bisher nur wenig&lt;br /&gt;
&lt;br /&gt;
* [[Telegram]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
;Was hätte mir geholfen und würde ich gerne schreiben&lt;br /&gt;
* Beschreibung der Perlfunktionen für Developer&lt;br /&gt;
** dev2array&lt;br /&gt;
** Log3 &lt;br /&gt;
** AttrVal&lt;br /&gt;
* Umgang mit timestamps und Zeitberechnungen&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Projekte und Ideen ==&lt;br /&gt;
&lt;br /&gt;
* Infrarot-Modul als Homematic Aktor (Selbstbau Arduino Nano / Funkmodul-RFM12B? / IR-LEDs&lt;br /&gt;
&lt;br /&gt;
* Klingeltaster-Modul mit RGB-LEDs und Arduino+Funk&lt;br /&gt;
&lt;br /&gt;
* grösseres (10 Zoll ?) Tablet als zentrale Bedienungskonsole&lt;br /&gt;
&lt;br /&gt;
* Energieverbrauchsüberwachung auch als Warnung für angebliebene Geräte&lt;br /&gt;
&lt;br /&gt;
* Quadcopter-Steuerung aus FHEM - Nein natürlich nicht, wofür auch?&lt;br /&gt;
&lt;br /&gt;
== Sonstiges / Links ==&lt;br /&gt;
&lt;br /&gt;
Fehlt noch&lt;/div&gt;</summary>
		<author><name>Viegener</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=Telegram_-_old_API_method&amp;diff=11780</id>
		<title>Telegram - old API method</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=Telegram_-_old_API_method&amp;diff=11780"/>
		<updated>2015-07-21T20:57:25Z</updated>

		<summary type="html">&lt;p&gt;Viegener: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Infobox Modul&lt;br /&gt;
|ModPurpose=Senden und Empfangen von Nachrichten (Text und Fotos) mit dem freien Messagingdienst Telegram&lt;br /&gt;
|ModType=x&lt;br /&gt;
|ModForumArea=Unterstützende Dienste&lt;br /&gt;
|ModFTopic=38328&lt;br /&gt;
|ModTechName=[https://github.com/viegener/Telegram-fhem/blob/master/70_Telegram.pm 70_Telegram.pm]&lt;br /&gt;
|ModOwner=[[Benutzer:Viegener|Viegener]] ({{Link2FU|12772|Forum}} / [[Benutzer Diskussion:Viegener|Wiki]])}}&lt;br /&gt;
&lt;br /&gt;
Das [[Telegram]]-Modul ermöglicht das Senden und Empfangen von Nachrichten über den Telegram-instant messaging Dienst (https://telegram.org/). &lt;br /&gt;
Es entsteht eine Möglichkeit Benachrichtungen aus Fhem zu versenden, zum Beispiel Alarmmeldungen.&lt;br /&gt;
Ausserdem können auch Kommandos über Telegram an Fhem gesendet werden um Steuerungsbefehle in Fhem auszulösen.&lt;br /&gt;
&lt;br /&gt;
Für den Betrieb des Telegram Moduls ist eine funktionsfähige Installation des inoffiziellen telegram command-line clients für Linux, &#039;&#039;telegram-cli&#039;&#039; (https://github.com/vysheng/tg), erforderlich.&lt;br /&gt;
&lt;br /&gt;
Für die Unterstützung von &#039;&#039;WhatsApp&#039;&#039; siehe Modul [[yowsup]].&lt;br /&gt;
&lt;br /&gt;
== Über Telegram Instant Messaging ==&lt;br /&gt;
Telegram-IDs und Versand/Empfang von Nachrichten sind kostenfrei. &lt;br /&gt;
Clients sind für gängige Smartphonesysteme erhältlich (iOS iPhone und Tablet, Android, Windows Phone) und &lt;br /&gt;
können auch aus dem WebBrowser verwendet werden. &lt;br /&gt;
Es gibt auch einen Kommandozeilen-Client für Linux, der die Grundlage dieses Moduls darstellt. &lt;br /&gt;
Mehrfachanmeldungen, auch parallel mit verschiedenen Geräten (z.B. Tablet und Smartphone), sind möglich.&lt;br /&gt;
Gruppenchats und Chats mit End-2-End-Verschlüsselung werden ebenfalls unterstützt.&lt;br /&gt;
&lt;br /&gt;
== Features ==&lt;br /&gt;
Unterstützt werden:&lt;br /&gt;
&lt;br /&gt;
* Versand von Textnachrichten an einen vordefinierten Kontakt (default peer)&lt;br /&gt;
* Versand von Textnachrichten an einen vordefinierten Kontakt als verschlüsselter Chat (secret chat)&lt;br /&gt;
* Versand von Bildern &lt;br /&gt;
* Empfang von Textnachrichten von beliebigen Kontakten&lt;br /&gt;
* Direkte Befehle an den telegram-client&lt;br /&gt;
&lt;br /&gt;
Eine detaillierte Beschreibung des Moduls ist im Fhem Forum in diesem  {{Link2Forum|Topic=38328|LinkText=Diskussionsthread}} zu finden, die jeweils aktuelle Version des Moduls ist im ersten Beitrag als Anhang verfügbar.&lt;br /&gt;
&lt;br /&gt;
== Hinweise zum Betrieb mit Fhem ==&lt;br /&gt;
{{Randnotiz|RNTyp=Warn|RNText=Achtung: telegram-cli wird momentan NICHT aus Fhem heraus gestartet, sondern muss separat gestartet werden. Ausserdem muss telegram-cli bereits angemeldet sein und entsprechende Kontakte müssen eingerichtet werden. Generell ist auch die Verwendung einer existierenden telegram, empfohlen wird aber die Verwendung einer getrennten ID, zum Beispiel für die eigene Festnetznummer.&lt;br /&gt;
&lt;br /&gt;
telegram-cli kann generell auch auf einem anderen Host betrieben werden, da die Kommunikation mit telegram-cli über Netzwerkprotokolle erfolgt.&lt;br /&gt;
}}&lt;br /&gt;
Das Telegram-Modul basiert auf einem im Hintergrund laufenden telegram-cli (https://github.com/vysheng/tg).&lt;br /&gt;
&lt;br /&gt;
Informationen zu Einrichtung und Betrieb von telegram-cli finden sich im Readme in obigem Repository.&lt;br /&gt;
Weitere Informationen finden sich auch im Wiki des github Repositories: https://github.com/vysheng/tg/wiki&lt;br /&gt;
&lt;br /&gt;
Hinweise zum Start von telegram-cli mit fhem finden sich in der Commandref / Doku zum Modul.&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
* Source code für das 70_Telegram.pm-Modul: https://github.com/viegener/Telegram-fhem&lt;br /&gt;
* Forum-Thread in dem das Modul vorgestellt wurde {{Link2Forum|Topic=38328|LinkText=Fhem-Forum}}&lt;br /&gt;
* Repository mit telegram-cli https://github.com/vysheng/tg&lt;br /&gt;
* Telegram messaging system https://telegram.org/&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Other Components]]&lt;/div&gt;</summary>
		<author><name>Viegener</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=Telegram_-_old_API_method&amp;diff=11620</id>
		<title>Telegram - old API method</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=Telegram_-_old_API_method&amp;diff=11620"/>
		<updated>2015-07-07T22:35:04Z</updated>

		<summary type="html">&lt;p&gt;Viegener: Erste Version zum Telegram Modul&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Infobox Modul&lt;br /&gt;
|ModPurpose=Senden und Empfangen von Nachrichten (Text und Fotos) mit dem freien Messagingdienst Telegram&lt;br /&gt;
|ModType=x&lt;br /&gt;
|ModCmdRef= ---- noch nicht Teil von FHEM ----&lt;br /&gt;
|ModForumArea=Unterstützende Dienste&lt;br /&gt;
|ModTechName=[https://github.com/viegener/Telegram-fhem/blob/master/70_Telegram.pm 70_Telegram.pm]&lt;br /&gt;
|ModOwner=viegener ([http://forum.fhem.de/index.php/topic,38328.0.html] / [[Benutzer Diskussion:Viegener|Wiki]])}}&lt;br /&gt;
&lt;br /&gt;
Das [[Telegram]]-Modul ermöglicht das Senden und Empfangen von Nachrichten über den Telegram-instant messaging Dienst (https://telegram.org/). &lt;br /&gt;
Es entsteht eine Möglichkeit Benachrichtungen aus fhem zu versenden, zum Beispiel Alarmmeldungen.&lt;br /&gt;
Ausserdem können auch Kommandos über Telegram an fhem gesendet werden um Steuerungsbefehle in fhem auszulösen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt;Für den Betrieb des Telegram Moduls ist eine funktionsfähige Installation des inoffiziellen telegram command-line clients für Linux telegram-cli (https://github.com/vysheng/tg) erforderlich&amp;lt;/u&amp;gt; &lt;br /&gt;
&lt;br /&gt;
== Über Telegram Instant Messaging ==&lt;br /&gt;
&lt;br /&gt;
Telegram-IDs und Versand/Empfang von Nachrichten ist kostenfrei. &lt;br /&gt;
Clients sind für gängige Smartphonesysteme erhältlich (iOS iPhone und Tablet, Android, Windows Phone) und &lt;br /&gt;
können auch aus dem WebBrowser verwendet werden. &lt;br /&gt;
Es gibt auch einen Kommandozeilen-Client für Linux, der die Grundlage dieses Moduls darstellt&lt;br /&gt;
Mehrfachanmeldungen auch parallel mit verschiedenen Geräten (z.B. tablet und smartphone) sind möglich.&lt;br /&gt;
Gruppenchats und Chats mit End-2-End-Verschlüsselung werden ebenfalls unterstützt.&lt;br /&gt;
&lt;br /&gt;
== Features ==&lt;br /&gt;
&lt;br /&gt;
Unterstützt werden&lt;br /&gt;
&lt;br /&gt;
* Versand von Textnachrichten an einen vordefinierten Kontakt (default peer)&lt;br /&gt;
* Versand von Textnachrichten an einen vordefinierten Kontakt als verschlüsselter Chat (secret chat)&lt;br /&gt;
* Versand von Bildern &lt;br /&gt;
* Empfang von Textnachrichten von beliebigen Kontakten&lt;br /&gt;
* Direkte Befehle an den telegram-client&lt;br /&gt;
&lt;br /&gt;
Eine detaillierte Beschreibung des Moduls ist in der Diskussion&lt;br /&gt;
Thread im {{Link2Forum|Topic=24519|LinkText=Fhem-Forum}} mit der jeweils aktuellen Version des Moduls als Anhang im ersten Beitrag.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Hinweise zum Betrieb mit Fhem ==&lt;br /&gt;
&lt;br /&gt;
Das Telegram-Modul basiert auf einem im Hintergrund laufenden telegram-cli (https://github.com/vysheng/tg)&lt;br /&gt;
&lt;br /&gt;
Informationen zur Einrichtung und Betrieb von telegram-cli finden sich im Readme in obigem Repository.&lt;br /&gt;
Weitere Infos finden sich auch im wiki des github Repositories: https://github.com/vysheng/tg/wiki&lt;br /&gt;
&lt;br /&gt;
Hinweise zum Start von telegram-cli mit fhem finden sich in der Commandref / Doku zum Modul.&lt;br /&gt;
&lt;br /&gt;
{{Randnotiz|RNTyp=Info|RNText=Achtung: telegram-cli wird momentan NICHT aus fhem herausgestartet, sondern muss separat gestartet werden. &lt;br /&gt;
Ausserdem muss telegram-cli bereits angemeldet sein und entsprechende Kontakte müssen eingerichtet werden.&lt;br /&gt;
Generell ist auch die Verwendung einer existierenden telegram, empfohlen wird aber die Verwendung einer getrennten ID, &lt;br /&gt;
zum Beispiel für die eigene Festnetznummer.&lt;br /&gt;
&lt;br /&gt;
telegram-cli kann generell auch auf einem anderen host betrieben werden, da die Kommunikation mit telegram-cli über Netzwerkprotokolle erfolgt.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Weblinks ==&lt;br /&gt;
* Source code für das 70_Telegram.pm-Modul : https://github.com/viegener/Telegram-fhem&lt;br /&gt;
* Forum-Thread in dem das Modul vorgestellt wurde {{Link2Forum|Topic=24519|LinkText=Fhem-Forum}}&lt;br /&gt;
* Repository mit telegram-cli https://github.com/vysheng/tg&lt;br /&gt;
* Telegram messaging system https://telegram.org/&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Other Components]]&lt;/div&gt;</summary>
		<author><name>Viegener</name></author>
	</entry>
</feed>