msgDialog: Instant Messaging als FHEM Interface

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

Vorheriges Thema - Nächstes Thema

Smarti

#390
Hallo,

also so sieht das ganze Inline aus: Screenshot_2018-03-05-09-07-42.png

und so "normal":  Screenshot_2018-03-05-09-08-51.png

Normal lassen sich auch buttons erstellen, wie z.B. bestätigen oder abbrechen. Wobei Zurück (zurück:%me% ) aber nicht geht.

Aber wenn ich "normal" keine Buttons mit anderer Bezeichnung als Inhalt erstellen kann ist mir klar, warum dies so aussieht.

ToM_ToM

Hi Smarti,

danke für die Aufklärung. :)

@igami: Du weißt ja, dass ich schon ewig mit meinem Temperatur-Dialog rumkämpfe. Konnte jetzt den exakten Fehlerbereich ausfindig machen.


{
"Raumtemperaturen": {
"match": "Raumtemperaturen",
"message": [
"(Arbeitszimmer) (Badezimmer|Wohnzimmer) (zurück) ",
"TelegramBot_MTYPE=queryInline (%me%) ",
"{return telegramBotGetRoomTemperatureListMessage() }"
],
"Raum": {
"match": "(Arbeitszimmer|Badezimmer|Wohnzimmer)",
"commands": "setreading $SELF $recipient_Room $message",
"message": [
"(5.0°C|10.0°C|16.0°C|17.0°:17.0) ",
"(17.5°C|18.0°C|18.5°C|19.0°C) ",
"(19.5°C|20.0°C|20.5°C|21.0°C) ",
"(21.5°C|22.0°C|22.5°C|23.0°C) ",
"(abbrechen) ",
"Heizung im $message einstellen"
],
"Temperatur": {
"match": "on|off|[0-2][0-9][:.]([0]|[5])(°C)?",
"commands": "{my $temp = $message;;;; $temp =~ s/([\\d]{1,2}\\.[\\d{1}])(°C)?/$1/g;;;; my $room = ReadingsVal(\"$SELF\", \"$recipient_Room\", \"\");;;; my $clima = ($room==\"Arbeitszimmer\"?\"HM_568F52_Clima\":($room==\"Badezimmer\"?\"HM_3C5A11_Clima\":($room==\"Wohnzimmer\"?\"HM_51B1F7_Clima\":\"\")));;;; fhem(\"setreading $SELF clima $clima\");;;; fhem (\"set $clima desired-temp $temp\") }",
"message": [
"TelegramBot_MTYPE=queryInline (%me%) ",
"{my $room = ReadingsVal(\"$SELF\", \"$recipient_Room\", \"\");;;; my $temp = $message;;;; $temp =~ s/([\\d]{1,2}\\.[\\d{1}])(°C)?/$1/g;;;; return \"Temperatur im $room auf $temp eingestellt.\";;;; }"
]
}
}
  }
}


Sobald ich die $message Variable in die $temp Variable kopieren möchte
my $temp = $message;;;;
bekomme ich in Telegram die Rückmeldung: Unrecognized character \x{b0}

Kannst du dir das erklären woran das liegen könnte?

VG, Thomas
Hardware: BananaPi, Busmaster CUL, SanDisk 16GB Ultra SD, 16 GB USB-Stick | Software: Armbian, FHEM 5.8

igami

inline ist es im Chatverlauf, normal ist es anstelle der Tastatur
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

ToM_ToM

Hi igami,

ich habe mal wieder einen speziellen Fall. Wie kann ich eine Variable direkt hinter ein @ setzen ohne dass es als Array erkannt wird?

Ich möchte folgende URL per Messenger zurückgeben, jedoch den Längen- und Breitengrad durch eine Variable ersetzen.

https://www.google.de/maps/@50.0937185,8.7160645,11z?hl=de

Dein Modul erkennt durch das @ in der URL ein Array.


{
  "Notfall": {
    "message": [
"(Standort) ",
"TelegramBot_MTYPE=queryInline (%me%) ",
"Letzen Standort abfragen"

    ],
"Standort": {
"message": [
"TelegramBot_MTYPE=queryInline (%me%) ",
"{my $locLat = ReadingsVal(\"Thomas\", \"locationLat\", \"0\");; my $locLong = ReadingsVal(\"Thomas\", \"locationLong\", \"0\");; my $locLatTimestamp = ReadingsTimestamp(\"Thomas\", \"locationLat\", \"0\"); my $locAddress = ReadingsVal(\"Thomas\", \"locationAddr\", \"0\"); return \"Letzte Position war $locLatTimestamp: $locLat x $locLong \n $locAddress \n https://www.google.de/maps/@\".@$locLat.\",$locLong,15z?hl=de\"}"
]
}
  }
}


VG, Thomas
Hardware: BananaPi, Busmaster CUL, SanDisk 16GB Ultra SD, 16 GB USB-Stick | Software: Armbian, FHEM 5.8

igami

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

ToM_ToM

#395
Okay, das hatte ich auch erst gedacht. Aber dann bekomme ich die Rückmeldung:

illegal backslash escape sequence in string, at character offset 603 (before "\\@50.4505417,8.7452...") at /opt/fhem/FHEM/76_msgDialog.pm line 93.

Habe es nun mit der Codierung des @ Zeichens versucht. Aber dann wird einfach gar keine URL per Telegram übertragen. Der erste Text schon, aber die komplette URL fehlt.


{
  "Notfall": {
    "message": [
"(Standort) ",
"TelegramBot_MTYPE=queryInline (%me%) ",
"Letzen Standort abfragen"

    ],
"Standort": {
"message": [
"TelegramBot_MTYPE=queryInline (%me%) ",
"{my $locLat = ReadingsVal(\"Thomas\", \"locationLat\", \"0\");; my $locLong = ReadingsVal(\"Thomas\", \"locationLong\", \"0\");; my $locLatTimestamp = ReadingsTimestamp(\"Thomas\", \"locationLat\", \"0\"); my $locAddress = ReadingsVal(\"Thomas\", \"locationAddr\", \"0\"); return \"Letzte Position war $locLatTimestamp: $locLat x $locLong \n $locAddress \n https:\/\/www.google.de\/maps\/%40\".$locLat.\",$locLong,15z?hl=de\"}"
]
}
  }
}
Hardware: BananaPi, Busmaster CUL, SanDisk 16GB Ultra SD, 16 GB USB-Stick | Software: Armbian, FHEM 5.8

igami

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

ToM_ToM

#397
Funktionierte leider auch nicht. Aber habe den Fehler jetzt gefunden. :)
Das Komma und das Gleichheitszeichen in der URL mussten auch encodiert werden damit die URL im Telegram-Messenger angezeigt wird.


{
  "Notfall": {
    "message": [
"(Standort) ",
"TelegramBot_MTYPE=queryInline (%me%) ",
"Letzen Standort abfragen"

    ],
"Standort": {
"message": [
"TelegramBot_MTYPE=queryInline (%me%) ",
"{my $locLat = ReadingsVal(\"Thomas\", \"locationLat\", \"0\");; my $locLong = ReadingsVal(\"Thomas\", \"locationLong\", \"0\");; my $locLatTimestamp = ReadingsTimestamp(\"Thomas\", \"locationLat\", \"0\"); my $locAddress = ReadingsVal(\"Thomas\", \"locationAddr\", \"0\"); return \"Letzte Position war $locLatTimestamp: $locLat x $locLong $locAddress https:\/\/www.google.de\/maps\/%40\".$locLat.\",$locLong%2C15z?hl%3Dde\"}"
]
}
  }
}


VG, Thomas
Hardware: BananaPi, Busmaster CUL, SanDisk 16GB Ultra SD, 16 GB USB-Stick | Software: Armbian, FHEM 5.8

igami

Auf Wunsch hier noch der Einkaufslisten Dialog:

defmod Einkaufsliste_Dialog msgDialog { \
  "Einkaufsliste": {\
    "message": [\
      "(Waren hinzufügen) ", \
      "(Waren entfernen) ", \
      "(einkaufen) ", \
      "(abbrechen) ",\
      "{my $content = (split(': ', fhem('get %PostMe% list %list%')))[1];;;; return('Keine Einträge vorhanden') unless($content);;;; return(join('\n', split(',', $content)));;;;}"\
    ],\
    "Waren hinzufügen": {\
      "message": [\
        "Bitte jede Ware als neue Nachricht hinzufügen.",\
        "Das hinzufügen von Waren durch \"/beenden\" beenden."\
      ],\
      "Ware hinzufügen": {\
        "match": "[^/]+",\
        "commands": [\
          "set %PostMe% add %list% $message",\
          "setreading $SELF $recipient_history Einkaufsliste|Waren hinzufügen"\
        ]\
      }\
    },\
    "Waren entfernen": {\
      "message": [\
        "{return('(' . join(') (', split(',', (split(': ', fhem('get %PostMe% list %list%')))[1]), 'beenden'). ') ')}",\
        "Welche Ware möchtest du entfernen?"\
      ],\
      "Ware entfernen": {\
        "match": "^(?!beenden).+",\
        "commands": [\
          "set %PostMe% remove %list% $message",\
          "set $SELF say @$recipient Einkaufsliste|Waren entfernen"\
        ]\
      }\
    },\
    "einkaufen": {\
      "commands": [\
        "setreading $SELF $recipient_history Einkaufsliste|noch einzukaufen"\
      ],\
      "message": [\
        "{return('(' . join(') (', split(',', (split(': ', fhem('get %PostMe% list %list%')))[1])) . ') ')}",\
        "(beenden) ",\
        "Bitte die Waren der Reihenfolge nach auswählen in der sie eingekauft werden."\
      ]\
    },\
    "noch einzukaufen": {\
      "message": [\
        "{return('(' . join(') (', split(',', (split(': ', fhem('get %PostMe% list %list%')))[1])) . ') ')}",\
        "(beenden) ",\
        "Noch einzukaufen:"\
      ],\
      "Ware eingekauft": {\
        "match": "^(?!beenden).+",\
        "commands": [\
          "set %PostMe% remove %list% $message",\
          "set $SELF say @$recipient Einkaufsliste|noch einzukaufen"\
        ]\
      }\
    }    \
  }\
}

attr Einkaufsliste_Dialog evalSpecials PostMe=PostMe\
list=Einkaufsliste
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

Marlen

Sehr cool die Einkaufsliste!!!!

Hab das ganze gerade noch mit "Standard-Waren" ergänzt, so kann man schnell "Standard-Waren" per click hinzufügen!

defmod Einkaufsliste_Dialog msgDialog { \
  "6. Einkaufsliste": {\
  "match": "Einkaufsliste",\
    "message": [\
      "(Waren hinzufügen) ", \
      "(Waren entfernen|einkaufen) ",\
  "(Standard-Waren) ",\
      "(Menü) ",\
      "{my $content = (split(': ', fhem('get %PostMe% list %list%')))[1];;;; return('Keine Einträge vorhanden') unless($content);;;; return(join('\n', split(',', $content)));;;;}"\
    ],\
    "Waren hinzufügen": {\
      "message": [\
        "{return('(' . join(') (', split(',', (split(': ', fhem('get %PostMe% list %standard%')))[1]), 'fertig'). ') ')}",\
        "Bitte jede Ware als neue Nachricht oder per Tastatur hinzufügen."\
      ],\
      "Ware hinzufügen": {\
        "match": "[^/]+",\
        "commands": [\
          "set %PostMe% add %list% $message",\
          "setreading $SELF $recipient_history Einkaufsliste|Waren hinzufügen",\
   "set $SELF say @$recipient Einkaufsliste|Waren hinzufügen"\
        ]\
      },\
   "fertig": {\
        "commands": [\
     "set $SELF say @$recipient Einkaufsliste"\
        ]\
      }  \
    },\
    "Waren entfernen": {\
      "message": [\
        "{return('(' . join(') (', split(',', (split(': ', fhem('get %PostMe% list %list%')))[1]), 'fertig'). ') ')}",\
        "Welche Ware möchtest du entfernen?"\
      ],\
      "Ware entfernen": {\
        "match": "^(?!beenden).+",\
        "commands": [\
          "set %PostMe% remove %list% $message",\
          "set $SELF say @$recipient Einkaufsliste|Waren entfernen"\
        ]\
      },\
     "fertig": {\
        "commands": [\
     "set $SELF say @$recipient Einkaufsliste"\
        ]\
      } \
    },\
    "einkaufen": {\
      "commands": [\
        "setreading $SELF $recipient_history Einkaufsliste|noch einzukaufen"\
      ],\
      "message": [\
        "{return('(' . join(') (', split(',', (split(': ', fhem('get %PostMe% list %list%')))[1])) . ') ')}",\
        "(fertig) ",\
        "Bitte die Waren der Reihenfolge nach auswählen in der sie eingekauft werden."\
      ]\
    },\
    "noch einzukaufen": {\
      "message": [\
        "{return('(' . join(') (', split(',', (split(': ', fhem('get %PostMe% list %list%')))[1])) . ') ')}",\
        "(fertig) ",\
        "Noch einzukaufen:"\
      ],\
      "Ware eingekauft": {\
        "match": "^(?!beenden).+",\
        "commands": [\
          "set %PostMe% remove %list% $message",\
          "set $SELF say @$recipient Einkaufsliste|noch einzukaufen"\
        ]\
      },\
     "fertig": {\
        "commands": [\
"set %PostMe% remove %list% $message",\
          "set $SELF say @$recipient Einkaufsliste|noch einzukaufen",\
     "set $SELF say @$recipient Einkaufsliste"\
        ]\
      } \
       \
  },\
    "Standard-Waren": {\
  "match": "Standard",\
    "message": [\
      "(Standard-Waren hinzufügen) ", \
      "(Standard-Waren entfernen) ",\
      "(Menü) ",\
      "{my $content = (split(': ', fhem('get %PostMe% list %standard%')))[1];;;; return('Keine Einträge vorhanden') unless($content);;;; return(join('\n', split(',', $content)));;;;}"\
    ],\
"Standard-Waren hinzufügen": {\
      "message": [\
  "(fertig) ",\
        "Bitte jede Ware als neue Nachricht hinzufügen.",\
        "Das hinzufügen von Waren durch \"/beenden\" beenden."\
      ],\
      "Ware hinzufügen": {\
        "match": "[^/]+",\
        "commands": [\
          "set %PostMe% add %standard% $message",\
          "setreading $SELF $recipient_history Einkaufsliste|Standard|Standard-Waren hinzufügen",\
   "set $SELF say @$recipient Einkaufsliste|Standard|Standard-Waren hinzufügen"\
        ]\
      },\
   "fertig": {\
        "commands": [\
     "set $SELF say @$recipient Einkaufsliste"\
        ]\
      }  \
    },\
    "Standard-Waren entfernen": {\
      "message": [\
        "{return('(' . join(') (', split(',', (split(': ', fhem('get %PostMe% list %standard%')))[1]), 'fertig'). ') ')}",\
        "Welche Standard-Ware möchtest du entfernen?"\
      ],\
      "Ware entfernen": {\
        "match": "^(?!beenden).+",\
        "commands": [\
          "set %PostMe% remove %standard% $message",\
          "set $SELF say @$recipient Einkaufsliste|Standard|Standard-Waren entfernen"\
        ]\
      },\
     "fertig": {\
        "commands": [\
     "set $SELF say @$recipient Einkaufsliste"\
        ]\
      } \
    }\
}\
}\
}
attr Einkaufsliste_Dialog allowed everyone
attr Einkaufsliste_Dialog evalSpecials PostMe=PostMe\
list=Einkaufsliste\
standard=Standardartikel


setstate Einkaufsliste_Dialog 2018-03-13 22:21:14 state Initialized



LG
  Marlen

Marlen

Hmmm..... cool wäre noch wenn beim Ware hinzufügen die Frage kommen würde in welchen Geschäft und wenn mann dann Edeka auswählt,
in der Einkaufsliste z.B.
ZitatEdeka - Toast
eingetragen würde.

Da die Liste alphabetisch sortiert ausgegeben wird, ist die Liste dann nach Geschäften sortiert.

LG
  Marlen

Marlen

Hallo,

gibt es dazu eine Lösung? Wie kann ich die $message in einer Variable schreiben, damit ich im weiterführenden Dialog damit arbeiten kann?

ZitatSobald ich die $message Variable in die $temp Variable kopieren möchte
Code: [Auswählen]
my $temp = $message;;;;
bekomme ich in Telegram die Rückmeldung: Unrecognized character \x{b0}

LG
  Marlen

igami

Poste mal bitte die komplette DEF mit der es nicht funktioniert, dann schaue ich es mir an.
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

Marlen

Hab es jetzt über ein reading gelöst.
{
  "5. Einkaufsliste": {
  "match": "Einkaufsliste",
    "message": [
      "(Waren hinzufügen) ",
      "(Waren entfernen|einkaufen) ",
  "(Standard-Waren|Menü) ",
      "{my $content = (split(': ', fhem('get %PostMe% list %list%')))[1];; return('Keine Einträge vorhanden') unless($content);; return(join('\n', split(',', $content)));;}"
    ],
    "Waren hinzufügen": {
      "message": [
        "{return('(' . join(') (', split(',', (split(': ', fhem('get %PostMe% list %standard%')))[1]), 'fertig'). ') ')}",
        "Bitte jede Ware als neue Nachricht oder per Tastatur hinzufügen."
      ],
      "Ware hinzufügen": {
        "match": "[^/]+",
        "commands": [
  "setreading $SELF $recipient_artikel $message"
        ],
      "message": [
  "(ALDI|LIDL) ",
  "(EDEKA|REWE) ",
  "In welchem Geschäft soll [$SELF:$recipient_artikel] gekauft werden?"
       ],
   "Geschäft wählen": {
        "match": "[^/]+",
        "commands": [
  "my $temp = $message",
          "set %PostMe% add %list% $message --> [$SELF:$recipient_artikel]",
          "setreading $SELF $recipient_history Einkaufsliste|Waren hinzufügen",
   "set $SELF say @$recipient Einkaufsliste|Waren hinzufügen"
        ]
}
},
 
 
 
   "fertig": {
        "commands": [
     "set $SELF say @$recipient Einkaufsliste"
        ]
      } 
    },
    "Waren entfernen": {
      "message": [
        "{return('(' . join(') (', split(',', (split(': ', fhem('get %PostMe% list %list%')))[1]), 'fertig'). ') ')}",
        "Welche Ware möchtest du entfernen?"
      ],
      "Ware entfernen": {
        "match": "^(?!beenden).+",
        "commands": [
          "set %PostMe% remove %list% $message",
          "set $SELF say @$recipient Einkaufsliste|Waren entfernen"
        ]
      },
     "fertig": {
        "commands": [
     "set $SELF say @$recipient Einkaufsliste"
        ]
      }
    },
    "einkaufen": {
      "commands": [
        "setreading $SELF $recipient_history Einkaufsliste|noch einzukaufen"
      ],
      "message": [
        "{return('(' . join(') (', split(',', (split(': ', fhem('get %PostMe% list %list%')))[1])) . ') ')}",
        "(fertig) ",
        "Bitte die Waren der Reihenfolge nach auswählen in der sie eingekauft werden."
      ]
    },
    "noch einzukaufen": {
      "message": [
        "{return('(' . join(') (', split(',', (split(': ', fhem('get %PostMe% list %list%')))[1])) . ') ')}",
        "(fertig) ",
        "Noch einzukaufen:"
      ],
      "Ware eingekauft": {
        "match": "^(?!beenden).+",
        "commands": [
          "set %PostMe% remove %list% $message",
          "set $SELF say @$recipient Einkaufsliste|noch einzukaufen"
        ]
      },
     "fertig": {
        "commands": [
"set %PostMe% remove %list% $message",
          "set $SELF say @$recipient Einkaufsliste|noch einzukaufen",
     "set $SELF say @$recipient Einkaufsliste"
        ]
      }
       
  },
    "Standard-Waren": {
  "match": "Standard",
    "message": [
      "(Standard-Waren hinzufügen) ",
      "(Standard-Waren entfernen) ",
      "(Menü) ",
      "{my $content = (split(': ', fhem('get %PostMe% list %standard%')))[1];; return('Keine Einträge vorhanden') unless($content);; return(join('\n', split(',', $content)));;}"
    ],
"Standard-Waren hinzufügen": {
      "message": [
  "(fertig) ",
        "Bitte jede Standard-Ware als neue Nachricht hinzufügen."
      ],
      "Ware hinzufügen": {
        "match": "[^/]+",
        "commands": [
          "set %PostMe% add %standard% $message",
          "setreading $SELF $recipient_history Einkaufsliste|Standard|Standard-Waren hinzufügen",
   "set $SELF say @$recipient Einkaufsliste|Standard|Standard-Waren hinzufügen"
        ]
      },
   "fertig": {
        "commands": [
     "set $SELF say @$recipient Einkaufsliste"
        ]
      } 
    },
    "Standard-Waren entfernen": {
      "message": [
        "{return('(' . join(') (', split(',', (split(': ', fhem('get %PostMe% list %standard%')))[1]), 'fertig'). ') ')}",
        "Welche Standard-Ware möchtest du entfernen?"
      ],
      "Ware entfernen": {
        "match": "^(?!beenden).+",
        "commands": [
          "set %PostMe% remove %standard% $message",
          "set $SELF say @$recipient Einkaufsliste|Standard|Standard-Waren entfernen"
        ]
      },
     "fertig": {
        "commands": [
     "set $SELF say @$recipient Einkaufsliste"
        ]
      }
    }
}
}
}


Bin gerade dabei mir das ganze noch für meinen Gefrierschrank zu bauen, dazu möchte ich beim hinzufügen (einfrieren) das Datum mit anhängen!
Steh irgendwie auf den Schlauch, sollte doch einfach mit $today funktionieren!
    "commands": [
  "set %PostMe% add %list% $message --> $today",


LG
  Marlen


igami

Zitat von: Marlen am 14 März 2018, 20:30:46
Hab es jetzt über ein reading gelöst.
teste doch mal bitte ob es mit einem '$message' als Zuweisung funktioniert (mit den Anführungszeichen).

Steh irgendwie auf den Schlauch, sollte doch einfach mit $today funktionieren!
    "commands": [
  "set %PostMe% add %list% $message --> $today",

[/quote]
Wird $today in einem normalen FHEM Befehl ausgewertet oder nur als Perl?
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