Telegram & Fhem

Das wohl interessanteste im Bereich Smart-Home ist, dass man sich über alles informieren lassen kann. Hier kann man auf E-Mails, Push-Nachrichten, Whatsapp oder, wie hier beschrieben, Telegram zurückgreifen. Darüber hinaus ist es sogar möglich Befehle per Messenger an seinen Server abzusetzen.

Inhalt

Warum nicht Whatsapp?

In der Vergangenheit gab es immer wieder Kriege. Damals haben sich VHS, Betamax und Video 2000 einen Krieg geliefert, den VHS gewonnen hat. Die Blueray hat gegen die HD-DVD gewonnen und bei allen mobilen Messengern hat Whatsapp den Krieg für sich entschieden.

Dass der Sieger, dieser ewigen Kriege, nicht immer der Beste sein muss spielt für die breite Masse keine Rolle – irgendwann ist die Anzahl der Nutzer so hoch, das kein Konkurrenzprodukt auch nur den Hauch einer Chance hat. Auf der anderen Seite sind auch Große schon an Größeren gescheitert

Whatsapp wäre durch seine riesige Anzahl an Nutzern eigentlich erste Wahl was die Kommunikation zwischen dem Fhem-Server und dem Nutzer angeht, allerdings läuft der entsprechende Dienst für Whatsapp nicht zuverlässig – und ist daher keine Option.

Nachtrag 24.08.2018:

In Zukunft wird Whatsapp nicht mehr werbe frei sein und die Nähe zu Facebook hinterlässt bei mir immer einen leicht negativen Beigeschmack. Seitdem ich Telegram benutze, ist die Zahl meiner Kontakte, die ebenfalls Telegram benutzen stetig angestiegen – das stimmt mich optimistisch.

zurück zum Inhalt

Telegram

Über den Dienst bzw. die App an sich gibt es nicht viel zu sagen – was Telegram in blau ist, ist Whatsapp in grün. Fast.

Telegram bietet eine sog. Bot-Funktion, die z.B. Programmen ermöglicht den Telegram-Dienst zu nutzen. Dieses funktioniert dann über einen HTTP-Request, was soviel heißt wie: Man gibt eine gewisse URL+Nachricht in die Browserzeile ein und der Nachrichtentext erscheint im Messenger.

Solche Anwendungen sind für Fhem wie gemacht, daher ist es kein Wunder, dass es ein eigenes Modul zur Nutzung dieses Telegram-Bot gibt.

zurück zum Inhalt

Anlegen des Bot

Zur Einrichtung des Bot muss die Telegram-Messenger App auf eurem Smartphone installiert sein. Nach dem Öffnen der App kann man oben rechts in der Ecke auf die Lupe klicken und damit suchen. Gesucht wird @BotFather.

Screenshot_20180501-211307

Mit diesem BotFather kann man nun kommunizieren – der BotFather gibt einem dabei entsprechende Optionen vor. Tippt man einfach irgendwas ein – erzählt der Botfather seine Optionen.

Screenshot_20180501-211215

Um einen neuen Bot anzulegen ist das Kommando /newbot von Bedeutung, das wird nun so einfach über den Messenger an den Botfather gesendet – dieser meldet sich mit weiteren Instruktionen zurück.

Screenshot_20180501-211222.jpg

Man wird danach vom Botfather aufgefordert einen Namen und einen Botnamen einzugeben – und erhält daraufhin vom Botfather einen Usertoken (die komische Nummer im roten Kästchen).

Screenshot_20180501-211243.jpg

Die Einrichtung des Bot ist nun abgeschlossen. Weiter geht’s im

zurück zum Inhalt

Fhem Webinterface

hier wird der Bot nun mit dem Modul verbunden. Dazu wird oben in die Kommandozeile folgendes eingetragen

define TelegramBot TelegramBot

Wie dem Fhem-Wiki zum Thema TelegramBot zu entnehmen ist, muss zum empfangen von Nachrichten noch das Attribut „pollingTimeout“ gesetzt werden.

attr TelegramBot pollingTimeout 120

Um sicher zu gehen, dass nichts hängt – kann mit

set TelegramBot reset

noch einmal alles neugestartet werden – ab dem Moment ist das Modul voll einsatzbereit.

zurück zum Inhalt

Eventmonitor-Test

Nun kann man über Telegram eine Nachricht an den Bot schicken, hier mal ein Tinkerblog Test

eventmonitor

Je nach dem was man machen möchte, könnte man so direkt ein Notify anlegen.

Angenommen man schreibt dem Bot „Licht Schlafzimmer Aus“ – so kann man diese Nachricht mit einem entsprechenden Aktor am Licht koppeln – und das Licht ausschalten.

zurück zum Inhalt

Nachricht von Fhem

Falls Fhem nun was wichtiges zu melden hat, kann es über das Modul direkt eine Nachricht schicken.

Damit das Modul immer direkt an dein Telegram Account sendet, muss die sog. msgPeerId, die auch oben im Screenshot zu sehen ist als „defaultpeer“ gesetzt werden.

set TelegramBot defaultpeer ID

Man muss dazu nicht in seinem Eventmonitor nachgucken und sich selbst eine Nachricht schicken – dazu kann man auch einfach in die Deviceoverview des TelegramBots schauen, dort wird im Reading Contacts angezeigt, wer so mit dem Bot kommuniziert hat (sollte in der Regel nur Einer sein).

Ab jetzt kann mit

set TelegramBot _msg NACHRICHT

eine Nachricht an euer Smartphone gesendet werden. Hier wieder der Tinkerblog Test

Screenshot_20180501-215143.jpg

Diese überaus nützliche Funktion lässt sich so natürlich ziemlich leicht in einem Notify oder Doif (mit) einbinden, um sich über Ereignisse informieren zu lassen.

zurück zum Inhalt

Telegram Message-Center

Man kann seinen Telegram-Bot dazu nutzen, um Devices in Fhem zu schalten/steuern, dazu wirft man erstmal einen Blick in den

Event-Monitor

und schreibt dem Bot per Telegram eine beliebige Nachricht z.B.

Screenshot_20180521-141642

im Event-Monitor kann man nun sehen, dass die Nachricht eingegangen ist

eventmonitor

Dieses Event könnte man jetzt einfach markieren und mit einem Klick auf „Create/Modify Device“ Button in ein

zurück zum Inhalt

Notify

verwandeln

createnotify

Klickt man auf „OK“, wird man auf ein neues Notity-Device weitergeleitet. Hier kann man jetzt auswählen, was passieren soll, wenn der Telegram-Bot die Nachricht „Tinkerblog Test“ erhält

deviceoverview

Im oberen Bereich, hinter der Button „modify“ seht ihr nun das Event. Über die drei Dropdowns kann man nun ein Device und eine Aktion auswählen. Ich nehme dafür einfach mal eine meiner Sonoff-Steckdosen und schalte sie, mit der Nachricht, ab

deviceoverview2

Nach einem Klick auf „modify“ ist das Notify fertig. Jedes mal, wenn ich nun Tinkerblog Test per Telegram an meinen Telegram-Bot schicke, wird „S20_1“ auf „OFF“ gesetzt.

zurück zum Inhalt

wenig komfortabel

Mit dieser Methode könnte man sich nun hunderte von Notify anlegen, die nach dem Eintreffen einer bestimmten Nachricht eine Aktion eines Devices ausführen. Eine so hohe Anzahl von Notify wäre aus Gründen der Übersicht natürlich wenig komfortabel  und schwer zu verwalten. Abgesehen davon, bräuchte man, um ein Device z.B. ein und aus zu schalten schon zwei Notify.

zurück zum Inhalt

Telegram Message-Center

Man kann sich auf ein einziges Notify beschränken, das die eingehenden Nachrichten des Telegram-Bot auswertet und je nach Text eine Aktion ausführt. Das verspricht nicht nur viel mehr Komfort, sondern ist auch viel übersichtlicher und leichter zu verwalten. Innerhalb dieses Notify arbeitet man dann mit der Perl-Syntax – das hört sich schlimmer an als es eigentlich ist.

Als erstes legt man sich dazu ein leeres Notify an

define Telegram_Message_Center notify set x off
message-center.png

set x off ist in dem Fall nur ein Platzhalter und wird später entfernt.

Mit einem Klick auf „DEF“ öffnet sich der Editor, hier fügen wir nun ein paar Zeilen ein

TelegramBot:msgText.* {
if ($EVTPART1 eq 'S20_1') {
if ($EVENT =~ 'an') {
fhem("set S20_1 ON");
}
elsif ($EVENT =~ 'aus') {
fhem("set S20_1 OFF");
}
}
else {
}
}
DEF1

Mit der TAB-Taste kann man den Code schön übersichtlich gestalten. Denk auch daran die Devicenamen (auch von TelegramBot) anzupassen.

Dieses Notify kann nun schon zwei eingehende Nachrichten auswerten

  1. Nachricht 1: „S20_1 an“ führt den Befehl -> „set S20_1 ON“ aus
  2. Nachricht 2: „S20_1 aus“ führt den Befehl -> „set S20_1 OFF“ aus

Um das zu testen kann man sich die jeweilige Nachricht wieder per Telegram an seinen Bot schicken und im Event Monitor nachsehen

Screenshot_20180521-162956

s20off

s20an

Wie man sieht klappt das einwandfrei. Der Bot erhält die Nachricht, das Notify wertet die Nachricht aus und führt den jeweiligen Befehl aus.

Dieses Notify kann man nun

zurück zum Inhalt

..beliebig erweitern

Da das Grundgerüst zum auswerten der Nachrichten schon steht, ist das nachträgliche Einfügen von Events wesentlich leichter.

Man kann auch Kommentarzeilen hinzufügen, um das Notify noch übersichtlicher zu gestalten. Dazu stellt man ein „#“ an den Anfang der Zeile und schreibt seinen Kommentar einfach dahinter. Der Code beginnt dann in der nächsten Zeile.

def3

Die #Kommentarzeilen sind im Editor grau hinterlegt und nehmen keinen Einfluss auf das Geschehen. Ich habe jeweils das Device angegeben und welche Funktion es aktuell hat.

Für meine insgesamt fünf Sonoff 20 Steckdosen, die  ich nun alle per Telegram schalten kann, sieht das ganze nun so aus

def2

Teilweise fehlen auf dem Screenshot hier die Semikolon hinter (set S20_X OFF) – in dem Feld zum kopieren habe ich diese hinzugefügt.

hier noch zum kopieren

TelegramBot:msgText.* {TelegramBot:msgText.* {
#Sonoff S20 1 / ohne Funktion 
if ($EVTPART1 eq 'S20_1') { if ($EVENT =~ 'an') { fhem("set S20_1 ON"); } elsif ($EVENT =~ 'aus') { fhem("set S20_1 OFF"); } }
#Sonoff S20 2 / Steckdose Server 
if ($EVTPART1 eq 'Server') { if ($EVENT =~ 'an') { fhem("set S20_2 ON"); } elsif ($EVENT =~ 'aus') { fhem("set S20_2 OFF"); } }
#Sonoff S20 3 / ohne Funktion 
if ($EVTPART1 eq 'S20_3') { if ($EVENT =~ 'an') { fhem("set S20_3 ON"); } elsif ($EVENT =~ 'aus') { fhem("set S20_3 OFF"); } }
#Sonoff S20 4 / Steckdose Wohnwand 
if ($EVTPART1 eq 'Wohnwand') { if ($EVENT =~ 'an') { fhem("set S20_4 ON"); } elsif ($EVENT =~ 'aus') { fhem("set S20_4 OFF"); } }
#Sonoff S20 5 / Steckdose Schreibtisch 
if ($EVTPART1 eq 'Schreibtisch') { if ($EVENT =~ 'an') { fhem("set S20_5 ON"); } elsif ($EVENT =~ 'aus') { fhem("set S20_5 OFF"); } } else { }}

Man könnte auch mit einer Nachricht direkt mehrere Events anstoßen

elsif ($EVTPART1 eq 'Alle Steckdosen aus') {
fhem("set S20_1 OFF");
fhem("set S20_2 OFF");
fhem("set S20_3 OFF");
fhem("set S20_4 OFF");
fhem("set S20_5 OFF");
}

So würde bei der Nachricht „Alle Steckdosen aus“ – S20_1 bis S20_5 ausgeschaltet.

Um die Steckdosen jeweils „an“ oder „aus“ zu schalten kann man wieder ein „if“ und „elsif“ einbauen

if ($EVENT =~ 'an') {
fhem("set S20_1 ON");
fhem("set S20_2 ON");
fhem("set S20_3 ON");
fhem("set S20_4 ON");
fhem("set S20_5 ON");
}
elsif ($EVENT =~ "aus") {
fhem("set S20_1 OFF");
fhem("set S20_2 OFF");
fhem("set S20_3 OFF");
fhem("set S20_4 OFF");
fhem("set S20_5 OFF");
}

Dieses Vorgehen ist Sinnvoll, wenn man sich ein Szenario bauen möchte. Angenommen man schreibt „TV“ – so könnte man Sat-Receiver, Fernseher und Beleuchtung gleichzeitig einschalten.

Ebenso kann man sich durch einen weiteren Befehl auch eine Antwort vom Telegram-Bot geben lassen – so hat man immer die Bestätigung, dass der gesendete Befehl auch korrekt war und nicht aufgrund von z.B. Groß – und Kleinschreibung übersehen wurde.

zurück zum Inhalt

Readings abfragen

Um Readings abzufragen muss erstmal eine Variable festgelegt werden

my$NAME = ReadingsVal ("DEVICE", "READING", "");

Hier die gemessene Temperatur eines Homematic-Thermostat:

my $tempbuero = ReadingsVal("Hzg_Buero_Clima", "measured-temp", "");

Das lässt sich für jedes Reading umsetzen – aber immer daran denken, dass jede Variable und damit jedes Reading ($myNAME) immer individuell definiert sein muss. Der TelegramBot kann die Variable dann nutzen, um

elsif ($EVTPART1 eq 'NACHRICHT') {
my$NAME = ReadingsVal("DEVICE", "READING", "");
fhem(set TelegramBot send BELIEBIGER TEXT $NAME);
}

Um die gemessene Temperatur des Thermostaten dann per TelegramBot zu senden:

elsif ($EVTPART1 eq 'Temperatur') {
my $tempbuero = ReadingsVal("Hzg_Buero_Clima", "measured-temp", "");
fhem("set TelegramBot send Bürotemperatur:$tempbuero");
}

Natürlich kann man das mit beliebig vielen Readings machen, die man alle in einer Nachricht verschicken kann

elsif ($EVTPART1 eq 'NACHRICHT') {
my$NAME = ReadingsVal("DEVICE", "READING", "");
my$NAME2 = ReadingsVal("DEVICE2", "READING2", "");
my$NAME3 = ReadingsVal("DEVICE3", "READING3", "");
fhem(set TelegramBot send BELIEBIGER TEXT $NAME \n BELIEBIGER TEXT $NAME2 \n BELIEBIGER TEXT $NAME3);
}

mit „\n“ innerhalb der Nachricht erzeugt man einen Zeilenumbruch – so kommen die Readings schön übersichtlich daher.

zurück zum Inhalt

..mit System

Wer zuweilen das Gefühl hat – der Kopf platz und sich seine eingebauten Kommandos nicht merken kann, der sollte darüber nachdenken seine Rooms und Devices mit einer Nummerierung zu versehen (ich selbst habe das bisher nicht eingeführt).

Man sollte dabei jeden Raum eine eigene Nummer zuweisen und die jeweiligen Devices unterhalb der Raumnummer einheitlich gruppieren.

Beispiele:

  • Küche, Raumnummer: 01
  • Wohnzimmer, Raumnummer: 02
  • Schlafzimmer, Raumnummer: 03
    • Begehbarer Kleiderschrank: 03.1
  • FC Schalke: 04

Angenommen im jedem Raum befindet sich nun ein Thermostat, könnte man diese z.B. mit der Zahl 4 gruppieren.

  • Thermostat Küche : 01_4_1
  • Thermostat 1 Wohnzimmer: 02_4_1
    • Thermostat 2 Wohnzimmer: 02_4_2
  • Thermostat Schlafzimmer: 03_4_1

Oder mit dem Buchstaben T

  • Thermostat Küche: 01_T_1
  • Thermostat 1 Wohnzimmer: 02_T_1
    • Thermostat 2 Wohnzimmer: 02_T_2
  • Thermostat Schlafzimmer: 03_T_1

Schaltbare Steckdosen könnte man mit der Nummer 6 gruppieren und fortlaufend nummerieren

  • Steckdose 1 Wohnzimmer: 02_6_1
  • Steckdose 2 Wohnzimmer: 02_6_2
  • Steckdose Schlafzimmer: 03_6_1

Oder statt der 6 mit einem S versehen

  • Steckdose 1 Wohnzimmer: 02_S_1
  • Steckdose 2 Wohnzimmer: 02_S_2
  • Steckdose Schlafzimmer: 03_S_1

Man ist voll flexibel – die Unterstriche zur Trennung kann man sich natürlich auch sparen. 03S1 = Steckdose Schlafzimmer, 02T3 = Wohnzimmer, Thermostat 3. Theoretisch muss sich dann nur noch sein System merken, und welches Gerät welcher fortlaufenden Nummer zugehört (da könnte man im Uhrzeigersinn vorgehen).

Grade wenn man viele Devices hat, die man über den Telegram-Bot steuern möchte – finde ich so eine Nummerierung sehr sinnvoll. Man kann die Devices selbst entsprechend so benennen (z.B. 03_4_Thermostat_Schlafzimmer) und sich so anhand seiner eignen Nummern orientieren.

zurück zum Inhalt

Fazit

Mit dem Telegram Message-Center ist es möglich alle eingehenden Telegram-Nachrichten auszuwerten und Kommandos an seine Geräte zu senden. Obendrein ist es einfach zu verwalten, zu erweitern und natürlich zu bedienen.

Natürlich ist die Anwendung von Perl-Code für den Laien keine einfache Angelegenheit, der Fhem-eigene Editor zur Bearbeitung des Codes ist dabei eine super Stütze, die den Umgang enorm erleichtert. Wer ein wenig geschickt ist, der kann hat nun eine Menge Möglichkeiten – man muss eben ein wenig Code tinkern 🙂

zurück zum Inhalt

Batteriestatus mit Telegram

Den Batteriestatus seiner Smart-Home Geräte zu überwachen ist überaus sinnvoll – sich bei Handlungsbedarf benachrichtigen zu lassen – maximal komfortabel.

Ich habe den Batteriestatus meiner Devices nach dieser Anleitung angelegt. Dazu wird eine Readingsgroup für das Battery-Reading angelegt, ein paar schöne Bildchen eingefügt – sieht super aus und funktioniert.

Batteriestatus

Für die Benachrichtigung nutzt der Ersteller, der Anleitung allerdings den Pushover-Dienst – ich aber wollte Telegram. Folglich musste ich das Notify (welches unter der Überschrift Monatliche Benachrichtigung per Pushover aufgeführt wird entsprechend bearbeiten.

Hier eine Zeile aus dem original Notify

{if (ReadingsVal("AZ.Fenster.Geschlossen", "battery", "-1") eq "low")\
  {fhem ("set PushoverJayFHEM msg 'Arbeitszimmer Fenster' 'Bitte Batterie tauschen' '' 0 ''")}\
};;\
AZ.Fenster.Geschlossen ist ein batteriebetriebenes Device. Bei Battery low wird eine Pushovernachricht gesendet – natürlich nicht sofort – sondern einmal im Monat. Normalerweise halten die Batterien sehr lange, daher ist der Zeitraum für die Benachrichtigungen durchaus ausreichend.
Für jedes batteriebetriebene Gerät – muss so eine Zeile angelegt werden. Bei entsprechender Anzahl an Geräten kann das sehr viel Arbeit werden. Es darf auch nicht vergessen werden, dass sich das Notify nicht selbst verwaltet, sondern bei neuen Devices manuell aktualisiert werden muss
(während des Schreibens fiel mir auf, dass all meine Xiaomi-Geräte, aufgrund des Gateway-Wechsels, aktualisiert werden müssen).
In meinem Telegram-Fall sieht so eine Zeile für ein Device wie folgt aus
{if (ReadingsVal("Fenster_Deele", "battery", "-1") eq "low")
{fhem ("set TelegramBot _msg 'Fenster Deele' Bitte die Batterie ersetzen!' '' 0 ''")}
};;
Statt set Pushover xxx kommt set TelegramBot xxx zum Einsatz. Mehr muss gar nicht gemacht werden.
So sieht dann das ganze Notify-DEF, für die obige Grafik aus
def.png
Der Dank gilt an dieser Stelle natürlich dem Ersteller des original Tutorials!!