Repository navigation
Releases
v0.3.0
Everything from the two 0.3.0 candidates, tried on a Wattpilot Home and a
Wattpilot Flex: Flex support, the readings per phase as sensors, the
charger's current limits and the PV-surplus stop hysteresis, a plain
device name for new installations, and many fixes. Requires
Home Assistant 2026.9.0 or newer. Coming from 0.2.0, read Changed
first: Phases in use now reads 0 while no phase is switched.
Existing installations keep their names and entity IDs.
Added
- Voltage, current, power and power factor per phase as sensors of their
own (L1 to L3 and N), disabled by default. They were only attributes of Charging
power, and those are kept out of the recorder, so no history of them
existed. The attributes stay for templates that read them. - PV surplus stop hysteresis and Minimum charging current as
settings; the minimum current is disabled by default. - Charging current limit, the lowest of the charger's hardware limits,
with the single limits and the current PV surplus charging offers as
attributes, and Temperature current limit; both diagnostic and
disabled by default. - Charging power from solar, battery, grid and other
sources in watts, the live counterpart of the session energy split, on
chargers that report it (seen on a Wattpilot Flex with firmware 43.x).
While charging they add up to Charging power; a source that
contributes nothing reads 0 W. Disabled by default.
Changed
- Phases in use counts the phases switched through to the car (
pha)
instead of reading the charger's phase count (pnp). That count stayed
at 1 through whole three-phase sessions, on a Wattpilot Home and on a
Flex, and followed a switch about 30 seconds late. The sensor now reads
0 when no phase is switched, where it showed 1 or 3 before; check
automations that test it for 1. The entity ID stays the same. - A new installation names the charger's device and entry Wattpilot, a
second charger Wattpilot 2 and so on, instead of after the charger's
host nameWattpilot_<serial>. Entity IDs follow the device name, so
they no longer carry the serial number:sensor.wattpilot_total_energy
instead ofsensor.wattpilot_<serial>_total_energy. Existing
installations keep their names and entity IDs. An installation carried
over from a fork names its device after the fork's friendly name: its
entities keep their IDs, and the ones the fork did not have get IDs
without the serial number. - Requires Home Assistant 2026.9.0 or newer (was 2026.8.0). Home Assistant
replaced its schema library in 2026.9, and the integration now uses the
new one directly instead of relying on the alias for the old name. - A reconnect reuses the password hash of the previous connection instead
of computing it again, so the charger gets its answer sooner: about a
tenth of a second per reconnect on a Wattpilot Home, whose password hash
is the slow one.
Fixed
- A select whose value the charger reports outside its list, such as a
Car profile the app does not offer, showed as unknown without a
word. The log now says so once, naming the kind of value but never the
value, and the diagnostics show whether a car profile was a known one,
still without naming the car. - Car profile shows Standard when the charger reports an empty
profile, as the app does, instead of unknown. - The repair notices about a refused connection go away once the charger
is connected again, not only with a reload. - A charger that refuses the password after first accepting it drops the
connection at once; its entities go unavailable and the password is asked
for again at the next availability check, within 30 seconds. During setup
the refusal was reported as a timeout and retried. - Diagnostics from a Wattpilot Flex replace three free-text fields nothing
documents: the OCPP fallback card, the OCPP tariff text and an OTA
field. Every top-level text field a Flex is known to report now has a
redaction decision, so a new one shows up in the tests instead of in a
download. - Average charging power reads 0 W once no current has flowed for a
minute. The charger keeps reporting the last session's average after
charging, so an automation on it kept firing for hours. A pause shorter
than a minute keeps the average. A new session reads 0 W until the
charger reports that session's average. - The 0.2.0 notes gave 0.5 minutes as an example for all three timings
now set in minutes. Minimum charging time starts at 1 minute, so 0.5
is refused there; fractions above 1 minute work, as for the two
phase-switch timings. - Total energy no longer falls across a reload or restart of Home
Assistant. After a charger restart it can report a few Wh less, which the
sensor held back -- but only until the integration reloaded, as it does
after a firmware update, and the energy dashboard then got a negative
hour. Only a step back that small is held across a reload: a replacement
charger that takes over the entity ID starts from its own total. - Diagnostics keep an empty value empty. An empty car profile showed up
there as "default", a value the charger had not sent. - The notice about entities that could not be migrated goes away with
the entry it is about, and with the entities it lists once they are
deleted, instead of staying until a restart. It no longer suggests
deleting the loaded entity, which Home Assistant does not allow. - A malformed address in the setup or reconfigure form -- an IPv6 address
without brackets, a mistyped port -- is reported at the address field
instead of as an unknown error. - On a Wattpilot Flex, three readings now work. Charger temperature
shows the hottest of the Flex's temperature sensors, with all readings
as an attribute; it stayed unknown, because the first of them is always
empty. What each sensor measures is not documented, so the hottest is
shown, the one that matters for derating. The ten ID chip sensors
exist, read from the Flex's per-chip keys instead of a list it does not
have. The Electricity price has itspricesattribute again; the
Flex sends its price list in another shape. - Ignoring a discovery card no longer deletes the charger's entry. An
entry carried over from the earlier integration learns its charger's
serial only once it connects, so a card for the same charger could still
be open; ignoring it made Home Assistant replace the entry, with its
entities and entity IDs, by an ignored one. While the entry waits for
its first connection, a card for its address is no longer offered and
the charger cannot be added there by hand a second time -- the entry
tries again instead; a card closes once the entry has its serial, and an
ignored card no longer blocks that entry from setting up. Reconfigure
and re-authentication refuse to move such an entry onto a charger that
already has an entry of its own, instead of reporting success and
failing afterwards. - A charger that comes back after an outage is reached again, also when a
reconnect action failed while it was away, or a firmware update took
longer than the integration waits for it. Either used to leave nothing
retrying, so the charger stayed unavailable until a reload. - After an outage the entities come back with the charger's current
readings. They used to show their readings from before the outage --
charging at 11 kW, say -- for up to the update interval, which the
recorder kept andto: chargingautomations reacted to. - A single value the integration cannot read no longer takes the rest of
the charger's update with it, and no longer stalls the first connection
until it times out. A message that is not valid text is skipped instead
of stopping the reader. A charger asking for a password scheme the
integration does not know is refused with that scheme named, instead of
a bare timeout; while running, a repair notice says so, and a firmware
update reports it instead of a timeout. A setting the charger accepted
with an empty status is no longer reported as unanswered. - Diagnostics from a Wattpilot Flex on Ethernet no longer contain the
serial number in the Ethernet host name, the Ethernet addresses, the name
servers and search domain, or the charger's address in the last cloud
error. IP addresses and the serial number are now replaced wherever they
appear in a text, not only in the fields known to hold them. The Flex's
ID-chip names are replaced too, as they already were on other models: a
name can be entered for each chip. - The integration no longer writes the charger's serial number or address
into the log. Its own messages, and the messages Home Assistant logs
about setting up the entry, show only the serial's last two digits: an
entry set up with an earlier version is named after the charger's host
name,Wattpilot_<serial>, and Home Assistant logs that name on every
failed attempt. The repair notice, which is not logged, still names the
serial in full. A network error is named by its kind, such as
ConnectionRefusedError (ECONNREFUSED), instead of by its text, which
quoted the charger's address. An entry set up with an earlier version
carries the serial in its entity IDs as well, so the integration's own
messages name an entity by its key; other parts of Home Assistant may
log entity IDs. - An entry whose setup failed, for example because another charger
answered at its address, now follows its charger to a new address the
charger announces and reloads; it used to wait for a manual reload. The
setup error points to Reconfigure for a charger with a new address. - A value where a number belongs that is no number -- text, a list, NaN or
infinity -- keeps the sensor's last reading instead of making Home
Assistant refuse the entity, and no longer puts an ID chip's card list
into t...
v0.3.0b2
The second candidate for 0.3.0, with what the first one's testers
reported: Phases in use now follows the phases actually switched to
the car, and the power per source reads 0 W instead of unknown. Requires
Home Assistant 2026.9.0 or newer. Entity IDs stay the same.
Changed
- Phases in use now counts the phases switched through to the car
(pha) instead of reading the charger's phase count (pnp). That count
stayed at 1 through whole three-phase sessions, on a Wattpilot Home and on
a Flex, and followed a switch about 30 seconds late. The sensor now reads
0 when no phase is switched, where it showed 1 or 3 before; check
automations that test it for 1. The entity ID stays the same. - Charging power from solar, battery, grid and other sources
read 0 W for a source that contributes nothing. A Flex sent no number for
solar and battery in that case, so they showed unknown and the four could
not be added up. Their unit is now confirmed as watts: while charging they
add up to Charging power. - A reconnect reuses the password hash of the previous connection instead
of computing it again, so the charger gets its answer sooner: about a
tenth of a second per reconnect on a Wattpilot Home, whose password hash
is the slow one.
v0.3.0b1
The first candidate for 0.3.0: Wattpilot Flex support built from one
owner's diagnostics, the readings per phase as sensors, the charger's
current limits and the PV-surplus stop hysteresis, a plain device name
for new installations, and the fixes from two audits. Requires Home
Assistant 2026.9.0 or newer. Existing installations keep their names and
entity IDs.
Added
- Voltage, current, power and power factor per phase as sensors of their
own (L1 to L3 and N), disabled by default. They were only attributes of Charging
power, and those are kept out of the recorder, so no history of them
existed. The attributes stay for templates that read them. - PV surplus stop hysteresis and Minimum charging current as
settings; the minimum current is disabled by default. - Charging current limit, the lowest of the charger's hardware limits,
with the single limits and the current PV surplus charging offers as
attributes, and Temperature current limit; both diagnostic and
disabled by default. - Charging power from solar, battery, grid and other
sources, the live counterpart of the session energy split, on chargers
that report it (seen on a Wattpilot Flex with firmware 43.x). Disabled
by default; their unit has not been measured.
Changed
- A new installation names the charger's device and entry Wattpilot, a
second charger Wattpilot 2 and so on, instead of after the charger's
host nameWattpilot_<serial>. Entity IDs follow the device name, so
they no longer carry the serial number:sensor.wattpilot_total_energy
instead ofsensor.wattpilot_<serial>_total_energy. Existing
installations keep their names and entity IDs. An installation carried
over from a fork names its device after the fork's friendly name: its
entities keep their IDs, and the ones the fork did not have get IDs
without the serial number. - Requires Home Assistant 2026.9.0 or newer (was 2026.8.0). Home Assistant
replaced its schema library in 2026.9, and the integration now uses the
new one directly instead of relying on the alias for the old name.
Fixed
- A select whose value the charger reports outside its list, such as a
Car profile the app does not offer, showed as unknown without a
word. The log now says so once, naming the kind of value but never the
value, and the diagnostics show whether a car profile was a known one,
still without naming the car. - The repair notices about a refused connection go away once the charger
is connected again, not only with a reload. - A charger that refuses the password after first accepting it drops the
connection at once; its entities go unavailable and the password is asked
for again at the next availability check, within 30 seconds. During setup
the refusal was reported as a timeout and retried. - Diagnostics from a Wattpilot Flex replace three free-text fields nothing
documents: the OCPP fallback card, the OCPP tariff text and an OTA
field. Every top-level text field a Flex is known to report now has a
redaction decision, so a new one shows up in the tests instead of in a
download. - Average charging power reads 0 W once no current has flowed for a
minute. The charger keeps reporting the last session's average after
charging, so an automation on it kept firing for hours. A pause shorter
than a minute keeps the average. A new session reads 0 W until the
charger reports that session's average. - The 0.2.0 notes gave 0.5 minutes as an example for all three timings
now set in minutes. Minimum charging time starts at 1 minute, so 0.5
is refused there; fractions above 1 minute work, as for the two
phase-switch timings. - Total energy no longer falls across a reload or restart of Home
Assistant. After a charger restart it can report a few Wh less, which the
sensor held back -- but only until the integration reloaded, as it does
after a firmware update, and the energy dashboard then got a negative
hour. Only a step back that small is held across a reload: a replacement
charger that takes over the entity ID starts from its own total. - Diagnostics keep an empty value empty. An empty car profile showed up
as "default", a real profile, contradicting the entity's unknown state. - The notice about entities that could not be migrated goes away with
the entry it is about, and with the entities it lists once they are
deleted, instead of staying until a restart. - A malformed address in the setup or reconfigure form -- an IPv6 address
without brackets, a mistyped port -- is reported at the address field
instead of as an unknown error. - On a Wattpilot Flex, three readings now work. Charger temperature
shows the hottest of the Flex's temperature sensors, with all readings
as an attribute; it stayed unknown, because the first of them is always
empty. What each sensor measures is not documented, so the hottest is
shown, the one that matters for derating. The ten ID chip sensors
exist, read from the Flex's per-chip keys instead of a list it does not
have. The Electricity price has itspricesattribute again; the
Flex sends its price list in another shape. - Ignoring a discovery card no longer deletes the charger's entry. An
entry carried over from the earlier integration learns its charger's
serial only once it connects, so a card for the same charger could still
be open; ignoring it made Home Assistant replace the entry, with its
entities and entity IDs, by an ignored one. While the entry waits for
its first connection, a card for its address is no longer offered and
the charger cannot be added there by hand a second time -- the entry
tries again instead; a card closes once the entry has its serial, and an
ignored card no longer blocks that entry from setting up. Reconfigure
and re-authentication refuse to move such an entry onto a charger that
already has an entry of its own, instead of reporting success and
failing afterwards. - A charger that comes back after an outage is reached again, also when a
reconnect action failed while it was away, or a firmware update took
longer than the integration waits for it. Either used to leave nothing
retrying, so the charger stayed unavailable until a reload. - After an outage the entities come back with the charger's current
readings. They used to show their readings from before the outage --
charging at 11 kW, say -- for up to the update interval, which the
recorder kept andto: chargingautomations reacted to. - A single value the integration cannot read no longer takes the rest of
the charger's update with it, and no longer stalls the first connection
until it times out. A message that is not valid text is skipped instead
of stopping the reader. A charger asking for a password scheme the
integration does not know is refused with that scheme named, instead of
a bare timeout; while running, a repair notice says so, and a firmware
update reports it instead of a timeout. A setting the charger accepted
with an empty status is no longer reported as unanswered. - Diagnostics from a Wattpilot Flex on Ethernet no longer contain the
serial number in the Ethernet host name, the Ethernet addresses, the name
servers and search domain, or the charger's address in the last cloud
error. IP addresses and the serial number are now replaced wherever they
appear in a text, not only in the fields known to hold them. The Flex's
ID-chip names are replaced too, as they already were on other models: a
name can be entered for each chip. - The integration no longer writes the charger's serial number or address
into the log. Its own messages, and the messages Home Assistant logs
about setting up the entry, show only the serial's last two digits: an
entry set up with an earlier version is named after the charger's host
name,Wattpilot_<serial>, and Home Assistant logs that name on every
failed attempt. The repair
notice, which is not logged, still names the serial in full. A network
error is named by its kind, such asConnectionRefusedError (ECONNREFUSED), instead of by its text, which quoted the charger's
address. Its entity IDs carry the serial as well, so the integration's
own messages name an entity by its key; other parts of Home Assistant
may log entity IDs. - Charging power no longer fills the recorder database. Its sixteen
per-phase attributes differ in nearly every update while a car charges,
and each update stored a new attribute row. They stay visible and usable in
templates and automations; only their history is no longer kept. - An answer from the charger that carries no request ID is no longer
thrown away as unreadable. A refusal now shows its reason in the log,
and an acceptance applies the state that came with it.
v0.2.0
Everything from the three 0.2.0 candidates, tried on a real charger, plus
what an independent audit of the last one found. Coming from 0.1.2, read
Changed first: three timings are now set in minutes.
Added
- Car plugged in and Car charging, two yes/no sensors.
- Forced charging state: what the three charging buttons set, now
readable and settable in one place. - Charging current preset: sets the current to one of the presets from
the app, so the app's slider stays in step with Home Assistant. - Energy limit per charge: stops the charge after a set amount of
energy; 0 switches the limit off. - Charging duration: minutes of the current charge, or of the last one
while no car is charging. - Electricity price and Car consumption, both disabled by default:
the market price of a dynamic tariff, with the day's prices as an
attribute, and the consumption the app uses to show range. - Minimum charge pause, Minimum charging interval, Forced
single-phase duration and Simulated unplugging duration, set in
seconds; disabled by default. - The charger is discovered on the network: Home Assistant offers it by
itself and asks only for the password. When a known charger has lost its
connection and announces a new address, its entry follows. An entry that
is connected stays where it is, and an entry set up by name keeps the
name.
Changed
- Breaking: Minimum charging time, Phase switch delay and
Phase switch interval are shown and set in minutes instead of
milliseconds (15 instead of 900000). Automations and scripts that set
them need their values divided by 60000. Fractions work: 0.5 is 30
seconds. The charger itself still receives milliseconds. - Uptime (disabled by default) reads in hours instead of milliseconds
once you enable it. If you had enabled it already, it keeps milliseconds
until you pick hours in the entity's settings. - Error messages now appear in your Home Assistant language (English and
German so far): a failed setting, a refused password, a lost connection.
They used to be fixed English text.
Fixed
- A charger the entry already knows must announce the expected serial
number before it is sent anything derived from the password. A different
charger at the address used to receive that answer first and be refused
only afterwards. - A diagnostics download hides the load-balancing group ID and the Wi-Fi
error message. Both are free text a charger may fill with something that
identifies you; they were left readable because the reference charger
sent them empty. - A different charger answering at the address while Home Assistant is
running now raises a repair notice that points to Reconfigure. The
integration already stopped connecting, rightly, but said nothing: the
entities just stayed unavailable. - A password the charger refuses while Home Assistant is running now asks
for a new one. The integration stopped reconnecting, as it should, but
never said why: the charger just stayed unavailable until a reload. - Reconnecting and disconnecting no longer trip over each other. A
reconnect under way when the integration was unloaded or disconnected
could open a connection after the teardown had finished, and a reconnect
during a slow disconnect could report success for the very connection
being closed. An unloaded integration now refuses a late reconnect
instead of coming back to life behind it. - When setup refuses a charger (a different device at the address, or one
already set up), that reason is what you see, even if closing the
connection fails as well. The closing error used to take its place. - Entities can no longer go missing when the integration connects. The
charger sends its first status in several pieces, and a live update
arriving between two of them used to count as "all properties known" --
whatever came later got no entity until the integration was reloaded. - The restart button no longer reports a failure on every press. The
charger restarts without ever answering the command, and waiting for that
answer ran into a timeout each time.
v0.2.0b3
The third candidate for 0.2.0: durations in units people read, and the
charging duration. One breaking change: three timings are now set in
minutes, see below. Switching the energy limit off (0) has still not been
seen to work on a real charger.
Added
- Charging duration: minutes of the current charge, or of the last one
while no car is charging. - Minimum charge pause, Minimum charging interval, Forced
single-phase duration and Simulated unplugging duration, set in
seconds; disabled by default.
Changed
- Breaking: Minimum charging time, Phase switch delay and
Phase switch interval are shown and set in minutes instead of
milliseconds (15 instead of 900000). Automations and scripts that set
them need their values divided by 60000. Fractions work: 0.5 is 30
seconds. The charger itself still receives milliseconds. - Uptime (disabled by default) reads in hours instead of milliseconds
once you enable it. If you had enabled it already, it keeps milliseconds
until you pick hours in the entity's settings.
v0.2.0b2
The second candidate for 0.2.0: everything from 0.2.0b1, plus discovery. As
before, switching the energy limit off (0) has not yet been seen to work on
a real charger.
Added
- The charger is discovered on the network: Home Assistant offers it by
itself and asks only for the password. When a known charger has lost its
connection and announces a new address, its entry follows. An entry that
is connected stays where it is, and an entry set up by name keeps the
name.
Changed
- The German texts of the repair notice and of the setup dialog use the
same impersonal style as the rest of the integration.
v0.2.0b1
A release candidate: new entities for the car state, for charging control and
for dynamic electricity prices, and a round of fixes found by audits and by
recording what a real charger sends. One part has not been tried on a real
charger yet: switching the energy limit off (0) sends the charger's
documented "no limit", but the charger has not yet been seen to accept it.
Added
- Car plugged in and Car charging, two yes/no sensors.
- Forced charging state: what the three charging buttons set, now
readable and settable in one place. - Charging current preset: sets the current to one of the presets from
the app, so the app's slider stays in step with Home Assistant. - Energy limit per charge: stops the charge after a set amount of
energy; 0 switches the limit off. - Electricity price and Car consumption, both disabled by default:
the market price of a dynamic tariff, with the day's prices as an
attribute, and the consumption the app uses to show range.
Fixed
- A different charger answering at the address while Home Assistant is
running now raises a repair notice that points to Reconfigure. The
integration already stopped connecting, rightly, but said nothing: the
entities just stayed unavailable. - Error messages now appear in your Home Assistant language (English and
German so far): a failed setting, a refused password, a lost connection.
They used to be fixed English text. - Reconnecting and disconnecting no longer trip over each other. A
reconnect under way when the integration was unloaded or disconnected
could open a connection after the teardown had finished, and a reconnect
during a slow disconnect could report success for the very connection
being closed. An unloaded integration now refuses a late reconnect
instead of coming back to life behind it. - A password the charger refuses while Home Assistant is running now asks
for a new one. The integration stopped reconnecting, as it should, but
never said why: the charger just stayed unavailable until a reload. - When setup refuses a charger (a different device at the address, or one
already set up), that reason is what you see, even if closing the
connection fails as well. The closing error used to take its place. - Entities can no longer go missing when the integration connects. The
charger sends its first status in several pieces, and a live update
arriving between two of them used to count as "all properties known" --
whatever came later got no entity until the integration was reloaded.
Possible rather than observed: after a restart the pieces paused for
about a second, while live updates arrive once a second. - The restart button no longer reports a failure on every press. The
charger restarts without ever answering the command, and waiting for that
answer ran into a timeout each time.
v0.1.2
Everything from the 0.1.2b1 candidate, plus what an independent audit of it
found. Nothing here adds functionality; it is quieter in the log and holds up
better at a few edges.
Changed
- A charger that stops answering is reported once, at INFO instead of WARNING.
Switching the charger off is not a fault you can act on, and Home Assistant
shows everything from WARNING up in the log panel, attributed to this
integration. The reconnect attempts behind it repeated their own warning for
as long as the charger stayed away; they are debug-only now.
Fixed
- Two reconnect actions arriving at the same time no longer leave a stray
connection behind. Each opened its own socket, and only the last one was
ever closed again. - The "enable cloud API" action gives up when its timeout says so. It used
to count whole seconds, so a short timeout still waited a full second. - A diagnostics download no longer fails on a
cardsvalue that is not a
list, and no longer walks a string there character by character. Not seen
from real firmware; the same guard the companion-device field already had. - An empty
nrgarray no longer stops the reader. It raised an error the
frame guard did not catch, and the valid frame behind it was lost while the
connection still looked healthy. Not observed on real firmware.
Removed
- The unused half of the adopted client: child-property expansion, an MQTT
bridge configuration and a discovery configuration that nothing here ever
called. No user-visible change.
v0.1.2b1
A release candidate. Nothing here changes what the integration does; it
changes what it writes into your log. Install it if your log panel is full of
warnings from this integration -- otherwise there is no reason to hurry.
Changed
- A charger that stops answering is reported once, at INFO instead of WARNING.
Switching the charger off is not a fault you can act on, and Home Assistant
shows everything from WARNING up in the log panel, attributed to this
integration. The reconnect attempts behind it repeated their own warning for
as long as the charger stayed away; they are debug-only now.
Fixed
- An empty
nrgarray no longer stops the reader. It raised an error the
frame guard did not catch, and the valid frame behind it was lost while the
connection still looked healthy. Not observed on real firmware.
v0.1.1
A maintenance release. Everything below came out of an independent audit of
0.1.0; there is no new functionality.
Fixed
- The departure time for Next Trip is sent unchanged. It was shifted an hour
forward during summer time, and read back without that shift -- so a trip
set to 07:30 showed up as 08:30. Measured against the charger: it expects
plain local time, and applies no daylight-saving correction of its own.
If you set a departure time with 0.1.0 during summer time, check it. - Re-entering the password now verifies which charger answered. If the
address had been taken over by another one, the new password was saved and
the flow reported success, while the entry itself then refused to start. - An ID-chip sensor for a slot the charger does not have shows nothing
instead of writing the whole card list, holder names included, into the
log. That log is not covered by the redaction that protects diagnostics. - Reconnecting by action while the integration was already retrying no longer
leaves the earlier attempt running, with two readers on one connection. - An automatic reconnect gives up on a charger that accepts the connection
and then never finishes talking, instead of waiting on it forever. - Nothing from a charger that was refused as the wrong one is applied any
more: what its connection had already sent used to be processed after the
refusal. - A setup that Home Assistant cancels hands the connection back in every
phase, including while the client is still reading its protocol
description. - The firmware update honours its own time limit. The limit counted only the
waiting between attempts, so an update could run far past it.