Telegram instant messaging TelegramBot - Empfangen und Senden per FHEM

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

Vorheriges Thema - Nächstes Thema

Betonklotz

#2445
Hallo zusammen,

habe gerade auch noch ein kleines Problem das ich als Laie suche und mir nicht erklären kann. Und zwar kann ich manchmal den Empfänger nicht angeben, bzw. der wird nicht korrekt geparst. Folgenden Codeschnipsel habe ich in einer Datei ausgelagert:

# Texte um nette Satusmeldungen im Log und per Telegram auszugeben
my $text_Pumpenstatus = "neuer Status der Tiefbrunnenpumpe ist: ";

# Festlegung wie eine Nachricht ans Handy verschickt wird
my $send_msg = "set Haus_bot message \@-38xxxxxxx";


#########################################################################
# ab hier nichts mehr anpassen
#########################################################################

# Pumpe anschalten
fhem ("set Garten_Tiefbrunnenpumpe_MQTT2 on");
# Info an Handy schicken
fhem ($send_msg." ".$text_Pumpe_an);
# 3sec danach eine Info zum neuen Status der Pumpe ans Handy schicken und ins Log schreiben
# fhem (define mein_Name at +00:00:03 {Perlcode});
# jegliche Sonderzeichen im inneren Perlcode müssen escaped werden
fhem ("define Brunnenpumpe_Statusmeldung at +00:00:03 {fhem (\"$send_msg $text_Pumpenstatus [Garten_Tiefbrunnenpumpe_MQTT2:POWER]\");;Log3 (undef, 3, \"$text_Pumpenstatus\".ReadingsVal(\"Garten_Tiefbrunnenpumpe_MQTT2\",\"POWER\",\"\"))}");


Hierbei ist es so, dass die erste Nachricht

fhem ($send_msg." ".$text_Pumpe_an);

am richtigen Handy korrekt ankommt. Die zweite Nachricht die 3sec später über das gekapselte define/at verschickt wird

[...]fhem ("define xyz at +00:00:03 {fhem (\"$send_msg $text_Pumpenstatus\")[...]

kommt allerdings
a) beim default Empfänger an (und nicht dem übergebenen)
b) und enthält im empfangenen Text die ChatID als erstes mit einer führenden Null als Text, d.h. die empfangene Textnachricht auf dem default Empfänger sieht so aus

038xxxxxxx neuer Status der Tiefbrunennpumpe ist: OFF

Wie kann/muss ich die Nachricht/den Empfänger verpacken damit es korrekt übergeben werden kann?

Und wenn wir dabei sind: gibt es eine Chance einzelne Perl Befehle in der TelegramBot zugehörigen allowedCommands Instanz zu erlauben statt generell alle perl Befehle? Konkret: meine Befehle aus einer/meinen Datei erlauben (z.B. Pumpe_anschalten ()), aber bitte nicht komplett Perl? Wie macht man das richtig?

Gruß, Robert

Ralli

Zitat von: Betonklotz am 03 Mai 2020, 13:43:24

...
my $send_msg = "set Haus_bot message \@-38xxxxxxx";

Wie kann/muss ich die Nachricht/den Empfänger verpacken damit es korrekt übergeben werden kann?

Muss hier ggf. mit doppeltem Backslash gearbeitet werden, da du das ja nochmal in ein DEF verpackst?
Gruß,
Ralli

Proxmox 8.2 Cluster mit HP ED800G2i7, Intel NUC11TNHi7+NUC7i5BNH, virtualisiertes fhem 6.3 dev, virtualisierte RaspberryMatic (3.75.7.20240420) mit HB-RF-ETH 1.3.0 / RPI-RF-MOD, HM-LAN-GW (1.1.5) und HMW-GW, FRITZBOX 7490 (07.57), FBDECT, Siri und Alexa

Betonklotz

Zitat von: Ralli am 03 Mai 2020, 18:46:06
Muss hier ggf. mit doppeltem Backslash gearbeitet werden, da du das ja nochmal in ein DEF verpackst?
Leider nein.
a) die normalen Nachrichten (also fhem ($send_msg." ".$text_Pumpe_an);) bekommen dann ein "\Chat ID" voran ==> ok, könnte man lösen indem man zwei Variabeln definiert um das zu fixen
b) aber zusätzlich schneidet er in der zweiten Nachricht die 3sec später über das gekapselte define/at gesendet wird die erste Zeiffer weg, d.h.

8xxxxxxx neuer Status der Tiefbrunennpumpe ist: OFF

wird dann übermittelt. zudem gibt es eine Warnung im FHEM Logfile

PERL WARNING: '\038' resolved to '\o{3}8' at (eval 184326) line 1.
eval: {fhem ("set Haus_bot message \038xxxxxxx neuer Status der Tiefbrunnenpumpe ist: [...]

Es scheint also so, als ob irgendwo im Modul eine Filterung/Kürzung stattfindet die sicher snnvoll ist, hier in meinem Fall aber unnötig zuschlägt...

Gruß, Robert

viegener

Zitat von: Betonklotz am 04 Mai 2020, 07:33:45
Leider nein.
a) die normalen Nachrichten (also fhem ($send_msg." ".$text_Pumpe_an);) bekommen dann ein "\Chat ID" voran ==> ok, könnte man lösen indem man zwei Variabeln definiert um das zu fixen
b) aber zusätzlich schneidet er in der zweiten Nachricht die 3sec später über das gekapselte define/at gesendet wird die erste Zeiffer weg, d.h.

8xxxxxxx neuer Status der Tiefbrunennpumpe ist: OFF

wird dann übermittelt. zudem gibt es eine Warnung im FHEM Logfile

PERL WARNING: '\038' resolved to '\o{3}8' at (eval 184326) line 1.
eval: {fhem ("set Haus_bot message \038xxxxxxx neuer Status der Tiefbrunnenpumpe ist: [...]

Es scheint also so, als ob irgendwo im Modul eine Filterung/Kürzung stattfindet die sicher snnvoll ist, hier in meinem Fall aber unnötig zuschlägt...

Gruß, Robert

Nein, das hat mit dem Modul erstmal gar nichts zu tun - das Problem ist genau die komplexe Abfolge von Anführungszeichen und \ - Der Hinweis von Ralli ar schon richtig.

Das Problem ist durch Deine Routine landet folgender Befehl in der Definition des at:

{fhem ("set Haus_bot message @-38xxxxxxx ....

Dabei wird bei der Ausführung von perl das @... versucht zu interpretieren und das geht natürlich nicht, denn es ist kein array

Also wäre mein Vorschlag an geeigneten Stellen das " durch ' zu ersetzen, dann ist es zwar auch nicht einfacher zu lesen, aber sicherer als ganz viele \

Mit anderen Worten die letzte Zeile durch folgendes ersetzen:


fhem ("define Brunnenpumpe_Statusmeldung at +00:00:03 {fhem ('$send_msg $text_Pumpenstatus [Garten_Tiefbrunnenpumpe_MQTT2:POWER]');;Log3 (undef, 3, \"$text_Pumpenstatus\".ReadingsVal(\"Garten_Tiefbrunnenpumpe_MQTT2\",\"POWER\",\"\"))}");


Dann wird nach der ersten ersetzung der Variablen (aussen stehen ja ") die innen stehenden @ und sonstigen Variablen in diesem Teil nicht ersetzt und es sollte gehen.

Weiterer Hinweis: über den selben Mechanismus könntest Du auch die konstrukte \"Power\" durch 'Power' ersetzen was das ganze noch etwas lesbarer macht.

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

Betonklotz

#2449
Hallo,

habe die einfachen Anführungszeichen einfach mal ausprobiert und die vorher auch schon mal als Tipp erhalten, leider bringt das keine Besserung

'$send_msg $text_Pumpenstatus [Garten_Tiefbrunnenpumpe_MQTT2:POWER]'

Habe die Texte und Empfänger jetzt hartcodiert und es funktioniert. Mach dir keinen Kopf darum.

Aber hast du evtl. auch einen Tipp für die zweite Frage, also

Und wenn wir dabei sind: gibt es eine Chance einzelne Perl Befehle in der TelegramBot zugehörigen allowedCommands Instanz zu erlauben statt generell alle perl Befehle? Konkret: meine Befehle aus einer/meinen Datei erlauben (z.B. Pumpe_anschalten ()), aber bitte nicht komplett Perl? Wie macht man das richtig?

Da habe ich derzeit eine riesen Sicherheitslücke, da ich generell "perl" erlauben musste :-( Hintergrund: die Pumpe wird aktuell nur per Perl geschaltet.

Gruß, Robert

viegener

Zitat von: Betonklotz am 05 Mai 2020, 08:06:00
Hallo,

habe die einfachen Anführungszeichen einfach mal ausprobiert und die vorher auch schon mal als Tipp erhalten, leider bringt das keine Besserung

'$send_msg $text_Pumpenstatus [Garten_Tiefbrunnenpumpe_MQTT2:POWER]'

Habe die Texte und Empfänger jetzt hartcodiert und es funktioniert. Mach dir keinen Kopf darum.

Aber hast du evtl. auch einen Tipp für die zweite Frage, also

Und wenn wir dabei sind: gibt es eine Chance einzelne Perl Befehle in der TelegramBot zugehörigen allowedCommands Instanz zu erlauben statt generell alle perl Befehle? Konkret: meine Befehle aus einer/meinen Datei erlauben (z.B. Pumpe_anschalten ()), aber bitte nicht komplett Perl? Wie macht man das richtig?

Da habe ich derzeit eine riesen Sicherheitslücke, da ich generell "perl" erlauben musste :-( Hintergrund: die Pumpe wird aktuell nur per Perl geschaltet.

Gruß, Robert

Ich habe Deine Routine bei mir exakt mit meinen Daten nachgestellt um die Lösung für Dich zu erarbeiten. Vorher ging es nicht danach schon, damit vermute ich, dass irgendein anderes Problem vorliegt.

Nein eine Möglichkeit einzelne perlbefehle zu erlauben und andere nicht wäre technisch schon kaum möglich. Hast Du mal versucht über cmdalias die perlnbefehle zu richtigen Kommandos zu machen?

Bezüglich Sicherheit - allowedcommands ist sicher KEIN Sicherheitsmechanismus, sondern eher als Beschränkung für Flüchtigkeitsfehler durch weniger erfahrene Nutzer gedacht. Eine Absicherung MUSS mindestens die Restriktion der erlaubten Benutzer auf wenige umfassen. Aber wenn Sicherheit ein reales Thema ist, sollte per Telegram kein Zugriff zur Ausführung erlaubt werden.
Kein Support über PM - Anfragen gerne im Forum - Damit auch andere profitieren und helfen können

Betonklotz

Hallo,

hmmm, keine Ahnung was dann bei mir los ist. Glücklicherweise läuft es mit den hartcodierten Werten. Trotzdem vielen Dank für deine Mühen.

Zitat von: viegener am 05 Mai 2020, 16:18:13
Hast Du mal versucht über cmdalias die perlnbefehle zu richtigen Kommandos zu machen?
Nein, das hört sich aber nach einer guten Möglichkeit an. Probiere ich am Wochenende mal aus.

Zitat von: viegener am 05 Mai 2020, 16:18:13
Bezüglich Sicherheit - allowedcommands ist sicher KEIN Sicherheitsmechanismus, sondern eher als Beschränkung für Flüchtigkeitsfehler durch weniger erfahrene Nutzer gedacht. Eine Absicherung MUSS mindestens die Restriktion der erlaubten Benutzer auf wenige umfassen. Aber wenn Sicherheit ein reales Thema ist, sollte per Telegram kein Zugriff zur Ausführung erlaubt werden.
Die Beschränkung auf Nutzer ist (natürlich) drin und im Grunde nutze ich nur die "Favoriten", also gebe keine Befehle selber ein. Trotzdem: ich habe extra Homematic und FHEM als System gewählt (und überall AES aktiviert), weil ich eben nicht möchte, dass jemand meine Heizung verstellt (oder schlimmeres), alles ganz toll über die Cloud eines Drittanbieters geht o.ä. Das jemand auch bei AES mitlesen kann was ich so über den Äther schicke ist ja ok, aber halt nichts schalten...
Dementsprechend wollte ich auch bei einer Fernsteuerung über Telegram das Maximum an Sicherheit rausholen und so viele Hürden wie möglich einbauen.

Gruß, Robert

MadMax-FHEM

Zwar OT aber weil du es schreibst: AES bei Homematic aber hoffentlich mit eigenem Schlüssel!?
Weil sonst "nutzlos"... ;)

Gruß, Joachim
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)

satprofi



Zitat von: Loctite am 11 Februar 2020, 16:51:26


Ich denke ich werde direkt auf Raspbian Buster wechseln. Damit sollte das hier genannte Problem erst gar nicht auftauchen.


leider doch. heute update gemacht, und telegram steht still. echt ärgerlich....


Gesendet mit Tapatalk

gruss
-----------------------------------------------------------------------
beelink miniPC - Fhem 6.x CUL 868, FS20, NetIO230 CUL 433
HMLAN, HM-CC-RT-DN,Homematic Actoren,LD382A,Telegram

stratege-0815

Hallo zusammen,
seit kurzem ist mein FHEM via Telegram "so schweigsam".

Im Logfile fand ich dann diese Meldung:

2020.05.16 12:28:35 3: TelegramBot_SendIt myTelegramBot: Failed with :FAILED peer not found :mein_name::

ich musste mich mit dem telegram bot erst wieder bekannt machen, indem ich ihm eine Nachricht sende. Danach wurden Meldungen wieder übertragen. Warum verliert er das irgendwann? Wie kann ich das konsistent speichern?

Gruß
Jan

Felix_86

Zitat von: stratege-0815 am 16 Mai 2020, 12:40:53
Im Logfile fand ich dann diese Meldung:

2020.05.16 12:28:35 3: TelegramBot_SendIt myTelegramBot: Failed with :FAILED peer not found :mein_name::

ich musste mich mit dem telegram bot erst wieder bekannt machen, indem ich ihm eine Nachricht sende. Danach wurden Meldungen wieder übertragen. Warum verliert er das irgendwann? Wie kann ich das konsistent speichern?

Diese oder eine ähnliche Meldung hatte ich im Log bei der Inbetriebnahme von Telegram (vor 2 Jahren ?!) ebenfalls. Besonders nach einem Neustart von FHEM waren die Kontakte weg, also musste ich "allowUnknownContacts" erst wieder auf "1" stellen, eine Nachricht schicken und dann ging es wieder.

Ich umgehe das Problem seither mit einem Notify, dass beim Start von FHEM ausgeführt wird und die Kontakte setzt. Seither (~2 Jahre) ist es stabil.

global:INITIALIZED {
fhem("setreading Telegram Contacts 123456789:Vorname1_Nachname1: 987654321:Vorname2_Nachname2:");
}

Grüße von Felix

Pi3, Raspbian 11, FHEM 6.2, ca 320 Device
SIGNALduino (TCM, TX, IT, SD_GT), CUL (EM, FS20, HMS), JeeLink (PCA301), HUEBridge, HUEDevice, mailcheck, echodevice, alexa, TelegramBot, Weather (OWM), DWD_OpenData, FRITZBOX, TabletUI, Calendar, Abfall, Vitoconnect, LGTV_WebOS

viegener

Zitat von: stratege-0815 am 16 Mai 2020, 12:40:53
Hallo zusammen,
seit kurzem ist mein FHEM via Telegram "so schweigsam".

Im Logfile fand ich dann diese Meldung:

2020.05.16 12:28:35 3: TelegramBot_SendIt myTelegramBot: Failed with :FAILED peer not found :mein_name::

ich musste mich mit dem telegram bot erst wieder bekannt machen, indem ich ihm eine Nachricht sende. Danach wurden Meldungen wieder übertragen. Warum verliert er das irgendwann? Wie kann ich das konsistent speichern?

Gruß
Jan

Die kontakte sind ein reading, das wie andere readings beim save mitgespeichert wird und bei. Neustart auch wieder gesetzt wird. Wenn sich nichts verändert reicht es also einmal zu speichern nachdem die kontakte bekannt sind.

Alternativ kann man die kontake aber auch über die set funktion manuell setzen

Hinweis: ich empfehle eher die verwendung der kontaktid als die verwendung des namens, da mir nicht bekannt ist, ob telegram hier eindeutigkeit sicherstellt.

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

stratege-0815


Betonklotz

Hallo viegener,

hat ewig gedauert weil ich noch alles andere um die Ohren hatte:
Zitat von: viegener am 05 Mai 2020, 16:18:13
Hast Du mal versucht über cmdalias die perlnbefehle zu richtigen Kommandos zu machen?
funktioniert leider nicht.

define c_Tiefbrunnenpumpe_an cmdalias Tiefbrunnenpumpe_an AS {Tiefbrunnenpumpe_schalten ("an")}


allowedCommands tiefbrunnenpumpe_an, tiefbrunnenpumpe_aus, [...]

führt zu einem

2020.05.17 08:53:32 3: Forbidden command perl for Haus_bot
2020.05.17 08:53:32 1: stacktrace:
2020.05.17 08:53:32 1:     main::allowed_Authorize             called by fhem.pl (3775)
2020.05.17 08:53:32 1:     main::CallFn                        called by fhem.pl (5632)
2020.05.17 08:53:32 1:     main::Authorized                    called by fhem.pl (1115)
2020.05.17 08:53:32 1:     main::AnalyzePerlCommand            called by fhem.pl (1171)
2020.05.17 08:53:32 1:     main::AnalyzeCommand                called by fhem.pl (1100)
2020.05.17 08:53:32 1:     main::AnalyzeCommandChain           called by ./FHEM/98_cmdalias.pm (92)
2020.05.17 08:53:32 1:     main::CommandCmdAlias               called by fhem.pl (1247)
2020.05.17 08:53:32 1:     main::AnalyzeCommand                called by fhem.pl (1100)
2020.05.17 08:53:32 1:     main::AnalyzeCommandChain           called by ./FHEM/50_TelegramBot.pm (1427)
2020.05.17 08:53:32 1:     main::TelegramBot_ExecuteCommand    called by ./FHEM/50_TelegramBot.pm (1260)
2020.05.17 08:53:32 1:     main::TelegramBot_SendFavorites     called by ./FHEM/50_TelegramBot.pm (1574)
2020.05.17 08:53:32 1:     main::Telegram_HandleCommandInMessages called by ./FHEM/50_TelegramBot.pm (2603)
2020.05.17 08:53:32 1:     main::TelegramBot_ParseMsg          called by ./FHEM/50_TelegramBot.pm (2281)
2020.05.17 08:53:32 1:     main::TelegramBot_Callback          called by FHEM/HttpUtils.pm (634)
2020.05.17 08:53:32 1:     main::__ANON__                      called by fhem.pl (754)
2020.05.17 08:53:32 3: TelegramBot_ExecuteCommand Haus_bot: cmd executed :Tiefbrunnenpumpe_an: -->    :Forbidden command {Tiefbrunnenpumpe_schalten ("an")}.:

Werde also wohl oder übel über ein Notify und dummy o.ä. Konstrukt gehen müssen. Schade, wäre so m.E. deutlich einfacher und eleganter.

Schönes WE,

Robert


amenomade

Zitat von: Betonklotz am 17 Mai 2020, 09:00:47

define c_Tiefbrunnenpumpe_an cmdalias Tiefbrunnenpumpe_an AS {Tiefbrunnenpumpe_schalten ("an")}


allowedCommands tiefbrunnenpumpe_an, tiefbrunnenpumpe_aus, [...]


Ich weiss nicht, ob das mit Alias funktionieren würde, aber was ich hier sehe kann auf keinen Fall funktionieren
ZitatTiefbrunnenpumpe_an
tiefbrunnenpumpe_an
Pi 3B, Alexa, CUL868+Selbstbau 1/2λ-Dipol-Antenne, USB Optolink / Vitotronic, Debmatic und HM / HmIP Komponenten, Rademacher Duofern Jalousien, Fritz!Dect Thermostaten, Proteus