All checks were successful
Testing Build / build (push) Successful in 8m44s
Adds an optional per-printer integration with KXGauge (https://gitea.it-drui.de/viewit/kxgauge), a small ESP32 round-face display that shows printer status as an emotion and hotend temperature as a color ring. KXGauge only exposes a GET-only HTTP API with no push/websocket, so the bridge actively pushes to it from the existing MQTT callbacks (_on_temp for the heat ring, _on_print + offline transitions for the emotion) whenever state actually changes, with a built-in dedupe so it doesn't spam the device every poll tick. - kxgauge_client.py: thin synchronous HTTP client (mirrors spoolman_client.py's shape - called from the MQTT reader thread). - New [kxgauge]/[kxgauge_mapping] config.ini sections; the mapping (kobra_state -> KXGauge emotion) is user-editable with a sane default and falls back per-key if only partially configured. - Settings UI: new card under Integrations with enable/URL/target-temp fields, a per-state emotion mapping list, and a connection-test button (/api/kxgauge/test). - Multi-printer aware: kxgauge_url/enabled/heat_peak merge per [printer_N] like the existing power-switch settings. Also fixes a real bug found while testing this: _find_config_path() resolves to the live project config/config.ini, not a sandboxed path, so any test hitting /api/settings POST without stubbing it out will silently overwrite the real printer config. test_settings.py already guards against this - test_kxgauge.py now does too.
44 lines
1.4 KiB
Docker
44 lines
1.4 KiB
Docker
FROM python:3.11-slim-bookworm
|
||
|
||
WORKDIR /app
|
||
|
||
RUN apt-get update && apt-get install -y --no-install-recommends ffmpeg gcc python3-dev && rm -rf /var/lib/apt/lists/*
|
||
|
||
COPY requirements.txt .
|
||
RUN pip install --no-cache-dir -r requirements.txt && \
|
||
apt-get purge -y gcc python3-dev && apt-get autoremove -y && rm -rf /var/lib/apt/lists/*
|
||
|
||
COPY kobrax_moonraker_bridge.py .
|
||
COPY bridge_*.py .
|
||
COPY web/ ./web/
|
||
# Statische Daten (orca_filaments.json etc.) liegen in /app/static/, NICHT in
|
||
# /app/data/ — letzteres wird vom User als Volume gemountet (Runtime-State).
|
||
COPY data/ ./static/
|
||
COPY config_loader.py .
|
||
COPY env_loader.py .
|
||
COPY kobrax_client.py .
|
||
COPY orca_filaments.py .
|
||
COPY spoolman_client.py .
|
||
COPY kxgauge_client.py .
|
||
COPY gcode_store.py .
|
||
COPY gcode_meta.py .
|
||
COPY camera.py .
|
||
COPY credentials.py .
|
||
COPY VERSION .
|
||
COPY anycubic_slicer.crt .
|
||
COPY anycubic_slicer.key .
|
||
COPY config/config.ini.example /app/config/config.ini.example
|
||
|
||
# config/ ist ein Volume-Mountpoint – beim Start wird config.ini aus .env migriert
|
||
# falls noch keine config.ini vorhanden ist.
|
||
RUN mkdir -p /app/config && mkdir -p /app/data
|
||
|
||
# Daten-Verzeichnis fest auf /app/data (sonst würde der Binary-Default <exe-dir>/data greifen)
|
||
# und Container-Erkennung für den Bridge-Restart (Supervisor startet neu statt subprocess).
|
||
ENV KX_DATA_DIR=/app/data
|
||
ENV KX_IN_DOCKER=1
|
||
|
||
EXPOSE 7125
|
||
|
||
ENTRYPOINT ["python", "kobrax_moonraker_bridge.py"]
|