msgDialog: Instant Messaging als FHEM Interface

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

Vorheriges Thema - Nächstes Thema

schnitzelbrain

Zitat von: wolfram am 29 August 2018, 20:31:46
Hallo und guten Abend,

eine kurze Frage an die Experten, denn bei meiner Suche habe ich nicht genau das gefunden, was ich gesucht habe (hoffentlich bin ich hier richtig):

Wenn meine Waschmaschine fertig ist bekomme ich per Telegram eine Nachricht, dass die Waschmaschine fertig ist - super.
Nun ist es aber so, dass ich mich "zwingen" möchte diese auszuräumen. Mit anderen Worten hätte ich gern:

- Einen Dialog, der in bestimmten Intervallen (alle 10) min "nervt", also die Nachricht wieder und wieder versendet, bis ich ein bestimmtes Schlüsselwort, oder ähnliches versendet habe, dass die Waschmaschine ausgeräumt ist.

Hat jemand sowas schon umgesetzt und kann mich auf den Weg bringen?

Liebe Grüße und einen schönen Abend
wolf
Hallo,

ich  würde beim auslösen der Telegram Nachricht noch ein Dummy setzen und in einem DOIF auswerten.
Im DOIF dann das attr repeatcmd benutzen.



Grüße Schnitzelbrain

igami

Oder nach der message ein command "sleep ... $SELF; set $SELF say ..."
Beim abbrechen dann das sleep abbrechen, das steht in der doku zu sleep
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

wolfram

Hallo,
zuerst einmal Danke für die Antworten/Anregungen. Ich versuche mich mich gerade grundsätzlich an den Telegram Dialogen, weil ich die Art der Kommunikation super finde, stehe aber ganz am Anfang der Lernkurve (copy&paste klappt schon ganz gut 8) ).

Zum Thema:
Im Moment schreibe ich in einen Dummy, wenn die Waschmaschine fertig ist. Den prüf ich dann ganz simpel mit einem Notify, das dann die Nachricht versendet:

HR.SpuelmaschineBetrieb:standby set telebot msg 🖐 Die Spülmaschine ist fertig 🖐

Klar, kann ich das Notify um einige Befehle erweitern, das bekomme ich schon hin:

HR.SpuelmaschineBetrieb:standby set telebot msg 🖐 Die Spülmaschine ist fertig 🖐;sleep 10;set telebot msg 🖐 Die Spülmaschine ist fertig und noch nicht ausgeräumt 🖐....usw

Das funktioniert auch. Jetzt hänge ich aber. Wie bekomme ich es 1. hin, dass ich den Dialog nicht 10 x in mein Notify schreiben muss und wie bekomme ich ein Schlüsselwort - gern auch einen Dialog hin, dass ich die Nachrichten abbrechen kann?

Wahrscheinlich ganz einfach, aber ich raff es einfach nicht  :'(

Viele Grüße
wolf

schnitzelbrain

Zitat von: wolfram am 30 August 2018, 12:40:43
Hallo,
zuerst einmal Danke für die Antworten/Anregungen. Ich versuche mich mich gerade grundsätzlich an den Telegram Dialogen, weil ich die Art der Kommunikation super finde, stehe aber ganz am Anfang der Lernkurve (copy&paste klappt schon ganz gut 8) ).

Zum Thema:
Im Moment schreibe ich in einen Dummy, wenn die Waschmaschine fertig ist. Den prüf ich dann ganz simpel mit einem Notify, das dann die Nachricht versendet:

HR.SpuelmaschineBetrieb:standby set telebot msg [emoji870] Die Spülmaschine ist fertig [emoji870]

Klar, kann ich das Notify um einige Befehle erweitern, das bekomme ich schon hin:

HR.SpuelmaschineBetrieb:standby set telebot msg [emoji870] Die Spülmaschine ist fertig [emoji870];sleep 10;set telebot msg [emoji870] Die Spülmaschine ist fertig und noch nicht ausgeräumt [emoji870]....usw

Das funktioniert auch. Jetzt hänge ich aber. Wie bekomme ich es 1. hin, dass ich den Dialog nicht 10 x in mein Notify schreiben muss und wie bekomme ich ein Schlüsselwort - gern auch einen Dialog hin, dass ich die Nachrichten abbrechen kann?

Wahrscheinlich ganz einfach, aber ich raff es einfach nicht  :'(

Viele Grüße
wolf
Wie ich vorgeschlagen hatte.

Mit einem DOIF.
Im DOIF dann das attr repeatcmd benutzen.

Grüße Schnitzelbrain


Wolle02

Hallo Igami,

auch von mir zunächst einmal ein dickes "Dankeschön" für dieses Modul. nach einer gewissen Einlese- und Eingewöhnungszeit funktioniert es eigentlich auch sehr gut. Ich habe nur ein kleines "Schönheitsproblem"  ;D
Ich habe beispielsweise folgenden Dialog:

defmod Informationen_dialog msgDialog {\
  "Informationen": {\
    "message": [\
      "(mobile Blitzer|Notdienstapotheke) ",\
      "(%me%) ",\
      "Welche Information wird benötigt?"\
    ],\
\
"mobile Blitzer":{\
  "message": "Aktuelle Blitzer in Deiner Umgebung (Radius: [Blitzer:maxkm] Km):\n\n[Blitzer:PushText]",\
"commands": "set $SELF say @$recipient Informationen"\
},\
\
"Notdienstapotheke": {\
"message": "Folgende Apotheke hat derzeit Notdienst:\n\n[NotdienstApotheke:STATE]",\
"commands": "set $SELF say @$recipient Informationen"\
    }\
  }\
}
attr Informationen_dialog allowed everyone


Funktionieren tut das soweit auch. Irgendwo in diesem Thread habe ich gelesen, dass die "commands" vor den "messages" ausgeführt werden. Das führt nun dazu, dass jedesmal bevor ich die aktuellen Blitzer zugesandt bekomme auch noch einmal die Frage gestellt bekomme "Welche Information wird benötigt?". Das macht an dieser Stelle allerdings gar keinen Sinn, sondern sie sollte sinnigerweise gesendet werden NACHDEM die aktuelle Information übermittelt wurde.
Wie gesagt nur ein Schönheitsproblem, aber gibt es irgendeine Möglichkeit die Reihenfolge wie die Nachrichten kommen zu beeinflussen?

Danke und Gruß
Wolle

igami

Zitat von: Wolle02 am 30 August 2018, 19:56:51
Wie gesagt nur ein Schönheitsproblem, aber gibt es irgendeine Möglichkeit die Reihenfolge wie die Nachrichten kommen zu beeinflussen?
Du kannst eine message als command verschicken (ungetestet)

"commands": "msg push @$recipient ..."

Wahrscheinlich währe es aber Sinnvoll, wenn ich noch eine Möglichkeit einbaue, dass zu steuern. Neuer Parameter "intro" oder so?
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

Wolle02

Danke für den Tip.

ZitatDu kannst eine message als command verschicken (ungetestet)


"commands": "msg push @$recipient ..."

Das funtioniert gut. Die Meldungen kommen so in der richtigen Reihenfolge.

ZitatWahrscheinlich währe es aber Sinnvoll, wenn ich noch eine Möglichkeit einbaue, dass zu steuern. Neuer Parameter "intro" oder so?

Eine Möglichkeit das auch über einen Parameter steuern zu können würde wahrscheinlich die Flexibilität erhöhen, wobei ich das nicht wirklich beurteilen kann.

Vielen Dank erstmal an dich.

wolfram

#532
Vielen Dank für die Eingebungen.

Ich habe es jetzt wie folgt gelöst - kann man bestimmt besser machen, aber es läuft - Danke nochmal. Vielleicht braucht es ja ein Anfänger wie ich nochmal:

1. Ein Dummy der beim Fertigstellen des Waschgangs gesetzt wird:

define Spuelmaschine_telegram dummy
attr Spuelmaschine_telegram eventMap on:voll off:leer
attr Spuelmaschine_telegram room Kueche
attr Spuelmaschine_telegram setList voll leer


2. Einen Message Dialog für Telegram:
define D_Spueli_fertig msgDialog {\
  "Spüli": {\
    "message": [\
      " (Ist die Spülmaschine schon ausgeräumt?) (JA|NEIN) ",\
      "Meldung von 🍽",\
      "Die Spülmaschine ist fertig und kann ausgeräumt werden!"\
    ],\
    "NEIN": {\
      "commands": [\
        "%me%"\
      ]\
    },\
    "JA": {\
      "commands": [\
        "set Spuelmaschine_telegram off",\
        "%me%"\
      ]\
    }\
  }\
}
attr D_Spueli_fertig allowed everyone,wolf
attr D_Spueli_fertig room Dialog


3. Das DOIF
define Spueli_message DOIF ([Spuelmaschine_telegram] eq "voll") (set D_Spueli_fertig say Spüli) DOELSEIF ([Spuelmaschine_telegram] eq "leer") (set telebot msg Sehr gut! 👍🏻 )
attr Spueli_message do always
attr Spueli_message repeatcmd 600
attr Spueli_message room Notify


Viele Grüße und ein schönes Wochenende
wolf

Vielen Dank für die Eingebungen.

Ich habe es jetzt wie folgt gelöst - kann man bestimmt besser machen, aber es läuft - Danke nochmal. Vielleicht braucht es ja ein Anfänger wie ich nochmal:

1. Ein Dummy der beim Fertigstellen des Waschgangs gesetzt wird:

define Spuelmaschine_telegram dummy
attr Spuelmaschine_telegram eventMap on:voll off:leer
attr Spuelmaschine_telegram room Kueche
attr Spuelmaschine_telegram setList voll leer


2. Einen Message Dialog für Telegram:
define D_Spueli_fertig msgDialog {\
  "Spüli": {\
    "message": [\
      " (Ist die Spülmaschine schon ausgeräumt?) (JA|NEIN) ",\
      "Meldung von 🍽",\
      "Die Spülmaschine ist fertig und kann ausgeräumt werden!"\
    ],\
    "NEIN": {\
      "commands": [\
        "%me%"\
      ]\
    },\
    "JA": {\
      "commands": [\
        "set Spuelmaschine_telegram off",\
        "%me%"\
      ]\
    }\
  }\
}
attr D_Spueli_fertig allowed everyone,wolf
attr D_Spueli_fertig room Dialog


3. Das DOIF
define Spueli_message DOIF ([Spuelmaschine_telegram] eq "voll") (set D_Spueli_fertig say Spüli) DOELSEIF ([Spuelmaschine_telegram] eq "leer") (set telebot msg Sehr gut! 👍🏻 )
attr Spueli_message do always
attr Spueli_message repeatcmd 600
attr Spueli_message room Notify


Viele Grüße und ein schönes Wochenende
wolf

nanocosmos

Hallo zusammen,

erstmal vielen Dank für das Modul!
Leider scheitere ich schon beim Einrichten.
Habe mich an den Eintrag im Wiki gehalten. Wenn ich nun den meta Dialog einrichten will erscheint:
Usage: define <name> msgDialog {JSON}
'"' expected, at character offset 1 (before "\\   "Hallo": {\\   ...") at ./FHEM/76_msgDialog.pm line 93.


Ich hatte bereits im Thread gelesen, dass das gleiche Problem hatte. Leider stehe ich total auf dem Schlauch, was die Lösung angeht.
ZitatLeerzeichen getrennte Liste von Name=Wert Paaren

Anbei mal meine RAW Definition:
defmod myMsgConfig msgConfig
attr myMsgConfig userattr msgDialog_evalSpecials:textField-long msgDialog_msgCommand:textField
attr myMsgConfig comment FHEM Global Configuration for command 'msg'
attr myMsgConfig group Global
attr myMsgConfig msgContactPush ***
attr myMsgConfig msgDialog_evalSpecials me=Hallo\ TelegramBot=***
attr myMsgConfig msgType text
attr myMsgConfig stateFormat fhemMsgState
attr myMsgConfig verbose 3


Könnte mich bitte jemand vom Schlauch schubsen...  ;D

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

nanocosmos

Hallo,
danke für die schnelle Antwort.
Leider besteht der Fehler weiterhin.
Usage: define <name> msgDialog {JSON}
'"' expected, at character offset 1 (before "\\   "Hallo": {\\   ...") at ./FHEM/76_msgDialog.pm line 93.

igami

Zeig doch mal bitte was du genau einfügen willst.
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

nanocosmos

Ich kopiere die Definition des metaDialogs und packe ihn in die Leiste oben im FHEMWeb. Auch wenn ich einen leeren metaDialog anlege und dann in die DEF kopiere, erscheint der gleiche Fehler:
defmod meta_Dialog msgDialog {\
  "%me%": {\
    "match": "\/?(start|%me%)",\
    "commands": "deletereading TYPE=msgDialog $recipient_history",\
    "message": [\
      "{return('(' . join(') (', sort{lc($a) cmp lc($b)} (split('\n', fhem('get TYPE=msgDialog:FILTER=NAME!=$SELF:FILTER=allowed=.*($recipient|everyone).* trigger', 1)))) . ') (abbrechen) ')}",\
      "Ich kann folgendes für dich tun:"\
    ]\
  },\
  "zurück": {\
    "commands": "set $recipient_history=.+ say @$recipient {(ReadingsVal($DEV, '$recipient_history', '') =~ m/((.+)\\|.+$)/;;;; return($2 || $1);;;;)}"\
  },\
  "abbrechen": {\
    "match": "\/?abbrechen",\
    "commands": "deletereading TYPE=msgDialog $recipient_history",\
    "message": [\
      "TelegramBot_MTYPE=queryInline (%me%) ",\
      "Dialog abgebrochen."\
    ]\
  },\
  "beenden": {\
    "match": "\/?beenden",\
    "commands": "deletereading TYPE=msgDialog $recipient_history",\
    "message": [\
      "TelegramBot_MTYPE=queryInline (%me%) ",\
      "Dialog beendet."\
    ]\
  }\
}

binford6000

Hallo,
du musst den Code in eine RAW Definition packen und dann auf Execute commands klicken  ;)
VG Sebastian

nanocosmos

Vielen Dank, das wars!  :)
Viele Grüße
Daniel