Teleinfo: Ihr Linky-Zähler in Gladys mit dem LiXee TIC-Modul

Hallo zusammen! Ich stelle euch Teleinfo vor, eine externe Integration, die die Ferninformation (TIC) Ihres Linky- oder elektronischen Zählers mit dem LiXee TIC-Modul auf Hutschiene (USB, ca. 30 €) liest. Quellcode: github.com/prohand/gladys-teleinfo.

Wichtiger Punkt: USB

Eine externe Gladys-Integration kann keinen USB-Serienadapter lesen. Das ist die erste Sache, die Sie wissen müssen, bevor Sie das Modul kaufen.

  • Externe Integrationen laufen jeweils in ihrem eigenen Docker-Container, isoliert durch Gladys (Dateisystem schreibgeschützt, kein Hardwarezugriff).
  • Das Manifest einer Integration kann Hardwarezugriff anfordern, aber nur aus vier Klassen: coral-usb, coral-pcie, gpu und video. Es gibt keine Klasse für einen seriellen Port (/dev/ttyUSB0, /dev/ttyACM0…).
  • Diese Klassen werden nur Untercontainern gewährt, nie als freier /dev-Pfad.

Folge: Das LiXee-Modul an den Gladys-Server anzuschließen, reicht nicht aus. Die Integration wird es nicht sehen, selbst wenn es von Linux erkannt wird.

Das ZLinky (die Zigbee-Version des LiXee) hat dieses Problem nicht: Es läuft über Zigbee2MQTT. Aber die günstigere USB-Version auf Hutschiene benötigt einen Netzwerkrelais.

Lösung: ser2net

ser2net teilt den seriellen Port des Moduls im Netzwerk (rohes TCP) und die Integration verbindet sich damit:

Zähler (I1/I2) -> LiXee-Modul (USB) -> ser2net (TCP 2000) -> Teleinfo-Integration -> Gladys

ser2net läuft auf der Maschine, an der das Modul angeschlossen ist: der Gladys-Server selbst oder ein Raspberry Pi in der Nähe des Stromverteilers (praktisch, das USB-Kabel ist auf ca. 5 m begrenzt).

sudo apt install ser2net
ls -l /dev/serial/by-id/

Dann /etc/ser2net.yaml:

connection: &teleinfo
  accepter: tcp,2000
  enable: on
  options:
    kickolduser: true
  connector: serialdev,/dev/serial/by-id/usb-XXXX-if00-port0,1200e71,local
  • 1200e71 für den historischen Modus (elektronische Zähler und die meisten Linky standardmäßig).
  • 9600e71 für einen Linky im Standardmodus.
  • Dann sudo systemctl restart ser2net && sudo systemctl enable ser2net.

Achtung: ser2net hat kein Passwort. Halten Sie diesen Port in Ihrem lokalen Netzwerk, nie im Internet geöffnet.

Was in Gladys hochgeladen wird

Der Modus (historisch oder standard) wird automatisch erkannt. Ein Gerät wird pro Zähler erstellt, mit nur den Werten, die Ihr Zähler sendet (einphasig oder dreiphasig, Base, HC/HP, Tempo, EJP).

  • Historischer Modus: Indizes (Base, HC/HP, EJP, Tempo) in kWh, Scheinleistung (PAPP), momentane und maximale Stromstärke, abonnierte Stromstärke, Tarifperiode, Überschreitung (ADPS).
  • Standardmodus: Entnommene Gesamtenergie und pro Index, eingespeiste Energie, momentane und maximale Scheinleistung, effektiver Strom und Spannung, mittlere Spannung, Lastkurve, aktueller Tarif.

Die Kategorien und Einheiten sind dieselben wie die von Gladys für das ZLinky über Zigbee: Ein Zähler wird in beiden Fällen gleich angezeigt.

Die Werte werden standardmäßig alle 60 Sekunden gesendet (einstellbar von 15 Sekunden bis 1 Stunde), nur wenn sie sich ändern, um den Verlauf nicht zu überfüllen.

Szenen und Dashboard (Gladys 5.1+)

Die Integration fügt ihre eigenen Karten im Szenario-Editor (Kategorie Integrationen) und ein Widget für das Dashboard hinzu.

  • Trigger „Tarifperiodenwechsel“: Startet die Szene beim Wechsel HC ↔ HP. Mögliche Filterung auf die neue Periode (Niedertarif, Hochtarif, Base). Beispiel: Warmwasserbereiter in Niedertarifzeiten.
  • Trigger „Überschreitung der abonnierten Leistung“: Warnt vor dem Abschalten. Ein Auslösen pro Überschreitung, selbst wenn die Leistung um die Grenze schwankt.
  • Aktion „Zähler lesen“: Gibt Leistung, Periode, Gesamtindex und Überschreitung zurück, für eine Bedingung oder eine Nachricht.
  • Widget „Stromzähler“: Momentane Leistung, Indizes, Kurve über 24 Stunden, Tarifperiode, Überschreitung und Empfangsstatus.

Diese Funktionen erfordern Gladys 5.1 oder neuer.

Installation

  1. Schließen Sie das LiXee-Modul an die Klemmen I1 und I2 des Zählers an (ohne Polarität, Strom abgeschaltet am Verteiler).
  2. Installieren und konfigurieren Sie ser2net wie oben beschrieben.
  3. In Gladys, installieren Sie die Integration Teleinfo, dann geben Sie die IP-Adresse der ser2net-Maschine und den Port (2000) an.
  4. Klicken Sie auf Verbindung testen: Die Zählernummer und die aktuelle Leistung werden angezeigt. Fügen Sie dann den Zähler über den Tab Entdeckung hinzu.

Der Verbindungsstatus im Konfigurationsbildschirm zeigt klar das Problem an: Erreichbarer Gateway oder verbunden, aber keine gültige Rahmen (falsche Geschwindigkeit oder Verkabelung). Die detaillierte Anleitung finden Sie in der Dokumentation.

Was ich suche

  • Tester mit einem echten Zähler: Die Integration wird mit simulierten Frames getestet, aber noch nicht an einem echten Linky. @mutmut, du hattest angeboten, mit deinem LiXee TIC Hutschienenmodul hier zu testen: Gerne! Wenn dein teleinfo2mqtt den Port bereits liest, musst du es während des Tests stoppen (nur ein Programm gleichzeitig am seriellen Port). Rückmeldungen zu dreiphasigen und Standardmodus sind ebenfalls willkommen.
  • Eine Meinung zum seriellen Zugriff: @pierre-gilles, eine Hardwareklasse serial (für /dev/ttyUSB* / /dev/ttyACM*), gewährt durch den Benutzer wie coral-usb oder video, würde ser2net vermeiden. Sie würde auch anderen USB-Integrationen wie dem RFPlayer dienen, der ebenfalls im Thread gefragt ist. Ist das auf Gladys-Seite vorstellbar?

Vielen Dank für euer Feedback!

Danke @prohand!
Ich sehe, dass es nicht so einfach ist, sobald man etwas per USB anschließen muss, ich hatte mir Plug&Play wie bei teleinfo2mqtt vorgestellt :frowning:

Installierst du es auf dem Host oder im Gladys-Docker oder im Docker der externen Integration?

Heißt das, dass ich, wenn ich von historisch auf Standard umstelle, die YAML-Datei ändern und den Dienst neu starten muss?

Wie wird er automatisch erkannt? Durch den obigen Code?
Ist es nicht möglich, die Frames zu lesen, den Inhalt zu analysieren und daraus zu schließen, ob historisch oder Standard vorliegt?
Die Variablen darin sind für beide deutlich unterschiedlich, ich dachte, es wäre einfacher :frowning:

Sehr gut, denn teleinfo2mqtt gibt alle Informationen bei jedem Polling (derzeit alle 10 Sekunden, da sonst zu viele Daten) zurück, auch wenn sich einige nicht ändern (z. B. Tempo-Rot-Tag).
Allerdings, für den PAPP (Sofortleistung im historischen Modus, ich kenne das Äquivalent im Standardmodus nicht), ist es möglich, dies niedriger einzustellen (z. B. auf 1 Sekunde)?
Ich verwende es, um zu sehen, ob es zu einer Überschreitung kommt (und Lastabwurf zu verwalten), und in 15 Sekunden kann der Linky „ausschalten“, wenn zu viel Leistung zum Zeitpunkt T gezogen wird (z. B. Auto laden + Warmwasser + Heizung).

Letzter Punkt, ich habe virtuelle MQTT-Geräte, um meine Tempo-Indizes zu verwalten, wie sollte ich vorgehen, um (historisch, conso30, cout30 usw.) zu dieser Integration zu migrieren?

Danke @mutmut für diese guten Fragen! Ich gehe Punkt für Punkt darauf ein.

1. Wo installiere ich ser2net?

  • Direkt auf der Maschine (dem Host), an die das LiXee-Modul per USB angeschlossen ist, mit sudo apt install ser2net.
  • Weder im Gladys-Docker noch in dem der Integration: Keiner der beiden sieht den USB-Port.
  • Zur Info, teleinfo2mqtt ist „Plug & Play“, weil du ihm den Port mit --device in seinem eigenen docker run gibst. Eine externe Integration kann das nicht tun: Gladys erstellt seinen eigenen Container, und ohne Zugriff auf den seriellen Port.

2. Wechsel von historisch zu standard: YAML ändern?

  • Ja: Du ersetzst 1200e71 durch 9600e71, dann sudo systemctl restart ser2net.
  • Das kommt normalerweise nur einmal im Leben des Zählers vor, wenn du den Wechsel in den Standardmodus anfordest.
  • Wenn du es vergisst, sagt dir die Integration das in ihrem Status: „Verbunden, aber kein gültiger TIC-Rahmen: Überprüfen Sie die ser2net-Geschwindigkeit (1200 oder 9600 Baud).“

3. Wie wird der Modus erkannt?

  • Genau wie du es beschreibst: Die Integration liest die Frames. Im historischen Modus sind die Felder durch ein Leerzeichen getrennt, im Standardmodus durch eine Tabulator. Die Namen der Felder (PAPP, SINSTS…) ändern sich auch.
  • Aber die Geschwindigkeit spielt eine Stufe tiefer. Bei der falschen Geschwindigkeit erhält man nur unlesbare Bytes, also keine Frames zur Analyse. Und es ist ser2net, der den seriellen Port mit der Geschwindigkeit aus seiner Konfigurationsdatei öffnet, nicht die Integration.
  • Ein Ansatz: ser2net verwaltet das RFC 2217-Protokoll, das es dem Client ermöglicht, die Geschwindigkeit remote zu ändern. Die Integration könnte dann selbst 1200 und 9600 versuchen.

4. PAPP öfter als alle 15 s?

  • Die veröffentlichten Werte in Gladys gehen nicht unter 15 s. Gladys begrenzt eine Integration auf 300 Werte pro Minute, und jeder Wert wird zu einer Zeile in der Historie. Ein dreiphasiger Zähler im Standardmodus würde diese Grenze schnell überschreiten.
  • Aber für die Lastabschaltung braucht man die Historie nicht. Der Trigger „Überschreitung der abonnierten Leistung“ analysiert jeden Frame, also alle 1 bis 2 s, unabhängig vom Veröffentlichungsintervall:
    • im historischen Modus basiert er auf ADPS, das der Zähler sendet, sobald die abonnierte Stromstärke überschritten wird;
    • im Standardmodus (das Äquivalent zu PAPP ist SINSTS) vergleicht er SINSTS mit der abonnierten Leistung (PREF).
  • Er löst sich einmal pro Überschreitung aus. Die Überschreitung gilt nach 60 s ohne neues Signal als beendet.
  • Die Aktion „Zähler lesen“ gibt auch den zuletzt empfangenen Frame (1 bis 2 s alt) zurück, und nicht den zuletzt veröffentlichten Wert. Du kannst ihn also in einer Szenenbedingung verwenden.

5. Migriere deine MQTT-Geräte (Tempo-Index, Historie, conso30, cout30)

  • conso30 / cout30: Nichts zu erstellen. Gladys berechnet sie allein aus den Indizes, die von der Integration gesendet werden, wie beim ZLinky. Die Tempo-Preise werden im Gladys-Energievertrag eingestellt.
  • Historie: Die Integration kann keine alten Werte importieren, sie veröffentlicht nur die aktuellen Werte.
  • Gladys hat eine „Migrieren“-Funktion, die die Historie, Szenen und Dashboards von einem Gerät zum anderen verschiebt. Heute existiert der Button nur bei veralteten Integrationen (Netatmo, Tuya, Hue…), nicht bei MQTT. @pierre-gilles, könnten wir ihn für MQTT-Geräte öffnen?
  • Achtung bei den Einheiten: Die Integration veröffentlicht die Indizes in kWh. Wenn deine MQTT-Indizes in Wh sind, würde eine Migration die Werte ohne Umrechnung verschieben.
  • In der Zwischenzeit: Behalte deine alten MQTT-Geräte für ihre Historie und lasse beide parallel laufen.