msgDialog: Instant Messaging als FHEM Interface

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

Vorheriges Thema - Nächstes Thema

gestein

Hallo,

Ich wollte die Begrüßung etwas freundlicher gestalten.
So in der Art ,,Hallo Gerhard, was kann ich für dich tun?"

Dazu hätte ich einfach die Rückmeldung im meta_Dialog ändern wollen:
"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) ')}",\
      "'Hallo ' . ReadingsVal($recipient, 'group','') . ', was kann ich für dich tun?'"\
    ]\


Damit sollte entweder mein Name oder der meiner Frau erscheinen.
Tut es aber nicht.
Wenn ich statt $recipient rr_Gerhard schreibe, dann kommt folgende Meldung im Telelgramn:
'Hallo ' . ReadingsVal(rr_Gerhard, 'group','') . ', was kann ich für dich tun?'

Könnte mir da bitte jemand helfen?
Danke, Lg, Gerhard

igami

Zitat von: gestein am 13 April 2019, 09:23:44
Könnte mir da bitte jemand helfen?
Die zweite Zeile auch noch mit {} versehen
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

gestein

Also wenn ich folgendes schreibe, reagiert das System gar nicht mehr:
"{'Hallo ' . [$recipient:group] . ', was kann ich für dich tun?'}"

Als log-Eintrag erscheint:
2019.04.13 18:42:56.268 1: No match: 'msgText: Marvis'
2019.04.13 18:42:56.271 1: Nothing to do: msgText: Marvis


Der Wert "group" ist nämlich ein Attribut, da kann ReadingsVal nicht helfen.

Was mache ich falsch?

igami

Du hast nun zwei Änderungen gleichzeitig gemacht. Jede für sich sollte funktionieren, zusammen aber nicht.
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

gestein

Manchmal sieht man den Wald vor lauter Bäumen nicht mehr.
Bei einem Roommate ist "group" kein Reading, sondern ein Attribut. Daher muss ich ja AttrVal nehmen.

Für alle, die das auch haben möchten, hier die richtige Zeile:
"{'Hallo ' . AttrVal('$recipient', 'group','') . ', was kann ich für dich tun?'}"

Danke und lg, Gerhard

gestein

Hallo,

nachdem die Begrüßung nun funktioniert ;) , bin ich dabei mir einen Dialog zu basteln, der alle Lampen auf meiner Terrasse schaltet.
Das funktioniert auch schon ganz gut.

Manchmal passiert es, dass die Lampen nicht funktionieren, da sie relativ weit weg sind (Empfangsprobleme).
Daher würde ich gerne im Message-Teil des Dialog alle nicht funktionierenden Lampen auflisten.
Das sollte über z.B. den "state" und den Raum funktionieren.
Ich könnte natürlich alle Lampen dort einzeln aufführen und den state prüfen.
Dann muss ich bei Änderungen aber auf den Dialog wieder ändern.

Ginge das auch automatisch über eine Schleife?

Danke für jede Hilfe!
lg, Gerhard

gestein

Mittlerweile habe ich diesen Dialog von Sebastian gefunden:
https://forum.fhem.de/index.php/topic,77297.msg747254.html#msg747254

Im  Prinzip wäre das genau das, was ich auch machen möchte.
Allerdings komme ich mit dem "get" nicht hin, da die devices vom Typ CUL_HM kein "Get name" oder ähnliches kennen.

Oder verstehe ich das falsch?
Wie könnte ich das lösen?

Vielen Dank für jede Hilfe!
lg, Gerhard

gestein

Hallo,

und noch eine Frage ist leider aufgetaucht.
Ich habe mir den tollen Dialog von Sebastian für meine Beleuchtungen adaptiert.
https://forum.fhem.de/index.php/topic,77297.msg807252/topicseen.html#msg807252

Was ich aber nicht verstehe, sind die Zeilen wie diese:
"{return('(💡Küche: [SteckdoseIT2:state]:Küche einschalten) ') if(ReadingsVal('SteckdoseIT2', 'state', '') eq 'off')}",\

Warum steht da "Küche: [SteckdoseIT2:state]:Küche einschalten"?
Im Telegramm erscheint der Text "💡Küche: on:Küche einschalten" oder "💡Küche: off:Küche einschalten".
Beim Drücken des Knopfes in Telegramm tut sich nix.

Im log-File erscheint dann:
2019.04.15 00:53:26.115 5: msgDialog (Status_Dialog) - entering msgDialog_Notify
2019.04.15 00:53:26.119 4: msgDialog (Status_Dialog) triggered by "rr_Gerhard fhemMsgRcvPush: 💡Küche einschalten: off:Küche einschalten"
2019.04.15 00:53:26.122 5: msgDialog (Status_Dialog)
    entering msgDialog_progress
        recipients: rr_Gerhard
        message:    💡Küche einschalten: off:Küche einschalten
        force:      0
2019.04.15 00:53:26.125 5: msgDialog (Status_Dialog) - entering msgDialog_evalSpecials
2019.04.15 00:53:26.607 1: No match: 'msgText: 💡Küche einschalten: off:Küche einschalten'
2019.04.15 00:53:26.611 1: Nothing to do: msgText: 💡Küche einschalten: off:Küche einschalten


Mit dem msgText kann ja auch nichts funktionieren, da das Command nur "Küche einschalten" heißt.

Was mache ich falsch bzw. was verstehe ich denn da nicht?
Danke für jede Hilfe.
lg, Gerhard

Wuehler

Moin,

Im Dialog von Sebastian gibt es weiter unten den Dialogteil zum ,,Küche einschalten", dort steht der set ... on Befehl .  Falls du den Teil auch hast und es trotzdem nicht funktioniert, hast du evtl ein Problem mit den Umlauten.

VG,
Dirk

binford6000

Zitat von: gestein am 15 April 2019, 01:22:33
Hallo,

und noch eine Frage ist leider aufgetaucht.
Ich habe mir den tollen Dialog von Sebastian für meine Beleuchtungen adaptiert.
https://forum.fhem.de/index.php/topic,77297.msg807252/topicseen.html#msg807252

Was ich aber nicht verstehe, sind die Zeilen wie diese:
"{return('(💡Küche: [SteckdoseIT2:state]:Küche einschalten) ') if(ReadingsVal('SteckdoseIT2', 'state', '') eq 'off')}",\

Warum steht da "Küche: [SteckdoseIT2:state]:Küche einschalten"?
Im Telegramm erscheint der Text "💡Küche: on:Küche einschalten" oder "💡Küche: off:Küche einschalten".
Beim Drücken des Knopfes in Telegramm tut sich nix.

Im log-File erscheint dann:
2019.04.15 00:53:26.115 5: msgDialog (Status_Dialog) - entering msgDialog_Notify
2019.04.15 00:53:26.119 4: msgDialog (Status_Dialog) triggered by "rr_Gerhard fhemMsgRcvPush: 💡Küche einschalten: off:Küche einschalten"
2019.04.15 00:53:26.122 5: msgDialog (Status_Dialog)
    entering msgDialog_progress
        recipients: rr_Gerhard
        message:    💡Küche einschalten: off:Küche einschalten
        force:      0
2019.04.15 00:53:26.125 5: msgDialog (Status_Dialog) - entering msgDialog_evalSpecials
2019.04.15 00:53:26.607 1: No match: 'msgText: 💡Küche einschalten: off:Küche einschalten'
2019.04.15 00:53:26.611 1: Nothing to do: msgText: 💡Küche einschalten: off:Küche einschalten


Mit dem msgText kann ja auch nichts funktionieren, da das Command nur "Küche einschalten" heißt.

Was mache ich falsch bzw. was verstehe ich denn da nicht?
Danke für jede Hilfe.
lg, Gerhard

Moin Gerhard,
wie Dirk bereits geschrieben hat kommt der set Befehl dann weiter unten im Dialog.
Diesen habe ich so allerdings nicht mehr im Einsatz, da ich irgendwann keine Lust mehr hatte einzelne
Lampen hinzuzufügen. Ich mach das jetzt mit einem Dialog und ein paar Zeilen in der myUtils:

Dialog:
defmod 02.Lampen_Dialog msgDialog {\
"04.💡...Lampen....💡": {\
"message": [\
"(💡 Lampe einschalten) ",\
"(💡 Lampe ausschalten) ",\
    "(abbrechen|zurück:%me%) ",\
"Bitte wählen:"\
],\
"💡 Lampe einschalten": {\
"message": [\
"{return(lightsOn())}"\
],\
"Einschalten": {\
"match": ".*licht",\
"commands": [\
"set $message on",\
"set $SELF say @$recipient 04.💡...Lampen....💡|Lampe einschalten"\
]\
},\
"Aktualisieren": {\
"commands": [\
"set $SELF say @$recipient 04.💡...Lampen....💡|Lampe einschalten"\
]\
},\
"Zurück": {\
"commands": [\
"set $SELF say @$recipient 04.💡...Lampen....💡"\
]\
}\
},\
"💡 Lampe ausschalten": {\
"message": [\
"{return(lightsOut())}"\
],\
"Ausschalten": {\
"match": ".*_licht",\
"commands": [\
"set $message off",\
"set $SELF say @$recipient 04.💡...Lampen....💡|Lampe ausschalten"\
]\
},\
"Aktualisieren": {\
"commands": [\
"set $SELF say @$recipient 04.💡...Lampen....💡|Lampe ausschalten"\
]\
},\
"Zurück": {\
"commands": [\
"set $SELF say @$recipient 04.💡...Lampen....💡"\
]\
}\
}\
\
}\
}
attr 02.Lampen_Dialog allowed everyone
attr 02.Lampen_Dialog group Dialoge
attr 02.Lampen_Dialog icon dialog
attr 02.Lampen_Dialog room 90_System->96_Dialogsteuerung


myUtils:
sub lightsOut
{
  my @lights = devspec2array('.*_licht:FILTER=state!=off');
  my $msg = '';
  if (@lights > 0 and defined($defs{$lights[0]})) {
    foreach (@lights) {
      $msg .= '('.AttrVal($_,"alexaName","").' :'.$_.') ';
}
$msg .= '(🔄Aktualisieren) (Zurück) (⬆️Hauptmenü:Q) Folgende Lampen sind an:';
  }
  else {
    $msg = '(🔄Aktualisieren) (Zurück) (⬆️Hauptmenü:Q) Alle Lampen sind aus.';
  }
  return $msg;
}

sub lightsOn
{
  my @lights = devspec2array('.*_licht:FILTER=state!=on');
  my $msg;
  if (@lights > 0 and defined($defs{$lights[0]})) {
    foreach (@lights){
      $msg .= '('.AttrVal($_,"alexaName","").' :'.$_.') ';
    }
    $msg .= '(🔄Aktualisieren) (Zurück) (⬆️Hauptmenü:Q) Folgende Lampen sind aus:';
  }
  else {
    $msg = '(🔄Aktualisieren) (Zurück) (⬆️Hauptmenü:Q) Alle Lampen sind an.';
  }
  return $msg;
}


VG Sebastian

gestein

Hallo Dirk, hallo Sebastian,

Den set-Befehl habe ich natürlich auch drinnen.
Allerdings mit "Küche einschalten" und der wird so nie aufgerufen.

Danke für die Tipps.
Ich denke, ich werde das dann auch so machen.

Und das dürfte auch meine zweite Frage nach dem Auflisten der fehlerhaften Schalter beantworten.

Schaut übrigens echt toll aus und hebt den WAF (fast) ins Unendliche.
Endlich ist mein fhem keine Spinnerei und Bastelei mehr sondern wird auch von meiner Holden geschätzt und genutzt.
Danke dafür.

lg, Gerhard

gestein

@Dirk:
Das mit den Umlauten sollte ja durch das Attribut utf8Special im TelegramBot device funktionieren. Dargestellt wird zumindest alles richtig.

Das einzige was nicht funktioniert ist das hier (und es irritiert mich etwas):
defmod status_Dialog msgDialog {"Systeminformationen":{\
  "message": [\
    "Fenster und Türen) ",\
    "(Batterien Fenster) ",\
    "(Batterien Heizung) ",\
    "(Netzwerk) ",\
    "(System) ",\
    "TelegramBot_MTYPE=queryInline (%me%) ",\
    "Welche Informationen:"\
  ],\
    "Fenster und Türen":{\
    "message":[\
      "{return('Gästezimmer:  [OZW772:GZ.Fenster] ')}",\
      "{return('Eingangstür:  [OZW772:Eingangstür] ')}",\
      "(zurück) ",\
      "TelegramBot_MTYPE=queryInline (%me%) "\
    ]\
    },\
    .
    .
    .


Angezeigt wird im Telegram folgendes:
Gästezimmer: Zu
Eingangstür:  [OZW772:Eingangstür]
(zurück) (Marvis)


Warum wird das "[OZW772:GZ.Fenster]" richtig durch "Zu" ersetzt, aber nicht das "[OZW772:Eingangstür]"?
Liegt sehr wahrscheinlich am Umlaut. Oder?

lg, Gerhard

Wuehler

Kannst du bitte ein list des Gerätes OZW772 posten.

gestein

Natürlich gerne.
Hier das "list OZW772":
Internals:
   CHANGED   
   FUUID      5c5575c5-f33f-0b7a-1ec1-3fa7426881bec4c7
   FVERSION   99_OZW672.pm:?/2019-02-02
   NAME       OZW772
   NR         1212
   STATE      OK
   TYPE       OZW672
   READINGS:
     2019-03-10 10:20:29   Abwesenheit     Anwesend
     2019-04-15 16:58:30   Aussentemperatur 18.1
     2019-04-15 16:58:30   Aussentemperatur-Heizgrenze 19.0
     2019-04-15 16:58:30   Bad.Fenster     Zu
     2019-04-15 16:58:30   Bad.TempIst     27.3
     2019-03-23 21:19:37   Eingangstür    Zu
     2019-03-23 21:19:37   FensterTürzustand Zu
     2019-04-15 16:58:30   GZ.Fenster      Zu
     2019-04-15 16:58:30   GZ.TempIst      23.1
     2019-04-15 16:58:30   KZ.Fenster      Zu
     2019-04-15 16:58:30   KZ.TempIst      21.3
     2019-04-15 16:58:30   Luftdruck       1019
     2019-04-15 16:58:30   SZ.Fenster      Zu
     2019-04-15 16:58:30   SZ.TempIst      21.5
     2019-03-10 01:48:07   SZ.Temperatur   22.3
     2019-04-15 16:58:30   Sommerbetrieb-Vorgabe Auto
     2019-04-15 16:58:30   WZ.Fenster      Zu
     2019-04-15 16:58:30   WZ.TempIst      24.1
     2019-04-15 16:58:30   Whg.Abwesenheit Abwesend
     2019-04-15 16:58:30   Whg.Eingangstür Zu
     2019-04-15 16:58:30   Whg.FensterTürzustand Zu
     2019-04-15 16:58:30   state           OK
   helper:
     DATAPOINT_TO_TYPE
     RUNNING_GET_PID:
       abortFn    OZW672_queryValuesAborted
       arg        OZW772|192.168.0.103|http|Administrator|Triniti_|[['960','Aussentemperatur',''],['1451','Luftdruck',''],['1009','WZ.TempIst',''],['1050','KZ.TempIst',''],['1091','Bad.TempIst',''],['1132','SZ.TempIst',''],['1173','GZ.TempIst',''],['1416','WZ.Fenster',''],['1423','KZ.Fenster',''],['1437','SZ.Fenster',''],['1430','Bad.Fenster',''],['1444','GZ.Fenster',''],['1409','Whg.Eingangstür',''],['980','Aussentemperatur-Heizgrenze',''],['971','Sommerbetrieb-Vorgabe',''],['962','Whg.FensterTürzustand',''],['1454','Whg.Abwesenheit','']]
       bc_pid     39997
       finishFn   OZW672_queryValuesCallback
       fn         OZW672_queryValues
       pid        21516
       telnet     telnetPort_127.0.0.1_47982
       timeout    60
       abortArg:
Attributes:
   dataPointDefinitions Aussentemperatur:960,Luftdruck:1451,WZ.TempIst:1009,KZ.TempIst:1050,Bad.TempIst:1091,SZ.TempIst:1132,GZ.TempIst:1173,WZ.Fenster:1416,KZ.Fenster:1423,SZ.Fenster:1437,Bad.Fenster:1430,GZ.Fenster:1444,Whg.Eingangstür:1409,Aussentemperatur-Heizgrenze:980,Sommerbetrieb-Vorgabe:971,Whg.FensterTürzustand:962,Whg.Abwesenheit:1454
   event-on-change-reading .*
   interval   10
   ozw672host XXX
   ozw672password XXX
   ozw672protocol http
   ozw672username XXX
   room       Zentrale
   verbose    0


Egal, ob ich "Whg.Eingangstür", "Eingangstür" oder "Whg.FensterTürzustand" verwende, im msgDialog wird der Zustand nicht angezeigt.

lg, Gerhard

obi

Hallo,

tolles Modul.

Ich habe eventuell eine kleine Verbesserung:

Da JSON->new->decode die Keys nicht ordnet bzw. in der Reihenfolge wie definert übernimmt funktioniert folgendes Szenario nicht:
Wenn man mit match (Regex) arbeitet und hier die Reihenfolge von oben nach unten verwendet werden soll funktioniert dies nicht wie gewünscht. Ich möchte z. B. am Ende alle anderen Nachrichten/Texte als Fehlermeldung ausgeben mit .* als Regex.

Man könnte hier dann folgende Funktion verwenden:
--Zeile 303: $dialog = eval{JSON->new->decode($dialog)};
++Zeile 303: $dialog = eval{JSON::MultiValueOrdered->new->decode( encode('utf-8', $dialog))};


Zusätzlich noch die Library am Anfang einbinden:
++Zeile 29: use JSON::MultiValueOrdered;

Und zu guter Letzt noch die Libraray im System installieren
apt-get install libjson-multivalueordered-perl

Eventuell hilft dies ja jemanden. Oder das könnte man in der Wiki geränzen oder so.

VG obi