Vorweg:
Ich habe auf meinem Cerbo-S GX zusätzlich evcc installiert. Darin ist auch die Steuerung (PV-Überschuss) meiner Brauchwasserwärmepumpe integriert, deren Werte per Modbus über einen USB-RS485-Adapter ausgelesen werden.
Problem:
Mein Script zum Auslesen der Werte kommt sich scheinbar immer wieder mit einem anderen Dienst ins Gehege. Ich nehme an, dass dort regelmäßig nach neuen Geräten gescant wird. Zumindest ist auf dem Adapter ständig Datenverkehr zu verzeichnen dessen Quelle ich nicht identifizieren kann und nach einigen Stunden hängt sich der Adapter auch immer auf.
Gibt es irgendeine Möglichkeit herauszufinden, welcher Dienst noch auf /dev/ttyUSB0 zugreift? Und wenn ja, wie kann man das verhindern?
“serial-starter” kann ich schon mal ausschließen, da habe ich den USB-Adapter zur ignore-Liste hinzugefügt. Leider ohne Erfolg.
Update: er war es doch … aber die Probleme reichen scheinbar noch tiefer.
Ich antworte mir mal selbst
Nachdem ich ewig versucht habe den Cerbo daran zu hindern ständig auf den RS485-Adapter zuzugreifen, habe ich den Adapter jetzt an einen alten Raspi 1B gehangen und dort eine Modbus-TCP-Bridge installiert. Ist vollkommener overkill, aber funktioniert.
Für Ideen und Vorschläge bin ich aber weiterhin offen …
hallo,
da gibt es eine sehr einfache loesung, vor allem, weil du ein eigenes script benutzt:
das script muss nur das device umbenennen und ein dummy-file unter dem alten namen anlegen, dann kommt dir ein anderes programm mehr in die quere. allerdings kann das device, wenn es vom usb getrennt und wieder verbunden wird, einen anderen namen bekommen. du kannst natuerlich auch das dummy-file mal weglassen. sollte auch funktionieren.
ich mache das manchmal unter linux, wenn ich ein filesystem pruefen will, damit mir der automounter nicht in die quere kommt!
Vielen Dank!
Manchmal liegt die Lösung doch so nah …
Folgendes steht jetzt am Anfang meines Scripts:
(es geht bestimmt auch einfacher, aber meine Kenntnisse sind “noch ausbaufähig” )
#!/bin/sh
exec 2>> /var/log/evcc/wwwp_temp_err.log
COUNT=0
STRING1="E: ID_SERIAL_SHORT=A5069RR4"
STRING2=$(udevadm info --name=/dev/wwwp_modbus | grep -i "ID_SERIAL_SHORT")
if [ "$STRING1" == "$STRING2" ] ; then
COUNT=11
fi
while [ "$COUNT" -le 9 ]; do
STRING2=$(udevadm info --name=/dev/ttyUSB$COUNT | grep -i "ID_SERIAL_SHORT")
if [ "$STRING1" == "$STRING2" ] ; then
mv /dev/ttyUSB$COUNT /dev/wwwp_modbus
COUNT=11
else
COUNT=$(( $COUNT + 1 ))
fi
done
if [ "$COUNT" = 10 ]; then
exit 1
fi
[restliches Script...]
Das Skript prüft also zu Beginn, ob der USB-Adapter bereits korrekt eingebunden ist.
Ist dies nicht der Fall, prüft es die Adressen /dev/ttyUSB0-9 ob der Adapter an einem dieser Punkte eingebunden ist. Findet es den Adapter hier, wird er entsprechend umbenannt. Ansonsten wird mit ‘exit 1’ beendet.
Es gibt übrigens sogar eine Anleitung von Victron wie man den serial-starter ausbremsen kann: Link
Das ändert aber nix daran, dass die Verbindung immer wieder mal unterbrochen wird und dabei wechselt der Adapter immer von /dev/ttyUSB0 zu /dev/ttyUSB1 und beim nächsten Mal wieder zurück.