You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
This commit was created on GitHub.com and signed with GitHub’s verified signature.
Changed
The mandatory startup-phase timer is no longer named after the heat pump. Whatever starts it,
peak shaving leaves the charge current alone while it runs, and that holds with or without the
heat-pump boost configured, so the timer is the way to keep the battery out of the way of any
large appliance. Field label and help text say that now; the field itself is unchanged, so no
instance needs reassigning.
One battery pack is mandatory, every further one is optional. The three BMS 2 fields (cell
voltage and both cell temperatures) are no longer demanded by the startup check, so a
single-pack site can leave them empty the way the BMS 3 fields already could. With them
empty the blueprint computes with one pack throughout: capacity, temperature limit and
cell balancing all read pack 1 alone. The worked example behind the charge rates now says
which number is the pack count, which only read as obvious while two packs were assumed.
The help text of the state-of-charge field read as if the shadow-BMS field below it had to be
filled in too. Both descriptions now say plainly that the second sensor is optional: left empty,
the inverter's own reading alone drives the whole cascade, and only a filled-in shadow field
brings both values into the conversion of the discharge-floor registers.
Removed
The escalation ceiling on the state of charge is gone as an input. No branch ever read the
field, while the escalation itself stops at a fixed 97 % that sits in its own entry condition —
so the field could only ever have lowered a ceiling that already held, and it never did. The
fixed limit stays; what goes is the field that made it look adjustable per site. An instance
that still assigns the key is unaffected, the blueprint simply ignores it, and from this release
the configuration block of the diagnostic recording carries one key fewer than older lines.
Fixed
The helper template no longer gives the half-hourly meters a cycle of their own. The blueprint
zeroes them every thirty minutes anyway, and a daily cycle put the meter's own reset on the
same second as the run that reads the last slot before midnight, which the run loses because
it queues behind the five-minute run. That slot then learned a zero and the running mean
pulled it down further every night. A site that already copied the template has to drop the cycle: line from each half-hourly meter it actually runs — house consumption, each wallbox,
the backup circuit; the counters evaluated per period keep theirs. Re-importing the blueprint
does not touch its package.
The helper template no longer pins the charge mode to normal at startup. The mode is
memory, not decoration: the morning blockade holds through the end of its window only by
recognising itself, and the top-up branch leaves case B alone for the same reason. With initial: set, Home Assistant skips restoring the value, so every restart quietly dropped
that memory. Without it a freshly created helper still starts on the first option. Here too a
site that already copied the template has to delete the initial: line itself.
The helper template gives every timer restore: true. Without it a timer that was running when
Home Assistant restarts comes back idle, and the branch it guards then reads a state that no
longer exists: the cell-balancing cooldown, the peak-shaving hold, the startup phase and the
boost runtime each end silently mid-run. A site that already copied the template has to add the
four lines itself.
The help text of the startup-phase timer and of its duration field said the battery drops to
0 A while the timer runs. It does not: that branch holds the charge current at the value it
last had and leaves lowering to the branches that own it, which the branch comment has said
all along. The same wrong picture had been carried from one wording to the next.
The logbook line for an interrupted peak-shaving hold named the heat pump as the reason. The
condition it reports only tests that the startup-phase timer runs, and anything may have
started it, so the line now names the timer instead of guessing the appliance.
A pack is now assigned as a whole or not at all: as soon as one of a pack's three sensors is
set, the startup check demands the other two and names the missing one. A half-assigned pack
used to compute silently wrong numbers — a missing highest cell temperature was read as 99 °C
and throttled the charge current to zero, a missing lowest one left the pack out of the
capacity, and a missing cell voltage left it unwatched during cell balancing.
The lowest cell temperature of pack 1 is a mandatory field now. Left empty, no pack counted
as reachable and the whole system ran on the emergency charge current for good, reporting
the BMS as offline — a state that is indistinguishable from a real outage in the logbook,
while the cause was an unassigned field the startup check could have named.
The second-opinion request to the optimizer now describes the battery the inverter actually
enforces. Its minimum state of charge is the ToU register in force instead of the general
minimum, so the schedules it returns can be compared with the blueprint's own plan; a request
built on a floor the inverter does not release yields schedules that could never have been
run. The floor is capped at the current state of charge, because a floor above the starting
point leaves no feasible schedule at all. Charge and discharge efficiency now come from the
same constants the blueprint's own planning uses, so both sides of the comparison assume the
same battery. Diagnosis only; no register is written on that run. In the recording, s_min_pct
of the request now reports the floor that was actually sent instead of the general minimum, so
those lines cannot be compared across this release.
The run that learns the consumption profiles now converts the discharge floor into the same
scale as the rest of the blueprint. It keeps its own copies of the hold detection because the
variable chain does not run there, and those copies compared the raw register against a minimum
that is meant in the second BMS's scale. Where the two scales differ, a floor one step above the
minimum counted as "not holding", so the night side of the loss accounting stayed silently at
zero, and the cap on the accumulated night import came out short by the offset. Without a second
sensor the offset is zero and nothing changes. The slot line of the recording now carries the
offset itself, and its floor and held-back energy are in the same scale as the run line, where
they previously were not despite the same names.