PV Output: SolarEdge SE7K; 19x345Wp West; 8x500Wp Oost. - Enphase; 6x435Wp Zuid; Totaal 10KWp. - Battery: Zinvol Power 6Kwh. - EV: Tesla Model X. - EVcharger: Smart EVSE - Home Assistant beginner
Inderdaad, ik heb eigenlijk geen idee wat de batterij nu doet zonder de cloud. Zal wel niks zijn.Fioravanti schreef op woensdag 21 oktober 2026 @ 16:06:
En met het nieuws van vandaag rondom php natuurlijk weer een extra argument om lokaal te willen kunnen draaien...
nou dat hebben we vandaag kunnen ervaren. De hele backend van ZInvolt ligt er de hele middag al uit vanwege de PHP bug.... de accu doet dan dus helemaal niets.
Bij mij bleef het staan op de laatste stand, wat blijkbaar 800W ontladen was.
Dus toen maar weer de Homewizard stekker (die ook een recall heeft nu) maar uitgezet.
Dus toen maar weer de Homewizard stekker (die ook een recall heeft nu) maar uitgezet.
Raar, hier deed de Zinvolt het wél. Maar goed ik gebruik de app dan ook niet. Hij wordt aangestuurd via de slimme meter simulator. Helaas loopt de Zinvolt p1 nog wel via de cloud, maar dat werkte dus wel.
Kan nog steeds niks.
PV Output: SolarEdge SE7K; 19x345Wp West; 8x500Wp Oost. - Enphase; 6x435Wp Zuid; Totaal 10KWp. - Battery: Zinvol Power 6Kwh. - EV: Tesla Model X. - EVcharger: Smart EVSE - Home Assistant beginner
Voor de liefhebbers mijn opzet om de Base lokaal te draaien via Modbus
# Batterij op nul regelen via Modbus in Home Assistant (AlphaESS/ZinVolt)
Home Assistant houdt de batterij (ZinVolt/AlphaESS) via Modbus TCP zo aan het werk dat het vermogen op de hoofdaansluiting dicht bij 0 W blijft. Hiervoor schrijf je force-laden/ontladen-registers naar de omvormer, tot het ingestelde maximum (in mijn opstelling 2,0 kW).
Entiteitsnamen en waarden hieronder zijn voorbeelden uit mijn installatie. Pas ze aan voor jouw situatie.
Een schakelaar ("Forceer nul op de meter") bepaalt de werkwijze:
- **Aan:** gedempte nul-op-de-meter-regeling op een netmeter die elke seconde ververst. Dit is de hoofdfunctie van dit bericht.
- **Uit:** de batterij volgt een extern setpoint (bij mij het DAO-setpoint van EvaPower in `input_number.dao_feedin_grid`). Optioneel; heb je dat niet, laat de schakelaar dan aan.
## Benodigdheden
De tekenconventies zijn belangrijk: de regeling werkt precies verkeerd om als een teken omgekeerd is.
| Onderdeel | Entiteit (voorbeeld) | Betekenis |
|---|---|---|
| Netmeter, 1 seconde | `sensor.meterkast_p1_meter_1_seconden_vermogen` | W. Positief = afname van het net, negatief = teruglevering |
| Batterijvermogen (Shelly Pro 3EM) | `sensor.shellypro3em_..._energy_meter_2_vermogen` | W. Positief = laden, negatief = ontladen. Alleen ter controle |
| Laadpaal (Peblar) | `sensor.peblar_ev_charger_vermogen` | W. Boven 1000 W blijft de batterij uit |
| Modus omvormer | `select.alphaess_inverter_dispatch_mode_2` | "State of Charge Control (2)" voor de force-registers, "Normal Mode (5)" = batterij stil |
| Force laden / ontladen | `switch.alphaess_inverter_force_charging_2`, `switch.alphaess_inverter_force_discharging_2` | Aan = geforceerd laden resp. ontladen |
| Force vermogen en duur | `number.alphaess_inverter_force_charging_power_2` en `..._discharging_power_2` (kW), `..._duration_2` (minuten) | Setpoint in kW en hoe lang het geldt |
Gebruikte integraties:
| Onderdeel | Integratie |
|---|---|
| Netmeter 1 seconde | HomeWizard Instant (`homewizard_instant`), aangepaste integratie, niet standaard in HA |
| Netmeter standaard | HomeWizard (`homewizard`), vernieuwt trager |
| Batterijvermogen | Shelly (`shelly`), meldt alleen bij verandering |
| Laadpaal | Peblar (`peblar`) |
| Omvormer en batterij | AlphaESS Modbus (`alphaess_modbus`), via HACS, Modbus TCP. Entiteiten hebben bij mij het achtervoegsel `_2` |
| Sliders en schakelaars | Helpers (`input_number`, `input_boolean`) |
| Aanstuursignaal en werkelijk vermogen | Template-helpers |
## Welke modus is actief
Met "Modbus sturing AAN" kiest de automation bij elke trigger de eerste regel die van toepassing is:
1. **Forceer nul AAN en de auto laadt** (laadpaal boven 1000 W): force laden en ontladen uit, Normal Mode. De batterij blijft uit, zodat hij niet leegloopt op het laden van de auto.
2. **Forceer nul AAN en de auto laadt niet:** gedempte nul-op-de-meter-regeling (volgende sectie).
3. **Forceer nul UIT en het DAO-setpoint ligt buiten de drempel** (±40 W): force laden of ontladen op het DAO-setpoint, begrensd op het maximum.
4. **Forceer nul UIT en het DAO-setpoint ligt binnen de drempel:** Normal Mode, de batterij is stil.
Met "Modbus sturing UIT" doet de automation niets meer met de batterij. Bij het omschakelen zet hij eenmalig alle force-schakelaars uit en gaat de omvormer naar Normal Mode.
De takken voor het DAO-setpoint lopen niet op meterwijzigingen. Anders zou een meter die elke seconde ververst vier Modbus-opdrachten per seconde veroorzaken, ook als "Forceer nul" uit staat.
## Het algoritme
Bij elke nieuwe meting corrigeert de automation het huidige setpoint met een deel van wat de meter nog laat zien. Het huidige setpoint is wat er nu geforceerd staat: ontladen telt positief, laden negatief, uit is 0 W. Het wordt afgelezen uit de force-schakelaars en de ingestelde vermogens, niet uit het gemeten batterijvermogen.
```
nieuw = clamp( huidig + k × P_meter , −P_max , +P_max )
```
P_meter is het voortschrijdend gemiddelde van de netmeter (positief = afname), k is de demping, P_max het maximale batterijvermogen. Alles in watt. Daarna gelden deze regels, in volgorde:
1. Er wordt gerekend met het voortschrijdend gemiddelde van de netmeter (**middeling meter**), niet met de ruwe seconde-meting.
2. De wijziging ten opzichte van het huidige setpoint wordt begrensd op de **maximale stap per meting**.
3. Staat de batterij stil en wijkt de meter meer dan 60 W af, dan start hij met minimaal 50 W.
4. Het setpoint wordt afgerond op 10 W. Kleine afwijkingen buiten de dode zone krijgen een duwtje van 10 W (hooguit eens per 4 seconden).
5. Zou het nieuwe setpoint van richting wisselen, dan gaat de batterij eerst naar 0 W (uit), zodra de minimale looptijd dat toelaat, en klapt hij niet direct om.
6. Vanuit uit naar een nieuwe richting kan pas als de tegengestelde force-schakelaar minstens de **vertraging richtingswissel** uit staat. Bij 0 s wisselt hij direct.
7. Een setpoint onder 50 W wordt 0 W (uit), maar pas nadat de batterij minstens de **minimale looptijd** aan staat. Daarvoor blijft hij op 50 W, ook als het setpoint van richting zou wisselen.
8. Ligt de meter binnen de **dode zone**, dan gebeurt er niets. Is de wijziging kleiner dan de **minimale stap**, dan wordt ze overgeslagen, behalve bij uitschakelen.
9. Anders schrijft de automation: modus State of Charge Control, de andere richting uit, vermogen in kW (2 decimalen), duur 60 minuten, de gewenste schakelaar aan.
**Waarom corrigeren op het huidige setpoint en niet op het gemeten batterijvermogen?** De omvormer volgt een nieuw setpoint met vertraging. Wie de meter vermindert met het gemeten batterijvermogen corrigeert dan dubbel en pendelt tussen laden en ontladen.
**Starten vanuit 0 W.** Bij een lage demping (0,15) bleef een stabiele import onder ongeveer 330 W (50 W gedeeld door de demping) onbehandeld: vanuit een stilstaande batterij is het berekende setpoint dan kleiner dan 50 W, en die ondergrens zette het elke seconde terug op 0. Oplossing: staat de batterij stil en wijkt de meter meer dan 60 W af, dan start hij met minimaal 50 W en bouwt daarna met de gewone demping op. Omdat de omvormer het vermogen in stappen van 10 W instelt, wordt het setpoint op 10 W afgerond. Valt het daardoor samen met het huidige setpoint terwijl de meter buiten de dode zone staat, dan volgt toch een stap van 10 W richting nul. Zo'n duwtje komt hooguit eens per 4 seconden (de dode tijd van de omvormer), anders werkt het als een veel te hoge demping en gaat de regeling zaagtanden maken.
**Maximale stap per meting.** De omvormer reageert pas na 3 à 4 seconden en loopt daarna ongeveer 100 W per seconde op, terwijl het setpoint bij een grote afwijking tot ongeveer 300 W per seconde stijgt. Bij een korte belastingspiek (gemeten: 2,1 kW gedurende 10 seconden) rent het setpoint daardoor naar 2000 W, levert de batterij na afloop nog 1,4 kW en slaat de meter naar export, waarna het setpoint weer terug moet en soms zelfs naar laden. De maximale stap (standaard 100 W) begrenst hoeveel het setpoint per meting hooguit mag stijgen of dalen. Lager is rustiger maar trager bij blijvende lasten, hoger is sneller maar schiet bij pieken meer door.
**Minimale looptijd.** Bij piekerige zonnepanelen schommelt de meter ±40 tot 70 W rond de ondergrens van 50 W. Het setpoint zakte dan steeds net onder 50 W (de batterij stopt) en de meter liep weer boven 60 W (de batterij start op 50 W), om de 8 tot 10 seconden (ongeveer 25 schakelmomenten in 12 minuten). De minimale looptijd (standaard 30 s) laat de batterij na het starten minstens zo lang aan op minimaal 50 W voordat hij mag stoppen. 0 = uit.
**Middeling meter.** Sommige lasten schakelen sneller dan de omvormer kan volgen. Voorbeeld uit mijn metingen: een last van ongeveer 1,3 kW die om de 5 tot 10 seconden aan en uit gaat. De meter sloeg daarbij heen en weer tussen ongeveer +1300 en −1400 W, omdat de batterij door de dode tijd (3 à 4 s) en de ramp (ongeveer 100 W/s) steeds in tegenfase meeliep. Een regeling kan zo'n puls niet compenseren; ze kan hem wel negeren. Daarom wordt gecorrigeerd op een voortschrijdend gemiddelde van de netmeter, standaard 4 s; 0 = uit (ruwe meter). Hoger = rustiger, maar een blijvende verandering wordt trager opgepikt. De dode zone, het starten bij meer dan 60 W en het duwtje van 10 W gebruiken ook het gemiddelde.
**Implementatie van de middeling.** Een aparte automation (mode single) draait bij elke meting en schrijft naar `input_number.nul_op_meter_gemiddeld_vermogen`:
```
nieuw = oud + α × (meter − oud)
α = 1 − e^(−Δt / (T/2))
```
Δt is de tijd sinds de vorige meting (begrensd op 0,1 tot 10 s) en T de middeling in seconden. T/2 als tijdconstante geeft dezelfde vertraging als een gewoon gemiddelde over T seconden. Bij T = 0 is α = 1. In de hoofdautomation is `net_w` het gemiddelde, of de ruwe meter bij T = 0. Beide automations draaien op dezelfde meting, dus de regeling kan het gemiddelde van de vorige meting lezen (hooguit een seconde verschil). De helper heeft bewust geen `initial`, zodat de waarde een herstart overleeft.
Rekenvoorbeelden bij demping 0,2 en een stabiele meter. In de praktijk begrenst de maximale stap (100 W per meting) de wijziging, dus het setpoint bereikt deze waarden in meerdere stappen:
| Situatie | Meter (W) | Huidig setpoint (W) | Nieuw setpoint (W) |
|---|---|---|---|
| Uit, huis neemt af | +1000 | 0 | +200 (ontladen) |
| Laden op 600 W, huis neemt af | +1000 | −600 | −400 (nog laden, minder) |
| Ontladen op 1200 W, teruglevering | −900 | +1200 | +1020 (ontladen, minder) |
| Uit, teruglevering | −800 | 0 | −160 (laden) |
## Timer verversen (elke 45 minuten)
De omvormer laat een force-opdracht na de ingestelde duur (60 minuten) vanzelf vervallen. Zonder verversing stopt de batterij dus na een uur. De automation heeft daarvoor een tijdtrigger op minuut 0 en minuut 45 van elk uur (afwisselend 45 en 15 minuten tussenruimte).
Bij zo'n refresh schrijft de automation het huidige setpoint opnieuw naar de omvormer en wisselt de duur tussen 60 en 59 minuten. Een refresh met exact dezelfde waarden bleek de timer in de omvormer niet opnieuw te starten. Gewone setpointwijzigingen schrijven altijd 60 minuten. Het setpoint verandert dus niet door de refresh, de batterij stopt er niet voor en de refresh gebeurt ook als de meter binnen de dode zone ligt.
## Instellingen
Allemaal helpers die je als tegels op een dashboard zet. Ze gelden direct, zonder de automation te herstarten. De waarden zijn die van mijn installatie.
| Instelling | Entiteit | Waarde | Effect |
|---|---|---|---|
| Modbus sturing | `input_boolean.batterijsturing_via_modbus` | aan | Aan = automation stuurt de batterij, uit = automation doet niets (omvormer in Normal Mode) |
| Forceer nul op de meter | `input_boolean.balanceer_grid_forceren` | aan | Aan = nul-regeling, het DAO-setpoint doet dan niet mee |
| Demping | `input_number.nul_op_meter_demping` | 0,15 | Aandeel van de afwijking dat per meting wordt gecorrigeerd. Lager = rustiger maar trager |
| Dode zone | `input_number.nul_op_meter_dode_zone` | 20 W | Meter binnen deze waarde rond 0: geen correctie |
| Minimale stap | `input_number.nul_op_meter_minimale_stap` | 10 W | Kleinere setpointwijzigingen worden overgeslagen |
| Maximale stap per meting | `input_number.nul_op_meter_maximale_stap_per_meting` | 100 W | Het setpoint mag per meting (1 s) hooguit zoveel W stijgen of dalen |
| Minimale looptijd | `input_number.nul_op_meter_minimale_looptijd` | 30 s | Na het starten blijft de batterij minstens zo lang aan (op minimaal 50 W). 0 = uit |
| Middeling meter | `input_number.nul_op_meter_middeling_s` | 4 s | Tijd waarover het netvermogen wordt gemiddeld. 0 = uit (ruwe meter) |
| Gemiddeld netvermogen | `input_number.nul_op_meter_gemiddeld_vermogen` | automatisch | Wordt door de middelings-automation bijgewerkt; niet handmatig instellen |
| Vertraging richtingswissel | `input_number.nul_op_meter_richtingswissel_vertraging` | 0 s | Minimale tijd uit tussen laden en ontladen. 0 = direct wisselen (via 0 W) |
| DAO feedin setpoint | `input_number.dao_feedin_grid` | volgt DAO | Alleen actief als "Forceer nul" uit staat |
| Drempel Modbus / Normal Mode | `input_number.batterijsturing_drempel_w` | 40 W | DAO-setpoint binnen deze waarde rond 0: batterij stil |
| Batterij max vermogen | `input_number.batterij_max_vermogen` | 2000 W | Maximaal laad- en ontlaadvermogen |
## SoC-grenzen
De batterij is LFP (LiFePO4) en verdraagt vol laden goed, dus 100 % als bovengrens is acceptabel. Houd onderaan wat marge boven de eigen uitschakelgrens van de omvormer. Let op: een stop-at-SoC onder de werkelijke SoC annuleert het force-commando. Bij mij stond force laden op 95 % terwijl de batterij op 96,8 % zat, waardoor het laden na elke poging binnen ongeveer 12 seconden werd afgebroken.
| Instelling | Entiteit | Waarde |
|---|---|---|
| Force laden stopt bij | `number.alphaess_inverter_force_charging_stop_at_soc_2` | 100 % |
| Force ontladen stopt bij | `number.alphaess_inverter_force_discharging_stop_at_soc_2` | 12 % |
| Laadgrens omvormer | `number.alphaess_inverter_charging_cutoff_soc_2` | 10 % |
| Ontlaadgrens omvormer | `number.alphaess_inverter_discharging_cutoff_soc_2` | 13 % |
Bij force ontladen geldt feitelijk de hoogste van de twee ontlaadgrenzen, hier dus 13 %. Deze waarden stel je eenmalig in; de automation schrijft ze niet.
## Reactie van de batterij meten
Drie template-sensoren laten zien hoe goed de batterij het aanstuursignaal volgt:
| Sensor | Betekenis |
|---|---|
| `sensor.batterij_aanstuursignaal` | Gevraagd vermogen in W (+ ontladen, − laden), afgeleid uit de force-schakelaars en -vermogens |
| `sensor.batterij_werkelijk_vermogen` | Gemeten vermogen in W, gelijk aan de Shelly met omgekeerd teken (+ ontladen) |
| `sensor.batterij_afwijking_aanstuur_vs_werkelijk` | Werkelijk min aanstuur, in W |
Uit een stappentest (2 minuten per stap, laden en ontladen) bleek dat de omvormer ongeveer 3 tot 4 seconden dode tijd heeft en daarna 70 tot 110 W per seconde oploopt. Bij 2000 W ontladen leverde hij 2,7 % minder dan gevraagd, bij laden was het verschil klein. Omdat de regeling het setpoint integreert, verdwijnt zo'n vaste afwijking vanzelf. Op basis van de test is de vertraging bij richtingswissel verlaagd van 25 naar 10 seconden (later naar 0: het vasthouden gaf bij een wissel vaak doorschieten naar de andere kant) en de demping verhoogd van 0,10 naar 0,15. De Shelly meldt alleen bij verandering (ongeveer elke 5 seconden) en heeft een standby-basis van ongeveer 38 W.
## Automation-modus
De automation draait in `mode: single` met `max_exceeded: silent`. In `mode: restart` brak de 1-secondenmeter een lopende reeks van vier schrijfacties steeds af, waardoor refreshes en wissels verloren gingen. Een run duurt 1 tot 2 seconden, dus een setpointwijziging wacht hooguit even.
## Beperkingen en tips
De regeling kan nooit sneller of krachtiger zijn dan de omvormer: het ingestelde maximum is de grens en de omvormer volgt een nieuw setpoint met vertraging.
- **Meer dan het maximum afname:** bij een grote last, zoals een auto die laadt, komt de meter niet op nul. Daarom blijft de batterij dan uit.
- **Auto-drempel:** de 1000 W voor de auto-blokkade staat vast in de automation.
- **Pieken in huis:** de 1-secondenmeter laat belastingspieken van enkele kW zien. Is de batterij nog te nerveus, verhoog dan de middeling of verlaag de maximale stap of de demping (ongeveer 0,10–0,15). Reageert hij te traag op een blijvende verandering, verlaag dan de middeling of verhoog de demping.
- **Schrijfacties:** elke setpointwijziging stuurt vier Modbus-opdrachten naar de omvormer. Dode zone, minimale stap en minimale looptijd beperken dat aantal.
- **Resolutie:** de omvormer stelt het vermogen per 10 W in en reageert pas na 3 à 4 seconden. Een dode zone onder ongeveer 10 W geeft kans op heen en weer slingeren; 20 W is een veilige waarde.
- **Minimale SoC:** de omvormer kan ontladen beperken bij zijn eigen minimale SoC, ook als het setpoint hoger is.
- **Afstellen:** de trace van de automation toont per run `cur_w`, `doel_w`, `stap_w` en `apply_w`. Daarmee zie je waarom een correctie wel of niet werd uitgevoerd.
Interessant, thanks. Welke hardware gebruik je daarvoor?thewhi schreef op woensdag 21 oktober 2026 @ 21:42:
Voor de liefhebbers mijn opzet om de Base lokaal te draaien via Modbus
[...]