[APP][Pro] Ultimate EMS - Intelligent energy management for solar, battery, EV and heat pump

Hoi Danny,

Probeer even een restart van de app, de instellingen lijken niet goed te zijn doorgekomen. waarschijnlijk halverwege de eerste stappen de popup gesloten?

Ik ga dit in een volgende update even fixen, maar voor nu dus even je instellingen nalopen, opslaan en de app restarten.

Hoi Menno,

Dat werkte inderdaad dankjewel. Tijdens het instellen moest ik even ergens anders wat opzoeken en toen was de pop up weg volgens mij. Nu werkt het en komen er in elk geval gegevens in de app. Alleen klopt nog niet alles. De auto staat niet als aangekoppeld in de app, maar dat is die wel al heeft tibber wel de controle en heeft die hem net volgeladen. Deze moet ik misschien weer op easee zetten zodat de ems hem kan aansturen?
Verder gaat het niet helemaal goed met de hoeveelheid opgewekte zonne-energie. Op dit moment wek ik 2,35 kw op. Alleen denkt de app dat ik er 7,1 kw opwek.

Ik heb de omvormer geselecteerd voor de zonne-energie, omdat het de enige optie is die ertussen staat die dat kan doen. Moet ik nog iets anders instellen of aanpassen, zodat hij wel de juiste data uitleest.

Verder zie ik alleen totaal verbruik en geen belasting per fase. De thuisaccu geeft die wel aan dat hij vol zit.

Kan je mij verder helpen ik hoe ik alles goed krijg?

Hoi Danny,

Heb je 3 fase in huis? Als ik even snel reken dan is 3x 2,3 ongeveer 7,1… dus ik denk dat die 2,3 op 1 fase wordt opgewekt? In dat geval moet je even aangeven op welke fase dit wordt opgewekt.

Hoe je het goed krijgt is als volgt, je kijkt op een zonnige dag, in het verleden op welk uur je de Max opbrengst hebt. Dit uur vul je in bij de instellingen. Vervolgens kijk je wat je op de beste dag per fase aan opwek hebt. Dan kan gelijk zijn, bij mij is dat niet zo omdat ik 3 inverters heb. Deze max opwek vul je in per fase. Je kan ook auto selecteren maar dan moet de inverter wel per fase de opwek doorgeven en niet alleen het totaal.

Belasting per fase wordt uitgelezen via je p1 meter, is verder niet interessant bij terugleveren en of import, daar is alleen het gemiddelde totaal per kwartier belangrijk. De loadbalancer zorgt ervoor dat je niet te veel trekt per fase.

New test version can be found here:

Hoi @Menno_De_Braak ik ben aan het prutsen met jouw app, maar ik kom er nog niet uit. Ik heb een Amina S laadpaal die prima van 1 naar 3 fasen kan schakelen en visa versa en van 6A - 20A. Maar hoe je de app nu met of zonder flows moet instellen om de WP op het juiste moment warm tapwater te laten maken, de auto dan te laten afschalen naar 1f 6A? In de app staat die bij mij op 3f en dus blijft de auto vrolijk laden met 3x6A i.p.v. 1x6A als ik maximaal op eigen PV wil laden.

Dag Brian,

Ik kom binnenkort nog even met een udpate en kan dan je Anima laadpaal er even opnemen. dat is dat deel opgelost. Ik dan even de bug report nodig, daar staan alle capabilities in die ik nodig heb.

wat betreft warmtepomp, op dit moment kan je alleen je setpoint instellen, maar ook hiervoor geldt, als je mij je bug report kan sturen dan pak ik die even mee.

Version 2.0.0 out now for testing!

Ultimate EMS — Setup Guide (v2.0.0)

This walks through every settings section in the order it appears on the app’s settings page. Skip any section for equipment you don’t have (battery, EV, heat pump, dump load are all optional).

1. Grid & Connection

P1 meter: pick the device that measures grid import/export (e.g. a HomeWizard P1 or DSMR reader). This is the single source of truth the EMS balances everything against.

Connection: set the number of phases (1 or 3) and your main fuse capacity in amps. If you have EV load balancing needs, enable Phase load balancing and set a threshold (e.g. 80% of max capacity) — it automatically throttles EV charging current if a phase gets close to overloaded, then waits a configurable delay before trying again.

Energy contract: choose Fixed or Dynamic (15-minute prices). On Fixed, just fill in your import/export price. On Dynamic:

  • Price source is now device-only — as of 2.0.0, Elecz has been removed as an option (its Dutch price data turned out to be structurally flat/incorrect). Pick a Power by the Hour or Tibber device instead.

  • To get the full 24-hour price curve (not just PBTH’s sparse “cheapest/most expensive hour” anchors), install the Power by the Hour app and build two Flows:

    • PBTH “New prices received” (period: this day) → Ultimate EMS “Import full price data from PBTH” (period: this day)
    • PBTH “New prices received” (period: tomorrow) → Ultimate EMS “Import full price data from PBTH” (period: tomorrow)

    Without these two Flows, the EMS still works but only sees PBTH’s day low/high plus the next few hours — planning is noticeably better with the full curve feeding in.

  • Tibber users: just select your Tibber Home device, no Flow needed (it already exposes full hourly prices as a capability).

Zero export: closes the loop on your P1 meter so solar surplus doesn’t get exported — each 15-minute billing block, the EMS calculates how much the battery needs to charge/discharge to net out at zero, and dims inverters as a last resort if the battery is full or absent. Recommended if your contract doesn’t pay for export.

Zero import: independent of Zero export — lets the battery discharge deeper than it normally would to also cover import, but only when today’s remaining solar forecast is expected to refill it. Needs a battery with real capacity; a small battery can drain faster than you’d like with this on.

2. Solar Panels

Add each inverter’s kWh meter (up to 3) and, on a 3-phase install, which phase it’s wired to (or leave it on “Auto” if the meter already reports per-phase). Multiple meters get summed automatically.

Fill in peak power (kWp) — total for 1-phase, per-phase for 3-phase — and a peak hour per phase (13 = south-facing/default, 10 = east, 15 = west; no need to enter panel tilt/azimuth, the app pulls Open-Meteo radiation data for your location).

New in 2.0.0: on a 3-phase install, if one or more phases have no PV meter at all, the EMS now estimates that phase’s live production from its configured peak power + the weather forecast, so it’s no longer invisible to planning. It’s clearly flagged as an estimate in the diagnostic log (+XXXWschat), never silently blended in as if it were a real reading.

Curtailment isn’t a separate toggle — if Zero export is on, inverters get dimmed automatically once the battery is full/absent; if it’s off, dimming never happens.

3. Home Battery

Toggle “I have a home battery”, pick the device, and fill in capacity + max charge/discharge power. If it’s a Zendure battery on local HEMS mode, a separate box appears for the IP address and serial number (enable HEMS mode in the Zendure app first — Add HEMS, then leave it — or the local API won’t respond).

If your battery already runs its own algorithm (e.g. Zonneplan Nexus Powerplay), tick “Battery manages itself” — the EMS then only reads SoC/power and never sends charge/discharge commands.

4. Electric Vehicle

Pick your EV device (Tesla or other) and how many phases it charges on. If you also have a separate smart charger, add it — otherwise (Tesla users especially) the EMS drives the car directly via the Tesla API.

Set battery capacity and your default target SoC, then pick a charge mode:

  • Solar only — pure surplus, never grid.
  • Solar+ — surplus with a 5A/200W minimum floor.
  • Solar + grid — Solar+ plus night charging when a trip is planned.
  • Fixed power — always charges at a set current.
  • Fast charge — max current.
  • Off — EMS doesn’t manage the car.

The solar-ceiling threshold (new-ish, default 80%) governs charging above your normal target toward a higher “solar goal” (set via the EV widget’s charge-goals popup): it only keeps charging past the normal target if the measured charging power is genuinely mostly solar, not just because there’s some PV somewhere in the house.

Set min/max charge current, start/stop hysteresis (avoids flapping on passing clouds), min on/off time (protects the charger from rapid switching), and morning/evening peak-hour blocks — EV charging always stops during these, battery covers the house instead.

For night charging, enable it and tick which weekdays the car is actually home (day and night now — as of this release, “not home” on a given day means genuinely absent, not just “away during the day, back overnight”). The night window itself is derived automatically from your peak-hour settings (evening peak end → morning peak start), nothing to keep in sync manually.

5. Heat Pump(s)

Add up to 4 devices, each with a type (heating heat pump, cooling airco, or DHW boiler) and which grid phase it’s on — the EMS only nudges a device’s setpoint when there’s surplus on its own phase. Boilers are on/off only, no setpoint needed.

Set the base offset applied on surplus, plus a larger “sustained surplus” offset that kicks in once surplus has held continuously for a configurable number of minutes (default 20) — this builds up a bit of extra thermal buffer instead of just tracking instantaneous surplus. Peak hours no longer block or force heat pumps/aircos; they simply follow surplus like any other time.

6. Dump Load

Optional: any on/off device that can usefully absorb leftover surplus (e.g. an immersion heater) once battery, EV, and heat pumps are all already satisfied. Add up to 3 devices — no phase or price logic, just on/off.


Tip for existing users upgrading to 2.0.0: if your price source was previously set to Elecz, it’ll keep working until you touch that setting, but you can no longer re-select it — switch to a Power by the Hour or Tibber device, and set up the two PBTH Flows above if you want the full price curve.

Zendure IP/SN field now visible (test version 2.1.0+)

For users of a Zendure battery (via “Zendure Local”): the IP/SN input field on the settings page was previously hidden due to a change in how Homey handles device data. This has been fixed in the test version.

After installing the test version:

  1. Go to the Ultimate EMS settings page (via the app settings in Homey).
  2. Under “Home battery,” select your Zendure device from the battery dropdown menu (if not already set).
  3. A field for your Zendure battery’s IP address and serial number (SN) will now appear.
  4. Enter the local IP address (found in your router/DHCP list or in the Zendure app under device details) and the serial number (located on the device or in the Zendure app).
  5. Save.

New version available with a lot of improvements!

Hi @Menno_De_Braak ,

Any plans for implementing peak shaving?

Hi Fredrik,

Peak shaving is actually already part of this EMS app. There are several options or flavors that you can choose from but the “zero import” function minimizes net intake (requires a home battery), while the peak blocks are time slots you can define your self to prevent EV’s getting charged or home batteries getting charged to help in net congestion…

There is also a “Zero Export” that will dim your solar to prevent net export.

please note that your energy suppliers only invoices the average total net intake or export per 15 minutes.

Small update with Alfen EV charger Support. Secondly, Ultimate EMS now comes with a web platform where you can view the EMS data and control the settings at https://ultimate-ems.com