Telegram und Sonderzeichen

Einrichtung, Anschluss und Programmierung der HomeMatic CCU

Moderator: Co-Administratoren

Pseudoreal
Beiträge: 246
Registriert: 01.05.2020, 19:48
System: CCU
Hat sich bedankt: 78 Mal
Danksagung erhalten: 10 Mal

Telegram und Sonderzeichen

Beitrag von Pseudoreal » 15.07.2021, 09:00

Hallo zusammen,

ich nutze Telegram, damit mir bestimmte Zustände der CCU mitgeteilt werden (Program ausgeführt, Servicemeldungen, etc.).
Jetzt ist mir aufgefallen, dass wenn das Grad Zeichen (°) im String steckt, die Nachricht bei Telegram nicht ankommt. Das Script ist ja relativ simpel:

Code: Alles auswählen

!Variablen TELEGRAM
string chatid = "1234567891011";
string botAPI = "123456789:ABCDEFGHIJKLMNOPQR1234";
string msg = "Programm Beschattung Forecast (>18C) wurde gestartet";

!Textnachricht versenden
dom.GetObject("CUxD.CUX2801001:2.CMD_EXEC").State("extra/curl -s -k https://api.telegram.org/bot"#botAPI#"/sendMessage -F text='"#msg#"' -F chat_id="#chatid);     
Wenn jetzt

Code: Alles auswählen

string msg = "Programm Beschattung Forecast (>18C) wurde gestartet";
zu

Code: Alles auswählen

string msg = "Programm Beschattung Forecast (>18°C) wurde gestartet";
wird, dann kommt die Nachricht nicht an. Ich habe gesucht, ob es eine Art Zeichenbeschränkung gibt, habe aber nichts gefunden.

Ideen?

Danke
1x HmIPW-DRAP, 3x HmIPW-DRI32, 3x HmIPW-DRBL4, 7x HmIPW-DRS8, 1x HmIPW-DRD3, 1x HmIPW-SMI55, 3x HmIPW-WTH, 1x HmIP-HAP, 3x HmIP-STH, 1x HmIP-WTH-2, 3x HmIP-PS, 1x HmIP-SMI, 7x HmIP-SWDO-I, 4x HmIP-SWSD, 3 HmIP-SRH, 2x HmIP-BSL, 3x HmIP-SMI55, 1x HmIP-ASIR, 1xHmIP-ASIR-O

dtp
Beiträge: 10658
Registriert: 21.09.2012, 08:09
System: CCU
Wohnort: Stuttgart
Hat sich bedankt: 320 Mal
Danksagung erhalten: 501 Mal

Re: Telegram und Sonderzeichen

Beitrag von dtp » 15.07.2021, 10:09

Versuch's mal mit

Code: Alles auswählen

msg = msg.ToUTF8();
Thema wurde hier aber schon häufig disktutiert.

Oder, um Werbung in eigener Sache zu machen, probier's mal mit meinem zPNP. Da ist das und noch einiges mehr bereits umgesetzt. 8)
CCU3 mit stets aktueller FW und den Addons "CUxD" und "Programmedrucken", ioBroker auf Synology DiskStation DS718+ im Docker-Container;
einige Projekte: zentrales Push-Nachrichten-Programm zPNP, DoorPi-Videotürsprechanlage, An- und Abwesenheitsdetektion per Haustürschloss, zentrales Programm zur Steuerung von Beschattungsgeräten zBSP.

Tyfys
Beiträge: 544
Registriert: 17.04.2021, 17:12
System: CCU
Hat sich bedankt: 27 Mal
Danksagung erhalten: 123 Mal

Re: Telegram und Sonderzeichen

Beitrag von Tyfys » 15.07.2021, 10:19

Hallo

Ich habe mich bei der Einrichtung meines Telegram-Bot etwas genauer damit beschäftigt.

Bestimmte Zeichen müssen umgesetzt(maskiert) werden,
andere dürfen gar nicht gesendet werden.
Dritte Variante ist, dass die CCU bei einigen Zeichen aussteigt.

Weitere Faktoren sind z.B. ob das Senden mit wget oder mit curl erfolgt.
Ob CUxD auch noch einen Einfluss hat, kann ich nicht sagen ( verwende ich nicht).

Dann hängt die Maskierung noch vom parse_mode ab.
Ich habe mei mir immer eingestellt : parse_mode=markdownv2


aus deinem String "Programm Beschattung Forecast (>18C) wurde gestartet"
wird dann "Programm Beschattung Forecast [»18C] wurde gestartet"


So hab ich das beispielsweise gemacht beim Senden von Bildern mit curl:
(mit wget muss das noch anders maskiert werden !)

Code: Alles auswählen

! SndTelegramImg ***********************************************
!***************************************************************
string sysvarname = "TelegramImgPath";
string path       = dom.GetObject(ID_SYSTEM_VARIABLES).Get(sysvarname).Value();
string sysvarname = "TelegramImgTxt";
string msg    = dom.GetObject(ID_SYSTEM_VARIABLES).Get(sysvarname).Value();
!von HTML nach MarkdownV2   bei CURL  bestimmte Zeichen mit \ maskieren
msg = msg.Replace("_" ,"\_");
msg = msg.Replace("*" ,"\*");
msg = msg.Replace("[" ,"\[");
msg = msg.Replace("]" ,"\]");
msg = msg.Replace("(" ,"\(");
msg = msg.Replace(")" ,"\)");
msg = msg.Replace("~" ,"\~");
msg = msg.Replace("`" ,"\`");
msg = msg.Replace("#" ,"\#");
msg = msg.Replace("+" ,"\+");
msg = msg.Replace("-" ,"\-");
msg = msg.Replace("=" ,"\=");
msg = msg.Replace("|" ,"\|");
msg = msg.Replace("{" ,"\{");
msg = msg.Replace("}" ,"\}");
msg = msg.Replace("." ,"\.");
msg = msg.Replace("!" ,"\!");
msg = msg.Replace("<br>", "\n");
msg = msg.Replace("<b>", "*");
msg = msg.Replace("</b>", "*");
msg = msg.Replace("<i>", "_");
msg = msg.Replace("</i>", "_");
msg = msg.Replace("<u>", "__");
msg = msg.Replace("</u>", "__");
!muss zu letzt, da sonst <b> etc nicht umgesetzt werden
msg = msg.Replace(">" ,"\>");
msg = msg.Replace("<" ,"\<");
string caption = msg.ToUTF8();

var sysvarname ="TelegramBotToken";
string botAPI = dom.GetObject(ID_SYSTEM_VARIABLES).Get(sysvarname).Value();
var sysvarname ="TelegramBotChatIDs";
string chatid = dom.GetObject(ID_SYSTEM_VARIABLES).Get(sysvarname).Value();
string stdout;
string stderr;
system.Exec("curl -s -k https://api.telegram.org/bot"#botAPI#"/sendPhoto -F chat_id="#chatid#" -F parse_mode=markdownv2  -F photo='@"#path#"' -F caption='"#caption#"'" , &stdout, &stderr);

!WriteLine(stdout);
!WriteLine(stderr);

Auf alle Fälle muss das auch zum Schluss noch - wie dtp schrieb - in UTF8 konvertiert werden.


Gruß
Harry
Gruß
Harry

Tyfys
Beiträge: 544
Registriert: 17.04.2021, 17:12
System: CCU
Hat sich bedankt: 27 Mal
Danksagung erhalten: 123 Mal

Re: Telegram und Sonderzeichen

Beitrag von Tyfys » 15.07.2021, 12:16

Ich habe mein Beispiel-Skript noch etwas geändert.
Nicht alle Umsetzungen waren so erforderlich. Hatte es vorher wohl nicht alles richtig getestet oder telegram hatte einen bug.


Pardon, ich hatte anfangs das Problem mit dem Grad-Zeichen einfach überlesen.
Ich habe es eben noch mal getestet:

Das °-Zeichen kommt an:
TelegramCaptur.jpg
Das ">" -Zeichen muss aber maskiert werden.
Sonst kam bei mir diese Antwort von Telegram

Code: Alles auswählen

{"ok":false,"error_code":400,"description":"Bad Request: can't parse entities: Character '>' is reserved and must be escaped with the preceding '\\'"}
In meiner vorherigen Skriptversion hatte ich > durch » ersetzt. Ist nun nicht mehr nötig da es nun so maskiert klappt : "\>"

Gruß
Harry
Gruß
Harry

Pseudoreal
Beiträge: 246
Registriert: 01.05.2020, 19:48
System: CCU
Hat sich bedankt: 78 Mal
Danksagung erhalten: 10 Mal

Re: Telegram und Sonderzeichen

Beitrag von Pseudoreal » 15.07.2021, 13:50

wo siehst Du diese Fehlermeldung von Telegram?
Bei mir kommt die Nachricht mit dem ">" durch.
1x HmIPW-DRAP, 3x HmIPW-DRI32, 3x HmIPW-DRBL4, 7x HmIPW-DRS8, 1x HmIPW-DRD3, 1x HmIPW-SMI55, 3x HmIPW-WTH, 1x HmIP-HAP, 3x HmIP-STH, 1x HmIP-WTH-2, 3x HmIP-PS, 1x HmIP-SMI, 7x HmIP-SWDO-I, 4x HmIP-SWSD, 3 HmIP-SRH, 2x HmIP-BSL, 3x HmIP-SMI55, 1x HmIP-ASIR, 1xHmIP-ASIR-O

Tyfys
Beiträge: 544
Registriert: 17.04.2021, 17:12
System: CCU
Hat sich bedankt: 27 Mal
Danksagung erhalten: 123 Mal

Re: Telegram und Sonderzeichen

Beitrag von Tyfys » 15.07.2021, 14:31

Also ich hab ja kein CUxD
Da mach ich das mit system.Exec und hinten dran die stdout und stderr.
Wenn man das im Skript Testfenster macht, kann man sich das mit WriteLine ausgeben.

Code: Alles auswählen

string stdout;
string stderr;
system.Exec("curl -s -k https://api.telegram.org/bot"#botAPI#"/sendMessage -F text='"#msg#"' -F parse_mode=markdownv2  -F chat_id="#chatid , &stdout, &stderr);

WriteLine(stdout);
WriteLine(stderr);

hast Du mit

Code: Alles auswählen

msg = msg.ToUTF8();
vor dem Sendebefehl die Konvertierung nach UTF8 gemacht ?
Ohne dem lief es bei mir auch nicht durch - da kam als antwort eben, dass UTF8 erwartet wird.

Diese Maskierung von Sonderzeichen könnte auch durch CUxD gemacht werden. Das würde das Durchkommen mit dem > erklären.

Kann auch sein, daß bei CUxD die Telegram Antwort irgendwie anders zu sehen ist.
Gruß
Harry

Benutzeravatar
blackhole
Beiträge: 3730
Registriert: 21.07.2015, 14:03
System: CCU
Hat sich bedankt: 184 Mal
Danksagung erhalten: 587 Mal

Re: Telegram und Sonderzeichen

Beitrag von blackhole » 15.07.2021, 17:16

Ihr macht das meiner Meinung nach recht umständlich und vor allem ziemlich unsicher in der Umsetzung.
Ein Beispiel für addon-freie, sichere Lösung, inkl. UTF-8 und URL-Encoding, findet man z.B. hier.

Vielleicht habt ihr aber auch gute Gründe genau das nicht zu nutzen. ¯\_(ツ)_/¯

Tyfys
Beiträge: 544
Registriert: 17.04.2021, 17:12
System: CCU
Hat sich bedankt: 27 Mal
Danksagung erhalten: 123 Mal

Re: Telegram und Sonderzeichen

Beitrag von Tyfys » 15.07.2021, 19:26

Hallo blackhole

Vielen Dank für Deinen link.
Ich z.B. benutze für die Telegram Lösung gar kein AddOn.

Die Gründe liegen in erster Linie daran, dass man, wenn man mit Telegram (oder anderem ) anfängt, die Suchfunktion im Forum benutzt.
Ob die nun richtig angewendet wird sei mal dahingestellt.

Man ist ja nicht immer der erste mit so einem Problem.
Anderen wurde dann ja auch von Experten geholfen. Dann orientiert man sich an den ersten gefundenen Lösungen, die man auch versteht
und die man an seine Bedürfnisse anpassen kann.
Also Dein Vorschlag einfach nicht gesehen.
( bei Pseudoreal wird's ähnlich gelaufen sein)


Das muss dann nicht immer die optimale Lösung gewesen sein.
Alle Finessen von curl kenne ich auch nicht. Da ist man froh, dass die auserkorenen Skriptzeilen funktioneren.

Die stdout habe ich mit eingebaut, damit ich daraus die message_id rausfiltern kann. (bei Fehlern natürlich hilfreich)
Auf parse_mode=markdownv2 bin ich umgestiegen, weil man damit etwas mehr formatieren kann.

In Deinem link habe ich nun die Methode .UriEncode() gesehen.

Ich habe dann damit ein wenig herumexperimentiert und festgestellt, dass
damit noch längst nicht alles klappt.
Einige Zeichen - zB. einzelner Asterisk müssen maskiert sein, weil sonst kam "Bad Request: can't parse entities: Can't find end of Bold entity"

So was mache ich da mit den Replace-Anweisungen neben den Formatierungen.

Das war jetzt nur, weil Du nach den Gründen fragtest. :mrgreen:



Gruß
Harry

ein Problem - drei Programmierer - 5 Lösungen :lol:
Gruß
Harry

Benutzeravatar
blackhole
Beiträge: 3730
Registriert: 21.07.2015, 14:03
System: CCU
Hat sich bedankt: 184 Mal
Danksagung erhalten: 587 Mal

Re: Telegram und Sonderzeichen

Beitrag von blackhole » 16.07.2021, 10:01

Tyfys hat geschrieben:
15.07.2021, 19:26
Ich habe dann damit ein wenig herumexperimentiert und festgestellt, dass
damit noch längst nicht alles klappt.

Ja, das ist richtig, die Funktion ist nicht konsequent umgesetzt.
Wenn man seine Bedürfnisse oder die zu sendenden Texte/Daten nicht anpassen kann oder möchte, ist das ein Problem.

Für das Projekt Alexa.sh bin ich aus erstgenanntem Grund auf das cURL-eigene URL-Encoding (Option --data-urlencode) umgestiegen. 8)

Ich transportiere da mittels cURL Daten (u.a. Sprachbefehle und Namen), deren Inhalt mir unbekannt ist und auch nahezu beliebig sein kann.
Vernünftiges URL-Encoding ist an dieser Stelle essentiell, da ich vor dem Abholen zunächst keinen Einfluss auf die -aus Sicht der CCU- eingehenden Daten habe.

Bei deinen -aus Sicht der CCU- ausgehenden Daten sieht das natürlich völlig anders aus.

Tyfys hat geschrieben:
15.07.2021, 19:26
Das war jetzt nur, weil Du nach den Gründen fragtest.

Ich habe gar nicht gefragt. :wink:

Tyfys
Beiträge: 544
Registriert: 17.04.2021, 17:12
System: CCU
Hat sich bedankt: 27 Mal
Danksagung erhalten: 123 Mal

Re: Telegram und Sonderzeichen

Beitrag von Tyfys » 16.07.2021, 10:33

Hallo blackhole

Für mich sieht das nach einer Frage aus. :mrgreen:
Besonders die letzen Zeichen...
blackhole hat geschrieben:
15.07.2021, 17:16
Vielleicht habt ihr aber auch gute Gründe genau das nicht zu nutzen. ¯\_(ツ)_/¯
Man muss hierbei natürlich auch die Eigenarten von Telegram berücksichtigen.

Und ich erzeuge meine Texte ja selbst - abgesehen die von Deinem Servicemeldungen SV -nun in Version v2.45 - erzeugten.
(Das habe ich übrigens. vor Alchys Servicemeldungen *allinclusive* Script gefunden)

Daher auch die Statements für bold, newline etc.

Alexa ist z.B. für mich uninteressant. Gibt da ja auch kontroverse Meinungen.
Wenn wir manuell etwas schalten wollenl, können wir das auch über Handy/Tablet/PC machen.
Über Handy/Telegram sogar von sonstwo.


Gruß
Harry
Gruß
Harry

Antworten

Zurück zu „HomeMatic Zentrale (CCU / CCU2 / CCU3 / Charly)“