Energy Flow

Generated from rPDU2MQTT --emit-schema. Keys are case-insensitive. [] marks a list item and <name> a map key of your choosing. A blank default means none is declared.

Virtual upstream nodes (breakers, transfer switches, a “Total”) and their feeder wiring for the energy-flow hierarchy. Edited visually on the Flow tab.

Setting Type Default Description
EnergyFlow object Virtual upstream nodes (breakers, transfer switches, a “Total”) and their feeder wiring for the energy-flow hierarchy. Edited visually on the Flow tab.
EnergyFlow.Aggregation object Accumulate energy (kWh) from the power readings, for nodes that report power but not energy.
EnergyFlow.Aggregation.Enabled bool false Derive energy (kWh) by integrating each node's power over time. A real energy source on a node always takes precedence.
EnergyFlow.Aggregation.SampleIntervalSeconds int 10 How often to sample power, in seconds. Shorter samples track a spiky load more closely.
EnergyFlow.Aggregation.MaxGapSeconds int 60 Longest gap between samples that still counts, in seconds. A longer gap is recorded as unmeasured rather than guessed.
EnergyFlow.Aggregation.TrackPeriods bool true Track a daily energy total per node and outlet, so the flow diagram compares figures that all start at the same moment. Lifetime totals are unaffected.
EnergyFlow.Aggregation.PeriodTimeZone one of 419 values, e.g. Africa/Abidjan, Africa/Accra, Africa/Addis_Ababa IANA time zone the daily total rolls over in, e.g. "America/Chicago". Blank uses the host's local time zone — which in a container is usually UTC.
EnergyFlow.Aggregation.PeriodStartHour int 0 Hour of the day the daily total rolls over, in the period time zone. 0 = midnight. Range 0–23.
EnergyFlow.Nodes list Custom upstream flow nodes (breakers, transfer-switch outputs, Total, ...), keyed by a stable id.
EnergyFlow.Nodes[].Id string Stable unique id used to wire parents/children.
EnergyFlow.Nodes[].Label string Human-readable label shown in the flow diagram.
EnergyFlow.Nodes[].Kind one of node, panel, breaker, inverter, battery, solar, grid, load node What this node represents: 'node' (generic), 'panel', 'breaker' (a circuit that feeds other nodes), 'inverter', 'battery', 'solar', 'grid', or 'load' (where power is used, so it feeds nothing). Drives styling and the fields the editor offers.
EnergyFlow.Nodes[].Value double Optional fixed value for a leaf node. Used only when no live source has reported for it.
EnergyFlow.Nodes[].Max double Full-scale value for this node's gauge, in the metric's canonical unit (W for power). For example a PV array's peak output. Leave blank to show the plain reading instead — no ceiling is ever guessed.
EnergyFlow.Nodes[].Tags list Free-form tags for filtering the diagram and the energy views — e.g. 'critical', 'rack-1', 'upstairs'. A tag never changes a reading, only what a view shows.
EnergyFlow.Nodes[].Location string The id of the room, area, floor or site this node is in. Its own consumption counts toward that place.
EnergyFlow.Nodes[].Circuit string The circuit this node is plugged into, as the panel id and breaker number: 'main_panel/B06'. A circuit then shows it among its metered devices and reports what is left unmetered.
EnergyFlow.Nodes[].EmonCmsTag string EmonCMS tag this node's feeds are filed under. Blank uses EmonCMS.Feeds.Tag. Placeholders: , , .
EnergyFlow.Nodes[].EmonCmsVirtualTag string EmonCMS tag this node's virtual feeds are filed under. Blank uses EmonCMS.Feeds.Virtual.Tag. Placeholders: , , .
EnergyFlow.Nodes[].StorageKwh double For a battery node: usable storage capacity in kWh (display metadata; optional).
EnergyFlow.Nodes[].Mode one of auto, static, residual, untracked, none auto How to value this node when it has no direct measurement: 'auto' (aggregate children; carries unmet demand only when it is the single path into a node — never splits a load between several unmeasured feeders), 'static' (a fixed leaf at Value), 'residual' (the designated absorber of what its target still needs — this is how you say where unaccounted power comes from), 'untracked' (show a measured parent's unaccounted consumption), or 'none' (never inferred). A live source always wins.
EnergyFlow.Nodes[].Sources list Live value bindings for this node, one per metric. Each binds a metric to an external source (Type 'mqtt' today). Supersedes Value.
EnergyFlow.Nodes[].Sources[].Type one of mqtt, modbus, emoncms, homeassistant, derived mqtt Where this value comes from: 'mqtt' (subscribe to a broker topic), 'modbus' (read a register from a Modbus TCP connection), 'emoncms' (read an EmonCMS feed's current value), 'homeassistant' (read an entity's state), or 'derived' (work it out from this node's other readings — current as power ÷ voltage, for a meter that reports watts and volts but no amps).
EnergyFlow.Nodes[].Sources[].Metric one of realpower, apparentpower, energy, current, voltage, frequency, powerfactor, soc, percent, temperature realpower Which measurement this source supplies. The power, energy and current of a node are rolled up through the hierarchy; the rest — voltage, frequency, power factor, state of charge, any other percentage, temperature — are read at the node and shown, never summed.
EnergyFlow.Nodes[].Sources[].Accumulation one of lifetime, period lifetime Whether this counter runs forever or restarts each day: 'lifetime' (default — a cumulative total whose rise is measured) or 'period' (the device resets it daily, so the reading already is today's total). Only meaningful for energy. Check the topic before choosing: a publisher can offer both kinds, and firmware changes which. A daily counter tagged 'lifetime' is read as a meter running backwards every midnight and stops being published; a lifetime counter tagged 'period' is republished every poll as if that whole total were today's.
EnergyFlow.Nodes[].Sources[].Direction one of out, in, split out Which way energy flows for this source, relative to the node: 'out' (default — battery discharge, grid import, solar production), 'in' (battery charge, grid export), or 'split' — one signed value fanned into both directions, positive as out and the magnitude of negative as in (for a single ± power/current topic or register). Only meaningful for directional metrics (realpower, apparentpower, current, energy); ignored for voltage/frequency/powerfactor/soc.
EnergyFlow.Nodes[].Sources[].Unit string Unit the source publishes in (e.g. kW, Wh, mV). Converted to the metric's canonical unit (W, kWh, V, …) on ingest. Blank = already canonical.
EnergyFlow.Nodes[].Sources[].Topic string For Type 'mqtt': the topic carrying this value, e.g. 'solar_assistant/inverter_1/pv_power/state'. Subscribed on the configured broker.
EnergyFlow.Nodes[].Sources[].JsonField string For JSON payloads, the field to read (dotted for nesting, e.g. 'battery.power'). Blank = the whole payload is the number.
EnergyFlow.Nodes[].Sources[].Scale double 1 Multiplier applied to the received value — for unit conversion, e.g. 0.001 to turn W into kW, or -1 to flip a sign convention.
EnergyFlow.Nodes[].Sources[].StaleAfterSeconds int 900 Ignore the last value once it is this old, so a dead publisher stops silently propping up the flow. 0 disables the check (value never expires). Range 0–86400.
EnergyFlow.Nodes[].Sources[].Connection string For Type 'modbus': the id of the Modbus connection (from the Modbus section) to read from.
EnergyFlow.Nodes[].Sources[].Register int For Type 'modbus': the register address to read (0-based).
EnergyFlow.Nodes[].Sources[].RegisterType one of holding, input holding For Type 'modbus': which register bank — 'holding' (function 3) or 'input' (function 4).
EnergyFlow.Nodes[].Sources[].DataType one of uint16, int16, uint32, int32, float32 uint16 For Type 'modbus': how to decode the register(s) — uint16, int16, uint32, int32, or float32.
EnergyFlow.Nodes[].Sources[].WordOrder one of big, little big For Type 'modbus' 32-bit values: word order — 'big' (ABCD, high word first) or 'little' (CDAB, word-swapped).
EnergyFlow.Nodes[].Sources[].Feed string For Type 'emoncms': the feed to read — its numeric id (e.g. 945), or its name (e.g. '1_power'). Qualify a name with its tag as 'tag/name' when the same name exists under several tags.
EnergyFlow.Nodes[].Sources[].Settings map Extra settings for a plugin-supplied source type. The built-in mqtt and modbus types use the fields above instead.
EnergyFlow.Nodes[].Mqtt list Deprecated: use Sources. Legacy MQTT bindings (implicitly Type 'mqtt'); still honored for back-compat.
EnergyFlow.Nodes[].Mqtt[].Type one of mqtt, modbus, emoncms, homeassistant, derived mqtt Where this value comes from: 'mqtt' (subscribe to a broker topic), 'modbus' (read a register from a Modbus TCP connection), 'emoncms' (read an EmonCMS feed's current value), 'homeassistant' (read an entity's state), or 'derived' (work it out from this node's other readings — current as power ÷ voltage, for a meter that reports watts and volts but no amps).
EnergyFlow.Nodes[].Mqtt[].Metric one of realpower, apparentpower, energy, current, voltage, frequency, powerfactor, soc, percent, temperature realpower Which measurement this source supplies. The power, energy and current of a node are rolled up through the hierarchy; the rest — voltage, frequency, power factor, state of charge, any other percentage, temperature — are read at the node and shown, never summed.
EnergyFlow.Nodes[].Mqtt[].Accumulation one of lifetime, period lifetime Whether this counter runs forever or restarts each day: 'lifetime' (default — a cumulative total whose rise is measured) or 'period' (the device resets it daily, so the reading already is today's total). Only meaningful for energy. Check the topic before choosing: a publisher can offer both kinds, and firmware changes which. A daily counter tagged 'lifetime' is read as a meter running backwards every midnight and stops being published; a lifetime counter tagged 'period' is republished every poll as if that whole total were today's.
EnergyFlow.Nodes[].Mqtt[].Direction one of out, in, split out Which way energy flows for this source, relative to the node: 'out' (default — battery discharge, grid import, solar production), 'in' (battery charge, grid export), or 'split' — one signed value fanned into both directions, positive as out and the magnitude of negative as in (for a single ± power/current topic or register). Only meaningful for directional metrics (realpower, apparentpower, current, energy); ignored for voltage/frequency/powerfactor/soc.
EnergyFlow.Nodes[].Mqtt[].Unit string Unit the source publishes in (e.g. kW, Wh, mV). Converted to the metric's canonical unit (W, kWh, V, …) on ingest. Blank = already canonical.
EnergyFlow.Nodes[].Mqtt[].Topic string For Type 'mqtt': the topic carrying this value, e.g. 'solar_assistant/inverter_1/pv_power/state'. Subscribed on the configured broker.
EnergyFlow.Nodes[].Mqtt[].JsonField string For JSON payloads, the field to read (dotted for nesting, e.g. 'battery.power'). Blank = the whole payload is the number.
EnergyFlow.Nodes[].Mqtt[].Scale double 1 Multiplier applied to the received value — for unit conversion, e.g. 0.001 to turn W into kW, or -1 to flip a sign convention.
EnergyFlow.Nodes[].Mqtt[].StaleAfterSeconds int 900 Ignore the last value once it is this old, so a dead publisher stops silently propping up the flow. 0 disables the check (value never expires). Range 0–86400.
EnergyFlow.Nodes[].Mqtt[].Connection string For Type 'modbus': the id of the Modbus connection (from the Modbus section) to read from.
EnergyFlow.Nodes[].Mqtt[].Register int For Type 'modbus': the register address to read (0-based).
EnergyFlow.Nodes[].Mqtt[].RegisterType one of holding, input holding For Type 'modbus': which register bank — 'holding' (function 3) or 'input' (function 4).
EnergyFlow.Nodes[].Mqtt[].DataType one of uint16, int16, uint32, int32, float32 uint16 For Type 'modbus': how to decode the register(s) — uint16, int16, uint32, int32, or float32.
EnergyFlow.Nodes[].Mqtt[].WordOrder one of big, little big For Type 'modbus' 32-bit values: word order — 'big' (ABCD, high word first) or 'little' (CDAB, word-swapped).
EnergyFlow.Nodes[].Mqtt[].Feed string For Type 'emoncms': the feed to read — its numeric id (e.g. 945), or its name (e.g. '1_power'). Qualify a name with its tag as 'tag/name' when the same name exists under several tags.
EnergyFlow.Nodes[].Mqtt[].Settings map Extra settings for a plugin-supplied source type. The built-in mqtt and modbus types use the fields above instead.
EnergyFlow.Links list Directed energy-flow links (From feeds To). Allows multiple feeders per node and producer inputs.
EnergyFlow.Links[].From string Source node id — energy flows out of here.
EnergyFlow.Links[].To string Target node id — energy flows into here.
EnergyFlow.AutoTags list Tags for derived nodes (PDUs and outlets), which have no entry of their own to carry them. Matched by node id with '' as a wildcard, e.g. 'outlet:rack_pdu_1:'.
EnergyFlow.AutoTags[].Match string Node id to match, with '' matching any run of characters. e.g. 'outlet:rack_pdu_1:' for every outlet on that PDU, 'pdu:*' for every PDU, or a single outlet's full id.
EnergyFlow.AutoTags[].Tags list Tags to apply to every node the pattern matches. A tag never changes a reading — only what a view shows and what the exports may carry.
EnergyFlow.Tags list Tags declared up front, each with what it is for. Optional — a tag typed onto a node works without being declared. Declaring one lets it exist before anything carries it, and gives it a description.
EnergyFlow.Tags[].Name string The tag itself, as it is written on a node, a rule or a destination filter.
EnergyFlow.Tags[].Description string What this tag is for, in your own words. Shown wherever the tag is listed.
EnergyFlow.Groups list Named groups of nodes shown as one collapsible node on the flow graphs (e.g. three MPPTs as one 'Incoming PV'). Members keep their own links/exports; the group also exports its summed total.
EnergyFlow.Groups[].Id string Stable unique id for the group (used in the group's exported topic/metric).
EnergyFlow.Groups[].Label string Human-readable label shown on the flow diagram when the group is collapsed.
EnergyFlow.Groups[].Kind one of node, panel, breaker, inverter, battery, solar, grid, load node What the group represents, for diagram styling: 'node', 'panel', 'breaker', 'inverter', 'battery', 'solar', 'grid', or 'load'.
EnergyFlow.Groups[].Members list The ids of the member nodes this group aggregates.
EnergyFlow.Balance object Which nodes make up the site's Solar, Grid, Battery and Home totals on the energy pages, Trends and the Home Assistant Energy Dashboard. Each list is summed. Leave every list empty to total nodes by their kind instead.
EnergyFlow.Balance.Solar list Nodes whose output is solar production — a PV total, never the strings it is made of.
EnergyFlow.Balance.Grid list Nodes metering the grid connection: import out, export in.
EnergyFlow.Balance.Battery list Nodes metering battery banks: discharge out, charge in.
EnergyFlow.Balance.Home list Nodes whose reading is what the home used — an inverter's load output, a whole-house meter. Empty works it out from the other three.
EnergyFlow.Panels list Electrical panels and the breakers in their slots: breaker number, rating, wire label and what each one feeds, including the circuits nobody has identified yet.
EnergyFlow.Panels[].Id string Stable unique id for this panel, used to refer to it from elsewhere. For example 'main_panel'.
EnergyFlow.Panels[].Name string Human-readable name shown on the panel schedule. For example 'Main Panel'.
EnergyFlow.Panels[].Slots int 42 How many breaker positions the panel has, counting both columns. A 42-space panel has 42. Odd numbers fill the left column; even numbers the right, as they are stamped in the panel. Range 2–200.
EnergyFlow.Panels[].Node string The energy-flow node that is this panel. Its reading is the power coming into the panel, and a circuit mapped to one of these breakers is placed beneath it.
EnergyFlow.Panels[].Location string The id of the room, area or floor the panel is mounted in.
EnergyFlow.Panels[].Breakers list The breakers in this panel's slots.
EnergyFlow.Panels[].Breakers[].Slot int Which slot the breaker is in, numbered as the panel is: odd down the left column, even down the right. Range 1–200.
EnergyFlow.Panels[].Breakers[].Number string The breaker number as written in the directory. Usually the slot number; a tandem half is written like '26.1'.
EnergyFlow.Panels[].Breakers[].Poles int 1 1 for a single-pole breaker, 2 for a double-pole. A double-pole also occupies the next slot in the same column (slot + 2). Range 1–2.
EnergyFlow.Panels[].Breakers[].Half int For a tandem breaker, which half of the slot this is: 1 for the upper, 2 for the lower. Leave blank when the breaker has the whole slot. Range 1–2.
EnergyFlow.Panels[].Breakers[].Amps int The breaker's rating in amps, as stamped on its handle. Range 1–1000.
EnergyFlow.Panels[].Breakers[].Wire string The label on the wire leaving this breaker, for example 'W11'. What the wire carries is mapped separately.
EnergyFlow.Panels[].Breakers[].Description string What this breaker feeds, in the words the directory uses. For example 'Lights, Garage, Kitchen'.
EnergyFlow.Panels[].Breakers[].Gauge string The wire's gauge, as written on the cable — for example '12 AWG THWN' or '6 AWG'. Free text: the rating that matters is the breaker's, and the gauge is what says whether the wire can carry it.
EnergyFlow.Panels[].Breakers[].Conductor one of copper, aluminium What the wire is made of. Aluminium carries less for the same gauge, so a run sized in copper is not the same run in aluminium.
EnergyFlow.Panels[].Breakers[].Rooms list The ids of the rooms and areas this breaker's circuit serves. A circuit serving several rooms lists each; its power then counts toward the smallest place holding all of them.
EnergyFlow.Panels[].Breakers[].Node string The energy-flow node that is this circuit. Blank uses the channel measuring it, when a single channel does.
EnergyFlow.Panels[].Breakers[].State one of identified, unknown, unused unknown Whether this breaker is identified, not yet identified (the '????' rows of a paper directory), or an unused slot. A new breaker starts unknown, so a blank row claims nothing.
EnergyFlow.Clamps list CT clamps: which breaker's wire each one is on, the monitor channel it is plugged into, its rating, and whether it is on backwards.
EnergyFlow.Clamps[].Label string The label written on the clamp, if it has one. Used to refer to this clamp from elsewhere.
EnergyFlow.Clamps[].Amps int The clamp's rating in amps, as printed on it. For example 50 or 100. Range 1–1000.
EnergyFlow.Clamps[].Panel string The id of the panel holding the breaker this clamp measures.
EnergyFlow.Clamps[].Breaker string The breaker number this clamp measures, as written in the directory. A tandem half is written like '26.1'.
EnergyFlow.Clamps[].Leg int 1 Which leg of the breaker this clamp is on: 1 for a single-pole breaker, 1 or 2 for the two poles of a double-pole. Both legs need a clamp before the breaker's power is known. Range 1–2.
EnergyFlow.Clamps[].Wire string The label on the wire this clamp sits on, for example 'W11'. Blank means the breaker's own wire.
EnergyFlow.Clamps[].Channel string The monitor channel this clamp is plugged into, given as the node id the bridge already reads — for example 'n30_1_5'.
EnergyFlow.Clamps[].Whole bool false Tick when this single clamp measures the whole breaker rather than one leg — one CT on a 240 V circuit, where the monitor already accounts for both legs. Without it, a double-pole breaker needs a clamp on each leg before its power is known.
EnergyFlow.Clamps[].Reversed bool false Tick when the clamp is on the wire backwards, so it reads negative. Its reading is flipped rather than taken as a negative load.
EnergyFlow.Sites list Where things are: sites, their floors, and the rooms and areas on each floor. Energy rolls up room → floor → site alongside the electrical hierarchy.
EnergyFlow.Sites[].Id string Stable unique id for this site, used to refer to it from elsewhere. For example 'home'. Ids are shared by sites, floors, rooms and areas, so each must be unique across all of them.
EnergyFlow.Sites[].Name string Human-readable name, for example 'Home'.
EnergyFlow.Sites[].Floors list The floors of this site.
EnergyFlow.Sites[].Floors[].Id string Stable unique id for this floor, for example 'ground'.
EnergyFlow.Sites[].Floors[].Name string Human-readable name, for example 'Ground floor'.
EnergyFlow.Sites[].Floors[].Level int 0 Where this floor sits in the building: 0 for the ground floor, 1 for the one above, -1 for a basement. Floors are listed in this order.
EnergyFlow.Sites[].Floors[].Image string The id of the uploaded floor plan image drawn behind this floor. Images are kept in plan storage, never in the configuration. Blank shows a grid.
EnergyFlow.Sites[].Floors[].Width double 1000 Width of the plan in drawing units. Room outlines are given in these units, with 0,0 at the top left. Set from the image's proportions when one is uploaded. Range 100–100000.
EnergyFlow.Sites[].Floors[].Height double 700 Height of the plan in drawing units. Range 100–100000.
EnergyFlow.Sites[].Floors[].Scale double 100 Drawing units per metre. 100 makes one unit a centimetre. Set it by measuring a known distance on the plan, so room sizes read in feet or metres. Range 1–100000.
EnergyFlow.Sites[].Floors[].ImageOpacity double 0.85 How strongly the plan image shows behind the drawing, from 0 (hidden) to 1.
EnergyFlow.Sites[].Floors[].Ground one of grass, concrete, gravel, dirt, pavers, snow What the ground around the rooms looks like: grass, concrete, gravel, dirt, pavers or snow. Blank is plain paper.
EnergyFlow.Sites[].Floors[].Rooms list The rooms on this floor.
EnergyFlow.Sites[].Floors[].Rooms[].Id string Stable unique id for this room, for example 'kitchen'.
EnergyFlow.Sites[].Floors[].Rooms[].Name string Human-readable name, for example 'Kitchen'. Also the name of its Home Assistant area.
EnergyFlow.Sites[].Floors[].Rooms[].Shape list The room's outline on the plan, as points in drawing units. Empty until the room is drawn.
EnergyFlow.Sites[].Floors[].Rooms[].Shape[].X double
EnergyFlow.Sites[].Floors[].Rooms[].Shape[].Y double
EnergyFlow.Sites[].Floors[].Rooms[].Outdoor bool false An outdoor zone rather than a room: a yard, porch, patio, driveway or deck. Drawn as ground, not walls.
EnergyFlow.Sites[].Floors[].Rooms[].Surface one of wood, tile, carpet, concrete, stone, grass, gravel, dirt, deck, pavers, water, snow, stairs The floor or ground inside it: wood, tile, carpet, concrete, stone, grass, gravel, dirt, deck, pavers, water, snow, or stairs for a stairwell. Blank is plain.
EnergyFlow.Sites[].Floors[].Rooms[].SurfaceColor string The surface's colour, like #7a5c3e: the carpet, the tile, the paint. Blank uses the surface's own. With a plain surface it fills the room.
EnergyFlow.Sites[].Floors[].Rooms[].Locked bool false Lock the room: it cannot be moved, reshaped or deleted until it is unlocked.
EnergyFlow.Sites[].Floors[].Rooms[].LockedWalls list Walls that are locked in place, by number: wall n runs from corner n to the next.
EnergyFlow.Sites[].Floors[].Rooms[].HaArea string The Home Assistant area this room was linked to, by area id. Written when rooms are published to Home Assistant, so a rename updates the same area.
EnergyFlow.Sites[].Floors[].Areas list Areas on this floor. An area can span several rooms, such as 'upstairs' or 'server corner', and may overlap them.
EnergyFlow.Sites[].Floors[].Areas[].Id string Stable unique id for this area, for example 'server_corner'.
EnergyFlow.Sites[].Floors[].Areas[].Name string Human-readable name, for example 'Server corner'.
EnergyFlow.Sites[].Floors[].Areas[].Rooms list The ids of the rooms this area takes in. Everything in those rooms counts toward the area as well.
EnergyFlow.Sites[].Floors[].Areas[].Shape list The area's outline on the plan, as points in drawing units. Optional: an area made of whole rooms needs no outline of its own.
EnergyFlow.Sites[].Floors[].Areas[].Shape[].X double
EnergyFlow.Sites[].Floors[].Areas[].Shape[].Y double
EnergyFlow.Sites[].Floors[].Areas[].Locked bool false Lock the area's outline: it cannot be moved, reshaped or deleted until it is unlocked.
EnergyFlow.Sites[].Floors[].Openings list Doors, windows and openings in the walls on this floor.
EnergyFlow.Sites[].Floors[].Openings[].Id string Stable unique id for this opening.
EnergyFlow.Sites[].Floors[].Openings[].Kind one of door, double-door, sliding-door, garage-door, window, opening door A door, double door, sliding door, garage door, window, or a plain opening.
EnergyFlow.Sites[].Floors[].Openings[].X double Centre of the opening across the plan, in drawing units.
EnergyFlow.Sites[].Floors[].Openings[].Y double Centre of the opening down the plan, in drawing units.
EnergyFlow.Sites[].Floors[].Openings[].Angle double The direction of the wall it sits in, in degrees clockwise from pointing right.
EnergyFlow.Sites[].Floors[].Openings[].Width double How wide the opening is, in drawing units.
EnergyFlow.Sites[].Floors[].Openings[].Swing one of left, right left Which end of a door the hinges are at.
EnergyFlow.Sites[].Floors[].Openings[].Flip bool false Swing the door to the other side of the wall.
EnergyFlow.Sites[].Floors[].Constraints list Geometric constraints between the corners and walls of this floor's rooms and areas: coincident, colinear, parallel, perpendicular, horizontal, vertical, a fixed angle or a fixed length. Kept as the plan is edited.
EnergyFlow.Sites[].Floors[].Constraints[].Id string Stable unique id for this constraint.
EnergyFlow.Sites[].Floors[].Constraints[].Kind one of coincident, colinear, parallel, perpendicular, horizontal, vertical, angle, length Coincident (two corners), colinear, parallel or perpendicular (two walls), horizontal or vertical (a wall), angle (a corner) or length (a wall).
EnergyFlow.Sites[].Floors[].Constraints[].Refs list The corners or walls it holds, each a room or area id with a corner or wall number counted from 0.
EnergyFlow.Sites[].Floors[].Constraints[].Refs[].Room string The id of the room or area.
EnergyFlow.Sites[].Floors[].Constraints[].Refs[].Corner int The corner, counted from 0 in the outline. Blank when this refers to a wall.
EnergyFlow.Sites[].Floors[].Constraints[].Refs[].Edge int The wall, counted from 0: wall n runs from corner n to the next. Blank when this refers to a corner.
EnergyFlow.Sites[].Floors[].Constraints[].Value double For a length, in drawing units; for an angle, in degrees, signed the way the outline turns at that corner.
EnergyFlow.Placements list Outlets, switches, fixtures, appliances and devices placed on the floor plans, each with its room and the circuit feeding it.
EnergyFlow.Placements[].Id string Stable unique id for this item.
EnergyFlow.Placements[].Kind one of outlet, switch, fixture, appliance, device, fan, hvac, ev-charger, junction, panel, meter, pole, transformer, solar, battery, inverter, generator outlet What this is: an outlet, switch, light fixture, fan, appliance, device, HVAC unit, EV charger, junction box, electrical panel, utility meter, utility pole, transformer, solar array, battery, inverter or generator.
EnergyFlow.Placements[].Label string What it is called, for example 'Fridge' or 'Desk outlet'.
EnergyFlow.Placements[].Room string The id of the room or outdoor zone it is in. Blank when it is outdoors, or anywhere not drawn as a room.
EnergyFlow.Placements[].Floor string The id of the floor it is drawn on. Needed for anything outside every room.
EnergyFlow.Placements[].Width double For an item drawn at its real size — a washer, a fridge, an AC condenser — its width, in drawing units. Blank draws it as an icon.
EnergyFlow.Placements[].Depth double Its depth, front to back, in drawing units.
EnergyFlow.Placements[].Rotation double How far it is turned, in degrees clockwise. Its front faces down the plan at 0.
EnergyFlow.Placements[].Footprint string What appliance it is drawn as, seen from above: washer, dryer, fridge, freezer, range, dishwasher, water-heater, furnace, condenser, rack or hot-tub. Blank draws a plain box.
EnergyFlow.Placements[].Round bool false Drawn round rather than square, such as a water heater; Width is its diameter.
EnergyFlow.Placements[].Gfci bool false A GFCI outlet: everything wired downstream of it, from its load terminals, is protected by it.
EnergyFlow.Placements[].Facing double For an item mounted on a wall, the direction it faces into its room, in degrees clockwise from pointing right. Blank when it stands free.
EnergyFlow.Placements[].Panel string For an electrical panel placed on the plan, the id of the panel in the panel schedule.
EnergyFlow.Placements[].X double Where it is on the floor plan, across, in drawing units.
EnergyFlow.Placements[].Y double Where it is on the floor plan, down, in drawing units.
EnergyFlow.Placements[].Circuit string The circuit feeding it, as the panel id and breaker number: 'main_panel/B06'. Blank when nobody knows which breaker it is on.
EnergyFlow.Placements[].Node string The energy-flow node metering it, when it is individually metered — a smart plug, an ESPHome sensor, a PDU outlet.
EnergyFlow.Runs list Cable runs drawn on the floor plans: branch circuits, feeders and the utility service, each between placed items.
EnergyFlow.Runs[].Id string Stable unique id for this run.
EnergyFlow.Runs[].Kind one of circuit, feeder, service circuit A branch circuit, a feeder between panels, or the utility service.
EnergyFlow.Runs[].Floor string The id of the floor it is drawn on.
EnergyFlow.Runs[].Circuit string The circuit it carries, as the panel id and breaker number: 'main_panel/B06'. Blank when it is not known.
EnergyFlow.Runs[].From string The placed item it starts at, on the supply side: runs are drawn from the panel outward, so what is downstream of an item is what its runs lead to. Blank when it starts at a bare point.
EnergyFlow.Runs[].To string The placed item it ends at. Blank when it ends at a bare point.
EnergyFlow.Runs[].Points list The path between its ends, in drawing units: bends and, where an end is not an item, the end itself.
EnergyFlow.Runs[].Points[].X double
EnergyFlow.Runs[].Points[].Y double
EnergyFlow.Runs[].Label string A note on the run, for example 'through the attic'.
EnergyFlow.AutoLocations list Locations for derived nodes (PDUs and outlets), which have no entry of their own. Matched by node id with '*' as a wildcard; the first match wins, and an exact id beats a pattern.
EnergyFlow.AutoLocations[].Match string Node id to match, with '' matching any run of characters. For example 'outlet:rack_pdu_1:' for every outlet on that PDU.
EnergyFlow.AutoLocations[].Location string The id of the room, area, floor or site the matching nodes are in.
EnergyFlow.Parents map Legacy single-feeder map (child id -> parent id). Prefer Links; still honored for back-compat.
EnergyFlow.InferFromConservation bool true Work out an unmeasured node's value from what it feeds, when exactly one path could have supplied it. Sound arithmetic, but it describes the hierarchy you drew rather than anything measured — so results are always labelled 'inferred'. Turn it off to show 'no data' instead.
EnergyFlow.MqttExport bool false Publish each energy-hierarchy tier's rolled-up value to MQTT every poll.
EnergyFlow.MqttExportTags object Limit the MQTT export to nodes with particular tags. Empty exports every node. Filtering changes only what is sent — never a value, and never any other destination.
EnergyFlow.MqttExportTags.Include list Only send nodes carrying at least one of these tags. Empty sends every node.
EnergyFlow.MqttExportTags.Exclude list Never send nodes carrying any of these tags. Takes precedence over Include.
EnergyFlow.MqttTopicTemplate string {parent}/energyflow/{id} Template for each tier's MQTT topic. Placeholders: (MQTT parent topic), , , , , . e.g. '/energyflow/'.