Everything that runs automatically when a meter interaction reaches a final status —
ordered sequence, conditional branches, follow-up interactions, and the abort cascade.
The blastoff Sequence
Eight steps run in code order after the interaction row is persisted. Steps 5–7 are
fired asynchronously (not awaited). Step 8 is always last.
100%
Follow-up Interactions & Abort Cascade
Two patterns that extend beyond a single interaction lifecycle.
100%
Key Concepts
Meter fields by interaction type
TURN_ON / TURN_OFF → is_on, is_on_updated_at
SET / READ_POWER_LIMIT → power_limit, power_limit_updated_at
READ_REPORT → same as READ_CREDIT + analytics POST to Yeti API (production only)
READ_VERSION → version
TOP_UP / CLEAR_CREDIT → no direct field update; triggers READ_CREDIT follow-up
All successful interactions also set last_seen_at on the meter.
Issue auto-closing
The meter's open issue (if any) is evaluated before the DB write and may be closed
automatically based on the new meter state.
NO_COMMUNICATION — closed when any interaction succeeds and last_seen_at is set
NO_CREDIT — closed when resulting credit balance is > 0
UNEXPECTED_POWER_LIMIT — closed when power_limit now equals power_limit_should_be
UNEXPECTED_METER_STATUS is never auto-closed by this service.
Commissioning: advance vs resume
Two distinct code paths, selected based on whether the interaction itself belongs
to a commissioning flow.
advanceActive — interaction has a meter_commissioning_id. Updates commissioning
status (PENDING → PROCESSING → SUCCESSFUL), triggers the next deferred command,
or marks FAILED and aborts siblings on error.
resumeInactive — a normal command succeeds while the meter's
last_commissioning is still PENDING. Unpauses deferred commissioning commands.