chatBot (vordefinierte Dialoge) für Telegram

Begonnen von igami, 27 März 2016, 17:17:32

Vorheriges Thema - Nächstes Thema

BKSolo

Ich habe TelegramBot nun auch am Laufen inkl. vordefinierten Dialoge.
Dazu hat mir der Beitrag #12 vom 22 Juni 2016, 23:14:03 » von tiroso  viel geholfen. Danke euch.

Etwas Zeit brauchte ich für die userattr korrekt zu definieren, da ich das noch nicht kannte.

Weiter brauchte ich etwas Zeit bis ich herausgefunden hatte, was z.B. /alleheizungplot als Wert eingetragen werden muss.
Die Antwort ist - es muss die Bezeichnung aus der SVG Definition im fhem.cfg verwendet werden.
fhem.cfg:  define SVG_FS20_S8_3_T1 SVG FS20_S8_3_T1:SVG_FS20_S8_3_T1:CURRENT 
99_myUtilsTelegram.pm: ["SVG_FS20_S8_3_T1","SVG Plot T1"],

Es werden über Telegram Messages die Ausgänge eines FS20 SM8 über CUL (drahtlos) in meinem Wohnmobil geschaltet.
Dazu habe ich im WoMo ein Raspberry mit FHEM im Einsatz. Setze auch den neuen Touchscreen ein.
Der Floorplan des Wohnmobils mit den Schaltern lässt die Ausgänge auch lokal schalten.

Der Remote Zugang läuft über ein Mobile Wi-Fi, wo alles im WoMo per WLAN untereinander kommuniziert.

Als nächstes geht es daran es mit Sensoren zu erweitern, die mir Zustände / Grenzwertüberschreitungen etc.  per Telegram Messages melden werden.

Gruss, Bruno




Raspberry PI 2/3 - CUL-433(V3) - CUL-868 (V3) - Jeelink 868 - 433 S/E Eigenbau
TX29DTH-IT - FHT80B - FHT80TF - FS20KSE
FHEMobile 3.7r803 - Fhem2Fhem - Alpha2 - OZW672 - TelegramBot

igami

Ich habe meine Methode, die auf DOIF basiert, mittlerweile auch weiter entwickelt und werde die dann vorstellen, wenn sie komplett funktioniert.
Mittlerweile kann ich Berechtigungen für Dialoge vergeben (ich kann alles, meine bessere Hälfte nur ausgewählte Sachen). Weiterhin nutzte ich nun aufgrund von Wurstfingern Keyboards statt /Text. Auch können mehrere Nutzer parallel den gleichen Dialog ausführen.
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

jazzor

Zitat von: igami am 15 November 2016, 05:56:38
Ich habe meine Methode, die auf DOIF basiert, mittlerweile auch weiter entwickelt und werde die dann vorstellen, wenn sie komplett funktioniert.
Mittlerweile kann ich Berechtigungen für Dialoge vergeben (ich kann alles, meine bessere Hälfte nur ausgewählte Sachen). Weiterhin nutzte ich nun aufgrund von Wurstfingern Keyboards statt /Text. Auch können mehrere Nutzer parallel den gleichen Dialog ausführen.
Igami, genau so etwas versuche ich auch gerade aufzubauen.
Wärst du bereit, deinen Code/ deine Method auch im 'unfertigen' Zustand schon zu teilen?
Vielleicht kann man dann zusammen weiter machen, man muss ja nicht das Rad neu erfinden :-)

igami

Hakki
Zitat von: jazzor am 01 Dezember 2016, 17:05:01
Wärst du bereit, deinen Code/ deine Method auch im 'unfertigen' Zustand schon zu teilen?
Hallo jazzor,

kann ich gerne machen. Ich möchte aber betonen, dass ich keine Lust habe großartig Support dafür zu übernehmen. Meine Lösung ist eher was für welche die fundierte Grundkenntnisse in DOIF und perl haben.

Vorab:

  • das TelegramBot device hat den name TelegramBot
  • meinen Bot spreche ich mit heimdall an (Wikipedia)
  • für meine Telegram ID nutze ich hier im Forum 12345678
  • für die Telegram ID meiener Freundin nutze ich hier im Foum 87654321

global userattr erweitern:

{addToAttrList("subType")}


TelegramBot einrichten

attr <TelegramBot> userReadings replyId:msgText.* {ReadingsVal($name, "msgChat", "") eq "" ? ReadingsVal($name, "msgPeerId", "") : (split(" ", ReadingsVal($name, "msgChat", ""), 2))[0]}


notify um Kontakte bequem zuzuweisen

defmod Contacts_notify notify .*Contacts:.* {\
  return if(InternalVal($NAME, "TYPE", "undef") ne "TelegramBot");;\
  my @Contacts = split(" ", ReadingsVal($NAME, "Contacts", ""));;\
  $_ = join(":", (split(":", $_))[0,1]) for (@Contacts);;\
  fhem("attr subType=dialog widgetOverride msgPeerId:multiple-strict,".join(",", @Contacts));;\
  return;;  \
}
attr Contacts_notify devStateIcon {ReadingsVal($name, "state", "inactive") eq "active" ? ".*:ios-on-blue:inactive" : ".*:ios-off:active"}
attr Contacts_notify icon audio_mic
attr Contacts_notify room Telegram


myUtils erweitern:

sub TelegramBot_SendKeyboard($$$@) {
  my ($name, $peer, $msg, @rows) = @_;
  my $hash = $defs{$name};
  my @keys;
  for (@rows){
    my @columns = split("\\|", $_);
    push(@keys, \@columns);
  }
  my $jsonkb = TelegramBot_MakeKeyboard($hash, 1, 0, @keys);
  TelegramBot_SendIt($hash, $peer, $msg, $jsonkb, 0);
  return;
}


Notify um Nachrichten an die Dialoge weiter zu leiten:

defmod dialog_notify notify .*msgText:.* {\
  return if(InternalVal($NAME, "TYPE", "undef") ne "TelegramBot");;\
  my $msgPeerId = ReadingsVal($NAME, "msgPeerId", undef);;\
  my $msgChat = ReadingsVal($NAME, "msgChat", "");;\
    $msgChat = (split(" ", $msgChat, 2))[0] if($msgChat ne "");;\
  my $msgText = ReadingsVal($NAME, "msgText", undef);;\
\
  my @a = devspec2array("subType=dialog:FILTER=disable!=1");;\
  my @dialogs;;\
    for (@a){\
      push(@dialogs, $_)\
        if\
        (grep(/$msgPeerId/, split(",", AttrVal($_, "msgPeerId", ""))) and\
         (grep(/$msgChat/, split(",", AttrVal($_, "msgChat", ""))) or\
           $msgChat eq ""\
         ) and\
         trim($defs{$_}->{devices}{0}) eq $_\
        );;;;\
    }\
\
  fhem("trigger $_ msg: $msgText", 0) for (@dialogs);;\
  return;;  \
}
attr dialog_notify devStateIcon {ReadingsVal($name, "state", "inactive") eq "active" ? ".*:ios-on-blue:inactive" : ".*:ios-off:active"}
attr dialog_notify icon audio_mic
attr dialog_notify room Telegram


Hauptdialog:

defmod heimdall_dialog DOIF ### heimdall ###\
  ([$SELF:"^msg: /(heimdall|start)$"])(\
    ({my @a = devspec2array("subType=dialog:FILTER=disable!=1:FILTER=NAME!=$SELF");;;;\
      my $msgChat = ReadingsVal("TelegramBot", "msgChat", "");;;;\
        $msgChat = (split(" ", $msgChat, 2))[0] if($msgChat ne "");;;;\
      my @dialogs;;;;\
      for (@a){\
        push(@dialogs, $_)\
          if(grep(/[TelegramBot:msgPeerId]/, split(",", AttrVal($_, "msgPeerId", ""))) and\
            ((grep(/$msgChat/, split(",", AttrVal($_, "msgChat", ""))) or\
              $msgChat eq ""\
             ) and\
             trim($defs{$_}->{devices}{0}) eq $_\
            )\
          );;;;\
      }\
      if($dialogs[0] and defined($defs{$dialogs[0]})){\
        $_ = trim((split("\#\#\#", InternalVal($_, "DEF", undef), 3))[1]) for (@dialogs);;;;\
        @dialogs = sort(@dialogs);;;;\
      }\
      else{\
        return;;;;\
      }\
      push(@dialogs, "abbrechen");;;;\
\
      TelegramBot_SendKeyboard("TelegramBot", "[TelegramBot:replyId]", "Ich kann folgendes für dich tun:", @dialogs);;;;\
     }\
    ),\
    sleep 0.001;; setreading subType=dialog [TelegramBot:msgPeerId] initialized\
  )\
### abbrechen ###\
  DOELSEIF\
  ([$SELF:"^msg: /?abbrechen$"])(\
    ({Telegram_reply("TelegramBot", "Dialog abgebrochen.\n\n/heimdall");;;;}),\
    sleep 0.001;; setreading subType=dialog [TelegramBot:msgPeerId] initialized\
  )\
### beenden ###\
  DOELSEIF\
  ([$SELF:"^msg: /?beenden$"])(\
    ({Telegram_reply("TelegramBot", "Dialog beendet.\n\n/heimdall");;;;}),\
    sleep 0.001;; setreading subType=dialog [TelegramBot:msgPeerId] initialized\
  )
attr heimdall_dialog userattr msgPeerId
attr heimdall_dialog alias Telegram: heimdall Dialog
attr heimdall_dialog cmdState heimdall|abbrechen|beenden
attr heimdall_dialog do always
attr heimdall_dialog event-on-change-reading none
attr heimdall_dialog group Dialog
attr heimdall_dialog icon audio_playlist
attr heimdall_dialog msgPeerId 12345678:Michael,87654321:Riku
attr heimdall_dialog notexist notexist
attr heimdall_dialog repeatsame 0:1
attr heimdall_dialog room Telegram
attr heimdall_dialog subType dialog
attr heimdall_dialog widgetOverride msgPeerId:multiple-strict,12345678:Michael,87654321:Riku


Das sind die Grundeinstellungen. Nun zu den Dialogen:

  • alle Dialoge sind DOIF
  • alle Dialoge müssen mit "### <Dialog> ###" beginnen
  • ich habe für alle Dialoge die Attribute mit Werten: "do always", "notexist notexist", "repeatsame 0:1" und "subType dialog" gesetzt
  • zum Auswerten der Nachrichten wird [$SELF:"^msg: <msg>$"] verwendet (siehe Commandref zu DOIF Events)

Ich habe folgende Dialoge definiert:

INITIALIZED_dialog
Michael_alarm_dialog
PostMe_Einkaufsliste_dialog
PostMe_Geschenke_dialog
Schlafzimmer_alarm_dialog
Tankstelle_dialog
Waschkeller_clothesline_dialog
Waschkeller_washer_dialog
Weather_frost_dialog
Wohnzimmer_alarm_dialog
grill_dialog
ip_dialog
lightning_dialog
opened_windows_dialog

Falls ein bestimmter davon interessant erscheint kann ich Raw defintion davon posten.

Hier ein paar ausgewählte Dialoge (das Attribut MsgPeerId poste ich dabei nicht mit, dies ist jedoch zwingend erforderlich)

opened_windows_dialog

defmod opened_windows_dialog DOIF ### Fenster ###\
  ([$SELF:"^msg: Fenster$"])(\
    ({my @windows = devspec2array("model=HM-SEC-SC.*:FILTER=state!=closed");;;;\
      my $msg = "Es sind noch folgenede Fenster geöffnet:\n";;;;\
\
      if(@windows > 0){\
        $msg .= "\n".AttrVal($_, "alias", $_) for (@windows);;;;\
      }else{\
        $msg = "Es sind alle Fenster geschlossen.";;;;\
      }\
      $msg .= "\n\n/heimdall";;;;\
\
      Telegram_reply("TelegramBot", $msg);;;;\
     }\
    )\
  )
attr opened_windows_dialog userattr do notexist msgPeerId repeatsame
attr opened_windows_dialog alias Telegram: Fenster Dialog
attr opened_windows_dialog cmdState Fenster Status gesendet
attr opened_windows_dialog description {trim((split("\#\#\#", InternalVal($name, "DEF", undef), 3))[1])}
attr opened_windows_dialog do always
attr opened_windows_dialog event-on-change-reading none
attr opened_windows_dialog group Dialog
attr opened_windows_dialog icon audio_playlist
attr opened_windows_dialog notexist notexist
attr opened_windows_dialog repeatsame 0:1
attr opened_windows_dialog room Telegram
attr opened_windows_dialog subType dialog


und die Keule
lightning_dialog:

defmod lightning_dialog DOIF ### Beleuchtung ###\
  ([$SELF:"^msg:.+Beleuchtung$"])(\
    set HUEDevice(\d)+ statusRequest\
  )(\
    ({my $msg = q{\
        Welche Beleuchtung möchtest du schalten?\
        \nDu kannst auch eine Beleuchtung und einen Wert in % angeben.\
        \nZum Beispiel "Schlafzimmer Deckenlampe 20" oder "Sz d 20".\
      };;;;\
      \
      my @rows;;;;\
        push(@rows, "Beleuchtung");;;;\
        push(@rows, q{[HM_24074C_Sw_01:state:"(.*)":$1 =~ "off" ? "Flur Beleuchtung ein" : "Flur Beleuchtung aus"]});;;;\
        push(@rows, (("[HUEDevice6:state]" !~ /unreachable|off/ or "[HUEDevice7:state]" !~ /unreachable|off/ or "[HUEDevice8:state]" !~ /unreachable|off/) ? "Küche Deckenlampe aus" : "Küche Deckenlampe ein"))\
          if\
          ("[HUEDevice6:state]" !~ /unreachable/ or\
           "[HUEDevice7:state]" !~ /unreachable/ or\
           "[HUEDevice8:state]" !~ /unreachable/\
          );;;;\
        push(@rows, (("[HUEDevice6:state]" !~ /unreachable|off/ or "[HUEDevice7:state]" !~ /unreachable|off/ or "[HUEDevice8:state]" !~ /unreachable|off/) ? "Küche Deckenlampe dimmen" : "Küche Deckenlampe dimmen"))\
          if\
          ("[HUEDevice6:state]" !~ /unreachable/ or\
           "[HUEDevice7:state]" !~ /unreachable/ or\
           "[HUEDevice8:state]" !~ /unreachable/\
          );;;;\
        push(@rows, q{[HUEDevice9:state:"(.*)":$1 =~ "off" ? "Schlafzimmer Deckenlampe ein" : "Schlafzimmer Deckenlampe aus"]}) if("[HUEDevice9:state]" !~ /unreachable/);;;;\
        push(@rows, q{[HUEDevice9:state:"(.*)":$1 =~ "off" ? "Schlafzimmer Deckenlampe dimmen" : "Schlafzimmer Deckenlampe dimmen"]}) if("[HUEDevice9:state]" !~ /unreachable/);;;;\
        push(@rows, q{[HUEDevice5:state:"(.*)":$1 =~ "off" ? "Schlafzimmer Nachttischlampe ein" : "Schlafzimmer Nachttischlampe aus"]}) if("[HUEDevice5:state]" !~ /unreachable/);;;;\
        push(@rows, q{[HUEDevice5:state:"(.*)":$1 =~ "off" ? "Schlafzimmer Nachttischlampe dimmen" : "Schlafzimmer Nachttischlampe dimmen"]}) if("[HUEDevice5:state]" !~ /unreachable/);;;;\
        push(@rows, (("[HUEDevice2:state]" !~ /unreachable|off/ or "[HUEDevice3:state]" !~ /unreachable|off/ or "[HUEDevice4:state]" !~ /unreachable|off/) ? "Arbeitszimmer Deckenlampe aus" : "Arbeitszimmer Deckenlampe ein"))\
          if\
          ("[HUEDevice2:state]" !~ /unreachable/ or\
           "[HUEDevice3:state]" !~ /unreachable/ or\
           "[HUEDevice4:state]" !~ /unreachable/\
          );;;;\
        push(@rows, (("[HUEDevice2:state]" !~ /unreachable|off/ or "[HUEDevice3:state]" !~ /unreachable|off/ or "[HUEDevice4:state]" !~ /unreachable|off/) ? "Arbeitszimmer Deckenlampe dimmen" : "Arbeitszimmer Deckenlampe dimmen"))\
          if\
          ("[HUEDevice2:state]" !~ /unreachable/ or\
           "[HUEDevice3:state]" !~ /unreachable/ or\
           "[HUEDevice4:state]" !~ /unreachable/\
          );;;;\
        push(@rows, q{[HUEDevice1:state:"(.*)":$1 =~ "off" ? "Wohnzimmer Deckenlampe ein" : "Wohnzimmer Deckenlampe aus"]}) if("[HUEDevice1:state]" !~ /unreachable/);;;;\
        push(@rows, q{[HUEDevice1:state:"(.*)":$1 =~ "off" ? "Wohnzimmer Deckenlampe dimmen" : "Wohnzimmer Deckenlampe dimmen"]}) if("[HUEDevice1:state]" !~ /unreachable/);;;;\
        push(@rows, q{[HM_273CDB:state:"(.*)":$1 =~ "off" ? "Wohnzimmer Spots ein" : "Wohnzimmer Spots aus"]});;;;\
        push(@rows, q{[HM_273CDB:state:"(.*)":$1 =~ "off" ? "Wohnzimmer Spots dimmen" : "Wohnzimmer Spots dimmen"]});;;;\
        push(@rows, "abbrechen");;;;\
\
      TelegramBot_SendKeyboard("TelegramBot", "[TelegramBot:replyId]", $msg, @rows);;;;\
     }\
    ),\
    sleep 0.001;; setreading $SELF state send status\
  )\
### Flur Beleuchtung aus ###\
  DOELSEIF\
  ([$SELF:"^msg:.+(Flur|[Ff]) (Beleuchtung|[Bb]) (aus|0)"])(\
    set HM_24074C_Sw_01 off,\
    ({Telegram_reply("TelegramBot", "Flur Beleuchtung ausgeschaltet.\n\n/heimdall")}),\
    sleep 0.001;; setreading $SELF state Flur Beleuchtung aus\
  )\
### Flur Beleuchtung ein ###\
  DOELSEIF\
  ([$SELF:"^msg:.+(Flur|[Ff]) (Beleuchtung|[Bb]) (ein|100|[1-9][0-9]|[1-9])"])(\
    set HM_24074C_Sw_01 on,\
    ({Telegram_reply("TelegramBot", "Flur Beleuchtung eingeschaltet.\n\n/heimdall")}),\
    sleep 0.001;; setreading $SELF state Flur Beleuchtung ein\
  )\
### Küche Deckenlampe aus ###\
  DOELSEIF\
  ([$SELF:"^msg:.+(Küche|[Kk]) (Deckenlampe|[Dd]) (aus|0)"])(\
    set HUEGroup3 off,\
    ({Telegram_reply("TelegramBot", "Küche Deckenlampe ausgeschaltet.\n\n/heimdall")}),\
    sleep 0.001;; setreading $SELF state Küche Deckenlampe aus\
  )\
### Küche Deckenlampe ein ###\
  DOELSEIF\
  ([$SELF:"^msg:.+(Küche|[Kk]) (Deckenlampe|[Dd]) (ein|100)"])(\
    set HUEGroup3 pct 100,\
    ({Telegram_reply("TelegramBot", "Küche Deckenlampe eingeschaltet.\n\n/heimdall")}),\
    sleep 0.001;; setreading $SELF state Küche Deckenlampe ein\
  )\
### Küche Deckenlampe % ###\
  DOELSEIF\
  ([$SELF:"^msg:.+(Küche|[Kk]) (Deckenlampe|[Dd]) ([1-9]|[1-9][0-9])$"])(\
    set HUEGroup3 pct [TelegramBot:msgText:".* (.*)$":$1],\
    ({Telegram_reply("TelegramBot", q{Küche Deckenlampe auf [TelegramBot:msgText:".* (.*)$":$1] % gedimmt.\n\n/heimdall})}),\
    sleep 0.001;; setreading $SELF state Küche Deckenlampe [TelegramBot:msgText:".* (.*)$":$1]\
  )\
### request K D dim ###\
  DOELSEIF\
  ([$SELF:"^msg:.+(Küche|[Kk]) (Deckenlampe|[Dd]) (dimmen|[Dd])$"])(\
    ({TelegramBot_SendKeyboard("TelegramBot", "[TelegramBot:replyId]", "Welchen Wert soll ich einstellen?", "5|10|15|20|25", "30|35|40|45|50", "55|60|65|70|75", "80|85|90|95|100", "0|abbrechen")}),\
    setreading $SELF [TelegramBot:msgPeerId] request K D dim,\
    sleep 0.001;; setreading $SELF state request K D dim\
  )\
  ### request K D dim set done ###\
    DOELSEIF\
    ([$SELF:"^msg:.+([0-9]|[1-9][0-9]|100)$"] and\
     ReadingsVal("$SELF", [TelegramBot:msgPeerId], "") eq "request K D dim"\
    )(\
      set HUEGroup3 pct [TelegramBot:msgText],\
      ({TelegramBot_SendKeyboard("TelegramBot", "[TelegramBot:replyId]",  q{Küche Deckenlampe auf [TelegramBot:msgText] % gedimmt.}, "5|10|15|20|25", "30|35|40|45|50", "55|60|65|70|75", "80|85|90|95|100", "0|beenden")}),\
      sleep 0.001;; setreading $SELF state Küche Deckenlampe [TelegramBot:msgText]\
    )\
### Schlafzimmer Deckenlampe aus ###\
  DOELSEIF\
  ([$SELF:"^msg:.+(Schlafzimmer|[Ss][Zz]) (Deckenlampe|[Dd]) (aus|0)"])(\
    set HUEDevice9 off,\
    ({Telegram_reply("TelegramBot", "Schlafzimmer Deckenlampe ausgeschaltet.\n\n/heimdall")}),\
    sleep 0.001;; setreading $SELF state Schlafzimmer Deckenlampe aus\
  )\
### Schlafzimmer Deckenlampe ein ###\
  DOELSEIF\
  ([$SELF:"^msg:.+(Schlafzimmer|[Ss][Zz]) (Deckenlampe|[Dd]) (ein|100)"])(\
    set HUEDevice9 pct 100,\
    ({Telegram_reply("TelegramBot", "Schlafzimmer Deckenlampe eingeschaltet.\n\n/heimdall")}),\
    sleep 0.001;; setreading $SELF state Schlafzimmer Deckenlampe ein\
  )\
### Schlafzimmer Deckenlampe % ###\
  DOELSEIF\
  ([$SELF:"^msg:.+(Schlafzimmer|[Ss][Zz]) (Deckenlampe|[Dd]) ([1-9]|[1-9][0-9])$"])(\
    set HUEDevice9 pct [TelegramBot:msgText:".* (.*)$":$1],\
    ({Telegram_reply("TelegramBot", q{Schlafzimmer Deckenlampe auf [TelegramBot:msgText:".* (.*)$":$1] % gedimmt.\n\n/heimdall})}),\
    sleep 0.001;; setreading $SELF state Schlafzimmer Deckenlampe [TelegramBot:msgText:".* (.*)$":$1]\
  )\
### request SZ D dim ###\
  DOELSEIF\
  ([$SELF:"^msg:.+(Schlafzimmer|[Ss][Zz]) (Deckenlampe|[Dd]) (dimmen|[Dd])$"])(\
    ({TelegramBot_SendKeyboard("TelegramBot", "[TelegramBot:replyId]", "Welchen Wert soll ich einstellen?", "5|10|15|20|25", "30|35|40|45|50", "55|60|65|70|75", "80|85|90|95|100", "0|abbrechen")}),\
    setreading $SELF [TelegramBot:msgPeerId] request SZ D dim,\
    sleep 0.001;; setreading $SELF state request SZ D dim\
  )\
  ### request SZ D dim set done ###\
    DOELSEIF\
    ([$SELF:"^msg:.+([0-9]|[1-9][0-9]|100)$"] and\
     ReadingsVal("$SELF", [TelegramBot:msgPeerId], "") eq "request SZ D dim"\
    )(\
      set HUEDevice9 pct [TelegramBot:msgText],\
      ({TelegramBot_SendKeyboard("TelegramBot", "[TelegramBot:replyId]",  q{Schlafzimmer Deckenlampe auf [TelegramBot:msgText] % gedimmt.}, "5|10|15|20|25", "30|35|40|45|50", "55|60|65|70|75", "80|85|90|95|100", "0|beenden")}),\
      sleep 0.001;; setreading $SELF state Schlafzimmer Deckenlampe [TelegramBot:msgText]\
    )\
### Schlafzimmer Nachttischlampe aus ###\
  DOELSEIF\
  ([$SELF:"^msg:.+(Schlafzimmer|[Ss][Zz]) (Nachttischlampe|[Nn]) (aus|0)"])(\
    set HUEDevice5 off,\
    ({Telegram_reply("TelegramBot", "Schlafzimmer Nachttischlampe ausgeschaltet.\n\n/heimdall")}),\
    sleep 0.001;; setreading $SELF state Schlafzimmer Nachttischlampe aus\
  )\
### Schlafzimmer Nachttischlampe ein ###\
  DOELSEIF\
  ([$SELF:"^msg:.+(Schlafzimmer|[Ss][Zz]) (Nachttischlampe|[Nn]) (ein|100)"])(\
    set HUEDevice5 pct 100,\
    ({Telegram_reply("TelegramBot", "Schlafzimmer Nachttischlampe eingeschaltet.\n\n/heimdall")}),\
    sleep 0.001;; setreading $SELF state Schlafzimmer Nachttischlampe ein\
  )\
### Schlafzimmer Nachttischlampe % ###\
  DOELSEIF\
  ([$SELF:"^msg:.+(Schlafzimmer|[Ss][Zz]) (Nachttischlampe|[Nn]) ([1-9]|[1-9][0-9])$"])(\
    set HUEDevice5 pct [TelegramBot:msgText:".* (.*)$":$1],\
    ({Telegram_reply("TelegramBot", q{Schlafzimmer Nachttischlampe auf [TelegramBot:msgText:".* (.*)$":$1] % gedimmt.\n\n/heimdall})}),\
    sleep 0.001;; setreading $SELF state Schlafzimmer Nachttischlampe [TelegramBot:msgText:".* (.*)$":$1]\
  )\
### request SZ N dim ###\
  DOELSEIF\
  ([$SELF:"^msg:.+(Schlafzimmer|[Ss][Zz]) (Nachttischlampe|[Nn]) (dimmen|[Dd])$"])(\
    ({TelegramBot_SendKeyboard("TelegramBot", "[TelegramBot:replyId]", "Welchen Wert soll ich einstellen?", "5|10|15|20|25", "30|35|40|45|50", "55|60|65|70|75", "80|85|90|95|100", "0|abbrechen")}),\
    setreading $SELF [TelegramBot:msgPeerId] request SZ N dim,\
    sleep 0.001;; setreading $SELF state request SZ N dim\
  )\
  ### request SZ N dim set done ###\
    DOELSEIF\
    ([$SELF:"^msg:.+([0-9]|[1-9][0-9]|100)$"] and\
     ReadingsVal("$SELF", [TelegramBot:msgPeerId], "") eq "request SZ N dim"\
    )(\
      set HUEDevice5 pct [TelegramBot:msgText],\
      ({TelegramBot_SendKeyboard("TelegramBot", "[TelegramBot:replyId]",  q{Schlafzimmer Nachttischlampe auf [TelegramBot:msgText] % gedimmt.}, "5|10|15|20|25", "30|35|40|45|50", "55|60|65|70|75", "80|85|90|95|100", "0|beenden")}),\
      sleep 0.001;; setreading $SELF state Schlafzimmer Nachttischlampe [TelegramBot:msgText]\
    )\
### Arbeitszimmer Deckenlampe aus ###\
  DOELSEIF\
  ([$SELF:"^msg:.+(Arbeitszimmer|[Aa][Zz]) (Deckenlampe|[Dd]) (aus|0)"])(\
    set HUEGroup1 off,\
    ({Telegram_reply("TelegramBot", "Arbeitszimmer Deckenlampe ausgeschaltet.\n\n/heimdall")}),\
    sleep 0.001;; setreading $SELF state Arbeitszimmer Deckenlampe aus\
  )\
### Arbeitszimmer Deckenlampe ein ###\
  DOELSEIF\
  ([$SELF:"^msg:.+(Arbeitszimmer|[Aa][Zz]) (Deckenlampe|[Dd]) (ein|100)"])(\
    set HUEGroup1 pct 100,\
    ({Telegram_reply("TelegramBot", "Arbeitszimmer Deckenlampe eingeschaltet.\n\n/heimdall")}),\
    sleep 0.001;; setreading $SELF state Arbeitszimmer Deckenlampe ein\
  )\
### Arbeitszimmer Deckenlampe % ###\
  DOELSEIF\
  ([$SELF:"^msg:.+(Arbeitszimmer|[Aa][Zz]) (Deckenlampe|[Dd]) ([1-9]|[1-9][0-9])$"])(\
    set HUEGroup1 pct [TelegramBot:msgText:".* (.*)$":$1],\
    ({Telegram_reply("TelegramBot", q{Arbeitszimmer Deckenlampe auf [TelegramBot:msgText:".* (.*)$":$1] % gedimmt.\n\n/heimdall})}),\
    sleep 0.001;; setreading $SELF state Arbeitszimmer Deckenlampe [TelegramBot:msgText:".* (.*)$":$1]\
  )\
### request AZ D dim ###\
  DOELSEIF\
  ([$SELF:"^msg:.+(Arbeitszimmer|[Aa][Zz]) (Deckenlampe|[Dd]) (dimmen|[Dd])$"])(\
    ({TelegramBot_SendKeyboard("TelegramBot", "[TelegramBot:replyId]", "Welchen Wert soll ich einstellen?", "5|10|15|20|25", "30|35|40|45|50", "55|60|65|70|75", "80|85|90|95|100", "0|abbrechen")}),\
    setreading $SELF [TelegramBot:msgPeerId] request AZ D dim,\
    sleep 0.001;; setreading $SELF state request AZ D dim\
  )\
  ### request AZ D dim set done ###\
    DOELSEIF\
    ([$SELF:"^msg:.+([0-9]|[1-9][0-9]|100)$"] and\
     ReadingsVal("$SELF", [TelegramBot:msgPeerId], "") eq "request AZ D dim"\
    )(\
      set HUEGroup1 pct [TelegramBot:msgText],\
      ({TelegramBot_SendKeyboard("TelegramBot", "[TelegramBot:replyId]",  q{Arbeitszimmer Deckenlampe auf [TelegramBot:msgText] % gedimmt.}, "5|10|15|20|25", "30|35|40|45|50", "55|60|65|70|75", "80|85|90|95|100", "0|beenden")}),\
      sleep 0.001;; setreading $SELF state Arbeitszimmer Deckenlampe [TelegramBot:msgText]\
    )\
### Wohnzimmer Deckenlampe aus ###\
  DOELSEIF\
  ([$SELF:"^msg:.+(Wohnzimmer|[Wz][Zz]) (Deckenlampe|[Dd]) (aus|0)"])(\
    set HUEDevice1 off,\
    ({Telegram_reply("TelegramBot", "Wohnzimmer Deckenlampe ausgeschaltet.\n\n/heimdall")}),\
    sleep 0.001;; setreading $SELF state Wohnzimmer Deckenlampe aus\
  )\
### Wohnzimmer Deckenlampe ein ###\
  DOELSEIF\
  ([$SELF:"^msg:.+(Wohnzimmer|[Wz][Zz]) (Deckenlampe|[Dd]) (ein|100)"])(\
    set HUEDevice1 pct 100,\
    ({Telegram_reply("TelegramBot", "Wohnzimmer Deckenlampe eingeschaltet.\n\n/heimdall")}),\
    sleep 0.001;; setreading $SELF state Wohnzimmer Deckenlampe ein\
  )\
### Wohnzimmer Deckenlampe % ###\
  DOELSEIF\
  ([$SELF:"^msg:.+(Wohnzimmer|[Wz][Zz]) (Deckenlampe|[Dd]) ([1-9]|[1-9][0-9])$"])(\
    set HUEDevice1 pct [TelegramBot:msgText:".* (.*)$":$1],\
    ({Telegram_reply("TelegramBot", q{Wohnzimmer Deckenlampe auf [TelegramBot:msgText:".* (.*)$":$1] % gedimmt.\n\n/heimdall})}),\
    sleep 0.001;; setreading $SELF state Wohnzimmer Deckenlampe [TelegramBot:msgText:".* (.*)$":$1]\
  )\
### request WZ D dim ###\
  DOELSEIF\
  ([$SELF:"^msg:.+(Wohnzimmer|[Wz][Zz]) (Deckenlampe|[Dd]) (dimmen|[Dd])$"])(\
    ({TelegramBot_SendKeyboard("TelegramBot", "[TelegramBot:replyId]", "Welchen Wert soll ich einstellen?", "5|10|15|20|25", "30|35|40|45|50", "55|60|65|70|75", "80|85|90|95|100", "0|abbrechen")}),\
    setreading $SELF [TelegramBot:msgPeerId] request WZ D dim,\
    sleep 0.001;; setreading $SELF state request WZ D dim\
  )\
  ### request WZ D dim set done ###\
    DOELSEIF\
    ([$SELF:"^msg:.+([0-9]|[1-9][0-9]|100)$"] and\
     ReadingsVal("$SELF", [TelegramBot:msgPeerId], "") eq "request WZ D dim"\
    )(\
      set HUEDevice1 pct [TelegramBot:msgText],\
      ({TelegramBot_SendKeyboard("TelegramBot", "[TelegramBot:replyId]",  q{Wohnzimmer Deckenlampe auf [TelegramBot:msgText] % gedimmt.}, "5|10|15|20|25", "30|35|40|45|50", "55|60|65|70|75", "80|85|90|95|100", "0|beenden")}),\
      sleep 0.001;; setreading $SELF state Wohnzimmer Deckenlampe [TelegramBot:msgText]\
    )\
### Wohnzimmer Spots aus ###\
  DOELSEIF\
  ([$SELF:"^msg:.+(Wohnzimmer|[Wz][Zz]) (Spots|[Ss]) (aus|0)"])(\
    set HM_273CDB off,\
    ({Telegram_reply("TelegramBot", "Wohnzimmer Spots ausgeschaltet.\n\n/heimdall")}),\
    sleep 0.001;; setreading $SELF state Wohnzimmer Spots aus\
  )\
### Wohnzimmer Spots ein ###\
  DOELSEIF\
  ([$SELF:"^msg:.+(Wohnzimmer|[Wz][Zz]) (Spots|[Ss]) (ein|100)"])(\
    set HM_273CDB pct 100,\
    ({Telegram_reply("TelegramBot", "Wohnzimmer Spots eingeschaltet.\n\n/heimdall")}),\
    sleep 0.001;; setreading $SELF state Wohnzimmer Spots ein\
  )\
### Wohnzimmer Spots % ###\
  DOELSEIF\
  ([$SELF:"^msg:.+(Wohnzimmer|[Wz][Zz]) (Spots|[Ss]) ([1-9]|[1-9][0-9])$"])(\
    set HM_273CDB pct [TelegramBot:msgText:".* (.*)$":$1],\
    ({Telegram_reply("TelegramBot", q{Wohnzimmer Spots auf [TelegramBot:msgText:".* (.*)$":$1] % gedimmt.\n\n/heimdall})}),\
    sleep 0.001;; setreading $SELF state Wohnzimmer Spots [TelegramBot:msgText:".* (.*)$":$1]\
  )\
### request WZ S dim ###\
  DOELSEIF\
  ([$SELF:"^msg:.+(Wohnzimmer|[Wz][Zz]) (Spots|[Ss]) (dimmen|[Dd])$"])(\
    ({TelegramBot_SendKeyboard("TelegramBot", "[TelegramBot:replyId]", "Welchen Wert soll ich einstellen?", "5|10|15|20|25", "30|35|40|45|50", "55|60|65|70|75", "80|85|90|95|100", "0|abbrechen")}),\
    setreading $SELF [TelegramBot:msgPeerId] request WZ S dim,\
    sleep 0.001;; setreading $SELF state request WZ S dim\
  )\
  ### request WZ S dim set done ###\
    DOELSEIF\
    ([$SELF:"^msg:.+([0-9]|[1-9][0-9]|100)$"] and\
     ReadingsVal("$SELF", [TelegramBot:msgPeerId], "") eq "request WZ S dim"\
    )(\
      set HM_273CDB pct [TelegramBot:msgText],\
      ({TelegramBot_SendKeyboard("TelegramBot", "[TelegramBot:replyId]",  q{Wohnzimmer Spots auf [TelegramBot:msgText] % gedimmt.}, "5|10|15|20|25", "30|35|40|45|50", "55|60|65|70|75", "80|85|90|95|100", "0|beenden")}),\
      sleep 0.001;; setreading $SELF state Wohnzimmer Spots [TelegramBot:msgText]\
    )
attr lightning_dialog userattr do notexist msgPeerId repeatsame
attr lightning_dialog alias Telegram: Beleuchtung Dialog
attr lightning_dialog do always
attr lightning_dialog event-on-change-reading none
attr lightning_dialog group Dialog
attr lightning_dialog icon audio_playlist
attr lightning_dialog notexist notexist
attr lightning_dialog repeatsame 0:1
attr lightning_dialog room Telegram
attr lightning_dialog subType dialog


und noch die Waschmaschine:
Waschkeller_washer_dialog

defmod Waschkeller_washer_dialog DOIF ### Waschmaschine ###\
  ([$SELF:"^msg: Waschmaschine$"])(\
    ({my $msg = q{\
        Waschmaschine: [HM_2C10D8_Sw:state:"(.*)":($1 =~ /on/?"eingeschaltet":"ausgeschaltet")]\
        \nModus: [Waschkeller_washer_controlUnit:controlMode:"(.*)":($1 =~ /auto/?"Automatik":"Manuell")]  ([Waschkeller_washer_controlUnit:time])\
      };;;;\
      my @rows;;;;\
        push(@rows, q{Zeitprogramm stoppen}) if("[Waschkeller_washer_controlUnit:controlMode]" eq "auto");;;;\
        push(@rows, q{programmieren}) if("[HM_2C10D8_Sw:state]" ne "on");;;;\
        push(@rows, q{einschalten}) if("[HM_2C10D8_Sw:state]" ne "on");;;;\
        push(@rows, q{Verlaufsdiagramm});;;;\
        push(@rows, q{abbrechen});;;;\
     TelegramBot_SendKeyboard("TelegramBot", "[TelegramBot:msgPeerId]", $msg, @rows);;;;\
     }\
    ),\
    setreading $SELF [TelegramBot:msgPeerId] Waschmaschine,\
    sleep 0.001;; setreading $SELF state Waschmaschine\
  )\
### set manual ###\
  DOELSEIF\
  ([$SELF:"^msg: Zeitprogramm stoppen$"] and\
   ReadingsVal("$SELF", [TelegramBot:msgPeerId], "") eq "Waschmaschine"\
  )(\
    set Waschkeller_washer_controlUnit controlMode manual,\
    ({Telegram_reply("TelegramBot", "Das Zeitprogramm wurde gestoppt.\n\n/heimdalll")}),\
    setreading $SELF [TelegramBot:msgPeerId] set manual,\
    sleep 0.001;; setreading $SELF state set manual\
  )\
### program ###\
  DOELSEIF\
  ([$SELF:"^msg: programmieren$"] and\
   ReadingsVal("$SELF", [TelegramBot:msgPeerId], "") eq "Waschmaschine"\
  )(\
    ({my $msg = q{\
        Wann soll die Wäsche fertig sein?\
        \nBitte Uhrzeit in HH:MM angeben.\
        \nAktuell ist [Waschkeller_washer_controlUnit:time] eingestellt.\
      };;;;\
      my @rows;;;;\
        push(@rows, q{bestätigen|abbrechen});;;;\
        push(@rows, q{00:00|00:15|00:30|00:45});;;;\
        push(@rows, q{01:00|01:15|01:30|01:45});;;;\
        push(@rows, q{02:00|02:15|02:30|02:45});;;;\
        push(@rows, q{03:00|03:15|03:30|03:45});;;;\
        push(@rows, q{04:00|04:15|04:30|04:45});;;;\
        push(@rows, q{05:00|05:15|05:30|05:45});;;;\
        push(@rows, q{06:00|06:15|06:30|06:45});;;;\
        push(@rows, q{07:00|07:15|07:30|07:45});;;;\
        push(@rows, q{08:00|08:15|08:30|08:45});;;;\
        push(@rows, q{09:00|09:15|09:30|09:45});;;;\
        push(@rows, q{10:00|10:15|10:30|10:45});;;;\
        push(@rows, q{11:00|11:15|11:30|11:45});;;;\
        push(@rows, q{12:00|12:15|12:30|12:45});;;;\
        push(@rows, q{13:00|13:15|13:30|13:45});;;;\
        push(@rows, q{14:00|14:15|14:30|14:45});;;;\
        push(@rows, q{15:00|15:15|15:30|15:45});;;;\
        push(@rows, q{16:00|16:15|16:30|16:45});;;;\
        push(@rows, q{17:00|17:15|17:30|17:45});;;;\
        push(@rows, q{18:00|18:15|18:30|18:45});;;;\
        push(@rows, q{19:00|19:15|19:30|19:45});;;;\
        push(@rows, q{20:00|20:15|20:30|20:45});;;;\
        push(@rows, q{21:00|21:15|21:30|21:45});;;;\
        push(@rows, q{22:00|22:15|22:30|22:45});;;;\
        push(@rows, q{23:00|23:15|23:30|23:45});;;;\
      TelegramBot_SendKeyboard("TelegramBot", "[TelegramBot:msgPeerId]", $msg, @rows);;;;\
     }\
    ),\
    setreading $SELF [TelegramBot:msgPeerId] request time,\
    sleep 0.001;; setreading $SELF state request time\
  )\
  ### time ###\
    DOELSEIF\
    (([$SELF:"^msg: bestätigen$"] or\
      [$SELF:"^msg: ([0-1][0-9]|2[0-3]):[0-5][0-9]$"]\
     ) and\
     ReadingsVal("$SELF", [TelegramBot:msgPeerId], "") eq "request time"\
    )(\
      IF ([TelegramBot:msgText] =~ /([0-1][0-9]|2[0-3]):[0-5][0-9]/)(\
        set Waschkeller_washer_controlUnit time [TelegramBot:msgText]\
      ),\
      set Waschkeller_washer_controlUnit controlMode auto,\
      ({my $msg = q{\
          Das Zeitprogramm wurde eingestellt.\
        \nDie Wäsche wird voraussichtlich um [Waschkeller_washer_controlUnit:time] Uhr fertig sein.\
        \nBitte die Waschmaschine vorbereiten.\
        \n\
        \n/heimdall\
        };;;;\
        Telegram_reply("TelegramBot", $msg);;;;\
       }\
      ),\
      setreading $SELF [TelegramBot:msgPeerId] set auto,\
      sleep 0.001;; setreading $SELF state set auto\
    )\
### set on ###\
  DOELSEIF\
  ([$SELF:"^msg: einschalten$"] and\
   ReadingsVal("$SELF", [TelegramBot:msgPeerId], "") eq "Waschmaschine"\
  )(\
    set Waschkeller_washer_controlUnit controlMode manual,\
    set HM_2C10D8_Sw on,\
    setreading $SELF [TelegramBot:msgPeerId] set on,\
    sleep 0.001;; setreading $SELF state set on\
  )\
### send plot ###\
  DOELSEIF\
  ([$SELF:"^msg: Verlaufsdiagramm$"] and\
   ReadingsVal("$SELF", [TelegramBot:msgPeerId], "") eq "Waschmaschine"\
  )(\
    ({TelegramBot_ExecuteCommand($defs{TelegramBot}, [TelegramBot:msgPeerId], '{plotAsPng("Waschkeller_washer_SVG")}');;;; return;;;;}),\
    ({Telegram_reply("TelegramBot", "/heimdall")}),\
    setreading $SELF [TelegramBot:msgPeerId] send plot,\
    sleep 0.001;; setreading $SELF state send plot\
  )
attr Waschkeller_washer_dialog userattr do notexist msgPeerId repeatsame
attr Waschkeller_washer_dialog alias Telegram: Waschmaschine Dialog
attr Waschkeller_washer_dialog do always
attr Waschkeller_washer_dialog event-on-change-reading none
attr Waschkeller_washer_dialog group Dialog
attr Waschkeller_washer_dialog icon audio_playlist
attr Waschkeller_washer_dialog notexist notexist
attr Waschkeller_washer_dialog repeatsame 0:1
attr Waschkeller_washer_dialog room Telegram
attr Waschkeller_washer_dialog subType dialog


Zum Abschluss noch ein kleines Video:
Youtube: FHEM Telegram Dialoge
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

hartenthaler

Wow! Heftig! Insbesondere die Licht-Keule!

Was mich dabei irritiert ist die enge Vermischung zwischen Funktion (etwa Waschmaschine steuern oder Licht steuern/kontrollieren) und Dialog mit dem Nutzer. Ich denke, dass man da eine Spaghetti-Lösung bekommt, die kaum zu warten ist. Ich denke es ist sinnvoll die Funktionen in perl-Scripte zu verpacken und jeweils zum Beispiel Unterfunktionen anzulegen, die sich an natürlicher Sprache orientieren, also einen Zustand in einem verständlichen Satz ausdrücken.

Der Dialog mit dem Nutzer kann dann per Chat oder alternativ auch über Sprachein-/ausgabe erfolgen. Beides muss möglich sein ohne dass man die zu Grunde liegenden Funktionen anpacken muss. Ein Satz wie "Das Schlafzimmerfenster und das Küchenfenster sind offen." eignet sich für einen Chat, ein Display und eine Sprachausgabe.

Für den Chat per Telegram nutze ich RiveScript per TALKTOME (s. http://www.fhemwiki.de/wiki/TALKTOME_%26_TALKTOUSER_-_Sprachverarbeitung_f%C3%BCr_Nutzerinteraktionen). Sehr flexibel und viel leichter zu warten als eine DOIF-Eigenkonstruktion. Ich bewundere Deine Lösung @igami, befürchte aber dass sie auf Dauer nicht tragen wird.
fhem 5.8 auf RaspberryPi 3 mit HMLAN und CCU2, ZWave, JeeLink, FHZ1000 für FS20, HMS, Fritz!Box, Fritz!DECT200, Harmony, Sonos, hue, netatmo, SSCam, Wetter- und Verkehrsmodule, Chat-Bot mit RiveScript/Telegram, IFTTT, pushover, ...

igami

Anfangs wollte ich dafür auch ein eigenes Modul schreiben, dann kam SirUli mit TALKTOME (dabei fehlt mir noch die Benutzerverwaltung). Auch wollte ich mir den msg Befehl noch mal genauer anschauen.

Was für mich gegen eine globale Lösung spricht:
- Ich möchte keine Sprachsteuerung haben
- Ich habe Keyboards bei Telegram!

TALKTOME habe ich mir noch nicht sooo genau angesehen, ich vermute aber mal, dass DOIF mächtiger ist was die Abfrage von Status angeht.
Weiterhin finde ich von Vorteil, dass ich mehrere einzelne Dialog Definitionen habe. Beim testen funktioniert dann vielleicht ein Dialog nicht, aber ich mache nicht die ganze Konfiguration zu nichte.

Man könnte auch sagen viele Wege führen nach Rom. Meine Lösung ist sicher nicht perfekt, die TALKTOME aber auch nicht ;)
Auch gilt: never touch a running System und bei mir funktioniert es gut.

Auf meiner ToDo liste steht noch Sub um indirekt zu antworten (z.B. ich stelle die Waschmaschine, also möchte ich auch die Antwort haben wenn sie fertig ist). Hier sehe ich auch wieder den Vorteil von meiner Lösung, ich programmiere morgens die Waschmaschine und bekomme die Antwort wenn die Waschmaschine fertig ist, also FHEM startet den Dialog und ich quittiere nur, dass ich die Aufgabe (Wäsche aufhängen) erledigt habe.
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

hartenthaler

Zitat von: igami am 01 Dezember 2016, 20:31:21
Anfangs wollte ich dafür auch ein eigenes Modul schreiben, dann kam SirUli mit TALKTOME (dabei fehlt mir noch die Benutzerverwaltung). Auch wollte ich mir den msg Befehl noch mal genauer anschauen.
ja, msg ist mächtig und sehr flexibel, wird bei der TALKTOME-Lösung verwendet. Und ja, dass man bei TALKTOME derzeit nur einen Nutzer hat ist einschränkend.

Zitat
Was für mich gegen eine globale Lösung spricht:
- Ich möchte keine Sprachsteuerung haben
- Ich habe Keyboards bei Telegram!
Ich denke, dass gerade zu Hause der Sprachsteuerung zusammen mit einer Gestenerkennung die Zukunft gehört: "Mache diese Lampe an" und deuten auf die Lampe.

Zitat
TALKTOME habe ich mir noch nicht sooo genau angesehen, ich vermute aber mal, dass DOIF mächtiger ist was die Abfrage von Status angeht.
Deswegen mein Vorschlag die Funktionen streng von der Dialogschnittstelle zutrennen. Alles was geschaltet und verwaltet wird, habe ich in fhem (u.a. in Funktionen in der myUtils.pm). Die gesamte Dialogschnittstelle setzt auf msg und TALKOME mit RiveScript auf. Man kann in RiveScript alle Readings von fhem abfragen und so in den Dialog einbauen, aber die gesamte Dialogsteuerung läuft in RiveScript sehr flexibel. Entweder im Freitext Fragen/Antworten-Stil (so habe ich es gemacht) oder in einer Menüform (will ich noch zusätzlich umsetzen, weil das manchmal schneller und übersichtlicher geht als mit Frage/Antwort, allerdings ist das dann nicht mehr für Sprachein-/ausgabe geeignet). RiveScript ist ein wirklich mächtiges und leicht zu administrierendes Chat-Tool (mit ein paar kleineren nervigen Spezialitäten); für diese Funktion ist aus meiner Sicht fhem nicht gut geeignet.

Zitat
Weiterhin finde ich von Vorteil, dass ich mehrere einzelne Dialog Definitionen habe. Beim testen funktioniert dann vielleicht ein Dialog nicht, aber ich mache nicht die ganze Konfiguration zu nichte.
Ja, das ist wichtig. Man kann den RiveScript-Dialog in viele Themenfelder strukturieren, man kann kontextabhängige Dialoge gestalten, man kann alles in einzelne kleine Dateien verpacken. Ist auch sehr flexibel. Aber richtig, wenn man einen Syntaxfehler einbaut ist RiveScript sehr bockig und wenig debug-freundlich. Also immer testen und schwierige Dialoge vorab in einem sehr komfortablen online-Simulator austesten.

Zitat
Auf meiner ToDo liste steht noch Sub um indirekt zu antworten (z.B. ich stelle die Waschmaschine, also möchte ich auch die Antwort haben wenn sie fertig ist). Hier sehe ich auch wieder den Vorteil von meiner Lösung, ich programmiere morgens die Waschmaschine und bekomme die Antwort wenn die Waschmaschine fertig ist, also FHEM startet den Dialog und ich quittiere nur, dass ich die Aufgabe (Wäsche aufhängen) erledigt habe.
Das ist bei TALKTOME auch kein Problem. Ich schiesse zu festen Zeiten (etwa morgens um 7:00 Uhr) oder bei bestimmten Ereignissen in fhem (wie Waschmaschine ist fertig) einfach eine Telegram-Nachricht in den Chat rein. Das mit dem Quittieren ist dann allerdings nicht so elegant, da der Kontext nicht da ist. Das ist wirklich ein Vorteil Deiner Lösung. Wenn ich das gleiche haben möchte, dann müsste ich mir dazu noch eine extra-Telegram-Logik basteln.
fhem 5.8 auf RaspberryPi 3 mit HMLAN und CCU2, ZWave, JeeLink, FHZ1000 für FS20, HMS, Fritz!Box, Fritz!DECT200, Harmony, Sonos, hue, netatmo, SSCam, Wetter- und Verkehrsmodule, Chat-Bot mit RiveScript/Telegram, IFTTT, pushover, ...

hartenthaler

Ich habe mal versucht die DOIF-Lösung nachzubauen. Komme aber noch nicht zum Ziel.

Was habe ich gemacht

  • die Grundkonstruktion übernommen
  • beim BotFather einen neuen Bot angelegt
  • ein neues Telegram Device TelegramBot angelegt
  • die Telegram IDs von mir und meiner Frau eingepflegt
  • den opened_windows_dialog als ein Beispiel angelegt (und dabei noch das fehlende userattr description ergänzt)

Nun kann ich per Telegram chatten, d.h. die Kommunikation ist in beiden Richtungen durchgängig. Aber es erfolgt keinerlei Reaktion weder auf /heimdall noch auf /start.

Im Logfile finde ich u.a.

heimdall_dialog: {Telegram_reply("TelegramBot", "Dialog beendet.\n\n/heimdall");;}: Undefined subroutine &main::Telegram_reply called at (eval 3537) line 1.
TelegramBot_SendIt TelegramBot: Failed with :FAILED peer not found :[TelegramBot:replyId]::
TelegramBot_Callback TelegramBot: resulted in :NonBlockingGet: returned FAILED peer not found :[TelegramBot:replyId]:: from SendIt


Kann es sein, dass Du irgendwo noch eine Routine Telegram_reply hast? Die TelegramBot:replyId ist eigentlich vorhanden und richtig gesetzt.
fhem 5.8 auf RaspberryPi 3 mit HMLAN und CCU2, ZWave, JeeLink, FHZ1000 für FS20, HMS, Fritz!Box, Fritz!DECT200, Harmony, Sonos, hue, netatmo, SSCam, Wetter- und Verkehrsmodule, Chat-Bot mit RiveScript/Telegram, IFTTT, pushover, ...

igami

Zitat von: hartenthaler am 02 Dezember 2016, 01:55:36
ja, msg ist mächtig und sehr flexibel, wird bei der TALKTOME-Lösung verwendet. Und ja, dass man bei TALKTOME derzeit nur einen Nutzer hat ist einschränkend.
Wie gesagt, ich habe mich damit noch nicht so beschäftigt, da ich keine Sprachausgabe habe und die gesamte Kommunikation eh über Telegram abläuft. Aber anschauen werde ich es mir noch mal. wenn ich Zeit habe  ::)

Zitat von: hartenthaler am 02 Dezember 2016, 01:55:36
Ich denke, dass gerade zu Hause der Sprachsteuerung zusammen mit einer Gestenerkennung die Zukunft gehört: "Mache diese Lampe an" und deuten auf die Lampe.
Also das ist nun wirklich noch Zukunftsmusik, zumindest für mich. Meine Anwesenheitserkennung basiert auf LAN-Ping. Von Gestenerkennung bin ich weit entfernt. Und auch wieder keine Hardware zum erkennen der Sprache vorhanden.

Zitat von: hartenthaler am 02 Dezember 2016, 01:55:36
Deswegen mein Vorschlag die Funktionen streng von der Dialogschnittstelle zutrennen. Alles was geschaltet und verwaltet wird, habe ich in fhem (u.a. in Funktionen in der myUtils.pm). Die gesamte Dialogschnittstelle setzt auf msg und TALKOME mit RiveScript auf. Man kann in RiveScript alle Readings von fhem abfragen und so in den Dialog einbauen, aber die gesamte Dialogsteuerung läuft in RiveScript sehr flexibel. Entweder im Freitext Fragen/Antworten-Stil (so habe ich es gemacht) oder in einer Menüform (will ich noch zusätzlich umsetzen, weil das manchmal schneller und übersichtlicher geht als mit Frage/Antwort, allerdings ist das dann nicht mehr für Sprachein-/ausgabe geeignet). RiveScript ist ein wirklich mächtiges und leicht zu administrierendes Chat-Tool (mit ein paar kleineren nervigen Spezialitäten); für diese Funktion ist aus meiner Sicht fhem nicht gut geeignet.
Ja, das ist wichtig. Man kann den RiveScript-Dialog in viele Themenfelder strukturieren, man kann kontextabhängige Dialoge gestalten, man kann alles in einzelne kleine Dateien verpacken. Ist auch sehr flexibel. Aber richtig, wenn man einen Syntaxfehler einbaut ist RiveScript sehr bockig und wenig debug-freundlich. Also immer testen und schwierige Dialoge vorab in einem sehr komfortablen online-Simulator austesten.
Das ist bei TALKTOME auch kein Problem. Ich schiesse zu festen Zeiten (etwa morgens um 7:00 Uhr) oder bei bestimmten Ereignissen in fhem (wie Waschmaschine ist fertig) einfach eine Telegram-Nachricht in den Chat rein. Das mit dem Quittieren ist dann allerdings nicht so elegant, da der Kontext nicht da ist. Das ist wirklich ein Vorteil Deiner Lösung. Wenn ich das gleiche haben möchte, dann müsste ich mir dazu noch eine extra-Telegram-Logik basteln.
Ich hab mich auch noch nicht richtig mit RiveScript beschäftigt, da ich ja schon eine "funktionierende" Lösung hatte die auch für mehrere Benutzer möglich ist. Solange diese Einschränkung noch vorhanden ist werde ich mich auch nicht damit auseinandersetzen. Zudem müsste ich dann ja noch eine Sprache neben perl und "DOIF" lernen.

Zitat von: hartenthaler am 02 Dezember 2016, 03:42:41
Ich habe mal versucht die DOIF-Lösung nachzubauen. Komme aber noch nicht zum Ziel.

Was habe ich gemacht

  • die Grundkonstruktion übernommen
  • beim BotFather einen neuen Bot angelegt
  • ein neues Telegram Device TelegramBot angelegt
  • die Telegram IDs von mir und meiner Frau eingepflegt
  • den opened_windows_dialog als ein Beispiel angelegt (und dabei noch das fehlende userattr description ergänzt)
description gehört eigentlich gar nicht zum Dialog, sondern zum archetype Modul und dient nur dazu den alias zu setzen.

Zitat von: hartenthaler am 02 Dezember 2016, 03:42:41
Nun kann ich per Telegram chatten, d.h. die Kommunikation ist in beiden Richtungen durchgängig. Aber es erfolgt keinerlei Reaktion weder auf /heimdall noch auf /start.

Im Logfile finde ich u.a.

heimdall_dialog: {Telegram_reply("TelegramBot", "Dialog beendet.\n\n/heimdall");;}: Undefined subroutine &main::Telegram_reply called at (eval 3537) line 1.
TelegramBot_SendIt TelegramBot: Failed with :FAILED peer not found :[TelegramBot:replyId]::
TelegramBot_Callback TelegramBot: resulted in :NonBlockingGet: returned FAILED peer not found :[TelegramBot:replyId]:: from SendIt


Kann es sein, dass Du irgendwo noch eine Routine Telegram_reply hast? Die TelegramBot:replyId ist eigentlich vorhanden und richtig gesetzt.
Ja, habe ich tatsächlich noch, ein überbleibsel der eigentlich nicht mehr unbedingt gebraucht wird

sub Telegram_reply($$) {
  my ($name, $msg) = @_;
  my $peer = ReadingsVal($name, "msgChat", "") ne "" ? (split(" ", ReadingsVal($name, "msgChat", ""), 2))[0] : ReadingsVal($name, "msgPeerId", "");
 
  fhem("set $name message \@$peer $msg");
}

Sendet eigentlich nur eine Nachricht an die replyId.
Wie gesagt, alles noch nicht ganz rund.
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

igami

Ich überlege gerade ob ich nicht einfach ein Modul für die Telegram Dialoge bauen soll. Dafür hätte ich jedoch gerne ein bisschen input, damit ich mir die Syntax nicht alleine ausdenken muss ;)

Wer wäre denn alles an so einem Modul interessiert?
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

Maista

Hallo Michael,

ein Modul finde ich gut!

Als Wochenend-FHEM-Versteher ist es nicht immer einfach alles mitzubekommen.
Gerade wenn man nur sporadisch dazu kommt etwas weiter zu machen.

Der Syntax sollte natürlich so einfach wie möglich sein  ;) ;D

Da ich bisher noch nicht wirklich viel probiert habe (manchmal auch weil es um 23:55 nicht funktionieren wollte)
tue ich mich aber schwer genau zu sagen wie das aussehen sollte.

Danke erst einmal für die bisherigen Beispiele!

Gruss Gerd

CBSnake

Moin,
hätte auch interesse. Primär nutzen wir zwar die FTUI, aber in Gebieten mit schwachem Mobilnetz wären ausgewählt Kommandos per Telegram top. Und ich kann extern, aktuell die Nachbarin die unseren Netzwerkspeicher mit nutzt und diesen per telegram startet, auch einen genau definierten Ausschnitt an Befehlen freigeben.
Grüße
Achim

Gesendet von meinem SM-P605 mit Tapatalk

FHEM auf Debian 10, HM-Wlan, JeeLink-Wlan, Wlanduino, ConBee, TP-Link Steckdose, GHoma Steckdosen, Shelly Steckdosen

münchner

Moin,

an so einem Modul wäre ich auch interessiert.  ;D

Vor allem an einer Möglichkeit auf ein Ereignis zu Hause gleich die passenden Auswahlmöglichkeiten zu bekommen und wenn man die dann noch unterschiedlichen PEERS Zuordnen kann wäre es Spitze !

Ich danke schon mal für die Mühe, die Du dir bisher schon gemacht hast !

Viele Grüße

Matze

Fixel2012

Wäre auch Interessiert!

Würde helfen zu Testen, das ist leider das einzige mit dem ich dienen kann.

Grüße

Fixel
Fhem 5.8 auf Raspi 3, HMLAN und 868MHz CUL mit einigen Komponenten, Z-Wave Rollladenaktoren, Tablet UI, 433 MHz CUL mit Baumarktsteckdosen und Temp Sensoren, Amazon Echo, Echo Dot, 2x SONOS  play1, 1x SONOS Connect AMP,  presence, HUE, Lightify

gent

Hi,

warum bekomme ich im logfile immer diese Meldungen:

2017.01.09 21:47:29 1: PERL WARNING: Subroutine myUtilsTelegram_Initialize redefined at ./FHEM/99_myUtilsTelegramMessenger.pm line 73.
2017.01.09 21:47:29 1: PERL WARNING: Subroutine fhem_bot redefined at ./FHEM/99_myUtilsTelegramMessenger.pm line 76.
2017.01.09 21:47:29 1: PERL WARNING: Subroutine fhem_bot_check_permission redefined at ./FHEM/99_myUtilsTelegramMessenger.pm line 180.
2017.01.09 21:47:29 1: PERL WARNING: Subroutine fhem_bot_response redefined at ./FHEM/99_myUtilsTelegramMessenger.pm line 203.
2017.01.09 21:47:29 1: PERL WARNING: Subroutine fhem_bot_imgresponse redefined at ./FHEM/99_myUtilsTelegramMessenger.pm line 208.
2017.01.09 21:47:29 1: PERL WARNING: Subroutine fhem_bot_svgresponse redefined at ./FHEM/99_myUtilsTelegramMessenger.pm line 213.
2017.01.09 21:47:29 1: PERL WARNING: Subroutine fhem_bot_fhem_cmd redefined at ./FHEM/99_myUtilsTelegramMessenger.pm line 227.


Ich habe es so gemacht, wie auf Seite 1 beschrieben. Bis auf die Meldungen im logfile scheint alles so zu funktionieren.

Viele Grüße vom gent
fhem auf rPi3 mit USB boot und M2, cul866 (hm), homebridge, FlowerSens, Shelly, Harmony, WemosD1, Sonoff/Tasmota, grafana, mqtt/mosquitto