telegram
Das Plugin dient zum Senden und Empfangen von Nachrichten über den Telegram Nachrichten Dienst
Abhängigkeiten
Es wird die Bibliothek python-telegram-bot
benötigt.
Diese ist in der requirements.txt
enthalten.
Bevor das Plugin genutzt werden kann, muß die Bibliothek installiert werden:
Entweder mit
sudo pip install -r requirements.txt
oder
unter Benutzung von
pip install -r requirements.txt
innerhalb des Verzeichnisses/usr/local/smarthome/plugins/telegram
.
Konfiguration von Telegram
Zuerst muß ein eigener Bot bei Telegram erstellt werden:
An
Botfather
das Kommando/newbot
senden.Dann muß ein Bot Name vergeben werden der noch nicht existiert.
Weitere Bot Details können eingestellt werden, wenn das Kommando
/mybots
an den BotFather gesendet wird.
Der BotFather erstellt für den neuen Bot ein sogenanntes token also einen einzigartigen Schlüssel.
Konfiguration des Plugins
Die Konfiguration des Plugins ist auch unter Plugin ‚telegram‘ Konfiguration beschrieben bzw. in der plugin.yaml nachzulesen.
Der erstelle token muß in der plugin.yaml
von SmartHomeNG eingetragen werden. Das kann im Admin-IF geschehen oder durch direkten Eintrag in die plugin.yaml
.
name: Eine Beschreibung des Bots
token: Der oben beschriebene einzigartige Schlüssel mit dem der Bot bei Telegram identifiziert wird.
Item Konfiguration
Jeder Chat, der auf den Bot zugreifen soll, muß SmartHomeNG bekannt gemacht werden.
Das geschieht über ein Item das das Attribut telegram_chat_ids
mit dem Parameter True hat und als Wert ein Dictionary hat.
Im Dictionary sind Paare von Chat-ID und Berechtigung gespeichert.
Um die Chat Id zu bekommen, muß der Bot (und das Plugin) zunächst laufen. Dazu wird SmartHomeNG (neu) gestartet.
Im Telegram Client wird der Bot als Chatpartner aufgerufen und das Kommando /start
an den Bot gesendet.
Der Bot reagiert mit einer Meldung, das die Chat-ID noch nicht bekannt ist und diese zunächst eingetragen werden muß. Mit der nun bekannten Chat-ID wird über das AdminIF das Items Dictionary des entsprechenden Items aus dem obigen Beispiel mit den eigenen Chat-IDs erweitert.
Ein erneutes Kommando im Telegram Client an den Bot mit /start
sollte nun die Meldung ergeben, das der Chat bekannt ist und weiterhin, welche
Zugriffsrechte der Chat auf den Bot hat.
telegram_chat_ids
Es muß ein Item mit dem Typ Dictionary mit dem Attribut telegram_chat_ids
und dem Parameterwert True
angelegt werden.
In ihm werden Chat-IDs und Zugriff auf den Bot gespeichert. Siehe obiges Beispiel.
telegram_message
Items mit dem Attribut telegram_message
lösen eine Nachricht aus, wenn sich der Itemwert ändert. Es ist möglich Platzhalter
in der Nachricht zu verwenden.
Verfügbare Platzhalter:
[ID] [NAME] [VALUE] [CALLER] [SOURCE] [DEST]
Einfaches Beispiel
Tuerklingel:
name: Türklingel (entprellt)
type: bool
knx_dpt: 1
telegram_message: 'Es klingelt an der Tür'
Beispiel mit Platzhaltern
state_name:
name: Name des aktuellen Zustands
type: str
visu_acl: r
cache: 'on'
telegram_message: 'New AutoBlind state: [VALUE]'
telegram_condition
Da es Situationen gibt die für Items ein enforce_updates: True
benötigen, würde bei telegram_message
bei jeder Aktualisierung des Items eine Nachricht verschickt werden.
Um das zu verhindern, kann einem Item das Attribut telegram_condition: on_change
zugewiesen werden.
Einfaches Beispiel
Tuerklingel:
type: bool
knx_dpt: 1
enforce_updates: True
telegram_message: 'Es klingelt an der Tür'
telegram_condition: on_change
telegram_value_match_regex: (true|True|1)
Dadurch wird auf eine mehrfache Zuweisung des Items mit dem Wert True
nur einmal mit einer Nachricht reagiert. Um eine weitere Nachricht zu generieren
muss das Item zunächst wieder den Wert False
annehmen. Das Attribut telegram_value_match_regex
filtert den Wert so das es bei der Änderung des Itemwertes
auf False
zu keiner Meldung Es klingelt an der Tür kommt.
telegram_value_match_regex
Ist zusätzlich zum Attribut telegram_message
auch das Attribut telegram_value_match_regex
gesetzt, wird der Itemwert geprüft, bevor eine
Nachricht gesendet wird. Geprüft wird gegen/mit den Regex, der als Parameterwert angegeben ist.
Beispiel
TestNum:
type: num
cache: True
telegram_message: 'TestNum: [VALUE]'
telegram_value_match_regex: '[0-1][0-9]' # nur Nachrichten senden wenn Zahlen von 0 - 19
TestBool:
type: bool
cache: True
telegram_message: "TestBool: [VALUE]"
telegram_value_match_regex: 1 # nur Nachricht senden wenn 1 (True)
telegram_message_chat_id
Ist zusätzlich zum Attribut telegram_message
auch das Attribut telegram_message_chat_id
gesetzt, wird die Nachricht nur an die dort angegebene Chat-ID (hier 3234123342) gesendet.
Ist das Attribut nicht gesetzt, erfolgt der Versand der Nachricht an alle Chat-IDs, die dem Plugin bekannt sind.
Einfaches Beispiel
Tuerklingel:
type: bool
knx_dpt: 1
enforce_updates: True
telegram_message: 'Es klingelt an der Tür'
telegram_message_chat_id: 3234123342
telegram_value_match_regex: (true|True|1)
telegram_info
Für alle Items mit diesem Attribut wird eine Liste mit Kommandos für den Bot erstellt. Der Listeneintrag entspricht dabei dem Attributwert.
Wird das Kommando /info
an den Bot gesendet, so erstellt der Bot ein Tastaturmenü, dass jedes Attribut mindestens einmal als Kommando enthält.
Bei Auswahl eines dieser Kommandos im Telegram Client wird dann für jedes Item, dass das Attribut telegram_info
und als Attributwert den Kommandonamen enthält
der Wert des Items ausgegeben.
Beispiel
Aussentemperatur:
name: Aussentemperatur in °C
type: num
knx_dpt: 9
telegram_info: wetter
Wind_kmh:
name: Windgeschwindigkeit in kmh
type: num
knx_dpt: 9
telegram_info: wetter
Raumtemperatur:
name: Raumtemperatur Wohnzimmer in °C
type: num
knx_dpt: 9
telegram_info: rtr_ist
Das Kommando /info
veranlasst den Bot zu antworten mit
[/wetter] [/rtr_ist]
Wählt man am Telegram Client daraufhin [/wetter]
aus, so werden
Aussentemperatur = -10,6
Wind_kmh = 12.6
ausgegeben. Bei der Auswahl des Kommandos [/rtr_ist]
antwortet der Bot mit
Raumtemperatur = 22.6
telegram_text
Items mit dem Attribut telegram_text
und dem Attributwert True
bekommen eine Mitteilung, die von einem Telegram Client an den Bot gesendet wird, als Wert zugewiesen.
Beispiel
telegram_message:
name: Textnachricht von Telegram
type: str
telegram_text: true
Nach der Eingabe von Hello world!
am Telegram wird das Item telegram_message
auf <Benutzername des chat Partners>: Chat-ID: Hello world!
gesetzt.
Ein John Doe ergäbe also John Doe: xxxxxxx: Hello world!
Mit einer Logik kann basierend darauf ein Menu und entsprechende Abfragen an shNG gestellt werden. Siehe dazu ein Beispiel weiter unten.
telegram_control
Für alle Items mit diesem Attribut wird eine Liste mit Kommandos für den Bot erstellt. Der Listeneintrag muss mit name
spezifiziert werden.
Wird das Kommando /control
an den Bot gesendet, so erstellt der Bot ein Tastaturmenü, dass jedes Attribut als Kommando enthält.
Dabei werden auch alle aktuellen Werte der Items ausgegeben.
Bei Auswahl eines dieser Kommandos im Telegram Client kann dann ein Item vom Type bool geschalten werden (on/off) oder beim Type ‚num‘ kein eine Zahl zum SH-Item gesendet werden.
name
Item wird mit diesem Namen im Bot als Kommando dargestellt
type
- Möglichkeiten: on, off, onoff, toggle, num
- on
nur Einschalten ist möglich
- off
nur Ausschalten ist möglich
- onoff
das Ein- und Ausschalten muss mit einen weiteren Kommando vom Tastaturmenu ausgewählt werden [On] [Off] (nach einem Timeout ohne Antwort wird der Befehl abgebrochen)
- toggle
der Wert des Items wird umgeschltet (0 zu 1; 1 zu 0)
- num
es kann eine Zahl an SH gesendet werden und das entsprechende Item wird damit geschrieben. (nach einem Timeout ohne Antwort wird der Befehl abgebrochen)
question
Sicherheitsabfrage vor dem Schalten des Items (verwendbar bei type:on/off/toggle - nach einem Timeout ohne Antwort wird der Befehl abgebrochen) [Yes] [No]
min
Minimalwert (verwendbar bei type:num)
max
Maximalwert (verwendbar bei type:num)
timeout
Zeit nach welcher der Befehl mit Antwort(onoff/question/num) abgebrochen wird (default 20Sekunden)
Beispiel
BeregnungZone1:
type: bool
cache: True
telegram_control: "name:BeregnungZ1, type:onoff"
BeregnungZone2:
type: bool
cache: True
telegram_control: "name:BeregnungZ2, type:toggle, question:Ventil wirklich umschalten?"
Gartentor:
type: bool
cache: True
telegram_control: "name:Gartentor, type:on, question:Gartentor wirklich öffnen?"
Dachfenster:
type: num
cache: True
telegram_control: "name:Dachfenster, type:num, min:0, max:100, timeout:30"
Kamera:
type: bool
cache: True
telegram_control: "name:Kamera, type:toggle"
eval: sh.plugins.return_plugin("telegram").photo_broadcast("http://192.168.0.78/snapshot/view0.jpg", datetime.datetime.now().strftime("%H:%M %d.%m.%Y"))
Das Kommando /control
veranlasst den Bot zu antworten mit
[/BeregnungZ1] [/BeregnungZ2] [/Gartentor]
[/Dachfenster] [/Kamera]
Funktionen
Das Plugin stellt derzeit zwei Funktionen zur Nutzung in Logiken bereit:
msg_broadcast
Argumente beim Funktionsaufruf:
msg: Die Nachricht, die verschickt werden soll
- chat_id:
Eine Chat-ID oder eine Liste von Chat-IDs.
Wird keine ID oder None angegeben, so wird an alle autorisierten Chats gesendet
photo_broadcast
Argumente beim Funktionsaufruf:
- path_or_URL:
entweder ein lokaler Pfad, der auf eine Bilddatei zeigt log_directory oder
eine URL mit einem Link. Wenn der Link lokal ist,
- caption:
Titel der Bilddatei, kann auch Dateiname sein oder Datum
Vorgabewert: None
- chat_id:
eine Chat Id oder eine Liste von Chat ids. Wird keine ID oder None angegeben, so wird an alle autorisierten Chats gesendet
Vorgabewert: None
- local_prepare
Ist für das zu sendende Bild eine URL angegeben, ruft das Plugin die Daten von der URL lokal ab und sendet die Daten dann an den Telegram Server. Beispiel dafür ist eine URL einer lokalen Webcam. Soll stattdessen eine im Internet frei zugängliche URL abgerufen werden, so wird dieses Argument auf False gesetzt und es wird nur die URL an Telegram geschickt und der lokale Rechner von den Daten entlastet. Aktuell kann das Plugin nicht mit Benutzername und Passwort geschützten URL umgehen.
Vorgabewert: True
Beispiele
Die folgende Beispiellogik zeigt einige Nutzungsmöglichkeiten für die Funktionen:
telegram_plugin = sh.plugins.return_plugin('telegram')
# Eine Nachricht `Hello world!` wird an alle vertrauten Chat Ids gesendet
msg = "Hello world!"
telegram_plugin.msg_broadcast(msg)
# Ein Bild von einem externen Server soll gesendet werden.
# Nur die URL wird an Telegram gesendet und keine Daten lokal aufbereitet
telegram_plugin.photo_broadcast("https://cdn.pixabay.com/photo/2018/10/09/16/20/dog-3735336_960_720.jpg", "A dog", None, False)
# Bild auf lokalem Server mit aktueller Zeit an Telegram senden
my_webcam_url = "http:// .... bitte lokale URL hier einfügen zum Test ..."
telegram_plugin.photo_broadcast(my_webcam_url, "My webcam at {:%Y-%m-%d %H:%M:%S}".format(sh.shtime.now()))
# Bild senden aber den Inhalt lokal vorbereiten
telegram_plugin.photo_broadcast("https://cdn.pixabay.com/photo/2018/10/09/16/20/dog-3735336_960_720.jpg", "The dog again (data locally prepared)")
local_file = "/usr/local/smarthome/var/ ... bitte eine lokal gespeicherte Datei angeben ..."
telegram_plugin.photo_broadcast(local_file, local_file)
Anwendungen
Changelog
V2.0.3 Plugin mit stop/run/pause_item steuerbar
V2.0.2 Fehler beim Kommando /control
behoben
V2.0.0 Umbau auf neues Telegram Paket (V20.2+) mit async
Web Interface
Das Webinterface bietet folgende Informationen:
Allgemeines: Oben rechts wird das Timeout, Begrüßungs- und Verabschiedungsnachricht angezeigt
Output Items: Sämtliche Items, die zum Senden einer Nachricht beitragen
Input Items: Items, über die Nachrichten empfangen werden können
Telegram Control: Items, die über Telegram geändert werden können
Telegram Infos: Befehle mit den zugehörigen Items, deren Werte auf eine Abfrage hin kommuniziert werden
Chat IDs: Registrierte Chat IDs inkl. Angabe der Zugriffe