Skip to content

Billing#

Four sensors covering the money side of the account. They are created whether or not the panel's beta tabs are turned on.

Sensor What it is
sensor.edf_energy_{{ACCOUNT_ID}}_account_balance The account balance, positive when in credit
sensor.edf_energy_{{ACCOUNT_ID}}_last_bill_amount What the latest statement charged
sensor.edf_energy_{{ACCOUNT_ID}}_next_payment_amount The next direct debit collection
sensor.edf_energy_{{ACCOUNT_ID}}_refund_status The status of the latest refund request

Account balance#

The balance as EDF report it: positive means in credit, which is the usual state for an account on direct debit, and is the way round it reads on the bill and in the app.

Attribute
account_status EDF's status for the account, e.g. ACTIVE

The balance is not what you can get refunded

EDF only refund what has been paid in by direct debit. See refund_status below.

Last bill amount#

The charges on the most recent statement - not the balance it closed on.

Attribute
bill_id EDF's id for the statement
issued_date When EDF issued it
period_from, period_to The period it covers
due_date When payment is due
closing_balance The balance the statement closed on

Next payment amount#

The next direct debit collection.

Attribute
next_payment_date The next collection date, worked out from the payment day
payment_day The day of the month EDF collect on
frequency e.g. Monthly
is_variable Whether the amount varies
payment_method e.g. DIRECT_DEBIT

A variable schedule has no amount

On a variable schedule EDF collect whatever the period came to, so there is no figure until the statement is cut and the sensor reads unknown. is_variable says why. EDF report the amount as 0 in that case, which would otherwise read as a free month.

next_payment_date is worked out from the payment day EDF give, since they do not supply a date. A day beyond the length of the month lands on the last day of it.

Refund status#

The status of the most recent refund request, or None requested on an account that has never asked for one. Statuses seen so far run REQUESTED → SUBMITTED → PAID.

Attribute
amount The amount of the latest request
payment_date When it is due to be paid, which moves as the request progresses
reason EDF's reason code for it, e.g. PARTIAL_CREDIT_REFUND
open_requests How many requests have not been settled yet
can_request_refund Whether EDF say they will accept a new request right now - advisory, see below
cannot_request_reason EDF's reason when they say they will not, e.g. HAS_NOT_GIVEN_READINGS_RECENTLY
maximum_refund What EDF will actually refund

Treat can_request_refund as advice rather than a rule. It read false on a real account, with HAS_NOT_GIVEN_READINGS_RECENTLY as the reason, while EDF accepted and paid two requests made in spite of it - so the panel shows the reason but does not withhold the request form, and neither does the websocket command behind it.

maximum_refund is the figure to automate against. It tracks what has been paid in by direct debit and is normally far below the balance, sometimes by an order of magnitude.

What is deliberately not here#

The statement list, the account ledger and the referral list are not on any sensor or attribute. Each is dozens or hundreds of rows, the referrals carry other people's names, and nothing useful triggers on them - so putting them in attributes would write all of it into the recorder database every time it changed. The panel asks for them over the websocket while the tab is open and nothing is persisted. They are visible on the Account and Perks tabs.

Diagnostics#

A diagnostics download redacts the figures on these four sensors, since diagnostics are usually attached to a public issue. Whether a sensor has a value, when it last changed, and EDF's own eligibility reason all survive, which is what is needed to diagnose a fault with one.