msgDialog: Instant Messaging als FHEM Interface

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

Vorheriges Thema - Nächstes Thema

binford6000

ZitatNeues Problem irgendetwas lässt mein FHEM abstürzen folgender Fehler im Log:
...
Hier ein list des Meta und Test Dialogs:
Warum benutzt Du nicht den originalen Meta-Dialog aus dem wiki?
defmod meta_Dialog msgDialog {\
  "%me%": {\
    "match": "\/?(start|%me%)",\
    "commands": [\
  "deletereading TYPE=msgDialog $recipient_history",\
  "deletereading %TelegramBot% $recipient_sentMsgId"\
    ],\
    "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:"\
    ]\
  },\
  "abbrechen": {\
    "match": "\/?abbrechen",\
    "commands": [\
  "deletereading TYPE=msgDialog $recipient_history",\
  "deletereading %TelegramBot% $recipient_sentMsgId"\
    ],\
    "message": [\
      "(%me%) ",\
      "Dialog abgebrochen."\
    ]    \
  },\
  "beenden": {\
    "match": "\/?beenden",\
    "commands": [\
  "deletereading TYPE=msgDialog $recipient_history",\
  "deletereading %TelegramBot% $recipient_sentMsgId"\
    ],\
    "message": [\
      "(%me%) ",\
      "Dialog beendet."\
    ]\
  }\
}

attr meta_Dialog DbLogExclude .*
attr meta_Dialog allowed everyone
attr meta_Dialog room msg

Ich habe bei mir lediglich die Messages geändert.
VG Sebastian

Amenophis86

Ich nutze den original Meta Dialog aus dem Wiki, der Fehle kommt scheinbar aus dem Test Dialog.

Wenn ich es richtig gesehen habe, dann soll es doch aber auch so sein, dass es quasi den meta Dialog gibt und dann unter Dialoge, wie die Waschmaschine. Und um diese Unter Dialoge zu erstellen und zu verstehen habe ich mir den Test Dialog gebastelt.
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...

Esjay

Hallo Igami,
kannst du mir sagen, wie du in deinem Waschmaschinen Dialog die Uhrzeit übergibst?
Unter programmieren wählst du ja die Uhrzeit, und über set %controlUnit% time $message setzt du sie ja. Allerdings unter einem anderen Trigger?

Ich wollte das selbe mit der Saugstufe meines Staubsaugerroboters tun, sehe aber den Zusammenhang deiner beiden Trigger nicht. Kannst du mir einen Tipp geben?

defmod DialogRoberta msgDialog {\
"Roberta": {\
"message": [\
"(Roberta Start) ",\
"(Roberta Stopp) ",\
"(Roberta Laden) ",\
"(Roberta Pause) ",\
"(Roberta Status) ",\
"(Roberta Störungen) ",\
"(Roberta Saugstufe) ",\
"(abbrechen) ",\
"Hier das Menü für Roberta"\
],\
"Roberta Start": {\
"commands": "set Roberta start",\
"message": [\
"(%me%)  ",\
"Ich fahre jetzt los"\
]\
},\
"Roberta Stopp": {\
"commands": "set Roberta stop",\
"message": [\
"(%me%)  ",\
"Ich habe das Staubsaugen abgebrochen"\
]\
},\
"Roberta Laden": {\
"commands": "set Roberta charge",\
"message": [\
"(%me%)  ",\
"Ich fahre zurück zur Station"\
]\
},\
"Roberta Pause": {\
"commands": "set Roberta pause",\
"message": [\
"(%me%)  ",\
"Ich habe das Staubsaugen unterbrochen"\
]\
},\
"Roberta Status": {\
"commands": "set TelegramBot msg Batterie Level = [Roberta:batteryLevel]% \nState = [Roberta:state] \nLetzte Reinigung = [Roberta:history_0]\nFilter [:Roberta:consumables_filter]\nHauptbürste [Roberta:consumables_main_brush]\nSensoren [Roberta:consumables_sensors]\nSeitenbürste [Roberta:consumables_side_brush] ",\
"message": [\
"(%me%)  ",\
"Hier ein paar Infos zu mir"\
]\
},\
"Roberta Störungen": {\
"commands": "set TelegramBot msg Störung [Roberta:error]\nFehlercode [Roberta:error_code]",\
"message": [\
"(%me%)  ",\
"Ich habe folgende Störungen"\
]\
},\
"Roberta Saugstufe": {\
"message": [\
"( 10 | 20 | 30 | 40 ) ",\
"( 60 | 70 | 80 | 90 ) ",\
"(%me%)  ",\
"Bitte die mögliche Saugstufe einstellen"\
]\
},\
"Saugstufe": {\
"match": "[01-99]",\
"commands": "set Roberta fan_power $message",\
"message": [\
"(%me%)  ",\
"Saugstufe auf xx gestellt"\
]\
}\
}\
}
attr DialogRoberta allowed everyone
attr DialogRoberta room msg

setstate DialogRoberta 2017-11-03 17:06:59 state Initialized




Grüße

igami

Ist doch in dem Trigger in dem sie eingegeben wird. Im vorherigen wird das Keyboard dafür bereitgestellt.
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

Esjay

Zitat von: igami am 03 November 2017, 19:12:10
Ist doch in dem Trigger in dem sie eingegeben wird. Im vorherigen wird das Keyboard dafür bereitgestellt.

Sry, aber ich kann dir nicht folgen!

igami

Dein Match ist falsch. Bitte mit regex befassen. Morgen kann ich dir mehr sagen, wenn ich nicht nur über tapatalk schreibe
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

Esjay

Zitat von: igami am 03 November 2017, 19:55:48
Dein Match ist falsch. Bitte mit regex befassen. Morgen kann ich dir mehr sagen, wenn ich nicht nur über tapatalk schreibe
Ich danke dir. Wahrscheinlich ist mir noch nicht ganz klar, was "Gesamte Nachricht bedeutet".
Habe ich eigentlich getan. Zumindest bekomme ich ein match auf 101regex für sämtliche Zahlen.
Aber gut, dann mache ich für heute Schluss.

Grüße

binford6000

Ich hatte heute Nachmittag wieder einen Crash:
Unmatched ( in regex; marked by <-- HERE in m/%( <-- HERE !%/ at ./FHEM/75_MSG.pm line 1728.
Ich denke zu dieser Zeit war die Mobilfunkverbindung schlecht und ist ständig gewechselt zwischen Edge und LTE.
Kann sein, dass eine Message dabei unvollständig angekommen ist und somit der Fehler ausgelöst wurde.

@ Amenophis86: Könnte das bei dir auch so gewesen sein?
VG Sebastian

Flipper92

#173
Thema 1:

Zitat von: igami am 02 November 2017, 22:26:28
Klar geht das

...
"message": [
  "{'UpdateCheck: '. fhem('update check')}",
  "/hauptmenue"
]
...

Sollte so funktionieren, getestet habe ich es aber nicht ;)

Hab es etwas angepasst:
"Update Check": {
  "message": [
"(Zurück:%me%) ",
"{'UpdateCheck: '. fhem('update check')}"
]
}

Es funktioniert.
Bei mir ist es noch in einem Dialog verschachtelt, aber so könnte es eventuell ins Wiki als Anwendungsbeispiel.

Interesant finde ich, das es so glappt, wenn ich aber das zurück tausche, also so:
"Update Check": {
  "message": [
"{'UpdateCheck: '. fhem('update check')}",
"(Zurück:%me%) ",
]
}

dann bekomme ich keinen Button mit Zurück geliefert, sondern nur den Text (Zurück:%me%)".

--------
Thema 2:

Ich komm leider nicht weiter (also es wird kein Bild versendet) und die beispiele hier im Forum bringen mich leider auch nicht weiter:
"Wetter jetzt": {
"message": [
"(zurück:Wetter) ",
"hier kommt noch was"
],
"commands": [
"set %TelegramBot% sendImage /opt/fhem/www/images/default/weather/sunny.png"
]
}


wo sitzt mein Fehler?
Auch wenn ich direkt meine ID eingebe kommt kein Bild an.

Edit: Wenn ich jedoch anstelle von %TelegramBot% nur TelegramBot verwende geht es. Sehr komisch.

-----
Thema 3:

Oh, eine Sache hab ich noch:
Ich verwende in manchen bereichen den Befehl (als Beispiel):
set TelegramBot message \@-1*******3 Heute ist GelberSack!"

Da ich Inline Verwende bekomme ich diese Nachricht nicht als neuer Befehl, sondern als ersatz auf eine Alte.
Ich hab das Problem wie folgt gelößt:
attr message2queryEditInline disable 1;
set TelegramBot message \@-1*******3 Heute ist GelberSack!";
attr message2queryEditInline disable 0;

Gibt es da was besseres? wäre das was fürs Wiki?

Grüße.

Amenophis86

Zitat von: binford6000 am 03 November 2017, 21:56:20
Ich hatte heute Nachmittag wieder einen Crash:
Unmatched ( in regex; marked by <-- HERE in m/%( <-- HERE !%/ at ./FHEM/75_MSG.pm line 1728.
Ich denke zu dieser Zeit war die Mobilfunkverbindung schlecht und ist ständig gewechselt zwischen Edge und LTE.
Kann sein, dass eine Message dabei unvollständig angekommen ist und somit der Fehler ausgelöst wurde.

@ Amenophis86: Könnte das bei dir auch so gewesen sein?
VG Sebastian

An der Vernunft kann es eigentlich nicht liegen. Aber das irgendwas nicht komplett ankam ist gut möglich. Glaube der Fehler trat auf, wenn FHEM einen Moment brauchte, bis wieder gepollt wurde von Telegrambot. Er lässt sich aber schwer reproduzieren, weil ich jedes Mal den kompletten Dialog löschen musste um FHEM wieder nutzen zu können. Sonst ist es beim Neustart direkt wieder gestorben nach kurzer Zeit.
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


...
"Roberta Saugstufe": {\
"message": [\
"(10|20|30|40) ",\
"(60|70|80|90) ",\
"(%me%)  ",\
"Bitte die mögliche Saugstufe einstellen"\
]\
},\
"Saugstufe": {\
"match": "[1-9]0",\
...

So sollte es funktionieren. Die Leerzeichen vor und nach dem Keyboard hatten mir anfangs mal Probleme beseitigt und sind nicht mehr erforderlich.

Zitat von: Flipper92 am 03 November 2017, 22:03:10
Interesant finde ich, das es so glappt, wenn ich aber das zurück tausche, also so:
"Update Check": {
  "message": [
"{'UpdateCheck: '. fhem('update check')}",
"(Zurück:%me%) ",
]
}

dann bekomme ich keinen Button mit Zurück geliefert, sondern nur den Text (Zurück:%me%)".
Die Keyboards müssen immer zuerst stehen, das liegt an der TelegramBor Syntax.

Zitat von: Flipper92 am 03 November 2017, 22:03:10
Edit: Wenn ich jedoch anstelle von %TelegramBot% nur TelegramBot verwende geht es. Sehr komisch.
Die %% sind ja Ersetzungen, wenn die nicht gepflegt sind steht da auch nur %TelegramBot% was es ja als device nicht gibt.

Zitat von: Flipper92 am 03 November 2017, 22:03:10
Oh, eine Sache hab ich noch:
Ich verwende in manchen bereichen den Befehl (als Beispiel):
set TelegramBot message \@-1*******3 Heute ist GelberSack!"

Da ich Inline Verwende bekomme ich diese Nachricht nicht als neuer Befehl, sondern als ersatz auf eine Alte.
Ich hab das Problem wie folgt gelößt:
attr message2queryEditInline disable 1;
set TelegramBot message \@-1*******3 Heute ist GelberSack!";
attr message2queryEditInline disable 0;

Gibt es da was besseres? wäre das was fürs Wiki?
Ich habe mich von den inline Keyboards verarbschiedet. Aber du könntest für die Benachrichtigung des Gelben Sackes auch einen Dialog nutzen, damit das cmdAlias funktioniert. Soweit die Theorie ::)
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

Flipper92

Zitat von: igami am 04 November 2017, 09:59:18
Die %% sind ja Ersetzungen, wenn die nicht gepflegt sind steht da auch nur %TelegramBot% was es ja als device nicht gibt.
Oh, war wieder ein fehler beim "myMsgConfig" hatte dort noch das alte evalSpecials. nun geändert in msgDialog_evalSpecials.

Zitat von: igami am 04 November 2017, 09:59:18
Ich habe mich von den inline Keyboards verarbschiedet. Aber du könntest für die Benachrichtigung des Gelben Sackes auch einen Dialog nutzen, damit das cmdAlias funktioniert. Soweit die Theorie ::)
Das cmdAlias funktioniert ja super ::) aber es soll ja nicht bei allen Nachrichten greifen.

Danke für die Hilfe und auch das Modul.
Das Menü ist schon super.

RoBra81

Hallo,

ich bin am Wochenende auf das Modul gestoßen und musste es gleich mal ausprobieren, um meine Dialoge abzulösen.

Zitat von: Esjay am 02 November 2017, 20:37:01
Kann ich das Menü so aufbauen, dass ich es nicht immer anfassen muss wenn ich ein neues Device hinzufüge?
Also zum Beispiel beim Ein und Ausschalten von Steckdosen.

Das würde mich auch interessieren. Daher habe ich einfach mal angefangen, zu experimentieren:


{"Lampen einschalten":{
    "message":[
    "{return(LampsOff())}"
    ]
}
}


mit

sub LampsOff
{
  my @lights = devspec2array('.*\.LI\..*:FILTER=state!=on:FILTER=TYPE!=DOIF:FILTER=TYPE!=notify');;
  my $msg = 'Es sind folgende Lichter ausgeschaltet:
  ';

  if (@lights > 0 and defined($defs{$lights[0]})){
    foreach (@lights){
      $msg .= '('.$_.')
      ';
    }
  }else{
    $msg = 'Es sind alle Lichter eingeschaltet.';
  }
  return $msg;
}


in der myUtils liefert eine Nachricht mit der Liste der ausgeschalteten Lampen. Leider aber eben als eine Nachricht und nicht als n Menüpunkte (siehe Anhang). Ich denke, wenn man das Modul dazu bewegen könnte, daraus Menüpunkte zu machen, müsste es doch mittels Regexp im match-Part und Textvariable im command auch möglich sein, auf die durch Anklicken erzeugte Nachricht das entsprechende Licht einzuschalten?!

Ronny

RoBra81

So geht das mit den Menüs erstmal:

{"Lampen einschalten":{
    "message":[
    "{return(LampsOff())}",
    " Folgende Lampen sind aus"
    ]
}
}


mit

sub LampsOff
{
  my @lights = devspec2array('.*\.LI\..*:FILTER=state!=on:FILTER=TYPE!=DOIF:FILTER=TYPE!=notify');
  my $msg = '';

  if (@lights > 0 and defined($defs{$lights[0]})){
    foreach (@lights){
      $msg .= '('.$_.') ';
    }
  }else{
    $msg = 'Es sind alle Lichter eingeschaltet.';
  }
  return $msg;
}


Ich bleibe dran und berichte, wenn ich schalten kann :-)

Ronny

RoBra81

So,

ich habe mir nun mal einen dynamischen Dialog für das Schalten meiner Lampen gebaut. Dieser nutzt das Inline Menü um einen Klartextnamen zur jeweiligen Lampe anzuzeigen, könnte aber auch auf das andere Menü umgebaut werden, dann wird allerdings der FHEM-Name angezeigt.

Die Dialog:

{
"Beleuchtung": {
"message": [
"(Lampen einschalten) ",
"(Lampen ausschalten) ",
"(Lampen schalten) ",
"(abbrechen) ",
"Lampen schalten:"
],
"Lampen einschalten": {
"message": [
"{return(lampsOff())}"
],
"Einschalten": {
"match": ".*.LI..*",
"commands": [
"set $message on",
"set $SELF say @$recipient Beleuchtung|Lampen einschalten"
]
},
"Aktualisieren": {
"commands": [
"set $SELF say @$recipient Beleuchtung|Lampen einschalten"
]
},
"Zurück": {
"commands": [
"set $SELF say @$recipient Beleuchtung"
]
}
},
"Lampen ausschalten": {
"message": [
"{return(lampsOn())}"
],
"Ausschalten": {
"match": ".*.LI..*",
"commands": [
"set $message off",
"set $SELF say @$recipient Beleuchtung|Lampen ausschalten"
]
},
"Aktualisieren": {
"commands": [
"set $SELF say @$recipient Beleuchtung|Lampen ausschalten"
]
},
"Zurück": {
"commands": [
"set $SELF say @$recipient Beleuchtung"
]
}
},
"Lampen schalten": {
"message": [
"{return(lamps())}"
],
"Schalten": {
"match": ".*.LI..*",
"commands": [
"set $message",
"set $SELF say @$recipient Beleuchtung|Lampen schalten"
]
},
"Aktualisieren": {
"commands": [
"set $SELF say @$recipient Beleuchtung|Lampen schalten"
]
},
"Zurück": {
"commands": [
"set $SELF say @$recipient Beleuchtung"
]
}
}
}
}


Und die benötigten Funktionen in der myUtils:

sub lampsOff
{
  my @lights = devspec2array('.*\.LI\..*:FILTER=state!=on:FILTER=TYPE!=DOIF:FILTER=TYPE!=notify');
  my $msg = '';

  if (@lights > 0 and defined($defs{$lights[0]})){
    foreach (@lights){
      $msg .= '('.AttrVal($_,"room","").' '.substr($_, 9).':'.$_.') ';
    }
    $msg .= '(Aktualisieren) (Zurück) (Hauptmenü:Wilhelm) Folgende Lampen sind aus:';
  }else{
    $msg = '(Aktualisieren) (Zurück) (Hauptmenü:Wilhelm) Es sind alle Lichter eingeschaltet.';
  }
  return $msg;
}

sub lampsOn
{
  my @lights = devspec2array('.*\.LI\..*:FILTER=state!=off:FILTER=TYPE!=DOIF:FILTER=TYPE!=notify');
  my $msg = '';

  if (@lights > 0 and defined($defs{$lights[0]})){
    foreach (@lights){
      $msg .= '('.AttrVal($_,"room","").' '.substr($_, 9).':'.$_.') ';
    }
    $msg .= '(Aktualisieren) (Zurück) (Hauptmenü:Wilhelm) Folgende Lampen sind an:';
  }else{
    $msg = '(Aktualisieren) (Zurück) (Hauptmenü:Wilhelm) Es sind alle Lichter ausgeschaltet.';
  }
  return $msg;
}

sub lamps
{
  my @lights = devspec2array('.*\.LI\..*:FILTER=TYPE!=DOIF:FILTER=TYPE!=notify');
  my $msg = '';

  if (@lights > 0 and defined($defs{$lights[0]})){
    foreach (@lights){
      $msg .= '('.AttrVal($_,"room","").' '.substr($_, 9).' '.((ReadingsVal($_,'state','') eq 'off')?' ist aus':' ist an').':'.$_.((ReadingsVal($_,'state','') eq 'off')?' on':' off').') ';
    }
    $msg .= '(Aktualisieren) (Zurück) (Hauptmenü:Wilhelm) Welche Lampe soll geschaltet werden:';
  }
  return $msg;
}


Leider funktioniert das automatische aktualisieren mit sleep nicht, sodass ich erstmal einen entsprechenden Knopf eingebaut habe. Außerdem will ich %me% noch als Parameter an die drei subs übergeben, um dies nicht hardcoded da drin zu haben.

Der Dialog ist sicherlich noch nicht perfekt, kann aber bestimmt als Grundlage für andere dynamische Dialoge dienen...

Ronny