Files
kc868-a2_solar/emulator/Dockerfile
T
gilles a8f0d6ccba Initial commit — KC868-A2 contrôleur solaire ESP32
Fonctionnalités :
- Lecture RS485 Modbus Epever Tracer 4210N (115200 bps, FC03/FC04/FC16)
- Moteur de règles JSON (LittleFS) — commande automatique des relais
- Interface web mobile-first (dashboard, règles, config, historique, EPEVER, debug)
- WiFi AP+STA simultanés avec reconnexion automatique et portail captif
- mDNS configurable (pv.local par défaut)
- Configuration registres EPEVER depuis l'UI (18 registres holding)
- Historique basse/haute résolution avec graphes canvas
- VPN WireGuard optionnel (désactivé par défaut, config via UI)
- OTA firmware + filesystem via ElegantOTA
- Deep sleep / économie d'énergie

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-09 19:25:01 +02:00

97 lines
3.6 KiB
Docker

ARG DEBIAN_FRONTEND=noninteractive
ARG QEMU_TAG=esp-develop-9.2.2-20260417
ARG QEMU_ARCHIVE=qemu-xtensa-softmmu-esp_develop_9.2.2_20260417-x86_64-linux-gnu.tar.xz
# =============================================================================
# Stage 1 — extract ESP32 ROM blobs from the official pre-built package
# (these binary blobs are not built from source; we reuse them as-is)
# =============================================================================
FROM ubuntu:22.04 AS rom-extractor
ARG QEMU_TAG QEMU_ARCHIVE DEBIAN_FRONTEND
RUN apt-get update && apt-get install -y --no-install-recommends \
wget ca-certificates xz-utils \
&& rm -rf /var/lib/apt/lists/*
RUN wget -qO /tmp/qemu.tar.xz \
"https://github.com/espressif/qemu/releases/download/${QEMU_TAG}/${QEMU_ARCHIVE}" \
&& mkdir -p /tmp/rom \
&& tar -xJf /tmp/qemu.tar.xz -C /tmp/rom --strip-components=1 \
&& ls /tmp/rom/share/qemu/esp32*.bin
# =============================================================================
# Stage 2 — build patched QEMU from Espressif source
# Adds a silent stub for WiFi modem registers (0x60033C00) so the firmware
# does not crash with LoadStorePIFAddrError on first WiFi register access.
# =============================================================================
FROM ubuntu:22.04 AS qemu-builder
ARG QEMU_TAG DEBIAN_FRONTEND
RUN apt-get update && apt-get install -y --no-install-recommends \
git python3 python3-pip python3-tomli ninja-build pkg-config \
libglib2.0-dev libpixman-1-dev libslirp-dev libfdt-dev \
zlib1g-dev libpng-dev libgcrypt20-dev build-essential flex bison \
&& rm -rf /var/lib/apt/lists/*
# QEMU 9.x requires meson >= 1.1.0 — Ubuntu 22.04 ships an older version
RUN pip3 install --quiet 'meson>=1.5'
# Shallow clone of the exact release tag
RUN git clone --depth=1 --branch "${QEMU_TAG}" \
https://github.com/espressif/qemu.git /qemu
WORKDIR /qemu
# Inject WiFi modem stub into hw/xtensa/esp32.c
COPY wifi_stub_patch.py /tmp/
RUN python3 /tmp/wifi_stub_patch.py
# Configure and build — xtensa only, no UI, no docs
RUN ./configure \
--target-list=xtensa-softmmu \
--disable-docs \
--disable-gtk \
--disable-sdl \
--disable-vnc \
--disable-curses \
--disable-opengl \
--disable-virglrenderer \
--disable-spice \
--disable-dbus-display \
--disable-guest-agent \
--disable-capstone \
--disable-libudev \
--disable-libusb \
--disable-usb-redir \
--audio-drv-list= \
--enable-slirp \
--enable-fdt \
&& ninja -C build qemu-system-xtensa
# =============================================================================
# Stage 3 — final runtime image
# =============================================================================
FROM ubuntu:22.04
ARG DEBIAN_FRONTEND
RUN apt-get update && apt-get install -y --no-install-recommends \
python3 python3-pip \
libglib2.0-0 libpixman-1-0 libslirp0 libfdt1 libpng16-16 \
&& rm -rf /var/lib/apt/lists/*
# ROM blobs from the official pre-built package
RUN mkdir -p /usr/local/share/qemu
COPY --from=rom-extractor /tmp/rom/share/qemu/esp32*.bin /usr/local/share/qemu/
# Patched QEMU binary (built from source with WiFi stub)
COPY --from=qemu-builder /qemu/build/qemu-system-xtensa /usr/local/bin/qemu-system-xtensa
RUN chmod +x /usr/local/bin/qemu-system-xtensa
RUN pip3 install --quiet esptool
WORKDIR /emulator
COPY modbus_stub.py server.py entrypoint.sh ./
COPY ui/ ui/
RUN chmod +x entrypoint.sh
# 8888 = UI debug 3 volets 10080 = webserver ESP32
EXPOSE 8888 10080
ENTRYPOINT ["/emulator/entrypoint.sh"]