TelegramBot – Kommuniziere mit deiner FHEM-Installation

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 Messenger
Preis: Kostenlos

Telegram
Preis: Kostenlos

Telegram Messenger
Preis: Kostenlos

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.

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.

Telegram - Bothfather

Der Chatbot @BotFather wird mit Kurzbefehlen gesteuert. Eine List der verfügbaren Befehle erhält nach dem Tippen auf Start.

Telegram - Bothfather

Mit dem Befehl „/newbot“ lässt sich nunTelegram - Bothfather 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.

Telegram - Bothfather

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.

Telegram - Bothfather

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.

Telegram - BotFather

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.

Telegram - BotFather

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

Telegram

Als Reading erhält man nun die Daten des abgesendeten Befehls.

Telegram

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.

Telegram

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.

Telegram Kurzbefehle

Die Kurzbefehle lassen sich aber noch einfacher aufrufen. Rechts neben dem Eingabefeld befindet sich ein Shortcut zu den Kurzbefehlen.

Telegram Kurzbefehl

(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 Telegram:msgText:.* { Telegram("Telegram","msgText")}

Sobald nun das Telegram-Device „Telegram“ eine einkommende Nachricht erhält, wird diese an die Routine „Telegram“ übergeben. Diese Routine 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.

Hinterlasse einen Kommentar

17 Kommentare auf "TelegramBot – Kommuniziere mit deiner FHEM-Installation"

Benachrichtige mich zu:
avatar
Fotos und Bilder
 
 
 
sonstiges Dateiformat
 
 
 
Sortiert nach:   neuste | älteste | beste Bewertung
Stefan
Gast
Stefan

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

Jörg
Gast
Jörg

genau das gleiche Problem habe ich auch. Gibt es eine Lösung, den Fehler NICHT zu loggen?

Danke und Gruß

JoeWannne
Gast
JoeWannne

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

Lutz
Gast
Lutz

Hallo Daniel,

bei mir kommt im FHEM die Meldung:

Cannot load Module TelegramBot

Wie kann ich das Modul laden?

Gruß
Lutz

Andre
Gast
Andre
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… weiterlesen »
Christian
Gast
Christian

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

Ron
Gast
Ron

Klappt, geile Sache, vielen Dank!

Jörg
Gast

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.

Lukas
Gast
Lukas

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.

Denny
Gast
Denny

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

wpDiscuz