SOVSystems -

komponenter och lösningar som bygger en

Digital Twin för hemmet

En återanvändbar templateplattform för energidata, styrning och visualisering – byggd för att paketeras och säljas. Från referensinstallation till skräddarsydd kundlösning.

Kom igång
Vision & Mål

En digital tvilling av hemmet

Syftet med SOVSystems är att bygga en digital tvilling av ett hem för att optimera och minska elförbrukningen samt kostnaden för köpt el. Produkten kombinerar lokal hårdvara, öppen programvara och en intelligent heuristikmotor i ett sammanhållet system.

Firmware

MQTT-enheter baserade på ESP32 och tredjepartshårdvara som publicerar telemetri till systemet.

RPIHUB

Raspberry Pi som kör MQTT-broker, datalager, API och statisk Digital Twin-webb lokalt på LAN.

Digital Twin UI

Statisk webbapp som visualiserar nuläge, historik och planerade åtgärder i realtid.

Baltazar

AI/heuristikmotor som analyserar priser och telemetri för att ge förslag och styra laster.

Systemöversikt

Arkitektur och dataflöde

Systemet är uppbyggt kring en central hub – RPIHUB – som tar emot data från alla enheter i hemmet via MQTT, lagrar det i en lokal SQLite-databas och gör det tillgängligt för UI och AI-motor. Nedan visas hur dataflödet ser ut från sensorer till dashboard.

Den minsta fungerande produkten (MVP) kräver endast att enheter publicerar till MQTT, att RPIHUB kör Mosquitto och ingest, och att API:t serverar UI:n. Baltazar kan aktiveras i ett senare steg när tillräckliga signaler finns tillgängliga.

RPIHUB

Hjärtat i systemet – vad körs på Pi:n

RPIHUB är produkten som körs lokalt på LAN. Den samlar alla komponenter i ett enda system: MQTT-broker, datainsamling, API och webbgränssnitt. Allt körs som systemd-services för stabil drift.

Komponenter

  • Mosquitto MQTT-broker
  • mqtt_ingest.py – MQTT → SQLite
  • open_meteo_ingest.py – väderdata
  • FastAPI + statisk Digital Twin UI
  • Integrations-adaptrar (tredjepart)
  • SQLite: /var/lib/rpihub/telemetry.db

Konfiguration via env-fil

RPIHUB konfigureras via en env-fil. De viktigaste nycklarna:

  • RPIHUB_DB – sökväg till SQLite-databas
  • RPIHUB_STATIC_ROOT – måste innehålla DigitalTwin_WebApp/
  • RPIHUB_MQTT_HOST/PORT – broker-adress
  • RPIHUB_MQTT_TOPICS – vilka topic-filter att ingest:a
Databas & Konfiguration

SQLite-struktur och DT-secrets

Databasen är medvetet enkel – ingen ORM, bara ren SQL. Schemat initieras vid start och definieras i mqtt_ingest.py och api_server.py. För att hålla hemligheter separerade från konfiguration delas DT-data upp i två filer.

raw_messages

Råa MQTT-meddelanden för debug och spårbarhet. Innehåller received_at_utc, topic och payload.

points

Normaliserade tidsserier med time_local, metric, value, unit och source. Indexerad på datum och metric för snabba uppslag.

daily_stats

Dagliga summeringar per datum: produktion, konsumtion, import, export, charge och discharge.

load_events

Planerade och registrerade last-event med load_id, start/slut-tid, power_kw och anteckningar.

dt_config.json

Masterdata och topologi – inte hemlig. Kan delas och versionhanteras fritt.

dt_secrets.json

Lagrar enbart bearer_token, refresh_token, client_secret och api_key. Indexeras per site och entity. Sätts till chmod 600 på Pi.

MQTT & Integrationer

Kanoniskt kontrakt – nyckeln till enkelhet

För att slippa att varje UI, ingest och AI-motor måste förstå 20 olika payload-format inför vi ett kanoniskt MQTT-lager. Alla signaler normaliseras till samma topic-struktur och JSON-format innan de når databasen.

1

Tredjepartsenhet

Shelly, Tuya, växelriktare eller värmepump med eget protokoll.

2

Adapter

Node-RED, Python-service eller ESP32-gateway publicerar kanoniska topics.

3

Kanoniskt topic

iot/energy/tele/han/import_kwh_qh – standardiserat format.

4

DB / UI / AI

Ingest, Digital Twin och Baltazar konsumerar samma enhetliga signaler.

Firmware

MQTT-enheter och provisioning

Firmware-källkoden finns i Arduino-repot och täcker allt från dashboard-enheter med LCD-skärm till HAN-mätare och energiaktuatorer. Enheterna provisioneras via WebBLE-verktyget som skickar konfiguration över Bluetooth.

ESP32 Dashboard

ESP32-S3 med 4,3" RGB-display. Visar lokal energistatus utan broker-koppling.

HAN → MQTT

Läser HAN-porten på elmätaren och publicerar import/export-data till MQTT.

Energy Actuator

Styrbara reläer för att koppla laster av och på baserat på Baltazars styrsignaler.

Provisionering sker via WebBLE-verktyget som skickar CFG/CARDS/SET-kommandon över BLE.

Se /DEPLOY_SoV.md för komplett deploy-guide.

Baltazar

AI och heuristik för energioptimering

Vad Baltazar gör idag

Första versionen är en deterministisk kontrollheuristik fokuserad på batteristyrning och lastoptimering. Den tar emot parametrar som batterikapacitet, SoC-gränser, max charge/discharge, import-cap (peak shaving) samt trösklar för "billig" och "dyr" el.

Koden finns i /server/telemetry_api/baltazar.py med konfiguration i baltazar_config.json.

Målbild – prognos och reglering

För att gå från heuristik till full prognos och automatiserad reglering krävs:

  • Bra signaler i kanoniskt format (telemetri)
  • Möjlighet att skriva tillbaka styrsignaler till MQTT (setpoints)
  • Säkert ack/state-mönster för styrkommandon under .../cmd/...
  • Prissignaler och väderprognos inlästa i systemet
Deployment

Bygg, kör och driftsätt

SOVSystems är designat för att köras lokalt på LAN men kan utvecklas och testas på valfri plattform. Nedan beskrivs de två huvudsakliga driftmiljöerna: lokal utveckling och produktionsdrift på Raspberry Pi.

1

Lokal utveckling (Windows/Mac)

Starta API:t med statiska filer via uvicorn. DigitalTwin_WebApp servas från samma origin som API:t för att undvika CORS-problem. Idealiskt för att testa UI och API-logik innan deployment.

2

Installera Mosquitto på Pi

Följ guiden i deploy/mosquitto/README.md. Konfigurera lyssnare, authentication och topic-filter enligt din installationsbehov.

3

Deploy systemd-services

Installera rpihub.service (API), rpihub-ingest.service (datainsamling) och valfritt rpihub-weather.service. Se /tools/rpihub/README.md för komplett onboarding-guide.

4

Uppdatera via git

På Pi checkas repot ut i /opt/sovsystems/sovdevice-rpihub och uppdateras med git pull.

Nästa steg

Praktiska regler och roadmap

För att hålla systemet hanterbart vid varje ny installation finns fyra grundläggande principer att följa. Dessa minskar komplexiteten och gör det möjligt att paketera lösningen till nya kunder.

1

Allt spåras till ett kontrakt

Varje signal definieras med MQTT-topic, JSON-schema och enhet (kW, kWh, °C, %). Inga implicita antaganden.

2

Normalisera tidigt

Adapter → kanoniska MQTT-topics → ingest/DB/API/AI/UI. Ju tidigare normalisering sker, desto enklare blir varje efterföljande lager.

3

Separera telemetri och styrning

Telemetri publiceras under .../tele/..., styrkommandon under .../cmd/... med tydligt ack/state-mönster för säker återkoppling.

4

Mätbarhet och felsökning

Råa meddelanden sparas i raw_messages-tabellen. Det möjliggör felsökning i efterhand utan att förlora data.

Prioriterade todos

  • Skriv MQTT-signal-katalog med topic, payload-exempel, källa och konsument
  • Definiera kanoniska topics för 1–2 styrsignaler med ack/state-mönster
  • Sätt permissions på dt_secrets.json (chmod 600, endast service-user)
  • Definiera minimal datamodell för rum/zon → entities som Baltazar kan använda

Dokumentation att läsa

  • MQTT_CATALOG.md – komplett topic- och signalkatalog
  • DT_TODO.md – prioriterad backlog (P0/P1/P2)
  • REPO_STRUCTURE.md – mapp-ägarskap och struktur
  • sovdevice/tools/rpihub/README.md – onboarding-guide
Made with