FHEM in Docker: convert Befehl schlägt fehl

Begonnen von AndreasS, 04 Juni 2025, 23:01:52

Vorheriges Thema - Nächstes Thema

AndreasS

Hallo, liebe FHEM Community!

Ich betreibe seit Jahren eine FHEM Instanz auf einem Raspi im Keller, verbunden mit meiner Wärmepumpe und einigen LaCrosse-Sensoren.

Nun habe ich eine zweite Instanz auf einem neueren Mini-PC (Debian) in Betrieb genommen. Dort läuft FHEM in Docker. Und es soll per FHEM2FHEM die Readings der älteren Instanz einsammeln.

So weit funktioniert es auch, bis auf ein paar Probleme, die ich nicht beseitigt bekomme.

Einige Readings sollen in eine PNG Grafik geschrieben werden, die ich auf einer Webseite einbinde.
Es gibt dafür eine SVG-Vorlage, die konvertiert werden soll. Das tut ein FReplacer mit diesem PostCommand:

convert /opt/fhem/www/images/status.svg -type GrayScale -depth 8 /opt/fhem/www/images/status.png 2>/dev/null &
Genau dieser Befehl schlägt fehl. Die status.png wird nicht erzeugt. Ich werde aus der Fehlermeldung aber nicht zu 100% schlau.

convert-im6.q16: delegate failed `'rsvg-convert' -o '%o' '%i'' @ error/delegate.c/InvokeDelegate/1966.
convert-im6.q16: unable to open file `/tmp/magick-djGX3GJQJuoW-GdWwwHyStztW0EyL0dQ': No such file or directory @ error/constitute.c/ReadImage/619.
convert-im6.q16: no images defined `/opt/fhem/www/images/status.png' @ error/convert.c/ConvertImageCommand/3229.

Meine beste Vermutung ist, dass das Schreiben einer temporären Datei in den /tmp Ordner vom Container nicht erlaubt wird.

Ich habe dasselbe Kommando testweise auf einer aus dem Container geführten Shell manuell ausgeführt und mit einer Umgebungsvariable versucht, ein anderes temporäres Verzeichnis zur Verfügung zu stellen, dieses liegt im gemounteten Volume und nach chmod 777 definitiv beschreibbar für dem fhem User. Dennoch schlägt es fehl und liefert genau dieselben Meldungen, die auch im FHEM Log standen:

root@d35154b97e79:/opt/fhem# MAGICK_TMPDIR=/opt/fhem/temp convert /opt/fhem/www/images/status.svg -type GrayScale -depth 8 /opt/fhem/www/images/status.png
convert-im6.q16: delegate failed `'rsvg-convert' -o '%o' '%i'' @ error/delegate.c/InvokeDelegate/1966.
convert-im6.q16: unable to open file `/opt/fhem/temp/magick-3Qn76UApJsFkt7Thrz02R7JEPs2XuVIf': No such file or directory @ error/constitute.c/ReadImage/619.
convert-im6.q16: no images defined `/opt/fhem/www/images/status.png' @ error/convert.c/ConvertImageCommand/3229.

Hier zur Vollständigkeit meiner Dokumentation die Docker-Compose YAML:
(die einzige Besonderheit am Setup ist, dass ich imagemagick installiere, damit convert überhaupt erst zur Verfügung steht)

$ cat compose.yaml
services:
  fhem:
    build:
      context: .
      dockerfile: fhem-dockerfile
    pull_policy: build
    ports:
      - "8083:8083"
    volumes:
      - "/opt/fhem:/opt/fhem"
      - "/var/www/html:/var/www/html"
    restart: always
    environment:
      TZ: Europe/Berlin
      FHEM_UID: 1002
      FHEM_GID: 1002

Und das Dockerfile:
$ cat fhem-dockerfile
FROM ghcr.io/fhem/fhem-docker:5-bookworm
RUN LC_ALL=C DEBIAN_FRONTEND=noninteractive apt-get update
RUN LC_ALL=C DEBIAN_FRONTEND=noninteractive apt-get install -qqy --no-install-recommends imagemagick
RUN LC_ALL=C apt-get autoremove -qqy && LC_ALL=C apt-get clean

Vielen Dank im voraus für jede Hilfe!

Guybrush

das ist ziemlich sicher ein fehler von imagemagick. da passt irgendwas bei deiner installation/config nicht. mehr kann dir dazu mit den infos aber vermutlich niemand sagen

passibe

#2
Zitat von: AndreasS am 04 Juni 2025, 23:01:52convert-im6.q16: unable to open file `/tmp/magick-djGX3GJQJuoW-GdWwwHyStztW0EyL0dQ': No such file or directory @ error/constitute.c/ReadImage/619.
Diese Fehlermeldung ist nur Symptom.

Der eigentliche Fehler ist:
Zitat von: AndreasS am 04 Juni 2025, 23:01:52convert-im6.q16: delegate failed `'rsvg-convert' -o '%o' '%i'' @ error/delegate.c/InvokeDelegate/1966.
Das rsvg-convert kann nicht ausgeführt werden. Daraufhin "stirbt" der convert-Befehl aus dem PostCommand aber nicht, sondern läuft aus irgendeinem Grund weiter – aber ohne zu checken, dass schon der vorherige Schritt nicht geklappt hat. Weil durch rsvg-convert ja nichts generiert werden konnte, existiert dann eben keine /tmp/magick-Datei, die weiterverarbeitet werden könnte und es kommt zur no such file-Fehlermeldung.

Lösung ist, rsvg-convert (in librsvg2-bin enthalten) zu installieren. Also in deinem Dockerfile:RUN LC_ALL=C DEBIAN_FRONTEND=noninteractive apt-get install -qqy --no-install-recommends imagemagick librsvg2-bin
(Kann jetzt auch gut sein, dass das alles Quatsch ist, ich konnte das jetzt natürlich nicht 1:1 testen, aber sollte™ funktionieren.)

AndreasS

Vielen lieben Dank! Damit kam ich schon mal einen Schritt weiter. Nachdem ich die besagte Library installiert hatte, lief der Befehl tatsächlich zumindest ohne Fehlermeldung durch und konnte die Zieldatei schreiben.

Nun ja, es gab keine Fehlermeldungen mehr, ich würde es aber dennoch nicht wirklich "erfolgreich" nennen, weil das Resultat kein valides PNG-Bild ist. Nur ein etwa 200 Byte kleiner Zeichenbrei, der sich nicht öffnen lässt. Wahrscheinlich fehlt noch irgendetwas anderes, wer weiß.

Ich hab nun allerdings beschlossen, als "work-around" einfach die SVG Datei direkt zu verwenden, ohne vorherige Konvertierung. Damals, als ich mein FHEM-Projekt gestartet habe, war die Umwandlung vielleicht noch nötig, weil ich es auch auf einem Kindle anzeigen liess. Heutzutage unterstützt auch wirklich jeder Browser SVG und dieser Zwischenschritt ist nicht mehr wirklich nötig.