Telegram instant messaging TelegramBot - Empfangen und Senden per FHEM

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

Vorheriges Thema - Nächstes Thema

viegener

Zitat von: SlrG am 07 Februar 2017, 13:15:43
@viegener:
Danke, dass Du es Dir angeschaut hast. Dass ein Komma nicht als Trennzeichen geeignet ist, ist doch eine wichtige Informationen. Vielen Dank dafür! Wie genau erwartet der TelegramBot eine Liste von mehreren Adressaten? Stört das Komma nicht, wenn jeweils ein @verwendet wird? Oder geht das ganz allgemein gar nicht und es muss immer ein Leerzeichen sein?

@name1,@name2, ...
oder
@name1 @name2 ...

Ich gucke mir bei Gelegenheit mal auch noch den Quellcode vom msg Modul an. Dann müsste sich herausfinden lassen, ob es die Arrays einfach nur durchreicht. Wenn ja, müssten diese erst ähnlich wie @DeeSPe es beschrieben hat vorbearbeitet werden.

@DeeSPe:
Die numerische ID habe ich auch schon probiert. Funktioniert für mich genauso wie der Name. Wenn auch jeweils nur mit einem @ und nicht mit zweien wie Loredo es empfiehlt. Aber auch die numerische ID hilft nicht, wenn msg das gar nicht auswertet und nur das Array mit den Device Namen der durchreicht.

Vielen Dank für Deine Idee das Array selbst zu bearbeiten und es erst dann an msg zu übergeben. Ich probiere das möglichst bald mal aus. Eventuell lässt sich das direkt in das msg Modul einbinden und dann braucht nicht jeder seine eigene Lösung stricken, sondern es ist für alle sofort verfügbar. U.u. ist Loredo ja bereit einen fertigen patch zu akzeptieren. Ich will ihm ja keine Arbeit machen, sondern nur, dass es funktioniert. :)

Momentan muss es ein Leerzeichen sein. Jede Variante mit weiterem Überlapp zu telegram Benutzernamen würde den Aufwand erhöhen.
Kein Support über PM - Anfragen gerne im Forum - Damit auch andere profitieren und helfen können

DeeSPe

Zitat von: DeeSPe am 07 Februar 2017, 08:47:14
my $contacts = "\@".ReadingsVal("rgr_Residents","residentsHomeDevs","");
$contacts =~ s/,/,\\@/;


Zitat von: viegener am 07 Februar 2017, 15:08:12
Momentan muss es ein Leerzeichen sein. Jede Variante mit weiterem Überlapp zu telegram Benutzernamen würde den Aufwand erhöhen.

Oh, ich dachte die kommen mit Komma aneinander!
Tja, wenn man nicht richtig/alles liest.

Dann so vielleicht:
my $contacts = "\@".ReadingsVal("rgr_Residents","residentsHomeDevs","");
$contacts =~ s/,/ \\@/;


Gruß
Dan
MAINTAINER: 22_HOMEMODE, 98_Hyperion, 98_FileLogConvert, 98_serviced

Als kleine Unterstützung für meine Programmierungen könnt ihr mir gerne einen Kaffee spendieren: https://buymeacoff.ee/DeeSPe

gloob

Hallo,

Gibt es eine Möglichkeit den Inhalt (String) eines Events welches ein Notify auslöst als Message zu verschicken?
Aktuell habe ich folgendes Notify:

define FHEMBackupTelegram notify FHEM.Backup set teleBot message "Backup Event"

Ich würde jedoch gerne den String des Events verschicken.


Okay den Event String bekomme ich jetzt mehr oder weniger. Kann ich auch den Inhalt eines Readings verschicken. Ich hätte da FHEM.Backup und dort ein Reading "info"
Raspberry Pi 3 | miniCUL 433MHz | nanoCUL 868 MHz | nanoCUL 433 MHz | MySensors WLAN Gateway | LaCrosse WLAN Gateway | SignalESP 433 MHz | SignalESP 868 MHz | HM-MOD-UART WLAN Gateway | IR - 360 Grad WLAN Gateway

Prof. Dr. Peter Henning

 ::) ::)
Da würde ich einfach mal einen Blick in die Commandref zu notify werfen ...

LG

pah

SlrG

@DeeSPe:
Vielen Dank für Deine Hilfe! So war es mir möglich, das Ganze jetzt erstmal provisorisch zu lösen, indem ich ein userReading zu meinem Residents Device hinzufüge:

attr rgr_bewohner userReadings residentsHomeContacts {\
  my $contacts = ReadingsVal('rgr_bewohner','residentsHomeDevs','');;\
  $contacts =~ s/,/ \@/g;;\
  sprintf ($contacts);;\
}

msg scheint selbst ein @ voran zu stellen, bevor es das Array an den TelegramBot durchreicht. Deshalb darf am Anfang kein @ eingefügt werden, wie Du es erst vorgeschlagen hattest, sonst gibt es eine Dopplung. Nun kann ich mit

msg @[rgr_bewohner:residentsHomeContacts] Test

eine Nachricht an alle Bewohner mit dem Status home schicken. (Weitere Voraussetzung ist, dass die Roommate Devices so heißen wie die TelegramBot Kontakte.)

Leider muss so aber für alle interessanten readings (z.B. auch residentsGoneDevs) ein entsprechendes userReading angelegt werden. Optimal wäre immer noch, wenn msg die korrekte Adressierung selbst vornehmen würde. Für mich als Python Laie, ist der Code von msg leider sehr schwer zu durchschauen.

DeeSPe

Mit meinem Vorschlag sparst Du aber noch das @ vor:
Zitatmsg @[rgr_bewohner:residentsHomeContacts] Test

Also:
msg [rgr_bewohner:residentsHomeContacts] Test

Wie es m.E. syntaktisch auch richtig wäre!
Denn das Reading soll ja für alle Kontakte das @ voran stellen und nicht erst ab dem zweiten.

Gruß
Dan
MAINTAINER: 22_HOMEMODE, 98_Hyperion, 98_FileLogConvert, 98_serviced

Als kleine Unterstützung für meine Programmierungen könnt ihr mir gerne einen Kaffee spendieren: https://buymeacoff.ee/DeeSPe

DeeSPe

Hab gerade mal selbst im Testsystem rumgespielt und würde für die vollständige msg Liste der zuhause verfügbaren RESIDENTS folgendes userReading vorschlagen:
attr <RESIDENTS> userReadings residentsTotalPresentDevsMsg:residentsTotalPresentDevs.* {my $s="\@".ReadingsVal($NAME,"residentsTotalPresentDevs","");$s=~s/,/ \@/g;$s}

Damit wäre m.E. das Reading optimal zur Weiterverwendung auch mit msg geeignet!

Gruß
Dan
MAINTAINER: 22_HOMEMODE, 98_Hyperion, 98_FileLogConvert, 98_serviced

Als kleine Unterstützung für meine Programmierungen könnt ihr mir gerne einen Kaffee spendieren: https://buymeacoff.ee/DeeSPe

zelli001

Also ich hab ehrlich lange gesucht, aber nichts gefunden was mein Problem löst...
Ich habe Telegram in Fhem eingebunden, kann auch Nachrichten empfangen und Befehle setzen.

Wie ich das nun verstanden habe muß ich die notifys mittels ActionDetector anlegen, der wir bei mir aber nicht angezeigt.

Mach ich was falsch, oder bin ich auf dem falschen Weg?

Gruß Thorsten

viegener

Zitat von: zelli001 am 09 Februar 2017, 13:10:25
Also ich hab ehrlich lange gesucht, aber nichts gefunden was mein Problem löst...
Ich habe Telegram in Fhem eingebunden, kann auch Nachrichten empfangen und Befehle setzen.

Wie ich das nun verstanden habe muß ich die notifys mittels ActionDetector anlegen, der wir bei mir aber nicht angezeigt.

Mach ich was falsch, oder bin ich auf dem falschen Weg?

Gruß Thorsten

Aus Deiner Beschreibung ist für mich nicht klar, was Du eigentlich machen willst?

Für das Empfangen von Nachrichten, Senden von Nachrichten und auch nicht für die Ausgührung von FHEM-Kommandos von Aussen ist erstmal kein Notify nötig und wie Du bei TelegramBot auf den ActionDetector kommst ist mir unklar, in diesem Thread findet sich dazu überhaupt nichts...

Also vielleicht beschreibst Du, was Du erreichen willst (so nanchvollziehbar wie möglich) und was dabei nicht funnktioniert/Dein Problem ist?
Kein Support über PM - Anfragen gerne im Forum - Damit auch andere profitieren und helfen können

zelli001

Zitat von: viegener am 09 Februar 2017, 13:27:29
Aus Deiner Beschreibung ist für mich nicht klar, was Du eigentlich machen willst?

Für das Empfangen von Nachrichten, Senden von Nachrichten und auch nicht für die Ausgührung von FHEM-Kommandos von Aussen ist erstmal kein Notify nötig und wie Du bei TelegramBot auf den ActionDetector kommst ist mir unklar, in diesem Thread findet sich dazu überhaupt nichts...

Also vielleicht beschreibst Du, was Du erreichen willst (so nanchvollziehbar wie möglich) und was dabei nicht funnktioniert/Dein Problem ist?

Ja, ich glaube ich habe da was komplett falsch verstanden....
Also ich arbeite mit Fhem jetzt erst seit ca einer woche und bin absoluter neuling.
Dennoch habe ich schon allerhand hinbekommen....

Jetzt mochte ich mir Nachrichten per Telegram aufs Handy schicken, ausgelöst durch, erst mal ganz einfach, Licht wird eingegeschaltet. Dies möchte ich dann auf dem Handy als Nachricht empfangen.

So, Telegram hab ich installiert und kommuniziert auch mit Fehm.

Jetzt hab ich in einer Viedoanleitung beispiele gesehen die ich abändern wollte und in die fhem.cf einfügen:

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

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

usw.

ich bekam dann fehlermeldungen und kam irgendwie auf den weg, das dies im ActionDetector gemacht werden müsste, den ich aber nicht fand.....

Gruß

zelli001

oder

teleBot:msgText.* {
    if ($EVTPART1 eq 'Licht') {
        if ($EVENT =~ 'an') {
            fhem("set WZ_Dekolicht on");
            fhem("set WZ_Fensterlicht on");
            fhem("set WZ_Fernsehlicht on");
        }
        elsif ($EVENT =~ 'aus') {
            fhem("set WZ_Dekolicht off");
            fhem("set WZ_Fensterlicht off");
            fhem("set WZ_Fernsehlicht off");
        }
    }
    elsif ($EVTPART1 eq 'Zocken') {
        fhem("set WZ_Receiver on");
        fhem("set WZ_TV power on");
        fhem("sleep 15 quiet");
        fhem("set WZ_TV input hdmi1");
        fhem("set WZ_Receiver input GAME");
        fhem("set WZ_Fernsehlicht on");
    }
    elsif ($EVTPART1 eq 'FireTV') {
        fhem("set WZ_Receiver on");
        fhem("set WZ_TV power on");
        fhem("sleep 15 quiet");
        fhem("set WZ_TV input hdmi1");
        fhem("set WZ_Receiver input DVD");
        fhem("set WZ_Fernsehlicht on");
    }
    elsif ($EVTPART1 eq 'Nacht') {
        fhem("set WZ_Dekolicht off");
        fhem("set WZ_Fensterlicht off");
        fhem("set WZ_Fernsehlicht off");
        fhem("set WZ_Receiver off");
        fhem("set WZ_TV power off");
    }
    elsif ($EVTPART1 eq 'Status') {
        my $temperature = ReadingsVal("WZ_Balkontuer", "temperature", "");
        fhem("set $NAME send Temperatur: $temperature");
    }
    elsif ($EVTPART1 eq 'Spritpreis') {
        my $spritPreis = ReadingsVal("OUT_Tankstelle", "SuperE5", "");
        fhem("set WEB_Telegram send Preis: $spritPreis");
    }
    else {

    }
}


viegener

@zelli001: Ich denke Du fängst mit zu komplexen Dingen an. Routinen in myutils oder ähnliches ist eigentlich nicht erforderlich um Nachrichten bei Licht eingeschaltet zu senden.

Generell solltest Du wohl Dich mit dem Konzept der Events (Event Monitor) und notify befassen. Du findest viele Beispiele in diesem Thread (und wohl auch im fhemwiki) wie man auf Änderungen mit notify (oder DOIF reagiert)

Im einfachsten Fall ist das soetwas wie


define LeuchteAn notify Leuchte:on set teleBot message Die Leuchte wurde eingeschaltet


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

viegener

Zitat von: zelli001 am 09 Februar 2017, 13:54:39
oder

teleBot:msgText.* {
    if ($EVTPART1 eq 'Licht') {
        if ($EVENT =~ 'an') {


Bitte verwende Code-tags !

Der Code hat nichts mit Deinem Problem zu tun, sondern ist genau das Gegenteil (von aussen per Telegram etwas auslösen)
Kein Support über PM - Anfragen gerne im Forum - Damit auch andere profitieren und helfen können

zelli001

ja, das waren auch nur beispiele die ich enorm gekürzt habe...
ich bin ja auch noch im versuchsstadium....

aber wie reagiere ich auf einen befehl von telegram mit dem ich was auslösen möchte?


viegener

Zitat von: zelli001 am 09 Februar 2017, 14:04:29
ja, das waren auch nur beispiele die ich enorm gekürzt habe...
ich bin ja auch noch im versuchsstadium....

aber wie reagiere ich auf einen befehl von telegram mit dem ich was auslösen möchte?

Die erste Reaktion wäre zu lesen was schon geschrieben wurde  ;)

Nicht falsch verstehen, aber es gibt Beispiele im Wiki und hier, wie man so etwas macht. Wenn es dazu eine konkrete Frage gibt kann ich gerne helfen. Aber Deine generelle Frage ist im wiki, commandref und hier im Forum beantwortet worden. Ausserdem ist dies genau das Gegenteil von dem was Du oben machen wolltest.

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