<?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=Weini</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=Weini"/>
	<link rel="alternate" type="text/html" href="http://wiki.fhem.de/wiki/Spezial:Beitr%C3%A4ge/Weini"/>
	<updated>2026-04-17T17:10:07Z</updated>
	<subtitle>Benutzerbeiträge</subtitle>
	<generator>MediaWiki 1.43.6</generator>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=Signalbot&amp;diff=36069</id>
		<title>Signalbot</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=Signalbot&amp;diff=36069"/>
		<updated>2021-09-27T13:08:02Z</updated>

		<summary type="html">&lt;p&gt;Weini: notify code extended by msgGroup fix from Flachzange&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 Messenger Signal&lt;br /&gt;
|ModType=x&lt;br /&gt;
|ModForumArea=Unterstützende Dienste&lt;br /&gt;
|ModFTopic=118370&lt;br /&gt;
|ModTechName=50_Signalbot.pm&lt;br /&gt;
|ModOwner=Adimarantis ({{Link2FU|39402|Forum}}/[[Benutzer Diskussion:Adimarantis‎|Wiki]])}}&lt;br /&gt;
&lt;br /&gt;
Das Modul [[Signalbot]] ermöglicht den Versand von Nachrichten über den Instant-Messaging-Dienst [https://signal.org Signal] aus FHEM heraus.&lt;br /&gt;
&lt;br /&gt;
== Beschreibung ==&lt;br /&gt;
Beschreibung in Kurzform:&lt;br /&gt;
&lt;br /&gt;
Signalbot stellt eine Schnittstelle von FHEM zum Signal Messenger unter Linux zur Verfügung. Dazu wird das Tool [https://github.com/AsamK/signal-cli signal-cli] im DBus-Daemon Modus verwendet, welches dann letztendlich mit Signal kommuniziert.&lt;br /&gt;
&lt;br /&gt;
Aktuell unterstützte Funktionen aus FHEM:&lt;br /&gt;
* Senden und Empfangen von Nachrichten an Gruppen oder Einzelempfänger&lt;br /&gt;
* Versenden von einem oder mehreren Attachments (Bilder)&lt;br /&gt;
* Einlesen, Speichern und Übersetzen von Gruppennamen (statt base64 Strings)&lt;br /&gt;
* Setzen, Empfangen und Übersetzen von Kontaktnamen (statt Telefonnummern)&lt;br /&gt;
* Einschränken von Gruppen oder Kontakten, auf die FHEM reagieren soll&lt;br /&gt;
* Direkte Verknüpfung mit dem [[Modul Babble|Babble]] Modul zur Interpretation von Befehlen&lt;br /&gt;
* Authentifizierte Befehle an FHEM senden ({{Link2CmdRef|Anker=GoogleAuth}})&lt;br /&gt;
* Blockieren von Kontakten und Gruppen&lt;br /&gt;
* Verwalten und Betreten/Verlassen von Gruppen&lt;br /&gt;
Neu mit 3.0:&lt;br /&gt;
* Registrierung von neuen Nummern inklusive Hilfestellung für Captchas&lt;br /&gt;
* Linken von bestehenden Accounts zu FHEM&lt;br /&gt;
Die Installation von signal-cli ist aktuell je nach Linux Kenntnissen durchaus anspruchsvoll. Daher gibt es ein Installationsscript welches für aktuelle Ubuntu und Raspian Distributionen getestet ist (höchstwahrscheinlich aber auch für andere Debian basierte Distributionen funktioniert).&lt;br /&gt;
&lt;br /&gt;
Signalbot ist weitgehend kompatibel mit SiSi, verfolgt aber technisch ein paar andere Ansätze und stellt zusätzliche Funktionalitäten zur Verfügung:&lt;br /&gt;
* Signalbot erzeugt keinen eigenen Prozess sondern integriert sich voll in die laufende FHEM Instanz (ist dadurch hoffentlich stabiler und verbraucht auch weniger Speicher)&lt;br /&gt;
* Gruppen werden grundsätzlich mit ihren Klarnamen verwendet und können auch nur mit einem vorangestellten &amp;quot;#&amp;quot; (statt &amp;quot;@#&amp;quot;) gekennzeichnet werden.&lt;br /&gt;
* Kontakte werden soweit möglich auch mit Klarnamen (statt +49....) unterstützt. Diese kommen aus dem internen Adressbuch und können über &amp;quot;setContact&amp;quot; definiert werden, bzw. kommen bei verlinkten Accounts aus dem Adressbuch des Hauptgeräts. Sie können aktuell leider nur über empfangene Nachrichten entschlüsselt werden, da signal-cli die entsprechende Schnittstelle (noch) nicht zur Verfügung stellt. Signalbot lernt diese aber mit der Zeit und kann sie bei Bedarf auch so abspeichern, dass sie auch nach einem FHEM Neustart wieder verfügbar sind&lt;br /&gt;
* Die Möglichkeit von Telegrambot in den &amp;quot;send&amp;quot; Befehl eingebetteten Code auszuführen und damit z.B. einen SVG Plot zu erstellen und mit zu verschicken ist verfügbar. Dazu muss der Befehl in runde Klammern eingebettet werden (Beispiele folgen unten).&lt;br /&gt;
* Wurde mit und für die aktuelle Version 0.9.0 von signal-cli entwickelt, die auch die neuen &amp;quot;V2&amp;quot; Gruppen unterstützt, ebenso wird die neuste Version vom Perl Modul Protocol::DBus (aktuell 0.19) benötigt&lt;br /&gt;
* Wird aktiv (September 2021) gewartet (letztes Update für SiSi auf github ist von August 2018)&lt;br /&gt;
&lt;br /&gt;
=== &amp;quot;set&amp;quot; Funktionen im Detail ===&lt;br /&gt;
{{Hinweis|Die Beschreibung bezieht sich jetzt auf die aktuelle Version 3.x&lt;br /&gt;
Diese Version wird demnächst über FHEM update zur Verfügung gestellt.}}&lt;br /&gt;
&lt;br /&gt;
==== send [@&amp;lt;Recipient1&amp;gt; ... @&amp;lt;RecipientN&amp;gt;] [#&amp;lt;Group1&amp;gt; ... #&amp;lt;GroupN&amp;gt;] [&amp;amp;&amp;lt;Attachment1&amp;gt;; ... &amp;amp;&amp;lt;AttachmentN&amp;gt;] [&amp;lt;Text&amp;gt;] ====&lt;br /&gt;
* &#039;&#039;&#039;Recipient:&#039;&#039;&#039; Nummer mit Ländervorwahl (+49....) oder Kontaktname aus dem internen Adressbuch&lt;br /&gt;
* &#039;&#039;&#039;Group:&#039;&#039;&#039; Gruppenname, wie in Signal definiert im Klartext&lt;br /&gt;
* &#039;&#039;&#039;Attachment&#039;&#039;&#039;: Dateiname (Pfad für muss für fhem lesbar und absolut oder relativ zum fhem home sein) oder Stream einer Bilddatei (z.B.)SVG&lt;br /&gt;
* &#039;&#039;&#039;Text:&#039;&#039;&#039; Die eigentlich Textnachricht, kann Leerzeichen und Umbrüche (mit &amp;quot;\n&amp;quot; oder \0x0a) enthalten&lt;br /&gt;
* Sofern ein Recipient, Group oder Attachment Leerzeichen enthält, den ganzen Teilstring in Anführungszeichen setzen: z.B. &amp;quot;@Max Mustermann&amp;quot;&lt;br /&gt;
* Wenn ein FHEM Befehl ausgeführt werden soll, dann diesen in runde Klammern setzen z.B. &amp;amp;({plotAsPng(&#039;SVG_Aussentemperatur&#039;)})&lt;br /&gt;
&lt;br /&gt;
Ein paar Beispiele &lt;br /&gt;
  send @+498514711 Hallo Signal&lt;br /&gt;
  send #FHEM &amp;amp;/tmp/foto.jpg Ein Bild schicken&lt;br /&gt;
  send &amp;quot;@Mein Freund&amp;quot; Leerzeichen durch Anführungszeichen um den ganzen Teilbefehl&lt;br /&gt;
  send @Joerg #FHEM #Familie Jeder Empfänger, jede Gruppe und Attachments können mehrfach vorkommen&lt;br /&gt;
  send &amp;quot;@({my $var=\&amp;quot;Joerg\&amp;quot;;; return $var;;})&amp;quot; Perl Code mit Leerzeichen ausführen&lt;br /&gt;
  send @(define dummy1 dummy) FHEM Befehl ausführen, wird aber nicht gesendet, da kein gültiger Empfänger zurück geliefert wird&lt;br /&gt;
  send @Joerg &amp;amp;({plotAsPng(\&#039;SVG_Aussentemperatur\&#039;)}) Einen FHEM SVG Plot verschicken oder&lt;br /&gt;
  send @Joerg &amp;quot;&amp;amp;({plotAsPng(&#039;SVG_Aussentemperatur&#039;)})&amp;quot; Einen FHEM SVG Plot verschicken&lt;br /&gt;
  send @Joerg Mehrzeilige Ausgabe:\nNeue Zeile&lt;br /&gt;
  send @Joerg Umlaute öäü und Emojis 🙃😆🤗🤑🤪 sowie 𝐅𝐨𝐫𝐦𝐚𝐭𝐢𝐞𝐫𝐮𝐧𝐠𝐞𝐧 direkt senden &lt;br /&gt;
  send @Joerg Die Aussentemperatur ist [out_temp:temperature] Grad&lt;br /&gt;
&#039;&#039;&#039;Tipp zu den Formatierungen&#039;&#039;&#039;: Auf z.B. https://yaytext.com/ kann man sich seine UTF8 Kodierungen erstellen und nach FHEM per copy&amp;amp;paste einfügen. Vorrausetzung dürfte sein, dass die &amp;quot;locale&amp;quot; des Systems auf UTF8 eingestellt ist&lt;br /&gt;
&lt;br /&gt;
==== setContact &amp;lt;Number&amp;gt; &amp;lt;Contactname&amp;gt; ====&lt;br /&gt;
Definiert einen Kontakteintrag im internen Adressbuch. Es kann beim &#039;&#039;&#039;send&#039;&#039;&#039; Befehl dann der &#039;&#039;ContactName&#039;&#039; statt der Nummer verwendet werden.&lt;br /&gt;
&lt;br /&gt;
==== reinit ====&lt;br /&gt;
Verbindung zum DBus wiederherstellen. Dies sollte nicht nötig sein, außer der signal-cli Service funktionierte nicht richtig und wurde korrigiert. Ich rate hier aber eher zu einem FHEM Neustart.&lt;br /&gt;
&lt;br /&gt;
==== createGroup &amp;lt;Groupname&amp;gt; [&amp;amp;&amp;lt;path to picture&amp;gt;] ====&lt;br /&gt;
Erzeugt eine neue Signalgruppe und versieht diese (optional) mit einem Gruppenbild.&lt;br /&gt;
&lt;br /&gt;
==== updateGroup &amp;lt;Groupname&amp;gt; [&amp;lt;new Groupname&amp;gt;] [&amp;amp;&amp;lt;path to picture&amp;gt;] ====&lt;br /&gt;
Aktualisiert den Namen und/oder das Gruppenbild einer Gruppe.&lt;br /&gt;
&lt;br /&gt;
==== invite &amp;lt;Groupname&amp;gt; &amp;lt;Contact1&amp;gt; [&amp;lt;Contact2&amp;gt;...] ====&lt;br /&gt;
Lädt einen oder mehrere Kontakte (per Namen oder Nummer) in eine bestehende Gruppe ein.&lt;br /&gt;
&lt;br /&gt;
==== joinGroup &amp;lt;group link&amp;gt; ====&lt;br /&gt;
Einer bestehenden Gruppe beitreten. Dazu ist eine Einladung über einen &amp;quot;group link&amp;quot; nötig, der das Format &amp;lt;nowiki&amp;gt;https://signal.group/ https://signal.group/....&amp;lt;/nowiki&amp;gt; hat. Der einfachste Weg hierzu ist es, wenn aus der Signal App die Funktion &amp;quot;group link&amp;quot; verwendet wird und der Link dann per Signal an den FHEM User gesendet wird. Sofern das &#039;&#039;autoJoin&#039;&#039; Attribut gesetzt ist, wird dieser erkannt und FHEM tritt der Gruppe automatisch bei.&lt;br /&gt;
&lt;br /&gt;
==== quitGroup &amp;lt;Groupname&amp;gt; ====&lt;br /&gt;
Aus einer Gruppe austreten. Die Gruppe wird dabei lediglich auf &amp;quot;inaktiv&amp;quot; gesetzt und ist mit &#039;&#039;get groups&#039;&#039; weiterhin als solche sichtbar. Eine Möglichkeit die Gruppe komplett aus dem Profil zu löschen besteht aktuell nicht.&lt;br /&gt;
&lt;br /&gt;
==== block #&amp;lt;Groupname&amp;gt;|&amp;lt;Contact&amp;gt; ====&lt;br /&gt;
Blockiert eine Gruppe oder einen Kontakt (per Namen oder Nummer) serverseitig. Signalbot bekommt dann keine Nachrichten dieser Absender mehr (im Gegensatz zu &#039;&#039;allowedPeer&#039;&#039; bei der FHEM die Nachrichten noch bekommt, diese aber ignoriert.)&lt;br /&gt;
&lt;br /&gt;
==== unblock #&amp;lt;Groupname&amp;gt;|&amp;lt;Contact&amp;gt; ====&lt;br /&gt;
Hebt die Blockierung wieder auf.&lt;br /&gt;
&lt;br /&gt;
=== &amp;quot;set&amp;quot; Sonderfunktionen zur Registrierung ===&lt;br /&gt;
&lt;br /&gt;
==== signalAccount &amp;lt;Telefonnummer&amp;gt; ====&lt;br /&gt;
Setzt eine bereits registrierte oder gelinkte Telefonnummer aktiv. Die bekannten Nummern werden als Pulldown zur Verfügung gestellt. Falls eine Nummer fehlen sollte, kann diese mit &amp;quot;set reinit&amp;quot; aktualisiert werden.&lt;br /&gt;
&lt;br /&gt;
Ist nur eine Telefonnummer registriert, wird diese automatisch verwendet.&lt;br /&gt;
&lt;br /&gt;
Wenn mehrere Nummern gleichzeitig verwendet werden sollen, braucht jede Nummer eine eigenen Instanz des Moduls.&lt;br /&gt;
&lt;br /&gt;
==== register &amp;lt;Telefonnummer&amp;gt; ====&lt;br /&gt;
Eine neue Nummer für Signal registrieren. Die Telefonnummer muss in Internationaler Schreibweise (+49.....) angegeben werden.&lt;br /&gt;
&lt;br /&gt;
Signalbot führt den Anwender in einer Art Wizard (Detailtexte auf der Modulseite) durch den Registrierungsprozess. Der erste Schritt ist, eine Nummer festzulegen. Üblicherweise ist das eine Festnetznummer, was die normale Verwendung der Nummer nicht beinträchtigt. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Achtung:&#039;&#039;&#039; Hier nicht die Handynummer eines Smartphones verwenden auf dem Signal schon installiert ist. Das Handy würde dadurch von Signal abgemeldet. Dazu kann &amp;quot;link&amp;quot; verwendet werden.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Wichtig:&#039;&#039;&#039; Im Laufe der Registrierung wird eine Verifikationsnummer übermittelt, normalerweise per SMS. Für Festnetznummern sollte man das aber üblicherweise auf Sprachanruf umstellen. Dazu das Attribut &amp;quot;registerMethod&amp;quot; auf &amp;quot;Voice&amp;quot; umstellen.&lt;br /&gt;
&lt;br /&gt;
Die Registrierung wird meistens durch ein Captcha geschützt. Details dazu weiter unten.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;captcha &amp;lt;signalcaptcha://.......&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Setzen des Captcha String im Rahmen der Registrierung. Details dazu, wie man den bekommt und wie der Prozess teilweise automatisiert werden kann weiter unten&lt;br /&gt;
&lt;br /&gt;
==== verify &amp;lt;Verifizierungscode&amp;gt; ====&lt;br /&gt;
Setzen des Codes, den man im Rahmen der Registrierung per SMS oder Sprachanruf übermittelt bekommen hat.&lt;br /&gt;
&lt;br /&gt;
Dies ist der letzte Schritt der Registrierung. Danach ist Signalbot einsatzbereit.&lt;br /&gt;
&lt;br /&gt;
==== link ====&lt;br /&gt;
Zeigt einen QR Code an, den man mit der Signal App auf dem Smartphone scannen kann um FHEM als &amp;quot;Mitbenutzer&amp;quot; zu registrieren. FHEM erhält dann alle Nachrichten und gesendete Nachrichten haben den Absender des Telefons. Dies ist ein einfacher und schneller Weg um Signalbot auszuprobieren, sollte aber nicht für die produktive Benutzung verwendet werden, um unerwünschte Nebeneffekte zu vermeiden.&lt;br /&gt;
&lt;br /&gt;
=== &amp;quot;get&amp;quot; Funktionen im Detail ===&lt;br /&gt;
&lt;br /&gt;
==== contacts all|nonblocked ====&lt;br /&gt;
Öffnet ein Fenster mit allen bekannten Kontakten mit Telefonnummer und Kontaktname sowie deren &amp;quot;blocked&amp;quot; Status. Mit dem Parameter &amp;quot;nonblocked&amp;quot; werden geblockte Kontakte ausgeblendet. Als Name wird primär der selbstdefinierte Kontaktname angezeigt. Sofern keiner definiert ist, wird der durch den Kontakt selbst definierte Profilname angezeigt. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Achtung: Profilnamen werden nur all 24h aktualisiert. Ein Änderung wird also ggf. nicht sofort sichtbar. Ist kein Kontaktname und auch kein Profilname definiert, bleibt das Feld leer. Mit signal-cli 0.8.1 führt das aktuell noch zu einer Fehlermeldung im Logfile, die ignoriert werden kann. Das dürfte mit der nächsten Version behoben sein.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
==== groups all|active|nonblocked ====&lt;br /&gt;
Öffnet ein Fenster mit allen bekannten Gruppen. Es wird der Gruppenname, der &amp;quot;Active&amp;quot; Status (ist FHEM Mitglied der Gruppe), der &amp;quot;Blocked&amp;quot; Status sowie die Liste der anderen Gruppenmitglieder angezeigt. Mit dem Parameter &amp;quot;active&amp;quot; wird die Liste auf Gruppen beschränkt, in denen FHEM Mitglied ist, mit &amp;quot;nonblocked&amp;quot; werden zusätzlich noch geblockte Gruppen ausgeblendet.&lt;br /&gt;
&lt;br /&gt;
==== accounts ====&lt;br /&gt;
Zeigt alle aktuell in signal-cli registierten Telefonnummern an, die mit &amp;quot;set signalAccount&amp;quot; verwendet werden können.&lt;br /&gt;
&lt;br /&gt;
=== Attribute im Detail ===&lt;br /&gt;
==== authTimeout ====&lt;br /&gt;
Gibt bei Verwendung des {{Link2CmdRef|Anker=GoogleAuth|Label=GoogleAuth}} device die Dauer in Sekunden an, die ein Nutzer authentifiziert bleibt. Siehe &#039;&#039;commandKeyword&#039;&#039; für mehr Infos.&lt;br /&gt;
&lt;br /&gt;
==== authDev ====&lt;br /&gt;
Name des genutzten GoogleAuth device. Dies wird üblicherweise automatisch gesetzt, sofern bereits ein GoogleAuth device im System definiert ist, sobald das &#039;&#039;authTimeout&#039;&#039; gesetzt wird.&lt;br /&gt;
&lt;br /&gt;
==== autoJoin 0|1 ====&lt;br /&gt;
Falls auf 1 gesetzt, reagiert FHEM automatisch auf Einladungslinks (siehe &#039;&#039;joinGroup&#039;&#039;) und tritt der Gruppe bei&lt;br /&gt;
&lt;br /&gt;
==== commandKeyword ====&lt;br /&gt;
Eine Zeichenkette aus einem oder mehreren Zeichen, die am Anfang einer Nachricht stehen kann, damit FHEM die restliche Nachricht ungefiltert als Kommando ausführt. Die Funktion ist über GoogleAuth geschützt, d.h. ein Benutzer muss sich erst mit einem gültigen GoogleAuth Token legitimieren und bleibt entsprechend des &#039;&#039;authTimeout&#039;&#039; Attributs für gewisse Zeit authorisiert.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Beispiel:&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
Man setzt &#039;&#039;commandKeyword&#039;&#039; auf &amp;quot;=&amp;quot; , dann kann man &#039;&#039;&amp;quot;=123456 set lamp off&amp;quot;&#039;&#039; senden. Im weiteren Verlauf reicht &#039;&#039;&amp;quot;=set lamp on&amp;quot;&#039;&#039; solange bis der Timeout abgelaufen ist.&lt;br /&gt;
&lt;br /&gt;
Zur Authorisierung muss nicht zwingend gleich ein Befehl mitgesendet werden. Sofern &#039;&#039;allowedPeer&#039;&#039; gesetzt ist, muss der Absender zusätzlich in dieser Liste stehen.&lt;br /&gt;
&lt;br /&gt;
==== defaultPeer ====&lt;br /&gt;
Gruppe, Kontaktname oder Nummer an die &#039;&#039;&#039;send&#039;&#039;&#039; eine Nachricht schicken soll, wenn kein Empfänger mit @ oder # definiert wurde.&lt;br /&gt;
&lt;br /&gt;
==== allowedPeer ====&lt;br /&gt;
Komma getrennte Liste von Gruppen, Kontaktnamen oder Nummern auf die Signalbot reagieren soll (also bei empfangenen Nachrichten Readings aktualisiert). Ist dieses Attribut nicht gesetzt, reagiert Signalbot auf alle Nachrichten.&lt;br /&gt;
&lt;br /&gt;
==== babblePeer ====&lt;br /&gt;
Komma getrennte Liste von Gruppen, Kontaktnamen oder Nummern auf die Signalbot reagieren soll indem es die Nachricht an das über &#039;&#039;&#039;babbleDev&#039;&#039;&#039; (nicht zu verwechseln mit &#039;&#039;babbleDevice&#039;&#039;) definierte [[Modul Babble|Babble]] Modul schickt. Die Nachrichten werden zuerst (beschränkt auf allowedPeer) normal verarbeitet (also Readings aktualisiert) und nur nach Babble gesendet wenn diese Attribut gesetzt ist.&lt;br /&gt;
&lt;br /&gt;
Der Absender der Nachricht (Gruppe hat Prio über individuellem Absender) wird Babble als &#039;&#039;$PARM0&#039;&#039; übergeben. Dazu in Babble noch das Attribut helpFunc wie folgt setzen&lt;br /&gt;
 {fhem(&amp;quot;set SignalBot send \@$PARM0 $HELP&amp;quot;)}&lt;br /&gt;
Sollen die rivescript Spracherweiterungen genutzt werden muss außerdem &amp;quot;noChatbot&amp;quot; auf 0 stehen.&lt;br /&gt;
&lt;br /&gt;
Nach dem selben Prinzip können in der Babble Definition auch Antworten spezfisch für Devices angelegt werden, z.B. als Aktion für out-temp -&amp;gt; Temperatur -&amp;gt; draußen -&amp;gt; sagen -&amp;gt; Status:&lt;br /&gt;
 set SignalBot send @$PARM0 Die Temperatur draußen ist [out_temp:temperature] Grad&lt;br /&gt;
Womit die Frage (ohne Fragezeichen!) &amp;quot;Wie ist die Temperatur draußen&amp;quot; entsprechend quittiert wird.&lt;br /&gt;
&lt;br /&gt;
==== babbleDev ====&lt;br /&gt;
Name des definierten Babble Device.Wird beim Setzen vom babblePeer automatisch mit der ersten &amp;quot;Babble&amp;quot; Device gefüllt sofern vorhanden.&lt;br /&gt;
&lt;br /&gt;
==== babbleExclude ====&lt;br /&gt;
Regulärer Ausdruck auf den Nachrichtentext um bestimmte Nachrichten von der Weiterleitung zu Babble auszuschließen (ein Event wird trotzdem generiert und kann mit Notify, DOIF etc. verarbeitet werden).&lt;br /&gt;
&lt;br /&gt;
==== registerMethod &amp;lt;SMS|Voice&amp;gt; ====&lt;br /&gt;
Stellt die Registrierungsmethode (Rückmeldung des Verifizierungscodes) auf SMS oder Sprachanruf um.&lt;br /&gt;
&lt;br /&gt;
=== Readings im Detail ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|account&lt;br /&gt;
|Aktuell verwendete Telefonnummer (nur verfügbar wenn signal-cli 0.9.0 ohne -u Parameter gestartet wurde)&lt;br /&gt;
|-&lt;br /&gt;
|joinedGroups&lt;br /&gt;
|Liste der beigetretenen Gruppen getrennt mit Leerzeichen&lt;br /&gt;
|-&lt;br /&gt;
|lastError&lt;br /&gt;
|Text der letzten Fehlermeldung. Bitte unbedingt den Timestamp beachten. Das Reading wird bei erfolgreichen Aktionen nicht zurückgesetzt und enthält ggf. sehr alte Fehlermeldungen.&lt;br /&gt;
|-&lt;br /&gt;
|msgAttachment&lt;br /&gt;
|Attachments (Dateinamen im signal-cli repository) der zuletzt empfangenen Attachments&lt;br /&gt;
|-&lt;br /&gt;
|msgGroupName&lt;br /&gt;
|Gruppenname aus der zuletzt eine Nachricht empfangen wurde - leer wenn es eine persönlich Nachricht war&lt;br /&gt;
|-&lt;br /&gt;
|msgSender&lt;br /&gt;
|Absender der letzten Nachricht als Nummer oder wenn bekannt als Name&lt;br /&gt;
|-&lt;br /&gt;
|msgText&lt;br /&gt;
|Empfangenen Nachricht&lt;br /&gt;
|-&lt;br /&gt;
|msgTimestamp&lt;br /&gt;
|Zeitstempel der Nachricht&lt;br /&gt;
|-&lt;br /&gt;
|msgAuth&lt;br /&gt;
|Ist auf 1 gesetzt wenn der Absender der aktuellen Nachricht (also zum Zeitpunkt zu dem z.B. ein Notify/DOIF die Nachricht auswertet) per GoogleAuth authentifiziert war.&lt;br /&gt;
|-&lt;br /&gt;
|prevMsgAttachment&lt;br /&gt;
| rowspan=&amp;quot;5&amp;quot; |Wie oben, nur enthalten diese Readings die Daten der zuvor empfangenen Nachricht (n-1)&lt;br /&gt;
|-&lt;br /&gt;
|prevMsgGroupName&lt;br /&gt;
|-&lt;br /&gt;
|prevMsgSender&lt;br /&gt;
|-&lt;br /&gt;
|prevMsgText&lt;br /&gt;
|-&lt;br /&gt;
|prevMsgTimestamp&lt;br /&gt;
|-&lt;br /&gt;
|sentMsg&lt;br /&gt;
|Zuletzt gesendete Nachricht&lt;br /&gt;
|-&lt;br /&gt;
|sentMsgRecipient&lt;br /&gt;
|Empfänger der zuletzt gesendeten Nachricht. Enthält zumeist den Namen aus der Empfangsbestätigung und somit bei vielen Empfängern den zuletzt bestätigten Empfang.&lt;br /&gt;
&lt;br /&gt;
Dies muss nicht zwingend auf die zuletzt gesendete Nachricht (sendMsg) passen, wenn mehrere Nachrichten versendet wurden.&lt;br /&gt;
|-&lt;br /&gt;
|sentMsgTimestamp&lt;br /&gt;
|Zeitstempel des Empfangs oder &amp;quot;pending&amp;quot; wenn noch keine Bestätigung vorliegt&lt;br /&gt;
|-&lt;br /&gt;
|VERSION&lt;br /&gt;
|Internal Reading die die aktuelle Version von Signalbot, signal-cli und Dbus angibt - vor Support Anfragen bitte erst im Forum prüfen ob die aktuellste Version verwendet wird und ggf. updaten.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Installation ==&lt;br /&gt;
Zur Installation steht das Script &amp;quot;signal_install.sh&amp;quot; zur Verfügung, welches aber nicht zwangsweise in jeder Umgebung funktioniert. Daher erst einmal ein paar Referenzen zur manuellen Installation von signal-cli:&lt;br /&gt;
* Die Wikiseite des Vorgängermoduls [[SiSi]] welches grundsätzlich die selben Anforderungen hat&lt;br /&gt;
* Quickstart (englisch) für [https://github.com/AsamK/signal-cli/wiki/Quickstart signal-cli]&lt;br /&gt;
* Anleitung zum [https://github.com/AsamK/signal-cli/wiki/Provide-native-lib-for-libsignal#libsignal-client Übersetzen und Installieren der Libraries] für armv7 (Raspberry) da die Distribution nur x86 libraries enthält&lt;br /&gt;
* CPAN Seite des Perl Moduls zur [https://metacpan.org/pod/Protocol::DBus DBus Kommunikation]&lt;br /&gt;
Das Modul und Install Script wird demnächst über &amp;quot;fhem [[update]]&amp;quot; verbreitet, ist aber aktuell noch über dieses {{Link2Forum|Topic=118370|LinkText=Forenthema}} zu finden.&lt;br /&gt;
&lt;br /&gt;
Vorbereitung:&lt;br /&gt;
&lt;br /&gt;
Modul 50_Signalbot.pm wie üblich ins Verzeichnis &amp;quot;FHEM&amp;quot; der FHEM Installation kopieren und FHEM neu starten.&lt;br /&gt;
&lt;br /&gt;
Modul per &amp;quot;define &amp;lt;name&amp;gt; Signalbot&amp;quot; definieren.&lt;br /&gt;
&lt;br /&gt;
Das Script &amp;quot;signal_install.sh&amp;quot; aus der Detailseite des Moduls oder vom [https://svn.fhem.de/fhem/trunk/fhem/contrib/signal/ FHEM SVN] runterladen und ins Verzeichnis eines beliebigen &amp;quot;sudo&amp;quot;-fähigen Users kopieren.&lt;br /&gt;
&lt;br /&gt;
Das Script hat mehrere Optionen um Teilfunktionen direkt auszuführen, diese sind:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+&lt;br /&gt;
!Argument&lt;br /&gt;
!Bedeutung&lt;br /&gt;
|-&lt;br /&gt;
|system&lt;br /&gt;
|System für die signal-cli Installation vorbereiten. Es werden per &amp;quot;apt install&amp;quot; fehlende Pakete installiert und Verzeichnisse erstellt. &lt;br /&gt;
Muss mindestens einmal erfolgreich gelaufen sein, damit die restliche Installation funktioniert&lt;br /&gt;
|-&lt;br /&gt;
|install&lt;br /&gt;
|Installiert signal-cli als System Service. Automatischer Download, Installation und Konfiguration (dbus, systemd)&lt;br /&gt;
|-&lt;br /&gt;
|test&lt;br /&gt;
|Versendet eine Testnachricht auf zwei Arten - direkt mit dem Client (klappt das, ist die Grundregistrierung schon mal erfolgreich) und über Dbus (dann ist auch der System Service korrekt eingerichtet)&lt;br /&gt;
|-&lt;br /&gt;
|remove&lt;br /&gt;
|Löscht alle durch &amp;quot;install&amp;quot; installierten Verzeichnisse und Dateien (aber nicht die Pakete die durch &amp;quot;system&amp;quot; installiert wurden)&lt;br /&gt;
|-&lt;br /&gt;
|start&lt;br /&gt;
|Starten des singal service über systemd bzw. im Container des Dbus daemon and signal-cli Daemon&lt;br /&gt;
|}&lt;br /&gt;
Im Normalfall kann das script einfach unter root Rechten, also mit&lt;br /&gt;
 sudo ./signal_install.sh&lt;br /&gt;
aufgerufen werden (wenn das Script per Download geholt wurde, muss es vorher noch mit &amp;quot;chmod a+x signal_install.sh&amp;quot; ausführbar gemacht werden). Wenn kein Argument übergeben wird, dann wird automatisch der Ablauf &#039;&#039;system -&amp;gt; install -&amp;gt; test&#039;&#039; durchlaufen.&lt;br /&gt;
&lt;br /&gt;
Es prüft außerdem ab, ob es im Container läuft (&#039;&#039;&#039;**Aktuell nicht unterstützt**&#039;&#039;&#039; hier erfolgt ein etwas anderer Ablauf - mehr dazu unten) und prüft auf Betriebssystem und CPU Architektur. Gegebenenfalls bricht es ab, wenn es sich um keine unterstützte Kombination handelt.&lt;br /&gt;
&lt;br /&gt;
=== Registrierung ===&lt;br /&gt;
Die Registrierung wird ab Version 3.0 nicht mehr im Script sondern in FHEM selbst geführt durchgeführt.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Hinweis:&#039;&#039;&#039; Eine Nummer kann immer nur &#039;&#039;&#039;einmal&#039;&#039;&#039; registriert sein. Eine bereits bestehende Registrierung (Smartphone) wird dabei &#039;&#039;&#039;aufgehoben&#039;&#039;&#039;. Daher entweder eine Festnetznummer verwenden mit der Option &amp;quot;link&amp;quot; FHEM als Zweitbenutzer zu einer bestehenden Nummer hinzugefügen. Dies ist zum Testen ok, aber produktiv ist davon abzuraten, da FHEM dann alle Mitteilungen bekommt die man am Handy auch kriegt, was zu unerwarteten Nebeneffekten führen kann.&lt;br /&gt;
&lt;br /&gt;
Die Registrierung erfolgt mit &amp;quot;set register &amp;lt;nummer&amp;gt;&amp;quot; (Telefonnummer in internationaler Schreibweise mit +49....).&lt;br /&gt;
&lt;br /&gt;
Nach erfolgter Registrierung bekommt man je nach Wert des Attributs &amp;quot;registerMethod&amp;quot; eine SMS oder einen Sprachanruf mit einer Verifikationsnummer.&lt;br /&gt;
&lt;br /&gt;
Signal versucht sich gegen unberechtigte Nutzung des Service (man könnte ja damit quasi SMS/Telefonterror betreiben) zu schützen. Nach gewissen Kriterien (soweit bekannt z.B. Registrierung aus einer VM oder über VPN) wird daher ein Captcha verlangt.&lt;br /&gt;
&lt;br /&gt;
FHEM führt hierbei durch den Prozess mit Hilfestellungen&lt;br /&gt;
&lt;br /&gt;
Ablauf:[[Datei:Signalbot Captcha Chrome.png|mini|Captcha in Chrome]]&lt;br /&gt;
# [https://signalcaptchas.org/registration/generate.html Captcha Seite] von Signal aufrufen. Link ist auch direkt in FHEM verfügbar&lt;br /&gt;
# Im Developermode (F12) und nach erfolgreichem Lösen des Captchas (wenn der Bildschirm leer bleibt, ist es auch erfolgreich gelöst) macht der Browser ein redirect auf signalcaptcha://. Das versteht der Browser aber nicht und macht gar nichts.&lt;br /&gt;
# Der String steht aber bei Firefox in der Console (recht einfach zu finden), beim Chrome muss man auf Network gehen, mit Ctrl+R refreshen und dann in der Spalte &amp;quot;Name&amp;quot; nach einem kryptischen String suchen. Dass dieser mit signalcaptcha anfängt, sieht man erst im Tooltipp, da der Anfang abgeschnitten wird.&lt;br /&gt;
# Diesen String dann in FHEM bei &amp;quot;set captcha&amp;quot; eintragen. Jetzt sollte die Registrierung erfolgreich weitergehen (SMS/Anruf).&lt;br /&gt;
Anbei Screenshots von Firefox und Chrome zum besseren Verständnis.&lt;br /&gt;
[[Datei:Signalbot Captch Firefox.png|mini|Captcha im Firefox]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Captcha &amp;quot;Automatisierung&amp;quot;:&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
Am einfachsten ist die Registrierung wenn sich von Windows aus mit FHEM verbindet. Hier stellt Signalbot ein Windows Registry File (signalcaptcha.reg) zum Download zur Verfügung. Dieses einfach runterladen und per Doppelklick in die Registry eintragen.&lt;br /&gt;
&lt;br /&gt;
Wenn jetzt die Signal Captcha Seite besucht wird, wird nach Bestätigung ein Powershell Script welches einfach wieder FHEM mit der entsprechenden &amp;quot;set captcha&amp;quot; Befehl automatisch ausführt.&lt;br /&gt;
&lt;br /&gt;
Für Linux habe ich aktuell nur eine Lösung für Firefox. Hier die signalcaptcha.desktop runterladen und nach &#039;&#039;~/.local/share/applications/signalcaptcha.desktop&#039;&#039; kopieren und mit &#039;&#039;xdg-mime default signalcaptcha.desktop x-scheme-handler/signalcaptcha&#039;&#039; (alles mit dem Desktop User) aktivieren. Dann sollte ebenfalls automatisch FHEM aufgerufen werden.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Wichtig:&#039;&#039;&#039; Wenn csrf-Tokens nicht abgeschaltet sind, werden diese bei jedem FHEM Neustart neu erzeugt, womit man auch neue .reg/.desktop Dateien benötigt (set reinit, neuer Download)&lt;br /&gt;
&lt;br /&gt;
==== Verifizierung ====&lt;br /&gt;
Zuletzt wird mit &amp;quot;set verify&amp;quot; der Verifizierungscode eingetragen und die Registrierung ist damit abgeschlossen.&lt;br /&gt;
&lt;br /&gt;
=== Bestehende Nummer verlinken ===&lt;br /&gt;
Alternativ kann man auch eine bestehende Nummer verlinken. Dazu &amp;quot;set link&amp;quot; aufrufen. Es wird jetzt ein QR-Code auf dem Bildschirm angezeigt. In der Signal App dann auf Settings-&amp;gt;Linked Devices gehen und mit &amp;quot;+&amp;quot; den QR-Code abfotografieren.&lt;br /&gt;
&lt;br /&gt;
Bitte beachten, dass bei verlinkten Devices immer alle Devices (also auch das Smartphone) Nachrichten bekommen. Bei reinem Sendebetrieb dürfte das weniger stören, soll aber auch auf Befehle reagiert werden, dann ist das eventuell verwirrend.&lt;br /&gt;
&lt;br /&gt;
== Einrichtung des Moduls ==&lt;br /&gt;
Siehe Forenthema {{Link2Forum|Topic=118370|LinkText=Neues Modul: Signalbot}}.&lt;br /&gt;
&lt;br /&gt;
Nachdem alles sauber eingerichtet ist und das Modul im FHEM Directory abgelegt wurde, entweder ein &amp;quot;reload 50_Signalbot&amp;quot; oder besser ein &amp;quot;shutdown restart&amp;quot; von FHEM machen.&lt;br /&gt;
&lt;br /&gt;
Das Modul dann einfach mit&lt;br /&gt;
 define &amp;lt;name&amp;gt; Signalbot&lt;br /&gt;
definiert.&lt;br /&gt;
&lt;br /&gt;
== Umstieg von SiSi ==&lt;br /&gt;
Alle die bereits SiSi verwenden können Signalbot erstmal gefahrlos parallel installieren. Einfach Modul ins FHEM Verzeichnis, reload / restart und &amp;quot;define&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Signalbot benötigt allerdings eine andere Dbus Implementierung (Protocol::DBus), diese muss erst installiert werden:&lt;br /&gt;
:&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;cpan install -f Protocol::DBus&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Probleme durch eine veraltete &#039;&#039;&#039;signal-cli&#039;&#039;&#039; Version sind aber nicht ausgeschlossen. Daher keine Support Anfrage ohne vollständigen Umstieg.&lt;br /&gt;
&lt;br /&gt;
Wer komplett umsteigen möchte, kann dies dann mit dem Installer Script tun. Gegebenenfalls Pfade im Script anpassen. Eine bestehende Registrierung wird dann übernommen und muss nicht erneut erfolgen (keine Garantie, dass dies für sehr alte &#039;&#039;&#039;signal-cli&#039;&#039;&#039; Versionen funktioniert). Wer&#039;s ganz sauber haben will, löscht aber alte Installationsreste.&lt;br /&gt;
&lt;br /&gt;
Sofern nach dem SiSi Wiki vorgegangen wurde, dann sind folgende Anpassungen im Script notwendig:&lt;br /&gt;
 SIGNALPATH=/opt/fhem&lt;br /&gt;
 SIGNALUSER=fhem&lt;br /&gt;
 SIGNALVAR=/opt/fhem/.local/share&lt;br /&gt;
Das Verzeichnis /opt/fhem/signal-cli kann gelöscht werden.&lt;br /&gt;
&lt;br /&gt;
Wenn mein Installationsschema übernommen werden soll, dann&lt;br /&gt;
 sudo mv /opt/fhem/.local/share/signal-cli /var/lib&lt;br /&gt;
&lt;br /&gt;
Jetzt kann das Script einfach wie oben beschrieben gestartet werden.&lt;br /&gt;
&lt;br /&gt;
=== Umzug auf ein neues System ===&lt;br /&gt;
Dazu einfach das Script mit dem Argument &amp;quot;remove&amp;quot; starten. Die alte Konfiguration wird dabei im Home Verzeichnis des aktuellen Benutzers als &#039;&#039;~/signalconf.tar.gz&#039;&#039; gesichert.&lt;br /&gt;
&lt;br /&gt;
auf dem neuen System dann&lt;br /&gt;
 cd /&lt;br /&gt;
 sudo tar xvf &#039;&#039;signalconf.tar.gz&#039;&#039;&lt;br /&gt;
Dann wie üblich das Install Script ausführen.&lt;br /&gt;
&lt;br /&gt;
== Eigene native Libraries übersetzen ==&lt;br /&gt;
Signal-cli ist zwar überwiegend in Java geschrieben, hat aber leider zwei binäre libraries die zwingend benötigt werden. Ohne diese Libraries startet der Service nicht.&lt;br /&gt;
&lt;br /&gt;
Das Install Script kann aktuell automatisch die Standard Libraries (Stand signal-cli 0.9.0 ist das für am64 mit glibc-2.31 - was z.B. Ubuntu 20.04 verwendet) durch native libraries für Raspberry (armv7l) unter &amp;quot;Buster&amp;quot; ersetzen.&lt;br /&gt;
&lt;br /&gt;
Meine apt-packages unterstützen zusätzlich noch amd64/libc-2.27, was z.B. Ubuntu 18.04 verwendet. Was aber jetzt wenn ich eine andere Architektur oder glibc habe?&lt;br /&gt;
&lt;br /&gt;
Es gibt mehrere github Projekte um signal-cli die auch fertig übersetzte libsignal_jni.so und libzkgroup.so haben (einfach mal suchen), es ist aber gar nicht so schwer die selber zu übersetzen.&lt;br /&gt;
&lt;br /&gt;
Ich gehe dabei davon aus, dass eine (wenn auch inkompatible) Installation von signal-cli bereits erfolgt ist und z.B. alle Java libraries an Ort und Stelle sind.&lt;br /&gt;
&lt;br /&gt;
Erstmal brauchst du &amp;quot;rust&amp;quot;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;sudo curl &amp;lt;nowiki&amp;gt;https://sh.rustup.rs&amp;lt;/nowiki&amp;gt; -sSf | sh&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dann die zkgroup libs übersetzen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;git clone git@github.com:signalapp/zkgroup.git&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;cd ffi/java&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;make&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Da kommt am Schluss ein Fehler, den kann man aber ignorieren, wenn die library erfolgreich erzeugt wurde.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;libzkgroup.so&#039;&#039; aus &#039;&#039;target/release/&#039;&#039; nach &#039;&#039;/opt/signal/lib&#039;&#039; kopieren&lt;br /&gt;
&lt;br /&gt;
Jetzt libsignal-client übersetzen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;git clone git@github.com:signalapp/libsignal-client.git&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;cd java&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;./build_jni.sh desktop&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;libsignal_jni.so&#039;&#039; aus &#039;&#039;target/release/&#039;&#039; nach &#039;&#039;/opt/signal/lib&#039;&#039; kopieren&lt;br /&gt;
&lt;br /&gt;
Libraries in den Java .jar Files durch die selbst compilierten ersetzen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;cd /opt/signal/lib&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;sudo -u signal-cli zip -u signal-client-java-*.jar libsignal_jni.so&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;sudo -u signal-cli zip -u zkgroup-java-*.jar libzkgroup.so&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dann Service neu starten&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;sudo service signal start&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wenn alles richtig funktioniert hat, sollte der Service jetzt laufen (syslog prüfen, oder &#039;&#039;ps -ef | grep signal-cli )&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Installation im Docker Container  ==&lt;br /&gt;
Um signal-cli in einem Docker Container zu installieren stellt sich die Schwierigkeit, dass man dort nicht so einfach Dienste per systemd starten kann und die Kommunikation zum System Dbus schwierig ist. Dies wird in durch die spezielle Docker Installation umgangen, indem der dbus-daemon dort eigens gestartet wird und signal-cli per script in den Hintergrund gestartet wird.&lt;br /&gt;
&lt;br /&gt;
Unter Verwendung [https://svn.fhem.de/fhem/trunk/fhem/contrib/signal/fhem_signal_docker_install.sh dieses Scripts] wird eine komplette FHEM Basisinstallation per Docker erstellt und dort signal-cli eingerichtet.&lt;br /&gt;
&lt;br /&gt;
==== Funktionsweise: ====&lt;br /&gt;
Das Script erstellt alle notwendigen Dateien in einem User Verzeichnis (default: $HOME/fhem) und installiert dort auch in &amp;quot;fhem-&amp;lt;version&amp;gt;&amp;quot; die aktuelle FHEM Version sowie ein Verzeichnis &amp;quot;signal&amp;quot; für die Registrierungsdaten. Diese sind somit persistent außerhalb des Containers und können auch von außen überschrieben werden.&lt;br /&gt;
&lt;br /&gt;
Wer bereits eine Signal Registrierung einer normalen Installation hat, kann diese von /var/lib/signal-cli in dieses &amp;quot;signal&amp;quot; Verzeichnis kopieren, so das sie verwendet wird.&lt;br /&gt;
&lt;br /&gt;
Das Script muss mit &amp;quot;sudo&amp;quot; ausgeführt werden und hat noch die Option &amp;quot;remove&amp;quot; alle Dockerdateien die es erzeugt auch wieder zu entfernen. FHEM bleibt dabei unangetastet.&lt;br /&gt;
&lt;br /&gt;
Bei einer erneuten Erstellung des Containers (z.B. um package updates oder eine neue signal-cli Version einzuspielen) kann man wählen FHEM nicht neu zu installieren womit es danach genauso konfiguriert wieder gestartet wird.&lt;br /&gt;
&lt;br /&gt;
Der Container wird basierend auf einem aktuellen Ubuntu Image erzeugt (aktuelle Ubuntu 20.04). Falls in FHEM Module verwendet werden, müssen oft weiteren Pakete (über apt, cpan oder npm) installiert werden. Im Installscript finden sich hier auskommentiert ein paar Hinweise wie für einige gängige Module (bzw. eben welche die ich verwende) die entsprechenden Abhängigkeiten mit eingebunden werden können.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Achtung:&#039;&#039;&#039; Das Ganze ist experimentell und für eine einmalige Installation/Start gebaut. Wenn fhem, signal-cli oder der dbus-daemon im Docker beendet werden, dann muss man diese evtl. selbst wieder nachstarten. Das kann man sicher noch einiges verbessern. Sinnvollerweise nimmt man die erzeugten Config Dateien und Scripte eher als Anregung für eine eigene Konfiguration. Verbesserungsvorschläge gerne auch im Forum.&lt;br /&gt;
&lt;br /&gt;
== Favoriten und erweiterte Command Funktionen mit einem notify ergänzen ==&lt;br /&gt;
Signalbot kann über [[DOIF]]s/[[notify]]s problemlos um individuelle Funktionen erweitert werden. Der hier beschriebene Ansatz ergänzt eine Favoritenverwaltung und erlaubt die direkt Ausführung von FHEM Befehlen entweder mit oder ohne Authentifizierung via GoogleAuth.&lt;br /&gt;
&lt;br /&gt;
Die Beschreibung hier erfolgt auf Basis von Signalbot Version &amp;quot;Signalbot:2.0.1-beta signal-cli:0.8.1 Protocol::DBus:0.16&amp;quot;. Bei künftigen Versionen können sich ggf. Änderungen ergeben.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Use Case / Szenario&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Das Signalbot Modul bietet über die Defintion von &amp;quot;allowedPeers&amp;quot; und durch die von Signal bereitgestellte Ende-zu-Ende Verschlüsselung bereits ein hohes Maß an Sicherheit. Für einfache Abfragen von Temperaturen etc. ist das aus Sicht des Autors absolut ausreichend. Diese Abfragen sollten über Favoriten mit möglichst wenig Tipp-Aufwand gesendet werden können.&lt;br /&gt;
&lt;br /&gt;
Für sicherheitskritische / sensible Aktionen ist aber eine zusätzliche Absicherung wünschenswert. Für solche Befehle bietet das Signalbot Modul die Integration von GoogleAuth bereits an.  Auch diese Befehle können über Favoritendefinitionen abgekürzt werden. Das GoogleAuth Token wird dann vorab separt geschickt.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Voraussetzungen&#039;&#039;&#039;&lt;br /&gt;
* Das Signalbot Device wird mit &amp;quot;signalBot&amp;quot; benannt (alternativ muss eben der Code im Notify angepasst werden)&lt;br /&gt;
* Es werden zusätzliche Attribute via &amp;lt;code&amp;gt;userattr&amp;lt;/code&amp;gt; zum Signalbot Device hinzugefügt: cmdKeywordNoAuth cmdPatternNoAuth favPrefix favList &amp;lt;code&amp;gt;attr signalBot userattr cmdKeywordNoAuth cmdPatternNoAuth favPrefix favList&amp;lt;/code&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Der Notify Code&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
signalBot:msgText.* {&lt;br /&gt;
	my $msgText = ReadingsVal(&amp;quot;signalBot&amp;quot;, &amp;quot;msgText&amp;quot;, &amp;quot;&amp;quot;);&lt;br /&gt;
	my $msgAuth = int(ReadingsVal(&amp;quot;signalBot&amp;quot;, &amp;quot;msgAuth&amp;quot;, 0));&lt;br /&gt;
	my $FhemCmd;&lt;br /&gt;
	my $cmdPatternNoAuth = AttrVal(&amp;quot;signalBot&amp;quot;, &amp;quot;cmdPatternNoAuth&amp;quot;, undef);&lt;br /&gt;
	my $favPrefix = AttrVal(&amp;quot;signalBot&amp;quot;, &amp;quot;favPrefix&amp;quot;, undef);&lt;br /&gt;
	my $cmdKeyword = AttrVal(&amp;quot;signalBot&amp;quot;, &amp;quot;cmdKeyword&amp;quot;, undef);&lt;br /&gt;
	my $cmdKeywordNoAuth = AttrVal(&amp;quot;signalBot&amp;quot;, &amp;quot;cmdKeywordNoAuth&amp;quot;, undef);&lt;br /&gt;
	my @favarray;&lt;br /&gt;
	my @patternarray;&lt;br /&gt;
	my $favno;&lt;br /&gt;
	my $favList;&lt;br /&gt;
	my $retval;&lt;br /&gt;
	my $msgSender = ReadingsVal(&amp;quot;signalBot&amp;quot;, &amp;quot;msgSender&amp;quot;, &amp;quot;&amp;quot;);&lt;br /&gt;
        my $msgGroup =  ReadingsVal(&amp;quot;Signalbot&amp;quot;, &amp;quot;msgGroupName&amp;quot;, &amp;quot;&amp;quot;);&lt;br /&gt;
	if ($msgGroup ne &amp;quot;&amp;quot;) { $msgSender = &amp;quot;#&amp;quot; . $msgGroup }&lt;br /&gt;
	elsif (substr($msgSender, 0, 1) ne &amp;quot;+&amp;quot;)  { $msgSender = &amp;quot;@&amp;quot; . $msgSender }&lt;br /&gt;
&lt;br /&gt;
    # Sicherheitsprüfung für multi-Command Befehl&lt;br /&gt;
	if (index($msgText, &amp;quot;;&amp;quot;) &amp;gt;= 0)  {&lt;br /&gt;
	   Log3(&amp;quot;ntf_signalBot&amp;quot;, 2, &amp;quot;ntf_signalBot: Semicolon detected, sender may try to send multiple commands in one line. Aborting!&amp;quot;);&lt;br /&gt;
	   fhem(&amp;quot;set signalBot send $msgSender Semicolon detected, command is ignored!&amp;quot;);&lt;br /&gt;
	   return;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	# ggf. Favoriten auflösen&lt;br /&gt;
	if ($favPrefix &amp;amp;&amp;amp; substr($msgText, 0, length($favPrefix)) eq $favPrefix) {&lt;br /&gt;
	   $favno = $favPrefix eq $msgText ? 0 : int(substr($msgText, length($favPrefix)));&lt;br /&gt;
       @favarray = split(&amp;quot;;&amp;quot;, AttrVal(&amp;quot;signalBot&amp;quot;, &amp;quot;favList&amp;quot;, undef));&lt;br /&gt;
	   &lt;br /&gt;
	   if ($favno == 0)  {&lt;br /&gt;
	      # Favoritenliste zurückgeben&lt;br /&gt;
	      Log3(&amp;quot;ntf_signalBot&amp;quot;, 4, &amp;quot;ntf_signalBot: list favorites&amp;quot;);&lt;br /&gt;
		  $favList = &amp;quot;&amp;quot;;&lt;br /&gt;
		  $favno = 1;&lt;br /&gt;
		  foreach my $favLine (@favarray) {&lt;br /&gt;
			 $favLine =~ /^\[(.*)\]/;&lt;br /&gt;
		     $favList .= $favPrefix . $favno . &amp;quot;\t&amp;quot; . $1 . &amp;quot;\n&amp;quot;;&lt;br /&gt;
			 $favno++;&lt;br /&gt;
		  }&lt;br /&gt;
		  fhem(&amp;quot;set signalBot send $msgSender $favList&amp;quot;);&lt;br /&gt;
		  return;&lt;br /&gt;
	   } else {&lt;br /&gt;
	      # favoriten verarbeiten&lt;br /&gt;
	      $FhemCmd = $favarray[$favno-1];&lt;br /&gt;
	      # wenn ein Alias definiert ist, dann den Befehlsteil aus dem Favoriten extrahieren&lt;br /&gt;
	      if (index($FhemCmd, &amp;quot;=&amp;quot;) &amp;gt;= 0) {&lt;br /&gt;
		    $FhemCmd = substr($FhemCmd, index($FhemCmd, &amp;quot;=&amp;quot;)+1);&lt;br /&gt;
	      }&lt;br /&gt;
	      Log3(&amp;quot;ntf_signalBot&amp;quot;,3,&amp;quot;ntf_signalBot: FhemCmd after favorite substitution: $FhemCmd&amp;quot;);&lt;br /&gt;
	   }&lt;br /&gt;
&lt;br /&gt;
	   # prüfe auf authorsiertes Command (nur wenn Favoriten expandiert wurden, um doppelte Ausführung zu vermeiden&lt;br /&gt;
	   if ($cmdKeyword &amp;amp;&amp;amp; substr($FhemCmd, 0, length($cmdKeyword)) eq $cmdKeyword)  {&lt;br /&gt;
		  if ($msgAuth)  {&lt;br /&gt;
			 Log3(&amp;quot;ntf_signalBot&amp;quot;, 3, &amp;quot;ntf_signalBot: execute authenticated cmd&amp;quot;);&lt;br /&gt;
			 $FhemCmd = substr($FhemCmd, length($cmdKeyword));&lt;br /&gt;
			 $retval = fhem($FhemCmd);&lt;br /&gt;
			 if ($retval) {&lt;br /&gt;
			    fhem(&amp;quot;set signalBot send $msgSender $retval&amp;quot;);&lt;br /&gt;
			 }&lt;br /&gt;
		  } else {&lt;br /&gt;
			 # Hinweis auf nicht authorsiertes Command&lt;br /&gt;
			 fhem(&amp;quot;set signalBot send $msgSender You are not authorized to execute authenticated commands&amp;quot;);&lt;br /&gt;
		  }&lt;br /&gt;
	   }&lt;br /&gt;
	} else {&lt;br /&gt;
	   $FhemCmd = $msgText&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	# prüfe auf nicht authorsiertes Command&lt;br /&gt;
	if ($cmdKeywordNoAuth &amp;amp;&amp;amp; substr($FhemCmd, 0, length($cmdKeywordNoAuth)) eq $cmdKeywordNoAuth)  {&lt;br /&gt;
	   # prüfe patterns&lt;br /&gt;
       Log3(&amp;quot;ntf_signalBot&amp;quot;, 4, &amp;quot;ntf_signalBot: received non-authenticated cmd, checking patterns&amp;quot;);&lt;br /&gt;
	   @patternarray = split(&amp;quot;;&amp;quot;, AttrVal(&amp;quot;signalBot&amp;quot;, &amp;quot;cmdPatternNoAuth&amp;quot;, undef));&lt;br /&gt;
	   $FhemCmd = substr($FhemCmd, length($cmdKeywordNoAuth));&lt;br /&gt;
&lt;br /&gt;
	   my $res = 0;&lt;br /&gt;
	   foreach my $secLine (@patternarray) {&lt;br /&gt;
		 $res += eval &#039;$FhemCmd =~ /&#039; . $secLine . &#039;/&#039;;&lt;br /&gt;
	   }&lt;br /&gt;
	   if ($res &amp;gt; 0)  {&lt;br /&gt;
          Log3(&amp;quot;ntf_signalBot&amp;quot;, 3, &amp;quot;ntf_signalBot: execute non-authenticated cmd&amp;quot;);&lt;br /&gt;
	      $retval = fhem($FhemCmd);&lt;br /&gt;
		  if ($retval) {&lt;br /&gt;
		     fhem(&amp;quot;set signalBot send $msgSender $retval&amp;quot;);&lt;br /&gt;
		  }&lt;br /&gt;
	   } else {&lt;br /&gt;
          Log3(&amp;quot;ntf_signalBot&amp;quot;, 2, &amp;quot;ntf_signalBot: non-authenticated cmd execution requested, but no pattern match&amp;quot;);&lt;br /&gt;
	      fhem(&amp;quot;set signalBot send $msgSender You are not authorized to execute this command without authentication&amp;quot;);&lt;br /&gt;
	   }&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Die Konfiguration erfolgt mit den Attributen am Signal Device. Diese kann z. B. wie folgt aussehen:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
attr signalBot cmdKeyword /&lt;br /&gt;
attr signalBot cmdKeywordNoAuth -&lt;br /&gt;
attr signalBot cmdPatternNoAuth get .*;;trigger .*;;getstate .*&lt;br /&gt;
attr signalBot favPrefix fav&lt;br /&gt;
attr signalBot favList [Wird später]=-trigger ntf_sayTTS &amp;quot;Es wird leider etwas später&amp;quot;;;[Öffne Haustüre]=/set Flur_Tueroeffner press;;[Temperaturen]=-trigger listTemperatures&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Wichtig ist hier, dass &amp;lt;code&amp;gt;cmdKeyword&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;cmdKeywordNoAuth&amp;lt;/code&amp;gt; unterschiedlich sind. &#039;&#039;&#039;Das &amp;quot;=&amp;quot;-Zeichen darf nicht verwendet werden,&#039;&#039;&#039; weil es in der Favoritenliste für die Zuweisung verwendet wird. In der Favoritenliste müssen die FHEM Befehle mit einem Prefix versehen werden, entweder &amp;lt;code&amp;gt;cmdKeyword&amp;lt;/code&amp;gt; oder &amp;lt;code&amp;gt;cmdKeywordNoAuth&amp;lt;/code&amp;gt;. Ohne Authentifizierung dürfen &amp;lt;code&amp;gt;get, trigger&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;getstate&amp;lt;/code&amp;gt; aufgerufen werden, alle anderen Befehle erfordern Authentifizierung.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Anwendung&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Im Chat hat man nun folgende Optionen:&lt;br /&gt;
* Liste aller Favoriten zurückgeben lassen: &amp;lt;code&amp;gt;fav&amp;lt;/code&amp;gt;&lt;br /&gt;
* Einen Favoriten aufrufen: &amp;lt;code&amp;gt;fav&amp;lt;x&amp;gt;&amp;lt;/code&amp;gt;, also z. B. fav3 oder fav13&lt;br /&gt;
* Einen FHEM Befehl ohne Authentifizierung aufrufen: &amp;lt;code&amp;gt;-get hzgWZ ist_temp&amp;lt;/code&amp;gt;&lt;br /&gt;
* Einen FHEM Befehl mit Authentifizierung aufrufen: &amp;lt;code&amp;gt;/set hzgWZ soll_temp 22&amp;lt;/code&amp;gt;  davor muss via &amp;lt;code&amp;gt;/&amp;lt;token&amp;gt;&amp;lt;/code&amp;gt; also z.B. &amp;lt;code&amp;gt;/394848&amp;lt;/code&amp;gt; das aktuelle GoogleAuth Token gesendet werden&lt;br /&gt;
&lt;br /&gt;
== Troubleshooting / FAQ ==&lt;br /&gt;
Anmerkung: Ich gehe hier davon aus, dass die Installation mit den im Script voreingestellten Pfaden/Users durchgeführt wurde. Änderungen auf eigene Gefahr.&lt;br /&gt;
&lt;br /&gt;
Bevor ich hier ein paar typische Probleme und Lösungen aus dem Foren Thread aufliste, bitte folgende Punkte sicherstellen:&lt;br /&gt;
# Ich verwende eine unterstütztes Betriebssystem (Raspbian oder Ubuntu) und CPU Architektur (armv7l oder x86)&lt;br /&gt;
# Ich habe das neuste Install Script aus https://svn.fhem.de/fhem/trunk/fhem/contrib/signal/ verwendet&lt;br /&gt;
# Ich habe vor der Installation nach besten Wissen und Gewissen Reste einer vorherigen Installation (z.B. auch für SiSi) entfernt (das Repository kann weggesichert werden um eine erneute Registrierung zu vermeiden und dann statt dem Registrierungsschritt in /var/lib/signal-cli kopiert werden&lt;br /&gt;
# Ich habe das Install Script gemäß Anleitung vollständig durchlaufen lassen und auf Fehlermeldungen geachtet&lt;br /&gt;
&lt;br /&gt;
==== Wo finde ich Fehlermeldungen/Logfiles? ====&lt;br /&gt;
* Beim Install Script direkt in der Console - achte auf die Bildschirmausgabe&lt;br /&gt;
* Beim Install Script auch in &#039;&#039;/tmp/signal_install.log&#039;&#039; - ggf. wegsichern da es bei jedem Durchlauf wieder überschrieben wird.&lt;br /&gt;
* Fehler beim Starten und Betrieb des signal-cli service (normale Installation) in /var/log/syslog&lt;br /&gt;
* Fehler beim Betrieb in FHEM im normalen FHEM log (ggf. Signalbot mit verbose=5 definieren)&lt;br /&gt;
* Im Container, sofern die Daemons mit dem Install Script gestartet wurden, schreiben ihr log in /var/log/dbus.log bzw. signal.log und die Fehlerausgabe in /var/log/dbus.err bzw. signal.err&lt;br /&gt;
&lt;br /&gt;
==== Probleme bei normaler Installation ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+&lt;br /&gt;
!Fehler&lt;br /&gt;
!Lösungsansatz&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;In FHEM:&#039;&#039;&#039;&lt;br /&gt;
Error sending message:org.asamk.Signal.Error.Failure: org.whispersystems.signalservice.api.push.exceptions.NotFoundException: Not found&lt;br /&gt;
|signal-cli läuft nicht.&lt;br /&gt;
Prüfe ggf. &#039;&#039;&#039;/var/log/syslog&#039;&#039;&#039; für weitere Fehlermeldungen.&lt;br /&gt;
&lt;br /&gt;
Führe &#039;&#039;&#039;sudo service signal start&#039;&#039;&#039; aus.&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;Bei Starten von signal-cli:&#039;&#039;&#039;&lt;br /&gt;
OpenJDK Server VM warning: You have loaded library /tmp/resource17792002454964883349.so which might have disabled stack guard. The VM will try to fix the stack guard now.&lt;br /&gt;
&lt;br /&gt;
It&#039;s highly recommended that you fix the library with &#039;execstack -c &amp;lt;libfile&amp;gt;&#039;, or link it with &#039;-z noexecstack&#039;.&lt;br /&gt;
&lt;br /&gt;
oder&lt;br /&gt;
&lt;br /&gt;
ERROR App - Missing required native library dependency: libsignal-client&lt;br /&gt;
&lt;br /&gt;
oder&lt;br /&gt;
&lt;br /&gt;
Support for new group V2 is disabled, because the required native library dependency is missing: libzkgroup&lt;br /&gt;
|Passiert üblicherweise auf dem &#039;&#039;&#039;Raspberry pi.&#039;&#039;&#039; Die Standard Distribution von signal-cli enthält eine x86 library libzkgroup.so und libsignal_jni.so, die mit armv7l nicht kompatibel ist, welche im jar &#039;&#039;zkgroup-java-*.jar&#039;&#039; bzw. signal-client-java-*.jar enthalten sind. Das Install Script entfernt diese und ersetzt sie durch armv7l libraries die vom Signalbot Maintainer auf svn.fhem.de zur Verfügung gestellt werden.&lt;br /&gt;
Irgendwo auf dem System vorhandene alte Versionen können aber versehentlich erwischt werden und diese Fehler produzieren. Als ersten Schritt mit&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;sudo rm -rf /opt/signal&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
die alte Installation komplett löschen (enthält keine Konfigurationen) und vom Install Script neu erstellen lassen (einfach wie oben beschrieben starten).&lt;br /&gt;
&lt;br /&gt;
Weitere Tests wenn der Fehler nicht behoben ist:&lt;br /&gt;
# Welche Library wird vom System verwendet: &#039;&#039;sudo ldconfig -v | grep libzkgroup.so&#039;&#039; beziehungsweise &#039;&#039;sudo ldconfig -v | grep libsignal_jni.so&#039;&#039; . Da die libraries in .jar files eingebettet sind, darf hier keine gefunden werden.&lt;br /&gt;
# Check gibt es irgendwo noch eine andere lib.so  &amp;lt;code&amp;gt;sudo find / -name libzkgroup.so 2&amp;gt;/dev/null&amp;lt;/code&amp;gt;  Wenn ja, sicherstellen, dass diese nicht genommen wird (löschen, umbenennen)&lt;br /&gt;
# Check gibt es noch irgendwo ein anderes jar  &amp;lt;code&amp;gt;sudo find / -name zkgroup-java-*.jar 2&amp;gt;/dev/null&amp;lt;/code&amp;gt;  Wenn ja, sicherstellen, dass diese nicht genommen wird (löschen, umbenennen)&lt;br /&gt;
# (für den zweiten Fehler, die Schritte 2 und 3 mit libsignal_jni.so bzw. signal-client-java-*.jar durchführen&lt;br /&gt;
|-&lt;br /&gt;
|Ich kann an Einzelempfänger senden und empfangen, aber nicht an Gruppen versenden&lt;br /&gt;
|Du hast wahrscheinlich den vorhergehenden Fehler (libzkgroup) irgendwo, aber er ist dir nicht aufgefallen. Vorgehensweise wie oben.&lt;br /&gt;
|-&lt;br /&gt;
|Ich kann keiner Gruppe beitreten und/oder nichts an eine Gruppe schicken.&lt;br /&gt;
oder&lt;br /&gt;
&lt;br /&gt;
Error in invite:org.asamk.Signal.Error.Failure: Cannot join a V2 group as self does not have a versioned profile&lt;br /&gt;
|Die neuen V2 Gruppen benötigen zwingend einen Profil Namen. Sofern also nach der Registrierung keiner gesetzt wurde, kann man keine Gruppen verwenden.&lt;br /&gt;
Abhilfe:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;sudo -E ./signal_install.sh name&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
um einen Namen (und optional ein Avatarbild) festzulegen.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Links ====&lt;br /&gt;
* Thread {{Link2Forum|Topic=118370|LinkText=Neues Modul: Signalbot}}&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Messenger]]&lt;/div&gt;</summary>
		<author><name>Weini</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=Signalbot&amp;diff=36068</id>
		<title>Signalbot</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=Signalbot&amp;diff=36068"/>
		<updated>2021-09-27T11:48:21Z</updated>

		<summary type="html">&lt;p&gt;Weini: Patch von Flachzange für Favoriten Handling eingepflegt.&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 Messenger Signal&lt;br /&gt;
|ModType=x&lt;br /&gt;
|ModForumArea=Unterstützende Dienste&lt;br /&gt;
|ModFTopic=118370&lt;br /&gt;
|ModTechName=50_Signalbot.pm&lt;br /&gt;
|ModOwner=Adimarantis ({{Link2FU|39402|Forum}}/[[Benutzer Diskussion:Adimarantis‎|Wiki]])}}&lt;br /&gt;
&lt;br /&gt;
Das Modul [[Signalbot]] ermöglicht den Versand von Nachrichten über den Instant-Messaging-Dienst [https://signal.org Signal] aus FHEM heraus.&lt;br /&gt;
&lt;br /&gt;
== Beschreibung ==&lt;br /&gt;
Beschreibung in Kurzform:&lt;br /&gt;
&lt;br /&gt;
Signalbot stellt eine Schnittstelle von FHEM zum Signal Messenger unter Linux zur Verfügung. Dazu wird das Tool [https://github.com/AsamK/signal-cli signal-cli] im DBus-Daemon Modus verwendet, welches dann letztendlich mit Signal kommuniziert.&lt;br /&gt;
&lt;br /&gt;
Aktuell unterstützte Funktionen aus FHEM:&lt;br /&gt;
* Senden und Empfangen von Nachrichten an Gruppen oder Einzelempfänger&lt;br /&gt;
* Versenden von einem oder mehreren Attachments (Bilder)&lt;br /&gt;
* Einlesen, Speichern und Übersetzen von Gruppennamen (statt base64 Strings)&lt;br /&gt;
* Setzen, Empfangen und Übersetzen von Kontaktnamen (statt Telefonnummern)&lt;br /&gt;
* Einschränken von Gruppen oder Kontakten, auf die FHEM reagieren soll&lt;br /&gt;
* Direkte Verknüpfung mit dem [[Modul Babble|Babble]] Modul zur Interpretation von Befehlen&lt;br /&gt;
* Authentifizierte Befehle an FHEM senden ({{Link2CmdRef|Anker=GoogleAuth}})&lt;br /&gt;
* Blockieren von Kontakten und Gruppen&lt;br /&gt;
* Verwalten und Betreten/Verlassen von Gruppen&lt;br /&gt;
Neu mit 3.0:&lt;br /&gt;
* Registrierung von neuen Nummern inklusive Hilfestellung für Captchas&lt;br /&gt;
* Linken von bestehenden Accounts zu FHEM&lt;br /&gt;
Die Installation von signal-cli ist aktuell je nach Linux Kenntnissen durchaus anspruchsvoll. Daher gibt es ein Installationsscript welches für aktuelle Ubuntu und Raspian Distributionen getestet ist (höchstwahrscheinlich aber auch für andere Debian basierte Distributionen funktioniert).&lt;br /&gt;
&lt;br /&gt;
Signalbot ist weitgehend kompatibel mit SiSi, verfolgt aber technisch ein paar andere Ansätze und stellt zusätzliche Funktionalitäten zur Verfügung:&lt;br /&gt;
* Signalbot erzeugt keinen eigenen Prozess sondern integriert sich voll in die laufende FHEM Instanz (ist dadurch hoffentlich stabiler und verbraucht auch weniger Speicher)&lt;br /&gt;
* Gruppen werden grundsätzlich mit ihren Klarnamen verwendet und können auch nur mit einem vorangestellten &amp;quot;#&amp;quot; (statt &amp;quot;@#&amp;quot;) gekennzeichnet werden.&lt;br /&gt;
* Kontakte werden soweit möglich auch mit Klarnamen (statt +49....) unterstützt. Diese kommen aus dem internen Adressbuch und können über &amp;quot;setContact&amp;quot; definiert werden, bzw. kommen bei verlinkten Accounts aus dem Adressbuch des Hauptgeräts. Sie können aktuell leider nur über empfangene Nachrichten entschlüsselt werden, da signal-cli die entsprechende Schnittstelle (noch) nicht zur Verfügung stellt. Signalbot lernt diese aber mit der Zeit und kann sie bei Bedarf auch so abspeichern, dass sie auch nach einem FHEM Neustart wieder verfügbar sind&lt;br /&gt;
* Die Möglichkeit von Telegrambot in den &amp;quot;send&amp;quot; Befehl eingebetteten Code auszuführen und damit z.B. einen SVG Plot zu erstellen und mit zu verschicken ist verfügbar. Dazu muss der Befehl in runde Klammern eingebettet werden (Beispiele folgen unten).&lt;br /&gt;
* Wurde mit und für die aktuelle Version 0.9.0 von signal-cli entwickelt, die auch die neuen &amp;quot;V2&amp;quot; Gruppen unterstützt, ebenso wird die neuste Version vom Perl Modul Protocol::DBus (aktuell 0.19) benötigt&lt;br /&gt;
* Wird aktiv (September 2021) gewartet (letztes Update für SiSi auf github ist von August 2018)&lt;br /&gt;
&lt;br /&gt;
=== &amp;quot;set&amp;quot; Funktionen im Detail ===&lt;br /&gt;
{{Hinweis|Die Beschreibung bezieht sich jetzt auf die aktuelle Version 3.x&lt;br /&gt;
Diese Version wird demnächst über FHEM update zur Verfügung gestellt.}}&lt;br /&gt;
&lt;br /&gt;
==== send [@&amp;lt;Recipient1&amp;gt; ... @&amp;lt;RecipientN&amp;gt;] [#&amp;lt;Group1&amp;gt; ... #&amp;lt;GroupN&amp;gt;] [&amp;amp;&amp;lt;Attachment1&amp;gt;; ... &amp;amp;&amp;lt;AttachmentN&amp;gt;] [&amp;lt;Text&amp;gt;] ====&lt;br /&gt;
* &#039;&#039;&#039;Recipient:&#039;&#039;&#039; Nummer mit Ländervorwahl (+49....) oder Kontaktname aus dem internen Adressbuch&lt;br /&gt;
* &#039;&#039;&#039;Group:&#039;&#039;&#039; Gruppenname, wie in Signal definiert im Klartext&lt;br /&gt;
* &#039;&#039;&#039;Attachment&#039;&#039;&#039;: Dateiname (Pfad für muss für fhem lesbar und absolut oder relativ zum fhem home sein) oder Stream einer Bilddatei (z.B.)SVG&lt;br /&gt;
* &#039;&#039;&#039;Text:&#039;&#039;&#039; Die eigentlich Textnachricht, kann Leerzeichen und Umbrüche (mit &amp;quot;\n&amp;quot; oder \0x0a) enthalten&lt;br /&gt;
* Sofern ein Recipient, Group oder Attachment Leerzeichen enthält, den ganzen Teilstring in Anführungszeichen setzen: z.B. &amp;quot;@Max Mustermann&amp;quot;&lt;br /&gt;
* Wenn ein FHEM Befehl ausgeführt werden soll, dann diesen in runde Klammern setzen z.B. &amp;amp;({plotAsPng(&#039;SVG_Aussentemperatur&#039;)})&lt;br /&gt;
&lt;br /&gt;
Ein paar Beispiele &lt;br /&gt;
  send @+498514711 Hallo Signal&lt;br /&gt;
  send #FHEM &amp;amp;/tmp/foto.jpg Ein Bild schicken&lt;br /&gt;
  send &amp;quot;@Mein Freund&amp;quot; Leerzeichen durch Anführungszeichen um den ganzen Teilbefehl&lt;br /&gt;
  send @Joerg #FHEM #Familie Jeder Empfänger, jede Gruppe und Attachments können mehrfach vorkommen&lt;br /&gt;
  send &amp;quot;@({my $var=\&amp;quot;Joerg\&amp;quot;;; return $var;;})&amp;quot; Perl Code mit Leerzeichen ausführen&lt;br /&gt;
  send @(define dummy1 dummy) FHEM Befehl ausführen, wird aber nicht gesendet, da kein gültiger Empfänger zurück geliefert wird&lt;br /&gt;
  send @Joerg &amp;amp;({plotAsPng(\&#039;SVG_Aussentemperatur\&#039;)}) Einen FHEM SVG Plot verschicken oder&lt;br /&gt;
  send @Joerg &amp;quot;&amp;amp;({plotAsPng(&#039;SVG_Aussentemperatur&#039;)})&amp;quot; Einen FHEM SVG Plot verschicken&lt;br /&gt;
  send @Joerg Mehrzeilige Ausgabe:\nNeue Zeile&lt;br /&gt;
  send @Joerg Umlaute öäü und Emojis 🙃😆🤗🤑🤪 sowie 𝐅𝐨𝐫𝐦𝐚𝐭𝐢𝐞𝐫𝐮𝐧𝐠𝐞𝐧 direkt senden &lt;br /&gt;
  send @Joerg Die Aussentemperatur ist [out_temp:temperature] Grad&lt;br /&gt;
&#039;&#039;&#039;Tipp zu den Formatierungen&#039;&#039;&#039;: Auf z.B. https://yaytext.com/ kann man sich seine UTF8 Kodierungen erstellen und nach FHEM per copy&amp;amp;paste einfügen. Vorrausetzung dürfte sein, dass die &amp;quot;locale&amp;quot; des Systems auf UTF8 eingestellt ist&lt;br /&gt;
&lt;br /&gt;
==== setContact &amp;lt;Number&amp;gt; &amp;lt;Contactname&amp;gt; ====&lt;br /&gt;
Definiert einen Kontakteintrag im internen Adressbuch. Es kann beim &#039;&#039;&#039;send&#039;&#039;&#039; Befehl dann der &#039;&#039;ContactName&#039;&#039; statt der Nummer verwendet werden.&lt;br /&gt;
&lt;br /&gt;
==== reinit ====&lt;br /&gt;
Verbindung zum DBus wiederherstellen. Dies sollte nicht nötig sein, außer der signal-cli Service funktionierte nicht richtig und wurde korrigiert. Ich rate hier aber eher zu einem FHEM Neustart.&lt;br /&gt;
&lt;br /&gt;
==== createGroup &amp;lt;Groupname&amp;gt; [&amp;amp;&amp;lt;path to picture&amp;gt;] ====&lt;br /&gt;
Erzeugt eine neue Signalgruppe und versieht diese (optional) mit einem Gruppenbild.&lt;br /&gt;
&lt;br /&gt;
==== updateGroup &amp;lt;Groupname&amp;gt; [&amp;lt;new Groupname&amp;gt;] [&amp;amp;&amp;lt;path to picture&amp;gt;] ====&lt;br /&gt;
Aktualisiert den Namen und/oder das Gruppenbild einer Gruppe.&lt;br /&gt;
&lt;br /&gt;
==== invite &amp;lt;Groupname&amp;gt; &amp;lt;Contact1&amp;gt; [&amp;lt;Contact2&amp;gt;...] ====&lt;br /&gt;
Lädt einen oder mehrere Kontakte (per Namen oder Nummer) in eine bestehende Gruppe ein.&lt;br /&gt;
&lt;br /&gt;
==== joinGroup &amp;lt;group link&amp;gt; ====&lt;br /&gt;
Einer bestehenden Gruppe beitreten. Dazu ist eine Einladung über einen &amp;quot;group link&amp;quot; nötig, der das Format &amp;lt;nowiki&amp;gt;https://signal.group/ https://signal.group/....&amp;lt;/nowiki&amp;gt; hat. Der einfachste Weg hierzu ist es, wenn aus der Signal App die Funktion &amp;quot;group link&amp;quot; verwendet wird und der Link dann per Signal an den FHEM User gesendet wird. Sofern das &#039;&#039;autoJoin&#039;&#039; Attribut gesetzt ist, wird dieser erkannt und FHEM tritt der Gruppe automatisch bei.&lt;br /&gt;
&lt;br /&gt;
==== quitGroup &amp;lt;Groupname&amp;gt; ====&lt;br /&gt;
Aus einer Gruppe austreten. Die Gruppe wird dabei lediglich auf &amp;quot;inaktiv&amp;quot; gesetzt und ist mit &#039;&#039;get groups&#039;&#039; weiterhin als solche sichtbar. Eine Möglichkeit die Gruppe komplett aus dem Profil zu löschen besteht aktuell nicht.&lt;br /&gt;
&lt;br /&gt;
==== block #&amp;lt;Groupname&amp;gt;|&amp;lt;Contact&amp;gt; ====&lt;br /&gt;
Blockiert eine Gruppe oder einen Kontakt (per Namen oder Nummer) serverseitig. Signalbot bekommt dann keine Nachrichten dieser Absender mehr (im Gegensatz zu &#039;&#039;allowedPeer&#039;&#039; bei der FHEM die Nachrichten noch bekommt, diese aber ignoriert.)&lt;br /&gt;
&lt;br /&gt;
==== unblock #&amp;lt;Groupname&amp;gt;|&amp;lt;Contact&amp;gt; ====&lt;br /&gt;
Hebt die Blockierung wieder auf.&lt;br /&gt;
&lt;br /&gt;
=== &amp;quot;set&amp;quot; Sonderfunktionen zur Registrierung ===&lt;br /&gt;
&lt;br /&gt;
==== signalAccount &amp;lt;Telefonnummer&amp;gt; ====&lt;br /&gt;
Setzt eine bereits registrierte oder gelinkte Telefonnummer aktiv. Die bekannten Nummern werden als Pulldown zur Verfügung gestellt. Falls eine Nummer fehlen sollte, kann diese mit &amp;quot;set reinit&amp;quot; aktualisiert werden.&lt;br /&gt;
&lt;br /&gt;
Ist nur eine Telefonnummer registriert, wird diese automatisch verwendet.&lt;br /&gt;
&lt;br /&gt;
Wenn mehrere Nummern gleichzeitig verwendet werden sollen, braucht jede Nummer eine eigenen Instanz des Moduls.&lt;br /&gt;
&lt;br /&gt;
==== register &amp;lt;Telefonnummer&amp;gt; ====&lt;br /&gt;
Eine neue Nummer für Signal registrieren. Die Telefonnummer muss in Internationaler Schreibweise (+49.....) angegeben werden.&lt;br /&gt;
&lt;br /&gt;
Signalbot führt den Anwender in einer Art Wizard (Detailtexte auf der Modulseite) durch den Registrierungsprozess. Der erste Schritt ist, eine Nummer festzulegen. Üblicherweise ist das eine Festnetznummer, was die normale Verwendung der Nummer nicht beinträchtigt. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Achtung:&#039;&#039;&#039; Hier nicht die Handynummer eines Smartphones verwenden auf dem Signal schon installiert ist. Das Handy würde dadurch von Signal abgemeldet. Dazu kann &amp;quot;link&amp;quot; verwendet werden.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Wichtig:&#039;&#039;&#039; Im Laufe der Registrierung wird eine Verifikationsnummer übermittelt, normalerweise per SMS. Für Festnetznummern sollte man das aber üblicherweise auf Sprachanruf umstellen. Dazu das Attribut &amp;quot;registerMethod&amp;quot; auf &amp;quot;Voice&amp;quot; umstellen.&lt;br /&gt;
&lt;br /&gt;
Die Registrierung wird meistens durch ein Captcha geschützt. Details dazu weiter unten.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;captcha &amp;lt;signalcaptcha://.......&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Setzen des Captcha String im Rahmen der Registrierung. Details dazu, wie man den bekommt und wie der Prozess teilweise automatisiert werden kann weiter unten&lt;br /&gt;
&lt;br /&gt;
==== verify &amp;lt;Verifizierungscode&amp;gt; ====&lt;br /&gt;
Setzen des Codes, den man im Rahmen der Registrierung per SMS oder Sprachanruf übermittelt bekommen hat.&lt;br /&gt;
&lt;br /&gt;
Dies ist der letzte Schritt der Registrierung. Danach ist Signalbot einsatzbereit.&lt;br /&gt;
&lt;br /&gt;
==== link ====&lt;br /&gt;
Zeigt einen QR Code an, den man mit der Signal App auf dem Smartphone scannen kann um FHEM als &amp;quot;Mitbenutzer&amp;quot; zu registrieren. FHEM erhält dann alle Nachrichten und gesendete Nachrichten haben den Absender des Telefons. Dies ist ein einfacher und schneller Weg um Signalbot auszuprobieren, sollte aber nicht für die produktive Benutzung verwendet werden, um unerwünschte Nebeneffekte zu vermeiden.&lt;br /&gt;
&lt;br /&gt;
=== &amp;quot;get&amp;quot; Funktionen im Detail ===&lt;br /&gt;
&lt;br /&gt;
==== contacts all|nonblocked ====&lt;br /&gt;
Öffnet ein Fenster mit allen bekannten Kontakten mit Telefonnummer und Kontaktname sowie deren &amp;quot;blocked&amp;quot; Status. Mit dem Parameter &amp;quot;nonblocked&amp;quot; werden geblockte Kontakte ausgeblendet. Als Name wird primär der selbstdefinierte Kontaktname angezeigt. Sofern keiner definiert ist, wird der durch den Kontakt selbst definierte Profilname angezeigt. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Achtung: Profilnamen werden nur all 24h aktualisiert. Ein Änderung wird also ggf. nicht sofort sichtbar. Ist kein Kontaktname und auch kein Profilname definiert, bleibt das Feld leer. Mit signal-cli 0.8.1 führt das aktuell noch zu einer Fehlermeldung im Logfile, die ignoriert werden kann. Das dürfte mit der nächsten Version behoben sein.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
==== groups all|active|nonblocked ====&lt;br /&gt;
Öffnet ein Fenster mit allen bekannten Gruppen. Es wird der Gruppenname, der &amp;quot;Active&amp;quot; Status (ist FHEM Mitglied der Gruppe), der &amp;quot;Blocked&amp;quot; Status sowie die Liste der anderen Gruppenmitglieder angezeigt. Mit dem Parameter &amp;quot;active&amp;quot; wird die Liste auf Gruppen beschränkt, in denen FHEM Mitglied ist, mit &amp;quot;nonblocked&amp;quot; werden zusätzlich noch geblockte Gruppen ausgeblendet.&lt;br /&gt;
&lt;br /&gt;
==== accounts ====&lt;br /&gt;
Zeigt alle aktuell in signal-cli registierten Telefonnummern an, die mit &amp;quot;set signalAccount&amp;quot; verwendet werden können.&lt;br /&gt;
&lt;br /&gt;
=== Attribute im Detail ===&lt;br /&gt;
==== authTimeout ====&lt;br /&gt;
Gibt bei Verwendung des {{Link2CmdRef|Anker=GoogleAuth|Label=GoogleAuth}} device die Dauer in Sekunden an, die ein Nutzer authentifiziert bleibt. Siehe &#039;&#039;commandKeyword&#039;&#039; für mehr Infos.&lt;br /&gt;
&lt;br /&gt;
==== authDev ====&lt;br /&gt;
Name des genutzten GoogleAuth device. Dies wird üblicherweise automatisch gesetzt, sofern bereits ein GoogleAuth device im System definiert ist, sobald das &#039;&#039;authTimeout&#039;&#039; gesetzt wird.&lt;br /&gt;
&lt;br /&gt;
==== autoJoin 0|1 ====&lt;br /&gt;
Falls auf 1 gesetzt, reagiert FHEM automatisch auf Einladungslinks (siehe &#039;&#039;joinGroup&#039;&#039;) und tritt der Gruppe bei&lt;br /&gt;
&lt;br /&gt;
==== commandKeyword ====&lt;br /&gt;
Eine Zeichenkette aus einem oder mehreren Zeichen, die am Anfang einer Nachricht stehen kann, damit FHEM die restliche Nachricht ungefiltert als Kommando ausführt. Die Funktion ist über GoogleAuth geschützt, d.h. ein Benutzer muss sich erst mit einem gültigen GoogleAuth Token legitimieren und bleibt entsprechend des &#039;&#039;authTimeout&#039;&#039; Attributs für gewisse Zeit authorisiert.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Beispiel:&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
Man setzt &#039;&#039;commandKeyword&#039;&#039; auf &amp;quot;=&amp;quot; , dann kann man &#039;&#039;&amp;quot;=123456 set lamp off&amp;quot;&#039;&#039; senden. Im weiteren Verlauf reicht &#039;&#039;&amp;quot;=set lamp on&amp;quot;&#039;&#039; solange bis der Timeout abgelaufen ist.&lt;br /&gt;
&lt;br /&gt;
Zur Authorisierung muss nicht zwingend gleich ein Befehl mitgesendet werden. Sofern &#039;&#039;allowedPeer&#039;&#039; gesetzt ist, muss der Absender zusätzlich in dieser Liste stehen.&lt;br /&gt;
&lt;br /&gt;
==== defaultPeer ====&lt;br /&gt;
Gruppe, Kontaktname oder Nummer an die &#039;&#039;&#039;send&#039;&#039;&#039; eine Nachricht schicken soll, wenn kein Empfänger mit @ oder # definiert wurde.&lt;br /&gt;
&lt;br /&gt;
==== allowedPeer ====&lt;br /&gt;
Komma getrennte Liste von Gruppen, Kontaktnamen oder Nummern auf die Signalbot reagieren soll (also bei empfangenen Nachrichten Readings aktualisiert). Ist dieses Attribut nicht gesetzt, reagiert Signalbot auf alle Nachrichten.&lt;br /&gt;
&lt;br /&gt;
==== babblePeer ====&lt;br /&gt;
Komma getrennte Liste von Gruppen, Kontaktnamen oder Nummern auf die Signalbot reagieren soll indem es die Nachricht an das über &#039;&#039;&#039;babbleDev&#039;&#039;&#039; (nicht zu verwechseln mit &#039;&#039;babbleDevice&#039;&#039;) definierte [[Modul Babble|Babble]] Modul schickt. Die Nachrichten werden zuerst (beschränkt auf allowedPeer) normal verarbeitet (also Readings aktualisiert) und nur nach Babble gesendet wenn diese Attribut gesetzt ist.&lt;br /&gt;
&lt;br /&gt;
Der Absender der Nachricht (Gruppe hat Prio über individuellem Absender) wird Babble als &#039;&#039;$PARM0&#039;&#039; übergeben. Dazu in Babble noch das Attribut helpFunc wie folgt setzen&lt;br /&gt;
 {fhem(&amp;quot;set SignalBot send \@$PARM0 $HELP&amp;quot;)}&lt;br /&gt;
Sollen die rivescript Spracherweiterungen genutzt werden muss außerdem &amp;quot;noChatbot&amp;quot; auf 0 stehen.&lt;br /&gt;
&lt;br /&gt;
Nach dem selben Prinzip können in der Babble Definition auch Antworten spezfisch für Devices angelegt werden, z.B. als Aktion für out-temp -&amp;gt; Temperatur -&amp;gt; draußen -&amp;gt; sagen -&amp;gt; Status:&lt;br /&gt;
 set SignalBot send @$PARM0 Die Temperatur draußen ist [out_temp:temperature] Grad&lt;br /&gt;
Womit die Frage (ohne Fragezeichen!) &amp;quot;Wie ist die Temperatur draußen&amp;quot; entsprechend quittiert wird.&lt;br /&gt;
&lt;br /&gt;
==== babbleDev ====&lt;br /&gt;
Name des definierten Babble Device.Wird beim Setzen vom babblePeer automatisch mit der ersten &amp;quot;Babble&amp;quot; Device gefüllt sofern vorhanden.&lt;br /&gt;
&lt;br /&gt;
==== babbleExclude ====&lt;br /&gt;
Regulärer Ausdruck auf den Nachrichtentext um bestimmte Nachrichten von der Weiterleitung zu Babble auszuschließen (ein Event wird trotzdem generiert und kann mit Notify, DOIF etc. verarbeitet werden).&lt;br /&gt;
&lt;br /&gt;
==== registerMethod &amp;lt;SMS|Voice&amp;gt; ====&lt;br /&gt;
Stellt die Registrierungsmethode (Rückmeldung des Verifizierungscodes) auf SMS oder Sprachanruf um.&lt;br /&gt;
&lt;br /&gt;
=== Readings im Detail ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|account&lt;br /&gt;
|Aktuell verwendete Telefonnummer (nur verfügbar wenn signal-cli 0.9.0 ohne -u Parameter gestartet wurde)&lt;br /&gt;
|-&lt;br /&gt;
|joinedGroups&lt;br /&gt;
|Liste der beigetretenen Gruppen getrennt mit Leerzeichen&lt;br /&gt;
|-&lt;br /&gt;
|lastError&lt;br /&gt;
|Text der letzten Fehlermeldung. Bitte unbedingt den Timestamp beachten. Das Reading wird bei erfolgreichen Aktionen nicht zurückgesetzt und enthält ggf. sehr alte Fehlermeldungen.&lt;br /&gt;
|-&lt;br /&gt;
|msgAttachment&lt;br /&gt;
|Attachments (Dateinamen im signal-cli repository) der zuletzt empfangenen Attachments&lt;br /&gt;
|-&lt;br /&gt;
|msgGroupName&lt;br /&gt;
|Gruppenname aus der zuletzt eine Nachricht empfangen wurde - leer wenn es eine persönlich Nachricht war&lt;br /&gt;
|-&lt;br /&gt;
|msgSender&lt;br /&gt;
|Absender der letzten Nachricht als Nummer oder wenn bekannt als Name&lt;br /&gt;
|-&lt;br /&gt;
|msgText&lt;br /&gt;
|Empfangenen Nachricht&lt;br /&gt;
|-&lt;br /&gt;
|msgTimestamp&lt;br /&gt;
|Zeitstempel der Nachricht&lt;br /&gt;
|-&lt;br /&gt;
|msgAuth&lt;br /&gt;
|Ist auf 1 gesetzt wenn der Absender der aktuellen Nachricht (also zum Zeitpunkt zu dem z.B. ein Notify/DOIF die Nachricht auswertet) per GoogleAuth authentifiziert war.&lt;br /&gt;
|-&lt;br /&gt;
|prevMsgAttachment&lt;br /&gt;
| rowspan=&amp;quot;5&amp;quot; |Wie oben, nur enthalten diese Readings die Daten der zuvor empfangenen Nachricht (n-1)&lt;br /&gt;
|-&lt;br /&gt;
|prevMsgGroupName&lt;br /&gt;
|-&lt;br /&gt;
|prevMsgSender&lt;br /&gt;
|-&lt;br /&gt;
|prevMsgText&lt;br /&gt;
|-&lt;br /&gt;
|prevMsgTimestamp&lt;br /&gt;
|-&lt;br /&gt;
|sentMsg&lt;br /&gt;
|Zuletzt gesendete Nachricht&lt;br /&gt;
|-&lt;br /&gt;
|sentMsgRecipient&lt;br /&gt;
|Empfänger der zuletzt gesendeten Nachricht. Enthält zumeist den Namen aus der Empfangsbestätigung und somit bei vielen Empfängern den zuletzt bestätigten Empfang.&lt;br /&gt;
&lt;br /&gt;
Dies muss nicht zwingend auf die zuletzt gesendete Nachricht (sendMsg) passen, wenn mehrere Nachrichten versendet wurden.&lt;br /&gt;
|-&lt;br /&gt;
|sentMsgTimestamp&lt;br /&gt;
|Zeitstempel des Empfangs oder &amp;quot;pending&amp;quot; wenn noch keine Bestätigung vorliegt&lt;br /&gt;
|-&lt;br /&gt;
|VERSION&lt;br /&gt;
|Internal Reading die die aktuelle Version von Signalbot, signal-cli und Dbus angibt - vor Support Anfragen bitte erst im Forum prüfen ob die aktuellste Version verwendet wird und ggf. updaten.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Installation ==&lt;br /&gt;
Zur Installation steht das Script &amp;quot;signal_install.sh&amp;quot; zur Verfügung, welches aber nicht zwangsweise in jeder Umgebung funktioniert. Daher erst einmal ein paar Referenzen zur manuellen Installation von signal-cli:&lt;br /&gt;
* Die Wikiseite des Vorgängermoduls [[SiSi]] welches grundsätzlich die selben Anforderungen hat&lt;br /&gt;
* Quickstart (englisch) für [https://github.com/AsamK/signal-cli/wiki/Quickstart signal-cli]&lt;br /&gt;
* Anleitung zum [https://github.com/AsamK/signal-cli/wiki/Provide-native-lib-for-libsignal#libsignal-client Übersetzen und Installieren der Libraries] für armv7 (Raspberry) da die Distribution nur x86 libraries enthält&lt;br /&gt;
* CPAN Seite des Perl Moduls zur [https://metacpan.org/pod/Protocol::DBus DBus Kommunikation]&lt;br /&gt;
Das Modul und Install Script wird demnächst über &amp;quot;fhem [[update]]&amp;quot; verbreitet, ist aber aktuell noch über dieses {{Link2Forum|Topic=118370|LinkText=Forenthema}} zu finden.&lt;br /&gt;
&lt;br /&gt;
Vorbereitung:&lt;br /&gt;
&lt;br /&gt;
Modul 50_Signalbot.pm wie üblich ins Verzeichnis &amp;quot;FHEM&amp;quot; der FHEM Installation kopieren und FHEM neu starten.&lt;br /&gt;
&lt;br /&gt;
Modul per &amp;quot;define &amp;lt;name&amp;gt; Signalbot&amp;quot; definieren.&lt;br /&gt;
&lt;br /&gt;
Das Script &amp;quot;signal_install.sh&amp;quot; aus der Detailseite des Moduls oder vom [https://svn.fhem.de/fhem/trunk/fhem/contrib/signal/ FHEM SVN] runterladen und ins Verzeichnis eines beliebigen &amp;quot;sudo&amp;quot;-fähigen Users kopieren.&lt;br /&gt;
&lt;br /&gt;
Das Script hat mehrere Optionen um Teilfunktionen direkt auszuführen, diese sind:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+&lt;br /&gt;
!Argument&lt;br /&gt;
!Bedeutung&lt;br /&gt;
|-&lt;br /&gt;
|system&lt;br /&gt;
|System für die signal-cli Installation vorbereiten. Es werden per &amp;quot;apt install&amp;quot; fehlende Pakete installiert und Verzeichnisse erstellt. &lt;br /&gt;
Muss mindestens einmal erfolgreich gelaufen sein, damit die restliche Installation funktioniert&lt;br /&gt;
|-&lt;br /&gt;
|install&lt;br /&gt;
|Installiert signal-cli als System Service. Automatischer Download, Installation und Konfiguration (dbus, systemd)&lt;br /&gt;
|-&lt;br /&gt;
|test&lt;br /&gt;
|Versendet eine Testnachricht auf zwei Arten - direkt mit dem Client (klappt das, ist die Grundregistrierung schon mal erfolgreich) und über Dbus (dann ist auch der System Service korrekt eingerichtet)&lt;br /&gt;
|-&lt;br /&gt;
|remove&lt;br /&gt;
|Löscht alle durch &amp;quot;install&amp;quot; installierten Verzeichnisse und Dateien (aber nicht die Pakete die durch &amp;quot;system&amp;quot; installiert wurden)&lt;br /&gt;
|-&lt;br /&gt;
|start&lt;br /&gt;
|Starten des singal service über systemd bzw. im Container des Dbus daemon and signal-cli Daemon&lt;br /&gt;
|}&lt;br /&gt;
Im Normalfall kann das script einfach unter root Rechten, also mit&lt;br /&gt;
 sudo ./signal_install.sh&lt;br /&gt;
aufgerufen werden (wenn das Script per Download geholt wurde, muss es vorher noch mit &amp;quot;chmod a+x signal_install.sh&amp;quot; ausführbar gemacht werden). Wenn kein Argument übergeben wird, dann wird automatisch der Ablauf &#039;&#039;system -&amp;gt; install -&amp;gt; test&#039;&#039; durchlaufen.&lt;br /&gt;
&lt;br /&gt;
Es prüft außerdem ab, ob es im Container läuft (&#039;&#039;&#039;**Aktuell nicht unterstützt**&#039;&#039;&#039; hier erfolgt ein etwas anderer Ablauf - mehr dazu unten) und prüft auf Betriebssystem und CPU Architektur. Gegebenenfalls bricht es ab, wenn es sich um keine unterstützte Kombination handelt.&lt;br /&gt;
&lt;br /&gt;
=== Registrierung ===&lt;br /&gt;
Die Registrierung wird ab Version 3.0 nicht mehr im Script sondern in FHEM selbst geführt durchgeführt.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Hinweis:&#039;&#039;&#039; Eine Nummer kann immer nur &#039;&#039;&#039;einmal&#039;&#039;&#039; registriert sein. Eine bereits bestehende Registrierung (Smartphone) wird dabei &#039;&#039;&#039;aufgehoben&#039;&#039;&#039;. Daher entweder eine Festnetznummer verwenden mit der Option &amp;quot;link&amp;quot; FHEM als Zweitbenutzer zu einer bestehenden Nummer hinzugefügen. Dies ist zum Testen ok, aber produktiv ist davon abzuraten, da FHEM dann alle Mitteilungen bekommt die man am Handy auch kriegt, was zu unerwarteten Nebeneffekten führen kann.&lt;br /&gt;
&lt;br /&gt;
Die Registrierung erfolgt mit &amp;quot;set register &amp;lt;nummer&amp;gt;&amp;quot; (Telefonnummer in internationaler Schreibweise mit +49....).&lt;br /&gt;
&lt;br /&gt;
Nach erfolgter Registrierung bekommt man je nach Wert des Attributs &amp;quot;registerMethod&amp;quot; eine SMS oder einen Sprachanruf mit einer Verifikationsnummer.&lt;br /&gt;
&lt;br /&gt;
Signal versucht sich gegen unberechtigte Nutzung des Service (man könnte ja damit quasi SMS/Telefonterror betreiben) zu schützen. Nach gewissen Kriterien (soweit bekannt z.B. Registrierung aus einer VM oder über VPN) wird daher ein Captcha verlangt.&lt;br /&gt;
&lt;br /&gt;
FHEM führt hierbei durch den Prozess mit Hilfestellungen&lt;br /&gt;
&lt;br /&gt;
Ablauf:[[Datei:Signalbot Captcha Chrome.png|mini|Captcha in Chrome]]&lt;br /&gt;
# [https://signalcaptchas.org/registration/generate.html Captcha Seite] von Signal aufrufen. Link ist auch direkt in FHEM verfügbar&lt;br /&gt;
# Im Developermode (F12) und nach erfolgreichem Lösen des Captchas (wenn der Bildschirm leer bleibt, ist es auch erfolgreich gelöst) macht der Browser ein redirect auf signalcaptcha://. Das versteht der Browser aber nicht und macht gar nichts.&lt;br /&gt;
# Der String steht aber bei Firefox in der Console (recht einfach zu finden), beim Chrome muss man auf Network gehen, mit Ctrl+R refreshen und dann in der Spalte &amp;quot;Name&amp;quot; nach einem kryptischen String suchen. Dass dieser mit signalcaptcha anfängt, sieht man erst im Tooltipp, da der Anfang abgeschnitten wird.&lt;br /&gt;
# Diesen String dann in FHEM bei &amp;quot;set captcha&amp;quot; eintragen. Jetzt sollte die Registrierung erfolgreich weitergehen (SMS/Anruf).&lt;br /&gt;
Anbei Screenshots von Firefox und Chrome zum besseren Verständnis.&lt;br /&gt;
[[Datei:Signalbot Captch Firefox.png|mini|Captcha im Firefox]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Captcha &amp;quot;Automatisierung&amp;quot;:&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
Am einfachsten ist die Registrierung wenn sich von Windows aus mit FHEM verbindet. Hier stellt Signalbot ein Windows Registry File (signalcaptcha.reg) zum Download zur Verfügung. Dieses einfach runterladen und per Doppelklick in die Registry eintragen.&lt;br /&gt;
&lt;br /&gt;
Wenn jetzt die Signal Captcha Seite besucht wird, wird nach Bestätigung ein Powershell Script welches einfach wieder FHEM mit der entsprechenden &amp;quot;set captcha&amp;quot; Befehl automatisch ausführt.&lt;br /&gt;
&lt;br /&gt;
Für Linux habe ich aktuell nur eine Lösung für Firefox. Hier die signalcaptcha.desktop runterladen und nach &#039;&#039;~/.local/share/applications/signalcaptcha.desktop&#039;&#039; kopieren und mit &#039;&#039;xdg-mime default signalcaptcha.desktop x-scheme-handler/signalcaptcha&#039;&#039; (alles mit dem Desktop User) aktivieren. Dann sollte ebenfalls automatisch FHEM aufgerufen werden.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Wichtig:&#039;&#039;&#039; Wenn csrf-Tokens nicht abgeschaltet sind, werden diese bei jedem FHEM Neustart neu erzeugt, womit man auch neue .reg/.desktop Dateien benötigt (set reinit, neuer Download)&lt;br /&gt;
&lt;br /&gt;
==== Verifizierung ====&lt;br /&gt;
Zuletzt wird mit &amp;quot;set verify&amp;quot; der Verifizierungscode eingetragen und die Registrierung ist damit abgeschlossen.&lt;br /&gt;
&lt;br /&gt;
=== Bestehende Nummer verlinken ===&lt;br /&gt;
Alternativ kann man auch eine bestehende Nummer verlinken. Dazu &amp;quot;set link&amp;quot; aufrufen. Es wird jetzt ein QR-Code auf dem Bildschirm angezeigt. In der Signal App dann auf Settings-&amp;gt;Linked Devices gehen und mit &amp;quot;+&amp;quot; den QR-Code abfotografieren.&lt;br /&gt;
&lt;br /&gt;
Bitte beachten, dass bei verlinkten Devices immer alle Devices (also auch das Smartphone) Nachrichten bekommen. Bei reinem Sendebetrieb dürfte das weniger stören, soll aber auch auf Befehle reagiert werden, dann ist das eventuell verwirrend.&lt;br /&gt;
&lt;br /&gt;
== Einrichtung des Moduls ==&lt;br /&gt;
Siehe Forenthema {{Link2Forum|Topic=118370|LinkText=Neues Modul: Signalbot}}.&lt;br /&gt;
&lt;br /&gt;
Nachdem alles sauber eingerichtet ist und das Modul im FHEM Directory abgelegt wurde, entweder ein &amp;quot;reload 50_Signalbot&amp;quot; oder besser ein &amp;quot;shutdown restart&amp;quot; von FHEM machen.&lt;br /&gt;
&lt;br /&gt;
Das Modul dann einfach mit&lt;br /&gt;
 define &amp;lt;name&amp;gt; Signalbot&lt;br /&gt;
definiert.&lt;br /&gt;
&lt;br /&gt;
== Umstieg von SiSi ==&lt;br /&gt;
Alle die bereits SiSi verwenden können Signalbot erstmal gefahrlos parallel installieren. Einfach Modul ins FHEM Verzeichnis, reload / restart und &amp;quot;define&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Signalbot benötigt allerdings eine andere Dbus Implementierung (Protocol::DBus), diese muss erst installiert werden:&lt;br /&gt;
:&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;cpan install -f Protocol::DBus&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Probleme durch eine veraltete &#039;&#039;&#039;signal-cli&#039;&#039;&#039; Version sind aber nicht ausgeschlossen. Daher keine Support Anfrage ohne vollständigen Umstieg.&lt;br /&gt;
&lt;br /&gt;
Wer komplett umsteigen möchte, kann dies dann mit dem Installer Script tun. Gegebenenfalls Pfade im Script anpassen. Eine bestehende Registrierung wird dann übernommen und muss nicht erneut erfolgen (keine Garantie, dass dies für sehr alte &#039;&#039;&#039;signal-cli&#039;&#039;&#039; Versionen funktioniert). Wer&#039;s ganz sauber haben will, löscht aber alte Installationsreste.&lt;br /&gt;
&lt;br /&gt;
Sofern nach dem SiSi Wiki vorgegangen wurde, dann sind folgende Anpassungen im Script notwendig:&lt;br /&gt;
 SIGNALPATH=/opt/fhem&lt;br /&gt;
 SIGNALUSER=fhem&lt;br /&gt;
 SIGNALVAR=/opt/fhem/.local/share&lt;br /&gt;
Das Verzeichnis /opt/fhem/signal-cli kann gelöscht werden.&lt;br /&gt;
&lt;br /&gt;
Wenn mein Installationsschema übernommen werden soll, dann&lt;br /&gt;
 sudo mv /opt/fhem/.local/share/signal-cli /var/lib&lt;br /&gt;
&lt;br /&gt;
Jetzt kann das Script einfach wie oben beschrieben gestartet werden.&lt;br /&gt;
&lt;br /&gt;
=== Umzug auf ein neues System ===&lt;br /&gt;
Dazu einfach das Script mit dem Argument &amp;quot;remove&amp;quot; starten. Die alte Konfiguration wird dabei im Home Verzeichnis des aktuellen Benutzers als &#039;&#039;~/signalconf.tar.gz&#039;&#039; gesichert.&lt;br /&gt;
&lt;br /&gt;
auf dem neuen System dann&lt;br /&gt;
 cd /&lt;br /&gt;
 sudo tar xvf &#039;&#039;signalconf.tar.gz&#039;&#039;&lt;br /&gt;
Dann wie üblich das Install Script ausführen.&lt;br /&gt;
&lt;br /&gt;
== Eigene native Libraries übersetzen ==&lt;br /&gt;
Signal-cli ist zwar überwiegend in Java geschrieben, hat aber leider zwei binäre libraries die zwingend benötigt werden. Ohne diese Libraries startet der Service nicht.&lt;br /&gt;
&lt;br /&gt;
Das Install Script kann aktuell automatisch die Standard Libraries (Stand signal-cli 0.9.0 ist das für am64 mit glibc-2.31 - was z.B. Ubuntu 20.04 verwendet) durch native libraries für Raspberry (armv7l) unter &amp;quot;Buster&amp;quot; ersetzen.&lt;br /&gt;
&lt;br /&gt;
Meine apt-packages unterstützen zusätzlich noch amd64/libc-2.27, was z.B. Ubuntu 18.04 verwendet. Was aber jetzt wenn ich eine andere Architektur oder glibc habe?&lt;br /&gt;
&lt;br /&gt;
Es gibt mehrere github Projekte um signal-cli die auch fertig übersetzte libsignal_jni.so und libzkgroup.so haben (einfach mal suchen), es ist aber gar nicht so schwer die selber zu übersetzen.&lt;br /&gt;
&lt;br /&gt;
Ich gehe dabei davon aus, dass eine (wenn auch inkompatible) Installation von signal-cli bereits erfolgt ist und z.B. alle Java libraries an Ort und Stelle sind.&lt;br /&gt;
&lt;br /&gt;
Erstmal brauchst du &amp;quot;rust&amp;quot;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;sudo curl &amp;lt;nowiki&amp;gt;https://sh.rustup.rs&amp;lt;/nowiki&amp;gt; -sSf | sh&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dann die zkgroup libs übersetzen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;git clone git@github.com:signalapp/zkgroup.git&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;cd ffi/java&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;make&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Da kommt am Schluss ein Fehler, den kann man aber ignorieren, wenn die library erfolgreich erzeugt wurde.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;libzkgroup.so&#039;&#039; aus &#039;&#039;target/release/&#039;&#039; nach &#039;&#039;/opt/signal/lib&#039;&#039; kopieren&lt;br /&gt;
&lt;br /&gt;
Jetzt libsignal-client übersetzen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;git clone git@github.com:signalapp/libsignal-client.git&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;cd java&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;./build_jni.sh desktop&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;libsignal_jni.so&#039;&#039; aus &#039;&#039;target/release/&#039;&#039; nach &#039;&#039;/opt/signal/lib&#039;&#039; kopieren&lt;br /&gt;
&lt;br /&gt;
Libraries in den Java .jar Files durch die selbst compilierten ersetzen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;cd /opt/signal/lib&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;sudo -u signal-cli zip -u signal-client-java-*.jar libsignal_jni.so&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;sudo -u signal-cli zip -u zkgroup-java-*.jar libzkgroup.so&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dann Service neu starten&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;sudo service signal start&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wenn alles richtig funktioniert hat, sollte der Service jetzt laufen (syslog prüfen, oder &#039;&#039;ps -ef | grep signal-cli )&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Installation im Docker Container  ==&lt;br /&gt;
Um signal-cli in einem Docker Container zu installieren stellt sich die Schwierigkeit, dass man dort nicht so einfach Dienste per systemd starten kann und die Kommunikation zum System Dbus schwierig ist. Dies wird in durch die spezielle Docker Installation umgangen, indem der dbus-daemon dort eigens gestartet wird und signal-cli per script in den Hintergrund gestartet wird.&lt;br /&gt;
&lt;br /&gt;
Unter Verwendung [https://svn.fhem.de/fhem/trunk/fhem/contrib/signal/fhem_signal_docker_install.sh dieses Scripts] wird eine komplette FHEM Basisinstallation per Docker erstellt und dort signal-cli eingerichtet.&lt;br /&gt;
&lt;br /&gt;
==== Funktionsweise: ====&lt;br /&gt;
Das Script erstellt alle notwendigen Dateien in einem User Verzeichnis (default: $HOME/fhem) und installiert dort auch in &amp;quot;fhem-&amp;lt;version&amp;gt;&amp;quot; die aktuelle FHEM Version sowie ein Verzeichnis &amp;quot;signal&amp;quot; für die Registrierungsdaten. Diese sind somit persistent außerhalb des Containers und können auch von außen überschrieben werden.&lt;br /&gt;
&lt;br /&gt;
Wer bereits eine Signal Registrierung einer normalen Installation hat, kann diese von /var/lib/signal-cli in dieses &amp;quot;signal&amp;quot; Verzeichnis kopieren, so das sie verwendet wird.&lt;br /&gt;
&lt;br /&gt;
Das Script muss mit &amp;quot;sudo&amp;quot; ausgeführt werden und hat noch die Option &amp;quot;remove&amp;quot; alle Dockerdateien die es erzeugt auch wieder zu entfernen. FHEM bleibt dabei unangetastet.&lt;br /&gt;
&lt;br /&gt;
Bei einer erneuten Erstellung des Containers (z.B. um package updates oder eine neue signal-cli Version einzuspielen) kann man wählen FHEM nicht neu zu installieren womit es danach genauso konfiguriert wieder gestartet wird.&lt;br /&gt;
&lt;br /&gt;
Der Container wird basierend auf einem aktuellen Ubuntu Image erzeugt (aktuelle Ubuntu 20.04). Falls in FHEM Module verwendet werden, müssen oft weiteren Pakete (über apt, cpan oder npm) installiert werden. Im Installscript finden sich hier auskommentiert ein paar Hinweise wie für einige gängige Module (bzw. eben welche die ich verwende) die entsprechenden Abhängigkeiten mit eingebunden werden können.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Achtung:&#039;&#039;&#039; Das Ganze ist experimentell und für eine einmalige Installation/Start gebaut. Wenn fhem, signal-cli oder der dbus-daemon im Docker beendet werden, dann muss man diese evtl. selbst wieder nachstarten. Das kann man sicher noch einiges verbessern. Sinnvollerweise nimmt man die erzeugten Config Dateien und Scripte eher als Anregung für eine eigene Konfiguration. Verbesserungsvorschläge gerne auch im Forum.&lt;br /&gt;
&lt;br /&gt;
== Favoriten und erweiterte Command Funktionen mit einem notify ergänzen ==&lt;br /&gt;
Signalbot kann über [[DOIF]]s/[[notify]]s problemlos um individuelle Funktionen erweitert werden. Der hier beschriebene Ansatz ergänzt eine Favoritenverwaltung und erlaubt die direkt Ausführung von FHEM Befehlen entweder mit oder ohne Authentifizierung via GoogleAuth.&lt;br /&gt;
&lt;br /&gt;
Die Beschreibung hier erfolgt auf Basis von Signalbot Version &amp;quot;Signalbot:2.0.1-beta signal-cli:0.8.1 Protocol::DBus:0.16&amp;quot;. Bei künftigen Versionen können sich ggf. Änderungen ergeben.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Use Case / Szenario&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Das Signalbot Modul bietet über die Defintion von &amp;quot;allowedPeers&amp;quot; und durch die von Signal bereitgestellte Ende-zu-Ende Verschlüsselung bereits ein hohes Maß an Sicherheit. Für einfache Abfragen von Temperaturen etc. ist das aus Sicht des Autors absolut ausreichend. Diese Abfragen sollten über Favoriten mit möglichst wenig Tipp-Aufwand gesendet werden können.&lt;br /&gt;
&lt;br /&gt;
Für sicherheitskritische / sensible Aktionen ist aber eine zusätzliche Absicherung wünschenswert. Für solche Befehle bietet das Signalbot Modul die Integration von GoogleAuth bereits an.  Auch diese Befehle können über Favoritendefinitionen abgekürzt werden. Das GoogleAuth Token wird dann vorab separt geschickt.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Voraussetzungen&#039;&#039;&#039;&lt;br /&gt;
* Das Signalbot Device wird mit &amp;quot;signalBot&amp;quot; benannt (alternativ muss eben der Code im Notify angepasst werden)&lt;br /&gt;
* Es werden zusätzliche Attribute via &amp;lt;code&amp;gt;userattr&amp;lt;/code&amp;gt; zum Signalbot Device hinzugefügt: cmdKeywordNoAuth cmdPatternNoAuth favPrefix favList &amp;lt;code&amp;gt;attr signalBot userattr cmdKeywordNoAuth cmdPatternNoAuth favPrefix favList&amp;lt;/code&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Der Notify Code&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
signalBot:msgText.* {&lt;br /&gt;
	my $msgText = ReadingsVal(&amp;quot;signalBot&amp;quot;, &amp;quot;msgText&amp;quot;, &amp;quot;&amp;quot;);&lt;br /&gt;
	my $msgAuth = int(ReadingsVal(&amp;quot;signalBot&amp;quot;, &amp;quot;msgAuth&amp;quot;, 0));&lt;br /&gt;
	my $FhemCmd;&lt;br /&gt;
	my $cmdPatternNoAuth = AttrVal(&amp;quot;signalBot&amp;quot;, &amp;quot;cmdPatternNoAuth&amp;quot;, undef);&lt;br /&gt;
	my $favPrefix = AttrVal(&amp;quot;signalBot&amp;quot;, &amp;quot;favPrefix&amp;quot;, undef);&lt;br /&gt;
	my $cmdKeyword = AttrVal(&amp;quot;signalBot&amp;quot;, &amp;quot;cmdKeyword&amp;quot;, undef);&lt;br /&gt;
	my $cmdKeywordNoAuth = AttrVal(&amp;quot;signalBot&amp;quot;, &amp;quot;cmdKeywordNoAuth&amp;quot;, undef);&lt;br /&gt;
	my @favarray;&lt;br /&gt;
	my @patternarray;&lt;br /&gt;
	my $favno;&lt;br /&gt;
	my $favList;&lt;br /&gt;
	my $retval;&lt;br /&gt;
	my $msgSender = ReadingsVal(&amp;quot;signalBot&amp;quot;, &amp;quot;msgSender&amp;quot;, &amp;quot;&amp;quot;);&lt;br /&gt;
	if (substr($msgSender, 0, 1) ne &amp;quot;+&amp;quot;)  { $msgSender = &amp;quot;@&amp;quot; . $msgSender }&lt;br /&gt;
&lt;br /&gt;
    # Sicherheitsprüfung für multi-Command Befehl&lt;br /&gt;
	if (index($msgText, &amp;quot;;&amp;quot;) &amp;gt;= 0)  {&lt;br /&gt;
	   Log3(&amp;quot;ntf_signalBot&amp;quot;, 2, &amp;quot;ntf_signalBot: Semicolon detected, sender may try to send multiple commands in one line. Aborting!&amp;quot;);&lt;br /&gt;
	   fhem(&amp;quot;set signalBot send $msgSender Semicolon detected, command is ignored!&amp;quot;);&lt;br /&gt;
	   return;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	# ggf. Favoriten auflösen&lt;br /&gt;
	if ($favPrefix &amp;amp;&amp;amp; substr($msgText, 0, length($favPrefix)) eq $favPrefix) {&lt;br /&gt;
	   $favno = $favPrefix eq $msgText ? 0 : int(substr($msgText, length($favPrefix)));&lt;br /&gt;
       @favarray = split(&amp;quot;;&amp;quot;, AttrVal(&amp;quot;signalBot&amp;quot;, &amp;quot;favList&amp;quot;, undef));&lt;br /&gt;
	   &lt;br /&gt;
	   if ($favno == 0)  {&lt;br /&gt;
	      # Favoritenliste zurückgeben&lt;br /&gt;
	      Log3(&amp;quot;ntf_signalBot&amp;quot;, 4, &amp;quot;ntf_signalBot: list favorites&amp;quot;);&lt;br /&gt;
		  $favList = &amp;quot;&amp;quot;;&lt;br /&gt;
		  $favno = 1;&lt;br /&gt;
		  foreach my $favLine (@favarray) {&lt;br /&gt;
			 $favLine =~ /^\[(.*)\]/;&lt;br /&gt;
		     $favList .= $favPrefix . $favno . &amp;quot;\t&amp;quot; . $1 . &amp;quot;\n&amp;quot;;&lt;br /&gt;
			 $favno++;&lt;br /&gt;
		  }&lt;br /&gt;
		  fhem(&amp;quot;set signalBot send $msgSender $favList&amp;quot;);&lt;br /&gt;
		  return;&lt;br /&gt;
	   } else {&lt;br /&gt;
	      # favoriten verarbeiten&lt;br /&gt;
	      $FhemCmd = $favarray[$favno-1];&lt;br /&gt;
	      # wenn ein Alias definiert ist, dann den Befehlsteil aus dem Favoriten extrahieren&lt;br /&gt;
	      if (index($FhemCmd, &amp;quot;=&amp;quot;) &amp;gt;= 0) {&lt;br /&gt;
		    $FhemCmd = substr($FhemCmd, index($FhemCmd, &amp;quot;=&amp;quot;)+1);&lt;br /&gt;
	      }&lt;br /&gt;
	      Log3(&amp;quot;ntf_signalBot&amp;quot;,3,&amp;quot;ntf_signalBot: FhemCmd after favorite substitution: $FhemCmd&amp;quot;);&lt;br /&gt;
	   }&lt;br /&gt;
&lt;br /&gt;
	   # prüfe auf authorsiertes Command (nur wenn Favoriten expandiert wurden, um doppelte Ausführung zu vermeiden&lt;br /&gt;
	   if ($cmdKeyword &amp;amp;&amp;amp; substr($FhemCmd, 0, length($cmdKeyword)) eq $cmdKeyword)  {&lt;br /&gt;
		  if ($msgAuth)  {&lt;br /&gt;
			 Log3(&amp;quot;ntf_signalBot&amp;quot;, 3, &amp;quot;ntf_signalBot: execute authenticated cmd&amp;quot;);&lt;br /&gt;
			 $FhemCmd = substr($FhemCmd, length($cmdKeyword));&lt;br /&gt;
			 $retval = fhem($FhemCmd);&lt;br /&gt;
			 if ($retval) {&lt;br /&gt;
			    fhem(&amp;quot;set signalBot send $msgSender $retval&amp;quot;);&lt;br /&gt;
			 }&lt;br /&gt;
		  } else {&lt;br /&gt;
			 # Hinweis auf nicht authorsiertes Command&lt;br /&gt;
			 fhem(&amp;quot;set signalBot send $msgSender You are not authorized to execute authenticated commands&amp;quot;);&lt;br /&gt;
		  }&lt;br /&gt;
	   }&lt;br /&gt;
	} else {&lt;br /&gt;
	   $FhemCmd = $msgText&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	# prüfe auf nicht authorsiertes Command&lt;br /&gt;
	if ($cmdKeywordNoAuth &amp;amp;&amp;amp; substr($FhemCmd, 0, length($cmdKeywordNoAuth)) eq $cmdKeywordNoAuth)  {&lt;br /&gt;
	   # prüfe patterns&lt;br /&gt;
       Log3(&amp;quot;ntf_signalBot&amp;quot;, 4, &amp;quot;ntf_signalBot: received non-authenticated cmd, checking patterns&amp;quot;);&lt;br /&gt;
	   @patternarray = split(&amp;quot;;&amp;quot;, AttrVal(&amp;quot;signalBot&amp;quot;, &amp;quot;cmdPatternNoAuth&amp;quot;, undef));&lt;br /&gt;
	   $FhemCmd = substr($FhemCmd, length($cmdKeywordNoAuth));&lt;br /&gt;
&lt;br /&gt;
	   my $res = 0;&lt;br /&gt;
	   foreach my $secLine (@patternarray) {&lt;br /&gt;
		 $res += eval &#039;$FhemCmd =~ /&#039; . $secLine . &#039;/&#039;;&lt;br /&gt;
	   }&lt;br /&gt;
	   if ($res &amp;gt; 0)  {&lt;br /&gt;
          Log3(&amp;quot;ntf_signalBot&amp;quot;, 3, &amp;quot;ntf_signalBot: execute non-authenticated cmd&amp;quot;);&lt;br /&gt;
	      $retval = fhem($FhemCmd);&lt;br /&gt;
		  if ($retval) {&lt;br /&gt;
		     fhem(&amp;quot;set signalBot send $msgSender $retval&amp;quot;);&lt;br /&gt;
		  }&lt;br /&gt;
	   } else {&lt;br /&gt;
          Log3(&amp;quot;ntf_signalBot&amp;quot;, 2, &amp;quot;ntf_signalBot: non-authenticated cmd execution requested, but no pattern match&amp;quot;);&lt;br /&gt;
	      fhem(&amp;quot;set signalBot send $msgSender You are not authorized to execute this command without authentication&amp;quot;);&lt;br /&gt;
	   }&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Die Konfiguration erfolgt mit den Attributen am Signal Device. Diese kann z. B. wie folgt aussehen:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
attr signalBot cmdKeyword /&lt;br /&gt;
attr signalBot cmdKeywordNoAuth -&lt;br /&gt;
attr signalBot cmdPatternNoAuth get .*;;trigger .*;;getstate .*&lt;br /&gt;
attr signalBot favPrefix fav&lt;br /&gt;
attr signalBot favList [Wird später]=-trigger ntf_sayTTS &amp;quot;Es wird leider etwas später&amp;quot;;;[Öffne Haustüre]=/set Flur_Tueroeffner press;;[Temperaturen]=-trigger listTemperatures&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Wichtig ist hier, dass &amp;lt;code&amp;gt;cmdKeyword&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;cmdKeywordNoAuth&amp;lt;/code&amp;gt; unterschiedlich sind. &#039;&#039;&#039;Das &amp;quot;=&amp;quot;-Zeichen darf nicht verwendet werden,&#039;&#039;&#039; weil es in der Favoritenliste für die Zuweisung verwendet wird. In der Favoritenliste müssen die FHEM Befehle mit einem Prefix versehen werden, entweder &amp;lt;code&amp;gt;cmdKeyword&amp;lt;/code&amp;gt; oder &amp;lt;code&amp;gt;cmdKeywordNoAuth&amp;lt;/code&amp;gt;. Ohne Authentifizierung dürfen &amp;lt;code&amp;gt;get, trigger&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;getstate&amp;lt;/code&amp;gt; aufgerufen werden, alle anderen Befehle erfordern Authentifizierung.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Anwendung&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Im Chat hat man nun folgende Optionen:&lt;br /&gt;
* Liste aller Favoriten zurückgeben lassen: &amp;lt;code&amp;gt;fav&amp;lt;/code&amp;gt;&lt;br /&gt;
* Einen Favoriten aufrufen: &amp;lt;code&amp;gt;fav&amp;lt;x&amp;gt;&amp;lt;/code&amp;gt;, also z. B. fav3 oder fav13&lt;br /&gt;
* Einen FHEM Befehl ohne Authentifizierung aufrufen: &amp;lt;code&amp;gt;-get hzgWZ ist_temp&amp;lt;/code&amp;gt;&lt;br /&gt;
* Einen FHEM Befehl mit Authentifizierung aufrufen: &amp;lt;code&amp;gt;/set hzgWZ soll_temp 22&amp;lt;/code&amp;gt;  davor muss via &amp;lt;code&amp;gt;/&amp;lt;token&amp;gt;&amp;lt;/code&amp;gt; also z.B. &amp;lt;code&amp;gt;/394848&amp;lt;/code&amp;gt; das aktuelle GoogleAuth Token gesendet werden&lt;br /&gt;
&lt;br /&gt;
== Troubleshooting / FAQ ==&lt;br /&gt;
Anmerkung: Ich gehe hier davon aus, dass die Installation mit den im Script voreingestellten Pfaden/Users durchgeführt wurde. Änderungen auf eigene Gefahr.&lt;br /&gt;
&lt;br /&gt;
Bevor ich hier ein paar typische Probleme und Lösungen aus dem Foren Thread aufliste, bitte folgende Punkte sicherstellen:&lt;br /&gt;
# Ich verwende eine unterstütztes Betriebssystem (Raspbian oder Ubuntu) und CPU Architektur (armv7l oder x86)&lt;br /&gt;
# Ich habe das neuste Install Script aus https://svn.fhem.de/fhem/trunk/fhem/contrib/signal/ verwendet&lt;br /&gt;
# Ich habe vor der Installation nach besten Wissen und Gewissen Reste einer vorherigen Installation (z.B. auch für SiSi) entfernt (das Repository kann weggesichert werden um eine erneute Registrierung zu vermeiden und dann statt dem Registrierungsschritt in /var/lib/signal-cli kopiert werden&lt;br /&gt;
# Ich habe das Install Script gemäß Anleitung vollständig durchlaufen lassen und auf Fehlermeldungen geachtet&lt;br /&gt;
&lt;br /&gt;
==== Wo finde ich Fehlermeldungen/Logfiles? ====&lt;br /&gt;
* Beim Install Script direkt in der Console - achte auf die Bildschirmausgabe&lt;br /&gt;
* Beim Install Script auch in &#039;&#039;/tmp/signal_install.log&#039;&#039; - ggf. wegsichern da es bei jedem Durchlauf wieder überschrieben wird.&lt;br /&gt;
* Fehler beim Starten und Betrieb des signal-cli service (normale Installation) in /var/log/syslog&lt;br /&gt;
* Fehler beim Betrieb in FHEM im normalen FHEM log (ggf. Signalbot mit verbose=5 definieren)&lt;br /&gt;
* Im Container, sofern die Daemons mit dem Install Script gestartet wurden, schreiben ihr log in /var/log/dbus.log bzw. signal.log und die Fehlerausgabe in /var/log/dbus.err bzw. signal.err&lt;br /&gt;
&lt;br /&gt;
==== Probleme bei normaler Installation ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+&lt;br /&gt;
!Fehler&lt;br /&gt;
!Lösungsansatz&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;In FHEM:&#039;&#039;&#039;&lt;br /&gt;
Error sending message:org.asamk.Signal.Error.Failure: org.whispersystems.signalservice.api.push.exceptions.NotFoundException: Not found&lt;br /&gt;
|signal-cli läuft nicht.&lt;br /&gt;
Prüfe ggf. &#039;&#039;&#039;/var/log/syslog&#039;&#039;&#039; für weitere Fehlermeldungen.&lt;br /&gt;
&lt;br /&gt;
Führe &#039;&#039;&#039;sudo service signal start&#039;&#039;&#039; aus.&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;Bei Starten von signal-cli:&#039;&#039;&#039;&lt;br /&gt;
OpenJDK Server VM warning: You have loaded library /tmp/resource17792002454964883349.so which might have disabled stack guard. The VM will try to fix the stack guard now.&lt;br /&gt;
&lt;br /&gt;
It&#039;s highly recommended that you fix the library with &#039;execstack -c &amp;lt;libfile&amp;gt;&#039;, or link it with &#039;-z noexecstack&#039;.&lt;br /&gt;
&lt;br /&gt;
oder&lt;br /&gt;
&lt;br /&gt;
ERROR App - Missing required native library dependency: libsignal-client&lt;br /&gt;
&lt;br /&gt;
oder&lt;br /&gt;
&lt;br /&gt;
Support for new group V2 is disabled, because the required native library dependency is missing: libzkgroup&lt;br /&gt;
|Passiert üblicherweise auf dem &#039;&#039;&#039;Raspberry pi.&#039;&#039;&#039; Die Standard Distribution von signal-cli enthält eine x86 library libzkgroup.so und libsignal_jni.so, die mit armv7l nicht kompatibel ist, welche im jar &#039;&#039;zkgroup-java-*.jar&#039;&#039; bzw. signal-client-java-*.jar enthalten sind. Das Install Script entfernt diese und ersetzt sie durch armv7l libraries die vom Signalbot Maintainer auf svn.fhem.de zur Verfügung gestellt werden.&lt;br /&gt;
Irgendwo auf dem System vorhandene alte Versionen können aber versehentlich erwischt werden und diese Fehler produzieren. Als ersten Schritt mit&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;sudo rm -rf /opt/signal&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
die alte Installation komplett löschen (enthält keine Konfigurationen) und vom Install Script neu erstellen lassen (einfach wie oben beschrieben starten).&lt;br /&gt;
&lt;br /&gt;
Weitere Tests wenn der Fehler nicht behoben ist:&lt;br /&gt;
# Welche Library wird vom System verwendet: &#039;&#039;sudo ldconfig -v | grep libzkgroup.so&#039;&#039; beziehungsweise &#039;&#039;sudo ldconfig -v | grep libsignal_jni.so&#039;&#039; . Da die libraries in .jar files eingebettet sind, darf hier keine gefunden werden.&lt;br /&gt;
# Check gibt es irgendwo noch eine andere lib.so  &amp;lt;code&amp;gt;sudo find / -name libzkgroup.so 2&amp;gt;/dev/null&amp;lt;/code&amp;gt;  Wenn ja, sicherstellen, dass diese nicht genommen wird (löschen, umbenennen)&lt;br /&gt;
# Check gibt es noch irgendwo ein anderes jar  &amp;lt;code&amp;gt;sudo find / -name zkgroup-java-*.jar 2&amp;gt;/dev/null&amp;lt;/code&amp;gt;  Wenn ja, sicherstellen, dass diese nicht genommen wird (löschen, umbenennen)&lt;br /&gt;
# (für den zweiten Fehler, die Schritte 2 und 3 mit libsignal_jni.so bzw. signal-client-java-*.jar durchführen&lt;br /&gt;
|-&lt;br /&gt;
|Ich kann an Einzelempfänger senden und empfangen, aber nicht an Gruppen versenden&lt;br /&gt;
|Du hast wahrscheinlich den vorhergehenden Fehler (libzkgroup) irgendwo, aber er ist dir nicht aufgefallen. Vorgehensweise wie oben.&lt;br /&gt;
|-&lt;br /&gt;
|Ich kann keiner Gruppe beitreten und/oder nichts an eine Gruppe schicken.&lt;br /&gt;
oder&lt;br /&gt;
&lt;br /&gt;
Error in invite:org.asamk.Signal.Error.Failure: Cannot join a V2 group as self does not have a versioned profile&lt;br /&gt;
|Die neuen V2 Gruppen benötigen zwingend einen Profil Namen. Sofern also nach der Registrierung keiner gesetzt wurde, kann man keine Gruppen verwenden.&lt;br /&gt;
Abhilfe:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;sudo -E ./signal_install.sh name&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
um einen Namen (und optional ein Avatarbild) festzulegen.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Links ====&lt;br /&gt;
* Thread {{Link2Forum|Topic=118370|LinkText=Neues Modul: Signalbot}}&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Messenger]]&lt;/div&gt;</summary>
		<author><name>Weini</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=Signalbot&amp;diff=35162</id>
		<title>Signalbot</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=Signalbot&amp;diff=35162"/>
		<updated>2021-03-07T11:12:02Z</updated>

		<summary type="html">&lt;p&gt;Weini: Erweiterung via notify für Favoriten (Teil 2)&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 Messenger Signal&lt;br /&gt;
|ModType=x&lt;br /&gt;
|ModForumArea=Codeschnipsel&lt;br /&gt;
|ModFTopic=118370&lt;br /&gt;
|ModTechName=50_Signalbot.pm&lt;br /&gt;
|ModOwner=Adimarantis ({{Link2FU|39402|Forum}}/[[Benutzer Diskussion:Adimarantis‎|Wiki]])}}&lt;br /&gt;
Das Modul [[Signalbot]] ermöglicht den Versand von Nachrichten über den Instant-Messaging-Dienst [https://signal.org Signal] aus FHEM heraus.&lt;br /&gt;
&lt;br /&gt;
== Beschreibung ==&lt;br /&gt;
Beschreibung in Kurzform:&lt;br /&gt;
&lt;br /&gt;
Signalbot stellt eine Schnittstelle von FHEM zum Signal Messenger unter Linux zur Verfügung. Dazu wird das Tool [https://github.com/AsamK/signal-cli signal-cli] im DBus-Daemon Modus verwendet, welches dann letztendlich mit Signal kommuniziert.&lt;br /&gt;
&lt;br /&gt;
Da sich signal-cli noch in der Entwicklung befindet (aktuelle Version 0.7.4) steht leider noch nicht die volle Funktionalität über DBus zur Verfügung, wodurch sich auch Einschränkungen für FHEM ergeben.&lt;br /&gt;
&lt;br /&gt;
Aktuell unterstütze Funktionen aus FHEM:&lt;br /&gt;
* Senden und Empfangen von Nachrichten an Gruppen oder Einzelempfänger&lt;br /&gt;
* Versenden von einem oder mehreren Attachments (Bilder)&lt;br /&gt;
* Einlesen, Speichern und Übersetzen von Gruppennamen (statt base64 Strings)&lt;br /&gt;
* Setzen, Empfangen und Übersetzen von Kontaktnamen (statt Telefonnummern)&lt;br /&gt;
* Einschränken von Gruppen oder Kontakten auf die FHEM reagieren soll&lt;br /&gt;
* Direkte Verknüpfung mit dem [[Modul Babble|Babble]] Modul zur Interpretation von Befehlen&lt;br /&gt;
Die Installation von signal-cli ist aktuell je nach Linux Kenntnissen durchaus anspruchsvoll. Daher gibt es ein Installationsscript welches aktuell für aktuelle Ubuntu und Raspian Distributionen getestet ist (höchstwahrscheinlich aber auch für andere Debian basierte Distributionen funktioniert)&lt;br /&gt;
&lt;br /&gt;
Signalbot ist weitgehend kompatibel mit SiSi, verfolgt aber technisch ein paar andere Ansätze und stellt zusätzliche Funktionalitäten zur Verfügung:&lt;br /&gt;
* Signalbot erzeugt keinen eigenen Prozess sondern integriert sich voll in die laufende FHEM Instanz (ist dadurch hoffentlich stabiler und verbraucht auch weniger Speicher)&lt;br /&gt;
* Gruppen werden grundsätzlich mit ihren Klarnamen verwendet und können auch nur mit einem vorangestellten &amp;quot;#&amp;quot; (statt &amp;quot;@#&amp;quot;) gekennzeichnet werden.&lt;br /&gt;
* Kontakte werden soweit möglich auch mit Klarnamen (statt +49....) unterstützt. Diese kommen aus dem internen Adressbuch und können über &amp;quot;setContact&amp;quot; definiert werden, bzw. kommen bei verlinkten Accounts aus dem Adressbuch des Hauptgeräts. Sie können aktuell leider nur über empfangene Nachrichten entschlüsselt werden, da signal-cli die entsprechende Schnittstelle (noch) nicht zur Verfügung stellt. Signalbot lernt diese aber mit der Zeit und kann sie bei Bedarf auch so abspeichern, dass sie auch nach einem FHEM Neustart wieder verfügbar sind&lt;br /&gt;
* Die Möglichkeit von Telegrambot in den &amp;quot;send&amp;quot; Befehl eingebetteten Code auszuführen und damit z.B. einen SVG Plot zu erstellen und mit zu verschicken ist verfügbar. Dazu muss der Befehl in runde Klammern eingebettet werden (Beispiele folgen unten).&lt;br /&gt;
* Wurde mit und für die aktuelle Version 0.7.4 von signal-cli entwickelt, die auch die neuen &amp;quot;V2&amp;quot; Gruppen unterstützt, ebenso wird die neuste Version (1.2.0) vom Perl Modul Net::DBus benötigt&lt;br /&gt;
* Wird aktiv(Feb 2021) gewartet (letztes Update für SiSi auf github ist von August 2018)&lt;br /&gt;
&lt;br /&gt;
=== Funktionen im Detail ===&lt;br /&gt;
&lt;br /&gt;
==== send [@&amp;lt;Recipient1&amp;gt; ... @&amp;lt;RecipientN&amp;gt;] [#&amp;lt;Group1&amp;gt; ... #&amp;lt;GroupN&amp;gt;] [&amp;amp;&amp;lt;Attachment1&amp;gt;; ... &amp;amp;&amp;lt;AttachmentN&amp;gt;] [&amp;lt;Text&amp;gt;] ====&lt;br /&gt;
* &#039;&#039;&#039;Recipient:&#039;&#039;&#039; Nummer mit Ländervorwahl (+49....) oder Kontaktname aus dem internen Adressbuch&lt;br /&gt;
* &#039;&#039;&#039;Group:&#039;&#039;&#039; Gruppenname, wie in Signal definiert im Klartext&lt;br /&gt;
* &#039;&#039;&#039;Attachment&#039;&#039;&#039;: Dateiname (Pfad für muss für fhem lesbar und absolut oder relativ zum fhem home sein) oder Stream einer Bilddatei (z.B.)SVG&lt;br /&gt;
* &#039;&#039;&#039;Text:&#039;&#039;&#039; Die eigentlich Textnachricht, kann Leerzeichen und Umbrüche (mit &amp;quot;\n&amp;quot; oder \0x0a) enthalten&lt;br /&gt;
* Sofern ein Recipient, Group oder Attachment Leerzeichen enthält, den ganzen Teilstring in Anführungszeichen setzen: z.B. &amp;quot;@Max Mustermann&amp;quot;&lt;br /&gt;
* Wenn ein FHEM Befehl ausgeführt werden soll, dann diesen in runde Klammern setzen z.B. &amp;amp;({plotAsPng(&#039;SVG_Aussentemperatur&#039;)})&lt;br /&gt;
&lt;br /&gt;
Ein paar Beispiele &lt;br /&gt;
  send @+498514711 Hallo Signal&lt;br /&gt;
  send #FHEM &amp;amp;/tmp/foto.jpg Ein Bild schicken&lt;br /&gt;
  send &amp;quot;@Mein Freund&amp;quot; Leerzeichen durch Anführungszeichen um den ganzen Teilbefehl&lt;br /&gt;
  send @Joerg #FHEM #Familie Jeder Empfänger, jede Gruppe und Attachments können mehrfach vorkommen&lt;br /&gt;
  send &amp;quot;@({my $var=\&amp;quot;Joerg\&amp;quot;;; return $var;;})&amp;quot; Perl Code mit Leerzeichen ausführen&lt;br /&gt;
  send @(define dummy1 dummy) FHEM Befehl ausführen, wird aber nicht gesendet, da kein gültiger Empfänger zurück geliefert wird&lt;br /&gt;
  send @Joerg &amp;amp;({plotAsPng(\&#039;SVG_Aussentemperatur\&#039;)}) Einen FHEM SVG Plot verschicken oder&lt;br /&gt;
  send @Joerg &amp;quot;&amp;amp;({plotAsPng(&#039;SVG_Aussentemperatur&#039;)})&amp;quot; Einen FHEM SVG Plot verschicken&lt;br /&gt;
  send @Joerg Mehrzeilige Ausgabe:\nNeue Zeile&lt;br /&gt;
  send @Joerg Umlaute öäü und Emojis 🙃😆🤗🤑🤪 sowie 𝐅𝐨𝐫𝐦𝐚𝐭𝐢𝐞𝐫𝐮𝐧𝐠𝐞𝐧 direkt senden &lt;br /&gt;
  send @Joerg Die Aussentemperatur ist [out_temp:temperature] Grad&lt;br /&gt;
&#039;&#039;&#039;Tipp zu den Formatierungen&#039;&#039;&#039;: Auf z.B. https://yaytext.com/ kann man sich seine UTF8 Kodierungen erstellen und nach FHEM per copy&amp;amp;paste einfügen. Vorrausetzung dürfte sein, dass die &amp;quot;locale&amp;quot; des Systems auf UTF8 eingestellt ist&lt;br /&gt;
&lt;br /&gt;
==== refreshGroups ====&lt;br /&gt;
Fragt die List der aktuellen Gruppen ab, denen der verknüpfte Account beigetreten ist. Die Liste wird im u.a. Reading &#039;&#039;&#039;joinedGroups&#039;&#039;&#039; sichtbar gemacht.  &lt;br /&gt;
&lt;br /&gt;
==== setContact &amp;lt;Number&amp;gt; &amp;lt;Contactname&amp;gt; ====&lt;br /&gt;
Definiert einen Kontakteintrag im internen Adressbuch. Es kann beim &#039;&#039;&#039;send&#039;&#039;&#039; Befehl dann der &#039;&#039;ContactName&#039;&#039; statt der Nummer verwendet werden.&lt;br /&gt;
&lt;br /&gt;
==== saveContacts ====&lt;br /&gt;
Speichert die interne Kontaktliste in das Reading &#039;&#039;&#039;contactList&#039;&#039;&#039; welches beim Speichern der FHEM Config in &#039;&#039;fhem.save&#039;&#039; abgelegt wird und nach einem Neustart wieder zur Verfügung steht (zur Diskussion: immer automatisch so machen wenn neue Kontakte festgelegt werden?)&lt;br /&gt;
&lt;br /&gt;
==== reinit ====&lt;br /&gt;
Verbindung zum DBus wiederherstellen. Dies sollte nicht nötig sein, außer der signal-cli Service funktionierte nicht richtig und wurde korrigiert. Ich rate hier aber eher zu einem FHEM Neustart.&lt;br /&gt;
&lt;br /&gt;
==== createGroup &amp;lt;Groupname&amp;gt; [&amp;amp;&amp;lt;path to picture&amp;gt;] ====&lt;br /&gt;
Erzeugt eine neue Signalgruppe und versieht diese (optional) mit einem Gruppenbild.&lt;br /&gt;
&lt;br /&gt;
==== updateGroup &amp;lt;Groupname&amp;gt; [&amp;lt;new Groupname&amp;gt;] [&amp;amp;&amp;lt;path to picture&amp;gt;] ====&lt;br /&gt;
Aktualisiert den Namen und/oder das Gruppenbild einer Gruppe.&lt;br /&gt;
&lt;br /&gt;
==== invite &amp;lt;Groupname&amp;gt; &amp;lt;Contact1&amp;gt; [&amp;lt;Contact2&amp;gt;...] ====&lt;br /&gt;
Lädt einen oder mehrere Kontakte (per Namen oder Nummer) in eine bestehende Gruppe ein.&lt;br /&gt;
&lt;br /&gt;
==== block #&amp;lt;Groupname&amp;gt;|&amp;lt;Contact&amp;gt; ====&lt;br /&gt;
Blockiert eine Gruppe oder einen Kontakt (per Namen oder Nummer) serverseitig. Signalbot bekommt dann keine Nachrichten dieser Absender mehr (im Gegensatz zu &#039;&#039;allowedPeer&#039;&#039; bei der FHEM die Nachrichten noch bekommt, diese aber ignoriert.)&lt;br /&gt;
&lt;br /&gt;
==== unblock #&amp;lt;Groupname&amp;gt;|&amp;lt;Contact&amp;gt; ====&lt;br /&gt;
Hebt die Blockierung wieder auf.&lt;br /&gt;
&lt;br /&gt;
=== Attribute im Detail ===&lt;br /&gt;
&lt;br /&gt;
==== defaultPeer ====&lt;br /&gt;
Gruppe, Kontaktname oder Nummer an die &#039;&#039;&#039;send&#039;&#039;&#039; eine Nachricht schicken soll, wenn kein Empfänger mit @ oder # definiert wurde.&lt;br /&gt;
&lt;br /&gt;
==== allowedPeer ====&lt;br /&gt;
Komma getrennte Liste von Gruppen, Kontaktnamen oder Nummern auf die Signalbot reagieren soll (also bei empfangenen Nachrichten Readings aktualisiert). Ist dieses Attribut nicht gesetzt, reagiert Signalbot auf alle Nachrichten.&lt;br /&gt;
&lt;br /&gt;
==== babblePeer ====&lt;br /&gt;
Komma getrennte Liste von Gruppen, Kontaktnamen oder Nummern auf die Signalbot reagieren soll indem es die Nachricht an das über &#039;&#039;&#039;babbleDev&#039;&#039;&#039; (nicht zu verwechseln mit &#039;&#039;babbleDevice&#039;&#039;) definierte [[Modul Babble|Babble]] Modul schickt. Die Nachrichten werden zuerst (beschränkt auf allowedPeer) normal verarbeitet (also Readings aktualisiert) und nur nach Babble gesendet wenn diese Attribut gesetzt ist.&lt;br /&gt;
&lt;br /&gt;
Der Absender der Nachricht (Gruppe hat Prio über individuellem Absender) wird Babble als &#039;&#039;$PARM0&#039;&#039; übergeben. Dazu in Babble noch das Attribut helpFunc wie folgt setzen&lt;br /&gt;
 {fhem(&amp;quot;set SignalBot send \@$PARM0 $HELP&amp;quot;)}&lt;br /&gt;
Sollen die rivescript Spracherweiterungen genutzt werden muss außerdem &amp;quot;noChatbot&amp;quot; auf 0 stehen.&lt;br /&gt;
&lt;br /&gt;
Nach dem selben Prinzip können in der Babble Definition auch Antworten spezfisch für Devices angelegt werden, z.B. als Aktion für out-temp -&amp;gt; Temperatur -&amp;gt; draußen -&amp;gt; sagen -&amp;gt; Status:&lt;br /&gt;
 set SignalBot send @$PARM0 Die Temperatur draußen ist [out_temp:temperature] Grad&lt;br /&gt;
Womit die Frage (ohne Fragezeichen!) &amp;quot;Wie ist die Temperatur draußen&amp;quot; entsprechend quittiert wird.&lt;br /&gt;
&lt;br /&gt;
==== babbleDev ====&lt;br /&gt;
Name des definierten Babble Device.Wird beim Setzen vom babblePeer automatisch mit der ersten &amp;quot;Babble&amp;quot; Device gefüllt sofern vorhanden.&lt;br /&gt;
&lt;br /&gt;
==== babbleExclude ====&lt;br /&gt;
Regulärer Ausdruck auf den Nachrichtentext um bestimmte Nachrichten von der Weiterleitung zu Babble auszuschließen (ein Event wird trotzdem generiert und kann mit Notify, DOIF etc. verarbeitet werden).&lt;br /&gt;
&lt;br /&gt;
=== Readings im Detail ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|contactList&lt;br /&gt;
|Liste der gespeicherten Kontakt im Format &#039;&#039;Nummer1=Kontakt1,Nummer2=Kontakt2,...&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|joinedGroups&lt;br /&gt;
|Liste der beigetretenen Gruppen getrennt mit Leerzeichen&lt;br /&gt;
|-&lt;br /&gt;
|msgAttachment&lt;br /&gt;
|Attachments (Dateinamen im signal-cli repository) der zuletzt empfangenen Attachments&lt;br /&gt;
|-&lt;br /&gt;
|msgGroupName&lt;br /&gt;
|Gruppenname aus der zuletzt eine Nachricht empfangen wurde - leer wenn es eine persönlich Nachricht war&lt;br /&gt;
|-&lt;br /&gt;
|msgSender&lt;br /&gt;
|Absender der letzten Nachricht als Nummer oder wenn bekannt als Name&lt;br /&gt;
|-&lt;br /&gt;
|msgText&lt;br /&gt;
|Empfangenen Nachricht&lt;br /&gt;
|-&lt;br /&gt;
|msgTimestamp&lt;br /&gt;
|Zeitstempel der Nachricht&lt;br /&gt;
|-&lt;br /&gt;
|prevMsgAttachment&lt;br /&gt;
| rowspan=&amp;quot;5&amp;quot; |Wie oben, nur enthalten diese Readings die Daten der zuvor empfangenen Nachricht (n-1)&lt;br /&gt;
|-&lt;br /&gt;
|prevMsgGroupName&lt;br /&gt;
|-&lt;br /&gt;
|prevMsgSender&lt;br /&gt;
|-&lt;br /&gt;
|prevMsgText&lt;br /&gt;
|-&lt;br /&gt;
|prevMsgTimestamp&lt;br /&gt;
|-&lt;br /&gt;
|sentMsg&lt;br /&gt;
|Zuletzt gesendete Nachricht&lt;br /&gt;
|-&lt;br /&gt;
|sentMsgRecipient&lt;br /&gt;
|Empfänger der zuletzt gesendeten Nachricht. Enthält zumeist den Namen aus der Empfangsbestätigung und somit bei vielen Empfängern den zuletzt bestätigten Empfang.&lt;br /&gt;
&lt;br /&gt;
Dies muss nicht zwingend auf die zuletzt gesendete Nachricht (sendMsg) passen, wenn mehrere Nachrichten versendet wurden.&lt;br /&gt;
|-&lt;br /&gt;
|sentMsgTimestamp&lt;br /&gt;
|Zeitstempel des Empfangs oder &amp;quot;pending&amp;quot; wenn noch keine Bestätigung vorliegt&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Installation ==&lt;br /&gt;
Zur Installation steht das Script &amp;quot;signal_install.sh&amp;quot; zur Verfügung. Dieses befindet sich noch in der Entwicklung und funktioniert nicht zwangsweise in jeder Umgebung. Daher erst einmal ein paar Referenzen zur manuellen Installation von signal-cli:&lt;br /&gt;
* Die Wikiseite des Vorgängermoduls [[SiSi]] welches grundsätzlich die selben Anforderungen hat&lt;br /&gt;
* Quickstart (englisch) für [https://github.com/AsamK/signal-cli/wiki/Quickstart signal-cli]&lt;br /&gt;
* Anleitung zum [https://github.com/AsamK/signal-cli/wiki/Linking-other-devices-%28Provisioning%29 &amp;quot;linken&amp;quot; einer Nummer] mit signal-cli&lt;br /&gt;
* Anleitung zum [https://github.com/AsamK/signal-cli/wiki/Provide-native-lib-for-libsignal#libsignal-client Übersetzen und Installieren der Libraries] für armv7 (Raspberry) da die Distribution nur x86 libraries enthält&lt;br /&gt;
* CPAN Seite des Perl Moduls zur [https://metacpan.org/release/Net-DBus DBus Kommunikation]&lt;br /&gt;
Das Modul und Install Script wird aktuell nicht über &amp;quot;fhem [[update]]&amp;quot; verbreitet und muss vom ersten Post dieses {{Link2Forum|Topic=118370|LinkText=Forenthemas}} geholt werden.&lt;br /&gt;
&lt;br /&gt;
Vorbereitung:&lt;br /&gt;
&lt;br /&gt;
Modul 50_Signalbot.pm wie üblich ins Verzeichnis &amp;quot;FHEM&amp;quot; der FHEM Installation kopieren.&lt;br /&gt;
&lt;br /&gt;
Das Script &amp;quot;signal_install.sh&amp;quot; ins home Verzeichnis eines beliebigen &amp;quot;sudo&amp;quot;-fähigen Users kopieren.&lt;br /&gt;
&lt;br /&gt;
Am Anfang des Moduls sind einige Informationen und Pfade definiert. Mindestvorrausetzung ist eine Telefonnummer. Es kann eine Festnetznummer oder Mobilfunknummer verwendet werden. Wird Signal schon am Handy benutzt lässt sich die Nummer verknüpfen, was aber den unangenehmen Nebeneffekt hat, dass man dort alle FHEM Nachrichten mitbekommt.&lt;br /&gt;
&lt;br /&gt;
Kontrolliert also bitte vor dem Start des Scripts diese Angaben. Außer bei &#039;&#039;PHONE=+49xxxxx&#039;&#039; sollte aber üblicherweise keine Änderung nötig sein. Wird das sudo mit &#039;&#039;-E&#039;&#039; ausgeführt, so bewirkt das die Übernahme der Environment Variablen. Wenn mit &#039;&#039;export PHONE=+49xxxx&#039;&#039; die Telefonnummer z.B. bereits im &#039;&#039;.bash_profile&#039;&#039; gesetzt wurde, muss das Script nicht mehr editiert werden.&lt;br /&gt;
&lt;br /&gt;
Das Script hat mehrere Optionen um Teilfunktionen direkt auszuführen, diese sind:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+&lt;br /&gt;
!Argument&lt;br /&gt;
!Bedeutung&lt;br /&gt;
|-&lt;br /&gt;
|system&lt;br /&gt;
|System für die signal-cli Installation vorbereiten. Es werden per &amp;quot;apt install&amp;quot; fehlende Pakete installiert und Verzeichnisse erstellt. &lt;br /&gt;
Muss mindestens einmal erfolgreich gelaufen sein, damit die restliche Installation funktioniert&lt;br /&gt;
|-&lt;br /&gt;
|install&lt;br /&gt;
|Installiert signal-cli als System Service. Automatischer Download, Installation und Konfiguration (dbus, systemd)&lt;br /&gt;
|-&lt;br /&gt;
|register&lt;br /&gt;
|Registriert die definierte Telefonnummer bei Signal. Dieser Prozess hat seine Tücken  und wird unten nochmal eingehend beschrieben&lt;br /&gt;
|-&lt;br /&gt;
|link&lt;br /&gt;
|Verknüpfen einer bestehenden Telefonnummer. Dazu muss in Signal über Settings -&amp;gt; Linked Devices -&amp;gt; &amp;quot;plus&amp;quot; ein QR Code abfotografiert werden. &lt;br /&gt;
Dieser wird von dieser Routine als Datei in /tmp/qrcode.png abgelegt. D.h. vorher sicherstellen, dass man mit einem Bildbetrachter an diese Datei kommt&lt;br /&gt;
|-&lt;br /&gt;
|test&lt;br /&gt;
|Versendet eine Testnachricht auf zwei Arten - direkt mit dem Client (klappt das, ist die Grundregistrierung schon mal erfolgreich) und über Dbus (dann ist auch der System Service korrekt eingerichtet)&lt;br /&gt;
|-&lt;br /&gt;
|remove&lt;br /&gt;
|Löscht alle durch &amp;quot;install&amp;quot; installierten Verzeichnisse und Dateien (aber nicht die Pakete die durch &amp;quot;system&amp;quot; installiert wurden)&lt;br /&gt;
|-&lt;br /&gt;
|join&lt;br /&gt;
|Ermöglicht einer Gruppe mithilfe eines Einladungslinks beizutreten&lt;br /&gt;
|-&lt;br /&gt;
|name&lt;br /&gt;
|Definieren des eigenen Namens und Avatar Bildes&lt;br /&gt;
|-&lt;br /&gt;
|start&lt;br /&gt;
|Starten des singal service über systemd bzw. im Container des Dbus daemon and signal-cli Daemon&lt;br /&gt;
|}&lt;br /&gt;
Das Script muss unter root Rechten, also mit&lt;br /&gt;
 sudo -E ./signal_install.sh&lt;br /&gt;
aufgerufen werden. Wenn kein Argument übergeben wird, dann wird automatisch der Ablauf &#039;&#039;system -&amp;gt; install -&amp;gt; register/link -&amp;gt; test&#039;&#039; durchlaufen.&lt;br /&gt;
&lt;br /&gt;
Das Script fragt üblicherweise nach wenn es etwas tut und führt nur notwendige Aktionen durch (kann also bei teilweisen Fehlern problemlos erneut durchlaufen werden).&lt;br /&gt;
&lt;br /&gt;
Es prüft außerdem ab ob es im Container läuft (hier erfolgt ein etwas anderer Ablauf - mehr dazu unten) und prüft auf Betriebssystem und CPU Architektur. Gegebenenfalls bricht es ab, wenn es sich um keine unterstützte Kombination handelt.&lt;br /&gt;
&lt;br /&gt;
Bitte genau auf die Bildschirmausgaben und Fragen achten. Fehlermeldungen im Thread melden damit das Script weiter verbessert werden kann.&lt;br /&gt;
&lt;br /&gt;
=== Registrierung ===&lt;br /&gt;
&#039;&#039;&#039;Hinweis:&#039;&#039;&#039; Es kann nur &#039;&#039;&#039;eine&#039;&#039;&#039; Nummer registriert sein. Eine bereits bestehende Registrierung (Smartphone) wird dabei &#039;&#039;&#039;aufgehoben&#039;&#039;&#039;. Daher entweder eine Festnetznummer verwenden oder das Script hier abbrechen und mit der Option &amp;quot;link&amp;quot; neu starten, dann wird FHEM als Zweitbenutzer zu einer bestehenden Nummer hinzugefügt.&lt;br /&gt;
&lt;br /&gt;
Wenn die Systeminstallation erfolgreich abgeschlossen ist, folgt die Registrierung der Nummer. Hier gibt es zwei Optionen:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;SMS&#039;&#039;&#039; oder &#039;&#039;&#039;Voice&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Je nachdem wird ein 6-stelliger Aktivierungscode per SMS geschickt oder über einen Telefonanruf (sogar auf Deutsch) diktiert.&lt;br /&gt;
&lt;br /&gt;
==== Captcha ====&lt;br /&gt;
Signal versucht sich gegen unberechtigte Nutzung des Service (man könnte ja damit quasi SMS/Telefonterror betreiben) zu schützen. Nach gewissen Kriterien (soweit bekannt z.B. Registrierung aus einer VM oder über VPN) wird daher ein Captcha verlangt.&lt;br /&gt;
&lt;br /&gt;
Nur wie funktioniert sowas in der Kommandozeile?&lt;br /&gt;
&lt;br /&gt;
Das Script erkennt diese Abfrage und fragt nach einem Captcha Code. Diesen erlangt man wie folgt:&lt;br /&gt;
[[Datei:Signalbot Captcha Chrome.png|mini|Captcha in Chrome]]&lt;br /&gt;
# [https://signalcaptchas.org/registration/generate.html Captcha Seite] von Signal aufrufen. Dabei ist es wahrscheinlich unerheblich von wo (hab es erfolgreich aus meinem Windows Host gemacht und in meinen Linux VM Guest eingetragen) - schätzungsweise ist es einfach zeitlich begrenzt gültig.&lt;br /&gt;
# Im Developermode (F12) und nach erfolgreichem Lösen des Captchas (wenn der Bildschirm leer bleibt, ist es auch erfolgreich gelöst) macht der Browser ein redirect auf signalcaptcha://. Das versteht der Browser aber nicht und macht gar nichts.&lt;br /&gt;
# Der String steht aber bei Firefox in der Console (recht einfach zu finden), beim Chrome muss man auf Network gehen, mit Ctrl+R refreshen und dann in der Spalte &amp;quot;Name&amp;quot; nach einem kryptischen String suchen. Dass dieser mit signalcaptcha anfängt, sieht man erst im Tooltipp, da der Anfang abgeschnitten wird.&lt;br /&gt;
# Diesen String (ohne signalcaptcha://) dann in die Eingabezeile des Scripts einfügen und Return drücken. Jetzt sollte die Registrierung erfolgreich abschließen.&lt;br /&gt;
Anbei Screenshots von Firefox und Chrome zum besseren Verständnis.&lt;br /&gt;
[[Datei:Signalbot Captch Firefox.png|mini|Captcha im Firefox]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Unterstützung gesucht:&#039;&#039;&#039; Das Holen des Captchas ist ziemlich umständlich. Suche jemanden der sich mit z.B. mit der Erstellung von Protokoll plugins in Chrome (Abfangen von signalcaptcha:// und Darstellen des Texts in einem Fenster - evtl. mit &amp;quot;Copy&amp;quot; Button) auskennt - oder vielleicht geht sowas ja auch als FHEM Modul?&lt;br /&gt;
&lt;br /&gt;
=== Bestehende Nummer verlinken ===&lt;br /&gt;
Alternativ kann man auch eine bestehende Nummer verlinken. Dazu statt der Registrierung die Option &amp;quot;l&amp;quot; (link) wählen.&lt;br /&gt;
&lt;br /&gt;
Besonders komfortabel geht das, wenn das Script im Terminalfenster einer graphischen Benutzeroberfläche gestartet wird. Hierzu gegebenfalls im Script den Einstellung&amp;lt;blockquote&amp;gt;VIEWER=eog&amp;lt;/blockquote&amp;gt;auf einen installierten jpg/png Bildbetrachter anpassen. Wird Ubuntu mit Gnome verwendet kann die Voreinstellung (eog = Eye of Gnome) beibehalten werden. Es wird jetzt automatisch der QR-Code auf dem Bildschirm angezeigt. In der Signal App dann auf Settings-&amp;gt;Linked Devices gehen und mit &amp;quot;+&amp;quot; den QR-Code abfotografieren.&lt;br /&gt;
&lt;br /&gt;
Bitte beachten, dass bei verlinkten Devices immer alle Devices (also auch das Smartphone) Nachrichten bekommen. Bei reinem Sendebetrieb dürfte das weniger stören, soll aber auch auf Befehle reagiert werden, dann ist das eventuell verwirrend.&lt;br /&gt;
&lt;br /&gt;
== Einrichtung des Moduls ==&lt;br /&gt;
Siehe Forenthema {{Link2Forum|Topic=118370|LinkText=Neues Modul: Signalbot}}.&lt;br /&gt;
&lt;br /&gt;
Nachdem alles sauber eingerichtet ist und das Modul im FHEM Directory abgelegt wurde, entweder ein &amp;quot;reload 50_Signalbot&amp;quot; oder besser ein &amp;quot;shutdown restart&amp;quot; von FHEM machen.&lt;br /&gt;
&lt;br /&gt;
Das Modul dann einfach mit&lt;br /&gt;
 define &amp;lt;name&amp;gt; Signalbot&lt;br /&gt;
definiert.&lt;br /&gt;
&lt;br /&gt;
Weitere Attribute sind optional (siehe oben)&lt;br /&gt;
&lt;br /&gt;
== Umstieg von SiSi ==&lt;br /&gt;
Alle die bereits SiSi verwenden können Signalbot erstmal gefahrlos parallel installieren. Einfach Modul ins FHEM Verzeichnis, reload / restart und &amp;quot;define&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Vorher aber zumindest Net::DBus auf V1.2.0 updaten&lt;br /&gt;
 cpan install -f Net::DBus &lt;br /&gt;
Probleme durch eine veraltete &#039;&#039;&#039;signal-cli&#039;&#039;&#039; Version sind aber nicht ausgeschlossen. Daher keine Support Anfrage ohne vollständigen Umstieg.&lt;br /&gt;
&lt;br /&gt;
Wer komplett umsteigen möchte, kann dies dann mit dem Installer Script tun. Gegebenenfalls Pfade im Script anpassen. Eine bestehende Registrierung wird dann übernommen und muss nicht erneut erfolgen (keine Garantie, dass dies für sehr alte &#039;&#039;&#039;signal-cli&#039;&#039;&#039; Versionen funktioniert). Wer&#039;s ganz sauber haben will, löscht aber alte Installationsreste.&lt;br /&gt;
&lt;br /&gt;
Sofern nach dem SiSi Wiki vorgegangen wurde, dann sind folgende Anpassungen im Script notwendig:&lt;br /&gt;
 PHONE=+49&amp;lt;eure nummer&amp;gt;&lt;br /&gt;
 SIGNALPATH=/opt/fhem&lt;br /&gt;
 SIGNALUSER=fhem&lt;br /&gt;
 SIGNALVAR=/opt/fhem/.local/share&lt;br /&gt;
Das Verzeichnis /opt/fhem/signal-cli kann gelöscht werden.&lt;br /&gt;
&lt;br /&gt;
Wenn mein Installationsschema übernommen werden soll, dann&lt;br /&gt;
 sudo mv /opt/fhem/.local/share/signal-cli /var/lib&lt;br /&gt;
&lt;br /&gt;
Jetzt kann das Script (PHONE setzen nicht vergessen) einfach wie oben beschrieben gestartet werden.&lt;br /&gt;
&lt;br /&gt;
=== Umzug auf ein neues System ===&lt;br /&gt;
Dazu einfach das Script mit dem Argument &amp;quot;remove&amp;quot; starten. Die alte Konfiguration wird dabei im Home Verzeichnis des aktuellen Benutzers als &#039;&#039;~/signalconf.tar.gz&#039;&#039; gesichert.&lt;br /&gt;
&lt;br /&gt;
auf dem neuen System dann&lt;br /&gt;
 cd /&lt;br /&gt;
 sudo tar xvf &#039;&#039;signalconf.tar.gz&#039;&#039;&lt;br /&gt;
Dann wie üblich das Install Script ausführen.&lt;br /&gt;
&lt;br /&gt;
== Installation im Docker Container ==&lt;br /&gt;
Das Install Script kann auch in einem FHEM Container ausgeführt werden. Diese Funktion ist noch in der Entwicklungsphase (siehe Foren Thread).&lt;br /&gt;
&lt;br /&gt;
Dazu eine interaktive root Shell öffnen und das Script in den Container kopieren (z.B. mit scp).&lt;br /&gt;
&lt;br /&gt;
Dann wie oben beschrieben das Script als root starten.&lt;br /&gt;
&lt;br /&gt;
Im Container wird die Installation des systemd Service ausgelassen und am Anfang ein zusätzliches apt-get update/upgrade ausgeführt (was insbesondere bei einem neuen Container notwendig sein kann).&lt;br /&gt;
&lt;br /&gt;
Sowohl der Dbus daemon und der signal-cli daemon werden vom Script am Ende im Hintergrund gestartet. Dabei wird insbesondere gewartet bis der signal-cli Prozess läuft bevor die Tests durchlaufen werden (das hat in meiner VM durchaus schon mal eine Minute gedauert).&lt;br /&gt;
&lt;br /&gt;
Um Sicherzustellen, dass die beiden Daemons laufen, sollte in den Container Startup ein Aufruf des Scripts mit dem Argument &amp;quot;start&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Dies prüft ob die Daemons laufen und startet die ggf. nach.&lt;br /&gt;
&lt;br /&gt;
Hier noch mein verwendetes docker-compose.yml&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Perl&amp;quot;&amp;gt;&lt;br /&gt;
version: &#039;2&#039;&lt;br /&gt;
&lt;br /&gt;
services:&lt;br /&gt;
    fhem:&lt;br /&gt;
        build: .&lt;br /&gt;
        restart: always&lt;br /&gt;
        stdin_open: true&lt;br /&gt;
        tty: true&lt;br /&gt;
        ports:&lt;br /&gt;
            - &amp;quot;8083:8083&amp;quot;&lt;br /&gt;
            - &amp;quot;7072:7072&amp;quot;&lt;br /&gt;
        volumes:&lt;br /&gt;
            - ./fhem/core/:/opt/fhem/&lt;br /&gt;
        networks:&lt;br /&gt;
            - fhem-network&lt;br /&gt;
        #devices:&lt;br /&gt;
        #    - &amp;quot;/dev/ttyUSB0:/dev/ttyUSB0&amp;quot;&lt;br /&gt;
        environment:&lt;br /&gt;
            FHEM_UID: 1000&lt;br /&gt;
            FHEM_GID: 1000&lt;br /&gt;
            TIMEOUT: 10&lt;br /&gt;
            RESTART: 1&lt;br /&gt;
            TELNETPORT: 7072&lt;br /&gt;
            TZ: Europe/Berlin&lt;br /&gt;
&lt;br /&gt;
networks:&lt;br /&gt;
    fhem-network:&lt;br /&gt;
        driver: bridge&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Und mein Dockerfile&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Perl&amp;quot;&amp;gt;&lt;br /&gt;
ARG BASE_IMAGE=&amp;quot;fhem/fhem&amp;quot;&lt;br /&gt;
ARG BASE_IMAGE_TAG=&amp;quot;latest&amp;quot;&lt;br /&gt;
FROM ${BASE_IMAGE}:${BASE_IMAGE_TAG}&lt;br /&gt;
&lt;br /&gt;
ARG L_SIGNAL_CLI=&amp;quot;0.7.4&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# Install base environment&lt;br /&gt;
&lt;br /&gt;
VOLUME [ &amp;quot;/opt/signal-cli&amp;quot; ]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Im Unterverzeichnis fhem/core liegt das ausgepackte fhem.tar.gz (da kann man auch gleich das Install Script und Signalbot installieren).&lt;br /&gt;
&lt;br /&gt;
Dann mit&lt;br /&gt;
 docker-compose up -d&lt;br /&gt;
 docker exec -ti fhem-docker_fhem_1 /bin/bash&lt;br /&gt;
das Dockerimage erzeugen und root shell starten. Jetzt wird&lt;br /&gt;
 ./signal-install.sh&lt;br /&gt;
ausgeführt.&lt;br /&gt;
&lt;br /&gt;
Dann sollte man zum fhem user wechseln und fhem starten können&lt;br /&gt;
 su - fhem&lt;br /&gt;
 cd /opt/fhem&lt;br /&gt;
 perl fhem.pl fhem.cfg&lt;br /&gt;
Das aber noch ohne Gewähr und nur rudimentär getestet. Verbesserungsvorschläge, insbesondere wie man gleich alles in die Config Files einbaut willkommen.&lt;br /&gt;
&lt;br /&gt;
== Favoriten und erweiterte Command Funktionen mit einem notify ergänzen ==&lt;br /&gt;
Signalbot kann über DOIFs/notifys problemlos um individuelle Funktionen erweitert werden. Der hier beschriebene Ansatz ergänzt eine Favoritenverwaltung und erlaubt die direkt Ausführung von FHEM Befehlen entweder mit oder ohne Authentifizierung via GoogleAuth.&lt;br /&gt;
&lt;br /&gt;
Die Beschreibung hier erfolgt auf Basis von Signalbot Version &amp;quot;Signalbot:2.0.1-beta signal-cli:0.8.1 Protocol::DBus:0.16&amp;quot;. Bei künftigen Versionen können sich ggf. Änderungen ergeben.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Use Case / Szenario&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Das Signalbot Modul bietet über die Defintion von &amp;quot;allowedPeers&amp;quot; und durch die von Signal bereitgestellte Ende-zu-Ende Verschlüsselung bereits ein hohes Maß an Sicherheit. Für einfache Abfragen von Temperatiuren etc. ist das aus Sicht des Autors absolut ausreichend. Diese Abfragen sollten über Favoriten mit möglichst wenig Tipp-Aufwand gesendet werden können.&lt;br /&gt;
&lt;br /&gt;
Für sicherheitskritische / sensible Aktionen ist aber eine zusätzliche Absicherung wünschenswert. Für solche Befehle bietet das Signalbot Modul die Integration von GoogleAuth bereits an.  Auch diese Befehle können über Favoritendefinitionen abgekürzt werden. Das GoogleAuth Token wird dann vorab separt geschickt.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Voraussetzungen&#039;&#039;&#039;&lt;br /&gt;
* Das Signalbot Device wird mit &amp;quot;signalBot&amp;quot; benannt (alternativ muss eben der Code im Notify angepasst werden)&lt;br /&gt;
* Es werden zusätzliche Attribute via &amp;lt;code&amp;gt;userattr&amp;lt;/code&amp;gt; zum Signalbot Device hinzugefügt: cmdKeywordNoAuth cmdPatternNoAuth favPrefix favList &amp;lt;code&amp;gt;attr signalBot userattr cmdKeywordNoAuth cmdPatternNoAuth favPrefix favList&amp;lt;/code&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Der Notify Code&#039;&#039;&#039;&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
signalBot:msgText.* {&lt;br /&gt;
	my $msgText = ReadingsVal(&amp;quot;signalBot&amp;quot;, &amp;quot;msgText&amp;quot;, &amp;quot;&amp;quot;);&lt;br /&gt;
	my $msgAuth = int(ReadingsVal(&amp;quot;signalBot&amp;quot;, &amp;quot;msgAuth&amp;quot;, 0));&lt;br /&gt;
	my $FhemCmd;&lt;br /&gt;
	my $cmdPatternNoAuth = AttrVal(&amp;quot;signalBot&amp;quot;, &amp;quot;cmdPatternNoAuth&amp;quot;, undef);&lt;br /&gt;
	my $favPrefix = AttrVal(&amp;quot;signalBot&amp;quot;, &amp;quot;favPrefix&amp;quot;, undef);&lt;br /&gt;
	my $cmdKeyword = AttrVal(&amp;quot;signalBot&amp;quot;, &amp;quot;cmdKeyword&amp;quot;, undef);&lt;br /&gt;
	my $cmdKeywordNoAuth = AttrVal(&amp;quot;signalBot&amp;quot;, &amp;quot;cmdKeywordNoAuth&amp;quot;, undef);&lt;br /&gt;
	my @favarray;&lt;br /&gt;
	my @patternarray;&lt;br /&gt;
	my $favno;&lt;br /&gt;
	my $favList;&lt;br /&gt;
	my $retval;&lt;br /&gt;
	my $msgSender = ReadingsVal(&amp;quot;signalBot&amp;quot;, &amp;quot;msgSender&amp;quot;, &amp;quot;&amp;quot;);&lt;br /&gt;
	if (substr($msgSender, 0, 1) ne &amp;quot;+&amp;quot;)  { $msgSender = &amp;quot;@&amp;quot; . $msgSender }&lt;br /&gt;
&lt;br /&gt;
    # Sicherheitsprüfung für multi-Command Befehl&lt;br /&gt;
	if (index($msgText, &amp;quot;;&amp;quot;) &amp;gt;= 0)  {&lt;br /&gt;
	   Log3(&amp;quot;ntf_signalBot&amp;quot;, 2, &amp;quot;ntf_signalBot: Semicolon detected, sender may try to send multiple commands in one line. Aborting!&amp;quot;);&lt;br /&gt;
	   fhem(&amp;quot;set signalBot send $msgSender Semicolon detected, command is ignored!&amp;quot;);&lt;br /&gt;
	   return;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	# ggf. Favoriten auflösen&lt;br /&gt;
	if ($favPrefix &amp;amp;&amp;amp; substr($msgText, 0, length($favPrefix)) eq $favPrefix) {&lt;br /&gt;
	   $favno = int(substr($msgText, length($favPrefix)));&lt;br /&gt;
       @favarray = split(&amp;quot;;&amp;quot;, AttrVal(&amp;quot;signalBot&amp;quot;, &amp;quot;favList&amp;quot;, undef));&lt;br /&gt;
	   &lt;br /&gt;
	   if ($favno == 0)  {&lt;br /&gt;
	      # Favoritenliste zurückgeben&lt;br /&gt;
	      Log3(&amp;quot;ntf_signalBot&amp;quot;, 4, &amp;quot;ntf_signalBot: list favorites&amp;quot;);&lt;br /&gt;
		  $favList = &amp;quot;&amp;quot;;&lt;br /&gt;
		  $favno = 1;&lt;br /&gt;
		  foreach my $favLine (@favarray) {&lt;br /&gt;
			 $favLine =~ /^\[(.*)\]/;&lt;br /&gt;
		     $favList .= $favPrefix . $favno . &amp;quot;\t&amp;quot; . $1 . &amp;quot;\n&amp;quot;;&lt;br /&gt;
			 $favno++;&lt;br /&gt;
		  }&lt;br /&gt;
		  fhem(&amp;quot;set signalBot send $msgSender $favList&amp;quot;);&lt;br /&gt;
		  return;&lt;br /&gt;
	   } else {&lt;br /&gt;
	      # favoriten verarbeiten&lt;br /&gt;
	      $FhemCmd = $favarray[$favno-1];&lt;br /&gt;
	      # wenn ein Alias definiert ist, dann den Befehlsteil aus dem Favoriten extrahieren&lt;br /&gt;
	      if (index($FhemCmd, &amp;quot;=&amp;quot;) &amp;gt;= 0) {&lt;br /&gt;
		    $FhemCmd = substr($FhemCmd, index($FhemCmd, &amp;quot;=&amp;quot;)+1);&lt;br /&gt;
	      }&lt;br /&gt;
	      Log3(&amp;quot;ntf_signalBot&amp;quot;,3,&amp;quot;ntf_signalBot: FhemCmd after favorite substitution: $FhemCmd&amp;quot;);&lt;br /&gt;
	   }&lt;br /&gt;
&lt;br /&gt;
	   # prüfe auf authorsiertes Command (nur wenn Favoriten expandiert wurden, um doppelte Ausführung zu vermeiden&lt;br /&gt;
	   if ($cmdKeyword &amp;amp;&amp;amp; substr($FhemCmd, 0, length($cmdKeyword)) eq $cmdKeyword)  {&lt;br /&gt;
		  if ($msgAuth)  {&lt;br /&gt;
			 Log3(&amp;quot;ntf_signalBot&amp;quot;, 3, &amp;quot;ntf_signalBot: execute authenticated cmd&amp;quot;);&lt;br /&gt;
			 $FhemCmd = substr($FhemCmd, length($cmdKeyword));&lt;br /&gt;
			 $retval = fhem($FhemCmd);&lt;br /&gt;
			 if ($retval) {&lt;br /&gt;
			    fhem(&amp;quot;set signalBot send $msgSender $retval&amp;quot;);&lt;br /&gt;
			 }&lt;br /&gt;
		  } else {&lt;br /&gt;
			 # Hinweis auf nicht authorsiertes Command&lt;br /&gt;
			 fhem(&amp;quot;set signalBot send $msgSender You are not authorized to execute authenticated commands&amp;quot;);&lt;br /&gt;
		  }&lt;br /&gt;
	   }&lt;br /&gt;
	} else {&lt;br /&gt;
	   $FhemCmd = $msgText&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	# prüfe auf nicht authorsiertes Command&lt;br /&gt;
	if ($cmdKeywordNoAuth &amp;amp;&amp;amp; substr($FhemCmd, 0, length($cmdKeywordNoAuth)) eq $cmdKeywordNoAuth)  {&lt;br /&gt;
	   # prüfe patterns&lt;br /&gt;
       Log3(&amp;quot;ntf_signalBot&amp;quot;, 4, &amp;quot;ntf_signalBot: received non-authenticated cmd, checking patterns&amp;quot;);&lt;br /&gt;
	   @patternarray = split(&amp;quot;;&amp;quot;, AttrVal(&amp;quot;signalBot&amp;quot;, &amp;quot;cmdPatternNoAuth&amp;quot;, undef));&lt;br /&gt;
	   $FhemCmd = substr($FhemCmd, length($cmdKeywordNoAuth));&lt;br /&gt;
&lt;br /&gt;
	   my $res = 0;&lt;br /&gt;
	   foreach my $secLine (@patternarray) {&lt;br /&gt;
		 $res += eval &#039;$FhemCmd =~ /&#039; . $secLine . &#039;/&#039;;&lt;br /&gt;
	   }&lt;br /&gt;
	   if ($res &amp;gt; 0)  {&lt;br /&gt;
          Log3(&amp;quot;ntf_signalBot&amp;quot;, 3, &amp;quot;ntf_signalBot: execute non-authenticated cmd&amp;quot;);&lt;br /&gt;
	      $retval = fhem($FhemCmd);&lt;br /&gt;
		  if ($retval) {&lt;br /&gt;
		     fhem(&amp;quot;set signalBot send $msgSender $retval&amp;quot;);&lt;br /&gt;
		  }&lt;br /&gt;
	   } else {&lt;br /&gt;
          Log3(&amp;quot;ntf_signalBot&amp;quot;, 2, &amp;quot;ntf_signalBot: non-authenticated cmd execution requested, but no pattern match&amp;quot;);&lt;br /&gt;
	      fhem(&amp;quot;set signalBot send $msgSender You are not authorized to execute this command without authentication&amp;quot;);&lt;br /&gt;
	   }&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Die Konfiguration erfolgt mit den Attributen am Signal Device. Diese kann z. B. wie folgt aussehen:&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
attr signalBot cmdKeyword /&lt;br /&gt;
attr signalBot cmdKeywordNoAuth -&lt;br /&gt;
attr signalBot cmdPatternNoAuth get .*;;trigger .*;;getstate .*&lt;br /&gt;
attr signalBot favPrefix fav&lt;br /&gt;
attr signalBot favList [Wird später]=-trigger ntf_sayTTS &amp;quot;Es wird leider etwas später&amp;quot;;;[Öffne Haustüre]=/set Flur_Tueroeffner press;;[Temperaturen]=-trigger listTemperatures&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Wichtig ist hier, dass &amp;lt;code&amp;gt;cmdKeyword&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;cmdKeywordNoAuth&amp;lt;/code&amp;gt; unterschiedlich sind. &#039;&#039;&#039;Das &amp;quot;=&amp;quot;-Zeichen darf nicht verwendet werden,&#039;&#039;&#039; weil es in der Favoritenliste für die Zuweisung verwendet wird. In der Favoritenliste müssen die FHEM Befehle mit einem Prefix versehen werden, entweder &amp;lt;code&amp;gt;cmdKeyword&amp;lt;/code&amp;gt; oder &amp;lt;code&amp;gt;cmdKeywordNoAuth&amp;lt;/code&amp;gt;. Ohne Authentifizierung dürfen &amp;lt;code&amp;gt;get, trigger&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;getstate&amp;lt;/code&amp;gt; aufgerufen werden, alle anderen Befehle erfordern Authentifizierung.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Anwendung&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Im Chat hat man nun folgende Optionen:&lt;br /&gt;
* Liste aller Favoriten zurückgeben lassen: &amp;lt;code&amp;gt;fav&amp;lt;/code&amp;gt;&lt;br /&gt;
* Einen Favoriten aufrufen: &amp;lt;code&amp;gt;fav&amp;lt;x&amp;gt;, also z. B. fav3 oder fav13&amp;lt;/code&amp;gt;&lt;br /&gt;
* Einen FHEM Befehl ohne Authentifizierung aufrufen: &amp;lt;code&amp;gt;-get hzgWZ ist_temp&amp;lt;/code&amp;gt;&lt;br /&gt;
* Einen FHEM Befehl mit Authentifizierung aufrufen: &amp;lt;code&amp;gt;/set hzgWZ soll_temp 22&amp;lt;/code&amp;gt;  davor muss via &amp;lt;code&amp;gt;/&amp;lt;tokern&amp;gt;&amp;lt;/code&amp;gt; also z. B. &amp;lt;code&amp;gt;/394848&amp;lt;/code&amp;gt; das aktuelle GoogleAuth Token gesendet werden&lt;br /&gt;
&lt;br /&gt;
== Troubleshooting / FAQ ==&lt;br /&gt;
Anmerkung: Ich gehe hier davon aus, dass die Installation mit den im Script voreingestellten Pfaden/Users durchgeführt wurde. Änderungen auf eigene Gefahr.&lt;br /&gt;
&lt;br /&gt;
Bevor ich hier ein paar typische Probleme und Lösungen aus dem Foren Thread aufliste, bitte folgende Punkte sicherstellen:&lt;br /&gt;
# Ich verwende eine unterstütztes Betriebssystem (Raspbian oder Ubuntu) und CPU Architektur (armv7l oder x86)&lt;br /&gt;
# Ich habe das neuste Install Script aus dem ersten Post des Foren Threads verwendet&lt;br /&gt;
# Ich habe vor der Installation nach besten Wissen und Gewissen Reste einer vorherigen Installation (z.B. auch für SiSi) entfernt (das Repository kann weggesichert werden um eine erneute Registrierung zu vermeiden und dann statt dem Registrierungsschritt in /var/lib/signal-cli kopiert werden&lt;br /&gt;
# Ich habe das Install Script gemäß Anleitung vollständig durchlaufen lassen und auf Fehlermeldungen geachtet&lt;br /&gt;
&lt;br /&gt;
==== Wo finde ich Fehlermeldungen/Logfiles? ====&lt;br /&gt;
* Beim Install Script direkt in der Console - achte auf die Bildschirmausgabe&lt;br /&gt;
* Beim Install Script auch in &#039;&#039;/tmp/signal_install.log&#039;&#039; - ggf. wegsichern da es bei jedem Durchlauf wieder überschrieben wird.&lt;br /&gt;
* Fehler beim Starten und Betrieb des signal-cli service (normale Installation) in /var/log/syslog&lt;br /&gt;
* Fehler beim Betrieb in FHEM im normalen FHEM log (ggf. Signalbot mit verbose=5 definieren)&lt;br /&gt;
* Im Container, sofern die Daemons mit dem Install Script gestartet wurden, schreiben ihr log in /var/log/dbus.log bzw. signal.log und die Fehlerausgabe in /var/log/dbus.err bzw. signal.err&lt;br /&gt;
&lt;br /&gt;
==== Probleme bei normaler Installation ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+&lt;br /&gt;
!Fehler&lt;br /&gt;
!Lösungsansatz&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;In FHEM:&#039;&#039;&#039;&lt;br /&gt;
Error sending message:org.asamk.Signal.Error.Failure: org.whispersystems.signalservice.api.push.exceptions.NotFoundException: Not found&lt;br /&gt;
|signal-cli läuft nicht.&lt;br /&gt;
Prüfe ggf. &#039;&#039;&#039;/var/log/syslog&#039;&#039;&#039; für weitere Fehlermeldungen.&lt;br /&gt;
&lt;br /&gt;
Führe &#039;&#039;&#039;sudo service signal start&#039;&#039;&#039; aus.&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;Bei Starten von signal-cli:&#039;&#039;&#039;&lt;br /&gt;
OpenJDK Server VM warning: You have loaded library /tmp/resource17792002454964883349.so which might have disabled stack guard. The VM will try to fix the stack guard now.&lt;br /&gt;
&lt;br /&gt;
It&#039;s highly recommended that you fix the library with &#039;execstack -c &amp;lt;libfile&amp;gt;&#039;, or link it with &#039;-z noexecstack&#039;.&lt;br /&gt;
&lt;br /&gt;
oder&lt;br /&gt;
&lt;br /&gt;
ERROR App - Missing required native library dependency: libsignal-client&lt;br /&gt;
&lt;br /&gt;
oder&lt;br /&gt;
&lt;br /&gt;
Support for new group V2 is disabled, because the required native library dependency is missing: libzkgroup&lt;br /&gt;
|Passiert üblicherweise auf dem &#039;&#039;&#039;Raspberry pi.&#039;&#039;&#039; Die Standard Distribution von signal-cli enthält eine x86 library libzkgroup.so und libsignal_jni.so, die mit armv7l nicht kompatibel ist, welche im jar &#039;&#039;zkgroup-java-*.jar&#039;&#039; bzw. signal-client-java-*.jar enthalten sind. Das Install Script entfernt diese und ersetzt sie durch armv7l libraries die vom Signalbot Maintainer auf svn.fhem.de zur Verfügung gestellt werden.&lt;br /&gt;
Irgendwo auf dem System vorhandene alte Versionen können aber versehentlich erwischt werden und diese Fehler produzieren. Als ersten Schritt mit&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;sudo rm -rf /opt/signal&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
die alte Installation komplett löschen (enthält keine Konfigurationen) und vom Install Script neu erstellen lassen (einfach wie oben beschrieben starten).&lt;br /&gt;
&lt;br /&gt;
Weitere Tests wenn der Fehler nicht behoben ist:&lt;br /&gt;
# Welche Library wird vom System verwendet: &#039;&#039;sudo ldconfig -v | grep libzkgroup.so&#039;&#039; beziehungsweise &#039;&#039;sudo ldconfig -v | grep libsignal_jni.so&#039;&#039; . Da die libraries in .jar files eingebettet sind, darf hier keine gefunden werden.&lt;br /&gt;
# Check gibt es irgendwo noch eine andere lib.so  &amp;lt;code&amp;gt;sudo find / -name libzkgroup.so 2&amp;gt;/dev/null&amp;lt;/code&amp;gt;  Wenn ja, sicherstellen, dass diese nicht genommen wird (löschen, umbenennen)&lt;br /&gt;
# Check gibt es noch irgendwo ein anderes jar  &amp;lt;code&amp;gt;sudo find / -name zkgroup-java-*.jar 2&amp;gt;/dev/null&amp;lt;/code&amp;gt;  Wenn ja, sicherstellen, dass diese nicht genommen wird (löschen, umbenennen)&lt;br /&gt;
# (für den zweiten Fehler, die Schritte 2 und 3 mit libsignal_jni.so bzw. signal-client-java-*.jar durchführen&lt;br /&gt;
|-&lt;br /&gt;
|Ich kann an Einzelempfänger senden und empfangen, aber nicht an Gruppen versenden&lt;br /&gt;
|Du hast wahrscheinlich den vorhergehenden Fehler (libzkgroup) irgendwo, aber er ist dir nicht aufgefallen. Vorgehensweise wie oben.&lt;br /&gt;
|-&lt;br /&gt;
|Ich kann keiner Gruppe beitreten und/oder nichts an eine Gruppe schicken.&lt;br /&gt;
oder&lt;br /&gt;
&lt;br /&gt;
Error in invite:org.asamk.Signal.Error.Failure: Cannot join a V2 group as self does not have a versioned profile&lt;br /&gt;
|Die neuen V2 Gruppen benötigen zwingend einen Profil Namen. Sofern also nach der Registrierung keiner gesetzt wurde, kann man keine Gruppen verwenden.&lt;br /&gt;
Abhilfe:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;sudo -E ./signal_install.sh name&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
um einen Namen (und optional ein Avatarbild) festzulegen.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Probleme bei Installation im Container ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+&lt;br /&gt;
!Fehler&lt;br /&gt;
!Lösungsansatz&lt;br /&gt;
|-&lt;br /&gt;
|org.freedesktop.DBus.Error.Spawn.FileInvalid: Cannot do system-bus activation with no user&lt;br /&gt;
|Prüfe Datei &#039;&#039;/usr/share/dbus-1/system-services/org.asamk.Signal.service&#039;&#039; ob es einen Eintrag&lt;br /&gt;
&#039;&#039;&#039;User=signal-cli&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
gibt&lt;br /&gt;
|-&lt;br /&gt;
|Signal: Error while initializing Dbus:org.freedesktop.DBus.Error.Disconnected: Connection is closed&lt;br /&gt;
|DBus daemon oder signal-cli daemon laufen nicht. Mit dem Installscript als root&lt;br /&gt;
&#039;&#039;&#039;./signal_install.sh start&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
nachstarten.&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
* Thread {{Link2Forum|Topic=118370|LinkText=Neues Modul: Signalbot}}&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Messenger]]&lt;/div&gt;</summary>
		<author><name>Weini</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=Signalbot&amp;diff=35161</id>
		<title>Signalbot</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=Signalbot&amp;diff=35161"/>
		<updated>2021-03-07T10:37:42Z</updated>

		<summary type="html">&lt;p&gt;Weini: Erweiterung für Favoriten via notify beschrieben (teil 1)&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 Messenger Signal&lt;br /&gt;
|ModType=x&lt;br /&gt;
|ModForumArea=Codeschnipsel&lt;br /&gt;
|ModFTopic=118370&lt;br /&gt;
|ModTechName=50_Signalbot.pm&lt;br /&gt;
|ModOwner=Adimarantis ({{Link2FU|39402|Forum}}/[[Benutzer Diskussion:Adimarantis‎|Wiki]])}}&lt;br /&gt;
Das Modul [[Signalbot]] ermöglicht den Versand von Nachrichten über den Instant-Messaging-Dienst [https://signal.org Signal] aus FHEM heraus.&lt;br /&gt;
&lt;br /&gt;
== Beschreibung ==&lt;br /&gt;
Beschreibung in Kurzform:&lt;br /&gt;
&lt;br /&gt;
Signalbot stellt eine Schnittstelle von FHEM zum Signal Messenger unter Linux zur Verfügung. Dazu wird das Tool [https://github.com/AsamK/signal-cli signal-cli] im DBus-Daemon Modus verwendet, welches dann letztendlich mit Signal kommuniziert.&lt;br /&gt;
&lt;br /&gt;
Da sich signal-cli noch in der Entwicklung befindet (aktuelle Version 0.7.4) steht leider noch nicht die volle Funktionalität über DBus zur Verfügung, wodurch sich auch Einschränkungen für FHEM ergeben.&lt;br /&gt;
&lt;br /&gt;
Aktuell unterstütze Funktionen aus FHEM:&lt;br /&gt;
* Senden und Empfangen von Nachrichten an Gruppen oder Einzelempfänger&lt;br /&gt;
* Versenden von einem oder mehreren Attachments (Bilder)&lt;br /&gt;
* Einlesen, Speichern und Übersetzen von Gruppennamen (statt base64 Strings)&lt;br /&gt;
* Setzen, Empfangen und Übersetzen von Kontaktnamen (statt Telefonnummern)&lt;br /&gt;
* Einschränken von Gruppen oder Kontakten auf die FHEM reagieren soll&lt;br /&gt;
* Direkte Verknüpfung mit dem [[Modul Babble|Babble]] Modul zur Interpretation von Befehlen&lt;br /&gt;
Die Installation von signal-cli ist aktuell je nach Linux Kenntnissen durchaus anspruchsvoll. Daher gibt es ein Installationsscript welches aktuell für aktuelle Ubuntu und Raspian Distributionen getestet ist (höchstwahrscheinlich aber auch für andere Debian basierte Distributionen funktioniert)&lt;br /&gt;
&lt;br /&gt;
Signalbot ist weitgehend kompatibel mit SiSi, verfolgt aber technisch ein paar andere Ansätze und stellt zusätzliche Funktionalitäten zur Verfügung:&lt;br /&gt;
* Signalbot erzeugt keinen eigenen Prozess sondern integriert sich voll in die laufende FHEM Instanz (ist dadurch hoffentlich stabiler und verbraucht auch weniger Speicher)&lt;br /&gt;
* Gruppen werden grundsätzlich mit ihren Klarnamen verwendet und können auch nur mit einem vorangestellten &amp;quot;#&amp;quot; (statt &amp;quot;@#&amp;quot;) gekennzeichnet werden.&lt;br /&gt;
* Kontakte werden soweit möglich auch mit Klarnamen (statt +49....) unterstützt. Diese kommen aus dem internen Adressbuch und können über &amp;quot;setContact&amp;quot; definiert werden, bzw. kommen bei verlinkten Accounts aus dem Adressbuch des Hauptgeräts. Sie können aktuell leider nur über empfangene Nachrichten entschlüsselt werden, da signal-cli die entsprechende Schnittstelle (noch) nicht zur Verfügung stellt. Signalbot lernt diese aber mit der Zeit und kann sie bei Bedarf auch so abspeichern, dass sie auch nach einem FHEM Neustart wieder verfügbar sind&lt;br /&gt;
* Die Möglichkeit von Telegrambot in den &amp;quot;send&amp;quot; Befehl eingebetteten Code auszuführen und damit z.B. einen SVG Plot zu erstellen und mit zu verschicken ist verfügbar. Dazu muss der Befehl in runde Klammern eingebettet werden (Beispiele folgen unten).&lt;br /&gt;
* Wurde mit und für die aktuelle Version 0.7.4 von signal-cli entwickelt, die auch die neuen &amp;quot;V2&amp;quot; Gruppen unterstützt, ebenso wird die neuste Version (1.2.0) vom Perl Modul Net::DBus benötigt&lt;br /&gt;
* Wird aktiv(Feb 2021) gewartet (letztes Update für SiSi auf github ist von August 2018)&lt;br /&gt;
&lt;br /&gt;
=== Funktionen im Detail ===&lt;br /&gt;
&lt;br /&gt;
==== send [@&amp;lt;Recipient1&amp;gt; ... @&amp;lt;RecipientN&amp;gt;] [#&amp;lt;Group1&amp;gt; ... #&amp;lt;GroupN&amp;gt;] [&amp;amp;&amp;lt;Attachment1&amp;gt;; ... &amp;amp;&amp;lt;AttachmentN&amp;gt;] [&amp;lt;Text&amp;gt;] ====&lt;br /&gt;
* &#039;&#039;&#039;Recipient:&#039;&#039;&#039; Nummer mit Ländervorwahl (+49....) oder Kontaktname aus dem internen Adressbuch&lt;br /&gt;
* &#039;&#039;&#039;Group:&#039;&#039;&#039; Gruppenname, wie in Signal definiert im Klartext&lt;br /&gt;
* &#039;&#039;&#039;Attachment&#039;&#039;&#039;: Dateiname (Pfad für muss für fhem lesbar und absolut oder relativ zum fhem home sein) oder Stream einer Bilddatei (z.B.)SVG&lt;br /&gt;
* &#039;&#039;&#039;Text:&#039;&#039;&#039; Die eigentlich Textnachricht, kann Leerzeichen und Umbrüche (mit &amp;quot;\n&amp;quot; oder \0x0a) enthalten&lt;br /&gt;
* Sofern ein Recipient, Group oder Attachment Leerzeichen enthält, den ganzen Teilstring in Anführungszeichen setzen: z.B. &amp;quot;@Max Mustermann&amp;quot;&lt;br /&gt;
* Wenn ein FHEM Befehl ausgeführt werden soll, dann diesen in runde Klammern setzen z.B. &amp;amp;({plotAsPng(&#039;SVG_Aussentemperatur&#039;)})&lt;br /&gt;
&lt;br /&gt;
Ein paar Beispiele &lt;br /&gt;
  send @+498514711 Hallo Signal&lt;br /&gt;
  send #FHEM &amp;amp;/tmp/foto.jpg Ein Bild schicken&lt;br /&gt;
  send &amp;quot;@Mein Freund&amp;quot; Leerzeichen durch Anführungszeichen um den ganzen Teilbefehl&lt;br /&gt;
  send @Joerg #FHEM #Familie Jeder Empfänger, jede Gruppe und Attachments können mehrfach vorkommen&lt;br /&gt;
  send &amp;quot;@({my $var=\&amp;quot;Joerg\&amp;quot;;; return $var;;})&amp;quot; Perl Code mit Leerzeichen ausführen&lt;br /&gt;
  send @(define dummy1 dummy) FHEM Befehl ausführen, wird aber nicht gesendet, da kein gültiger Empfänger zurück geliefert wird&lt;br /&gt;
  send @Joerg &amp;amp;({plotAsPng(\&#039;SVG_Aussentemperatur\&#039;)}) Einen FHEM SVG Plot verschicken oder&lt;br /&gt;
  send @Joerg &amp;quot;&amp;amp;({plotAsPng(&#039;SVG_Aussentemperatur&#039;)})&amp;quot; Einen FHEM SVG Plot verschicken&lt;br /&gt;
  send @Joerg Mehrzeilige Ausgabe:\nNeue Zeile&lt;br /&gt;
  send @Joerg Umlaute öäü und Emojis 🙃😆🤗🤑🤪 sowie 𝐅𝐨𝐫𝐦𝐚𝐭𝐢𝐞𝐫𝐮𝐧𝐠𝐞𝐧 direkt senden &lt;br /&gt;
  send @Joerg Die Aussentemperatur ist [out_temp:temperature] Grad&lt;br /&gt;
&#039;&#039;&#039;Tipp zu den Formatierungen&#039;&#039;&#039;: Auf z.B. https://yaytext.com/ kann man sich seine UTF8 Kodierungen erstellen und nach FHEM per copy&amp;amp;paste einfügen. Vorrausetzung dürfte sein, dass die &amp;quot;locale&amp;quot; des Systems auf UTF8 eingestellt ist&lt;br /&gt;
&lt;br /&gt;
==== refreshGroups ====&lt;br /&gt;
Fragt die List der aktuellen Gruppen ab, denen der verknüpfte Account beigetreten ist. Die Liste wird im u.a. Reading &#039;&#039;&#039;joinedGroups&#039;&#039;&#039; sichtbar gemacht.  &lt;br /&gt;
&lt;br /&gt;
==== setContact &amp;lt;Number&amp;gt; &amp;lt;Contactname&amp;gt; ====&lt;br /&gt;
Definiert einen Kontakteintrag im internen Adressbuch. Es kann beim &#039;&#039;&#039;send&#039;&#039;&#039; Befehl dann der &#039;&#039;ContactName&#039;&#039; statt der Nummer verwendet werden.&lt;br /&gt;
&lt;br /&gt;
==== saveContacts ====&lt;br /&gt;
Speichert die interne Kontaktliste in das Reading &#039;&#039;&#039;contactList&#039;&#039;&#039; welches beim Speichern der FHEM Config in &#039;&#039;fhem.save&#039;&#039; abgelegt wird und nach einem Neustart wieder zur Verfügung steht (zur Diskussion: immer automatisch so machen wenn neue Kontakte festgelegt werden?)&lt;br /&gt;
&lt;br /&gt;
==== reinit ====&lt;br /&gt;
Verbindung zum DBus wiederherstellen. Dies sollte nicht nötig sein, außer der signal-cli Service funktionierte nicht richtig und wurde korrigiert. Ich rate hier aber eher zu einem FHEM Neustart.&lt;br /&gt;
&lt;br /&gt;
==== createGroup &amp;lt;Groupname&amp;gt; [&amp;amp;&amp;lt;path to picture&amp;gt;] ====&lt;br /&gt;
Erzeugt eine neue Signalgruppe und versieht diese (optional) mit einem Gruppenbild.&lt;br /&gt;
&lt;br /&gt;
==== updateGroup &amp;lt;Groupname&amp;gt; [&amp;lt;new Groupname&amp;gt;] [&amp;amp;&amp;lt;path to picture&amp;gt;] ====&lt;br /&gt;
Aktualisiert den Namen und/oder das Gruppenbild einer Gruppe.&lt;br /&gt;
&lt;br /&gt;
==== invite &amp;lt;Groupname&amp;gt; &amp;lt;Contact1&amp;gt; [&amp;lt;Contact2&amp;gt;...] ====&lt;br /&gt;
Lädt einen oder mehrere Kontakte (per Namen oder Nummer) in eine bestehende Gruppe ein.&lt;br /&gt;
&lt;br /&gt;
==== block #&amp;lt;Groupname&amp;gt;|&amp;lt;Contact&amp;gt; ====&lt;br /&gt;
Blockiert eine Gruppe oder einen Kontakt (per Namen oder Nummer) serverseitig. Signalbot bekommt dann keine Nachrichten dieser Absender mehr (im Gegensatz zu &#039;&#039;allowedPeer&#039;&#039; bei der FHEM die Nachrichten noch bekommt, diese aber ignoriert.)&lt;br /&gt;
&lt;br /&gt;
==== unblock #&amp;lt;Groupname&amp;gt;|&amp;lt;Contact&amp;gt; ====&lt;br /&gt;
Hebt die Blockierung wieder auf.&lt;br /&gt;
&lt;br /&gt;
=== Attribute im Detail ===&lt;br /&gt;
&lt;br /&gt;
==== defaultPeer ====&lt;br /&gt;
Gruppe, Kontaktname oder Nummer an die &#039;&#039;&#039;send&#039;&#039;&#039; eine Nachricht schicken soll, wenn kein Empfänger mit @ oder # definiert wurde.&lt;br /&gt;
&lt;br /&gt;
==== allowedPeer ====&lt;br /&gt;
Komma getrennte Liste von Gruppen, Kontaktnamen oder Nummern auf die Signalbot reagieren soll (also bei empfangenen Nachrichten Readings aktualisiert). Ist dieses Attribut nicht gesetzt, reagiert Signalbot auf alle Nachrichten.&lt;br /&gt;
&lt;br /&gt;
==== babblePeer ====&lt;br /&gt;
Komma getrennte Liste von Gruppen, Kontaktnamen oder Nummern auf die Signalbot reagieren soll indem es die Nachricht an das über &#039;&#039;&#039;babbleDev&#039;&#039;&#039; (nicht zu verwechseln mit &#039;&#039;babbleDevice&#039;&#039;) definierte [[Modul Babble|Babble]] Modul schickt. Die Nachrichten werden zuerst (beschränkt auf allowedPeer) normal verarbeitet (also Readings aktualisiert) und nur nach Babble gesendet wenn diese Attribut gesetzt ist.&lt;br /&gt;
&lt;br /&gt;
Der Absender der Nachricht (Gruppe hat Prio über individuellem Absender) wird Babble als &#039;&#039;$PARM0&#039;&#039; übergeben. Dazu in Babble noch das Attribut helpFunc wie folgt setzen&lt;br /&gt;
 {fhem(&amp;quot;set SignalBot send \@$PARM0 $HELP&amp;quot;)}&lt;br /&gt;
Sollen die rivescript Spracherweiterungen genutzt werden muss außerdem &amp;quot;noChatbot&amp;quot; auf 0 stehen.&lt;br /&gt;
&lt;br /&gt;
Nach dem selben Prinzip können in der Babble Definition auch Antworten spezfisch für Devices angelegt werden, z.B. als Aktion für out-temp -&amp;gt; Temperatur -&amp;gt; draußen -&amp;gt; sagen -&amp;gt; Status:&lt;br /&gt;
 set SignalBot send @$PARM0 Die Temperatur draußen ist [out_temp:temperature] Grad&lt;br /&gt;
Womit die Frage (ohne Fragezeichen!) &amp;quot;Wie ist die Temperatur draußen&amp;quot; entsprechend quittiert wird.&lt;br /&gt;
&lt;br /&gt;
==== babbleDev ====&lt;br /&gt;
Name des definierten Babble Device.Wird beim Setzen vom babblePeer automatisch mit der ersten &amp;quot;Babble&amp;quot; Device gefüllt sofern vorhanden.&lt;br /&gt;
&lt;br /&gt;
==== babbleExclude ====&lt;br /&gt;
Regulärer Ausdruck auf den Nachrichtentext um bestimmte Nachrichten von der Weiterleitung zu Babble auszuschließen (ein Event wird trotzdem generiert und kann mit Notify, DOIF etc. verarbeitet werden).&lt;br /&gt;
&lt;br /&gt;
=== Readings im Detail ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|contactList&lt;br /&gt;
|Liste der gespeicherten Kontakt im Format &#039;&#039;Nummer1=Kontakt1,Nummer2=Kontakt2,...&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|joinedGroups&lt;br /&gt;
|Liste der beigetretenen Gruppen getrennt mit Leerzeichen&lt;br /&gt;
|-&lt;br /&gt;
|msgAttachment&lt;br /&gt;
|Attachments (Dateinamen im signal-cli repository) der zuletzt empfangenen Attachments&lt;br /&gt;
|-&lt;br /&gt;
|msgGroupName&lt;br /&gt;
|Gruppenname aus der zuletzt eine Nachricht empfangen wurde - leer wenn es eine persönlich Nachricht war&lt;br /&gt;
|-&lt;br /&gt;
|msgSender&lt;br /&gt;
|Absender der letzten Nachricht als Nummer oder wenn bekannt als Name&lt;br /&gt;
|-&lt;br /&gt;
|msgText&lt;br /&gt;
|Empfangenen Nachricht&lt;br /&gt;
|-&lt;br /&gt;
|msgTimestamp&lt;br /&gt;
|Zeitstempel der Nachricht&lt;br /&gt;
|-&lt;br /&gt;
|prevMsgAttachment&lt;br /&gt;
| rowspan=&amp;quot;5&amp;quot; |Wie oben, nur enthalten diese Readings die Daten der zuvor empfangenen Nachricht (n-1)&lt;br /&gt;
|-&lt;br /&gt;
|prevMsgGroupName&lt;br /&gt;
|-&lt;br /&gt;
|prevMsgSender&lt;br /&gt;
|-&lt;br /&gt;
|prevMsgText&lt;br /&gt;
|-&lt;br /&gt;
|prevMsgTimestamp&lt;br /&gt;
|-&lt;br /&gt;
|sentMsg&lt;br /&gt;
|Zuletzt gesendete Nachricht&lt;br /&gt;
|-&lt;br /&gt;
|sentMsgRecipient&lt;br /&gt;
|Empfänger der zuletzt gesendeten Nachricht. Enthält zumeist den Namen aus der Empfangsbestätigung und somit bei vielen Empfängern den zuletzt bestätigten Empfang.&lt;br /&gt;
&lt;br /&gt;
Dies muss nicht zwingend auf die zuletzt gesendete Nachricht (sendMsg) passen, wenn mehrere Nachrichten versendet wurden.&lt;br /&gt;
|-&lt;br /&gt;
|sentMsgTimestamp&lt;br /&gt;
|Zeitstempel des Empfangs oder &amp;quot;pending&amp;quot; wenn noch keine Bestätigung vorliegt&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Installation ==&lt;br /&gt;
Zur Installation steht das Script &amp;quot;signal_install.sh&amp;quot; zur Verfügung. Dieses befindet sich noch in der Entwicklung und funktioniert nicht zwangsweise in jeder Umgebung. Daher erst einmal ein paar Referenzen zur manuellen Installation von signal-cli:&lt;br /&gt;
* Die Wikiseite des Vorgängermoduls [[SiSi]] welches grundsätzlich die selben Anforderungen hat&lt;br /&gt;
* Quickstart (englisch) für [https://github.com/AsamK/signal-cli/wiki/Quickstart signal-cli]&lt;br /&gt;
* Anleitung zum [https://github.com/AsamK/signal-cli/wiki/Linking-other-devices-%28Provisioning%29 &amp;quot;linken&amp;quot; einer Nummer] mit signal-cli&lt;br /&gt;
* Anleitung zum [https://github.com/AsamK/signal-cli/wiki/Provide-native-lib-for-libsignal#libsignal-client Übersetzen und Installieren der Libraries] für armv7 (Raspberry) da die Distribution nur x86 libraries enthält&lt;br /&gt;
* CPAN Seite des Perl Moduls zur [https://metacpan.org/release/Net-DBus DBus Kommunikation]&lt;br /&gt;
Das Modul und Install Script wird aktuell nicht über &amp;quot;fhem [[update]]&amp;quot; verbreitet und muss vom ersten Post dieses {{Link2Forum|Topic=118370|LinkText=Forenthemas}} geholt werden.&lt;br /&gt;
&lt;br /&gt;
Vorbereitung:&lt;br /&gt;
&lt;br /&gt;
Modul 50_Signalbot.pm wie üblich ins Verzeichnis &amp;quot;FHEM&amp;quot; der FHEM Installation kopieren.&lt;br /&gt;
&lt;br /&gt;
Das Script &amp;quot;signal_install.sh&amp;quot; ins home Verzeichnis eines beliebigen &amp;quot;sudo&amp;quot;-fähigen Users kopieren.&lt;br /&gt;
&lt;br /&gt;
Am Anfang des Moduls sind einige Informationen und Pfade definiert. Mindestvorrausetzung ist eine Telefonnummer. Es kann eine Festnetznummer oder Mobilfunknummer verwendet werden. Wird Signal schon am Handy benutzt lässt sich die Nummer verknüpfen, was aber den unangenehmen Nebeneffekt hat, dass man dort alle FHEM Nachrichten mitbekommt.&lt;br /&gt;
&lt;br /&gt;
Kontrolliert also bitte vor dem Start des Scripts diese Angaben. Außer bei &#039;&#039;PHONE=+49xxxxx&#039;&#039; sollte aber üblicherweise keine Änderung nötig sein. Wird das sudo mit &#039;&#039;-E&#039;&#039; ausgeführt, so bewirkt das die Übernahme der Environment Variablen. Wenn mit &#039;&#039;export PHONE=+49xxxx&#039;&#039; die Telefonnummer z.B. bereits im &#039;&#039;.bash_profile&#039;&#039; gesetzt wurde, muss das Script nicht mehr editiert werden.&lt;br /&gt;
&lt;br /&gt;
Das Script hat mehrere Optionen um Teilfunktionen direkt auszuführen, diese sind:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+&lt;br /&gt;
!Argument&lt;br /&gt;
!Bedeutung&lt;br /&gt;
|-&lt;br /&gt;
|system&lt;br /&gt;
|System für die signal-cli Installation vorbereiten. Es werden per &amp;quot;apt install&amp;quot; fehlende Pakete installiert und Verzeichnisse erstellt. &lt;br /&gt;
Muss mindestens einmal erfolgreich gelaufen sein, damit die restliche Installation funktioniert&lt;br /&gt;
|-&lt;br /&gt;
|install&lt;br /&gt;
|Installiert signal-cli als System Service. Automatischer Download, Installation und Konfiguration (dbus, systemd)&lt;br /&gt;
|-&lt;br /&gt;
|register&lt;br /&gt;
|Registriert die definierte Telefonnummer bei Signal. Dieser Prozess hat seine Tücken  und wird unten nochmal eingehend beschrieben&lt;br /&gt;
|-&lt;br /&gt;
|link&lt;br /&gt;
|Verknüpfen einer bestehenden Telefonnummer. Dazu muss in Signal über Settings -&amp;gt; Linked Devices -&amp;gt; &amp;quot;plus&amp;quot; ein QR Code abfotografiert werden. &lt;br /&gt;
Dieser wird von dieser Routine als Datei in /tmp/qrcode.png abgelegt. D.h. vorher sicherstellen, dass man mit einem Bildbetrachter an diese Datei kommt&lt;br /&gt;
|-&lt;br /&gt;
|test&lt;br /&gt;
|Versendet eine Testnachricht auf zwei Arten - direkt mit dem Client (klappt das, ist die Grundregistrierung schon mal erfolgreich) und über Dbus (dann ist auch der System Service korrekt eingerichtet)&lt;br /&gt;
|-&lt;br /&gt;
|remove&lt;br /&gt;
|Löscht alle durch &amp;quot;install&amp;quot; installierten Verzeichnisse und Dateien (aber nicht die Pakete die durch &amp;quot;system&amp;quot; installiert wurden)&lt;br /&gt;
|-&lt;br /&gt;
|join&lt;br /&gt;
|Ermöglicht einer Gruppe mithilfe eines Einladungslinks beizutreten&lt;br /&gt;
|-&lt;br /&gt;
|name&lt;br /&gt;
|Definieren des eigenen Namens und Avatar Bildes&lt;br /&gt;
|-&lt;br /&gt;
|start&lt;br /&gt;
|Starten des singal service über systemd bzw. im Container des Dbus daemon and signal-cli Daemon&lt;br /&gt;
|}&lt;br /&gt;
Das Script muss unter root Rechten, also mit&lt;br /&gt;
 sudo -E ./signal_install.sh&lt;br /&gt;
aufgerufen werden. Wenn kein Argument übergeben wird, dann wird automatisch der Ablauf &#039;&#039;system -&amp;gt; install -&amp;gt; register/link -&amp;gt; test&#039;&#039; durchlaufen.&lt;br /&gt;
&lt;br /&gt;
Das Script fragt üblicherweise nach wenn es etwas tut und führt nur notwendige Aktionen durch (kann also bei teilweisen Fehlern problemlos erneut durchlaufen werden).&lt;br /&gt;
&lt;br /&gt;
Es prüft außerdem ab ob es im Container läuft (hier erfolgt ein etwas anderer Ablauf - mehr dazu unten) und prüft auf Betriebssystem und CPU Architektur. Gegebenenfalls bricht es ab, wenn es sich um keine unterstützte Kombination handelt.&lt;br /&gt;
&lt;br /&gt;
Bitte genau auf die Bildschirmausgaben und Fragen achten. Fehlermeldungen im Thread melden damit das Script weiter verbessert werden kann.&lt;br /&gt;
&lt;br /&gt;
=== Registrierung ===&lt;br /&gt;
&#039;&#039;&#039;Hinweis:&#039;&#039;&#039; Es kann nur &#039;&#039;&#039;eine&#039;&#039;&#039; Nummer registriert sein. Eine bereits bestehende Registrierung (Smartphone) wird dabei &#039;&#039;&#039;aufgehoben&#039;&#039;&#039;. Daher entweder eine Festnetznummer verwenden oder das Script hier abbrechen und mit der Option &amp;quot;link&amp;quot; neu starten, dann wird FHEM als Zweitbenutzer zu einer bestehenden Nummer hinzugefügt.&lt;br /&gt;
&lt;br /&gt;
Wenn die Systeminstallation erfolgreich abgeschlossen ist, folgt die Registrierung der Nummer. Hier gibt es zwei Optionen:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;SMS&#039;&#039;&#039; oder &#039;&#039;&#039;Voice&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Je nachdem wird ein 6-stelliger Aktivierungscode per SMS geschickt oder über einen Telefonanruf (sogar auf Deutsch) diktiert.&lt;br /&gt;
&lt;br /&gt;
==== Captcha ====&lt;br /&gt;
Signal versucht sich gegen unberechtigte Nutzung des Service (man könnte ja damit quasi SMS/Telefonterror betreiben) zu schützen. Nach gewissen Kriterien (soweit bekannt z.B. Registrierung aus einer VM oder über VPN) wird daher ein Captcha verlangt.&lt;br /&gt;
&lt;br /&gt;
Nur wie funktioniert sowas in der Kommandozeile?&lt;br /&gt;
&lt;br /&gt;
Das Script erkennt diese Abfrage und fragt nach einem Captcha Code. Diesen erlangt man wie folgt:&lt;br /&gt;
[[Datei:Signalbot Captcha Chrome.png|mini|Captcha in Chrome]]&lt;br /&gt;
# [https://signalcaptchas.org/registration/generate.html Captcha Seite] von Signal aufrufen. Dabei ist es wahrscheinlich unerheblich von wo (hab es erfolgreich aus meinem Windows Host gemacht und in meinen Linux VM Guest eingetragen) - schätzungsweise ist es einfach zeitlich begrenzt gültig.&lt;br /&gt;
# Im Developermode (F12) und nach erfolgreichem Lösen des Captchas (wenn der Bildschirm leer bleibt, ist es auch erfolgreich gelöst) macht der Browser ein redirect auf signalcaptcha://. Das versteht der Browser aber nicht und macht gar nichts.&lt;br /&gt;
# Der String steht aber bei Firefox in der Console (recht einfach zu finden), beim Chrome muss man auf Network gehen, mit Ctrl+R refreshen und dann in der Spalte &amp;quot;Name&amp;quot; nach einem kryptischen String suchen. Dass dieser mit signalcaptcha anfängt, sieht man erst im Tooltipp, da der Anfang abgeschnitten wird.&lt;br /&gt;
# Diesen String (ohne signalcaptcha://) dann in die Eingabezeile des Scripts einfügen und Return drücken. Jetzt sollte die Registrierung erfolgreich abschließen.&lt;br /&gt;
Anbei Screenshots von Firefox und Chrome zum besseren Verständnis.&lt;br /&gt;
[[Datei:Signalbot Captch Firefox.png|mini|Captcha im Firefox]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Unterstützung gesucht:&#039;&#039;&#039; Das Holen des Captchas ist ziemlich umständlich. Suche jemanden der sich mit z.B. mit der Erstellung von Protokoll plugins in Chrome (Abfangen von signalcaptcha:// und Darstellen des Texts in einem Fenster - evtl. mit &amp;quot;Copy&amp;quot; Button) auskennt - oder vielleicht geht sowas ja auch als FHEM Modul?&lt;br /&gt;
&lt;br /&gt;
=== Bestehende Nummer verlinken ===&lt;br /&gt;
Alternativ kann man auch eine bestehende Nummer verlinken. Dazu statt der Registrierung die Option &amp;quot;l&amp;quot; (link) wählen.&lt;br /&gt;
&lt;br /&gt;
Besonders komfortabel geht das, wenn das Script im Terminalfenster einer graphischen Benutzeroberfläche gestartet wird. Hierzu gegebenfalls im Script den Einstellung&amp;lt;blockquote&amp;gt;VIEWER=eog&amp;lt;/blockquote&amp;gt;auf einen installierten jpg/png Bildbetrachter anpassen. Wird Ubuntu mit Gnome verwendet kann die Voreinstellung (eog = Eye of Gnome) beibehalten werden. Es wird jetzt automatisch der QR-Code auf dem Bildschirm angezeigt. In der Signal App dann auf Settings-&amp;gt;Linked Devices gehen und mit &amp;quot;+&amp;quot; den QR-Code abfotografieren.&lt;br /&gt;
&lt;br /&gt;
Bitte beachten, dass bei verlinkten Devices immer alle Devices (also auch das Smartphone) Nachrichten bekommen. Bei reinem Sendebetrieb dürfte das weniger stören, soll aber auch auf Befehle reagiert werden, dann ist das eventuell verwirrend.&lt;br /&gt;
&lt;br /&gt;
== Einrichtung des Moduls ==&lt;br /&gt;
Siehe Forenthema {{Link2Forum|Topic=118370|LinkText=Neues Modul: Signalbot}}.&lt;br /&gt;
&lt;br /&gt;
Nachdem alles sauber eingerichtet ist und das Modul im FHEM Directory abgelegt wurde, entweder ein &amp;quot;reload 50_Signalbot&amp;quot; oder besser ein &amp;quot;shutdown restart&amp;quot; von FHEM machen.&lt;br /&gt;
&lt;br /&gt;
Das Modul dann einfach mit&lt;br /&gt;
 define &amp;lt;name&amp;gt; Signalbot&lt;br /&gt;
definiert.&lt;br /&gt;
&lt;br /&gt;
Weitere Attribute sind optional (siehe oben)&lt;br /&gt;
&lt;br /&gt;
== Umstieg von SiSi ==&lt;br /&gt;
Alle die bereits SiSi verwenden können Signalbot erstmal gefahrlos parallel installieren. Einfach Modul ins FHEM Verzeichnis, reload / restart und &amp;quot;define&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Vorher aber zumindest Net::DBus auf V1.2.0 updaten&lt;br /&gt;
 cpan install -f Net::DBus &lt;br /&gt;
Probleme durch eine veraltete &#039;&#039;&#039;signal-cli&#039;&#039;&#039; Version sind aber nicht ausgeschlossen. Daher keine Support Anfrage ohne vollständigen Umstieg.&lt;br /&gt;
&lt;br /&gt;
Wer komplett umsteigen möchte, kann dies dann mit dem Installer Script tun. Gegebenenfalls Pfade im Script anpassen. Eine bestehende Registrierung wird dann übernommen und muss nicht erneut erfolgen (keine Garantie, dass dies für sehr alte &#039;&#039;&#039;signal-cli&#039;&#039;&#039; Versionen funktioniert). Wer&#039;s ganz sauber haben will, löscht aber alte Installationsreste.&lt;br /&gt;
&lt;br /&gt;
Sofern nach dem SiSi Wiki vorgegangen wurde, dann sind folgende Anpassungen im Script notwendig:&lt;br /&gt;
 PHONE=+49&amp;lt;eure nummer&amp;gt;&lt;br /&gt;
 SIGNALPATH=/opt/fhem&lt;br /&gt;
 SIGNALUSER=fhem&lt;br /&gt;
 SIGNALVAR=/opt/fhem/.local/share&lt;br /&gt;
Das Verzeichnis /opt/fhem/signal-cli kann gelöscht werden.&lt;br /&gt;
&lt;br /&gt;
Wenn mein Installationsschema übernommen werden soll, dann&lt;br /&gt;
 sudo mv /opt/fhem/.local/share/signal-cli /var/lib&lt;br /&gt;
&lt;br /&gt;
Jetzt kann das Script (PHONE setzen nicht vergessen) einfach wie oben beschrieben gestartet werden.&lt;br /&gt;
&lt;br /&gt;
=== Umzug auf ein neues System ===&lt;br /&gt;
Dazu einfach das Script mit dem Argument &amp;quot;remove&amp;quot; starten. Die alte Konfiguration wird dabei im Home Verzeichnis des aktuellen Benutzers als &#039;&#039;~/signalconf.tar.gz&#039;&#039; gesichert.&lt;br /&gt;
&lt;br /&gt;
auf dem neuen System dann&lt;br /&gt;
 cd /&lt;br /&gt;
 sudo tar xvf &#039;&#039;signalconf.tar.gz&#039;&#039;&lt;br /&gt;
Dann wie üblich das Install Script ausführen.&lt;br /&gt;
&lt;br /&gt;
== Installation im Docker Container ==&lt;br /&gt;
Das Install Script kann auch in einem FHEM Container ausgeführt werden. Diese Funktion ist noch in der Entwicklungsphase (siehe Foren Thread).&lt;br /&gt;
&lt;br /&gt;
Dazu eine interaktive root Shell öffnen und das Script in den Container kopieren (z.B. mit scp).&lt;br /&gt;
&lt;br /&gt;
Dann wie oben beschrieben das Script als root starten.&lt;br /&gt;
&lt;br /&gt;
Im Container wird die Installation des systemd Service ausgelassen und am Anfang ein zusätzliches apt-get update/upgrade ausgeführt (was insbesondere bei einem neuen Container notwendig sein kann).&lt;br /&gt;
&lt;br /&gt;
Sowohl der Dbus daemon und der signal-cli daemon werden vom Script am Ende im Hintergrund gestartet. Dabei wird insbesondere gewartet bis der signal-cli Prozess läuft bevor die Tests durchlaufen werden (das hat in meiner VM durchaus schon mal eine Minute gedauert).&lt;br /&gt;
&lt;br /&gt;
Um Sicherzustellen, dass die beiden Daemons laufen, sollte in den Container Startup ein Aufruf des Scripts mit dem Argument &amp;quot;start&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Dies prüft ob die Daemons laufen und startet die ggf. nach.&lt;br /&gt;
&lt;br /&gt;
Hier noch mein verwendetes docker-compose.yml&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Perl&amp;quot;&amp;gt;&lt;br /&gt;
version: &#039;2&#039;&lt;br /&gt;
&lt;br /&gt;
services:&lt;br /&gt;
    fhem:&lt;br /&gt;
        build: .&lt;br /&gt;
        restart: always&lt;br /&gt;
        stdin_open: true&lt;br /&gt;
        tty: true&lt;br /&gt;
        ports:&lt;br /&gt;
            - &amp;quot;8083:8083&amp;quot;&lt;br /&gt;
            - &amp;quot;7072:7072&amp;quot;&lt;br /&gt;
        volumes:&lt;br /&gt;
            - ./fhem/core/:/opt/fhem/&lt;br /&gt;
        networks:&lt;br /&gt;
            - fhem-network&lt;br /&gt;
        #devices:&lt;br /&gt;
        #    - &amp;quot;/dev/ttyUSB0:/dev/ttyUSB0&amp;quot;&lt;br /&gt;
        environment:&lt;br /&gt;
            FHEM_UID: 1000&lt;br /&gt;
            FHEM_GID: 1000&lt;br /&gt;
            TIMEOUT: 10&lt;br /&gt;
            RESTART: 1&lt;br /&gt;
            TELNETPORT: 7072&lt;br /&gt;
            TZ: Europe/Berlin&lt;br /&gt;
&lt;br /&gt;
networks:&lt;br /&gt;
    fhem-network:&lt;br /&gt;
        driver: bridge&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Und mein Dockerfile&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Perl&amp;quot;&amp;gt;&lt;br /&gt;
ARG BASE_IMAGE=&amp;quot;fhem/fhem&amp;quot;&lt;br /&gt;
ARG BASE_IMAGE_TAG=&amp;quot;latest&amp;quot;&lt;br /&gt;
FROM ${BASE_IMAGE}:${BASE_IMAGE_TAG}&lt;br /&gt;
&lt;br /&gt;
ARG L_SIGNAL_CLI=&amp;quot;0.7.4&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# Install base environment&lt;br /&gt;
&lt;br /&gt;
VOLUME [ &amp;quot;/opt/signal-cli&amp;quot; ]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Im Unterverzeichnis fhem/core liegt das ausgepackte fhem.tar.gz (da kann man auch gleich das Install Script und Signalbot installieren).&lt;br /&gt;
&lt;br /&gt;
Dann mit&lt;br /&gt;
 docker-compose up -d&lt;br /&gt;
 docker exec -ti fhem-docker_fhem_1 /bin/bash&lt;br /&gt;
das Dockerimage erzeugen und root shell starten. Jetzt wird&lt;br /&gt;
 ./signal-install.sh&lt;br /&gt;
ausgeführt.&lt;br /&gt;
&lt;br /&gt;
Dann sollte man zum fhem user wechseln und fhem starten können&lt;br /&gt;
 su - fhem&lt;br /&gt;
 cd /opt/fhem&lt;br /&gt;
 perl fhem.pl fhem.cfg&lt;br /&gt;
Das aber noch ohne Gewähr und nur rudimentär getestet. Verbesserungsvorschläge, insbesondere wie man gleich alles in die Config Files einbaut willkommen.&lt;br /&gt;
&lt;br /&gt;
== Favoriten und erweiterte Command Funktionen mit einem notify ergänzen ==&lt;br /&gt;
Signalbot kann über DOIFs/notifys problemlos um individuelle Funktionen erweitert werden. Der hier beschriebene Ansatz ergänzt eine Favoritenverwaltung und erlaubt die direkt Ausführung von FHEM Befehlen entweder mit oder ohne Authentifizierung via GoogleAuth.&lt;br /&gt;
&lt;br /&gt;
Die Beschreibung hier erfolgt auf Basis von Signalbot Version &amp;quot;Signalbot:2.0.1-beta signal-cli:0.8.1 Protocol::DBus:0.16&amp;quot;. Bei künftigen Versionen können sich ggf. Änderungen ergeben.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Use Case / Szenario&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Das Signalbot Modul bietet über die Defintion von &amp;quot;allowedPeers&amp;quot; und durch die von Signal bereitgestellte Ende-zu-Ende Verschlüsselung bereits ein hohes Maß an Sicherheit. Für einfache Abfragen von Temperatiuren etc. ist das aus Sicht des Autors absolut ausreichend. Diese Abfragen sollten über Favoriten mit möglichst wenig Tipp-Aufwand gesendet werden können.&lt;br /&gt;
&lt;br /&gt;
Für sicherheitskritische / sensible Aktionen ist aber eine zusätzliche Absicherung wünschenswert. Für solche Befehle soll eine zusätzliche Absicherung erfolgen, die das Signalbot Modul mit der Integration von GoogleAuth bereits anbietet.  Auch diese Befehle können über Favoritendefinitionen abgekürzt werden. Das GoogleAuth Token wird dann vorab separt geschickt.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Voraussetzungen&#039;&#039;&#039;&lt;br /&gt;
* Das Signalbot Device wird mit &amp;quot;signalBot&amp;quot; benannt (alternativ muss eben der Code im Notify angepasst werden&lt;br /&gt;
* Es werden zusätzliche Attribute via userattr zum Signalbot Device hinzugefügt: cmdKeywordNoAuth cmdPatternNoAuth favPrefix favList&lt;br /&gt;
&#039;&#039;&#039;Das eigentliche Notify&#039;&#039;&#039;&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
signalBot:msgText.* {&lt;br /&gt;
	my $msgText = ReadingsVal(&amp;quot;signalBot&amp;quot;, &amp;quot;msgText&amp;quot;, &amp;quot;&amp;quot;);&lt;br /&gt;
	my $msgAuth = int(ReadingsVal(&amp;quot;signalBot&amp;quot;, &amp;quot;msgAuth&amp;quot;, 0));&lt;br /&gt;
	my $FhemCmd;&lt;br /&gt;
	my $cmdPatternNoAuth = AttrVal(&amp;quot;signalBot&amp;quot;, &amp;quot;cmdPatternNoAuth&amp;quot;, undef);&lt;br /&gt;
	my $favPrefix = AttrVal(&amp;quot;signalBot&amp;quot;, &amp;quot;favPrefix&amp;quot;, undef);&lt;br /&gt;
	my $cmdKeyword = AttrVal(&amp;quot;signalBot&amp;quot;, &amp;quot;cmdKeyword&amp;quot;, undef);&lt;br /&gt;
	my $cmdKeywordNoAuth = AttrVal(&amp;quot;signalBot&amp;quot;, &amp;quot;cmdKeywordNoAuth&amp;quot;, undef);&lt;br /&gt;
	my @favarray;&lt;br /&gt;
	my @patternarray;&lt;br /&gt;
	my $favno;&lt;br /&gt;
	my $favList;&lt;br /&gt;
	my $retval;&lt;br /&gt;
	my $msgSender = ReadingsVal(&amp;quot;signalBot&amp;quot;, &amp;quot;msgSender&amp;quot;, &amp;quot;&amp;quot;);&lt;br /&gt;
	if (substr($msgSender, 0, 1) ne &amp;quot;+&amp;quot;)  { $msgSender = &amp;quot;@&amp;quot; . $msgSender }&lt;br /&gt;
&lt;br /&gt;
    # Sicherheitsprüfung für multi-Command Befehl&lt;br /&gt;
	if (index($msgText, &amp;quot;;&amp;quot;) &amp;gt;= 0)  {&lt;br /&gt;
	   Log3(&amp;quot;ntf_signalBot&amp;quot;, 2, &amp;quot;ntf_signalBot: Semicolon detected, sender may try to send multiple commands in one line. Aborting!&amp;quot;);&lt;br /&gt;
	   fhem(&amp;quot;set signalBot send $msgSender Semicolon detected, command is ignored!&amp;quot;);&lt;br /&gt;
	   return;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	# ggf. Favoriten auflösen&lt;br /&gt;
	if ($favPrefix &amp;amp;&amp;amp; substr($msgText, 0, length($favPrefix)) eq $favPrefix) {&lt;br /&gt;
	   $favno = int(substr($msgText, length($favPrefix)));&lt;br /&gt;
       @favarray = split(&amp;quot;;&amp;quot;, AttrVal(&amp;quot;signalBot&amp;quot;, &amp;quot;favList&amp;quot;, undef));&lt;br /&gt;
	   &lt;br /&gt;
	   if ($favno == 0)  {&lt;br /&gt;
	      # Favoritenliste zurückgeben&lt;br /&gt;
	      Log3(&amp;quot;ntf_signalBot&amp;quot;, 4, &amp;quot;ntf_signalBot: list favorites&amp;quot;);&lt;br /&gt;
		  $favList = &amp;quot;&amp;quot;;&lt;br /&gt;
		  $favno = 1;&lt;br /&gt;
		  foreach my $favLine (@favarray) {&lt;br /&gt;
			 $favLine =~ /^\[(.*)\]/;&lt;br /&gt;
		     $favList .= $favPrefix . $favno . &amp;quot;\t&amp;quot; . $1 . &amp;quot;\n&amp;quot;;&lt;br /&gt;
			 $favno++;&lt;br /&gt;
		  }&lt;br /&gt;
		  fhem(&amp;quot;set signalBot send $msgSender $favList&amp;quot;);&lt;br /&gt;
		  return;&lt;br /&gt;
	   } else {&lt;br /&gt;
	      # favoriten verarbeiten&lt;br /&gt;
	      $FhemCmd = $favarray[$favno-1];&lt;br /&gt;
	      # wenn ein Alias definiert ist, dann den Befehlsteil aus dem Favoriten extrahieren&lt;br /&gt;
	      if (index($FhemCmd, &amp;quot;=&amp;quot;) &amp;gt;= 0) {&lt;br /&gt;
		    $FhemCmd = substr($FhemCmd, index($FhemCmd, &amp;quot;=&amp;quot;)+1);&lt;br /&gt;
	      }&lt;br /&gt;
	      Log3(&amp;quot;ntf_signalBot&amp;quot;,3,&amp;quot;ntf_signalBot: FhemCmd after favorite substitution: $FhemCmd&amp;quot;);&lt;br /&gt;
	   }&lt;br /&gt;
&lt;br /&gt;
	   # prüfe auf authorsiertes Command (nur wenn Favoriten expandiert wurden, um doppelte Ausführung zu vermeiden&lt;br /&gt;
	   if ($cmdKeyword &amp;amp;&amp;amp; substr($FhemCmd, 0, length($cmdKeyword)) eq $cmdKeyword)  {&lt;br /&gt;
		  if ($msgAuth)  {&lt;br /&gt;
			 Log3(&amp;quot;ntf_signalBot&amp;quot;, 3, &amp;quot;ntf_signalBot: execute authenticated cmd&amp;quot;);&lt;br /&gt;
			 $FhemCmd = substr($FhemCmd, length($cmdKeyword));&lt;br /&gt;
			 $retval = fhem($FhemCmd);&lt;br /&gt;
			 if ($retval) {&lt;br /&gt;
			    fhem(&amp;quot;set signalBot send $msgSender $retval&amp;quot;);&lt;br /&gt;
			 }&lt;br /&gt;
		  } else {&lt;br /&gt;
			 # Hinweis auf nicht authorsiertes Command&lt;br /&gt;
			 fhem(&amp;quot;set signalBot send $msgSender You are not authorized to execute authenticated commands&amp;quot;);&lt;br /&gt;
		  }&lt;br /&gt;
	   }&lt;br /&gt;
	} else {&lt;br /&gt;
	   $FhemCmd = $msgText&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	# prüfe auf nicht authorsiertes Command&lt;br /&gt;
	if ($cmdKeywordNoAuth &amp;amp;&amp;amp; substr($FhemCmd, 0, length($cmdKeywordNoAuth)) eq $cmdKeywordNoAuth)  {&lt;br /&gt;
	   # prüfe patterns&lt;br /&gt;
       Log3(&amp;quot;ntf_signalBot&amp;quot;, 4, &amp;quot;ntf_signalBot: received non-authenticated cmd, checking patterns&amp;quot;);&lt;br /&gt;
	   @patternarray = split(&amp;quot;;&amp;quot;, AttrVal(&amp;quot;signalBot&amp;quot;, &amp;quot;cmdPatternNoAuth&amp;quot;, undef));&lt;br /&gt;
	   $FhemCmd = substr($FhemCmd, length($cmdKeywordNoAuth));&lt;br /&gt;
&lt;br /&gt;
	   my $res = 0;&lt;br /&gt;
	   foreach my $secLine (@patternarray) {&lt;br /&gt;
		 $res += eval &#039;$FhemCmd =~ /&#039; . $secLine . &#039;/&#039;;&lt;br /&gt;
	   }&lt;br /&gt;
	   if ($res &amp;gt; 0)  {&lt;br /&gt;
          Log3(&amp;quot;ntf_signalBot&amp;quot;, 3, &amp;quot;ntf_signalBot: execute non-authenticated cmd&amp;quot;);&lt;br /&gt;
	      $retval = fhem($FhemCmd);&lt;br /&gt;
		  if ($retval) {&lt;br /&gt;
		     fhem(&amp;quot;set signalBot send $msgSender $retval&amp;quot;);&lt;br /&gt;
		  }&lt;br /&gt;
	   } else {&lt;br /&gt;
          Log3(&amp;quot;ntf_signalBot&amp;quot;, 2, &amp;quot;ntf_signalBot: non-authenticated cmd execution requested, but no pattern match&amp;quot;);&lt;br /&gt;
	      fhem(&amp;quot;set signalBot send $msgSender You are not authorized to execute this command without authentication&amp;quot;);&lt;br /&gt;
	   }&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Die Konfiguration erfolgt mit den Attributen am Signal Device. Diese kann z. B. wie folgt aussehen:&lt;br /&gt;
&lt;br /&gt;
== Troubleshooting / FAQ ==&lt;br /&gt;
Anmerkung: Ich gehe hier davon aus, dass die Installation mit den im Script voreingestellten Pfaden/Users durchgeführt wurde. Änderungen auf eigene Gefahr.&lt;br /&gt;
&lt;br /&gt;
Bevor ich hier ein paar typische Probleme und Lösungen aus dem Foren Thread aufliste, bitte folgende Punkte sicherstellen:&lt;br /&gt;
# Ich verwende eine unterstütztes Betriebssystem (Raspbian oder Ubuntu) und CPU Architektur (armv7l oder x86)&lt;br /&gt;
# Ich habe das neuste Install Script aus dem ersten Post des Foren Threads verwendet&lt;br /&gt;
# Ich habe vor der Installation nach besten Wissen und Gewissen Reste einer vorherigen Installation (z.B. auch für SiSi) entfernt (das Repository kann weggesichert werden um eine erneute Registrierung zu vermeiden und dann statt dem Registrierungsschritt in /var/lib/signal-cli kopiert werden&lt;br /&gt;
# Ich habe das Install Script gemäß Anleitung vollständig durchlaufen lassen und auf Fehlermeldungen geachtet&lt;br /&gt;
&lt;br /&gt;
==== Wo finde ich Fehlermeldungen/Logfiles? ====&lt;br /&gt;
* Beim Install Script direkt in der Console - achte auf die Bildschirmausgabe&lt;br /&gt;
* Beim Install Script auch in &#039;&#039;/tmp/signal_install.log&#039;&#039; - ggf. wegsichern da es bei jedem Durchlauf wieder überschrieben wird.&lt;br /&gt;
* Fehler beim Starten und Betrieb des signal-cli service (normale Installation) in /var/log/syslog&lt;br /&gt;
* Fehler beim Betrieb in FHEM im normalen FHEM log (ggf. Signalbot mit verbose=5 definieren)&lt;br /&gt;
* Im Container, sofern die Daemons mit dem Install Script gestartet wurden, schreiben ihr log in /var/log/dbus.log bzw. signal.log und die Fehlerausgabe in /var/log/dbus.err bzw. signal.err&lt;br /&gt;
&lt;br /&gt;
==== Probleme bei normaler Installation ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+&lt;br /&gt;
!Fehler&lt;br /&gt;
!Lösungsansatz&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;In FHEM:&#039;&#039;&#039;&lt;br /&gt;
Error sending message:org.asamk.Signal.Error.Failure: org.whispersystems.signalservice.api.push.exceptions.NotFoundException: Not found&lt;br /&gt;
|signal-cli läuft nicht.&lt;br /&gt;
Prüfe ggf. &#039;&#039;&#039;/var/log/syslog&#039;&#039;&#039; für weitere Fehlermeldungen.&lt;br /&gt;
&lt;br /&gt;
Führe &#039;&#039;&#039;sudo service signal start&#039;&#039;&#039; aus.&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;Bei Starten von signal-cli:&#039;&#039;&#039;&lt;br /&gt;
OpenJDK Server VM warning: You have loaded library /tmp/resource17792002454964883349.so which might have disabled stack guard. The VM will try to fix the stack guard now.&lt;br /&gt;
&lt;br /&gt;
It&#039;s highly recommended that you fix the library with &#039;execstack -c &amp;lt;libfile&amp;gt;&#039;, or link it with &#039;-z noexecstack&#039;.&lt;br /&gt;
&lt;br /&gt;
oder&lt;br /&gt;
&lt;br /&gt;
ERROR App - Missing required native library dependency: libsignal-client&lt;br /&gt;
&lt;br /&gt;
oder&lt;br /&gt;
&lt;br /&gt;
Support for new group V2 is disabled, because the required native library dependency is missing: libzkgroup&lt;br /&gt;
|Passiert üblicherweise auf dem &#039;&#039;&#039;Raspberry pi.&#039;&#039;&#039; Die Standard Distribution von signal-cli enthält eine x86 library libzkgroup.so und libsignal_jni.so, die mit armv7l nicht kompatibel ist, welche im jar &#039;&#039;zkgroup-java-*.jar&#039;&#039; bzw. signal-client-java-*.jar enthalten sind. Das Install Script entfernt diese und ersetzt sie durch armv7l libraries die vom Signalbot Maintainer auf svn.fhem.de zur Verfügung gestellt werden.&lt;br /&gt;
Irgendwo auf dem System vorhandene alte Versionen können aber versehentlich erwischt werden und diese Fehler produzieren. Als ersten Schritt mit&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;sudo rm -rf /opt/signal&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
die alte Installation komplett löschen (enthält keine Konfigurationen) und vom Install Script neu erstellen lassen (einfach wie oben beschrieben starten).&lt;br /&gt;
&lt;br /&gt;
Weitere Tests wenn der Fehler nicht behoben ist:&lt;br /&gt;
# Welche Library wird vom System verwendet: &#039;&#039;sudo ldconfig -v | grep libzkgroup.so&#039;&#039; beziehungsweise &#039;&#039;sudo ldconfig -v | grep libsignal_jni.so&#039;&#039; . Da die libraries in .jar files eingebettet sind, darf hier keine gefunden werden.&lt;br /&gt;
# Check gibt es irgendwo noch eine andere lib.so  &amp;lt;code&amp;gt;sudo find / -name libzkgroup.so 2&amp;gt;/dev/null&amp;lt;/code&amp;gt;  Wenn ja, sicherstellen, dass diese nicht genommen wird (löschen, umbenennen)&lt;br /&gt;
# Check gibt es noch irgendwo ein anderes jar  &amp;lt;code&amp;gt;sudo find / -name zkgroup-java-*.jar 2&amp;gt;/dev/null&amp;lt;/code&amp;gt;  Wenn ja, sicherstellen, dass diese nicht genommen wird (löschen, umbenennen)&lt;br /&gt;
# (für den zweiten Fehler, die Schritte 2 und 3 mit libsignal_jni.so bzw. signal-client-java-*.jar durchführen&lt;br /&gt;
|-&lt;br /&gt;
|Ich kann an Einzelempfänger senden und empfangen, aber nicht an Gruppen versenden&lt;br /&gt;
|Du hast wahrscheinlich den vorhergehenden Fehler (libzkgroup) irgendwo, aber er ist dir nicht aufgefallen. Vorgehensweise wie oben.&lt;br /&gt;
|-&lt;br /&gt;
|Ich kann keiner Gruppe beitreten und/oder nichts an eine Gruppe schicken.&lt;br /&gt;
oder&lt;br /&gt;
&lt;br /&gt;
Error in invite:org.asamk.Signal.Error.Failure: Cannot join a V2 group as self does not have a versioned profile&lt;br /&gt;
|Die neuen V2 Gruppen benötigen zwingend einen Profil Namen. Sofern also nach der Registrierung keiner gesetzt wurde, kann man keine Gruppen verwenden.&lt;br /&gt;
Abhilfe:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;sudo -E ./signal_install.sh name&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
um einen Namen (und optional ein Avatarbild) festzulegen.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Probleme bei Installation im Container ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+&lt;br /&gt;
!Fehler&lt;br /&gt;
!Lösungsansatz&lt;br /&gt;
|-&lt;br /&gt;
|org.freedesktop.DBus.Error.Spawn.FileInvalid: Cannot do system-bus activation with no user&lt;br /&gt;
|Prüfe Datei &#039;&#039;/usr/share/dbus-1/system-services/org.asamk.Signal.service&#039;&#039; ob es einen Eintrag&lt;br /&gt;
&#039;&#039;&#039;User=signal-cli&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
gibt&lt;br /&gt;
|-&lt;br /&gt;
|Signal: Error while initializing Dbus:org.freedesktop.DBus.Error.Disconnected: Connection is closed&lt;br /&gt;
|DBus daemon oder signal-cli daemon laufen nicht. Mit dem Installscript als root&lt;br /&gt;
&#039;&#039;&#039;./signal_install.sh start&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
nachstarten.&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
* Thread {{Link2Forum|Topic=118370|LinkText=Neues Modul: Signalbot}}&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Messenger]]&lt;/div&gt;</summary>
		<author><name>Weini</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=HM-LC-Bl1PBU-FM_Funk-Rollladenaktor_f%C3%BCr_Markenschalter&amp;diff=15529</id>
		<title>HM-LC-Bl1PBU-FM Funk-Rollladenaktor für Markenschalter</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=HM-LC-Bl1PBU-FM_Funk-Rollladenaktor_f%C3%BCr_Markenschalter&amp;diff=15529"/>
		<updated>2016-06-06T20:58:39Z</updated>

		<summary type="html">&lt;p&gt;Weini: Tasterverhalten: neue Variante mit Templates ergänzt&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Infobox Hardware&lt;br /&gt;
|Bild=HM-LC-Bl1PBU-FM.jpg&lt;br /&gt;
|Bildbeschreibung=HM-LC-Bl1PBU-FM montiert, ohne Adapter&lt;br /&gt;
|HWProtocol=BidCoS ([[HomeMatic]])&lt;br /&gt;
|HWType=[[HomeMatic Type Blind|Blind]]&lt;br /&gt;
|HWCategory=[[:Kategorie:Rollladensteuerung|Rollladensteuerung]]&lt;br /&gt;
|HWComm=868,3&amp;amp;nbsp;MHz&lt;br /&gt;
|HWChannels=1&lt;br /&gt;
|HWVoltage=230&amp;amp;nbsp;V&lt;br /&gt;
|HWPowerConsumption=0,5&amp;amp;nbsp;W (Stand-by)&lt;br /&gt;
|HWPoweredBy=Netz&lt;br /&gt;
|HWSize=71x71x37 mm&lt;br /&gt;
|HWDeviceFHEM=[[CUL_HM]]&lt;br /&gt;
|HWManufacturer=ELV / eQ-3&lt;br /&gt;
}}&lt;br /&gt;
== Features ==&lt;br /&gt;
&lt;br /&gt;
Schalten eines angeschlossenen Jalousiemotors mittels CUL/CUN/HMLAN Konfigurator und über lokalen, in bestehendes Schalterprogramm integrierte Schaltwippe.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Technische Daten:&#039;&#039;&#039;&lt;br /&gt;
* Gerätebezeichnung: HM-LC-Bl1PBU-FM&lt;br /&gt;
* Versorgungsspannung: 230 V / 50 Hz&lt;br /&gt;
* Maximale Schaltleistung: 230 VA (Motorlast)&lt;br /&gt;
* Standby-Verbrauch: 0,5 W&lt;br /&gt;
* Schaltvermögen: 1 A (Motorlast)&lt;br /&gt;
* Funkfrequenz: 868,3 MHz&lt;br /&gt;
* Empfängerklasse: SRD Class 2&lt;br /&gt;
* Maximale Sendeleistung: 10 mW&lt;br /&gt;
* Schutzart: IP20&lt;br /&gt;
* Schutzklasse: II&lt;br /&gt;
* Umgebungstemperatur: +5°C bis +35°C&lt;br /&gt;
* Abmessungen (B x H x T): 71 x 71 x 37 mm&lt;br /&gt;
* Gewicht: 43 g&lt;br /&gt;
&lt;br /&gt;
== Hinweise zur Hardware-Installation ==&lt;br /&gt;
&lt;br /&gt;
Der Schaltaktor ersetzt den Unterputzschalter der bestehenden Elektroinstallation. Arbeiten am 230 V Netz dürfen nur von einer Elektrofachkraft durchgeführt werden! Sicherheitsregeln anwenden:&lt;br /&gt;
&lt;br /&gt;
* Freischalten (Sicherung abschalten),&lt;br /&gt;
* gegen Wiedereinschalten sichern,&lt;br /&gt;
* Spannungsfreiheit feststellen, (Messgerät vor und &#039;&#039;&#039;nach&#039;&#039;&#039; Messung auf Funktion überprüfen)&lt;br /&gt;
* Erden und Kurzschließen,&lt;br /&gt;
* benachbarte, unter Spannung stehende Teile abdecken.&lt;br /&gt;
&lt;br /&gt;
Zur Integration in ein bestehendes Schalterprogramm bitte den entsprechenden Adapter mit bestellen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
Datei:HM-LC-BL1PBU schritt 01.jpg|Ausgangssituation&lt;br /&gt;
Datei:HM-LC-BL1PBU schritt 02.jpg|Schalter abbauen, Rahmen entfernen, Unterputzschalter lösen&lt;br /&gt;
Datei:HM-LC-BL1PBU schritt 03.jpg|Bestehender Anschluss&lt;br /&gt;
Datei:HM-LC-BL1PBU schritt 04.jpg|Neuer Anschluss. Achtung: zusätzlicher Nullleiteranschluss!&lt;br /&gt;
Datei:HM-LC-BL1PBU schritt 05.jpg|Einbau ohne Adapter&lt;br /&gt;
Datei:HM-LC-BL1PBU schritt 06.jpg|Adapter aufsetzen&lt;br /&gt;
Datei:HM-LC-BL1PBU schritt 07.jpg|Fertig eingebauter HM-LC-BL1PBU-FM&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Hinweise zum Betrieb mit FHEM ==&lt;br /&gt;
&lt;br /&gt;
Der Schalter wird seit FHEM 5.3 unterstützt. Das [[Pairing (HomeMatic)|Pairing]] sollte wie in [[HomeMatic Devices pairen]] beschrieben durchgeführt werden. Dazu wird der Config-Taster kurz gedrückt.&lt;br /&gt;
Zur Darstellung im Webfrontend siehe [[Slider für HM-Rolladensteuerung anzeigen]].&lt;br /&gt;
&lt;br /&gt;
=== FHEM Config-Auszug ===&lt;br /&gt;
Ein exemplarischer Auszug aus der fhem.cfg:&lt;br /&gt;
&lt;br /&gt;
 define WZ_Rollo_Links CUL_HM ABCDEF&lt;br /&gt;
 attr WZ_Rollo_Links devInfo 010100&lt;br /&gt;
 attr WZ_Rollo_Links eventMap on:hoch off:runter stop:stop&lt;br /&gt;
 attr WZ_Rollo_Links firmware 2.1&lt;br /&gt;
 attr WZ_Rollo_Links hmClass receiver&lt;br /&gt;
 attr WZ_Rollo_Links model HM-LC-Bl1PBU-FM&lt;br /&gt;
 attr WZ_Rollo_Links room Wohnzimmer&lt;br /&gt;
 attr WZ_Rollo_Links serialNr JEQxxxxxxx&lt;br /&gt;
 attr WZ_Rollo_Links subType blindActuator&lt;br /&gt;
 attr WZ_Rollo_Links webCmd pct&lt;br /&gt;
&lt;br /&gt;
=== Variablen===&lt;br /&gt;
==== Attribute====&lt;br /&gt;
Dem Device können neben den Allgemeinen auch spezielle Attribute gesetzt werden. &lt;br /&gt;
* &#039;&#039;&#039;param levelInverse&#039;&#039;&#039;: HM Blind Aktoren stehen auf 100% wenn sie offen sind und auf 0% wenn sie geschlossen sind. Das ist oftmals nicht intuitiv. In FHEM kann man dies &amp;quot;drehen&amp;quot; durch dieses Attribut. Damit dreht sich auch die Bedeutung von On und Off.&lt;br /&gt;
&lt;br /&gt;
Desweiteren empfehlen sich die üblichen Homematic Attribute (wie autoReadReg, event-on-change-reading, expert) zu setzten. Weitere Informationen dazu unter [[HomeMatic#Attribute]]&lt;br /&gt;
&lt;br /&gt;
==== Readings====&lt;br /&gt;
*&#039;&#039;&#039;level&#039;&#039;&#039; numerischer Wert der den Stand des Rollo wiedergibt. Achtung: Der Aktor kennt nicht den Stand des Rollos sondern errechnet diesen aus den Fahrzeiten. Nach einem powerUp wird ein Stand von 50% angenommen. &lt;br /&gt;
*&#039;&#039;&#039;motor&#039;&#039;&#039;: zeigt den Zustand des Motors an, ob er steht oder in welche Richtung er fährt&lt;br /&gt;
*&#039;&#039;&#039;pct&#039;&#039;&#039;: analog &amp;quot;level&amp;quot;&lt;br /&gt;
&lt;br /&gt;
== Konfiguration==&lt;br /&gt;
Die Konfiguration des Devices betrifft Register und Peerings. Dies sind Werte, die zwar über FHEM gesetzt werden, aber im Device im Flash gespeichert werden.&lt;br /&gt;
Man kann die Devices mit Sensoren und Tastern &amp;lt;u&amp;gt;[[Homematic_Peering_Beispiele|peeren]]&amp;lt;/u&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Fahrzeiten kalibrieren===&lt;br /&gt;
Um die Jalousie mit Prozentangaben auf eine bestimmte Position fahren zu lassen, muss der Aktor die Fahrtzeiten kennen um daraus die relativen Positionen erechnen zu können. Dazu müssen 3 Werte manuell mit einer Stoppuhr gemessen werden.&lt;br /&gt;
&lt;br /&gt;
* Fahrtzeit nach oben&lt;br /&gt;
* Fahrtzeit nach unten (ist meistens identisch mit der Fahrzeit nach oben bei herkömlichen Jalousiemotoren)&lt;br /&gt;
* Wechsel der Fahrtrichtung&lt;br /&gt;
&lt;br /&gt;
Diese 3 Zeiten werden in Sekunden gemessen und anschließend einmalig mit den folgenden Befehlen eingestellt: &lt;br /&gt;
 set &amp;lt;name&amp;gt; regSet driveUp 27.0              # Fahrtzeit nach oben in Sekunden&lt;br /&gt;
 set &amp;lt;name&amp;gt; regSet driveDown 27.0            # Fahrtzeit nach unten in Sekunden&lt;br /&gt;
 set &amp;lt;name&amp;gt; regSet driveTurn 0.5             # Die Zeit die gebraucht wird um die Fahrtrichtung zu wechseln in Sekunden&lt;br /&gt;
&lt;br /&gt;
=== Tasterverhalten ===&lt;br /&gt;
Um den fahrenden Rollladen bei jedem Tastendruck anzuhalten und nicht nur bei Druck auf die entgegengesetzte Richtung:&lt;br /&gt;
&lt;br /&gt;
* Die internen Taster sichtbar schalten und die config abfragen&lt;br /&gt;
 set &amp;lt;device&amp;gt; regSet intKeyVisib visib&lt;br /&gt;
 set &amp;lt;device&amp;gt; getConfig&lt;br /&gt;
&lt;br /&gt;
* Die Taster konfigurieren (alte Variante via Register)&lt;br /&gt;
 set &amp;lt;device&amp;gt; regBulk RegL_03:self01 0B:94 0D:63 8B:94&lt;br /&gt;
 set &amp;lt;device&amp;gt; regBulk RegL_03:self02 0B:18 0D:63 8B:18&lt;br /&gt;
&lt;br /&gt;
* Die Taster konfigurieren (neue Variante via Template, dazu muss ein [[HomeMatic_HMInfo]] Device anglegt sein)&lt;br /&gt;
 set &amp;lt;HMinfo&amp;gt; templateSet &amp;lt;device&amp;gt; BlStopUpSh self02:short&lt;br /&gt;
 set &amp;lt;HMinfo&amp;gt; templateSet &amp;lt;device&amp;gt; BlStopDnSh self01:short&lt;br /&gt;
 set &amp;lt;device&amp;gt; getConfig&lt;br /&gt;
&lt;br /&gt;
* Die internen Taster unsichtbar schalten und die config überprüfen&lt;br /&gt;
 set &amp;lt;device&amp;gt; regSet intKeyVisib invisib&lt;br /&gt;
 set &amp;lt;device&amp;gt; getConfig&lt;br /&gt;
&lt;br /&gt;
Wichtig: bei der alten Variante nach jedem Schritt jeweils die Anlern-Taste drücken und in den Internals schauen ob die kommandos ohne Fehler abgearbeitet wurden.&lt;br /&gt;
&lt;br /&gt;
== Mögliche Schaltoperationen ==&lt;br /&gt;
&lt;br /&gt;
Der Aktor versteht folgende Befehle:&lt;br /&gt;
 set &amp;lt;name&amp;gt; on -&amp;gt; Schaltet den Aktor ein&lt;br /&gt;
 set &amp;lt;name&amp;gt; off -&amp;gt; Schaltet den Aktor aus&lt;br /&gt;
 set &amp;lt;name&amp;gt; toggle -&amp;gt; Ändert den logischen Zustand des Aktors.&lt;br /&gt;
 set &amp;lt;name&amp;gt; &amp;lt;Prozentangabe[0 bis 100]&amp;gt; -&amp;gt; Öffnet die Jalousie auf absolut prozentuale Öffnungsposition, berechnet aus definierter Laufzeit. &lt;br /&gt;
 set &amp;lt;name&amp;gt; up/down &amp;lt;Prozentangabe[0 bis 100]&amp;gt; -&amp;gt; Öffnet oder schließt die Jalousie um den prozentualen Wert, berechnet aus definierter Laufzeit. Keine Angabe =&amp;gt; 10% &lt;br /&gt;
&lt;br /&gt;
== Log-Auszug ==&lt;br /&gt;
In FHEM ist nach dem Schalten des HM-LC-BL1-FM folgendes Log zu sehen:&lt;br /&gt;
 2013.02.26 07:00:12 2: CUL_HM set WZ_Rollo_Rechts on rxt:1&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
* [http://www.elv-downloads.de/Assets/Produkte/10/1030/103038/Downloads/103038_FunkRollladenaktor_um.pdf Bedienungsanleitung (PDF)]&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:HomeMatic Components]]&lt;br /&gt;
[[Kategorie:HomeMatic Type Blind]]&lt;br /&gt;
[[Kategorie:Rollladensteuerung]]&lt;/div&gt;</summary>
		<author><name>Weini</name></author>
	</entry>
</feed>