Telegram instant messaging TelegramBot - Empfangen und Senden per FHEM

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

Vorheriges Thema - Nächstes Thema

Ruggy

Habe an einen zweiten FHEM TelegramBot eingerichte. Hier funktioniert es aber nicht.
Wenn ich z.B. die Nachricht "Test" über FHEM schicke, kommt folgende Fehlermeldung:

2024.11.15 11:41:49 3: TelegramBot_Callback teleBot: resulted in Callback returned error :Not Found: from SendIt
2024.11.15 11:41:49 3: TelegramBot_Callback teleBot: Reached max retries (ret: Callback returned error :Not Found:) for msg Karsten : test

Was habe ich hier falsch eingerichtet?

swsmily

Zitat von: Ruggy am 15 November 2024, 12:09:57Habe an einen zweiten FHEM TelegramBot eingerichte. Hier funktioniert es aber nicht.
Wenn ich z.B. die Nachricht "Test" über FHEM schicke, kommt folgende Fehlermeldung:

2024.11.15 11:41:49 3: TelegramBot_Callback teleBot: resulted in Callback returned error :Not Found: from SendIt
2024.11.15 11:41:49 3: TelegramBot_Callback teleBot: Reached max retries (ret: Callback returned error :Not Found:) for msg Karsten : test

Was habe ich hier falsch eingerichtet?

Hast du an den Bot erstmalig ne Nachricht vom Handy aus geschickt? Mit Attribut allowUnknownContacts auf 1 ?

bertl

Liebe Telegram-Community,

ich habe folgenden Schönheitsfehler im Log-File.

Wenn ich von meinem Handy einen Favoriten-Befehl absetze, funktioniert dieser einwandfrei.
Wenn meine Frau den gleichen Favoriten-Befehl absetzt, funktioniert dieser zwar, aber es kommt folgende Fehlermeldung im Log-File.
2025.06.30 08:34:49 3: TelegramBot Telegram: Found from id in message - id : Iris_ID
2025.06.30 08:34:52 3: TelegramBot Telegram: Found from id in callback - id : Iris_ID
2025.06.30 08:34:52 1: di_MQTT2_Worx_M700_Party_toggle: Der paryMode von MQTT2_Worx_M700 wird AUS-geschaltet.
2025.06.30 08:34:52 3: MQTT2_DEVICE set MQTT2_Worx_M700 partyMode off
2025.06.30 08:34:53 3: TelegramBot_Callback Telegram: resulted in Callback returned error :Bad Request: message to edit not found: from SendIt
2025.06.30 08:34:53 3: TelegramBot_Callback Telegram: No retry for (ret: Callback returned error :Bad Request: message to edit not found:) for msg Robert_ID : TelegramBot FHEM - Iris_Nachname Befehl:set di_MQTT2_Worx_M700_Party_toggle on: - Ergebnis:\nOK

Mir ist aufgefallen, dass bei der Fehlermeldung auf einmal meine ID (Robert_ID) angeführt wird und nicht die meiner Frau (Iris_ID).

Manchmal kommt auch noch folgende Warnung hinzu:
PERL WARNING: Use of uninitialized value $finalcontent in concatenation (.) or string at ./FHEM/50_TelegramBot.pm line 2061.
Hier das List vom Device:
Internals:
   FAILS      0
   FUUID      5c474f95-f33f-3e1e-ee2e-d3913fb58f5d4ee6
   FVERSION   50_TelegramBot.pm:?-s27218/2023-02-13
   NAME       Telegram
   NR         133
   OLD_POLLING 53
   POLLING    53
   SNAME      Telegram
   STATE      Polling
   TYPE       TelegramBot
   UPDATER    0
   WAIT       0
   eventCount 186
   me         meID:FHEM:@FHEM_bot
   offset_id  860900081
   sentLastResult Callback returned error :Bad Request: message to edit not found:
   sentMsgId 
   sentMsgOptions
   sentMsgPeer Robert_Nachname
   sentMsgPeerId Robert_ID
   sentMsgResult Callback returned error :Bad Request: message to edit not found:
   sentMsgText TelegramBot FHEM - Iris_Nachname Befehl:set di_MQTT2_Worx_M700_Party_toggle on: - Ergebnis:\nOK
   sourceVersion $Id: 50_TelegramBot.pm 27218 2023-02-13 22:45:48Z viegener $
   AliasCmds:
   Contacts:
     Iris_ID  Iris_ID:Iris_Nachname:@Iris_Nachname
     Robert_ID  Robert_ID:Robert_Nachname:@Robert_Nachname
   HU_DO_PARAMS:
     NAME       
     addr       https://api.telegram.org:443
     auth       0
     boundary   TelegramBot_boundary-x0123
     buf       
     code       400
     compress   1
     conn       
     data       
     displayurl <hidden>
     header     agent: TelegramBot/1.0
User-Agent: TelegramBot/1.0
Accept: application/json
Accept-Charset: utf-8
Content-Type: multipart/form-data; boundary=TelegramBot_boundary-x0123
     hideurl    1
     host       api.telegram.org
     httpheader HTTP/1.1 400 Bad Request
Server: nginx/1.18.0
Date: Mon, 30 Jun 2025 06:34:53 GMT
Content-Type: application/json
Content-Length: 84
Connection: close
Strict-Transport-Security: max-age=31536000; includeSubDomains; preload
Access-Control-Allow-Origin: *
Access-Control-Expose-Headers: Content-Length,Content-Type,Date,Server,Connection
     hu_blocking 0
     hu_filecount 95
     hu_port    443
     hu_portSfx
     loglevel   4
     method     POST
     path       /botTelegram:ID/editMessageText
     protocol   https
     redirects  0
     timeout    30
     url        https://api.telegram.org/botTelegram:ID/editMessageText
     args:
       Robert_ID
       TelegramBot FHEM - Iris_Nachname Befehl:set di_MQTT2_Worx_M700_Party_toggle on: - Ergebnis:\nOK
       undef
       10
       undef
       
       2
     hash:
     sslargs:
   HU_UPD_PARAMS:
     FD         25
     NAME       
     addr       https://api.telegram.org:443
     auth       0
     buf       
     code       200
     compress   1
     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
     hu_blocking 0
     hu_filecount 5152
     hu_inProgress  TelegramBot_UpdatePoll:2434 TelegramBot_Callback:756 __ANON__:786
     hu_port    443
     hu_portSfx
     isPolling  update
     loglevel   4
     method     GET
     offset     860900081
     path       /botTelegram:ID/getUpdates?offset=860900081&limit=5&timeout=120
     protocol   https
     redirects  0
     timeout    245
     url        https://api.telegram.org/botTelegram:ID/getUpdates?offset=860900081&limit=5&timeout=120
     hash:
     sslargs:
   READINGS:
     2025-06-30 08:34:52   Contacts        Robert_ID:Robert_Nachname:@Robert_Nachname Iris_ID:Iris_Nachname:@Iris_Nachname
     2025-06-30 00:00:16   PollingErrCount 0
     2025-06-24 03:10:54   PollingLastError Callback returned error :Bad Gateway:
     2025-06-20 11:12:28   StoredCommands  FHEM set modemIP reread
FHEM set modemIP_2 reread
doit set modemIP_2 reread
doit set externeIP_2 reread
doit set di_MQTT2_Worx_M700_Telegram on

     2025-06-30 08:34:49   msgChat         Iris_Nachname
     2025-06-30 08:34:49   msgChatId       Iris_ID
     2025-06-30 08:34:49   msgDate         2025-06-30 08:34:49
     2025-06-30 08:34:49   msgFileId       
     2025-06-30 08:34:49   msgId           22139
     2025-06-30 08:34:49   msgPeer         Iris_Nachname
     2025-06-30 08:34:49   msgPeerId       Iris_ID
     2025-06-30 08:34:49   msgReplyMsgId   
     2025-06-30 08:34:49   msgText         /cmd
     2025-06-30 08:34:49   prevMsgChat     Robert_Nachname
     2025-06-30 08:34:49   prevMsgDate     2025-06-30 07:08:21
     2025-06-30 08:34:49   prevMsgFileId   
     2025-06-30 08:34:49   prevMsgId       22135
     2025-06-30 08:34:49   prevMsgPeer     Robert_Nachname
     2025-06-30 08:34:49   prevMsgPeerId   Robert_ID
     2025-06-30 08:34:49   prevMsgReplyMsgId
     2025-06-30 08:34:49   prevMsgText     /cmd
     2025-06-30 08:34:52   queryData       TBOT_FAVORITE_15
     2025-06-30 08:34:52   queryID         2437956958977765251
     2025-06-30 08:34:52   queryPeer       Iris_Nachname
     2025-06-30 08:34:52   queryPeerId     Iris_ID
     2025-06-30 08:34:52   queryReplyMsgId 22140
     2025-06-30 08:34:53   sentMsgId       
     2025-06-30 08:34:53   sentMsgPeerId   Robert_ID
     2025-06-30 08:34:53   sentMsgResult   Callback returned error :Bad Request: message to edit not found:
   inlinechats:
   sentQueue:
Attributes:
   allowUnknownContacts 0
   cmdFavorites /cmd
   cmdKeyword doit
   cmdRestrictedPeer Robert_ID Iris_ID
   defaultPeer Robert_Nachname
   favorites  /[-ModemIP]=set modemIP reread;
/[-Alarmanlage (toggle)]=set di_Alarmanlage_SS_A_toggle on;
/[-Rolladen-Nord auf]=set Rolladen_Nord up;
/[-Rolladen-Sued auf]=set Rolladen_Sued up;
/[-Rolladen-Nord stop]=set Rolladen_Nord stop;
/[-Rolladen-Sued stop]=set Rolladen_Sued stop;
/[-Rolladen-Nord zu]=set Rolladen_Nord down;
/[-Rolladen-Sued zu]=set Rolladen_Sued down;
/[-Lamellen-Sued auf-100]=set Rolladen_Sued_Lamellen open100;
/[-Lamellen-Sued auf-60]=set Rolladen_Sued_Lamellen open60;
/[-Lamellen-Sued auf-30]=set Rolladen_Sued_Lamellen open30;
/[-Lamellen-Sued zu]=set Rolladen_Sued_Lamellen close;
/[-PV-Aktuell]=set di_mdbsWRgetAkt_Telegram on;
/[-PV-Tag]=set di_mdbsWRgetTag_Telegram on;
/[-Worx-Party (toggle)]=set di_MQTT2_Worx_M700_Party_toggle on;
/[-X-Mas-Light (toggle)]=set xmaslight_FS20 toggle;
/[-Pi-Hole (toggle)]=set di_PiHole_toggle on;
/[-WLAN (toggle)]=set di_FB_WIFI_toggle on;
/[-Gaeste-WLAN (toggle)]=set di_FB_gWIFI_toggle on;
/[-Fritzbox reboot]=set di_FB_reboot on;
/[-WLAN-Profile (toggle)]=set ProfileJakob_Lock toggle;
/[-WLAN-Jakob-Lap (toggle)]=set NotebookJakob_Lock toggle;
/[-WLAN-Jakob-Mob (toggle)]=set HandyJakob_Lock toggle;
/[-Wohnz.SAT (toggle)]=set rc_strong_receiver 404050AF;
/[-Wohnz.TV (toggle)]=set rc_sony_tv A90;
/[-Fernbedienung (toggle)]=set ir_fernbedienung_checken toggle;
/[-Kamera-Bild zeigen]=trigger Tuer_Glocke on;
   favorites2Col 1
   favoritesInline 1
   icon       telegram
   parseModeSend 2_HTML
   pollingTimeout 120
   room       system
   verbose    3

Danke für eure Unterstützung
Robert

Maista

Hallo Robert,

kann Dir nicht helfen aber Du solltest die Kontakt-IDs/Namen aus deinem Post löschen!
Nachtrag: Auch weitere IDs (im Feld z.B. URL , PATH) die auf deinen BOT hinweisen solltest Du löschen.

Gruss Gerd

Prof. Dr. Peter Henning

@Viegener:

Ich habe eine kleine Bitte: Beim Versenden von Medien (z.B. Audiodateien) möchte ich gerne ebenfalls eine caption mitgeben dürfen, so wie das schon bei Image/Photo der Fall ist.

LG

pah

wowogiengen

Hallo,
ich habe folgendes DOIF:

define teleBotRestartPi DOIF ([teleBot:msgText] eq "mach neu") (set teleBot _msg @xxxxxxxxx @xxxxxxxxxx Mach ich;;shutdown restart;;)
attr teleBotRestartPi .* 1
attr teleBotRestartPi do always
attr teleBotRestartPi room Büro,System
#   DEF        ([teleBot:msgText] eq "mach neu") (set teleBot _msg @xxxxxxxxxx @xxxxxxxxxx Mach ich;shutdown restart;)
#   FUUID      5ce84ec0-f33f-a625-3d24-5e9478ceab654dec
#   MODEL      FHEM
#   NAME       teleBotRestartPi
#   NOTIFYDEV  global,teleBot
#   NR         96
#   NTFY_ORDER 50-teleBotRestartPi
#   STATE      initialized
#   TYPE       DOIF
#   VERSION    29460 2024-12-29 20:25:48
#   eventCount 1
#   READINGS:
#     2025-08-14 09:41:46   cmd             0
#     2025-08-14 09:41:46   mode            enabled
#     2025-08-14 09:41:46   state           initialized
#   Regex:
#     accu:
#     bar:
#     barAvg:
#     collect:
#     cond:
#       teleBot:
#         0:
#           msgText    ^teleBot$:^msgText:
#   condition:
#     0          ::ReadingValDoIf($hash,'teleBot','msgText') eq "mach neu"
#   do:
#     0:
#       0          set teleBot _msg @xxxxxxxxxx @xxxxxxxxxx Mach ich;shutdown restart;
#     1:
#   helper:
#     NOTIFYDEV  global,teleBot
#     globalinit 1
#     last_timer 0
#     sleeptimer -1
#   readings:
#     all         teleBot:msgText
#   uiState:
#   uiTable:
#
setstate teleBotRestartPi initialized
setstate teleBotRestartPi 2025-08-14 09:41:46 cmd 0
setstate teleBotRestartPi 2025-08-14 09:41:46 mode enabled
setstate teleBotRestartPi 2025-08-14 09:41:46 state initialized


Das funktioniert wie gewünscht.

Jetzt hat sich meine bessere Hälfte darüber beschwert, dass sie nur das "Mach ich" sieht, aber nicht, dass ich "mach neu" eingegeben habe...
Ist ja klar, da der Empfänger in dem Fall nur der telebot ist, und dieser sendet die Antwort an beide Teilnehmer.

Kann man eine Nachricht verschicken, die aussagt, dass der eine Teilnehmer das "Mach neu" an den Bot gesendet hat,
so ungefähr:

Wolfgang sagt 'Mach Neu' - Mach ich...
Dabei ist Wolfgang der Name des Peers, der die ursprüngliche Nachricht gesendet hat.

D.h. ich müsste das Reading "msgPeer" in die Nachricht einbetten, ebenso "msgText"...

Wie geht das?


flummy1978

Hai,

ich weiss nicht ob und wenn ja wieviel Programmierkenntnisse Du hast, aber wenn diese sich eher bei NULL bewegen, dann wäre das Beste 2 DOIFs zu erstellen.

Bei dem einen heisst es "Restart" -> Antwort ich starte den raspberry neu
Bei dem anderen heisst es "Neustart" -> Antwort ich starte den raspberry neu

Zitat von: wowogiengen am 14 August 2025, 09:53:53D.h. ich müsste das Reading "msgPeer" in die Nachricht einbetten, ebenso "msgText"...

Wie geht das?

Bei ensprechenden Programmierkenntnissen, kann man das Ganze in myUtils verpacken und entsprechend ausschmücken. Ich hab mir dafür eine Art Chatbot gebaut, mit dem ich mich unterhalte und einige Sachen (wie Neustart Waschmaschinenmeldungen usw an meine Frau und mich gehen)

VG
Andreas

p.s. Falls noch nicht erledigt:
Ich würde DRINGEND empfehlen, auch eine Abfrage bezüglich der ID zu machen (dass nicht jeder Hans und Franz Dir einen Neustart oder schlimmeres auslösen kann)
und außerdem im Telegrambot vermerken, WER überhaupt mit dem Bot quatschen darf. Siehe auch TelegramBot Wiki

wowogiengen

Hallo Flummy,

ist das nicht ein bisschen Overkill für das, was ich vorhabe?
Ich möchte ja nur, dass das DOIF ein Reading aus dem telegram-Device nimmt, und dieses dann
in die zu sendende Nachricht einbaut...
Hier mal das stark gekürzte Listing des telegram-Devices
   READINGS:
     2025-08-14 09:48:50   Contacts        #######################
     2025-08-14 00:00:01   PollingErrCount 0
     2025-08-11 17:21:08   PollingLastError NonBlockingGet timed out on read from <hidden> after 15s
     2025-08-09 20:09:20   StoredCommands  ok\n
     2025-08-14 09:48:50   msgChat         ########
     2025-08-14 09:48:50   msgChatId       ##########
     2025-08-14 09:48:50   msgDate         2025-08-14 09:48:50
     2025-08-14 09:48:50   msgFileId       
     2025-08-14 09:48:50   msgId           22360
     2025-08-14 09:48:50   msgPeer         ##########
     2025-08-14 09:48:50   msgPeerId       ##########
     2025-08-14 09:48:50   msgReplyMsgId   
     [b]2025-08-14 09:48:50   msgText         mach neu[/b]
     2025-08-14 09:48:50   prevMsgChat     ##########
     2025-08-14 09:48:50   prevMsgDate     2025-08-14 09:47:38
     2025-08-14 09:48:50   prevMsgFileId   
     2025-08-14 09:48:50   prevMsgId       22353
     2025-08-14 09:48:50   prevMsgPeer     ##########
     2025-08-14 09:48:50   prevMsgPeerId   ##########
     2025-08-14 09:48:50   prevMsgReplyMsgId
     2025-08-14 09:48:50   prevMsgText     mach neu
     2025-08-14 10:15:24   sentMsgId       22368
     2025-08-14 10:15:24   sentMsgPeerId   ##########
     2025-08-14 10:15:24   sentMsgResult   SUCCESS

Da steht die Information ja drin msgPeer, msgPeerId, msgText - die will ich im DOIF verarbeiten und in die Nachricht einbauen.


flummy1978

Aaaahhh ich glaube jetzt habe ich es richtig verstanden (vorhin war es ein Missverständniss)

Dummerweise kann ich Dir im DOIF nicht weiterhelfen - grundsätzlich kannst Du aber ziemlich sicher das Reading mit verwenden - nur kenne ich mich mit DOIFs gar nicht aus. Ich schätze es KÖNNTE so in etwa verwenden werden:
DEF        ([teleBot:msgText] eq "mach neu") (set teleBot _msg @xxxxxxxxxx @xxxxxxxxxx  Mach ich ausgelöst von [teleBot:prevMsgChat] mit [teleBot:prevMsgText];shutdown restart;)

Aber absolut ohne Gewähr, weil ich mich mit DOIF einfach nicht auskenne - dafür müsste ich jetzt genausi in die Doku schauen, wie man dort Readings in set Befehle mit einbinden kann.

VG
Andreas

p.s. Sorry auf die falsche Fährte gelockt zu haben ;)


wowogiengen

Hallo,
ja das ist die Lösung...
Ich hatte
(set teleBot_msg statt
(set teleBot _msg geschrieben...
Jetzt sieht das DOIF so aus:

define teleBotRestartPi DOIF (([teleBot:msgText] eq "mach neu") or ([teleBot:msgText] eq "Mach neu")) (set teleBot _msg @xxxxxxxxxx @yyyyyyyyyy '[teleBot:msgPeer]' sagt \n '[teleBot:msgText]'...\n Mach ich...;;shutdown restart;;)\

Läuft und sieht auch ansprechend aus...

Prof. Dr. Peter Henning

Zitat von: flummy1978 am 14 August 2025, 15:21:59...im Telegrambot vermerken, WER überhaupt mit dem Bot quatschen darf.
Ja, sehr wichtig.

ZitatEine Abfrage bezüglich der ID zu machen
Das ist sinnlos, wenn der Bot richtig konfiguriert wurde, siehe oben

ZitatIch hab mir dafür eine Art Chatbot gebaut, mit dem ich mich unterhalte und einige Sachen (wie Neustart Waschmaschinenmeldungen usw an meine Frau und mich gehen)
Das Modul Babble bietet ein semantisches Sprachinterface, mit dem
- generische Devices wir z.B. Rollläden und Thermostate ohne zusätzliche Definition gesteuert werden können, z.B. "Stelle die Temperatur im Wohnzimmer auf 22 Grad"
- alle Devices durch entsprechend hinterlegte Kommandosätze gesteuert und abgefragt werden können, z.B. "Wie ist der Wert vom DAX"
- zusätzlich ein Rivescript-Chatbot integriert werden kann. Der kann alle möglichen Diskussionen und Dialoge in natürlicher Sprache führen und interpretieren. Rivescript ist relativ leicht zu verwenden, das habe ich sogar meinen Pädagogikstudentinnen an der Uni Wien beibringen können.

Dieses Babble Sprachinterface ist natürlich auch an Telegram angebunden. Viele der Hausfunktionen kann ich per Telegram-Keyboard steuern, aber eben auch Sprachanweisungen eintippen. Die neueste Ergänzung ist das noch im Betastadium befindliche Modul 72_FBTAM.pm, mit dem ich mir die Nachrichten des Fritzbox-Anrufbeantworters via Teleram senden lassen kann. Und dort natürlich auch den Inhalte des AB verwalten kann.

ZitatD.h. ich müsste das Reading "msgPeer" in die Nachricht einbetten, ebenso "msgText"...
userReading erstellen, welches die gesamte zu sendende Nachricht aus den einzelnen Stücken zusammensetzt (ReadingsVal(...)).

Zitatdann wäre das Beste 2 DOIFs zu erstellen
Das ist Unsinn, ein einzelnes DOIF kann auf ganz unterschiedliche Events lauschen. Und z.B. wenn eine Nachricht von msgPeer Hansi empfangen wurde, die zusammengesetzte Nachricht (siehe oben) an Mausi schicken.

LG

pah




wowogiengen

Hallo flummy, pah,
ich habe das mit den allowed Peers umgesetzt.

Das mit Babble hört sich elegant an...