chatBot (vordefinierte Dialoge) für Telegram

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

Vorheriges Thema - Nächstes Thema

igami

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
Pi3 mit fhem.cfg + DbLog/logProxy
Komm vorbei zum FHEM Treffen im Kreis Gütersloh! Das nächste Mal im April 2020.

MAINTAINER: archetype, LuftdatenInfo, monitoring, msgDialog, Nmap, powerMap
ToDo: AVScene, FluxLED

Ferdy2003

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?");
}
}

tiroso

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

Wie habe ich es gelöst?

Im wesentlichen über 3 Punkte

  • Anlegen und einstellen des TelegramBot Moduls (in meinem Beispiel TelegramBot)
  • Anlegen eines notify der TelegramBot überwacht
  • Eigene MyUtils Datei (in meinem Beispiel 99_myUtilsTelegram.pm

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ß

Floca

Ich hatte dich auf Youtube gefragt ;)

Vielen Dank für die Daten  ;D

tiroso

Hat es denn geklappt?

Gesendet von meinem SM-G900F mit Tapatalk


Puschel74

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).
Zotac BI323 als Server mit DBLog
CUNO für FHT80B, 3 HM-Lan per vCCU, RasPi mit CUL433 für Somfy-Rollo (F2F), RasPi mit I2C(LM75) (F2F), RasPi für Panstamp+Vegetronix +SONOS(F2F)
Ich beantworte keine Supportanfragen per PM! Bitte im Forum suchen oder einen Beitrag erstellen.

igami

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

Pi3 mit fhem.cfg + DbLog/logProxy
Komm vorbei zum FHEM Treffen im Kreis Gütersloh! Das nächste Mal im April 2020.

MAINTAINER: archetype, LuftdatenInfo, monitoring, msgDialog, Nmap, powerMap
ToDo: AVScene, FluxLED

tiroso

#7
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.

Floca

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...

SirUli

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

igami

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 :)
Pi3 mit fhem.cfg + DbLog/logProxy
Komm vorbei zum FHEM Treffen im Kreis Gütersloh! Das nächste Mal im April 2020.

MAINTAINER: archetype, LuftdatenInfo, monitoring, msgDialog, Nmap, powerMap
ToDo: AVScene, FluxLED


tiroso

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 ;)

Esjay

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

tiroso

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.