Im letzten Beitrag habe ich geschildert, wie man eine bereits laufende Installation des Modbus-Proxies von Debian11 und Python3.9 auf Debian12 mit Python3.9 aktualisieren kann.
Da ich aber bislang noch keinen Beitrag darüber geschrieben hatte, wie ich den Modbus-Proxy überhaupt als Dienst eingerichtet hatte, möchte ich dies nun auf einem aktuellen System nachholen.
Hierzu installieren wir unter Proxmox zu aller erst einen neuen Container mit Debian12.
Die Anleitung im Git-Repository des Modbus-Proxy bereitet hier nun die ersten, kleineren Schwierigkeiten… Das Problem, unter python3.9 konnte der Proxy ohne Virtuelle Umgebung ausgeführt werden und mit pip install modbus-proxy
installiert werden.
Dies scheint nun nicht mehr zu funktionieren, denn es erscheint folgende Fehlermeldung:
root@modbus-proxy2:~# pip install modbus-proxy[yaml]
error: externally-managed-environment
× This environment is externally managed
╰─> To install Python packages system-wide, try apt install
python3-xyz, where xyz is the package you are trying to
install.
If you wish to install a non-Debian-packaged Python package,
create a virtual environment using python3 -m venv path/to/venv.
Then use path/to/venv/bin/python and path/to/venv/bin/pip. Make
sure you have python3-full installed.
If you wish to install a non-Debian packaged Python application,
it may be easiest to use pipx install xyz, which will manage a
virtual environment for you. Make sure you have pipx installed.
See /usr/share/doc/python3.11/README.venv for more information.
note: If you believe this is a mistake, please contact your Python installation or OS distribution provider. You can override this, at the risk of breaking your Python installation or OS, by passing --break-system-packages.
hint: See PEP 668 for the detailed specification.
Code-Sprache: PHP (php)
Wir nutzen, wie in der Meldung empfohlen den Befehl pipx, müssen dieses aber erst einmal mit apt installieren:
root@modbus-proxy2:~# apt install pipx
Code-Sprache: PHP (php)
Nach erfolgter Installation von pipx, installieren wir den Modbus-Proxy über den Befehl pipx install modbus-proxy[yaml]
root@modbus-proxy2:~# pipx install modbus-proxy[yaml]
installed package modbus-proxy 0.6.8, installed using Python 3.11.2
These apps are now globally available
- modbus-proxy
⚠️ Note: '/root/.local/bin' is not on your PATH environment variable. These apps will not be globally accessible until your PATH is updated.
Run `pipx ensurepath` to automatically add it, or manually modify your PATH in your shell's config file (i.e. ~/.bashrc).
done! ✨ 🌟 ✨
Code-Sprache: PHP (php)
durch die Angabe von [yaml] hinter dem Paket geben wir gleich an, dass wir als Konfigurationsfile ein yaml file nutzen möchten.
Eine Alternative hierzu wäre ansonsten toml – dann über den Befehl pipx install modbus-proxy[toml]
Wie wir anhand der Meldung sehen können, wurde der Modbus-Proxy erfolgreich unter dem Pfad /root/.local/bin installiert. Allerdings muss dieser noch zur PATH-Variablen hinzugefügt werden.
Dies machen wir mit pipx ensurepath
Anschließend kümmern wir uns um das Config-File – dazu wechseln wir in folgendes Verzeichnis:/root/.local/pipx/venvs/modbus-proxy/lib/python3.11/site-packages
und erstellen mit nano ein file wie z.B. mproxy-config.yaml
root@modbus-proxy2:~/.local/pipx/venvs/modbus-proxy/lib/python3.11/site-packages# nano mproxy-conf.yaml
devices:
- modbus:
url: 192.168.52.120:503
listen:
bind: 0:5030
Code-Sprache: PHP (php)
Der Inhalt der Konfiguration ist relativ simpel aufgebaut und zeigt auf das Modbus-Gerät (hier 192.168.52.120:503) und auf welchen Port der Proxy für Verbindungen hören soll (hier: 5030)
Nun müssen wir noch den Dienst konfigurieren – und wechseln dazu in das Verzeichnis /etc/systemd/system
Mit nano (oder einem anderen Editor) erstellen wir dann die Datei mproxy.service
mit folgendem Inhalt:
[Unit]
Description=Modbus-Proxy service
After=network.targef
[Service]
Type=simple
Restart=always
ExecStart = /root/.local/bin/modbus-proxy -c root/.local/pipx/venvs/modbus-proxy/lib/python3.11/site-packages/mproxy-con>
[Install]
WantedBy=multi-user.target
Code-Sprache: JavaScript (javascript)
Wichtig hier sind die genauen Pfadangaben unter ExecStart
…
Dann führen wir noch folgende Befehle aus um den Dienst anzulegen:systemctl daemon-reload
systemctl enable mproxy.service
systemctl start mproxy.service
Der Aufruf sollte nun ohne Fehler erfolgen & zur Kontrolle, ob das ganze auch korrekt ausgeführt wird, können wir dann systemctl status mproxy.service
nutzen:
root@modbus-proxy2:/etc/systemd/system# systemctl status mproxy.service
* mproxy.service - Modbus-Proxy service
Loaded: loaded (/etc/systemd/system/mproxy.service; enabled; preset: enabled)
Active: active (running) since Sun 2024-01-28 14:08:22 UTC; 1min 28s ago
Main PID: 966 (modbus-proxy)
Tasks: 2 (limit: 18723)
Memory: 13.1M
CPU: 73ms
CGroup: /system.slice/mproxy.service
`-966 /root/.local/pipx/venvs/modbus-proxy/bin/python /root/.local/bin/modbus-proxy -c root/.local/pipx/ven>
Jan 28 14:08:22 modbus-proxy2 systemd[1]: Started mproxy.service - Modbus-Proxy service.
Jan 28 14:08:22 modbus-proxy2 modbus-proxy[966]: 2024-01-28 14:08:22,989 INFO modbus-proxy: Starting...
Code-Sprache: PHP (php)
Leider funktioniert in meiner neuen Bookworm-Installation die Anleitung nicht. Die YAML-Datei wird nicht gefunden:
—————————- snip ———————————
root@bbb3:~/.local/pipx/venvs/modbus-proxy/lib/python3.11/site-packages# modbus-proxy -c /root/.local/pipx/venvs/modbus-proxy/lib/python3.11/site-packages/mproxy-conf.yaml
Traceback (most recent call last):
File „/root/.local/bin/modbus-proxy“, line 8, in
sys.exit(main())
^^^^^^
File „/root/.local/pipx/venvs/modbus-proxy/lib/python3.11/site-packages/modbus_proxy.py“, line 343, in main
asyncio.run(run())
File „/usr/lib/python3.11/asyncio/runners.py“, line 190, in run
return runner.run(main)
^^^^^^^^^^^^^^^^
File „/usr/lib/python3.11/asyncio/runners.py“, line 118, in run
return self._loop.run_until_complete(task)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File „/usr/lib/python3.11/asyncio/base_events.py“, line 653, in run_until_complete
return future.result()
^^^^^^^^^^^^^^^
File „/root/.local/pipx/venvs/modbus-proxy/lib/python3.11/site-packages/modbus_proxy.py“, line 336, in run
config = create_config(args)
^^^^^^^^^^^^^^^^^^^
File „/root/.local/pipx/venvs/modbus-proxy/lib/python3.11/site-packages/modbus_proxy.py“, line 295, in create_config
config = load_config(args.config_file) if args.config_file else {}
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File „/root/.local/pipx/venvs/modbus-proxy/lib/python3.11/site-packages/modbus_proxy.py“, line 212, in load_config
import yaml
ModuleNotFoundError: No module named ‚yaml‘
—————————- snip ———————————
Auch die Varianten
– Aufruf mit „modbus-proxy -c root/.local/pipx/venvs/modbus-proxy/lib/python3.11/site-packages/mproxy-conf.yaml“ (ohne Backslash vor root)
– Symbolischer Link auf die YAML-Datei
führen auf denselben Fehler. Im Netz gibt es einige Hinweise auf den Fehler „ModuleNotFoundError: No module named ‚yaml'“, die sich aber nicht auf Bookworm bzw. pipx beziehen.
Ich bin ratlos. Hast du einen Tipp?
Viele Grüße
einen tipp direkt nicht.
Ich würde dennoch den Hinweisen im Netz dazu folgen, auch, wenn diese sich nicht explizit auf Bookworm beziehen.
Vermutlich fehlen dir die Pakete pyyaml oder ähnliches… das sollte dann m.E. unabhängig der OS Version sein.
Den Fehler hatte ich auch. Ich hatte vergessen
pip install modbus-proxy[yaml]
zu installieren. „pip install modbus-proxy“ hatte ich schon. Aber dann fehlt die YAML Unterstützung.