MsgDialog

Aus FHEMWiki
Version vom 19. Oktober 2017, 22:03 Uhr von Binford6000 (Diskussion | Beiträge) (Die Seite wurde neu angelegt: „{{Infobox Modul |ModPurpose=Dialoge für Sofortnachrichten über TelegramBot, Jabber und WhatsApp |ModType=d |ModForumArea=Frontends |ModTechName=76msgDialog.p…“)
(Unterschied) ← Nächstältere Version | Aktuelle Version (Unterschied) | Nächstjüngere Version → (Unterschied)
MsgDialog
Zweck / Funktion
Dialoge für Sofortnachrichten über TelegramBot, Jabber und WhatsApp
Allgemein
Typ Gerätemodul
Details
Dokumentation EN / DE
Support (Forum) Frontends
Modulname 76msgDialog.pm
Ersteller igami
Wichtig: sofern vorhanden, gilt im Zweifel immer die (englische) Beschreibung in der commandref!


Zielsetzung

Eine zentrale Anforderung einer modernen Haus-Automation ist die Steuerung von unterwegs. Mittlerweile nutzt fast jeder einen oder mehrere Messenger Dienste. Da liegt es doch nahe, diese Messenger Dienste für die Kommunikation mit FHEM zu nutzen. Mit msgDialog ist es jetzt möglich, Dialoge für Sofortnachrichten über TelegramBot, Jabber und WhatsApp (yowsup) zu definieren. Dabei können die einzelnen Dialoge für unterschiedliche Nutzer berechtigt werden. Die grundlegende Bedienung wird in diesem Video am Beispiel von TelegramBot gezeigt: https://youtu.be/yiCOTeR1YVQ

Einbindung in FHEM

Voraussetzungen

Für dieses Modul wird das Perl JSON Modul benötigt. Auf einem Debian-basierten System (z.B RaspberryPI o.ä.) kann man das mit dem folgenden Befehl installieren:

sudo apt-get install libjson-perl

Hinweise

Telegram:

Es kann notwendig sein, dass im TelegramBot das Attribut "utf8specials" auf "1" gesetzt wird, damit Nachrichten mit Umlauten gesendert werden. Bei dem msg-Befehl kann der TelegramBot_MTYPE angegeben werden. Die Vorgabe ist "message". Durch den Wert "queryInline" lässt sich ein inline Keyboard erzeugen (siehe weiter unten).

Jabber:

Bei dem msg Befehl kann der Jabber_MTYPE angegeben werden. Die Vorgabe ist leer. Durch den Wert otr lässt sich eine OTR Nachricht versenden.

WhatsApp (yowsup):

Bisher noch keine Erfahungen.

Definition des msgConfig-Device

Als nächstes benötigt man ein definiertes msgConfig device:

defmod myMsgConfig msgConfig
attr myMsgConfig userattr evalSpecials:textField-long
attr myMsgConfig evalSpecials me=<Aktivierungswort bzw. -Nachricht>
TelegramBot=<Name des TelegramBot-device>
attr myMsgConfig msgContactPush TelegramBot
attr myMsgConfig room msg

Falls bereits vorhanden müssen, natürlich nur die fehlenden Attribute gesetzt werden.

Definition des metaDialogs

Zur Auflistung aller berechtigten Dialoge dient - was sonst - ein Dialog!

defmod meta_Dialog msgDialog {\
  "%me%": {\
    "match": "\/?(start|%me%)",\
    "commands": [\
	  "deletereading TYPE=msgDialog $recipient_history",\
	  "deletereading %TelegramBot% $recipient_sentMsgId"\
    ],\
    "message": [\
      "{return('(' . join(') (', sort(split('\n', fhem('get TYPE=msgDialog:FILTER=NAME!=$SELF:FILTER=allowed=.*($recipient|everyone).* trigger')))) . ') ')}",\
      "(abbrechen) ",\
      "Ich kann folgendes für dich tun:"\
    ]\
  },\
  "abbrechen": {\
    "match": "\/?abbrechen",\
    "commands": [\
	  "deletereading TYPE=msgDialog $recipient_history",\
	  "deletereading %TelegramBot% $recipient_sentMsgId"\
    ],\
    "message": [\
      "(%me%) ",\
      "Dialog abgebrochen."\
    ]    \
  },\
  "beenden": {\
    "match": "\/?beenden",\
    "commands": [\
	  "deletereading TYPE=msgDialog $recipient_history",\
	  "deletereading %TelegramBot% $recipient_sentMsgId"\
    ],\
    "message": [\
      "(%me%) ",\
      "Dialog beendet."\
    ]\
  }\
}

attr meta_Dialog DbLogExclude .*
attr meta_Dialog allowed everyone
attr meta_Dialog room msg

Definition beliebiger Dialoge

Aufgrund der Komplexität eines Dialogs mit JSON ist es am praktikabelsten, zunächst einen leeren Dialog zu definieren:

define <name> msgDialog {} 

Anschließend kann die DEF in der Detail-Ansicht des Dialog-Device bearbeitet werden. Jeder Dialog basiert auf der folgenden Struktur von einfach bis komplex.

{
  "<TRIGGER>": {
    "match": "<regex>",
    "setOnly": (true|false),
    "commands": "(fhem command|{perl code})",
    "message": [
      "{perl code}",
      "text"
    ],
    "<NEXT TRIGGER 1>": {
      ...
    },
    "<NEXT TRIGGER 2>": {
      ...
    }
  }
}

Um den JSON-Teil der Dialoge zu testen, empfiehlt sich ein Besuch auf https://jsonlint.com/ Hier kann der selbst geschriebene JSON-Code validiert werden.

Beispiele

Links