Nibe F1145-15 EXP | PCM42 koeling | KV300 buffervat vloerverwarming | VPA300 boilervat | UKV20 500L buffervat zwembad + ELK9(kW) elek.backup element | POOL40 | 80L E-boiler | NibeGW voor HASS MODBUS koppeling | Zon-PV: 23,49 kWP + SE25K Solaredge omvormer
Solar optimiser kijkt enkel naar (verwachte) zonopbrengst en gaat aan de hand daarvan je toestellen aansturen.
Ik maak gebruik van open-meteo (forecast met interval van 15 minuten) en moest ondermeer de voorbeeld scripts aanpassen.
Documentatie zoveel mogelijk doorgenomen, maar heb toch een paar vragen:
1. Waarom dagelijks een dao draaien als een mpc meer actuele info oplevert? Of is een dao nodig om een mpc te voeden met specifieke input?
2. Ik heb 32 enphase micro omvormers, moet ik deze 32x invoeren of kan dat makkelijker? Ik gebruik nu de default instellingen voor de panelen.
3. Ik heb 2 thuisaccu’s: kan ik beide afzonderlijk invoeren of moet ik er 1 grote accu van maken?
2. Ik heb mijn panelen in solcast gezet en ik stuur de verwachtingen daarvan naar EMHASS
3. VZIW is er een geen mogelijkheid om meerdere batterijen te configureren.
1. Ook ik weet dit niet precies, maar doe het ook, direct nadat de day-ahead nordpool prijzen bekend zijn gemaakt (zeg rond 13:30 's middags).diamanten schreef op zaterdag 14 juni 2025 @ 15:06:
Met dank aan jullie heb ik het inmiddels draaien! 😀
Ik maak gebruik van open-meteo (forecast met interval van 15 minuten) en moest ondermeer de voorbeeld scripts aanpassen.
Documentatie zoveel mogelijk doorgenomen, maar heb toch een paar vragen:
1. Waarom dagelijks een dao draaien als een mpc meer actuele info oplevert? Of is een dao nodig om een mpc te voeden met specifieke input?
2. Ik heb 32 enphase micro omvormers, moet ik deze 32x invoeren of kan dat makkelijker? Ik gebruik nu de default instellingen voor de panelen.
3. Ik heb 2 thuisaccu’s: kan ik beide afzonderlijk invoeren of moet ik er 1 grote accu van maken?
2. : als je in het configuratie scherm helemaal bovenaan, aan de rechterkant op de <> klikt, dan kun je de config ook bewerken in een soort text-editor. Dan kun je gemakkelijker bepaalde configs kopieren.
3. volgens mij idd ook niet. Je zou dit https://community.home-as...gement-for-home-assistant topic eens door kunnen spitten of daar de vraag stellen, is behoorlijk actief door o.a. de ontwikkelaars van EMHASS. Er is evt. ook nog een Discord channel.
Dat leek mij dus ook en ga vanaf nu alleen maar de MPC om de x minuten draaien.Sicco92 schreef op zondag 15 juni 2025 @ 19:48:
Ik doe elk kwartier een nieuwe MPC en daarna gelijk een publish, zodat ik altijd met de meest actuele gegevens een voorspelling maak. Dat vond ik zelf het makkelijkste. Ik doe niet nog eens extra een DAO, dus dat is helemaal niet nodig. Heel eerlijk zou ik het verschil tussen een MPC en een DAO niet eens kunnen noemen, behalve dat een MPC volgens mij meer inputs slikt.
Wel een vervolgvraag:
Ik zie nl diverse automations die deze optimalisatie alleen tussen XX.YY en ZZ.AA draaien. Het lijkt mij dat het zinvol is om de MPC gedurende de hele dag regelmatig te draaien. Zo heb je immers een zo actuele waarde van bijv. p_batt_forecast om je accu aan te sturen, of zie ik dat verkeerd?
Je kunt met regelmaat de MPC opnieuw uitvoeren, maar je kunt ook alleen een publish doen van de meest recente berekening.
Dat laatste moet volgens mij zelfs als de horizon van de MPC minder dan 5 periodes weg is.
Ik draai de MPC iedere minuut, voor de laatste actuele waardes van PV en p1, maar volgens mij is dat sub-optimaal, soms krijg ik daardoor onnodig veel aan/uit-schakelingen. (30 seconden opladen aan, bijv)
Ik heb geen EV of planbare deferrables, dus ik wil dat EMHASS snel reageert op veranderingen in verbruik en dat werkt niet echt goed.
Ja, de hele dag door inderdaad. In de nacht krijg ik ook nieuwe voorspellingen binnen van Solcast, dus dan kan die daar gelijk mee rekenen. Voor nu nog niet heel erg relevant, maar voor na 1 januari 2027 kan dat wel verschillen geven voor de gehele voorspelling (bijv. 's nachts nog stroom dumpen als de accu te vol zit en er plotseling toch een zonnige dag voorspeld wordt).diamanten schreef op maandag 16 juni 2025 @ 15:58:
[...]
Dat leek mij dus ook en ga vanaf nu alleen maar de MPC om de x minuten draaien.
Wel een vervolgvraag:draai je die MPC de gehele dag door om het kwartier?
Ik zie nl diverse automations die deze optimalisatie alleen tussen XX.YY en ZZ.AA draaien. Het lijkt mij dat het zinvol is om de MPC gedurende de hele dag regelmatig te draaien. Zo heb je immers een zo actuele waarde van bijv. p_batt_forecast om je accu aan te sturen, of zie ik dat verkeerd?
Daarnaast voor een kwartier gekozen zodat ik makkelijk over kan naar kwartierprijzen, als die ooit aangeboden worden.
Op mijn NUC duurt de MPC-berekening ongeveer 1 minuut trouwens, dus ik trap ze altijd 50 seconden voor het kwartier af zodat de nieuwe waarden gepublished worden net als het nieuwe kwartier start.
ok, ik draai de mpc nu elke 10 minuten. Ik probeer de cost function te doorgronden, dat is toch een indicatie van de optimalisatie: negatief is goed? Mijn grafiek van sensor.total_cost_fun_value zit er zo uit:RudolfR schreef op maandag 16 juni 2025 @ 16:32:
@diamanten
Je kunt met regelmaat de MPC opnieuw uitvoeren, maar je kunt ook alleen een publish doen van de meest recente berekening.
Dat laatste moet volgens mij zelfs als de horizon van de MPC minder dan 5 periodes weg is.
Ik draai de MPC iedere minuut, voor de laatste actuele waardes van PV en p1, maar volgens mij is dat sub-optimaal, soms krijg ik daardoor onnodig veel aan/uit-schakelingen. (30 seconden opladen aan, bijv)
Ik heb geen EV of planbare deferrables, dus ik wil dat EMHASS snel reageert op veranderingen in verbruik en dat werkt niet echt goed.
Dus pas 's avonds een gunstige cost function. Kunnen jullie een dergelijke grafiek ook plaatsen?
Ok, dank.MarcoPolet schreef op zaterdag 21 juni 2025 @ 08:13:
Negatief = negatief, dan kost het geld, positief levert geld op
Ik heb ook nog verder gezocht in het HA Emhass forum:
cost_profit = Σ (P_grid_pos * unit_load_cost) - Σ (P_grid_neg * unit_prod_price)
Waarbij:
P_grid_pos = verbruik uit het net
P_grid_neg = teruglevering aan het net
Als de opbrengsten (P_grid_neg * unit_prod_price) groter zijn dan de kosten (P_grid_pos * unit_load_cost), dan wordt cost_profit negatief.
Nb. het maakt mij niet uit wie gelijk heeft, alleen wil ik het snappen...
[ Voor 53% gewijzigd door diamanten op 21-06-2025 14:11 ]
Het is te warm om die formules na te rekenendiamanten schreef op zaterdag 21 juni 2025 @ 13:56:
[...]
Ok, dank.
Ik heb ook nog verder gezocht in het HA Emhass forum:
cost_profit = Σ (P_grid_pos * unit_load_cost) - Σ (P_grid_neg * unit_prod_price)
Waarbij:
P_grid_pos = verbruik uit het net
P_grid_neg = teruglevering aan het net
Als de opbrengsten (P_grid_neg * unit_prod_price) groter zijn dan de kosten (P_grid_pos * unit_load_cost), dan wordt cost_profit negatief.
Nb. het maakt mij niet uit wie gelijk heeft, alleen wil ik het snappen...
MarcoPolet schreef op zaterdag 21 juni 2025 @ 15:49:
[...]
Het is te warm om die formules na te rekenenmaar als ik de tabel in de EMHASS website bekijk, dan zie je daar duidelijk (bij mij in elk geval) dat als je te weinig productie hebt, de cost_fun_profit negatief is, en later op de dag, als er meer productie dan gebruik is, de cost_fun_profit positief wordt.
[Afbeelding]
Ok, ik zie inderdaad hetzelfde in mijn grafiek, alleen geen grote negatieve waarden (behalve -0.00 als mijn batterij bijspringt). Dat zou dus optimaal zijn voor mijn situatie?
[ Voor 3% gewijzigd door diamanten op 22-06-2025 13:18 ]
Doel is bij mij self-consumption. Dit werkt idd (nog) niet ideaal. Het verloop is vrij grillig en naar mijn idee wordt er (ook wel eens) geladen als er te weinig zon is of net andersom. De grafiek toont de sensor.p_batt_forecast waarden van afgelopen uren.MarcoPolet schreef op zondag 22 juni 2025 @ 14:01:
Welk doel heb je ingesteld in de configuratie? Bovenin bij de cost function. Ik heb die op profit staan, maar kan bv. ook op self-consumption. Als je dat laatste doet dan denk ik wel dat de sturing van EMHASS te langzaam is, je zou dat dan misschien moeten combineren met je accu zelf, dat die in de gaten houdt (met bv. CT klemmen) wat je gebruik/productie is, en zich daar op aanpast.
:no_upscale():strip_icc():strip_exif()/f/image/7jBHEEL3ZFAnZ28q0w92JTfD.jpg?f=user_large)
De MPC draait elke 5 minuten. Mijn accu kan ik wel via HA aansturen (koppeling met P1-meter die om de 10 seconden een update stuurt). Het exact volgen van sensor.p_batt_forecast waarde heb ik nu via scripts geregeld, maar ik denk dat het beter (en ook makkelijker) is als de accu NoM gaat werken bij een waarde van sensor.p_batt_forecast ongelijk 0. Dus eigenlijk een binaire mode: doe niets bij sensor.p_batt_forecast= 0 of als sensor.p_batt_forecast ongeljk 0: ga NoM laden/ontladen.
In onderstaande screenshot de belangrijkste parameters voor de batterij die bij elke MPC worden meegestuurd.
:no_upscale():strip_icc():strip_exif()/f/image/slp1XFCuwiHi1xUX81QlT39X.jpg?f=user_large)
Hoe hebben jullie dit ingeregeld?
[ Voor 26% gewijzigd door diamanten op 23-06-2025 12:38 ]
optie voor meerdere batterijen is er momenteel niet. Ik heb ze hier nu opgeteld (capaciteit en vermogens) en splits wat emhass berekend voor de batterij dan weer uit om beide batterijen apart aan te sturen met wat logica (prioriteit tussen stekkerbatterij en eentje met hybride omvormer, zorgen dat beide batterij wat gelijkmatig gebruikt worden maar dat er rekening gehouden wordt met mindere efficiëntie bij lage vermogens enz) .RudolfR schreef op zaterdag 14 juni 2025 @ 19:48:
1. Weet ik niet goed, doe ik ook. Volgens mij kan het ook met alleen de MPC.
2. Ik heb mijn panelen in solcast gezet en ik stuur de verwachtingen daarvan naar EMHASS
3. VZIW is er een geen mogelijkheid om meerdere batterijen te configureren.
2 aparte batterijen in emhass zou idd wel beter zijn.
https://github.com/davidusb-geek/emhass/discussions/544
ik bereken met een template een batterij control mode, deze is ofwel forcible charge, forcible discharge, do nothing of follow grid (NoM). Voor die laatste mode gebruik ik dan een aparte automatisatie om die NoM sturing te doen.diamanten schreef op maandag 23 juni 2025 @ 12:26:
[...]
Doel is bij mij self-consumption. Dit werkt idd (nog) niet ideaal. Het verloop is vrij grillig en naar mijn idee wordt er (ook wel eens) geladen als er te weinig zon is of net andersom. De grafiek toont de sensor.p_batt_forecast waarden van afgelopen uren.
[Afbeelding]
De MPC draait elke 5 minuten. Mijn accu kan ik wel via HA aansturen (koppeling met P1-meter die om de 10 seconden een update stuurt). Het exact volgen van sensor.p_batt_forecast waarde heb ik nu via scripts geregeld, maar ik denk dat het beter (en ook makkelijker) is als de accu NoM gaat werken bij een waarde van sensor.p_batt_forecast ongelijk 0. Dus eigenlijk een binaire mode: doe niets bij sensor.p_batt_forecast= 0 of als sensor.p_batt_forecast ongeljk 0: ga NoM laden/ontladen.
In onderstaande screenshot de belangrijkste parameters voor de batterij die bij elke MPC worden meegestuurd.
[Afbeelding]
Hoe hebben jullie dit ingeregeld?
Verder run ik hier de mpc optimiser elke 2 minuten.
Interessant, zou je die template voor de batterij control kunnen plaatsen? Ik ben benieuwd wanneer jij kiest voor forcible charge/discharge etc.scruysberghs schreef op zaterdag 28 juni 2025 @ 12:04:
[...]
ik bereken met een template een batterij control mode, deze is ofwel forcible charge, forcible discharge, do nothing of follow grid (NoM). Voor die laatste mode gebruik ik dan een aparte automatisatie om die NoM sturing te doen.
Verder run ik hier de mpc optimiser elke 2 minuten.
Momenteel gebruik ik onderstaande template, aan de lijst met ongebruikte waarden bovenaan kan je zien dat ik er al wat mee gespeeld heb om het helemaal te krijgen zoals ik wil. Oorspronkelijk probeerde ik de echte waarden van de sensoren er mee in te brengen maar nu mpc elke 2 minuten loopt volg ik toch vooral wat emhass berekend. Enkel voor NoM sturing gebrik ik dan sensorwaarden van de p1 meter of de NoM functie van de batterij als die bestaat (=als batterij een eigen grid meter heeft)diamanten schreef op zaterdag 28 juni 2025 @ 16:34:
[...]
Interessant, zou je die template voor de batterij control kunnen plaatsen? Ik ben benieuwd wanneer jij kiest voor forcible charge/discharge etc.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
| # ----------------
# TEMPLATE SENSORS
# ----------------
template:
- sensor:
- name: "EMHASS batcontrol mode"
unique_id: emhass_batcontrol_mode
icon: mdi:battery-heart-outline
state: >
{# Waarden ophalen #}
{% set p_hybrid = states('sensor.mpc_p_hybrid_inverter')| float(0) %}
{% set p_batt = states('sensor.mpc_p_batt_forecast') | float(0) %}
{% set p_load = states('sensor.mpc_p_load_forecast') | float(0) %}
{% set p_grid = states('sensor.mpc_p_grid_forecast') | float(0) %}
{% set p_curtail = states('sensor.mpc_p_pv_curtailment') | float(0) %}
{% set export = states('sensor.sec_pac_power_to_grid') | float(0) %}
{% set deferrables = states('sensor.mpc_p_deferrable0') | float(0)
+ states('sensor.mpc_p_deferrable1') | float(0)
+ states('sensor.mpc_p_deferrable2') | float(0)
+ states('sensor.mpc_p_deferrable3') | float(0) %}
{% set surplus = states('sensor.sec_surplus_power') | float(0) %}
{% set max_captar = states('input_number.sec_pac_doel_limiet_capaciteitspiek') | float(0) %}
{% set captar15 = states('sensor.sec_pac_extrapoleer_captar_kwartier') | float(0) %}
{# Bepaal modus #}
{% set mode = 'Do Nothing' %}
{# 1. Curtailment actief: batterij niet gebruiken zodat PV niet afgeschakeld moet worden #}
{% if p_curtail > 20 %}
{% set mode = 'Do Nothing' %}
{# 2. Netverbruik voorspeld als 0 → batterij mag gedrag afstemmen op netbalans #}
{% elif p_grid == 0 %}
{% set mode = 'Follow Grid' %}
{# 3. Netverbruik overschrijdt capaciteitstarieflimiet → piek afvlakken #}
{% elif p_grid > max_captar %}
{% set mode = 'Peak Shaving' %}
{# 4. EMHASS voorspelt laden → afdwingen #}
{% elif p_batt < -10 %}
{% set mode = 'Forcible Charge' %}
{# 5. EMHASS voorspelt ontladen → afdwingen #}
{% elif p_batt > 10 %}
{% set mode = 'Forcible Discharge' %}
{# 6. Standaardactie #}
{% else %}
{% set mode = 'Do Nothing' %}
{% endif %}
{{ mode }} |
Dqt geeft dqn zoiets:
:strip_exif()/f/image/h0Wr0YqQ75NPTDyvbstmbwy7.png?f=user_large)
En met de prijzen van vandaag maakt emhass er dit van:
/f/image/ayAbNoKgRhVeMVfgy3LP7DPo.png?f=fotoalbum_large)
Heb hier nu wel calculate_curtailment uitstaan in emhass omdat ik nog groene stroom certificaten krijg op deze installatie van 45c€/kWh. Anders zou de planning er wat anders uitzien
OK, dank voor je info.scruysberghs schreef op zondag 29 juni 2025 @ 10:35:
[...]
Momenteel gebruik ik onderstaande template, aan de lijst met ongebruikte waarden bovenaan kan je zien dat ik er al wat mee gespeeld heb om het helemaal te krijgen zoals ik wil. Oorspronkelijk probeerde ik de echte waarden van de sensoren er mee in te brengen maar nu mpc elke 2 minuten loopt volg ik toch vooral wat emhass berekend. Enkel voor NoM sturing gebrik ik dan sensorwaarden van de p1 meter of de NoM functie van de batterij als die bestaat (=als batterij een eigen grid meter heeft)
code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46# ---------------- # TEMPLATE SENSORS # ---------------- template: - sensor: - name: "EMHASS batcontrol mode" unique_id: emhass_batcontrol_mode icon: mdi:battery-heart-outline state: > {# Waarden ophalen #} {% set p_hybrid = states('sensor.mpc_p_hybrid_inverter')| float(0) %} {% set p_batt = states('sensor.mpc_p_batt_forecast') | float(0) %} {% set p_load = states('sensor.mpc_p_load_forecast') | float(0) %} {% set p_grid = states('sensor.mpc_p_grid_forecast') | float(0) %} {% set p_curtail = states('sensor.mpc_p_pv_curtailment') | float(0) %} {% set export = states('sensor.sec_pac_power_to_grid') | float(0) %} {% set deferrables = states('sensor.mpc_p_deferrable0') | float(0) + states('sensor.mpc_p_deferrable1') | float(0) + states('sensor.mpc_p_deferrable2') | float(0) + states('sensor.mpc_p_deferrable3') | float(0) %} {% set surplus = states('sensor.sec_surplus_power') | float(0) %} {% set max_captar = states('input_number.sec_pac_doel_limiet_capaciteitspiek') | float(0) %} {% set captar15 = states('sensor.sec_pac_extrapoleer_captar_kwartier') | float(0) %} {# Bepaal modus #} {% set mode = 'Do Nothing' %} {# 1. Curtailment actief: batterij niet gebruiken zodat PV niet afgeschakeld moet worden #} {% if p_curtail > 20 %} {% set mode = 'Do Nothing' %} {# 2. Netverbruik voorspeld als 0 → batterij mag gedrag afstemmen op netbalans #} {% elif p_grid == 0 %} {% set mode = 'Follow Grid' %} {# 3. Netverbruik overschrijdt capaciteitstarieflimiet → piek afvlakken #} {% elif p_grid > max_captar %} {% set mode = 'Peak Shaving' %} {# 4. EMHASS voorspelt laden → afdwingen #} {% elif p_batt < -10 %} {% set mode = 'Forcible Charge' %} {# 5. EMHASS voorspelt ontladen → afdwingen #} {% elif p_batt > 10 %} {% set mode = 'Forcible Discharge' %} {# 6. Standaardactie #} {% else %} {% set mode = 'Do Nothing' %} {% endif %} {{ mode }}
Dqt geeft dqn zoiets:
[Afbeelding]
En met de prijzen van vandaag maakt emhass er dit van:
[Afbeelding]
Heb hier nu wel calculate_curtailment uitstaan in emhass omdat ik nog groene stroom certificaten krijg op deze installatie van 45c€/kWh. Anders zou de planning er wat anders uitzien
Jij stuurt dus niet alleen met p_batt, maar ook met p_grid en p_curtailment.
Wat doen jouw scripts 'Peak Shaving' en 'Follow Grid' precies qua aansturing van je batterij?
Ik stuur momenteel alleen met p_batt, maar ben nog aan het zoeken naar de optimale config.
Follow grid zet een automatisering aan die NoM sturing doet. Is wat afhankelijk van omvormer of batterij. Ofwel een loop elke paar seconden die (ont)laadvermogen zet ofwel aanezetten van en NoM functie van omvormer of batterij zelf als die zijn eigen grid/energie meter heeft.diamanten schreef op maandag 30 juni 2025 @ 08:26:
[...]
OK, dank voor je info.
Jij stuurt dus niet alleen met p_batt, maar ook met p_grid en p_curtailment.
Wat doen jouw scripts 'Peak Shaving' en 'Follow Grid' precies qua aansturing van je batterij?
Ik stuur momenteel alleen met p_batt, maar ben nog aan het zoeken naar de optimale config.
Peak Shaving doet een extrapolatie van het het verbruik naar het einde van het lopende kwartier. Als dat dreigt over een ingestelde limiet te gaan gaat die de batterij inschakelen. Deze overruled ook steeds alle andere sturingen
Wederom dank. Ik probeer eea verder te doorgronden, vandaar mijn vervolgvragen (scruysberghs schreef op maandag 30 juni 2025 @ 13:09:
[...]
Follow grid zet een automatisering aan die NoM sturing doet. Is wat afhankelijk van omvormer of batterij. Ofwel een loop elke paar seconden die (ont)laadvermogen zet ofwel aanezetten van en NoM functie van omvormer of batterij zelf als die zijn eigen grid/energie meter heeft.
Peak Shaving doet een extrapolatie van het het verbruik naar het einde van het lopende kwartier. Als dat dreigt over een ingestelde limiet te gaan gaat die de batterij inschakelen. Deze overruled ook steeds alle andere sturingen
Hoe werk je met 'curtailment'?
De EMHASS-manual is niet bijster uitgebreid hierover:
1
| compute_curtailment: Set to True to compute a special PV curtailment variable (Default False). |
Vraag: welke waarden kan deze variabele krijgen? Bij mij is deze nog nul (gisteren geactiveerd dus op True gezet).
Jij activeert een script als de waarde meer dan 20 is. Waarop is dat gebaseerd?
Ik heb zelf een Enphase PV. Ik kan de centrale unit (Envoy) aan of uitzetten met een HA-switch. Zou ik deze switch 'off' kunnen zetten als curtailment > 0 is?
Volgens mij is het evengoed een Wattage voor de hoeveelheid power die over is.
EMHASS heeft daar niks bruikbaars voor kunnen bedenken, geen gebruiker/batterij, dus tenzij je je omvormer knijpt gaat dat het net op.
Omvormer uitzetten is misschien zonde.
Ja, afknijpen is beter. Helaas kan dat niet met mijn Enphase PV (Envoy standard non-metered).RudolfR schreef op maandag 30 juni 2025 @ 18:37:
@diamanten
Volgens mij is het evengoed een Wattage voor de hoeveelheid power die over is.
EMHASS heeft daar niks bruikbaars voor kunnen bedenken, geen gebruiker/batterij, dus tenzij je je omvormer knijpt gaat dat het net op.
Omvormer uitzetten is misschien zonde.
[ Voor 3% gewijzigd door diamanten op 30-06-2025 19:27 ]
:strip_exif()/f/image/bq1gi8SV7eMZ6mVz6hkiarfC.jpg?f=fotoalbum_large)
Hierbij de code en graag jullie suggesties ter verbetering:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
| - sensor:
- name: "EMHASS Uitleg Batterijactie Simpel"
unique_id: emhass_batt_action_reason_simpel
state: >
{% set batt = states('sensor.p_batt_forecast') | float(0) %}
{% set soc = states('input_number.dummy_soc') | float(0) %}
{% set min_soc = states('input_number.min_soc') | float(0) %}
{% set max_soc = states('input_number.max_soc') | float(100) %}
{% set net_power = states('sensor.gecombineerde_vermogenssensor') | float(0) %}
{% if batt == 0 %}
"⏳ Geen batterijactie gepland."
{% elif soc <= min_soc and batt > 0 %}
"🛑 Ontladen geblokkeerd: SoC te laag."
{% elif soc >= max_soc and batt < 0 %}
"🛑 Laden gestopt: batterij is vol."
{% elif batt > 0 %}
{% if net_power < -50 %}
"🔋 Ontladen: injectie naar net."
{% elif net_power >= -50 and net_power <= 50 %}
"🔋 Ontladen: in balans met verbruik."
{% else %}
"🔋 Ontladen: batterij dekt netverbruik."
{% endif %}
{% elif batt < 0 %}
{% if net_power < -50 %}
"⚡ Laden: eigen overschot benut."
{% elif net_power >= -50 and net_power <= 50 %}
"⚡ Laden: in balans met verbruik."
{% else %}
"⚡ Laden: via netstroom."
{% endif %}
{% else %}
"⚖️ Geen batterijactie."
{% endif %} |
[ Voor 3% gewijzigd door diamanten op 02-07-2025 16:43 ]
Ziet er leuk uit met die symbolen, maar ik zou liever een simpele tekst-state maken en de vormgeving aan de UI overlaten.
ik vind "net_" verwarrend in het engels, omdat het lijkt op 'netto', daarom kies ik voor 'grid'
1
2
3
4
5
| {% elif soc <= min_soc and batt > 0 %} "🛑 Ontladen geblokkeerd: SoC te laag." {% elif soc >= max_soc and batt < 0 %} "🛑 Laden gestopt: batterij is vol." |
Deze begrijp ik niet goed, emhass zal toch geen batt > 0 berekenen in periods waar de soc lager is dan min_soc?
En idem voor het laden?
Ook berekent EMHASS p_grid waar je uit af kunt leiden of er sprake is van terugleveren/afnemen.
Jouw template lijkt een soort mix tussen de prognose van EMHASS en de actuele werkelijkheid.
Volgens mij kun je dat beter los blijven zien.
Ook zie ik twee verschillende 'Geen batterijactie" met twee verschillende iconen, waarvan de tweede een weegschaal is, die ik zou verwachten bij de 'balans/net zero' modus.
Dank voor je feedback! Ik ga eea verder aanpassen.RudolfR schreef op vrijdag 4 juli 2025 @ 10:23:
@diamanten
Ziet er leuk uit met die symbolen, maar ik zou liever een simpele tekst-state maken en de vormgeving aan de UI overlaten.
ik vind "net_" verwarrend in het engels, omdat het lijkt op 'netto', daarom kies ik voor 'grid'
YAML:
1 2 3 4 5 {% elif soc <= min_soc and batt > 0 %} "🛑 Ontladen geblokkeerd: SoC te laag." {% elif soc >= max_soc and batt < 0 %} "🛑 Laden gestopt: batterij is vol."
Deze begrijp ik niet goed, emhass zal toch geen batt > 0 berekenen in periods waar de soc lager is dan min_soc?
En idem voor het laden?
Ook berekent EMHASS p_grid waar je uit af kunt leiden of er sprake is van terugleveren/afnemen.
Jouw template lijkt een soort mix tussen de prognose van EMHASS en de actuele werkelijkheid.
Volgens mij kun je dat beter los blijven zien.
Ook zie ik twee verschillende 'Geen batterijactie" met twee verschillende iconen, waarvan de tweede een weegschaal is, die ik zou verwachten bij de 'balans/net zero' modus.
Nb. ik controleer op min soc en max soc omdat ik mijn accu in deze testfase ook nog op een andere manier aanstuur.
Dingen zoals toestellen aan en uitschakelen op basis van verbruik, EV laten load balancen en solar excess verbruiken, etc..
Het lukt wel maar voelt wat onoverzichtelijk, 'tis erg moeilijk om schalende prioriteiten te doen, alles zit verdeeld over template sensors en automations, veel heen en weer springen, moeilijk overzicht..
Ik denk dat EMHASS wel de oplossing is, maar:
Ik draai op Synology in Docker, dus moet al weer een extra docker container opstarten. Ben sowieso geen fan van het idee dat EMHASS apart draait van HA, waarom is dit zo, heeft het echt voordelen, vinden jullie dat goed werkbaar? Het lijkt nogal een gedoe op het eerste zicht...
Ook heb ik dan nog eens bijzonder moeilijk toegang tot mijn maandelijkse stroomprijzen via API, moet al web-scraping gaan doen, en het lijkt alsof de prijzen pas de op het einde van de maand bekend zijn (neemt maandelijks gemiddeld EPEXDAM..) Maakt dit uit ?
Heb ook geen thuisbatterij, als dat uitmaakt.
Batterij is geen vereiste. Planbare loads dan des te meer, EV, boiler.
Hoe bedoel je "apart", als add-on? Of bij jou op aparte computers? Waarom voelt dat verkeerd?
Een EMS lijkt me een wezenlijk andere functie dan een domoticasysteem. Kan prima gescheiden via een API?
Apart als in aparte container om te updaten, in te stellen, dan ook nog ens zorgen dat het goed communiceert en synchroniseert (gaat naar mijn ervaring toch altijd wat mis). Vaak gebeurt er dan een update en werkt het plots niet meer samen. Ik heb zo al m'n Z-wave spul weg gedaan omdat ik het zo beu was dat zwave2mqtt stopte met werken bij zowat iedere update van Home Assistant die ik deed, werd er knettergek van.RudolfR schreef op vrijdag 1 augustus 2025 @ 13:34:
@Xoliul
Batterij is geen vereiste. Planbare loads dan des te meer, EV, boiler.
Hoe bedoel je "apart", als add-on? Of bij jou op aparte computers? Waarom voelt dat verkeerd?
Een EMS lijkt me een wezenlijk andere functie dan een domoticasysteem. Kan prima gescheiden via een API?
Als het allemaal in Home Assistant zit, dan werkt het gewoon meteen bij een update.
Tja, dan is de keuze voor het draaien van home assistant in docker (op Synology) voor jou misschien niet de juiste? Dan mis je de “add-on” functionaliteit (wat in feite ook docker containers zijn, maar dan meer onder stuur van home assistant zelf) en het gemak daarvan.Xoliul schreef op zaterdag 2 augustus 2025 @ 10:15:
[...]
Apart als in aparte container om te updaten, in te stellen, dan ook nog ens zorgen dat het goed communiceert en synchroniseert (gaat naar mijn ervaring toch altijd wat mis). Vaak gebeurt er dan een update en werkt het plots niet meer samen. Ik heb zo al m'n Z-wave spul weg gedaan omdat ik het zo beu was dat zwave2mqtt stopte met werken bij zowat iedere update van Home Assistant die ik deed, werd er knettergek van.
Als het allemaal in Home Assistant zit, dan werkt het gewoon meteen bij een update.
Voorheen probeerde om heel vaak de MPC te draaien om de actuele waarden van PV/P1 te gebruiken. Maar dat is tijdrovend en je loopt altijd achter de feiten aan.
Draai ik de MPC nu iedere 15 minuten en ik regel op basis van de P1 meter en de 'strategie' uit EMHASS, die ik bepaal mbv de berekende waardes, voor grid import en batterij.
Daardoor kan emhass zero_import/geen batterij berekend hebben, maar kan ik bij load toch de batterij bijschakelen.
Bijv. Als ik de was opzet op een zonnige dag. Gaat best goed.
Interessant, ik ben ook nog zoekende naar de meest efficiente aanpak. Ik draai nu de MPC elke 3 minuten.RudolfR schreef op dinsdag 5 augustus 2025 @ 20:03:
Inmiddels een andere aanpak gekozen met EMHASS.
Voorheen probeerde om heel vaak de MPC te draaien om de actuele waarden van PV/P1 te gebruiken. Maar dat is tijdrovend en je loopt altijd achter de feiten aan.
Draai ik de MPC nu iedere 15 minuten en ik regel op basis van de P1 meter en de 'strategie' uit EMHASS, die ik bepaal mbv de berekende waardes, voor grid import en batterij.
Daardoor kan emhass zero_import/geen batterij berekend hebben, maar kan ik bij load toch de batterij bijschakelen.
Bijv. Als ik de was opzet op een zonnige dag. Gaat best goed.
Betekent jouw aanpak: EMHASS voor de strategie en je P1-meter voor de operationele uitvoering? Kan je nog wat meer voorbeelden geven van een 'override'? Bijv. ga je ook opladen ondanks dat EMHASS dit niet adviseert? En zo ja, op basis van welke criteria?
Ja, dat is het inderdaad.
Ik heb net als jij een template sensor:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
| - sensor: - name: "EMHASS battery mode" unique_id: 2022603f-cb5a-4693-a70d-f0eef4b6883e icon: mdi:battery-heart-outline state: > {# Waarden ophalen #} {% set p_pv = states('sensor.p_pv')| float(0) %} {% set p_batt = states('sensor.p_batt_forecast') | float(0) %} {% set p_load = states('sensor.p_load_forecast') | float(0) %} {% set p_grid = states('sensor.p_grid_forecast') | float(0) %} {% set soc = states('sensor.athom_smart_plug_v3_50f110_jbd_bms_state_of_charge') | float(0) %} {# Bepaal modus #} {% set mode = 'idle' %} {% if p_batt < 0 %} {% set mode = 'charge' %} {% else %} {% if soc < 3 %} {% set mode = 'blocked' %} {% elif p_grid < 20 %} {% set mode = 'net_zero' %} {% else %} {% set mode = 'discharge' %} {% endif %} {% endif %} {{ mode }} |
In m'n automation heb ik een aantal variabelen, op basis van de modus.
1
2
3
4
5
6
| p_batt_forecast: > {{ states('sensor.p_batt_forecast') | float(0) }} p_batt_limit: > {{ iif(states('sensor.emhass_battery_mode') == 'discharge', p_batt_forecast, 650) }} p_batt_limit2: > {{ iif(states('sensor.emhass_battery_mode') == 'blocked', 0, p_batt_limit) }} |
Zodat ik bij 'net_zero' gewoon naar nul-op-de-meter kan sturen op basis van de P1-meter.
Zonder daarbij de waarde van EMHASS te gebruiken dus.
Opladen ook, daar gaat het overschot ook de batterij in, tenzij de SoC hoog is of EMHASS ook laden voorstelt.
1
2
3
4
5
6
7
8
9
10
| p_surplus: > {% set available_for_charging = -p_to_charger - p_to_grid + p_from_grid + p_from_battery %} {{ iif(available_for_charging > 0, 0, available_for_charging) }} p_batt: > {% set p_batt_fc = states('sensor.p_batt_forecast') | float(0) %} {% set battery_mode = states('sensor.emhass_battery_mode') %} {% set soc = states('sensor.athom_smart_plug_v3_50f110_jbd_bms_state_of_charge') | float(0) %} {% if battery_mode == 'charge' or soc > 95 %} {{ [p_surplus, p_batt_fc] | max }} {% endif %} |
Dat zal vast minder goed passen bij een dynamisch tarief, maar dat heb ik niet, dus ik wil alleen laden met PV.
Grappig, we zitten grotendeels op dezelfde lijn (althans volgens Chatgtp):RudolfR schreef op woensdag 6 augustus 2025 @ 10:41:
@diamanten
Ja, dat is het inderdaad.
Ik heb net als jij een template sensor:
YAML:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 - sensor: - name: "EMHASS battery mode" unique_id: 2022603f-cb5a-4693-a70d-f0eef4b6883e icon: mdi:battery-heart-outline state: > {# Waarden ophalen #} {% set p_pv = states('sensor.p_pv')| float(0) %} {% set p_batt = states('sensor.p_batt_forecast') | float(0) %} {% set p_load = states('sensor.p_load_forecast') | float(0) %} {% set p_grid = states('sensor.p_grid_forecast') | float(0) %} {% set soc = states('sensor.athom_smart_plug_v3_50f110_jbd_bms_state_of_charge') | float(0) %} {# Bepaal modus #} {% set mode = 'idle' %} {% if p_batt < 0 %} {% set mode = 'charge' %} {% else %} {% if soc < 3 %} {% set mode = 'blocked' %} {% elif p_grid < 20 %} {% set mode = 'net_zero' %} {% else %} {% set mode = 'discharge' %} {% endif %} {% endif %} {{ mode }}
In m'n automation heb ik een aantal variabelen, op basis van de modus.
YAML:
1 2 3 4 5 6 p_batt_forecast: > {{ states('sensor.p_batt_forecast') | float(0) }} p_batt_limit: > {{ iif(states('sensor.emhass_battery_mode') == 'discharge', p_batt_forecast, 650) }} p_batt_limit2: > {{ iif(states('sensor.emhass_battery_mode') == 'blocked', 0, p_batt_limit) }}
Zodat ik bij 'net_zero' gewoon naar nul-op-de-meter kan sturen op basis van de P1-meter.
Zonder daarbij de waarde van EMHASS te gebruiken dus.
Opladen ook, daar gaat het overschot ook de batterij in, tenzij de SoC hoog is of EMHASS ook laden voorstelt.
YAML:
1 2 3 4 5 6 7 8 9 10 p_surplus: > {% set available_for_charging = -p_to_charger - p_to_grid + p_from_grid + p_from_battery %} {{ iif(available_for_charging > 0, 0, available_for_charging) }} p_batt: > {% set p_batt_fc = states('sensor.p_batt_forecast') | float(0) %} {% set battery_mode = states('sensor.emhass_battery_mode') %} {% set soc = states('sensor.athom_smart_plug_v3_50f110_jbd_bms_state_of_charge') | float(0) %} {% if battery_mode == 'charge' or soc > 95 %} {{ [p_surplus, p_batt_fc] | max }} {% endif %}
Dat zal vast minder goed passen bij een dynamisch tarief, maar dat heb ik niet, dus ik wil alleen laden met PV.
Ik heb de modus template toegevoegd en ben nu aan het proefdraaien (zowel met vaste als dynamische tarieven).
Volgens mij heb ik alle parameters ingevuld die nodig zijn voor de berekening maar er klopt geen hout van de waarde die ik eruit krijg. PV opwek wordt al helemaal niet gezien, terwijl ik wel alle solcast waarden heb ingevuld. Ik weet dat de leercurve stijl is maar omdat ik ook maar 10 API calls per dag mag doen is het testen tot nu toe zonder positief resultaat gebleven. Ook met de info uit diverse fora raak ik niet wijzer.
Zie onderstaand mijn huidige configuratie. Daarnaast in HA config nog de solcast parameters ingevuld.
code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119{ "adjusted_pv_regression_model": "LassoRegression", "adjusted_pv_solar_elevation_threshold": 10, "battery_charge_efficiency": 0.92, "battery_charge_power_max": 1200, "battery_discharge_efficiency": 0.92, "battery_discharge_power_max": 1200, "battery_dynamic_max": 0.9, "battery_dynamic_min": -0.9, "battery_maximum_state_of_charge": 0.99, "battery_minimum_state_of_charge": 0.1, "battery_nominal_energy_capacity": 5760, "battery_target_state_of_charge": 0.4, "compute_curtailment": false, "continual_publish": false, "costfun": "profit", "delta_forecast_daily": 1, "end_timesteps_of_each_deferrable_load": [ 0, 0 ], "historic_days_to_retrieve": 7, "inverter_is_hybrid": false, "load_cost_forecast_method": "hp_hc_periods", "load_forecast_method": "naive", "load_negative": false, "load_offpeak_hours_cost": 0.1419, "load_peak_hour_periods": { "period_hp_1": [ { "start": "02:54" }, { "end": "15:24" } ] }, "load_peak_hours_cost": 0.1907, "logging_level": "INFO", "lp_solver": "default", "lp_solver_path": "empty", "lp_solver_timeout": 45, "maximum_power_from_grid": 9000, "maximum_power_to_grid": 5500, "method_ts_round": "nearest", "minimum_power_of_deferrable_loads": [ 200, 200 ], "modules_per_string": [ 16 ], "nominal_power_of_deferrable_loads": [ 2000, 750 ], "num_threads": 0, "number_of_deferrable_loads": 2, "open_meteo_cache_max_age": 30, "operating_hours_of_each_deferrable_load": [ 4, 1 ], "optimization_time_step": 30, "photovoltaic_production_sell_price": 0.1419, "production_price_forecast_method": "constant", "pv_inverter_model": [ "Fronius_International_GmbH__Fronius_Primo_5_0_1_208_240__240V_" ], "pv_module_model": [ "CSUN_Eurasia_Energy_Systems_Industry_and_Trade_CSUN295_60M" ], "sensor_linear_interp": [ "sensor.actueel_verbruik_w" ], "sensor_power_load_no_var_loads": "sensor.actueel_verbruik_w", "sensor_power_photovoltaics": "sensor.total_pv_generation", "sensor_power_photovoltaics_forecast": "sensor.thuis", "sensor_replace_zero": [ "sensor.pv_power", "sensor.thuis" ], "set_battery_dynamic": false, "set_deferrable_load_single_constant": [ false, false ], "set_deferrable_startup_penalty": [ 0, 0 ], "set_nocharge_from_grid": false, "set_nodischarge_to_grid": false, "set_total_pv_sell": false, "set_use_adjusted_pv": false, "set_use_battery": true, "set_use_pv": false, "set_zero_min": true, "start_timesteps_of_each_deferrable_load": [ 0, 0 ], "strings_per_inverter": [ 1 ], "surface_azimuth": [ 205 ], "surface_tilt": [ 30 ], "treat_deferrable_load_as_semi_cont": [ true, true ], "weather_forecast_method": "solcast", "weight_battery_charge": 0, "weight_battery_discharge": 0 }
- onderaan de webpagina van EMHASS zie je het optimization result. Als dat anders is dan Optimal klopt er niets van. Weet niet wat er bij jou als uitkomst kwam (ik vermoed unfeasible oid), maar dan betekent dat meestal dat je onjuiste of tegenstrijdige parameters hebt doorgegeven.
- voor wat betreft solcast: ik gebruik daarvoor de HACS integratie (BJReplay / ha-solcast-solar), die werkt wel prettig, want dan kun je zelf aangeven hoe vaak hij de API mag gebruiken, dat verdeelt hij dan over de dag en tussenin geeft hij de vorige waarden terug, dan heb je dus geen last van de 10 calls max.
- waar ik erg veel baat bij gehad heb ik in HA de Developer Tools | Template pagina, daar kun je veel van de parameters die je runtime doorgeeft aan EMHASS evalueren of ze juist zijn
- de logs van EMHASS geven ook aardig wat info, hoewel ook wel eens een hele brei, waar moeilijk doorheen te lezen is. Vooral op zoek gaan naar de eerte fout die optrad
- je zou het leven nog iets gemakkelijker kunnen maken door bv. eerst zonder batterij en bv, naar 1 deferrable load te werken dan maak je het probleem mogelijk wat kleiner / gemakkelijker te doorgronden
- en verder: hou vol, als het eenmaal draait dan is 't erg mooi en stabiel
Bedankt voor de tips, ga ik in ieder geval naar kijken:MarcoPolet schreef op zaterdag 16 augustus 2025 @ 15:28:
Misschien een paar tips:
- onderaan de webpagina van EMHASS zie je het optimization result. Als dat anders is dan Optimal klopt er niets van. Weet niet wat er bij jou als uitkomst kwam (ik vermoed unfeasible oid), maar dan betekent dat meestal dat je onjuiste of tegenstrijdige parameters hebt doorgegeven.
- voor wat betreft solcast: ik gebruik daarvoor de HACS integratie (BJReplay / ha-solcast-solar), die werkt wel prettig, want dan kun je zelf aangeven hoe vaak hij de API mag gebruiken, dat verdeelt hij dan over de dag en tussenin geeft hij de vorige waarden terug, dan heb je dus geen last van de 10 calls max.
- waar ik erg veel baat bij gehad heb ik in HA de Developer Tools | Template pagina, daar kun je veel van de parameters die je runtime doorgeeft aan EMHASS evalueren of ze juist zijn
- de logs van EMHASS geven ook aardig wat info, hoewel ook wel eens een hele brei, waar moeilijk doorheen te lezen is. Vooral op zoek gaan naar de eerte fout die optrad
- je zou het leven nog iets gemakkelijker kunnen maken door bv. eerst zonder batterij en bv, naar 1 deferrable load te werken dan maak je het probleem mogelijk wat kleiner / gemakkelijker te doorgronden
- en verder: hou vol, als het eenmaal draait dan is 't erg mooi en stabiel
- Resultaat is Optimal dus dat gaat dan goed denk ik?
- Solcast gebruik ik ook op die manier. Dat werkt wel goed alleen nog problemen om het werkend te krijgen in EMHASS
- Ik snap niet precies wat je bedoelt met de runtime parameters maar ben wel bekend met de dev tools. Daar valt mogelijk dus nog wat te winnen
- Logs gaven voornamelijk solcast aan, al lijkt dit nu goed te gaan. Nu een probleem met var_no_loads sensor. Misschien moet ik even wachten totdat deze twee dagen aan historische data heeft. Mocht het dan nog niet lukken kom ik er uiteraard op terug.
- Beginnen met de basis had misschien wel handig geweest inderdaad. Mocht het niet lukken ga ik dit overwegen, want ik ga door tot het werkt
Even geduld dus.
Als je solcast vanuit EMHASS zelf wilt gebruiken dan moet je ook het solcast rooftop-id en de api-key meesturen. Als je nog steeds de HACS solcast integratie gebruikt, dan zou je eigenlijk csv moeten opgeven (althans, dat doe ik), en dan geef je in de aanroep van bv. de day-ahead call de pv-forecast mee:
zoiets:
"pv_power_forecast\": {{state_attr('sensor.solcast_48hrs_forecast_15minutes_interval_current_quarter', 'solar_power') }}
deze zal bij jou niet direct werken, omdat ik zelf vanuit de 30 minuten solcast een list gemaakt heb voor 15 minuten interval (als voorbereiding op de kwartier-prijzen vanaf oktober ergens).
Dat klikken is wel handig om e.e.a. te proberen, maar rechstreeks vanuit HA is gemakkelijker voor de latere termijn. Kan op meerdere manieren, ik definieer een curl commando in configuration.yaml (als een shell_command). Deze worden dan via automations aangeroepen.
Wat eerder al werd genoemd, het is een flinke leercurve
Dit idee:
1
| curl -i -H "Content-Type:application/json" -X POST -d '{"solcast_rooftop_id":"<your_system_id>","solcast_api_key":"<your_secret_api_key>"}' http://localhost:5000/action/dayahead-optim |
Zie ook de documentatie:
https://emhass.readthedoc...st/forecasts.html#solcast
Als voorbeeld, hier zijn een paar van mijn rest_commands:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
| rest_command: emhass_dayahead_optim: url: http://localhost:5000/action/dayahead-optim method: post timeout: 300 content_type: 'application/json' payload: > { "load_cost_forecast": {{ state_attr('sensor.current_price_for_electricity_usage', 'upcoming_24_hours_emhass_1h') }}, "prod_price_forecast": {{ state_attr('sensor.current_price_for_electricity_return', 'upcoming_24_hours_emhass_1h') }}, "def_total_hours": {{ states('sensor.deferrable_loads') }} } emhass_npc_optim_with_pv_15m: url: http://localhost:5000/action/naive-mpc-optim method: post timeout: 300 payload: > {% set horizon = min(144, state_attr('sensor.entsoe_prices_forecast_30', 'prices_36h_15min') | length | int) %} { "load_cost_forecast": {{ state_attr('sensor.entsoe_prices_forecast_30', 'prices_36h_15min') | tojson }}, "prod_price_forecast": {{ state_attr('sensor.entsoe_prices_forecast_30', 'prices_36h_15min_return') | tojson }}, {% if state_attr('sensor.solcast_forecast_data', 'forecasts') != [] %}"pv_power_forecast": {{ state_attr('sensor.solcast_24hrs_forecast_15m', 'forecasts')[:horizon] | tojson }},{% endif %} "prediction_horizon": {{ horizon | tojson }}, "soc_init": {{ (states('sensor.hyper_2000_electric_level') | float(0) / 100) | round(2) | tojson }}, "soc_final": 0.6 } |
Ik vind het ook veel leesbaarder
Ik denk dat je dataset te beperkt is voor goede resultaten; zeker nu het weer verandert.
Met PV kreeg ik ook wel zoiets, maar met de load niet, ook niet over 30 dagen.
Dit heb ik opgelost door in Home Assistant een filter-sensor aan te maken die een moving_average heeft van 5 minuten. Die sensor gebruik ik nu in EMHASS, en dat geeft een veel rustiger én accurater beeld van mijn base-load.
1
2
3
4
5
6
7
8
9
| sensor: - platform: filter name: "Power load no var loads filter" unique_id: d2261339-79ee-4d0f-a225-bb7c3357da87 entity_id: sensor.power_load_no_var_loads filters: - filter: time_simple_moving_average window_size: "00:05" precision: 0 |
Ik heb dit geprobeerd maar dan krijg ik hetzelfde resultaat als dat ik gewoon de API key en rooftop ID invul in de configuratie. Nog steeds 0 PV_load....RudolfR schreef op donderdag 21 augustus 2025 @ 20:18:
@dennisdew16
Dit idee:
code:
1curl -i -H "Content-Type:application/json" -X POST -d '{"solcast_rooftop_id":"<your_system_id>","solcast_api_key":"<your_secret_api_key>"}' http://localhost:5000/action/dayahead-optim
Zie ook de documentatie:
https://emhass.readthedoc...st/forecasts.html#solcast
Goeie tip, heb het nu op debug gezet. Echter niks geks.MarcoPolet schreef op zondag 24 augustus 2025 @ 09:39:
Komt er in het EMHASS log nog iets interessants voorbij? Dat is vaak de eerste plek om dit soort dingen te onderzoeken. In de EMHASS config dan de logging level nog even op DEBUG zetten.
En misschien gebruik ik het verkeerd, maar als ik al zoiets simpels als onderstaand uitvoer:
1
| curl -i -H "Content-Type:application/json" -X POST -d '{"solcast_rooftop_id":"xxx","solcast_api_key":"xxx"}' http://192.168.1.xxx:5000/action/dayahead-optim |
Krijg ik geen foutmeldingen maar ook geen PV opwek te zien. En met de documentatie kom ik er ook niet echt uit. Ik heb echt het idee dat ik dingen over het hoofd zie of het dus niet goed gebruik maar ik kom er tot op heden weer niet uit...
Dat komt waarschijnlijk omdat je de andere parameters voor de dayahead er nu niet bij hebt?
Ik doe dat zo, maar ik geef pv_power_forecast zelf mee, jij zou dit vervangen door de settings voor solcast.
Via de web-ui kun je dit er in plakken (type 'Box') bij Input Runtime Parameters voordat je de dayahead uitvoert (via de knop in de UI)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
| {"entity_save": true, "publish_prefix": "",
"battery_maximum_state_of_charge": 1, "battery_minimum_state_of_charge":
0.02, "battery_target_state_of_charge": 0.24,
"battery_discharge_power_max": 600, "battery_charge_power_max": 800.0,
"weather_forecast_cache": false, "pv_power_forecast": [0, 0, 0, 0, 0, 14,
265, 553, 815, 1061, 1265, 1486, 1632, 1801, 1933, 2014, 2059, 2080, 2076,
2058, 2006, 1925, 1807, 1666, 1493, 1296, 1093, 878, 631, 490, 406, 277,
117, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], "load_cost_forecast":
[0.25112, 0.25112, 0.25112, 0.25112, 0.25112, 0.25112, 0.25112, 0.26322,
0.26322, 0.26322, 0.26322, 0.26322, 0.26322, 0.26322, 0.26322, 0.26322,
0.26322, 0.26322, 0.26322, 0.26322, 0.26322, 0.26322, 0.26322, 0.26322,
0.26322, 0.26322, 0.26322, 0.26322, 0.26322, 0.26322, 0.26322, 0.26322,
0.26322, 0.26322, 0.26322, 0.26322, 0.26322, 0.26322, 0.26322, 0.25112,
0.25112, 0.25112, 0.25112, 0.25112, 0.25112, 0.25112, 0.25112, 0.25112] } |
Maar goed, is de oplossing dan iets van een template sensor maken die elke dag die waarde ophaalt, of hoe doe jij het in de specifieke geval om de pv data te laden?
Dan nog een vraag over de input parameters: welke data moet hier perse in staan? Of zijn dit allemaal optionele parameters om de voorspelling nauwkeuriger te maken?
EMHASS kan dat ook doen, maar dan moet je in de gegevens van solcast meenemen als runtime parameters. (en pv_power_forecast weglaten)
Ik heb de solcast integratie in Home Assistant en die haalt de waardes op. Daarvan maak ik een array voor EMHASS, om mee te geven aan de day-ahead en MPC.
Met alleen solcast krijg ik een infeasible resultaat, maar dat kan ook de combinatie zijn van mijn standaard-instellingen. Ga dat niet te vaak doen, want dat kost me vast api-hits.
Hier is alleen een pv_power_forecast voldoende voor een goed resultaat:
{"pv_power_forecast":[0,0,0,0,0,14,265,553,815,1061,1265,1486,1632,1801,1933,2014,2059,2080,2076,2058,2006,1925,1807,1666,1493,1296,1093,878,631,490,406,277,117,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0]}, aangenomen dat die dan van solcast komt zou alleen de api-info voor solcast voldoende moeten zijn. Misschien zit je al aan je limiet en komt er geen data terug om mee te rekenen?
[ Voor 31% gewijzigd door RudolfR op 25-08-2025 16:00 ]
edit: heb nu onderstaand en dat lijkt enigzins te werken.
1
2
3
4
5
6
7
8
9
10
| rest_command:
emhass_dayahead_optim:
url: http://localhost:5000/action/dayahead-optim
method: post
timeout: 300
content_type: 'application/json'
payload: >
{
"pv_power_forecast": {{ states('sensor.pv_power_forecast') }}
} |
Maar betekend dit dus eigenlijk dat alles via rest commands moet lopen? Want dan snap ik waarom ie bij mij niks deed als ik alleen de standaard configuratie gebruik.
[ Voor 57% gewijzigd door dennisdew16 op 25-08-2025 17:15 ]
Ook als je straks een berekening hebt zul je met regelmaat een publish moeten aanroepen zodat HA de laatste waardes doorkrijgt (passend bij de huidige periode)
Tegenwoordig kun je alles wel meegeven als runtime parameter; eerder was dat niet zo en moest een deel worden ingesteld in de config van de addon.
Je kunt het nog steeds mixen. Settings die je niet meegeeft komen dan uit je standaard config. In de rest-call kunt je er er dan voor kiezen om een andere waarde mee te geven en de config te overrulen.
Ik zat dit ook eens te bekijken:Sicco92 schreef op vrijdag 22 augustus 2025 @ 11:16:
Die power load sensor was bij mij ook nog wel een dingetje met EMHASS. Ik heb er soms kleine piekjes in zitten van bijvoorbeeld de compressor van de koelkast of de keukenboiler. EMHASS extrapoleert die piekjes dan naar het hele kwartier, waardoor ik vaak een erg onrustige voorspelling kreeg. Nu maakt die load-voorspelling voor mij nog weinig uit, maar vanaf 2027 wordt die belangrijker omdat er dan vaker op NOM gedraaid moet gaan worden.
Dit heb ik opgelost door in Home Assistant een filter-sensor aan te maken die een moving_average heeft van 5 minuten. Die sensor gebruik ik nu in EMHASS, en dat geeft een veel rustiger én accurater beeld van mijn base-load.
YAML:
1 2 3 4 5 6 7 8 9 sensor: - platform: filter name: "Power load no var loads filter" unique_id: d2261339-79ee-4d0f-a225-bb7c3357da87 entity_id: sensor.power_load_no_var_loads filters: - filter: time_simple_moving_average window_size: "00:05" precision: 0
Vraag: een dergelijke sensor kan toch eigenlijk nooit '0' zijn vanwege het altijd aanwezige sluipverbruik?Sensor power loads with no variable loads:
The name of the household power consumption sensor in Watts from Home Assistant. The deferrable loads that we will want to include in the optimization problem should be subtracted from this sensor in HASS.
Nu is mijn sensor_power_load_no_var_loads namelijk vaak iets boven de '0' W is (ook met gebruik van bovenstaand filter), waarschijnlijk omdat mijn zonnepanelen (Enphase) slechts om de 60 seconden een update geven en dus niet in sync zijn met mijn P1-meter (om de 10 seconden).
Ik heb 's nachts een sluipverbruik van rond de 300W, dus eigenlijk is dat ook de minimale waarde van sensor_power_load_no_var_loads of zie ik dat verkeerd?
[ Voor 11% gewijzigd door diamanten op 01-09-2025 18:25 ]
Helpen kan altijd, ik zou eerst zelf beginnen met home assistant. Eerst je zonnepanelen toevoegen, P1-meter koppelen, smart sockets installeren, etc. Zo ben ik vorig jaar ook gestart.cnoobie schreef op vrijdag 5 september 2025 @ 17:17:
Dag allemaal, wow wat een kennis en ervaring zit hier. Mijn vraag is misschien een beetje offtopic. Kennen (of zijn) jullie mensen/bedrijven die dit soort toepassingen (home assistant als home energy management system met zonnepanelen, warmtepomp, laadpaal en toekomstige thuisbatterij) voor anderen in kunnen richten? Tegen betaling natuurlijk? Deze leercurve is mij te steil, maar ik wil niet afhankelijk worden van techbedrijven die over 5 jaar misschien niet meer bestaan of hun app ineens uitschakelen.
Anders ben je ook weer afhankelijk van een derde die iets heeft ingericht, wat niet helemaal helder is.
Ik ben het met @diamanten eens. Gewoon beginnen. Een EMS gebaseerd op zoiets als home assistant blijft je aandacht vragen. Dat is juist ook de kracht (steeds verder verbeteren) en hobby (je blijft betrokken bij je energie verbruik en hoe dat te optimaliseren). Het is geen kwestie van één keer installeren en instellen en jarenlang blijven draaien. Als je rustig de tijd neemt kun je de leercurve uitrekken en minder stijl maken. Als je dat toch niet aandurft, dan moet je je afvragen of deze route wel iets voor jou is. Alternatief kan iets als home wizard zijn. Een stuk toegankelijker en ook gericht op inzicht in verbruik en sturen op verbruik.cnoobie schreef op vrijdag 5 september 2025 @ 17:17:
Dag allemaal, wow wat een kennis en ervaring zit hier. Mijn vraag is misschien een beetje offtopic. Kennen (of zijn) jullie mensen/bedrijven die dit soort toepassingen (home assistant als home energy management system met zonnepanelen, warmtepomp, laadpaal en toekomstige thuisbatterij) voor anderen in kunnen richten? Tegen betaling natuurlijk? Deze leercurve is mij te steil, maar ik wil niet afhankelijk worden van techbedrijven die over 5 jaar misschien niet meer bestaan of hun app ineens uitschakelen.
[ Voor 35% gewijzigd door Xoliul op 10-09-2025 22:31 ]
Kan je niet gewoon een container opspinnen op basis van een image? Als je ghcr.io/davidusb-geek/emhass:0.13.4 gebruikt, dan heb je de laatste versie.Xoliul schreef op woensdag 10 september 2025 @ 22:27:
Ik zat wat verder te kijken of ik EMHASS eens kan testen, maar blijkbaar is EMHASS op Synology Docker redelijk out of date, iemand een oplossing voor?
Een oud collega van me heeft er zijn (deel)beroep van gemaakt: https://smartenergycontrol.be/over-ons/cnoobie schreef op vrijdag 5 september 2025 @ 17:17:
Dag allemaal, wow wat een kennis en ervaring zit hier. Mijn vraag is misschien een beetje offtopic. Kennen (of zijn) jullie mensen/bedrijven die dit soort toepassingen (home assistant als home energy management system met zonnepanelen, warmtepomp, laadpaal en toekomstige thuisbatterij) voor anderen in kunnen richten? Tegen betaling natuurlijk? Deze leercurve is mij te steil, maar ik wil niet afhankelijk worden van techbedrijven die over 5 jaar misschien niet meer bestaan of hun app ineens uitschakelen.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
| - name: "Solcast PV Forecast Power Series"
unique_id: solcast_pv_forecast_power_series
unit_of_measurement: "W"
device_class: power
state_class: measurement
state: >
{% set forecast = state_attr('sensor.solcast_pv_forecast_forecast_tomorrow','detailedForecast') %}
{% if forecast %}
{# Show the first interval’s W value in state #}
{% set first = forecast[0].pv_estimate | float(0) %}
{{ ((first / 0.5) * 1000) | round(0) }}
{% else %}
0
{% endif %}
attributes:
forecast: >
{% set forecast = state_attr('sensor.solcast_pv_forecast_forecast_tomorrow','detailedForecast') %}
{% if forecast %}
{% set data = [] %}
{% for step in forecast %}
{% set w = ((step.pv_estimate | float(0)) / 0.5 * 1000) | round(0) %}
{% set rec = {"datetime": step.period_start, "value": w} %}
{% set data = data + [rec] %}
{% endfor %}
{{ data }}
{% else %}
[]
{% endif %} |
In m'n EMHASS config ziet het er nu zo uit:
1
2
3
4
| "pv_power_forecast": {
"method": "ha",
"entity_id": "sensor.solcast_pv_forecast_power_series"
}, |
Maar... ik zie in de grafiekjes na een daily optimize niks over een solar voorspelling... In de EMHASS logs:
1
2
3
4
5
6
7
8
| [2025-09-24 10:20:16 +0200] [25] [INFO] >> Performing dayahead optimization... [2025-09-24 10:20:16 +0200] [25] [INFO] Performing day-ahead forecast optimization [2025-09-24 10:20:16 +0200] [25] [INFO] Perform optimization for the day-ahead [2025-09-24 10:20:16 +0200] [25] [WARNING] Solver default unknown, using default [2025-09-24 10:20:16 +0200] [25] [INFO] Status: Optimal [2025-09-24 10:20:16 +0200] [25] [INFO] Total value of the Cost function = -1.70 [2025-09-24 10:20:16 +0200] [25] [INFO] Optimization status: Optimal [2025-09-24 10:20:17 +0200] [25] [INFO] >> Sending rendered template table data |
Iemand die dit werkend heeft en de correcte config heeft?
Ik loop een beetje achter met EMHASS, maar ik ben niet bekend met een pv_power_forecast method: "ha" en een entity_id die kan worden uitgelezen.
Ik ben gewend dat je die forecast moet meegeven als parameter in de rest-call.
Ik gebruik geen rest-call of automations, tot nu toe. Heb EMHASS als add-on draaien en druk vie de GUI op optimize. Config in /share/config.jsonRudolfR schreef op woensdag 24 september 2025 @ 10:38:
@zaphod_b
Ik loop een beetje achter met EMHASS, maar ik ben niet bekend met een pv_power_forecast method: "ha" en een entity_id die kan worden uitgelezen.
Ik ben gewend dat je die forecast moet meegeven als parameter in de rest-call.
Dit kun je zo in de 'Box' plakken voor een day-ahead, maar zoals gezegd, pv_power_forecast is een array, geen entity van HA.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
| {"entity_save": true, "publish_prefix": "", "battery_maximum_state_of_charge": 1, "battery_minimum_state_of_charge": 0.02, "battery_target_state_of_charge": 0.13, "battery_discharge_power_max": 600, "battery_charge_power_max": 800.0, "weather_forecast_cache": false, "pv_power_forecast": [0, 0, 0, 0, 0, 0, 0, 133, 672, 949, 1240, 1430, 1616, 1780, 1836, 1873, 1853, 1823, 1748, 1648, 1598, 1577, 1485, 1330, 1145, 929, 717, 480, 315, 160, 39, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], "load_cost_forecast": [0.25112, 0.25112, 0.25112, 0.25112, 0.25112, 0.25112, 0.25112, 0.26322, 0.26322, 0.26322, 0.26322, 0.26322, 0.26322, 0.26322, 0.26322, 0.26322, 0.26322, 0.26322, 0.26322, 0.26322, 0.26322, 0.26322, 0.26322, 0.26322, 0.26322, 0.26322, 0.26322, 0.26322, 0.26322, 0.26322, 0.26322, 0.26322, 0.26322, 0.26322, 0.26322, 0.26322, 0.26322, 0.26322, 0.26322, 0.25112, 0.25112, 0.25112, 0.25112, 0.25112, 0.25112, 0.25112, 0.25112, 0.25112] } |
Ik gebruik het ook, werkt erg goed, maar wel een flink steile leercurve, hoewel er inmiddels ook behoorlijk goede documentatie is. En een vrij actief forum. En hier bij tweakers krijg je ook vast hulp :-)ZatarraNL schreef op zondag 28 december 2025 @ 17:40:
Ik overweeg me te gaan verdiepen in emhass. Wie gebruikt dit nog? Of zijn er nog alternatieven?
Nog beginnertips?
[ Voor 3% gewijzigd door ZatarraNL op 28-12-2025 19:11 ]
een alternatief: Day Ahead Optimizer: ervaringen met Home Assistant-addon DAOZatarraNL schreef op zondag 28 december 2025 @ 17:40:
Ik overweeg me te gaan verdiepen in emhass. Wie gebruikt dit nog? Of zijn er nog alternatieven?
Gasloos 2019 + WP Panasonic H-serie 7kW + 300 liter boilervat + PV 12.415Wp + Home Assistant + Hyundai Ioniq 6 First Edition + Zaptec laadpaal
Dank voor de tip. Ga ik eens goed bekijken.
1 sensor.entso_e_dynamische_prijzen_average_electricity_price: voor teruglevering
2 sensor.template_entso_e_dynamische_prijzen_average_electricity_price_inkoop: voor consumed
1 is zonder BTW en energiebelasting etc. (voor na 31-12-2026)
Hoe doen jullie dit? Wat moet ik in de json invullen?
[ Voor 12% gewijzigd door ZatarraNL op 13-01-2026 19:45 ]
Je moet zelf een array aanbieden met de prijzen van de aankomende timeperiods, meestal uren.
In de load_cost_forecast staat een lijstje met prijzen per uur, vanaf 3 PM, dus eerst wat dure uren, dan de nacht, en dan weer de ochtend/middag.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
| domain: shell_command service: emhass_dayahead_optim service_data: payload: >- {"entity_save": true, "publish_prefix": "dh_", "battery_maximum_state_of_charge": 1, "battery_minimum_state_of_charge": 0.02, "battery_target_state_of_charge": 0.0, "battery_discharge_power_max": 600, "battery_charge_power_max": 800.0, "weather_forecast_cache": false, "pv_power_forecast": [73, 51, 26, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 47, 85, 144, 213, 247, 245, 219, 196, 173, 143, 109], "load_cost_forecast": [0.26322, 0.26322, 0.26322, 0.26322, 0.26322, 0.26322, 0.26322, 0.26322, 0.26322, 0.26322, 0.26322, 0.26322, 0.26322, 0.26322, 0.26322, 0.26322, 0.26322, 0.25112, 0.25112, 0.25112, 0.25112, 0.25112, 0.25112, 0.25112, 0.25112, 0.25112, 0.25112, 0.25112, 0.25112, 0.25112, 0.25112, 0.25112, 0.25112, 0.26322, 0.26322, 0.26322, 0.26322, 0.26322, 0.26322, 0.26322, 0.26322, 0.26322, 0.26322, 0.26322, 0.26322, 0.26322, 0.26322, 0.26322] } |
[ Voor 3% gewijzigd door RudolfR op 13-01-2026 19:59 ]
Deze automation gebaseerd op Nordpool prijs voor een dynamische NL-leverancier zoals Frank/Tibber (incl.BTW en energiebelasting) gebruik ik voor het draaien van een MPC elke tien minuten (nog wel in een testopstelling). Met name het stuk voor de load_cost_forecast is relevant:ZatarraNL schreef op dinsdag 13 januari 2026 @ 19:41:
Ik ben druk bezig met EMHASS. Veel dingen zijn al gelukt. Het lukt me alleen niet om variabele prijzen in het model te krijgen. Hij houdt alleen vaste bedragen aan, eventueel met dal- en piektijden. Ik gebruik hiervoor deze sensoren met state-attributes:
1 sensor.entso_e_dynamische_prijzen_average_electricity_price: voor teruglevering
2 sensor.template_entso_e_dynamische_prijzen_average_electricity_price_inkoop: voor consumed
1 is zonder BTW en energiebelasting etc. (voor na 31-12-2026)
Hoe doen jullie dit? Wat moet ik in de json invullen?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
| alias: >-
EMHASS: MPC optimalisatie op basis van Nord Pool dynamische tarieven (15-min
direct)
description: >
Voert elke 10 minuten een MPC-optimalisatie uit (15-min prijzen worden direct
gebruikt). Gebruikt PV- en load-voorspellingen met 15-min resolutie. Zowel
afname als teruglevering gebruiken dezelfde prijsreeks (pas aan als je andere
tarieven hebt).
triggers:
- trigger: time_pattern
minutes: /10
actions:
- action: shell_command.emhass_naive_mpc
data:
payload: |
{
"prediction_horizon": {{ prediction_horizon }},
"prod_price_forecast": {{ prod_price_forecast }},
"soc_init": {{ soc_init }},
"num_def_loads": {{ num_def_loads }},
"def_total_hours": {{ def_total_hours }},
"pv_power_forecast": {{ pv_p_fc }},
"load_power_forecast": {{ load_p_fc }},
"load_cost_forecast": {{ load_cost_forecast }},
"min_soc": {{ states('input_number.min_soc') | float }},
"max_soc": {{ states('input_number.max_soc') | float }},
"target_soc": {{ states('input_number.target_soc') | float }},
"max_charging_power": {{ states('input_number.max_charge_power') | float }},
"max_discharging_power": {{ states('input_number.max_discharge_power') | float }},
"set_battery_dynamic": {{ 1 if is_state('input_boolean.dynamic_battery_profile', 'on') else 0 }}
}
- delay:
seconds: 5
- action: script.emhass_rolling_forecast_en_publish
data: {}
mode: single
variables:
prediction_horizon: |
{% set horizon_hours = 12 %} {{ (horizon_hours * 60 // 15) | int }}
soc_max: 0.95
soc_init: >
{% set soc_val = (states('input_number.dummy_soc') | float(90)) / 100 %} {{
soc_max if soc_val > soc_max else soc_val }}
load_cost_forecast: >
{% set steps = prediction_horizon %} {% set raw_today =
state_attr('sensor.nordpool_kwh_nl_eur_6_095_021', 'raw_today') or [] %} {%
set raw_tomorrow = state_attr('sensor.nordpool_kwh_nl_eur_6_095_021',
'raw_tomorrow') or [] %} {% set all_slots = (raw_today + raw_tomorrow) %} {%
set now_ts = now() %} {% set start_idx = 0 %} {% for i in
range(all_slots|length) %}
{% set slot = all_slots[i] %}
{% if as_datetime(slot.start) >= now_ts %}
{% set start_idx = i %}
{% break %}
{% endif %}
{% endfor %} {% set tail = all_slots[start_idx:] %} {% set values = tail |
map(attribute='value') | list %} {% if values | length < steps %}
{% set values = values + ([values[-1] if values|length>0 else 0.0] * (steps - values|length)) %}
{% else %}
{% set values = values[:steps] %}
{% endif %} {{ values | tojson }}
prod_price_forecast: "{{ load_cost_forecast }}"
load_p_fc: >
{% set steps = prediction_horizon %} {% set p_load_fc =
(state_attr('sensor.p_load_forecast', 'forecasts') or [])
| map(attribute='p_load_forecast')
| map('float', default=0.0)
| list %}
{% set p_load_now = [states('sensor.power_load_no_var_loads') | float(0)] %}
{% set combined = (p_load_now + p_load_fc)[:steps] %} {% if combined |
length < steps %}
{% set combined = combined + ([0.0] * (steps - combined | length)) %}
{% endif %} {{ combined | tojson }}
pv_p_fc: >
{% set steps = prediction_horizon %} {% set today =
(state_attr('sensor.energy_production_today_2', 'watts') or {})
| dictsort
| selectattr('0', '>=', now().replace(second=0, microsecond=0).isoformat())
| map(attribute='1')
| map('float', default=0.0)
| list %}
{% set tomorrow = (state_attr('sensor.energy_production_tomorrow_2',
'watts') or {})
| dictsort
| map(attribute='1')
| map('float', default=0.0)
| list %}
{% set all_future = today + tomorrow %} {% set sampled = all_future[:steps]
%} {% if sampled | length < steps %}
{% set sampled = sampled + ([0.0] * (steps - sampled | length)) %}
{% endif %} {{ sampled | tojson }}
num_def_loads: 1
def_total_hours:
- 2 |
Beetje late reactie maar heb je in de configuratie bij Tariff ook de Load cost method op csv gezet? Daar staat hij bij mij op, en ik stuur dan ook een list mee zoals anderen aangeven.ZatarraNL schreef op dinsdag 13 januari 2026 @ 19:41:
Ik ben druk bezig met EMHASS. Veel dingen zijn al gelukt. Het lukt me alleen niet om variabele prijzen in het model te krijgen. Hij houdt alleen vaste bedragen aan, eventueel met dal- en piektijden. Ik gebruik hiervoor deze sensoren met state-attributes:
1 sensor.entso_e_dynamische_prijzen_average_electricity_price: voor teruglevering
2 sensor.template_entso_e_dynamische_prijzen_average_electricity_price_inkoop: voor consumed
1 is zonder BTW en energiebelasting etc. (voor na 31-12-2026)
Hoe doen jullie dit? Wat moet ik in de json invullen?
Ik loop er tegenaan dat ik de aansturing van de warmtepomp vanuit EMHASS op sommige momenten volstrekt onlogisch vind. Een warmtepomp doet het liefst lange runs ipv meerdere kortere runs, en dat krijg ik met geen mogelijkheid in EMHASS. Gisteravond kreeg ik een schema waarbij de warmtepomp in 3 uur tijd maar liefst 6 keer een kwartiertje aan zou moeten gaan. Vanochtend gaat het wat beter, maar EMHASS gooit er nog steeds random kwartiertjes tussen waarop de warmtepomp aan zou moeten springen.
Dit is bijvoorbeeld het schema voor vanochtend:
/f/image/VL9GYLbYP4O3ci7JJYBkgmwN.png?f=fotoalbum_large)
In de bovenste grafiek is de lichtblauwe lijn bij 1000W mijn warmtepomp. Er zitten 2 spikes, eentje om 17:00 en eentje om 18:45. Die wil ik dus weg hebben.
Ik heb geprobeerd om de set_deferrable_startup_penalty op een hoog getal te zetten. Dat lijkt die te negeren. Ook set_deferrable_load_single_constant op true lijkt niks te doen.
Ik heb ook geprobeerd om nominal_power_of_deferrable_loads te verlagen (van 2500W naar 1000W). Dat lijkt nog het meeste effect te hebben, maar het gaat niet helemaal weg. Daarnaast kan mijn warmtepomp meer verbruiken dan die 1000W, en dat wordt dan niet goed meegenomen in EMHASS.
Heeft iemand dit al goed werkend? Zo ja, zou je je config en parameters willen delen?
Ter info, hier mijn config (de 4e deferrable load is de warmtepomp):
En de parameters die ik naar EMHASS stuur:JSON:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 { "adjusted_pv_model_max_age": 24, "adjusted_pv_regression_model": "LassoRegression", "adjusted_pv_solar_elevation_threshold": 10, "battery_charge_efficiency": 0.9, "battery_charge_power_max": 1201, "battery_discharge_efficiency": 0.89, "battery_discharge_power_max": 899, "battery_dynamic_max": 0.9, "battery_dynamic_min": -0.9, "battery_maximum_state_of_charge": 1, "battery_minimum_state_of_charge": 0.2, "battery_nominal_energy_capacity": 3840, "battery_stress_cost": 0, "battery_stress_segments": 10, "battery_target_state_of_charge": 0.5, "compute_curtailment": true, "continual_publish": false, "costfun": "profit", "delta_forecast_daily": 2, "end_timesteps_of_each_deferrable_load": [ 0, 0, 0, 0 ], "historic_days_to_retrieve": 2, "influxdb_database": "homeassistant", "influxdb_host": "localhost", "influxdb_measurement": "W", "influxdb_port": 8086, "influxdb_retention_policy": "autogen", "influxdb_use_ssl": false, "influxdb_verify_ssl": false, "inverter_ac_input_max": 1200, "inverter_ac_output_max": 800, "inverter_efficiency_ac_dc": 1, "inverter_efficiency_dc_ac": 1, "inverter_is_hybrid": false, "inverter_stress_cost": 0, "inverter_stress_segments": 10, "load_cost_forecast_method": "hp_hc_periods", "load_forecast_method": "naive", "load_negative": false, "load_offpeak_hours_cost": 0.1419, "load_peak_hour_periods": { "period_hp_1": [ { "start": "02:54" }, { "end": "15:24" } ], "period_hp_2": [ { "start": "17:24" }, { "end": "20:24" } ] }, "load_peak_hours_cost": 0.1907, "logging_level": "DEBUG", "lp_solver_timeout": 45, "maximum_power_from_grid": 17000, "maximum_power_to_grid": 17000, "method_ts_round": "nearest", "minimum_power_of_deferrable_loads": [ 0, 0, 0, 0, 0 ], "model_type": "load_forecast", "modules_per_string": [ 8 ], "nominal_power_of_deferrable_loads": [ 11000, 7200, 2500, 1000 ], "num_lags": 48, "num_threads": 0, "number_of_deferrable_loads": 4, "open_meteo_cache_max_age": 30, "operating_hours_of_each_deferrable_load": [ 0, 0, 0, 0 ], "optimization_time_step": 15, "perform_backtest": false, "photovoltaic_production_sell_price": 0.1419, "production_price_forecast_method": "constant", "pv_inverter_model": [ "GoodWe_Technologies_Co___Ltd___GW5000A_MS__240V_" ], "pv_module_model": [ "JA_Solar_JAM72S01_375_PR" ], "sensor_linear_interp": [ "sensor.power_load_no_var_loads_filter" ], "sensor_power_load_no_var_loads": "sensor.power_load_no_var_loads_filter", "sensor_power_photovoltaics": "sensor.pv_power", "sensor_power_photovoltaics_forecast": "sensor.p_pv_forecast", "sensor_replace_zero": [ "sensor.pv_power" ], "set_battery_dynamic": false, "set_deferrable_load_single_constant": [ false, false, true, false ], "set_deferrable_startup_penalty": [ 0, 0, 1, 4 ], "set_nocharge_from_grid": false, "set_nodischarge_to_grid": false, "set_total_pv_sell": false, "set_use_adjusted_pv": false, "set_use_battery": true, "set_use_pv": true, "set_zero_min": true, "sklearn_model": "KNeighborsRegressor", "split_date_delta": "48h", "ssl_no_verify": false, "start_timesteps_of_each_deferrable_load": [ 0, 0, 0, 0 ], "strings_per_inverter": [ 2 ], "surface_azimuth": [ 169 ], "surface_tilt": [ 40 ], "treat_deferrable_load_as_semi_cont": [ false, false, false, false ], "use_influxdb": false, "use_websocket": true, "var_model": "sensor.power_load_no_var_loads", "weather_forecast_method": "open-meteo", "weight_battery_charge": 0, "weight_battery_discharge": 0.05 }
YAML:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 rest_command: emhass_npc_optim_with_pv_15m_with_def_heat_pump: url: http://localhost:5000/action/naive-mpc-optim method: post timeout: 300 payload: > {% set horizon = min(144, state_attr('sensor.entsoe_prices_forecast_30', 'prices_36h_15min') | length | int) %} {% set charging_on_or_planned = is_state('switch.ev_smart_charging_ev_connected', 'on') and (is_state('sensor.ev_smart_charging_charging', 'on') or is_state_attr('sensor.ev_smart_charging_charging', 'charging_is_planned', true)) %} {% set charging_load = (state_attr('sensor.ev_smart_charging_charging', 'charging_number_of_hours') | float(0) / 0.25) | int if charging_on_or_planned else 0 %} {% set charging_on_or_planned_2 = is_state('switch.ev_smart_charging_ev_connected_2', 'on') and (is_state('sensor.ev_smart_charging_charging_2', 'on') or is_state_attr('sensor.ev_smart_charging_charging_2', 'charging_is_planned', true)) %} {% set charging_load_2 = (state_attr('sensor.ev_smart_charging_charging_2', 'charging_number_of_hours') | float(0) / 0.25) | int if charging_on_or_planned_2 else 0 %} {% set dhw_load = 6 if is_state('binary_sensor.mitsubishi_next_dhw_run_is_legionella_run', 'on') else 2 if states('sensor.mitsubishi_tank_water_temperature') | float(0) - states('input_number.dhw_temperature_setpoint') | float(0) < -2 else 0 %} {% set heat_pump_load = 8 if is_state('sensor.mitsubishi_operating_mode', 'Heating') or is_state('sensor.mitsubishi_operating_mode', 'Cooling') else 0 %} {% set heat_pump_flow_temp = states('number.mitsubishi_h_c_thermostat_target_temperature') | float(25) %} { "load_cost_forecast": {{ state_attr('sensor.entsoe_prices_forecast_30', 'prices_36h_15min') | tojson }}, "prod_price_forecast": {{ state_attr('sensor.entsoe_prices_forecast_30', 'prices_36h_15min_return') | tojson }}, {% if state_attr('sensor.solcast_forecast_data', 'forecasts') != [] %}"pv_power_forecast": {{ state_attr('sensor.solcast_24hrs_forecast_15m', 'forecasts')[:horizon] | tojson }},{% endif %} "prediction_horizon": {{ horizon | tojson }}, "soc_init": {{ (states('sensor.hyper_2000_electric_level') | float(0) / 100) | round(2) | tojson }}, "soc_final": {{ 0.4 if is_state('sensor.season', ['autumn', 'winter']) else 0.6 }}, "operating_timesteps_of_each_deferrable_load": {{ [ charging_load, charging_load_2, dhw_load, heat_pump_load ] | tojson }}, "def_load_config": [ {}, {}, {}, { "thermal_battery": { "supply_temperature": {{ heat_pump_flow_temp | tojson }}, "volume": 22.0, "start_temperature": 21.5, "min_temperatures": {{ [21.0] * horizon }}, "max_temperatures": {{ [26.0] * horizon }}, "carnot_efficiency": 0.44, "u_value": 0.33, "envelope_area": 258.8, "ventilation_rate": 0.5, "heated_volume": 380.7, "window_area": 22.8, "shgc": 0.5, "internal_gains_factor": 0 } } ], "outdoor_temperature_forecast": {{ [-4.0] * horizon }} }
Was het eind-resultaat wel Optimal? Als EMHASS Infeasible als eindresultaat heeft wordt e.e.a. meestal troep.Sicco92 schreef op zaterdag 24 januari 2026 @ 11:11:
Ik ben bezig om mijn warmtebehoefte in EMHASS te krijgen, zodat EMHASS slim mijn warmtepomp aan kan sturen. Ik volg hiervoor de instructies op https://emhass.readthedocs.io/en/latest/thermal_battery.html, en ik heb volgens mij parameters gevonden/berekend die mijn huis aardig representeren.
Verder ook veel kennis op de Engelse forums:
https://community.home-as...ement-for-home-assistant/
Speciek over het thermal model:
https://github.com/davidusb-geek/emhass/discussions/340
Beide worden regelmatig door de ontwikkelaars bezocht en vragen beantwoord.
Ja, dat was wel Optimal bij die pogingen inderdaad. Daar ligt het dus niet aan.MarcoPolet schreef op zondag 25 januari 2026 @ 20:28:
[...]
Was het eind-resultaat wel Optimal? Als EMHASS Infeasible als eindresultaat heeft wordt e.e.a. meestal troep.
Verder ook veel kennis op de Engelse forums:
https://community.home-as...ement-for-home-assistant/
Speciek over het thermal model:
https://github.com/davidusb-geek/emhass/discussions/340
Beide worden regelmatig door de ontwikkelaars bezocht en vragen beantwoord.
Mijn gok is dat de startup_penalty simpelweg genegeerd wordt bij het gebruik van het thermal_model. Zojuist heb ik het nog eens getest, en ik krijg nu dit:
/f/image/jw0Ol8qyyuVck9AALd96UgXU.png?f=fotoalbum_large)
Tussen 2:30 en 5:30 zou de warmtepomp aan moeten staan, wat voor vannacht inderdaad een mooi schema is. Helaas staat er weer een stom kwartiertje tussen waarop de warmtepomp uit zou moeten staan, van 3:30-3:45. Dat is het duurste kwartier in de reeks, maar het verschil met het een-na-duurste kwartier is 0,001 euro. Een startup penalty zou daar gewoon 1 run van maken, maar die optie lijkt genegeerd te worden.
Die links had ik al gevonden, maar er lijkt nog weinig met de thermal_battery optie gespeeld te worden. Ik zal eens op het HA forum posten. Thanks!
Ik heb zelf zonnepanelen en 3 Sessy batterijen, nog geen deferrable loads (EV dit jaar). EMHASS ziet de 3 batterijen als 1 batterij en ik heb dus nog een template sensor gecreeerd waar ik de strategie opladen/ontladen bepaal. Zodat per batterij min/max soc en max laden/ontladen niet overschreden wordt. Ook heb ik een prioriteit voor de batterijen (welke eerst, tweede en als laatste) ingebouwd zodat de batterij die het minst geladen/ontladen (charged_energy) heeft altijd als eerste wordt gebruikt, bij een vermogen >1200W springt de tweede bij (vermogen gelijk verdeeld) en bij >1800W wordt het vermogen verdeeld over alle drie. Mocht tijdens het laden of ontladen een batterij zijn min/max soc overschrijden wordt het setpoint op 0W gezet en het vermogen gelijk verdeeld over de overgebleven batterijen maar nooit hoger dan de opgegeven max laad/ontlaad limieten.
Automatisering is redelijk eenvoudig aangezien ik geen deferrables heb en kijkt naar zowel p_batt als p_grid_forecast voor aansturing, als zowel p_batt en p_grid_forecast een waarde hebben dan gebruik ik p_batt als setpoint voor mijn batterijen, als p_batt een waarde heeft maar p_grid_forecast is 0 dan draai ik nul op de meter.
Het enige waar ik nog mee struggle is de alpha en beta voor MPC. Ik geef ze mee in de mpc call maar weet niet zo goed welke waarde ik ze mee moet geven. Nu alpha=0.25 en beta=0.75.
Nu wil ik de setup een tijdje monitoren en kijken of alles werkt zoals ik in mijn hoofd had . Volgende stap wordt de forecast module, eerst load power en dan pv power forecast.
Goed bezig!! Paar overdenkingen:VentingBow5 schreef op zaterdag 21 februari 2026 @ 14:18:
en de prijzen vanuit Nordpool. Om b.v. 00:00 zijn de prijzen voor na 13:00 nog niet bekend, de laatste bekende waarde wordt dan als fixed waarde meegenomen voor de rest van de lijst, zodra ze beschikbaar zijn worden ze vervangen door de correcte.
Het enige waar ik nog mee struggle is de alpha en beta voor MPC. Ik geef ze mee in de mpc call maar weet niet zo goed welke waarde ik ze mee moet geven. Nu alpha=0.25 en beta=0.75.
Nu wil ik de setup een tijdje monitoren en kijken of alles werkt zoals ik in mijn hoofd had . Volgende stap wordt de forecast module, eerst load power en dan pv power forecast.
Alpha/beta: gebruik tot nu toe niet, defaults zijn 0,5/0,5 en dat lijkt bij mij in elk geval behoorlijk goed te zijn
Qua prijzen; ik draai zelf de day-ahead met als trigger de 'tomorrow_valid' naar true van de nordpool integratie. Dan zit je er vlot bij. Verder vul ik altijd tot 48 uur vooruit aan vanuit de EpexPredictor integratie:
https://github.com/b3nn0/EpexPredictor/tree/main
Die geeft in basis ook de NL nordpool/epex prijzen terug, maar extrapoleert die op basis van weers/wind voorspelling, dagen in de week, etc. Kun je lokaal in een Docker draaien
ValueError: Mixed timezones detected. Pass utc=True in to_datetime or tz='UTC' in DatetimeIndex to convert to a common timezone.
Lost zich morgen (komende nacht 3:00) waarschijnlijk vanzelf wel op, maar zou wel prettig zijn als e.e.a. gewoon doorwerkt. Er is al wel een Issue van gemeld bij EMHASS github, maar daar geen oplossingen voor zover ik zie.
Heb mijn Docker TZ al even van Europe/Amsterdam naar UTC gezet, maar dat helpt niet. Mocht je dat ook willen doen, lijkt alleen te werken in combinatie met schakelen tussen 2 versie-nummers (bv. 0.16.2 -> 0.17.1, en dan eventueel weer terug).
[ Voor 25% gewijzigd door MarcoPolet op 28-03-2026 07:58 ]
1
2
3
4
5
6
7
8
9
| solar:
current_power: sensor.sigen_plant_pv_power
forecasts:
- sensor.solcast_pv_forecast_forecast_today
- sensor.solcast_pv_forecast_forecast_tomorrow
- sensor.solcast_pv_forecast_forecast_day_3
amber:
general: sensor.zonneplan_current_electricity_tariff
feed_in: sensor.zonneplan_current_electricity_tariff |
Ik draai ieder kwartier een MPC en de dayahead dagelijks om 3.30 uur. Aangezien de MPC minstens 5 periodes nodig heeft, stopt deze automatisch om 1.00 uur. Die periode is het energieverbruik toch aardig stabiel (en laag).
Echter is de tijd daarna soms te kort om de batterij te gebruiken, zeker als de zon vroeg schijnt.
Stelregel bij de DA is dat soc_begin = soc_final, en ik heb geprobeerd om soc_final aan te passen aan de hoeveelheid zon (meer zon verwacht => lagere soc om 3.30), maar dat is ook gekunsteld?
Tips?
Ik optimaliseer op kosten, maar als ik jouw verhaal lees, dan wil jij maximale zelf consumptie, misschien dat je die setting nog niet gekozen hebt in de configuratie? Profit --> self consumptionRudolfR schreef op donderdag 16 april 2026 @ 13:22:
Hoe zorgen jullie ervoor dat de batterij zo goed als leeg is aan het begin van een zonnige dag?
Tips?
- Standaard (PV overschot laden): gebruikt auto modus omvormer, dus 0 op de meter.
- Lage inkoopprijs (Geforceerd laden van het net): bovenop PV opbrengst bijladen, charge_battery modus op omvormer
- Hoog verbruik / hoge verkoopprijs (Geforceerd ontladen): Batterij ontladen met door EMHASS opgegeven vermogen, discharge_battery op omvormer
- Battery lock (Batterij op 0, evt PV overschot op net 'dumpen', of netto import zonder batterij bij te schakelen): Discharge modus, maar max battery discharge gelijk aan huidige SOC.
Ter info, hier nog de YAML voor de automatisering:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
| alias: EMHASS Slimme Batterijsturing description: "EMHASS Slimme Batterijsturing" triggers: - entity_id: sensor.p_batt_forecast trigger: state actions: - variables: p_batt_raw: "{{ states('sensor.p_batt_forecast') | float(0) }}" p_grid: "{{ states('sensor.p_grid_forecast') | float(0) }}" p_batt: "{{ [ [p_batt_raw, 10000] | min, -10000 ] | max }}" charge_pct: "{{ ((p_batt | abs / 15000) * 100) | round(0) }}" current_soc: "{{ states('sensor.goodwe_battery_state_of_charge') | float(0) }}" - choose: # SCENARIO 1: PV overschot laden (p_batt < -100 & p_grid <= 0) - conditions: - condition: template value_template: "{{ p_batt < -100 and p_grid <= 0 }}" sequence: - action: select.select_option target: entity_id: select.goodwe_ems_mode data: option: auto - action: switch.turn_off target: entity_id: switch.goodwe_fast_charging_switch # SCENARIO 2: Geforceerd laden van net (p_batt < -100 & p_grid > 0) - conditions: - condition: template value_template: "{{ p_batt < -100 and p_grid > 0 }}" sequence: - action: select.select_option target: entity_id: select.goodwe_ems_mode data: option: charge_battery - action: number.set_value target: entity_id: number.goodwe_fast_charging_power data: value: "{{ charge_pct }}" - action: switch.turn_on target: entity_id: switch.goodwe_fast_charging_switch # SCENARIO 3: Ontladen (p_batt > 100) # Dekt zowel huisverbruik als export - conditions: - condition: template value_template: "{{ p_batt > 100 }}" sequence: - action: switch.turn_off target: entity_id: switch.goodwe_fast_charging_switch - action: select.select_option target: entity_id: select.goodwe_ems_mode data: option: discharge_battery - action: number.set_value target: entity_id: number.goodwe_ems_power_limit data: value: "{{ p_batt | abs | round(0) }}" - action: number.set_value target: entity_id: number.goodwe_depth_of_discharge_on_grid data: value: 90 # SCENARIO 4: Battery-lock (p_batt rond 0) # Dwingt PV naar het net als p_grid < 0, of staat gewoon standby. - conditions: - condition: template value_template: "{{ p_batt | abs <= 100 }}" sequence: - action: switch.turn_off target: entity_id: switch.goodwe_fast_charging_switch - action: select.select_option target: entity_id: select.goodwe_ems_mode data: option: discharge_battery - action: number.set_value target: entity_id: number.goodwe_depth_of_discharge_on_grid data: value: "{{ (100 - current_soc) | round(0) }}" mode: restart |
Wil nu graag Day-Ahead Optimazion enzovoort automatisch uitvoeren. Iemand een idee hoe je zoiets in 'leken taal' kan uitleggen?
In configuration.yaml automation: include automations.yaml Uitroepteken weggehaald
In automation.yaml
- alias: EMHASS day-ahead optimization
trigger:
platform: time
at: '13:00:00'
action:
- service: shell_command.dayahead_optim
In dayahead_optim.sh curl -i -H "Content-Type:application/json" -X POST -d '{{payload}}' [url="http://localhost:5000/action/dayahead-optim"]http://localhost:5000/action/dayahead-optim[/url]
Heb de rechten goed staan.
Maar werkt niet. Iemand een idee?
In Settings, Automations, kun je de automations min of meer grafisch bekijken en zie je ook Traces van wat er is gebeurd, dat zou je wellicht info geven wat er mis gaat. Misschien is he took handiger om meteen het curl commando aan te roepen vanuit de automation, en niet via het .sh script.vincent_1971 schreef op donderdag 14 mei 2026 @ 12:39:
Ben pasgeleden begonnen met EMHass.Draai op een raspberry pi 5.0 Home Assistant OS
Wil nu graag Day-Ahead Optimazion enzovoort automatisch uitvoeren. Iemand een idee hoe je zoiets in 'leken taal' kan uitleggen?
In configuration.yaml automation: include automations.yaml Uitroepteken weggehaald
In automation.yaml
- alias: EMHASS day-ahead optimization
trigger:
platform: time
at: '13:00:00'
action:
- service: shell_command.dayahead_optim
In dayahead_optim.sh curl -i -H "Content-Type:application/json" -X POST -d '{{payload}}' [url="http://localhost:5000/action/dayahead-optim"]http://localhost:5000/action/dayahead-optim[/url]
Heb de rechten goed staan.
Maar werkt niet. Iemand een idee?
Bedankt. Weet je hoe je het curl script vanuit automations kan aanroepen? Welk commando?MarcoPolet schreef op donderdag 14 mei 2026 @ 21:02:
[...]
In Settings, Automations, kun je de automations min of meer grafisch bekijken en zie je ook Traces van wat er is gebeurd, dat zou je wellicht info geven wat er mis gaat. Misschien is he took handiger om meteen het curl commando aan te roepen vanuit de automation, en niet via het .sh script.
1
2
3
| shell_command: emhass_dayahead_optim: > curl -i -H "Content-Type:application/json" -X POST -d '{{payload}}' http://localhost:5000/action/dayahead-optim |
1
2
3
4
| - service: shell_command.emhass_dayahead_optim data: payload: > {"entity_save": true, "publish_prefix": "dh_", "battery_maximum_state_of_charge": {{ soc_max }}, "battery_minimum_state_of_charge": {{ soc_min }}, "battery_target_state_of_charge": {{ soc_init }}, "battery_discharge_power_max": {{ pd_max }}, "battery_charge_power_max": {{ pc_max }}, "weather_forecast_cache": false, "pv_power_forecast": {{ pv_p_fc }}, "load_cost_forecast": {{ load_cost_forecast }} } |
Die payload geef ik dus altijd mee in de aanroep van de automations.
Het shell_command is dus direct de aanroep van curl, niet nog apart een los script dat vanaf het filesystem geladen zou moeten worden.
"localhost" is een slecht voorbeeld, dat werkt sinds kort niet meer goed:
https://github.com/davidusb-geek/emhass/issues/833
alternatief is 127.0.0.1 of de slug van je app, of homeassistant?
[ Voor 18% gewijzigd door RudolfR op 14-05-2026 22:42 ]
emhass_dayahead_optim: "curl -i -H \"Content-Type:application/json\" -X POST -d '{}' http://192.168.1.200:5000/action/dayahead-optim" Het zat inderdaad in de 'localhost' .. en ja je kan een breuk zoeken.RudolfR schreef op donderdag 14 mei 2026 @ 21:59:
Ik heb dat zo:YAML:
1 2 3 shell_command: emhass_dayahead_optim: > curl -i -H "Content-Type:application/json" -X POST -d '{{payload}}' http://localhost:5000/action/dayahead-optimYAML:Een aantal shell_command's met de diverse endpoints, allemaal met een payload-parameter.
1 2 3 4 - service: shell_command.emhass_dayahead_optim data: payload: > {"entity_save": true, "publish_prefix": "dh_", "battery_maximum_state_of_charge": {{ soc_max }}, "battery_minimum_state_of_charge": {{ soc_min }}, "battery_target_state_of_charge": {{ soc_init }}, "battery_discharge_power_max": {{ pd_max }}, "battery_charge_power_max": {{ pc_max }}, "weather_forecast_cache": false, "pv_power_forecast": {{ pv_p_fc }}, "load_cost_forecast": {{ load_cost_forecast }} }
Die payload geef ik dus altijd mee in de aanroep van de automations.
Het shell_command is dus direct de aanroep van curl, niet nog apart een los script dat vanaf het filesystem geladen zou moeten worden.
"localhost" is een slecht voorbeeld, dat werkt sinds kort niet meer goed:
https://github.com/davidusb-geek/emhass/issues/833
alternatief is 127.0.0.1 of de slug van je app, of homeassistant?
/f/image/T83aB4abH0Q7XTYHrMaoBzV4.png?f=fotoalbum_large)
:strip_exif()/f/image/yB4rCf0Gef6pbnGnt3DE5ZuV.jpg?f=fotoalbum_large)