Mit Pushover kann man sich Push-Benachrichtigungen auf seinen Smartphone schicken. Dies geschieht leider nur ein eine Richtung. Möchte man auch selber Nachrichten an FHEM senden, ist man auf andere Möglichkeiten angewiesen. In diesem Beitrag erkläre ich euch, wie ihr mit dem Chat-Client „Telegram“ (App-Store, Play-Store, Windows-Store) Nachrichten und somit auch Befehle an eure FHEM-Installation sendet.
Telegram ist ein Instant-Messaging Dienst der ähnlich wie WhatsApp verwendet werden kann. Er kann auf Smartphones, Tablets und PCs verwendet werden. Es lassen sich Nachrichten empfangen und senden.
Contents
Telegram auf Smartphone installieren
Um Nachrichten Empfangen und Senden zu können, ist es nötig, dass die Applikation „Telegram Messenger“ auf ein Endgerät installiert ist. Natürlich besteht auch die Möglichkeit die Webanwendung zu benutzen https://web.telegram.org/#/login. Mehr Infos auf der offiziellen Homepage.
Nachdem starten der Applikation muss ein Chat mit @BotFather gestartet werden. Dies ist ein Chatroboter mit dem sich neue Clienten (Chatbots) einrichten lassen. Dies ist nötig, da FHEM später als solcher fungiert.
Der Chatbot @BotFather wird mit Kurzbefehlen gesteuert. Eine List der verfügbaren Befehle erhält nach dem Tippen auf Start.
Mit dem Befehl „/newbot“ lässt sich nun ein neuer Bot einrichten
Es wird nach einem Namen gefragt. Dieser kann frei gewählt werden. Es ist der Name, der später als Absender der Nachrichten angezeigt wird. In diesem Fall habe ich ihn FHEM genannt.
Anschließend wird nach dem „username“ gefragt. Dieser kann auch frei gewählt werden. Voraussetzung ist jedoch, dass er einmalig ist und auf „bot“ endet. Für diesen Beitrag habe ich mich für „FHEMwaschto_bot“ entschieden.
Wurde der Bot erfolgreich angelegt erhält man eine Nachricht mit einem Access-Token. Dieser wird benötigt, damit FHEM später über diesen Bot Nachrichten senden kann.
Dieser „Token“ sollte gut und sicher aufbewahrt werden. Er ist das Einzige was den Bot gegenüber unbefugtem Benutzen absichert. Der zu Testzwecken angelegter Bot hat folgenden Token:
221475141:AAHmYaE17_z9rigdo8y-EMG0Q-I4AfPSXTs
Dieser wird zum definieren innerhalb von FHEM benötigt. Aber dazu später mehr.
Möchte man, dass der Bot später auch Nachrichten innerhalb Gruppen verarbeiten kann, ist ein weitere Einstellung nötig. Diese kann ebenfalls über den BotFather vorgenommen werden.
Mit dem Befehl „/setprivacy“ lassen sich die Gruppen-Einstellungen ändern. Es wird nach dem Usernamen des gewünschten Bots gefragt. In diesem Fall „@FHEMwaschto_bot“. Über die Eingabe von „Enable“ bzw. „Disable“ lassen sich die Gruppennachrichten aktivieren, bzw. deaktivieren. Der BotFather lässt sich auch über die eingeblendeten Buttons steuern.
Der Bot wurde nun erfolgreich eingerichtet und die Mindestkonfiguration wurde vorgenommen. Über den BotFather lassen sich natürlich noch weitere Einstellungen vornehmen. Wie zum Beispiel das Profilfoto des erstellten Chatbots. Einfach mal die verfügbaren Befehle anschauen.
Einrichtung unter FHEM
Unter FHEM definiert man sich mit dem oben erhaltenen Token ein Device. Hier kommt das Modul TelegramBot zum Einsatz.
define Telegram TelegramBot 221475141:AAHmYaE17_z9rigdo8y-EMG0Q-I4AfPSXTs
Der Name „Telegram“ kann frei gewählt werden.
Damit der TelegramBot nun auch Nachrichten empfangen kann, ist das Einstellen eines Timeouts größer 0 notwendig. Die Zeitangabe erfolgt hier in Sekunden.
attr Telegram pollingTimeout 180
Damit der Chatbot eingehende Nachrichten als ein FHEM-Befehl identifiziert, muss ein „Geheimwort“ festgelegt werden. Dies geschieht über das Attribut cmdKeyword.
attr Telegram cmdKeyword FHEM
Anschließend kann man die erste Testnachricht an FHEM senden. Dazu über die App den eingerichteten Bot suchen. Nach dem der Bot durch drücken von „Start“ gestartet wurde öffnet sich der Chat.
Mit dem Keyword und dem gewünschten Befehl lassen sich nun seine FHEM-Geräte steuern. Zum Beispiel
FHEM set WZ_Papierlampe off
Als Reading erhält man nun die Daten des abgesendeten Befehls.
Wichtig ist hier das Reading „Contacts“. Dieses Reading gibt die Kontaktdaten des Absenders an.
Gegen unbefugten Zugriff absichern
Nur dieser Kontakt soll Befehle an FHEM senden dürfen. Damit andere Kontakte gesperrt werden, sollte das Attribut „allowUnknownContacts“ auf 0 gesetzt werden.
attr Telegram allowUnknownContacts 0
Dies bewirkt, dass nur noch Befehle von bekannten Kontakten verarbeitet werden. Dadurch, dass zuvor eine Nachricht an FHEM gesendet wurde, ist der Kontakt des Absenders dem Telegram-Modul bereits bekannt.
Eine weitere Absicherung kann mit dem Attribut „cmdRestrictedPeer“ erreicht werden. Hier lassen sich IDs angeben, von der Befehle verarbeitet werden. Durch das Reading „Contacts“ erhält man diese ID.
attr Telegram cmdRestrictedPeer 228427286
Hier sollten auch wirklich nur die IDS verwendet werden, da Benutzernamen frei vergeben werden können und somit nicht eindeutig sind.
Kurzbefehle für ein schnelleres Bedienen
Damit man nicht immer den kompletten Befehl samt „Geheimwort“ eingeben muss, gibt es die Möglichkeit sogenannte Kurzbefehle zu setzen. Dies geschieht über das Attribut „Favorites“
attr Telegram favorites [Papierlampe]=set WZ_Papierlampe toggle
Weitere Kurzbefehle können durch ein ; getrennt werden.
Diese eingetragenen Favoriten werden nun fortlaufend nummeriert. Bevor man diese jedoch verwenden kann, muss noch ein Wort für die Kurzbefehle eingerichtet werden. Dies geschieht über „cmdFavorites“.
attr Telegram cmdFavorites /cmd
Dieser Kurzbefehl kann frei gewählt werden. Es sollte jedoch ein Wort sein, welches nicht im normalen Sprachgebrauch verwendet wird. Um sich zusätzlich gegen ein ungewolltes Verwenden zu schützen, kann man ein Sonderzeichen verwenden. Wie hier der Fall „/cmd“. Der Schrägstrich hat zusätzlich noch den Vorteil, dass sich der Befehl im Chatverlauf der App antippen lässt und sich der Befehl so widerholt senden lässt.
Über den Chat lassen sich nun diese über /cmd1 bzw. /cmd2 usw. auswählen. Ein senden ohne Nummer „/cmd“ gibt eine Auswahl der vorhandenen Kurzbefehle zurück.
Die Kurzbefehle lassen sich aber noch einfacher aufrufen. Rechts neben dem Eingabefeld befindet sich ein Shortcut zu den Kurzbefehlen.
(Update 11.10.16) HINWEIS: Sollte das Shortcut zu den Kurzbefehlen nicht angezeigt werden, dann hilft es, kurz das „Favoriten-Wort“ zu senden. In diesem Fall „/cmd“. Danach sollte das Shortcut angezeigt werden.
Ab sofort lassen sich über die App alle FHEM-Befehle ausführen. Dazu einfach das ausgesuchte „Geheimwort“ und den gewünschten Befehl über den ChatBot an FHEM senden.
Für häufig gebrauchte Befehle lohnt es sich Kurzbefehle anzulegen.
Anwendungsbeispiele
Menüstruktur für ein einfaches Steuern
Das Steuern über Telegram ist zwar schon ganz schön praktisch, jedoch muss man dafür die FHEM-Befehle und den Namen der gewünschten Devices kennen. Für weitere Personen im Haushalt also eher unvorteilhaft.
Der FHEM-Forum-Benutzer „tiroso“ hat dafür eine elegante Lösung entwickelt. Über ein notify wird die empfangene Nachricht an ein Skript geleitet, welches dann entsprechende Wege einleitet. Gleichzeitig hat er eine Menüstruktur aufgebaut, mit der sich FHEM leicht steuern lässt.
In seinem Forums-Beitrag dazu hat er einen Ausschnitt seines Skriptes hochgeladen. Die perfekte Inspiration für sein eigenes Skript.
Status von Devices abrufen
Neben dem Schalten ist es natürlich auch möglich diverse Infos von Devices abzufragen. Dazu erstellt man sich einfach eine kleine Routine, welche je nach empfangende Nachricht die entsprechende Aktion ausführt bzw. die gewünschte Information zurückliefert.
Zu erst erstellt man sich ein Notify, welches bei einer eingegangenen Nachricht, diese an die Routine weitergibt.
define TelegramNotify Notify Telegram:msgText:.* { Telegram("Telegram","msgText")}
Der Routine gibt man bei einer ankommenden Nachricht den Namen des Telegram-Devices mit („Telegram“) und das Reading, welches die empfangende Nachricht enthält („msgText“). Die Routine „Telegram“ erstellt man nun in der Datei „99_myUtils.pm“, welche über den Menü-Punkt „Edit files“ erreicht werden kann.
Um zum Beispiel den aktuellen Leistungsverbrauch einer Steckdose zu bekommen, könnte die Routine wie folgt aussehen:
sub Telegram($$) { my ($TelegramDevice, $msgText) = @_; my $Nachricht = ReadingsVal($TelegramDevice,$msgText,"0"); my @array = split(/ /,$Nachricht); if(@array[0] eq "Verbrauch") { my $Verbrauch = ReadingsVal("WZ_Stehlampe","power",0); fhem("set $TelegramDevice message Verbrauch der Stehlampe: $Verbrauch W"); } }
Die eingehende Nachricht wird in der Routine in die einzelnen Wörter gesplittet („split…“). Dies ermöglicht somit auf jedes Wort der Nachricht getrennt einzugehen.
Das obige Beispiel reagiert nun auf die Nachricht „Verbrauch“ und gibt den aktuellen Verbrauch des Devices „WZ_Stehlampe“ zurück.
Dank dem Splitten der Nachricht, kann man die Abrage jedoch auch etwas flexibler gestallten. Möchte man zum Beispiel ein anderes Gerät abfragen, so kann man dies bereits in der Nachricht angeben.
Zum Beispiel: „Reading power WZ_TV“. Die Routine kann dann wie folgt aussehen:
sub Telegram($$) { my ($TelegramDevice, $msgText) = @_; my $Nachricht = ReadingsVal($TelegramDevice,$msgText,"0"); my @array = split(/ /,$Nachricht); if(@array[0] eq "Reading") { my $Reading = ReadingsVal("@array[2]","@array[1]",0); fhem("set $TelegramDevice message $array[1] von $array[2]: $Reading"); } }
Im Array an der Stell 0 befindet sich nun das Steuerwort „Reading“. An der Stelle 1 befindet sich das gewünschte Reading, in diesem Fall das Reading „power“. Das gewünschte Device befindet sich an der Stelle 2 – WZ_TV.
Somit lässt sich jedes Reading von einem beliebigen Device auslesen.
Die Routine und die benötigten „Steuerwörter“ lassen sich natürlich je nach Wunsch anpassen. Aber ich hoffe ich konnte euch die Vorgehensweise etwas näher bringen.
SVG-Plots senden
Der Telegram-Client kann natürlich auch Bilder senden und empfangen. Da liegt es doch nahe, dass man sich die SVG-Plots auf sein Handy schicken lässt.
Dazu sind noch einige Pakete nötig, die auf den Raspberry installiert werden müssen:
sudo apt-get install libimage-librsvg-perl sudo apt-get install libgd-graph-perl sudo apt-get install libgd-text-perl
Über ein Perl-Befehl lassen sich nun SVG-Plots versenden:
set Telegram cmdSend {plotAsPng("SVG_DbLog_12")}
Entweder man baut diesen Befehl in sein Menü-Skript (siehe Menüstruktur) oder man erstellt sich ein einfaches Notify welches auf eine bestimmte Nachricht reagiert:
define TelegramSVGsend notify Telegram:msgText:./SVG set Telegram cmdSend {plotAsPng("SVG_DbLog_12")}
Sobald die Nachricht „/SVG“ eingeht, wird der SVG-Plot mit dem Namen „SVG_Wohnzimmer“ an das Gerät mit der ID „228427286“ gesendet.
Ich hoffe ich konnte euch den TelegramBot etwas näher bringen und euer Interesse dafür wecken. Bei Fragen einfach die Kommentarfunktion nutzen oder ins FHEM-Forum vorbei schauen.
Hi,
ich hab das gem. Deinem Tutorial eingerichtet. Funktioniert auch alles soweit, nachrichten empfangen und senden geht.
Ich habe jedoch im EventMonitor andauern folgende Meldungen:
2016-08-05 16:37:59 TelegramBot Telegram PollingLastError: NonBlockingGet timed out on read from after 245s
2016-08-05 16:37:59 TelegramBot Telegram PollingErrCount: 533
Weist Du was da los ist?
gruß
Stefan
genau das gleiche Problem habe ich auch. Gibt es eine Lösung, den Fehler NICHT zu loggen?
Danke und Gruß
Hallo Jörg,
ich habe schon versucht diesen Fehler irgendwie zu rekonstruieren, leider ohne Erfolg. Was ich eventuell die Fehlermeldungen unterbindet ist das Attribut „verbose“ (FHEM-Wiki). Damit lässt sich einstellen, welche Meldungen alle geloggt werden sollen. Dies würde jedoch nur die Fehler-Meldung unterdrücken, leider nichts am Problem selber verbessern. Aber wenn Telegram sonst funktioniert ist das ja erstmal eine Lösung.
Gruß Daniel
Probierts mal mit
attr myTelegramBot utf8Special 1
Gruss Marc
smarthome.family.blog
Hallo zusammen,
zuerst mal ein Lob für die Anleitung, echt super.
Nun zu meinem Problem, ich bekomme inn der App leider neben dem Eingabefeld keine Shortcuts angezeigt. Was muss ich da noch machen, damit das Feld angezeigt wird?
Bitte um Hilfe.
Danke.
Mit freundlichen Grüßen
JoeWanne
Hallo JoeWanne,
ich habe meinen Bot nochmal gelöscht und einen neuen eingerichtet. Hatte dann genau das gleich Problem wie du. Es wurden keine Shortcuts angezeigt. Geholfen hat es, einmal das Befehlswort zu senden, welches über das Attribut „attr Telegram cmdFavorites /cmd“ hinzugefügt wurde. Nachdem ich dann „/cmd“ gesendet haben, wurden mi die Shortcuts angezeigt und seit dem dann auch das Shortcut neben der Tastatur.
Hoffe der Tipp hilft bei dir auch.
Gruß Daniel
Hallo Daniel,
danke für die schnelle Antwort, genauu das war es.
Nun bekomme ich es angezeigt.
Liebe Grüße
JoeWanne
Hallo Daniel,
bei mir kommt im FHEM die Meldung:
Cannot load Module TelegramBot
Wie kann ich das Modul laden?
Gruß
Lutz
Hallo Lutz,
normalerweise ist das benötigte Modul bereits standardmäßig installieren. Sonst einfach mal mit dem Befehl „update“ die FHEM-Installation updaten. Ansonsten lässt sich die Modul-Datei (50_TelegramBot.pm) hier downloaden:
https://github.com/viegener/Telegram-fhem
Die Datei dann einfach in das Modul-Verzeichnis von FHEM kopieren „opt/fhem/FHEM“ und FHEM anschließend neu starten.
Gruß Daniel
Hallo Daniel,
ich habe FHEM auf einem QNAP T212 installiert und wollte nun ebenso den TelegramBot nutzen.
Ich erhalte auch die Meldung „cannot load Mdule TelegramBot“ und bin nun recht ratlos.
Ich habe sowohl erst „update“ gemacht (daraufhin wurden so ziemlich alle Module geladen) dann neustart und dennoch kam die Meldung. Im Netz war noch die Angabe man solle JSON nachinstallierten. Das habe ich per OPKG auch gemacht. Die Meldung war immer noch da.
Demnach habe ich explizit die .pm-Datei in den Order /opt/bin/fhem/ kopiert.
Von hier aus wird bei mir fhem gestartet.
Im Endeffekt ist die Meldung immer noch vorhanden. Was habe ich denn übersehen?!
ps. ich hatte nach dem kopieren nochmal fhem per shutdown restart neugestartet gehabt.
Viele Grüße
André
Hallo André,


ich kenne mich jetzt nicht mit dem QNAP aus, aber eigentlich müsste es ja klappen, wenn das Modul („50_TelegramBot.pm“) im richtigen Ordner abgelegt wurde.
Was vielleicht sein kann ist, dass FHEM keine Rechte hat um auf diese Datei zugreifen zu dürfen. Vielleicht überprüfst du das mal.
Bei meiner FHEM-Installation hatte jede pm-Datei als Besitzer den Benutzer „fhem“ und die Gruppe „dialout“ und darf auch von anderen gelesen und verändert werden.
Vllt hat bei dir FHEM keine Rechte auf die Datei. Eine weitere Möglichkeit ist das Neuladen des Moduls. Aber eigentlich geschieht dies ja auch bei einem Neustart von FHEM:
reload 50_TelegramBot.pm
Des Weiteren sieht es so aus, dass du die pm-Datei falsch kopiert hast. Normalerweise befinden sich die Module im fhem-Installationsordner noch im Unterordner FHEM. In meinem Fall:
/opt/fhem/FHEM
Gruß Daniel
Danke für dieses Tutorial! Hat auf anhieb geklappt. Einzig „attr defaultPeer“ musste mit der ID gesetzt werden, sonst gab es Fehler. Bin sehr begeistert, kein Vergleich zum PushNotifier
Klappt, geile Sache, vielen Dank!
Hallo,
vielen Dank für die tolle Anleitung! Bei mir funktioniert das alles soweit auch gut. Mit dem Mechanismus schalte ich z.B. eine Funksteckdose.
Jetzt möchte ich aber gern auch den Status der Funksteckdose (on/off) über den TelegramBot abfragen können.
Wie und wo kann ich das einrichten?
Gruß Jörg.
Hallo Jörg,
ich habe im Beitrag nun erklärt, wie man ein bestimmtes Reading abfragt der man sich eine Routine erstellt, mit der man ein beliebiges Reading abfragen kann.
Ich denke, mit diesem Vorgehen kannst du auch deinen Plan umsetzen.
Gruß Daniel
Ohne, dass man jetzt irgendwas zusätzlich coded ist es einfach mit:
list
z.B.
fhem list MeineLampe state
oder
fhem list Temperatursensor state
So mache ich das und es erfüllt seinen Zweck.
Hallo Daniel,
ich erhalte bei dem Versuch den SVG String einzubinden folgende Meldung:
Not enough arguments for main::TelegramBot_ExecuteCommand at (eval 5235) line 1, near „‚{plotAsPng(„SVG_MS_Liefern_dblog_1″)}‘)“
Kannst Du mir sagen wo das klemmt?
Vg Denny
Hallo Denny,
wurde wohl irgendwas geändert an der Funktionsweise. Habe bei mir den gleichen Fehler bekommen.
Um ein Plot zu senden geht die Definition nun wie folgt:
define TelegramSVGsend notify Telegram:msgText:./SVG {fhem("set Telegram cmdSend {plotAsPng("SVG_DbLog_12")}")}
Habe es im Beitrag entsprechend angepasst. Danke für den Hinweis.
Gruß Daniel
Hallo Daniel,
ich habe auch nach deinem Tutorial den Dienst eingerichtet und bin auf ein Problem gestoßen:
wenn ich ein notify einrichte um einen Plog zu senden funktioniert das wie in deinem Beispeil:
define TelegramSVGsend notify Telegram:msgText:./SVG set Telegram cmdSend {plotAsPng("SVG_Heizlog_1")}
Will ich aber das notify einrichten um den Status von Devices abzurufen:
define TelegramNotify Telegram:msgText:.* { Telegram("Telegram","msgText")}
kommt die Fehlermedung : „Unknown module Telegram:msgText:.* “
Weißt du evtl woran das liegen könnte?
Gruß
Hallo Scherheinz,
ist mein Fehler. Im Beitrag fehlte das „Notify“. Witzig, dass du der erste bist, dem es aufgefallen ist.
Richtig lautet die Definition so:
define TelegramNotify Notify Telegram:msgText:.* { Telegram("Telegram","msgText")}
Habe es im Beitrag verbessert.
Gruß Daniel
Ach stimmt, ist mir aber auch nicht aufgefallen. Danke für die schnelle Hilfe!
Gruß
Scherheinz
Hi,
danke für das gute Tutorial, hat mir sehr weitergeholfen.
Bei den Favoriten muss es wohl eine Änderung gegeben haben.
Wenn ich die so wie bei Dir beschrieben anlege, werden mir die Shortcuts in Telegram
samt dem Befehl der dahinter steht angezeigt und in Fhem kommt dann der gesamte
Inhalt als reading an. [Papierlampe]=set WZ_Papierlampe toggle
Mit einem / vor dem Objektnamen funktioniert es dann bei mir.
attr Telegram favorites /[Papierlampe]=set WZ_Papierlampe toggle
Gibt es eine Möglichkeit das nur die Shortcuts mit Ihren Nahmen ohne dem Keyword /cmd angezeigt werden.
Gruß Ingo
Hallo,
ja gibt es Probier es mal mit: https://fhem.de/commandref.html#msgDialog
Gruß
Meck