FHEM Forum

FHEM => Codeschnipsel => Thema gestartet von: igami am 27 März 2016, 17:17:32

Titel: chatBot (vordefinierte Dialoge) für Telegram
Beitrag von: igami am 27 März 2016, 17:17:32
Hallo zusammen,

ich habe die Ostertage ein bisschen genutzt um einfache Dialoge mit FHEM über Telegram führen zu können. Realisiert habe ich dies mit einem DOIF. Bisher finde ich das noch relativ umständlich, aber es funktioniert.

Was brauchen wir dazu?
1. Ein Chat-Interface, bei mir Telegram.
2. Einen Filter auf meine Nachrichten, mein FHEM soll ja nicht mit Fremden reden ;)

define Michael_Telegram DOIF
([myTelegramBot:"msgText"] and
[?myTelegramBot:msgPeerId] =~ /XXXXXXXX/
)(
  setreading Michael_Telegram msgText [myTelegramBot:msgText]
)

attr Michael_Telegram do always
attr Michael_Telegram event-on-update-reading msgText

3. Einen Primärdialog, der mir alle verfügbaren Dialoge auflistet

define heimdall_dialog DOIF
### heimdall ###
([Michael_Telegram:msgText:"(^\/(heimdall|start)$)"])(
  ({my @dialogs = devspec2array(".*_dialog:FILTER=disable!=1");;
    my $msg = "Ich kann folgendes für dich tun:\n\n";;

    if (@dialogs > 0 and defined($defs{$dialogs[0]})){
      foreach (@dialogs){
        my $dialog = (split(" ", InternalVal($_, "DEF", undef), 3))[1];;
        $msg .= "/".$dialog."\n"if!($dialog =~ /heimdall/i);;
      }
    }
    $msg .= "\n/heimdall\n";;

    fhem("set myTelegramBot message \@[myTelegramBot:msgPeerId] $msg");;
   }
  ),
  sleep 1; set .*_dialog initialize
)
### abbrechen ###
DOELSEIF
([Michael_Telegram:msgText:"(^\/abbrechen$)"])(
  set myTelegramBot message @[myTelegramBot:msgPeerId]
    Dialog abgebrochen.
    \n
    \n/heimdall
  ,
  sleep 1; set .*_dialog initialize
)

4.1 Den eigentlichen Dialog. Zu Anfang ein einstufiger Dialog, eine Statusabfrage welche Fenster noch geöffnet sind.

define openedWindows_dialog DOIF
### Fenster ###
([Michael_Telegram:msgText:"(^\/Fenster$)"])(
  ({my @windows = devspec2array('model=HM-SEC-SC(-\d)?:FILTER=state!=closed');;
    my $msg = "Es sind folgenede Fenster geöffnet:\n";;

    if (@windows > 0 and defined($defs{$windows[0]})){
      foreach (@windows){
        $msg .= "\n".AttrVal($_, "alias", $_);;
      }
    }else{
      $msg = "Es sind alle Fenster geschlossen.";;
    }
    $msg .= "\n
             \n/heimdall
            ";;
 
    fhem("set myTelegramBot message \@[myTelegramBot:msgPeerId] $msg");;
   }
  ),
  sleep 0.001; setreading openedWindows_dialog state send status
)

Anbei noch der Verlauf von dem Dialog:

(17:08:00) Michael:
  /start
(17:08:00) heimdall:
  Ich kann folgendes für dich tun:

  /Verlaufsdiagramm
  /BBQ
  /Fenster
  /Waschmaschine

  /heimdall
(17:08:06) Michael:
  /Fenster
(17:08:06) heimdall:
  Es sind folgenede Fenster geöffnet:

  2.5 Arbeitszimmer: Fenster 2
   
  /heimdall

4.2 Noch ein Dialog. Diesmal zweistufig um mir ein belibiges SVG zu senden

define SVG_dialog DOIF
### Verlaufsdiagramm ###
([Michael_Telegram:msgText:"(^\/Verlaufsdiagramm$)"])(
  {my @SVGS = devspec2array("TYPE=SVG");;
   my $msg = "Welches Verlaufsdiagramm möchtest du sehen?\n";;
   
   foreach (@SVGS){
     $msg .= "\n/".$_;;
   }
   $msg .= "\n
            \n/abbrechen
           ";;
   fhem("set myTelegramBot message \@[myTelegramBot:msgPeerId] $msg");;
  },
  sleep 0.001; setreading SVG_dialog state request SVG
)
  ### SVG ###
  DOELSEIF(
    [?SVG_dialog:state] eq "request SVG" and
    [Michael_Telegram:msgText:"(^\/(.+SVG|SVG.+))"]
  )(
    ({Plot2JPEG('[myTelegramBot:msgText:"(\/)(.*)":"$2"]', "/opt/fhem/log/SVG.jpg");;}),
    set myTelegramBot sendImage @[myTelegramBot:msgPee Das könnte man vllt mit dem userattr subType umgehen.rId] /opt/fhem/log/SVG.jpg,
    set myTelegramBot message @[myTelegramBot:msgPeerId] /heimdall,
    sleep 0.001; setreading SVG_dialog state send SVG
  )


Hier noch der Verlauf von dem Waschmaschinen Dialog (etwas Umfangreicher)

(17:11:02) Michael:
  /heimdall
(17:11:03) heimdall:
  Ich kann folgendes für dich tun:

  /Verlaufsdiagramm
  /BBQ
  /Fenster
  /Waschmaschine

  /heimdall
(17:11:06) Michael:
  /Waschmaschine
(17:11:06) heimdall:
  Waschmaschine: ausgeschaltet
  Modus: Manuell

  /einschalten
  /programmieren
  /Verlaufsdiagramm
 
  /abbrechen
(17:11:10) Michael:
  /programmieren
(17:11:10) heimdall:
  Wann soll die Wäsche fertig sein?
  Bitte Uhrzeit in HH:MM angeben.
  Aktuell ist 17:00 eingestellt.
   
  /bestaetigen

  /abbrechen
(17:11:13) Michael:
  /bestaetigen
(17:11:16) heimdall:
  Das Zeitprogramm wurde eingestellt.
  Die Wäsche wird voraussichtlich um 17:00 Uhr fertig sein.
  Bitte die Waschmaschine vorbereiten.
   
  /heimdall


Nun ein bisschen Erklärung:
1. Alle Namen der Dialoge müssen auf _dialog enden. (Das könnte man mit dem userattr subType umgehen.)
2.1. Der Dialog ist Folgendermaßen aufgebaut. Als erstes muss immer die Zeile

### <Keyword> ###

stehen. Damit werden die Dialoge vom Primärdialog ausgewertet.
2.2. Danach folgt die Zeile

([Michael_Telegram:msgText:"(^\/<Keyword>$)"])

Telegram ermöglicht es direkt eine Nachricht beim tippen auf eine Zeichenkette zu senden die mit einem "/" anfängt. So muss ich bei dem Dialog auch nie schreiben.
2.3. Anschließend folgt die Antwort die FHEM senden soll. Diese endet mit

sleep 0.001; setreading <dialog NAME> state <dialog STATE>

Dies könnte man auch über das cmdState Attribut machen, wird aber schnell unübersichtlich, besonders wenn man einen Dialog erweitert.
2.4. Falls benötigt folgen nun weitere Stufen des Dialogs. Diese beginnen auch wie die erste Stufe, haben aber zusätzliche eine Abfrage auf die vorherige Stufe

([?<dialog NAME>:state] eq "<dialog STATE> and
[Michael_Telegram:msgText:"(^\/<Keyword>$)"]
)


Im Grunde ist das schon alles. Ich setze ans Ende jeder Stufe noch ein "/abbrechen" um den Dialog abzubrechen und bei der letzten Stufe ein "/heimdall" (Name meines Bots). Damit kann ich dann ohne schreiben einen neuen Dialog beginnen.

Was mich noch stört:
1. Keine einfache Syntax, wahrscheinlich wäre ein eigenes Modul am besten geeignet.
2. Nicht wirklich Mehrbenutzerfreundlich

Ich habe die Dialog während des schreibens noch angepasst und anschließend getestet. Trotzdem kann es sein, dass sich Fehler eingeschlichen haben.

Ich wünsche euch noch schöne Ostertage und freue mich über Anregungen und Unterstützung bei der Verbesserung um in Zukunft leichter mit FHEM Dialoge zu führen. Denn sich jedes Mal durch ein Webinterface zu klicken hat keinen hohen WAF;)

Grüße
igami
Titel: Antw:chatBot (vordefinierte Dialoge) für Telegram
Beitrag von: Ferdy2003 am 09 Juni 2016, 10:29:41
Hallo zusammen,

mein "Chat"-Bot sieht wie folgt aus:

Harald:msgText:.* {

my $sender = ReadingsVal($NAME, "msgPeerId", 0);
my $nachricht = ReadingsVal($NAME, "msgText", "");

Log "Sender", "$sender";
Log "Nachricht", "$nachricht";

if ($nachricht =~ /Advent/) {
if ($nachricht =~ /an/) {
  fhem("set Harald message \@$sender Advent Advent ein Lichtlein brennt..");
fhem("set EG_WZ_STD_Advent on");
} else {
fhem("set Harald message \@$sender Da geht sie hin die Stimmung...");
    fhem("set EG_WZ_STD_Advent off");
}
} elsif ($nachricht =~ /Trockner/) {
if ($nachricht =~ /an/) {
  fhem("set Harald message \@$sender Trocker ist an!");
  fhem("set OG_BD_STD_Trockner on");
} else {
fhem("set Harald message \@$sender Trockner ist aus!.");
    fhem("set OG_BD_STD_Trockner off");
}
} elsif ($nachricht =~ /Fritz/) {
$nachricht =~ s/Fritz //;
  fhem("set FritzBox ring 610,611,612 say:$nachricht");
} elsif ($nachricht =~ /Sonos/) {
$nachricht =~ s/Sonos //;
  fhem("set Sonos_Bad speak 55 de $nachricht");
fhem("set Sonos_Esszimmer speak 55 de $nachricht");
} elsif ($nachricht =~ /Status/) {
  fhem("set Harald message \@$sender Uptime: [sysmon:uptime_text]");;
  fhem("set Harald message \@$sender Startzeit: [sysmon:starttime_text]");
  fhem("set Harald message \@$sender CPU-Temperatur: [sysmon:cpu_temp]°");
  fhem("set Harald message \@$sender RAM: [sysmon:ram]");
} elsif ($nachricht =~ /Müll/) {
  fhem("set Harald message \@$sender Gelber Sack: [MuellterminDummy:GelberSack] Tage");
  fhem("set Harald message \@$sender Papiermüll: [MuellterminDummy:GrueneTonne] Tage");
  fhem("set Harald message \@$sender Restmüll: [MuellterminDummy:Restmuell] Tage");
} else {
    fhem("set Harald message \@$sender Wat willst du den?");
}
}
Titel: Antw:chatBot (vordefinierte Dialoge) für Telegram
Beitrag von: tiroso am 17 Juni 2016, 14:18:22
Hallo,

Ich habe vor einiger Zeit auch ein Youtube Video gepostet und wurde gefragt ob ich den Code dazu auch einstellen kann.

https://www.youtube.com/watch?v=at6fRLsXfEs (https://www.youtube.com/watch?v=at6fRLsXfEs)

Wie habe ich es gelöst?

Im wesentlichen über 3 Punkte

Zuerst das Notify:

TelegramBot:msgText:.* {
my $msgText = ReadingsVal("TelegramBot","msgText","");
my $msgPeerId = ReadingsVal("TelegramBot","msgPeerId","");
if($msgPeerId eq "DEINETELEGRAMID"){
tg_analyse($msgPeerId,$msgText);
}
}


Und hier die 99_myUtilsTelegram.pm:

##############################################
# 99_myUtilsTelegramMessenger.pm
#


package main;

use strict;
use warnings;
use POSIX;

sub
myUtilsTelegram_Initialize($$)
{
my ($hash) = @_;
}
sub tg_analyse($$){
my ($msgPeerId, $msgText) = @_;
$msgText = lc $msgText;
Log "TelegramBot", "Sender: $msgPeerId";
Log "TelegramBot", "Text: $msgText";
if($msgText eq "/start"){
fhem "set TelegramBot message \@$msgPeerId Hallo
ich gebe dir die Möglichkeit mit FHEM zu kommunizieren
Mit /hilfe bekommst du eine Liste derzeitigen Befehle";
}
if($msgText eq "/hilfe" || $msgText eq "/hauptmenue"){
fhem "set TelegramBot message \@$msgPeerId Hier sind alle Befehle:
--Generell
/hilfe - Hilfetext
/hauptmenue -Hilfetext
/okfhem - Direktbefehl
/system
--Umwelt
/wetterjetzt
/wetterheute
/wettermorgen
/wettervorhersage
--Media
/sonosstop - Stoppe SonosBoxen
--Heizung
/heizung - Heizung Info
--Sonstiges
/sendeplot
/batterie
/TurStatus
/muelltonne";
}
if($msgText eq "/sonnenaufgang"){
my $temp = sunrise("REAL");
fhem "set TelegramBot message \@$msgPeerId Sonnenaufgang:
$temp";
fhem "set TelegramBot message \@$msgPeerId /hauptmenue";
}
if($msgText eq "/turstatus"){
if(ReadingsVal('FL.TS.Tuersensor','state','0') eq "open"){
fhem "set TelegramBot message \@$msgPeerId Die Haustüre ist offen";
}
if(ReadingsVal('FL.TS.Tuersensor','state','0') eq "closed"){
fhem "set TelegramBot message \@$msgPeerId Die Haustüre ist geschlossen";
}
fhem "set TelegramBot message \@$msgPeerId /hauptmenue";
}
    if($msgText eq "/updatecheck"){
my $temp = fhem "update check";
fhem "set TelegramBot message \@$msgPeerId UpdateCheck:
$temp";
fhem "set TelegramBot message \@$msgPeerId /system
/hauptmenue";
}
if($msgText eq "/update"){
my $temp = fhem "update";
fhem "set TelegramBot message \@$msgPeerId Update:
$temp";
fhem "set TelegramBot message \@$msgPeerId /system
/hauptmenue";
}
if($msgText eq "/fhemneustar"){
#ACHTUNG - NOCH NICHT NUTZEN. Der Neustart wird gespeichert und FHEM startet immer wieder neu!!!
fhem "set TelegramBot message \@$msgPeerId FHEM wird nun neu gestartet.
Sollte dieser Vorgang erfolgreich sein wird FHEM sich per Telegram melden.";
#my $temp = fhem "shutdown restart";
}
if($msgText eq "/reloadtelegramutils"){
fhem "set TelegramBot message \@$msgPeerId Die Datei 99_myUtilsTelegram.pm wird neu geladen.";
my $temp = fhem "reload 99_myUtilsTelegram.pm";
fhem "set TelegramBot message \@$msgPeerId /system
/hauptmenue";
}
if($msgText eq "/sonosstop"){
fhem "set Sonos StopAll";
fhem "set TelegramBot message \@$msgPeerId Alle Sonos-Boxen wurden gestoppt";
}
if($msgText eq "/sonnenuntergang"){
my $temp = sunset("REAL");
fhem "set TelegramBot message \@$msgPeerId Sonnenuntergang:
$temp";
fhem "set TelegramBot message \@$msgPeerId /hauptmenue";
}
if($msgText eq "/system"){
fhem "set TelegramBot message \@$msgPeerId /updatecheck
/update
/reloadTelegramUtils
/fhemneustart
/status";
fhem "set TelegramBot message \@$msgPeerId /hauptmenue";
}
if($msgText eq "/status"){
fhem "set TelegramBot message \@$msgPeerId FHEM gestartet:
".ReadingsVal('sysmon','fhemstarttime_text','0')."
FHEM läuft seit:
".ReadingsVal('sysmon','fhemuptime_text','0')."

System gestartet:
".ReadingsVal('sysmon','starttime_text','0')."
System läuft seit:
".ReadingsVal('sysmon','uptime_text','0')."
Erreichbar unter:
".ReadingsVal('sysmon','eth0_ip','0')."

Power:
".ReadingsVal('sysmon','power_ac_text','0');
fhem "set TelegramBot message \@$msgPeerId /system
/hauptmenue";
}
if($msgText eq "/wetterjetzt"){
fhem "set TelegramBot sendImage \@$msgPeerId /opt/fhem/www/images/default/weather/".ReadingsVal('XX.XX.YahooWetter','icon','0').".png Das Wetter jetzt: ".ReadingsVal('XX.XX.YahooWetter','day_of_week','0')." den ".ReadingsVal('XX.XX.YahooWetter','fc1_date','0')."
".ReadingsVal('XX.XX.YahooWetter','condition','0')."
".ReadingsVal('XX.XX.YahooWetter','temp_c','0')."C° ".ReadingsVal('XX.XX.YahooWetter','humidity','0')."%
".ReadingsVal('XX.XX.YahooWetter','wind_condition','0');
fhem "set TelegramBot message \@$msgPeerId /hauptmenue";
}
if($msgText eq "/wetterheute"){
fhem "set TelegramBot sendImage \@$msgPeerId /opt/fhem/www/images/default/weather/".ReadingsVal('XX.XX.YahooWetter','fc1_icon','0').".png Das Wetter heute: ".ReadingsVal('XX.XX.YahooWetter','fc1_day_of_week','0')." den ".ReadingsVal('XX.XX.YahooWetter','fc1_date','0')."
".ReadingsVal('XX.XX.YahooWetter','fc1_condition','0')."
Min ".ReadingsVal('XX.XX.YahooWetter','fc1_low_c','0')."C° Max".ReadingsVal('XX.XX.YahooWetter','fc1_high_c','0')."C°";
fhem "set TelegramBot message \@$msgPeerId /hauptmenue";
}
if($msgText eq "/wettermorgen"){
fhem "set TelegramBot sendImage \@$msgPeerId /opt/fhem/www/images/default/weather/".ReadingsVal('XX.XX.YahooWetter','fc2_icon','0').".png Das Wetter morgen: ".ReadingsVal('XX.XX.YahooWetter','fc2_day_of_week','0')." den ".ReadingsVal('XX.XX.YahooWetter','fc2_date','0')."
".ReadingsVal('XX.XX.YahooWetter','fc2_condition','0')."
Min ".ReadingsVal('XX.XX.YahooWetter','fc2_low_c','0')."C° Max".ReadingsVal('XX.XX.YahooWetter','fc2_high_c','0')."C°";
fhem "set TelegramBot message \@$msgPeerId /hauptmenue";
}
if($msgText eq "/sendeplot"){
fhem "set TelegramBot message \@$msgPeerId /KinderzimmerPlot
/KleinesBadezimmerPlot
/MittleresBadezimmerPlot
/EGPlot
/AlleHeizungPlot
/SpeedtestPlot";
fhem "set TelegramBot message \@$msgPeerId /hauptmenue";
}
if($msgText eq "/kleinesbadezimmerplot"){
my $filename = 'plot.png';
open(my $fh, '>', $filename) or die "Could not open file '$filename' $!";
print $fh plotAsPng("KBZ.XX.Heizung.svg");
close $fh;
fhem "set TelegramBot sendImage \@$msgPeerId /opt/fhem/plot.png SVG Plot Kleines Badezimmer";
fhem "set TelegramBot message \@$msgPeerId /sendeplot
/hauptmenue";
}
if($msgText eq "/speedtestplot"){
my $filename = 'plot.png';
open(my $fh, '>', $filename) or die "Could not open file '$filename' $!";
print $fh plotAsPng("XX.XX.Speedtest.svg");
close $fh;
fhem "set TelegramBot sendImage \@$msgPeerId /opt/fhem/plot.png SVG Plot Speedtest";
fhem "set TelegramBot message \@$msgPeerId /sendeplot
/hauptmenue";
}
if($msgText eq "/kinderzimmerplot"){
my $filename = 'plot.png';
open(my $fh, '>', $filename) or die "Could not open file '$filename' $!";
print $fh plotAsPng("KZ.XX.Heizung.svg");
close $fh;
fhem "set TelegramBot sendImage \@$msgPeerId /opt/fhem/plot.png SVG Plot Kinderzimmer";
fhem "set TelegramBot message \@$msgPeerId /sendeplot
/hauptmenue";
}
if($msgText eq "/mittleresbadezimmerplot"){
my $filename = 'plot.png';
open(my $fh, '>', $filename) or die "Could not open file '$filename' $!";
print $fh plotAsPng("MBZ.XX.Heizung.svg");
close $fh;
fhem "set TelegramBot sendImage \@$msgPeerId /opt/fhem/plot.png SVG Plot Mittleres Badezimmer";
fhem "set TelegramBot message \@$msgPeerId /sendeplot
/hauptmenue";
}
if($msgText eq "/egplot"){
my $filename = 'plot.png';
open(my $fh, '>', $filename) or die "Could not open file '$filename' $!";
print $fh plotAsPng("EG.XX.Heizung.svg");
close $fh;
fhem "set TelegramBot sendImage \@$msgPeerId /opt/fhem/plot.png SVG Plot Erdgeschoss";
fhem "set TelegramBot message \@$msgPeerId /sendeplot
/hauptmenue";
}
if($msgText eq "/alleheizungplot"){
my $filename = 'plot1.png';
open(my $fh, '>', $filename) or die "Could not open file '$filename' $!";
print $fh plotAsPng("EG.XX.Heizung.svg");
close $fh;
my $filename = 'plot2.png';
open(my $fh, '>', $filename) or die "Could not open file '$filename' $!";
print $fh plotAsPng("KBZ.XX.Heizung.svg");
close $fh;
my $filename = 'plot3.png';
open(my $fh, '>', $filename) or die "Could not open file '$filename' $!";
print $fh plotAsPng("MBZ.XX.Heizung.svg");
close $fh;
my $filename = 'plot4.png';
open(my $fh, '>', $filename) or die "Could not open file '$filename' $!";
print $fh plotAsPng("KZ.XX.Heizung.svg");
close $fh;
fhem "set TelegramBot sendImage \@$msgPeerId /opt/fhem/plot1.png 'SVG Plot Erdgeschoss'";
fhem "set TelegramBot sendImage \@$msgPeerId /opt/fhem/plot2.png SVG Plot Kleines Badezimmer";
fhem "set TelegramBot sendImage \@$msgPeerId /opt/fhem/plot3.png SVG Plot Mittleres Badezimmer";
fhem "set TelegramBot sendImage \@$msgPeerId /opt/fhem/plot4.png SVG Plot Kinderzimmer";
fhem "set TelegramBot message \@$msgPeerId /sendeplot
/hauptmenue";
}
if($msgText eq "/wettervorhersage"){
fhem "set TelegramBot sendImage \@$msgPeerId /opt/fhem/www/images/default/weather/".ReadingsVal('XX.XX.YahooWetter','fc2_icon','0').".png Das Wetter am: ".ReadingsVal('XX.XX.YahooWetter','fc2_day_of_week','0')." den ".ReadingsVal('XX.XX.YahooWetter','fc2_date','0')."
".ReadingsVal('XX.XX.YahooWetter','fc2_condition','0')."
Min ".ReadingsVal('XX.XX.YahooWetter','fc2_low_c','0')."C° Max".ReadingsVal('XX.XX.YahooWetter','fc2_high_c','0')."C°";

fhem "set TelegramBot sendImage \@$msgPeerId /opt/fhem/www/images/default/weather/".ReadingsVal('XX.XX.YahooWetter','fc3_icon','0').".png Das Wetter am: ".ReadingsVal('XX.XX.YahooWetter','fc3_day_of_week','0')." den ".ReadingsVal('XX.XX.YahooWetter','fc3_date','0')."
".ReadingsVal('XX.XX.YahooWetter','fc3_condition','0')."
Min ".ReadingsVal('XX.XX.YahooWetter','fc3_low_c','0')."C° Max".ReadingsVal('XX.XX.YahooWetter','fc3_high_c','0')."C°";

fhem "set TelegramBot sendImage \@$msgPeerId /opt/fhem/www/images/default/weather/".ReadingsVal('XX.XX.YahooWetter','fc4_icon','0').".png Das Wetter am: ".ReadingsVal('XX.XX.YahooWetter','fc4_day_of_week','0')." den ".ReadingsVal('XX.XX.YahooWetter','fc4_date','0')."
".ReadingsVal('XX.XX.YahooWetter','fc4_condition','0')."
Min ".ReadingsVal('XX.XX.YahooWetter','fc4_low_c','0')."C° Max".ReadingsVal('XX.XX.YahooWetter','fc4_high_c','0')."C°";

fhem "set TelegramBot sendImage \@$msgPeerId /opt/fhem/www/images/default/weather/".ReadingsVal('XX.XX.YahooWetter','fc5_icon','0').".png Das Wetter am: ".ReadingsVal('XX.XX.YahooWetter','fc5_day_of_week','0')." den ".ReadingsVal('XX.XX.YahooWetter','fc5_date','0')."
".ReadingsVal('XX.XX.YahooWetter','fc5_condition','0')."
Min ".ReadingsVal('XX.XX.YahooWetter','fc5_low_c','0')."C° Max".ReadingsVal('XX.XX.YahooWetter','fc5_high_c','0')."C°";

fhem "set TelegramBot sendImage \@$msgPeerId /opt/fhem/www/images/default/weather/".ReadingsVal('XX.XX.YahooWetter','fc6_icon','0').".png Das Wetter am: ".ReadingsVal('XX.XX.YahooWetter','fc6_day_of_week','0')." den ".ReadingsVal('XX.XX.YahooWetter','fc6_date','0')."
".ReadingsVal('XX.XX.YahooWetter','fc6_condition','0')."
Min ".ReadingsVal('XX.XX.YahooWetter','fc6_low_c','0')."C° Max".ReadingsVal('XX.XX.YahooWetter','fc6_high_c','0')."C°";

fhem "set TelegramBot sendImage \@$msgPeerId /opt/fhem/www/images/default/weather/".ReadingsVal('XX.XX.YahooWetter','fc7_icon','0').".png Das Wetter am: ".ReadingsVal('XX.XX.YahooWetter','fc7_day_of_week','0')." den ".ReadingsVal('XX.XX.YahooWetter','fc7_date','0')."
".ReadingsVal('XX.XX.YahooWetter','fc7_condition','0')."
Min ".ReadingsVal('XX.XX.YahooWetter','fc7_low_c','0')."C° Max".ReadingsVal('XX.XX.YahooWetter','fc7_high_c','0')."C°";
fhem "set TelegramBot message \@$msgPeerId /hauptmenue";
}
if($msgText eq "/heizung"){

fhem "set TelegramBot message \@$msgPeerId Erdgeschoss:
Ist Temperatur: " . ReadingsVal('KU.TH.Wandthermostat','measured-temp','0') . " C°
SOLL Temperatur: " . ReadingsVal('KU.TH.Wandthermostat','desired-temp','0') . " C°
Küche Ventil: " . ReadingsVal('KU.TH.Heizung','actuator','0') . " %
WZlinks Ventil: " . ReadingsVal('WZ.TH.Heizunglinks','actuator','0') . " %
WZrechts Ventil: " . ReadingsVal('WZ.TH.Heizungrechts','actuator','0') . " %";

fhem "set TelegramBot message \@$msgPeerId Kinderzimmer:
Ist Temperatur: " . ReadingsVal('KZ.TH.Heizung','measured-temp','0') . " C°
SOLL Temperatur: " . ReadingsVal('KZ.TH.Heizung','desired-temp','0') . " C°
Ventil: " . ReadingsVal('KZ.TH.Heizung','actuator','0') . " %";

fhem "set TelegramBot message \@$msgPeerId Kleines Badezimmer:
Ist Temperatur: " . ReadingsVal('KBZ.TH.Heizung','measured-temp','0') . " C°
SOLL Temperatur: " . ReadingsVal('KBZ.TH.Heizung','desired-temp','0') . " C°
Ventil: " . ReadingsVal('KBZ.TH.Heizung','actuator','0') . " %";

fhem "set TelegramBot message \@$msgPeerId Mittleres Badezimmer:
Ist Temperatur: " . ReadingsVal('MBZ.TH.Heizung','measured-temp','0') . " C°
SOLL Temperatur: " . ReadingsVal('MBZ.TH.Heizung','desired-temp','0') . " C°
Ventil: " . ReadingsVal('MBZ.TH.Heizung','actuator','0') . " %";

fhem "set TelegramBot message \@$msgPeerId /hauptmenue";
}
if($msgText eq "/batterie"){
my $temp = fhem "list NAME=.*:FILTER=battery=.* battery";
fhem "set TelegramBot message \@$msgPeerId $temp";

fhem "set TelegramBot message \@$msgPeerId /hauptmenue";
}
if($msgText eq "/muelltonne"){

my $terminanzahl = ReadingsVal("MuellKalenderView","c-term",0);
$terminanzahl += 0;
if ($terminanzahl > 10){ $terminanzahl = 10;}
my $temp = "";
for (my $i=1; $i <= $terminanzahl; $i++) {
$i = sprintf ('%03d', $i);

$temp = $temp . ReadingsVal('MuellKalenderView','t_' . $i . '_bdate','01.01.2016'). ":
" . ReadingsVal('MuellKalenderView','t_' . $i . '_summary','01.01.2016') . "

";
}
$temp =~ s/RSAG\s//gio;
$temp =~ s/oder\s-sack\s//gio;
fhem("set TelegramBot message \@msgPeerId " . $temp);

fhem "set TelegramBot message \@$msgPeerId /hauptmenue";
}
}


1;


Installiert habe ich FHEM unter den StandartPfaden wie es in den ganzen Tutorials steht /opt/fhem/
Ich hoffe ihr könnt etwas damit anfangen.

Gruß
Titel: Antw:chatBot (vordefinierte Dialoge) für Telegram
Beitrag von: Floca am 18 Juni 2016, 00:01:01
Ich hatte dich auf Youtube gefragt ;)

Vielen Dank für die Daten  ;D
Titel: Antw:chatBot (vordefinierte Dialoge) für Telegram
Beitrag von: tiroso am 18 Juni 2016, 10:39:49
Hat es denn geklappt?

Gesendet von meinem SM-G900F mit Tapatalk

Titel: Antw:chatBot (vordefinierte Dialoge) für Telegram
Beitrag von: Puschel74 am 19 Juni 2016, 21:32:01
Hallo tiroso,

danke für deine Vorlage  ;)
Als Inspiration war dein Code einwandfrei aber ich erlaube mir mal den einen onder anderen Punkt anzumerken - bitte nicht falsch verstehen.

Da du in der sub auf das Device "TelegramBot" zurückgreifst habe ich mir erlaubt den Aufruf der sub dahingehend zu ändern:
tg_analyse($NAME,$msgPeerId,$msgText);
Nun wird auch das Device - bei dir TelegramBot (bei mir FHEMBOT bei anderen evtl. anders benannt) mitübergeben.

In der sub muss dann natürlich auch
sub tg_analyse($$$){
  my ($Name, $msgPeerId, $msgText) = @_;

geändert werden - aus Bequemlichkeit mache ich aus $NAME (was innerhalb von FHEM ausgewertet werden kann aber nicht in Perl) $Name
Sämtliche Angaben die sich bei dir auf TelgramBot beziehen können dann recht einfach durch $Name ersetzt werden - Notepad++ bringt dafür ja Suchen und Ersetzen mit.

Kurz und knapp und auch als Code - mein Device heisst FHEMBOT.
Das notify sieht im DEF so aus:
FHEMBOT:msgText:.* {
  my $msgText = ReadingsVal($NAME,"msgText","");
  my $msgPeerId = ReadingsVal($NAME,"msgPeerId","");
  if($msgPeerId eq "meinePEERID"){
    tg_analyse($NAME,$msgPeerId,$msgText);
  }
}

Und die Auswertung in der sub sieht dann so aus - erstmal nur für /start und /hilfe (den Rest muss ich noch für mich passend umbauen):
sub tg_analyse($$$){
  my ($Name, $msgPeerId, $msgText) = @_;
  $msgText = lc $msgText;
#  Log(0,"$Name - Sender: $msgPeerId");
#  Log(0,"Text: $msgText");
  if($msgText eq "/start"){
fhem "set $Name message \@$msgPeerId Hallo
ich gebe dir die Möglichkeit mit FHEM zu kommunizieren
Mit /hilfe bekommst du eine Liste der momentan möglichen Befehle";
  }
  if($msgText eq "/hilfe" || $msgText eq "/hauptmenue"){
fhem "set $Name message \@$msgPeerId Hier sind alle Befehle:
--Generell
/hilfe - Hilfetext
/hauptmenue -Hilfetext
/okfhem - Direktbefehl
/system
--Umwelt
/wetterjetzt
/wetterheute
/wettermorgen
/wettervorhersage
--Media
/sonosstop - Stoppe SonosBoxen
--Heizung
/heizung - Heizung Info
--Sonstiges
/sendeplot
/batterie
/TurStatus
/muelltonne";
  }
}

Log-Einträge habe ich gern drinnen zum schauen was ankommt um dann passend weiterprogrammieren zu können - ich mach das ja auch nur in meiner Freizeit und hab nicht immer alles im Kopf (aber ich weiß wo ich nachschauen kann)  ;D

Wie geschrieben - meine Anmerkung bitte nur als konstruktive Kritik verstehen und nicht als destruktive  ;)

Daher auf alle Fälle einen grünen Daumen nach oben (wenn es sowas geben würde).
Titel: Antw:chatBot (vordefinierte Dialoge) für Telegram
Beitrag von: igami am 20 Juni 2016, 20:23:50
Hat sich von euch schon mal wer Gedanken gemacht wie man ein eigenes Modul für Dialoge schreiben könnte?
Ich würde es ja Begrüßen die Dialoge zu vereinzeln um nicht eine unübersichtliche 99_myXXX.pm zu haben. Allerdings fällt mir noch keine vernünftige Syntax ein.
Eventuell sowas:

[<keyword>:<regexp>:<description>:<list>](
  response(
    "Was auch immer er sagen soll",
    ListAllKeywords
  ),
  <fhem commands>,
  <{perl commands}>,
  [<keyword>:<regexp>:<description>:<list>](),
  [<keyword>:<regexp>:<description>:<list>]()
)

<list> soll 1 oder 0 sein um autmatisch über ListAllKeywords aufgelistet zu werden, oder auch nicht wenn es sich um eine regexp handelt. Z.B.

...
response(
  "Wann soll ich dich wecken?",
  "Bitte Uhrzeit in HH:MM angeben"
),
[Uhrzeit:(\d\d):(\d\d)::0](
  "Ich werde dich um $0:$1 Uhr wecken."
  set Wecker $0:$1
)

da ich momentan leider nur wenig Zeit für fhem habe komme ich da auch nicht weiter. Wahrscheinlich gibt es ja ähnliche Aufbauten schon für IRC/Jabber bots

Titel: Antw:chatBot (vordefinierte Dialoge) für Telegram
Beitrag von: tiroso am 21 Juni 2016, 08:37:38
Ach quatsch. Ich versteh das doch nicht falsch, sondern nehme die Kritik gerne mit. Mache ich ja ebenfalls in meiner Freizeit und von daher passt das schon ganz gut.

Wieso gibt's du denn den Device Namen mit? Wofür brauchst du den noch? hat sich erledigt. Habs gelesen ;)

Ich werde mir mal Gedanken machen ob man so ein Modul nicht ausbauen könnte.
Titel: Antw:chatBot (vordefinierte Dialoge) für Telegram
Beitrag von: Floca am 21 Juni 2016, 11:36:03
Hi tiroso, sicher hast du dir gedacht "da fragt er schon und nun lässt er nichts mehr von sich hören"...

Bin erst gestern dazu gekommen den Code in mein System einzuschachteln. Ich muss sagen du hast da großartige arbeit geleistet... Ich finde die Utils dafür übrigens sehr gut, so ist ein notify nicht vollgestopft bis oben hin.

Hab deine "Vorlage" schon kräftig erweitert und alles funktioniert super.


Ich komme gut mit der Utils klar, aber unerfahrene nutzen dann besser die fertige /syntax im bot Modul. Lest mal im Wiki das geht pber ein Attribut wenn man nicht zu viel hat.

Für mich jedenfalls ist die Lösung von Tiroso absolut perfekt...
Titel: Antw:chatBot (vordefinierte Dialoge) für Telegram
Beitrag von: SirUli am 21 Juni 2016, 13:04:40
Hi zusammen,

weil ich das grad hier sehe: Ich baue gerade einen Chatbot (so in etwa wie bei verschiedenen Webseiten) für genau diesen Zweck.

Ich lade das mal heute abend hoch, ist dann relativ einfach Dialoge zu bauen. Habe ich im Einsatz, um Meldungen auszugeben (die dann Dialoge zur Folge haben - "Wassermelder Küche sagt: "WASSER", willst du diesen Alarm für 24 Stunden ignorieren?) und mein FHEM zu befragen ("Temperatur Büro" als Beispiel).

Cheers,
Uli
Titel: Antw:chatBot (vordefinierte Dialoge) für Telegram
Beitrag von: igami am 21 Juni 2016, 20:52:30
Zitat von: SirUli am 21 Juni 2016, 13:04:40
Ich lade das mal heute abend hoch, ist dann relativ einfach Dialoge zu bauen.
Da bin ich ja mal gespannt :)
Titel: Antw:chatBot (vordefinierte Dialoge) für Telegram
Beitrag von: SirUli am 21 Juni 2016, 22:21:30
Siehe hier: https://forum.fhem.de/index.php/topic,54863.0.html
Titel: Antw:chatBot (vordefinierte Dialoge) für Telegram
Beitrag von: tiroso am 22 Juni 2016, 23:14:03
So ich habe heute was Zeit gehabt und habe mein FHEMBot-Script noch was angepasst.

Dem TelegramBot sind folgende userattr hinzuzufügen:

-FhemBot_ReceiveRestrictedPeer   (1 oder 0)
-FhemBot_ReceiveCustomPeer      (Custom Peers)


Wie funktioniert die Sicherheit? Welche PeerID darf mit FHEM Kontakt aufnehmen?
Sollte FhemBot_ReceiveRestrictedPeer gesetzt sein wird das TelegramBot attr RestrictedPeer eingelesen. Sollte die PeerID dort eingetragen sein wird die Kommunikation freigegeben. Sollte die ID nicht zu finden sein wird die Kommunikation nicht freigegeben.
Sollte FhemBot_ReceiveRestrictedPeer nicht vorhanden oder nicht gesetzt sein wird das userattr FhemBot_ReceiveCustomPeer eingelesen. Die ist z.B. nötig wenn man TelegramBot noch für andere Sachen verwenden will und speziell für die FHEM Kommunikation nur bestimmte IDs freigeben will. Sollte die ID nicht vorhanden sein wird die Kommunikation nicht freigegeben, ansonsten schon.
Die Berechtigung wird in der SubRoutine fhem_bot_check_permission kontrolliert.

Es wird ein Notify angelegt welches Das TelegrammBot Device überwacht:

define TelegramBotNotify notify TelegramBot:msgText:.* { fhem_bot($NAME); }


In der anschließenden 99_myUtilsTelegram.pm kommt dann folgender Code rein:Ich habe mir die Freiheit genommen ein paar Beispiele drin zu lassen. Wer mein kompletten Code haben will inkl aller Keywords kann gerne Bescheid geben

##################################################
# 99_myUtilsTelegramMessenger.pm
#
##################################################
# Ein ChatBot mit dem sich auch FHEM steuern
# lässt. Die Keywords lassen sich selber fest-
# legen.
#
# Bitte dran denken im TelegramBot Device die
# userattr:
# -FhemBot_ReceiveRestrictedPeer (1/1)
# -FhemBot_ReceiveCustomPeer (Custom Peers)
# zu setzen.
# Die Sicherheitsbestimmungen sehen folgendermaßen
# aus:
# -Sollte FhemBot_ReceiveRestrictedPeer gesetzt
#  sein, aber kein RestrictedPeer angegeben ist
#  werden die Befehle NICHT angenommen
# -Sollte FhemBot_ReceiveRestrictedPeer NICHT
#  gesetzt sein, und ebenfalls keine
#  FhemBot_ReceiveCustomPeer so werden die Befehle
#  ebenfalls NICHT angenommen.
#
# Innerhalb der Kontrolle eines Keywords werden
# folgende Befehle unterstützt:
#
# --Rückantworten an die ankommende PeerID
#   Es können beliebig viele Texte gesendet werden
# fhem_bot_response(
# "Textbox 1\nMit #ein bisschen Text",
# "Textbox 2",
# "Textbox 3\nWieder mit ein bisschen Test\nAber noch einer Zeile",
# );
#
# --Rückantworten mit Bild an die ankommende PeerID
#   Es können beliebig viele Bilder gesendet werden
# fhem_bot_imgresponse(
# "/opt/fhem/bild1.png Das ist ein Testbild",
# "/opt/fhem/bild2.png Das ist ein Testbild von eine anderem Bild\nAber sonst alles gut",
# "/opt/fhem/bild1.png Wieder das erste Bild",
# );
#
# --SVG Plot als Bild an die ankommende PeerID
#   Es können beliebig viele SVG Plots gesendet werden
# fhem_bot_svgresponse(
# ["EG.XX.Heizung.svg","SVG Plot Beschreibung Erdgeschoss"],
# ["KBZ.XX.Heizung.svg","SVG Plot Beschreibung Kleines Badezimmer"],
# ["MBZ.XX.Heizung.svg","SVG Plot Beschreibung Mittleres Badezimmer"],
# );
#
# --FHEM Befehle die ausgeführt werden können
#   Es können beliebig viele Befehle abgesetzt werden
# fhem_bot_fhem_cmd(
# "set lampe1 on",
# "set fernseher off",
# "define temp_timer at +00:00:10 set lampe1 on",
# );




package main;

use strict;
use warnings;
use POSIX;

my $msgPeerId = "";
my $TelegramBot_Device = "";

sub
myUtilsTelegram_Initialize($$)
{
my ($hash) = @_;
}
sub fhem_bot($){
($TelegramBot_Device) = @_;

if (fhem_bot_check_permission($TelegramBot_Device)){
my $msgText = lc ReadingsVal($TelegramBot_Device,"msgText","");
$msgPeerId = ReadingsVal($TelegramBot_Device,"msgPeerId","");
my $msgPeer = ReadingsVal($TelegramBot_Device,"msgPeer","");
##################################################
#
# Ab hier können die Keywords eingetragen werden
#
##################################################
if($msgText eq "/start"){
fhem_bot_response(
"Hallo\nich gebe dir die Möglichkeit mit FHEM zu kommunizieren\nMit /hilfe bekommst du eine Liste derzeitigen Befehle"
);
}
if($msgText eq "/hilfe" || $msgText eq "/hauptmenue"){
fhem_bot_response(
"Hier sind alle Befehle:",
"--Generell\n/hilfe - Hilfetext\n/hauptmenue -Hilfetext\n/okfhem - Direktbefehl\n/system",
"--Umwelt\n/wetterjetzt\n/wetterheute\n/wettermorgen\n/wettervorhersage",
"--Media\n/sonosstop - Stoppe SonosBoxen","--Heizung\n/heizung - Heizung Info",
"--Sonstiges\n/sendeplot\n/batterie\n/TurStatus\n/muelltonne",
);
}
if($msgText eq "/sonnenaufgang"){
fhem_bot_response(
"Sonnenaufgang:\n" . sunrise("REAL"),
"/hauptmenue",
);
}
if($msgText eq "/updatecheck"){
fhem_bot_response(
"UpdateCheck:\n" . fhem "update check",
"/hauptmenue",
);
}
if($msgText eq "/sonosstop"){
fhem_bot_fhem_cmd(
"set Sonos StopAll",
);
fhem_bot_response(
"Alle Sonos Boxen wurden gestoppt.\n/hauptmenue",
);
}
if($msgText eq "/sonnenuntergang"){
fhem_bot_response(
"Sonnenaufgang:\n" . sunset("REAL"),
"/hauptmenue",
);
}
if($msgText eq "/system"){
fhem_bot_response(
"/updatecheck\n/update\n/status",
"/hauptmenue",
);
}
if($msgText eq "/status"){
fhem_bot_response(
"FHEM gestartet:\n".ReadingsVal('sysmon','fhemstarttime_text','0')."\nFHEM läuft seit:\n".ReadingsVal('sysmon','fhemuptime_text','0')."\n\nSystem gestartet:\n".ReadingsVal('sysmon','starttime_text','0')."\nSystem läuft seit:\n".ReadingsVal('sysmon','uptime_text','0')."\nErreichbar unter:\n".ReadingsVal('sysmon','eth0_ip','0')."\n\nPower:\n".ReadingsVal('sysmon','power_ac_text','0'),
"/system\n/hauptmenue",
);
}
if($msgText eq "/sendeplot"){
fhem_bot_response(
"/KinderzimmerPlot\n/KleinesBadezimmerPlot\n/MittleresBadezimmerPlot\n/EGPlot\n/AlleHeizungPlot\n/SpeedtestPlot",
"/hauptmenue",
);
}
if($msgText eq "/alleheizungplot"){
fhem_bot_svgresponse(
["EG.XX.Heizung.svg","SVG Plot Erdgeschoss"],
["KBZ.XX.Heizung.svg","SVG Plot Kleines Badezimmer"],
["MBZ.XX.Heizung.svg","SVG Plot Mittleres Badezimmer"],
["KZ.XX.Heizung.svg","SVG Plot Kinderzimmer"],
);
fhem_bot_response(
"/sendeplot\n/hauptmenue",
);
}
if($msgText eq "/heizung"){
fhem_bot_response(
"Erdgeschoss:\nIst Temperatur: " . ReadingsVal('KU.TH.Wandthermostat','measured-temp','0') . " C°\nSOLL Temperatur: " . ReadingsVal('KU.TH.Wandthermostat','desired-temp','0') . " C°\nKüche Ventil: " . ReadingsVal('KU.TH.Heizung','actuator','0') . " %\nWZlinks Ventil: " . ReadingsVal('WZ.TH.Heizunglinks','actuator','0') . " %\nWZrechts Ventil: " . ReadingsVal('WZ.TH.Heizungrechts','actuator','0') . " %",
"Kinderzimmer:\nIst Temperatur: " . ReadingsVal('KZ.TH.Heizung','measured-temp','0') . " C°\nSOLL Temperatur: " . ReadingsVal('KZ.TH.Heizung','desired-temp','0') . " C°\nVentil: " . ReadingsVal('KZ.TH.Heizung','actuator','0') . " %",
"Kleines Badezimmer:\nIst Temperatur: " . ReadingsVal('KBZ.TH.Heizung','measured-temp','0') . " C°\nSOLL Temperatur: " . ReadingsVal('KBZ.TH.Heizung','desired-temp','0') . " C°\nVentil: " . ReadingsVal('KBZ.TH.Heizung','actuator','0') . " %",
"Mittleres Badezimmer:\nIst Temperatur: " . ReadingsVal('MBZ.TH.Heizung','measured-temp','0') . " C°\nSOLL Temperatur: " . ReadingsVal('MBZ.TH.Heizung','desired-temp','0') . " C°\nVentil: " . ReadingsVal('MBZ.TH.Heizung','actuator','0') . " %",
"/hauptmenue",
);
}
if($msgText eq "/batterie"){
fhem_bot_response(
fhem "list NAME=.*:FILTER=battery=.* battery",
"/hauptmenue",
);
}
##################################################
#
# Bis hier können die Keywords eingetragen werden
#
##################################################
}
}

sub fhem_bot_check_permission{
($TelegramBot_Device) = @_;

if (AttrVal($TelegramBot_Device,'FhemBot_ReceiveRestrictedPeer','0')){
return 0 if ( AttrVal($TelegramBot_Device,'cmdRestrictedPeer','') eq '' );

$msgPeerId = ReadingsVal($TelegramBot_Device,"msgPeerId","");
my @peers = split( " ", AttrVal($TelegramBot_Device,'cmdRestrictedPeer','')); 
foreach my $checkpeer (@peers) {
return 1 if ( $checkpeer eq $msgPeerId );
}
return 0;
}else{
return 0 if ( AttrVal($TelegramBot_Device,'FhemBot_ReceiveCustomPeer','') eq '' );

$msgPeerId = ReadingsVal($TelegramBot_Device,"msgPeerId","");
my @peers = split( " ", AttrVal($TelegramBot_Device,'FhemBot_ReceiveCustomPeer','')); 
foreach my $checkpeer (@peers) {
return 1 if ( $checkpeer eq $msgPeerId );
}
return 0;
}
}
sub fhem_bot_response{
foreach my $responsetext (@_) {
fhem "set $TelegramBot_Device message \@$msgPeerId $responsetext";
}
}
sub fhem_bot_imgresponse{
foreach my $responseimg (@_) {
fhem "set $TelegramBot_Device sendImage \@$msgPeerId $responseimg";
}
}
sub fhem_bot_svgresponse{
my $svgentries = 0;
foreach (@_){$svgentries++;}
for(my $i = 0; $i < $svgentries; $i++) {
my @data = @{$_[$i]};
my $filename = 'plot'.$i.'.png';
open(my $fh, '>', $filename) or die "Could not open file '$filename' $!";
print $fh plotAsPng($data[0]);
close $fh;
fhem_bot_imgresponse(
"/opt/fhem/plot".$i.".png ".$data[1],
);
}
}
sub fhem_bot_fhem_cmd{
foreach my $fhemcmd (@_) {
fhem "$fhemcmd";
}
}
1;


Ich habe die Keywords folgendermaßen eingetragen:

if($msgText eq "/start"){
...CODE...
}


Innerhalb eines Keywords habe ich folgende Befehle vereinfacht

Rückantworten an die ankommende PeerID.Es können beliebig viele Texte gesendet werden:
fhem_bot_response(
"Textbox 1\nMit #ein bisschen Text",
"Textbox 2",
"Textbox 3\nWieder mit ein bisschen Test\nAber noch einer Zeile",
);


Rückantworten mit Bild an die ankommende PeerID. Es können beliebig viele Bilder gesendet werden:
fhem_bot_imgresponse(
"/opt/fhem/bild1.png Das ist ein Testbild",
"/opt/fhem/bild2.png Das ist ein Testbild von eine anderem Bild\nAber sonst alles gut",
"/opt/fhem/bild1.png Wieder das erste Bild",
);


SVG Plot als Bild an die ankommende PeerID. Es können beliebig viele SVG Plots gesendet werden:
fhem_bot_svgresponse(
["EG.XX.Heizung.svg","SVG Plot Beschreibung Erdgeschoss"],
["KBZ.XX.Heizung.svg","SVG Plot Beschreibung Kleines Badezimmer"],
["MBZ.XX.Heizung.svg","SVG Plot Beschreibung Mittleres Badezimmer"],
);


FHEM Befehle die ausgeführt werden können. Es können beliebig viele Befehle abgesetzt werden:
fhem_bot_fhem_cmd(
"set lampe1 on",
"set fernseher off",
"define temp_timer at +00:00:10 set lampe1 on",
);


Sooooooo....ich weiß allerdings nicht ob das mit kompletten Modulen wie bsp. von Uli mithalten kann.
Feedback erwünscht ;)
Titel: Antw:chatBot (vordefinierte Dialoge) für Telegram
Beitrag von: Esjay am 23 Juni 2016, 10:25:43
Zitat von: tiroso am 22 Juni 2016, 23:14:03
So ich habe heute etwas Zeit gehabt und habe mein FHEMBot-Script noch was angepasst.

Danke für deine Mühe,und das du es zur Verfügung stellst!
Ich hätte noch ein oder zwei Verständnissfragen!

Du lässt dir ja deine SVG Datein, wie z.B
fhem_bot_svgresponse(
["EG.XX.Heizung.svg","SVG Plot Erdgeschoss"]

zuschicken.

Woher weiß er denn, wo er die Datein suchen muss? Die liegen doch wenn ich mich nicht täusche in /opt/fhem/www/gplot. Ich finde allerdings keinen Hinweis darauf in deinem Code!

Ich vermute allerdings, dass das bei dir hier geschieht,und du schlicht deine Daten woanders abspeicherst?!??
sub fhem_bot_svgresponse{
my $svgentries = 0;
foreach (@_){$svgentries++;}
for(my $i = 0; $i < $svgentries; $i++) {
my @data = @{$_[$i]};
my $filename = 'plot'.$i.'.png';
open(my $fh, '>', $filename) or die "Could not open file '$filename' $!";
print $fh plotAsPng($data[0]);
close $fh;
fhem_bot_imgresponse(
"/opt/fhem/plot".$i.".png ".$data[1],
);
}
}


Desweiteren finde ich diesen Part sehr interessant
if($msgText eq "/status"){
fhem_bot_response(
"FHEM gestartet:\n".ReadingsVal('sysmon','fhemstarttime_text','0')."\nFHEM läuft seit:\n".ReadingsVal('sysmon','fhemuptime_text','0')."\n\nSystem gestartet:\n".ReadingsVal('sysmon','starttime_text','0')."\nSystem läuft seit:\n".ReadingsVal('sysmon','uptime_text','0')."\nErreichbar unter:\n".ReadingsVal('sysmon','eth0_ip','0')."\n\nPower:\n".ReadingsVal('sysmon','power_ac_text','0'),
"/system\n/hauptmenue",
);
}


Wärst du bereit deine define aus deiner fhem.cfg zu teilen?

In deinem vorherigen Post findet sich der Code
if($msgText eq "/turstatus"){
if(ReadingsVal('FL.TS.Tuersensor','state','0') eq "open"){
fhem "set TelegramBot message \@$msgPeerId Die Haustüre ist offen";
}
if(ReadingsVal('FL.TS.Tuersensor','state','0') eq "closed"){
fhem "set TelegramBot message \@$msgPeerId Die Haustüre ist geschlossen";
}
fhem "set TelegramBot message \@$msgPeerId /hauptmenue";
}


Überwacht er FL.TS.Tuersensor aus Fhem heraus, oder hast du das i-wo noch als Attribut oder wie auch immer in Telegram mit eingebunden?

Viele Grüße
Titel: Antw:chatBot (vordefinierte Dialoge) für Telegram
Beitrag von: tiroso am 23 Juni 2016, 12:58:34
Hey,

Ich versuche mal die Fragen bestmöglich zu beantworten.
Es gibt...ich habe sie mal gefunden, weiß allerdings nicht mehr wo...die Funktion plotaspng() mit der Funktion ( und den entsprechenden Paketen ) ist es möglich deine SVG Plots als PNG Stream zu verschicken oder, so wie ich es gemacht habe, als PNG zu speichern. Da das ganze in /opt/fhem/ passiert werden hier auch die plot.png abgelegt. Die hattest du ja quasi in dem Teil gefunden:
Zitat
sub fhem_bot_svgresponse{
   my $svgentries = 0;
   foreach (@_){$svgentries++;}
   for(my $i = 0; $i < $svgentries; $i++) {
      my @data = @{$_[$i]};
      my $filename = 'plot'.$i.'.png';
      open(my $fh, '>', $filename) or die "Could not open file '$filename' $!";
      print $fh plotAsPng($data[0]);
      close $fh;
      fhem_bot_imgresponse(
         "/opt/fhem/plot".$i.".png ".$data[1],
      );
   }
}
In der selben Funktion wird diese gerade erstellte PNG per Telegram wieder versendet.
Die Funktion plotaspng("SVG_PLOT"); nimmt sich dein definierten Plot und stellt diese als PNG zur Verfügung. Vorraussetzung:

sudo apt-get install libimage-librsvg-perl
sudo apt-get install libgd-graph-perl
sudo apt-get install libgd-text-perl


Das Keyword /start greift sich die Readings aus dem MODUL Sysmon.
define sysmon SYSMON 1 1 1 10

Der Türstatus ist keine Überwachung. Ich bekomme ja nur eine Anwort wenn ich /tuerstatus an FHEM schicke. Wenn es jetzt wirklich eine Überwachung sein soll (Tür steht auf für 5 Minuten oder so) dann leg ein seperates notify an.
Wenn ich /tuerstatus geschickt habe, wird in der Funktion der State meines Fensterkontaktes (HOMEMATIC ebenfalls in FHEM eingebunden) ausgelesen und verschickt.
Der jetzige Teil dafür sieht folgendermaßen aus:

if($msgText eq "/turstatus"){
my $temptext = "";
if(ReadingsVal('FL.TS.Tuersensor','state','0') eq "open"){
$temptext = "Die Haustüre ist offen";
}elsif(ReadingsVal('FL.TS.Tuersensor','state','0') eq "closed"){
$temptext = "Die Haustüre ist geschlossen";
}
fhem_bot_response(
$temptext,
"/hauptmenue",
);
}


Ich hoffe ich konnte helfen.
Titel: Antw:chatBot (vordefinierte Dialoge) für Telegram
Beitrag von: Esjay am 23 Juni 2016, 13:34:07
Danke für die schnelle und ausführliche Antwort!

Also mit den von dir genannten Paketen,geht das abspeichern der SVG Datein als PNG komplett automatisch von statten ja?

Das Sysmon Modul hab ich sogar bereits definiert.Hab die Readings wohl nur nicht wahr genommen. :o

Das Wort "Überwachung" wahr wohl ein bisschen irreführend!
Ich schalte über pilight meine Funksteckdosen und habe dementsprechend eine Steckdose mit "define Schlafzimemr pilight_switch kaku_switch  19864566 0" formuliert, die mir auch als state "on" und "off" liefert.

Also müsste doch mein Code dann so aussehen!?

if($msgText eq "/StStatus"){
my $temptext = "";
if(ReadingsVal('Schlafzimmer','state','0') eq "off"){
$temptext = "Die Steckdose ist aus";
}elsif(ReadingsVal('Schlafzimmer','state','0') eq "on"){
$temptext = "Die Steckdose ist an";
}
fhem_bot_response(
$temptext,
"/hauptmenue",
);
}


Bin gerade noch auf der Arbeit,deswegen kann ich nicht direkt testen.

Ich hoffe das kommt alles nicht all zu "der hat ja gar keine Ahnung" rüber.

Grüße
Titel: Antw:chatBot (vordefinierte Dialoge) für Telegram
Beitrag von: tiroso am 23 Juni 2016, 14:01:32
Wenn dein Device Schlafzimmer heisst ist es korrekt. Aber ich glaube es heisst bei dir Schlafzimmer_pilight_switch.

Ja wenn dein FHEM unter /opt/fhem/ läuft werden dort auch die PNGs abgelegt.

Ach ist ja kein Problem. Dafür ist es ja da um drüber zu reden. ;)
Titel: Antw:chatBot (vordefinierte Dialoge) für Telegram
Beitrag von: andre07 am 04 Juli 2016, 13:08:41
Hallo tiroso

Komme mit deinen sicherheitseinstellungen nicht ganz klar
Im telgram_bot fhem habe ich das ergänzt
userattr   -FhemBot_ReceiveRestrictedPeer 1 , -FhemBot_ReceiveCustomPeer 22042539X
In deinen code das dies ergänzt
my $msgPeerId = "22042539X";
my $TelegramBot_Device = "andre_telegram";

wobei 22042539X die  msgPeerId von meinen  handy contact ist und andre_telegram mein bot in fhem.
Funktioniert so leider nicht kannst du mir vielleicht auf die Sprünge helfen was da flasch ist.
Titel: Antw:chatBot (vordefinierte Dialoge) für Telegram
Beitrag von: RoBra81 am 04 Juli 2016, 15:18:39
Hallo,

da ich auch mal Dialoge auf diese Art gebaut habe und nun aber ein neues Modul entdeckt habe, mit welche ich meine Dialoge umgebaut und erweitert habe, möchte ich hier zur Info mal darauf verweisen - vielleicht ist das ja was für den einen oder anderen...

https://forum.fhem.de/index.php/topic,54863.0.html

Ronny
Titel: Antw:chatBot (vordefinierte Dialoge) für Telegram
Beitrag von: networker am 05 Juli 2016, 11:16:40
hallo andre07

Bist du dir mit den userattr sicher?
userattr   -FhemBot_ReceiveRestrictedPeer 1 , -FhemBot_ReceiveCustomPeer 22042539X

Im Code fragt er die userattr ohne den führenden "-" ab.

lG, Michael
Titel: Antw:chatBot (vordefinierte Dialoge) für Telegram
Beitrag von: andre07 am 05 Juli 2016, 16:06:17
Ich habe das so im Telegram_bot definiert wie muß es denn genau
aussehen
so dann ???
userattr  FhemBot_ReceiveRestrictedPeer 1 , FhemBot_ReceiveCustomPeer 22042539X
kannst du mir helfen

Andre
Titel: Antw:chatBot (vordefinierte Dialoge) für Telegram
Beitrag von: marvin78 am 06 Juli 2016, 14:30:34
Wie wäre es denn, mal die Doku von FHEM zu userattr zu konsultieren?

userattr erhält durch Leerzeichen getrennt die neuen Attribute:

attr DEV userattr FhemBot_ReceiveRestrictedPeer FhemBot_ReceiveCustomPeer

Dann bekommt das Device die neuen Attribute und diese setzt du dann, wie beschrieben.

Bitte ein wenig mit den FHEM Grundlagen beschäftigen.
Titel: Antw:chatBot (vordefinierte Dialoge) für Telegram
Beitrag von: andre07 am 06 Juli 2016, 18:17:55
Hallo marvin

Soweit war ich schon hatte FhemBot_ReceiveRestrictedPeer den wert 1 gegeben und FhemBot_ReceiveCustomPeer 22042539X
was aber so anscheinend falsch ist weil der chatbot nicht reagiert
rnals:
   DEF        206056671:AAH__ifJ9WnkHqupXzKYmXb87rYw6rHdxxx
   FAILS      0
   NAME       telegram_andre
   NR         625
   OLD_POLLING 14
   POLLING    14
   SNAME      telegram_andre
   STATE      Polling
   TYPE       TelegramBot
   Token      206056671:AAH__ifJ9WnkHqupXzKYmXb87rYw6rHdxxx
   UPDATER    0
   URL        https://api.telegram.org/bot206056671:AAH__ifJ9WnkHqupXzKYmXb87rYw6rHdxxx/
   WAIT       0
   me         206056671:andre:@andreg8_bot
   Aliascmds:
     /lichtan   set RemotePI cmd set Schlafzimmer_Nachttisch on
     /lichtaus  set RemotePI cmd set Schlafzimmer_Nachttisch off
     /speakvolume setreading telegram_andre currentSpeakVolume
     /stromverbrauch {plotAsPng("SVG_FileLog_stromsensor.haus_4")}
     /tv        set RemotePI cmd set Schlafzimmer_Fernseher on
     /wohnzimmer setreading telegram_andre currentSpeakPlayer Sonos_Schlafzimmer
   Contacts:
     220425399  220425399:gustav:@adolfo
   Hu_do_params:
     header     agent: TelegramBot/1.0

User-Agent: TelegramBot/1.0

Accept: application/json

Accept-Charset: utf-8
     hideurl    1
     method     GET
     timeout    30
     url
   Hu_upd_params:
     FD         106
     NAME
     addr       https://api.telegram.org:443
     buf
     code       200
     displayurl <hidden>
     header     agent: TelegramBot/1.0

User-Agent: TelegramBot/1.0

Accept: application/json

Accept-Charset: utf-8
     hideurl    1
     host       api.telegram.org
     httpheader HTTP/1.1 200 OK

Server: nginx/1.10.0

Date: Wed, 06 Jul 2016 16:10:59 GMT

Content-Type: application/json

Content-Length: 23

Connection: close

Access-Control-Allow-Origin: *

Access-Control-Allow-Methods: GET, POST, OPTIONS

Access-Control-Expose-Headers: Content-Length,Content-Type,Date,Server,Connection

Strict-Transport-Security: max-age=31536000; includeSubdomains
     hu_blocking 0
     hu_filecount 3
     isPolling  update
     loglevel   4
     method     GET
     offset     0
     path       /bot206056671:AAH__ifJ9WnkHqupXzKYmXb87rYw6rHdCZU/getUpdates?offset=0&limit=5&timeout=120
     protocol   https
     redirects  0
     timeout    245
     url        https://api.telegram.org/bot206056671:AAH__ifJ9WnkHqupXzKYmXb87rYw6rHdxxx/getUpdates?offset=0&limit=5&timeout=120
     Hash:
     Sslargs:
   Readings:
     2016-06-05 14:20:25   Contacts        22042539x:gustav:@adolfo
     2016-07-06 18:08:28   PollingErrCount 3
     2016-07-06 18:08:28   PollingLastError NonBlockingGet timed out on read from <hidden> after 245s
     2016-06-06 19:21:44   currentSpeakPlayer Sonos_Schlafzimmer
     2016-07-04 12:24:47   msgChat
     2016-07-04 12:24:47   msgFileId
     2016-07-04 12:24:47   msgId           1241
     2016-07-04 12:24:47   msgPeer         gustav
     2016-07-04 12:24:47   msgPeerId       22042539x
     2016-07-04 12:24:47   msgText         /start
     2016-07-04 12:24:47   prevMsgChat
     2016-07-04 12:24:47   prevMsgFileId
     2016-07-04 12:24:47   prevMsgId       1240
     2016-07-04 12:24:47   prevMsgPeer     gustav
     2016-07-04 12:24:47   prevMsgPeerId   22042539x
     2016-07-04 12:24:47   prevMsgText     /start
     2016-07-06 06:16:38   sentMsgId       1318
     2016-07-06 06:16:38   sentMsgResult   SUCCESS
Attributes:
   FhemBot_ReceiveCustomPeer 22042539x
   FhemBot_ReceiveRestrictedPeer 1
   defaultPeer @adolfo
   favorites  /lichtan=set RemotePI cmd set Schlafzimmer_Nachttisch on;/tv=?set RemotePI cmd set Schlafzimmer_Fernseher on;set RemotePI cmd set Schlafzimmer_Fernseher off;/wohnzimmer=setreading telegram_andre currentSpeakPlayer Sonos_Schlafzimmer ; /speakvolume=setreading telegram_andre currentSpeakVolume;/stromverbrauch={plotAsPng("SVG_FileLog_stromsensor.haus_4")};/lichtaus=set RemotePI cmd set Schlafzimmer_Nachttisch off
   maxRetries 3
   pollingTimeout 120
   room       Status
   userattr   FhemBot_ReceiveRestrictedPeer FhemBot_ReceiveCustomPeer


Habs rausgefunden
FhemBot_ReceiveRestrictedPeer wert 0 und es geht :)
aber warum steht dann im code das

# Bitte dran denken im TelegramBot Device die
# userattr:
# -FhemBot_ReceiveRestrictedPeer   (1/1)
# -FhemBot_ReceiveCustomPeer      (Custom Peers)
# zu setzen.
Titel: Antw:chatBot (vordefinierte Dialoge) für Telegram
Beitrag von: tiroso am 06 Juli 2016, 23:29:29
Hallöchen,

Andre sorry hatte vergessen zu antworten...mache es jetzt hier.

Ich habe diese zwei UserAttr mit dazu genommen um auf verschiedene Peerszu reagieren.

FhemBot_ReceiveRestrictedPeer -> Wenn gesetzt werden nur Peers akzeptiert die im Attr cmdRestrictedPeer stehen. Das ist ein Attr vom TelegramMessenger selber. Wenn FhemBot_ReceiveRestrictedPeer = 0 werden die Peers im UserAttr FhemBot_ReceiveCustomPeer nur akzeptiert.

Ich sehe das ist was verwirrend ... Tut mir Leid:(


:D
Hatte versucht mein unsortierten Code zu sortieren und Userfreundlicher zu gestalten und dann sowas
Titel: Antw:chatBot (vordefinierte Dialoge) für Telegram
Beitrag von: andre07 am 07 Juli 2016, 15:48:31
Danke noch jetzt läuft es ja ein Problem hätte ich noch den Versand von plots
der will bei mir nicht so richtig, bekomme  nur  Grafiken mit "no logdevice" zugesandt
definiert ist das so bei mir if($msgText eq "/heizungsplot"){
fhem_bot_svgresponse(
["SVG_Filelog.Thermostat.WZ_Clima_1.svg","SVG Plot Wohnzimmer"],
["Bad_Heizung_Clima_1.svg","SVG Plot Badezimmer"],
["SVG_FileLog_Dach_Heizung_Clima_1.svg","SVG Plot Dachboden"],
                                ["SVG_FileLog_stromsensor.haus_4.svg","Stromverbrauch"],
);

Die gleichnamigen plots befinden sich bei mir /opt/fhem/www/glot/SVG_Filelog.Thermostat.WZ_Clima_1.gplot......
Dies hier geht definiert bei favorites /stromverbrauch={plotAsPng("SVG_FileLog_stromsensor.haus_4")}
plotAsPng funktioniert also
Andre
Titel: Antw:chatBot (vordefinierte Dialoge) für Telegram
Beitrag von: tiroso am 07 Juli 2016, 21:42:19
Was steht denn im Log?
Titel: Antw:chatBot (vordefinierte Dialoge) für Telegram
Beitrag von: andre07 am 08 Juli 2016, 10:32:37
Check ich heute abend
Von der Arbeit gehts ja auch
das steht im log

2016.07.08 11:44:18 3: SVG_Filelog.Thermostat.WZ_Clima_1.svg: space is not allowed in  definition: Corresponding FileLog definition:
[Fri Jul  8 11:44:18 2016] fhem.pl: Use of uninitialized value $src in hash element at ./FHEM/98_SVG.pm line 775.
[Fri Jul  8 11:44:18 2016] fhem.pl: Use of uninitialized value $ldType in string eq at ./FHEM/98_SVG.pm line 751.
[Fri Jul  8 11:44:18 2016] fhem.pl: Use of uninitialized value $ldType in concatenation (.) or string at ./FHEM/98_SVG.pm line 763.
2016.07.08 11:44:18 3: SVG_Filelog.Thermostat.WZ_Clima_1.svg: space is not allowed in  definition: define ememlog FileLog /var/log/fhem/emem-%Y.log emem:power.*
[Fri Jul  8 11:44:18 2016] fhem.pl: Use of uninitialized value $src in hash element at ./FHEM/98_SVG.pm line 775.
[Fri Jul  8 11:44:18 2016] fhem.pl: Use of uninitialized value $ldType in string eq at ./FHEM/98_SVG.pm line 751.
2016.07.08 11:44:18 1: No Logdevice
[Fri Jul  8 11:44:18 2016] fhem.pl: Use of uninitialized value $ldType in string eq at ./FHEM/98_SVG.pm line 751.
[Fri Jul  8 11:44:18 2016] fhem.pl: Use of uninitialized value $ldType in concatenation (.) or string at ./FHEM/98_SVG.pm line 763.
2016.07.08 11:44:18 3: Bad_Heizung_Clima_1.svg: space is not allowed in  definition: Display the power reported by the EM1010
[Fri Jul  8 11:44:18 2016] fhem.pl: Use of uninitialized value $src in hash element at ./FHEM/98_SVG.pm line 775.
[Fri Jul  8 11:44:18 2016] fhem.pl: Use of uninitialized value $src in hash element at ./FHEM/98_SVG.pm line 778.
[Fri Jul  8 11:44:18 2016] fhem.pl: Use of uninitialized value $ldType in string eq at ./FHEM/98_SVG.pm line 751.
[Fri Jul  8 11:44:18 2016] fhem.pl: Use of uninitialized value $ldType in concatenation (.) or string at ./FHEM/98_SVG.pm line 763.
2016.07.08 11:44:18 3: Bad_Heizung_Clima_1.svg: space is not allowed in  definition: Corresponding FileLog definition:
[Fri Jul  8 11:44:18 2016] fhem.pl: Use of uninitialized value $src in hash element at ./FHEM/98_SVG.pm line 775.
[Fri Jul  8 11:44:18 2016] fhem.pl: Use of uninitialized value $ldType in string eq at ./FHEM/98_SVG.pm line 751.
[Fri Jul  8 11:44:18 2016] fhem.pl: Use of uninitialized value $ldType in concatenation (.) or string at ./FHEM/98_SVG.pm line 763.
2016.07.08 11:44:18 3: Bad_Heizung_Clima_1.svg: space is not allowed in  definition: define ememlog FileLog /var/log/fhem/emem-%Y.log emem:power.*
[Fri Jul  8 11:44:18 2016] fhem.pl: Use of uninitialized value $src in hash element at ./FHEM/98_SVG.pm line 775.
[Fri Jul  8 11:44:18 2016] fhem.pl: Use of uninitialized value $ldType in string eq at ./FHEM/98_SVG.pm line 751.
2016.07.08 11:44:18 1: No Logdevice
[Fri Jul  8 11:44:18 2016] fhem.pl: Use of uninitialized value $ldType in string eq at ./FHEM/98_SVG.pm line 751.
[Fri Jul  8 11:44:18 2016] fhem.pl: Use of uninitialized value $ldType in concatenation (.) or string at ./FHEM/98_SVG.pm line 763.
2016.07.08 11:44:18 3: SVG_FileLog_Dach_Heizung_Clima_1.svg: space is not allowed in  definition: Display the power reported by the EM1010
[Fri Jul  8 11:44:18 2016] fhem.pl: Use of uninitialized value $src in hash element at ./FHEM/98_SVG.pm line 775.
[Fri Jul  8 11:44:18 2016] fhem.pl: Use of uninitialized value $src in hash element at ./FHEM/98_SVG.pm line 778.
[Fri Jul  8 11:44:18 2016] fhem.pl: Use of uninitialized value $ldType in string eq at ./FHEM/98_SVG.pm line 751.
[Fri Jul  8 11:44:18 2016] fhem.pl: Use of uninitialized value $ldType in concatenation (.) or string at ./FHEM/98_SVG.pm line 763.
2016.07.08 11:44:18 3: SVG_FileLog_Dach_Heizung_Clima_1.svg: space is not allowed in  definition: Corresponding FileLog definition:
[Fri Jul  8 11:44:18 2016] fhem.pl: Use of uninitialized value $src in hash element at ./FHEM/98_SVG.pm line 775.
[Fri Jul  8 11:44:18 2016] fhem.pl: Use of uninitialized value $ldType in string eq at ./FHEM/98_SVG.pm line 751.
[Fri Jul  8 11:44:18 2016] fhem.pl: Use of uninitialized value $ldType in concatenation (.) or string at ./FHEM/98_SVG.pm line 763.
2016.07.08 11:44:18 3: SVG_FileLog_Dach_Heizung_Clima_1.svg: space is not allowed in  definition: define ememlog FileLog /var/log/fhem/emem-%Y.log emem:power.*
[Fri Jul  8 11:44:18 2016] fhem.pl: Use of uninitialized value $src in hash element at ./FHEM/98_SVG.pm line 775.
[Fri Jul  8 11:44:18 2016] fhem.pl: Use of uninitialized value $ldType in string eq at ./FHEM/98_SVG.pm line 751.
2016.07.08 11:44:18 1: No Logdevice
[Fri Jul  8 11:44:18 2016] fhem.pl: Use of uninitialized value $ldType in string eq at ./FHEM/98_SVG.pm line 751.
[Fri Jul  8 11:44:18 2016] fhem.pl: Use of uninitialized value $ldType in concatenation (.) or string at ./FHEM/98_SVG.pm line 763.
2016.07.08 11:44:18 3: SVG_FileLog_stromsensor.haus_4.svg: space is not allowed in  definition: Display the power reported by the EM1010
[Fri Jul  8 11:44:18 2016] fhem.pl: Use of uninitialized value $src in hash element at ./FHEM/98_SVG.pm line 775.
[Fri Jul  8 11:44:18 2016] fhem.pl: Use of uninitialized value $src in hash element at ./FHEM/98_SVG.pm line 778.
[Fri Jul  8 11:44:18 2016] fhem.pl: Use of uninitialized value $ldType in string eq at ./FHEM/98_SVG.pm line 751.
[Fri Jul  8 11:44:18 2016] fhem.pl: Use of uninitialized value $ldType in concatenation (.) or string at ./FHEM/98_SVG.pm line 763.
2016.07.08 11:44:18 3: SVG_FileLog_stromsensor.haus_4.svg: space is not allowed in  definition: Corresponding FileLog definition:
[Fri Jul  8 11:44:18 2016] fhem.pl: Use of uninitialized value $src in hash element at ./FHEM/98_SVG.pm line 775.
[Fri Jul  8 11:44:18 2016] fhem.pl: Use of uninitialized value $ldType in string eq at ./FHEM/98_SVG.pm line 751.
[Fri Jul  8 11:44:18 2016] fhem.pl: Use of uninitialized value $ldType in concatenation (.) or string at ./FHEM/98_SVG.pm line 763.
2016.07.08 11:44:18 3: SVG_FileLog_stromsensor.haus_4.svg: space is not allowed in  definition: define ememlog FileLog /var/log/fhem/emem-%Y.log emem:power.*
[Fri Jul  8 11:44:18 2016] fhem.pl: Use of uninitialized value $src in hash element at ./FHEM/98_SVG.pm line 775.
[Fri Jul  8 11:44:18 2016] fhem.pl: Use of uninitialized value $ldType in string eq at ./FHEM/98_SVG.pm line 751.
Titel: Antw:chatBot (vordefinierte Dialoge) für Telegram
Beitrag von: ripper am 19 Juli 2016, 22:22:13
Hallo,

ich teste jetzt schon einige Stunden mit dem Code von tiroso. Danke erst mal dafür!!

Allerdings habe ich ein hoffentlich kleines Problem an dem ich nicht weiter komme. Ich kann zwar mit dem Bot chatten und er gibt mir z.B. auch mein Menü aus. Allerdings werden keine Befehle ausgeführt.
Befehle für die Jalousien schauen bei mir so aus:
if($msgText eq "/AlleAuf"){
fhem_bot_fhem_cmd(
"set .*rollo.* auf",
);
fhem_bot_response(
"Alle Jalousien werden geschlossen.\n/jalousie\n/hauptmenue",
);
}
if($msgText eq "/AlleZu"){
fhem_bot_fhem_cmd(
"set .*rollo.* zu",
);
fhem_bot_response(
"Alle Jalousien werden geöffnet.\n/jalousie\n/hauptmenue",
);
}
if($msgText eq "/SchlafzimmerAnkippen"){
fhem_bot_fhem_cmd(
"set Sc_rollo pct 2",
);
fhem_bot_response(
"Schlafzimmer Jalousie wurde gekippt",
);
}


Wenn ich mein "99_myChat_Utils.pm" speichere bekomme ich folgenden Fehler:

Bareword "jarvisAThome" not allowed while "strict subs" in use at ./FHEM/99_myChat_Utils.pm line 69.

Wobei jarvisAThome mein Bot ist.
Ich steh hier gerade echt auf dem Schlauch. Kann mir vielleicht jemand einen "Schupser" oder einen Tipp geben??
Wenn noch weitere Infos benötigt werden liefere ich die natürlich gerne nach.

Vielen Dank schon mal :-)
Titel: Antw:chatBot (vordefinierte Dialoge) für Telegram
Beitrag von: Maista am 20 Juli 2016, 11:38:06
Moin ripper

Was steht denn in der Zeile 69 deines Moduls?

Grussig Gerd
Titel: Antw:chatBot (vordefinierte Dialoge) für Telegram
Beitrag von: ripper am 20 Juli 2016, 12:03:33


oh..ja klar..

my $TelegramBot_Device = jarvisAThome;

an der stelle wird das TelegramBot Device hinterlegt. Deswegen versteh ichs auch nicht. Wenn ich meinem Bot etwas schicke, bekomme ich z.B. mein Menü zurück und kann dann auf mein Jalousie Menü drücken. Auch meine eigene Auswahl, AlleAuf, AlleZu und SchlafzimmerAnkippen bekomme ich im Chat angezeigt. Nur der Befehl wird nicht abgesetzt.
Hab mal noch was anderes getestet:
Im Code von toriso steht:

if($msgText eq "/sonosstop"){
fhem_bot_fhem_cmd(
"set Sonos StopAll",
);
fhem_bot_response(
"Alle Sonos Boxen wurden gestoppt.\n/hauptmenue",
);
}


wenn ich dass drinnen lasse und meinem Bot /sonosstop schicke bzw. anklicke dann bekomme ich einen log Eintrag dass ich Sonos erst definieren muss. Wenn ich meine rollo befehle direkt über die fhem Eingabezeile ausführe dann bewegen sich die Jalousien.


Titel: Antw:chatBot (vordefinierte Dialoge) für Telegram
Beitrag von: pole23 am 20 Juli 2016, 14:01:39
versuch mal folgendes:
my $TelegramBot_Device = "jarvisAThome";
Titel: Antw:chatBot (vordefinierte Dialoge) für Telegram
Beitrag von: ripper am 20 Juli 2016, 16:30:55
Zitat von: pole23 am 20 Juli 2016, 14:01:39
versuch mal folgendes:
my $TelegramBot_Device = "jarvisAThome";

wenn ichs so eintrage dann bekomme ich leider folgenden Fehler

Undefined subroutine &main::myChat_Utils_Initialize called at fhem.pl line 2271.

ansonsten bleibt alles wie vorher schon beschrieben :-[
Titel: Antw:chatBot (vordefinierte Dialoge) für Telegram
Beitrag von: ripper am 20 Juli 2016, 19:55:59
ich habe jetzt einfach mal zum testen ein Stück vom "original" Code, in dem Sonos Boxen geschallten werden, in meinen Code mit eingefügt. Die Boxen gibt es bei mir natürlich nicht.

if($msgText eq "/sonosstop"){
fhem_bot_fhem_cmd(
"set Sonos StopAll",
);
fhem_bot_response(
"Alle Sonos Boxen wurden gestoppt.\n/hauptmenue",
);
}


wenn ich jetzt /sonosstop an meinen Bot schicke bekomme ich im Event Monitor mit eingeschaltetem Log folgende Meldung:


2016.07.20 19:28:37 3 : set Sonos StopAll : Please define Sonos first
2016-07-20 19:28:37 TelegramBot jarvisAThome msgId: 421
2016-07-20 19:28:37 TelegramBot jarvisAThome msgPeer: Florian
2016-07-20 19:28:37 TelegramBot jarvisAThome msgChat:
2016-07-20 19:28:37 TelegramBot jarvisAThome msgPeerId: 22247xxxx
2016-07-20 19:28:37 TelegramBot jarvisAThome msgText: /sonosstop
2016-07-20 19:28:37 TelegramBot jarvisAThome msgFileId:
2016-07-20 19:28:38 TelegramBot jarvisAThome sentMsgResult: SUCCESS
2016-07-20 19:28:38 TelegramBot jarvisAThome sentMsgId: 422


wenn ich jetzt
set Sonos StopAll gegen set .*rollo.* zu tausche und /sonosstop an meinen Bot schicke dann fahren alle meine Jalousien runter. Das Versteh ich jetzt nicht.

Ich habe das "Sonos if" jetzt komplett umbenannt und umgeschrieben:
if($msgText eq "/alleauf"){
fhem_bot_fhem_cmd(
"set .*rollo.* auf",
);
fhem_bot_response(
"Alle Jalousien werden geöffnet.\n/hauptmenue",
);
}


und auch in meine Auswahlliste mit eingefügt:
if($msgText eq "/jalousie"){
fhem_bot_response(
"/AlleAuf\n/AlleZu\n/SchlafzimmerAnkippen\n/alleauf\n/hauptmenue",
);
}

ich kann /alleauf an meinen Bot schicken oder über das "Menü" hinnavigieren und dann auf /alleauf klicken. Die Jalousien fahren hoch.
Kann mir vielleicht jemand erklären was der Unterschied zwischen dem eingefügten Code von tiroso und dem von mir selber geschriebenen ist??

Hier nochmal von mir selber getippt. Dies funktioniert nicht:
if($msgText eq "/AlleAuf"){
fhem_bot_fhem_cmd(
"set .*rollo.* auf",
);
fhem_bot_response(
"Alle Jalousien werden geöffnet.\n/jalousie\n/hauptmenue",
);
}


----------------------------------------------------------
OK....ich glaub ich habs rausgefunden was mein Problem war. Sobald in $msgText ein Großbuchstabe enthalten war hat es nicht funktioniert. Wenn ich alles klein schreibe dann geht es.
Was mich an der Stelle allerdings doch noch interessieren würde: Warum ist dass so?? Kann mir dass ein Perl Profi vielleicht erklären??
Titel: Antw:chatBot (vordefinierte Dialoge) für Telegram
Beitrag von: jostereo am 21 Juli 2016, 06:50:33
Ich bin zwar kein Perl Profi aber die Antwort weiß ich trotzdem :)

Ist liegt an der Zeile
$msgText = lc $msgText;

Am Anfang der Funktion "sub tg_analyse($$$)".

Denn diese wandelt den MessageText in lowercase (Also komplett in Kleinbuchstaben) um.
Somit kann dein Vergleich:
f($msgText eq "/AlleAuf"){
eigentlich niemals matchen, da "eq" Case-Sensitive ist also auf Groß/Kleinschreibung achtet.
Titel: Antw:chatBot (vordefinierte Dialoge) für Telegram
Beitrag von: ripper am 21 Juli 2016, 09:23:51
Hallo jostero,

danke für deine Erklärung!! Ich Nutze zwar den Code aus diese Post:

https://forum.fhem.de/index.php/topic,51425.msg464928.html#msg464928 (https://forum.fhem.de/index.php/topic,51425.msg464928.html#msg464928)

Aber auch dort hab ichs gefunden:

my $msgText = lc ReadingsVal($TelegramBot_Device,"msgText","");

Die Meldung mit dem Bareword bekomme ich zwar immer noch, aber es funktioniert.
Titel: Antw:chatBot (vordefinierte Dialoge) für Telegram
Beitrag von: mattes1007 am 06 August 2016, 14:02:49
Zitat von: tiroso am 22 Juni 2016, 23:14:03
So ich habe heute was Zeit gehabt und habe mein FHEMBot-Script noch was angepasst.

Dem TelegramBot sind folgende userattr hinzuzufügen:

-FhemBot_ReceiveRestrictedPeer   (1 oder 0)
-FhemBot_ReceiveCustomPeer      (Custom Peers)


Wie funktioniert die Sicherheit? Welche PeerID darf mit FHEM Kontakt aufnehmen?
Sollte FhemBot_ReceiveRestrictedPeer gesetzt sein wird das TelegramBot attr RestrictedPeer eingelesen. Sollte die PeerID dort eingetragen sein wird die Kommunikation freigegeben. Sollte die ID nicht zu finden sein wird die Kommunikation nicht freigegeben.
Sollte FhemBot_ReceiveRestrictedPeer nicht vorhanden oder nicht gesetzt sein wird das userattr FhemBot_ReceiveCustomPeer eingelesen. Die ist z.B. nötig wenn man TelegramBot noch für andere Sachen verwenden will und speziell für die FHEM Kommunikation nur bestimmte IDs freigeben will. Sollte die ID nicht vorhanden sein wird die Kommunikation nicht freigegeben, ansonsten schon.
Die Berechtigung wird in der SubRoutine fhem_bot_check_permission kontrolliert.

Es wird ein Notify angelegt welches Das TelegrammBot Device überwacht:

define TelegramBotNotify notify TelegramBot:msgText:.* { fhem_bot($NAME); }




Hallo,

habe mich die ganze Nacht mit dem TelegramBot beschäftigt...bekomme es nicht zum laufen mit dem Code.
Kann mir Nachrichten und Plots schicken. Aber das mit dem Menü will einfach nicht laufen....

Wenn ich das notify erstelle kommt schon mal Unknown command }, try help.

Habe alle anderen Versionen der notifys und sub getestet aber nichts geht. Es kommt immer nur zurück unknown command /start try help

hier mal meine config

define FHEMBOT TelegramBot 2248xxx9:AAHxxxxxxxxxxxzMDMcQQVlYlJcS84s
attr FHEMBOT userattr FhemBot_ReceiveRestrictedPeer 0 FhemBot_ReceiveCustomPeer 1xxxxxxxxxx
attr FHEMBOT cmdFavorites /cmd
attr FHEMBOT cmdKeyword ok
attr FHEMBOT defaultPeer @xxxxxxxx
attr FHEMBOT favorites [Zaehler]={ plotAsPng('SVG_FileLog_myObis_1') };;\
[Tagesverbrauch]={ plotAsPng('SVG_FileLog_zaehler_stat_1') }
attr FHEMBOT pollingTimeout 20
attr FHEMBOT room TelegramBot
define TelegramBotNotify notify FHEMBOT:msgText:.* { fhem_bot($NAME);; }
attr TelegramBotNotify room TelegramBot


Internals:
   DEF        FHEMBOT:msgText:.* { fhem_bot($NAME); }
   NAME       TelegramBotNotify
   NOTIFYDEV  FHEMBOT
   NR         41
   NTFY_ORDER 50-TelegramBotNotify
   REGEXP     FHEMBOT:msgText:.*
   STATE      active
   TYPE       notify
   Readings:
     2016-08-06 13:55:54   state           active
Attributes:
   room       TelegramBot

Readings:
     2016-08-06 12:39:58   Contacts        xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
     2016-08-06 13:50:54   PollingErrCount 16
     2016-08-06 13:50:54   PollingLastError NonBlockingGet timed out on read from <hidden> after 45s
     2016-08-06 13:53:33   msgChat
     2016-08-06 13:53:33   msgFileId
     2016-08-06 13:53:33   msgId           132
     2016-08-06 13:53:33   msgPeer         xx
     2016-08-06 13:53:33   msgPeerId       xxxxxxxx
     2016-08-06 13:53:33   msgText         ok /start
     2016-08-06 13:53:33   prevMsgChat
     2016-08-06 13:53:33   prevMsgFileId
     2016-08-06 13:53:33   prevMsgId       130
     2016-08-06 13:53:33   prevMsgPeer     xxxxxx
     2016-08-06 13:53:33   prevMsgPeerId   19xxxxx37
     2016-08-06 13:53:33   prevMsgText     ok
     2016-08-06 13:53:33   sentMsgId       133
     2016-08-06 13:53:33   sentMsgResult   SUCCESS

use warnings;
use POSIX;

my $msgPeerId = "xxxxxxxxxxxxxxxxxxx";
my $TelegramBot_Device = "FHEMBOT";

sub
myUtilsTelegram_Initialize($$)
{


Woran könnte das liegen ?

Gruß mattes
Titel: Antw:chatBot (vordefinierte Dialoge) für Telegram
Beitrag von: tiroso am 07 August 2016, 07:27:51
Puh im Moment weiss ich es leider auch nicht.
Hmm...ich suche weiter
Titel: Antw:chatBot (vordefinierte Dialoge) für Telegram
Beitrag von: davedeluxe am 09 September 2016, 13:19:04
Hey,
danke für die Mühe und für´s teilen!

Ich bekomme leider auch Fehler:
Beim Erstellen des Notify: Unknown command }, try help.
Beim speichern der 99_myUtilsTelegramMessenger.pm: Undefined subroutine &main::myUtilsTelegramMessenger_Initialize called at fhem.pl line 2274.
Titel: Antw:chatBot (vordefinierte Dialoge) für Telegram
Beitrag von: kalle0103 am 10 September 2016, 14:54:04
Super Script, leider hat bei mir die Authentification nicht funktioniert. Habe jetzt eine einfach if ID eq ID. Das läuft...
Anbei die Info zum notify was bei mir auch mit der Fehlermeldung { nicht funktionierte...damit klappts:

define TelegramBotNotify notify TelegramBot:msgText:.* { fhem_bot("$NAME") }
Titel: Antw:chatBot (vordefinierte Dialoge) für Telegram
Beitrag von: Ascos am 12 September 2016, 19:14:13
Hi,

ich klinke mich mal in die Diskussion mit ein. Habe bei mir auch Telegramm eingerichtet und mit dieser tollen Anleitung hier soweit zum Laufen bekommen.
Licht lässt sich schalten, Informationen und Menüs werden gesendet.
Einzig die SVGs wollen nicht zu mir kommen.
Mein Code sieht im Moment noch so aus, wie der von tiroso von Seite 1, will ihn aber noch auf den von Seite 2 ändern.
Von der 2. Seite habe ich auch das SVG-Skript kopiert, aber ich bekomme genau die gleichen Fehlermeldungen, wie andre07.
Leider hab es auf sein Log keine Antwort, deswegen hole ich das noch einmal nach vorne und hoffe, das jemand jetzt vielleicht eine Idee hat, wo das Problem liegen könnte.

Viele Grüße
Tino


Zitat von: andre07 am 08 Juli 2016, 10:32:37
Check ich heute abend
Von der Arbeit gehts ja auch
das steht im log

2016.07.08 11:44:18 3: SVG_Filelog.Thermostat.WZ_Clima_1.svg: space is not allowed in  definition: Corresponding FileLog definition:
[Fri Jul  8 11:44:18 2016] fhem.pl: Use of uninitialized value $src in hash element at ./FHEM/98_SVG.pm line 775.
[Fri Jul  8 11:44:18 2016] fhem.pl: Use of uninitialized value $ldType in string eq at ./FHEM/98_SVG.pm line 751.
[Fri Jul  8 11:44:18 2016] fhem.pl: Use of uninitialized value $ldType in concatenation (.) or string at ./FHEM/98_SVG.pm line 763.
2016.07.08 11:44:18 3: SVG_Filelog.Thermostat.WZ_Clima_1.svg: space is not allowed in  definition: define ememlog FileLog /var/log/fhem/emem-%Y.log emem:power.*
[Fri Jul  8 11:44:18 2016] fhem.pl: Use of uninitialized value $src in hash element at ./FHEM/98_SVG.pm line 775.
[Fri Jul  8 11:44:18 2016] fhem.pl: Use of uninitialized value $ldType in string eq at ./FHEM/98_SVG.pm line 751.
2016.07.08 11:44:18 1: No Logdevice
[Fri Jul  8 11:44:18 2016] fhem.pl: Use of uninitialized value $ldType in string eq at ./FHEM/98_SVG.pm line 751.
[Fri Jul  8 11:44:18 2016] fhem.pl: Use of uninitialized value $ldType in concatenation (.) or string at ./FHEM/98_SVG.pm line 763.
2016.07.08 11:44:18 3: Bad_Heizung_Clima_1.svg: space is not allowed in  definition: Display the power reported by the EM1010
[Fri Jul  8 11:44:18 2016] fhem.pl: Use of uninitialized value $src in hash element at ./FHEM/98_SVG.pm line 775.
[Fri Jul  8 11:44:18 2016] fhem.pl: Use of uninitialized value $src in hash element at ./FHEM/98_SVG.pm line 778.
[Fri Jul  8 11:44:18 2016] fhem.pl: Use of uninitialized value $ldType in string eq at ./FHEM/98_SVG.pm line 751.
[Fri Jul  8 11:44:18 2016] fhem.pl: Use of uninitialized value $ldType in concatenation (.) or string at ./FHEM/98_SVG.pm line 763.
2016.07.08 11:44:18 3: Bad_Heizung_Clima_1.svg: space is not allowed in  definition: Corresponding FileLog definition:
[Fri Jul  8 11:44:18 2016] fhem.pl: Use of uninitialized value $src in hash element at ./FHEM/98_SVG.pm line 775.
[Fri Jul  8 11:44:18 2016] fhem.pl: Use of uninitialized value $ldType in string eq at ./FHEM/98_SVG.pm line 751.
[Fri Jul  8 11:44:18 2016] fhem.pl: Use of uninitialized value $ldType in concatenation (.) or string at ./FHEM/98_SVG.pm line 763.
2016.07.08 11:44:18 3: Bad_Heizung_Clima_1.svg: space is not allowed in  definition: define ememlog FileLog /var/log/fhem/emem-%Y.log emem:power.*
[Fri Jul  8 11:44:18 2016] fhem.pl: Use of uninitialized value $src in hash element at ./FHEM/98_SVG.pm line 775.
[Fri Jul  8 11:44:18 2016] fhem.pl: Use of uninitialized value $ldType in string eq at ./FHEM/98_SVG.pm line 751.
2016.07.08 11:44:18 1: No Logdevice
[Fri Jul  8 11:44:18 2016] fhem.pl: Use of uninitialized value $ldType in string eq at ./FHEM/98_SVG.pm line 751.
[Fri Jul  8 11:44:18 2016] fhem.pl: Use of uninitialized value $ldType in concatenation (.) or string at ./FHEM/98_SVG.pm line 763.
2016.07.08 11:44:18 3: SVG_FileLog_Dach_Heizung_Clima_1.svg: space is not allowed in  definition: Display the power reported by the EM1010
[Fri Jul  8 11:44:18 2016] fhem.pl: Use of uninitialized value $src in hash element at ./FHEM/98_SVG.pm line 775.
[Fri Jul  8 11:44:18 2016] fhem.pl: Use of uninitialized value $src in hash element at ./FHEM/98_SVG.pm line 778.
[Fri Jul  8 11:44:18 2016] fhem.pl: Use of uninitialized value $ldType in string eq at ./FHEM/98_SVG.pm line 751.
[Fri Jul  8 11:44:18 2016] fhem.pl: Use of uninitialized value $ldType in concatenation (.) or string at ./FHEM/98_SVG.pm line 763.
2016.07.08 11:44:18 3: SVG_FileLog_Dach_Heizung_Clima_1.svg: space is not allowed in  definition: Corresponding FileLog definition:
[Fri Jul  8 11:44:18 2016] fhem.pl: Use of uninitialized value $src in hash element at ./FHEM/98_SVG.pm line 775.
[Fri Jul  8 11:44:18 2016] fhem.pl: Use of uninitialized value $ldType in string eq at ./FHEM/98_SVG.pm line 751.
[Fri Jul  8 11:44:18 2016] fhem.pl: Use of uninitialized value $ldType in concatenation (.) or string at ./FHEM/98_SVG.pm line 763.
2016.07.08 11:44:18 3: SVG_FileLog_Dach_Heizung_Clima_1.svg: space is not allowed in  definition: define ememlog FileLog /var/log/fhem/emem-%Y.log emem:power.*
[Fri Jul  8 11:44:18 2016] fhem.pl: Use of uninitialized value $src in hash element at ./FHEM/98_SVG.pm line 775.
[Fri Jul  8 11:44:18 2016] fhem.pl: Use of uninitialized value $ldType in string eq at ./FHEM/98_SVG.pm line 751.
2016.07.08 11:44:18 1: No Logdevice
[Fri Jul  8 11:44:18 2016] fhem.pl: Use of uninitialized value $ldType in string eq at ./FHEM/98_SVG.pm line 751.
[Fri Jul  8 11:44:18 2016] fhem.pl: Use of uninitialized value $ldType in concatenation (.) or string at ./FHEM/98_SVG.pm line 763.
2016.07.08 11:44:18 3: SVG_FileLog_stromsensor.haus_4.svg: space is not allowed in  definition: Display the power reported by the EM1010
[Fri Jul  8 11:44:18 2016] fhem.pl: Use of uninitialized value $src in hash element at ./FHEM/98_SVG.pm line 775.
[Fri Jul  8 11:44:18 2016] fhem.pl: Use of uninitialized value $src in hash element at ./FHEM/98_SVG.pm line 778.
[Fri Jul  8 11:44:18 2016] fhem.pl: Use of uninitialized value $ldType in string eq at ./FHEM/98_SVG.pm line 751.
[Fri Jul  8 11:44:18 2016] fhem.pl: Use of uninitialized value $ldType in concatenation (.) or string at ./FHEM/98_SVG.pm line 763.
2016.07.08 11:44:18 3: SVG_FileLog_stromsensor.haus_4.svg: space is not allowed in  definition: Corresponding FileLog definition:
[Fri Jul  8 11:44:18 2016] fhem.pl: Use of uninitialized value $src in hash element at ./FHEM/98_SVG.pm line 775.
[Fri Jul  8 11:44:18 2016] fhem.pl: Use of uninitialized value $ldType in string eq at ./FHEM/98_SVG.pm line 751.
[Fri Jul  8 11:44:18 2016] fhem.pl: Use of uninitialized value $ldType in concatenation (.) or string at ./FHEM/98_SVG.pm line 763.
2016.07.08 11:44:18 3: SVG_FileLog_stromsensor.haus_4.svg: space is not allowed in  definition: define ememlog FileLog /var/log/fhem/emem-%Y.log emem:power.*
[Fri Jul  8 11:44:18 2016] fhem.pl: Use of uninitialized value $src in hash element at ./FHEM/98_SVG.pm line 775.
[Fri Jul  8 11:44:18 2016] fhem.pl: Use of uninitialized value $ldType in string eq at ./FHEM/98_SVG.pm line 751.

Titel: Antw:chatBot (vordefinierte Dialoge) für Telegram
Beitrag von: gs62 am 18 September 2016, 17:38:53
Hallo,
ich arbeite jetzt auch schon ein paar Tage mit Telegram. Daher wollte ich die Anleitung von tiroso umsetzen. Leider kommt beim Anlegen des Notify die Meldung das die Variablen u.a $msgText nicht bekannt sind. Die 99_myUtilTelegram.pm ist angelegt.
Vielleicht ganz einfach zu lösen aber ich komme nicht weiter. Ich danke schon mal für die Hilfe.

Gunter
Hat sich erledigt, war halt doch blind. Beim kopieren und ändern hatte sich ein Syntaxfehler eingeschlichen. Jetzt funktioniert die Abfrage über Telegram.
Titel: Antw:chatBot (vordefinierte Dialoge) für Telegram
Beitrag von: ReinerZ am 28 September 2016, 23:33:17
Hallo  ;D

habe gerade das Modul in Betrieb genommen, tiroso's Menü funktioniert perfekt. Habe auch schon einige Befehle angepasst.
Nur mit dem Befehlt     /okfhem - Direktbefehl      habe ich Schwierigkeiten ...

Wie habt ihr den umgesetzt ?

Beste Grüße

Reiner
Titel: Antw:chatBot (vordefinierte Dialoge) für Telegram
Beitrag von: Ascos am 01 Oktober 2016, 11:41:30
Hey,

ich möchte noch einmal meine Anfrage (https://forum.fhem.de/index.php/topic,51425.msg490345.html#msg490345)vom 12. September erneuern.
Vielleicht hat ja jemand eine Idee, woran das Problem liegen könnte.

Viele grüße
Tino
Titel: Antw:chatBot (vordefinierte Dialoge) für Telegram
Beitrag von: Dersch am 10 Oktober 2016, 14:39:30
Hi, super Vorlagen hier!!! Ich versuche mich grade reinzufuchsen. Ist ja einiges zu tun damit das komfortabel läuft aber das wird über die Zeit schon.

Was ich überhaupt nicht verstehe ist was ich genau zu den SVG Plots verwenden muss. Ich habe es grade so und schon viel probiert:

if($msgText eq "/sendeplot"){
fhem_bot_response(
"/KinderzimmerPlot\n/BadezimmerPlot\n/WaeschekellerPlot\n/ServerSchrankPlot\n/WohnzimmerPlot\n/KuecheDeckePlot\n/KuecheMagicMirrorPlot",
"/hauptmenue",
);
}
if($msgText eq "/alleplots"){
fhem_bot_svgresponse(
["WaeschekellerPlot.svg","SVG Plot Wäschekeller"],
["BadTempFeuchte_1.svg","SVG Plot Badezimmer"],
["ServerSchrankPlot.svg","SVG Plot Serverschrank"],
["WohnzimmerPlot.svg","SVG Plot Wohnrzimmer"],


HIer ist ein List eines meiner Plots

Internals:
   DEF        FileLog_WzTempFeuchte:SVG_FileLog_WzTempFeuchte_1:CURRENT
   GPLOTFILE  SVG_FileLog_WzTempFeuchte_1
   LOGDEVICE  FileLog_WzTempFeuchte
   LOGFILE    CURRENT
   NAME       SVG_FileLog_WzTempFeuchte_1
   NR         116
   STATE      initialized
   TYPE       SVG
Attributes:
   room       Wohnzimmer


Wenn ich nun /WohnzimmerPlot eingebe passiert gar nichts. Wenn ich /allplots sende kommen zwar Bilder aber ohne Inhalt. Es steht nur "No Logdevice" drin.
Im /opt/fhem Ordner werden aber nummerierte Plot.png erstellt. 

Ich vermute ich sage ihm einfach den falschen Namen für die SVG aber ich weiß nun auch nicht was das Richtige ist da alle meine Versuche nicht zum Erfolg geführt haben :(

Grüße
Dirk
Titel: Antw:chatBot (vordefinierte Dialoge) für Telegram
Beitrag von: Markus80 am 16 Oktober 2016, 17:31:50
Hammer coole Idee das ganze hier....

Werde am Ball bleiben und mir auch so ein Menü erstellen...

Telegram funzt schonmal perfekt

Gesendet von meinem C6903 mit Tapatalk

Titel: Antw:chatBot (vordefinierte Dialoge) für Telegram
Beitrag von: BKSolo am 14 November 2016, 19:10:32
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




Titel: Antw:chatBot (vordefinierte Dialoge) für Telegram
Beitrag 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.
Titel: Antw:chatBot (vordefinierte Dialoge) für Telegram
Beitrag von: jazzor am 01 Dezember 2016, 17:05:01
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 :-)
Titel: Antw:chatBot (vordefinierte Dialoge) für Telegram
Beitrag von: igami am 01 Dezember 2016, 18:58:41
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:

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:

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  (https://www.youtube.com/watch?v=HcWCdOtyQ2w)
Titel: Antw:chatBot (vordefinierte Dialoge) für Telegram
Beitrag von: hartenthaler am 01 Dezember 2016, 20:14:26
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 (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.
Titel: Antw:chatBot (vordefinierte Dialoge) für Telegram
Beitrag 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.

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.
Titel: Antw:chatBot (vordefinierte Dialoge) für Telegram
Beitrag von: hartenthaler am 02 Dezember 2016, 01:55:36
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.
Titel: Antw:chatBot (vordefinierte Dialoge) für Telegram
Beitrag 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

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.
Titel: Antw:chatBot (vordefinierte Dialoge) für Telegram
Beitrag von: igami am 02 Dezember 2016, 06:04:07
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.
Titel: Antw:chatBot (vordefinierte Dialoge) für Telegram
Beitrag von: igami am 06 Dezember 2016, 21:18:14
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?
Titel: Antw:chatBot (vordefinierte Dialoge) für Telegram
Beitrag von: Maista am 06 Dezember 2016, 22:36:24
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
Titel: Antw:chatBot (vordefinierte Dialoge) für Telegram
Beitrag von: CBSnake am 07 Dezember 2016, 06:30:37
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

Titel: Antw:chatBot (vordefinierte Dialoge) für Telegram
Beitrag von: münchner am 09 Dezember 2016, 22:09:49
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
Titel: Antw:chatBot (vordefinierte Dialoge) für Telegram
Beitrag von: Fixel2012 am 04 Januar 2017, 16:58:59
Wäre auch Interessiert!

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

Grüße

Fixel
Titel: Antw:chatBot (vordefinierte Dialoge) für Telegram
Beitrag von: gent am 09 Januar 2017, 21:52:34
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
Titel: Antw:chatBot (vordefinierte Dialoge) für Telegram
Beitrag von: binford6000 am 10 Januar 2017, 08:55:33
ZitatIch ü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?

Hi Michael,

das sieht alles schon sehr schick aus und ich hätte natürlich auch großes Interesse an einem Modul für einen Chat-Dialog mit FHEM!   :D

VG Sebastian
Titel: Antw:chatBot (vordefinierte Dialoge) für Telegram
Beitrag von: sig10680 am 10 Januar 2017, 11:54:39
Hallo,
ich wäre auch an so einen Modul interessiert.

mfg Sig10680
Titel: Antw:chatBot (vordefinierte Dialoge) für Telegram
Beitrag von: magix99 am 12 Januar 2017, 18:28:03
Hi,

ich möchte mir mit dem Befehl ein Plot der Benzinpreise schicken lassen, habe aber von Perl nicht viel Ahnung.
Da ich aber auch eine Gruppe erstellt habe, geht die Nachricht nicht an mich sondern immer an die Gruppe.
Wie kann man das ändern?


if($msgText eq "/benzin_plot")
{TelegramBot_ExecuteCommand($defs{"Telegram"}, meineID, '{plotAsPng("SVG_FileLog_Benzinpreis_1")}');; return;;}


Bei den normalen Befehlen geht es, aber nicht bei dem Format zu Plot versenden.


if($msgText eq "/lampe_an"){
fhem "set FBDECT_Fritzbox_18 on meineID)."
Titel: Antw:chatBot (vordefinierte Dialoge) für Telegram
Beitrag von: pandabear_de am 24 Januar 2017, 22:41:24
Hi,
ich bin gerade über diesen Thread gestoßen und finde ihn sehr interessant. Bisher habe ich meinen Dialog via Telegram komplett über einen Notify abgewickelt. Die Auslagerung in ein Modul macht m.E. Sinn. Ich werde dieses Wochenende mal etwas Spieltzeit reservieren.  ;)

Ein Hinweis an dieser Stelle. Vor ich Schlatungen über Telegram erlauben wollte, war es mir wichtig, dies noch irgendwie mit einem Passwort abzusichern. - Zusammen mit Betateilchen habe ich zu diesem Zweck ein neues Modul (98_GoogleAuth) entwickelt, mit der One-Time-Passwords mit Google Authenticator geprüft werden können.

Also z.B.

Licht an 123456

Wenn 123456 ein gültiger Token ist, geht das Licht an.

Ich prüfe bei mir nun bei jeder Message nach, ob die letzten 6 Zeichen einen gültiger Token ergeben und kann dann bei meinen Schaltungen in der IF Abfrage prüfen, ob eine erfolgreiche Authentifizierung vorliegt.

Weitere Infos unter: https://fhem.de/commandref.html#GoogleAuth (https://fhem.de/commandref.html#GoogleAuth)

Gruß
Jakob

Titel: Antw:chatBot (vordefinierte Dialoge) für Telegram
Beitrag von: PSI69 am 09 Februar 2017, 17:01:15
Hi,

ich habe gerade eben diesen Thread komplett gelesen, habe großes Interesse an einem Modul und teste gern!

Tschau Peter
Titel: Antw:chatBot (vordefinierte Dialoge) für Telegram
Beitrag von: igami am 09 Februar 2017, 17:28:07
Hach, dann muss ich ja wirklich mal was machen :D
Titel: Antw:chatBot (vordefinierte Dialoge) für Telegram
Beitrag von: binford6000 am 09 Februar 2017, 23:01:46
ZitatHach, dann muss ich ja wirklich mal was machen

Das wäre echt cool! Ich würde mich auch als Betatester anbieten!  8)

VG Sebastian
Titel: Antw:chatBot (vordefinierte Dialoge) für Telegram
Beitrag von: Wuehler am 11 Februar 2017, 13:39:39
Ich habe mich neulich ein wenig mit dem IBM Watson Conversation-Service beschäftigt. Den kann man privat bis zu einem gewissen Umfang kostenfrei nutzen. War ganz interessant. In recht kurzer Zeit konnte man Dialoge zusammenklicken, die einigermaßen natürlich gegenüber dem Nutzer wirkten.
Ist aber insgesamt recht viel Aufwand, wenn man nicht nur per Codeworten chatten will.
Titel: Antw:chatBot (vordefinierte Dialoge) für Telegram
Beitrag von: hartenthaler am 12 Februar 2017, 20:56:05
Mit dem Watson Conversation Dienst habe ich mich noch nicht näher beschäftigt. Ich nutze RiveScript mit dem genialen fhem-TALKTOME-Modul (s.
https://forum.fhem.de/index.php/topic,54863.msg583423.html#msg583423). Dort nutze ich den Dialog mit natürlicher Sprache, wobei ich etliches so definiert habe, dass auch mal nur ein eindeutiges Stichwort reicht. Ein anderer Ansatz liesse sich da noch kombinieren nämlich eine Menüführung, die manchmal besser geeignet ist, etwa wenn es um das Schalten von Lampen geht. Ein "schalte die lampe an der decke im wohnzimmer" setzt voraus, dass man für jede Lampe weiß wie man sie nennen kann, und ist für Spracheingabe ok, bei einem Text-Chat aber etwas länglich; da wäre /licht mit der Ausgabe einer anklickbaren Liste aller Räume (keyboards) und dann einer Liste aller Lampen in einem Raum intuitiver, passt aber nicht für einen Sprachdialog. Mein Traum wäre ja die Kombination von Sprache mit Geste: "diese Lampe einschalten" und "Fingerzeig zur Lampe".
Titel: Antw:chatBot (vordefinierte Dialoge) für Telegram
Beitrag von: andies am 20 März 2017, 13:35:40
Ich hätte auch großes Interesse an einem solchen Modul.

<EDIT>Die Fehlermeldung hat sich erledigt, ich wusste nicht, wie man ein userattr setzt. Sorry.</EDIT>
Titel: Antw:chatBot (vordefinierte Dialoge) für Telegram
Beitrag von: andies am 20 März 2017, 22:35:40
Zitat von: tiroso am 22 Juni 2016, 23:14:03
So ich habe heute was Zeit gehabt und habe mein FHEMBot-Script noch was angepasst.
<EDIT>Wettersymbole habe ich doch noch einbinden können.</EDIT>
Titel: Antw:chatBot (vordefinierte Dialoge) für Telegram
Beitrag von: andies am 21 März 2017, 06:51:02
Besteht die Möglichkeit, die Favorite-Keyboards zweispaltig zu machen? In der Commandref steht drin, dass die keyboards noch gar nicht unterstützt werden, was glücklicherweise nicht der Fall ist: gerade die Keyboards sind ein großartiges Tool, danke!
Titel: Antw:chatBot (vordefinierte Dialoge) für Telegram
Beitrag von: igami am 21 März 2017, 10:51:20
Zitat von: andies am 21 März 2017, 06:51:02
Besteht die Möglichkeit, die Favorite-Keyboards zweispaltig zu machen? In der Commandref steht drin, dass die keyboards noch gar nicht unterstützt werden, was glücklicherweise nicht der Fall ist: gerade die Keyboards sind ein großartiges Tool, danke!
Ich glaube du meinst eher das telegramBot modul, dann ist das hier der falsche thread.
Titel: Antw:chatBot (vordefinierte Dialoge) für Telegram
Beitrag von: andies am 21 März 2017, 13:43:04
Danke, Anfrage habe ich verschoben.
Titel: Antw:chatBot (vordefinierte Dialoge) für Telegram
Beitrag von: andies am 27 März 2017, 12:42:29
Ich unternehme hier einen zweiten Versuch. Ist das die richtige Stelle um das zu diskutieren:
2017.03.27 09:24:21 3: eval: my $EVENT='msgText: /system';my $EVTPART0='msgText:';my $NAME='TelegramBot';my $EVTPART1='/system';my $TYPE='TelegramBot';my $SELF='TelegramBotNotify';{fhem_bot($NAME);}
(process:707): GdkPixbuf-CRITICAL **: gdk_pixbuf_get_bits_per_sample: assertion 'GDK_IS_PIXBUF (pixbuf)' failed
(process:707): GdkPixbuf-CRITICAL **: gdk_pixbuf_get_width: assertion 'GDK_IS_PIXBUF (pixbuf)' failed
(process:707): GdkPixbuf-CRITICAL **: gdk_pixbuf_get_height: assertion 'GDK_IS_PIXBUF (pixbuf)' failed
(process:707): GdkPixbuf-CRITICAL **: gdk_pixbuf_get_rowstride: assertion 'GDK_IS_PIXBUF (pixbuf)' failed
(process:707): GdkPixbuf-CRITICAL **: gdk_pixbuf_get_has_alpha: assertion 'GDK_IS_PIXBUF (pixbuf)' failed
(process:707): GdkPixbuf-CRITICAL **: gdk_pixbuf_get_pixels_with_length: assertion 'GDK_IS_PIXBUF (pixbuf)' failed
Schwerer Fehler in PNG-Bilddatei: Invalid IHDR data2017.03.27 09:30:53 1: Including fhem.cfg


Ausgelöst wurde der Fehler durch folgenden Befehl (in meiner 99_myUtilsTelegram.pm):

fhem_bot_svgresponse(
["wl_sysmon_temp", "CPU Temp"],
["wl_sysmon_load", "CPU Load"],
["wl_sysmon_wlan0", "WLAN"],
["wl_sysmon_fs_root", "Partition"],
["wl_sysmon_ram", "RAM"]
...
sub fhem_bot_svgresponse{
my $svgentries = 0;
foreach (@_){$svgentries++;}
for(my $i = 0; $i < $svgentries; $i++) {
my @data = @{$_[$i]};
my $filename = 'plot'.$i.'.png';
open(my $fh, '>', $filename) or die "Could not open file '$filename' $!";
print $fh plotAsPng($data[0]);
close $fh;
fhem_bot_imgresponse(
"/opt/fhem/plot".$i.".png ".$data[1],
);
}
}

und diese sub habe ich aus dem Forum kopiert.
Titel: Antw:chatBot (vordefinierte Dialoge) für Telegram
Beitrag von: igami am 27 März 2017, 13:02:59
Ich glaube in diesem Thread gibt es mittlerweile vier Mögliche Umsetzungen. Vllt sollte man die thread aufteilen:
chatBot by igami
chatBot by Ferdy2003
chatBot by tiroso
chatBot by Puschel74
Titel: Antw:chatBot (vordefinierte Dialoge) für Telegram
Beitrag von: Jump2016 am 01 April 2017, 23:46:30
@tiroso

Ich habe deine Skripte wie hier https://forum.fhem.de/index.php/topic,51425.msg464928.html#msg464928 (https://forum.fhem.de/index.php/topic,51425.msg464928.html#msg464928) beschrieben eingefügt.

Diese funktionieren auch super.

Anschließend hab ich ein zusätzlichen Eintrag (Test) im Hauptmenü gemacht.
if($msgText eq "/hilfe" || $msgText eq "/hauptmenue"){
fhem_bot_response(
"Hier sind alle Befehle:",
"--Generell\n/hilfe - Hilfetext\n/hauptmenue -Hilfetext\n/okfhem - Direktbefehl\n/system",
"--Umwelt\n/wetterjetzt\n/wetterheute\n/wettermorgen\n/wettervorhersage",
"--Media\n/sonosstop - Stoppe SonosBoxen","--Heizung\n/heizung - Heizung Info",
"--Sonstiges\n/sendeplot\n/batterie\n/TurStatus\n/muelltonne",
"--Test\n/Test",
);
}


Und dann folgendes definiert:

if($msgText eq "/Test"){
fhem_bot_response(
"Textbox 1\nMit #ein bisschen Text",
"Textbox 2",
"Textbox 3\nWieder mit ein bisschen Test\nAber noch einer Zeile",
);
}


Der neue Eintrag wird mir im Chat auch angezeigt.
Wenn ich diesen Punkt auswähle, dann wird auch /Test an FHEM geschickt (sehe ich im Log),
ich bekomme aber im Chat keinerlei Rückmeldung.

Hast du eine Idee warum?
Titel: Antw:chatBot (vordefinierte Dialoge) für Telegram
Beitrag von: sw85 am 02 April 2017, 08:01:16
Zitat von: Jump2016 am 01 April 2017, 23:46:30
@tiroso

Ich habe deine Skripte wie hier https://forum.fhem.de/index.php/topic,51425.msg464928.html#msg464928 (https://forum.fhem.de/index.php/topic,51425.msg464928.html#msg464928) beschrieben eingefügt.

Diese funktionieren auch super.

Anschließend hab ich ein zusätzlichen Eintrag (Test) im Hauptmenü gemacht.
if($msgText eq "/hilfe" || $msgText eq "/hauptmenue"){
fhem_bot_response(
"Hier sind alle Befehle:",
"--Generell\n/hilfe - Hilfetext\n/hauptmenue -Hilfetext\n/okfhem - Direktbefehl\n/system",
"--Umwelt\n/wetterjetzt\n/wetterheute\n/wettermorgen\n/wettervorhersage",
"--Media\n/sonosstop - Stoppe SonosBoxen","--Heizung\n/heizung - Heizung Info",
"--Sonstiges\n/sendeplot\n/batterie\n/TurStatus\n/muelltonne",
"--Test\n/Test",
);
}


Und dann folgendes definiert:

if($msgText eq "/Test"){
fhem_bot_response(
"Textbox 1\nMit #ein bisschen Text",
"Textbox 2",
"Textbox 3\nWieder mit ein bisschen Test\nAber noch einer Zeile",
);
}


Der neue Eintrag wird mir im Chat auch angezeigt.
Wenn ich diesen Punkt auswähle, dann wird auch /Test an FHEM geschickt (sehe ich im Log),
ich bekomme aber im Chat keinerlei Rückmeldung.

Hast du eine Idee warum?

Versuch mal Test klein zu schreiben. Ich habe immer wieder das Problem, dass der Bot Großbuchstaben nicht mag. Ich hab zwar noch nicht raus gefunden warum, aber bisher war das bei mir meist die Lösung.
Titel: Antw:chatBot (vordefinierte Dialoge) für Telegram
Beitrag von: Jump2016 am 02 April 2017, 09:41:22
@sw85

Vielen Dank für den Hinweis.

Nun funktionierts  :)
Titel: Antw:chatBot (vordefinierte Dialoge) für Telegram
Beitrag von: ripper am 02 April 2017, 11:14:04
Zitat von: Jump2016 am 02 April 2017, 09:41:22
@sw85

Vielen Dank für den Hinweis.

Nun funktionierts  :)

die Erklärung steht ein Stück weiter vorne:
https://forum.fhem.de/index.php/topic,51425.msg474200.html#msg474200

hatte am Anfang dass gleiche Problem mit Gr0ß- und Kleinschreibung.

Gruß
Flo
Titel: Antw:chatBot (vordefinierte Dialoge) für Telegram
Beitrag von: Willi91 am 02 Juli 2017, 11:05:54
Guten Morgen zusammen,

vor einiger Zeit habe ich diesen Thread hier entdeckt und durch meinen Spieltrieb mich direkt damit beschäftigt.
Ein Modul für 433 MHz war schnell zusammen gelötet, das für 868 MHz wollte nicht so wie ich es wollte... Dafür kommt die Woche dann das von ELV als BiggyPack für den Raspberry.
Angefangen habe ich mit dem ganz am Anfang vorgestellten Script, aber die ganzen "/" Befehle haben mir auf Dauer nicht gefallen, so dass ich da ein wenig umgebaut habe.
Buttons sind doch viel schöner und gehen auch mit der Grundbasis.

if($msgText eq "start"){
# --------ID 1--------
if($msgPeerId eq "ID 1"){
fhem "set $Name message \@$msgPeerId  (Drucker|".ReadingsVal('Drucker_Buero','state','0').") (Kühlschrank|".ReadingsVal('Test_Steckdose','state','0').") (Wohnzimmer|Schlafzimmer) (Wetter) (Jalousie|System) Hey ID 1";
}
# --------ID 2--------
if($msgPeerId eq "ID 2"){
fhem "set $Name message \@$msgPeerId (Licht Schlafzimmer|".ReadingsVal('Licht_Schlafzimmer','state','0').") (Wohnzimmer|Wetter) Hey ID 2 ";
}
}


Eine Übergabe der Werte direkt in die Buttons funktioniert einwandfrei, so kann ich den zwar unnütz drücken, bekomme aber direkt meinen aktuellen Status angezeigt.
Die Überwachung wer welchen Befehl sehen und nutzen kann, erfolgt hier sehr einfach über die direkte Telegram ID im Script.
Das mit der Groß-/Kleinschreibung habe ich auch gemerkt, dabei ist es so simpel. Die angezeigten Texte können ruhig in Groß geschrieben werden, aber die API wertet diese nur in Klein aus, so dass man hier das "erkennen" im Script in klein schreiben muss. ;)

Nun bin ich aber mit den Heizungen dran und würde gerne direkt von Telegram aus, nach Betätigung eines Buttons eine neue Temperatur einstellen.
Hat sich hiermit auf Basis des ersten Grundscripts schon mal jemand beschäftigt?

fhem "set $Name message \@$msgPeerId (Licht Schlafzimmer|".ReadingsVal('Licht_Schlafzimmer','state','0').") (Heizung Ist|".ReadingsVal('TVLicht','measured-temp','0')." °C) (Heizung Soll|".ReadingsVal('TVLicht','desired-temp','0')." °C) (Start) Schlafzimmer";
Titel: Antw:chatBot (vordefinierte Dialoge) für Telegram
Beitrag von: Willi91 am 02 Juli 2017, 19:46:40
Doppelpost ist kacke, ich weiß aber ich habe es hinbekommen. Vielleicht für manche was umständlich, aber wenn man es einmal sauber aufgezogen hat, läuft es ja sauber!
Hier die Code Schnippsel für Nachfolgende. :)

f($msgText eq "heizung soll"){
#---------------Schlafzimmer----------
if(ReadingsVal('StatusH','state','0') eq "1"){
if($msgPeerId eq "ID" || $msgPeerId eq "ID"){
fhem "set $Name message \@$msgPeerId (16°|17°|18°|19°|20°) (21°|22°|23°|24°|25°) (Schlafzimmer) Heizung im Schlafzimmer";
}
#---------------Wohnzimmer ----------
} elsif(ReadingsVal('StatusH','state','0') eq "2"){
if($msgPeerId eq "ID" || $msgPeerId eq "ID"){
fhem "set $Name message \@$msgPeerId (16°|17°|18°|19°|20°) (21°|22°|23°|24°|25°) (Wohnzimmer) Heizung im Wohnzimmer";
}
} else {
fhem "set $Name message \@$msgPeerId Funktioniert im Hauptmenü";
}
}
if($msgText eq "18°"){
#---------------Schlafzimmer ----------
if(ReadingsVal('StatusH','state','0') eq "1"){
if($msgPeerId eq "ID"){
fhem "set $Name message \@$msgPeerId  (Drucker|".ReadingsVal('Drucker_Buero','state','0').") (Kühlschrank|".ReadingsVal('Test_Steckdose','state','0').") (Wohnzimmer|Schlafzimmer) (Wetter) (Jalousie|System) Heizung im Schlafzimmer auf 18° eingestellt!";
} elsif($msgPeerId eq "ID"){
fhem "set $Name message \@$msgPeerId (Licht Schlafzimmer|".ReadingsVal('Licht_Schlafzimmer','state','0').") (Wohnzimmer|Wetter) Heizung im Schlafzimmer auf 18° eingestellt!";
}
#---------------Wohnzimmer ----------
} elsif(ReadingsVal('StatusH','state','0') eq "2"){
if($msgPeerId eq "ID"){
fhem "set $Name message \@$msgPeerId  (Drucker|".ReadingsVal('Drucker_Buero','state','0').") (Kühlschrank|".ReadingsVal('Test_Steckdose','state','0').") (Wohnzimmer|Schlafzimmer) (Wetter) (Jalousie|System) Heizung im Wohnzimmer auf 18° eingestellt!";
} elsif($msgPeerId eq "ID2"){
fhem "set $Name message \@$msgPeerId (Licht Schlafzimmer|".ReadingsVal('Licht_Schlafzimmer','state','0').") (Wohnzimmer|Wetter) Heizung im Wohnzimmer auf 18° eingestellt!";
}
} else {
fhem "set $Name message \@$msgPeerId Funktioniert nicht hier";
}
}


Die Set Befehle fehlen noch, da die Heizungen noch nicht gekoppelt sind. Sobald diese aber drin sind, kann ich den Rest ja nachziehen. ;)

Gruß Ernst
Titel: Antw:chatBot (vordefinierte Dialoge) für Telegram
Beitrag von: ErzGabriel am 09 August 2017, 17:29:58
Hi.
Das Thema Telegram Bot ist sehr interessant und das kann man gut einsetzen aber leider komme ich damit nicht ganz klar.
Ich habe mir den Bot eingerichtet und kann auch Geräte bei mir schalten, leider kriege ich es nicht hin, das er mir die Temperaturen schickt. Das mag gut dadran liegen, das ich in Perl ne Niete bin. Deswegen wollte ich hier mal um hilfe bitten.
1. Möchte ich auf Abfrage die Temperaturen der Wohnung erhalten
2. Zu bestimmten Zeiten, möchte ich die Außentemperatur erhalten.
3. Später vielleicht noch ne Meldung über leere Batterien.
Titel: Antw:chatBot (vordefinierte Dialoge) für Telegram
Beitrag von: Esjay am 09 August 2017, 18:32:45
Zitat von: ErzGabriel am 09 August 2017, 17:29:58
Hi.
Das Thema Telegram Bot ist sehr interessant und das kann man gut einsetzen aber leider komme ich damit nicht ganz klar.
Ich habe mir den Bot eingerichtet und kann auch Geräte bei mir schalten, leider kriege ich es nicht hin, das er mir die Temperaturen schickt. Das mag gut dadran liegen, das ich in Perl ne Niete bin. Deswegen wollte ich hier mal um hilfe bitten.
1. Möchte ich auf Abfrage die Temperaturen der Wohnung erhalten
2. Zu bestimmten Zeiten, möchte ich die Außentemperatur erhalten.
3. Später vielleicht noch ne Meldung über leere Batterien.
Das hat nicht wirklich etwas mit dem Chatbot zu tun. Guck mal in den normalen Telegram Theard. Das hier ist eher etwas für komplexere Angelegenheiten.Läßt sich relativ einfach mit Doif oder at ausarbeiten..Einfach mal die Commandref zu doif lesen.
Grüße
Titel: Antw:chatBot (vordefinierte Dialoge) für Telegram
Beitrag von: ErzGabriel am 09 August 2017, 19:02:50
Okay, danke für den Tipp. Werde mir das mal anschauen, mit dem DOIF und AT.
Titel: Antw:chatBot (vordefinierte Dialoge) für Telegram
Beitrag von: julianG am 15 August 2017, 23:49:00
Zitat von: igami am 27 März 2017, 13:02:59
Ich glaube in diesem Thread gibt es mittlerweile vier Mögliche Umsetzungen. Vllt sollte man die thread aufteilen:
chatBot by igami
chatBot by Ferdy2003
chatBot by tiroso
chatBot by Puschel74

Wie ist denn der aktuelle Stand bei den genannten Umsetzungen? Was hat sich getan und kann man an den Fortschritten teilhaben?

Viele Grüße
Julian
Titel: Antw:chatBot (vordefinierte Dialoge) für Telegram
Beitrag von: Killermike007 am 16 August 2017, 12:37:21
Hi.

Habe die Dialoge von igami auch übernommen.

Leider bekomme ich keinerlei Reaktion auf /start oder /heimdall.

Im Log steht lediglich:

}
  return;;;;
  fhem("attr subType=dialog widgetOverride msgPeerId:multiple-strict,".join(",", @Contacts));;;;
  $_ = join(":", (split(":", $_))[0,1]) for (@Contacts);;;;
  my @Contacts = split(" ", ReadingsVal($NAME, "Contacts", ""));;;;
  return if(InternalVal($NAME, "TYPE", "undef") ne "TelegramBot");;;;
2017.08.16 12:19:18 4: no_contacts exec {
2017.08.16 12:19:18 5: Triggering no_contacts
}
  return;;;; 
  fhem("trigger $_ msg: $msgText", 0) for (@dialogs);;;;

    }
        );;;;;;;;
         trim($defs{$_}->{devices}{0}) eq $_
         ) and
           $msgChat eq ""
         (grep(/$msgChat/, split(",", AttrVal($_, "msgChat", ""))) or
        (grep(/$msgPeerId/, split(",", AttrVal($_, "msgPeerId", ""))) and
        if
      push(@dialogs, $_)
    for (@a){
  my @dialogs;;;;
  my @a = devspec2array("subType=dialog:FILTER=disable!=1");;;;

  my $msgText = ReadingsVal($NAME, "msgText", undef);;;;
    $msgChat = (split(" ", $msgChat, 2))[0] if($msgChat ne "");;;;
  my $msgChat = ReadingsVal($NAME, "msgChat", "");;;;
  my $msgPeerId = ReadingsVal($NAME, "msgPeerId", undef);;;;
  return if(InternalVal($NAME, "TYPE", "undef") ne "TelegramBot");;;;
2017.08.16 12:17:00 4: dialog_notify exec {
2017.08.16 12:17:00 5: Triggering dialog_notify


Das log wird bei mir rückwärts angezeigt.

Jemand ne Idee, warum kein Dialog kommt?

Danke und Gruß

Mike
Titel: Antw:chatBot (vordefinierte Dialoge) für Telegram
Beitrag von: igami am 16 August 2017, 15:29:11
Ich bin momentan dabei mein FHEM komplett auf Vordermann zu bringen und da zählt das Thema Dialoge auch mit rein. Die Anbindung wollte ich noch über das msg Modul machen​. Das dauert aber alles noch. Ich benutze nach wie vor den Stand den ich hier gepostet habe.
Titel: Antw:chatBot (vordefinierte Dialoge) für Telegram
Beitrag von: igami am 16 August 2017, 15:29:27
Ich bin momentan dabei mein FHEM komplett auf Vordermann zu bringen und da zählt das Thema Dialoge auch mit rein. Die Anbindung wollte ich noch über das msg Modul machen​. Das dauert aber alles noch. Ich benutze nach wie vor den Stand den ich hier gepostet habe.
Titel: Antw:chatBot (vordefinierte Dialoge) für Telegram
Beitrag von: julianG am 16 August 2017, 15:57:39
Super, danke. Dann versuche ich die Tage mal das ganze auch bei mir zum Laufen zu bekommen  :)
Titel: Antw:chatBot (vordefinierte Dialoge) für Telegram
Beitrag von: igami am 24 August 2017, 17:59:47
So, ich wollte mich nun mal wieder daran setzen und habe aber ein paar Fragen an euch nutzer:
1. Was für einen Chat-Dienst nutzt ihr? Ausschließlich Telegram oder gibt es auch Adaptionen auf andere Dienste? Ich würde versuchen das ganze dann so modular wie möglich zu halten und das ganze midestens noch auf jabber zu erweitern.
2. Wie konfiguriert ihr lieber eure Dialoge? Eine "myUtils" Datei oder pro Dialog ein FHEM Device? Letzteres mache ich mit DOIF und finde das auch recht praktisch. So kann ich für jeden Dialog separat Berechtigungen vergeben.

Noch bin ich in der Findungsphase und der Meinung, dass ein Zweistufiges Modul Sinnvoll ist.
1. "DialogModerator" in dem man die Schnittstellen definiert, also den TelegramBot
2. "Dialog" in dem man die einzelnen Dialoge definiert.

Es gibt ja mittlerweile auch schon mehrere Ansätze hier im Forum (TALKTOME und TERRKO). Diese gehen aber weiter und machen auch eine Kontexterkennung.
Mir geht es aber ausschließlich um einen ChatBot mit vordefinierten Dialogen ohne Spielraum. Dadurch lässt sich das Handy einfach als Interface benutzen.
Titel: Antw:chatBot (vordefinierte Dialoge) für Telegram
Beitrag von: ripper am 25 August 2017, 04:54:28
Hallo Igami,

also ich nutze Telegram und habe tiroso`s Version aus diesem Thread bei mir umgesetzt. Ich finde die alles in einer Datei zu haben aktuell sehr übersichtlich und gut zu warten. Allerdings gibt es bei mir momentan auch nicht so viel zu schalten, sodass sperate Berechtigungen kein Thema sind.
Titel: Antw:chatBot (vordefinierte Dialoge) für Telegram
Beitrag von: pole23 am 25 August 2017, 07:50:10
Moin,

ich benutze auch als Client ausschließlich Telegram und habe eine eigene "myutils" Datei für die Dialoge.
Titel: Antw:chatBot (vordefinierte Dialoge) für Telegram
Beitrag von: binford6000 am 25 August 2017, 09:36:09
Moin,
ich benutze als Client auch Telegram und fände die DOIF-Variante charmanter wie mit die myUtils.
VG Sebastian
Titel: Antw:chatBot (vordefinierte Dialoge) für Telegram
Beitrag von: tiroso am 25 August 2017, 12:38:01
Ich bin zwischenzeitlich zu lange raus und habe iwie zu wenig Zeit. Da gehen mir viele Beiträge unter. Bin nicht so fit mit Forums Beiträge verfolgen ^^

Ich freue mich wenn meine Vorlage genutzt werden kann und würde auch gerne mehr helfen. Noch besser finde ich das andere da aushelfen können.
Titel: Antw:chatBot (vordefinierte Dialoge) für Telegram
Beitrag von: schka17 am 25 August 2017, 20:18:09
Telegram mit myUtils, DOIF's gibts bei mir nicht


Sent from my iPad using Tapatalk
Titel: Antw:chatBot (vordefinierte Dialoge) für Telegram
Beitrag von: felskrone am 27 August 2017, 13:24:43
Ich nutze auch Telegram und bin kein Freund von DoIf.
Wichtig wäre mir die Möglichkeit, mehrere Benutzer mit unterschiedlichem Funktionsumfang abbilden zu können.
Titel: Antw:chatBot (vordefinierte Dialoge) für Telegram
Beitrag von: igami am 27 August 2017, 16:16:02
Das mit den mehreren Benutzern realisiere ich momentan über die DOIF. Für jeden Dialog wird festgelegt wer den benutzten darf.
Titel: Antw:chatBot (vordefinierte Dialoge) für Telegram
Beitrag von: PSI69 am 28 August 2017, 15:04:33
Ich nutze Telegram und derzeit die myutils; doifs mit einzelnen Berechtigungen (wobei ich diese im Moment nicht benötige) sind aber auch OK...

Peter
Titel: Antw:chatBot (vordefinierte Dialoge) für Telegram
Beitrag von: jkriegl am 28 August 2017, 15:46:37
Benutze ausschließlich Telegramm, lasse mir zeitgesteuert Informationen zuschicken.
Über Menue und notify rufe ich Daten und plots ab.
Daten setzen z.B. Vorlauftemperatur ist in Planung.
Titel: Antw:chatBot (vordefinierte Dialoge) für Telegram
Beitrag von: Smarti am 01 September 2017, 08:20:55
Guten Tag,
ich beschäftige mich auch gerade mit dem Thema ChatBot. Bisher habe ich noch nichts wirklich brauchbares implementiert. Habe mir aber da so meine Gedanken gemacht.

Für die Entwicklung eines ChatBot Moduls, sollte meines erachtens eine Trennung zwischen Code und Dialogen stattfinden: Sprich, wenn möglich sollten alle Dialoge in eine speaparte Datei ausgelagert werden (worin die Dialoge z.B. in XML, JASON, YAML oder einer andern Markup Language) abgelegt/gepflegt werden. Durch das Modul wird diese entsprechende Datei geparst.

Klingt das zu abwägig? Was meint Ihr dazu?
Titel: Antw:chatBot (vordefinierte Dialoge) für Telegram
Beitrag von: igami am 01 September 2017, 08:23:22
Zitat von: Smarti am 01 September 2017, 08:20:55
Guten Tag,
ich beschäftige mich auch gerade mit dem Thema ChatBot. Bisher habe ich noch nichts wirklich brauchbares implementiert. Habe mir aber da so meine Gedanken gemacht.

Für die Entwicklung eines ChatBot Moduls, sollte meines erachtens eine Trennung zwischen Code und Dialogen stattfinden: Sprich, wenn möglich sollten alle Dialoge in eine speaparte Datei ausgelagert werden (worin die Dialoge z.B. in XML, JASON, YAML oder einer andern Markup Language) abgelegt/gepflegt werden. Durch das Modul wird diese entsprechende Datei geparst.

Klingt das zu abwägig? Was meint Ihr dazu?
So hatte ich das ja vor. Nur eben nicht einzelne Dateien, sondern devices in FHEM. Bei der Syntax bin ich mir aber noch nicht sicher was richtig ist.
Titel: Antw:chatBot (vordefinierte Dialoge) für Telegram
Beitrag von: RoBra81 am 01 September 2017, 23:10:10
Dann solltest du dir das Modul mal ansehen: https://forum.fhem.de/index.php?topic=54863.0

Gesendet von meinem SM-G935F mit Tapatalk

Titel: Antw:chatBot (vordefinierte Dialoge) für Telegram
Beitrag von: igami am 03 September 2017, 08:59:52
Zitat von: RoBra81 am 01 September 2017, 23:10:10
Dann solltest du dir das Modul mal ansehen: https://forum.fhem.de/index.php?topic=54863.0
Ja, das Modul kenne ich schon.
Meiner Meinung nach bietet es aber nicht die passende Syntax.
Ich denke ich werde es eher mit json machen

{
  "variables": {
    "actor": "HM_2C10D8_Sw",
    "controlUnit": "Waschkeller_washer_controlUnit",
    "state": "ReadingsVal($actor,'state', '') eq 'on' ? 'eingeschaltet' : 'ausgeschaltet';",
    "controlMode": "ReadingsVal($controlUnit,'controlMode', '') eq 'auto' ? 'Automatik' : 'Manuell';"
  },
  "request": "Waschmaschine",
  "message": [
    "Waschmaschine: $state",
    "Modus: $controlMode"
  ],
  "keyboard": [
    "Zeitprogramm stoppen",
    "programmieren",
    "einschalten",
    "Verlaufsdiagramm",
    "abbrechen"
  ],
  "reply": [{
      "request": "Zeitprogramm stoppen",
      "message": [
        "Das Zeitprogramm wurde gestoppt.",
        "",
        "/heimdall"
      ],
      "commands": "set $controlUnit controlMode manual"
    },
    {
      "request": "programmieren",
      "message": [
        "Wann soll die Wäsche fertig sein?",
        "Bitte Uhrzeit in HH:MM angeben.",
        "Aktuell ist [Waschkeller_washer_controlUnit:time] eingestellt."
      ],
      "keyboard": [
        ["bestätigen", "abbrechen"],
        ["00:00", "00:15", "00:30", "00:45"],
        ["01:00", "01:15", "01:30", "01:45"],
        ["02:00", "02:15", "02:30", "02:45"],
        ["03:00", "03:15", "03:30", "03:45"],
        ["04:00", "04:15", "04:30", "04:45"],
        ["05:00", "05:15", "05:30", "05:45"],
        ["06:00", "06:15", "06:30", "06:45"],
        ["07:00", "07:15", "07:30", "07:45"],
        ["08:00", "08:15", "08:30", "08:45"],
        ["09:00", "09:15", "09:30", "09:45"],
        ["10:00", "10:15", "10:30", "10:45"],
        ["11:00", "11:15", "11:30", "11:45"],
        ["12:00", "12:15", "12:30", "12:45"],
        ["13:00", "13:15", "13:30", "13:45"],
        ["14:00", "14:15", "14:30", "14:45"],
        ["15:00", "15:15", "15:30", "15:45"],
        ["16:00", "16:15", "16:30", "16:45"],
        ["17:00", "17:15", "17:30", "17:45"],
        ["18:00", "18:15", "18:30", "18:45"],
        ["19:00", "19:15", "19:30", "19:45"],
        ["20:00", "20:15", "20:30", "20:45"],
        ["21:00", "21:15", "21:30", "21:45"],
        ["22:00", "22:15", "22:30", "22:45"],
        ["23:00", "23:15", "23:30", "23:45"],
        ["24:00", "24:15", "24:30", "24:45"]
      ],
      "reply": [{
        "request": "bestätigen",
        "message": [
          "Das Zeitprogramm wurde eingestellt.",
          "Die Wäsche wird voraussichtlich um [Waschkeller_washer_controlUnit:time] Uhr fertig sein.",
          "Bitte die Waschmaschine vorbereiten.",
          "",
          "/heimdall"
        ],
        "commands": "set $controlUnit controlMode auto"
      },
      {
        "request": "([0-1][0-9]|2[0-3]):[0-5][0-9]",
        "message": [
          "Das Zeitprogramm wurde eingestellt.",
          "Die Wäsche wird voraussichtlich um [Waschkeller_washer_controlUnit:time] Uhr fertig sein.",
          "Bitte die Waschmaschine vorbereiten.",
          "",
          "/heimdall"
        ],
        "commands": [
          "set Waschkeller_washer_controlUnit time [TelegramBot:msgText]",
          "set $controlUnit controlMode auto"
        ]
      }]
    },
    {
      "request": "einschalten",
      "commands": [
        "set $controlUnit controlMode manual",
        "set $actor on"
      ]
    },
    {
      "request": "Verlaufsdiagramm",
      "message": [
        "{plotAsPng('Waschkeller_washer_SVG')}",
        "/heimdall"
      ]
    }
  ]
}

Dabei kann man dann auch einigermaßen gut den ganzen Dialog überblicken.

Aber so ganz ausgereift ist das halt immer noch nicht.
Titel: Antw:chatBot (vordefinierte Dialoge) für Telegram
Beitrag von: RoBra81 am 03 September 2017, 18:14:26
Darf ich fragen, was dir bei der Syntax fehlt?

Gesendet von meinem SM-G935F mit Tapatalk

Titel: Antw:chatBot (vordefinierte Dialoge) für Telegram
Beitrag von: igami am 03 September 2017, 22:51:10
Zitat von: RoBra81 am 03 September 2017, 18:14:26
Darf ich fragen, was dir bei der Syntax fehlt?
Das kann ich dir gar nicht so genau beantworten, da ich mich noch nicht so tief eingelesen haben.
Meiner Meinung nach ist die Syntax zu einfach. Mehrstufige Dialoge lassen sich nur mit % erzeugen. Und wie kann man einfach Variablen verändern (z.B. formatieren oder übersetzen)?

Noch ist nichts in Stein gemeißelt und es gibt momentan mehrere Ansätze hier im Forum.
Wie gesagt ist Thema dieses Threads aber ausschließlich ein chatBot mit vordefinierten Dialogen ohne Kontexterkennung.
RiveScript Zielt ja eher darauf ab, dass man mit dem Bot natürlich reden kann.
Ich suche nach einer Syntax mit der ich die Frage und die Möglichen Antworten erfasse ohne Spielraum zu geben.
Titel: Antw:chatBot (vordefinierte Dialoge) für Telegram
Beitrag von: igami am 30 September 2017, 15:26:19
Hier wird es weitergehen msgDialog: Instant Messaging als FHEM Interface (https://forum.fhem.de/index.php/topic,77297.0.html)
Titel: Antw:chatBot (vordefinierte Dialoge) für Telegram
Beitrag von: rohlande am 03 November 2017, 13:44:43
Hallo Experten,

versuche gerade die SVG Daten via Telegram zu versenden.
Leider erhalte ich dazu folgende Fehlermeldung im log....
2017.11.03 13:40:39 5: Triggering TelegramSVGsend
2017.11.03 13:40:39 4: TelegramSVGsend exec {TelegramBot_ExecuteCommand($defs{"teleBot1"}, XXXXXXXXXX, '{plotAsPng("SVG_MS_Liefern_dblog_1")}');; return;;}
2017.11.03 13:40:39 1: ERROR evaluating my $NAME='teleBot1';my $TYPE='TelegramBot';my $EVENT='msgText: /SVG';my $EVTPART0='msgText:';my $EVTPART1='/SVG';my $SELF='TelegramSVGsend';{TelegramBot_ExecuteCommand($defs{"teleBot1"}, XXXXXXXXX, '{plotAsPng("SVG_MS_Liefern_dblog_1")}'); return;}: Not enough arguments for main::TelegramBot_ExecuteCommand at (eval 5235) line 1, near "'{plotAsPng("SVG_MS_Liefern_dblog_1")}')"

2017.11.03 13:40:39 3: TelegramSVGsend return value: Not enough arguments for main::TelegramBot_ExecuteCommand at (eval 5235) line 1, near "'{plotAsPng("SVG_MS_Liefern_dblog_1")}')"


Kann mir jemand auf die Sprünge helfen?

VG Denny
Titel: Antw:chatBot (vordefinierte Dialoge) für Telegram
Beitrag von: jkriegl am 03 November 2017, 13:55:26
Da wurde mal was geändert
TeleB:queryData.*svg_solar {{TelegramBot_ExecuteCommand($defs{"TeleB"}, xxxxxxxx, undef, '{plotAsPng("SVG_FileLog_Solar_1")}');; return;;}}
Ich glaube das undef
Titel: Antw:chatBot (vordefinierte Dialoge) für Telegram
Beitrag von: rohlande am 03 November 2017, 14:04:51
hast Recht. Habe es soeben selbst wieder gefunden. :-)
so funktioniert es.

   
teleBot1:msgText:./SVG {TelegramBot_ExecuteCommand($defs{"teleBot1"}, XXXXXXXX, undef, '{plotAsPng("SVG_MS_Liefern_dblog_1")}');return;}

Trotzdem Vielen Dank für die schnelle Antwort.

VG Denny
Titel: Antw:chatBot (vordefinierte Dialoge) für Telegram
Beitrag von: igami am 03 November 2017, 15:22:30
Ich möchte hier auch noch Mal auf das msgDialog Modul hinweisen,welches offiziell in FHEM enthalten ist
Titel: Antw:chatBot (vordefinierte Dialoge) für Telegram
Beitrag von: rohlande am 03 November 2017, 16:39:55
@igami: habe es heute erst entdeckt. Bin hin und her gerissen. Habe schon einige zeit in meine "notify" Struktur gesteckt. Wenn ich zeit finde werde ich versuchen es umzubauen. Ist sehr schön Dein Modul.

Vg denny
Titel: Antw:chatBot (vordefinierte Dialoge) für Telegram
Beitrag von: Traxel am 09 November 2017, 21:24:40
Guten Abend!

Ich bin mir nicht sicher ob ich hier richtig bin, aber ich versuche es einfach mal :-)

Mein Vorhaben ist folgendes: Ich möchte jeden Morgen um 06:30 eine Telegram message bekommen, mit der aktuellen Aussentemperatur.

Telegram läuft bereits erfolgreich, ich bekomme bei Anruf in Abwesenheit (FB_MONTOR) bereits fleißig Nachrichten.

Mein define lautet wie folgt:

define Morgennachricht at *06:30:00 {my $TETemperatur = ReadingsVal("Aussensensor","temperature", "") my $TEHumidity = ReadingsVal("Aussensensor","humidity", "")} set Telegram message Aussentemperatur $TETemperatur°C Luftfeuchte $TEHumidity%

Leider bekomme ich einen Fehler zurück:

Unrecognized character \xC2; marked by <-- HERE after Temperatur<-- HERE near column 194 at (eval 3326) line 1.

Ich habe schon einiges durchsucht hier und bei Google, aber nichts gefunden :-( Wo liegt nur mein Fehler? Danke!
Titel: Antw:chatBot (vordefinierte Dialoge) für Telegram
Beitrag von: vitolinker am 09 November 2017, 21:56:52
Guten Abend!
Lasse doch mal das "°" (Gradzeichen) im set Befehl weg und probiere nochmal :-)

VG Vitolinker
Titel: Antw:chatBot (vordefinierte Dialoge) für Telegram
Beitrag von: igami am 09 November 2017, 22:54:22
richtig bist du hier zwar nicht, aber die Perl Befehle müssen noch mit Semikolon getrennt werden und der FHEM aufruf passt auch nicht.
Du kannst aber auch einfach setmagic verwenden. siehe dazu die Commandref im Abschnitt set.
Dann wird es zu "set ... [device:reading] ..."
Titel: Antw:chatBot (vordefinierte Dialoge) für Telegram
Beitrag von: Traxel am 10 November 2017, 11:45:35
Vielen Dank für den Tip!

Gemeinsam mit der Referenz https://fhem.de/commandref_DE.html#set (https://fhem.de/commandref_DE.html#set) sieht meine Automatik nun so aus:

define Morgennachricht at *06:30:00 set Telegram message [Aussensensor:STATE] / [Abfallkalender:STATE]
attr Morgennachricht group Steuerungssysteme
attr Morgennachricht room Einstellungen


Und es funktioniert hervorragend!
Titel: Antw:chatBot (vordefinierte Dialoge) für Telegram
Beitrag von: Alex1984 am 30 Juni 2019, 10:05:15
Hallo Igami


Hab alles soweit am laufen aber scheitere am senden der SVG Plots da die SubRoutine nicht dabei ist und ich es einfach nicht hin bekomme.

Könntest du mir bitte deine SubRoutine PLOT2JPEG zu kommen lassen oder hier posten???


Danke
Gruss
Alex
Titel: Antw:chatBot (vordefinierte Dialoge) für Telegram
Beitrag von: igami am 30 Juni 2019, 10:08:30
Puh, schon lange nicht mehr verwendet. Habe das aus dem Forum. Guck mal bei https://forum.fhem.de/index.php/topic,38842.msg309983.html#msg309983

Telegram Bot untertzütz das Commando plotAsPng einfach mal in die commandref gucken ;)
Titel: Antw:chatBot (vordefinierte Dialoge) für Telegram
Beitrag von: adrian am 08 Januar 2023, 16:04:36
Hallo zusammen,
Ich steige gerade von Telegram auf den Signalbot um. Ist sowieso mein Standard Messenger und sicher dazu. :-) Da macht es nur Sinn auch den Chatbot auf Signal um zubauen.
Grundsätzlich funktioniert das auch sehr gut, nur werden mir die Menüpunkte als Text angezeigt, sprich "/hauptmenu" steht als reiner Text bzw. Rückgabewert in der Signalnachricht. Was muß denn eingestellt oder angepasst werden, dass die Befehle auch als Shortcuts also klickbar übergeben werden?
danke und gruß
adrian