This page documents the HTTP/JSON endpoints that return live meter readings, energy history, and tariff data.
All endpoints return Content-Type: application/json unless noted otherwise. Endpoints marked Auth: level 1 require admin credentials. Endpoints marked Auth: level 2 require any valid login (or no login when security is disabled). The CORS column indicates whether Access-Control-Allow-Origin: * is sent.
| Endpoint | Auth | Description |
|---|---|---|
/data.json |
Level 2 | Live meter readings, status flags, and energy accounting |
/realtime.json |
None | 10-second power history ring buffer (last hour) |
/temperature.json |
Level 2 | DS18B20 temperature sensor readings |
/dayplot.json |
Level 2 | Hourly import/export totals for the current day |
/monthplot.json |
Level 2 | Daily import/export totals for the current month |
/tariff.json |
Level 2 | Capacity tariff thresholds and peak consumption records |
/importprice.json |
Level 2 | Day-ahead import price series |
/exportprice.json |
Level 2 | Day-ahead export price series |
/energyprice.json |
Level 2 | Deprecated. Single combined price series |
/data.jsonReturns a comprehensive snapshot of the current meter state, device status, and energy accounting data. This is the primary polling endpoint for dashboards and integrations.
Request: GET http://<hostname>/data.json
Example response:
{
"im": 20000,
"om": 0,
"mf": 63,
"i": 1234,
"e": 0,
"w": 1234,
"ri": 120,
"re": 0,
"ic": 4521.234,
"ec": 0.000,
"ric": 312.100,
"rec": 0.000,
"f": 0.98,
"l1": { "u": 230.10, "i": 5.38, "p": 1234, "q": 0, "f": 0.98 },
"l2": { "u": 0.00, "i": 0.00, "p": 0, "q": 0, "f": 0.00, "e": false },
"l3": { "u": 0.00, "i": 0.00, "p": 0, "q": 0, "f": 0.00 },
"v": 3.30,
"r": -68,
"t": 42.5,
"u": 86400,
"m": 32768,
"em": 1,
"hm": 1,
"wm": 1,
"mm": 0,
"me": 0,
"p": 0.7823,
"px": null,
"mt": 1,
"ds": 2,
"ea": {
"x": 1.85,
"p": [1.85, 1.72, 1.61],
"t": 2,
"h": { "u": 0.31, "c": 0.24, "p": 0.00, "i": 0.00 },
"d": { "u": 3.21, "c": 2.50, "p": 0.00, "i": 0.00 },
"m": { "u": 89.40, "c": 69.73, "p": 0.00, "i": 0.00 }
},
"pe": true,
"pr": "NO3",
"pc": "NOK",
"he": 0,
"ee": 0,
"c": 1712750400,
"a": false
}
| Field | Type | Unit | Description |
|---|---|---|---|
im |
integer | W | Configured maximum import capacity (installed fuse × 230 V, or 20 000 W default) |
om |
integer | W | Configured production/export capacity (0 if not set) |
mf |
integer | A | Main fuse rating (40 A default if not configured) |
i |
integer | W | Active import power |
e |
integer | W | Active export power |
w |
integer (signed) | W | Net active power: import − export. Negative when exporting more than importing |
ri |
integer | VAr | Reactive import power |
re |
integer | VAr | Reactive export power |
ic |
float (3 dp) | kWh | Accumulated active import energy (meter register) |
ec |
float (3 dp) | kWh | Accumulated active export energy (meter register) |
ric |
float (3 dp) | kVArh | Accumulated reactive import energy |
rec |
float (3 dp) | kVArh | Accumulated reactive export energy |
f |
float (2 dp) | — | Overall power factor |
v |
float (2 dp) | V | Device supply voltage (VCC) |
r |
integer | dBm | Wi-Fi RSSI signal strength |
t |
float (2 dp) | °C | Board/internal temperature |
u |
integer | s | Device uptime since last boot |
m |
integer | bytes | Free heap memory |
em |
integer | — | ESP/board status: 0=booting, 1=ok, 2=warning, 3=error |
hm |
integer | — | HAN/meter link status: 0=waiting for first packet, 1=ok (<15 s since last packet), 2=stale (15–30 s), 3=error (>30 s or error code set) |
wm |
integer | — | Wi-Fi signal quality: 1=good (>−75 dBm), 2=fair (>−95 dBm), 3=poor |
mm |
integer | — | MQTT status: 0=disabled, 1=connected, 2=disconnected (no error), 3=error |
me |
integer | — | Last MQTT error code (0 = no error) |
p |
float or null |
currency/kWh | Current import electricity price. null when no price is available |
px |
float or null |
currency/kWh | Current export electricity price. null when no price is available |
mt |
integer | — | Meter type code (manufacturer-specific enum) |
ds |
integer | — | Distribution system type (IT, TN, etc.) |
pe |
boolean | — | true if a current price is available from the price service |
pr |
string | — | Price region code (e.g. "NO3"). Empty string if not configured |
pc |
string | — | Price currency code (e.g. "NOK"). Empty string if not configured |
he |
integer | — | Last HAN/meter parser error code (0 = no error) |
ee |
integer | — | Last price service error code (0 = no error) |
c |
integer | s | Device clock as a Unix timestamp (seconds since 1970-01-01 UTC) |
a |
boolean | — | true if the current request is authenticated at admin level (security level 1) |
l1, l2, l3)Each phase object contains:
| Field | Type | Unit | Description |
|---|---|---|---|
u |
float (2 dp) | V | Phase voltage |
i |
float (2 dp) | A | Phase current |
p |
integer | W | Phase active import power |
q |
integer | W | Phase active export power |
f |
float (2 dp) | — | Phase power factor |
e |
boolean | — | L2 only. true when L2 current is not reported by the meter (common on single-phase meters that place all load on L1) |
ea)| Field | Type | Unit | Description |
|---|---|---|---|
ea.x |
float (1 dp) | kWh | Highest hourly consumption recorded this month (used as the peak for tariff calculation) |
ea.p |
float[] | kWh | Array of the top N peak hourly values this month, sorted descending. Array length equals the number of peak hours configured in the tariff settings |
ea.t |
integer | — | Current capacity tariff threshold level (index into the thresholds array in /tariff.json) |
ea.h.u |
float (2 dp) | kWh | Energy consumed (import) in the current hour |
ea.h.c |
float (2 dp) | currency | Estimated cost for the current hour |
ea.h.p |
float (2 dp) | kWh | Energy produced (export) in the current hour |
ea.h.i |
float (2 dp) | currency | Estimated income for the current hour |
ea.d.* |
same as ea.h |
kWh / currency | Same four values aggregated over today |
ea.m.* |
same as ea.h |
kWh / currency | Same four values aggregated over the current month |
/realtime.jsonReturns a slice of the high-frequency net active power ring buffer maintained by the device. The buffer holds 360 samples at 10-second intervals, covering the last 60 minutes of history. Samples represent net active power (import minus export) at the time of capture.
This endpoint does not require authentication and includes an unrestricted CORS header, making it suitable for embedding in browser-based dashboards on other origins.
Request: GET http://<hostname>/realtime.json[?offset=N&size=M]
Query parameters:
| Parameter | Default | Description |
|---|---|---|
offset |
0 |
Number of samples to skip from the start of the requested window |
size |
60 |
Number of samples to return (capped at the total buffer size of 360) |
Example response:
{
"offset": 0,
"size": 60,
"total": 360,
"data": [1234, 1198, 1201, 1180, 0, -200, 1150]
}
| Field | Type | Unit | Description |
|---|---|---|---|
offset |
integer | — | The offset applied to this response |
size |
integer | — | Number of data points returned |
total |
integer | — | Total number of points in the ring buffer (always 360) |
data |
integer[] | W | Net active power per 10-second slot. Negative values indicate net export. Ordered from oldest to newest within the requested window |
/temperature.jsonReturns readings from all DS18B20 temperature sensors connected to the device.
Request: GET http://<hostname>/temperature.json
Example response (two sensors connected):
{
"c": 2,
"s": [
{ "i": 0, "a": "28ff641d4a2c3401", "n": "", "c": 1, "v": 22.5 },
{ "i": 1, "a": "28aa1b2c3d4e5f60", "n": "", "c": 1, "v": 18.0 }
]
}
Example response (no sensors):
{ "c": 0, "s": [] }
| Field | Type | Unit | Description |
|---|---|---|---|
c |
integer | — | Number of temperature sensors detected |
s |
array | — | Array of sensor objects, one per detected sensor |
s[n].i |
integer | — | Zero-based sensor index |
s[n].a |
string | — | Sensor hardware address as a 16-character hex string (8-byte Dallas 1-Wire address) |
s[n].n |
string | — | Sensor name (currently always an empty string) |
s[n].c |
integer | — | Sensor enabled flag (currently always 1) |
s[n].v |
float (1 dp) | °C | Last temperature reading |
/dayplot.jsonReturns hourly import and export totals for the current day (UTC hours 00–23).
Request: GET http://<hostname>/dayplot.json
Example response:
{
"unit": "kwh",
"i00": 0.312,
"e00": 0.000,
"i01": 0.298,
"e01": 0.000,
...
"i23": 0.410,
"e23": 0.000
}
| Field | Type | Unit | Description |
|---|---|---|---|
unit |
string | — | Always "kwh" |
i00–i23 |
float (3 dp) | kWh | Import energy for UTC hour 00–23 |
e00–e23 |
float (3 dp) | kWh | Export energy for UTC hour 00–23 |
Hours are in UTC. To display in local time, apply the clock_offset value from /sysinfo.json.
/monthplot.jsonReturns daily import and export totals for the current month (days 01–31).
Request: GET http://<hostname>/monthplot.json
Example response:
{
"unit": "kwh",
"i01": 12.345,
"e01": 0.000,
"i02": 14.210,
"e02": 0.120,
...
"i31": 0.000,
"e31": 0.000
}
| Field | Type | Unit | Description |
|---|---|---|---|
unit |
string | — | Always "kwh" |
i01–i31 |
float (3 dp) | kWh | Import energy for day 01–31 of the current month. Days beyond the end of the month are 0.000 |
e01–e31 |
float (3 dp) | kWh | Export energy for day 01–31 of the current month |
/tariff.jsonReturns the capacity tariff configuration and the recorded peak-consumption hours for the current month. Used to determine which threshold level is currently active and how close the user is to the next threshold.
Request: GET http://<hostname>/tariff.json
Example response:
{
"t": [2, 5, 10, 15, 20, 25, 30, 35, 40, 50],
"p": [
{ "d": 5, "h": 14, "v": 2.85 },
{ "d": 3, "h": 8, "v": 2.61 },
{ "d": 9, "h": 17, "v": 2.34 }
],
"c": 2,
"m": 2.60
}
| Field | Type | Unit | Description |
|---|---|---|---|
t |
integer[10] | kWh | Array of 10 capacity tariff threshold values. The active threshold level index is given by ea.t in /data.json |
p |
object[] | — | Array of peak consumption records for the current month, sorted by value descending. Contains up to N entries where N is the number of peak hours configured (default 3). See below |
p[n].d |
integer | — | Day of the month (1–31) when this peak occurred |
p[n].h |
integer | — | Hour of the day (0–23) when this peak occurred |
p[n].v |
float (2 dp) | kWh | Peak hourly consumption value |
c |
integer | — | Index (0-based) of the currently active tariff threshold level |
m |
float (2 dp) | kWh | Average of the top N peak hourly values, used as the billable capacity for the current month. N is the number of configured peak hours, not necessarily 3 |
/importprice.jsonReturns the day-ahead electricity import price series from the configured price service. This is the primary price endpoint and replaces the deprecated /energyprice.json.
Returns HTTP 404 when no price service is configured or no price data is currently available.
Request: GET http://<hostname>/importprice.json
Example response:
{
"currency": "NOK",
"source": "EOE",
"resolution": 60,
"direction": "import",
"cursor": 14,
"importExportPriceDifferent": false,
"prices": [0.6812, 0.6543, 0.7021, null, null]
}
| Field | Type | Unit | Description |
|---|---|---|---|
currency |
string | — | Currency code for price values (e.g. "NOK") |
source |
string | — | Price data provider name (e.g. "EOE", "EDS", "HKS") |
resolution |
integer | minutes | Time resolution of each price point (typically 60) |
direction |
string | — | Always "import" for this endpoint |
cursor |
integer | — | Zero-based index of the price point that is currently active |
importExportPriceDifferent |
boolean | — | true when the export price series differs from the import series |
prices |
(float or null)[] | currency/kWh | Ordered array of price values, one per resolution period, starting from period 0 of the available data. Entries are null for periods where no price is available |
/exportprice.jsonReturns the day-ahead electricity export (feed-in) price series. Identical structure to /importprice.json with "direction": "export".
When importExportPriceDifferent is false, the prices array will be identical to the import series. Intended for use with solar and battery systems that need the feed-in tariff schedule separately from the consumption tariff.
Returns HTTP 404 when no price service is configured or no price data is currently available.
Request: GET http://<hostname>/exportprice.json
Response fields: Same as /importprice.json above, with "direction": "export".
/energyprice.json (deprecated)Deprecated. This endpoint is retained for backwards compatibility but may be removed in a future release. New integrations should use
/importprice.jsonand/exportprice.jsoninstead.
Returns the current electricity price series as a flat object indexed by relative hour offset from the current hour.
Request: GET http://<hostname>/energyprice.json
Example response:
{
"currency": "NOK",
"source": "EOE",
"00": 0.7823,
"01": 0.8012,
"02": null,
...
"35": null
}
| Field | Type | Unit | Description |
|---|---|---|---|
currency |
string | — | Currency code (e.g. "NOK") |
source |
string | — | Price data provider. Known values: "EOE" (ENTSO-E), "EDS" (Energi Data Service), "HKS" (Hvakosterstrommen.no) |
"00"–"35" |
float or null |
currency/kWh | Price for the hour at offset 0 (current hour), 1 (next hour), …, up to 35 hours ahead. null when price data is unavailable for that hour |