unverbraucht / hanazeder_server

MQTT server for reading from Hanazeder FP and SHC heating pumps
Apache License 2.0
3 stars 0 forks source link

ModuleNotFoundError: No module named 'serial_asyncio' error, trying to run the server inside a docker container #3

Closed da-bernie closed 2 years ago

da-bernie commented 2 years ago

Hallo Herr Read,

ich habe versucht den Server in einen docker container zu stecken, scheitere aber an einer Fehlermeldung.

Dockerfile:

FROM python:3.10-alpine3.16

RUN apk update && \
    apk add usbutils bash wget
WORKDIR /usr/hanazeder_server
RUN python -m venv /usr/hanazeder_server/venv
ENV PATH="/usr/hanazeder_server/venv/bin:$PATH"
RUN pip3 install --no-cache-dir --upgrade pip && \
    pip3 install --no-cache-dir hanazeder_server

#Eigentlicher Einstieg, Crash aber
#ENTRYPOINT [ "python", "-m", "hanazeder_server.mqtt", "--serial-port/dev/serial/by-id/usb-FTDI_FT231X_USB_UART_DN028GKE-if00-port0", "192.168.2.3"]
#Einstiegspunkt für Debug, Container läuft weiter
ENTRYPOINT ["tail", "-f", "/dev/null"]

Das bauen des Containers bringt keine Fehlermeldung.

Ich verbinde mich dann mit dem Container und sehe folgende Punkte in der Shell: Das Serial-Device ist vorhanden mit root.dailout rw-Rechten.

Wenn ich aber entweder den Server starte, oder auch nur versuche die Heizungssteuerung abzufragen bekommen ich immer die Fehlermeldung:

Traceback (most recent call last):
File "/usr/local/lib/python3.10/runpy.py", line 196, in _run_module_as_main
return _run_code(code, main_globals, None,
File "/usr/local/lib/python3.10/runpy.py", line 86, in _run_code
exec(code, run_globals)
File "/usr/local/lib/python3.10/site-packages/hanazeder_server/mqtt.py", line 8, in <module>
from hanazeder_server.BaseServer import BaseServer
File "/usr/local/lib/python3.10/site-packages/hanazeder_server/BaseServer.py", line 2, in <module>
from hanazeder.Hanazeder import HanazederFP, SENSOR_LABELS
File "/usr/local/lib/python3.10/site-packages/hanazeder/Hanazeder.py", line 3, in <module>
import serial_asyncio
ModuleNotFoundError: No module named 'serial_asyncio'

Das notwendige Paket pyserial wird aber bei der Containererstellung mit eingebaut.

Ein Quercheck ohne Docker-Container auf einem Ubuntu Server bringt den gleichen Fehler.

unverbraucht commented 2 years ago

Hallo,

danke für die Meldung. Das liegt vermutlich daran dass die Bibliothek die wir zum Auslesen verwenden ihre Dependencies nicht korrekt erklärt hat. Ich habe ein neues Release gemacht (1.2.1): https://github.com/unverbraucht/hanazeder_python/commit/a241e48271785cb8b99cf149fbc844908a936029

Jetzt müssen wir allerdings noch warten bis pypi die neue Version im Index hat, das kann bei poetry durchaus mal einen Tag dauern. Dann werde ich ein neues Release machen.

unverbraucht commented 2 years ago

Sollte mit Release 1.1.0 vom Server behoben sein, bitte testen.

da-bernie commented 2 years ago

Ist getestet und funktioniert. Vielen Dank.

Dockerfile

FROM python:3.10-alpine3.16

RUN apk update && \
    apk add usbutils bash wget

RUN pip3 install --no-cache-dir --upgrade pip && \
    pip3 install --no-cache-dir hanazeder_server

COPY entrypoint.sh /entrypoint.sh

ENTRYPOINT ["/entrypoint.sh"]

entrypoint.sh

#!/bin/sh

python -m hanazeder_server.mqtt --serial-port /dev/serial/by-id/<Serialdevice-ID> --mqtt-server <IP-Adress>
unverbraucht commented 2 years ago

Top, danke für die Rückmeldung. Das Dockerfile nehme ich mit ins Repo auf und wenn ich etwas Zeit am Wochenende finde würde ich die Images vom CI-System automatisch bauen und pushen lassen.

da-bernie commented 2 years ago

Bitte gerne. So ist das Dockerimage aber sehr "persönlich", die Parameter über ein docker-compose rein zu reichen ist einfach, aber ein entrypoint Skript das das auch verarbeiten kann, kann ich nicht aus dem Ärmel schütteln. Mein docker-compose.yml für den Container sieht aktuell so aus:

version: '3'                                                                                                                                                                                                                                                                                                                 

services:
  hanazeder:
    build: ./hanazeder
    restart: unless-stopped
    environment:
      - MQTT_BROKER=
      - SERIAL_DEVICE=
    devices:
      - /dev/serial/by-id/usb-FTDI_FT231X_USB_UART_DN028GKE-if00-port0
    volumes:
      - /etc/timezone:/etc/timezone:ro
      - /etc/localtime:/etc/localtime:ro