msgDialog: Instant Messaging als FHEM Interface

Begonnen von igami, 30 September 2017, 15:09:01

Vorheriges Thema - Nächstes Thema

binford6000

ZitatDas ist es ja, kein HUE sondern ein Homematicdeckenlampenschalter  ;).
Ja OK dann habe ich nicht gesagt...  ;D
ZitatWie bekommst Du die Icons dort hinein?
Einfach per copy&paste im RAW einfügen. Eine Liste der Emojis findest du hier:
https://apps.timwhitlock.info/emoji/tables/unicode
Ich habe mir aber auch schon welche per Telegram geschickt. Dann stehen sie direkt im Reading msgText vom TelegramBot device.
Hier im Forum im Editor kommt bei der Vorschau eine Fehlermeldung. Einfach ignorieren  ;)
VG Sebastian

FHEm2005

Ich arbeite gerade an einer Umschaltung für Sommer- bzw. Winterbetrieb der Heizung. Normalerweise relativ einfach, aber (wie immer) bei mir läuft irgend etwas schief. Zuerst soll in den manuellen mode mit: "set Th_.*_Climate controlMode manual" umgeschaltet werden. Danach soll in allen Thermostaten die Temperatur auf 5 °C gesetzt werden. Aber ein Schritt nach dem anderen.  Bereits das Umschalten des ControlModes auf manuell bereitet Probleme dahingehend, dass keinerlei Reaktion geschieht. Unter Verbose 5 zwar  einzelne Meldungen aber keine Fehler uns kein Umschalten in den Thermostaten.

Hier die gesamte Raw-Definition:
Heftig: Wenn ich die Raw-Definition einfüge kommt oben ein Hinweis:
Zitat
Fehler beim Schreiben des Beitrages.
Textfeld wurde nicht ausgefüllt.

Offensichtlich kommt der Forumsserver nicht mit den geschweiften Klammern klar, deshalb als Auszug:
    "Sommerbetrieb": {
                        "match" : "(☀️ Sommerbetrieb|Sommerbetrieb)",
                        "commands": "set Th_.*_Climate controlMode manual",     
                        "message" : "Sommerbetrieb ist jetzt eingeschaltet."
                 }
}

Im Einsatz sind fünf HM-Thermostaten.
Was ist falsch bzw. was habe ich übersehen?

Gruß Eberhard
Raspi3: FHEM, CULV3 (V1.61), EnOcean Pi 868, nanoCUL433, HUE-Bridge; Raspi4: Node-red, MQTT, Gaszähler auslesen mit ESP32-CAM

FHEm2005

Ich lese mir gerade zum gefühlten tausendsten Male die CommansRef für msgDialog durch und speziell den Absatz zu set only.
ZitatWenn setOnly auf true gestellt wird kann der Dialog an dieser Stelle nicht durch eingehnde Nachrichten ausgelöst werden, sondern nur über "get <name> say TRIGGER".

Das habe ich versucht und bin kläglich gescheitert! Bis ich dahintergekommen bin, dass es sich hier um einen Schreibfehler handelt. Erst bei "set <name> say TRIGGER" wird der Dialog <TRIGGER> angestoßen!

Viele Grüße
Eberhard
Raspi3: FHEM, CULV3 (V1.61), EnOcean Pi 868, nanoCUL433, HUE-Bridge; Raspi4: Node-red, MQTT, Gaszähler auslesen mit ESP32-CAM

igami

Zitat von: FHEm2005 am 03 Juni 2018, 18:57:36
Was ist falsch bzw. was habe ich übersehen?
Funktioniert denn

set Th_.*_Climate controlMode manual

wenn du es direkt in der Kommandozeile eingibst?

Zitat von: FHEm2005 am 03 Juni 2018, 22:26:06
Ich lese mir gerade zum gefühlten tausendsten Male die CommansRef für msgDialog durch und speziell den Absatz zu set only.
Das habe ich versucht und bin kläglich gescheitert! Bis ich dahintergekommen bin, dass es sich hier um einen Schreibfehler handelt. Erst bei "set <name> say TRIGGER" wird der Dialog <TRIGGER> angestoßen!
Vielen Dank, habe ich korrigiert.
Pi3 mit fhem.cfg + DbLog/logProxy
Komm vorbei zum FHEM Treffen im Kreis Gütersloh! Das nächste Mal im April 2020.

MAINTAINER: archetype, LuftdatenInfo, monitoring, msgDialog, Nmap, powerMap
ToDo: AVScene, FluxLED

FHEm2005

Zitat von: igami am 04 Juni 2018, 05:32:15
Funktioniert denn

set Th_.*_Climate controlMode manual

wenn du es direkt in der Kommandozeile eingibst?
Das ist es ja: von der Kommandozeile aus funktioniert es.

Gruß Eberhard
Raspi3: FHEM, CULV3 (V1.61), EnOcean Pi 868, nanoCUL433, HUE-Bridge; Raspi4: Node-red, MQTT, Gaszähler auslesen mit ESP32-CAM

FHEm2005

Ich mache wohl jeden Fehler, der irgendwie machbar ist.  :(

Ich habe den Heizungsdialog in mehreren Ebenen aufgebaut. Den Dialog für Sommerbetrieb hatte ich fälschlicherweise in die falsche Ebene gepackt. (Vereinfachte Darstellung)


%me%: match:
             message:
             Raum: match:
                        commands:
                        message:
                        Sommerbetrieb:
                              match:
                              commands:
                              massage:


So ist der "Sommerbetrieb" ein Teil von Raum. Richtig ist ihn eine Ebenen höher zu schieben:


%me%: match:
             message:
             Raum: match:
                        commands:
                        message:
             Sommerbetrieb:
                         match:
                         commands:
                         massage:

Sinnvoll ist es die beabsichtigte Hierarchie eines Dialoges vorher mal zu skizzieren. Lesson learned!

Viele Grüße
Eberhard
Raspi3: FHEM, CULV3 (V1.61), EnOcean Pi 868, nanoCUL433, HUE-Bridge; Raspi4: Node-red, MQTT, Gaszähler auslesen mit ESP32-CAM

Quantum

Hallo igami,

vielen Dank für das überaus geniale Modul!

Ich hätte eine Anregung, die ich zur Diskussion stellen möchte. Wenn ich das richtig verstanden habe, versendet msgDialog die Nachrichten über "msg push ...". Wäre hier "msg text ..." nicht flexibler? So könnte man die Nachrichten, die über "set <NAME> say" oder den gesamten Dialog nicht nur über einen Messenger, sonderen gleichzeitig auch noch per EMail versenden, ohne dafür einen weiteren Benutzer anlegen zu müssen. So könnte nach meinem Verständnis auch relativ einfach zweigleißig gefahren werden.  Hier ein Zitat aus dem Wiki:

Zitat
text

Sendet eine Textnachricht per Push oder E-Mail. Je nach Priorität wird gepusht, gemailt oder beides. E-Mails werden mit der entsprechenden Priorität im Header markiert (dafür sind bei High und Low Prio HTML Mails zwingend erforderlich. Normale Mails werden als Nur-Text gesendet).

Die Befehle, wie gepusht oder gemailt werden soll, können über Attribute am Device "globalMsg" für die Prioritäts-Kategorien "High", "Normal" und "Low" angepasst werden. Standardmäßig wird für Push das Pushover Modul sowie für E-Mail system() per /usr/bin/mail verwendet.

Die Sub-Typen "mail" und "push" können auch explizit für sich aufgerufen werden.

Freundliche Grüße
Quantum


igami

Pi3 mit fhem.cfg + DbLog/logProxy
Komm vorbei zum FHEM Treffen im Kreis Gütersloh! Das nächste Mal im April 2020.

MAINTAINER: archetype, LuftdatenInfo, monitoring, msgDialog, Nmap, powerMap
ToDo: AVScene, FluxLED

igami

Zitat von: Quantum am 05 Juni 2018, 11:01:07
Ich hätte eine Anregung, die ich zur Diskussion stellen möchte. Wenn ich das richtig verstanden habe, versendet msgDialog die Nachrichten über "msg push ...". Wäre hier "msg text ..." nicht flexibler? So könnte man die Nachrichten, die über "set <NAME> say" oder den gesamten Dialog nicht nur über einen Messenger, sonderen gleichzeitig auch noch per EMail versenden, ohne dafür einen weiteren Benutzer anlegen zu müssen. So könnte nach meinem Verständnis auch relativ einfach zweigleißig gefahren werden.
Darauf möchte ich mit einem Zitat aus der Commandref antworten:
Zitat
Attribute
[...]
msgCommand <command>
Befehl der zum Versenden einer Nachricht verwendet wird.
Die Vorgabe ist "msg push \@$recipients $message"
Dieses Attribut ist als "msgDialog_msgCommand" im msgConfig Gerät vorhanden.
Ist also alles schon vorbereitet ;)
Pi3 mit fhem.cfg + DbLog/logProxy
Komm vorbei zum FHEM Treffen im Kreis Gütersloh! Das nächste Mal im April 2020.

MAINTAINER: archetype, LuftdatenInfo, monitoring, msgDialog, Nmap, powerMap
ToDo: AVScene, FluxLED

1of16

Zitat von: igami am 21 November 2017, 21:26:15
Okay, ist fhemMsgRcvPush. Hast du Einschränkungen durch event-on- Attribute?
verdammte axt!
ich sitze hier seit zwei Stunden und kämpfe mich nebenbei durch den Thread, da ich mir sicher war, dass ich irgendeinen dummen Fehler mache
und auf Seite 16 finde ich die Lösung: auch ich hatte beim ROOMMATE (aus dubiosen historischen Gründen) noch ein even-on- Attribut drin.
DANKE!
Vielleicht auch ein Thema für "Fehlersuche" Bereich im Wiki :)

So, jetzt kann ich mich endlich richtig mit deinem grandios klingenden Modul auseinander setzen :)
FHEM in einem Dockercontainer
VCCU mit 3x HM-MOD-UART und 1x HmLGW
1x CCU2
2x nanoCUL 433MHz, 3x RPi3, Unifi-Controller mit drei APs für presence und Unifi Protec
div. weitere HM, ein paar HmIP Geräte und div. Shellys

1of16

Zitat von: igami am 06 März 2018, 18:06:32
Auf Wunsch hier noch der Einkaufslisten Dialog:

defmod Einkaufsliste_Dialog msgDialog { \
  "Einkaufsliste": {\
    "message": [\
      "(Waren hinzufügen) ", \
      "(Waren entfernen) ", \
      "(einkaufen) ", \
      "(abbrechen) ",\
      "{my $content = (split(': ', fhem('get %PostMe% list %list%')))[1];;;; return('Keine Einträge vorhanden') unless($content);;;; return(join('\n', split(',', $content)));;;;}"\
    ],\
    "Waren hinzufügen": {\
      "message": [\
        "Bitte jede Ware als neue Nachricht hinzufügen.",\
        "Das hinzufügen von Waren durch \"/beenden\" beenden."\
      ],\
      "Ware hinzufügen": {\
        "match": "[^/]+",\
        "commands": [\
          "set %PostMe% add %list% $message",\
          "setreading $SELF $recipient_history Einkaufsliste|Waren hinzufügen"\
        ]\
      }\
    },\
    "Waren entfernen": {\
      "message": [\
        "{return('(' . join(') (', split(',', (split(': ', fhem('get %PostMe% list %list%')))[1]), 'beenden'). ') ')}",\
        "Welche Ware möchtest du entfernen?"\
      ],\
      "Ware entfernen": {\
        "match": "^(?!beenden).+",\
        "commands": [\
          "set %PostMe% remove %list% $message",\
          "set $SELF say @$recipient Einkaufsliste|Waren entfernen"\
        ]\
      }\
    },\
    "einkaufen": {\
      "commands": [\
        "setreading $SELF $recipient_history Einkaufsliste|noch einzukaufen"\
      ],\
      "message": [\
        "{return('(' . join(') (', split(',', (split(': ', fhem('get %PostMe% list %list%')))[1])) . ') ')}",\
        "(beenden) ",\
        "Bitte die Waren der Reihenfolge nach auswählen in der sie eingekauft werden."\
      ]\
    },\
    "noch einzukaufen": {\
      "message": [\
        "{return('(' . join(') (', split(',', (split(': ', fhem('get %PostMe% list %list%')))[1])) . ') ')}",\
        "(beenden) ",\
        "Noch einzukaufen:"\
      ],\
      "Ware eingekauft": {\
        "match": "^(?!beenden).+",\
        "commands": [\
          "set %PostMe% remove %list% $message",\
          "set $SELF say @$recipient Einkaufsliste|noch einzukaufen"\
        ]\
      }\
    }    \
  }\
}

attr Einkaufsliste_Dialog evalSpecials PostMe=PostMe\
list=Einkaufsliste

hi,
ich habe das bei mir übernommen, nur der Name ist anders (Einkaufsliste_Dialog vs. md_einkauf).
Sobold ich den den Dialog starte kommt folgendes im Log als Fehler:
3: get PostMe list Einkaufsliste : Please define PostMe first
Und ja, das attr evalSpecials  ist gesetzt, auch mit Zeilenumbruch (also im Raw mit einem \ ).
Ich bin verwirrt.

Grüße
FHEM in einem Dockercontainer
VCCU mit 3x HM-MOD-UART und 1x HmLGW
1x CCU2
2x nanoCUL 433MHz, 3x RPi3, Unifi-Controller mit drei APs für presence und Unifi Protec
div. weitere HM, ein paar HmIP Geräte und div. Shellys

ToM_ToM

Hast du denn ein Device mit dem Namen "PostMe"?
Wahrscheinlich vom gleichnamigen Typ:
https://fhem.de/commandref.html#PostMe

VG, Thomas
Hardware: BananaPi, Busmaster CUL, SanDisk 16GB Ultra SD, 16 GB USB-Stick | Software: Armbian, FHEM 5.8

1of16

Zitat von: ToM_ToM am 11 Juni 2018, 11:51:18
Hast du denn ein Device mit dem Namen "PostMe"?
Wahrscheinlich vom gleichnamigen Typ:
https://fhem.de/commandref.html#PostMe

VG, Thomas
oh man....ja, das ist es.
erst
define PostMe PostMe
Und dann noch
set create Einkaufsliste
Jetzt funktioniert es.

Danke dir!
....so schnellt der WAF in die Höhe ;)

Grüße

FHEM in einem Dockercontainer
VCCU mit 3x HM-MOD-UART und 1x HmLGW
1x CCU2
2x nanoCUL 433MHz, 3x RPi3, Unifi-Controller mit drei APs für presence und Unifi Protec
div. weitere HM, ein paar HmIP Geräte und div. Shellys

Rainerlan_2

#478
Hallo,

ich finde das Modul wirklich toll.
Nur leider bekomme ich 2 Dinge überhaupt nicht zum laufen - und habe auf Eure Hilfe gehofft:)

1) (zurück) funktioniert bei mir nicht. (Abbrechen) und (beenden) aber schon.
Habe in diesem Thread das Problem schon ein paarmal gesehen, aber keine für mich passende Antwort gefunden.
Mir scheint ich habe irgendwas noch falsch konfiguriert - In ROOMATE, msgConfig, msgDialog - ich weiß es nicht.

Ein Indiz ist vielleicht, dass das Reading <MeinName>_history im meta_Dialog immer "leer" angelegt wird (nach dem beenden des eigentlichen Dialogs wieder korrekt gelöscht). Die History steht stattdessen im Reading <MeinName>_history in dem Dialog, aus dem ich zum Beispiel in den meta_Dialog zurück möchte. Woher bekommt der meta_dialog das (history) reading - damit der korrekte TRIGGER aufgerufen werden kann?

2) Wenn ich (ohne das Inline-Keyboard konfiguriert zu haben) nach Abbruch des "meta-Dialog"s auf den Inline-Key des "%me%" readings drücke, kommt der Fehler "UNAUTHORIZED: TelegramBot FHEM request from user : <MeinName> (<MeineTelegramID>) Msg: Callback for inline query id: <ID> from :<MeineTelegramID>: data: <MeinName>".

Ich bin für jede Hilfe dankbar!
Viele Grüße
Rainer

Rainerlan_2

Naja, wenn sich keiner erbarmt - hab ich mich selber mühsam auf Fehlersuche begeben.

Lösung für das 1. Problem - "Zurück" (wie im meta_Dialog definiert) funktioniert nicht:
Lösung: Wenn in einem Trigger keine weiteren Sub-trigger definiert sind, bleibt das Reading $User_history (im entsprechenden msgDialog) <void>.
Imho ein Bug. Kann man auf 2 Arten lösen:
a) Ein "Dummy-sub-trigger" unterhalb des Triggers, der sonst keine unter-Trigger hätte - definiert mit einer leeren message: [].
b) Über ein command "set $SELF say <übergeordneterTrigger>" einfach selbst eine Ebene hochspringen. Dann braucht man auch das "zurück" im meta_Dialog nicht (und das $User_history reading kann dann leer bleiben)

Für das 2. Problem - Inline-keyboard-Fehler:
a) Im TelegramBot device das Default-peer reading löschen (sonst gehts daneben mit der Fehlermeldung aus vorigem Post)
b) die erlaubten Peers im Reading cmdRestrictedPeer auf jeden Fall durch ein <blank> trennen.
(Ich hatte ein Komma verwendet, mit dem Effekt, dass das inline-Keyboard trotz gelöschtem Default-peer keine Reaktion zeigte)
Wär' vielleicht ein Hinweis im Wiki wert. Für dummies wie mich.