Formatierter Text mit dem Telegram-Framework

Eine kleine Einführung in Zeichenformatierungen und mehrzeilige Nachrichten mit dem T-Framework

In Telegram gibt es die Möglichkeit, auch mehrzeilige Nachrichten und formatierte Texte zu versenden, also Nachrichten mit fetter oder kursiver Schrift. Das habe ich irgendwann mal ausprobiert und bei der Gelegenheit festgestellt, dass auch mehrzeilige Nachrichten mit Zeilenumbrüchen durchaus Sinn machen können – bisher war meine Philosophie ja eher, „Telegram-Nachrichten sind so kurz, dass man das nicht braucht.“

Nun, ich bin bereit, meine Meinung zu ändern. Manchmal. Mit langer Vorbereitungszeit und höchstens eine Meinung pro Monat.

Diese Seite richtet sich an Profis – ich beschreibe nur kurz die nötigen Änderungen im Original-Framework und beispielhaft in einigen Programmen. Wer es umsetzen möchte, muss das T-Framework also schon am Laufen haben und sich selbst die passenden Stellen suchen. Kein Hexenwerk – aber wenn es bei jemandem quietscht, der die Seite hier durcharbeitet, dann ist es vielleicht das Hirn. Kleiner Scherz.

Zeilenumbrüche

Neue Zeilen werden in der CCU-Welt mit \n dargestellt. Um die Codierung für wget kümmert sich das T-Framework. Ich kann also entspannt loslegen und mein Wohnraumtemperaturbenachrichtigungsscript ein kleines bisschen anpassen.

dom.GetObject ("Telegram").State ("Wohnraumtemperatur" # "\n" # dom.GetObject ("Wohnraumtemperatur").Value().ToString().Substr(0,4) # " °C");

Der Doppelpunkt wird durch einen Zeilenumbruch ersetzt. An dieser Stelle zickt die CCU mal wieder etwas – der Zeilenumbruch kann nicht einfach an den vorherigen String angehängt werden, sondern muss separat als Teilstring zusammengefügt werden. Was wäre die HomeMatic ohne ihre Eigenheiten.

Das Ergebnis sind mehrzeilige Nachrichten. Im Vergleich zum Originalscript habe ich auch noch die Maßeinheit °C hinzugefügt

Was will man mehr? Ah, keine Sorge. Es geht immer noch etwas mehr.

Was ist \n?

Wenn ich schreibe, dass der Zeilenumbruch in der CCU-Welt mit \n dargestellt wird, dann ist das nur die halbe Wahrheit. Die ganze Wahrheit lautet etwa wie folgt:

\n und \r kommen aus der Zeit der mechanischen Drucker. Da gab es einen Druckkopf, der von links nach rechts die Zeile gedruckt hat, und eine Walze, die das Papier zeilenweise nach oben schob. Mit \n wurde die Walze eine Zeile weitergedreht, mit \r der Druckkopf an den linken Anschlag gefahren.

Ein vollständiger Zeilenumbruch lautete demnach \r\n oder \n\r – ersteres traditionell die Codierung in der Windows-Welt, letzteres in der Unix-Welt. Wenn eins fehlte, druckte der Drucker … seltsam.

In den vollständigen Namen der Steuerzeichen (ja, sowas gibt es!) spiegelt sich die Geschichte wider: \r heißt „Carriage Return“, kurz CR, weil dabei der Wagen mit dem Druckkopf an den Zeilenanfang zurückkehrt, und \n heißt „Line Feed“, kurz LF, weil eine neue Zeile in das Druckwerk eingeführt wird.

Irgendwann hat sich eingebürgert, dass auch ein einzelnes \r oder ein einzelnes \n für einen Zeilenumbruch ausreicht. In Texten und grafischen Oberflächen gibt es halt sehr wenige Anwendungsfälle, wo man eine Zeile doppelt schreiben möchte (\r) oder in die nächste Zeile wechseln möchte, ohne gleichzeitig am Anfang wieder anzufangen (\n).

Dabei wiederum hat sich in der Unix-Welt, in deren Vororten auch die CCU ihren kleinen Winkel bewohnt, \n durchgesetzt. Darum verwende ich \n für neue Zeilen und nichts anderes.

Das war jetzt auch nicht die ganze Wahrheit, aber zumindest konnte ich die Menge nutzlosen Wissens auf dieser Welt etwas vergrößern.

Zeichenformatierung

In der Telegram-API, über die das T-Framework die Nachrichten versendet, gibt es drei Varianten, wie die übergebenen Texte interpretiert werden:

Bisher habe ich die Standard-Variante verwendet, die zwar Zeilenumbrüche versteht, aber keine Formatierungen. Bei HTML erzeugen die spitzen Klammern in der WebUI manchmal Schluckauf. Kann man machen, nervt aber, also ist das nix. Vielleicht ändere ich nächsten Monat meine Meinung, aber im Moment werde ich den Markdown-Stil verwenden.

Hier muss nur eine Zeile im Code des Versandscripts angepasst werden:

string s_cmd = "wget --no-check-certificate --quiet -O /dev/null \"https://api.telegram.org/bot314321353:AAFKjr29dF940b-aTchoFJ_pb6oZKxzx8Zw/sendMessage?chat_id=374629384&parse_mode=Markdown&text=" # s.ToUTF8().UriEncode() # "\"";

Neu ist der Parameter parse_mode=Markdown, der an die Telegram-API übergeben wird. Das war’s schon – mit dieser Änderung werden Nachrichten auf Formatierungen abgeklopft und entsprechend von Telegram umgesetzt.

Natürlich müssen Programme die Formatierungen dann auch nutzen. Mein Wohnraumtemperaturbenachrichtigungsscript sieht jetzt so aus:

dom.GetObject ("Telegram").State ("*Wohnraumtemperatur*" # "\n" # dom.GetObject ("Wohnraumtemperatur").Value().ToString().Substr(0,4) # " °C");

Ich habe den Text „Wohnraumtemperatur“ in Sternen eingeklammert – er soll fettgedruckt sein. Und siehe da:

Weitere Formate

Die Beschreibung der Telegram-API listet weitere Zeichen auf, mit denen die Formatierung beeinflusst werden kann.

*fettgedruckter Text*

Mein Standard-Beispiel für alles auf dieser Seite.

_Kursivschrift_

Dieses Format würde klassisch eigentlich durch /Schrägstriche/ ausgelöst, während _Unterstriche_ für Unterstreichung stehen. Telegram macht es anders – _Unterstriche_ werden kursiv umgesetzt.

Das erweiterte T-Framework kann damit umgehen.

[Christians Homepage](http://www.christian-luetgens.de)

URLs kann man codieren und das erweiterte Framework kommt mit diesem Beispiel sogar klar. Bei komplexen URLs kann es allerdings Probleme geben.

Vermutlich gibt es wenig Bedarf, die CCU irgendwelche URLs versenden zu lassen.

`Text mit fester Breite`

```Text
Langer Textblock mit fester Breite
```

Text mit fester Breite sieht hässlich aus und kein Mensch kann damit was anfangen – abgesehen natürlich von sämtlichen Script-Schnipseln auf dieser Seite.

Nachrichten in einfachen Programmen

Mein Gaszähler-Warnprogramm verwendet Zeichenketten, die ohne Script direkt im WebUI-Programm vorgegeben sind. Auch hier können natürlich jetzt Formatierungen verwendet werden.

Auf obigem Screenshot gut zu sehen: „Gaszähler“ ist mit Sternen eingeklammert, soll also fett angezeigt werden.

Nicht gut zu sehen: Danach folgt noch ein Zeilenumbruch. Das hängt mit der WebUI zusammen. Man kann problemlos \n für einen Zeilenumbruch eingeben, aber sobald man das Eingabefeld verlässt, wendet JavaScript seine Magie an und das Steuerzeichen wird nicht mehr angezeigt. In der Zeichenkette ist es aber noch vorhanden und wird korrekt gespeichert.

Ein Test beweist es:

Um das nicht angezeigte Steuerzeichen wieder zu löschen, muss man einfach die beiden umliegenden Zeichen löschen. Wenn ich *s lösche, ist auch der Zeilenumbruch dazwischen weg.

Programme anpassen …

Programme, die bisher das T-Framework verwendet haben, funktionieren natürlich auch nach diesen Erweiterungen weiter. Nichtsdestotrotz kann man sie anpassen, um überall in den Genuss formatierter Nachrichten zu kommen.

Als Beispiel zum Abschluss die Nachrichten des Servicemeldungs-Scripts, die von formatierten Texten durchaus profitieren:

Ich glaube, ich muss mal wieder ein paar Batterien wechseln.

Navigation