Skip to content

Update #194 against main and fix one-phase limit attribution - #226

Open
segran2 wants to merge 9 commits into
srcfl:easee-allocated-limitfrom
segran2:fix/pr194-easee-allocated-limit
Open

segran2 wants to merge 9 commits into
srcfl:easee-allocated-limitfrom
segran2:fix/pr194-easee-allocated-limit

Conversation

@segran2

@segran2 segran2 commented Nov 12, 2026

Copy link
Copy Markdown
Contributor

This PR updates the source branch of #194 with current main and resolves its merge conflicts. It preserves the coarse session energy counter from #214 and regenerates the Easee 1.4.3 catalog metadata.

A one-phase EV can charge on any of the three phases when the active phase is unknown. Require all three usable allocations before attributing a lower pilot to load balancing. With a 15 A request, a 12 A pilot and only one reported allocation of 10 A, the driver still reports the 12 A limit and leaves the cause unset.

Validation

  • Easee tests: 44 passed, 15 skipped.
  • Full make check: 5,092 passed, 951 skipped.
  • The new regression case fails with the previous allocation rule.

The head includes both the current #194 head and the current main tip in its ancestry. Please merge with a merge commit or fast-forward the #194 source branch to the head to preserve that ancestry.

frahlg and others added 9 commits October 28, 2026 11:29
….1) (srcfl#202)

Count a failed read or EMS write only when the device answers with a
Modbus exception. A failed read also counts when another read in the
same poll returned data. Transport errors, reconnect backoff and gateway
or busy exceptions never count. The first poll that reads data after a
poll that read nothing clears the read misses and the EMS write count.

Once forced mode has landed, set_self_consumption always writes the
release and never reports the default as held until the inverter takes
it.

FTW's random site rig (27 October 2026, master 83c2b24c) found both:
13000 dropped after an outage flipped the battery sign (207539, 207534),
and the release was skipped while the inverter held its last forced
command for up to 5 minutes (8 of 10 seeds).

Signed-off-by: Fredrik Ahlgren <fredrik@sourceful-labs.com>
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
…(0.1.2) (srcfl#204)

* test(tesla_wall_connector): idle unit must report 0 W

The vitals of an idle Gen 3 (no car, contactor open, 0 V on every leg,
0.8 A and 0.6 A of sensor offset) give 184 W today: the same number a
field connection test showed. Adds the idle, car-waiting and charging
cases. Fails on 0.1.1.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Signed-off-by: Fredrik Ahlgren <fredrik@sourceful-labs.com>

* fix(tesla_wall_connector): no charge power through an open contactor (0.1.2)

With the contactor open the output legs read 0 V, the leg sum was 0, and
the driver fell back to grid_v × vehicle_current_a. That multiplied the
grid-side voltage by the sensor offset of an idle unit and reported
about 180-290 W to a car that was not there.

Charge power and charging now need a closed contactor and a car on the
cable. A reply without contactor_closed falls back to the EVSE charging
states. Power through a closed contactor is unchanged.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Signed-off-by: Fredrik Ahlgren <fredrik@sourceful-labs.com>

* fix(tesla_wall_connector): contactor field first, grid_v only with no leg voltage

From review. An explicit contactor_closed now goes before
vehicle_connected: the contactor is the physical switch, and a status
flag should not cancel volts and amps measured through it. With that
order, a closed contactor with every leg at 0 V would still have reached
the grid_v fallback, so the fallback now runs only when the reply has no
leg voltage at all. A leg that reads 0 V carries no power, as in Home
Assistant's own calculation.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Signed-off-by: Fredrik Ahlgren <fredrik@sourceful-labs.com>

---------

Signed-off-by: Fredrik Ahlgren <fredrik@sourceful-labs.com>
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
Some Zap gateway firmware serves the local API in data model v2
(srcful-data-models 2.3.0): every meter field gets an "_ac" suffix and
the L1/L2/L3 phase prefix is lowercased (W -> W_ac, L1_V -> l1_V_ac;
Hz is unchanged). emit_meter read the v1 names unconditionally, so a
Zap on v2 firmware gave FTW no meter reading at all.

Add raw_field(), which tries the v1 name, then the _ac suffix, then
the lowercased-prefix _ac variant -- no explicit version branch
needed. Scoped to the meter DER only; pv/battery have the identical
assumption against v2's _ac/_dc split and are left to srcfl#170, since
this site runs read_pv/read_battery both false and I have no v2
hardware with those enabled to verify against.

Fixes (partially) srcfl#170.

Signed-off-by: Marcus Murwall <marcus@murwall.se>
Zap firmware 7.x calls the PV DER solar, sends power and energy on one side,
_ac or _dc, and moves the ratings to /api/devices. read_pv and read_battery
therefore read nothing on 7.x. The driver now reads the 1.x and the v2 names,
and a value v2 sends as null stays unknown.

An AC-side voltage or current is not reported as the battery's own. The
inverter DER is not counted as another resource.

Also removes draft comments and a pinned version from the meter schema test.

Signed-off-by: David Mozart <dmozartandraws@gmail.com>
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
* feat(saj-emanager): add read-only eManager telemetry

The community register sheet does not state sign, word order, or
whether phase voltage and frequency are summed. Control stays off
until a named eManager proves a held zero.

Signed-off-by: Cursor Agent <cursoragent@cursor.com>
Co-authored-by: David Mozart <davmoz@users.noreply.github.com>

* fix(saj-emanager): state site signs on every watt

Generation stays negative. Battery charge is positive and discharge
is negative; the H2 wire is the other way round, so 0x8491 is negated.
Grid import stays positive. Vendor-only words are not DER fields.

Signed-off-by: Cursor Agent <cursoragent@cursor.com>
Co-authored-by: David Mozart <davmoz@users.noreply.github.com>

---------

Signed-off-by: Cursor Agent <cursoragent@cursor.com>
Co-authored-by: Cursor Agent <cursoragent@cursor.com>
Co-authored-by: David Mozart <davmoz@users.noreply.github.com>
NovaCore rejects set_make("SAJ") and does not provide emit_metric.
Device count and the phase divisor are logged once instead.

Signed-off-by: Cursor Agent <cursoragent@cursor.com>
Co-authored-by: Cursor Agent <cursoragent@cursor.com>
Co-authored-by: David Mozart <davmoz@users.noreply.github.com>
…1.3) (srcfl#203)

* fix(growatt): skip battery telemetry when no battery is connected

PV-only Growatt still answers the battery registers with 0, so Overview
rendered a phantom Battery node. Only emit battery telemetry when
voltage/SoC/power indicate a real battery. Fixes srcfl/ftw#1669.

Signed-off-by: huangkongsheng <59566679+huangkongsheng@users.noreply.github.com>

* chore(growatt): lower the invented-number baseline and regenerate for 2.1.3

The battery gate removes four invented numbers from growatt (20 to 16),
so the ratchet needs its baseline lowered. index.yaml, devices.yaml and
the support status are regenerated for the 2.1.3 manifest.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Signed-off-by: Fredrik Ahlgren <fredrik@sourceful-labs.com>

---------

Signed-off-by: huangkongsheng <59566679+huangkongsheng@users.noreply.github.com>
Signed-off-by: Fredrik Ahlgren <fredrik@sourceful-labs.com>
Co-authored-by: Fredrik Ahlgren <fredrik@sourceful-labs.com>
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
Easee moves session energy in steps of about 1 kWh. FTW's energy record
judged each step against the time since the last reading, and rejected
those that landed moments later. On one home box it kept 10 of 24.3 kWh.

The driver now says so with session_wh_coarse. Measured power came within
0.1 % of Easee's own total on three charges.

Signed-off-by: Fredrik Ahlgren <fredrik@sourceful-labs.com>
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
…bution

Signed-off-by: Segran <goran@andersson-stehag.se>

This branch has not been deployed

No deployments
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants