Ronny Eia 1bdc19b695 Add MQTT client + Home Assistant Discovery, verified end-to-end
Adds espressif/mqtt and mdns as the project's first external managed
component dependencies (neither ships with ESP-IDF core in v6.0.2
anymore). Once Wi-Fi connects, the device advertises itself on the LAN
as kvida-xxxxxx.local and serves a persistent settings page there for
MQTT broker host/port and credentials -- the ongoing config channel
beyond the one-time Wi-Fi captive portal.

mDNS auto-discovery of _mqtt._tcp was the original plan, but verified
against a real Home Assistant OS + Mosquitto add-on that it doesn't
reliably answer PTR queries on the LAN (confirmed with a raw mDNS
query from the host, parsed properly with dnspython after an earlier
naive byte-check gave a false positive). Manual host/port entry is
now the primary path; mDNS discovery still runs as a secondary
fallback attempt, retried every 30s, in case it works on other
networks.

On MQTT_EVENT_CONNECTED, publishes retained HA MQTT Discovery for a
diagnostic "connectivity" binary_sensor (grouped under a Kvida/Xylon
device block) plus an online/offline availability topic driven by
MQTT's own LWT. Verified end-to-end on real hardware: the device
appears in Home Assistant with a "Connected" Connectivity sensor.

Also extracts url_decode() (previously local to commissioning.cpp)
and a new device_id() helper into shared headers, since both
commissioning's Wi-Fi form and the new MQTT settings form need them.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-07-10 18:13:34 +02:00

kvida-os

Fastvare for Kvida — en konfigurerbar automasjonsplattform (ESP32-C6) fra Xylon.

Visjon og arkitektur er beskrevet i meta-repoet kvida. Dette repoet inneholder kun fastvaren, bygget på ESP-IDF (C++17).

Forutsetninger

  • Docker
  • WSL2
  • usbipd-win (for å videresende ESP32-C6 sin USB-seriellport fra Windows til WSL2 ved flashing)

Arkitektur

Lagdelt: drivers -> sensors -> profiles -> lua_runtime -> transport, se komponent-READMEene under components/ og AGENTS.md for detaljer. Bruker konfigurerer enheten visuelt (Blockly -> Lua), ikke ved å skrive/kompilere fastvare.

Quickstart

# Bygg toolchain-imaget (Espressif sitt offisielle ESP-IDF v6.0.2-image)
docker compose build

# Velg target (kjøres én gang; genererer sdkconfig)
docker compose run --rm build idf.py set-target esp32c6

# Bygg fastvaren
docker compose run --rm build idf.py build

# Flash + monitor (krever seriellport videresendt via usbipd-win til WSL2)
docker compose run --rm build idf.py -p <PORT> flash monitor

Prosjektet er pinnet til ESP-IDF v6.0.2 (se docker/Dockerfile).

Testing

Host-baserte enhetstester ligger per komponent, under <component>/test_apps/host/, bygget mot ESP-IDFs linux-target (ikke behov for kort) — se components/sensors/test_apps/host/ for et fungerende eksempel (verifisert i en ren kjøring: bygger, 4 tester passerer).

docker run --rm -v "$(pwd)":/project -w /project/components/sensors/test_apps/host espressif/idf:v6.0.2 \
  bash -lc 'idf.py --preview set-target linux && idf.py build && ./build/test_sensor_host.elf'

(Imagets entrypoint aktiverer ESP-IDF-miljøet automatisk — ikke source export.sh selv.)

Merk: under gjentatte, raske kjøringer mot denne test_apps/*/build-mappen observerte jeg periodisk FileExistsError fra idf.py (og enkelte ganger ls/rm som var uenige om mappen fantes) — både via docker compose run og ren docker run. Mistenkelig likt kjent metadata-cache-lag i WSL2s DrvFs (/mnt/*) under raske create/delete-sykluser på tvers av containergrenser, ikke en feil i selve kodebasen (en ren, isolert kjøring bygger og består alltid). Hvis du støter på dette: slett build/sdkconfig i mappen fra Windows/PowerShell-siden og vent et par sekunder før du prøver igjen.

Status

main/ bygger og logger oppstart. components/sensors har et reelt Sensor-grensesnitt (include/sensor.h, Zephyr-inspirert: fetch/get-splitt, fixed-point verdier, finkornet kanal-enum, trigger-API) med et verifisert host-testoppsett. Resten av components/* inneholder foreløpig bare README-er som beskriver ansvar per lag. partitions.csv har et A/B OTA + LittleFS-oppsett med plassholder-størrelser (4MB flash) som bør justeres når ekte flash-størrelse/image-størrelse er kjent.

Description
No description provided
Readme 155 KiB
Languages
C++ 79%
C 11.9%
HTML 5.2%
CMake 3.2%
Dockerfile 0.7%