msgDialog: Instant Messaging als FHEM Interface

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

Vorheriges Thema - Nächstes Thema

binford6000

Hab jetzt mal mit
define metaDialog msgDialog {}
den nackten metaDialog erstellt und dann im DEF Fenster
{
  "%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."
    ]
  }
}

eingegeben (also schon noch c&p  ;))
FHEM meldet stur:
Usage: define <name> msgDialog {JSON}

invalid character encountered while parsing JSON string, at character offset 11 (before "\n    "match": "\\/?...") at ./FHEM/76_msgDialog.pm line 93.

https://jsonlint.com/ sagt aber bei Validate JSON
Valid JSON
in grün. Kein Gemecker.  ???


binford6000

Moin,
wenn ich in DEF versuche den metaDialog einzufügen kommt folgender Fehler:
Usage: define <name> msgDialog {JSON}

invalid character encountered while parsing JSON string, at character offset 11 (before "\n    "match": "\\/?...") at ./FHEM/76_msgDialog.pm line 93.

Vor dem Zeilenumbruch kommt ein {

Wenn ich dagegen in RAW versuche den metaDialog einzufügen kommt diese Fehlermeldung:
Usage: define  msgDialog {JSON}

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


Was bedeutet in diesem Zusammenhang character offset 1 bzw. 11?
Wie bereits vorher geschrieben, ist das JSON selbst laut jsonlint.com in Ordnung.
VG Sebastian

Wuehler

#497
Ich glaube es waren die Leerzeichen bei mir damals. Da waren keine normalen Leerzeichen sondern geschützte oder Tabs. Damit kommen die unterschiedlichen Parser anders mit zurecht. Habe diese im notepad suchen und ersetzen lassen.
Offset ist das Zeichen in der Zeile.
Versuch mal die Leerzeichen der angemahnten Zeile zu entfernen. Das sollte eine geänderte Fehlermeldung geben.
Edit: ggf. auch den Zeilenumbruch neu machen.

binford6000

Hallo,
also auf einem fast nackten und aktuellen FHEM funktioniert alles tiptop:
This is perl 5, version 24, subversion 1 (v5.24.1)
libjson-perl ist schon die neueste Version (2.90-1).

Auf dem betroffenen System laufen diese Versionen:
This is perl 5, version 26, subversion 1 (v5.26.1)
libjson-perl ist schon die neueste Version (2.90-1).

Am Ende ein PERL Problem?!
Auf beiden wurde getestet mit diesem Code:
{
"%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."
]
}
}

Der Code wurde nach einem validate auf jsonlint.com direkt per c&p in DEF eingefügt.
Nächste Frage: Wie komme ich mit PERL wieder nach 5.24.1?
VG Sebastian

Wuehler

Mit perl 5.26 wurde Unicode 9.0 unterstützt. Da gab es auf jeden Fall Anpassungen an LineBreaks.
Versuch mal meinen Vorschlag Leerzeichen und Linebreaks in den ersten vier Zeilen in einem Texteditor zu löschen und neu zu schreiben. Dann sollte eine andere Zeile beanstandet werden.

binford6000

Hi Wuehler,
habe diesen Code eingefügt:
{"%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."
]
}
}


Die Fehlermeldung lautet nun:
Usage: define <name> msgDialog {JSON}
':' expected, at character offset 8 (before "match": "\\/?(start|...") at ./FHEM/76_msgDialog.pm line 93.


Offset 8 ist das ":"
: gelöscht und wieder eingetragen: keine Veränderung  ???

Trotzdem Danke für den Support.  :)


binford6000

Zitat von: Wuehler am 13 August 2018, 20:15:18
Hast du schon mal folgendes nachgeschaut:
https://forum.fhem.de/index.php/topic,77297.msg743993.html#msg743993
Moin,
danke dir das war es! Im Attribut msgDialog_evalSpecials hat sich noch ein Backslash versteckt/eingeschlichen.
msgDialog_evalSpecials me=Q\
TelegramBot=fhemBot

Deshalb hat FHEM beim editieren in DEF und RAW - zurecht - ständig gemeckert. Wie so oft ein Layer 8 Problem  ;D
Danke dir fürs Helfen! Jetzt kann ich mich wieder auf die Suche nach meinem eigentlichehn Problem machen...  ;)
VG Sebastian

binford6000

Meine Dialoge sind wieder online :)
Da ich nicht das Gegenteil beweisen kann, lag es wohl an mir...   ::)
Danke an alle für eure Tipps und Hilfestellungen!
VG Sebastian

Mumpitz

#504
Hallo Leute

ich bin echt grad am verzweifeln und komme nicht weiter. Ich kriege einfach keine Antwort vom Boot. Telegram läuft soweit.. Was mache ich falsch??

myMsgConfig
defmod myMsgConfig msgConfig
attr myMsgConfig userattr evalSpecials:textField-long msgDialog_evalSpecials:textField-long msgDialog_msgCommand:textField
attr myMsgConfig comment FHEM Global Configuration for command 'msg'
attr myMsgConfig evalSpecials me=XXXX\
TelegramBot=XXX_Telegram
attr myMsgConfig group Global
attr myMsgConfig msgContactPush XXX_Telegram
attr myMsgConfig msgType text
attr myMsgConfig room Telegram
attr myMsgConfig stateFormat fhemMsgState
attr myMsgConfig verbose 3

setstate myMsgConfig 1



msgPushReceived notify
defmod msgPushReceived notify .*(msgText|queryData|(OTR)?LastMessage|message):(\n|.)* {\
  my ($recipient, $received);;\
  my $TYPE = InternalVal($NAME, "TYPE", "");;\
\
  if($TYPE eq "TelegramBot" && $EVENT =~ m/^msgText/){\
    $recipient = ReadingsVal($NAME, "msgPeerId", undef);;\
    $received = ReadingsVal($NAME, "msgText", undef);;\
  }\
  elsif($TYPE eq "TelegramBot" && $EVENT =~ m/^queryData/){\
    $recipient = ReadingsVal($NAME, "queryPeerId", undef);;\
    $received = ReadingsVal($NAME, "queryData", undef);;\
  }\
  elsif($TYPE eq "Jabber" && $EVENT =~ m/^((OTR)?Last)Message/){\
    $received = ReadingsVal($NAME, $1."Message", undef);;\
    ($recipient) = (ReadingsVal($NAME, $1."SenderJID", undef) =~ m/[^\/]+/g);;\
  }\
  elsif($TYPE eq "yowsup" && $EVENT =~ m/^message/){\
    $recipient = $NAME;;\
    $NAME = $modules{yowsup}{defptr}{yowsup}->{NAME};;\
    $received = ReadingsVal($NAME, "message", undef);;\
  }\
\
  return unless($recipient && $received ne "");;\
  \
  my @contacts = devspec2array("TYPE=(ROOMMATE|GUEST):FILTER=msgContactPush=.*$recipient.*");;\
  \
  if(@contacts){\
    foreach (@contacts){\
      my $dev_hash = $defs{$_};;\
\
      readingsBeginUpdate($dev_hash);;\
      readingsBulkUpdate($dev_hash, "fhemMsgPushReceived", $received);;\
      readingsBulkUpdate($dev_hash, "fhemMsgPushReceivedContact", $NAME);;\
      readingsEndUpdate($dev_hash, 1);;\
    }\
  }\
  else{\
    fhem("msg push Unbekannter Kontaktversuch über $NAME von $recipient:\n$received");;\
  }\
}
attr msgPushReceived devStateIcon {ReadingsVal($name, "state", "inactive") eq "active" ? ".*:ios-on-blue:inactive" : ".*:ios-off:active"}
attr msgPushReceived icon audio_mic
attr msgPushReceived room Telegram

setstate msgPushReceived 2018-08-18 15:08:02
setstate msgPushReceived 2018-08-18 14:29:36 state active



Waschmaschine Dialog
defmod Waschmaschine_Dialog msgDialog { "Waschmaschine": {\
    "message": [\
      "{return('(Zeitprogramm stoppen) ') if(ReadingsVal('%controlUnit%', 'controlMode', '') eq 'auto')}",\
      "{return('(programmieren) (einschalten) ') if(ReadingsVal('%actor%', 'state', '') ne 'on')}",\
      "(Verlaufsdiagramm) ",\
      "(abbrechen) ",\
      "{return('Waschmaschine: ' . (ReadingsVal('%actor%', 'state', '') eq 'on' ? 'eingeschaltet' : 'ausgeschaltet'))}",\
      "{return('Modus: ' . (ReadingsVal('%controlUnit%', 'controlMode', '') eq 'auto' ? 'Automatik' : 'Manuell (' . ReadingsVal('%controlUnit%', 'time', '') . ')'))}"\
    ],\
    "Zeitprogramm stoppen": {\
      "commands": "set %controlUnit% controlMode manual",\
      "message": [\
        "(%me%) ",\
        "Das Zeitprogramm wurde gestoppt."\
      ]\
    },\
    "programmieren": {\
      "message": [\
        "(bestätigen|abbrechen) ",\
        "(00:00:00_00|00:30:00_30|01:00:01_00|01:30:01_30|02:00:02_00|02:30:02_30) ",\
        "(03:00:03_00|03:30:03_30|04:00:04_00|04:30:04_30|05:00:05_00|05:30:05_30) ",\
        "(06:00:06_00|06:30:06_30|07:00:07_00|07:30:07_30|08:00:08_00|08:30:08_30) ",\
        "(09:00:09_00|09:30:09_30|10:00:10_00|10:30:10_30|11:00:11_00|11:30:11_30) ",\
        "(12:00:12_00|12:30:12_30|13:00:13_00|13:30:13_30|14:00:14_00|14:30:14_30) ",\
        "(15:00:15_00|15:30:15_30|16:00:16_00|16:30:16_30|17:00:17_00|17:30:17_30) ",\
        "(18:00:18_00|18:30:18_30|19:00:19_00|19:30:19_30|20:00:20_00|20:30:20_30) ",\
        "(21:00:21_00|21:30:21_30|22:00:22_00|22:30:22_30|23:00:23_00|23:30:23_30) ",\
        "Wann soll die Wäsche fertig sein?",\
        "Bitte Uhrzeit in HH:MM angeben.",\
        "Aktuell ist [%controlUnit%:time] Uhr eingestellt."\
      ],\
      "Uhrzeit": {\
        "match": "([0-1][0-9]|2[0-3])[:_][0-5][0-9]",\
        "commands": [\
          "{my $time = '$message';;;; $time =~ s/_/:/;;;; fhem(\"set %controlUnit% time $time\");;;;}",\
          "set $SELF say @$recipient Waschmaschine|programmieren|bestätigen"\
        ]\
      },\
      "bestätigen": {\
        "commands": "set %controlUnit% controlMode auto",\
        "message": [\
          "(%me%) ",\
          "Das Zeitprogramm wurde eingestellt.",\
          "Die Wäsche wird voraussichtlich um [%controlUnit%:time] Uhr fertig sein.",\
          "Bitte die Waschmaschine vorbereiten."\
        ]\
      }\
    },\
    "einschalten": {\
      "commands": [\
        "set %controlUnit% controlMode manual",\
        "set %actor% on"\
      ]\
    },\
    "Verlaufsdiagramm": {\
      "commands": "set %TelegramBot% cmdSend {plotAsPng('%plot%')}",\
      "message": [\
        "(%me%) ",\
        "Waschkeller: Waschmaschine"\
      ]\
    }\
  },\
  "auto": {\
    "setOnly": true,\
    "commands": [\
      "set %actor% on",\
      "set %controlUnit% controlMode manual"\
    ],\
    "message": [\
      "(%me%) ",\
      "Die Wachmaschine wurde automatisch eingeschaltet."\
    ]\
  },\
  "manual": {\
    "setOnly": true,\
    "message": [\
      "(%me%) ",\
      "Die Wachmaschine wurde manuell eingeschaltet."\
    ]\
  },\
  "done": {\
    "setOnly": true,\
    "commands": "set %actor% off",\
    "message": [\
      "(%me%) ",\
      "Die Wachmaschine ist fertig."\
    ]\
  }\
}\

attr Waschmaschine_Dialog room Telegram

setstate Waschmaschine_Dialog 2018-08-18 14:34:33 state Initialized



Beim Attribut msgContactPush bei rr_Reto habe ich folgendes eingegeben:

XXX_Telegram:@Nummer welcher im Telegram Bot Device unter Contacts steht 

Wo ist mein Fehler??

Wuehler


Mumpitz

Zitat von: Wuehler am 18 August 2018, 16:48:54
Beim Dislog fehlt denke ich:
attr allowed rr_Reto

Menno..... ein Klick und es funktioniert.....

igami

Das notify wird übrigens nicht mehr benötigt.
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

Mumpitz

#508
Hallo zusammen

Ich habe ein echt komisches Phänomen bei meinem Dialog. Und zwar ist es so, dass wenn ich der Reihe nach alle "Kästchen" abfrage funktioniert alles. Wenn ich jedoch direkt auf den Klima Dialog gehe und dort z.B. den Lux Werte anzeige auswähle passiert nichts. Wenn ich jedoch zuerst die aktuellen Temperaturen anzeige, anschliessend den Temperaturverlauf anzeige und dann erst die Lux Werte anzeige funktioniert es wie gewünscht....

defmod Klima_Dialog msgDialog {"02.Klima":{\
  "message": [\
    "(Aktuelle Temperaturen anzeigen) ",\
    "(Temperatur Verlauf anzeigen) ",\
"(Helligkeits Werte anzeigen) ",\
"(Helligkeits Verlauf anzeigen) ",   \
"(abbrechen) ",\
    "%me% was möchtest Du tun mein Meister?:"\
  ],\
    "Aktuelle Temperaturen anzeigen":{\
    "message":[\
      "Aktuelle Temperaturen:",\
  "Küche: [Temp_Wohnzimmer:temperature]°C.",\
  "Esszimmer: [blink:Cam_Wohnzimmer_Tempg]°C.",\
  "Galerie: [blink:Cam_Galerie_Tempg]°C.",\
  "Kinderzimmer Lean:[Temp_Lean:temperature]°C.",\
  "Büro UG: [blink:Cam_Buero_Tempg]°C.",\
  "Sitzplatz: [blink_outdoor:Cam_Garten_Tempg]°C.",\
  "Vorbau: [blink_outdoor:Cam_Eingang_Tempg]°C.",\
  "Fragen?"\
    ]},\
"Temperatur Verlauf anzeigen": {\
"message": [\
"TelegramBot_MTYPE=queryInline (%me%) ",\
"{fhem(\"set %TelegramBot% cmdSend @\".\"R_Eppi {plotAsPng('SVG_FileLog_Temp_Lean_1')}\")}",\
"{fhem(\"set %TelegramBot% cmdSend @\".\"R_Eppi {plotAsPng('SVG_FileLog_Temp_Wohnzimmer_1')}\")}",\
"Temperatur Verlauf Lean & Wohnzimmer"\
]\
},\
\
\
    "Helligkeits Werte anzeigen":{\
     "message":[\
      "Aktuelle Lux Werte:",\
  "Ostseite: [Multisensor_Ost:state] lx.",\
  "Südseite: [HM_Lichtsensor_Sued:state] lx.",\
  "Westseite: [HM_Lichtsensor_West:state] lx.",\
  "Fragen?"\
    ]\
    },\
"Helligkeits Verlauf anzeigen": {\
"message": [\
"TelegramBot_MTYPE=queryInline (%me%) ",\
"{fhem(\"set %TelegramBot% cmdSend @\".\"R_Eppi {plotAsPng('SVG_FileLog_Sensor_Licht_West_3')}\")}",\
"Helligkeitsverlauf"\
]\
},\
    "Stehlampe Wohnzimmer einschalten":{\
    "commands": "set Licht_Stehlampe_Wohnzimmer on",\
    "message":[\
      "(%me%) ",\
      "Die Lampe im Wohnzimmer wurde eingeschaltet."\
    ]\
    \
   }\
}\
}
attr Klima_Dialog allowed rr_Reto
attr Klima_Dialog room Telegram
attr Klima_Dialog verbose 0



jemand eine Idee wo das Problem liegt?

igami

Ich habe den Dialog bei mir importiert und kann direkt nach "02.Klima" auf "Helligkeits Werte anzeigen" gehen und bekomme eine Nachricht.
Poste doch mal ein List von dem Dialog, zu dem Zeitpunkt wo es nicht funktioniert.
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