msgDialog: Instant Messaging als FHEM Interface

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

Vorheriges Thema - Nächstes Thema

PSI69

Noch einmal ich ;D

Jetzt beim Versenden eines Plots...

Laut Wiki Beispiel, habe ich das so umgesetzt:

"Steckdose Schuppen Verlaufsdiagramm": {
      "commands": "set %TelegramBot% cmdSend {plotAsPng('%aussen_plot%')}",
      "message": [
        "(%me%) $message",
      ]
    },


Leider bekommt dann die Nachricht immer der defaultPeer über Telegram.  Zum einen soll der richtige User des Dialoges die Nachricht bekommen, zum anderen möchte ich das nicht auf Telegram festnageln, sondern flexibel lassen.

Das hier hat mich auch nicht weiter gebracht, hier kommt kein Plot, sondern nur Müll im Logfile, hm:

"Steckdose Schuppen Verlaufsdiagramm": {
      "message": [
        "(%me%) $message",
        "{set %TelegramBot% cmdSend {plotAsPng('%aussen_plot%')}}"
      ]
    },


Wie macht ihr das, Plots (oder Bilder von z. Bsp. einer IPCam) per Push flexibel an den richtigen Teilnehmer???

Danke Peter
FHEM auf RPi 5 unter Bookworm mit inzwischen einem ganzen Zoo von Geräten...

binford6000

ZitatWie macht ihr das, Plots (oder Bilder von z. Bsp. einer IPCam)...???
Hilft Dir wahrscheinlich nicht wirklich weiter - ich lasse mir bereits von mehreren Stellen ein IPCam Bild schicken. Daher ganz einfach via dummy/notify:
{"Kamerabild":{
  "commands": "set ipcamshot on",
  "message": [
    "(%me%) ",
    "Moment, ich schicke Dir ein Bild..."
  ]
}
}

Der Code für ein IPCam Bild ist ja dann trivial:
  {fhem "get Tablet.PCIPCam image; sleep 5; set <TelegramBot> sendImage ./www/snapshots/Tablet.PCIPCam_snapshot.jpg";}

Zitat...per Push flexibel an den richtigen Teilnehmer???

  • Arbeite momentan nur mit Telegram
  • Bin der einzige Empfänger
VG Sebastian

igami

Aus der TelegramBot Commandref:

cmdSend [ @<peer1> ... @<peerN> ] <fhem command>
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

PSI69

Danke für Eure Antworten!

Mir ist schon klar (hätte ich besser formulieren sollen, sorry!), wie ich Telegram zum Versenden von Bildern/SVGs bringe, das nutze ich auch bereits. Auch das 'cmdSend @peer' ist mir klar. Wo ich Probleme habe:

Ich bekomme zwar aus '$recipient:' mittels
{(split(":",AttrVal('rr_Peter','msgContactPush','')))[1]}
bzw. dann im Dialog
{(split(":",AttrVal('$recipient','msgContactPush','')))[1]}
an den gewünschten Telegram Empfänger, der den Dialog gerade bedient.

Aber, dem so ermittelten Telegram Empfänger eine Testnachricht zuzustellen, das bekomme ich nicht auf die Reihe:
set TeleBot message {(split(":",AttrVal('rr_Peter','msgContactPush','')))[1]} Testnachricht
... stellt mir den kompletten Text ab '{' als Nachricht zu; wertet also nicht, wie von mir gedacht/erwünsch, einfach den Perl Code aus und benutzt das Ergebnis in der Befehlszeile.

Als Ziel habe ich mir so eine Kombination vorgestellt:
set TeleBot cmdSend {(split(":",AttrVal('rr_Peter','msgContactPush','')))[1]} {plotAsPng('SVG_FileLog_hc_Steckdose.EXT.Schuppen')}
oder
set TeleBot cmdSend {((split(":",AttrVal('rr_Peter','msgContactPush','')))[1]);;plotAsPng('SVG_FileLog_hc_Steckdose.EXT.Schuppen')}
Wobei ich dann die fixen Angaben noch variabel machen würde. ... aber, klappt ja so nicht, hm.

Meine Frage an Euch: Wie kann ich die ermittelte Telegram ID aus dem ROOMMATE Device des aktuellen Dialog Nutzers sinnvoll mit 'Telebot cmdSend @xxxx' verbandeln?

Zuerst hatte ich mir vorgestellt 'msg' zum Versenden zu benutzen, also 'msg push @rr_Peter Testnachricht'. Das klappt auch, allerdings nur bei Text und nicht bei Bildern. Damit wäre das pro User flexibel, je nachdem welcher Messenger hat vom User benutzt wird. Davon (verschiedene Messenger) habe ich mich bei den Grafiken schon verabschiedet.

Danke Peter
FHEM auf RPi 5 unter Bookworm mit inzwischen einem ganzen Zoo von Geräten...

igami

Ich denke es ist sinnvoll, wenn man mehrere Nachrichten angeben könnte

...
"message": [
  ["TelegramBot_MTYPE=cmdSend {plotAsPng('SVG_FileLog_hc_Steckdose.EXT.Schuppen')}"],
  ["Hier das angeforderte Bild"]
]

Alternativ kann man das auch mit dem set say erreichen

{
  "Bild": {
    "commands": "set $SELF say @$recipient Bild|senden",
    "message": "Moment, ich schicke Dir ein Bild...",
    "senden": {
      "message": "TelegramBot_MTYPE=cmdSend {plotAsPng('SVG_FileLog_hc_Steckdose.EXT.Schuppen')}"
    }   
  }
}
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

PSI69

Hi igami!

Bei Deinem ersten Codeschnipsel, war ich mir nicht sicher, ob das schon funktioniert, oder ob das nur eine Überlegung von Dir ist, das Modul zu erweitern/zu verändern. Ausprobiert habe ich es trotzdem...


    "Steckdose Schuppen Verlaufsdiagramm": {
      "commands": "set %TelegramBot% message %TelegramBot% $recipient",
      "message": [
        ["TelegramBot_MTYPE=cmdSend {plotAsPng('SVG_FileLog_hc_Steckdose.EXT.Schuppen')}"],
        ["Hier das angeforderte Bild"],
        "(%me%) $message"
      ]
    },

... bringt mir im Telegram zwei 'ARRAY (0x...)' Zeilen zurück und nicht das Image.

    "Steckdose Schuppen Verlaufsdiagramm": {
      "commands": "set %TelegramBot% message %TelegramBot% $recipient",
      "message": [
        "TelegramBot_MTYPE=cmdSend {plotAsPng('SVG_FileLog_hc_Steckdose.EXT.Schuppen')}",
        "Hier das angeforderte Bild",
        "(%me%) $message"
      ]
    },

... bring 'Unknown command {plot...' im Telegram Interface.

Verwende ich das hier:

"Steckdose Schuppen Verlaufsdiagramm": {
      "commands": "set $SELF say @$recipient 'Steckdose Schuppen Verlaufsdiagramm|senden'",
      "message": "Steckdose Schuppen Verlaufsdiagramm",
      "senden": {
        "message": "TelegramBot_MTYPE=cmdSend {plotAsPng('SVG_FileLog_hc_Steckdose.EXT.Schuppen')}"
      }   
    },

... wirkt das 'set $self say...' nicht, ich bekomme nur die erste 'message' (Steckdose Schuppen Verlaufsdiagramm) im Telegram.

Danke Peter
FHEM auf RPi 5 unter Bookworm mit inzwischen einem ganzen Zoo von Geräten...

PSI69

... läßt mich nicht in Ruhe, das Thema ;D

Das hier klappt; sprich das SVG landet beim richtigen Empfänger:
"Steckdose Schuppen Verlaufsdiagramm": {
      "message":
        "TelegramBot_MTYPE=cmdSend {plotAsPng('SVG_FileLog_hc_Steckdose.EXT.Schuppen')}"
    },


Sobald ein zweiter Part '(%me%)' als Nachricht hinzukommt, hagelt es 'Unknown command...' Fehler im Telegram Interface.

@igami
Ich denke, das meintest Du mit Deinem ersten Codebeispiel - Du willst das Anpassen?

Danke und Tschau,
Peter
FHEM auf RPi 5 unter Bookworm mit inzwischen einem ganzen Zoo von Geräten...

igami


defmod plot msgDialog {\
  "plot": {\
    "commands": "set $SELF say @$recipient plot|send",\
"message": "das war das Bild",\
"send": {\
  "message": "TelegramBot_MTYPE=cmdSend {plotAsPng('Waschkeller_washer_SVG')}"\
}\
  }\
}

das funktioniert.

Ja, das mit den verschachtelten messages will ich noch einbauen.
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

Amenophis86

Ich wollte heute endlich auch mal das System testen, aber ich bekomme es nicht hin. Ich habe auf meinem Test-System einen Roomate: rr_Etienne diesem kann ich auch mittels msg @rr_Etienne Hallo direkt eine Pushnachricht schicken. Allerdings wenn ich den trigger "test" des folgenden MetaDialog an den Bot sende passiert nix. Hier der Metadialog fast komplett aus der CommandRef kopiert. Habe extra mal aus %me% als trigger "test" gemacht:

Internals:
   CFGFN
   DEF        {
  "test": {
    "match": "\/?(start|%me%)",
    "commands": "deletereading TYPE=msgDialog $recipient_history",
    "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:"
    ]
  },
  "zurück": {
    "commands": "set $recipient_history=.+|.+ say @$recipient {(ReadingsVal($DEV, '$recipient_history', '') =~ m/(.+)\\|.+$/;; return $2 ? $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."
    ]
  }
}
   MSGCOMMAND msg push \@$recipients $message
   NAME       meta_Dialog
   NOTIFYDEV  TYPE=(ROOMMATE|GUEST)
   NR         31
   NTFY_ORDER 50-meta_Dialog
   STATE      Initialized
   TRIGGER    abbrechen,beenden,test,zurück
   TYPE       msgDialog
   READINGS:
     2017-10-29 19:53:49   state           Initialized
Attributes:
   allowed    rr_Etienne
   evalSpecials me=test
TelegramBot=TelegramBot
#

Weiterhin wurde bei TelegramBot UTF8 auf 1 gesetzt und die Nachricht an den Bot ist in TelegramBot zu lesen.
Aktuell dabei unser neues Haus mit KNX am einrichten. Im nächsten Schritt dann KNX mit FHEM verbinden. Allein zwei Dinge sind dabei selten: Zeit und Geld...

igami

Werden denn Events für die Empfangene Nachricht im rr_Etienne Device erzeugt?
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

PSI69

Zitat von: igami am 29 Oktober 2017, 19:23:12

defmod plot msgDialog {\
  "plot": {\
    "commands": "set $SELF say @$recipient plot|send",\
"message": "das war das Bild",\
"send": {\
  "message": "TelegramBot_MTYPE=cmdSend {plotAsPng('Waschkeller_washer_SVG')}"\
}\
  }\
}

das funktioniert.

Ja, das mit den verschachtelten messages will ich noch einbauen.

Danke! Ich versuche das, komme aber erst morgen dazu :(
Peter
FHEM auf RPi 5 unter Bookworm mit inzwischen einem ganzen Zoo von Geräten...

Amenophis86

#131
Zitat von: igami am 30 Oktober 2017, 07:17:49
Werden denn Events für die Empfangene Nachricht im rr_Etienne Device erzeugt?

Ähm also ich glaube ich habe es noch nicht richtig verstanden. Im RESIDENT Device stehen die Nachrichte, die der Bot mir sendet und nicht die, die ich sende. Vermutlich ist das richtig, aber dann habe ich noch nicht verstanden, wie ich das Menü aufrufe. Ich dachte ich muss mit mit meinem Telegram dem Bot die Nachricht schicken, damit mir das Menü gezeigt wird. Oder ist das falsch?

Edit:
Also beim Resident steht, wenn ich zum Beispiel mittels msg @rr_Etienne test sende im Reading fhemMsgPush "test" drinnen. Ist das so richtig? Aber wenn ich selbst dem Bot eine Nachricht schicke, dann steht die nicht im Resident.
Aktuell dabei unser neues Haus mit KNX am einrichten. Im nächsten Schritt dann KNX mit FHEM verbinden. Allein zwei Dinge sind dabei selten: Zeit und Geld...

igami

Zitat von: Amenophis86 am 30 Oktober 2017, 18:20:45
Also beim Resident steht, wenn ich zum Beispiel mittels msg @rr_Etienne test sende im Reading fhemMsgPush "test" drinnen. Ist das so richtig? Aber wenn ich selbst dem Bot eine Nachricht schicke, dann steht die nicht im Resident.
Dann passt da etwas noch nicht. Die Zuordnung der eingehenden Nachrichen wird auch von dem msgConfig device übernommen. Die Nachricht sollte unter dem Reading "fhemMsgRcvPush" auftauchen.
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

Amenophis86

#133
Das msgConfig Device ist das globalmsg was automatisch angelegt wird?

Edit:
Also ich habe mir jetzt nochmal die Dokumentation von msg angeschaut und ich komme einfach damit nicht klar. Welches Attr muss ich wie setzen, dass die Nachrichten auch beim Resident ankommen, sowohl die er gesendet hat, als auch die für ihn bestimmten. Vermutlich hat es mit msgContactPush und msgRecipientPush zu tun, aber ich bekomme es nicht hin. Verstehe weder was im globalmsg noch was beim resident gesetzt werden muss. Sry.
Aktuell dabei unser neues Haus mit KNX am einrichten. Im nächsten Schritt dann KNX mit FHEM verbinden. Allein zwei Dinge sind dabei selten: Zeit und Geld...

igami

Zitat von: Amenophis86 am 31 Oktober 2017, 06:57:37
Das msgConfig Device ist das globalmsg was automatisch angelegt wird?

Edit:
Also ich habe mir jetzt nochmal die Dokumentation von msg angeschaut und ich komme einfach damit nicht klar. Welches Attr muss ich wie setzen, dass die Nachrichten auch beim Resident ankommen, sowohl die er gesendet hat, als auch die für ihn bestimmten. Vermutlich hat es mit msgContactPush und msgRecipientPush zu tun, aber ich bekomme es nicht hin. Verstehe weder was im globalmsg noch was beim resident gesetzt werden muss. Sry.
Ich finde die Dokumentation vom msg auch nicht sonderlich gut ::)

Im ROOMMATE musst du das Attribut msgContactPush wie folgt setzen: <TelegramBot>:@<peerID>
Bsp:

attr rr_igami msgContactPush myTelegramBot:@12345678
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