Marstek Venus E v3 praktische one page voor Tweakers

Marstek Venus E v3 in Home Assistant

Praktijkreferentie voor lokale aansturing, planning en debugging. Gericht op gevorderde gebruikers die prijssturing, Solcast, AppDaemon en eigen logica willen combineren zonder eerst in alle valkuilen te stappen.

statische HTML geen framework of buildstap uitklapvelden + modals zonder persoonlijke data

Belangrijkste inzichten

Dit zijn de punten die in de praktijk het meeste uitmaakten. Bij elk punt staat meteen waar je in code of configuratie naar wilt kijken.

Power semantics
Negatief vermogen = laden, positief vermogen = ontladen* Kijk naar de Passive mode write-path. Als je hier verkeerd denkt, doet de batterij exact het omgekeerde van wat je verwacht.
Zoekterm: mode == "charge", power = -2500
Integraties
API en BLE versterken elkaar Gebruik API idealiter als write-path. Gebruik BLE als fallback of extra read-path als observability belangrijk is.
Kijk naar: sensoren, latency, bereik, write vs read
Forecast
Forecast zonder marge maakt slechte laadkeuzes Forecast moet defensief de planner in. Anders laad je te vroeg netstroom en verdring je later echte zonne-overschotten.
Zoekterm: SOLAR_MARGIN = 0.70
SOC band
10-95% geeft meer bruikbare ruimte, maar niet gratis Meer speelruimte is fijn, maar recovery en periodieke kalibratie worden daarmee ook functioneel belangrijk.
Zoekterm: SOC_MIN = 10.0, SOC_MAX = 95.0
Persistence
ISO-slots zijn restart-proof Alleen uurgetallen opslaan werkt totdat je over de daggrens gaat of AppDaemon herstart.
Zoekterm: self.laad_slots, _slot_id()
Economie
Schijnwinst moet er hard uitgefilterd worden Spread alleen is te naïef. RTE, cycle cost, displaced solar en conservatism margin maken het verschil.
Zoekterm: CONSERVATISM_MARGIN = 0.10
* Hier wordt vaak “omgekeerde pariteit” mee bedoeld, maar feitelijk gaat het om omgekeerde tekenlogica of contra-intuïtieve polariteit van het power-commando.
Codefragment: waarom die tekenlogica belangrijk is
if mode == "charge":
    power = -2500   # negatief = laden
elif mode == "discharge":
    power = 2500    # positief = ontladen
else:
    mode = "Auto"

WiFi vs LAN, app, API en BLE

Het grootste deel van de verwarring zit meestal niet in de accu, maar in de gekozen communicatielaag en de rolverdeling tussen integraties.

WiFi vs LAN

“Local API over LAN” betekent in de praktijk vaak gewoon: lokaal IP-verkeer op je eigen subnet, terwijl de Marstek zelf via WiFi verbonden is. Dat is op zich prima zolang je netwerk stabiel is.

WiFi
Vaak de realistische setup. Check DHCP-reservatie, RSSI, packet loss en of sensorupdates niet stilvallen.
LAN
Alleen relevant als de hardware daadwerkelijk bekabeld werkt. Anders is het vooral semantiek.
Praktijktest
Niet discussiëren over terminologie maar meten: ping, update-frequentie, retry-gedrag, command-acknowledgement.
Checklist netwerkstabiliteit
- Vast IP of DHCP reservation
- Geen client isolation op guest wifi
- Goede 2.4 GHz dekking
- Geen power saving rare fratsen in AP
- Packet loss testen vanaf HA host
- Controleren of UDP 8000 lokaal bereikbaar is

De app

Zie de app als bootstrap-tool. Goed voor eerste setup en controles, maar niet als primaire orkestratielaag wanneer je met planning, logging en fallback werkt.

  • Gebruik de app voor initiële configuratie en controle van basisfunctionaliteit.
  • Gebruik Home Assistant voor states, dashboards en logging.
  • Gebruik AppDaemon of eigen code voor slotselectie, strategie en edge cases.
Als een handmatige actie in de app wel werkt en je automation niet, heb je meestal een write-path of state-model probleem en geen accu-probleem.

API vs BLE

De relevante vraag is niet welke integratie theoretisch de beste is, maar welke taak je aan welke route toewijst.

API

  • Logische write-path voor expliciete control loops.
  • Goed scriptbaar voor planners, automations en services.
  • Afhankelijk van firmwaregedrag, lokale enablement en netwerkstabiliteit.

BLE

  • Handig als extra telemetrie of fallback.
  • Nuttig als API nog niet stabiel genoeg is.
  • Kwetsbaarder voor afstand, interferentie en Bluetooth-stackissues.
Praktische architectuur voor nerds

Voorkeursmodel: API voor write-path, BLE als aanvullende read-path. Niet omdat het elegant is, maar omdat je observability en fallback vaak belangrijker zijn dan architecturale zuiverheid.

Handmatige local control test

Eerst de write-path bewijzen met een minimale handtest. Pas daarna automation-logica debuggen.

UDP testvoorbeeld
echo '{"data":{"value":{"limit_type":"passive","value1":0,"value2":0}}}' | \
  nc -u -w1 192.168.178.XXX 8000
Waar je direct op wilt letten
  • Komt het commando aan op het juiste IP?
  • Reageert de batterij zichtbaar in state of modus?
  • Wordt de mode daarna niet direct overschreven door andere logica?
  • Gebruik je de juiste tekenrichting voor laden en ontladen?

Solcast, echte opbrengst, SOC-band en strategie

Hier zit het verschil tussen “er draait iets” en “het systeem maakt slimme keuzes zonder zichzelf tegen te werken”.

Solcast vs daadwerkelijke opbrengst

Forecast is input, geen waarheid. Zodra je forecast te optimistisch verwerkt, ga je netladen in uren die je eigenlijk vrij had moeten houden voor eigen opwek.

  • Forecast van vandaag en morgen combineren kan prima.
  • Maar pas defensieve marge toe.
  • En bouw fallback in voor missende of verouderde forecastdata.
Codehaakje
SOLAR_MARGIN = 0.70
SOLAR_HIGH = 6.0
SOLAR_LOW = 3.0

SOC-band en kalibratie

10-95% geeft beduidend meer bruikbare tradingruimte dan 20-85%, maar daardoor moet je recovery en periodieke kalibratie serieus nemen.

Normaal
SOC_MIN = 10.0 en SOC_MAX = 95.0
Kalibratie
Eerste zondag van de maand tot 100%, daarna 60 min hold voor balancing.
Recovery
Ondergrensbewaking voorkomt dat prijslogica belangrijker wordt dan batterijgezondheid of bruikbaarheid.
Codehaakje
SOC_MIN = 10.0
SOC_MAX = 95.0
CALIBRATION_SOC_MAX = 100.0
CALIBRATION_HOLD_MINUTES = 60

RTE en echte economische filtering

Prijsverschil alleen zegt te weinig. Zonder efficiëntieverlies, cycle cost en displaced solar straf je de verkeerde scenario's niet af.

  • Charge-efficiency: 90%
  • Discharge-efficiency: 90%
  • Round-trip efficiency: 81%
  • Cycle cost: €0.025 per kWh
  • Conservatism margin: €0.10 per blok
Codehaakje
MIN_SPREAD = 0.08
CONSERVATISM_MARGIN = 0.10

Strategieën

Een bruikbare planner heeft meestal minstens drie regimes nodig, plus een correctiemechanisme voor de avondreserve.

  • ARBITRAGE: lage forecast, focus op goedkope laaduren en dure ontlaaduren.
  • HYBRID: combinatie van netladen en ruimte laten voor solar.
  • SOLAR_PRIORITY: veel verwachte zon, dus netladen terugschalen of uitsluiten.
Codehaakje
Solcast < 3.0 kWh   -> ARBITRAGE
Solcast 3.0-6.0 kWh -> HYBRID
Solcast > 6.0 kWh   -> SOLAR_PRIORITY

Home Assistant en AppDaemon

De planner staat of valt met observability, helpers en deploymenthygiëne. Juist daar gaan veel uren verloren.

Minimale stack

  • Home Assistant OS
  • AppDaemon add-on
  • Marstek via local API en/of BLE
  • Prijsbron, bijvoorbeeld Zonneplan
  • Forecastbron, bijvoorbeeld Solcast
  • Helpers voor slots, strategie en status
Helpers die er echt toe doen
input_text.marstek_laad_slots
input_text.marstek_ontlaad_slots
Gebruik ze voor persistente ISO-slot-ID's en niet alleen voor kale uurgetallen.

ISO-slots

Een van de nuttigste verbeteringen is overstappen van uurgetallen naar datum-tijd-slots met timezone.

Voorbeeld
Voor:
[3, 4]

Na:
["2026-03-13T03:00:00+01:00", "2026-03-13T04:00:00+01:00"]

Praktische implementatievolgorde

1
Bewijs eerst je read-path.
SOC, prijzen en forecast moeten stabiel en controleerbaar binnenkomen voordat je write-paths vertrouwt.
2
Bewijs daarna je write-path los.
Handmatige local control test eerst. Pas daarna pas planner, automations en event listeners erbovenop.
3
Bouw persistence expliciet in.
Slots, states en strategy-output moeten een restart overleven zonder ambigu gedrag.
4
Deploy met rollback paraat.
Nieuwe logica zonder backup is vragen om onnodige ellende.
5
Valideer met logs, niet met hoop.
Check scheduler, slothelpers, gekozen strategie, current mode en uitgevoerde commando's.
Deploy- en verificatieblokken
# Backup actieve versie
cp /addon_configs/a0d7b954_appdaemon/apps/marstek_simple.py \
   /config/apps/marstek_simple_backup_$(date +%Y%m%d_%H%M%S).py

# Nieuwe versie deployen
cp /config/apps/marstek_simple_v3.6.0.py \
   /addon_configs/a0d7b954_appdaemon/apps/marstek_simple.py

# Restart AppDaemon
ha apps restart a0d7b954_appdaemon

# Check startup
ha apps logs a0d7b954_appdaemon | grep "v3.6.0"

# Check errors/warnings
ha apps logs a0d7b954_appdaemon | grep -iE "(error|warning)" | tail -50
De gevaarlijkste foutklasse is niet dat iets niet werkt, maar dat het net wel werkt genoeg om vertrouwen te wekken terwijl de write-path of strategy-selectie inhoudelijk verkeerd zit.

Waar de fouten zaten

Geen generieke best practices, maar concrete fouten die tijd kostten en die je liever in één keer voorkomt.

1. Uren zonder datum opslaan

[3,4] lijkt voldoende totdat de daggrens verschuift of AppDaemon herstart.

Fix: ISO 8601 slot-ID's met timezone gebruiken.

2. Forecast te letterlijk nemen

Forecast als feit behandelen creëert displaced solar en verkeerde laadblokken.

Fix: forecastmarge en defensieve plannerlogica.

3. Spread overschatten

“Goedkoop erin, duur eruit” is te simpel zodra je efficiëntieverlies en cyclusslijtage meeneemt.

Fix: RTE, cycle cost en conservatism margin toepassen.

4. Write-path te laat isoleren

Automation debuggen terwijl de directe local control test nog niet hard bewezen was, kost onnodig veel tijd.

Fix: eerst een minimale handtest op UDP/API-niveau.

5. Helpers onderschatten

Kleine entity-id mismatches of onhandige helperkeuzes breken persistence en observability.

Fix: helpers UI-side aanmaken en naamgeving strak houden.

6. Optimaliseren vóór stabiliseren

Meer slimheid in de planner is waardeloos als de input-data of state-overgangen nog wiebelen.

Fix: eerst stabiliteit, daarna winstmaximalisatie.
Troubleshooting-snippets
# Scheduler draait?
ha apps logs a0d7b954_appdaemon | grep "Scheduler"

# SOC sensor actueel?
ha core states get sensor.mst_vnse3_3bd3_state_of_charge

# Solcast-logica zichtbaar?
ha apps logs a0d7b954_appdaemon | grep "Solcast"

# Handmatig planning triggeren
# Developer Tools -> Events
# Event type: marstek_trigger_planning

Korte antwoorden op logische vragen

Moet ik kiezen tussen API en BLE?

Nee. Voor veel setups is API de write-path en BLE de extra read-path of fallback.

Waarom niet dagelijks naar 100% laden?

Omdat dagelijkse trading hier bewust binnen 10-95% blijft. De stap naar 100% is bedoeld voor periodieke kalibratie en balancing.

Waarom kan forecastgestuurde planning fout uitpakken?

Omdat forecast geen gemeten werkelijkheid is. Timing en lokale omstandigheden zorgen snel voor verkeerde aannames.

Waarom zijn ISO-slots zo belangrijk?

Omdat planning anders ambigu wordt rond middernacht of na een restart. Dat zijn precies de fouten die lastig te reproduceren zijn.

Wat is de meest gemaakte denkfout?

Dat een werkend handcommando automatisch betekent dat de complete plannerarchitectuur ook goed staat.

Is deze setup één op één kopieerbaar?

Nee. Firmware, netwerk, prijsbron, forecastbron, huishoudprofiel en integratiepad verschillen per gebruiker.

AI prompt voor een integratie die in één keer goed moet

Deze prompt is bedoeld voor een AI-assistent die eerst de juiste vragen stelt, verschillen per setup expliciet maakt en daarna pas een implementatieplan oplevert.

Gebruik deze prompt in een AI-tool naar keuze. De assistent moet eerst inventariseren, dan valideren en pas daarna concrete YAML, automations, AppDaemon-code of debugstappen voorstellen.

Korte versie
Help mij mijn Marstek-integratie in Home Assistant in 1x goed op te zetten.
Stel eerst alle ontbrekende vragen over firmware, netwerk, API/BLE, prijsbron,
forecastbron, gewenste strategie, veiligheidsgrenzen, logging en deployment.
Geef pas daarna een concreet en reproduceerbaar implementatieplan.