NEWS
[Gelöst] Adapter Smartmeter per ser2net und socat
-
Hallo zusammen,
ich bräuchte mal etwas Hilfe oder einen Denkanstoß in Sachen Smartmeter Adapter
Was bisher geschah:
ioBroker läuft hier in einer VM (VMM, nicht Docker) auf einem Synology NAS (Intel Architektur). Da das NAS samt aller anderer Netzwerk-Komponenten in einem Rack im Serverraum steht, aber unser Stromzähler im Hausanschlußraum untergebracht ist, kann ich die Smartmeter-Anbindung nur per Netzwerk (LAN-Dosen sind im HAR vorhanden) realisieren. In diversen Einträgen habe ich nun schon gelesen, dass es in einer ioBroker-Multihost-Umgebung funktioniert, aber ich möchte ungern noch eine zusätzliche Instanz und somit Baustelle (nicht negativ gemeint) aufmachen. Darüber hinaus soll die finale Konstellation mit einem Arduino Uno und WLAN-Shield abgebildet werden.
Der erste Schritt war also der Bau des Lesekopfs: TEKT5400S Fototransistor (lag hier eh noch in der Bastelkiste), 1k Widerstand, etwas Kabel, Lochrasterplatine, Lötkolben und fertig war die Laube. Das Ganze dann an P1, P6 und P10 an einem Pi3, Bluetooth deaktivieren und per raspi-config anpassen. Den Lesekopf mit Tape auf die Schnittstelle am eHZ-HW8E, Pi3 Neustart und ein cat /dev/ttyAMA0 liefert wunderbar Daten.
Zur Verifizierung, dass nicht nur Müll gelesen wird, habe ich vzlogger installiert, konfiguriert, gestartet und mich darüber gefreut, dass im vzlogger.log tatsächlich die Daten korrekt angezeigt werden (in diesem Fall 1.8.0, 1.8.1, 1.8.2 und 15.7.0). Somit war die erste Hürde genommen.
In Erinnerung an die guten alten Mainframe-Zeiten kam mir ser2net in den Sinn. Also installiert und per Config mit "192.168.55.72,9999:raw:0:/dev/ttyAMA0:9600 8DATABITS NONE 1STOPBIT" als TCP-Stream auf Port 9999 bereitgestellt.
Nun ging es an den ioBroker-Host. Hier das passende Gegenstück (socat) installiert, als Service eingerichtet und mit "/usr/bin/socat pty,link=/dev/ttyVSP0 tcp:192.168.55.72:9999" hochgefahren.
Das Resultat: Ein "cat /dev/ttyVSP0 | od -tx1" liefert Daten. Auch hier dann wieder den vzlogger installiert und geprüft, ob die Daten korrekt sind.
Somit habe ich nun also auf dem ioBorker ein serielles Device, welches mir die notwendigen Daten für den Adapter liefert.
Nun kommt aber das Problem:
Im Adapter habe ich die Einstellungen gemäß Screenshot vorgenommen.Der Adapter (im Debug-Modus) bringt mir folgende Einträge im ioBroker-Log:
Korrekte Daten kommen definitiv alle 2 Sekunden an. Diese kann ich im vzlogger.log sehen:
Der vzlogger ist natürlich nur kurz zum Testen gestartet und dann sofort wieder beendet. Das Serial-Device ist also nicht blockiert bzw. gelockt.
Hat jemand noch eine Idee?
Vielen Dank und beste Grüße
Levy -
Das Problem ist gelöst!Dies ist das Device oder besser gesagt der Symlink, welcher von "socat" angelegt wird:
lrwxrwxrwx 1 root root 10 Sep 1 14:53 ttyVSP0 -> /dev/pts/1
Folgt man dem Symlink, kommt das dabei heraus:
crw--w---- 1 root tty 136, 1 Sep 1 14:53 1
Da ioBroker unter dem Benutzer iobroker läuft, hat der Smartmeter-Adapter also gar keine Möglichkeit, das serielle Device anzusprechen.
Gegenprobe: Auf der Konsole als root (oder per sudo) den folgenden Befehl ausführen. Dieser sollte den Smartmeter-Adapter starten, die Datenpunkte im ioBroker anlegen und natürlich auch die Werte aktualisieren.
node smartmeter.js --force --logs
Um die Berechtigungen dahingehend anzupassen, dass auch ioBroker auf das Device zugreifen darf, kann sollte man direkt ein chmod auf /dev/pts/1 ausführen und danach die Datei /etc/fstab anpassen. Nach Anpassung der Datei werden die entsprechenden Recht direkt bei Systemstart eingetragen bzw. die Devices werden direkt mit den richtigen Rechten angelegt.Von nun an funktioniert der Smartmeter-Adapter einwandfrei.Viele Grüße
Levy -
Meinen vorigen Post bitte ignorieren! Diese Lösung ist a) nicht dauerhaft und b) widerspricht den Regeln für ein sicheres Linux-System.
Hier nun die korrekte Lösung für das Problem:
Damit socat als Dienst/Service startet, muss eine Datei socat.service im Verzeichnis /etc/systemd/system/ mit folgendem Inhalt anlegt werden:
[Unit] Description=SOCAT Listen Service After=network.target redis.service Wants=redis.service [Service] Type=simple User=iobroker ExecStart=/bin/bash -c '/usr/bin/socat pty,link=/tmp/ttyCOM tcp:192.168.55.72:9999' Restart=on-failure [Install] WantedBy=multi-user.target
Die IP-Adresse sowie der Port sollten den Angaben in ser2net angepasst sein.
Danach folgendes in der Shell ausführen:
root@iobroker:~# systemctl daemon-reload root@iobroker:~# systemctl start socat root@iobroker:~# systemctl status socat ● socat.service - SOCAT Listen Service Loaded: loaded (/etc/systemd/system/socat.service; disabled; vendor preset: enabled) Active: active (running) since Fri 2019-09-06 18:30:09 CEST; 4s ago Main PID: 26865 (socat) Tasks: 1 (limit: 4915) CGroup: /system.slice/socat.service └─26865 /usr/bin/socat pty,link=/tmp/ttyCOM tcp:192.168.55.72:9999 Sep 06 18:30:09 iobroker systemd[1]: Started SOCAT Listen Service. root@iobroker:~#
Sofern man nicht direkt als root arbeitet, sollte vor jedem Befehl sudo stehen.
Nun in der Instanz im ioBroker nur noch unter "Serielles Gerät: Name:" /tmp/ttyCOM eintragen.
So läuft socat unter dem Benutzer iobroker und funktioniert einwandfrei.
Viele Grüße
Levy -
ich mach das Thema mal auf
es gibt ein Problem wenn socat die Verbindung verliert
diese wird nicht wieder eaufgemacht.. somit verliert auch Smartmeter die Verbindung -
@arteck
An dieser Problematik sitze ich jetzt auch schon eine Weile. ser2net läuft ziemlich stabil, aber socat verliert ab und zu die Verbindung. Leider habe ich bisher noch keinen Weg gefunden, dies zu überwachen und im Fall der Fälle einen Reload bzw. Restart auszuführen. Ich hatte es mal mit der Dienstüberwachung probiert (auch per externem Script), aber leider zeigt socat ein "Alles in Ordnung" an, obwohl die Verbindung nicht da ist. Per Status oder PID fällt somit eine Überwachung weg.Am Optimalsten wäre es immer noch, wenn der smartmeter-Adapter selbst eine socat-Anbindung anbieten könnte. Der Adapter "sieht" ja, wenn keine Daten kommen und könnte den Dienst neu starten.
-
@arteck
Aaaaarggghhh... die Lösung ist so nah! Bitte vergiss socat. Das braucht man mittlerweile nicht mehr. Auf der einen Seite ser2net ist korrekt und dann im smartmeter-Adapter einfach die Konfiguration in der Zeile "Datenübertragung" auf "Netzwerk/TCP-Daten werden nur gelesen" setzen.Dann kann man im mittleren Bereich unter "TCP Server" und "TCP Port" die Daten von ser2net eintragen und es läuft.
Vielen Dank @apollon77 für dieses Feature!!! Muss socat trotzdem installiert bleiben, weil der Adapter diesen Dienst lokal nutzt oder kann das weg?
-
@levyko na super... klasse DANKE..
socat kann weg..