Hallo,
ich habe vor langer Zeit Telegram zum Versenden von Nachrichten eingebaut. Funktioniert sehr gut. Später kam die Idee auf, dass Fhem mir auf Anfrage Statusnachrichten senden soll.
Dieses funktioniert auch mit einer Einschränkung, dass ich nur mit dem Bot anschreiben kann und er auch die Antwort erhält. Wümschenswert ist, dass jeder zugelassene Chatpartner / Gruppe die Anfrage senden kann und auch die Antwort erhält.
Kann mir jemand mitteilen, ob und wie das geht.
Danke Euch.
Ich versteh ja nicht so ganz woran es bei dir hapert!?
Du kannst beim Senden angeben wer die Nachricht erhalten soll...
...du siehst an eingehenden Nachrichten von wem sie gekommen ist...
Damit kannst du doch alles machen!?
Was nicht geht: Bot zu Bot...
Schon Wiki gelesen: https://wiki.fhem.de/wiki/TelegramBot
Auch die weiterführenden Links unten!?
Z.B. Message-Dialog etc.
Oder chat-bot: https://forum.fhem.de/index.php?topic=51425.0
Wenn dann noch was unklar ist...
...oder irgendwas nicht geht: einfach im Telegram-Thread fragen...
Gruß, Joachim
Hallo Beetle2003,
das sollte auf jeden Fall funktionieren. Du musst NUR die PeerIDs freigeben. Ich schlage dir vor lies dir das mal bitte im Wiki durch. Vielleicht kannst du mir noch einen kurzes Feedback geben, was du nicht verstehst, weil ich möchte sowieso das Wiki noch ein bisschen überarbeiten dann kann ich das gleich mit einfließen lassen.
https://wiki.fhem.de/wiki/TelegramBot
Gruß Meck
Hi,
der Bot kann, zumindest ist das mein Stand, einen neuen Kontakt erst anschreiben wenn dieser im zuerst eine Nachricht geschrieben hat.
Also alle gewünschten Kontakte in eine Gruppe und den Bot dazu. Dann schreiben die neuen Kontakte dem Bot.
Nun ist der Chat möglich und du hast die ID zu jedem Kontakt auch in FHEM, wichtig für die Antwort.
Auch in der Gruppe kannst was schreiben, dann hast auch die Gruppe in FHEM und der Bot kann Nachrichten an alle auch in diesem Gruppe schicken anstatt jedem einzeln.
Zitat von: Meck am 05 August 2019, 17:37:44
Hallo Beetle2003,
das sollte auf jeden Fall funktionieren. Du musst NUR die PeerIDs freigeben. Ich schlage dir vor lies dir das mal bitte im Wiki durch. Vielleicht kannst du mir noch einen kurzes Feedback geben, was du nicht verstehst, weil ich möchte sowieso das Wiki noch ein bisschen überarbeiten dann kann ich das gleich mit einfließen lassen.
https://wiki.fhem.de/wiki/TelegramBot
Gruß Meck
Hallo Meck,
danke für Deine Rückmeldung.
Anbei ein Beispiel:
define Telegram_notify notify TeleBot:msgText.* {\
if ($EVTPART1 eq 'Status') {\
if ($EVENT =~ 'Speedtest') {\
my $ChatId = ReadingsVal("TeleBot", "msgChatId", "");;\
fhem("set $NAME send \@$ChatId Status des DSL Anschlusses: \n");;\
fhem("set $NAME cmdSend \@$ChatId { plotAsPng('SVG_FileLog_Speedtest')};");;\
}\
}\
}
Ich sende aus Telegram eine Nachricht mit dem Inhalt Status Speedtest
Wenn ich diesen aus dem Bot sende kommt zurück:
Status des DSL Anschlusses:
[Plot des Speedtest]
Sende ich die gleiche Befehlsfolge aus einem Kontakt, welcher auch im TeleBot unter Contacts hinterlegt ist, erhalte ich keine Antwort.
Ich hatte es so verstanden, dass wenn ich das Reading msgChatId auslese und wieder in der Zeile zum versenden der der Nachricht hinterlege, dieser Kontakt auch die Antwort erhält.
Ich hoffe Du hast mich verstanden. Wenn nicht, gebe mir einen Hinweis, da ich dieses gerne klären würde und ggf es auch anderen helfen kann.
Danke
Nachtrag:
Der TeleBot reagiert auf keine Anfrage ausser auf den des Bot.
Alle anderen Anfragen scheinen erst gar nicht anzukommen.
Weshalb???
Nicht msgChatId sondern msgPeerId...
...denke ich.
Anhand der kannst du auch prüfen (bevor du etwas tust), ob die Nachricht auch von "jemandem" gekommen ist, der "darf"...
EDIT: verm. funktioniert es in dem Fall, weil "du" der default Peer bist!?
Kurz da nur Handy...
Gruđ, Joachim
Zitat von: MadMax-FHEM am 05 August 2019, 23:02:53
Nicht msgChatId sondern msgPeerId...
...denke ich.
Anhand der kannst du auch prüfen (bevor du etwas tust), ob die Nachricht auch von "jemandem" gekommen ist, der "darf"...
EDIT: verm. funktioniert es in dem Fall, weil "du" der default Peer bist!?
Kurz da nur Handy...
Gruđ, Joachim
Hallo Mad-Max,
so wie ich das sehe hat die msgChatId den gleichen Inhalt die msgPeerId
Ist mir noch nicht aufgefallen aber ist bei mir auch so...
Hmmm...
Hab das irgendwann mal aus dem "chatBot-Thread" (glaub ich) übernommen...
Hab allerdings keine Gruppen oder mehrere Kontakte, daher kann ich das auch nicht testen...
Ist es auch immer gleich, selbst wenn andere schreiben!?
EDIT: allerdings wenn ich nachlese, dann ist schon eher msgPeerId "richtig"...
Zitat von: device specific help
msgPeerId <text>
The sender id of the last received message
msgChatId <ID>
The id of the chat of the last message, if not identical to the private peer chat then this value will be the peer id
Sorry, Joachim
Hi.
Ich hab das so bei mir im Einsatz: Botti ist Mitglied in meiner Gruppe. Jeder Berechtigte der Gruppe darf commands absetzen und die Response geht in die Gruppe.
Commands werden in TG eingeleitet mit einem Slash, damit der Bot weiß, daß er gemeint ist: /gogo gadget set blabla on
Meine Attr
allowUnknownContacts 0
cmdKeyword /gogo gadget
cmdRestrictedPeer -GruppenID_hier_rein und ALLE PeerID, welche erlaubt sein sollen (Gruppe erlaubt nicht implizit alle Mitglieder, Leerzeichen getrennt)
defaultPeer -GruppenID_hier_rein
defaultPeerCopy 0
pollingTimeout 20
textResponseResult FHEM an $peer :\n Befehl "$cmd" erhalten\n Ergebnis: $result
textResponseUnauthorized nope!
Das Attr allowUnknownContacts hatte ich solange auf 1, bis ich alle nötigen PeerID kannte und unter cmdRestrictedPeer abgespeichert hatte. Erst danach auf 0.
Vielleicht hilft das ein wenig :)
Viele Grüße
rob
Zitat von: rob am 07 August 2019, 21:32:54
Hi.
Ich hab das so bei mir im Einsatz: Botti ist Mitglied in meiner Gruppe. Jeder Berechtigte der Gruppe darf commands absetzen und die Response geht in die Gruppe.
Commands werden in TG eingeleitet mit einem Slash, damit der Bot weiß, daß er gemeint ist: /gogo gadget set blabla on
Meine Attr
allowUnknownContacts 0
cmdKeyword /gogo gadget
cmdRestrictedPeer -GruppenID_hier_rein und ALLE PeerID, welche erlaubt sein sollen (Gruppe erlaubt nicht implizit alle Mitglieder, Leerzeichen getrennt)
defaultPeer -GruppenID_hier_rein
defaultPeerCopy 0
pollingTimeout 20
textResponseResult FHEM an $peer :\n Befehl "$cmd" erhalten\n Ergebnis: $result
textResponseUnauthorized nope!
Das Attr allowUnknownContacts hatte ich solange auf 1, bis ich alle nötigen PeerID kannte und unter cmdRestrictedPeer abgespeichert hatte. Erst danach auf 0.
Vielleicht hilft das ein wenig :)
Viele Grüße
rob
Danke für die Hinweise.
Es hat keine Verbesserung gebracht. Aus dem Bot heraus kann ich eine Anfrage senden und erhalte eine Antwort in dem Bot mit dem Ergebnis der Anfrage.
Sende ich die gleiche Anfrage aus einer Gruppe z.B. Netzwerk, so erhalte ich keine Antwort. In dem Reading Contacts ist die Gruppe hinterlegt.
Zitat von: Beetle2003 am 08 August 2019, 00:06:09
In dem Reading Contacts ist die Gruppe hinterlegt.
Und auch die anderen PeerIDs? Unten hast Du glaub ich geschrieben, dass Du in Contacts mehr stehen hast. Sonst wäre es zu wenig, weil jeder Peer aus der Gruppe heraus den Bot bereits angeschrieben haben sollte und die alle unter Contacts erscheinen sollten (siehe Posts von Meck u.CBSnake).
Die IDs könntest Du später in die Liste unter
cmdRestrictedPeer rein nehmen.
Zitat von: Beetle2003 am 05 August 2019, 22:54:04
Der TeleBot reagiert auf keine Anfrage ausser auf den des Bot.
Alle anderen Anfragen scheinen erst gar nicht anzukommen.
Weshalb???
Steht unter
defaultPeer Deine GruppenID von z.B. Netwerk?
Hast Du
cmdRestrictedPeer und
allowUnknownContacts gesetzt? Wenn ja, nimm es zum Test raus (IDs merken, Attr löschen), sodass zunächst jeder was senden kann.
Dann in TG von jedem Mitglied in "Netzwerk" was senden lassen (z.B. Hallo, keine commands). Test am besten ohne Scripts und Notify.
Wenn alles klappt -> PeerIDs erfassen und alle PeerID + GruppenID in
cmdRestrictedPeer rein und
allowUnknownContacts=0 setzen.
Ich würde dann schrittweise Notify und Scripts drauf aufbauen. Wenn was nicht klappt, wüsst man an welcher Stelle. Naja, so die Theorie ;D
Viele Grüße
rob
vielleicht postest du einfach mal ein list....
so raten hier alle nur rum...
Zitat von: Beetle2003 am 08 August 2019, 00:06:09
Aus dem Bot heraus kann ich eine Anfrage senden und erhalte eine Antwort in dem Bot mit dem Ergebnis der Anfrage.
ich verstehe schon nicht was du immer mit "aus dem Bot" und "in den Bot" meinst.
Wer kommuniziert da mit wem??
Zitat von: rob am 08 August 2019, 11:53:13
Und auch die anderen PeerIDs? Unten hast Du glaub ich geschrieben, dass Du in Contacts mehr stehen hast. Sonst wäre es zu wenig, weil jeder Peer aus der Gruppe heraus den Bot bereits angeschrieben haben sollte und die alle unter Contacts erscheinen sollten (siehe Posts von Meck u.CBSnake).
Die IDs könntest Du später in die Liste unter cmdRestrictedPeer rein nehmen.
Steht unter defaultPeer Deine GruppenID von z.B. Netwerk?
Hast Du cmdRestrictedPeer und allowUnknownContacts gesetzt? Wenn ja, nimm es zum Test raus (IDs merken, Attr löschen), sodass zunächst jeder was senden kann.
Dann in TG von jedem Mitglied in "Netzwerk" was senden lassen (z.B. Hallo, keine commands). Test am besten ohne Scripts und Notify.
Wenn alles klappt -> PeerIDs erfassen und alle PeerID + GruppenID in cmdRestrictedPeer rein und allowUnknownContacts=0 setzen.
Ich würde dann schrittweise Notify und Scripts drauf aufbauen. Wenn was nicht klappt, wüsst man an welcher Stelle. Naja, so die Theorie ;D
Viele Grüße
rob
Hallo rob,
ich habe weiter getestet.
Wenn ich in die Telegram Gruppen den Bot als Admin hinzufüge, dann funktioniert es.
Kannst du mir das erklären?
Danke
Heyho
ich habe damals(tm) basierend auf diesem BlogPost (https://waschto.eu/telegrambot-kommuniziere-mit-deiner-fhem-installation/#Status_von_Devices_abrufen) in 99_myUtils.pm folgende Sub eingebaut:
sub Telegram($$$) {
my ($TelegramDevice, $msgText, $msgPeerId) = @_;
##split message for first word
my $Nachricht = ReadingsVal($TelegramDevice,$msgText,"0");
my @array = split(/ /,$Nachricht);
##get peerid
my $peer = ReadingsVal($TelegramDevice,$msgPeerId,"0");
my $command = "set ".$TelegramDevice." message ";
$command .= "@".$peer." ";
if($array[0] eq "Temps")
{
##Temp-Sensoren
my $Temps = "bla: ";
$Temps .= ReadingsVal("BspDevice","BspReading","-");
##[ ........ ]
$command .= $Temps;
fhem($command);
}
elsif($array[0] eq "Keywort")
{
##[......]
}
}
Das ganze wird durch ein notify aufgerufen:
defmod TelegramNotify notify TELEGRAMDEVICE:msgText:.* {Telegram("TELEGRAMDEVICE","msgText","msgPeerId")}
Empfängt der Bot eines der Keywörter, wird es auch an den Sender zurückgesendet. Ist das Keywort nicht bekannt, passiert nichts - auch keine Rückmeldung.
Natürlich sind im TelegramBot-Device cmdRestrictedPeer sowie allowUnknownContacts = 0gesetzt. Das cmd Keywort (https://fhem.de/commandref.html#TelegramBot) ist auch kein Teil der Sub-Keywörter.
Guten Morgen,
danke für die vielen Anregungen zur Fehlersuche.
Nun habe ich festgestellt, dass wenn ich den Bot in den Gruppen zum Admin mache, funktioniert es.
Ist jemandem bekannt, ob das so muss oder kann dieses auch auf anderem Wege erreicht werden?
Zitat von: Beetle2003 am 08 August 2019, 18:42:07
Kannst du mir das erklären?
Nein, leider nicht. Ich kann nur raten, würde aber die FHEM-Seite ausschließen.
Hab mal in meine Gruppe geglotzt -> bei mir ist der Bot definitiv kein Admin.
Einzige Einstellung fürn Bot "Mitteilungen An/Aus" und ist bei mir An.
Ich nutze TG für Android v5.9.0 - falls das einen Unterschied macht (TG gibts auch via F-Droid oder App Store f. iOS).
Beim BotFather hab ich /setuserpic und den Namen gesetzt. Es gibt versch. Set-Options fürn Bot - hast Du da mehr gesetzt (setcommands oder setinline oder so)?
Viele Grüße
rob