Telegram instant messaging TelegramBot - Empfangen und Senden per FHEM

Begonnen von viegener, 20 Juni 2015, 18:59:41

Vorheriges Thema - Nächstes Thema

viegener

OK, Fix ist eingechecked und jetzt sollte es auch bei der Verwendung mehrerer Empfänger keine Warnung mehr geben. Trotz der Warnung wurden die Nachrichten aber wohl verschickt.

Ab morgen ist die neue Version über update verfügbar
Kein Support über PM - Anfragen gerne im Forum - Damit auch andere profitieren und helfen können

Tomsc1984

Ich glaube ich bin zu doof. ich hab jetzt schon einiges in Fhem geschafft, aber der Telebot ist für ich ein Rästel. Ich habe mir ein Notify gemacht, wo ich meine Heizkörper steuern kann und den Spripreis abfragen kann. Ich hänge das al an :
teleBot:msgText.* {
    if ($EVTPART1 eq 'WohnzimmerEG') {
        if ($EVENT =~ 'boost') {
            fhem("set Thermostat_Wohnzimmer_EG desiredTemperature boost");
fhem("set teleBot send Erledigt")
           
        }
        elsif ($EVENT =~ 'auto') {
            fhem("set Thermostat_Wohnzimmer_EG desiredTemperature auto");
fhem("set teleBot send Erledigt")
             }
        elsif ($EVENT =~ 'aus') {
            fhem("set Thermostat_Wohnzimmer_EG desiredTemperature off");
fhem("set teleBot send Erledigt")
            }
     }
    elsif ($EVTPART1 eq 'Spritpreis') {
        my $spritPreis = ReadingsVal("OUT.Spritpreis", "Diesel", "");
        fhem("set teleBot send Preis: $spritPreis");
          }
  if ($EVTPART1 eq 'WohnzimmerOG') {
        if ($EVENT =~ 'boost') {
            fhem("set Thermostat desiredTemperature boost");
fhem("set teleBot send Erledigt");
           
        }
        elsif ($EVENT =~ 'auto') {
            fhem("set Thermostat desiredTemperature auto");
fhem("set teleBot send Erledigt");
             }
        elsif ($EVENT =~ 'aus') {
            fhem("set Thermostat desiredTemperature off");
fhem("set teleBot send Erledigt");
            }
     }
if ($EVTPART1 eq 'Pond') {
        if ($EVENT =~ 'Licht ein') {
            fhem("set Unterwasserlicht on");
fhem("set teleBot send Licht eingeschaltet");
           
        }
elsif ($EVENT =~ 'Licht aus') {
            fhem("set Unterwasserlicht off");
fhem("set teleBot send Licht ausgeschaltet");
           
        }

         
          }
  }



kann mir den jemand berichtigen? Ich bekomme einfach keine Antwort an die Person die die Anforderung schreibt.. Nachricht bekomme immer nur ich. Ausgefürt wird der Befehl aber.

Danke für eure Hilfe

Gruß Thomas

MadMax-FHEM

FHEM PI3B+ Bullseye: HM-CFG-USB, 40x HM, ZWave-USB, 13x ZWave, EnOcean-PI, 15x EnOcean, HUE/deCONZ, CO2, ESP-Multisensor, Shelly, alexa-fhem, ...
FHEM PI2 Buster: HM-CFG-USB, 25x HM, ZWave-USB, 4x ZWave, EnOcean-PI, 3x EnOcean, Shelly, ha-bridge, ...
FHEM PI3 Buster (Test)

Xguide

Hallo Thomas,

eigentlich wurde Dir die Lösung ja schon angeboten, aber da ich mein Notify gerade auf habe  ;D
teleBot:msgText.* {
    my $peer = ReadingsVal("teleBot","msgPeerId","undef");
    if ($EVTPART1 eq 'WohnzimmerEG') {
        if ($EVENT =~ 'boost') {
            fhem("set Thermostat_Wohnzimmer_EG desiredTemperature boost");
    fhem("set teleBot message \@".$peer." Erledigt - ".$EVTPART1." set to boost");           
        }
.
.
.


Schau mal ob das so funktioniert, ich benutze die Kontakte und dort muss das @ vorangestellt werden, laut Doku sollte das bei der peerID auch so sein....

Gruß Marcel
Zitat von: Tomsc1984 am 31 Mai 2017, 21:37:43
Ich glaube ich bin zu doof. ich hab jetzt schon einiges in Fhem geschafft, aber der Telebot ist für ich ein Rästel. Ich habe mir ein Notify gemacht, wo ich meine Heizkörper steuern kann und den Spripreis abfragen kann. Ich hänge das al an :
teleBot:msgText.* {
    if ($EVTPART1 eq 'WohnzimmerEG') {
        if ($EVENT =~ 'boost') {
            fhem("set Thermostat_Wohnzimmer_EG desiredTemperature boost");
fhem("set teleBot send Erledigt")
           
        }
        elsif ($EVENT =~ 'auto') {
            fhem("set Thermostat_Wohnzimmer_EG desiredTemperature auto");
fhem("set teleBot send Erledigt")
             }
        elsif ($EVENT =~ 'aus') {
            fhem("set Thermostat_Wohnzimmer_EG desiredTemperature off");
fhem("set teleBot send Erledigt")
            }
     }
    elsif ($EVTPART1 eq 'Spritpreis') {
        my $spritPreis = ReadingsVal("OUT.Spritpreis", "Diesel", "");
        fhem("set teleBot send Preis: $spritPreis");
          }
  if ($EVTPART1 eq 'WohnzimmerOG') {
        if ($EVENT =~ 'boost') {
            fhem("set Thermostat desiredTemperature boost");
fhem("set teleBot send Erledigt");
           
        }
        elsif ($EVENT =~ 'auto') {
            fhem("set Thermostat desiredTemperature auto");
fhem("set teleBot send Erledigt");
             }
        elsif ($EVENT =~ 'aus') {
            fhem("set Thermostat desiredTemperature off");
fhem("set teleBot send Erledigt");
            }
     }
if ($EVTPART1 eq 'Pond') {
        if ($EVENT =~ 'Licht ein') {
            fhem("set Unterwasserlicht on");
fhem("set teleBot send Licht eingeschaltet");
           
        }
elsif ($EVENT =~ 'Licht aus') {
            fhem("set Unterwasserlicht off");
fhem("set teleBot send Licht ausgeschaltet");
           
        }

         
          }
  }



kann mir den jemand berichtigen? Ich bekomme einfach keine Antwort an die Person die die Anforderung schreibt.. Nachricht bekomme immer nur ich. Ausgefürt wird der Befehl aber.

Danke für eure Hilfe

Gruß Thomas
FHEM 5.9 - Intel NUC i3 mit Proxmox im Stretch Container
HomeMatic - VCCU mit 2 x HM-LAN-CFG
Module: SMA Peripheries - Sonos - IPCam(s) - Philips Hue - Sprinkler - TabletUI - DBlog -

viegener

Ich wiederhole mich gerne - bitte sorgt bei solchen notfies dafür, dass Euer telegrambot abgesichert ist. In solch einem Fall greift nicht die normale Absicherung! Sonst kann hier jeder Eure Heizung steuern...

Generell ist aber nicht klar, warum keine Favoriten verwendet werden?
Vorteile aus meiner Sicht:
- Es kann über Menu der richtige Befehl ausgewählt werden
- Man kann sogar entsprechende Texte vorgeben
- Einfachere Absicherung
- Einfach erweiterbar

Kein Support über PM - Anfragen gerne im Forum - Damit auch andere profitieren und helfen können

Xguide

Hallo Viegener,
Du hast ja Recht, natürlich prüfe ich bei mir noch auf eine gültige peerID!

@Thomas, etwas erweitert - die gültigen Peers müssen natürlich eingetragen werden!


teleBot:msgText.* {
    my $peer = ReadingsVal("teleBot","msgPeerId","undef");
    if (($peer == "123456789") || ($peer == "234567890") || ($peer == "345678901")) {
        if ($EVTPART1 eq 'WohnzimmerEG') {
            if ($EVENT =~ 'boost') {
                fhem("set Thermostat_Wohnzimmer_EG desiredTemperature boost");
        fhem("set teleBot message \@".$peer." Erledigt - ".$EVTPART1." set to boost");           
            }
    }
    else
   {
        fhem("set teleBot message Warnung - unknown peer tries to send messages! peerID: $peer"); 
    }
}

FHEM 5.9 - Intel NUC i3 mit Proxmox im Stretch Container
HomeMatic - VCCU mit 2 x HM-LAN-CFG
Module: SMA Peripheries - Sonos - IPCam(s) - Philips Hue - Sprinkler - TabletUI - DBlog -

geiercasi

Guten Morgen
wenn mehre Favoriten angelegt werden, ist immer nur der Letzte aktiv.

attr MyBot favorites [Test1]=set HUEDevice18 on
attr MyBot favorites [Test2]=set HUEDevice17 on
attr MyBot cmdFavorites /cmd

verhält sich wie
attr MyBot favorites set HUEDevice18 on
attr MyBot favorites set HUEDevice17 on
attr MyBot cmdFavorites /cmd


Wie macht man das denn richtig ?

Gruß und danke

amenomade

Pi 3B, Alexa, CUL868+Selbstbau 1/2λ-Dipol-Antenne, USB Optolink / Vitotronic, Debmatic und HM / HmIP Komponenten, Rademacher Duofern Jalousien, Fritz!Dect Thermostaten, Proteus

viegener

Zitat von: geiercasi am 01 Juni 2017, 10:05:10
Guten Morgen
wenn mehre Favoriten angelegt werden, ist immer nur der Letzte aktiv.

attr MyBot favorites [Test1]=set HUEDevice18 on
attr MyBot favorites [Test2]=set HUEDevice17 on
attr MyBot cmdFavorites /cmd

verhält sich wie
attr MyBot favorites set HUEDevice18 on
attr MyBot favorites set HUEDevice17 on
attr MyBot cmdFavorites /cmd


Wie macht man das denn richtig ?

Gruß und danke


Wie schon von amenomade gesagt, das ist in der commandref beschrieben.

Es ist aber ein grundsätzliches Konzept in FHEM, dass Attribute einen Wert haben. Wenn man demselben Attribut einen anderen Wert zuweist, dann ist der vorherige Wert weg. Das ist wie beim Radio, wenn man einen anderen Sender einstellt wird nur dieser gespielt (ähnliches gilt auch für Spotify)  ;)

Kein Support über PM - Anfragen gerne im Forum - Damit auch andere profitieren und helfen können

geiercasi

nach nochmaligem, aber aufmerksamen lesen, war es dann klar. Es steht ja auch extra dabei....
Multiple commands are separated by semicolon (;). This also means that only simple commands (without embedded semicolon) can be defined.
Danke euch.
Gruß

viegener

Zitat von: geiercasi am 01 Juni 2017, 22:03:32
nach nochmaligem, aber aufmerksamen lesen, war es dann klar. Es steht ja auch extra dabei....
Multiple commands are separated by semicolon (;). This also means that only simple commands (without embedded semicolon) can be defined.
Danke euch.
Gruß

Aua, das muss ich gleich korrigieren, denn ich habe vor einiger zeit auch doppelte Semikolons ermöglicht um mehrere Kommandos in einem Favoriten unterzubringen. Den Teil habe ich wohl übersehen
Kein Support über PM - Anfragen gerne im Forum - Damit auch andere profitieren und helfen können

hartenthaler

Ich hatte eben ein Problem mit 50_TelegramBot.pm line 3250
Hier der Eintrag aus dem Logfile:
2017.06.10 21:05:57 3: msg globalMsg: ID=xxx TYPE=push ROUTE=Telegram.James.Bot STATUS=OK PRIORITY=0 TITLE='' MSG='TalkToUser_Hermann 0 | | Mein Haus ... in Berlin-Frohnau:\nSomething went wrong: Modification of a read-only value attempted at ./FHEM/50_TelegramBot.pm line 3250.\n\n\nMöchtest Du wissen ... wer dort wohnt?'
Verursacht wird der Fehler reproduzierbar durch die Frage wie ist das haus vertikal gegliedert.
Der zugehörige RiveScript-Teil sieht so aus:

+ wie ist [@artikel] [haus|wohnhaus] vertikal (gegliedert|strukturiert)
@ welche etagen gibt es im haus

+ welche (etagen|geschosse|ebenen) (sind|befinden sich|gibt es) (in|im) [deinem|eurem] (haus|wohnhaus)
- Mein Haus <bot location> gliedert sich ...
^ {@ zeige mir den hausschnitt}
^ \nMöchtest Du wissen ... wer dort wohnt?

+ (@schicke) [mir] [@artikel] (schnitt|hausschnitt) [@artikel] [hauses|wohnhauses] [zu]
- Hier ist der Schnitt meines Hauses <bot location>:
^ <call>perl send_telegram AE74_West_Gliederung.jpg</call>


Die Funktion perl send_telegram verschickt eine Grafik. Der entsprechende Chat-Befehl zeige mir den hausschnitt funktioniert direkt abgesetzt einwandfrei. Im Zusammenhang mit dem Verweis {@ zeige mir den hausschnitt} scheint es zu krachen. Seltsam. So eine Konstruktion verwende ich ansonsten sehr oft.

fhem 5.8 auf RaspberryPi 3 mit HMLAN und CCU2, ZWave, JeeLink, FHZ1000 für FS20, HMS, Fritz!Box, Fritz!DECT200, Harmony, Sonos, hue, netatmo, SSCam, Wetter- und Verkehrsmodule, Chat-Bot mit RiveScript/Telegram, IFTTT, pushover, ...

viegener

@hartenthaler: Sorry bisher verstehe ich leider nur Bahnhof - hast Du ein Szenario, dass ich das reproduzieren oder zumindest nachvollziehen kann? Ich benutze kein rivescript und auch den msg-Befehle nicht.

Zeile 3250 ist das lesen von Dateien - kommt mir komisch vor zu der Meldung - ist Deine Installation aktuell?

Was passiert denn eigentlich? Es sieht so aus, als ob msg die Fehlermeldung zu versenden versucht?

Kein Support über PM - Anfragen gerne im Forum - Damit auch andere profitieren und helfen können

hartenthaler

Das mit dem nachvollziehbaren Szenario wird wohl leider schwierig. Aber vielleicht hast Du trotzdem eine Idee.
Ja, ich denke mein System ist aktuell. Version ist 50_TelegramBot.pm            14424 2017-05-30 18:11:30Z viegener

Der Code in 50_TelegramBot.pm an der fehlerhaften Stelle passt zur aufgerufenen Funktion

  3238  ######################################
  3239  #  read binary file for Phototransfer - returns undef or empty string on error
  3240  #
  3241  sub TelegramBot_BinaryFileRead($$) {
  3242    my ($hash, $fileName) = @_;
  3243
  3244    return '' if ( ! (-e $fileName) );
  3245
  3246    my $fileData = '';
  3247
  3248    open TGB_BINFILE, '<'.$fileName;
  3249    binmode TGB_BINFILE;
  3250    while (<TGB_BINFILE>){
  3251      $fileData .= $_;
  3252    }
  3253    close TGB_BINFILE;
  3254
  3255    return $fileData;
  3256  }


Meine Funktion ist

#################################################################
###  Nachrichten, Readings, Bilder, Dokumente und Plots       ###
###            per Telegram verschicken                       ###
#################################################################

# Beispiele:
# Textnachricht:                               send_telegram("Dies ist eine Nachricht.");
# Device, Reading:                             send_telegram("cv_Kalender","t_001_summary");
# Plot:                                        send_telegram("SVG_FileLog_NETATMO_CO2");
# Bild (.jpg oder .png zur direkten Ansicht):  send_telegram("picture.png");
# sonstiges Dokument (download):               send_telegram("document.pdf");
# Der erste Übergabeparameter darf maximal einen Punkt enthalten, der die Dateierweiterung abtrennt bzw. die Textnachricht abschließt.

sub send_telegram($;$) {
my ($document, $reading) = @_;
my $device = "Telegram.James.Bot";  # device name of Telegram Bot
my $path   = "./my_documents/";     # default path to documents, relative to fhem folder, e.g. /opt/fhem/my_documents/

if (defined $reading) {  # reading (first parameter = device, second parameter = reading)
   $document = ReadingsVal($document,$reading,"Error");
   fhem ("set $device message $document");
} else {  # message or plot or image or document
   my @parts = split(/\./,$document);
   if (@parts == 1) { # plot or message
     if (exists($defs{$document})) {  # plot
       $document = "{ plotAsPng('".$document."') }";
   fhem ("set $device cmdSend $document");
     } else {  # message
       fhem ("set $device message $document");
     }
   }
   else  {  # image or document
     $document = $path.$document if (!-e $document);
     if (-e $document) {
       if ($parts[1] eq "png" or $parts[1] eq "jpg") { # image
     fhem("set $device sendImage $document");
       } else { # other document
         fhem("set $device sendDocument $document");
       }
     } else {
       Log3 'send_telegram', 1, "File not found";
       return "File not found";
     }
   }
}
return undef;
}


Ich rufe meine Funktion send_telegram aus RiveScript heraus auf: send_telegram AE74_West_Gliederung.jpg
und das führt in dem Fall in meiner Funktion in der zwölftletzten Zeile zu fhem("set $device sendImage $document");

Das führt dann wohl zum Aufruf Deiner sub TelegramBot_BinaryFileRead

Die Datei AE74_West_Gliederung.jpg existiert und wenn ich die Funktion in RiveScript alleine aufrufe ("zeige mir den hausschnitt"), dann wird die Grafik im Chat korrekt angezeigt. Anders im eingebetteten Dialog: Dort gibt RiveScript erst ein paar Zeilen Text aus, veranlasst dann das Senden der Grafik und gibt dann noch eine Zeile Text aus. Und in dem Fall kommt es zur Meldung im FHEM-Logfile Something went wrong: Modification of a read-only value attempted at ./FHEM/50_TelegramBot.pm line 3250. Wenn die Zeilennummer stimmt, dann wäre das 3250    while (<TGB_BINFILE>){

Das Ergebnis ist, dass FHEM zwar noch läuft, aber der Telegram-TALKTOME-RiveScript-Chat eingefroren ist und sich nur durch einen Neustart (reboot) des raspberrypi wieder in Gang bringen lässt.

Hast Du eine Idee, was ich testen könnte um das Problem weiter einzugrenzen? Wer genau produziert die Fehlermeldung? perl? Wie gesagt, mache ich das so ähnlich an anderen Stellen auch und schiesse in einem Dialog einfach eine Grafik oder ein Dokument dazwischen.
Viele Grüße
Hermann
fhem 5.8 auf RaspberryPi 3 mit HMLAN und CCU2, ZWave, JeeLink, FHZ1000 für FS20, HMS, Fritz!Box, Fritz!DECT200, Harmony, Sonos, hue, netatmo, SSCam, Wetter- und Verkehrsmodule, Chat-Bot mit RiveScript/Telegram, IFTTT, pushover, ...

TWART016

Sorry, ich stehe derzeit ein Wenig auf dem Schlauch.

Ich möchte mir einen Wert wöchtenlich zusenden. Nur wie kann ich in mitten eines Textes ein Readingsval einbinden.

*20:00:00 {if ($wday==0 && (Value("AnzahSpeicher") ge "1")) {fhem("set Telegram msg Es sind" .ReadingsVal("AnzahlSpeicher","state",""))}}