msgDialog: Instant Messaging als FHEM Interface

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

Vorheriges Thema - Nächstes Thema

ErzGabriel

Hat sich in dem Sinne erledigt, meine Maus war nicht in der Lage mir mitzuteilen, das  sie die Nachricht erhält.
Klappt also, winzigste, ich erhalte es auch noch, was ich eigentlich gar nicht wollte.
sub pollen() {
my $msg;
my @V****;
my @plants = ("Birke", "Erle", "Graeser", "Hasel", "Roggen");
foreach my $plant (@plants) {
my $pol = ReadingsVal("Pollen","fc2_$plant", "");
if ($pol !~ /white|yellow/) {
$msg .= "🌳"  if ($plant =~ /Birke|Erle/);
$msg .= "🌿"  if ($plant =~ /Graeser/);
$msg .= "🌾"  if ($plant =~ /Roggen/);
$msg .= "🌰"  if ($plant =~ /Hasel/);
$msg .= "$plant: leicht 🟡\n" if ($pol =~ /yellow/);
$msg .= "$plant: mittel 🟠\n" if ($pol =~ /orange/);
$msg .= "$plant: hoch 🔴\n" if ($pol =~ /red/);
}
}
fhem("set Jarvis msg @V**** $msg") if ($msg);
}


defmod doif_Pollen DOIF ([18:00]) ({pollen()})
attr doif_Pollen do always
attr doif_Pollen room Telegram


Ist zwar ne unnötige Nachricht auf meine Smartphone aber kann ich zur Not mit leben.

binford6000

#736
Zitat von: ErzGabriel am 02 Mai 2020, 11:42:00
Hat sich in dem Sinne erledigt, meine Maus war nicht in der Lage mir mitzuteilen, das  sie die Nachricht erhält.
Klappt also, winzigste, ich erhalte es auch noch, was ich eigentlich gar nicht wollte.
sub pollen() {
my $msg;
my @V****;
my @plants = ("Birke", "Erle", "Graeser", "Hasel", "Roggen");
foreach my $plant (@plants) {
my $pol = ReadingsVal("Pollen","fc2_$plant", "");
if ($pol !~ /white|yellow/) {
$msg .= "🌳"  if ($plant =~ /Birke|Erle/);
$msg .= "🌿"  if ($plant =~ /Graeser/);
$msg .= "🌾"  if ($plant =~ /Roggen/);
$msg .= "🌰"  if ($plant =~ /Hasel/);
$msg .= "$plant: leicht 🟡\n" if ($pol =~ /yellow/);
$msg .= "$plant: mittel 🟠\n" if ($pol =~ /orange/);
$msg .= "$plant: hoch 🔴\n" if ($pol =~ /red/);
}
}
fhem("set Jarvis msg @V**** $msg") if ($msg);
}


defmod doif_Pollen DOIF ([18:00]) ({pollen()})
attr doif_Pollen do always
attr doif_Pollen room Telegram


Ist zwar ne unnötige Nachricht auf meine Smartphone aber kann ich zur Not mit leben.

Ja du bist halt in PERL. Brauchst aber kein Array definieren:
my @V****;
So gehts auch:
{ my $recipient ="@";
$recipient .= "V****";
fhem("msg push $recipient $msg")
}


Man könnte das "@" bestimmt auch noch maskieren, weiß aber gerade nicht wie... Deshalb Quick and dirty concat...  ;D

VG Sebastian

gestein

#737
Hallo,

ich wollte heute meine Dialoge um die neuen Lichter erweitern und komme mit der Syntax für die Trigger und match nicht zusammen:

Die folgenden Menüpunkte sind im Dialog und ich würde gerne alle Trigger - außer die für die Terrassen - in einem Eintrag abfangen:
{"💡Beleuchtung":{
  "message": [
    "(💡Terrasse West) ",
    "(💡Terrasse West Podest) ",
    "(💡Terrasse Ost) ",
    "(💡Badezimmer) ",
    "(💡Vorzimmer) ",
    "(💡Gästezimmer) ",
    "(💡Kinderzimmer) ",
    "(💡Gästebad) ",
    "(💡Schrankräume) ",
    "(💡Schlafzimmer) ",
    "(💡Küche) ",
    "(💡Wohnzimmer) ",
    "(💡🎄Weihnachten) ",
    "(🔚beenden|🔙zurück) ",
    "Was möchtest Du tun?"
],
"💡[^T].*":{
"message":[
"{GetLights('$message')}",
"Welche Lampe soll ich schalten?"
]
}, .....


Der Teil mit "💡[^T].*" wird aber nie aufgerufen.
Wenn ich dort z.B. "💡Gästezimmer" eintrage, wird die Funktion "GetLights" aufgerufen - aber nicht mit dem RegEx.

Was mache ich falsch bzw. wie muss ich das richtig machen?

Danke im Voraus
liebe Grüße
Gerhard

gestein

Manchmal kommt man auf die verzwicksten Dinge selber drauf, wenn man es jemand anderen erklären muss (oder wie hier eine Frage dazu formulieren muss):

Die Lösung scheint so zu sein: Der <Trigger> kann ein beliebiger Text sein, wenn im Feld "match" das Richtige steht.

Wenn ich in meinen Dialog die Zeile "match": "💡[^T].*" dazugebe, dann geht's.
"Lichter":{
"match": "💡[^T].*",
"message":[
"{GetLights($message);}",
"Welche Lampe soll ich schalten?"
]
},


lg, Gerhard

ErzGabriel

Hi zusammen.
Ich habe da mal ne Frage. Ich bin beruflich täglich in zwei bis drei Städten unterwegs und da zur Zeit Corona ja fleißig steigt, hats man in jeder Stadt eine andere Inzidenzzahl und somit anderen Vorgaben. Da drauf hin habe ich mir nach dem Thread https://forum.fhem.de/index.php/topic,113798.0.html mir die Daten vom RKI ins Fhem geholt.
Alles soweit eingerichtet und klappt auch super. Nun möchte ich gerne, das mein Bot mir morgens vor Arbeitsbeginn die Inzidenz der drei Städte schickt. Mit einer normalen Pushnachricht kriege ich nur einen Wert übermittelt und mir drei Nachrichten schicken lassen, finde ich doof.

Meine Frage, wie kriege ich das hin, das mir die drei Werte in einer Nachricht geschickt werden. Ich bin für Perl einfach zu blöde. Sorry.

onkel-tobi

Hi zusammen,

ich stehe aktuell auf dem Schlauch, was das das zurück zum metaDialog angeht.
Folgendes habe ich konfiguriert:
defmod msg_cams msgDialog {\
"Kameras": {\
"message": [\
"(Kamera Tür) ",\
"(Kamera Garten) ",\
"(Kamera 3d-Drucker) ",\
            "(abbrechen|🔙zurück) ",\
"Menü Kameras"\
]\
},\
"Kamera Tür": {\
"commands": "set FHEM_Bot sendImage /opt/fhem/www/images/ipcams/ipcam1_snapshot.jpg",\
"message": [\
"So siehts vor der Tür aus aus!"\
]\
},\
"Kamera Garten": {\
"commands": "set SSCam.INSTAR_IN_9008HD snap",\
"message": [\
"So siehts in deinem Garten aus!"\
]\
},\
"Kamera 3d-Drucker": {\
"commands": [\
"get og_az_cam3d image",\
"set homy sendImage /tmp/og_az_cam3d_snapshot.jpg"\
],\
"message": [\
"So siehts auf Deinem 3d-Drucker aus!"\
]\
},\
  "🔙zurück": {\
      "commands": [\
            "set $SELF say @$recipient %me%"\
      ]\
      }\
}
attr msg_cams allowed rr_Sandra,rr_Tobi

setstate msg_cams rr_Tobi: 🔙zurück
setstate msg_cams 2020-11-15 12:36:29 state rr_Tobi: 🔙zurück

Aber bei drücken auf zurück passiert nichts.

Der Metadialog:

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."\
]\
}\
}
attr meta_Dialog allowed everyone

setstate meta_Dialog rr_Tobi: do
setstate meta_Dialog 2020-11-15 12:40:27 state rr_Tobi: do

Hat jemand einen Tipp für mich?

Danke & Gruß,
Tobi

onkel-tobi

#741
Zitat von: ErzGabriel am 26 Oktober 2020, 18:19:09
Hi zusammen.
Ich habe da mal ne Frage. Ich bin beruflich täglich in zwei bis drei Städten unterwegs und da zur Zeit Corona ja fleißig steigt, hats man in jeder Stadt eine andere Inzidenzzahl und somit anderen Vorgaben. Da drauf hin habe ich mir nach dem Thread https://forum.fhem.de/index.php/topic,113798.0.html mir die Daten vom RKI ins Fhem geholt.
Alles soweit eingerichtet und klappt auch super. Nun möchte ich gerne, das mein Bot mir morgens vor Arbeitsbeginn die Inzidenz der drei Städte schickt. Mit einer normalen Pushnachricht kriege ich nur einen Wert übermittelt und mir drei Nachrichten schicken lassen, finde ich doof.

Meine Frage, wie kriege ich das hin, das mir die drei Werte in einer Nachricht geschickt werden. Ich bin für Perl einfach zu blöde. Sorry.
Bin mir nicht ganz sicher ob das hier im Thread richtig ist, geht aber so:
([07:47])(set homy send @#HA "Guten morgen, hier die neuesten Inzidenzzahlen:\nBorken: [RKI7:Borken]\nRhein Erft: [RKI7:Rhein-Erft-Kreis]\nKöln: [RKI7:Koln]\nMünster: [RKI7:Munster]")

eTax

Hi zusammen,

danke auch von meiner Seite für das Modul! Klappt soweit gut. Ich versuche mich gerade am Heizungsdialog von subseven.

Ich würde gerne 3 Thermostate vom Typ HM-CC-RT-DN damit steuern:

Die Geräte befinden sich in den jeweiligen Räumen.

Da die Temperatur der HM-Thermostate für das Gerät *_Clima gesteuert wird, klappt bei mir noch nicht die Auswahl des richtigen Gerätes im Dialog über :FILTER=....
Hier das Original von subseven zum setzen der Temperatur:
"{my $temp = \"$message\";;;;;;;; $temp =~ s/([\\d]{1,2}\\.[\\d{1}])/$1/g;;;;;;;; my $room = ReadingsVal(\"$SELF\", \"$recipient_Room\", \"\");;;;;;;;  fhem (\"set room=$room:FILTER=type=HeatingThermostat desiredTemperature $temp \");;;;;;;; }"\

Und hier mein Versuch für meine Thermostate:
"{my $temp = \"$message\";;;;;;;; $temp =~ s/([\\d]{1,2}\\.[\\d{1}])/$1/g;;;;;;;; my $room = ReadingsVal(\"$SELF\", \"$recipient_Room\", \"\");;;;;;;;  fhem (\"set room=$room:FILTER=NAME!=.*_Clima desired-temp $temp\");;;;;;;; }"\

Leider funktioniert das noch nicht. Ich habe auch die Befehle schon direkt probiert:
set room=Flur:FILTER=NAME!=.*_Clima desired-temp 13 -  Fehler: Unknown argument desired-temp
set room=Flur:FILTER=type=CUL-HM:FILTER=NAME!=.*_Clima desired-temp 13 -  Der Raum "Flur" wird aufgerufen.

Hat jemand eine Idee, wie die richtige Syntax lautet?

eTax

Ok, hat geklappt mit

set room=$room:FILTER=model=HM-CC-RT-DN:FILTER=chanNo=04 desired-temp $temp

matrois

Hallo zusammen,
ich will bei msgDialog tiefer einsteigen. Ich habe bereits Dialoge zum Übertragen eines Kamerabildes von meiner Kamera (funktioniert nicht ganz, weil immer erst das zweite Bild aktuell ist), zur Rückmeldung ob irgendwo Batterien leer sind und zur Rückmeldung ob noch Fenster oder Türen offen sind erfolgreich angelegt. Jetzt kommt der erste Dialog mit Untermenü und dabei komme ich etwas ins Stolpern. Ich möchte einen Dialog Heizung aufrufen bei dem ich gefragt werde wo aufgeheizt werden soll. Im folgenden Auswahlmenü möchte ich zwischen "Bad" und "Büro" auswählen. Der folgende Dialog funktioniert zwar, aber...


defmod dialog_heizung msgDialog {\
  "Heizung": {\
    "match": "\/Heizung",\
    "commands": "deletereading TYPE=msgDialog $recipient_history",\
    "message": [\
      "(Büro) ",\
      "(Bad) ",\
      "Wo soll die Temperatur erhöht werden?"\
    ]},\
    "Büro": {\
         "commands": "set cc_clima_buero desired-temp 21",\
         "message": "Temperatur im Büro auf 21°C gestellt."\
            },\
    "Bad": {\
         "commands": "set tc_climate_bad desired-temp 23",\
         "message":  "Temperatur im Bad auf 23°C gestellt."\
            }\
}
attr dialog_heizung allowed everyone
attr dialog_heizung group IO
attr dialog_heizung room _FHEM

setstate dialog_heizung 2021-01-10 17:50:28 state Initialized


Meine Frage bzw. mein Problem: Die Menüeinträge "Bad" und "Büro" werden sowohl im Hauptmenü (über meta_Dialog wie im Wiki beschrieben) als auch im "Untermenü" Heizung angezeigt. Wie kann ich das abstellen? Vielen Dank für Tipps.
Viele Grüße,
matrois.
FHEM: 5.9@docker@qnap | 5.9@raspberry pi III
IO: HMLAN | HMUART | Jeelink | MySensors
CUL_HM: CC-RT-DN | SEC-SCo | Sen-DB-PCB | TC-WM-W-EU
Module / Konfig: configdb | FHEMWEB | FRITZBOX | FileLog | HMinfo | IPCAM | SIP | Abfall | Tablet UI - FUIP | Sonoff/Tasmota

matrois

Hallo zusammen,
ich habe die Antwort gefunden. Bin wohl etwas durcheinander gekommen mit den ganzen Klammern, Kommas und Leerzeichen... Hier mein funktionierender Dialog mit dem "Extra" der Temperaturanzeige im Menü (habe ich im Thread gefunden, für gut befunden und übernommen  ;) )


{
  "Heizung": {
    "match": "\/Heizung",
    "message": [
      "(Büro # Soll [cc_dev_buero:desired-temp]°C # Ist [cc_dev_buero:measured-temp]°C) ",
      "(Bad # Soll [tc_dev_bad:desired-temp]°C # Ist [tc_dev_bad:measured-temp]°C) ",
      "(beenden) ",
      "Wo soll die Temperatur erhöht werden?"
    ],
    "Büro": {
         "match": "Büro.*",
         "commands": "set cc_clima_buero desired-temp 21",
         "message": "Temperatur im Büro auf 21°C gestellt."
            },
    "Bad": {
         "match": "Bad.*",
         "commands": "set tc_climate_bad desired-temp 23",
         "message":  "Temperatur im Bad auf 23°C gestellt."
          }
   }
}
FHEM: 5.9@docker@qnap | 5.9@raspberry pi III
IO: HMLAN | HMUART | Jeelink | MySensors
CUL_HM: CC-RT-DN | SEC-SCo | Sen-DB-PCB | TC-WM-W-EU
Module / Konfig: configdb | FHEMWEB | FRITZBOX | FileLog | HMinfo | IPCAM | SIP | Abfall | Tablet UI - FUIP | Sonoff/Tasmota

ErzGabriel

Hallo zusammen.
Da ich mein Fhem System komplett neu aufgesetzt habe, neuer RPi, neue Installation von Fhem, muss ich natürlich auch den Bot neu einrichten.
Aber ich bin irgendwie zu blöde dazu, habe die gleichen Probleme wie ich sie schon damals damit hatte.
Ich habe nach dem Wiki, den Bot angelegt und dann den msgDialog.

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 Jarvis
attr myMsgConfig msgDialog_evalSpecials me=Jarvis TelegramBot=Jarvis
attr myMsgConfig msgType text
attr myMsgConfig room Telegram
attr myMsgConfig stateFormat fhemMsgState
attr myMsgConfig verbose 3


Alles geklappt, jetzt wollte ich den meta_Dialos anlegen und kriege immer wieder die gleiche Fehlermeldung:
ZitatUsage: define  msgDialog {JSON}

'"' expected, at character offset 1 (before "(end of string)") at ./FHEM/76_msgDialog.pm line 93.

Mein meta_Dialog sieht wie folgt aus:
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."
    ]
  }
}


Ich schnalle einfach nicht, was ich da wieder falsch mache. Kann mir bitte jemand helfen? Danke.

gestein

#747
Wenn ich Deinen meta_dialog bei mir probiere, bekomme ich auch einen Fehler.

Probier mal folgendes:
1) einen leeren msgDialog anlegen mit
defmod meta_Dialog msgDialog {}
2) unter Def die Definition ändern, sprich den restlichen Code einfügen und "modify" drücken.

Damit sollte es klappen.

lg, Gerhard

Edit: Code korrigiert.

ErzGabriel

#748
Hallo Gerhard.

Defmode ist ein unbekannter Befehl und gehe ich von einem Schreibfehler aus, das es defmod heißen soll. Das war die Methode, die ich versucht habe. Einen Modify Button habe ich nciht.

Ist der meta_Dialog aus dem Wiki.

gestein

Tja, die Rechtschreibprüfung  ::)
Tschuldige. Natürlich war defmod gemeint.

Nachdem Du den leeren meta_Dialog angelegt hast, kannst Du die Definition des Devices in der Device-Übersicht ändern indem Du auf das "DEF" klickst.
In dem Feld kannst Du dann die ausführliche Definition reinkopieren - also nur das was in den geschwungenen Klammern steht (ohne "defmod meta_Dialog msgDialog").

Unter dem Feld ist ein Link namens "modify meta_Dialog".
Wenn Du darauf klickst, wird die neue Definition übernommen und alles sollte funktionieren.

Manchmal scheint sich fhem bei komplexeren Definitionen zu verschlucken.
Da hilft es ein leeres Device anzulegen und dann die Definition zu ändern.

lg, Gerhard