<?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=Hartenthaler</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=Hartenthaler"/>
	<link rel="alternate" type="text/html" href="http://wiki.fhem.de/wiki/Spezial:Beitr%C3%A4ge/Hartenthaler"/>
	<updated>2026-04-10T03:50:14Z</updated>
	<subtitle>Benutzerbeiträge</subtitle>
	<generator>MediaWiki 1.43.6</generator>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=TelegramBot&amp;diff=21102</id>
		<title>TelegramBot</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=TelegramBot&amp;diff=21102"/>
		<updated>2017-04-01T16:39:53Z</updated>

		<summary type="html">&lt;p&gt;Hartenthaler: /* Versand von SVG-Plots */ Umstellung auf cmdSend statt TelegramBot_ExecuteCommand&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;
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;
&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>Hartenthaler</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=DoorPi_und_FHEM&amp;diff=20273</id>
		<title>DoorPi und FHEM</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=DoorPi_und_FHEM&amp;diff=20273"/>
		<updated>2017-02-24T22:33:48Z</updated>

		<summary type="html">&lt;p&gt;Hartenthaler: /* Audio-Subsystem */ 3 x typo korrigiert&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{&lt;br /&gt;
Infobox Modul&lt;br /&gt;
|ModPurpose=Das Modul verknüpft eine IP-Türsprechstelle aus dem DoorPi-Projekt mit FHEM.&lt;br /&gt;
|ModType=h&lt;br /&gt;
&amp;lt;!-- |ModCategory= (noch?) nicht verwendet --&amp;gt;&lt;br /&gt;
|ModCmdRef=DoorPi&lt;br /&gt;
|ModForumArea=Automatisierung&lt;br /&gt;
|ModTechName=70_DoorPi.pm&lt;br /&gt;
|ModOwner=Prof. Dr. Peter A. Henning&lt;br /&gt;
}}&lt;br /&gt;
Auf dieser Seite wird beschrieben, wie man mit Hilfe der [https://www.doorpi.org/forum/ DoorPi-Software] auf Basis eines Raspberry Pi eine &#039;&#039;&#039;IP-Türsprechstelle&#039;&#039;&#039; baut und in FHEM integriert.&lt;br /&gt;
&lt;br /&gt;
Weitere Bestandteile des Gesamtsystems sind ein &#039;&#039;&#039;Garagentoröffner&#039;&#039;&#039; und eine &#039;&#039;&#039;Hoftür mit selbstverriegelndem Panikschloss&#039;&#039;&#039;. Zur Beschreibung  der beiden letztgenannten Teilprojekte verweise ich auf das Buch [https://www.dpunkt.de/buecher/12387/9783960090120-smarthome-hacks.html Smart Home Hacks].&lt;br /&gt;
&lt;br /&gt;
[[File:Doorpi_all_s.png]]&lt;br /&gt;
&lt;br /&gt;
=Funktion=&lt;br /&gt;
Die Software DoorPi läuft auf einem Raspberry Pi und stellt einen IP-Phone Client zur Verfügung, der in eine IP-Haustelefonanlage (z.B. mit der FritzBox) eingebunden werden kann. Diesen Raspberry Pi könnte man zwar über längere Audiokabel mit der notwendigen Lautsprecher-Mikrofon-Kombination verbinden, das ist allerdings etwas anfällig für Störsignale. Die meisten Anwender von DoorPi wählen deshalb den Einbau des Raspberry Pi direkt an der Türsprechstelle. Aus Sicht des Autors stellt das eine Sicherheitslücke dar - weil ein direkter Zugang ins Heimnetz außerhalb der eigenen vier Wände geschaffen würde.&lt;br /&gt;
&lt;br /&gt;
Hier soll deshalb eine abgesetzte Installation beschrieben werden: Außen an der Türsprechstelle sitzen nur Sensoren, Audiohardware und ein Display, angesteuert von einem &amp;quot;dummen&amp;quot; Arduino Mikrocontroller. Ins Innere des Hauses führen drei Kabel:&lt;br /&gt;
*Ein USB-Kabel zur digitalen Ankopplung der Audio-Hardware an den Raspberry Pi&lt;br /&gt;
*Ein HDMI-Kabel zur digitalen Ankopplung einer Kamera an den Raspberry Pi&lt;br /&gt;
*Ein 8-adriges Kabel zur Weiterleitung verschiedener Signale an den Raspberry Pi. Hierfür kann man aus Bequemlichkeitsgründen ein Netzwerk-Patchkabel verwenden - hochfrequente Signale gehen allerdings nicht über diesen Weg.&lt;br /&gt;
&lt;br /&gt;
[[File:Doorpi_block.png]][[File:doorpi_completes.png]][[File:doorpi_completeb.png]]&lt;br /&gt;
&lt;br /&gt;
==Klingel und Türsprechstelle==&lt;br /&gt;
Beim Drücken auf den Klingelknopf wird ein IP-Telefonanruf gestartet - entweder bei einer internen Nummer, oder (per Mausklick auswählbar in FHEM) bei einer beliebigen anderen Nummer. Wenn der Empfänger den Ruf annimmt, kann er mit dem Besucher sprechen und ggf. durch das Drücken einer Taste die Tür öffnen. Es ist in der DoorPi-Installation problemlos konfigurierbar, beliebige andere Aktionen zu starten - z.B. könnte man dem Paketlieferanten nur das Gartentor öffnen.&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
| [[File:Pizzabote.jpg |200px]]&lt;br /&gt;
| [[File:Dhlbote.jpg |200px]]&lt;br /&gt;
| Während des Klingelvorgangs wird eine Infrarot-Lichtquelle eingeschaltet und mit einem Weitwinkelobjektiv eine Aufnahme des Besuchers angefertigt. Diese IR-Beleuchtung soll nicht die ganze Szene ausleuchten - sondern verhindern, dass man das Gesicht des Besuchers auf Grund einer hinter ihm befindlichen Beleuchtung mit sichtbarem Licht nicht gut erkennen kann. Die Infrarotempfindlichkeit der Kamera sorgt bei Tageslicht für einen Rotstich des Bildes. Lichtbrechung durch den Kameradom sorgt dafür, dass man außen um das Bild herum einen leuchtenden Ring mit 8 Segmenten erkennt.&lt;br /&gt;
&lt;br /&gt;
Die URL dieses Schnappschusses wird ferner im DoorPi-Device als Reading &#039;&#039;&#039;snapshot&#039;&#039;&#039; angezeigt, sowie ein Event &#039;&#039;&#039;&amp;lt;DoorPi-Device&amp;gt; snapshot: URL&#039;&#039;&#039; ausgelöst, mit dem man weitere Aktionen triggern kann. Beispielsweise wird eine Push-Nachricht an ein Tablet gesendet, das den Klingelnden für eine Minute als Bild anzeigt.&lt;br /&gt;
|} &lt;br /&gt;
&lt;br /&gt;
Das Gespräch wird als WAV-Datei ebenfalls aufgezeichnet, diese ist ebenso wie die Bilddatei aus dem FHEM-Frontend abrufbar.&lt;br /&gt;
&lt;br /&gt;
==Türöffnung==&lt;br /&gt;
Das System verfügt über einen iButton-Reader. Legt man einen iButton auf, der in der Arduino-Software codiert ist, leuchtet eine im Reader integrierte Tricolor-LED in einer entsprechenden Farbe auf (z.B. roter iButton-Halter =&amp;gt; rote LED). Der weitere Ablauf hängt vom Schließzustand der Haustür ab.&lt;br /&gt;
*Ist die Haustür nur zugezogen und nicht abgeschlossen (Zustand &#039;&#039;&#039;hardlock=off&#039;&#039;&#039;), wird sie geöffnet. Gleichzeitig wird über die Türsprechstelle die Stimmnachricht ausgegeben &amp;quot;Willkommen zu Hause !&amp;quot;, und auf einem im Haus befindlichen Tablet angesagt &amp;quot;Ein Bewohner betritt das Haus.&amp;quot;&lt;br /&gt;
*Ist die Haustür abgeschlossen (Zustand &#039;&#039;&#039;hardlock=on&#039;&#039;&#039;), wird zunächst auf dem Touchscreen des Systems statt der Namen eine virtuelle Tastatur angezeigt. Hier kann ggf. noch die akustische Bitte eingebaut werden, eine fünfstellige PIN einzugeben. Der Fortschritt bei der Eingabe wird durch einen Balken angezeigt.&lt;br /&gt;
**Ist die PIN falsch, geht das System wieder in den Ausgangszustand zurück, es wird eine Warnungsmeldung an das interne FHEM-System übermittelt.&lt;br /&gt;
**Ist die PIN korrekt, wird zunächst der Entriegelungsvorgang der Tür eingeleitet. Je nach verwendetem System kann das eine Weile dauern - Keymatic ist hierfür ein Beispiel, das können durchaus 3-4 Sekunden werden. Danach wird die Tür geöffnet, gleichzeitig wird über die Türsprechstelle die Stimmnachricht ausgegeben &amp;quot;Willkommen zu Hause !&amp;quot;, und auf einem im Haus befindlichen Tablet angesagt &amp;quot;Ein Bewohner betritt das Haus.&amp;quot; Je nach Konfiguration kann FHEM an dieser Stelle auch weitere Aktionen auslösen - etwa weitere Entriegelungsvorgänge starten.&lt;br /&gt;
&lt;br /&gt;
==Verwendung des Hausschlüssels==&lt;br /&gt;
*Verriegelt man die Haustür mit einem gewöhnlichen mechanischen Schlüssel, teilt dies die Keymatic dem FHEM-System mit (Zustand &#039;&#039;&#039;hardlock=on&#039;&#039;&#039;), das FHEM-System informiert den DoorPi-Rechner. &lt;br /&gt;
*Entriegelt man die Haustür mit einem gewöhnlichen mechanischen Schlüssel, teilt dies die Keymatic dem FHEM-System mit (Zustand &#039;&#039;&#039;hardlock=off&#039;&#039;&#039;), das FHEM-System informiert den DoorPi-Rechner. &lt;br /&gt;
&lt;br /&gt;
==Fernbedienung==&lt;br /&gt;
Alle Funktionen, z.B. die Ent- und Verriegelung und das Türöffnen sind selbstverständlich auch über FHEM (und damit über ein Funksystem, im konkreten Fall über HomeMatic) steuerbar.&lt;br /&gt;
&lt;br /&gt;
==Videostream==&lt;br /&gt;
Auf dem Raspberry Pi ist auch die Software mjpeg_streamer installiert, Per Mausklick in der FHEM-Oberfläche wird mjpeg-streamer gestartet und gestoppt (das wird von der DoorPi-Software erledigt, die einen bestimmten virtuellen Tastendruck erkennt und dann lokal ein Skript startet), und stellt dann an TCP-Port 9000 einen Videostream bereit. Wer möchte, kann das System auch so konfigurieren, dass es diesen Videostream zusammen mit dem Audiostream zur Videotelefonie verwendet.&lt;br /&gt;
&lt;br /&gt;
==Bewegungserkennung und Helligkeitsmessung==&lt;br /&gt;
Erkennt das System durch den eingebauten PIR-Bewegungsmelder eine Bewegung, wird&lt;br /&gt;
*die Anzeigehelligkeit für mindestens eine Minute hochgefahren&lt;br /&gt;
*ein Signal an FHEM gesendet.&lt;br /&gt;
Wenn eine Minute keine Bewegung erkannt wurde, geht die Anzeigehelligkeit (d.h. vom Display und dem LED-Rimng um den Klingelknopf) wieder auf einen Wert zurück, der durch die externe Helligkeit bestimmt ist.&lt;br /&gt;
&lt;br /&gt;
Der Bewegungsmelder ist so geschaltet, dass er innerhalb von ca. 1 Minute (tatsächlich sind es mit der unten geposteten Schaltung 47 Sekunden), gerechnet von der letzten erkannten Bewegung, keine neuen Bewegungsmeldungen weiterleitet - sondern die Zeitdauer einfach verlängert (retriggerbares Monoflop).&lt;br /&gt;
&lt;br /&gt;
=Hardware=&lt;br /&gt;
==Arbeitsaufwand und Kosten==&lt;br /&gt;
In der Zeit von Juni – September 2016 habe ich ca. 150 Arbeitsstunden für Konzeption, Prototyp und Programmierung sowie die Endmontage aufgewandt. Auf Grund der Tatsache, dass sowohl meine 3D-Druckdateien, als auch die Programmbestandteile hier frei verfügbar sind, kann man das sicher in weniger als der halben Zeit nachbauen.&lt;br /&gt;
&lt;br /&gt;
Die reinen Materialkosten betragen etwa 450 €, davon ca. 100 € für einen Raspberry Pi 3 mit Zubehör und Zusatzplatine PiFace 2, ca. 70 € für das Infrarot-Kamerasystem, ca. 40 € für das reine Audio-System, ca. 50 € für Bewegungsmelder, Helligkeitssensor und beleuchteten Klingelknopf. Der zusätzliche Controller vom Typ Arduino Micro und der angeschlossene iButton-Leser schlagen mit insgesamt 20 € zu Buche, das Nextion-Touchscreen mit ca. 30 €. Teuerstes Einzelstück war eine nach Maß gefräste und gebohrte Frontplatte mit ca. 100 €, entsprechende Wandeinbaugehäuse gibt es ab ca. 20 €. Da das Gesamtsystem modular aufgebaut ist, und Komponenten auch in ganz unterschiedlichen Qualitäten verwendet worden sind, kann man eine &#039;&#039;abgespeckte&#039;&#039;  Version auch schon für ca. 200 € realisieren.&lt;br /&gt;
==Raspberry Pi==&lt;br /&gt;
Verwendet wird &lt;br /&gt;
* ein [http://www.pollin.de/shop/dt/OTQxNzkyOTk-/Bauelemente_Bauteile/Entwicklerboards/Raspberry_Pi/Raspberry_Pi_3_Modell_B.html Raspberry Pi 3], der ein integriertes WLAN-Modul besitzt. Falls man seiner eigenen WLAN-Bandbreite nicht traut: Für ca. 25 € bekommt man einen Satz Powerline-Adapter, mit denen man eine sehr stabile Verbindung zwischen dem Raspberry Pi (Innenwand nmeben der Tür) und dem Rest des Hauses aufbauen kann.&lt;br /&gt;
* eine Zusatzkarte [http://www.pollin.de/shop/dt/NTc1NzkyOTk-/Bauelemente_Bauteile/Entwicklerboards/Raspberry_Pi/Raspberry_Pi_B_Zusatzplatine_PIFACE_DIGITAL_2.html PiFace 2], mit je 8 digitalen Ein- und Ausgängen.&lt;br /&gt;
* ein klares [http://www.reichelt.de/CB-RPF-P-CLR/3/index.html?&amp;amp;ACTION=3&amp;amp;LA=446&amp;amp;ARTICLE=160959 Gehäuse], das die Erweiterungskarte mit aufnehmen kann.&lt;br /&gt;
&lt;br /&gt;
Das Gehäuse mit Raspberry Pi, ein Netzschalter, ein 5V Netzteil und ein Powerline-Adapter wurden in ein kompaktes Hutschienengehäude montiert, das durch einen Mauerdurchbruch (ca. 3cm Durchmesser wegen der HDMI-Stecker, siehe dort) mit der außenliegenden Türsprechstelle verbunden ist.&lt;br /&gt;
&lt;br /&gt;
==Kamera-Subsystem==&lt;br /&gt;
Verwendet werden hierfür&lt;br /&gt;
* eine Standard-NoIR-Kamera für den Raspberry Pi (ohne Infrarotfilter, somit IR-empfindlich, z.B. erhältlich [http://www.elv.de/raspberry-pi-noir-kamera-modul.html hier])&lt;br /&gt;
* ein Fisheye 180° zum Aufclippen auf Smartphones. Die untenstehenden Stereo-Litografie-Dateien sind für das [http://www.elv.de/bresser-handy-kameraaufsatz-clip-on-180-fisheye-handylinse.html Objektiv von Bresser] entworfen worden, auch erhältlich [https://www.conrad.de/de/smartphone-fish-eye-objektiv-bresser-optik-clip-on-180-fisheye-1359363.html hier].&lt;br /&gt;
* eine [http://www.ebay.de/itm/321915955373?_trksid=p2057872.m2749.l2649 Acrylglaskuppel] 2 Zoll (Achtung, der Durchmesser beträgt 49,5 mm).&lt;br /&gt;
* eine [https://www.tindie.com/products/freto/pi-camera-hdmi-cable-extension/ Kabelverlängerung] Flatribbon &amp;lt;-&amp;gt; HDMI &amp;lt;-&amp;gt; Flatribbon. &lt;br /&gt;
** Tipp: HDMI-Stecker sind ziemlich dick und passen eher schlecht durch enge Kabelkanäle. Hat man dieses Problem, kann man noch an einer Seite einen [http://www.conrad.biz/ce/de/product/1171399/HDMI-Adapter-1x-HDMI-Stecker-1x-HDMI-Buchse-C-mini-vergoldete-Steckkontakte-Schwarz-SpeaKa-Professional Adapter] HDMI &amp;lt;-&amp;gt; Mini-HDMI einsetzen und ein entsprechendes Kabel mit deutlich dünnerem Mini-HDMI-Stecker vewenden.&lt;br /&gt;
* ein Kameradom aus dem 3D-Drucker mit genauer Passung für das Fisheye vorne und die Kamera hinten, sowie Passungen für 8 LED. Die STL-Datei für diesen Kameradom findet man hier: [https://tinkercad.com/things/jv5x6lrihbk PiCameraDome4]&lt;br /&gt;
* eine Rückseite des Kameradoms aus dem 3D-Drucker, wird hinten mittig aufgeklebt und hält den Deckel des Kamerasystem durch drei Nippel. Die STL-Datei dafür findet man hier  [https://tinkercad.com/things/cV6rkY6DWvc PiCameraDome4addendum]&lt;br /&gt;
* ein Deckel des Kameradoms aus dem 3D-Drucker, wird auf die Rückseite aufgesteckt und beinhaltet zwei Halterungen für Mikrofone (die &amp;quot;Ohren&amp;quot; im Bild). Die STL-Datei dafür findet man hier [https://tinkercad.com/things/8X0fhiSTyXk PiCameraDome4back]&lt;br /&gt;
* 9 x IR-LED [http://www.conrad.biz/ce/de/product/171140/IR-Emitter-940-nm-17-5-mm-radial-bedrahtet-Vishay-TSAL-6200 TSAL 6200] mit hoher Leistung &lt;br /&gt;
* 3 Widerstände 10 Ohm 0,2 W.&lt;br /&gt;
&lt;br /&gt;
[[File:Dome1.jpg|400x300px]][[File:Dome2.jpg|400x300px]][[File:Doorpi_dome3s.jpg|400x300px]][[File:Doorpi_dome4s.jpg|600x300px]]&lt;br /&gt;
&lt;br /&gt;
Zur Montage werden vier M2-Gewindebolzen in die hintere Aussparung des Kameradoms eingeklebt, und auf diese mit entsprechenden Abstandshaltern und Muttern sowohl die Kamera, als auch die eine Hälfte der Kabelverlängerung geschraubt. Dabei empfiehlt es sich, die LED vorher an Ort und Stelle zu haben - ggf.  muss bei ungünstiger Klebung der Gewindebolzen bei den Eck-LED ein Gehäusevorsprung etwas abgefeilt werden.&lt;br /&gt;
&lt;br /&gt;
Die Schaltung der LED für dem Betrieb an einer Spannung von 5V ausgelegt - damit fließen durch drei in Reihe geschaltete LED und einen 10 Ohm-Widerstand ziemlich genau 100mA. Bei der Schaltung über einen MOSFET ist das etwas weniger, wegen des Drain-Source-Widerstandes des MOSFET, reicht aber für die notwendige Helligkeit aus. Aus Symmetriegründen werden drei solche Stränge (insgesamt 9 LED) montiert - aber nur 8 davon sind bei dem angegebenen Kameradom nach außen gerichtet (wer möchte, kann gerne ein 3D-Design mit 9 Löchern erstellen), eine LED zeigt also nutzlos nach innen (erkennbar im 3. Bild der obigen Reihe).&lt;br /&gt;
&lt;br /&gt;
Das Fischaugenobjektiv wird mit wenig (!) klarem Silikon in die vordere Öffnung des Kameradoms geklebt, der rückwärtige Aufsatz mit den 3 Nippeln mit Zweikomponentenkleber auf der Rückseite des Kameradoms befestigt. Dabei zur Ausrichtung den Mikrofonhalter (rechtes Bild, mit den &amp;quot;Ohren&amp;quot;) probeweise aufstecken.&lt;br /&gt;
&lt;br /&gt;
Die Acrylglaskuppel wird mit Silikon oder einem äquivalenten Dichtmaterial wasserdicht in die Frontplatte eingesetzt, auf diese dann von hinten der Kameradom. Eine staubdichte Verbindung erfordert auch hier die Abdichtung mit Silikon. Für den Fall einer möglichen Demontage empfiehlt es sich, diese Abdichtung nicht als Klebung zu verwenden, sondern als umlaufenden Rand nachträglich aufzubringen - der ist dann einfach mit einem Cutter zu entfernen.&lt;br /&gt;
&lt;br /&gt;
==Audio-Subsystem==&lt;br /&gt;
*Als Sound&amp;quot;karte&amp;quot; wird mit dem [https://www.amazon.de/gp/product/B005BYCBO8 BIGtec 7.1 USB Adapter] ein preiswertes Produkt verwendet, dessen Gehäuse sich problemlos entfernen lässt. Weitere Modelle werden im oben zitierten DoorPi-Forum empfohlen.&lt;br /&gt;
*Der Audioverstärker ist ein Modell von [https://www.amazon.de/gp/product/B00UAA7NH8 Foxnovo] mit einer Ausgangsleistung von 2x3 W. Auch hierfür können nahezu beliebige andere Modelle verwendet werden&lt;br /&gt;
*Als Lautsprecher kommen zwei [https://www.reichelt.de/VIS-K28-40-8/3/index.html?&amp;amp;ACTION=3&amp;amp;LA=446&amp;amp;ARTICLE=145413&amp;amp;artnr=VIS+K28.40-8&amp;amp;SEARCH=kleinlautsprecher VISATON Kleinlautsprecher VIS K28.40-8] mit den Maßen 2,8 x 4 cm und einer Impedanz von 8 Ohm zum Einsatz. Zwischen Lautsprecher und Frontplatte ist ein Lautsprechervlies angebracht - damit ergibt sich ein effektiver Spritzwasserschutz, allerdings keine vollständige Abdichtung gegen Feuchtigkeit. Betriebserfahrungen liegen noch nicht vor ! &lt;br /&gt;
*Als Mikrofon können nahezu beliebige preiswerte [https://www.amazon.de/gp/product/B000WGW96K Mikrofonkapseln] für Sprachqualität verwendet werden. Bei diesen handelt es in der Regel um Kristallmikrofone, die einen ausreichenden Spannungspegel für den Audioverstärker erzeugen. Wichtig ist die gute akustische Entkopplung von Lautsprechern und Mikrofonen - darum werden die Lautsprecher fest auf die Frontplatte geschraubt, die Mikrofone aber in den Halter am Kameradom von hinten eingeschoben. Eine Fixierung der Mikrofone mit dem bereits vorher verwendeten Silikon ist empfehlenswert, ebenso eine Vliesschicht zwischen Mikrofon und Frontplatte.&lt;br /&gt;
&lt;br /&gt;
Steckkontakte aller Art sind bei Installationen im Außenbereich immer ein Risiko. Für das gegenwärtige Projekt wurden deshalb das Gehäuse der Sound&amp;quot;karte&amp;quot; und die enthaltenen 3,5 mm Klinkenbuchsen entfernt. Zwei Mikrofonkabel wurden direkt angelötet, die Ausgänge per Draht mit der Verstärkerplatine verbunden, deren Ausgänge wiederum mit Schraubklemmen versehen. Etwas Zweikomponentenkleber macht daraus eine kompakte Einheit, die oberhalb des Displays auf einer Lochrasterplatte befestigt und per USB-Kabel mit dem Raspberry Pi verbunden wird.&lt;br /&gt;
&lt;br /&gt;
Der verwendete Verstärker hat einen Schalteingang (weißes Kabel im Bild) - wird dieser auf Low=GND gesetzt, ist der Verstärker ausgeschaltet und verbraucht keinen Strom. Dieser Schalteingang wird auf den Ausgang DLA der Arduino-Platine geführt.&lt;br /&gt;
&lt;br /&gt;
[[File:doorpi_audios.jpg|800x300px]]&lt;br /&gt;
&lt;br /&gt;
==Sensoren==&lt;br /&gt;
* Der [http://www.elv.de/bewegungsmeldermodul-pir-13.html PIR-Bewegungsmelder] ist ein sehr kleines Modul, das einfach von hinten in eine Bohrung der Frontplatte gesteckt wird. Sein Open-Collector-Ausgang muss noch mit einem retriggerbaren Monoflop = Timer versehen werden. Damit ist sichergestellt, dass erneute Triggervorgänge nicht neue Events in Doorpi bzw. FHEM auslösen. Hierfür gibt es zwei Möglichkeiten:&lt;br /&gt;
** Bausatz PIR13TM, seit kurzem erhältlich bei ELV. Kleine Zusatzplatine, die auf das Bewegungsmeldermodul aufgesteckt wird.&lt;br /&gt;
** Eigenbau auf Basis des LM555, siehe Schaltplan unten. Innerhalb einer Zeit von ca. 50 Sekunden (bestimmt durch R8 und C2) wird kein neuer Impuls ausgelöst. Der Ausgang des LM555 wird durch einen MOSFET invertiert und dann über eine der unbenutzten Adern (blau im Bild) des HDMI-Kabels an den Raspberry Pi weitergeleitet. Achtung: Dieses Monoflop sitzt auf einer kleinen Zusatzplatine, die im rechten unteren Bild noch nicht aufgesteckt ist.&lt;br /&gt;
* Ein Fototransistor wird mit zwei festen und einem einstellbaren Widerstand als Helligkeitssensor verwendet. Seine Ausgangsspannung wird an den Arduino weitergeleitet, der auf Grund dieses Wertes das Display und den LED-Ring des Klingelknopfes dimmt.&lt;br /&gt;
* Als [https://www.amazon.de/gp/product/B01DKTHDXE​ Klingelknopf] wird ein Modell aus Edelstahl mit umlaufendem LED-Ring verwendet. &lt;br /&gt;
* Ein Mikroschalter dient als Sabotagekontakt, der so in die Rückwandinstallation geklebt wird, dass er bei der Abnahme der Frontplatte geschlossen wird. Dieses Signal wird über eine der unbenutzten Adern des HDMI-Kabels (orange im Bild) an den Raspberry Pi weitergeleitet.&lt;br /&gt;
&lt;br /&gt;
[[File:DoorPi_part1.png|500x350px]][[File:DoorPi_part2a.png|500x350px]][[File:doorpi_sensorss.jpg|800x350px]]&lt;br /&gt;
&lt;br /&gt;
==Arduino==&lt;br /&gt;
Verwendet wird ein Arduino Micro mit dem Programm (Sketch in der Arduino-Terminologie), das [[#Arduino_2|weiter unten]] veröffentlicht ist. Der Arduino sitzt in einer Fassung auf einer Lochrasterplatte, die hinter dem Nextion-Display befestigt ist.&lt;br /&gt;
&lt;br /&gt;
Hauptaufgabe des Arduino ist, in dem iButton-Reader einen Abfragezyklus von 250 ms durchzuführen. Solche hohen Abfrageraten können in der Regel mit Busmastern, die von einer universellen 1-Wire Software wie [[OWX]] oder OWFS angesteuert werden, nicht realisiert werden. Im vorliegenden Projekt übernimmt der Arduino auch die Steuerung des Nextion-Displays über eine seiner seriellen Schnittstellen.&lt;br /&gt;
&lt;br /&gt;
==Nextion-Subsystem==&lt;br /&gt;
Als interaktives Namensschild wird ein&lt;br /&gt;
[http://wiki.iteadstudio.com/Nextion_HMI_Solution Nextion Display] 3,2&amp;quot; mit einer Auflösung von 400x240 Pixel verwendet (erhältlich in [http://www.aliexpress.com/item/3-2-TFT-480x240-resistive-touch-screen-display-Nextion-3-2-HMI-LCD-Display-Module-TFT/32443541471.html China] oder in [http://www.komputer.de/zen/index.php?main_page=product_info&amp;amp;cPath=30&amp;amp;products_id=354&amp;amp;zenid=like084ipplb747m4ur447p5h3 Deutschland]). &lt;br /&gt;
&lt;br /&gt;
Die Besonderheit dieses Displays ist der eingebaute Prozessor. Mit Hilfe der zugehörigen Software (erhältlich für Windows auf den Seiten des Herstellers) kann man diesem Prozessor ein regelrechtes GUI (Graphical User Interface) einprogrammieren: Bilder, Texte, Buttons, Fortschrittsbalken, aktive Regionen werden zusammengestellt und können mit Hilfe der entsprechenden Softwarebibliotheken abgerufen werden, wenn sie erst einmal im internen Flash-Memory gespeichert sind. Für diese Zusammenstellung eines Ablaufes stellt der Nextion-Editor auch einen komfortablen Emulator zur Verfügung, mit dem man den Ablauf vor dem Upload ausprobieren kann. &lt;br /&gt;
&lt;br /&gt;
Der Upload auf das Nextion-Display geschieht entweder über die eingebaute serielle Schnittstelle (via USB-Seriell-Adapter für ca. 5 € auch an USB anzuschließen), oder indem mit Hilfe des Nextion Editors eine Micro-SD-Karte beschrieben und in den Kartenslot des Displays gesteckt wird (unten im Bild). Die Ansteuerung des Displays geschieht ebenfalls über die diese serielle Schnittstelle (rechts im Bild). &lt;br /&gt;
&lt;br /&gt;
Zum Schutz des Nextion empfiehlt sich seine Montage an der Frontplatte mit einer entsprechenden [http://www.conrad.biz/ce/de/product/519111/Displayschutzfolie-Passend-fuer-Universal-100-mm-x-150-mm-1-St/SHOP_AREA_19142 Schutzfolie]. Diese Folie kann man Rand etwas überstehen lassen und dort mit Silikon gegen die Frontplatte abdichten.  &lt;br /&gt;
&lt;br /&gt;
[[File:doorpi_displays.jpg|800x380px]]&lt;br /&gt;
&lt;br /&gt;
==iButton-Subsystem==&lt;br /&gt;
iButtons sind kompakte Knöpfe aus Stahl, in denen ein Chip mit einer eindeutigen ID sitzt. Durch Auflegen des iButtons auf das Lesegerät wird diese ausgelesen und mit den einprogrammierten IDs verglichen.&lt;br /&gt;
* iButtonLesegerät, z.B.:&lt;br /&gt;
** [http://www.fuchs-shop.com/de/shop/16/1/13372564/ ohne LED]&lt;br /&gt;
** [http://www.fuchs-shop.com/de/shop/16/1/13372377/ mit LED] - Achtung evtl. nicht ausreichend Wetterfest&lt;br /&gt;
** [http://www.aliexpress.com/item/2PCS-TM-probe-DS9092-Zinc-Alloy-probe-iButton-probe-reader-with-LED-M98/32635390937.html aus Fernost]&lt;br /&gt;
Mehr über die Technik der iButtons erfährt man in der [[:Kategorie:1-Wire|Katgeorie 1-Wire]]. Achtung: iButtons sind nicht fälschungssicher. Was aber manche Hotels nicht abhält, ihren Gästen als Zimmerschlüssel einen iButton auszuhändigen...&lt;br /&gt;
&lt;br /&gt;
==Frontplatte==&lt;br /&gt;
Die Frontplatte besteht aus 4 mm starken Aluminium, eloxiert und auf 1/10 mm genau mit den passenden Bohrungen und Ausschnitten sowie rückseitig angeschweißten Gewindebolzen versehen. Online bestellbar z.B. bei der Schaeffer AG, für das vorliegende Exemplar wurden ca. 115 € in Rechnung gestellt. Auf Grund ihrer Stabilität dient diese Frontplatte als Baugruppenträger für die Außeninstallation.&lt;br /&gt;
&lt;br /&gt;
[[File:Doorpi_front.jpg]]&lt;br /&gt;
&lt;br /&gt;
==Rückwandinstallation==&lt;br /&gt;
Die Rückwandinstallation, die in des Mauerwerk eingelassen wird, kommt ebenfalls aus dem 3D-Drucker. Sie besteht aus drei Teilen mit unterschiedlicher Tiefe, um das Loch im Mauerwerk nicht zu groß werden zu lassen. Das obere und das untere Teil enthalten jeweils zwei stabile Vorsprünge mit Aussparungen, in die eine normgerechte M4-Mutter von unten genau hineinpasst. Bemerkenswert ist, dass dieses Bauteil nicht mit einer konventionellen Methode (z.B. im Spritzgussverfahren) gefertigt werden kann. Die hineingedrückten Muttern kommen damit genau hinter den äußeren Schraubenlöchern der Frontplatte zu liegen, Die Frontplatte kann dadurch mit vier (Sicherheits-)schrauben M4 passgenau auf die im Mauerwerk sitzende Rückwandinstallation geschraubt werden. Dafür &lt;br /&gt;
werden Edelstahlschrauben mit Senkkopf und zwei Löchern auf der Oberseite verwendet (sog. Sicherheitsschrauben). &lt;br /&gt;
&lt;br /&gt;
Auf der Oberkante der drei Teile verläuft eine 1x1 mm² große Nut, in die eine Dichtung eingelegt werden kann. Zur besseren Verankerung im Putz kann das zusammengeklebte Gehäuse noch mit &#039;&#039;Ohren&#039;&#039; versehen werden - siehe die beiden letzten Links in der nachfolgenden List.&lt;br /&gt;
&lt;br /&gt;
Die Bauteile der Rückwandinstallation können aus beliebigem Material gefertigt werden, aber Achtung: Druckt man sie aus dme Material PLA (Poly-Milchsäure), ist zum Schutz gegen biologischen Abbau und Depolymerisation im Mauerwerk ein (äußerer) Überzug mit Sprühlack sinnvoll.&lt;br /&gt;
&lt;br /&gt;
[[File:Doorpi_coverparts.jpg]]&lt;br /&gt;
&lt;br /&gt;
Hier die Links zu den betreffenden Dateien: [https://www.tinkercad.com/things/5DvvrghWe7T-coverbottom4 CoverBottom4]&lt;br /&gt;
[https://www.tinkercad.com/things/3oHRTA6XL1g-covermiddle4 CoverMiddle4]&lt;br /&gt;
[https://www.tinkercad.com/things/6BOOMGKsd9Z-covertop4 CoverTop4]&lt;br /&gt;
[https://www.tinkercad.com/things/kOnZEsCaQI9-coverearc4 CoverEarC4]&lt;br /&gt;
[https://www.tinkercad.com/things/86ovGXH3JyK-coverears4 CoverEarS4]&lt;br /&gt;
&lt;br /&gt;
[[File:Doorpi_covertop.jpg]]&lt;br /&gt;
&lt;br /&gt;
=Software=&lt;br /&gt;
Die Software besteht aus verschiedenen Bestandteilen&lt;br /&gt;
* Auf dem Nextion-Display sind so genannte Seiten mit Bildern, Texten und aktiven Elementen (Widgets) gespeichert, diese werden mit dem zugehörigen Nextion-Editor des Herstellers erzeugt und entweder über serielle Schnittstelle oder über eine Micro-SD-Karte auf das Nextion übertragen.&lt;br /&gt;
* Auf dem Arduino läuft ein kleines Programm in einer Endlosschleife. Es führt die Abfrage des iButton-Lesers durch und steuert den Seitenwechel des Nextion-Displays, verarbeitet auch dessen Bedienvorgänge. Das Programm (Sketch in der Arduino-Terminologie) wird mit Hife der Arduino-Entwicklungsumgebung übersetzt und auf diesen übertragen.&lt;br /&gt;
* Auf dem Raspberry Pi wird nach einer der verfügbaren Anleitungen im DoorPi-Forum die DoorPi-Software installiert und konfiguriert&lt;br /&gt;
* Auf dem FHEM-System (z.B. einem weiteren Raspberry Pi) muss eine aktuelle Version von FHEM laufen.&lt;br /&gt;
==Nextion-Subsystem==&lt;br /&gt;
Für das hier Projekt wurden mit dem Nextion-Editor zwei Seiten erstellt (&#039;&#039;&#039;page0&#039;&#039;&#039; und &#039;&#039;&#039;page1&#039;&#039;&#039; genannt), die verschiedene &#039;&#039;Widgets&#039;&#039; enthalten, also bedienbare Elemente.&lt;br /&gt;
* &#039;&#039;&#039;page0&#039;&#039;&#039; ist die Default-Seite, sie zeigt die Namen der Hausbewohner. Die gesamte Fläche ist als &#039;&#039;picture&#039;&#039; mit der ID &#039;&#039;&#039;p0&#039;&#039;&#039; deklariert. Ein weiteres kleines &#039;&#039;picture&#039;&#039; mit der ID &#039;&#039;&#039;p1&#039;&#039;&#039; dient der Anzeige eine kleinen Schloss-Symbols&lt;br /&gt;
* &#039;&#039;&#039;page1&#039;&#039;&#039; ist das virtuelle Keyboard. Wie man in der nachstehenden Abbildung sehen kann, wurden dabei 11 verschiedene &#039;&#039;buttons&#039;&#039; definiert, nämlich &#039;&#039;&#039;b0-b9&#039;&#039;&#039; für Ziffern und &#039;&#039;&#039;b10&#039;&#039;&#039; als &#039;&#039;Cancel&#039;&#039;-Button. Außerdem gibt es es einen Fortschrittsbalken &#039;&#039;&#039;j0&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
[[File:nextion.png|400x240px]]&lt;br /&gt;
&lt;br /&gt;
Um die Eingabe von Ziffern über dieses Display zu verarbeiten, müssen die Button-Widgets mit Callback-Funktionen versehen werden, dies geschieht weiter unten in dem Programm des Arduino.&lt;br /&gt;
&lt;br /&gt;
Die fertigen Seiten werden durch den Nextion-Editor in einer kompakten Datei zusammengefasst, die entweder per serieller Schnittstelle an das Display übertragen wird, oder auf einer Micro-SD-Karte in das Nextion gesteckt wird. Beim Einschalten des Displays wird dann diese Datei automatisch in den internen Flash-Speicher des Nextion übernommen.&lt;br /&gt;
&lt;br /&gt;
==Arduino==&lt;br /&gt;
Im Projekt wurde ein Arduino Micro verwendet - nahezu jede andere Version tut es auch. Das Programm darauf ist relativ einfach und wird im Folgenden erklärt.&lt;br /&gt;
&lt;br /&gt;
Zuerst gibt es ein paar Deklarationen. Insbesondere müssen die Bibliotheken für den 1-Wire Anschluss (=iButton-Reader) und das Nextion Display eingebunden werden. Achtung: in der Datei NexConfig.h muss der Wert für nexSerial auf Serial1 gesetzt werden.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
/*----------------------------------------------------------------------------------&lt;br /&gt;
 Haustür&lt;br /&gt;
&lt;br /&gt;
 Prof. Dr. Peter A. Henning, April 2016&lt;br /&gt;
&lt;br /&gt;
 ------------------------------------------------------------------------------------*/&lt;br /&gt;
#include &amp;lt;OneWire.h&amp;gt;&lt;br /&gt;
#include &amp;lt;SPI.h&amp;gt;&lt;br /&gt;
#include &amp;lt;SD.h&amp;gt;&lt;br /&gt;
#include &amp;lt;SoftwareSerial.h&amp;gt;&lt;br /&gt;
// Make sure that in NexConfig.h nexSerial is configured properly !&lt;br /&gt;
#include &amp;quot;Nextion.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Jetzt werden die Pins des Arduino ausgewählt. Außerdem wir din diesem Abschnitt die Sicherheits-PIN gesetzt, im Beispiel 12345&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
// Door Opener Subsystem&lt;br /&gt;
const int DoorOpen   =  8;  // output for door opening&lt;br /&gt;
const int LockState  =  6;  // output to indicate lock state&lt;br /&gt;
byte       softlock  =  0;&lt;br /&gt;
byte       hardlock  =  0;&lt;br /&gt;
&lt;br /&gt;
// Security PIN&lt;br /&gt;
const int HardLock   =  5;  // input low = high security&lt;br /&gt;
String PIN           = &amp;quot;12345&amp;quot;;&lt;br /&gt;
char   pin[10];&lt;br /&gt;
char   pindigit      =  &#039; &#039;;&lt;br /&gt;
byte   pinctr        =  0;&lt;br /&gt;
long   pinMillis     =  0;&lt;br /&gt;
const int WrongID    =  7;  // indicator for false 1-Wire ID or PIN&lt;br /&gt;
&lt;br /&gt;
// process variables&lt;br /&gt;
const int loopLED    = 13; // signal loop&lt;br /&gt;
byte phase           = 1;  // phase of test&lt;br /&gt;
long currentMillis   = 0;&lt;br /&gt;
&lt;br /&gt;
// dimming&lt;br /&gt;
const int  Brightness  = A0;   // input pin for the dimming voltage&lt;br /&gt;
const int  Movement    = A1;   // input for movement detection&lt;br /&gt;
const int  DashDim     = 3;    // output for dimming further dashlights&lt;br /&gt;
const int  DashlightOn = 4;    // input pin for the dashlight signal&lt;br /&gt;
const long dimTimeout  = 60000;&lt;br /&gt;
byte       isDimmed   = 0;&lt;br /&gt;
long       dimMillis  = 0;    // timer&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Hier folgt der Code für das iButton-System. Natürlich nicht mit meinen echten 1-Wire IDs. Wichtig ist, dass diese hier hart in den Code eingebaut werden. Das ist zwar etwas unkomfortabel, wenn man sie ändern möchte - aber sehr sicher gegen Manipulationen.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
// 1-Wire subsystem&lt;br /&gt;
OneWire   ds(12);          // 1-Wire on pin 12 (a 4.7K resistor is necessary)&lt;br /&gt;
const int redLED     = 11; // LED on pins 9,10,11&lt;br /&gt;
const int greenLED   = 10;&lt;br /&gt;
const int blueLED    = 9;&lt;br /&gt;
&lt;br /&gt;
typedef struct {&lt;br /&gt;
  char* name;&lt;br /&gt;
  byte  ROM[8];&lt;br /&gt;
  int   red;&lt;br /&gt;
  int   green;&lt;br /&gt;
  int   blue;&lt;br /&gt;
} iButton;&lt;br /&gt;
&lt;br /&gt;
const byte iBnum = 7;     // Number of defined iButtons&lt;br /&gt;
const iButton iButtons[] = {&lt;br /&gt;
  {&amp;quot;iRed&amp;quot;,   {0x01, 0x--, 0x--, 0x--, 0x--, 0x--, 0x--, 0x--}, LOW, HIGH, HIGH},&lt;br /&gt;
  {&amp;quot;iRed*&amp;quot;,  {0x01, 0x--, 0x--, 0x--, 0x--, 0x--, 0x--, 0x--}, LOW, HIGH, HIGH},&lt;br /&gt;
  {&amp;quot;iGreen&amp;quot;, {0x01, 00x--, 0x--, 0x--, 0x--, 0x--, 0x--, 0x--}, HIGH, LOW, HIGH},&lt;br /&gt;
  {&amp;quot;iBlue&amp;quot;,  {0x01, 0x--, 0x--, 0x--, 0x--, 0x--, 0x--, 0x--}, HIGH, HIGH, LOW},&lt;br /&gt;
  {&amp;quot;iOrange&amp;quot;, {0x01, 0x--, 0x--, 0x--, 0x--, 0x--, 0x--, 0x--}, LOW, LOW, HIGH},&lt;br /&gt;
  {&amp;quot;iPink&amp;quot;,  {0x01, 0x--, 0x--, 0x--, 0x--, 0x--, 0x--, 0x--}, LOW, HIGH, LOW},&lt;br /&gt;
  {&amp;quot;iPurple&amp;quot;, {0x01, 0x--, 0x--, 0x--, 0x--, 0x--, 0x--, 0x--}, LOW, HIGH, LOW}&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
In dieser Version des Programms gibt es auf dem Nextion-Display nur zwei Seiten, eine mit den Namen und eine mit einem Keyboard. Die Keyboard-Buttons werden hier bekannt gemacht und mit Callbacks versehen.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
// GUI&lt;br /&gt;
NexPage page0     = NexPage(0, 0, &amp;quot;page0&amp;quot;);&lt;br /&gt;
NexPage page1     = NexPage(1, 0, &amp;quot;page1&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
NexButton  p0    = NexButton(0, 1, &amp;quot;p0&amp;quot;);&lt;br /&gt;
NexPicture p1     = NexPicture(0, 2, &amp;quot;p1&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
NexButton num0    = NexButton(1, 11, &amp;quot;b0&amp;quot;);&lt;br /&gt;
NexButton num1    = NexButton(1, 2, &amp;quot;b1&amp;quot;);&lt;br /&gt;
NexButton num2    = NexButton(1, 3, &amp;quot;b2&amp;quot;);&lt;br /&gt;
NexButton num3    = NexButton(1, 4, &amp;quot;b3&amp;quot;);&lt;br /&gt;
NexButton num4    = NexButton(1, 5, &amp;quot;b4&amp;quot;);&lt;br /&gt;
NexButton num5    = NexButton(1, 6, &amp;quot;b5&amp;quot;);&lt;br /&gt;
NexButton num6    = NexButton(1, 7, &amp;quot;b6&amp;quot;);&lt;br /&gt;
NexButton num7    = NexButton(1, 8, &amp;quot;b7&amp;quot;);&lt;br /&gt;
NexButton num8    = NexButton(1, 9, &amp;quot;b8&amp;quot;);&lt;br /&gt;
NexButton num9    = NexButton(1, 10, &amp;quot;b9&amp;quot;);&lt;br /&gt;
NexButton cancel  = NexButton(1, 12, &amp;quot;b10&amp;quot;);&lt;br /&gt;
NexProgressBar progress  = NexProgressBar(1, 13, &amp;quot;j0&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
NexTouch *nex_Listen_List[] =&lt;br /&gt;
{&lt;br /&gt;
  &amp;amp;num0, &amp;amp;num1, &amp;amp;num2, &amp;amp;num3, &amp;amp;num4,&lt;br /&gt;
  &amp;amp;num5, &amp;amp;num6, &amp;amp;num7, &amp;amp;num8, &amp;amp;num9,&lt;br /&gt;
  &amp;amp;cancel, &amp;amp;p0, NULL&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
void p0Callback(void *ptr)&lt;br /&gt;
{&lt;br /&gt;
  dimLight(100);&lt;br /&gt;
  softlock = 1;&lt;br /&gt;
  if ( hardlock == 0) {&lt;br /&gt;
    showLock();&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void num0PushCallback(void *ptr)&lt;br /&gt;
{&lt;br /&gt;
  pindigit = &#039;0&#039;;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void num1PushCallback(void *ptr)&lt;br /&gt;
{&lt;br /&gt;
  pindigit = &#039;1&#039;;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void num2PushCallback(void *ptr)&lt;br /&gt;
{&lt;br /&gt;
  pindigit = &#039;2&#039;;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void num3PushCallback(void *ptr)&lt;br /&gt;
{&lt;br /&gt;
  pindigit = &#039;3&#039;;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void num4PushCallback(void *ptr)&lt;br /&gt;
{&lt;br /&gt;
  pindigit = &#039;4&#039;;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void num5PushCallback(void *ptr)&lt;br /&gt;
{&lt;br /&gt;
  pindigit = &#039;5&#039;;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void num6PushCallback(void *ptr)&lt;br /&gt;
{&lt;br /&gt;
  pindigit = &#039;6&#039;;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void num7PushCallback(void *ptr)&lt;br /&gt;
{&lt;br /&gt;
  pindigit = &#039;7&#039;;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void num8PushCallback(void *ptr)&lt;br /&gt;
{&lt;br /&gt;
  pindigit = &#039;8&#039;;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void num9PushCallback(void *ptr)&lt;br /&gt;
{&lt;br /&gt;
  pindigit = &#039;9&#039;;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void CancelCallback(void *ptr)&lt;br /&gt;
{&lt;br /&gt;
  pinctr = 0;&lt;br /&gt;
  progress.setValue(0);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Es folgt die Initialisierungsroutine&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
void setup() {&lt;br /&gt;
&lt;br /&gt;
  String cmd;&lt;br /&gt;
&lt;br /&gt;
  // set the digital pins as output:&lt;br /&gt;
  pinMode(redLED, OUTPUT);&lt;br /&gt;
  pinMode(greenLED, OUTPUT);&lt;br /&gt;
  pinMode(blueLED, OUTPUT);&lt;br /&gt;
  pinMode(loopLED, OUTPUT);&lt;br /&gt;
  pinMode(DoorOpen, OUTPUT);&lt;br /&gt;
  pinMode(WrongID, OUTPUT);&lt;br /&gt;
  pinMode(LockState, OUTPUT);&lt;br /&gt;
  pinMode(HardLock, INPUT_PULLUP);&lt;br /&gt;
  pinMode(DashlightOn, INPUT_PULLUP);&lt;br /&gt;
&lt;br /&gt;
  digitalWrite(redLED, HIGH);&lt;br /&gt;
  digitalWrite(greenLED, HIGH);&lt;br /&gt;
  digitalWrite(blueLED, HIGH);&lt;br /&gt;
  digitalWrite(loopLED, LOW);&lt;br /&gt;
  digitalWrite(DoorOpen, HIGH);&lt;br /&gt;
  digitalWrite(WrongID, HIGH);&lt;br /&gt;
  digitalWrite(LockState, HIGH);&lt;br /&gt;
&lt;br /&gt;
  // initialize the GUI&lt;br /&gt;
  nexInit();&lt;br /&gt;
&lt;br /&gt;
  p0.attachPush(p0Callback, &amp;amp;p0);&lt;br /&gt;
  num0.attachPush(num0PushCallback, &amp;amp;num0);&lt;br /&gt;
  num1.attachPush(num1PushCallback, &amp;amp;num1);&lt;br /&gt;
  num2.attachPush(num2PushCallback, &amp;amp;num2);&lt;br /&gt;
  num3.attachPush(num3PushCallback, &amp;amp;num3);&lt;br /&gt;
  num4.attachPush(num4PushCallback, &amp;amp;num4);&lt;br /&gt;
  num5.attachPush(num5PushCallback, &amp;amp;num5);&lt;br /&gt;
  num6.attachPush(num6PushCallback, &amp;amp;num6);&lt;br /&gt;
  num7.attachPush(num7PushCallback, &amp;amp;num7);&lt;br /&gt;
  num8.attachPush(num8PushCallback, &amp;amp;num8);&lt;br /&gt;
  num9.attachPush(num9PushCallback, &amp;amp;num9);&lt;br /&gt;
  cancel.attachPush(CancelCallback, &amp;amp;cancel);&lt;br /&gt;
&lt;br /&gt;
  //dimming&lt;br /&gt;
  dimLight(100);&lt;br /&gt;
&lt;br /&gt;
  //showlock&lt;br /&gt;
  if ( digitalRead(HardLock) == LOW) {&lt;br /&gt;
    showLock();&lt;br /&gt;
    hardlock = 1;&lt;br /&gt;
    softlock = 0;&lt;br /&gt;
  } else {&lt;br /&gt;
    hideLock();&lt;br /&gt;
    hardlock = 0;&lt;br /&gt;
    softlock = 0;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Türöffnung -&amp;gt; Pin mit Name DoorOpen wird für eine Sekunde auf LOW gesetzt.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
void openDoor(int level) {&lt;br /&gt;
  digitalWrite(DoorOpen, LOW);&lt;br /&gt;
  delay(1000);&lt;br /&gt;
  digitalWrite(DoorOpen, HIGH);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Falsche ID -&amp;gt; Pin mit Name WrongID wird für eine Sekunde auf LOW gesetzt.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
void wrongID() {&lt;br /&gt;
  digitalWrite(WrongID, LOW);&lt;br /&gt;
  delay(1000);&lt;br /&gt;
  digitalWrite(WrongID, HIGH);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Mit den beiden nachfolgenden Kommandos wird ein Schloss-Symbol auf dem Nextion angezeigt bzw. ausgeblendet&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
void showLock() {&lt;br /&gt;
  sendCommand(&amp;quot;vis p1,1&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
void hideLock() {&lt;br /&gt;
  sendCommand(&amp;quot;vis p1,0&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Dimmen des Dashlight auf einen durch den Helligkeitssensor vorgegebenen Wert (Parameter level=0) oder auf einen als Parameter übergebenen Wert&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
void dimLight(int level) {&lt;br /&gt;
  uint16_t dimVal;&lt;br /&gt;
  String cmd = &amp;quot;dim=&amp;quot;;&lt;br /&gt;
  // zero level - determine from lighting conditions&lt;br /&gt;
  if ( (level == 0) &amp;amp;&amp;amp; (digitalRead(DashlightOn) == HIGH) ) {&lt;br /&gt;
    dimVal = (uint32_t) analogRead(Brightness);&lt;br /&gt;
    dimVal = map(dimVal, 0, 1023, 0, 100);&lt;br /&gt;
    isDimmed = 1;&lt;br /&gt;
  // nonzero level - take as it is&lt;br /&gt;
  } else {&lt;br /&gt;
    dimVal = 100;&lt;br /&gt;
    isDimmed = 0;&lt;br /&gt;
  }&lt;br /&gt;
  cmd += dimVal;&lt;br /&gt;
  //dbSerialPrint(cmd);&lt;br /&gt;
  sendCommand(cmd.c_str());&lt;br /&gt;
  dimVal = map(dimVal, 0, 100, 0, 255);&lt;br /&gt;
  //dbSerialPrint(&amp;quot; -- &amp;quot;);&lt;br /&gt;
  //dbSerialPrintln(dimVal);&lt;br /&gt;
  analogWrite(DashDim,dimVal);&lt;br /&gt;
  dimMillis = millis();&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Hier endlich die Schleife des Hauptprogramms&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
void loop(void) {&lt;br /&gt;
  byte i;&lt;br /&gt;
  byte j;&lt;br /&gt;
  boolean equiv;&lt;br /&gt;
  byte iBfound;&lt;br /&gt;
  byte present = 0;&lt;br /&gt;
  byte addr[8];&lt;br /&gt;
  char* device;&lt;br /&gt;
&lt;br /&gt;
  // new for each loop&lt;br /&gt;
  currentMillis = millis();&lt;br /&gt;
  digitalWrite(loopLED, HIGH);&lt;br /&gt;
&lt;br /&gt;
  // dimming&lt;br /&gt;
  if ( isDimmed == 1 ) {&lt;br /&gt;
    if ( analogRead(Movement) &amp;lt; 10 ) {&lt;br /&gt;
       dimLight(100);&lt;br /&gt;
    }&lt;br /&gt;
     if ( digitalRead(DashlightOn) == LOW) {&lt;br /&gt;
        //dbSerialPrintln(&amp;quot; DashlightOn = LOW&amp;quot;);&lt;br /&gt;
        dimLight(100);&lt;br /&gt;
     }&lt;br /&gt;
  }&lt;br /&gt;
  if ( (currentMillis - dimMillis) &amp;gt; dimTimeout) {&lt;br /&gt;
    dimLight(0);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // locking&lt;br /&gt;
  if ( digitalRead(HardLock) == LOW) {&lt;br /&gt;
    //change display only if hardlock has changed&lt;br /&gt;
    if ( hardlock == 0 ) {&lt;br /&gt;
      showLock();&lt;br /&gt;
    }&lt;br /&gt;
    hardlock = 1;&lt;br /&gt;
    softlock = 0;&lt;br /&gt;
&lt;br /&gt;
  } else {&lt;br /&gt;
    //change display only if&lt;br /&gt;
    if ( (hardlock == 1) &amp;amp;&amp;amp; (softlock == 0)) {&lt;br /&gt;
      hideLock();&lt;br /&gt;
    }&lt;br /&gt;
    hardlock = 0;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  //lockState display&lt;br /&gt;
  if ( (hardlock == 0) &amp;amp;&amp;amp; (softlock == 0)) {&lt;br /&gt;
    digitalWrite(LockState, HIGH);&lt;br /&gt;
  } else {&lt;br /&gt;
    digitalWrite(LockState, LOW);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  //1-Wire bus access only in phase 1&lt;br /&gt;
  if ( phase == 1) {&lt;br /&gt;
    digitalWrite(redLED, HIGH);&lt;br /&gt;
    digitalWrite(greenLED, HIGH);&lt;br /&gt;
    digitalWrite(blueLED, HIGH);&lt;br /&gt;
&lt;br /&gt;
    if ( !ds.search(addr)) {&lt;br /&gt;
      present = 0;&lt;br /&gt;
      ds.reset_search();&lt;br /&gt;
      digitalWrite(loopLED, LOW);&lt;br /&gt;
      delay(250);&lt;br /&gt;
&lt;br /&gt;
    } else {&lt;br /&gt;
      digitalWrite(loopLED, LOW);&lt;br /&gt;
      // Invalid 1-Wire ID&lt;br /&gt;
      if (OneWire::crc8(addr, 7) != addr[7]) {&lt;br /&gt;
      } else {&lt;br /&gt;
        dimLight(100);&lt;br /&gt;
&lt;br /&gt;
        // the first ROM byte indicates which chip&lt;br /&gt;
        switch (addr[0]) {&lt;br /&gt;
          case 0x01:&lt;br /&gt;
            device = &amp;quot;DS2401&amp;quot;;&lt;br /&gt;
            present++;&lt;br /&gt;
            for (i = 0; i &amp;lt; iBnum; i++) {&lt;br /&gt;
              equiv = true;&lt;br /&gt;
              for (j = 0; j &amp;lt; 7; j++) {&lt;br /&gt;
                if (iButtons[i].ROM[j] != addr[j]) {&lt;br /&gt;
                  equiv = false;&lt;br /&gt;
                  break;&lt;br /&gt;
                }&lt;br /&gt;
              }&lt;br /&gt;
              if (equiv ) {&lt;br /&gt;
                iBfound = i;&lt;br /&gt;
                break;&lt;br /&gt;
              }&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
            if ( equiv ) {&lt;br /&gt;
              digitalWrite(redLED, iButtons[iBfound].red);&lt;br /&gt;
              digitalWrite(greenLED, iButtons[iBfound].green);&lt;br /&gt;
              digitalWrite(blueLED, iButtons[iBfound].blue);&lt;br /&gt;
              // LowSec state =&amp;gt; open door&lt;br /&gt;
              if ( (hardlock == 0) &amp;amp;&amp;amp; (softlock == 0)) {&lt;br /&gt;
                openDoor(1);&lt;br /&gt;
                delay(4000);&lt;br /&gt;
                return;&lt;br /&gt;
                // HiSec state =&amp;gt; go to phase 2&lt;br /&gt;
              } else {&lt;br /&gt;
                phase = 2;&lt;br /&gt;
                pinMillis = millis();&lt;br /&gt;
                page1.show();&lt;br /&gt;
                return;&lt;br /&gt;
              }&lt;br /&gt;
              //sabotage ? Unknown iButton&lt;br /&gt;
            } else {&lt;br /&gt;
              digitalWrite(redLED, LOW);&lt;br /&gt;
              digitalWrite(greenLED, LOW);&lt;br /&gt;
              digitalWrite(blueLED, LOW);&lt;br /&gt;
              wrongID();&lt;br /&gt;
            }&lt;br /&gt;
            break;&lt;br /&gt;
          default:&lt;br /&gt;
            device = &amp;quot;unknown&amp;quot;;&lt;br /&gt;
            break;&lt;br /&gt;
        }&lt;br /&gt;
        ds.reset();&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  nexLoop(nex_Listen_List);&lt;br /&gt;
  if ( phase == 2 ) {&lt;br /&gt;
    // check for timeout&lt;br /&gt;
    if ( (currentMillis - pinMillis) &amp;gt; 30000 ) {&lt;br /&gt;
      progress.setValue(0);&lt;br /&gt;
      phase = 1;&lt;br /&gt;
      pinctr = 0;&lt;br /&gt;
      page0.show();&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // phase 2 and GUI input is a number&lt;br /&gt;
  if ( (phase == 2) &amp;amp;&amp;amp; ( pindigit != &#039; &#039;) ) {&lt;br /&gt;
    // push this number to the PIN buffer&lt;br /&gt;
    pin[pinctr] = pindigit;&lt;br /&gt;
    pindigit = &#039; &#039;;&lt;br /&gt;
    pinctr++;&lt;br /&gt;
    progress.setValue(pinctr * 20);&lt;br /&gt;
    // PIN is complete&lt;br /&gt;
    if ( pinctr == 5) {&lt;br /&gt;
      // PIN is correct =&amp;gt; open door&lt;br /&gt;
      if ( String(pin) == PIN ) {&lt;br /&gt;
        openDoor(2);&lt;br /&gt;
        // wrong PIN&lt;br /&gt;
      } else {&lt;br /&gt;
        wrongID();&lt;br /&gt;
      }&lt;br /&gt;
      // return to phase 1&lt;br /&gt;
      progress.setValue(0);&lt;br /&gt;
      phase = 1;&lt;br /&gt;
      pinctr = 0;&lt;br /&gt;
      page0.show();&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==FHEM==&lt;br /&gt;
Aufseiten von FHEM müssen die Perl-Module JSON und Test::JSON installiert werden. Ferner muss die Datei 70_DoorPi.pm aus dem Ordner contrib/doorpi in das Hauptverzeichnis von FHEM geschoben werden. Eine beispielhafte Konfiguration in FHEM lautet dann:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
define A.Door.Pi DoorPi 192.168.0.YY&lt;br /&gt;
attr A.Door.Pi alarmDevice Sensor&lt;br /&gt;
attr A.Door.Pi alarmSettings alarm4,alarm5,|A.Door.Pi:.*sabotage|Türstation|on&lt;br /&gt;
attr A.Door.Pi doorlockcmd set A.Door.T locked&lt;br /&gt;
attr A.Door.Pi doorunlockcmd set A.Door.T unlocked&lt;br /&gt;
attr A.Door.Pi target0 telefonnummer1&lt;br /&gt;
attr A.Door.Pi target1 telefonnummer2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
*Dabei ist natürlich die IP-Adresse des DoorPi-Rechners einzutragen. &lt;br /&gt;
*Die Attribute alarmDevice/alarmSettings sind nur zu verwenden, wenn man das Modul 95_Alarm.pm benutzt.&lt;br /&gt;
*Die Attribute doorlockcmd/doorunlockcmd sind die Kommandos, die von FHEM ausgeführt werden, wenn die Haustür wirklich abgeschlossen werden soll.&lt;br /&gt;
===Notify zur Anzeige des gegenwärtigen Bildes===&lt;br /&gt;
Ruft man im FHEM-Frontend das Kommando &#039;&#039;&#039;set A.Door.Pi snapshot&#039;&#039;&#039; auf, oder wird der Klingelknopf betätigt, gibt es in FHEM ein Event &#039;&#039;&#039;A.Door.Pi snapshot: &amp;lt;url&amp;gt;&#039;&#039;&#039;. Dieses kann man mit einem Notify abfangen, beispielsweise wird mit &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
define A.Door.Pi.img notify A.Door.Pi:snapshot.* {&lt;br /&gt;
   fhem(&amp;quot;set GalaxyTab tickerMessage A.Door.Pi $EVTPART1&amp;quot;);; &lt;br /&gt;
   fhem(&amp;quot;set Archos7Tab tickerMessage A.Door.Pi $EVTPART1&amp;quot;)}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
eine entsprechende Message an zwei Tablets gesendet.&lt;br /&gt;
&lt;br /&gt;
==DoorPi==&lt;br /&gt;
Die DoorPi-Software wird laut diversen Anleitungen im DoorPi Forum auf dem Raspberry Pi installiert. Danach liegt sie im Pfad der Python-Installation - ziemlich ungünstig für weitere Arbeiten. Deshalb wird zunächst ein Verzeichnis /home/doorpi angelegt. In dieser liegen dann verschiedene Hilfsdateien und Hilfsverzeichnisse.&lt;br /&gt;
&lt;br /&gt;
===FHEMHelper.sh===&lt;br /&gt;
Diese Datei ist eine Skriptdatei, mit der diverse Hilfsfunktionen ausgeführt werden. Zwar lassen sich diese in einigen Fällen auch als Einzeiler in der doorpi.ini verstecken, als separate Datei im Verzeichnis /home/doorpi ist diese Helferdatei jedoch leichter änderbar.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# /bin/sh&lt;br /&gt;
&lt;br /&gt;
FHEMDP=&amp;quot;A.Door.Pi&amp;quot;&lt;br /&gt;
FHEMIP=&amp;quot;192.168.0.XX&amp;quot;&lt;br /&gt;
FHEM=&amp;quot;http://192.168.0.XX:8083/fhem?XHR=1&amp;amp;cmd.$FHEMDP&amp;quot;&lt;br /&gt;
HOME=&amp;quot;/home/doorpi&amp;quot;&lt;br /&gt;
default_target=&amp;quot;yyyyyy&amp;quot;&lt;br /&gt;
&lt;br /&gt;
case $1 in &lt;br /&gt;
&lt;br /&gt;
 init) target=`cat $HOME/calltarget`&lt;br /&gt;
       curl &amp;quot;$FHEM=setreading%20$FHEMDP%20call_target%20$target&amp;quot; &amp;amp;&lt;br /&gt;
&lt;br /&gt;
       streampid=`pidof mjpg_streamer`&lt;br /&gt;
       if [ -z &amp;quot;$streampid&amp;quot; ]; then&lt;br /&gt;
         curl &amp;quot;$FHEM=setreading%20$FHEMDP%20stream%20off&amp;quot; &amp;amp;&lt;br /&gt;
       else&lt;br /&gt;
         curl &amp;quot;$FHEM=setreading%20$FHEMDP%20stream%20on&amp;quot; &amp;amp;&lt;br /&gt;
       fi&lt;br /&gt;
       ;;&lt;br /&gt;
&lt;br /&gt;
 doorunlockandopen) &lt;br /&gt;
       curl &amp;quot;$FHEM=set%20GalaxyTab%20ttsSay%20Ein%20Bewohner%20betritt%20das%20Haus&amp;quot; &amp;amp;&lt;br /&gt;
       curl &amp;quot;$FHEM=set%20$FHEMDP%20door%20unlockandopen&amp;quot; &amp;amp;&lt;br /&gt;
       ;;&lt;br /&gt;
&lt;br /&gt;
 wrongid)&lt;br /&gt;
       curl &amp;quot;$FHEM=set%20GalaxyTab%20ttsSay%20Unerlaubter%20Zutrittsversuch&amp;quot; &amp;amp;&lt;br /&gt;
       curl &amp;quot;$FHEM=set%20$FHEMDP%20door%20wrong_id&amp;quot; &amp;amp;&lt;br /&gt;
       ;;&lt;br /&gt;
&lt;br /&gt;
 softlock)&lt;br /&gt;
       curl &amp;quot;$FHEM=set%20$FHEMDP%20door%20softlock&amp;quot; &amp;amp;&lt;br /&gt;
       ;;&lt;br /&gt;
&lt;br /&gt;
 call) &lt;br /&gt;
       curl &amp;quot;$FHEM=set%20$FHEMDP%20call%20$2&amp;quot; &amp;amp;&lt;br /&gt;
       ;;&lt;br /&gt;
&lt;br /&gt;
 gettarget)&lt;br /&gt;
       echo &amp;quot;{ReadingsVal(&#039;$FHEMDP&#039;,&#039;call_target&#039;,&#039;$default_target&#039;)}&amp;quot; | socat -t50 - TCP:$FHEMIP:7072 &amp;gt; $HOME/calltarget&lt;br /&gt;
       ;;&lt;br /&gt;
&lt;br /&gt;
 purge)&lt;br /&gt;
       find $HOME/records/ -type f -ctime 1 -delete&lt;br /&gt;
       ;;&lt;br /&gt;
&lt;br /&gt;
 movement)&lt;br /&gt;
       curl &amp;quot;$FHEM=set%20$FHEMDP%20door%20movement&amp;quot; &amp;amp;&lt;br /&gt;
       ;;&lt;br /&gt;
&lt;br /&gt;
 sabotage)&lt;br /&gt;
       curl &amp;quot;$FHEM=set%20$FHEMDP%20door%20sabotage&amp;quot; &amp;amp;&lt;br /&gt;
       ;;&lt;br /&gt;
&lt;br /&gt;
esac&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===doorpi.ini===&lt;br /&gt;
Die Konfigurationsdatei &#039;&#039;&#039;doorpi.ini&#039;&#039;&#039; liegt in der Standardinstallation von DoorPi im Verzeichnis /usr/local/etc/DoorPi/conf, sie wird deshalb per Softlink mit /home/doorpi.ini verbunden. In dieser Datei stehen diverse Konfigurationsangaben für DoorPi.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[DoorPi]&lt;br /&gt;
base_path = /usr/local/etc/DoorPi&lt;br /&gt;
snapshot_path = /home/doorpi/records&lt;br /&gt;
number_of_snapshots = 10&lt;br /&gt;
eventlog = /home/doorpi/log/eventlog.db&lt;br /&gt;
is_alive_led = blinking_led &lt;br /&gt;
last_snapshot = &lt;br /&gt;
&lt;br /&gt;
[DoorPiWeb]&lt;br /&gt;
indexfile = index.html&lt;br /&gt;
loginfile = login.html&lt;br /&gt;
online_fallback = http://motom001.github.io/DoorPiWeb&lt;br /&gt;
port = 80&lt;br /&gt;
public = AREA_public&lt;br /&gt;
www = /home/doorpi/records&lt;br /&gt;
&lt;br /&gt;
[AREA_public]&lt;br /&gt;
.*&lt;br /&gt;
&lt;br /&gt;
[AREA_config]&lt;br /&gt;
/control/config_value_get&lt;br /&gt;
/control/config_value_set&lt;br /&gt;
/control/config_value_delete&lt;br /&gt;
/control/config_save&lt;br /&gt;
/control/config_get_configfile &lt;br /&gt;
&lt;br /&gt;
[AREA_dashboard]&lt;br /&gt;
/dashboard/pages/.*html&lt;br /&gt;
&lt;br /&gt;
[AREA_status]&lt;br /&gt;
/status&lt;br /&gt;
/mirror&lt;br /&gt;
&lt;br /&gt;
[AREA_control]&lt;br /&gt;
.*&lt;br /&gt;
&lt;br /&gt;
[User]&lt;br /&gt;
admin = admin&lt;br /&gt;
visitor = visitor&lt;br /&gt;
&lt;br /&gt;
[Group]&lt;br /&gt;
administrators = admin&lt;br /&gt;
guests = visitor&lt;br /&gt;
&lt;br /&gt;
[WritePermission]&lt;br /&gt;
administrators = dashboard,status,config&lt;br /&gt;
&lt;br /&gt;
[ReadPermission]&lt;br /&gt;
guests = dashboard&lt;br /&gt;
&lt;br /&gt;
[AdminNumbers]&lt;br /&gt;
**621 = active&lt;br /&gt;
&lt;br /&gt;
[DTMF]&lt;br /&gt;
&amp;quot;#&amp;quot; = out:door,1,0,3&lt;br /&gt;
&lt;br /&gt;
####################### SIP phone #######################&lt;br /&gt;
[SIP-Phone]&lt;br /&gt;
identity = DoorPi&lt;br /&gt;
local_port = 5060&lt;br /&gt;
firewallpolicy = PolicyNoFirewall&lt;br /&gt;
#&lt;br /&gt;
sipphonetyp = linphone&lt;br /&gt;
sipserver_password = xxxxxxxxxxxxx&lt;br /&gt;
sipserver_realm = fritz.box&lt;br /&gt;
sipserver_server = yyyyyyyyyyyy&lt;br /&gt;
sipserver_username = 620&lt;br /&gt;
stun_server =&lt;br /&gt;
#&lt;br /&gt;
max_call_time = 300&lt;br /&gt;
call_timeout = 60&lt;br /&gt;
ua.max_calls = 2&lt;br /&gt;
#&lt;br /&gt;
capture_device = ALSA: USB PnP Sound Device&lt;br /&gt;
playback_device = ALSA: USB PnP Sound Device&lt;br /&gt;
audio_codecs = PCMA,PCMU&lt;br /&gt;
record_while_dialing = False&lt;br /&gt;
records = /home/doorpi/records/%Y-%m-%d_%H-%M-%S.wav&lt;br /&gt;
#&lt;br /&gt;
dialtone = /home/doorpi/sounds/ShortDialTone.wav&lt;br /&gt;
dialtone_renew_every_start = False&lt;br /&gt;
dialtone_volume = 35&lt;br /&gt;
echo_cancellation_enabled = False&lt;br /&gt;
#&lt;br /&gt;
video_codecs = VP8&lt;br /&gt;
video_device = StaticImage: Static picture&lt;br /&gt;
video_display_enabled = False&lt;br /&gt;
video_size = vga&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Mit den nachfolgenden Events sendet DoorPi Nachrichten an FHEM:&lt;br /&gt;
&amp;lt;pre style=&amp;quot;color: blue&amp;quot;&amp;gt;&lt;br /&gt;
####################### Events #######################&lt;br /&gt;
[EVENT_OnStartup]&lt;br /&gt;
10 = sleep:1&lt;br /&gt;
20 = os_execute:/home/doorpi/FHEMHelper.sh call init&lt;br /&gt;
&lt;br /&gt;
[EVENT_BeforeSipPhoneMakeCall]&lt;br /&gt;
10 = out:irlight,1&lt;br /&gt;
20 = os_execute:/home/doorpi/FHEMHelper.sh call startup&lt;br /&gt;
30 = take_snapshot&lt;br /&gt;
40 = out:irlight,0&lt;br /&gt;
&lt;br /&gt;
[EVENT_OnCallStateDisconnect]&lt;br /&gt;
10 = os_execute:/home/doorpi/FHEMHelper.sh call end&lt;br /&gt;
&lt;br /&gt;
[EVENT_OnCallStateDismissed]&lt;br /&gt;
10 = os_execute:/home/doorpi/FHEMHelper.sh call dismissed&lt;br /&gt;
&lt;br /&gt;
[EVENT_OnCallStateReject]&lt;br /&gt;
10 = os_execute:/home/doorpi/FHEMHelper.sh call rejected&lt;br /&gt;
&lt;br /&gt;
[EVENT_OnTimeMinuteEvery5]&lt;br /&gt;
10=statuswatchdog:/tmp/doorpi.watchdog&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Hier wird ein virtuelles Keyboard (=I/O-System) mit dem Namen &#039;&#039;&#039;webservice&#039;&#039; sowie die reale I/O-Hardware, in diesem Falle das PiFace2-Board definiert.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
####################### Keyboards ##############################&lt;br /&gt;
[keyboards]&lt;br /&gt;
webservice = filesystem&lt;br /&gt;
onboardpins = piface&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Wichtig sind die virtuellen Buttons, die von FHEM per URL-Aufruf aktiviert werden können. &lt;br /&gt;
*Dabei lösen diese Aufrufe entweder eine direkte Reaktion des PiFace-Moduls aus, z.B. wird mit dem virtuellen Button &#039;&#039;&#039;doorlocked&#039;&#039;&#039; (Aufruf &#039;&amp;lt;URL des DoorPi&amp;gt;/control/trigger_event?event_name=OnKeyPressed_webservice.doorlocked&amp;amp;event_source=doorpi.keyboard.from_filesystem&#039;) der reale Output &#039;&#039;&#039;hardlock&#039;&#039;&#039; eingeschaltet (Zustand 1 =&amp;gt; Ausgang Low).&lt;br /&gt;
*Oder sie rufen dass DoorPi-seitige Hilfsprogramm FHEMHelper.sh auf.&lt;br /&gt;
&amp;lt;pre style=&amp;quot;color: red&amp;quot;&amp;gt;&lt;br /&gt;
####################### Virtual keyboard #######################&lt;br /&gt;
[webservice_keyboard]&lt;br /&gt;
base_path_input = /home/doorpi/keyboard/inputs/&lt;br /&gt;
base_path_output = /home/doorpi/keyboard/outputs/&lt;br /&gt;
reset_input=false&lt;br /&gt;
&lt;br /&gt;
[webservice_InputPins]&lt;br /&gt;
dooropen        = out:door,1,0,3 &lt;br /&gt;
doorlocked      = out:hardlock,1&lt;br /&gt;
doorunlocked    = out:hardlock,0&lt;br /&gt;
snapshot        = sleep:0 &lt;br /&gt;
streamon        = sleep:0&lt;br /&gt;
streamoff       = sleep:0&lt;br /&gt;
lighton         = out:light,1&lt;br /&gt;
#lightonfortimer = out:light,1,0,60&lt;br /&gt;
lightoff        = out:light,0&lt;br /&gt;
dashlighton     = out:dashlight,1&lt;br /&gt;
dashlightoff    = out:dashlight,0&lt;br /&gt;
gettarget       = sleep:0&lt;br /&gt;
purge           = sleep:0&lt;br /&gt;
clear           = sleep:0&lt;br /&gt;
button1         = sleep:0&lt;br /&gt;
button2         = sleep:0&lt;br /&gt;
&lt;br /&gt;
#-- communicate to FHEM that a snapshot has been taken&lt;br /&gt;
[EVENT_OnKeyPressed_webservice.snapshot]&lt;br /&gt;
10 = out:irlight,1&lt;br /&gt;
20 = os_execute:/home/doorpi/FHEMHelper.sh call snapshot&lt;br /&gt;
30 = take_snapshot&lt;br /&gt;
40 = out:irlight,0&lt;br /&gt;
&lt;br /&gt;
#-- start video stream&lt;br /&gt;
[EVENT_OnKeyPressed_webservice.streamon]&lt;br /&gt;
10 = os_execute:/etc/init.d/mjpg_streamer start&lt;br /&gt;
&lt;br /&gt;
#-- stop video stream&lt;br /&gt;
[EVENT_OnKeyPressed_webservice.streamoff]&lt;br /&gt;
10 = os_execute:/etc/init.d/mjpg_streamer stop &lt;br /&gt;
&lt;br /&gt;
#-- obtain the target call number from FHEM&lt;br /&gt;
[EVENT_OnKeyPressed_webservice.gettarget]&lt;br /&gt;
10 = os_execute:/home/doorpi/FHEMHelper.sh gettarget&lt;br /&gt;
&lt;br /&gt;
#-- purge all files older than one day&lt;br /&gt;
[EVENT_OnKeyPressed_webservice.purge]&lt;br /&gt;
10 = os_execute:/home/doorpi/FHEMHelper.sh purge&lt;br /&gt;
&lt;br /&gt;
[EVENT_OnKeyPressed_webservice.button1]&lt;br /&gt;
10 = os_execute:/home/doorpi/FHEMHelper.sh sabotage&lt;br /&gt;
&lt;br /&gt;
[EVENT_OnKeyPressed_webservice.button2]&lt;br /&gt;
10 = file_call_value:/home/doorpi/calltarget&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Es folgt die Definition der realen Buttons:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
####################### Real keyboard #######################&lt;br /&gt;
[onboardpins_keyboard]&lt;br /&gt;
pull_up_down = PUD_UP&lt;br /&gt;
&lt;br /&gt;
[onboardpins_OutputPins]&lt;br /&gt;
0 = door&lt;br /&gt;
1 = light&lt;br /&gt;
2 = dashlight&lt;br /&gt;
3 = irlight&lt;br /&gt;
4 = hardlock&lt;br /&gt;
7 = blinking_led&lt;br /&gt;
&lt;br /&gt;
[onboardpins_InputPins]&lt;br /&gt;
0 = file_call_value:/home/doorpi/calltarget&lt;br /&gt;
1 = sleep:0&lt;br /&gt;
4 = sleep:0&lt;br /&gt;
5 = sleep:0&lt;br /&gt;
6 = sleep:0&lt;br /&gt;
7 = sleep:0&lt;br /&gt;
&lt;br /&gt;
#-- DoorOpen pin from Arduino &lt;br /&gt;
[EVENT_OnKeyPressed_onboardpins.1]&lt;br /&gt;
10 = os_execute:/home/doorpi/FHEMHelper.sh doorunlockandopen&lt;br /&gt;
20 = os_execute:aplay -D plughw:1,0 /home/doorpi/sounds/067_willkommen.wav&lt;br /&gt;
&lt;br /&gt;
#-- WrongID pin from Arduino&lt;br /&gt;
[EVENT_OnKeyPressed_onboardpins.4]&lt;br /&gt;
10 = out:irlight,1&lt;br /&gt;
20 = os_execute:/home/doorpi/FHEMHelper.sh wrongid&lt;br /&gt;
30 = take_snapshot&lt;br /&gt;
40 = out:irlight,0&lt;br /&gt;
&lt;br /&gt;
#-- LockState pin from Arduino - FHEM will transform softlock into hardlock&lt;br /&gt;
[EVENT_OnKeyPressed_onboardpins.5]&lt;br /&gt;
10 = os_execute:/home/doorpi/FHEMHelper.sh softlock&lt;br /&gt;
&lt;br /&gt;
#-- Movement detection &lt;br /&gt;
[EVENT_OnKeyPressed_onboardpins.6]&lt;br /&gt;
10 = out:dashlight,1,0,3&lt;br /&gt;
20 = os_execute:/home/doorpi/FHEMHelper.sh movement&lt;br /&gt;
&lt;br /&gt;
#-- Sabotage detection  &lt;br /&gt;
[EVENT_OnKeyPressed_onboardpins.7]&lt;br /&gt;
10 = os_execute:/home/doorpi/FHEMHelper.sh sabotage&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==mjpg_streamer==&lt;br /&gt;
Diese Software dient dazu, einen kleinen Webserver mit MJPEG-Datenstrom aus der Raspberry Pi-Kamera zur Verfügung zu stellen. Sie wird mit Hilfes des Skriptes /etc/init.d/mjpeg_streamer gestartet und gestoppt&lt;br /&gt;
==sonstige Software==&lt;br /&gt;
Auf dem Raspberry Pi wird noch benötigt&lt;br /&gt;
*curl - zum Aufruf einer URL&lt;br /&gt;
*socat - zum Aufruf einer URL und Verarbeitung der Rückgabe (könnte man auch durch curl ersetzen)&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:1-Wire]]&lt;br /&gt;
[[Kategorie:Code_Snippets]]&lt;/div&gt;</summary>
		<author><name>Hartenthaler</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=SIP-Client&amp;diff=20170</id>
		<title>SIP-Client</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=SIP-Client&amp;diff=20170"/>
		<updated>2017-02-22T16:18:36Z</updated>

		<summary type="html">&lt;p&gt;Hartenthaler: typo korrigiert&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Infobox Modul&lt;br /&gt;
|ModPurpose=SIP-Client für FHEM &lt;br /&gt;
|ModType=h&lt;br /&gt;
|ModCmdRef=SIP&lt;br /&gt;
|ModForumArea=Sonstiges&lt;br /&gt;
|ModTechName=96_SIP.pm&lt;br /&gt;
|ModOwner=Wzut ({{Link2FU|1172|Forum}} / [[Benutzer Diskussion:Wzut|Wiki]])}}&lt;br /&gt;
&lt;br /&gt;
Das Modul &#039;&#039;&#039;SIP&#039;&#039;&#039; ermöglicht die Entgegennahme (DTMF-Töne interpretieren, kontrollierte Annahme) sowie die Durchführung (Audiofile abspielen, DTMF-Töne senden) von Anrufen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Voraussetzungen ==&lt;br /&gt;
=== FHEM-Server ===&lt;br /&gt;
Für den Remote-Zugang muss das Modul Net::SIP installiert sein; auf einem Raspberry Pi oder unter Ubuntu z.&amp;amp;nbsp;B. mit dem Befehl&lt;br /&gt;
:&amp;lt;code&amp;gt;sudo cpanm install Net::SIP&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
oder auch&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;code&amp;gt;sudo apt-get install libnet-sip-perl&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== SIP-Server ===&lt;br /&gt;
Der SIP-Client muss sich an einem SIP-Server anmelden (Fritzbox, Asterisk, VoIP-Provider). &lt;br /&gt;
Auf dem SIP-Server, mit dem sich der Client verbinden soll, muss ein User-Account vorhanden sein bzw. angelegt werden. &lt;br /&gt;
In der Fritzbox muss z.B. ein neues Telefoniegerät vom Typ LAN/WLAN angelegt und ein Passwort vergeben werden. Das erzeugt ein neues internes Device im internen Rufnummernbereich **62x, typischerweise die 620. Es sollte kontrolliert werden, ob bei den Anmeldeinformationen der Benutzername der Nebenstelle entspricht (z.B. 620) und ein Passwort eingetragen ist.&lt;br /&gt;
&lt;br /&gt;
== Installation ==&lt;br /&gt;
=== Erste Schritte ===&lt;br /&gt;
Spätestens nach einem &#039;update all&#039; sollte das Modul &#039;&#039;&#039;96_SIP.pm&#039;&#039;&#039; verfügbar sein.&lt;br /&gt;
&lt;br /&gt;
Nun ist der SIP-Client als Device in FHEM anzulegen:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;code&amp;gt;define &amp;lt;name&amp;gt; SIP&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Anschließend sollten alle sip_Attribute geprüft und für die eigene Umgebung gesetzt werden.&lt;br /&gt;
&lt;br /&gt;
=== mögliche Fehlermeldungen ===&lt;br /&gt;
Sollte schon bei &amp;lt;code&amp;gt;define mySIP SIP&amp;lt;/code&amp;gt; die Fehlermeldung kommen, dass dieses Modul nicht existiert, dann bitte &#039;update all&#039; durchführen.&lt;br /&gt;
&lt;br /&gt;
== Anwendung ==&lt;br /&gt;
=== Define ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;define &amp;lt;name&amp;gt; SIP&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Anschließend sollten alle sip_Attribute geprüft und für die eigene Umgebung gesetzt werden.&lt;br /&gt;
&lt;br /&gt;
Siehe auch [http://fhem.de/commandref_DE.html#SIP commandref]&lt;br /&gt;
&lt;br /&gt;
=== Attribute ===&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;sip_audiofile&#039;&#039;&#039;&lt;br /&gt;
: Audiofile das nach dem Command &#039;&#039;&#039;fetch&#039;&#039;&#039; abgespielt wird. Das Audiofile muss mit folgendem Command erzeugt werden&lt;br /&gt;
: &#039;&#039;&#039;sox &amp;lt;file&amp;gt;.wav -t raw -r 8000 -c 1 -e a-law &amp;lt;file&amp;gt;.alaw&#039;&#039;&#039;&lt;br /&gt;
: da nur das raw audio format unterstützt wird. Bitte darauf achten, dass das audiofile und der Pfad dort hin passende Permissions hat, damit FHEM das File auch lesen darf.&lt;br /&gt;
* &#039;&#039;&#039;sip_listen&#039;&#039;&#039;&lt;br /&gt;
: Das Attribut bietet folgende Optionen&lt;br /&gt;
: - &#039;&#039;&#039;none&#039;&#039;&#039;: keine Aktion (&#039;listen&#039; kann auch nicht manuell gestartet werden)&lt;br /&gt;
: - &#039;&#039;&#039;dtmf&#039;&#039;&#039;: Beim FHEM-Start geht das Device automatisch in den Status listen und wartet auf DTMF-Anrufer (listen_for_dtmf). Alternativ kann der Prozess manuell via &#039;listen&#039; gestartet werden.&lt;br /&gt;
: - &#039;&#039;&#039;wfp&#039;&#039;&#039;: Beim FHEM-Start geht das Device automatisch in den Status listen wait-fetch-play (listen_for_wfp). Alternativ kann der Prozess manuell via &#039;listen&#039; gestartet werden.&lt;br /&gt;
* &#039;&#039;&#039;sip_from&#039;&#039;&#039;&lt;br /&gt;
: Meine SIP-Client-Info. Default ist &amp;lt;nowiki&amp;gt;sip:620@fritz.box&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;sip_ip&#039;&#039;&#039;&lt;br /&gt;
: Die IP-Addresse meines FHEM-Servers.&lt;br /&gt;
* &#039;&#039;&#039;sip_port&#039;&#039;&#039;&lt;br /&gt;
: Port der für den SIP-Client genutzt wird. Default ist 5060 und wird automatisch um 10 erhöht wenn der Port nicht frei ist.&lt;br /&gt;
* &#039;&#039;&#039;sip_registrar&#039;&#039;&#039;&lt;br /&gt;
: Hostname oder IP-Addresse des SIP-Servers mit dem sich der Client verbindet. Default ist fritz.box.&lt;br /&gt;
* &#039;&#039;&#039;sip_ringtime&#039;&#039;&#039;&lt;br /&gt;
: Klingelzeit für ausgehende Anrufe.&lt;br /&gt;
* &#039;&#039;&#039;sip_user&#039;&#039;&#039;&lt;br /&gt;
: User Name des SIP-Clients. Default ist 620.&lt;br /&gt;
* &#039;&#039;&#039;sip_waits&#039;&#039;&#039;&lt;br /&gt;
: Interne Wartezeit in Sekunden bevor nach nicht erfolgreichem listen ein erneuter Versuch gestartet wird. &lt;br /&gt;
* &#039;&#039;&#039;sip_waittime&#039;&#039;&#039;&lt;br /&gt;
: Maximale Wartezeit bei listen_for_wfp bis das Gespräch automatisch angenommen wird.&lt;br /&gt;
&lt;br /&gt;
Siehe auch [http://fhem.de/commandref_DE.html#SIP commandref]&lt;br /&gt;
&lt;br /&gt;
=== Set ===&lt;br /&gt;
&lt;br /&gt;
Das Modul kennt derzeit folgende Commands&lt;br /&gt;
&lt;br /&gt;
* set &amp;lt;name&amp;gt; &#039;&#039;&#039;reset&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
: Stoppt laufende listen-Prozess und initalisiert das Device.&lt;br /&gt;
&lt;br /&gt;
* set &amp;lt;name&amp;gt; &#039;&#039;&#039;call &amp;lt;nummer&amp;gt; [&amp;lt;ringtime&amp;gt;] [&amp;lt;nachricht&amp;gt;]&#039;&#039;&#039;&lt;br /&gt;
: Startet einen Anruf an die angegebene Nummer.&lt;br /&gt;
: Optional kann die ringtime angegeben werden. Wird keine angegeben zieht das Attribut sip_ringtime. Default ist 10.&lt;br /&gt;
: Optional kann eine Nachricht in Form eines Audiofiles angegeben werden. Das File ist mit dem vollen Pfad oder dem relativen ab dem Verzeichnis mit fhem.pl anzugeben. Bitte darauf achten, dass das audiofile und der Pfad dort hin passende Permissions hat, damit FHEM das File auch lesen darf. Die ringtime ist in dem Fall nicht optional sondern anzugeben.&lt;br /&gt;
: Soll statt eines Audiofiles eine DTMF-Sequenz übertragen werden, so muss diese mit einem Prefix &#039;-&#039; versehen werden, also z.B. &#039;&#039;&#039;-&#039;&#039;&#039;#47.&lt;br /&gt;
&lt;br /&gt;
* set &amp;lt;name&amp;gt; &#039;&#039;&#039;listen&#039;&#039;&#039;&lt;br /&gt;
: Manueller Start des listen-Prozesses. Setzt voraus, dass die Variable sip_listen auf dtmf oder wfp gesetzt ist:&lt;br /&gt;
: &#039;&#039;&#039;dtmf&#039;&#039;&#039;: Der SIP-Client wird in einen Status versetzt in dem er automatisch Anrufe annimmt. Bei einem Anruf wird im Reading &#039;caller&#039; die Nummer bzw. Id des Anrufers angezeigt. Dem Anrufer wird der eigene Ton als Echo zurückgespielt. Über die Eingabe von &#039;&#039;&#039;#&#039;&#039;&#039; gefolgt von 2 Zahlen und anschließendem Auflegen kann eine Zahl an das Reading &#039;&#039;&#039;dtmf&#039;&#039;&#039; übergeben werden. Voraussetzung: Das anrufende Telefon ist auf Tonwahl gestellt (DTMF).&lt;br /&gt;
: &#039;&#039;&#039;wfp&#039;&#039;&#039;: Der SIP-Client wird in einen Status versetzt in dem er auf Anrufe wartet (wfp steht für wait-fetch-play). Erfolgt ein Anruf an den Client, wechselt das Reading &#039;caller_state&#039; zu &#039;ringing&#039;, im Reading &#039;caller&#039; wird die Nummer bzw. Id des Anrufers angezeigt. Nun kann das Gespräch via set-Command &#039;fetch&#039; angenommen werden. Das als sip_audiofile angegebene File wird abgespielt. Anschließend wechselt der Status wieder zu listen_for_wfp.&lt;br /&gt;
&lt;br /&gt;
=== Readings ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;caller&#039;&#039;&#039;: Die Rufnummer bzw. Info des aktuellen Anrufers. &lt;br /&gt;
* &#039;&#039;&#039;caller_state&#039;&#039;&#039;: Status für eingehende Anrufe. &lt;br /&gt;
* &#039;&#039;&#039;dtmf&#039;&#039;&#039;: Die via Tonwahl (DTMF) eingegebenen Zahlen.&lt;br /&gt;
* &#039;&#039;&#039;state&#039;&#039;&#039;: Der Status des Devices.&lt;br /&gt;
&lt;br /&gt;
== Anwendungsbeispiele ==&lt;br /&gt;
&lt;br /&gt;
=== Anruf tätigen und Sound abspielen ===&lt;br /&gt;
* Den Anruf initiieren&lt;br /&gt;
: &amp;lt;code&amp;gt;set &amp;lt;device&amp;gt; call &amp;lt;nummer&amp;gt; [&amp;lt;dauer&amp;gt;] [&amp;lt;audiofile&amp;gt;]&amp;lt;/code&amp;gt;&lt;br /&gt;
* Die Default-Dauer beträgt 10 Sekunden.&lt;br /&gt;
* Wird kein Audiofile angegeben, wird nur die Verbindung hergestellt und nach der Anrufdauer wieder unterbrochen.&lt;br /&gt;
* Anmerkung: Das Audiofile muss das Format PCM/8000 haben.&lt;br /&gt;
* Der Angerufene nimmt das Gespräch entgegen, das Audiofile wird abgespielt.&lt;br /&gt;
&lt;br /&gt;
=== Anruf tätigen und DTMF-Töne senden ===&lt;br /&gt;
* Den Anruf initiieren&lt;br /&gt;
: &amp;lt;code&amp;gt;set &amp;lt;device&amp;gt; call &amp;lt;nummer&amp;gt; &amp;lt;dauer&amp;gt; &amp;lt;-tastenkombination&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
* Die Tastenkombination muss mit einem Minus (-) nach der Zielnummer folgen, also z.B. **1 -#23&lt;br /&gt;
* Der Angerufene nimmt das Gespräch entgegen, die Tonfolge wird abgespielt.&lt;br /&gt;
&lt;br /&gt;
=== Auf Anruf warten und DTMF-Töne empfangen ===&lt;br /&gt;
* Der SIP-Client wird in den Listen-Modus versetzt.&lt;br /&gt;
: Das Attribut sip_listen auf &#039;&#039;&#039;dtmf&#039;&#039;&#039; setzen und&lt;br /&gt;
: &amp;lt;code&amp;gt;set &amp;lt;device&amp;gt; listen&amp;lt;/code&amp;gt;&lt;br /&gt;
* Die Nebenstelle des SIP-Clients wird von einem DTMF-fähigen Telefon aus angerufen.&lt;br /&gt;
* Wenn der SIP-Client das Gespräch angenommen hat, betätigt man &#039;&#039;&#039;#&#039;&#039;&#039;, gefolgt von zwei Ziffern und legt dann wieder auf.&lt;br /&gt;
* Im Reading &#039;&#039;&#039;dtmf&#039;&#039;&#039; ist diese zweistellige Zahl zu sehen und kann ggf. mit einem notify ausgewertet werden.&lt;br /&gt;
&lt;br /&gt;
=== Auf Anruf warten und kontrolliert annehmen ===&lt;br /&gt;
* Der SIP-Client wird in den Listen-Modus versetzt.&lt;br /&gt;
: Das Attribut sip_listen auf &#039;&#039;&#039;wfp&#039;&#039;&#039; setzen und&lt;br /&gt;
: &amp;lt;code&amp;gt;set &amp;lt;device&amp;gt; listen&amp;lt;/code&amp;gt;&lt;br /&gt;
* Die Nebenstelle des SIP-Clients wird angerufen.&lt;br /&gt;
* Im Reading &#039;&#039;&#039;caller&#039;&#039;&#039; ist die Nummer bzw. die Info des Callers zu sehen, im &#039;&#039;&#039;caller_state&#039;&#039;&#039; erscheint &#039;ringing&#039;.&lt;br /&gt;
* Soll der Anruf angenommen werden setze ich den Status des Devices mittels set auf &#039;&#039;&#039;fetch&#039;&#039;&#039;:&lt;br /&gt;
: &amp;lt;code&amp;gt;set &amp;lt;device&amp;gt; fetch&amp;lt;/code&amp;gt;&lt;br /&gt;
* Der SIP-Client nimmt den Anruf an und spielt das im Attribut sip_audiofile angegebene File ab.&lt;br /&gt;
* Der SIP-Client legt auf und geht wieder in den Status &#039;&#039;&#039;listen_for_wfp&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
=== Fritzbox + Doorline - Telefonklingeln beenden ===&lt;br /&gt;
Szenario: Als Türklingel ist eine Doorline im Einsatz die auf Direktannahme eingestellt ist. Klingelt jemand an der Tür, erfolgt ein &#039;Anruf&#039; an die in der Rufgruppe definierten Telefone. Man kann den Anruf entgegennehmen, um zu hören wer an der Tür ist, bevor man die Tür öffnet. Geht man direkt zur Tür, klingeln die Telefone insgesamt 30 Sekunden lang bis sie verstummen. Hat man die Haustür mit einem Türkontakt versehen, hilft folgender Ansatz:&lt;br /&gt;
* Der SIP-Client wird in der Fritzbox in die Rufgruppe der Türklingel aufgenommen.&lt;br /&gt;
* Das Attribut &#039;sip_listen&#039; wird auf &#039;wfp&#039; gesetzt.&lt;br /&gt;
* Der SIP-Client wird in den Listen-Modus &#039;wait-fetch-play&#039; versetzt (Die sip_waittime sollte größer als die Klingeldauer der Doorline sein).&lt;br /&gt;
: &amp;lt;code&amp;gt;set &amp;lt;device&amp;gt; listen&amp;lt;/code&amp;gt;&lt;br /&gt;
* Klingelt jemand an der Tür, wird unter anderem die Nebenstelle des SIP-Clients angerufen.&lt;br /&gt;
* Über ein DOIF greift man die Kombination SIP-Client caller_state &#039;ringing&#039; und Haustürkontakt closed-&amp;gt;open ab und&lt;br /&gt;
* setzt  den Status des Devices mittels set auf fetch:&lt;br /&gt;
: &amp;lt;code&amp;gt;set &amp;lt;device&amp;gt; fetch&amp;lt;/code&amp;gt;&lt;br /&gt;
* Der SIP-Client nimmt den Anruf an und spielt das im Attribut sip_audiofile angegebene File ab.&lt;br /&gt;
* Die Telefone verstummen.&lt;br /&gt;
&lt;br /&gt;
== Bekannte Probleme / Fehlersuche ==&lt;br /&gt;
=== Fehler bei der Registrierung an der Fritzbox ===&lt;br /&gt;
&#039;&#039;&#039;Fritzbox&#039;&#039;&#039;&lt;br /&gt;
* Ist das Device für den SIP-Client in der Fritzbox unter Telefonie &amp;gt; Telefoniegräte gelistet? &lt;br /&gt;
* Geräteeinstellungen ändern: Ist für das Device unter &#039;Anmeldedaten&#039; die Durchwahl als Benutzername angegeben?&lt;br /&gt;
* Ist der in dieser Ansicht angegebene &#039;Registrar&#039; mit der im Attribut sip_registrar identisch? Im Zweifelsfalle die IP-Adresse statt &#039;fritz.box&#039; verwenden.&lt;br /&gt;
* FitzOS ab 6.80: Wurde nach Definition des Gerätes an einem anderen bekannten Gerät der Bestätigungscode eingegeben?&lt;br /&gt;
&#039;&#039;&#039;FHEM&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Attribute des Devices prüfen:&lt;br /&gt;
* Ist unter sip_from &amp;lt;nowiki&amp;gt;&#039;sip:620@fritz.box&#039;&amp;lt;/nowiki&amp;gt; die von der Fritzbox vergebene Durchwahl angegeben?&lt;br /&gt;
* Ist unter sip_user die von der Fritzbox vergebene Durchwahl angegeben?&lt;br /&gt;
* Ist unter sip_password das in der Fritzbox hinterlegte Passwort eingetragen?&lt;br /&gt;
* Ist unter sip_registrar die IP-Adresser der Fritzbox eingetragen?&lt;br /&gt;
* Ist unter sip_ip die IP-Adresse des FHEM-Servers eingetragen (z.B. 192.168.178.47 angeben, keine Adresse aus dem 127er-Segment)?&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
* {{Link2Forum|Topic=40219|LinkText=Forenthread}} alter Forum-Thread zu FB_SIP.pm und SIP.pm&lt;br /&gt;
* {{Link2Forum|Topic=67443|LinkText=Forenthread}} Forum-Thread zu diesem Modul SIP&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Hilfsmodul]] &lt;br /&gt;
&amp;lt;!-- (Modulkategorie wird automatisch gesetzt) --&amp;gt;&lt;/div&gt;</summary>
		<author><name>Hartenthaler</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=Diskussion:Hauptseite&amp;diff=19665</id>
		<title>Diskussion:Hauptseite</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=Diskussion:Hauptseite&amp;diff=19665"/>
		<updated>2017-02-10T15:13:04Z</updated>

		<summary type="html">&lt;p&gt;Hartenthaler: Neuer Abschnitt /* FHEM Icon auf der Hauptseite */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Archivierung der &amp;quot;Sonderhinweise&amp;quot; nach Umstellung der Forums-Software ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Sonderaktivitäten nach Umstellung des Fhem Forums auf eine andere Software:&#039;&#039;&lt;br /&gt;
* Links auf einen Forenthread können nach folgendem Schema korrigiert werden:&lt;br /&gt;
::&amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;http://forum.fhem.de/index.php?t=msg&amp;amp;th=12345&amp;amp;prevloaded=1&amp;amp;rid=0&amp;amp;start=0&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
:wird zu&lt;br /&gt;
::&amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;http://forum.fhem.de/index.php/topic,12345.0.html&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
* Die Korrektur eines Links auf einen bestimmten Beitrag ist etwas schwieriger, da beim neuen Forum die Thread-Nummer (????? im folgenden Beispiel) notwendig ist, die in den alten Links nicht zur Verfügung steht&lt;br /&gt;
::&amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;http://forum.fhem.de/index.php?t=msg&amp;amp;goto=77777&amp;amp;rid=111 ...&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
:wird zu&lt;br /&gt;
::&amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;http://forum.fhem.de/index.php/topic,?????.msg77777.html#msg77777&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Vorschläge zur Überarbeitung der Hauptseite ==&lt;br /&gt;
&lt;br /&gt;
Vorschläge von [[Benutzer Diskussion:Krikan|Christian]] zur Überarbeitung der [[Hauptseite]] (übernommen von [[Benutzer Diskussion:Ph1959de#Inhalt Hauptseite|hier]]):&lt;br /&gt;
# &amp;lt;strike&amp;gt;Developers Corner: &amp;quot;bessere&amp;quot; Links&amp;lt;/strike&amp;gt; (erledigt)&lt;br /&gt;
# &amp;lt;strike&amp;gt;&amp;quot;Guter Startpunkt...&amp;quot; stärker betonen/hervorheben -&amp;gt; Für Grundverständnis von Fhem zwingend zu lesen / Basislektüre&amp;lt;/strike&amp;gt;(erledigt)&lt;br /&gt;
# Tipp der Woche / des Monats: beleben/aktiver pflegen oder einstellen&lt;br /&gt;
# &amp;lt;strike&amp;gt;Entfernung der Box &amp;quot;Weitere Informationen&amp;quot; auf der Hauptseite: &amp;quot;wichtige Fhem Links&amp;quot; ist veraltet/Löschkandidat und sollte daher von Hauptseite entfernt werden. Der Link zum Forum steht bereits in der Box &amp;quot;Was ist Fhem&amp;quot;. Dort könnte auch der Link zur Fhem-Seite untergebracht werden. Doppelte Nennung auf der Hauptseite ist unnötig. &amp;quot;Glossar&amp;quot; gehört zur Box &amp;quot;Wie fange ich an?&amp;quot;. Damit wäre die Box &amp;quot;Weitere Informationen&amp;quot; überflüssig und könnte gelöscht werden.&amp;lt;/strike&amp;gt; (erledigt)&lt;br /&gt;
# &amp;lt;strike&amp;gt;Multimedia (Unterhaltungselektronik) und Z-Wave unter Hardware verlinken&amp;lt;strike&amp;gt; (erledigt)&lt;br /&gt;
# &amp;lt;strike&amp;gt;Link &amp;quot;Andere Komponeten&amp;quot; zur Forumsangleichung in &amp;quot;Andere Komponenten/Sonstige Systeme&amp;quot; umbenennen (niedrige Priorität)&amp;lt;/strike&amp;gt; (erledigt)&lt;br /&gt;
# Modul-Orientierten Einstieg auf Hauptseite einbinden (durch Infobox-Vorlagen einfach möglich)&lt;br /&gt;
# Frontends auf der Haupseite einbinden&amp;lt;br /&amp;gt;&amp;lt;hr /&amp;gt;Ist, wie auch der vorherige Punkt nicht ohne &amp;quot;Risiken&amp;quot;: irgendwie (noch diffus) wäre es mir lieber, es werden auf der Hauptseite nicht &amp;quot;alle möglichen Abkürzungen&amp;quot; angeboten, sondern die &amp;quot;Leser&amp;quot; würden häufiger über Seiten wie &amp;quot;Systemübersicht&amp;quot;, &amp;quot;Phasen...&amp;quot; etc. auf die jeweiligen Unterseiten gehen müssen. Irgendwie eine Frage der Art &amp;quot;zu welcher Arbeitsweise &#039;&#039;&#039;erziehen&#039;&#039;&#039; wir die Benutzer - und wie &#039;&#039;&#039;zwingen&#039;&#039;&#039; wir sie, die Konzepte und Grundlagen gelesen und verstanden zu haben, bevor sie in Details gehen&amp;quot;. --[[Benutzer:Ph1959de|Peter]] ([[Benutzer Diskussion:Ph1959de|Diskussion]]) 08:50, 3. Sep. 2014 (UTC) &amp;lt;hr /&amp;gt; Ja, aber dann müssten die Seiten &amp;quot;Systemübersicht&amp;quot;, &amp;quot;Phasen...&amp;quot; etc. auch gut gepflegt sein, momentan machen die eher einen unfertigen (sorry) Eindruck auf mich. Und dann sind wir bei der Frage: Ist das Wiki ein Lehr- oder Nachschlagewerk? Oder wollen wir beides erreichen. Frontends finde ich wichtig, da das Wiki nach meinem Eindruck dort schmal besetzt ist und die Benutzer (ich auch) immer wieder Probleme beim WebFrontend haben. Da sind wir auch bei meiner hier irgendwo hinterlassenen Frage: Wo schreibe ich etwas über devstateIcon, webcmd usw.? Allein durch Deine heutige Umstellung der Hauptseite &amp;quot;Wo fange ich an&amp;quot;, sollte bereits einiges erreicht sein. Die, die nicht lesen wollen, werden nicht lesen.--[[Benutzer:Krikan|Krikan]] ([[Benutzer Diskussion:Krikan|Diskussion]]) 09:25, 3. Sep. 2014 (UTC)&amp;lt;hr /&amp;gt;[[Systemübersicht]] sollte eigentlich relativ &amp;quot;in Ordnung&amp;quot; sein. Ansonsten (bei [[Planung]], etc.) ist das ein bisschen ein Henne/Ei Problem. Ich hatte gehofft, dass die lieben Leser &amp;quot;diese Wege&amp;quot; gehen und gleichzeitig aktiv mithelfen, sie &amp;quot;auszubauen&amp;quot;. [[Benutzer:Ph1959de|Peter]] ([[Benutzer Diskussion:Ph1959de|Diskussion]]) 11:12, 3. Sep. 2014 (UTC) &amp;lt;br /&amp;gt;&amp;lt;hr /&amp;gt;&lt;br /&gt;
::* 1.: Developers Corner: geändert, da keine (Gegen-)meinungen --[[Benutzer:Krikan|Krikan]] ([[Benutzer Diskussion:Krikan|Diskussion]]) 14:29, 28. Aug. 2014 (UTC)&lt;br /&gt;
::* 5. teilweise: Unterhaltungselektronik verlinkt --[[Benutzer:Krikan|Krikan]] ([[Benutzer Diskussion:Krikan|Diskussion]]) 08:38, 29. Aug. 2014 (UTC)&lt;br /&gt;
::* 2.: UliMs Einsteiger-PDF stärker betont--[[Benutzer:Krikan|Krikan]] ([[Benutzer Diskussion:Krikan|Diskussion]]) 06:43, 3. Sep. 2014 (UTC)&lt;br /&gt;
::* 4.: Wenn es keine begründeten Gegenmeinung zur Löschung Box &amp;quot;Weitere Informationen&amp;quot; entsprechend obiger Erläuterung gibt, wird dies in den nächsten Tagen umgesetzt--[[Benutzer:Krikan|Krikan]] ([[Benutzer Diskussion:Krikan|Diskussion]]) 09:48, 24. Sep. 2014 (UTC)&lt;br /&gt;
&amp;lt;hr&amp;gt;&lt;br /&gt;
Hallo Peter! Mit Deiner letzten Änderung auf der Hauptseite wurde -wenn ich das richtig verstehe- die rechte Spalte verbreitert. War das Absicht? Eigentlich finde ich links deutlich wichtiger. Gruß, Christian --[[Benutzer:Krikan|Krikan]] ([[Benutzer Diskussion:Krikan|Diskussion]]) 08:38, 29. Aug. 2014 (UTC)&lt;br /&gt;
:Jein - ich habe von einer fixen Spaltenbreite (550px, was bei mir deutlich breiter war, als aktuell) auf 45%/55%-Aufteilung geändert. Damit sind auf jeden Fall die Spaltenlängen mal deutlich ausgewogener geworden und sind auf jeden Fall nicht mehr so stark abhängig von der Bildschirmauflösung der einzelnen Benutzer.&lt;br /&gt;
:Kann aber gern nochmal geändert werden - nur bitte nicht auf Fixbreite einer Spalte.&lt;br /&gt;
::Änderung halte ich (noch) nicht für zwingend.--[[Benutzer:Krikan|Krikan]] ([[Benutzer Diskussion:Krikan|Diskussion]]) 08:32, 3. Sep. 2014 (UTC)&lt;br /&gt;
&lt;br /&gt;
== Einbindung FLOORPLAN Einrichtungsleitfaden auf Hauptseite sinnvoll? ==&lt;br /&gt;
Die Einbindung des FLOORPLAN Einrichtungsleitfadens auf der Hauptseite passt meiner Meinung nach nicht in das Konzept der Hauptseite. Beim Einrichtungsleitfaden handelt es sich um ein &#039;&#039;&#039;modulspezifisches&#039;&#039;&#039; und kein übergreifendes Dokument. Zudem ist das Dokument bereits auf der FLOORPLAN-Wiki-Seite, UliMs Einsteiger-PDF und in der Commandref zu FLOORPLAN verlinkt. Wer das Dokument über diese Wege nicht gefunden/gelesen hat, wird es auch durch Aufnahme auf die Hauptseite nicht finden/lesen. Welche modulspezifischen Dokumente müssten dann nicht auch noch auf der Hauptseite verlinkt werden, weil sie in irgendeiner Form wichtig und gut sind? Ich würde daher die Einbindung wieder zurücknehmen. --[[Benutzer:Krikan|Krikan]] ([[Benutzer Diskussion:Krikan|Diskussion]]) 18:43, 17. Okt. 2014 (UTC)&lt;br /&gt;
&amp;lt;hr /&amp;gt;&lt;br /&gt;
:Hallo Christian, ich stimme Dir zu und bin auch für &amp;quot;wieder entfernen&amp;quot;. Ich schreibe aber [[Benutzer Diskussion:Fiedel|Fiedel]] noch mal direkt an - möglicherweise bekommt er die Diskussion hier gar nicht mit. --[[Benutzer:Ph1959de|Peter]] ([[Benutzer Diskussion:Ph1959de|Diskussion]]) 05:25, 22. Okt. 2014 (UTC)&lt;br /&gt;
:&amp;lt;hr /&amp;gt;&lt;br /&gt;
::Hallo ihr Beiden, das wäre kein Problem für mich. Zu dem Schritt habe ich mich entschieden weil Floorplan mittlerweile viel mehr ist als nur ein beliebiges FHEM-Modul. Er ist quasi fester Bestandteil des Frontends geworden und wird entsprechend genutzt. Als langjähriges Forenmitlglied sehe ich immer häufiger Fragen die darauf hindeuten, dass die Benutzer das FP-Manual nicht gelesen und vor Allem nicht gefunden haben. Meine Hoffnung war, das Forum von solchen Fragen zu entlasten. Außerdem sind das Einsteiger-PDF und das FP-PDF die einzigen beiden &amp;quot;kompletten Bücher&amp;quot;, die es zu FHEM gibt. Eine Idee wäre noch beide zu vereinen... Soviel zu meiner Motivation. Ihr hattet übrigens Recht - ich hätte ohne die Nachricht nie etwas von dieser Diskussion mitbekommen. Bin im Wiki noch nicht so fit, dass ich alle &amp;quot;Ecken&amp;quot; dort kenne. Viele Grüße --[[Benutzer:Fiedel|Fiedel]] ([[Benutzer Diskussion:Fiedel|Fiedel]]) 08:27, 24. Okt. 2014 (UTC)&lt;br /&gt;
::&amp;lt;hr /&amp;gt;&lt;br /&gt;
:::Ok, dann nehme ich das wieder raus.&lt;br /&gt;
:::Zum Thema &amp;quot;Ecken des Wiki&amp;quot; ... sowas siehst Du vermutlich auch nur, wenn Du die Liste der Änderungen im Wiki immer mal wieder zumindest &amp;quot;überfliegst&amp;quot;. --[[Benutzer:Ph1959de|Peter]] ([[Benutzer Diskussion:Ph1959de|Diskussion]]) 06:58, 24. Okt. 2014 (UTC)&lt;br /&gt;
&lt;br /&gt;
== Bereich &amp;quot;Wie fange ich an?&amp;quot; ==&lt;br /&gt;
&lt;br /&gt;
Ich denke im Bereich &amp;quot;Wie fange ich an?&amp;quot; sollten noch ein paar wenige Links mit aufgenommen werden, die für den Einstieg wichtig sind. Alternativ sollten diese Links anderweitig stärker hervorgehoben werden um leichter gefunden werden zu können.&lt;br /&gt;
&lt;br /&gt;
Bsp.:&lt;br /&gt;
* [[Konfiguration]]: Gerade für Neulinge ist die einzige direkt verfügbare Verlinkung dorthin im Fliesstext der Seite [[Systemübersicht#Konfiguration]] - und da hätte ich sie nicht gesucht, und selbst wenn übersieht man es schnell.&lt;br /&gt;
-- [[Benutzer:Fabian|Fabian]] ([[Benutzer Diskussion:Fabian|Diskussion]]) 10:25, 20. Mär. 2015 (CET)&lt;br /&gt;
&lt;br /&gt;
== Löschung des Links auf Kategorie &amp;quot;Kopp Components&amp;quot; ==&lt;br /&gt;
Vor 2 Monaten wurde auf der Hauptseite ein Link auf die damals neu eingerichtete Kategorie &amp;quot;Kopp Components&amp;quot; aufgenommen. Diese Kategorie ist nur ein &amp;quot;Stub&amp;quot; und enthält keine Informationen. Der einzige dort verlinkte Artikel &amp;quot;Kopp Allgemein&amp;quot; ist auch noch nicht fertig gestellt. Bisher wurden Kategorien erst auf der Hauptseite aufgenommen, wenn allgemeine Bedeutung, Vollständigkeit der Kategorie/Artikel und auch eine gewisse Anzahl von Artikeln in der Kategorie vorhanden waren. Alle diese Kriterien kann ich derzeit nicht als erfüllt erkennen. Ich würde daher den Link auf &amp;quot;Kopp Components&amp;quot; auf der Hauptseite löschen und erst dann wieder aufnehmen, wenn die Kriterien -wie sonst auch- erfüllt sind. Meiner Meinung nach ist es nicht sinnvoll solche Kategorien im Aufbau derart prominent zu platzieren. Gibt es Gegenmeinung?&lt;br /&gt;
Gruß, --[[Benutzer:Krikan|Christian]] ([[Benutzer Diskussion:Krikan|Diskussion]]) 20:21, 23. Mär. 2016 (CET)&lt;br /&gt;
&amp;lt;hr /&amp;gt;&lt;br /&gt;
: Dafür. Ich würde sogar so weit gehen, die Kategorie &amp;quot;unter Beobachtung&amp;quot; zu nehmen - und wieder zu löschen, wenn sich in den nächsten Monaten keine Aktivitäten zeigen. Den einen Artikel würde ich dann in &amp;quot;Other components&amp;quot; einsortieren. --[[Benutzer:Ph1959de|Peter]] ([[Benutzer Diskussion:Ph1959de|Diskussion]]) 20:53, 23. Mär. 2016 (CET)&lt;br /&gt;
&amp;lt;hr /&amp;gt;&lt;br /&gt;
:: Erledigt. Wiederaufnahme nach Erfüllung der Kriterien möglich. Kategorienlöschung und Artikelverschiebung sehe ich genauso, wenn es in den nächsten Monaten keine Fortentwicklung gibt. --[[Benutzer:Krikan|Christian]] ([[Benutzer Diskussion:Krikan|Diskussion]]) 21:32, 23. Mär. 2016 (CET)&lt;br /&gt;
&lt;br /&gt;
== Ergänzung um allgemeine Ausführung &amp;quot;Was ist FHEM Wiki&amp;quot; ==&lt;br /&gt;
&lt;br /&gt;
Gestern gab es im Forum die Anfrage, ob man in die Sidebar einen Link zur commandref aufnehmen kann. Richtig glücklich bin ich darüber nicht, aber wenn das überwiegend befürwortet wird, können wir das gerne machen.&lt;br /&gt;
&lt;br /&gt;
Mein ursprünglicher Plan, der das Thema commandref-link mit abdecken sollte, war:&lt;br /&gt;
Zusätzlich zur Box &amp;quot;Was ist FHEM&amp;quot; eine Box &amp;quot;Was ist FHEM Wiki&amp;quot; aufzunehmen. Dort wollte ich einen Hinweis folgender Art aufnehmen: &amp;quot;Das FHEM Wiki ergänzt die tagesaktuelle, von den zuständigen Entwicklern gepflegte commandref (Kommando-Referenz) um weitergehende Informationen zu FHEM. Im Wiki arbeiten Nutzer und Entwickler gemeinsam an zusätzlicher Dokumentation von FHEM und damit zusammenhängenden Themen.&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Was meint ihr? Gruß, --[[Benutzer:Krikan|Christian]] ([[Benutzer Diskussion:Krikan|Diskussion]]) 10:41, 26. Jan. 2017 (CET)&lt;br /&gt;
&amp;lt;hr /&amp;gt;&lt;br /&gt;
:Habe den Wunsch im Forum auch gesehen ... und denke, dass es durchaus berechtigt und sinnvoll wäre, die commandref aufzunehmen. Ist für nicht-Developer z.B. deutlich wichtiger, als der Link zum SVN. Das einzige Gegenargument, das ich im Augenblick sehe: commandref ist keine eigene Subdomain, aber ich denke, das ist auch nicht das Hauptkriterium für die Aufnahme in die Linkliste. &lt;br /&gt;
:Deinen Vorschlag &amp;quot;Was ist FHEM Wiki&amp;quot; finde ich auch gut. Würde in die rechte Spalte zwischen &amp;quot;News&amp;quot; und &amp;quot;Letzte Änderungen&amp;quot; passen ... dafür würde ich evtl. Teile (oder vielleicht sogar alles) aus der &amp;quot;Administratives zum Wiki&amp;quot; Box auslagern in Unterseiten. --[[Benutzer:Ph1959de|Peter]] ([[Benutzer Diskussion:Ph1959de|Diskussion]]) 13:21, 26. Jan. 2017 (CET)&lt;br /&gt;
&amp;lt;hr&amp;gt;&lt;br /&gt;
::Platziere mal einen commandref-Link in der Sidebar. Trenne das aber erst einmal von den SubDomain-Links. Die sind entsprechend auf allen SubDomains enthalten und würde es daher gerne so beibehalten.&lt;br /&gt;
::Bei &amp;quot;Adminstratives zum Wiki&amp;quot; würde ich &amp;quot;Aktivitäten für Administratoren:&amp;quot; herausnehmen. Das stört mich schon länger. Die dortige Absichtserklärung &amp;quot;Vorschlag&amp;quot; sollten wir entweder umsetzen oder beerdigen. Der Rest ist mMn nicht unwichtig. &lt;br /&gt;
::Mit der Positionierung von &amp;quot;Was ist FHEM Wiki&amp;quot; bin ich mir selbst noch nicht sicher. Spiele mal etwas--[[Benutzer:Krikan|Christian]] ([[Benutzer Diskussion:Krikan|Diskussion]]) 15:00, 26. Jan. 2017 (CET)&lt;br /&gt;
&amp;lt;hr&amp;gt;&lt;br /&gt;
::Meine eigene Zufriedenheit mit den Anpassungen ist nicht sehr groß, aber mir fällt keine bessere Lösung ein:&lt;br /&gt;
::Text in &amp;quot;Was ist FHEM&amp;quot; nimmt viel Platz ein, beschreibt aber FHEM klar und eindeutig und macht mMn auch die Möglichkeiten=Komplexität von FHEM klar.&lt;br /&gt;
::&amp;quot;Was ist FHEM Wiki&amp;quot; gefällt mir von der Platzierung nicht und macht die Hauptseite wegen der wechselnden Schriftgröße unruhig. Auf der anderen Seite möchte ich die Schrift nicht verkleinern.&lt;br /&gt;
::--[[Benutzer:Krikan|Christian]] ([[Benutzer Diskussion:Krikan|Diskussion]]) 09:27, 1. Feb. 2017 (CET)&lt;br /&gt;
&amp;lt;hr&amp;gt;&lt;br /&gt;
:::Wie wär&#039;s, wenn &amp;quot;Was ist FHEM Wiki&amp;quot; unter &amp;quot;Was ist FHEM&amp;quot; stehen würde? Macht irgendwie vom Lesefluss her Sinn. News, Änderungen, Neue Seiten wären dann auch wieder untereinander und haben alle die selbe Schriftgröße&lt;br /&gt;
:::&amp;quot;Administratives...&amp;quot; könnte man auf eine eigene Seite auslagern und die als &amp;quot;Mitmachen&amp;quot; in der Navigationsleiste verlinken&lt;br /&gt;
:::Gruß, --[[Benutzer:Drhirn|Drhirn]] ([[Benutzer Diskussion:Drhirn|Diskussion]]) 09:55, 1. Feb. 2017 (CET)&lt;br /&gt;
&amp;lt;hr&amp;gt;&lt;br /&gt;
::::die idee &#039;Was ist FHEM Wiki?&#039; nach links (vielleicht zwischen ‘Was ist FHEM?&#039; und &#039;Wie fange ich an?&#039;) zu schieben finde ich gut. vielleicht könnte man &#039;Ideen und Lösungen&#039; dafür nach rechts schieben unter die news schieben. dann wären links eher themen die sich mich dem einsteig, was ist was und der entwicklung und sonstigen meta informationen beschäftigen und rechts neuigkeiten und infos zum eigentlichen betrieb. lasse wäre es wenn die &#039;weniger wichtigen&#039; boxen weiter unten bis auf die überschrift ein und aus zu klappen wären.&lt;br /&gt;
:::: --[[Benutzer:Justme|Justme]] ([[Benutzer Diskussion:Justme|Diskussion]]) 20:09, 1. Feb. 2017 (CET)&lt;br /&gt;
&amp;lt;hr&amp;gt;&lt;br /&gt;
:::::Ein-/Ausklappen geht, indem man einen HTML-Element einfach die CSS-Klasse &amp;quot;mw-collapsible&amp;quot; gibt. Soll der Abschnitt im Initial-Zustand eingeklappt sein, auch die CSS-Klasse &amp;quot;mw-collapsed&amp;quot;.&lt;br /&gt;
:::::Beispiel auf: [[Benutzer:Drhirn]]&lt;br /&gt;
:::::--[[Benutzer:Drhirn|Drhirn]] ([[Benutzer Diskussion:Drhirn|Diskussion]]) 09:00, 2. Feb. 2017 (CET)&lt;br /&gt;
&amp;lt;hr&amp;gt;&lt;br /&gt;
::::::Stefan, wenn Du Lust und Zeit hast, kannst Du die hier gemachten Vorschläge mal testweise verwirklichen. Nur auf der eigenen Seite testen ist doch unschön und rückgängig können wir es immer machen :-) . Einklappen sehe ich kritisch, da das Nichtlesen fördert. Versuch schadet aber nicht. --[[Benutzer:Krikan|Christian]] ([[Benutzer Diskussion:Krikan|Diskussion]]) 11:35, 2. Feb. 2017 (CET)&lt;br /&gt;
&amp;lt;hr&amp;gt;&lt;br /&gt;
:::::::Ich schau mir grad in meinem Test-Wiki an, ob man das eventuell überhaupt anders hin bekommt. Schlage z.B. vor, eher mit CSS-Klassen zu arbeiten, als für jeden &amp;quot;Abschnitt&amp;quot; CSS-Styles zu definieren.&lt;br /&gt;
:::::::Nehme an, ein zweispaltiges Layout ist gewünscht, oder?&lt;br /&gt;
:::::::&amp;lt;span style=&amp;quot;text-decoration: line-through;&amp;quot;&amp;gt;Werde aber auf jeden Fall die bisherigen Vorschläge testweise umsetzen.&amp;lt;/span&amp;gt;&lt;br /&gt;
:::::::Bevor ich etwas mache noch ein Vorschlag: &#039;&#039;&amp;quot;Was ist FHEM&amp;quot;&#039;&#039; links oben, &#039;&#039;&amp;quot;Wie fange ich an&amp;quot;&#039;&#039; rechts oben, &#039;&#039;&amp;quot;Was ist FHEM-Wiki&amp;quot;&#039;&#039; links unten und &#039;&#039;&amp;quot;Ideen und Lösungen&amp;quot;&#039;&#039; rechts unten. Dann wäre alles für den Benutzer wesentliche auf der &amp;quot;ersten Bildschirmseite&amp;quot;. Den Rest dann darunter.&lt;br /&gt;
:::::::--[[Benutzer:Drhirn|Drhirn]] ([[Benutzer Diskussion:Drhirn|Diskussion]]) 12:57, 2. Feb. 2017 (CET)&lt;br /&gt;
::::::::Bitte mich nicht überfordern, bin nicht mehr so flexibel ;-) Wenn Du radikale Brüche machen willst, dann präsentiere das bitte zunächst auf Deiner persönlichen Seite. Bisher haben sich die anderen Admins nicht zu Wort gemeldet und ich kann/will das bei gravierenden Umbauten nicht alleine entscheiden. Gruß, --[[Benutzer:Krikan|Christian]] ([[Benutzer Diskussion:Krikan|Diskussion]]) 13:33, 2. Feb. 2017 (CET)&lt;br /&gt;
&amp;lt;hr&amp;gt;&lt;br /&gt;
:::::::: :D&lt;br /&gt;
::::::::Alles klar, melde mich wieder mit einem Entwurf --[[Benutzer:Drhirn|Drhirn]] ([[Benutzer Diskussion:Drhirn|Diskussion]]) 13:50, 2. Feb. 2017 (CET)&lt;br /&gt;
&amp;lt;hr&amp;gt;&lt;br /&gt;
::::::::Hier ein - nochmal geänderter - Vorschlag: [https://wiki.jft.at/FhemHaupt https://wiki.jft.at/FhemHaupt]&lt;br /&gt;
&amp;lt;hr&amp;gt;&lt;br /&gt;
:::::::::Ist ja gar nicht so radikal, wie ich befürchtet hatte. ;-) Habe damit kein Problem. Mal abwarten, was andere meinen. --[[Benutzer:Krikan|Christian]] ([[Benutzer Diskussion:Krikan|Diskussion]]) 18:09, 2. Feb. 2017 (CET)&lt;br /&gt;
::::::::&amp;lt;hr&amp;gt;&lt;br /&gt;
:::::::::Sorry, habe die ganze Diskussion erst jetzt mitbekommen. Also der Vorschlag gefällt mir sehr gut. Vielleicht noch kleinere Änderungen, wenn das im &amp;quot;echten&amp;quot; Wiki umgesetzt ist - mein Ok dafür hast Du. --[[Benutzer:Ph1959de|Peter]] ([[Benutzer Diskussion:Ph1959de|Diskussion]]) 07:45, 3. Feb. 2017 (CET)&lt;br /&gt;
&amp;lt;hr&amp;gt;&lt;br /&gt;
Ich fang mal wieder von vorne an. Schade um den Platz ;)&lt;br /&gt;
&lt;br /&gt;
Irgendjemand müsste mir bitte die CSS-Klassen &#039;&#039;.mainpagebox&#039;&#039; und &#039;&#039;.flexbox&#039;&#039; von https://wiki.jft.at/MediaWiki:Common.css hier in die [[MediaWiki:Common.css]] eintragen. Ich darf leider nicht. --[[Benutzer:Drhirn|Drhirn]] ([[Benutzer Diskussion:Drhirn|Diskussion]]) 14:24, 3. Feb. 2017 (CET)&lt;br /&gt;
&amp;lt;hr&amp;gt;&lt;br /&gt;
:Ist drin. --[[Benutzer:Krikan|Christian]] ([[Benutzer Diskussion:Krikan|Diskussion]]) 14:34, 5. Feb. 2017 (CET)&lt;br /&gt;
&amp;lt;hr&amp;gt;&lt;br /&gt;
::Und die Seite umgebaut.&lt;br /&gt;
::Info: Die Anordnung der Boxen kann mit &#039;&#039;style=&amp;quot;order: X&amp;quot;&#039;&#039; angepasst werden. Eine Box ist jeweils die Hälfte des Platzes breit. Soll eine Box über die gesamte Breite gehen, einfach &#039;&#039;style=&amp;quot;flex: 1 1 80%&amp;quot;&#039;&#039; angeben (wie bei den News z.B.).&lt;br /&gt;
::War dann noch die Überlegung, ob wir das &amp;quot;Administrative&amp;quot; auf eine eigene Seite auslagern sollen. Ist der Plan angenommen?&lt;br /&gt;
::--[[Benutzer:Drhirn|Drhirn]] ([[Benutzer Diskussion:Drhirn|Diskussion]]) 11:00, 6. Feb. 2017 (CET)&lt;br /&gt;
&amp;lt;hr&amp;gt;&lt;br /&gt;
:::Danke. Wie immer nur das Gemecker: Mich stört die Schriftart der Überschrift. Fand die alte (Arial?) besser. Bin ich da alleine?&lt;br /&gt;
:::&amp;quot;Administratives&amp;quot; würde ich auslagern. Eigentlich müsste das dem &amp;quot;Benutzerkonto beantragen&amp;quot; vorgesetzt werden.&lt;br /&gt;
:::--[[Benutzer:Krikan|Christian]] ([[Benutzer Diskussion:Krikan|Diskussion]]) 12:11, 6. Feb. 2017 (CET)&lt;br /&gt;
&amp;lt;hr&amp;gt;&lt;br /&gt;
::::Nein, ich fand die Schrift auch nicht gut. War mir nur nicht ganz sicher, ob das nicht vorher auch so war. Wie auch immer, hab den ursprünglichen Zustand nachgebaut (hab aus Suchmaschinengründen ein &#039;&#039;h1&#039;&#039; für den Titel verwendet, da ist aber ein ganz anderer Stil hinterlegt).&lt;br /&gt;
::::Zum Thema &amp;quot;Adminstratives&amp;quot;: Wie ich bereits geschrieben habe, würde ich einfach eine Seite &amp;quot;Mitmachen&amp;quot; erstellen. Dort die Regeln festlegen und Infos geben. Und dann am Schluss den Hinweis darauf, wie man ein Benutzerkonto beantragt. --[[Benutzer:Drhirn|Drhirn]] ([[Benutzer Diskussion:Drhirn|Diskussion]]) 12:57, 6. Feb. 2017 (CET)&lt;br /&gt;
&amp;lt;hr&amp;gt;&lt;br /&gt;
:::::Denke nur daran, dass die &amp;quot;alte&amp;quot; Wiki-Seite zum Benutzerkontenantrag von überall verlinkt ist.&lt;br /&gt;
:::::Im Nachhinein störe ich mich etwas am verschwendeten Platz bei &amp;quot;Ideen und Lösungen&amp;quot; und &amp;quot;Developers Corner&amp;quot;. Habe aber keine Ideen.&lt;br /&gt;
:::::Wegen Schriftstil gehe ich insgesamt noch mal auf Suche. Ursprünglich war es mal serifenlos und ist das verlorengegangen.&lt;br /&gt;
:::::--[[Benutzer:Krikan|Christian]] ([[Benutzer Diskussion:Krikan|Diskussion]]) 17:02, 6. Feb. 2017 (CET)&lt;br /&gt;
&amp;lt;hr&amp;gt;&lt;br /&gt;
::::::Hehe, der verschwendete Platz hat mich viel Zeit gekostet. Habe leider keine schöne Lösung gefunden und mir gedacht, wenn&#039;s jemand stört, dann soll er einfach mehr Text dazu schreiben ;). Aber ich kann mir auch etwas anderes einfallen lassen wenn&#039;s gewünscht ist.&lt;br /&gt;
::::::Die Schrift ist jetzt genau die selbe, wie in der Version vom 13. Jänner. Wie&#039;s davor war, kann ich leider nicht sagen.&lt;br /&gt;
::::::Für die &amp;quot;alte Wiki-Seite zum Benuterkontenantrag können wir einfach eine Weiterleitung erstellen&lt;br /&gt;
::::::Gruß, --[[Benutzer:Drhirn|Drhirn]] ([[Benutzer Diskussion:Drhirn|Diskussion]]) 17:33, 6. Feb. 2017 (CET)&lt;br /&gt;
&lt;br /&gt;
== FHEM Icon auf der Hauptseite ==&lt;br /&gt;
&lt;br /&gt;
... anscheinend wird FHEM überall in Großbuchstaben als FHEM geschrieben, nur das Icon hier im wiki verwendet die Schreibweise Fhem. &lt;br /&gt;
[[Benutzer:Hartenthaler|Hartenthaler]] ([[Benutzer Diskussion:Hartenthaler|Diskussion]]) 16:13, 10. Feb. 2017 (CET)&lt;/div&gt;</summary>
		<author><name>Hartenthaler</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=TRAFFIC&amp;diff=18003</id>
		<title>TRAFFIC</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=TRAFFIC&amp;diff=18003"/>
		<updated>2016-12-23T14:00:43Z</updated>

		<summary type="html">&lt;p&gt;Hartenthaler: /* Integrierte Karte */ Formulierungen überarbeitet. Die Karte wird erst erzeugt bei verbose=5 (also nicht &amp;quot;alternativ&amp;quot;)&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Infobox Modul&lt;br /&gt;
|ModPurpose=Verkehrsdaten zu fest definierten Routen ermitteln&lt;br /&gt;
|ModType=d&lt;br /&gt;
|ModForumArea=Unterstützende Dienste&lt;br /&gt;
|ModTechName=98_TRAFFIC.pm&lt;br /&gt;
|ModOwner=jmike &amp;lt;br /&amp;gt;([https://forum.fhem.de/index.php/topic,56045.0.html Forum] / [[Benutzer:Jmike|Wiki]])&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Dieses Modul erfasst Fahrzeiten in aktueller Verkehrslage mittels Google Maps Directions API.&lt;br /&gt;
&lt;br /&gt;
== Features / Funktionen ==&lt;br /&gt;
* Distanz einer Route&lt;br /&gt;
* Fahrzeit ohne Verkehr&lt;br /&gt;
* Fahrzeit mit Verkehr&lt;br /&gt;
* Verzögerung der geplanten Route&lt;br /&gt;
* Waypoints definieren&lt;br /&gt;
* Ausgabesprache festlegen &lt;br /&gt;
* Outputs in Sekunden / Meter (raw)&lt;br /&gt;
* Ausgabe als Text, in Minuten, Sekunden oder als Durchschnitt&lt;br /&gt;
* Device STATE frei wählbar&lt;br /&gt;
* einstellbares Update Interval&lt;br /&gt;
* update-burst für Stosszeiten&lt;br /&gt;
* Strecke kann zusätzlich in gegengesetzte Richtung ausgelesen werden&lt;br /&gt;
* Ankunfszeit bei Abfahrt zum Update-Zeitpunkt&lt;br /&gt;
* verschiedene Travel Modes (driving, walking, bicycling und transit)&lt;br /&gt;
* flexibeler Update Schedule für &amp;quot;Stosszeiten&amp;quot; &lt;br /&gt;
* integrierte Google Map zum visualisieren der konfigurierten Route&lt;br /&gt;
&lt;br /&gt;
== Voraussetzungen ==&lt;br /&gt;
Erstmal muss ein eigener API Key angefordert werden. &lt;br /&gt;
Das geht über Googles [https://console.developers.google.com/apis/ API Manager]&amp;lt;br&amp;gt;&lt;br /&gt;
Dort  &amp;quot;Google Maps Directions API&amp;quot; suchen und ein neues Projekt erstellen, anschliessend API aktivieren.&lt;br /&gt;
&lt;br /&gt;
Je nach FHEM Installation zusätzlich die Perl Module LWP::Simple, JSON und MIME::Base64 nach installieren:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;sudo apt-get install libwww-perl&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;sudo apt-get install libjson-perl&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
oder&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;sudo cpan -i LWP::Simple&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;sudo cpan -i JSON&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;sudo cpan -i MIME::Base64&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Definition ==&lt;br /&gt;
&amp;lt;code&amp;gt; define &amp;lt;devicename&amp;gt; TRAFFIC &amp;lt;API-KEY&amp;gt; [update-interval] &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Beispiel:&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;define muc2berlin TRAFFIC ABCDEFGHIJKLMNOPQRSTVWYZ 600&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Der API Key muss selbstverständlich mit dem eigenen Key aus dem API Manager ersetzt werden.&amp;lt;br&amp;gt;&lt;br /&gt;
Das Interval in Sekunden ist optional, der default beträgt es 3600 (1 Stunde).&amp;lt;br&amp;gt;&lt;br /&gt;
Attribute start_address und end_address definieren.&lt;br /&gt;
&lt;br /&gt;
== Readings ==&lt;br /&gt;
* average_delay_min&lt;br /&gt;
* average_duration_in_traffic_min&lt;br /&gt;
* average_duration_min&lt;br /&gt;
* delay&lt;br /&gt;
* delay_min&lt;br /&gt;
* distance&lt;br /&gt;
* duration&lt;br /&gt;
* duration_in_traffic&lt;br /&gt;
* duration_in_traffic_min&lt;br /&gt;
* duration_in_traffic_sec&lt;br /&gt;
* duration_min&lt;br /&gt;
* duration_sec&lt;br /&gt;
* [error_message]&lt;br /&gt;
* eta&lt;br /&gt;
* state&lt;br /&gt;
* status&lt;br /&gt;
&lt;br /&gt;
== Befehle ==&lt;br /&gt;
&lt;br /&gt;
==== update  [burst-update-count] [burst-update-interval] ====&lt;br /&gt;
Readings manuell aktualisieren,  der optionale Burst kann wie folgt genutzt werden:&amp;lt;br&amp;gt;&lt;br /&gt;
- erster Wert gibt an wie viele Updates abgearbeitet werden&amp;lt;br&amp;gt;&lt;br /&gt;
- zweiter Wert gibt an wie viele Sekunden zwischen den Updates gewartet wird&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Beispiel um für 1 Stunde alle 5min zu aktualisieren:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;set &amp;lt;device&amp;gt; update 12 300&amp;lt;/code&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
== STATE ==&lt;br /&gt;
* Initialized       - modul initialisiert&lt;br /&gt;
* OK        - update war erfolgreich&lt;br /&gt;
* incomplete configuration - Konfigurationsfehler (start_address oder end_address leer)&lt;br /&gt;
* &amp;lt;APIRETURN&amp;gt;         - Fehlermeldung von Google Maps, falls vorhanden (siehe Reading error_message)&lt;br /&gt;
* &amp;lt;Reading&amp;gt; - der Wert des Readings welches mit Attribut stateReading ausgewählt wurde&lt;br /&gt;
* disabled - das Device wurde über das Attribut disable deaktiviert&lt;br /&gt;
&lt;br /&gt;
== Attribute ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Attribut&lt;br /&gt;
!Default Wert&lt;br /&gt;
!mögliche Werte&lt;br /&gt;
!Beschreibung&lt;br /&gt;
!Beispiel&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |start_address&lt;br /&gt;
|&lt;br /&gt;
|&amp;lt;text&amp;gt;&lt;br /&gt;
|die vollständige Startadresse (erforderlich!)&lt;br /&gt;
|Startstr 1, 12345 Startcity&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |end_address&lt;br /&gt;
|&lt;br /&gt;
|&amp;lt;text&amp;gt;&lt;br /&gt;
|die vollständige Zieladresse (erforderlich!)&lt;br /&gt;
|Zielstr 99, 99099 Zielstadt&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |raw_data&lt;br /&gt;
|0&lt;br /&gt;
|0:1&lt;br /&gt;
|legt Readings an mit allen unbearbeiteten Werten &lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |language&lt;br /&gt;
|&lt;br /&gt;
|de, en, etc.&lt;br /&gt;
|Google ermittelt die Sprache automatisch falls nicht fest definiert&lt;br /&gt;
|de&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |waypoints&lt;br /&gt;
|&lt;br /&gt;
|lat, long&amp;lt;nowiki&amp;gt;|&amp;lt;/nowiki&amp;gt;lat, long&lt;br /&gt;
|fixe Wegpunkte auf der Strecke, mehrere Werte per pipe &amp;lt;nowiki&amp;gt;(|)&amp;lt;/nowiki&amp;gt; trennen, LAT, LONG Koordinaten angeben&lt;br /&gt;
|48.187918, 11.590514&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |returnWaypoints&lt;br /&gt;
|&lt;br /&gt;
|lat, long&amp;lt;nowiki&amp;gt;|&amp;lt;/nowiki&amp;gt;lat, long&lt;br /&gt;
|fixe Wegpunkte für den Rückweg, mehrere Werte per pipe &amp;lt;nowiki&amp;gt;(|)&amp;lt;/nowiki&amp;gt; trennen, LAT, LONG Koordinaten angeben, wenn leer werden &amp;quot;waypoints&amp;quot; in umgekehrter Reihenfolge verwendet&lt;br /&gt;
|48.187918, 11.590514&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |disable&lt;br /&gt;
|0&lt;br /&gt;
|0:1&lt;br /&gt;
|Modul deaktivieren&lt;br /&gt;
|1&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |stateReading&lt;br /&gt;
|&lt;br /&gt;
|&amp;lt;beliebiges-Reading&amp;gt;&lt;br /&gt;
|Name eines Readings dessen wert in den STATE des Devices geschrieben wird.&lt;br /&gt;
|delay_min&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |outputReadings&lt;br /&gt;
|text&lt;br /&gt;
|text,min,sec,average&lt;br /&gt;
|konfiguration welche Readings erstellt werden sollen, eine oder mehrere Möglich.&lt;br /&gt;
|text min&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |includeReturn&lt;br /&gt;
|0&lt;br /&gt;
|0:1&lt;br /&gt;
|aktiviert/deaktiviert ob die gleiche Strecke in umgekehrter Richtung hinzugefügt werden soll. &amp;lt;br&amp;gt;Readings werden mit return_* angegeben.&lt;br /&gt;
|1&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |verbose&lt;br /&gt;
|1&lt;br /&gt;
|0:1:2:3:4:5&lt;br /&gt;
|gibt vor wie ausführlich geloggt wird.&lt;br /&gt;
|5&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |travelMode&lt;br /&gt;
|driving&lt;br /&gt;
|driving:walking:bicycling:transit&lt;br /&gt;
|Fortbewegungsmethode für Kalkulation&lt;br /&gt;
|walking&lt;br /&gt;
|-&lt;br /&gt;
!align=&amp;quot;right&amp;quot; |updateSchedule&lt;br /&gt;
|&lt;br /&gt;
|&amp;lt;Beginn-volle-Stunde&amp;gt;-&amp;lt;Ende-volle-Stunde&amp;gt; [&amp;lt;Tag&amp;gt;] &amp;lt;update-Intervall-in-Sekunden&amp;gt;&lt;br /&gt;
|definiert einen flexiblen Zeitraum für feinere Updates, Tag als Zahl (Sonntag 0, Montag 1 etc), mehrere Definitionen per &amp;lt;nowiki&amp;gt;(|)&amp;lt;/nowiki&amp;gt; getrennt&lt;br /&gt;
| 6-8 1 60|6-8 2 60|6-8 3 60|6-8 4 60|6-8 5 60&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Integrierte Karte ==&lt;br /&gt;
* Zum Überprüfen der verwendeten Wegstrecke können der Hin- und Rückweg für ein TRAFFIC-Device auf einer Karte angezeigt werden.&lt;br /&gt;
* Diese Karte ist verfügbar unter: &amp;lt;nowiki&amp;gt;http://fhem-ip:port/fhem/TRAFFIC_debug?name=&amp;lt;TRAFFIC-DEVICE&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
* Um die Karte zu erzeugen, muss &amp;quot;verbose&amp;quot; auf 5 gesetzt werden. Das führt dazu, dass ein Weblink auf die jeweilige Karte im automatisch generierten Raum &amp;quot;TRAFFIC_debug&amp;quot; angelegt wird.&lt;br /&gt;
** &amp;lt;code&amp;gt;attr &amp;lt;DEVICE&amp;gt; verbose 5&amp;lt;/code&amp;gt;&lt;br /&gt;
** &amp;lt;code&amp;gt;set &amp;lt;DEVICE&amp;gt; update&amp;lt;/code&amp;gt;&lt;br /&gt;
** Raum / Link öffnen&lt;br /&gt;
*** grün visualisiert den Hinweg&lt;br /&gt;
*** rot visualisiert den Rückweg&lt;br /&gt;
* Der Weblink und ggf. der erzeugte Raum werden wieder entfernt, sobald verbose auf Werte unter 5 gesetzt wird.&lt;br /&gt;
&lt;br /&gt;
== Bekannte Probleme ==&lt;br /&gt;
* STATE: &amp;quot;REQUEST DENIED&amp;quot;&lt;br /&gt;
* Reading error_message: &amp;quot;This API project is not authorized to use this API&amp;quot;&lt;br /&gt;
** =&amp;gt;  API Key ist nicht aktiviert. Google API &amp;gt; API Manager &amp;gt; Google Maps Directions API &amp;gt; AKTIVIEREN &lt;br /&gt;
&lt;br /&gt;
* STATE: &amp;quot;UNKNOWN_ERROR&amp;quot;&lt;br /&gt;
** =&amp;gt; Es liegt ein Fehler bei Google vor.&lt;br /&gt;
** =&amp;gt; &amp;quot;UNKNOWN_ERROR indicates a directions request could not be processed due to a server error. The request may succeed if you try again.&amp;quot; [https://developers.google.com/maps/documentation/javascript/directions?hl=de]&lt;br /&gt;
&lt;br /&gt;
* STATE: &amp;quot;OVER_QUERY_LIMIT&amp;quot;&lt;br /&gt;
** Es wurden mehr als 2500 requests pro Tag abgesetzt, update Intervalle der TRAFFIC Devices erhöhen und &amp;quot;burst&amp;quot; zu den Stosszeiten nutzen.&lt;br /&gt;
&lt;br /&gt;
* STATE: &amp;quot;ZERO_RESULTS&amp;quot;&lt;br /&gt;
** Die Waypoint definition kann Google nicht realisieren. Statt Städtenamen besser exakte Koordinaten verwenden.&lt;br /&gt;
&lt;br /&gt;
== Tips ==&lt;br /&gt;
* täglicher Burst Update zum Feierabend, 1 Stunde alle 5 Minuten updaten:&lt;br /&gt;
** &amp;lt;code&amp;gt;define FeierabendCheck AT *17:00 set &amp;lt;device&amp;gt; update 12 300&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* komplette Reisezeit, also Hin- und Rückweg, im STATE anzeigen:&lt;br /&gt;
** &amp;lt;code&amp;gt;attr &amp;lt;device&amp;gt; stateFormat {int(ReadingsVal($name,&amp;quot;delay_min&amp;quot;,0)) + int(ReadingsVal($name,&amp;quot;return_delay_min&amp;quot;,0))}&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* updateSchedule einsetzen um default update Intervall zu verfeinern&lt;br /&gt;
** Montag bis Freitag von 6-8 Uhr alle 60 Sekunden&lt;br /&gt;
** &amp;lt;code&amp;gt;attr &amp;lt;device&amp;gt; updateSchedule 6-8 1 60|6-8 2 60|6-8 3 60|6-8 4 60|6-8 5 60&amp;lt;/code&amp;gt;&lt;br /&gt;
** jeden Tag von 17 bis 19 Uhr alle 2 Minuten&lt;br /&gt;
** &amp;lt;code&amp;gt;attr &amp;lt;device&amp;gt; updateSchedule 17-19 120&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Waypoints definieren (Tip von erdo_king)&lt;br /&gt;
** In Google-Maps die gewünschte Route auswählen. (PC)&lt;br /&gt;
** Auf eine signifikante Stelle der Route klicken - hierbei auf die Fahrtrichtung achten!&lt;br /&gt;
** Hier auf die Koordinaten klicken, diese können dann aus dem Suchfeld kopiert werden&lt;br /&gt;
** Im Browser zurück bis die Route wieder sichtbar ist (zum späteren Datenabgleich)&lt;br /&gt;
** Waypoints in FHEM deklarieren, Daten aktualisieren (set &amp;lt;device&amp;gt; update)&lt;br /&gt;
** distance + duration mit den Daten von Google-Maps am PC abgleichen&lt;br /&gt;
&lt;br /&gt;
== to Do ==&lt;br /&gt;
* Reading error_message löschen wenn update erfolgreich&lt;br /&gt;
* deutsche Commandref&lt;br /&gt;
&lt;br /&gt;
== Weblinks ==&lt;br /&gt;
* [https://forum.fhem.de/index.php/topic,56045.0.html Modul Vorstellung und Diskussionen]&lt;br /&gt;
* [http://fhem.de/commandref.html#TRAFFIC Commandref]&lt;br /&gt;
* [https://console.developers.google.com/apis Google API Manager]&lt;/div&gt;</summary>
		<author><name>Hartenthaler</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=Anwesenheitserkennung&amp;diff=17454</id>
		<title>Anwesenheitserkennung</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=Anwesenheitserkennung&amp;diff=17454"/>
		<updated>2016-11-25T06:33:38Z</updated>

		<summary type="html">&lt;p&gt;Hartenthaler: /* Batterieüberwachung (alle Devices vom Typ &amp;quot;MODE=lan-bluetooth&amp;quot;) */ kleine sprachliche Anpassungen&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Viele Benutzer führen bereits eine eigene &#039;&#039;&#039;Anwesenheitserkennung&#039;&#039;&#039; durch. Diese basiert in den meisten Fällen auf Ping Checks oder bei [[AVM Fritz!Box|FritzBoxen]] auf dem Befehl &#039;&#039;ctlmgr_ctl&#039;&#039;. Diese Lösungen können aber je nach Aufbau und Funktion FHEM massiv beeinträchtigen. Aufgrund des Aufbaus vom FHEM kann dieses dadurch für mehrere Sekunden zum völligen Stillstand gebracht werden.&lt;br /&gt;
&lt;br /&gt;
In FHEM gibt es mittlerweile mehrere Module, die eine zuverlässige Anwesenheitserkennung bieten, ohne dabei FHEM bei der Ausführung zu beeinträchtigen.&lt;br /&gt;
&lt;br /&gt;
Eine erweiterte Funktion der Anwesenheitserkennung ist die Standortverfolgung, die sich nicht nur auf ein oder sehr wenige mit (eigenem) WLAN versorgte Gebiete beschränkt.&lt;br /&gt;
&lt;br /&gt;
== Vorüberlegungen ==&lt;br /&gt;
Generell gibt es mehrere Ansätze um Anwesenheitserkennung mit Handys/Smartphones durchzuführen.&lt;br /&gt;
&lt;br /&gt;
* via PING Checks im gesamten WLAN&lt;br /&gt;
* Aktivitätsprüfung auf einer FritzBox&lt;br /&gt;
* Bluetooth Checks in der gesamten Wohnung&lt;br /&gt;
* eigene Perl-Funktion&lt;br /&gt;
* aktive Benachrichtigung des Smartphones, ausgelöst z.B. über Geo-Lokation/Geofence&lt;br /&gt;
&lt;br /&gt;
Dabei gilt bei der Auswahl der Art darauf zu achten wie sich das jeweilige Device verhält. Aufgrund der Vielfältigkeit kann man hier keine allgemeine Vorgehensweise empfehlen. Als einfacher Start (zumindest für Nicht-Apfel Telefone) eignet sich die Ping-Überprüfung und die FritzBox-Abfrage sehr gut.&lt;br /&gt;
&lt;br /&gt;
=== Randbedingungen ===&lt;br /&gt;
Es gibt Geräte, die ihr WLAN/Bluetooth auch im Standby ständig aktiv haben und auf Anfragen antworten können (fast alle Android-Geräte). Gerade bei Tests über WLAN kann sich das aber signifikant auf die Akku Leistung auswirken.&lt;br /&gt;
&lt;br /&gt;
Andere Geräte wiederum schalten WLAN im Standby Betrieb aus, um Akkukapazität zu sparen. Bluetooth hingegen bleibt weiterhin aktiviert und kann auf Anfragen reagieren. (iPhone)&lt;br /&gt;
&lt;br /&gt;
Wenn man bei einem iPhone die Funktion &amp;quot;über WLAN synchronisieren&amp;quot; aktiviert hat, so ist dies auch im Standby jederzeit pingbar, wenn der Recher auf dem iTunes zum synchroniseren läuft auch an ist. Ansonsten ist bei iPhone Geräten nur die Aktivitätsprüfung mit einer FritzBox oder das überwachen der DHCP Lease auf einer Airport Basestation wirklich zuverlässig.&lt;br /&gt;
&lt;br /&gt;
Auch wenn Bluetooth aktiviert ist, so bleiben einige Mobiltelefone erst dann empfangsbereit, wenn sie bereits zu irgend einem Bluetoothgerät gekoppelt wurden. Sind diese Geräte noch nie gekoppelt worden, deaktivieren diese ihren Bluetooth Empfänger beim verlassen des Bluetooth-Menüs im Gerät (iPhone).&lt;br /&gt;
&lt;br /&gt;
Hier gilt es vor allem auszuprobieren, wie stark der Akku durch eine Anwesenheitserkennung belastet wird. Entscheidend ist hier, in welchem Abstand man eine Anwesenheitserkennung durchführt. Viele Abfragen wirken sich stärker auf den Akku aus als wenige. Wenige Abfragen bieten aber keine zuverlässige und zeitnahe Erkennung.&lt;br /&gt;
&lt;br /&gt;
Als Alternative, unabhängig vom WLAN und der Erkennung, ob ein Gerät dort eingebucht ist oder nicht, bzw. unabhängig von Bluetooth kann zumindest bei einem iPhone die seit iOS 7 nochmals stark verbesserte Geo-Lokation (Geofencing) genutzt werden. Die iPhone Apps [http://geofency.com/ Geofency] oder [http://geofancy.com/ Geofancy] werden über das FHEM-Modul GEOFANCY angebunden und übertragen ihren Status immer dann, wenn ein definierter Standort betreten oder verlassen wird. Gekoppelt mit entsprechenden Notify und/oder Watchdog Kommandos ist so ebenfalls eine sehr zuverlässige Anwesenheitserkennung möglich (und das nicht nur für das eigene Zuhause).&lt;br /&gt;
&lt;br /&gt;
== Das PRESENCE Modul ==&lt;br /&gt;
Das [[PRESENCE]] Modul bietet für die Anwesenheitserkennung mehrere Varianten an. Diese sind aktuell folgende:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;lan-ping&#039;&#039;&#039; - Das Überwachen via PING Checks, die durch den FHEM Server versandt werden.&lt;br /&gt;
* &#039;&#039;&#039;fritzbox&#039;&#039;&#039; - Das Überwachen von Geräten auf einer FritzBox via ctlmgr_ctl (Nur auf einer FritzBox möglich)&lt;br /&gt;
* &#039;&#039;&#039;local-bluetooth&#039;&#039;&#039; - Das Überwachen via Bluetooth Checks, die vom FHEM Server direkt durchgeführt werden (angeschlossener Bluetooth-Stick und die Software bluez voraussgesetzt)&lt;br /&gt;
* &#039;&#039;&#039;lan-bluetooth&#039;&#039;&#039; - Das Überwachen von Bluetoothgeräte, über Netzwerk. Auf einer oder mehreren Maschinen im Netzwerk (z.B. [[:Kategorie:Raspberry Pi|Raspberry Pi]]) läuft ein Presence-Daemon, der nach Bluetooth-Geräten sucht. Um mehrere Presence-Daemon mit FHEM zu verbinden, gibt es den Collector-Daemon, der sich zu allen Presence-Damons im Netzwerk verbindet und das Ergebnis von allen zusammenfasst.&lt;br /&gt;
* &#039;&#039;&#039;function&#039;&#039;&#039; - Das Überwachen mithilfe einer selbst geschrieben Perl-Funktion, die den Anwesenheitsstatus zurückgibt (0 oder 1)&lt;br /&gt;
* &#039;&#039;&#039;shell-script&#039;&#039;&#039; - Das Überwachen mithilfe eines selbst geschriebenen Shell-Programms/Skript, das eine 0 oder 1 ausgibt, um den Anwesenheitsstatus mitzuteilen.&lt;br /&gt;
&lt;br /&gt;
=== Ping-Überwachung von Geräten im WLAN/LAN ===&lt;br /&gt;
{{Randnotiz|RNText=Um diese Methode auf einer FritzBox nutzen zu können, muss FHEM mit root-Rechten laufen. Dies ist standardmäßig nicht der Fall. Bitte dazu den Wiki Artikel [[FritzBox: fhem unter root starten]] beachten.}}&lt;br /&gt;
Um ein Gerät via Ping zu überwachen, muss folgende Definition durchgeführt werden:&lt;br /&gt;
:&amp;lt;code&amp;gt;define Handy PRESENCE lan-ping 192.168.0.30&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dadurch wird die IP-Addresse 192.168.0.30 alle 30&amp;amp;nbsp;Sekunden geprüft, ob sie erreichbar ist. Wenn sie erreichbar ist, ist der Status &amp;quot;present&amp;quot; (anwesend), ansonsten &amp;quot;absent&amp;quot; (abwesend).&lt;br /&gt;
&lt;br /&gt;
Der Timeout kann verändert werden, indem ein Wert (in Sekunden) an das Define anhängt wird:&lt;br /&gt;
:&amp;lt;code&amp;gt;define Handy PRESENCE lan-ping 192.168.0.30 &#039;&#039;&#039;60&#039;&#039;&#039;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nun würde das Handy alle 60 Sekunden geprüft werden.&lt;br /&gt;
&lt;br /&gt;
Nur wenn bei einem iPhone/iPad die Funktion &amp;quot;über WLAN synchronisieren&amp;quot; aktiviert ist, ist es auch im Standby zuverlässig pingbar. Standardmäßig deaktivieren Apple-Geräte ihr WLAN im Standby-Betrieb um die Akkulaufzeit zu verlängern.&lt;br /&gt;
&lt;br /&gt;
Sollte die Fehlermeldung &lt;br /&gt;
:&amp;lt;code&amp;gt; PRESENCE (Handy) - ping command returned with output: ping: icmp open socket: Operation not permitted &amp;lt;/code&amp;gt; &lt;br /&gt;
im Log auftauchen und lan-ping dadurch nicht funktionieren, liegt ein Berechtigungsproblem vor. Kein Grund den User fhem zu root zu machen!&lt;br /&gt;
So sollten die Berechtigungen aussehen&lt;br /&gt;
:&amp;lt;code&amp;gt;sudo ls -la /bin/ping&amp;lt;/code&amp;gt;&lt;br /&gt;
unter Jessie&lt;br /&gt;
:&amp;lt;code&amp;gt;-rwxr-xr-x 1 root root 38844 Feb 12  2014 /bin/ping&amp;lt;/code&amp;gt;&lt;br /&gt;
unter Wheezy&lt;br /&gt;
:&amp;lt;code&amp;gt;-rwsr-xr-x 1 root root 33220 Mär 30  2012 /bin/ping&amp;lt;/code&amp;gt;&lt;br /&gt;
Sollte es trotzdem unter Jessie nicht funktionieren kann man auch dort die Berechtigung analog wheezy setzen:&lt;br /&gt;
:&amp;lt;code&amp;gt;sudo chmod u+s /bin/ping&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== FritzBox: direktes Abfragen der Aktivität via ctlmgr_ctl ===&lt;br /&gt;
{{Randnotiz|RNText=Um diese Methode auf einer FritzBox nutzen zu können, muss FHEM mit root-Rechten laufen. Dies ist standardmäßig nicht der Fall. Bitte dazu den Wiki Artikel [[FritzBox: fhem unter root starten]] beachten.}}&lt;br /&gt;
Eine sehr häufige und auch zuverlässige Methode ist auf einer FritzBox die Abfrage mittels ctlmgr_ctl Befehl. Über diesen lassen sich alle Geräte abfragen ob sie aktiv sind. Ist ein Gerät aktiv, so gilt es als anwesend.&lt;br /&gt;
&lt;br /&gt;
Dieser Modus kann allerdings nur in FHEM Installationen direkt auf einer FritzBox verwendet werden. Des weiteren muss FHEM unter dem User root laufen. Um ein Gerät zu überwachen, wird lediglich der Gerätename benötigt, so wie er unter dem Menüpunkt &amp;quot;Heimnetz&amp;quot; auftaucht. &lt;br /&gt;
&lt;br /&gt;
Die erforderliche Definition:&lt;br /&gt;
:&amp;lt;code&amp;gt;define Handy PRESENCE fritzbox iPhone-4S&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Bluetooth-Überwachung von Geräten durch den FHEM Server ===&lt;br /&gt;
[[Datei:Bluetooth-Adresse-iPhone.png|thumb|Bluetooth-Adresse eines iPhones]]&lt;br /&gt;
Jenach Aufstellungsort des FHEM Servers kann es sinnvoll sein, eine Bluetooth-Überwachung direkt durch den FHEM Server durchzuführen. Hierbei gilt allerdings zu beachten, dass Bluetooth nicht für große Reichweiten gedacht ist und in den meisten Fällen keine Wände überwinden kann. Das heisst, dass in den meisten Fällen damit nur ein Raum überwacht werden kann.&lt;br /&gt;
&lt;br /&gt;
Je nach Einsatzzweck kann das auch so gewollt sein. Bluetooth USB Sticks, die bereits Bluetooth 4.0 unterstützen, können höhere Reichweiten über Zimmerwände hinaus erreichen. Vorausgesetzt, das Mobilgerät unterstützt Bluetooth 4.0.&lt;br /&gt;
&lt;br /&gt;
Um eine Überwachung per Bluetooth durchführen zu können, benötigt man die Bluetooth-Adresse eines Gerätes. Diese ähnelt vom Aufbau einer MAC-Adresse. Generell wird die Adresse in den Telefon-Informationen bei Smartphones angezeigt.&lt;br /&gt;
&lt;br /&gt;
Um eine Anwesenheitserkennung via Bluetooth durchzuführen, wird folgende Definition in der [[Konfiguration]] benötigt:&lt;br /&gt;
:&amp;lt;code&amp;gt;define Handy PRESENCE local-bluetooth XX:XX:XX:XX:XX:XX&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Bluetooth-Überwachung von Geräten durch verteilte Agenten in der Wohnung (presencd/collectord) ===&lt;br /&gt;
[[Datei:Raspberry-Pi-mit-WLAN-und-Bluetooth-Stick.jpg|thumb|left|Raspberry Pi mit Bluetooth- und WLAN-USB-Stick]]&lt;br /&gt;
Um eine zuverlässige und flächendeckende Bluetooth-Anwesenheitserkennung durchzuführen, ist es unerlässlich, mehrere Bluetooth-Empfänger zu verwenden, die auf mehrere oder alle Räume verteilt sind.&lt;br /&gt;
&lt;br /&gt;
Hierfür bietet sich zum Beispiel ein [[Raspberry Pi]] mit einem Mini-Bluetooth-USB-Stick und evtl. einem WLAN-USB-Stick an. Jeder Raum wird mit solch einem Raspberry ausgestattet und ist im WLAN Netz verfügbar.&lt;br /&gt;
&lt;br /&gt;
Dieses Netz aus Raspberrys wird mit dem presenced (Download-Link ist in der [http://fhem.de/commandref_DE.html#PRESENCE Commandref] zum Modul enthalten) ausgestattet. Es stehen bereits entsprechende Pakete für den Raspberry zur Verfügung.&lt;br /&gt;
&lt;br /&gt;
Beide Programme (presenced/collectord) sind Perl-Skripte, die als Daemon im Hintergrund laufen und auf Anfragen via Netzwerk warten. Es wird lediglich eine vollständige Perl-Grundinstallation mit Standardmodulen benötigt. Nach Installation der *.deb Pakete sollten diese noch angewiesen werden, automatisch beim Rechner-Neustart gestartet zu werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo update-rc.d presenced defaults&lt;br /&gt;
sudo update-rc.d collectord defaults&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Eine detaillierte Benutzung von presenced ist in der [http://fhem.de/commandref_DE.html#PRESENCE Commandref] Beschreibung zum PRESENCE Modul enthalten.&lt;br /&gt;
&lt;br /&gt;
==== Jeden Raum einzeln ansprechen (presenced) ====&lt;br /&gt;
Nun kann zuallererst jeder Raum einzeln angesprochen werden. Dabei ist zu beachten, dass pro Definition in der Konfiguration nur ein Gerät in einem Raum spezifisch überwacht werden kann.&lt;br /&gt;
&lt;br /&gt;
Eine Definition sieht dabei folgendermaßen aus:&lt;br /&gt;
:&amp;lt;code&amp;gt;define Handy_Wohnzimmer PRESENCE lan-bluetooth XX:XX:XX:XX:XX:XX 192.168.0.10:5111&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Damit wird nun das Gerät nur im Wohnzimmer (Raspberry mit IP 192.168.0.10) überwacht.&lt;br /&gt;
&lt;br /&gt;
==== Alle Räume gemeinsam ansprechen (collectord) ====&lt;br /&gt;
Um jedoch alle Räume gemeinsam zu verwenden, gibt es den Collector-Daemon. Dieser kennt alle presenced-Installationen im Netzwerk und führt eine koordinierte Suche nach den gewünschten Geräten durch. Sobald ein Gerät in einem Raum erkannt wurde, meldet der collectord den Status einschließlich der Angabe des Raumes, in dem das Gerät erkannt wurde.&lt;br /&gt;
&lt;br /&gt;
Um alle Räume zu kennen, müssen diese mit einem Config-File dem collectord mitgeteilt werden. Dieses sieht folgendermaßen aus:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[Schlafzimmer]           # Name des Raumes (wird in FHEM als Reading angezeigt)&lt;br /&gt;
address=192.168.179.31   # IP-Adresse oder Hostname des presenced&lt;br /&gt;
port=5111                # TCP Port, der verwendet werden soll (standardmäßig Port 5111)&lt;br /&gt;
presence_timeout=120     # Prüfinterval, das verwendet werden soll, wenn ein Gerät anwesend ist&lt;br /&gt;
absence_timeout=20       # Prüfinterval, das verwendet werden soll, wenn ein Gerät abwesend ist&lt;br /&gt;
&lt;br /&gt;
[Wohnzimmer]&lt;br /&gt;
address=192.168.179.34&lt;br /&gt;
port=5111&lt;br /&gt;
presence_timeout=180&lt;br /&gt;
absence_timeout=20&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Standardmäßig ist dieses Config-File unter /etc/collectord.conf zu finden. Mit dieser Konfiguration kann der Collectord gestartet werden. Es empfiehlt sich diesen mit auf dem FHEM Server zu betreiben. Die erforderliche Definition in der Fhem-Konfiguration:&lt;br /&gt;
:&amp;lt;code&amp;gt;define Handy PRESENCE lan-bluetooth XX:XX:XX:XX:XX:XX 127.0.0.1:5222&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Sobald das Handy irgendwo in der Wohnung erkannt wurde, meldet der Collectord dies sofort an FHEM und teilt den Raum mit.&lt;br /&gt;
&lt;br /&gt;
Eine detaillierte Benutzung von collectord findet man in der Commandref zum PRESENCE Modul.&lt;br /&gt;
&lt;br /&gt;
=== Überwachung von Geräten mit Perl-Code ===&lt;br /&gt;
Es ist möglich zum Überwachen von Geräten eine eigene Perl-Funktion zu verwenden die dann vom PRESENCE Modul im Hintergrund aufgerufen wird.&lt;br /&gt;
&lt;br /&gt;
 define &amp;lt;name&amp;gt; PRESENCE function {...} [ &amp;lt;check-interval&amp;gt; [ &amp;lt;present-check-interval&amp;gt; ] ]&lt;br /&gt;
&lt;br /&gt;
Sobald die Funktion den Rückgabewert 1 hat, ist das Gerät anwesend, bei 0 abwesend.&lt;br /&gt;
&lt;br /&gt;
==== Beispiel DHCP Überwachung auf Airport Basestation ====&lt;br /&gt;
Die hier vorgestellte Überwachung der DHCP Lease auf Airport Basestations per SNMP ist absolut robust gegenüber dem Ruhezustand von iOS und setzt keine weitere Konfiguration auf dem iPhone voraus. Das Abmelden beim Verlassen des Empfangsbereiches der Basestation geschieht mit etwa 5-10 Minuten Verzögerung und ist somit auch vor kurzzeitigen Empfangsproblemen sicher. Das nebenstehende Bild (???) verdeutlicht noch mal die Unterschiede zwischen einer IP-Basierten Ping-Überwachung und der Überwachung auf Ebene der Basestation oder FritzBox.&lt;br /&gt;
&lt;br /&gt;
Bevor der folgende Code verwendet werden kann ist das Perl Modul Net:SNMP zu installieren (z.&amp;amp;nbsp;B. mit: &amp;lt;code&amp;gt;cpan install use Net::SNMP&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Zuerst ist folgender Code in 99_myUtils.pl einzufügen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
use Net::SNMP;&lt;br /&gt;
sub&lt;br /&gt;
snmpCheck($$)&lt;br /&gt;
{&lt;br /&gt;
  my ($airport,$client)= @_;&lt;br /&gt;
&lt;br /&gt;
  my $community = &amp;quot;public&amp;quot;;&lt;br /&gt;
  my $host = $airport;&lt;br /&gt;
  my $oid = &amp;quot;.1.3.6.1.2.1.3.1.1.2&amp;quot;;&lt;br /&gt;
  #my $oid = &amp;quot;.1.3.6.1.2.1.3.1.1.2.25.1.10.0.1&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
  my ( $session, $error ) = Net::SNMP-&amp;gt;session(&lt;br /&gt;
    -hostname =&amp;gt; $host,&lt;br /&gt;
    -community =&amp;gt; $community,&lt;br /&gt;
    -port =&amp;gt; 161,&lt;br /&gt;
    -version =&amp;gt; 1&lt;br /&gt;
  );&lt;br /&gt;
&lt;br /&gt;
  if( !defined($session) ) {&lt;br /&gt;
    return 0;&lt;br /&gt;
    return &amp;quot;Can&#039;t connect to host $host.&amp;quot;;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  my @snmpoids = ();&lt;br /&gt;
&lt;br /&gt;
  my $response = $session-&amp;gt;get_next_request($oid);&lt;br /&gt;
  my @nextid = keys %$response;&lt;br /&gt;
  while ( @nextid &amp;amp;&amp;amp; $nextid[0] &amp;amp;&amp;amp; $nextid[0] =~ m/^$oid/ ) {&lt;br /&gt;
    push( @snmpoids, $nextid[0] );&lt;br /&gt;
&lt;br /&gt;
    $response = $session-&amp;gt;get_next_request( $nextid[0] );&lt;br /&gt;
    @nextid = keys %$response;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  if( !defined($response = $session-&amp;gt;get_request( @snmpoids ) ) ) {&lt;br /&gt;
    return 0;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  foreach my $value (values %$response) {&lt;br /&gt;
    return 1 if( $value eq $client )&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Danach lässt sich das Mobilgerät so überwachen:&lt;br /&gt;
:&amp;lt;code&amp;gt;define iPhone PRESENCE function {snmpCheck(&amp;quot;10.0.1.1&amp;quot;,&amp;quot;0x44d77429f35c&amp;quot;)} 30 30&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
wobei 10.0.1.1 durch die IP-Adresse der Basestation und 0x44d77429f35c durch die MAC Adresse des Geräts als HEX-Zahl ersetzt werden muss.&lt;br /&gt;
&lt;br /&gt;
== Das GEOFANCY Modul ==&lt;br /&gt;
Das Modul ermöglicht über einen sogenannten Webhook Mechanismus (umgangssprachlich oft auch als &amp;quot;Push&amp;quot; benannt) das aktive Melden des aktuellen Standortes. Die iPhone Apps  [http://geofency.com/ Geofency] und [http://geofancy.com/ Geofancy] können dann aktiv und quasi in dem Moment, wo man den Wohnbereich betritt oder verlässt, benachrichtigen. Android Nutzern können [https://play.google.com/store/apps/details?id=de.egi.geofence.geozone&amp;amp;hl=de EgiGeoZone Geofence] nutzen. Das geht nochmals um einiges schneller, als die Erkennung im WLAN, bei der die Anwesenheit nur in (engen) Zyklen aktiv geprüft werden muss. Gleichzeitig werden Ressourcen in FHEM geschont. Die aktuelle Implementierung im iPhone 5S mit dediziert für das Tracking zuständigem Chip ist so gut, dass der Akku ebenfalls sehr geschont wird.&lt;br /&gt;
&lt;br /&gt;
=== Modul in FHEM einrichten ===&lt;br /&gt;
Das Modul ist mit einer einfachen Definition sofort betriebsbereit:&lt;br /&gt;
:&amp;lt;code&amp;gt;define geofancy GEOFANCY geo&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Damit nimmt FHEM unter &amp;lt;nowiki&amp;gt;http://192.168.178.1:8083/fhem/geo&amp;lt;/nowiki&amp;gt; entsprechende Meldungen des iPhones entgegen. Damit das nicht nur über das lokale WLAN funktioniert, bedarf es allerdings noch einiger zusätzlicher Maßnahmen. FHEM muss vom Internet erreichbar gemacht werden, dabei sollte unbedingt an die Absicherung des Zugriffs gedacht werden.&lt;br /&gt;
&lt;br /&gt;
Zunächst einmal habe ich bei mir eine eigene FHEMWEB Instanz dafür angelegt:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
define WEBhook FHEMWEB 8088 global&lt;br /&gt;
attr WEBhook column Alarms: Apartment: Living: Bedroom: Kitchen: Sonos: Residents: Weather: Bathroom: Logs: Statistics: DashboardRoom: System: hidden: all:&lt;br /&gt;
attr WEBhook hiddenroom input,detail,save,Unsorted,Everything,CUL_HM,FS20,Commandref,style,Edit files,Select style,Logfile,Floorplans,Remote doc,FileLogs,Apartment,Bathroom,Bedroom,Kitchen,Living,Residents,System,Weather,Event monitor,NEW&lt;br /&gt;
attr WEBhook room hidden&lt;br /&gt;
attr WEBhook webname webhook&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Damit ist unter der URL &amp;lt;nowiki&amp;gt;http://192.168.178.1:8088/webhook/geo&amp;lt;/nowiki&amp;gt; das GEOFANCY Modul erreichbar. Ich verstecke in dieser Ansicht noch alle Räume, die ich so habe. Wer die Raumnamen allerdings kennt, kann sie trotzdem aufrufen. Die Anzeige in den Räumen kann man mit dem Attribut column und entsprechend leeren Definitionen verstecken. Nun muss man explizit den Devicenamen kennen, um noch etwas über die Konfiguration in Erfahrung bringen zu können.&lt;br /&gt;
Auch wenn das Security-by-Obscurity ist - ich fühle mich wohler damit.&lt;br /&gt;
&lt;br /&gt;
=== Webhook weiter absichern ===&lt;br /&gt;
Mit Hilfe eines [http://fhem.de/commandref.html#allowed allowed]-Devices lässt sich die FHEMWEB Instanz noch weiter absichern indem nur die tatsächlich benötigten Kommandos erlaubt werden (in diesem Fall keine) und damit alle anderen nicht erlaubten (attr,define,get,set,...) automatisch nicht mehr zur Verfügung stehen: &lt;br /&gt;
 &amp;lt;pre&amp;gt;&lt;br /&gt;
define allowedWEBhook allowed&lt;br /&gt;
attr allowedWEBhook allowedCommands ,&lt;br /&gt;
attr allowedWEBhook allowedDevices ,&lt;br /&gt;
attr allowedWEBhook validFor WEBhook&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Außerdem ist dringend zu empfehlen, den Zugriff über TLS/SSL und HTTP Basic-Authentication weiter abzusichern. Läuft FHEM auf einem Raspberry&amp;amp;nbsp;Pi, dann empfehle ich dazu die Konfiguration eines ReverseProxy (vorzugsweise HAproxy, Pound oder Varnish, notfalls auch Nginx oder Apache); damit ist man am flexibelsten und kann auch alle FHEMWEB Instanzen direkt über einen einzigen Port (meist 443, der HTTPS Standard Port) zusammenfassen. Ich möchte hier allerdings beschreiben, wie weit man mit FHEM Bordmitteln kommt und nehme das Beispiel einer Installation auf einer Fritzbox.&lt;br /&gt;
&lt;br /&gt;
Wie TLS aktiviert wird, steht in der Commandref für [[FHEMWEB]]. Um die Kommandos auf der Fritzbox ausführen zu können, muss zuerst Telnet aktiviert werden (bitte Google benutzen). Anschließend wechselt man auf der Fritzbox ins Verzeichnis /var/media/ftp/fhem und kann dann den Hinweisen aus der [http://fhem.de/commandref.html#FHEMWEB Commandref] unter dem Punkt HTTPS folgen. Letztlich fehlt noch das entsprechende Attribut:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
attr WEBhook HTTPS&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Als nächstes aktivieren wir Benutzername+Passwort für den Zugriff. Die commandref für allowed gibt auch hier unter dem Punkt basicAuth entsprechende Hinweise. Wir fügen hier einfach mal einen Benutzer &amp;quot;webhook&amp;quot; mit dem Passwort &amp;quot;Geofancy&amp;quot; hinzu, das sieht dann so aus:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
attr allowedWEBhook basicAuth { &amp;quot;$user:$password&amp;quot; eq &amp;quot;webhook:Geofancy&amp;quot; }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Weitere Infos zur Absicherung gibt auch [[FritzBox Webzugriff absichern]].&lt;br /&gt;
&lt;br /&gt;
Um zu testen, ob unsere Absicherung erfolgreich war, kann man die URL &amp;lt;nowiki&amp;gt;https://192.168.178.1:8088/webhook/geo&amp;lt;/nowiki&amp;gt; aufrufen (wichtig ist, dass man jetzt https und nicht mehr http eingibt; ansonsten bekommt man keine Antwort). Eine Zertifikatswarnung kann getrost ignoriert werden, verschlüsselt wird trotzdem. Es sollte auch eine Passwort Abfrage kommen und die Eingabe der entsprechenden Daten sollte dann zu einer entsprechenden Meldung vom GEOFANCY Modul führen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
NOK No data received, see API information on http://wiki.geofancy.com&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Das ist ok, schließlich sind wir keine App, sondern der Mensch, der nur mal eben prüfen will :-)&lt;br /&gt;
&lt;br /&gt;
=== Zugriff vom Internet ermöglichen ===&lt;br /&gt;
Das ist je nach Fritzbox und Software Version unterschiedlich. Grundsätzlich gilt: Eine Weiterleitung des ports 8088 vom Internet auf das laufende FHEM auf Port 8088 intern ist von AVM so nicht vorgesehen.&lt;br /&gt;
Bei mir führte folgendes zum Erfolg:&lt;br /&gt;
&lt;br /&gt;
* Einloggen per Telnet auf der Fritzbox (ich habe FritzOS 6 installiert)&lt;br /&gt;
* Konfiguration editieren mittels &amp;quot;nvi /var/flash/ar7.cfg&amp;quot;&lt;br /&gt;
* Suchen nach richtiger Zeile durch Eingabe von &amp;quot;/internet_forwardrules&amp;quot; und Enter&lt;br /&gt;
* Hinzufügen einer weiteren Zeile (Vorsicht, die bestehende Zeile endet mit ; und das muss in , umgeändert werden, so dass das ; schließlich am Ende der Zeile steht.&lt;br /&gt;
&lt;br /&gt;
So sieht es bei mir vorher aus:&lt;br /&gt;
:&amp;lt;code&amp;gt;internet_forwardrules = &amp;quot;tcp 0.0.0.0:488 0.0.0.0:488 0&amp;quot;;&amp;lt;/code&amp;gt;&lt;br /&gt;
Hinterher:&lt;br /&gt;
:&amp;lt;code&amp;gt;internet_forwardrules = &amp;quot;tcp 0.0.0.0:488 0.0.0.0:488 0&amp;quot;, &amp;quot;tcp 0.0.0.0:8088 0.0.0.0:8088 0&amp;quot;;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Danach mittels &amp;quot;:x&amp;quot; abspeichern und sofort per &amp;quot;reboot&amp;quot; die Box neu starten, um diese Änderungen zu aktivieren. Das ist wichtig; ansonsten zeigt die Erfahrung, dass die Änderung nicht dauerhaft erhalten bleibt und die gerade gemachten Änderungen verloren gehen.&lt;br /&gt;
&lt;br /&gt;
Wer die Einstellungen zu &amp;quot;internet_forwardrules&amp;quot; bei sich nicht finden kann, hat womöglich eine andere Version als ich oder ein leicht anderes Gerät und bemüht am besten Google, was er tun kann, um das Gleiche zu erreichen. Möglicherweise tauchen die Einträge auch erst auf, wenn man mal über das Webinterface ein Forwarding eingerichtet hatte.&lt;br /&gt;
&lt;br /&gt;
Hat man einen DynDNS Dienst oder myFritz auf der Fritzbox aktiviert, so kann man jetzt auch von draußen auf den Webhook zugreifen. Das kann man prüfen, indem man das iPhone aus dem WLAN ausbucht und einmal die externe Adresse eingibt, also z.B. https://meindyndns.org:8088/webhook/geo.&lt;br /&gt;
&lt;br /&gt;
=== Weitere Alternativen für den Zugriff aus dem Internet ===&lt;br /&gt;
Als Alternative zum Port Forwarding kann man sich auch per VPN in das lokale Netzwerk einwählen. iOS bietet dazu auch eine automatische Aktivierung des VPN (VPN on Demand), wie z.B. [http://forum.loxone.com/dede/netzwerk-firewall-and-security/8121-vpn-demand-ios-8-1-1-fritz-box-kleine-how.html hier] beschrieben wird.&lt;br /&gt;
&lt;br /&gt;
Auch eine Alternative ist, das Portforwarding nicht direkt an FHEM einzurichten, sondern an einem im Netzwerk laufenden Reverse-Proxy, der dann seinerseits die Anfragen an FHEM weiterleitet. Dies kann z.B. Apache, Nginx oder am besten HAproxy sein.&lt;br /&gt;
Letzterer ist dabei sehr flexibel, allerdings nicht unbedingt einfach zu konfigurieren. Ein paar Inspirationen diesbezüglich gibt es z.B. [https://github.com/Hoanoho/HSE/tree/develop/lib/cfg/any/stat/etc/haproxy hier] und [https://github.com/Hoanoho/HSE/tree/develop/lib/cfg/any/dyn/etc/haproxy hier]. Wer pfSense nutzt, findet [http://loredo.me/post/116633549315/geeking-out-with-haproxy-on-pfsense-the-ultimate diesen Artikel] womöglich auch interessant. Er zeigt auch, dass mit HAproxy noch weit mehr möglich ist.&lt;br /&gt;
Der Reverse-Proxy sollte dabei auch unbedingt der TLS Termination Point sein (TLS Offloading). Nicht nur spart man sich dann die Aktivierung von TLS in FHEM, sondern man hat auch mehr Einfluss darauf, wie TLS arbeitet (z.B. Deaktivierung von SSLv3, forcieren von TLSv1.2, nur als sicher eingestufte Cipher Suite... siehe auch Infos auf der [https://wiki.mozilla.org/Security/Server_Side_TLS Mozilla Website]).&lt;br /&gt;
&lt;br /&gt;
=== Einrichten in der Geof[e|a]ncy.app ===&lt;br /&gt;
Hat das alles soweit geklappt, können endlich in der Geofency.app bzw. Geofancy.app am iPhone die gewünschten Bereiche definiert werden. Am Besten zuvor in den Global Settings die folgenden Einstellungen hinterlegen:&lt;br /&gt;
&lt;br /&gt;
* URL: https://meindyndns.org:8088/webhook/geo&lt;br /&gt;
* POST (oder GET, ist egal - das FHEM Modul kann beides)&lt;br /&gt;
* HTTP Basic Authentication: EIN (entsprechend Username und Password eintragen)&lt;br /&gt;
&lt;br /&gt;
Anfänglich ist es empfehlenswert noch &amp;quot;Notification on success&amp;quot; und &amp;quot;Notification on Failure&amp;quot; einzuschalten. Ersteres kann man ausmachen wenn man weiß, dass es soweit funktioniert. Über &amp;quot;Send Test-Request&amp;quot; kann man einmal einen Test schicken und erhält das Ergebnis entsprechend dargestellt. Es sollte sowas kommen wie&lt;br /&gt;
:&amp;lt;code&amp;gt;POST Success: test OK&amp;lt;/code&amp;gt;. In Geofancy.app gibt es keine Rückmeldung über den Erfolg des Testrequests. In FHEM sollten sich durch den Testrequest jedoch die Readings sofort aktualisieren (Ggf. ist ein Reload der FHEMWEB-Seite nötig da zusätzliche Tabellenzeilen nicht via Longpoll ergänzt werden). &lt;br /&gt;
&lt;br /&gt;
Funktioniert das soweit, kann man eine neue Lokation als sein Zuhause anlegen. Es empfiehlt sich einen ID-Namen zu setzen; dieser ist dann in FHEM als Name für die Lokation sichtbar. Für die eigene Wohnung empfiehlt sich hier &amp;quot;home&amp;quot; (da dies auch direkt vom RESIDENTS Modul so verwendet werden kann). Man kann auch Trigger für andere Standorte anlegen. FHEM weiß dann sogar, wenn ihr im Büro seid und könnte sich dabei auch unterschiedlich verhalten, als wenn ihr &amp;quot;auf Achse&amp;quot; seid. Bei letzterem ist der Status im GEOFANCY Modul &amp;quot;underway&amp;quot;, was so viel heißt wie &amp;quot;unbekannter Aufenthaltsort&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Hinweis: Zumindest für Geofancy.app liefert ein Testrequest wohl zufällige Locations zurück. Die eigenen Location-IDs werden also nicht übergeben, selbst wenn man sich in einem Geofence befindet. Um zu testen muss man sich wohl oder übel selbst bewegen ;-).&lt;br /&gt;
&lt;br /&gt;
=== GEOFANCY Modul individualisieren ===&lt;br /&gt;
Die im GEOFANCY Modul dargestellten Readings sind nun in etwa so, wenn ihr euch bewegt:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Readings:&lt;br /&gt;
     2014-01-18 14:37:42   lastDevice      -&lt;br /&gt;
     2014-01-18 14:37:42   lastDeviceUUID      51F23894-AAAA-BBBB-CCCC-0123456789AB&lt;br /&gt;
     2014-01-18 14:37:42   state           dev:51F23894-AAAA-BBBB-CCCC-0123456789AB trig:test id:home lat:48.9999 long:11.9999&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wer genauer hinschaut sieht: Mein iPhone heißt wohl 51F23894-AAAA-BBBB-CCCC-0123456789AB.&lt;br /&gt;
Damit nun die Readings für mein iPhone richtig angelegt werden, muss ein Device Alias gesetzt werden. Sinnvoll erscheint mir der Vorname des Besitzers:&lt;br /&gt;
:&amp;lt;code&amp;gt;attr geofancy devAlias 51F23894-AAAA-BBBB-CCCC-0123456789AB:Julian&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Weitere Alias-Namen können mit Leerzeichen einfach angehängt werden.&lt;br /&gt;
Jetzt werden weitere Readings angelegt, sobald GEOFANCY entsprechende Daten vom Mobilgerät empfängt:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Readings:&lt;br /&gt;
     2014-01-18 14:37:42   Julian          arrived home&lt;br /&gt;
     2014-01-18 14:37:42   currLocLat_Julian 48.9999&lt;br /&gt;
     2014-01-18 14:37:42   currLocLong_Julian 11.9999&lt;br /&gt;
     2014-01-18 14:37:42   currLocTime_Julian 2014-01-18 14:37:42&lt;br /&gt;
     2014-01-18 14:37:42   currLoc_Julian  home&lt;br /&gt;
     2014-01-17 19:18:23   lastArr         Julian home&lt;br /&gt;
     2014-01-17 18:41:46   lastDep         Julian Office&lt;br /&gt;
     2014-01-18 14:37:42   lastDevice      Julian&lt;br /&gt;
     2014-01-18 14:37:42   lastDeviceUUID      51F23894-AAAA-BBBB-CCCC-0123456789AB&lt;br /&gt;
     2014-01-17 18:41:46   lastLocArr_Julian 2014-01-17 08:58:37&lt;br /&gt;
     2014-01-17 18:41:46   lastLocDep_Julian 2014-01-17 18:41:46&lt;br /&gt;
     2014-01-17 18:41:46   lastLocLat_Julian 48.1111&lt;br /&gt;
     2014-01-17 18:41:46   lastLocLong_Julian 11.1111&lt;br /&gt;
     2014-01-17 18:41:46   lastLoc_Julian  Office&lt;br /&gt;
     2014-01-18 14:37:42   state           dev:Julian trig:test id:home lat:48.9999 long:11.9999&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Möchte man nun etwas bestimmtes tun, wenn man nach Hause kommt oder das Heim verlässt, kann man am Besten ein entsprechendes Notify auf das Reading currLoc_Name setzen. Ich aktualisiere lediglich zwei Dummies, durch die dann alle weiteren Notifies ausgelöst werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
define n_Julian.Presence notify geofancy:currLoc_Julian:.home set Julian.homestatus:FILTER=STATE!=home home&lt;br /&gt;
attr n_Julian.Presence room Residents&lt;br /&gt;
define n_Julian.absence notify geofancy:currLoc_Julian:.underway {\&lt;br /&gt;
if (Value(&amp;quot;Julian.homestatus&amp;quot;) ne &amp;quot;gone&amp;quot;) {\&lt;br /&gt;
  fhem(&amp;quot;set Julian.homestatus:FILTER=STATE!=absent absent&amp;quot;);;\&lt;br /&gt;
}\&lt;br /&gt;
}&lt;br /&gt;
define n_Julian.whereabout notify geofancy:currLoc_Julian:.* set Julian.whereabout:FILTER=STATE!=$EVTPART1 $EVTPART1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wer es noch einfacher möchte (bzw. auch noch mehr Features) schaut sich einmal die neue Modulfamilie aus RESIDENTS[http://fhem.de/commandref_DE.html#RESIDENTS], ROOMMATE[http://fhem.de/commandref_DE.html#ROOMMATE] und GUEST[http://fhem.de/commandref_DE.html#GUEST] an. Diese sind direkt auf GEOFANCY abgestimmt. Dabei kann das devAlias Attribut entfallen und man hinterlegt die UUID stattdessen direkt im ROOMMATE oder GUEST Device (Attribut r*_geofenceUUIDs). Das erspart es für jeden Bewohner und jedes Device zig unterschiedliche Devices der Typen Notify, DOIF oder Watchdog anlegen und pflegen zu müssen.&lt;br /&gt;
&lt;br /&gt;
Wer mehr Kontrolle möchte kann natürlich bei notify, DOIF und Co. bleiben: &amp;lt;code&amp;gt;define n_rr_Julian.location notify geofancy:currLoc_Julian:.* set rr_Julian:FILTER=location!=$EVTPART1 location $EVTPART1&amp;lt;/code&amp;gt;. Wobei &amp;quot;Julian&amp;quot; dabei als devAlias in GEOFANCY eingtragen wurde, rr_Julian der Name des ROOMMATE aus RESIDENTS ist. Außerdem wurden die Location-IDs in der Geofency.app bzw. Geofancy.app so gewählt, dass diese direkt einem ROOMMATE-Status entsprechen (also z.B. home, wayhome...).&lt;br /&gt;
&lt;br /&gt;
== Beispiele für die Nutzung der Anwesenheitserkennung ==&lt;br /&gt;
Hier sollen Beispiele für den Nutzen von Anwesenheitserkennung aufgezeigt werden.&lt;br /&gt;
&lt;br /&gt;
=== Abschalten aller Verbraucher (Licht, Musikanlage) beim Verlassen der Wohnung ===&lt;br /&gt;
Typisches Szenario: Man geht ausser Haus, aber hat vergessen im Bad das Licht aus zu machen. Allerdings geht man heutzutage fast garnicht mehr ohne Handy aus dem Haus.&lt;br /&gt;
&lt;br /&gt;
Nun soll FHEM in der gesamten Wohnung das Licht, sowie sonstige Verbraucher ausschalten, wenn ich länger als 15 Minuten ausser Haus bin. Dazu benötigt man zuerst eine structure, die alle Verbraucher und sonstigen Devices, die das betrifft, zusammenfasst.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
define Gesamte_Wohnung structure Gesamtes_Licht Licht_Wohnzimmer Licht_Kueche LED_Kueche Licht_Bad Licht_Schlafzimmer AV_Receiver TV_Steckdose&lt;br /&gt;
attr Gesamte_Wohnung room Wohnung&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nun kann man mittels eines watchdogs eine Überwachung für sein Handy anlegen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# Überwachen der gesamten Wohnung mittels collectord sowie presenced in jedem Raum&lt;br /&gt;
define Handy PRESENCE lan-bluetooth XX:XX:XX:XX:XX:XX 127.0.0.1:5222&lt;br /&gt;
attr Handy event-on-change-reading state  # Ein Event soll nur bei der Änderung des Anwesenheitsstatus (Reading: status) erfolgen. Wichtig für den watchdog!!!&lt;br /&gt;
&lt;br /&gt;
# Nach 15 Minuten Abwesenheit (Handy im Status &amp;quot;absent&amp;quot;) soll die gesamte Wohnung ausgeschaltet werden.&lt;br /&gt;
define watchdog_Anwesenheit watchdog Handy:absent 00:15 Handy:present set Gesamte_Wohnung off ; trigger watchdog_Anwesenheit .&lt;br /&gt;
attr watchdog_Anwesenheit regexp1WontReactivate 1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Anwesenheitserkennung Bluetooth PebbleBee mit PRESENCE Modul ==&lt;br /&gt;
Im Forum gibt es einen {{Link2Forum|Topic=28753|LinkText=langen Beitrag}} über die Einrichtung eines BT-Tag an einem RaspberryPI mit FHEM. Dabei werden Skripte wie blescan.pl und lepresenced genannt.&lt;br /&gt;
Da mittlerweile viele neue Informationen zusammen gekommen sind wurde der Wiki Eintrag erstellt.&lt;br /&gt;
&lt;br /&gt;
Im Folgenden wird die Konfiguration für &#039;&#039;&#039;LE Deviced (z.B. Gtags,Pebbles etc.)&#039;&#039;&#039; und &#039;&#039;&#039;NICHT LE Device (z.B. IPhone)&#039;&#039;&#039; beschreiben.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Wo finde ich denn lepresenced?&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
lepresenced kann über Github heruntergeladen werden (Link weiter unten)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Was ist der Vorteil gegenüber blescan.pl?&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{{Randnotiz|RNText=Beide hier beschriebenen Wege (presenced/lepresenced) können parallel auf dem selben BT-Dongle laufen, da sich die Ports unterscheiden!}}&lt;br /&gt;
blescan.pl hat u. a. das Problem, dass dank der wundervollen Bluetooth-Implementierung unter Linux ab und zu der Scan fehlschlägt und das Interface resettet werden muss. Das tut blescan.pl auch mit aller Gewalt. Dazu kommt, dass bei längeren Scanzeiten und vielen Tags sich die Prozesse anstauen, weil immer nur auf einen Tag &amp;quot;gewartet&amp;quot; wird. Außerdem wurden mit der Einführung von lepresenced sämtliche Supportverträge gekündigt lepresenced läuft dauerhaft und merkt sich bei allen sendenden Tags den Zeitstempel des letzten Empfangs. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Getestete Hardware/Software===&lt;br /&gt;
* &#039;&#039;&#039;Raspbian System&#039;&#039;&#039; - wheezy, Jessie&lt;br /&gt;
* &#039;&#039;&#039;BT-Dongle&#039;&#039;&#039; - CSL NET BT USB2.0 Stick, Bluetooth V4.0, Nano &amp;lt;br /&amp;gt;&#039;&#039;&#039;Achtung&#039;&#039;&#039;: Es muss ein BT V4.0 oder höher verwendet werden. Nur dieser unterstützt &#039;&#039;LowEnergy&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;BT-TAG&#039;&#039;&#039; - Gtag von Gigaset, TrackR, UDOO Neo, PebbleBee, iTag von Unitec, X4-LIFE Multifunkti BL-Anhänger, iTag Wireless Anti, Trackr bravo&lt;br /&gt;
&lt;br /&gt;
===  BT Dongel am PI installieren ===&lt;br /&gt;
&lt;br /&gt;
Um den BT Dongle &#039;&#039;(hier: CSL NET BT USB2.0)&#039;&#039; am PI verwenden zu können, müssen die notwendigen Pakete über die Paketverwaltung von debain nachinstalliert werden.&lt;br /&gt;
Wer bereits ein BT-Dongle installiert hat, kann diesen Schritt überspringen.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt-get install bluetooth&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Nach erfolgreicher Installation der Pakete sollte der RaspberryPI neu gestartet werden.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo reboot&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nach dem erfolgten Reboot bitte das Log des Raspberry auf folgende Einträge prüfen:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Feb 12 19:52:55 fhem kernel: [    4.773600] Bluetooth: Core ver 2.20&lt;br /&gt;
Feb 12 19:52:55 fhem kernel: [    4.773748] NET: Registered protocol family 31&lt;br /&gt;
Feb 12 19:52:55 fhem kernel: [    4.773765] Bluetooth: HCI device and connection manager initialized&lt;br /&gt;
Feb 12 19:52:55 fhem kernel: [    4.773797] Bluetooth: HCI socket layer initialized&lt;br /&gt;
Feb 12 19:52:55 fhem kernel: [    4.773821] Bluetooth: L2CAP socket layer initialized&lt;br /&gt;
Feb 12 19:52:55 fhem kernel: [    4.773890] Bluetooth: SCO socket layer initialized&lt;br /&gt;
Feb 12 19:52:55 fhem kernel: [    4.797531] usbcore: registered new interface driver btusb&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Sobald der BT-Dongle erkannt wurde &#039;&#039;leuchtet&#039;&#039; (wenn vorhanden) auch die &#039;&#039;blaue/gelbe&#039;&#039; LED am Dongle auf.&lt;br /&gt;
&lt;br /&gt;
=== BT-Tags aktivieren ===&lt;br /&gt;
Jetzt kann der BT-Tag aktiviert werden. Bei einigen Tags muss dafür die &#039;&#039;&#039;Batteriesicherung&#039;&#039;&#039; gezogen werden.&lt;br /&gt;
&lt;br /&gt;
Einen Tag wird mit folgendem Befehl auf der Konsole gesucht:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo hcitool lescan&lt;br /&gt;
&lt;br /&gt;
Ausgabe z.B.:&lt;br /&gt;
LE Scan ...&lt;br /&gt;
7C:2F:80:A1:XA:XD (unknown)&lt;br /&gt;
7C:2F:80:A1:XA:XD Gigaset G-tag&lt;br /&gt;
7C:2F:80:A1:X4:X1 (unknown)&amp;lt;/source&amp;gt;&lt;br /&gt;
Eine Übersicht über die möglichen Befehle von hcitool gibt es mit der Eingabe von:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo hcitool&lt;br /&gt;
&lt;br /&gt;
Ausgabe z.B.:&lt;br /&gt;
hcitool - HCI Tool ver 5.23&lt;br /&gt;
Usage:&lt;br /&gt;
        hcitool [options] &amp;lt;command&amp;gt; [command parameters]&lt;br /&gt;
Options:&lt;br /&gt;
        --help  Display help&lt;br /&gt;
        -i dev  HCI device&lt;br /&gt;
Commands:&lt;br /&gt;
        dev     Display local devices&lt;br /&gt;
        inq     Inquire remote devices&lt;br /&gt;
        scan    Scan for remote devices&lt;br /&gt;
        name    Get name from remote device&lt;br /&gt;
        info    Get information from remote device&lt;br /&gt;
        spinq   Start periodic inquiry&lt;br /&gt;
        epinq   Exit periodic inquiry&lt;br /&gt;
        cmd     Submit arbitrary HCI commands&lt;br /&gt;
        con     Display active connections&lt;br /&gt;
        cc      Create connection to remote device&lt;br /&gt;
        dc      Disconnect from remote device&lt;br /&gt;
        sr      Switch master/slave role&lt;br /&gt;
        cpt     Change connection packet type&lt;br /&gt;
        rssi    Display connection RSSI&lt;br /&gt;
        lq      Display link quality&lt;br /&gt;
        tpl     Display transmit power level&lt;br /&gt;
        afh     Display AFH channel map&lt;br /&gt;
        lp      Set/display link policy settings&lt;br /&gt;
        lst     Set/display link supervision timeout&lt;br /&gt;
        auth    Request authentication&lt;br /&gt;
        enc     Set connection encryption&lt;br /&gt;
        key     Change connection link key&lt;br /&gt;
        clkoff  Read clock offset&lt;br /&gt;
        clock   Read local or remote clock&lt;br /&gt;
        lescan  Start LE scan&lt;br /&gt;
        lewladd Add device to LE White List&lt;br /&gt;
        lewlrm  Remove device from LE White List&lt;br /&gt;
        lewlsz  Read size of LE White List&lt;br /&gt;
        lewlclr Clear LE White list&lt;br /&gt;
        lecc    Create a LE Connection&lt;br /&gt;
        ledc    Disconnect a LE Connection&lt;br /&gt;
        lecup   LE Connection Update &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Falls beim SCAN kein Tag gefunden wird, sollte das BT Interface neu gestartet werden. Dazu ist kein Reboot des PI notwendig.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo hciconfig hci0 down&lt;br /&gt;
sudo hciconfig hci0 up&lt;br /&gt;
sudo hcitool dev&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Anleitung für ein  LE Device (z.B. Gtags,Pebbles etc.) ===&lt;br /&gt;
&lt;br /&gt;
Herunterladen des Skripts lepresenced.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
https://github.com/mhop/fhem-mirror/blob/master/fhem/contrib/PRESENCE/lepresenced&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Zur &amp;quot;Installation&amp;quot; des Skripts folgendermaßen vorgehen:&lt;br /&gt;
Unter /fhem manuell den Ordner „script“ anlegen:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkdir script&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Datei lepresenced reinkopieren und ausführbar machen:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo chmod +x /opt/fhem/script/lepresenced&lt;br /&gt;
sudo chgrp -cR dialout lepresenced&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Skript erstmalig starten:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo ./lepresenced --loglevel LOG_EMERG -d&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Kommt beim Starten des Skript eine Fehlermeldung, müssen die Abhängigkeiten aufgelöst werden.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Can&#039;t locate Net/Server/Daemonize.pm in @INC (@INC contains: /etc/perl /usr/local/lib/perl/5.14.2 /usr/local/share/perl/5.14.2 /usr/lib/perl5 /usr/share/perl5 / usr/lib/perl/5.14 /usr/share/perl/5.14 /usr/local/lib/site_perl .) at /opt/fhem/lepresenced line 17.&lt;br /&gt;
BEGIN failed--compilation aborted at /opt/fhem/lepresenced line 17.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Um die Abhängigkeiten aufzulösen muss folgendes nachinstalliert werden und anschließend ein Reboot durchgeführt werden.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo apt-get install libnet-server-*&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Nach dem letzten Schritt sind alle Bedingungen für eine abschließende Konfiguration der BT-Tags in FHEM abgeschlossen worden.&lt;br /&gt;
Jetzt kann der Tag dem FHEM-Server bekannt gemacht werden.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   --   Name       Modul    Modus         MAC vom Gtag  IP vom PI Port    Abfragezeit in Sekunden&lt;br /&gt;
define MeinGtAG PRESENCE lan-bluetooth xx:xx:xx:xx:xx:xx 127.0.0.1:5333    120&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Den absent und present Mode kann man einfach testen, in dem man den Gtag mit Alufolie einwickelt.&lt;br /&gt;
&lt;br /&gt;
=== Anleitung für ein NICHT LE Device (z.B. IPhone) ===&lt;br /&gt;
Die Installation kann (wie in der commanref beschrieben) über Debian Pakete erfolgen.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
.deb package for Debian (noarch): presenced-1.3.deb http://svn.code.sf.net/p/fhem/code/trunk/fhem/contrib/PRESENCE/deb/presenced-1.3.deb&lt;br /&gt;
&lt;br /&gt;
.deb package for Raspberry Pi (raspbian): presenced-rpi-1.3.deb http://svn.code.sf.net/p/fhem/code/trunk/fhem/contrib/PRESENCE/deb/presenced-rpi-1.3.deb&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo dpkg -i presenced-rpi-1.3.de&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Installation perl script file (Auszug commanref)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
direct perl script file: presenced http://svn.code.sf.net/p/fhem/code/trunk/fhem/contrib/PRESENCE/presenced&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
Nach dem letzten Schritt sind alle Bedingungen für eine abschließende Konfiguration der BT-Tags in FHEM abgeschlossen worden.&lt;br /&gt;
Jetzt kann der Tag dem FHEM-Server bekannt gemacht werden.&lt;br /&gt;
{{Randnotiz|RNText=Wenn man mit collectord arbeitet muß man die Erkennung bei allen Devices auf port 5222 setzen.&lt;br /&gt;
  lan-bluetooth xx:xx:80:xx:xx:AC 127.0.0.1:5222 20 120}}&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
    --   Name       Modul    Modus         MAC vom Gtag  IP vom PI Port    Abfragezeit in Sekunden&lt;br /&gt;
define MeinGtAG PRESENCE lan-bluetooth xx:xx:xx:xx:xx:xx 127.0.0.1:5333    120&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Automatischer Start ===&lt;br /&gt;
&lt;br /&gt;
Damit das leprecend Skript beim Systemstart mitgestartet wird, sollte eine Crontab Eintrag gesetzt werden. Alternativ die rc.local anpassen.&lt;br /&gt;
Ersteres würde so aussehen:&lt;br /&gt;
&lt;br /&gt;
Ein sh-Skript mit dem Inhalt:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo start-stop-daemon -d /opt/fhem/script -S -x /opt/fhem/script/lepresenced&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
unter dem Verzeichnis /home/pi ablegen, welches sich init_start.sh nennt.&lt;br /&gt;
&lt;br /&gt;
Das Skript dann unter: sudo crontab -e einhängen mit folgender Folge:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
@reboot        /home/pi/init_start.sh&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Zweiteres so:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo nano /etc/rc.local&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Datei rc.local, freie Stelle suchen, vor &amp;quot;exit 0&amp;quot;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# Start lepresenced&lt;br /&gt;
/opt/fhem/script/lepresenced --loglevel LOG_EMERG -d&lt;br /&gt;
exit 0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Batterieüberwachung (aktuell nur G-Tags) ===&lt;br /&gt;
&lt;br /&gt;
Leider überträgt der G-Tag nach der Einrichtung als Device in FHEM kein Reading mit seinem aktuellen Batteriestatus.&lt;br /&gt;
Dem wurde mit Hilfe des Forum Abhilfe geschaffen.&lt;br /&gt;
Im Folgenden wird erläutert wie die Batterieüberwachung eingerichtet werden kann.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Voraussetzung:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
bc - Basiscalculator [https://packages.debian.org/de/sid/bc Bc-Paket]&lt;br /&gt;
&amp;lt;pre&amp;gt; sudo apt-get install bc &amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Anlegen eines Shellskript auf dem Raspberry System. &lt;br /&gt;
Die Parameter &amp;lt;&amp;lt;MAC-Adresse&amp;gt;&amp;gt; und &amp;lt;&amp;lt;TagName&amp;gt;&amp;gt; müssen durch die Werte des auszulesenden G-Tags ersetzt werden.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
stringZ=$(sudo gatttool -b 5C:2B:80:C1:14:41 --char-read --handle=0x001b)&lt;br /&gt;
stringZ=${stringZ:33:2}&lt;br /&gt;
stringZ=$(echo &amp;quot;$stringZ&amp;quot; | tr a-f A-F)&lt;br /&gt;
decimal=$(echo &amp;quot;ibase=16; $stringZ&amp;quot; | bc)&lt;br /&gt;
perl /opt/fhem/fhem.pl 7072 &amp;quot;setreading MeinGtag Batterie $decimal&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dem Device in FHEM (hier MeinGtag) ein userReading mit dem Namen &#039;&#039;&#039;Batterie&#039;&#039;&#039; hinzufügen.&lt;br /&gt;
Das Shellskript mit folgendem Befehl starten:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
./GtagBatterie.sh&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Wichtig ist hierbei,&#039;&#039;&#039; dass Skript mit &amp;quot;./&amp;quot; und nicht mit &amp;quot;sh&amp;quot; aufzurufen. Beim Aufruf mit &amp;quot;sh GtagBatterie.sh&amp;quot; produziert es einen Fehler&lt;br /&gt;
&amp;lt;pre&amp;gt;GtagBatterie.sh: 3: GtagBatterie.sh: Bad substitution &amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Das Reading wird auf den ausgelesenen Wert der Batterie gesetzt. &lt;br /&gt;
&lt;br /&gt;
Hinweis: Es sollte für jeden G-Tag ein eigenes Skript abgelegt werden. Das Skript kann per crontab oder fhem Kommando (system) regelmäßig aufgerufen werden.&lt;br /&gt;
&lt;br /&gt;
=== Batterieüberwachung (alle Devices vom Typ &amp;quot;MODE=lan-bluetooth&amp;quot;) ===&lt;br /&gt;
&lt;br /&gt;
Es gibt eine weitere Möglichkeit um den Batteriestatus von LE Devices abzurufen und in FHEM als Reading darzustellen.&lt;br /&gt;
Dabei wird der Batteriezustand für alle LE Devices, die bereits in FHEM konfiguriert sind und per lepresenced überwacht werden, automatisch in einem shell-Script ermittelt.&lt;br /&gt;
Näheres dazu im Forumartikel [https://forum.fhem.de/index.php/topic,56960.0.html [Erweiterung]: Anwesenheitserkennung/Batterieüberwachung].&lt;br /&gt;
&lt;br /&gt;
Vorteile:&lt;br /&gt;
* Automatische Ermittlung aller in FHEM konfigurierten LE Devices&lt;br /&gt;
* Möglichkeit, diese Devices alternativ manuell im Script einzutragen&lt;br /&gt;
* Es werden nur Devices abgefragt, die im Status &amp;quot;present&amp;quot; sind, also mit ziemlicher Sicherheit auch verfügbar sind&lt;br /&gt;
* Ein eventuell auf dem FHEM telnet-Port gesetztes Passwort kann im Script hinterlegt werden&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Voraussetzung:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Funktionierendes lepresenced&#039;&#039;&#039; - siehe [[Anwesenheitserkennung#Anleitung_f.C3.BCr_ein_LE_Device_.28z.B._Gtags.2CPebbles_etc..29|Anleitung für ein LE Device (z.B. Gtags,Pebbles etc.)]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;socat&#039;&#039;&#039; - TCP port forwarder&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo apt-get update &amp;amp;&amp;amp; sudo apt-get install socat&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gatttool&#039;&#039;&#039; - Bestandteil von bluez &lt;br /&gt;
&lt;br /&gt;
gatttool ist auf den meisten Distributionen im bluez-Paket, allerdings nicht bei Opensuse. Dort muss man das Sourcepaket von bluez installieren und selbst kompilieren.&lt;br /&gt;
gatttool sollte dann nach /usr/bin oder /usr/local/bin kopiert werden,&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Zusätzlich zu den notwendigen Erweiterungen werden für die Ausführung von gatttool &#039;&#039;&#039;Root-Rechte benötigt&#039;&#039;&#039;!&lt;br /&gt;
&lt;br /&gt;
Das Script selbst gibt es hier: [https://raw.githubusercontent.com/micky0867/lebattery/master/lebattery lebattery]&lt;br /&gt;
&lt;br /&gt;
Am Besten unter /opt/fhem/script/lebattery speichern und ausführbar machen:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo su -&lt;br /&gt;
mkdir /opt/fhem/script&lt;br /&gt;
cd /opt/fhem/script&lt;br /&gt;
wget https://raw.githubusercontent.com/micky0867/lebattery/master/lebattery&lt;br /&gt;
chmod 755 lebattery&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Je nach Bedarf können im Script noch die folgenden 3 Parameter angepasst werden:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
# If allowed_telnetPort is protected by a password, add the password here&lt;br /&gt;
TELNETPASSWORD=&amp;quot;&amp;quot;&lt;br /&gt;
# Attribute for batterylevel in FHEM&lt;br /&gt;
ATTRIBUT=&amp;quot;batterylevel&amp;quot;&lt;br /&gt;
# Use this, if you dont want the script to determine the tags on its own&lt;br /&gt;
LETAGS=&amp;quot;&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Das Skript wird dann unter root folgendermaßen gestartet:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/opt/fhem/script/lebattery -v&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ausgabe des Skripts, wenn es mit dem Verbose Parameter -v gestartet wird.&lt;br /&gt;
&lt;br /&gt;
Beide Devices sind vom Typ NUT mini, das Device mit dem FHEM-Namen &#039;&#039;&#039;nut_Micky&#039;&#039;&#039; ist im Status &#039;&#039;&#039;absent&#039;&#039;&#039;. Das zweite Device ist im Status &#039;&#039;&#039;present&#039;&#039;&#039;.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Determining address for nut_Micky ...&lt;br /&gt;
nut_Micky is in state absent, no further action required&lt;br /&gt;
&lt;br /&gt;
Determining address for nut_Test ...&lt;br /&gt;
Fetching batterylevel for nut_Test (F3:44:04:81:54:89) ...&lt;br /&gt;
Setting batterylevel for nut_Test to 100%&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Mein crontab-Eintrag (User root) sieht so aus:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
3 3  * * * /opt/fhem/script/lebattery -v &amp;gt;/opt/fhem/script/lebattery.log 2&amp;gt;&amp;amp;1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Damit wird jeden Morgen um 3 Minuten nach 3 Uhr der Zustand der Batterien aller Devices ermittelt und in FHEM abgespeichert.&amp;lt;br&amp;gt; &lt;br /&gt;
Bevor man das mit crontab macht, sollte man allerdings zunächst sicher stellen, dass es auch ohne crontab funktioniert....&lt;br /&gt;
&lt;br /&gt;
Bei Problemen kann man auch erstmal schauen, ob das mit dem gattool überhaupt funktioniert:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
gatttool -t random -b &amp;lt;MAC-Adresse&amp;gt; --char-read --uuid 0x2a19&lt;br /&gt;
&lt;br /&gt;
handle: 0x0017 	 value: 64&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
In diesem Fall hat die Batterie noch 100% (hex 64).&lt;br /&gt;
&lt;br /&gt;
=== Problemlösungen ===&lt;br /&gt;
Falls es Probleme beim Starten des Skripts gibt bzw. man das Skript ohne Reboot des Systems neustarten möchte, kann man dies per kill Befehl erledigen.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
ps -ef | grep lepresenced&lt;br /&gt;
sudo kill &amp;lt;pid&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Debuglevel lepresenced setzen:&lt;br /&gt;
{{Randnotiz|RNText=Um Debug-Meldungen zu bekommen (Vorsicht bei SD-Karten-Systemen wie dem RPi) - Hierbei werden die Schreibzyklen auf die SD-Karte erhöht.}}&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
lepresenced --loglevel LOG_DEBUG&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Nur das wichtigste Loggen:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
lepresenced --loglevel LOG_WARNING&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Keinerlei LOG-Einträge&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
lepresenced --loglevel LOG_EMERG&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Ansprechpartner ====&lt;br /&gt;
# {{Link2FU|5068|PatrikR}} (Patrick) für lepresenced &lt;br /&gt;
# [[Benutzer Diskussion:Devender|Devender]] ({{Link2FU|20043|Dirk}}) für Wiki und Doku&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Code Snippets]]&lt;br /&gt;
[[Kategorie:Glossary]]&lt;/div&gt;</summary>
		<author><name>Hartenthaler</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=Benutzer:Hartenthaler&amp;diff=17453</id>
		<title>Benutzer:Hartenthaler</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=Benutzer:Hartenthaler&amp;diff=17453"/>
		<updated>2016-11-24T15:36:37Z</updated>

		<summary type="html">&lt;p&gt;Hartenthaler: neue Seite angelegt&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Hallo!&lt;br /&gt;
Ich bin Hermann Hartenthaler aus Berlin.&lt;/div&gt;</summary>
		<author><name>Hartenthaler</name></author>
	</entry>
</feed>