From 7ddd953bd6a037e77c2bb24b54d5d1444da12423 Mon Sep 17 00:00:00 2001 From: cayossarian <23534755+cayossarian@users.noreply.github.com> Date: Tue, 6 Oct 2026 11:09:02 -0700 Subject: [PATCH 01/95] test(emitter): pin the r202639 conventions and islanding rule the next ebus-panel-sim brings The next ebus-panel-sim changes four things a PanelBench panel publishes, and each is now pinned by a test: - the built-in shed/asserted-islanding-state handler ignores an assertion while every battery link is healthy; - the BESS meter/active-power sign and the EVSE config/user-max-charge-current preset follow the panel's firmware-version either side of SPAN release 202639; - a panel without a battery publishes no shed or shed-forecast node. Shared clone-and-capture helpers live in tests/_helpers.py for later tests. golden_wire.json is re-recorded with scripts/capture-wire.py. Beyond noisy power values and $description version timestamps, both EVSEs drop config/user-max-charge-current and declare its $format as 6:32, and the BESS meter is now the negative of power-flows/battery. golden_tree.json is derived from that wire capture, by feeding its $description documents through check-conformance.py --from-stdin, rather than from a broker session, as 2dc76f1 did; golden_report.json is regenerated from it. The tree moves only by the two EVSE $format values, and the report's counts, observations, violations and omissions are unchanged, since `config` is not a specification capability. The unvalued-by-both baseline gains both EVSEs' config/user-max-charge-current. The upstream CHANGELOG states it: "`config/user-max-charge-current` is unpublished until a user sets it." Both producers read the config's sim/v0.1.0, which names no release, so both publish the current convention. --- CHANGELOG.md | 11 + tests/_helpers.py | 61 +++++ tests/conformance/fixtures/golden_report.json | 232 +++++++++--------- tests/conformance/fixtures/golden_tree.json | 206 ++++++++-------- tests/conformance/fixtures/golden_wire.json | 198 ++++++++------- .../test_firmware_conventions.py | 72 ++++++ .../test_islanding_assertion.py | 36 +++ .../test_shed_requires_a_battery.py | 43 ++++ .../fixtures/unvalued_by_both_baseline.json | 2 + tests/fidelity/test_declared_but_unvalued.py | 8 +- 10 files changed, 550 insertions(+), 319 deletions(-) create mode 100644 tests/_helpers.py create mode 100644 tests/emitter_adapter/test_firmware_conventions.py create mode 100644 tests/emitter_adapter/test_islanding_assertion.py create mode 100644 tests/emitter_adapter/test_shed_requires_a_battery.py diff --git a/CHANGELOG.md b/CHANGELOG.md index 26c38a5..8dcc91d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,16 @@ # Changelog +## Unreleased + +### Changed + +- **Home Assistant's dominant power source control is now ignored while the panel's link to its battery is healthy**, as a SPAN panel ignores it. +- **The battery's own power reading is now positive while discharging**, as SPAN firmware r202639 publishes it, unless the panel's firmware version names an + earlier release. +- **A SPAN Drive's user charge limit is no longer published until a user sets one**, as on SPAN firmware r202639, unless the panel's firmware version names an + earlier release. +- **A panel without a battery no longer publishes load-shed state**, as the eBus specification requires. + ## 2.5.3 — two simulated panels no longer publish over each other **A simulated panel already added to Home Assistant has to be removed and re-added**, because its circuits get new device ids and so its circuit entities get diff --git a/tests/_helpers.py b/tests/_helpers.py new file mode 100644 index 0000000..d71325b --- /dev/null +++ b/tests/_helpers.py @@ -0,0 +1,61 @@ +"""What the tests that run a panel through the emitter share. + +A panel here is the shipped default config, optionally modified and written to a +temporary file, built through `start_clone` with a `RecordingTransport` in place +of the MQTT client. That is the assembly a real panel goes through, so what the +recorder holds is what a consumer would replay from the broker. +""" + +from __future__ import annotations + +from pathlib import Path +from typing import TYPE_CHECKING, Final + +import yaml + +from panelbench.emitter_adapter import runtime as emitter_runtime +from panelbench.emitter_adapter.wire_capture import RecordingTransport +from panelbench.engine import DynamicSimulationEngine + +if TYPE_CHECKING: + from collections.abc import Mapping + + from panelbench.config_types import SimulationConfig + from panelbench.emitter_adapter.runtime import CloneRuntime + +DEFAULT_CONFIG: Final = Path(__file__).resolve().parents[1] / "configs" / "default_MAIN_40.yaml" + +# SPAN firmware strings either side of release 202639, where the BESS meter's sign +# and the EVSE user limit's publication changed. +EARLIER_FIRMWARE: Final = "spanos2/r202633/02" +CURRENT_FIRMWARE: Final = "spanos2/r202639/01" + + +def default_config() -> SimulationConfig: + """A fresh copy of the shipped default config, to modify and then write.""" + config: SimulationConfig = yaml.safe_load(DEFAULT_CONFIG.read_text(encoding="utf-8")) + return config + + +def write_config(path: Path, config: Mapping[str, object]) -> Path: + """Write *config* to *path* as YAML and return *path*.""" + path.write_text(yaml.safe_dump(dict(config), sort_keys=False), encoding="utf-8") + return path + + +async def clone(config: Path) -> tuple[CloneRuntime, RecordingTransport]: + """The panel *config* describes, started and publishing into a recorder. + + Nothing has ticked yet: the recorder holds the tree and its descriptions, and + the first `publish_tick` fills in the values. + """ + engine = DynamicSimulationEngine(config_path=config) + await engine.initialize_async() + recorder = RecordingTransport() + runtime = await emitter_runtime.start_clone(engine, transport=recorder) + return runtime, recorder + + +def published(recorder: RecordingTransport, device_id: str, path: str) -> str: + """The retained value of *device_id*'s property at *path*.""" + return recorder.retained[f"ebus/5/{device_id}/{path}"].decode() diff --git a/tests/conformance/fixtures/golden_report.json b/tests/conformance/fixtures/golden_report.json index ee333be..d6f52a7 100644 --- a/tests/conformance/fixtures/golden_report.json +++ b/tests/conformance/fixtures/golden_report.json @@ -10,271 +10,271 @@ "observations": [ { "bucket": "extension", - "device": "df5d74733e435d53be69ee9edbbda675", + "device": "09a79266163d540c862d5efbe8ef67d3", "message": "property 'name' is not in catalog energy.ebus.capability.info; published as an extension, which the specification permits", "node": "info", - "path": "df5d74733e435d53be69ee9edbbda675/info/name", + "path": "09a79266163d540c862d5efbe8ef67d3/info/name", "property": "name", "rule": "O6" }, { "bucket": "extension", - "device": "df5d74733e435d53be69ee9edbbda675", + "device": "09a79266163d540c862d5efbe8ef67d3", "message": "property 'spaces' is not in catalog energy.ebus.capability.info; published as an extension, which the specification permits", "node": "info", - "path": "df5d74733e435d53be69ee9edbbda675/info/spaces", + "path": "09a79266163d540c862d5efbe8ef67d3/info/spaces", "property": "spaces", "rule": "O6" }, { "bucket": "extension", - "device": "a83191fcac585bda9d6fe05ca79b8a4f", + "device": "0c941ad4041050cc830e740ddddb2f23", "message": "property 'name' is not in catalog energy.ebus.capability.info; published as an extension, which the specification permits", "node": "info", - "path": "a83191fcac585bda9d6fe05ca79b8a4f/info/name", + "path": "0c941ad4041050cc830e740ddddb2f23/info/name", "property": "name", "rule": "O6" }, { "bucket": "extension", - "device": "a83191fcac585bda9d6fe05ca79b8a4f", + "device": "0c941ad4041050cc830e740ddddb2f23", "message": "property 'spaces' is not in catalog energy.ebus.capability.info; published as an extension, which the specification permits", "node": "info", - "path": "a83191fcac585bda9d6fe05ca79b8a4f/info/spaces", + "path": "0c941ad4041050cc830e740ddddb2f23/info/spaces", "property": "spaces", "rule": "O6" }, { "bucket": "extension", - "device": "f482dc963f2654de922bfd1a40d30ee0", + "device": "14c507fcbb5f539ba40b60b5e5655a72", "message": "property 'name' is not in catalog energy.ebus.capability.info; published as an extension, which the specification permits", "node": "info", - "path": "f482dc963f2654de922bfd1a40d30ee0/info/name", + "path": "14c507fcbb5f539ba40b60b5e5655a72/info/name", "property": "name", "rule": "O6" }, { "bucket": "extension", - "device": "f482dc963f2654de922bfd1a40d30ee0", + "device": "14c507fcbb5f539ba40b60b5e5655a72", "message": "property 'spaces' is not in catalog energy.ebus.capability.info; published as an extension, which the specification permits", "node": "info", - "path": "f482dc963f2654de922bfd1a40d30ee0/info/spaces", + "path": "14c507fcbb5f539ba40b60b5e5655a72/info/spaces", "property": "spaces", "rule": "O6" }, { "bucket": "extension", - "device": "51ab52ca7e085204bd300a35731c1501", + "device": "17e98544c51a59d98331dd263df2abe1", "message": "property 'name' is not in catalog energy.ebus.capability.info; published as an extension, which the specification permits", "node": "info", - "path": "51ab52ca7e085204bd300a35731c1501/info/name", + "path": "17e98544c51a59d98331dd263df2abe1/info/name", "property": "name", "rule": "O6" }, { "bucket": "extension", - "device": "51ab52ca7e085204bd300a35731c1501", + "device": "17e98544c51a59d98331dd263df2abe1", "message": "property 'spaces' is not in catalog energy.ebus.capability.info; published as an extension, which the specification permits", "node": "info", - "path": "51ab52ca7e085204bd300a35731c1501/info/spaces", + "path": "17e98544c51a59d98331dd263df2abe1/info/spaces", "property": "spaces", "rule": "O6" }, { "bucket": "extension", - "device": "9c22d40aa8f25a82bf22e62aa1891c4b", + "device": "3feb088e635f50bcad1ad38c9e79f82c", "message": "property 'name' is not in catalog energy.ebus.capability.info; published as an extension, which the specification permits", "node": "info", - "path": "9c22d40aa8f25a82bf22e62aa1891c4b/info/name", + "path": "3feb088e635f50bcad1ad38c9e79f82c/info/name", "property": "name", "rule": "O6" }, { "bucket": "extension", - "device": "9c22d40aa8f25a82bf22e62aa1891c4b", + "device": "3feb088e635f50bcad1ad38c9e79f82c", "message": "property 'spaces' is not in catalog energy.ebus.capability.info; published as an extension, which the specification permits", "node": "info", - "path": "9c22d40aa8f25a82bf22e62aa1891c4b/info/spaces", + "path": "3feb088e635f50bcad1ad38c9e79f82c/info/spaces", "property": "spaces", "rule": "O6" }, { "bucket": "extension", - "device": "72b4343c886e5c98bca64a131b6003ce", + "device": "51ab52ca7e085204bd300a35731c1501", "message": "property 'name' is not in catalog energy.ebus.capability.info; published as an extension, which the specification permits", "node": "info", - "path": "72b4343c886e5c98bca64a131b6003ce/info/name", + "path": "51ab52ca7e085204bd300a35731c1501/info/name", "property": "name", "rule": "O6" }, { "bucket": "extension", - "device": "72b4343c886e5c98bca64a131b6003ce", + "device": "51ab52ca7e085204bd300a35731c1501", "message": "property 'spaces' is not in catalog energy.ebus.capability.info; published as an extension, which the specification permits", "node": "info", - "path": "72b4343c886e5c98bca64a131b6003ce/info/spaces", + "path": "51ab52ca7e085204bd300a35731c1501/info/spaces", "property": "spaces", "rule": "O6" }, { "bucket": "extension", - "device": "cafc279d283d567280deb2fce6be8438", + "device": "5239be04f4725708a6f37d750fd5b4ae", "message": "property 'name' is not in catalog energy.ebus.capability.info; published as an extension, which the specification permits", "node": "info", - "path": "cafc279d283d567280deb2fce6be8438/info/name", + "path": "5239be04f4725708a6f37d750fd5b4ae/info/name", "property": "name", "rule": "O6" }, { "bucket": "extension", - "device": "cafc279d283d567280deb2fce6be8438", + "device": "5239be04f4725708a6f37d750fd5b4ae", "message": "property 'spaces' is not in catalog energy.ebus.capability.info; published as an extension, which the specification permits", "node": "info", - "path": "cafc279d283d567280deb2fce6be8438/info/spaces", + "path": "5239be04f4725708a6f37d750fd5b4ae/info/spaces", "property": "spaces", "rule": "O6" }, { "bucket": "extension", - "device": "e87d68b509855856a61570c7a7d95c07", + "device": "68213a7c393f54918706bf62a3b92047", "message": "property 'name' is not in catalog energy.ebus.capability.info; published as an extension, which the specification permits", "node": "info", - "path": "e87d68b509855856a61570c7a7d95c07/info/name", + "path": "68213a7c393f54918706bf62a3b92047/info/name", "property": "name", "rule": "O6" }, { "bucket": "extension", - "device": "e87d68b509855856a61570c7a7d95c07", + "device": "68213a7c393f54918706bf62a3b92047", "message": "property 'spaces' is not in catalog energy.ebus.capability.info; published as an extension, which the specification permits", "node": "info", - "path": "e87d68b509855856a61570c7a7d95c07/info/spaces", + "path": "68213a7c393f54918706bf62a3b92047/info/spaces", "property": "spaces", "rule": "O6" }, { "bucket": "extension", - "device": "bc07adcee8ff5945a29c618a54bef7e6", + "device": "72b4343c886e5c98bca64a131b6003ce", "message": "property 'name' is not in catalog energy.ebus.capability.info; published as an extension, which the specification permits", "node": "info", - "path": "bc07adcee8ff5945a29c618a54bef7e6/info/name", + "path": "72b4343c886e5c98bca64a131b6003ce/info/name", "property": "name", "rule": "O6" }, { "bucket": "extension", - "device": "bc07adcee8ff5945a29c618a54bef7e6", + "device": "72b4343c886e5c98bca64a131b6003ce", "message": "property 'spaces' is not in catalog energy.ebus.capability.info; published as an extension, which the specification permits", "node": "info", - "path": "bc07adcee8ff5945a29c618a54bef7e6/info/spaces", + "path": "72b4343c886e5c98bca64a131b6003ce/info/spaces", "property": "spaces", "rule": "O6" }, { "bucket": "extension", - "device": "3feb088e635f50bcad1ad38c9e79f82c", + "device": "768f5f7afac95b09a32fa6b8ece84041", "message": "property 'name' is not in catalog energy.ebus.capability.info; published as an extension, which the specification permits", "node": "info", - "path": "3feb088e635f50bcad1ad38c9e79f82c/info/name", + "path": "768f5f7afac95b09a32fa6b8ece84041/info/name", "property": "name", "rule": "O6" }, { "bucket": "extension", - "device": "3feb088e635f50bcad1ad38c9e79f82c", + "device": "768f5f7afac95b09a32fa6b8ece84041", "message": "property 'spaces' is not in catalog energy.ebus.capability.info; published as an extension, which the specification permits", "node": "info", - "path": "3feb088e635f50bcad1ad38c9e79f82c/info/spaces", + "path": "768f5f7afac95b09a32fa6b8ece84041/info/spaces", "property": "spaces", "rule": "O6" }, { "bucket": "extension", - "device": "768f5f7afac95b09a32fa6b8ece84041", + "device": "780a20adb8045467aa6ae9c66d3fd7f0", "message": "property 'name' is not in catalog energy.ebus.capability.info; published as an extension, which the specification permits", "node": "info", - "path": "768f5f7afac95b09a32fa6b8ece84041/info/name", + "path": "780a20adb8045467aa6ae9c66d3fd7f0/info/name", "property": "name", "rule": "O6" }, { "bucket": "extension", - "device": "768f5f7afac95b09a32fa6b8ece84041", + "device": "780a20adb8045467aa6ae9c66d3fd7f0", "message": "property 'spaces' is not in catalog energy.ebus.capability.info; published as an extension, which the specification permits", "node": "info", - "path": "768f5f7afac95b09a32fa6b8ece84041/info/spaces", + "path": "780a20adb8045467aa6ae9c66d3fd7f0/info/spaces", "property": "spaces", "rule": "O6" }, { "bucket": "extension", - "device": "c48878d21ad9590882e5c369f23a9a4e", + "device": "93294e528d045baa9190721acfb243d3", "message": "property 'name' is not in catalog energy.ebus.capability.info; published as an extension, which the specification permits", "node": "info", - "path": "c48878d21ad9590882e5c369f23a9a4e/info/name", + "path": "93294e528d045baa9190721acfb243d3/info/name", "property": "name", "rule": "O6" }, { "bucket": "extension", - "device": "c48878d21ad9590882e5c369f23a9a4e", + "device": "93294e528d045baa9190721acfb243d3", "message": "property 'spaces' is not in catalog energy.ebus.capability.info; published as an extension, which the specification permits", "node": "info", - "path": "c48878d21ad9590882e5c369f23a9a4e/info/spaces", + "path": "93294e528d045baa9190721acfb243d3/info/spaces", "property": "spaces", "rule": "O6" }, { "bucket": "extension", - "device": "be87c32bda4f5cd9abbf6d3995ae28c0", + "device": "9a67992e4e735d8a81340adb44120c11", "message": "property 'name' is not in catalog energy.ebus.capability.info; published as an extension, which the specification permits", "node": "info", - "path": "be87c32bda4f5cd9abbf6d3995ae28c0/info/name", + "path": "9a67992e4e735d8a81340adb44120c11/info/name", "property": "name", "rule": "O6" }, { "bucket": "extension", - "device": "be87c32bda4f5cd9abbf6d3995ae28c0", + "device": "9a67992e4e735d8a81340adb44120c11", "message": "property 'spaces' is not in catalog energy.ebus.capability.info; published as an extension, which the specification permits", "node": "info", - "path": "be87c32bda4f5cd9abbf6d3995ae28c0/info/spaces", + "path": "9a67992e4e735d8a81340adb44120c11/info/spaces", "property": "spaces", "rule": "O6" }, { "bucket": "extension", - "device": "f58f82be999a59d6b795c45cbde9ea63", + "device": "9c22d40aa8f25a82bf22e62aa1891c4b", "message": "property 'name' is not in catalog energy.ebus.capability.info; published as an extension, which the specification permits", "node": "info", - "path": "f58f82be999a59d6b795c45cbde9ea63/info/name", + "path": "9c22d40aa8f25a82bf22e62aa1891c4b/info/name", "property": "name", "rule": "O6" }, { "bucket": "extension", - "device": "f58f82be999a59d6b795c45cbde9ea63", + "device": "9c22d40aa8f25a82bf22e62aa1891c4b", "message": "property 'spaces' is not in catalog energy.ebus.capability.info; published as an extension, which the specification permits", "node": "info", - "path": "f58f82be999a59d6b795c45cbde9ea63/info/spaces", + "path": "9c22d40aa8f25a82bf22e62aa1891c4b/info/spaces", "property": "spaces", "rule": "O6" }, { "bucket": "extension", - "device": "d163b097bbfb5cf1af4420f396c76e2d", + "device": "a83191fcac585bda9d6fe05ca79b8a4f", "message": "property 'name' is not in catalog energy.ebus.capability.info; published as an extension, which the specification permits", "node": "info", - "path": "d163b097bbfb5cf1af4420f396c76e2d/info/name", + "path": "a83191fcac585bda9d6fe05ca79b8a4f/info/name", "property": "name", "rule": "O6" }, { "bucket": "extension", - "device": "d163b097bbfb5cf1af4420f396c76e2d", + "device": "a83191fcac585bda9d6fe05ca79b8a4f", "message": "property 'spaces' is not in catalog energy.ebus.capability.info; published as an extension, which the specification permits", "node": "info", - "path": "d163b097bbfb5cf1af4420f396c76e2d/info/spaces", + "path": "a83191fcac585bda9d6fe05ca79b8a4f/info/spaces", "property": "spaces", "rule": "O6" }, @@ -298,253 +298,253 @@ }, { "bucket": "extension", - "device": "9a67992e4e735d8a81340adb44120c11", + "device": "bc07adcee8ff5945a29c618a54bef7e6", "message": "property 'name' is not in catalog energy.ebus.capability.info; published as an extension, which the specification permits", "node": "info", - "path": "9a67992e4e735d8a81340adb44120c11/info/name", + "path": "bc07adcee8ff5945a29c618a54bef7e6/info/name", "property": "name", "rule": "O6" }, { "bucket": "extension", - "device": "9a67992e4e735d8a81340adb44120c11", + "device": "bc07adcee8ff5945a29c618a54bef7e6", "message": "property 'spaces' is not in catalog energy.ebus.capability.info; published as an extension, which the specification permits", "node": "info", - "path": "9a67992e4e735d8a81340adb44120c11/info/spaces", + "path": "bc07adcee8ff5945a29c618a54bef7e6/info/spaces", "property": "spaces", "rule": "O6" }, { "bucket": "extension", - "device": "93294e528d045baa9190721acfb243d3", + "device": "be820f5432c353e8b60329b6ee8e2a9b", "message": "property 'name' is not in catalog energy.ebus.capability.info; published as an extension, which the specification permits", "node": "info", - "path": "93294e528d045baa9190721acfb243d3/info/name", + "path": "be820f5432c353e8b60329b6ee8e2a9b/info/name", "property": "name", "rule": "O6" }, { "bucket": "extension", - "device": "93294e528d045baa9190721acfb243d3", + "device": "be820f5432c353e8b60329b6ee8e2a9b", "message": "property 'spaces' is not in catalog energy.ebus.capability.info; published as an extension, which the specification permits", "node": "info", - "path": "93294e528d045baa9190721acfb243d3/info/spaces", + "path": "be820f5432c353e8b60329b6ee8e2a9b/info/spaces", "property": "spaces", "rule": "O6" }, { "bucket": "extension", - "device": "d6e020a36d315281b4cac1cfd10f0cce", + "device": "be87c32bda4f5cd9abbf6d3995ae28c0", "message": "property 'name' is not in catalog energy.ebus.capability.info; published as an extension, which the specification permits", "node": "info", - "path": "d6e020a36d315281b4cac1cfd10f0cce/info/name", + "path": "be87c32bda4f5cd9abbf6d3995ae28c0/info/name", "property": "name", "rule": "O6" }, { "bucket": "extension", - "device": "d6e020a36d315281b4cac1cfd10f0cce", + "device": "be87c32bda4f5cd9abbf6d3995ae28c0", "message": "property 'spaces' is not in catalog energy.ebus.capability.info; published as an extension, which the specification permits", "node": "info", - "path": "d6e020a36d315281b4cac1cfd10f0cce/info/spaces", + "path": "be87c32bda4f5cd9abbf6d3995ae28c0/info/spaces", "property": "spaces", "rule": "O6" }, { "bucket": "extension", - "device": "09a79266163d540c862d5efbe8ef67d3", + "device": "c48878d21ad9590882e5c369f23a9a4e", "message": "property 'name' is not in catalog energy.ebus.capability.info; published as an extension, which the specification permits", "node": "info", - "path": "09a79266163d540c862d5efbe8ef67d3/info/name", + "path": "c48878d21ad9590882e5c369f23a9a4e/info/name", "property": "name", "rule": "O6" }, { "bucket": "extension", - "device": "09a79266163d540c862d5efbe8ef67d3", + "device": "c48878d21ad9590882e5c369f23a9a4e", "message": "property 'spaces' is not in catalog energy.ebus.capability.info; published as an extension, which the specification permits", "node": "info", - "path": "09a79266163d540c862d5efbe8ef67d3/info/spaces", + "path": "c48878d21ad9590882e5c369f23a9a4e/info/spaces", "property": "spaces", "rule": "O6" }, { "bucket": "extension", - "device": "ddab4e77c47d577192911fd8db925a27", + "device": "cafc279d283d567280deb2fce6be8438", "message": "property 'name' is not in catalog energy.ebus.capability.info; published as an extension, which the specification permits", "node": "info", - "path": "ddab4e77c47d577192911fd8db925a27/info/name", + "path": "cafc279d283d567280deb2fce6be8438/info/name", "property": "name", "rule": "O6" }, { "bucket": "extension", - "device": "ddab4e77c47d577192911fd8db925a27", + "device": "cafc279d283d567280deb2fce6be8438", "message": "property 'spaces' is not in catalog energy.ebus.capability.info; published as an extension, which the specification permits", "node": "info", - "path": "ddab4e77c47d577192911fd8db925a27/info/spaces", + "path": "cafc279d283d567280deb2fce6be8438/info/spaces", "property": "spaces", "rule": "O6" }, { "bucket": "extension", - "device": "0c941ad4041050cc830e740ddddb2f23", + "device": "d163b097bbfb5cf1af4420f396c76e2d", "message": "property 'name' is not in catalog energy.ebus.capability.info; published as an extension, which the specification permits", "node": "info", - "path": "0c941ad4041050cc830e740ddddb2f23/info/name", + "path": "d163b097bbfb5cf1af4420f396c76e2d/info/name", "property": "name", "rule": "O6" }, { "bucket": "extension", - "device": "0c941ad4041050cc830e740ddddb2f23", + "device": "d163b097bbfb5cf1af4420f396c76e2d", "message": "property 'spaces' is not in catalog energy.ebus.capability.info; published as an extension, which the specification permits", "node": "info", - "path": "0c941ad4041050cc830e740ddddb2f23/info/spaces", + "path": "d163b097bbfb5cf1af4420f396c76e2d/info/spaces", "property": "spaces", "rule": "O6" }, { "bucket": "extension", - "device": "68213a7c393f54918706bf62a3b92047", + "device": "d6e020a36d315281b4cac1cfd10f0cce", "message": "property 'name' is not in catalog energy.ebus.capability.info; published as an extension, which the specification permits", "node": "info", - "path": "68213a7c393f54918706bf62a3b92047/info/name", + "path": "d6e020a36d315281b4cac1cfd10f0cce/info/name", "property": "name", "rule": "O6" }, { "bucket": "extension", - "device": "68213a7c393f54918706bf62a3b92047", + "device": "d6e020a36d315281b4cac1cfd10f0cce", "message": "property 'spaces' is not in catalog energy.ebus.capability.info; published as an extension, which the specification permits", "node": "info", - "path": "68213a7c393f54918706bf62a3b92047/info/spaces", + "path": "d6e020a36d315281b4cac1cfd10f0cce/info/spaces", "property": "spaces", "rule": "O6" }, { "bucket": "extension", - "device": "17e98544c51a59d98331dd263df2abe1", + "device": "db9deedb6ba7580397507c1dac4d4da4", "message": "property 'name' is not in catalog energy.ebus.capability.info; published as an extension, which the specification permits", "node": "info", - "path": "17e98544c51a59d98331dd263df2abe1/info/name", + "path": "db9deedb6ba7580397507c1dac4d4da4/info/name", "property": "name", "rule": "O6" }, { "bucket": "extension", - "device": "17e98544c51a59d98331dd263df2abe1", + "device": "db9deedb6ba7580397507c1dac4d4da4", "message": "property 'spaces' is not in catalog energy.ebus.capability.info; published as an extension, which the specification permits", "node": "info", - "path": "17e98544c51a59d98331dd263df2abe1/info/spaces", + "path": "db9deedb6ba7580397507c1dac4d4da4/info/spaces", "property": "spaces", "rule": "O6" }, { "bucket": "extension", - "device": "5239be04f4725708a6f37d750fd5b4ae", + "device": "ddab4e77c47d577192911fd8db925a27", "message": "property 'name' is not in catalog energy.ebus.capability.info; published as an extension, which the specification permits", "node": "info", - "path": "5239be04f4725708a6f37d750fd5b4ae/info/name", + "path": "ddab4e77c47d577192911fd8db925a27/info/name", "property": "name", "rule": "O6" }, { "bucket": "extension", - "device": "5239be04f4725708a6f37d750fd5b4ae", + "device": "ddab4e77c47d577192911fd8db925a27", "message": "property 'spaces' is not in catalog energy.ebus.capability.info; published as an extension, which the specification permits", "node": "info", - "path": "5239be04f4725708a6f37d750fd5b4ae/info/spaces", + "path": "ddab4e77c47d577192911fd8db925a27/info/spaces", "property": "spaces", "rule": "O6" }, { "bucket": "extension", - "device": "be820f5432c353e8b60329b6ee8e2a9b", + "device": "df5d74733e435d53be69ee9edbbda675", "message": "property 'name' is not in catalog energy.ebus.capability.info; published as an extension, which the specification permits", "node": "info", - "path": "be820f5432c353e8b60329b6ee8e2a9b/info/name", + "path": "df5d74733e435d53be69ee9edbbda675/info/name", "property": "name", "rule": "O6" }, { "bucket": "extension", - "device": "be820f5432c353e8b60329b6ee8e2a9b", + "device": "df5d74733e435d53be69ee9edbbda675", "message": "property 'spaces' is not in catalog energy.ebus.capability.info; published as an extension, which the specification permits", "node": "info", - "path": "be820f5432c353e8b60329b6ee8e2a9b/info/spaces", + "path": "df5d74733e435d53be69ee9edbbda675/info/spaces", "property": "spaces", "rule": "O6" }, { "bucket": "extension", - "device": "780a20adb8045467aa6ae9c66d3fd7f0", + "device": "e87d68b509855856a61570c7a7d95c07", "message": "property 'name' is not in catalog energy.ebus.capability.info; published as an extension, which the specification permits", "node": "info", - "path": "780a20adb8045467aa6ae9c66d3fd7f0/info/name", + "path": "e87d68b509855856a61570c7a7d95c07/info/name", "property": "name", "rule": "O6" }, { "bucket": "extension", - "device": "780a20adb8045467aa6ae9c66d3fd7f0", + "device": "e87d68b509855856a61570c7a7d95c07", "message": "property 'spaces' is not in catalog energy.ebus.capability.info; published as an extension, which the specification permits", "node": "info", - "path": "780a20adb8045467aa6ae9c66d3fd7f0/info/spaces", + "path": "e87d68b509855856a61570c7a7d95c07/info/spaces", "property": "spaces", "rule": "O6" }, { "bucket": "extension", - "device": "14c507fcbb5f539ba40b60b5e5655a72", + "device": "e8d326d2b88e50a88e4fa3f04ed93608", "message": "property 'name' is not in catalog energy.ebus.capability.info; published as an extension, which the specification permits", "node": "info", - "path": "14c507fcbb5f539ba40b60b5e5655a72/info/name", + "path": "e8d326d2b88e50a88e4fa3f04ed93608/info/name", "property": "name", "rule": "O6" }, { "bucket": "extension", - "device": "14c507fcbb5f539ba40b60b5e5655a72", + "device": "e8d326d2b88e50a88e4fa3f04ed93608", "message": "property 'spaces' is not in catalog energy.ebus.capability.info; published as an extension, which the specification permits", "node": "info", - "path": "14c507fcbb5f539ba40b60b5e5655a72/info/spaces", + "path": "e8d326d2b88e50a88e4fa3f04ed93608/info/spaces", "property": "spaces", "rule": "O6" }, { "bucket": "extension", - "device": "e8d326d2b88e50a88e4fa3f04ed93608", + "device": "f482dc963f2654de922bfd1a40d30ee0", "message": "property 'name' is not in catalog energy.ebus.capability.info; published as an extension, which the specification permits", "node": "info", - "path": "e8d326d2b88e50a88e4fa3f04ed93608/info/name", + "path": "f482dc963f2654de922bfd1a40d30ee0/info/name", "property": "name", "rule": "O6" }, { "bucket": "extension", - "device": "e8d326d2b88e50a88e4fa3f04ed93608", + "device": "f482dc963f2654de922bfd1a40d30ee0", "message": "property 'spaces' is not in catalog energy.ebus.capability.info; published as an extension, which the specification permits", "node": "info", - "path": "e8d326d2b88e50a88e4fa3f04ed93608/info/spaces", + "path": "f482dc963f2654de922bfd1a40d30ee0/info/spaces", "property": "spaces", "rule": "O6" }, { "bucket": "extension", - "device": "db9deedb6ba7580397507c1dac4d4da4", + "device": "f58f82be999a59d6b795c45cbde9ea63", "message": "property 'name' is not in catalog energy.ebus.capability.info; published as an extension, which the specification permits", "node": "info", - "path": "db9deedb6ba7580397507c1dac4d4da4/info/name", + "path": "f58f82be999a59d6b795c45cbde9ea63/info/name", "property": "name", "rule": "O6" }, { "bucket": "extension", - "device": "db9deedb6ba7580397507c1dac4d4da4", + "device": "f58f82be999a59d6b795c45cbde9ea63", "message": "property 'spaces' is not in catalog energy.ebus.capability.info; published as an extension, which the specification permits", "node": "info", - "path": "db9deedb6ba7580397507c1dac4d4da4/info/spaces", + "path": "f58f82be999a59d6b795c45cbde9ea63/info/spaces", "property": "spaces", "rule": "O6" }, diff --git a/tests/conformance/fixtures/golden_tree.json b/tests/conformance/fixtures/golden_tree.json index 4e482b9..7b8a467 100644 --- a/tests/conformance/fixtures/golden_tree.json +++ b/tests/conformance/fixtures/golden_tree.json @@ -1,9 +1,9 @@ { - "df5d74733e435d53be69ee9edbbda675": { + "09a79266163d540c862d5efbe8ef67d3": { "children": [], "extensions": [], "homie": "5.0", - "name": "Kitchen Outlets (Island)", + "name": "Office Outlets", "nodes": { "breaker": { "name": "breaker", @@ -131,13 +131,13 @@ "parent": "sim-40t-001", "root": "sim-40t-001", "type": "energy.ebus.device.circuit", - "version": 1787808834687 + "version": 1791309827357 }, - "a83191fcac585bda9d6fe05ca79b8a4f": { + "0c941ad4041050cc830e740ddddb2f23": { "children": [], "extensions": [], "homie": "5.0", - "name": "SPAN Drive - Driveway", + "name": "Electric Oven/Range", "nodes": { "breaker": { "name": "breaker", @@ -265,13 +265,13 @@ "parent": "sim-40t-001", "root": "sim-40t-001", "type": "energy.ebus.device.circuit", - "version": 1787808834690 + "version": 1791309827360 }, - "f482dc963f2654de922bfd1a40d30ee0": { + "14c507fcbb5f539ba40b60b5e5655a72": { "children": [], "extensions": [], "homie": "5.0", - "name": "Smoke Detectors", + "name": "Laundry Room Outlets", "nodes": { "breaker": { "name": "breaker", @@ -399,13 +399,13 @@ "parent": "sim-40t-001", "root": "sim-40t-001", "type": "energy.ebus.device.circuit", - "version": 1787808834689 + "version": 1791309827357 }, - "51ab52ca7e085204bd300a35731c1501": { + "17e98544c51a59d98331dd263df2abe1": { "children": [], "extensions": [], "homie": "5.0", - "name": "Refrigerator", + "name": "Guest Room Outlets", "nodes": { "breaker": { "name": "breaker", @@ -514,7 +514,8 @@ "relay": { "datatype": "enum", "format": "UNKNOWN,OPEN,CLOSED", - "name": "Circuit relay state" + "name": "Circuit relay state", + "settable": true }, "relay-controllable": { "datatype": "boolean", @@ -532,13 +533,13 @@ "parent": "sim-40t-001", "root": "sim-40t-001", "type": "energy.ebus.device.circuit", - "version": 1787808834688 + "version": 1791309827358 }, - "9c22d40aa8f25a82bf22e62aa1891c4b": { + "3feb088e635f50bcad1ad38c9e79f82c": { "children": [], "extensions": [], "homie": "5.0", - "name": "SPAN Drive - Garage", + "name": "Water Heater", "nodes": { "breaker": { "name": "breaker", @@ -666,13 +667,13 @@ "parent": "sim-40t-001", "root": "sim-40t-001", "type": "energy.ebus.device.circuit", - "version": 1787808834690 + "version": 1791309827360 }, - "72b4343c886e5c98bca64a131b6003ce": { + "51ab52ca7e085204bd300a35731c1501": { "children": [], "extensions": [], "homie": "5.0", - "name": "Bedroom Lights", + "name": "Refrigerator", "nodes": { "breaker": { "name": "breaker", @@ -781,8 +782,7 @@ "relay": { "datatype": "enum", "format": "UNKNOWN,OPEN,CLOSED", - "name": "Circuit relay state", - "settable": true + "name": "Circuit relay state" }, "relay-controllable": { "datatype": "boolean", @@ -800,13 +800,13 @@ "parent": "sim-40t-001", "root": "sim-40t-001", "type": "energy.ebus.device.circuit", - "version": 1787808834686 + "version": 1791309827358 }, - "cafc279d283d567280deb2fce6be8438": { + "5239be04f4725708a6f37d750fd5b4ae": { "children": [], "extensions": [], "homie": "5.0", - "name": "Master Bedroom Outlets", + "name": "Garage Outlets", "nodes": { "breaker": { "name": "breaker", @@ -934,13 +934,13 @@ "parent": "sim-40t-001", "root": "sim-40t-001", "type": "energy.ebus.device.circuit", - "version": 1787808834686 + "version": 1791309827357 }, - "e87d68b509855856a61570c7a7d95c07": { + "68213a7c393f54918706bf62a3b92047": { "children": [], "extensions": [], "homie": "5.0", - "name": "Washing Machine", + "name": "Bathroom Lights", "nodes": { "breaker": { "name": "breaker", @@ -1068,13 +1068,13 @@ "parent": "sim-40t-001", "root": "sim-40t-001", "type": "energy.ebus.device.circuit", - "version": 1787808834688 + "version": 1791309827356 }, - "bc07adcee8ff5945a29c618a54bef7e6": { + "72b4343c886e5c98bca64a131b6003ce": { "children": [], "extensions": [], "homie": "5.0", - "name": "Garbage Disposal", + "name": "Bedroom Lights", "nodes": { "breaker": { "name": "breaker", @@ -1202,13 +1202,13 @@ "parent": "sim-40t-001", "root": "sim-40t-001", "type": "energy.ebus.device.circuit", - "version": 1787808834689 + "version": 1791309827356 }, - "3feb088e635f50bcad1ad38c9e79f82c": { + "768f5f7afac95b09a32fa6b8ece84041": { "children": [], "extensions": [], "homie": "5.0", - "name": "Water Heater", + "name": "Dishwasher", "nodes": { "breaker": { "name": "breaker", @@ -1336,13 +1336,13 @@ "parent": "sim-40t-001", "root": "sim-40t-001", "type": "energy.ebus.device.circuit", - "version": 1787808834690 + "version": 1791309827358 }, - "768f5f7afac95b09a32fa6b8ece84041": { + "780a20adb8045467aa6ae9c66d3fd7f0": { "children": [], "extensions": [], "homie": "5.0", - "name": "Dishwasher", + "name": "Microwave", "nodes": { "breaker": { "name": "breaker", @@ -1470,13 +1470,13 @@ "parent": "sim-40t-001", "root": "sim-40t-001", "type": "energy.ebus.device.circuit", - "version": 1787808834688 + "version": 1791309827358 }, - "c48878d21ad9590882e5c369f23a9a4e": { + "93294e528d045baa9190721acfb243d3": { "children": [], "extensions": [], "homie": "5.0", - "name": "Pool Pump", + "name": "Main HVAC", "nodes": { "breaker": { "name": "breaker", @@ -1604,13 +1604,13 @@ "parent": "sim-40t-001", "root": "sim-40t-001", "type": "energy.ebus.device.circuit", - "version": 1787808834689 + "version": 1791309827359 }, - "be87c32bda4f5cd9abbf6d3995ae28c0": { + "9a67992e4e735d8a81340adb44120c11": { "children": [], "extensions": [], "homie": "5.0", - "name": "Solar Inverter", + "name": "Heat Pump", "nodes": { "breaker": { "name": "breaker", @@ -1719,7 +1719,8 @@ "relay": { "datatype": "enum", "format": "UNKNOWN,OPEN,CLOSED", - "name": "Circuit relay state" + "name": "Circuit relay state", + "settable": true }, "relay-controllable": { "datatype": "boolean", @@ -1737,13 +1738,13 @@ "parent": "sim-40t-001", "root": "sim-40t-001", "type": "energy.ebus.device.circuit", - "version": 1787808834690 + "version": 1791309827360 }, - "f58f82be999a59d6b795c45cbde9ea63": { + "9c22d40aa8f25a82bf22e62aa1891c4b": { "children": [], "extensions": [], "homie": "5.0", - "name": "Master Bedroom Lights", + "name": "SPAN Drive - Garage", "nodes": { "breaker": { "name": "breaker", @@ -1871,13 +1872,13 @@ "parent": "sim-40t-001", "root": "sim-40t-001", "type": "energy.ebus.device.circuit", - "version": 1787808834685 + "version": 1791309827360 }, - "d163b097bbfb5cf1af4420f396c76e2d": { + "a83191fcac585bda9d6fe05ca79b8a4f": { "children": [], "extensions": [], "homie": "5.0", - "name": "Kitchen Outlets (Counter)", + "name": "SPAN Drive - Driveway", "nodes": { "breaker": { "name": "breaker", @@ -2005,7 +2006,7 @@ "parent": "sim-40t-001", "root": "sim-40t-001", "type": "energy.ebus.device.circuit", - "version": 1787808834687 + "version": 1791309827360 }, "bb8914a16ba2543a82a88c22e461943e": { "children": [], @@ -2139,13 +2140,13 @@ "parent": "sim-40t-001", "root": "sim-40t-001", "type": "energy.ebus.device.circuit", - "version": 1787808834686 + "version": 1791309827356 }, - "9a67992e4e735d8a81340adb44120c11": { + "bc07adcee8ff5945a29c618a54bef7e6": { "children": [], "extensions": [], "homie": "5.0", - "name": "Heat Pump", + "name": "Garbage Disposal", "nodes": { "breaker": { "name": "breaker", @@ -2273,13 +2274,13 @@ "parent": "sim-40t-001", "root": "sim-40t-001", "type": "energy.ebus.device.circuit", - "version": 1787808834689 + "version": 1791309827359 }, - "93294e528d045baa9190721acfb243d3": { + "be820f5432c353e8b60329b6ee8e2a9b": { "children": [], "extensions": [], "homie": "5.0", - "name": "Main HVAC", + "name": "Living Room Outlets", "nodes": { "breaker": { "name": "breaker", @@ -2407,13 +2408,13 @@ "parent": "sim-40t-001", "root": "sim-40t-001", "type": "energy.ebus.device.circuit", - "version": 1787808834689 + "version": 1791309827357 }, - "d6e020a36d315281b4cac1cfd10f0cce": { + "be87c32bda4f5cd9abbf6d3995ae28c0": { "children": [], "extensions": [], "homie": "5.0", - "name": "Chest Freezer", + "name": "Solar Inverter", "nodes": { "breaker": { "name": "breaker", @@ -2540,13 +2541,13 @@ "parent": "sim-40t-001", "root": "sim-40t-001", "type": "energy.ebus.device.circuit", - "version": 1787808834688 + "version": 1791309827360 }, - "09a79266163d540c862d5efbe8ef67d3": { + "c48878d21ad9590882e5c369f23a9a4e": { "children": [], "extensions": [], "homie": "5.0", - "name": "Office Outlets", + "name": "Pool Pump", "nodes": { "breaker": { "name": "breaker", @@ -2674,13 +2675,13 @@ "parent": "sim-40t-001", "root": "sim-40t-001", "type": "energy.ebus.device.circuit", - "version": 1787808834687 + "version": 1791309827359 }, - "ddab4e77c47d577192911fd8db925a27": { + "cafc279d283d567280deb2fce6be8438": { "children": [], "extensions": [], "homie": "5.0", - "name": "kitchen Lights", + "name": "Master Bedroom Outlets", "nodes": { "breaker": { "name": "breaker", @@ -2808,13 +2809,13 @@ "parent": "sim-40t-001", "root": "sim-40t-001", "type": "energy.ebus.device.circuit", - "version": 1787808834691 + "version": 1791309827356 }, - "0c941ad4041050cc830e740ddddb2f23": { + "d163b097bbfb5cf1af4420f396c76e2d": { "children": [], "extensions": [], "homie": "5.0", - "name": "Electric Oven/Range", + "name": "Kitchen Outlets (Counter)", "nodes": { "breaker": { "name": "breaker", @@ -2942,13 +2943,13 @@ "parent": "sim-40t-001", "root": "sim-40t-001", "type": "energy.ebus.device.circuit", - "version": 1787808834690 + "version": 1791309827357 }, - "68213a7c393f54918706bf62a3b92047": { + "d6e020a36d315281b4cac1cfd10f0cce": { "children": [], "extensions": [], "homie": "5.0", - "name": "Bathroom Lights", + "name": "Chest Freezer", "nodes": { "breaker": { "name": "breaker", @@ -3057,8 +3058,7 @@ "relay": { "datatype": "enum", "format": "UNKNOWN,OPEN,CLOSED", - "name": "Circuit relay state", - "settable": true + "name": "Circuit relay state" }, "relay-controllable": { "datatype": "boolean", @@ -3076,13 +3076,13 @@ "parent": "sim-40t-001", "root": "sim-40t-001", "type": "energy.ebus.device.circuit", - "version": 1787808834686 + "version": 1791309827359 }, - "17e98544c51a59d98331dd263df2abe1": { + "db9deedb6ba7580397507c1dac4d4da4": { "children": [], "extensions": [], "homie": "5.0", - "name": "Guest Room Outlets", + "name": "Exterior Lights", "nodes": { "breaker": { "name": "breaker", @@ -3210,13 +3210,13 @@ "parent": "sim-40t-001", "root": "sim-40t-001", "type": "energy.ebus.device.circuit", - "version": 1787808834688 + "version": 1791309827356 }, - "5239be04f4725708a6f37d750fd5b4ae": { + "ddab4e77c47d577192911fd8db925a27": { "children": [], "extensions": [], "homie": "5.0", - "name": "Garage Outlets", + "name": "kitchen Lights", "nodes": { "breaker": { "name": "breaker", @@ -3344,13 +3344,13 @@ "parent": "sim-40t-001", "root": "sim-40t-001", "type": "energy.ebus.device.circuit", - "version": 1787808834687 + "version": 1791309827361 }, - "be820f5432c353e8b60329b6ee8e2a9b": { + "df5d74733e435d53be69ee9edbbda675": { "children": [], "extensions": [], "homie": "5.0", - "name": "Living Room Outlets", + "name": "Kitchen Outlets (Island)", "nodes": { "breaker": { "name": "breaker", @@ -3478,13 +3478,13 @@ "parent": "sim-40t-001", "root": "sim-40t-001", "type": "energy.ebus.device.circuit", - "version": 1787808834687 + "version": 1791309827357 }, - "780a20adb8045467aa6ae9c66d3fd7f0": { + "e87d68b509855856a61570c7a7d95c07": { "children": [], "extensions": [], "homie": "5.0", - "name": "Microwave", + "name": "Washing Machine", "nodes": { "breaker": { "name": "breaker", @@ -3612,13 +3612,13 @@ "parent": "sim-40t-001", "root": "sim-40t-001", "type": "energy.ebus.device.circuit", - "version": 1787808834688 + "version": 1791309827358 }, - "14c507fcbb5f539ba40b60b5e5655a72": { + "e8d326d2b88e50a88e4fa3f04ed93608": { "children": [], "extensions": [], "homie": "5.0", - "name": "Laundry Room Outlets", + "name": "Electric Dryer", "nodes": { "breaker": { "name": "breaker", @@ -3746,13 +3746,13 @@ "parent": "sim-40t-001", "root": "sim-40t-001", "type": "energy.ebus.device.circuit", - "version": 1787808834687 + "version": 1791309827359 }, - "e8d326d2b88e50a88e4fa3f04ed93608": { + "f482dc963f2654de922bfd1a40d30ee0": { "children": [], "extensions": [], "homie": "5.0", - "name": "Electric Dryer", + "name": "Smoke Detectors", "nodes": { "breaker": { "name": "breaker", @@ -3880,13 +3880,13 @@ "parent": "sim-40t-001", "root": "sim-40t-001", "type": "energy.ebus.device.circuit", - "version": 1787808834689 + "version": 1791309827359 }, - "db9deedb6ba7580397507c1dac4d4da4": { + "f58f82be999a59d6b795c45cbde9ea63": { "children": [], "extensions": [], "homie": "5.0", - "name": "Exterior Lights", + "name": "Master Bedroom Lights", "nodes": { "breaker": { "name": "breaker", @@ -4014,7 +4014,7 @@ "parent": "sim-40t-001", "root": "sim-40t-001", "type": "energy.ebus.device.circuit", - "version": 1787808834686 + "version": 1791309827356 }, "sim-40t-001": { "children": [ @@ -4320,7 +4320,7 @@ } }, "type": "energy.ebus.device.distribution-enclosure", - "version": 1787808834691 + "version": 1791309827361 }, "sim-40t-001-SIM-BESS-40T-001": { "children": [ @@ -4403,7 +4403,7 @@ "parent": "sim-40t-001", "root": "sim-40t-001", "type": "energy.ebus.device.bess", - "version": 1787808834691 + "version": 1791309827361 }, "sim-40t-001-SIM-BESS-40T-001-mid": { "children": [], @@ -4461,7 +4461,7 @@ "parent": "sim-40t-001-SIM-BESS-40T-001", "root": "sim-40t-001", "type": "energy.ebus.device.mid", - "version": 1787808834691 + "version": 1791309827361 }, "sim-40t-001-lugs-dn": { "children": [], @@ -4547,7 +4547,7 @@ "parent": "sim-40t-001", "root": "sim-40t-001", "type": "energy.ebus.device.lugs", - "version": 1787808834691 + "version": 1791309827361 }, "sim-40t-001-lugs-up": { "children": [], @@ -4633,7 +4633,7 @@ "parent": "sim-40t-001", "root": "sim-40t-001", "type": "energy.ebus.device.lugs", - "version": 1787808834691 + "version": 1791309827361 }, "sim-40t-001-pv-1": { "children": [], @@ -4672,7 +4672,7 @@ "parent": "sim-40t-001", "root": "sim-40t-001", "type": "energy.ebus.device.pv", - "version": 1787808834691 + "version": 1791309827361 }, "sim-40t-001-sim-evse-sim-40t-001": { "children": [], @@ -4690,6 +4690,7 @@ }, "user-max-charge-current": { "datatype": "integer", + "format": "6:32", "name": "User-configured maximum EVSE charge current (ceiling)", "settable": true, "unit": "A" @@ -4760,7 +4761,7 @@ "parent": "sim-40t-001", "root": "sim-40t-001", "type": "energy.ebus.device.evse", - "version": 1787808834691 + "version": 1791309827361 }, "sim-40t-001-sim-evse-sim-40t-001-2": { "children": [], @@ -4778,6 +4779,7 @@ }, "user-max-charge-current": { "datatype": "integer", + "format": "6:32", "name": "User-configured maximum EVSE charge current (ceiling)", "settable": true, "unit": "A" @@ -4848,6 +4850,6 @@ "parent": "sim-40t-001", "root": "sim-40t-001", "type": "energy.ebus.device.evse", - "version": 1787808834691 + "version": 1791309827361 } } diff --git a/tests/conformance/fixtures/golden_wire.json b/tests/conformance/fixtures/golden_wire.json index 90d7735..db932d4 100644 --- a/tests/conformance/fixtures/golden_wire.json +++ b/tests/conformance/fixtures/golden_wire.json @@ -1,14 +1,14 @@ { "09a79266163d540c862d5efbe8ef67d3": { - "$description": "{\"homie\": \"5.0\", \"version\": 1787970490461, \"type\": \"energy.ebus.device.circuit\", \"name\": \"Office Outlets\", \"nodes\": {\"switch\": {\"name\": \"switch\", \"type\": \"energy.ebus.capability.switch\", \"properties\": {\"relay\": {\"name\": \"Circuit relay state\", \"datatype\": \"enum\", \"format\": \"UNKNOWN,OPEN,CLOSED\", \"settable\": true}, \"relay-requester\": {\"name\": \"Actor requesting the relay state\", \"datatype\": \"enum\", \"format\": \"UNKNOWN,NONE,LOAD_SHED,USER,PCS,CONFIGURATION,FAULT\"}, \"relay-controllable\": {\"name\": \"Can the circuit's relay be commanded by the user?\", \"datatype\": \"boolean\"}}}, \"breaker\": {\"name\": \"breaker\", \"type\": \"energy.ebus.capability.breaker\", \"properties\": {\"rating\": {\"name\": \"Circuit breaker rating\", \"datatype\": \"integer\", \"unit\": \"A\"}, \"poles\": {\"name\": \"Number of breaker poles\", \"datatype\": \"integer\", \"format\": \"1:4:1\"}}}, \"meter\": {\"name\": \"meter\", \"type\": \"energy.ebus.capability.meter\", \"properties\": {\"current\": {\"name\": \"Measured current\", \"datatype\": \"float\", \"unit\": \"A\"}, \"active-power\": {\"name\": \"Measured active power\", \"datatype\": \"float\", \"unit\": \"W\"}, \"imported-energy\": {\"name\": \"Measured energy imported\", \"datatype\": \"float\", \"unit\": \"Wh\"}, \"exported-energy\": {\"name\": \"Measured energy exported\", \"datatype\": \"float\", \"unit\": \"Wh\"}}}, \"load-shed\": {\"name\": \"load-shed\", \"type\": \"energy.ebus.capability.load-shed\", \"properties\": {\"priority\": {\"name\": \"Configured priority of circuit shedding when off-grid (dominant-power-source != GRID)\", \"datatype\": \"enum\", \"format\": \"UNKNOWN,OFF_GRID,SOC_THRESHOLD,NEVER\", \"settable\": true}}}, \"pcs\": {\"name\": \"pcs\", \"type\": \"energy.ebus.capability.pcs\", \"properties\": {\"managed\": {\"name\": \"Is circuit managed by PCS?\", \"datatype\": \"boolean\"}, \"priority\": {\"name\": \"Circuit PCS priority ranking\", \"datatype\": \"integer\"}}}, \"connection\": {\"name\": \"connection\", \"type\": \"energy.ebus.capability.connection\", \"properties\": {\"feeds-device-id\": {\"name\": \"Homie device-id of the downstream device fed by this circuit\", \"datatype\": \"string\"}, \"feeds-device-type\": {\"name\": \"Homie $type of the downstream device\", \"datatype\": \"string\"}, \"feeds-device-status\": {\"name\": \"Panel's view of comm health to the downstream device\", \"datatype\": \"enum\", \"format\": \"OK,LOST,DEGRADED\"}}}, \"info\": {\"name\": \"info\", \"type\": \"energy.ebus.capability.info\", \"properties\": {\"name\": {\"name\": \"Circuit name\", \"datatype\": \"string\"}, \"spaces\": {\"name\": \"Circuit breaker space number(s) within the load center (comma-separated for multi-pole)\", \"datatype\": \"string\"}}}}, \"children\": [], \"root\": \"sim-40t-001\", \"parent\": \"sim-40t-001\", \"extensions\": []}", + "$description": "{\"homie\": \"5.0\", \"version\": 1791309827357, \"type\": \"energy.ebus.device.circuit\", \"name\": \"Office Outlets\", \"nodes\": {\"switch\": {\"name\": \"switch\", \"type\": \"energy.ebus.capability.switch\", \"properties\": {\"relay\": {\"name\": \"Circuit relay state\", \"datatype\": \"enum\", \"format\": \"UNKNOWN,OPEN,CLOSED\", \"settable\": true}, \"relay-requester\": {\"name\": \"Actor requesting the relay state\", \"datatype\": \"enum\", \"format\": \"UNKNOWN,NONE,LOAD_SHED,USER,PCS,CONFIGURATION,FAULT\"}, \"relay-controllable\": {\"name\": \"Can the circuit's relay be commanded by the user?\", \"datatype\": \"boolean\"}}}, \"breaker\": {\"name\": \"breaker\", \"type\": \"energy.ebus.capability.breaker\", \"properties\": {\"rating\": {\"name\": \"Circuit breaker rating\", \"datatype\": \"integer\", \"unit\": \"A\"}, \"poles\": {\"name\": \"Number of breaker poles\", \"datatype\": \"integer\", \"format\": \"1:4:1\"}}}, \"meter\": {\"name\": \"meter\", \"type\": \"energy.ebus.capability.meter\", \"properties\": {\"current\": {\"name\": \"Measured current\", \"datatype\": \"float\", \"unit\": \"A\"}, \"active-power\": {\"name\": \"Measured active power\", \"datatype\": \"float\", \"unit\": \"W\"}, \"imported-energy\": {\"name\": \"Measured energy imported\", \"datatype\": \"float\", \"unit\": \"Wh\"}, \"exported-energy\": {\"name\": \"Measured energy exported\", \"datatype\": \"float\", \"unit\": \"Wh\"}}}, \"load-shed\": {\"name\": \"load-shed\", \"type\": \"energy.ebus.capability.load-shed\", \"properties\": {\"priority\": {\"name\": \"Configured priority of circuit shedding when off-grid (dominant-power-source != GRID)\", \"datatype\": \"enum\", \"format\": \"UNKNOWN,OFF_GRID,SOC_THRESHOLD,NEVER\", \"settable\": true}}}, \"pcs\": {\"name\": \"pcs\", \"type\": \"energy.ebus.capability.pcs\", \"properties\": {\"managed\": {\"name\": \"Is circuit managed by PCS?\", \"datatype\": \"boolean\"}, \"priority\": {\"name\": \"Circuit PCS priority ranking\", \"datatype\": \"integer\"}}}, \"connection\": {\"name\": \"connection\", \"type\": \"energy.ebus.capability.connection\", \"properties\": {\"feeds-device-id\": {\"name\": \"Homie device-id of the downstream device fed by this circuit\", \"datatype\": \"string\"}, \"feeds-device-type\": {\"name\": \"Homie $type of the downstream device\", \"datatype\": \"string\"}, \"feeds-device-status\": {\"name\": \"Panel's view of comm health to the downstream device\", \"datatype\": \"enum\", \"format\": \"OK,LOST,DEGRADED\"}}}, \"info\": {\"name\": \"info\", \"type\": \"energy.ebus.capability.info\", \"properties\": {\"name\": {\"name\": \"Circuit name\", \"datatype\": \"string\"}, \"spaces\": {\"name\": \"Circuit breaker space number(s) within the load center (comma-separated for multi-pole)\", \"datatype\": \"string\"}}}}, \"children\": [], \"root\": \"sim-40t-001\", \"parent\": \"sim-40t-001\", \"extensions\": []}", "$state": "ready", "breaker/poles": "1", "breaker/rating": "15", "info/name": "Office Outlets", "info/spaces": "11", "load-shed/priority": "NEVER", - "meter/active-power": "-265.6778872000183", - "meter/current": "2.213982393333486", + "meter/active-power": "-296.623342036397", + "meter/current": "2.4718611836366415", "meter/exported-energy": "0.0", "meter/imported-energy": "0.0", "pcs/managed": "true", @@ -18,15 +18,15 @@ "switch/relay-requester": "NONE" }, "0c941ad4041050cc830e740ddddb2f23": { - "$description": "{\"homie\": \"5.0\", \"version\": 1787970490464, \"type\": \"energy.ebus.device.circuit\", \"name\": \"Electric Oven/Range\", \"nodes\": {\"switch\": {\"name\": \"switch\", \"type\": \"energy.ebus.capability.switch\", \"properties\": {\"relay\": {\"name\": \"Circuit relay state\", \"datatype\": \"enum\", \"format\": \"UNKNOWN,OPEN,CLOSED\", \"settable\": true}, \"relay-requester\": {\"name\": \"Actor requesting the relay state\", \"datatype\": \"enum\", \"format\": \"UNKNOWN,NONE,LOAD_SHED,USER,PCS,CONFIGURATION,FAULT\"}, \"relay-controllable\": {\"name\": \"Can the circuit's relay be commanded by the user?\", \"datatype\": \"boolean\"}}}, \"breaker\": {\"name\": \"breaker\", \"type\": \"energy.ebus.capability.breaker\", \"properties\": {\"rating\": {\"name\": \"Circuit breaker rating\", \"datatype\": \"integer\", \"unit\": \"A\"}, \"poles\": {\"name\": \"Number of breaker poles\", \"datatype\": \"integer\", \"format\": \"1:4:1\"}}}, \"meter\": {\"name\": \"meter\", \"type\": \"energy.ebus.capability.meter\", \"properties\": {\"current\": {\"name\": \"Measured current\", \"datatype\": \"float\", \"unit\": \"A\"}, \"active-power\": {\"name\": \"Measured active power\", \"datatype\": \"float\", \"unit\": \"W\"}, \"imported-energy\": {\"name\": \"Measured energy imported\", \"datatype\": \"float\", \"unit\": \"Wh\"}, \"exported-energy\": {\"name\": \"Measured energy exported\", \"datatype\": \"float\", \"unit\": \"Wh\"}}}, \"load-shed\": {\"name\": \"load-shed\", \"type\": \"energy.ebus.capability.load-shed\", \"properties\": {\"priority\": {\"name\": \"Configured priority of circuit shedding when off-grid (dominant-power-source != GRID)\", \"datatype\": \"enum\", \"format\": \"UNKNOWN,OFF_GRID,SOC_THRESHOLD,NEVER\", \"settable\": true}}}, \"pcs\": {\"name\": \"pcs\", \"type\": \"energy.ebus.capability.pcs\", \"properties\": {\"managed\": {\"name\": \"Is circuit managed by PCS?\", \"datatype\": \"boolean\"}, \"priority\": {\"name\": \"Circuit PCS priority ranking\", \"datatype\": \"integer\"}}}, \"connection\": {\"name\": \"connection\", \"type\": \"energy.ebus.capability.connection\", \"properties\": {\"feeds-device-id\": {\"name\": \"Homie device-id of the downstream device fed by this circuit\", \"datatype\": \"string\"}, \"feeds-device-type\": {\"name\": \"Homie $type of the downstream device\", \"datatype\": \"string\"}, \"feeds-device-status\": {\"name\": \"Panel's view of comm health to the downstream device\", \"datatype\": \"enum\", \"format\": \"OK,LOST,DEGRADED\"}}}, \"info\": {\"name\": \"info\", \"type\": \"energy.ebus.capability.info\", \"properties\": {\"name\": {\"name\": \"Circuit name\", \"datatype\": \"string\"}, \"spaces\": {\"name\": \"Circuit breaker space number(s) within the load center (comma-separated for multi-pole)\", \"datatype\": \"string\"}}}}, \"children\": [], \"root\": \"sim-40t-001\", \"parent\": \"sim-40t-001\", \"extensions\": []}", + "$description": "{\"homie\": \"5.0\", \"version\": 1791309827360, \"type\": \"energy.ebus.device.circuit\", \"name\": \"Electric Oven/Range\", \"nodes\": {\"switch\": {\"name\": \"switch\", \"type\": \"energy.ebus.capability.switch\", \"properties\": {\"relay\": {\"name\": \"Circuit relay state\", \"datatype\": \"enum\", \"format\": \"UNKNOWN,OPEN,CLOSED\", \"settable\": true}, \"relay-requester\": {\"name\": \"Actor requesting the relay state\", \"datatype\": \"enum\", \"format\": \"UNKNOWN,NONE,LOAD_SHED,USER,PCS,CONFIGURATION,FAULT\"}, \"relay-controllable\": {\"name\": \"Can the circuit's relay be commanded by the user?\", \"datatype\": \"boolean\"}}}, \"breaker\": {\"name\": \"breaker\", \"type\": \"energy.ebus.capability.breaker\", \"properties\": {\"rating\": {\"name\": \"Circuit breaker rating\", \"datatype\": \"integer\", \"unit\": \"A\"}, \"poles\": {\"name\": \"Number of breaker poles\", \"datatype\": \"integer\", \"format\": \"1:4:1\"}}}, \"meter\": {\"name\": \"meter\", \"type\": \"energy.ebus.capability.meter\", \"properties\": {\"current\": {\"name\": \"Measured current\", \"datatype\": \"float\", \"unit\": \"A\"}, \"active-power\": {\"name\": \"Measured active power\", \"datatype\": \"float\", \"unit\": \"W\"}, \"imported-energy\": {\"name\": \"Measured energy imported\", \"datatype\": \"float\", \"unit\": \"Wh\"}, \"exported-energy\": {\"name\": \"Measured energy exported\", \"datatype\": \"float\", \"unit\": \"Wh\"}}}, \"load-shed\": {\"name\": \"load-shed\", \"type\": \"energy.ebus.capability.load-shed\", \"properties\": {\"priority\": {\"name\": \"Configured priority of circuit shedding when off-grid (dominant-power-source != GRID)\", \"datatype\": \"enum\", \"format\": \"UNKNOWN,OFF_GRID,SOC_THRESHOLD,NEVER\", \"settable\": true}}}, \"pcs\": {\"name\": \"pcs\", \"type\": \"energy.ebus.capability.pcs\", \"properties\": {\"managed\": {\"name\": \"Is circuit managed by PCS?\", \"datatype\": \"boolean\"}, \"priority\": {\"name\": \"Circuit PCS priority ranking\", \"datatype\": \"integer\"}}}, \"connection\": {\"name\": \"connection\", \"type\": \"energy.ebus.capability.connection\", \"properties\": {\"feeds-device-id\": {\"name\": \"Homie device-id of the downstream device fed by this circuit\", \"datatype\": \"string\"}, \"feeds-device-type\": {\"name\": \"Homie $type of the downstream device\", \"datatype\": \"string\"}, \"feeds-device-status\": {\"name\": \"Panel's view of comm health to the downstream device\", \"datatype\": \"enum\", \"format\": \"OK,LOST,DEGRADED\"}}}, \"info\": {\"name\": \"info\", \"type\": \"energy.ebus.capability.info\", \"properties\": {\"name\": {\"name\": \"Circuit name\", \"datatype\": \"string\"}, \"spaces\": {\"name\": \"Circuit breaker space number(s) within the load center (comma-separated for multi-pole)\", \"datatype\": \"string\"}}}}, \"children\": [], \"root\": \"sim-40t-001\", \"parent\": \"sim-40t-001\", \"extensions\": []}", "$state": "ready", "breaker/poles": "2", "breaker/rating": "40", "info/name": "Electric Oven/Range", "info/spaces": "28,30", "load-shed/priority": "OFF_GRID", - "meter/active-power": "-5000.0", - "meter/current": "20.833333333333332", + "meter/active-power": "0.0", + "meter/current": "0.0", "meter/exported-energy": "0.0", "meter/imported-energy": "0.0", "pcs/managed": "true", @@ -36,15 +36,15 @@ "switch/relay-requester": "NONE" }, "14c507fcbb5f539ba40b60b5e5655a72": { - "$description": "{\"homie\": \"5.0\", \"version\": 1787970490461, \"type\": \"energy.ebus.device.circuit\", \"name\": \"Laundry Room Outlets\", \"nodes\": {\"switch\": {\"name\": \"switch\", \"type\": \"energy.ebus.capability.switch\", \"properties\": {\"relay\": {\"name\": \"Circuit relay state\", \"datatype\": \"enum\", \"format\": \"UNKNOWN,OPEN,CLOSED\", \"settable\": true}, \"relay-requester\": {\"name\": \"Actor requesting the relay state\", \"datatype\": \"enum\", \"format\": \"UNKNOWN,NONE,LOAD_SHED,USER,PCS,CONFIGURATION,FAULT\"}, \"relay-controllable\": {\"name\": \"Can the circuit's relay be commanded by the user?\", \"datatype\": \"boolean\"}}}, \"breaker\": {\"name\": \"breaker\", \"type\": \"energy.ebus.capability.breaker\", \"properties\": {\"rating\": {\"name\": \"Circuit breaker rating\", \"datatype\": \"integer\", \"unit\": \"A\"}, \"poles\": {\"name\": \"Number of breaker poles\", \"datatype\": \"integer\", \"format\": \"1:4:1\"}}}, \"meter\": {\"name\": \"meter\", \"type\": \"energy.ebus.capability.meter\", \"properties\": {\"current\": {\"name\": \"Measured current\", \"datatype\": \"float\", \"unit\": \"A\"}, \"active-power\": {\"name\": \"Measured active power\", \"datatype\": \"float\", \"unit\": \"W\"}, \"imported-energy\": {\"name\": \"Measured energy imported\", \"datatype\": \"float\", \"unit\": \"Wh\"}, \"exported-energy\": {\"name\": \"Measured energy exported\", \"datatype\": \"float\", \"unit\": \"Wh\"}}}, \"load-shed\": {\"name\": \"load-shed\", \"type\": \"energy.ebus.capability.load-shed\", \"properties\": {\"priority\": {\"name\": \"Configured priority of circuit shedding when off-grid (dominant-power-source != GRID)\", \"datatype\": \"enum\", \"format\": \"UNKNOWN,OFF_GRID,SOC_THRESHOLD,NEVER\", \"settable\": true}}}, \"pcs\": {\"name\": \"pcs\", \"type\": \"energy.ebus.capability.pcs\", \"properties\": {\"managed\": {\"name\": \"Is circuit managed by PCS?\", \"datatype\": \"boolean\"}, \"priority\": {\"name\": \"Circuit PCS priority ranking\", \"datatype\": \"integer\"}}}, \"connection\": {\"name\": \"connection\", \"type\": \"energy.ebus.capability.connection\", \"properties\": {\"feeds-device-id\": {\"name\": \"Homie device-id of the downstream device fed by this circuit\", \"datatype\": \"string\"}, \"feeds-device-type\": {\"name\": \"Homie $type of the downstream device\", \"datatype\": \"string\"}, \"feeds-device-status\": {\"name\": \"Panel's view of comm health to the downstream device\", \"datatype\": \"enum\", \"format\": \"OK,LOST,DEGRADED\"}}}, \"info\": {\"name\": \"info\", \"type\": \"energy.ebus.capability.info\", \"properties\": {\"name\": {\"name\": \"Circuit name\", \"datatype\": \"string\"}, \"spaces\": {\"name\": \"Circuit breaker space number(s) within the load center (comma-separated for multi-pole)\", \"datatype\": \"string\"}}}}, \"children\": [], \"root\": \"sim-40t-001\", \"parent\": \"sim-40t-001\", \"extensions\": []}", + "$description": "{\"homie\": \"5.0\", \"version\": 1791309827357, \"type\": \"energy.ebus.device.circuit\", \"name\": \"Laundry Room Outlets\", \"nodes\": {\"switch\": {\"name\": \"switch\", \"type\": \"energy.ebus.capability.switch\", \"properties\": {\"relay\": {\"name\": \"Circuit relay state\", \"datatype\": \"enum\", \"format\": \"UNKNOWN,OPEN,CLOSED\", \"settable\": true}, \"relay-requester\": {\"name\": \"Actor requesting the relay state\", \"datatype\": \"enum\", \"format\": \"UNKNOWN,NONE,LOAD_SHED,USER,PCS,CONFIGURATION,FAULT\"}, \"relay-controllable\": {\"name\": \"Can the circuit's relay be commanded by the user?\", \"datatype\": \"boolean\"}}}, \"breaker\": {\"name\": \"breaker\", \"type\": \"energy.ebus.capability.breaker\", \"properties\": {\"rating\": {\"name\": \"Circuit breaker rating\", \"datatype\": \"integer\", \"unit\": \"A\"}, \"poles\": {\"name\": \"Number of breaker poles\", \"datatype\": \"integer\", \"format\": \"1:4:1\"}}}, \"meter\": {\"name\": \"meter\", \"type\": \"energy.ebus.capability.meter\", \"properties\": {\"current\": {\"name\": \"Measured current\", \"datatype\": \"float\", \"unit\": \"A\"}, \"active-power\": {\"name\": \"Measured active power\", \"datatype\": \"float\", \"unit\": \"W\"}, \"imported-energy\": {\"name\": \"Measured energy imported\", \"datatype\": \"float\", \"unit\": \"Wh\"}, \"exported-energy\": {\"name\": \"Measured energy exported\", \"datatype\": \"float\", \"unit\": \"Wh\"}}}, \"load-shed\": {\"name\": \"load-shed\", \"type\": \"energy.ebus.capability.load-shed\", \"properties\": {\"priority\": {\"name\": \"Configured priority of circuit shedding when off-grid (dominant-power-source != GRID)\", \"datatype\": \"enum\", \"format\": \"UNKNOWN,OFF_GRID,SOC_THRESHOLD,NEVER\", \"settable\": true}}}, \"pcs\": {\"name\": \"pcs\", \"type\": \"energy.ebus.capability.pcs\", \"properties\": {\"managed\": {\"name\": \"Is circuit managed by PCS?\", \"datatype\": \"boolean\"}, \"priority\": {\"name\": \"Circuit PCS priority ranking\", \"datatype\": \"integer\"}}}, \"connection\": {\"name\": \"connection\", \"type\": \"energy.ebus.capability.connection\", \"properties\": {\"feeds-device-id\": {\"name\": \"Homie device-id of the downstream device fed by this circuit\", \"datatype\": \"string\"}, \"feeds-device-type\": {\"name\": \"Homie $type of the downstream device\", \"datatype\": \"string\"}, \"feeds-device-status\": {\"name\": \"Panel's view of comm health to the downstream device\", \"datatype\": \"enum\", \"format\": \"OK,LOST,DEGRADED\"}}}, \"info\": {\"name\": \"info\", \"type\": \"energy.ebus.capability.info\", \"properties\": {\"name\": {\"name\": \"Circuit name\", \"datatype\": \"string\"}, \"spaces\": {\"name\": \"Circuit breaker space number(s) within the load center (comma-separated for multi-pole)\", \"datatype\": \"string\"}}}}, \"children\": [], \"root\": \"sim-40t-001\", \"parent\": \"sim-40t-001\", \"extensions\": []}", "$state": "ready", "breaker/poles": "1", "breaker/rating": "15", "info/name": "Laundry Room Outlets", "info/spaces": "13", "load-shed/priority": "NEVER", - "meter/active-power": "-165.41177631269989", - "meter/current": "1.378431469272499", + "meter/active-power": "-157.59107721471423", + "meter/current": "1.3132589767892853", "meter/exported-energy": "0.0", "meter/imported-energy": "0.0", "pcs/managed": "true", @@ -54,15 +54,15 @@ "switch/relay-requester": "NONE" }, "17e98544c51a59d98331dd263df2abe1": { - "$description": "{\"homie\": \"5.0\", \"version\": 1787970490461, \"type\": \"energy.ebus.device.circuit\", \"name\": \"Guest Room Outlets\", \"nodes\": {\"switch\": {\"name\": \"switch\", \"type\": \"energy.ebus.capability.switch\", \"properties\": {\"relay\": {\"name\": \"Circuit relay state\", \"datatype\": \"enum\", \"format\": \"UNKNOWN,OPEN,CLOSED\", \"settable\": true}, \"relay-requester\": {\"name\": \"Actor requesting the relay state\", \"datatype\": \"enum\", \"format\": \"UNKNOWN,NONE,LOAD_SHED,USER,PCS,CONFIGURATION,FAULT\"}, \"relay-controllable\": {\"name\": \"Can the circuit's relay be commanded by the user?\", \"datatype\": \"boolean\"}}}, \"breaker\": {\"name\": \"breaker\", \"type\": \"energy.ebus.capability.breaker\", \"properties\": {\"rating\": {\"name\": \"Circuit breaker rating\", \"datatype\": \"integer\", \"unit\": \"A\"}, \"poles\": {\"name\": \"Number of breaker poles\", \"datatype\": \"integer\", \"format\": \"1:4:1\"}}}, \"meter\": {\"name\": \"meter\", \"type\": \"energy.ebus.capability.meter\", \"properties\": {\"current\": {\"name\": \"Measured current\", \"datatype\": \"float\", \"unit\": \"A\"}, \"active-power\": {\"name\": \"Measured active power\", \"datatype\": \"float\", \"unit\": \"W\"}, \"imported-energy\": {\"name\": \"Measured energy imported\", \"datatype\": \"float\", \"unit\": \"Wh\"}, \"exported-energy\": {\"name\": \"Measured energy exported\", \"datatype\": \"float\", \"unit\": \"Wh\"}}}, \"load-shed\": {\"name\": \"load-shed\", \"type\": \"energy.ebus.capability.load-shed\", \"properties\": {\"priority\": {\"name\": \"Configured priority of circuit shedding when off-grid (dominant-power-source != GRID)\", \"datatype\": \"enum\", \"format\": \"UNKNOWN,OFF_GRID,SOC_THRESHOLD,NEVER\", \"settable\": true}}}, \"pcs\": {\"name\": \"pcs\", \"type\": \"energy.ebus.capability.pcs\", \"properties\": {\"managed\": {\"name\": \"Is circuit managed by PCS?\", \"datatype\": \"boolean\"}, \"priority\": {\"name\": \"Circuit PCS priority ranking\", \"datatype\": \"integer\"}}}, \"connection\": {\"name\": \"connection\", \"type\": \"energy.ebus.capability.connection\", \"properties\": {\"feeds-device-id\": {\"name\": \"Homie device-id of the downstream device fed by this circuit\", \"datatype\": \"string\"}, \"feeds-device-type\": {\"name\": \"Homie $type of the downstream device\", \"datatype\": \"string\"}, \"feeds-device-status\": {\"name\": \"Panel's view of comm health to the downstream device\", \"datatype\": \"enum\", \"format\": \"OK,LOST,DEGRADED\"}}}, \"info\": {\"name\": \"info\", \"type\": \"energy.ebus.capability.info\", \"properties\": {\"name\": {\"name\": \"Circuit name\", \"datatype\": \"string\"}, \"spaces\": {\"name\": \"Circuit breaker space number(s) within the load center (comma-separated for multi-pole)\", \"datatype\": \"string\"}}}}, \"children\": [], \"root\": \"sim-40t-001\", \"parent\": \"sim-40t-001\", \"extensions\": []}", + "$description": "{\"homie\": \"5.0\", \"version\": 1791309827358, \"type\": \"energy.ebus.device.circuit\", \"name\": \"Guest Room Outlets\", \"nodes\": {\"switch\": {\"name\": \"switch\", \"type\": \"energy.ebus.capability.switch\", \"properties\": {\"relay\": {\"name\": \"Circuit relay state\", \"datatype\": \"enum\", \"format\": \"UNKNOWN,OPEN,CLOSED\", \"settable\": true}, \"relay-requester\": {\"name\": \"Actor requesting the relay state\", \"datatype\": \"enum\", \"format\": \"UNKNOWN,NONE,LOAD_SHED,USER,PCS,CONFIGURATION,FAULT\"}, \"relay-controllable\": {\"name\": \"Can the circuit's relay be commanded by the user?\", \"datatype\": \"boolean\"}}}, \"breaker\": {\"name\": \"breaker\", \"type\": \"energy.ebus.capability.breaker\", \"properties\": {\"rating\": {\"name\": \"Circuit breaker rating\", \"datatype\": \"integer\", \"unit\": \"A\"}, \"poles\": {\"name\": \"Number of breaker poles\", \"datatype\": \"integer\", \"format\": \"1:4:1\"}}}, \"meter\": {\"name\": \"meter\", \"type\": \"energy.ebus.capability.meter\", \"properties\": {\"current\": {\"name\": \"Measured current\", \"datatype\": \"float\", \"unit\": \"A\"}, \"active-power\": {\"name\": \"Measured active power\", \"datatype\": \"float\", \"unit\": \"W\"}, \"imported-energy\": {\"name\": \"Measured energy imported\", \"datatype\": \"float\", \"unit\": \"Wh\"}, \"exported-energy\": {\"name\": \"Measured energy exported\", \"datatype\": \"float\", \"unit\": \"Wh\"}}}, \"load-shed\": {\"name\": \"load-shed\", \"type\": \"energy.ebus.capability.load-shed\", \"properties\": {\"priority\": {\"name\": \"Configured priority of circuit shedding when off-grid (dominant-power-source != GRID)\", \"datatype\": \"enum\", \"format\": \"UNKNOWN,OFF_GRID,SOC_THRESHOLD,NEVER\", \"settable\": true}}}, \"pcs\": {\"name\": \"pcs\", \"type\": \"energy.ebus.capability.pcs\", \"properties\": {\"managed\": {\"name\": \"Is circuit managed by PCS?\", \"datatype\": \"boolean\"}, \"priority\": {\"name\": \"Circuit PCS priority ranking\", \"datatype\": \"integer\"}}}, \"connection\": {\"name\": \"connection\", \"type\": \"energy.ebus.capability.connection\", \"properties\": {\"feeds-device-id\": {\"name\": \"Homie device-id of the downstream device fed by this circuit\", \"datatype\": \"string\"}, \"feeds-device-type\": {\"name\": \"Homie $type of the downstream device\", \"datatype\": \"string\"}, \"feeds-device-status\": {\"name\": \"Panel's view of comm health to the downstream device\", \"datatype\": \"enum\", \"format\": \"OK,LOST,DEGRADED\"}}}, \"info\": {\"name\": \"info\", \"type\": \"energy.ebus.capability.info\", \"properties\": {\"name\": {\"name\": \"Circuit name\", \"datatype\": \"string\"}, \"spaces\": {\"name\": \"Circuit breaker space number(s) within the load center (comma-separated for multi-pole)\", \"datatype\": \"string\"}}}}, \"children\": [], \"root\": \"sim-40t-001\", \"parent\": \"sim-40t-001\", \"extensions\": []}", "$state": "ready", "breaker/poles": "1", "breaker/rating": "15", "info/name": "Guest Room Outlets", "info/spaces": "14", "load-shed/priority": "NEVER", - "meter/active-power": "-138.43139883078936", - "meter/current": "1.153594990256578", + "meter/active-power": "-158.5914272280169", + "meter/current": "1.3215952269001408", "meter/exported-energy": "0.0", "meter/imported-energy": "0.0", "pcs/managed": "true", @@ -72,15 +72,15 @@ "switch/relay-requester": "NONE" }, "3feb088e635f50bcad1ad38c9e79f82c": { - "$description": "{\"homie\": \"5.0\", \"version\": 1787970490464, \"type\": \"energy.ebus.device.circuit\", \"name\": \"Water Heater\", \"nodes\": {\"switch\": {\"name\": \"switch\", \"type\": \"energy.ebus.capability.switch\", \"properties\": {\"relay\": {\"name\": \"Circuit relay state\", \"datatype\": \"enum\", \"format\": \"UNKNOWN,OPEN,CLOSED\", \"settable\": true}, \"relay-requester\": {\"name\": \"Actor requesting the relay state\", \"datatype\": \"enum\", \"format\": \"UNKNOWN,NONE,LOAD_SHED,USER,PCS,CONFIGURATION,FAULT\"}, \"relay-controllable\": {\"name\": \"Can the circuit's relay be commanded by the user?\", \"datatype\": \"boolean\"}}}, \"breaker\": {\"name\": \"breaker\", \"type\": \"energy.ebus.capability.breaker\", \"properties\": {\"rating\": {\"name\": \"Circuit breaker rating\", \"datatype\": \"integer\", \"unit\": \"A\"}, \"poles\": {\"name\": \"Number of breaker poles\", \"datatype\": \"integer\", \"format\": \"1:4:1\"}}}, \"meter\": {\"name\": \"meter\", \"type\": \"energy.ebus.capability.meter\", \"properties\": {\"current\": {\"name\": \"Measured current\", \"datatype\": \"float\", \"unit\": \"A\"}, \"active-power\": {\"name\": \"Measured active power\", \"datatype\": \"float\", \"unit\": \"W\"}, \"imported-energy\": {\"name\": \"Measured energy imported\", \"datatype\": \"float\", \"unit\": \"Wh\"}, \"exported-energy\": {\"name\": \"Measured energy exported\", \"datatype\": \"float\", \"unit\": \"Wh\"}}}, \"load-shed\": {\"name\": \"load-shed\", \"type\": \"energy.ebus.capability.load-shed\", \"properties\": {\"priority\": {\"name\": \"Configured priority of circuit shedding when off-grid (dominant-power-source != GRID)\", \"datatype\": \"enum\", \"format\": \"UNKNOWN,OFF_GRID,SOC_THRESHOLD,NEVER\", \"settable\": true}}}, \"pcs\": {\"name\": \"pcs\", \"type\": \"energy.ebus.capability.pcs\", \"properties\": {\"managed\": {\"name\": \"Is circuit managed by PCS?\", \"datatype\": \"boolean\"}, \"priority\": {\"name\": \"Circuit PCS priority ranking\", \"datatype\": \"integer\"}}}, \"connection\": {\"name\": \"connection\", \"type\": \"energy.ebus.capability.connection\", \"properties\": {\"feeds-device-id\": {\"name\": \"Homie device-id of the downstream device fed by this circuit\", \"datatype\": \"string\"}, \"feeds-device-type\": {\"name\": \"Homie $type of the downstream device\", \"datatype\": \"string\"}, \"feeds-device-status\": {\"name\": \"Panel's view of comm health to the downstream device\", \"datatype\": \"enum\", \"format\": \"OK,LOST,DEGRADED\"}}}, \"info\": {\"name\": \"info\", \"type\": \"energy.ebus.capability.info\", \"properties\": {\"name\": {\"name\": \"Circuit name\", \"datatype\": \"string\"}, \"spaces\": {\"name\": \"Circuit breaker space number(s) within the load center (comma-separated for multi-pole)\", \"datatype\": \"string\"}}}}, \"children\": [], \"root\": \"sim-40t-001\", \"parent\": \"sim-40t-001\", \"extensions\": []}", + "$description": "{\"homie\": \"5.0\", \"version\": 1791309827360, \"type\": \"energy.ebus.device.circuit\", \"name\": \"Water Heater\", \"nodes\": {\"switch\": {\"name\": \"switch\", \"type\": \"energy.ebus.capability.switch\", \"properties\": {\"relay\": {\"name\": \"Circuit relay state\", \"datatype\": \"enum\", \"format\": \"UNKNOWN,OPEN,CLOSED\", \"settable\": true}, \"relay-requester\": {\"name\": \"Actor requesting the relay state\", \"datatype\": \"enum\", \"format\": \"UNKNOWN,NONE,LOAD_SHED,USER,PCS,CONFIGURATION,FAULT\"}, \"relay-controllable\": {\"name\": \"Can the circuit's relay be commanded by the user?\", \"datatype\": \"boolean\"}}}, \"breaker\": {\"name\": \"breaker\", \"type\": \"energy.ebus.capability.breaker\", \"properties\": {\"rating\": {\"name\": \"Circuit breaker rating\", \"datatype\": \"integer\", \"unit\": \"A\"}, \"poles\": {\"name\": \"Number of breaker poles\", \"datatype\": \"integer\", \"format\": \"1:4:1\"}}}, \"meter\": {\"name\": \"meter\", \"type\": \"energy.ebus.capability.meter\", \"properties\": {\"current\": {\"name\": \"Measured current\", \"datatype\": \"float\", \"unit\": \"A\"}, \"active-power\": {\"name\": \"Measured active power\", \"datatype\": \"float\", \"unit\": \"W\"}, \"imported-energy\": {\"name\": \"Measured energy imported\", \"datatype\": \"float\", \"unit\": \"Wh\"}, \"exported-energy\": {\"name\": \"Measured energy exported\", \"datatype\": \"float\", \"unit\": \"Wh\"}}}, \"load-shed\": {\"name\": \"load-shed\", \"type\": \"energy.ebus.capability.load-shed\", \"properties\": {\"priority\": {\"name\": \"Configured priority of circuit shedding when off-grid (dominant-power-source != GRID)\", \"datatype\": \"enum\", \"format\": \"UNKNOWN,OFF_GRID,SOC_THRESHOLD,NEVER\", \"settable\": true}}}, \"pcs\": {\"name\": \"pcs\", \"type\": \"energy.ebus.capability.pcs\", \"properties\": {\"managed\": {\"name\": \"Is circuit managed by PCS?\", \"datatype\": \"boolean\"}, \"priority\": {\"name\": \"Circuit PCS priority ranking\", \"datatype\": \"integer\"}}}, \"connection\": {\"name\": \"connection\", \"type\": \"energy.ebus.capability.connection\", \"properties\": {\"feeds-device-id\": {\"name\": \"Homie device-id of the downstream device fed by this circuit\", \"datatype\": \"string\"}, \"feeds-device-type\": {\"name\": \"Homie $type of the downstream device\", \"datatype\": \"string\"}, \"feeds-device-status\": {\"name\": \"Panel's view of comm health to the downstream device\", \"datatype\": \"enum\", \"format\": \"OK,LOST,DEGRADED\"}}}, \"info\": {\"name\": \"info\", \"type\": \"energy.ebus.capability.info\", \"properties\": {\"name\": {\"name\": \"Circuit name\", \"datatype\": \"string\"}, \"spaces\": {\"name\": \"Circuit breaker space number(s) within the load center (comma-separated for multi-pole)\", \"datatype\": \"string\"}}}}, \"children\": [], \"root\": \"sim-40t-001\", \"parent\": \"sim-40t-001\", \"extensions\": []}", "$state": "ready", "breaker/poles": "2", "breaker/rating": "30", "info/name": "Water Heater", "info/spaces": "31,33", "load-shed/priority": "OFF_GRID", - "meter/active-power": "-4500.0", - "meter/current": "18.75", + "meter/active-power": "-2429.8490364053837", + "meter/current": "10.124370985022432", "meter/exported-energy": "0.0", "meter/imported-energy": "0.0", "pcs/managed": "true", @@ -90,15 +90,15 @@ "switch/relay-requester": "NONE" }, "51ab52ca7e085204bd300a35731c1501": { - "$description": "{\"homie\": \"5.0\", \"version\": 1787970490462, \"type\": \"energy.ebus.device.circuit\", \"name\": \"Refrigerator\", \"nodes\": {\"switch\": {\"name\": \"switch\", \"type\": \"energy.ebus.capability.switch\", \"properties\": {\"relay\": {\"name\": \"Circuit relay state\", \"datatype\": \"enum\", \"format\": \"UNKNOWN,OPEN,CLOSED\"}, \"relay-requester\": {\"name\": \"Actor requesting the relay state\", \"datatype\": \"enum\", \"format\": \"UNKNOWN,NONE,LOAD_SHED,USER,PCS,CONFIGURATION,FAULT\"}, \"relay-controllable\": {\"name\": \"Can the circuit's relay be commanded by the user?\", \"datatype\": \"boolean\"}}}, \"breaker\": {\"name\": \"breaker\", \"type\": \"energy.ebus.capability.breaker\", \"properties\": {\"rating\": {\"name\": \"Circuit breaker rating\", \"datatype\": \"integer\", \"unit\": \"A\"}, \"poles\": {\"name\": \"Number of breaker poles\", \"datatype\": \"integer\", \"format\": \"1:4:1\"}}}, \"meter\": {\"name\": \"meter\", \"type\": \"energy.ebus.capability.meter\", \"properties\": {\"current\": {\"name\": \"Measured current\", \"datatype\": \"float\", \"unit\": \"A\"}, \"active-power\": {\"name\": \"Measured active power\", \"datatype\": \"float\", \"unit\": \"W\"}, \"imported-energy\": {\"name\": \"Measured energy imported\", \"datatype\": \"float\", \"unit\": \"Wh\"}, \"exported-energy\": {\"name\": \"Measured energy exported\", \"datatype\": \"float\", \"unit\": \"Wh\"}}}, \"load-shed\": {\"name\": \"load-shed\", \"type\": \"energy.ebus.capability.load-shed\", \"properties\": {\"priority\": {\"name\": \"Configured priority of circuit shedding when off-grid (dominant-power-source != GRID)\", \"datatype\": \"enum\", \"format\": \"UNKNOWN,OFF_GRID,SOC_THRESHOLD,NEVER\", \"settable\": true}}}, \"pcs\": {\"name\": \"pcs\", \"type\": \"energy.ebus.capability.pcs\", \"properties\": {\"managed\": {\"name\": \"Is circuit managed by PCS?\", \"datatype\": \"boolean\"}, \"priority\": {\"name\": \"Circuit PCS priority ranking\", \"datatype\": \"integer\"}}}, \"connection\": {\"name\": \"connection\", \"type\": \"energy.ebus.capability.connection\", \"properties\": {\"feeds-device-id\": {\"name\": \"Homie device-id of the downstream device fed by this circuit\", \"datatype\": \"string\"}, \"feeds-device-type\": {\"name\": \"Homie $type of the downstream device\", \"datatype\": \"string\"}, \"feeds-device-status\": {\"name\": \"Panel's view of comm health to the downstream device\", \"datatype\": \"enum\", \"format\": \"OK,LOST,DEGRADED\"}}}, \"info\": {\"name\": \"info\", \"type\": \"energy.ebus.capability.info\", \"properties\": {\"name\": {\"name\": \"Circuit name\", \"datatype\": \"string\"}, \"spaces\": {\"name\": \"Circuit breaker space number(s) within the load center (comma-separated for multi-pole)\", \"datatype\": \"string\"}}}}, \"children\": [], \"root\": \"sim-40t-001\", \"parent\": \"sim-40t-001\", \"extensions\": []}", + "$description": "{\"homie\": \"5.0\", \"version\": 1791309827358, \"type\": \"energy.ebus.device.circuit\", \"name\": \"Refrigerator\", \"nodes\": {\"switch\": {\"name\": \"switch\", \"type\": \"energy.ebus.capability.switch\", \"properties\": {\"relay\": {\"name\": \"Circuit relay state\", \"datatype\": \"enum\", \"format\": \"UNKNOWN,OPEN,CLOSED\"}, \"relay-requester\": {\"name\": \"Actor requesting the relay state\", \"datatype\": \"enum\", \"format\": \"UNKNOWN,NONE,LOAD_SHED,USER,PCS,CONFIGURATION,FAULT\"}, \"relay-controllable\": {\"name\": \"Can the circuit's relay be commanded by the user?\", \"datatype\": \"boolean\"}}}, \"breaker\": {\"name\": \"breaker\", \"type\": \"energy.ebus.capability.breaker\", \"properties\": {\"rating\": {\"name\": \"Circuit breaker rating\", \"datatype\": \"integer\", \"unit\": \"A\"}, \"poles\": {\"name\": \"Number of breaker poles\", \"datatype\": \"integer\", \"format\": \"1:4:1\"}}}, \"meter\": {\"name\": \"meter\", \"type\": \"energy.ebus.capability.meter\", \"properties\": {\"current\": {\"name\": \"Measured current\", \"datatype\": \"float\", \"unit\": \"A\"}, \"active-power\": {\"name\": \"Measured active power\", \"datatype\": \"float\", \"unit\": \"W\"}, \"imported-energy\": {\"name\": \"Measured energy imported\", \"datatype\": \"float\", \"unit\": \"Wh\"}, \"exported-energy\": {\"name\": \"Measured energy exported\", \"datatype\": \"float\", \"unit\": \"Wh\"}}}, \"load-shed\": {\"name\": \"load-shed\", \"type\": \"energy.ebus.capability.load-shed\", \"properties\": {\"priority\": {\"name\": \"Configured priority of circuit shedding when off-grid (dominant-power-source != GRID)\", \"datatype\": \"enum\", \"format\": \"UNKNOWN,OFF_GRID,SOC_THRESHOLD,NEVER\", \"settable\": true}}}, \"pcs\": {\"name\": \"pcs\", \"type\": \"energy.ebus.capability.pcs\", \"properties\": {\"managed\": {\"name\": \"Is circuit managed by PCS?\", \"datatype\": \"boolean\"}, \"priority\": {\"name\": \"Circuit PCS priority ranking\", \"datatype\": \"integer\"}}}, \"connection\": {\"name\": \"connection\", \"type\": \"energy.ebus.capability.connection\", \"properties\": {\"feeds-device-id\": {\"name\": \"Homie device-id of the downstream device fed by this circuit\", \"datatype\": \"string\"}, \"feeds-device-type\": {\"name\": \"Homie $type of the downstream device\", \"datatype\": \"string\"}, \"feeds-device-status\": {\"name\": \"Panel's view of comm health to the downstream device\", \"datatype\": \"enum\", \"format\": \"OK,LOST,DEGRADED\"}}}, \"info\": {\"name\": \"info\", \"type\": \"energy.ebus.capability.info\", \"properties\": {\"name\": {\"name\": \"Circuit name\", \"datatype\": \"string\"}, \"spaces\": {\"name\": \"Circuit breaker space number(s) within the load center (comma-separated for multi-pole)\", \"datatype\": \"string\"}}}}, \"children\": [], \"root\": \"sim-40t-001\", \"parent\": \"sim-40t-001\", \"extensions\": []}", "$state": "ready", "breaker/poles": "1", "breaker/rating": "20", "info/name": "Refrigerator", "info/spaces": "15", "load-shed/priority": "NEVER", - "meter/active-power": "-120.24732835890829", - "meter/current": "1.0020610696575691", + "meter/active-power": "-117.89846406824168", + "meter/current": "0.9824872005686807", "meter/exported-energy": "0.0", "meter/imported-energy": "0.0", "pcs/managed": "false", @@ -108,15 +108,15 @@ "switch/relay-requester": "CONFIGURATION" }, "5239be04f4725708a6f37d750fd5b4ae": { - "$description": "{\"homie\": \"5.0\", \"version\": 1787970490461, \"type\": \"energy.ebus.device.circuit\", \"name\": \"Garage Outlets\", \"nodes\": {\"switch\": {\"name\": \"switch\", \"type\": \"energy.ebus.capability.switch\", \"properties\": {\"relay\": {\"name\": \"Circuit relay state\", \"datatype\": \"enum\", \"format\": \"UNKNOWN,OPEN,CLOSED\", \"settable\": true}, \"relay-requester\": {\"name\": \"Actor requesting the relay state\", \"datatype\": \"enum\", \"format\": \"UNKNOWN,NONE,LOAD_SHED,USER,PCS,CONFIGURATION,FAULT\"}, \"relay-controllable\": {\"name\": \"Can the circuit's relay be commanded by the user?\", \"datatype\": \"boolean\"}}}, \"breaker\": {\"name\": \"breaker\", \"type\": \"energy.ebus.capability.breaker\", \"properties\": {\"rating\": {\"name\": \"Circuit breaker rating\", \"datatype\": \"integer\", \"unit\": \"A\"}, \"poles\": {\"name\": \"Number of breaker poles\", \"datatype\": \"integer\", \"format\": \"1:4:1\"}}}, \"meter\": {\"name\": \"meter\", \"type\": \"energy.ebus.capability.meter\", \"properties\": {\"current\": {\"name\": \"Measured current\", \"datatype\": \"float\", \"unit\": \"A\"}, \"active-power\": {\"name\": \"Measured active power\", \"datatype\": \"float\", \"unit\": \"W\"}, \"imported-energy\": {\"name\": \"Measured energy imported\", \"datatype\": \"float\", \"unit\": \"Wh\"}, \"exported-energy\": {\"name\": \"Measured energy exported\", \"datatype\": \"float\", \"unit\": \"Wh\"}}}, \"load-shed\": {\"name\": \"load-shed\", \"type\": \"energy.ebus.capability.load-shed\", \"properties\": {\"priority\": {\"name\": \"Configured priority of circuit shedding when off-grid (dominant-power-source != GRID)\", \"datatype\": \"enum\", \"format\": \"UNKNOWN,OFF_GRID,SOC_THRESHOLD,NEVER\", \"settable\": true}}}, \"pcs\": {\"name\": \"pcs\", \"type\": \"energy.ebus.capability.pcs\", \"properties\": {\"managed\": {\"name\": \"Is circuit managed by PCS?\", \"datatype\": \"boolean\"}, \"priority\": {\"name\": \"Circuit PCS priority ranking\", \"datatype\": \"integer\"}}}, \"connection\": {\"name\": \"connection\", \"type\": \"energy.ebus.capability.connection\", \"properties\": {\"feeds-device-id\": {\"name\": \"Homie device-id of the downstream device fed by this circuit\", \"datatype\": \"string\"}, \"feeds-device-type\": {\"name\": \"Homie $type of the downstream device\", \"datatype\": \"string\"}, \"feeds-device-status\": {\"name\": \"Panel's view of comm health to the downstream device\", \"datatype\": \"enum\", \"format\": \"OK,LOST,DEGRADED\"}}}, \"info\": {\"name\": \"info\", \"type\": \"energy.ebus.capability.info\", \"properties\": {\"name\": {\"name\": \"Circuit name\", \"datatype\": \"string\"}, \"spaces\": {\"name\": \"Circuit breaker space number(s) within the load center (comma-separated for multi-pole)\", \"datatype\": \"string\"}}}}, \"children\": [], \"root\": \"sim-40t-001\", \"parent\": \"sim-40t-001\", \"extensions\": []}", + "$description": "{\"homie\": \"5.0\", \"version\": 1791309827357, \"type\": \"energy.ebus.device.circuit\", \"name\": \"Garage Outlets\", \"nodes\": {\"switch\": {\"name\": \"switch\", \"type\": \"energy.ebus.capability.switch\", \"properties\": {\"relay\": {\"name\": \"Circuit relay state\", \"datatype\": \"enum\", \"format\": \"UNKNOWN,OPEN,CLOSED\", \"settable\": true}, \"relay-requester\": {\"name\": \"Actor requesting the relay state\", \"datatype\": \"enum\", \"format\": \"UNKNOWN,NONE,LOAD_SHED,USER,PCS,CONFIGURATION,FAULT\"}, \"relay-controllable\": {\"name\": \"Can the circuit's relay be commanded by the user?\", \"datatype\": \"boolean\"}}}, \"breaker\": {\"name\": \"breaker\", \"type\": \"energy.ebus.capability.breaker\", \"properties\": {\"rating\": {\"name\": \"Circuit breaker rating\", \"datatype\": \"integer\", \"unit\": \"A\"}, \"poles\": {\"name\": \"Number of breaker poles\", \"datatype\": \"integer\", \"format\": \"1:4:1\"}}}, \"meter\": {\"name\": \"meter\", \"type\": \"energy.ebus.capability.meter\", \"properties\": {\"current\": {\"name\": \"Measured current\", \"datatype\": \"float\", \"unit\": \"A\"}, \"active-power\": {\"name\": \"Measured active power\", \"datatype\": \"float\", \"unit\": \"W\"}, \"imported-energy\": {\"name\": \"Measured energy imported\", \"datatype\": \"float\", \"unit\": \"Wh\"}, \"exported-energy\": {\"name\": \"Measured energy exported\", \"datatype\": \"float\", \"unit\": \"Wh\"}}}, \"load-shed\": {\"name\": \"load-shed\", \"type\": \"energy.ebus.capability.load-shed\", \"properties\": {\"priority\": {\"name\": \"Configured priority of circuit shedding when off-grid (dominant-power-source != GRID)\", \"datatype\": \"enum\", \"format\": \"UNKNOWN,OFF_GRID,SOC_THRESHOLD,NEVER\", \"settable\": true}}}, \"pcs\": {\"name\": \"pcs\", \"type\": \"energy.ebus.capability.pcs\", \"properties\": {\"managed\": {\"name\": \"Is circuit managed by PCS?\", \"datatype\": \"boolean\"}, \"priority\": {\"name\": \"Circuit PCS priority ranking\", \"datatype\": \"integer\"}}}, \"connection\": {\"name\": \"connection\", \"type\": \"energy.ebus.capability.connection\", \"properties\": {\"feeds-device-id\": {\"name\": \"Homie device-id of the downstream device fed by this circuit\", \"datatype\": \"string\"}, \"feeds-device-type\": {\"name\": \"Homie $type of the downstream device\", \"datatype\": \"string\"}, \"feeds-device-status\": {\"name\": \"Panel's view of comm health to the downstream device\", \"datatype\": \"enum\", \"format\": \"OK,LOST,DEGRADED\"}}}, \"info\": {\"name\": \"info\", \"type\": \"energy.ebus.capability.info\", \"properties\": {\"name\": {\"name\": \"Circuit name\", \"datatype\": \"string\"}, \"spaces\": {\"name\": \"Circuit breaker space number(s) within the load center (comma-separated for multi-pole)\", \"datatype\": \"string\"}}}}, \"children\": [], \"root\": \"sim-40t-001\", \"parent\": \"sim-40t-001\", \"extensions\": []}", "$state": "ready", "breaker/poles": "1", "breaker/rating": "15", "info/name": "Garage Outlets", "info/spaces": "12", "load-shed/priority": "NEVER", - "meter/active-power": "-130.21293854087392", - "meter/current": "1.0851078211739493", + "meter/active-power": "-145.87695587693375", + "meter/current": "1.2156412989744478", "meter/exported-energy": "0.0", "meter/imported-energy": "0.0", "pcs/managed": "true", @@ -126,15 +126,15 @@ "switch/relay-requester": "NONE" }, "68213a7c393f54918706bf62a3b92047": { - "$description": "{\"homie\": \"5.0\", \"version\": 1787970490460, \"type\": \"energy.ebus.device.circuit\", \"name\": \"Bathroom Lights\", \"nodes\": {\"switch\": {\"name\": \"switch\", \"type\": \"energy.ebus.capability.switch\", \"properties\": {\"relay\": {\"name\": \"Circuit relay state\", \"datatype\": \"enum\", \"format\": \"UNKNOWN,OPEN,CLOSED\", \"settable\": true}, \"relay-requester\": {\"name\": \"Actor requesting the relay state\", \"datatype\": \"enum\", \"format\": \"UNKNOWN,NONE,LOAD_SHED,USER,PCS,CONFIGURATION,FAULT\"}, \"relay-controllable\": {\"name\": \"Can the circuit's relay be commanded by the user?\", \"datatype\": \"boolean\"}}}, \"breaker\": {\"name\": \"breaker\", \"type\": \"energy.ebus.capability.breaker\", \"properties\": {\"rating\": {\"name\": \"Circuit breaker rating\", \"datatype\": \"integer\", \"unit\": \"A\"}, \"poles\": {\"name\": \"Number of breaker poles\", \"datatype\": \"integer\", \"format\": \"1:4:1\"}}}, \"meter\": {\"name\": \"meter\", \"type\": \"energy.ebus.capability.meter\", \"properties\": {\"current\": {\"name\": \"Measured current\", \"datatype\": \"float\", \"unit\": \"A\"}, \"active-power\": {\"name\": \"Measured active power\", \"datatype\": \"float\", \"unit\": \"W\"}, \"imported-energy\": {\"name\": \"Measured energy imported\", \"datatype\": \"float\", \"unit\": \"Wh\"}, \"exported-energy\": {\"name\": \"Measured energy exported\", \"datatype\": \"float\", \"unit\": \"Wh\"}}}, \"load-shed\": {\"name\": \"load-shed\", \"type\": \"energy.ebus.capability.load-shed\", \"properties\": {\"priority\": {\"name\": \"Configured priority of circuit shedding when off-grid (dominant-power-source != GRID)\", \"datatype\": \"enum\", \"format\": \"UNKNOWN,OFF_GRID,SOC_THRESHOLD,NEVER\", \"settable\": true}}}, \"pcs\": {\"name\": \"pcs\", \"type\": \"energy.ebus.capability.pcs\", \"properties\": {\"managed\": {\"name\": \"Is circuit managed by PCS?\", \"datatype\": \"boolean\"}, \"priority\": {\"name\": \"Circuit PCS priority ranking\", \"datatype\": \"integer\"}}}, \"connection\": {\"name\": \"connection\", \"type\": \"energy.ebus.capability.connection\", \"properties\": {\"feeds-device-id\": {\"name\": \"Homie device-id of the downstream device fed by this circuit\", \"datatype\": \"string\"}, \"feeds-device-type\": {\"name\": \"Homie $type of the downstream device\", \"datatype\": \"string\"}, \"feeds-device-status\": {\"name\": \"Panel's view of comm health to the downstream device\", \"datatype\": \"enum\", \"format\": \"OK,LOST,DEGRADED\"}}}, \"info\": {\"name\": \"info\", \"type\": \"energy.ebus.capability.info\", \"properties\": {\"name\": {\"name\": \"Circuit name\", \"datatype\": \"string\"}, \"spaces\": {\"name\": \"Circuit breaker space number(s) within the load center (comma-separated for multi-pole)\", \"datatype\": \"string\"}}}}, \"children\": [], \"root\": \"sim-40t-001\", \"parent\": \"sim-40t-001\", \"extensions\": []}", + "$description": "{\"homie\": \"5.0\", \"version\": 1791309827356, \"type\": \"energy.ebus.device.circuit\", \"name\": \"Bathroom Lights\", \"nodes\": {\"switch\": {\"name\": \"switch\", \"type\": \"energy.ebus.capability.switch\", \"properties\": {\"relay\": {\"name\": \"Circuit relay state\", \"datatype\": \"enum\", \"format\": \"UNKNOWN,OPEN,CLOSED\", \"settable\": true}, \"relay-requester\": {\"name\": \"Actor requesting the relay state\", \"datatype\": \"enum\", \"format\": \"UNKNOWN,NONE,LOAD_SHED,USER,PCS,CONFIGURATION,FAULT\"}, \"relay-controllable\": {\"name\": \"Can the circuit's relay be commanded by the user?\", \"datatype\": \"boolean\"}}}, \"breaker\": {\"name\": \"breaker\", \"type\": \"energy.ebus.capability.breaker\", \"properties\": {\"rating\": {\"name\": \"Circuit breaker rating\", \"datatype\": \"integer\", \"unit\": \"A\"}, \"poles\": {\"name\": \"Number of breaker poles\", \"datatype\": \"integer\", \"format\": \"1:4:1\"}}}, \"meter\": {\"name\": \"meter\", \"type\": \"energy.ebus.capability.meter\", \"properties\": {\"current\": {\"name\": \"Measured current\", \"datatype\": \"float\", \"unit\": \"A\"}, \"active-power\": {\"name\": \"Measured active power\", \"datatype\": \"float\", \"unit\": \"W\"}, \"imported-energy\": {\"name\": \"Measured energy imported\", \"datatype\": \"float\", \"unit\": \"Wh\"}, \"exported-energy\": {\"name\": \"Measured energy exported\", \"datatype\": \"float\", \"unit\": \"Wh\"}}}, \"load-shed\": {\"name\": \"load-shed\", \"type\": \"energy.ebus.capability.load-shed\", \"properties\": {\"priority\": {\"name\": \"Configured priority of circuit shedding when off-grid (dominant-power-source != GRID)\", \"datatype\": \"enum\", \"format\": \"UNKNOWN,OFF_GRID,SOC_THRESHOLD,NEVER\", \"settable\": true}}}, \"pcs\": {\"name\": \"pcs\", \"type\": \"energy.ebus.capability.pcs\", \"properties\": {\"managed\": {\"name\": \"Is circuit managed by PCS?\", \"datatype\": \"boolean\"}, \"priority\": {\"name\": \"Circuit PCS priority ranking\", \"datatype\": \"integer\"}}}, \"connection\": {\"name\": \"connection\", \"type\": \"energy.ebus.capability.connection\", \"properties\": {\"feeds-device-id\": {\"name\": \"Homie device-id of the downstream device fed by this circuit\", \"datatype\": \"string\"}, \"feeds-device-type\": {\"name\": \"Homie $type of the downstream device\", \"datatype\": \"string\"}, \"feeds-device-status\": {\"name\": \"Panel's view of comm health to the downstream device\", \"datatype\": \"enum\", \"format\": \"OK,LOST,DEGRADED\"}}}, \"info\": {\"name\": \"info\", \"type\": \"energy.ebus.capability.info\", \"properties\": {\"name\": {\"name\": \"Circuit name\", \"datatype\": \"string\"}, \"spaces\": {\"name\": \"Circuit breaker space number(s) within the load center (comma-separated for multi-pole)\", \"datatype\": \"string\"}}}}, \"children\": [], \"root\": \"sim-40t-001\", \"parent\": \"sim-40t-001\", \"extensions\": []}", "$state": "ready", "breaker/poles": "1", "breaker/rating": "15", "info/name": "Bathroom Lights", "info/spaces": "5", "load-shed/priority": "NEVER", - "meter/active-power": "-27.6977167164254", - "meter/current": "0.23081430597021166", + "meter/active-power": "-2.843329410138677", + "meter/current": "0.023694411751155643", "meter/exported-energy": "0.0", "meter/imported-energy": "0.0", "pcs/managed": "true", @@ -144,15 +144,15 @@ "switch/relay-requester": "NONE" }, "72b4343c886e5c98bca64a131b6003ce": { - "$description": "{\"homie\": \"5.0\", \"version\": 1787970490460, \"type\": \"energy.ebus.device.circuit\", \"name\": \"Bedroom Lights\", \"nodes\": {\"switch\": {\"name\": \"switch\", \"type\": \"energy.ebus.capability.switch\", \"properties\": {\"relay\": {\"name\": \"Circuit relay state\", \"datatype\": \"enum\", \"format\": \"UNKNOWN,OPEN,CLOSED\", \"settable\": true}, \"relay-requester\": {\"name\": \"Actor requesting the relay state\", \"datatype\": \"enum\", \"format\": \"UNKNOWN,NONE,LOAD_SHED,USER,PCS,CONFIGURATION,FAULT\"}, \"relay-controllable\": {\"name\": \"Can the circuit's relay be commanded by the user?\", \"datatype\": \"boolean\"}}}, \"breaker\": {\"name\": \"breaker\", \"type\": \"energy.ebus.capability.breaker\", \"properties\": {\"rating\": {\"name\": \"Circuit breaker rating\", \"datatype\": \"integer\", \"unit\": \"A\"}, \"poles\": {\"name\": \"Number of breaker poles\", \"datatype\": \"integer\", \"format\": \"1:4:1\"}}}, \"meter\": {\"name\": \"meter\", \"type\": \"energy.ebus.capability.meter\", \"properties\": {\"current\": {\"name\": \"Measured current\", \"datatype\": \"float\", \"unit\": \"A\"}, \"active-power\": {\"name\": \"Measured active power\", \"datatype\": \"float\", \"unit\": \"W\"}, \"imported-energy\": {\"name\": \"Measured energy imported\", \"datatype\": \"float\", \"unit\": \"Wh\"}, \"exported-energy\": {\"name\": \"Measured energy exported\", \"datatype\": \"float\", \"unit\": \"Wh\"}}}, \"load-shed\": {\"name\": \"load-shed\", \"type\": \"energy.ebus.capability.load-shed\", \"properties\": {\"priority\": {\"name\": \"Configured priority of circuit shedding when off-grid (dominant-power-source != GRID)\", \"datatype\": \"enum\", \"format\": \"UNKNOWN,OFF_GRID,SOC_THRESHOLD,NEVER\", \"settable\": true}}}, \"pcs\": {\"name\": \"pcs\", \"type\": \"energy.ebus.capability.pcs\", \"properties\": {\"managed\": {\"name\": \"Is circuit managed by PCS?\", \"datatype\": \"boolean\"}, \"priority\": {\"name\": \"Circuit PCS priority ranking\", \"datatype\": \"integer\"}}}, \"connection\": {\"name\": \"connection\", \"type\": \"energy.ebus.capability.connection\", \"properties\": {\"feeds-device-id\": {\"name\": \"Homie device-id of the downstream device fed by this circuit\", \"datatype\": \"string\"}, \"feeds-device-type\": {\"name\": \"Homie $type of the downstream device\", \"datatype\": \"string\"}, \"feeds-device-status\": {\"name\": \"Panel's view of comm health to the downstream device\", \"datatype\": \"enum\", \"format\": \"OK,LOST,DEGRADED\"}}}, \"info\": {\"name\": \"info\", \"type\": \"energy.ebus.capability.info\", \"properties\": {\"name\": {\"name\": \"Circuit name\", \"datatype\": \"string\"}, \"spaces\": {\"name\": \"Circuit breaker space number(s) within the load center (comma-separated for multi-pole)\", \"datatype\": \"string\"}}}}, \"children\": [], \"root\": \"sim-40t-001\", \"parent\": \"sim-40t-001\", \"extensions\": []}", + "$description": "{\"homie\": \"5.0\", \"version\": 1791309827356, \"type\": \"energy.ebus.device.circuit\", \"name\": \"Bedroom Lights\", \"nodes\": {\"switch\": {\"name\": \"switch\", \"type\": \"energy.ebus.capability.switch\", \"properties\": {\"relay\": {\"name\": \"Circuit relay state\", \"datatype\": \"enum\", \"format\": \"UNKNOWN,OPEN,CLOSED\", \"settable\": true}, \"relay-requester\": {\"name\": \"Actor requesting the relay state\", \"datatype\": \"enum\", \"format\": \"UNKNOWN,NONE,LOAD_SHED,USER,PCS,CONFIGURATION,FAULT\"}, \"relay-controllable\": {\"name\": \"Can the circuit's relay be commanded by the user?\", \"datatype\": \"boolean\"}}}, \"breaker\": {\"name\": \"breaker\", \"type\": \"energy.ebus.capability.breaker\", \"properties\": {\"rating\": {\"name\": \"Circuit breaker rating\", \"datatype\": \"integer\", \"unit\": \"A\"}, \"poles\": {\"name\": \"Number of breaker poles\", \"datatype\": \"integer\", \"format\": \"1:4:1\"}}}, \"meter\": {\"name\": \"meter\", \"type\": \"energy.ebus.capability.meter\", \"properties\": {\"current\": {\"name\": \"Measured current\", \"datatype\": \"float\", \"unit\": \"A\"}, \"active-power\": {\"name\": \"Measured active power\", \"datatype\": \"float\", \"unit\": \"W\"}, \"imported-energy\": {\"name\": \"Measured energy imported\", \"datatype\": \"float\", \"unit\": \"Wh\"}, \"exported-energy\": {\"name\": \"Measured energy exported\", \"datatype\": \"float\", \"unit\": \"Wh\"}}}, \"load-shed\": {\"name\": \"load-shed\", \"type\": \"energy.ebus.capability.load-shed\", \"properties\": {\"priority\": {\"name\": \"Configured priority of circuit shedding when off-grid (dominant-power-source != GRID)\", \"datatype\": \"enum\", \"format\": \"UNKNOWN,OFF_GRID,SOC_THRESHOLD,NEVER\", \"settable\": true}}}, \"pcs\": {\"name\": \"pcs\", \"type\": \"energy.ebus.capability.pcs\", \"properties\": {\"managed\": {\"name\": \"Is circuit managed by PCS?\", \"datatype\": \"boolean\"}, \"priority\": {\"name\": \"Circuit PCS priority ranking\", \"datatype\": \"integer\"}}}, \"connection\": {\"name\": \"connection\", \"type\": \"energy.ebus.capability.connection\", \"properties\": {\"feeds-device-id\": {\"name\": \"Homie device-id of the downstream device fed by this circuit\", \"datatype\": \"string\"}, \"feeds-device-type\": {\"name\": \"Homie $type of the downstream device\", \"datatype\": \"string\"}, \"feeds-device-status\": {\"name\": \"Panel's view of comm health to the downstream device\", \"datatype\": \"enum\", \"format\": \"OK,LOST,DEGRADED\"}}}, \"info\": {\"name\": \"info\", \"type\": \"energy.ebus.capability.info\", \"properties\": {\"name\": {\"name\": \"Circuit name\", \"datatype\": \"string\"}, \"spaces\": {\"name\": \"Circuit breaker space number(s) within the load center (comma-separated for multi-pole)\", \"datatype\": \"string\"}}}}, \"children\": [], \"root\": \"sim-40t-001\", \"parent\": \"sim-40t-001\", \"extensions\": []}", "$state": "ready", "breaker/poles": "1", "breaker/rating": "15", "info/name": "Bedroom Lights", "info/spaces": "4", "load-shed/priority": "NEVER", - "meter/active-power": "-83.32761699328408", - "meter/current": "0.6943968082773674", + "meter/active-power": "-8.530536329767036", + "meter/current": "0.07108780274805863", "meter/exported-energy": "0.0", "meter/imported-energy": "0.0", "pcs/managed": "true", @@ -162,15 +162,15 @@ "switch/relay-requester": "NONE" }, "768f5f7afac95b09a32fa6b8ece84041": { - "$description": "{\"homie\": \"5.0\", \"version\": 1787970490462, \"type\": \"energy.ebus.device.circuit\", \"name\": \"Dishwasher\", \"nodes\": {\"switch\": {\"name\": \"switch\", \"type\": \"energy.ebus.capability.switch\", \"properties\": {\"relay\": {\"name\": \"Circuit relay state\", \"datatype\": \"enum\", \"format\": \"UNKNOWN,OPEN,CLOSED\", \"settable\": true}, \"relay-requester\": {\"name\": \"Actor requesting the relay state\", \"datatype\": \"enum\", \"format\": \"UNKNOWN,NONE,LOAD_SHED,USER,PCS,CONFIGURATION,FAULT\"}, \"relay-controllable\": {\"name\": \"Can the circuit's relay be commanded by the user?\", \"datatype\": \"boolean\"}}}, \"breaker\": {\"name\": \"breaker\", \"type\": \"energy.ebus.capability.breaker\", \"properties\": {\"rating\": {\"name\": \"Circuit breaker rating\", \"datatype\": \"integer\", \"unit\": \"A\"}, \"poles\": {\"name\": \"Number of breaker poles\", \"datatype\": \"integer\", \"format\": \"1:4:1\"}}}, \"meter\": {\"name\": \"meter\", \"type\": \"energy.ebus.capability.meter\", \"properties\": {\"current\": {\"name\": \"Measured current\", \"datatype\": \"float\", \"unit\": \"A\"}, \"active-power\": {\"name\": \"Measured active power\", \"datatype\": \"float\", \"unit\": \"W\"}, \"imported-energy\": {\"name\": \"Measured energy imported\", \"datatype\": \"float\", \"unit\": \"Wh\"}, \"exported-energy\": {\"name\": \"Measured energy exported\", \"datatype\": \"float\", \"unit\": \"Wh\"}}}, \"load-shed\": {\"name\": \"load-shed\", \"type\": \"energy.ebus.capability.load-shed\", \"properties\": {\"priority\": {\"name\": \"Configured priority of circuit shedding when off-grid (dominant-power-source != GRID)\", \"datatype\": \"enum\", \"format\": \"UNKNOWN,OFF_GRID,SOC_THRESHOLD,NEVER\", \"settable\": true}}}, \"pcs\": {\"name\": \"pcs\", \"type\": \"energy.ebus.capability.pcs\", \"properties\": {\"managed\": {\"name\": \"Is circuit managed by PCS?\", \"datatype\": \"boolean\"}, \"priority\": {\"name\": \"Circuit PCS priority ranking\", \"datatype\": \"integer\"}}}, \"connection\": {\"name\": \"connection\", \"type\": \"energy.ebus.capability.connection\", \"properties\": {\"feeds-device-id\": {\"name\": \"Homie device-id of the downstream device fed by this circuit\", \"datatype\": \"string\"}, \"feeds-device-type\": {\"name\": \"Homie $type of the downstream device\", \"datatype\": \"string\"}, \"feeds-device-status\": {\"name\": \"Panel's view of comm health to the downstream device\", \"datatype\": \"enum\", \"format\": \"OK,LOST,DEGRADED\"}}}, \"info\": {\"name\": \"info\", \"type\": \"energy.ebus.capability.info\", \"properties\": {\"name\": {\"name\": \"Circuit name\", \"datatype\": \"string\"}, \"spaces\": {\"name\": \"Circuit breaker space number(s) within the load center (comma-separated for multi-pole)\", \"datatype\": \"string\"}}}}, \"children\": [], \"root\": \"sim-40t-001\", \"parent\": \"sim-40t-001\", \"extensions\": []}", + "$description": "{\"homie\": \"5.0\", \"version\": 1791309827358, \"type\": \"energy.ebus.device.circuit\", \"name\": \"Dishwasher\", \"nodes\": {\"switch\": {\"name\": \"switch\", \"type\": \"energy.ebus.capability.switch\", \"properties\": {\"relay\": {\"name\": \"Circuit relay state\", \"datatype\": \"enum\", \"format\": \"UNKNOWN,OPEN,CLOSED\", \"settable\": true}, \"relay-requester\": {\"name\": \"Actor requesting the relay state\", \"datatype\": \"enum\", \"format\": \"UNKNOWN,NONE,LOAD_SHED,USER,PCS,CONFIGURATION,FAULT\"}, \"relay-controllable\": {\"name\": \"Can the circuit's relay be commanded by the user?\", \"datatype\": \"boolean\"}}}, \"breaker\": {\"name\": \"breaker\", \"type\": \"energy.ebus.capability.breaker\", \"properties\": {\"rating\": {\"name\": \"Circuit breaker rating\", \"datatype\": \"integer\", \"unit\": \"A\"}, \"poles\": {\"name\": \"Number of breaker poles\", \"datatype\": \"integer\", \"format\": \"1:4:1\"}}}, \"meter\": {\"name\": \"meter\", \"type\": \"energy.ebus.capability.meter\", \"properties\": {\"current\": {\"name\": \"Measured current\", \"datatype\": \"float\", \"unit\": \"A\"}, \"active-power\": {\"name\": \"Measured active power\", \"datatype\": \"float\", \"unit\": \"W\"}, \"imported-energy\": {\"name\": \"Measured energy imported\", \"datatype\": \"float\", \"unit\": \"Wh\"}, \"exported-energy\": {\"name\": \"Measured energy exported\", \"datatype\": \"float\", \"unit\": \"Wh\"}}}, \"load-shed\": {\"name\": \"load-shed\", \"type\": \"energy.ebus.capability.load-shed\", \"properties\": {\"priority\": {\"name\": \"Configured priority of circuit shedding when off-grid (dominant-power-source != GRID)\", \"datatype\": \"enum\", \"format\": \"UNKNOWN,OFF_GRID,SOC_THRESHOLD,NEVER\", \"settable\": true}}}, \"pcs\": {\"name\": \"pcs\", \"type\": \"energy.ebus.capability.pcs\", \"properties\": {\"managed\": {\"name\": \"Is circuit managed by PCS?\", \"datatype\": \"boolean\"}, \"priority\": {\"name\": \"Circuit PCS priority ranking\", \"datatype\": \"integer\"}}}, \"connection\": {\"name\": \"connection\", \"type\": \"energy.ebus.capability.connection\", \"properties\": {\"feeds-device-id\": {\"name\": \"Homie device-id of the downstream device fed by this circuit\", \"datatype\": \"string\"}, \"feeds-device-type\": {\"name\": \"Homie $type of the downstream device\", \"datatype\": \"string\"}, \"feeds-device-status\": {\"name\": \"Panel's view of comm health to the downstream device\", \"datatype\": \"enum\", \"format\": \"OK,LOST,DEGRADED\"}}}, \"info\": {\"name\": \"info\", \"type\": \"energy.ebus.capability.info\", \"properties\": {\"name\": {\"name\": \"Circuit name\", \"datatype\": \"string\"}, \"spaces\": {\"name\": \"Circuit breaker space number(s) within the load center (comma-separated for multi-pole)\", \"datatype\": \"string\"}}}}, \"children\": [], \"root\": \"sim-40t-001\", \"parent\": \"sim-40t-001\", \"extensions\": []}", "$state": "ready", "breaker/poles": "1", "breaker/rating": "20", "info/name": "Dishwasher", "info/spaces": "16", "load-shed/priority": "OFF_GRID", - "meter/active-power": "-1800.0", - "meter/current": "15.0", + "meter/active-power": "0.0", + "meter/current": "0.0", "meter/exported-energy": "0.0", "meter/imported-energy": "0.0", "pcs/managed": "true", @@ -180,15 +180,15 @@ "switch/relay-requester": "NONE" }, "780a20adb8045467aa6ae9c66d3fd7f0": { - "$description": "{\"homie\": \"5.0\", \"version\": 1787970490462, \"type\": \"energy.ebus.device.circuit\", \"name\": \"Microwave\", \"nodes\": {\"switch\": {\"name\": \"switch\", \"type\": \"energy.ebus.capability.switch\", \"properties\": {\"relay\": {\"name\": \"Circuit relay state\", \"datatype\": \"enum\", \"format\": \"UNKNOWN,OPEN,CLOSED\", \"settable\": true}, \"relay-requester\": {\"name\": \"Actor requesting the relay state\", \"datatype\": \"enum\", \"format\": \"UNKNOWN,NONE,LOAD_SHED,USER,PCS,CONFIGURATION,FAULT\"}, \"relay-controllable\": {\"name\": \"Can the circuit's relay be commanded by the user?\", \"datatype\": \"boolean\"}}}, \"breaker\": {\"name\": \"breaker\", \"type\": \"energy.ebus.capability.breaker\", \"properties\": {\"rating\": {\"name\": \"Circuit breaker rating\", \"datatype\": \"integer\", \"unit\": \"A\"}, \"poles\": {\"name\": \"Number of breaker poles\", \"datatype\": \"integer\", \"format\": \"1:4:1\"}}}, \"meter\": {\"name\": \"meter\", \"type\": \"energy.ebus.capability.meter\", \"properties\": {\"current\": {\"name\": \"Measured current\", \"datatype\": \"float\", \"unit\": \"A\"}, \"active-power\": {\"name\": \"Measured active power\", \"datatype\": \"float\", \"unit\": \"W\"}, \"imported-energy\": {\"name\": \"Measured energy imported\", \"datatype\": \"float\", \"unit\": \"Wh\"}, \"exported-energy\": {\"name\": \"Measured energy exported\", \"datatype\": \"float\", \"unit\": \"Wh\"}}}, \"load-shed\": {\"name\": \"load-shed\", \"type\": \"energy.ebus.capability.load-shed\", \"properties\": {\"priority\": {\"name\": \"Configured priority of circuit shedding when off-grid (dominant-power-source != GRID)\", \"datatype\": \"enum\", \"format\": \"UNKNOWN,OFF_GRID,SOC_THRESHOLD,NEVER\", \"settable\": true}}}, \"pcs\": {\"name\": \"pcs\", \"type\": \"energy.ebus.capability.pcs\", \"properties\": {\"managed\": {\"name\": \"Is circuit managed by PCS?\", \"datatype\": \"boolean\"}, \"priority\": {\"name\": \"Circuit PCS priority ranking\", \"datatype\": \"integer\"}}}, \"connection\": {\"name\": \"connection\", \"type\": \"energy.ebus.capability.connection\", \"properties\": {\"feeds-device-id\": {\"name\": \"Homie device-id of the downstream device fed by this circuit\", \"datatype\": \"string\"}, \"feeds-device-type\": {\"name\": \"Homie $type of the downstream device\", \"datatype\": \"string\"}, \"feeds-device-status\": {\"name\": \"Panel's view of comm health to the downstream device\", \"datatype\": \"enum\", \"format\": \"OK,LOST,DEGRADED\"}}}, \"info\": {\"name\": \"info\", \"type\": \"energy.ebus.capability.info\", \"properties\": {\"name\": {\"name\": \"Circuit name\", \"datatype\": \"string\"}, \"spaces\": {\"name\": \"Circuit breaker space number(s) within the load center (comma-separated for multi-pole)\", \"datatype\": \"string\"}}}}, \"children\": [], \"root\": \"sim-40t-001\", \"parent\": \"sim-40t-001\", \"extensions\": []}", + "$description": "{\"homie\": \"5.0\", \"version\": 1791309827358, \"type\": \"energy.ebus.device.circuit\", \"name\": \"Microwave\", \"nodes\": {\"switch\": {\"name\": \"switch\", \"type\": \"energy.ebus.capability.switch\", \"properties\": {\"relay\": {\"name\": \"Circuit relay state\", \"datatype\": \"enum\", \"format\": \"UNKNOWN,OPEN,CLOSED\", \"settable\": true}, \"relay-requester\": {\"name\": \"Actor requesting the relay state\", \"datatype\": \"enum\", \"format\": \"UNKNOWN,NONE,LOAD_SHED,USER,PCS,CONFIGURATION,FAULT\"}, \"relay-controllable\": {\"name\": \"Can the circuit's relay be commanded by the user?\", \"datatype\": \"boolean\"}}}, \"breaker\": {\"name\": \"breaker\", \"type\": \"energy.ebus.capability.breaker\", \"properties\": {\"rating\": {\"name\": \"Circuit breaker rating\", \"datatype\": \"integer\", \"unit\": \"A\"}, \"poles\": {\"name\": \"Number of breaker poles\", \"datatype\": \"integer\", \"format\": \"1:4:1\"}}}, \"meter\": {\"name\": \"meter\", \"type\": \"energy.ebus.capability.meter\", \"properties\": {\"current\": {\"name\": \"Measured current\", \"datatype\": \"float\", \"unit\": \"A\"}, \"active-power\": {\"name\": \"Measured active power\", \"datatype\": \"float\", \"unit\": \"W\"}, \"imported-energy\": {\"name\": \"Measured energy imported\", \"datatype\": \"float\", \"unit\": \"Wh\"}, \"exported-energy\": {\"name\": \"Measured energy exported\", \"datatype\": \"float\", \"unit\": \"Wh\"}}}, \"load-shed\": {\"name\": \"load-shed\", \"type\": \"energy.ebus.capability.load-shed\", \"properties\": {\"priority\": {\"name\": \"Configured priority of circuit shedding when off-grid (dominant-power-source != GRID)\", \"datatype\": \"enum\", \"format\": \"UNKNOWN,OFF_GRID,SOC_THRESHOLD,NEVER\", \"settable\": true}}}, \"pcs\": {\"name\": \"pcs\", \"type\": \"energy.ebus.capability.pcs\", \"properties\": {\"managed\": {\"name\": \"Is circuit managed by PCS?\", \"datatype\": \"boolean\"}, \"priority\": {\"name\": \"Circuit PCS priority ranking\", \"datatype\": \"integer\"}}}, \"connection\": {\"name\": \"connection\", \"type\": \"energy.ebus.capability.connection\", \"properties\": {\"feeds-device-id\": {\"name\": \"Homie device-id of the downstream device fed by this circuit\", \"datatype\": \"string\"}, \"feeds-device-type\": {\"name\": \"Homie $type of the downstream device\", \"datatype\": \"string\"}, \"feeds-device-status\": {\"name\": \"Panel's view of comm health to the downstream device\", \"datatype\": \"enum\", \"format\": \"OK,LOST,DEGRADED\"}}}, \"info\": {\"name\": \"info\", \"type\": \"energy.ebus.capability.info\", \"properties\": {\"name\": {\"name\": \"Circuit name\", \"datatype\": \"string\"}, \"spaces\": {\"name\": \"Circuit breaker space number(s) within the load center (comma-separated for multi-pole)\", \"datatype\": \"string\"}}}}, \"children\": [], \"root\": \"sim-40t-001\", \"parent\": \"sim-40t-001\", \"extensions\": []}", "$state": "ready", "breaker/poles": "1", "breaker/rating": "20", "info/name": "Microwave", "info/spaces": "18", "load-shed/priority": "NEVER", - "meter/active-power": "-1500.0", - "meter/current": "12.5", + "meter/active-power": "0.0", + "meter/current": "0.0", "meter/exported-energy": "0.0", "meter/imported-energy": "0.0", "pcs/managed": "true", @@ -198,15 +198,15 @@ "switch/relay-requester": "NONE" }, "93294e528d045baa9190721acfb243d3": { - "$description": "{\"homie\": \"5.0\", \"version\": 1787970490464, \"type\": \"energy.ebus.device.circuit\", \"name\": \"Main HVAC\", \"nodes\": {\"switch\": {\"name\": \"switch\", \"type\": \"energy.ebus.capability.switch\", \"properties\": {\"relay\": {\"name\": \"Circuit relay state\", \"datatype\": \"enum\", \"format\": \"UNKNOWN,OPEN,CLOSED\", \"settable\": true}, \"relay-requester\": {\"name\": \"Actor requesting the relay state\", \"datatype\": \"enum\", \"format\": \"UNKNOWN,NONE,LOAD_SHED,USER,PCS,CONFIGURATION,FAULT\"}, \"relay-controllable\": {\"name\": \"Can the circuit's relay be commanded by the user?\", \"datatype\": \"boolean\"}}}, \"breaker\": {\"name\": \"breaker\", \"type\": \"energy.ebus.capability.breaker\", \"properties\": {\"rating\": {\"name\": \"Circuit breaker rating\", \"datatype\": \"integer\", \"unit\": \"A\"}, \"poles\": {\"name\": \"Number of breaker poles\", \"datatype\": \"integer\", \"format\": \"1:4:1\"}}}, \"meter\": {\"name\": \"meter\", \"type\": \"energy.ebus.capability.meter\", \"properties\": {\"current\": {\"name\": \"Measured current\", \"datatype\": \"float\", \"unit\": \"A\"}, \"active-power\": {\"name\": \"Measured active power\", \"datatype\": \"float\", \"unit\": \"W\"}, \"imported-energy\": {\"name\": \"Measured energy imported\", \"datatype\": \"float\", \"unit\": \"Wh\"}, \"exported-energy\": {\"name\": \"Measured energy exported\", \"datatype\": \"float\", \"unit\": \"Wh\"}}}, \"load-shed\": {\"name\": \"load-shed\", \"type\": \"energy.ebus.capability.load-shed\", \"properties\": {\"priority\": {\"name\": \"Configured priority of circuit shedding when off-grid (dominant-power-source != GRID)\", \"datatype\": \"enum\", \"format\": \"UNKNOWN,OFF_GRID,SOC_THRESHOLD,NEVER\", \"settable\": true}}}, \"pcs\": {\"name\": \"pcs\", \"type\": \"energy.ebus.capability.pcs\", \"properties\": {\"managed\": {\"name\": \"Is circuit managed by PCS?\", \"datatype\": \"boolean\"}, \"priority\": {\"name\": \"Circuit PCS priority ranking\", \"datatype\": \"integer\"}}}, \"connection\": {\"name\": \"connection\", \"type\": \"energy.ebus.capability.connection\", \"properties\": {\"feeds-device-id\": {\"name\": \"Homie device-id of the downstream device fed by this circuit\", \"datatype\": \"string\"}, \"feeds-device-type\": {\"name\": \"Homie $type of the downstream device\", \"datatype\": \"string\"}, \"feeds-device-status\": {\"name\": \"Panel's view of comm health to the downstream device\", \"datatype\": \"enum\", \"format\": \"OK,LOST,DEGRADED\"}}}, \"info\": {\"name\": \"info\", \"type\": \"energy.ebus.capability.info\", \"properties\": {\"name\": {\"name\": \"Circuit name\", \"datatype\": \"string\"}, \"spaces\": {\"name\": \"Circuit breaker space number(s) within the load center (comma-separated for multi-pole)\", \"datatype\": \"string\"}}}}, \"children\": [], \"root\": \"sim-40t-001\", \"parent\": \"sim-40t-001\", \"extensions\": []}", + "$description": "{\"homie\": \"5.0\", \"version\": 1791309827359, \"type\": \"energy.ebus.device.circuit\", \"name\": \"Main HVAC\", \"nodes\": {\"switch\": {\"name\": \"switch\", \"type\": \"energy.ebus.capability.switch\", \"properties\": {\"relay\": {\"name\": \"Circuit relay state\", \"datatype\": \"enum\", \"format\": \"UNKNOWN,OPEN,CLOSED\", \"settable\": true}, \"relay-requester\": {\"name\": \"Actor requesting the relay state\", \"datatype\": \"enum\", \"format\": \"UNKNOWN,NONE,LOAD_SHED,USER,PCS,CONFIGURATION,FAULT\"}, \"relay-controllable\": {\"name\": \"Can the circuit's relay be commanded by the user?\", \"datatype\": \"boolean\"}}}, \"breaker\": {\"name\": \"breaker\", \"type\": \"energy.ebus.capability.breaker\", \"properties\": {\"rating\": {\"name\": \"Circuit breaker rating\", \"datatype\": \"integer\", \"unit\": \"A\"}, \"poles\": {\"name\": \"Number of breaker poles\", \"datatype\": \"integer\", \"format\": \"1:4:1\"}}}, \"meter\": {\"name\": \"meter\", \"type\": \"energy.ebus.capability.meter\", \"properties\": {\"current\": {\"name\": \"Measured current\", \"datatype\": \"float\", \"unit\": \"A\"}, \"active-power\": {\"name\": \"Measured active power\", \"datatype\": \"float\", \"unit\": \"W\"}, \"imported-energy\": {\"name\": \"Measured energy imported\", \"datatype\": \"float\", \"unit\": \"Wh\"}, \"exported-energy\": {\"name\": \"Measured energy exported\", \"datatype\": \"float\", \"unit\": \"Wh\"}}}, \"load-shed\": {\"name\": \"load-shed\", \"type\": \"energy.ebus.capability.load-shed\", \"properties\": {\"priority\": {\"name\": \"Configured priority of circuit shedding when off-grid (dominant-power-source != GRID)\", \"datatype\": \"enum\", \"format\": \"UNKNOWN,OFF_GRID,SOC_THRESHOLD,NEVER\", \"settable\": true}}}, \"pcs\": {\"name\": \"pcs\", \"type\": \"energy.ebus.capability.pcs\", \"properties\": {\"managed\": {\"name\": \"Is circuit managed by PCS?\", \"datatype\": \"boolean\"}, \"priority\": {\"name\": \"Circuit PCS priority ranking\", \"datatype\": \"integer\"}}}, \"connection\": {\"name\": \"connection\", \"type\": \"energy.ebus.capability.connection\", \"properties\": {\"feeds-device-id\": {\"name\": \"Homie device-id of the downstream device fed by this circuit\", \"datatype\": \"string\"}, \"feeds-device-type\": {\"name\": \"Homie $type of the downstream device\", \"datatype\": \"string\"}, \"feeds-device-status\": {\"name\": \"Panel's view of comm health to the downstream device\", \"datatype\": \"enum\", \"format\": \"OK,LOST,DEGRADED\"}}}, \"info\": {\"name\": \"info\", \"type\": \"energy.ebus.capability.info\", \"properties\": {\"name\": {\"name\": \"Circuit name\", \"datatype\": \"string\"}, \"spaces\": {\"name\": \"Circuit breaker space number(s) within the load center (comma-separated for multi-pole)\", \"datatype\": \"string\"}}}}, \"children\": [], \"root\": \"sim-40t-001\", \"parent\": \"sim-40t-001\", \"extensions\": []}", "$state": "ready", "breaker/poles": "2", "breaker/rating": "30", "info/name": "Main HVAC", "info/spaces": "23,25", "load-shed/priority": "NEVER", - "meter/active-power": "-349.87751313263016", - "meter/current": "1.457822971385959", + "meter/active-power": "-41.906225544823386", + "meter/current": "0.17460927310343077", "meter/exported-energy": "0.0", "meter/imported-energy": "0.0", "pcs/managed": "true", @@ -216,15 +216,15 @@ "switch/relay-requester": "NONE" }, "9a67992e4e735d8a81340adb44120c11": { - "$description": "{\"homie\": \"5.0\", \"version\": 1787970490464, \"type\": \"energy.ebus.device.circuit\", \"name\": \"Heat Pump\", \"nodes\": {\"switch\": {\"name\": \"switch\", \"type\": \"energy.ebus.capability.switch\", \"properties\": {\"relay\": {\"name\": \"Circuit relay state\", \"datatype\": \"enum\", \"format\": \"UNKNOWN,OPEN,CLOSED\", \"settable\": true}, \"relay-requester\": {\"name\": \"Actor requesting the relay state\", \"datatype\": \"enum\", \"format\": \"UNKNOWN,NONE,LOAD_SHED,USER,PCS,CONFIGURATION,FAULT\"}, \"relay-controllable\": {\"name\": \"Can the circuit's relay be commanded by the user?\", \"datatype\": \"boolean\"}}}, \"breaker\": {\"name\": \"breaker\", \"type\": \"energy.ebus.capability.breaker\", \"properties\": {\"rating\": {\"name\": \"Circuit breaker rating\", \"datatype\": \"integer\", \"unit\": \"A\"}, \"poles\": {\"name\": \"Number of breaker poles\", \"datatype\": \"integer\", \"format\": \"1:4:1\"}}}, \"meter\": {\"name\": \"meter\", \"type\": \"energy.ebus.capability.meter\", \"properties\": {\"current\": {\"name\": \"Measured current\", \"datatype\": \"float\", \"unit\": \"A\"}, \"active-power\": {\"name\": \"Measured active power\", \"datatype\": \"float\", \"unit\": \"W\"}, \"imported-energy\": {\"name\": \"Measured energy imported\", \"datatype\": \"float\", \"unit\": \"Wh\"}, \"exported-energy\": {\"name\": \"Measured energy exported\", \"datatype\": \"float\", \"unit\": \"Wh\"}}}, \"load-shed\": {\"name\": \"load-shed\", \"type\": \"energy.ebus.capability.load-shed\", \"properties\": {\"priority\": {\"name\": \"Configured priority of circuit shedding when off-grid (dominant-power-source != GRID)\", \"datatype\": \"enum\", \"format\": \"UNKNOWN,OFF_GRID,SOC_THRESHOLD,NEVER\", \"settable\": true}}}, \"pcs\": {\"name\": \"pcs\", \"type\": \"energy.ebus.capability.pcs\", \"properties\": {\"managed\": {\"name\": \"Is circuit managed by PCS?\", \"datatype\": \"boolean\"}, \"priority\": {\"name\": \"Circuit PCS priority ranking\", \"datatype\": \"integer\"}}}, \"connection\": {\"name\": \"connection\", \"type\": \"energy.ebus.capability.connection\", \"properties\": {\"feeds-device-id\": {\"name\": \"Homie device-id of the downstream device fed by this circuit\", \"datatype\": \"string\"}, \"feeds-device-type\": {\"name\": \"Homie $type of the downstream device\", \"datatype\": \"string\"}, \"feeds-device-status\": {\"name\": \"Panel's view of comm health to the downstream device\", \"datatype\": \"enum\", \"format\": \"OK,LOST,DEGRADED\"}}}, \"info\": {\"name\": \"info\", \"type\": \"energy.ebus.capability.info\", \"properties\": {\"name\": {\"name\": \"Circuit name\", \"datatype\": \"string\"}, \"spaces\": {\"name\": \"Circuit breaker space number(s) within the load center (comma-separated for multi-pole)\", \"datatype\": \"string\"}}}}, \"children\": [], \"root\": \"sim-40t-001\", \"parent\": \"sim-40t-001\", \"extensions\": []}", + "$description": "{\"homie\": \"5.0\", \"version\": 1791309827360, \"type\": \"energy.ebus.device.circuit\", \"name\": \"Heat Pump\", \"nodes\": {\"switch\": {\"name\": \"switch\", \"type\": \"energy.ebus.capability.switch\", \"properties\": {\"relay\": {\"name\": \"Circuit relay state\", \"datatype\": \"enum\", \"format\": \"UNKNOWN,OPEN,CLOSED\", \"settable\": true}, \"relay-requester\": {\"name\": \"Actor requesting the relay state\", \"datatype\": \"enum\", \"format\": \"UNKNOWN,NONE,LOAD_SHED,USER,PCS,CONFIGURATION,FAULT\"}, \"relay-controllable\": {\"name\": \"Can the circuit's relay be commanded by the user?\", \"datatype\": \"boolean\"}}}, \"breaker\": {\"name\": \"breaker\", \"type\": \"energy.ebus.capability.breaker\", \"properties\": {\"rating\": {\"name\": \"Circuit breaker rating\", \"datatype\": \"integer\", \"unit\": \"A\"}, \"poles\": {\"name\": \"Number of breaker poles\", \"datatype\": \"integer\", \"format\": \"1:4:1\"}}}, \"meter\": {\"name\": \"meter\", \"type\": \"energy.ebus.capability.meter\", \"properties\": {\"current\": {\"name\": \"Measured current\", \"datatype\": \"float\", \"unit\": \"A\"}, \"active-power\": {\"name\": \"Measured active power\", \"datatype\": \"float\", \"unit\": \"W\"}, \"imported-energy\": {\"name\": \"Measured energy imported\", \"datatype\": \"float\", \"unit\": \"Wh\"}, \"exported-energy\": {\"name\": \"Measured energy exported\", \"datatype\": \"float\", \"unit\": \"Wh\"}}}, \"load-shed\": {\"name\": \"load-shed\", \"type\": \"energy.ebus.capability.load-shed\", \"properties\": {\"priority\": {\"name\": \"Configured priority of circuit shedding when off-grid (dominant-power-source != GRID)\", \"datatype\": \"enum\", \"format\": \"UNKNOWN,OFF_GRID,SOC_THRESHOLD,NEVER\", \"settable\": true}}}, \"pcs\": {\"name\": \"pcs\", \"type\": \"energy.ebus.capability.pcs\", \"properties\": {\"managed\": {\"name\": \"Is circuit managed by PCS?\", \"datatype\": \"boolean\"}, \"priority\": {\"name\": \"Circuit PCS priority ranking\", \"datatype\": \"integer\"}}}, \"connection\": {\"name\": \"connection\", \"type\": \"energy.ebus.capability.connection\", \"properties\": {\"feeds-device-id\": {\"name\": \"Homie device-id of the downstream device fed by this circuit\", \"datatype\": \"string\"}, \"feeds-device-type\": {\"name\": \"Homie $type of the downstream device\", \"datatype\": \"string\"}, \"feeds-device-status\": {\"name\": \"Panel's view of comm health to the downstream device\", \"datatype\": \"enum\", \"format\": \"OK,LOST,DEGRADED\"}}}, \"info\": {\"name\": \"info\", \"type\": \"energy.ebus.capability.info\", \"properties\": {\"name\": {\"name\": \"Circuit name\", \"datatype\": \"string\"}, \"spaces\": {\"name\": \"Circuit breaker space number(s) within the load center (comma-separated for multi-pole)\", \"datatype\": \"string\"}}}}, \"children\": [], \"root\": \"sim-40t-001\", \"parent\": \"sim-40t-001\", \"extensions\": []}", "$state": "ready", "breaker/poles": "2", "breaker/rating": "30", "info/name": "Heat Pump", "info/spaces": "27,29", "load-shed/priority": "OFF_GRID", - "meter/active-power": "-815.2308005551047", - "meter/current": "3.396795002312936", + "meter/active-power": "-500.0", + "meter/current": "2.0833333333333335", "meter/exported-energy": "0.0", "meter/imported-energy": "0.0", "pcs/managed": "true", @@ -234,7 +234,7 @@ "switch/relay-requester": "NONE" }, "9c22d40aa8f25a82bf22e62aa1891c4b": { - "$description": "{\"homie\": \"5.0\", \"version\": 1787970490464, \"type\": \"energy.ebus.device.circuit\", \"name\": \"SPAN Drive - Garage\", \"nodes\": {\"switch\": {\"name\": \"switch\", \"type\": \"energy.ebus.capability.switch\", \"properties\": {\"relay\": {\"name\": \"Circuit relay state\", \"datatype\": \"enum\", \"format\": \"UNKNOWN,OPEN,CLOSED\", \"settable\": true}, \"relay-requester\": {\"name\": \"Actor requesting the relay state\", \"datatype\": \"enum\", \"format\": \"UNKNOWN,NONE,LOAD_SHED,USER,PCS,CONFIGURATION,FAULT\"}, \"relay-controllable\": {\"name\": \"Can the circuit's relay be commanded by the user?\", \"datatype\": \"boolean\"}}}, \"breaker\": {\"name\": \"breaker\", \"type\": \"energy.ebus.capability.breaker\", \"properties\": {\"rating\": {\"name\": \"Circuit breaker rating\", \"datatype\": \"integer\", \"unit\": \"A\"}, \"poles\": {\"name\": \"Number of breaker poles\", \"datatype\": \"integer\", \"format\": \"1:4:1\"}}}, \"meter\": {\"name\": \"meter\", \"type\": \"energy.ebus.capability.meter\", \"properties\": {\"current\": {\"name\": \"Measured current\", \"datatype\": \"float\", \"unit\": \"A\"}, \"active-power\": {\"name\": \"Measured active power\", \"datatype\": \"float\", \"unit\": \"W\"}, \"imported-energy\": {\"name\": \"Measured energy imported\", \"datatype\": \"float\", \"unit\": \"Wh\"}, \"exported-energy\": {\"name\": \"Measured energy exported\", \"datatype\": \"float\", \"unit\": \"Wh\"}}}, \"load-shed\": {\"name\": \"load-shed\", \"type\": \"energy.ebus.capability.load-shed\", \"properties\": {\"priority\": {\"name\": \"Configured priority of circuit shedding when off-grid (dominant-power-source != GRID)\", \"datatype\": \"enum\", \"format\": \"UNKNOWN,OFF_GRID,SOC_THRESHOLD,NEVER\", \"settable\": true}}}, \"pcs\": {\"name\": \"pcs\", \"type\": \"energy.ebus.capability.pcs\", \"properties\": {\"managed\": {\"name\": \"Is circuit managed by PCS?\", \"datatype\": \"boolean\"}, \"priority\": {\"name\": \"Circuit PCS priority ranking\", \"datatype\": \"integer\"}}}, \"connection\": {\"name\": \"connection\", \"type\": \"energy.ebus.capability.connection\", \"properties\": {\"feeds-device-id\": {\"name\": \"Homie device-id of the downstream device fed by this circuit\", \"datatype\": \"string\"}, \"feeds-device-type\": {\"name\": \"Homie $type of the downstream device\", \"datatype\": \"string\"}, \"feeds-device-status\": {\"name\": \"Panel's view of comm health to the downstream device\", \"datatype\": \"enum\", \"format\": \"OK,LOST,DEGRADED\"}}}, \"info\": {\"name\": \"info\", \"type\": \"energy.ebus.capability.info\", \"properties\": {\"name\": {\"name\": \"Circuit name\", \"datatype\": \"string\"}, \"spaces\": {\"name\": \"Circuit breaker space number(s) within the load center (comma-separated for multi-pole)\", \"datatype\": \"string\"}}}}, \"children\": [], \"root\": \"sim-40t-001\", \"parent\": \"sim-40t-001\", \"extensions\": []}", + "$description": "{\"homie\": \"5.0\", \"version\": 1791309827360, \"type\": \"energy.ebus.device.circuit\", \"name\": \"SPAN Drive - Garage\", \"nodes\": {\"switch\": {\"name\": \"switch\", \"type\": \"energy.ebus.capability.switch\", \"properties\": {\"relay\": {\"name\": \"Circuit relay state\", \"datatype\": \"enum\", \"format\": \"UNKNOWN,OPEN,CLOSED\", \"settable\": true}, \"relay-requester\": {\"name\": \"Actor requesting the relay state\", \"datatype\": \"enum\", \"format\": \"UNKNOWN,NONE,LOAD_SHED,USER,PCS,CONFIGURATION,FAULT\"}, \"relay-controllable\": {\"name\": \"Can the circuit's relay be commanded by the user?\", \"datatype\": \"boolean\"}}}, \"breaker\": {\"name\": \"breaker\", \"type\": \"energy.ebus.capability.breaker\", \"properties\": {\"rating\": {\"name\": \"Circuit breaker rating\", \"datatype\": \"integer\", \"unit\": \"A\"}, \"poles\": {\"name\": \"Number of breaker poles\", \"datatype\": \"integer\", \"format\": \"1:4:1\"}}}, \"meter\": {\"name\": \"meter\", \"type\": \"energy.ebus.capability.meter\", \"properties\": {\"current\": {\"name\": \"Measured current\", \"datatype\": \"float\", \"unit\": \"A\"}, \"active-power\": {\"name\": \"Measured active power\", \"datatype\": \"float\", \"unit\": \"W\"}, \"imported-energy\": {\"name\": \"Measured energy imported\", \"datatype\": \"float\", \"unit\": \"Wh\"}, \"exported-energy\": {\"name\": \"Measured energy exported\", \"datatype\": \"float\", \"unit\": \"Wh\"}}}, \"load-shed\": {\"name\": \"load-shed\", \"type\": \"energy.ebus.capability.load-shed\", \"properties\": {\"priority\": {\"name\": \"Configured priority of circuit shedding when off-grid (dominant-power-source != GRID)\", \"datatype\": \"enum\", \"format\": \"UNKNOWN,OFF_GRID,SOC_THRESHOLD,NEVER\", \"settable\": true}}}, \"pcs\": {\"name\": \"pcs\", \"type\": \"energy.ebus.capability.pcs\", \"properties\": {\"managed\": {\"name\": \"Is circuit managed by PCS?\", \"datatype\": \"boolean\"}, \"priority\": {\"name\": \"Circuit PCS priority ranking\", \"datatype\": \"integer\"}}}, \"connection\": {\"name\": \"connection\", \"type\": \"energy.ebus.capability.connection\", \"properties\": {\"feeds-device-id\": {\"name\": \"Homie device-id of the downstream device fed by this circuit\", \"datatype\": \"string\"}, \"feeds-device-type\": {\"name\": \"Homie $type of the downstream device\", \"datatype\": \"string\"}, \"feeds-device-status\": {\"name\": \"Panel's view of comm health to the downstream device\", \"datatype\": \"enum\", \"format\": \"OK,LOST,DEGRADED\"}}}, \"info\": {\"name\": \"info\", \"type\": \"energy.ebus.capability.info\", \"properties\": {\"name\": {\"name\": \"Circuit name\", \"datatype\": \"string\"}, \"spaces\": {\"name\": \"Circuit breaker space number(s) within the load center (comma-separated for multi-pole)\", \"datatype\": \"string\"}}}}, \"children\": [], \"root\": \"sim-40t-001\", \"parent\": \"sim-40t-001\", \"extensions\": []}", "$state": "ready", "breaker/poles": "2", "breaker/rating": "50", @@ -255,7 +255,7 @@ "switch/relay-requester": "NONE" }, "a83191fcac585bda9d6fe05ca79b8a4f": { - "$description": "{\"homie\": \"5.0\", \"version\": 1787970490465, \"type\": \"energy.ebus.device.circuit\", \"name\": \"SPAN Drive - Driveway\", \"nodes\": {\"switch\": {\"name\": \"switch\", \"type\": \"energy.ebus.capability.switch\", \"properties\": {\"relay\": {\"name\": \"Circuit relay state\", \"datatype\": \"enum\", \"format\": \"UNKNOWN,OPEN,CLOSED\", \"settable\": true}, \"relay-requester\": {\"name\": \"Actor requesting the relay state\", \"datatype\": \"enum\", \"format\": \"UNKNOWN,NONE,LOAD_SHED,USER,PCS,CONFIGURATION,FAULT\"}, \"relay-controllable\": {\"name\": \"Can the circuit's relay be commanded by the user?\", \"datatype\": \"boolean\"}}}, \"breaker\": {\"name\": \"breaker\", \"type\": \"energy.ebus.capability.breaker\", \"properties\": {\"rating\": {\"name\": \"Circuit breaker rating\", \"datatype\": \"integer\", \"unit\": \"A\"}, \"poles\": {\"name\": \"Number of breaker poles\", \"datatype\": \"integer\", \"format\": \"1:4:1\"}}}, \"meter\": {\"name\": \"meter\", \"type\": \"energy.ebus.capability.meter\", \"properties\": {\"current\": {\"name\": \"Measured current\", \"datatype\": \"float\", \"unit\": \"A\"}, \"active-power\": {\"name\": \"Measured active power\", \"datatype\": \"float\", \"unit\": \"W\"}, \"imported-energy\": {\"name\": \"Measured energy imported\", \"datatype\": \"float\", \"unit\": \"Wh\"}, \"exported-energy\": {\"name\": \"Measured energy exported\", \"datatype\": \"float\", \"unit\": \"Wh\"}}}, \"load-shed\": {\"name\": \"load-shed\", \"type\": \"energy.ebus.capability.load-shed\", \"properties\": {\"priority\": {\"name\": \"Configured priority of circuit shedding when off-grid (dominant-power-source != GRID)\", \"datatype\": \"enum\", \"format\": \"UNKNOWN,OFF_GRID,SOC_THRESHOLD,NEVER\", \"settable\": true}}}, \"pcs\": {\"name\": \"pcs\", \"type\": \"energy.ebus.capability.pcs\", \"properties\": {\"managed\": {\"name\": \"Is circuit managed by PCS?\", \"datatype\": \"boolean\"}, \"priority\": {\"name\": \"Circuit PCS priority ranking\", \"datatype\": \"integer\"}}}, \"connection\": {\"name\": \"connection\", \"type\": \"energy.ebus.capability.connection\", \"properties\": {\"feeds-device-id\": {\"name\": \"Homie device-id of the downstream device fed by this circuit\", \"datatype\": \"string\"}, \"feeds-device-type\": {\"name\": \"Homie $type of the downstream device\", \"datatype\": \"string\"}, \"feeds-device-status\": {\"name\": \"Panel's view of comm health to the downstream device\", \"datatype\": \"enum\", \"format\": \"OK,LOST,DEGRADED\"}}}, \"info\": {\"name\": \"info\", \"type\": \"energy.ebus.capability.info\", \"properties\": {\"name\": {\"name\": \"Circuit name\", \"datatype\": \"string\"}, \"spaces\": {\"name\": \"Circuit breaker space number(s) within the load center (comma-separated for multi-pole)\", \"datatype\": \"string\"}}}}, \"children\": [], \"root\": \"sim-40t-001\", \"parent\": \"sim-40t-001\", \"extensions\": []}", + "$description": "{\"homie\": \"5.0\", \"version\": 1791309827360, \"type\": \"energy.ebus.device.circuit\", \"name\": \"SPAN Drive - Driveway\", \"nodes\": {\"switch\": {\"name\": \"switch\", \"type\": \"energy.ebus.capability.switch\", \"properties\": {\"relay\": {\"name\": \"Circuit relay state\", \"datatype\": \"enum\", \"format\": \"UNKNOWN,OPEN,CLOSED\", \"settable\": true}, \"relay-requester\": {\"name\": \"Actor requesting the relay state\", \"datatype\": \"enum\", \"format\": \"UNKNOWN,NONE,LOAD_SHED,USER,PCS,CONFIGURATION,FAULT\"}, \"relay-controllable\": {\"name\": \"Can the circuit's relay be commanded by the user?\", \"datatype\": \"boolean\"}}}, \"breaker\": {\"name\": \"breaker\", \"type\": \"energy.ebus.capability.breaker\", \"properties\": {\"rating\": {\"name\": \"Circuit breaker rating\", \"datatype\": \"integer\", \"unit\": \"A\"}, \"poles\": {\"name\": \"Number of breaker poles\", \"datatype\": \"integer\", \"format\": \"1:4:1\"}}}, \"meter\": {\"name\": \"meter\", \"type\": \"energy.ebus.capability.meter\", \"properties\": {\"current\": {\"name\": \"Measured current\", \"datatype\": \"float\", \"unit\": \"A\"}, \"active-power\": {\"name\": \"Measured active power\", \"datatype\": \"float\", \"unit\": \"W\"}, \"imported-energy\": {\"name\": \"Measured energy imported\", \"datatype\": \"float\", \"unit\": \"Wh\"}, \"exported-energy\": {\"name\": \"Measured energy exported\", \"datatype\": \"float\", \"unit\": \"Wh\"}}}, \"load-shed\": {\"name\": \"load-shed\", \"type\": \"energy.ebus.capability.load-shed\", \"properties\": {\"priority\": {\"name\": \"Configured priority of circuit shedding when off-grid (dominant-power-source != GRID)\", \"datatype\": \"enum\", \"format\": \"UNKNOWN,OFF_GRID,SOC_THRESHOLD,NEVER\", \"settable\": true}}}, \"pcs\": {\"name\": \"pcs\", \"type\": \"energy.ebus.capability.pcs\", \"properties\": {\"managed\": {\"name\": \"Is circuit managed by PCS?\", \"datatype\": \"boolean\"}, \"priority\": {\"name\": \"Circuit PCS priority ranking\", \"datatype\": \"integer\"}}}, \"connection\": {\"name\": \"connection\", \"type\": \"energy.ebus.capability.connection\", \"properties\": {\"feeds-device-id\": {\"name\": \"Homie device-id of the downstream device fed by this circuit\", \"datatype\": \"string\"}, \"feeds-device-type\": {\"name\": \"Homie $type of the downstream device\", \"datatype\": \"string\"}, \"feeds-device-status\": {\"name\": \"Panel's view of comm health to the downstream device\", \"datatype\": \"enum\", \"format\": \"OK,LOST,DEGRADED\"}}}, \"info\": {\"name\": \"info\", \"type\": \"energy.ebus.capability.info\", \"properties\": {\"name\": {\"name\": \"Circuit name\", \"datatype\": \"string\"}, \"spaces\": {\"name\": \"Circuit breaker space number(s) within the load center (comma-separated for multi-pole)\", \"datatype\": \"string\"}}}}, \"children\": [], \"root\": \"sim-40t-001\", \"parent\": \"sim-40t-001\", \"extensions\": []}", "$state": "ready", "breaker/poles": "2", "breaker/rating": "50", @@ -276,15 +276,15 @@ "switch/relay-requester": "NONE" }, "bb8914a16ba2543a82a88c22e461943e": { - "$description": "{\"homie\": \"5.0\", \"version\": 1787970490459, \"type\": \"energy.ebus.device.circuit\", \"name\": \"Living Room Lights\", \"nodes\": {\"switch\": {\"name\": \"switch\", \"type\": \"energy.ebus.capability.switch\", \"properties\": {\"relay\": {\"name\": \"Circuit relay state\", \"datatype\": \"enum\", \"format\": \"UNKNOWN,OPEN,CLOSED\", \"settable\": true}, \"relay-requester\": {\"name\": \"Actor requesting the relay state\", \"datatype\": \"enum\", \"format\": \"UNKNOWN,NONE,LOAD_SHED,USER,PCS,CONFIGURATION,FAULT\"}, \"relay-controllable\": {\"name\": \"Can the circuit's relay be commanded by the user?\", \"datatype\": \"boolean\"}}}, \"breaker\": {\"name\": \"breaker\", \"type\": \"energy.ebus.capability.breaker\", \"properties\": {\"rating\": {\"name\": \"Circuit breaker rating\", \"datatype\": \"integer\", \"unit\": \"A\"}, \"poles\": {\"name\": \"Number of breaker poles\", \"datatype\": \"integer\", \"format\": \"1:4:1\"}}}, \"meter\": {\"name\": \"meter\", \"type\": \"energy.ebus.capability.meter\", \"properties\": {\"current\": {\"name\": \"Measured current\", \"datatype\": \"float\", \"unit\": \"A\"}, \"active-power\": {\"name\": \"Measured active power\", \"datatype\": \"float\", \"unit\": \"W\"}, \"imported-energy\": {\"name\": \"Measured energy imported\", \"datatype\": \"float\", \"unit\": \"Wh\"}, \"exported-energy\": {\"name\": \"Measured energy exported\", \"datatype\": \"float\", \"unit\": \"Wh\"}}}, \"load-shed\": {\"name\": \"load-shed\", \"type\": \"energy.ebus.capability.load-shed\", \"properties\": {\"priority\": {\"name\": \"Configured priority of circuit shedding when off-grid (dominant-power-source != GRID)\", \"datatype\": \"enum\", \"format\": \"UNKNOWN,OFF_GRID,SOC_THRESHOLD,NEVER\", \"settable\": true}}}, \"pcs\": {\"name\": \"pcs\", \"type\": \"energy.ebus.capability.pcs\", \"properties\": {\"managed\": {\"name\": \"Is circuit managed by PCS?\", \"datatype\": \"boolean\"}, \"priority\": {\"name\": \"Circuit PCS priority ranking\", \"datatype\": \"integer\"}}}, \"connection\": {\"name\": \"connection\", \"type\": \"energy.ebus.capability.connection\", \"properties\": {\"feeds-device-id\": {\"name\": \"Homie device-id of the downstream device fed by this circuit\", \"datatype\": \"string\"}, \"feeds-device-type\": {\"name\": \"Homie $type of the downstream device\", \"datatype\": \"string\"}, \"feeds-device-status\": {\"name\": \"Panel's view of comm health to the downstream device\", \"datatype\": \"enum\", \"format\": \"OK,LOST,DEGRADED\"}}}, \"info\": {\"name\": \"info\", \"type\": \"energy.ebus.capability.info\", \"properties\": {\"name\": {\"name\": \"Circuit name\", \"datatype\": \"string\"}, \"spaces\": {\"name\": \"Circuit breaker space number(s) within the load center (comma-separated for multi-pole)\", \"datatype\": \"string\"}}}}, \"children\": [], \"root\": \"sim-40t-001\", \"parent\": \"sim-40t-001\", \"extensions\": []}", + "$description": "{\"homie\": \"5.0\", \"version\": 1791309827356, \"type\": \"energy.ebus.device.circuit\", \"name\": \"Living Room Lights\", \"nodes\": {\"switch\": {\"name\": \"switch\", \"type\": \"energy.ebus.capability.switch\", \"properties\": {\"relay\": {\"name\": \"Circuit relay state\", \"datatype\": \"enum\", \"format\": \"UNKNOWN,OPEN,CLOSED\", \"settable\": true}, \"relay-requester\": {\"name\": \"Actor requesting the relay state\", \"datatype\": \"enum\", \"format\": \"UNKNOWN,NONE,LOAD_SHED,USER,PCS,CONFIGURATION,FAULT\"}, \"relay-controllable\": {\"name\": \"Can the circuit's relay be commanded by the user?\", \"datatype\": \"boolean\"}}}, \"breaker\": {\"name\": \"breaker\", \"type\": \"energy.ebus.capability.breaker\", \"properties\": {\"rating\": {\"name\": \"Circuit breaker rating\", \"datatype\": \"integer\", \"unit\": \"A\"}, \"poles\": {\"name\": \"Number of breaker poles\", \"datatype\": \"integer\", \"format\": \"1:4:1\"}}}, \"meter\": {\"name\": \"meter\", \"type\": \"energy.ebus.capability.meter\", \"properties\": {\"current\": {\"name\": \"Measured current\", \"datatype\": \"float\", \"unit\": \"A\"}, \"active-power\": {\"name\": \"Measured active power\", \"datatype\": \"float\", \"unit\": \"W\"}, \"imported-energy\": {\"name\": \"Measured energy imported\", \"datatype\": \"float\", \"unit\": \"Wh\"}, \"exported-energy\": {\"name\": \"Measured energy exported\", \"datatype\": \"float\", \"unit\": \"Wh\"}}}, \"load-shed\": {\"name\": \"load-shed\", \"type\": \"energy.ebus.capability.load-shed\", \"properties\": {\"priority\": {\"name\": \"Configured priority of circuit shedding when off-grid (dominant-power-source != GRID)\", \"datatype\": \"enum\", \"format\": \"UNKNOWN,OFF_GRID,SOC_THRESHOLD,NEVER\", \"settable\": true}}}, \"pcs\": {\"name\": \"pcs\", \"type\": \"energy.ebus.capability.pcs\", \"properties\": {\"managed\": {\"name\": \"Is circuit managed by PCS?\", \"datatype\": \"boolean\"}, \"priority\": {\"name\": \"Circuit PCS priority ranking\", \"datatype\": \"integer\"}}}, \"connection\": {\"name\": \"connection\", \"type\": \"energy.ebus.capability.connection\", \"properties\": {\"feeds-device-id\": {\"name\": \"Homie device-id of the downstream device fed by this circuit\", \"datatype\": \"string\"}, \"feeds-device-type\": {\"name\": \"Homie $type of the downstream device\", \"datatype\": \"string\"}, \"feeds-device-status\": {\"name\": \"Panel's view of comm health to the downstream device\", \"datatype\": \"enum\", \"format\": \"OK,LOST,DEGRADED\"}}}, \"info\": {\"name\": \"info\", \"type\": \"energy.ebus.capability.info\", \"properties\": {\"name\": {\"name\": \"Circuit name\", \"datatype\": \"string\"}, \"spaces\": {\"name\": \"Circuit breaker space number(s) within the load center (comma-separated for multi-pole)\", \"datatype\": \"string\"}}}}, \"children\": [], \"root\": \"sim-40t-001\", \"parent\": \"sim-40t-001\", \"extensions\": []}", "$state": "ready", "breaker/poles": "1", "breaker/rating": "15", "info/name": "Living Room Lights", "info/spaces": "2", "load-shed/priority": "NEVER", - "meter/active-power": "-53.07248307608305", - "meter/current": "0.4422706923006921", + "meter/active-power": "-4.648806448422821", + "meter/current": "0.03874005373685684", "meter/exported-energy": "0.0", "meter/imported-energy": "0.0", "pcs/managed": "true", @@ -294,7 +294,7 @@ "switch/relay-requester": "NONE" }, "bc07adcee8ff5945a29c618a54bef7e6": { - "$description": "{\"homie\": \"5.0\", \"version\": 1787970490463, \"type\": \"energy.ebus.device.circuit\", \"name\": \"Garbage Disposal\", \"nodes\": {\"switch\": {\"name\": \"switch\", \"type\": \"energy.ebus.capability.switch\", \"properties\": {\"relay\": {\"name\": \"Circuit relay state\", \"datatype\": \"enum\", \"format\": \"UNKNOWN,OPEN,CLOSED\", \"settable\": true}, \"relay-requester\": {\"name\": \"Actor requesting the relay state\", \"datatype\": \"enum\", \"format\": \"UNKNOWN,NONE,LOAD_SHED,USER,PCS,CONFIGURATION,FAULT\"}, \"relay-controllable\": {\"name\": \"Can the circuit's relay be commanded by the user?\", \"datatype\": \"boolean\"}}}, \"breaker\": {\"name\": \"breaker\", \"type\": \"energy.ebus.capability.breaker\", \"properties\": {\"rating\": {\"name\": \"Circuit breaker rating\", \"datatype\": \"integer\", \"unit\": \"A\"}, \"poles\": {\"name\": \"Number of breaker poles\", \"datatype\": \"integer\", \"format\": \"1:4:1\"}}}, \"meter\": {\"name\": \"meter\", \"type\": \"energy.ebus.capability.meter\", \"properties\": {\"current\": {\"name\": \"Measured current\", \"datatype\": \"float\", \"unit\": \"A\"}, \"active-power\": {\"name\": \"Measured active power\", \"datatype\": \"float\", \"unit\": \"W\"}, \"imported-energy\": {\"name\": \"Measured energy imported\", \"datatype\": \"float\", \"unit\": \"Wh\"}, \"exported-energy\": {\"name\": \"Measured energy exported\", \"datatype\": \"float\", \"unit\": \"Wh\"}}}, \"load-shed\": {\"name\": \"load-shed\", \"type\": \"energy.ebus.capability.load-shed\", \"properties\": {\"priority\": {\"name\": \"Configured priority of circuit shedding when off-grid (dominant-power-source != GRID)\", \"datatype\": \"enum\", \"format\": \"UNKNOWN,OFF_GRID,SOC_THRESHOLD,NEVER\", \"settable\": true}}}, \"pcs\": {\"name\": \"pcs\", \"type\": \"energy.ebus.capability.pcs\", \"properties\": {\"managed\": {\"name\": \"Is circuit managed by PCS?\", \"datatype\": \"boolean\"}, \"priority\": {\"name\": \"Circuit PCS priority ranking\", \"datatype\": \"integer\"}}}, \"connection\": {\"name\": \"connection\", \"type\": \"energy.ebus.capability.connection\", \"properties\": {\"feeds-device-id\": {\"name\": \"Homie device-id of the downstream device fed by this circuit\", \"datatype\": \"string\"}, \"feeds-device-type\": {\"name\": \"Homie $type of the downstream device\", \"datatype\": \"string\"}, \"feeds-device-status\": {\"name\": \"Panel's view of comm health to the downstream device\", \"datatype\": \"enum\", \"format\": \"OK,LOST,DEGRADED\"}}}, \"info\": {\"name\": \"info\", \"type\": \"energy.ebus.capability.info\", \"properties\": {\"name\": {\"name\": \"Circuit name\", \"datatype\": \"string\"}, \"spaces\": {\"name\": \"Circuit breaker space number(s) within the load center (comma-separated for multi-pole)\", \"datatype\": \"string\"}}}}, \"children\": [], \"root\": \"sim-40t-001\", \"parent\": \"sim-40t-001\", \"extensions\": []}", + "$description": "{\"homie\": \"5.0\", \"version\": 1791309827359, \"type\": \"energy.ebus.device.circuit\", \"name\": \"Garbage Disposal\", \"nodes\": {\"switch\": {\"name\": \"switch\", \"type\": \"energy.ebus.capability.switch\", \"properties\": {\"relay\": {\"name\": \"Circuit relay state\", \"datatype\": \"enum\", \"format\": \"UNKNOWN,OPEN,CLOSED\", \"settable\": true}, \"relay-requester\": {\"name\": \"Actor requesting the relay state\", \"datatype\": \"enum\", \"format\": \"UNKNOWN,NONE,LOAD_SHED,USER,PCS,CONFIGURATION,FAULT\"}, \"relay-controllable\": {\"name\": \"Can the circuit's relay be commanded by the user?\", \"datatype\": \"boolean\"}}}, \"breaker\": {\"name\": \"breaker\", \"type\": \"energy.ebus.capability.breaker\", \"properties\": {\"rating\": {\"name\": \"Circuit breaker rating\", \"datatype\": \"integer\", \"unit\": \"A\"}, \"poles\": {\"name\": \"Number of breaker poles\", \"datatype\": \"integer\", \"format\": \"1:4:1\"}}}, \"meter\": {\"name\": \"meter\", \"type\": \"energy.ebus.capability.meter\", \"properties\": {\"current\": {\"name\": \"Measured current\", \"datatype\": \"float\", \"unit\": \"A\"}, \"active-power\": {\"name\": \"Measured active power\", \"datatype\": \"float\", \"unit\": \"W\"}, \"imported-energy\": {\"name\": \"Measured energy imported\", \"datatype\": \"float\", \"unit\": \"Wh\"}, \"exported-energy\": {\"name\": \"Measured energy exported\", \"datatype\": \"float\", \"unit\": \"Wh\"}}}, \"load-shed\": {\"name\": \"load-shed\", \"type\": \"energy.ebus.capability.load-shed\", \"properties\": {\"priority\": {\"name\": \"Configured priority of circuit shedding when off-grid (dominant-power-source != GRID)\", \"datatype\": \"enum\", \"format\": \"UNKNOWN,OFF_GRID,SOC_THRESHOLD,NEVER\", \"settable\": true}}}, \"pcs\": {\"name\": \"pcs\", \"type\": \"energy.ebus.capability.pcs\", \"properties\": {\"managed\": {\"name\": \"Is circuit managed by PCS?\", \"datatype\": \"boolean\"}, \"priority\": {\"name\": \"Circuit PCS priority ranking\", \"datatype\": \"integer\"}}}, \"connection\": {\"name\": \"connection\", \"type\": \"energy.ebus.capability.connection\", \"properties\": {\"feeds-device-id\": {\"name\": \"Homie device-id of the downstream device fed by this circuit\", \"datatype\": \"string\"}, \"feeds-device-type\": {\"name\": \"Homie $type of the downstream device\", \"datatype\": \"string\"}, \"feeds-device-status\": {\"name\": \"Panel's view of comm health to the downstream device\", \"datatype\": \"enum\", \"format\": \"OK,LOST,DEGRADED\"}}}, \"info\": {\"name\": \"info\", \"type\": \"energy.ebus.capability.info\", \"properties\": {\"name\": {\"name\": \"Circuit name\", \"datatype\": \"string\"}, \"spaces\": {\"name\": \"Circuit breaker space number(s) within the load center (comma-separated for multi-pole)\", \"datatype\": \"string\"}}}}, \"children\": [], \"root\": \"sim-40t-001\", \"parent\": \"sim-40t-001\", \"extensions\": []}", "$state": "ready", "breaker/poles": "1", "breaker/rating": "15", @@ -312,15 +312,15 @@ "switch/relay-requester": "NONE" }, "be820f5432c353e8b60329b6ee8e2a9b": { - "$description": "{\"homie\": \"5.0\", \"version\": 1787970490460, \"type\": \"energy.ebus.device.circuit\", \"name\": \"Living Room Outlets\", \"nodes\": {\"switch\": {\"name\": \"switch\", \"type\": \"energy.ebus.capability.switch\", \"properties\": {\"relay\": {\"name\": \"Circuit relay state\", \"datatype\": \"enum\", \"format\": \"UNKNOWN,OPEN,CLOSED\", \"settable\": true}, \"relay-requester\": {\"name\": \"Actor requesting the relay state\", \"datatype\": \"enum\", \"format\": \"UNKNOWN,NONE,LOAD_SHED,USER,PCS,CONFIGURATION,FAULT\"}, \"relay-controllable\": {\"name\": \"Can the circuit's relay be commanded by the user?\", \"datatype\": \"boolean\"}}}, \"breaker\": {\"name\": \"breaker\", \"type\": \"energy.ebus.capability.breaker\", \"properties\": {\"rating\": {\"name\": \"Circuit breaker rating\", \"datatype\": \"integer\", \"unit\": \"A\"}, \"poles\": {\"name\": \"Number of breaker poles\", \"datatype\": \"integer\", \"format\": \"1:4:1\"}}}, \"meter\": {\"name\": \"meter\", \"type\": \"energy.ebus.capability.meter\", \"properties\": {\"current\": {\"name\": \"Measured current\", \"datatype\": \"float\", \"unit\": \"A\"}, \"active-power\": {\"name\": \"Measured active power\", \"datatype\": \"float\", \"unit\": \"W\"}, \"imported-energy\": {\"name\": \"Measured energy imported\", \"datatype\": \"float\", \"unit\": \"Wh\"}, \"exported-energy\": {\"name\": \"Measured energy exported\", \"datatype\": \"float\", \"unit\": \"Wh\"}}}, \"load-shed\": {\"name\": \"load-shed\", \"type\": \"energy.ebus.capability.load-shed\", \"properties\": {\"priority\": {\"name\": \"Configured priority of circuit shedding when off-grid (dominant-power-source != GRID)\", \"datatype\": \"enum\", \"format\": \"UNKNOWN,OFF_GRID,SOC_THRESHOLD,NEVER\", \"settable\": true}}}, \"pcs\": {\"name\": \"pcs\", \"type\": \"energy.ebus.capability.pcs\", \"properties\": {\"managed\": {\"name\": \"Is circuit managed by PCS?\", \"datatype\": \"boolean\"}, \"priority\": {\"name\": \"Circuit PCS priority ranking\", \"datatype\": \"integer\"}}}, \"connection\": {\"name\": \"connection\", \"type\": \"energy.ebus.capability.connection\", \"properties\": {\"feeds-device-id\": {\"name\": \"Homie device-id of the downstream device fed by this circuit\", \"datatype\": \"string\"}, \"feeds-device-type\": {\"name\": \"Homie $type of the downstream device\", \"datatype\": \"string\"}, \"feeds-device-status\": {\"name\": \"Panel's view of comm health to the downstream device\", \"datatype\": \"enum\", \"format\": \"OK,LOST,DEGRADED\"}}}, \"info\": {\"name\": \"info\", \"type\": \"energy.ebus.capability.info\", \"properties\": {\"name\": {\"name\": \"Circuit name\", \"datatype\": \"string\"}, \"spaces\": {\"name\": \"Circuit breaker space number(s) within the load center (comma-separated for multi-pole)\", \"datatype\": \"string\"}}}}, \"children\": [], \"root\": \"sim-40t-001\", \"parent\": \"sim-40t-001\", \"extensions\": []}", + "$description": "{\"homie\": \"5.0\", \"version\": 1791309827357, \"type\": \"energy.ebus.device.circuit\", \"name\": \"Living Room Outlets\", \"nodes\": {\"switch\": {\"name\": \"switch\", \"type\": \"energy.ebus.capability.switch\", \"properties\": {\"relay\": {\"name\": \"Circuit relay state\", \"datatype\": \"enum\", \"format\": \"UNKNOWN,OPEN,CLOSED\", \"settable\": true}, \"relay-requester\": {\"name\": \"Actor requesting the relay state\", \"datatype\": \"enum\", \"format\": \"UNKNOWN,NONE,LOAD_SHED,USER,PCS,CONFIGURATION,FAULT\"}, \"relay-controllable\": {\"name\": \"Can the circuit's relay be commanded by the user?\", \"datatype\": \"boolean\"}}}, \"breaker\": {\"name\": \"breaker\", \"type\": \"energy.ebus.capability.breaker\", \"properties\": {\"rating\": {\"name\": \"Circuit breaker rating\", \"datatype\": \"integer\", \"unit\": \"A\"}, \"poles\": {\"name\": \"Number of breaker poles\", \"datatype\": \"integer\", \"format\": \"1:4:1\"}}}, \"meter\": {\"name\": \"meter\", \"type\": \"energy.ebus.capability.meter\", \"properties\": {\"current\": {\"name\": \"Measured current\", \"datatype\": \"float\", \"unit\": \"A\"}, \"active-power\": {\"name\": \"Measured active power\", \"datatype\": \"float\", \"unit\": \"W\"}, \"imported-energy\": {\"name\": \"Measured energy imported\", \"datatype\": \"float\", \"unit\": \"Wh\"}, \"exported-energy\": {\"name\": \"Measured energy exported\", \"datatype\": \"float\", \"unit\": \"Wh\"}}}, \"load-shed\": {\"name\": \"load-shed\", \"type\": \"energy.ebus.capability.load-shed\", \"properties\": {\"priority\": {\"name\": \"Configured priority of circuit shedding when off-grid (dominant-power-source != GRID)\", \"datatype\": \"enum\", \"format\": \"UNKNOWN,OFF_GRID,SOC_THRESHOLD,NEVER\", \"settable\": true}}}, \"pcs\": {\"name\": \"pcs\", \"type\": \"energy.ebus.capability.pcs\", \"properties\": {\"managed\": {\"name\": \"Is circuit managed by PCS?\", \"datatype\": \"boolean\"}, \"priority\": {\"name\": \"Circuit PCS priority ranking\", \"datatype\": \"integer\"}}}, \"connection\": {\"name\": \"connection\", \"type\": \"energy.ebus.capability.connection\", \"properties\": {\"feeds-device-id\": {\"name\": \"Homie device-id of the downstream device fed by this circuit\", \"datatype\": \"string\"}, \"feeds-device-type\": {\"name\": \"Homie $type of the downstream device\", \"datatype\": \"string\"}, \"feeds-device-status\": {\"name\": \"Panel's view of comm health to the downstream device\", \"datatype\": \"enum\", \"format\": \"OK,LOST,DEGRADED\"}}}, \"info\": {\"name\": \"info\", \"type\": \"energy.ebus.capability.info\", \"properties\": {\"name\": {\"name\": \"Circuit name\", \"datatype\": \"string\"}, \"spaces\": {\"name\": \"Circuit breaker space number(s) within the load center (comma-separated for multi-pole)\", \"datatype\": \"string\"}}}}, \"children\": [], \"root\": \"sim-40t-001\", \"parent\": \"sim-40t-001\", \"extensions\": []}", "$state": "ready", "breaker/poles": "1", "breaker/rating": "15", "info/name": "Living Room Outlets", "info/spaces": "8", "load-shed/priority": "NEVER", - "meter/active-power": "-268.5228057508987", - "meter/current": "2.237690047924156", + "meter/active-power": "-270.2582533772268", + "meter/current": "2.25215211147689", "meter/exported-energy": "0.0", "meter/imported-energy": "0.0", "pcs/managed": "true", @@ -330,7 +330,7 @@ "switch/relay-requester": "NONE" }, "be87c32bda4f5cd9abbf6d3995ae28c0": { - "$description": "{\"homie\": \"5.0\", \"version\": 1787970490465, \"type\": \"energy.ebus.device.circuit\", \"name\": \"Solar Inverter\", \"nodes\": {\"switch\": {\"name\": \"switch\", \"type\": \"energy.ebus.capability.switch\", \"properties\": {\"relay\": {\"name\": \"Circuit relay state\", \"datatype\": \"enum\", \"format\": \"UNKNOWN,OPEN,CLOSED\"}, \"relay-requester\": {\"name\": \"Actor requesting the relay state\", \"datatype\": \"enum\", \"format\": \"UNKNOWN,NONE,LOAD_SHED,USER,PCS,CONFIGURATION,FAULT\"}, \"relay-controllable\": {\"name\": \"Can the circuit's relay be commanded by the user?\", \"datatype\": \"boolean\"}}}, \"breaker\": {\"name\": \"breaker\", \"type\": \"energy.ebus.capability.breaker\", \"properties\": {\"rating\": {\"name\": \"Circuit breaker rating\", \"datatype\": \"integer\", \"unit\": \"A\"}, \"poles\": {\"name\": \"Number of breaker poles\", \"datatype\": \"integer\", \"format\": \"1:4:1\"}}}, \"meter\": {\"name\": \"meter\", \"type\": \"energy.ebus.capability.meter\", \"properties\": {\"current\": {\"name\": \"Measured current\", \"datatype\": \"float\", \"unit\": \"A\"}, \"active-power\": {\"name\": \"Measured active power\", \"datatype\": \"float\", \"unit\": \"W\"}, \"imported-energy\": {\"name\": \"Measured energy imported\", \"datatype\": \"float\", \"unit\": \"Wh\"}, \"exported-energy\": {\"name\": \"Measured energy exported\", \"datatype\": \"float\", \"unit\": \"Wh\"}}}, \"load-shed\": {\"name\": \"load-shed\", \"type\": \"energy.ebus.capability.load-shed\", \"properties\": {\"priority\": {\"name\": \"Configured priority of circuit shedding when off-grid (dominant-power-source != GRID)\", \"datatype\": \"enum\", \"format\": \"UNKNOWN,OFF_GRID,SOC_THRESHOLD,NEVER\", \"settable\": true}}}, \"pcs\": {\"name\": \"pcs\", \"type\": \"energy.ebus.capability.pcs\", \"properties\": {\"managed\": {\"name\": \"Is circuit managed by PCS?\", \"datatype\": \"boolean\"}, \"priority\": {\"name\": \"Circuit PCS priority ranking\", \"datatype\": \"integer\"}}}, \"connection\": {\"name\": \"connection\", \"type\": \"energy.ebus.capability.connection\", \"properties\": {\"feeds-device-id\": {\"name\": \"Homie device-id of the downstream device fed by this circuit\", \"datatype\": \"string\"}, \"feeds-device-type\": {\"name\": \"Homie $type of the downstream device\", \"datatype\": \"string\"}, \"feeds-device-status\": {\"name\": \"Panel's view of comm health to the downstream device\", \"datatype\": \"enum\", \"format\": \"OK,LOST,DEGRADED\"}}}, \"info\": {\"name\": \"info\", \"type\": \"energy.ebus.capability.info\", \"properties\": {\"name\": {\"name\": \"Circuit name\", \"datatype\": \"string\"}, \"spaces\": {\"name\": \"Circuit breaker space number(s) within the load center (comma-separated for multi-pole)\", \"datatype\": \"string\"}}}}, \"children\": [], \"root\": \"sim-40t-001\", \"parent\": \"sim-40t-001\", \"extensions\": []}", + "$description": "{\"homie\": \"5.0\", \"version\": 1791309827360, \"type\": \"energy.ebus.device.circuit\", \"name\": \"Solar Inverter\", \"nodes\": {\"switch\": {\"name\": \"switch\", \"type\": \"energy.ebus.capability.switch\", \"properties\": {\"relay\": {\"name\": \"Circuit relay state\", \"datatype\": \"enum\", \"format\": \"UNKNOWN,OPEN,CLOSED\"}, \"relay-requester\": {\"name\": \"Actor requesting the relay state\", \"datatype\": \"enum\", \"format\": \"UNKNOWN,NONE,LOAD_SHED,USER,PCS,CONFIGURATION,FAULT\"}, \"relay-controllable\": {\"name\": \"Can the circuit's relay be commanded by the user?\", \"datatype\": \"boolean\"}}}, \"breaker\": {\"name\": \"breaker\", \"type\": \"energy.ebus.capability.breaker\", \"properties\": {\"rating\": {\"name\": \"Circuit breaker rating\", \"datatype\": \"integer\", \"unit\": \"A\"}, \"poles\": {\"name\": \"Number of breaker poles\", \"datatype\": \"integer\", \"format\": \"1:4:1\"}}}, \"meter\": {\"name\": \"meter\", \"type\": \"energy.ebus.capability.meter\", \"properties\": {\"current\": {\"name\": \"Measured current\", \"datatype\": \"float\", \"unit\": \"A\"}, \"active-power\": {\"name\": \"Measured active power\", \"datatype\": \"float\", \"unit\": \"W\"}, \"imported-energy\": {\"name\": \"Measured energy imported\", \"datatype\": \"float\", \"unit\": \"Wh\"}, \"exported-energy\": {\"name\": \"Measured energy exported\", \"datatype\": \"float\", \"unit\": \"Wh\"}}}, \"load-shed\": {\"name\": \"load-shed\", \"type\": \"energy.ebus.capability.load-shed\", \"properties\": {\"priority\": {\"name\": \"Configured priority of circuit shedding when off-grid (dominant-power-source != GRID)\", \"datatype\": \"enum\", \"format\": \"UNKNOWN,OFF_GRID,SOC_THRESHOLD,NEVER\", \"settable\": true}}}, \"pcs\": {\"name\": \"pcs\", \"type\": \"energy.ebus.capability.pcs\", \"properties\": {\"managed\": {\"name\": \"Is circuit managed by PCS?\", \"datatype\": \"boolean\"}, \"priority\": {\"name\": \"Circuit PCS priority ranking\", \"datatype\": \"integer\"}}}, \"connection\": {\"name\": \"connection\", \"type\": \"energy.ebus.capability.connection\", \"properties\": {\"feeds-device-id\": {\"name\": \"Homie device-id of the downstream device fed by this circuit\", \"datatype\": \"string\"}, \"feeds-device-type\": {\"name\": \"Homie $type of the downstream device\", \"datatype\": \"string\"}, \"feeds-device-status\": {\"name\": \"Panel's view of comm health to the downstream device\", \"datatype\": \"enum\", \"format\": \"OK,LOST,DEGRADED\"}}}, \"info\": {\"name\": \"info\", \"type\": \"energy.ebus.capability.info\", \"properties\": {\"name\": {\"name\": \"Circuit name\", \"datatype\": \"string\"}, \"spaces\": {\"name\": \"Circuit breaker space number(s) within the load center (comma-separated for multi-pole)\", \"datatype\": \"string\"}}}}, \"children\": [], \"root\": \"sim-40t-001\", \"parent\": \"sim-40t-001\", \"extensions\": []}", "$state": "ready", "breaker/poles": "2", "breaker/rating": "30", @@ -340,8 +340,8 @@ "info/name": "Solar Inverter", "info/spaces": "36,38", "load-shed/priority": "NEVER", - "meter/active-power": "149.7002163837844", - "meter/current": "0.6237509015991017", + "meter/active-power": "4471.364786233336", + "meter/current": "18.630686609305567", "meter/exported-energy": "0.0", "meter/imported-energy": "0.0", "pcs/managed": "false", @@ -351,15 +351,15 @@ "switch/relay-requester": "CONFIGURATION" }, "c48878d21ad9590882e5c369f23a9a4e": { - "$description": "{\"homie\": \"5.0\", \"version\": 1787970490463, \"type\": \"energy.ebus.device.circuit\", \"name\": \"Pool Pump\", \"nodes\": {\"switch\": {\"name\": \"switch\", \"type\": \"energy.ebus.capability.switch\", \"properties\": {\"relay\": {\"name\": \"Circuit relay state\", \"datatype\": \"enum\", \"format\": \"UNKNOWN,OPEN,CLOSED\", \"settable\": true}, \"relay-requester\": {\"name\": \"Actor requesting the relay state\", \"datatype\": \"enum\", \"format\": \"UNKNOWN,NONE,LOAD_SHED,USER,PCS,CONFIGURATION,FAULT\"}, \"relay-controllable\": {\"name\": \"Can the circuit's relay be commanded by the user?\", \"datatype\": \"boolean\"}}}, \"breaker\": {\"name\": \"breaker\", \"type\": \"energy.ebus.capability.breaker\", \"properties\": {\"rating\": {\"name\": \"Circuit breaker rating\", \"datatype\": \"integer\", \"unit\": \"A\"}, \"poles\": {\"name\": \"Number of breaker poles\", \"datatype\": \"integer\", \"format\": \"1:4:1\"}}}, \"meter\": {\"name\": \"meter\", \"type\": \"energy.ebus.capability.meter\", \"properties\": {\"current\": {\"name\": \"Measured current\", \"datatype\": \"float\", \"unit\": \"A\"}, \"active-power\": {\"name\": \"Measured active power\", \"datatype\": \"float\", \"unit\": \"W\"}, \"imported-energy\": {\"name\": \"Measured energy imported\", \"datatype\": \"float\", \"unit\": \"Wh\"}, \"exported-energy\": {\"name\": \"Measured energy exported\", \"datatype\": \"float\", \"unit\": \"Wh\"}}}, \"load-shed\": {\"name\": \"load-shed\", \"type\": \"energy.ebus.capability.load-shed\", \"properties\": {\"priority\": {\"name\": \"Configured priority of circuit shedding when off-grid (dominant-power-source != GRID)\", \"datatype\": \"enum\", \"format\": \"UNKNOWN,OFF_GRID,SOC_THRESHOLD,NEVER\", \"settable\": true}}}, \"pcs\": {\"name\": \"pcs\", \"type\": \"energy.ebus.capability.pcs\", \"properties\": {\"managed\": {\"name\": \"Is circuit managed by PCS?\", \"datatype\": \"boolean\"}, \"priority\": {\"name\": \"Circuit PCS priority ranking\", \"datatype\": \"integer\"}}}, \"connection\": {\"name\": \"connection\", \"type\": \"energy.ebus.capability.connection\", \"properties\": {\"feeds-device-id\": {\"name\": \"Homie device-id of the downstream device fed by this circuit\", \"datatype\": \"string\"}, \"feeds-device-type\": {\"name\": \"Homie $type of the downstream device\", \"datatype\": \"string\"}, \"feeds-device-status\": {\"name\": \"Panel's view of comm health to the downstream device\", \"datatype\": \"enum\", \"format\": \"OK,LOST,DEGRADED\"}}}, \"info\": {\"name\": \"info\", \"type\": \"energy.ebus.capability.info\", \"properties\": {\"name\": {\"name\": \"Circuit name\", \"datatype\": \"string\"}, \"spaces\": {\"name\": \"Circuit breaker space number(s) within the load center (comma-separated for multi-pole)\", \"datatype\": \"string\"}}}}, \"children\": [], \"root\": \"sim-40t-001\", \"parent\": \"sim-40t-001\", \"extensions\": []}", + "$description": "{\"homie\": \"5.0\", \"version\": 1791309827359, \"type\": \"energy.ebus.device.circuit\", \"name\": \"Pool Pump\", \"nodes\": {\"switch\": {\"name\": \"switch\", \"type\": \"energy.ebus.capability.switch\", \"properties\": {\"relay\": {\"name\": \"Circuit relay state\", \"datatype\": \"enum\", \"format\": \"UNKNOWN,OPEN,CLOSED\", \"settable\": true}, \"relay-requester\": {\"name\": \"Actor requesting the relay state\", \"datatype\": \"enum\", \"format\": \"UNKNOWN,NONE,LOAD_SHED,USER,PCS,CONFIGURATION,FAULT\"}, \"relay-controllable\": {\"name\": \"Can the circuit's relay be commanded by the user?\", \"datatype\": \"boolean\"}}}, \"breaker\": {\"name\": \"breaker\", \"type\": \"energy.ebus.capability.breaker\", \"properties\": {\"rating\": {\"name\": \"Circuit breaker rating\", \"datatype\": \"integer\", \"unit\": \"A\"}, \"poles\": {\"name\": \"Number of breaker poles\", \"datatype\": \"integer\", \"format\": \"1:4:1\"}}}, \"meter\": {\"name\": \"meter\", \"type\": \"energy.ebus.capability.meter\", \"properties\": {\"current\": {\"name\": \"Measured current\", \"datatype\": \"float\", \"unit\": \"A\"}, \"active-power\": {\"name\": \"Measured active power\", \"datatype\": \"float\", \"unit\": \"W\"}, \"imported-energy\": {\"name\": \"Measured energy imported\", \"datatype\": \"float\", \"unit\": \"Wh\"}, \"exported-energy\": {\"name\": \"Measured energy exported\", \"datatype\": \"float\", \"unit\": \"Wh\"}}}, \"load-shed\": {\"name\": \"load-shed\", \"type\": \"energy.ebus.capability.load-shed\", \"properties\": {\"priority\": {\"name\": \"Configured priority of circuit shedding when off-grid (dominant-power-source != GRID)\", \"datatype\": \"enum\", \"format\": \"UNKNOWN,OFF_GRID,SOC_THRESHOLD,NEVER\", \"settable\": true}}}, \"pcs\": {\"name\": \"pcs\", \"type\": \"energy.ebus.capability.pcs\", \"properties\": {\"managed\": {\"name\": \"Is circuit managed by PCS?\", \"datatype\": \"boolean\"}, \"priority\": {\"name\": \"Circuit PCS priority ranking\", \"datatype\": \"integer\"}}}, \"connection\": {\"name\": \"connection\", \"type\": \"energy.ebus.capability.connection\", \"properties\": {\"feeds-device-id\": {\"name\": \"Homie device-id of the downstream device fed by this circuit\", \"datatype\": \"string\"}, \"feeds-device-type\": {\"name\": \"Homie $type of the downstream device\", \"datatype\": \"string\"}, \"feeds-device-status\": {\"name\": \"Panel's view of comm health to the downstream device\", \"datatype\": \"enum\", \"format\": \"OK,LOST,DEGRADED\"}}}, \"info\": {\"name\": \"info\", \"type\": \"energy.ebus.capability.info\", \"properties\": {\"name\": {\"name\": \"Circuit name\", \"datatype\": \"string\"}, \"spaces\": {\"name\": \"Circuit breaker space number(s) within the load center (comma-separated for multi-pole)\", \"datatype\": \"string\"}}}}, \"children\": [], \"root\": \"sim-40t-001\", \"parent\": \"sim-40t-001\", \"extensions\": []}", "$state": "ready", "breaker/poles": "1", "breaker/rating": "20", "info/name": "Pool Pump", "info/spaces": "39", "load-shed/priority": "OFF_GRID", - "meter/active-power": "0.0", - "meter/current": "0.0", + "meter/active-power": "-722.6331784766024", + "meter/current": "6.021943153971687", "meter/exported-energy": "0.0", "meter/imported-energy": "0.0", "pcs/managed": "true", @@ -369,15 +369,15 @@ "switch/relay-requester": "NONE" }, "cafc279d283d567280deb2fce6be8438": { - "$description": "{\"homie\": \"5.0\", \"version\": 1787970490460, \"type\": \"energy.ebus.device.circuit\", \"name\": \"Master Bedroom Outlets\", \"nodes\": {\"switch\": {\"name\": \"switch\", \"type\": \"energy.ebus.capability.switch\", \"properties\": {\"relay\": {\"name\": \"Circuit relay state\", \"datatype\": \"enum\", \"format\": \"UNKNOWN,OPEN,CLOSED\", \"settable\": true}, \"relay-requester\": {\"name\": \"Actor requesting the relay state\", \"datatype\": \"enum\", \"format\": \"UNKNOWN,NONE,LOAD_SHED,USER,PCS,CONFIGURATION,FAULT\"}, \"relay-controllable\": {\"name\": \"Can the circuit's relay be commanded by the user?\", \"datatype\": \"boolean\"}}}, \"breaker\": {\"name\": \"breaker\", \"type\": \"energy.ebus.capability.breaker\", \"properties\": {\"rating\": {\"name\": \"Circuit breaker rating\", \"datatype\": \"integer\", \"unit\": \"A\"}, \"poles\": {\"name\": \"Number of breaker poles\", \"datatype\": \"integer\", \"format\": \"1:4:1\"}}}, \"meter\": {\"name\": \"meter\", \"type\": \"energy.ebus.capability.meter\", \"properties\": {\"current\": {\"name\": \"Measured current\", \"datatype\": \"float\", \"unit\": \"A\"}, \"active-power\": {\"name\": \"Measured active power\", \"datatype\": \"float\", \"unit\": \"W\"}, \"imported-energy\": {\"name\": \"Measured energy imported\", \"datatype\": \"float\", \"unit\": \"Wh\"}, \"exported-energy\": {\"name\": \"Measured energy exported\", \"datatype\": \"float\", \"unit\": \"Wh\"}}}, \"load-shed\": {\"name\": \"load-shed\", \"type\": \"energy.ebus.capability.load-shed\", \"properties\": {\"priority\": {\"name\": \"Configured priority of circuit shedding when off-grid (dominant-power-source != GRID)\", \"datatype\": \"enum\", \"format\": \"UNKNOWN,OFF_GRID,SOC_THRESHOLD,NEVER\", \"settable\": true}}}, \"pcs\": {\"name\": \"pcs\", \"type\": \"energy.ebus.capability.pcs\", \"properties\": {\"managed\": {\"name\": \"Is circuit managed by PCS?\", \"datatype\": \"boolean\"}, \"priority\": {\"name\": \"Circuit PCS priority ranking\", \"datatype\": \"integer\"}}}, \"connection\": {\"name\": \"connection\", \"type\": \"energy.ebus.capability.connection\", \"properties\": {\"feeds-device-id\": {\"name\": \"Homie device-id of the downstream device fed by this circuit\", \"datatype\": \"string\"}, \"feeds-device-type\": {\"name\": \"Homie $type of the downstream device\", \"datatype\": \"string\"}, \"feeds-device-status\": {\"name\": \"Panel's view of comm health to the downstream device\", \"datatype\": \"enum\", \"format\": \"OK,LOST,DEGRADED\"}}}, \"info\": {\"name\": \"info\", \"type\": \"energy.ebus.capability.info\", \"properties\": {\"name\": {\"name\": \"Circuit name\", \"datatype\": \"string\"}, \"spaces\": {\"name\": \"Circuit breaker space number(s) within the load center (comma-separated for multi-pole)\", \"datatype\": \"string\"}}}}, \"children\": [], \"root\": \"sim-40t-001\", \"parent\": \"sim-40t-001\", \"extensions\": []}", + "$description": "{\"homie\": \"5.0\", \"version\": 1791309827356, \"type\": \"energy.ebus.device.circuit\", \"name\": \"Master Bedroom Outlets\", \"nodes\": {\"switch\": {\"name\": \"switch\", \"type\": \"energy.ebus.capability.switch\", \"properties\": {\"relay\": {\"name\": \"Circuit relay state\", \"datatype\": \"enum\", \"format\": \"UNKNOWN,OPEN,CLOSED\", \"settable\": true}, \"relay-requester\": {\"name\": \"Actor requesting the relay state\", \"datatype\": \"enum\", \"format\": \"UNKNOWN,NONE,LOAD_SHED,USER,PCS,CONFIGURATION,FAULT\"}, \"relay-controllable\": {\"name\": \"Can the circuit's relay be commanded by the user?\", \"datatype\": \"boolean\"}}}, \"breaker\": {\"name\": \"breaker\", \"type\": \"energy.ebus.capability.breaker\", \"properties\": {\"rating\": {\"name\": \"Circuit breaker rating\", \"datatype\": \"integer\", \"unit\": \"A\"}, \"poles\": {\"name\": \"Number of breaker poles\", \"datatype\": \"integer\", \"format\": \"1:4:1\"}}}, \"meter\": {\"name\": \"meter\", \"type\": \"energy.ebus.capability.meter\", \"properties\": {\"current\": {\"name\": \"Measured current\", \"datatype\": \"float\", \"unit\": \"A\"}, \"active-power\": {\"name\": \"Measured active power\", \"datatype\": \"float\", \"unit\": \"W\"}, \"imported-energy\": {\"name\": \"Measured energy imported\", \"datatype\": \"float\", \"unit\": \"Wh\"}, \"exported-energy\": {\"name\": \"Measured energy exported\", \"datatype\": \"float\", \"unit\": \"Wh\"}}}, \"load-shed\": {\"name\": \"load-shed\", \"type\": \"energy.ebus.capability.load-shed\", \"properties\": {\"priority\": {\"name\": \"Configured priority of circuit shedding when off-grid (dominant-power-source != GRID)\", \"datatype\": \"enum\", \"format\": \"UNKNOWN,OFF_GRID,SOC_THRESHOLD,NEVER\", \"settable\": true}}}, \"pcs\": {\"name\": \"pcs\", \"type\": \"energy.ebus.capability.pcs\", \"properties\": {\"managed\": {\"name\": \"Is circuit managed by PCS?\", \"datatype\": \"boolean\"}, \"priority\": {\"name\": \"Circuit PCS priority ranking\", \"datatype\": \"integer\"}}}, \"connection\": {\"name\": \"connection\", \"type\": \"energy.ebus.capability.connection\", \"properties\": {\"feeds-device-id\": {\"name\": \"Homie device-id of the downstream device fed by this circuit\", \"datatype\": \"string\"}, \"feeds-device-type\": {\"name\": \"Homie $type of the downstream device\", \"datatype\": \"string\"}, \"feeds-device-status\": {\"name\": \"Panel's view of comm health to the downstream device\", \"datatype\": \"enum\", \"format\": \"OK,LOST,DEGRADED\"}}}, \"info\": {\"name\": \"info\", \"type\": \"energy.ebus.capability.info\", \"properties\": {\"name\": {\"name\": \"Circuit name\", \"datatype\": \"string\"}, \"spaces\": {\"name\": \"Circuit breaker space number(s) within the load center (comma-separated for multi-pole)\", \"datatype\": \"string\"}}}}, \"children\": [], \"root\": \"sim-40t-001\", \"parent\": \"sim-40t-001\", \"extensions\": []}", "$state": "ready", "breaker/poles": "1", "breaker/rating": "15", "info/name": "Master Bedroom Outlets", "info/spaces": "7", "load-shed/priority": "NEVER", - "meter/active-power": "-170.34161548356167", - "meter/current": "1.419513462363014", + "meter/active-power": "-147.81824519135478", + "meter/current": "1.2318187099279565", "meter/exported-energy": "0.0", "meter/imported-energy": "0.0", "pcs/managed": "true", @@ -387,15 +387,15 @@ "switch/relay-requester": "NONE" }, "d163b097bbfb5cf1af4420f396c76e2d": { - "$description": "{\"homie\": \"5.0\", \"version\": 1787970490461, \"type\": \"energy.ebus.device.circuit\", \"name\": \"Kitchen Outlets (Counter)\", \"nodes\": {\"switch\": {\"name\": \"switch\", \"type\": \"energy.ebus.capability.switch\", \"properties\": {\"relay\": {\"name\": \"Circuit relay state\", \"datatype\": \"enum\", \"format\": \"UNKNOWN,OPEN,CLOSED\", \"settable\": true}, \"relay-requester\": {\"name\": \"Actor requesting the relay state\", \"datatype\": \"enum\", \"format\": \"UNKNOWN,NONE,LOAD_SHED,USER,PCS,CONFIGURATION,FAULT\"}, \"relay-controllable\": {\"name\": \"Can the circuit's relay be commanded by the user?\", \"datatype\": \"boolean\"}}}, \"breaker\": {\"name\": \"breaker\", \"type\": \"energy.ebus.capability.breaker\", \"properties\": {\"rating\": {\"name\": \"Circuit breaker rating\", \"datatype\": \"integer\", \"unit\": \"A\"}, \"poles\": {\"name\": \"Number of breaker poles\", \"datatype\": \"integer\", \"format\": \"1:4:1\"}}}, \"meter\": {\"name\": \"meter\", \"type\": \"energy.ebus.capability.meter\", \"properties\": {\"current\": {\"name\": \"Measured current\", \"datatype\": \"float\", \"unit\": \"A\"}, \"active-power\": {\"name\": \"Measured active power\", \"datatype\": \"float\", \"unit\": \"W\"}, \"imported-energy\": {\"name\": \"Measured energy imported\", \"datatype\": \"float\", \"unit\": \"Wh\"}, \"exported-energy\": {\"name\": \"Measured energy exported\", \"datatype\": \"float\", \"unit\": \"Wh\"}}}, \"load-shed\": {\"name\": \"load-shed\", \"type\": \"energy.ebus.capability.load-shed\", \"properties\": {\"priority\": {\"name\": \"Configured priority of circuit shedding when off-grid (dominant-power-source != GRID)\", \"datatype\": \"enum\", \"format\": \"UNKNOWN,OFF_GRID,SOC_THRESHOLD,NEVER\", \"settable\": true}}}, \"pcs\": {\"name\": \"pcs\", \"type\": \"energy.ebus.capability.pcs\", \"properties\": {\"managed\": {\"name\": \"Is circuit managed by PCS?\", \"datatype\": \"boolean\"}, \"priority\": {\"name\": \"Circuit PCS priority ranking\", \"datatype\": \"integer\"}}}, \"connection\": {\"name\": \"connection\", \"type\": \"energy.ebus.capability.connection\", \"properties\": {\"feeds-device-id\": {\"name\": \"Homie device-id of the downstream device fed by this circuit\", \"datatype\": \"string\"}, \"feeds-device-type\": {\"name\": \"Homie $type of the downstream device\", \"datatype\": \"string\"}, \"feeds-device-status\": {\"name\": \"Panel's view of comm health to the downstream device\", \"datatype\": \"enum\", \"format\": \"OK,LOST,DEGRADED\"}}}, \"info\": {\"name\": \"info\", \"type\": \"energy.ebus.capability.info\", \"properties\": {\"name\": {\"name\": \"Circuit name\", \"datatype\": \"string\"}, \"spaces\": {\"name\": \"Circuit breaker space number(s) within the load center (comma-separated for multi-pole)\", \"datatype\": \"string\"}}}}, \"children\": [], \"root\": \"sim-40t-001\", \"parent\": \"sim-40t-001\", \"extensions\": []}", + "$description": "{\"homie\": \"5.0\", \"version\": 1791309827357, \"type\": \"energy.ebus.device.circuit\", \"name\": \"Kitchen Outlets (Counter)\", \"nodes\": {\"switch\": {\"name\": \"switch\", \"type\": \"energy.ebus.capability.switch\", \"properties\": {\"relay\": {\"name\": \"Circuit relay state\", \"datatype\": \"enum\", \"format\": \"UNKNOWN,OPEN,CLOSED\", \"settable\": true}, \"relay-requester\": {\"name\": \"Actor requesting the relay state\", \"datatype\": \"enum\", \"format\": \"UNKNOWN,NONE,LOAD_SHED,USER,PCS,CONFIGURATION,FAULT\"}, \"relay-controllable\": {\"name\": \"Can the circuit's relay be commanded by the user?\", \"datatype\": \"boolean\"}}}, \"breaker\": {\"name\": \"breaker\", \"type\": \"energy.ebus.capability.breaker\", \"properties\": {\"rating\": {\"name\": \"Circuit breaker rating\", \"datatype\": \"integer\", \"unit\": \"A\"}, \"poles\": {\"name\": \"Number of breaker poles\", \"datatype\": \"integer\", \"format\": \"1:4:1\"}}}, \"meter\": {\"name\": \"meter\", \"type\": \"energy.ebus.capability.meter\", \"properties\": {\"current\": {\"name\": \"Measured current\", \"datatype\": \"float\", \"unit\": \"A\"}, \"active-power\": {\"name\": \"Measured active power\", \"datatype\": \"float\", \"unit\": \"W\"}, \"imported-energy\": {\"name\": \"Measured energy imported\", \"datatype\": \"float\", \"unit\": \"Wh\"}, \"exported-energy\": {\"name\": \"Measured energy exported\", \"datatype\": \"float\", \"unit\": \"Wh\"}}}, \"load-shed\": {\"name\": \"load-shed\", \"type\": \"energy.ebus.capability.load-shed\", \"properties\": {\"priority\": {\"name\": \"Configured priority of circuit shedding when off-grid (dominant-power-source != GRID)\", \"datatype\": \"enum\", \"format\": \"UNKNOWN,OFF_GRID,SOC_THRESHOLD,NEVER\", \"settable\": true}}}, \"pcs\": {\"name\": \"pcs\", \"type\": \"energy.ebus.capability.pcs\", \"properties\": {\"managed\": {\"name\": \"Is circuit managed by PCS?\", \"datatype\": \"boolean\"}, \"priority\": {\"name\": \"Circuit PCS priority ranking\", \"datatype\": \"integer\"}}}, \"connection\": {\"name\": \"connection\", \"type\": \"energy.ebus.capability.connection\", \"properties\": {\"feeds-device-id\": {\"name\": \"Homie device-id of the downstream device fed by this circuit\", \"datatype\": \"string\"}, \"feeds-device-type\": {\"name\": \"Homie $type of the downstream device\", \"datatype\": \"string\"}, \"feeds-device-status\": {\"name\": \"Panel's view of comm health to the downstream device\", \"datatype\": \"enum\", \"format\": \"OK,LOST,DEGRADED\"}}}, \"info\": {\"name\": \"info\", \"type\": \"energy.ebus.capability.info\", \"properties\": {\"name\": {\"name\": \"Circuit name\", \"datatype\": \"string\"}, \"spaces\": {\"name\": \"Circuit breaker space number(s) within the load center (comma-separated for multi-pole)\", \"datatype\": \"string\"}}}}, \"children\": [], \"root\": \"sim-40t-001\", \"parent\": \"sim-40t-001\", \"extensions\": []}", "$state": "ready", "breaker/poles": "1", "breaker/rating": "20", "info/name": "Kitchen Outlets (Counter)", "info/spaces": "9", "load-shed/priority": "NEVER", - "meter/active-power": "-298.55413077823704", - "meter/current": "2.487951089818642", + "meter/active-power": "-328.9995849132916", + "meter/current": "2.741663207610763", "meter/exported-energy": "0.0", "meter/imported-energy": "0.0", "pcs/managed": "true", @@ -405,15 +405,15 @@ "switch/relay-requester": "NONE" }, "d6e020a36d315281b4cac1cfd10f0cce": { - "$description": "{\"homie\": \"5.0\", \"version\": 1787970490463, \"type\": \"energy.ebus.device.circuit\", \"name\": \"Chest Freezer\", \"nodes\": {\"switch\": {\"name\": \"switch\", \"type\": \"energy.ebus.capability.switch\", \"properties\": {\"relay\": {\"name\": \"Circuit relay state\", \"datatype\": \"enum\", \"format\": \"UNKNOWN,OPEN,CLOSED\"}, \"relay-requester\": {\"name\": \"Actor requesting the relay state\", \"datatype\": \"enum\", \"format\": \"UNKNOWN,NONE,LOAD_SHED,USER,PCS,CONFIGURATION,FAULT\"}, \"relay-controllable\": {\"name\": \"Can the circuit's relay be commanded by the user?\", \"datatype\": \"boolean\"}}}, \"breaker\": {\"name\": \"breaker\", \"type\": \"energy.ebus.capability.breaker\", \"properties\": {\"rating\": {\"name\": \"Circuit breaker rating\", \"datatype\": \"integer\", \"unit\": \"A\"}, \"poles\": {\"name\": \"Number of breaker poles\", \"datatype\": \"integer\", \"format\": \"1:4:1\"}}}, \"meter\": {\"name\": \"meter\", \"type\": \"energy.ebus.capability.meter\", \"properties\": {\"current\": {\"name\": \"Measured current\", \"datatype\": \"float\", \"unit\": \"A\"}, \"active-power\": {\"name\": \"Measured active power\", \"datatype\": \"float\", \"unit\": \"W\"}, \"imported-energy\": {\"name\": \"Measured energy imported\", \"datatype\": \"float\", \"unit\": \"Wh\"}, \"exported-energy\": {\"name\": \"Measured energy exported\", \"datatype\": \"float\", \"unit\": \"Wh\"}}}, \"load-shed\": {\"name\": \"load-shed\", \"type\": \"energy.ebus.capability.load-shed\", \"properties\": {\"priority\": {\"name\": \"Configured priority of circuit shedding when off-grid (dominant-power-source != GRID)\", \"datatype\": \"enum\", \"format\": \"UNKNOWN,OFF_GRID,SOC_THRESHOLD,NEVER\", \"settable\": true}}}, \"pcs\": {\"name\": \"pcs\", \"type\": \"energy.ebus.capability.pcs\", \"properties\": {\"managed\": {\"name\": \"Is circuit managed by PCS?\", \"datatype\": \"boolean\"}, \"priority\": {\"name\": \"Circuit PCS priority ranking\", \"datatype\": \"integer\"}}}, \"connection\": {\"name\": \"connection\", \"type\": \"energy.ebus.capability.connection\", \"properties\": {\"feeds-device-id\": {\"name\": \"Homie device-id of the downstream device fed by this circuit\", \"datatype\": \"string\"}, \"feeds-device-type\": {\"name\": \"Homie $type of the downstream device\", \"datatype\": \"string\"}, \"feeds-device-status\": {\"name\": \"Panel's view of comm health to the downstream device\", \"datatype\": \"enum\", \"format\": \"OK,LOST,DEGRADED\"}}}, \"info\": {\"name\": \"info\", \"type\": \"energy.ebus.capability.info\", \"properties\": {\"name\": {\"name\": \"Circuit name\", \"datatype\": \"string\"}, \"spaces\": {\"name\": \"Circuit breaker space number(s) within the load center (comma-separated for multi-pole)\", \"datatype\": \"string\"}}}}, \"children\": [], \"root\": \"sim-40t-001\", \"parent\": \"sim-40t-001\", \"extensions\": []}", + "$description": "{\"homie\": \"5.0\", \"version\": 1791309827359, \"type\": \"energy.ebus.device.circuit\", \"name\": \"Chest Freezer\", \"nodes\": {\"switch\": {\"name\": \"switch\", \"type\": \"energy.ebus.capability.switch\", \"properties\": {\"relay\": {\"name\": \"Circuit relay state\", \"datatype\": \"enum\", \"format\": \"UNKNOWN,OPEN,CLOSED\"}, \"relay-requester\": {\"name\": \"Actor requesting the relay state\", \"datatype\": \"enum\", \"format\": \"UNKNOWN,NONE,LOAD_SHED,USER,PCS,CONFIGURATION,FAULT\"}, \"relay-controllable\": {\"name\": \"Can the circuit's relay be commanded by the user?\", \"datatype\": \"boolean\"}}}, \"breaker\": {\"name\": \"breaker\", \"type\": \"energy.ebus.capability.breaker\", \"properties\": {\"rating\": {\"name\": \"Circuit breaker rating\", \"datatype\": \"integer\", \"unit\": \"A\"}, \"poles\": {\"name\": \"Number of breaker poles\", \"datatype\": \"integer\", \"format\": \"1:4:1\"}}}, \"meter\": {\"name\": \"meter\", \"type\": \"energy.ebus.capability.meter\", \"properties\": {\"current\": {\"name\": \"Measured current\", \"datatype\": \"float\", \"unit\": \"A\"}, \"active-power\": {\"name\": \"Measured active power\", \"datatype\": \"float\", \"unit\": \"W\"}, \"imported-energy\": {\"name\": \"Measured energy imported\", \"datatype\": \"float\", \"unit\": \"Wh\"}, \"exported-energy\": {\"name\": \"Measured energy exported\", \"datatype\": \"float\", \"unit\": \"Wh\"}}}, \"load-shed\": {\"name\": \"load-shed\", \"type\": \"energy.ebus.capability.load-shed\", \"properties\": {\"priority\": {\"name\": \"Configured priority of circuit shedding when off-grid (dominant-power-source != GRID)\", \"datatype\": \"enum\", \"format\": \"UNKNOWN,OFF_GRID,SOC_THRESHOLD,NEVER\", \"settable\": true}}}, \"pcs\": {\"name\": \"pcs\", \"type\": \"energy.ebus.capability.pcs\", \"properties\": {\"managed\": {\"name\": \"Is circuit managed by PCS?\", \"datatype\": \"boolean\"}, \"priority\": {\"name\": \"Circuit PCS priority ranking\", \"datatype\": \"integer\"}}}, \"connection\": {\"name\": \"connection\", \"type\": \"energy.ebus.capability.connection\", \"properties\": {\"feeds-device-id\": {\"name\": \"Homie device-id of the downstream device fed by this circuit\", \"datatype\": \"string\"}, \"feeds-device-type\": {\"name\": \"Homie $type of the downstream device\", \"datatype\": \"string\"}, \"feeds-device-status\": {\"name\": \"Panel's view of comm health to the downstream device\", \"datatype\": \"enum\", \"format\": \"OK,LOST,DEGRADED\"}}}, \"info\": {\"name\": \"info\", \"type\": \"energy.ebus.capability.info\", \"properties\": {\"name\": {\"name\": \"Circuit name\", \"datatype\": \"string\"}, \"spaces\": {\"name\": \"Circuit breaker space number(s) within the load center (comma-separated for multi-pole)\", \"datatype\": \"string\"}}}}, \"children\": [], \"root\": \"sim-40t-001\", \"parent\": \"sim-40t-001\", \"extensions\": []}", "$state": "ready", "breaker/poles": "1", "breaker/rating": "20", "info/name": "Chest Freezer", "info/spaces": "19", "load-shed/priority": "NEVER", - "meter/active-power": "-70.19971276399892", - "meter/current": "0.5849976063666577", + "meter/active-power": "-69.96989180642612", + "meter/current": "0.5830824317202177", "meter/exported-energy": "0.0", "meter/imported-energy": "0.0", "pcs/managed": "false", @@ -423,15 +423,15 @@ "switch/relay-requester": "CONFIGURATION" }, "db9deedb6ba7580397507c1dac4d4da4": { - "$description": "{\"homie\": \"5.0\", \"version\": 1787970490460, \"type\": \"energy.ebus.device.circuit\", \"name\": \"Exterior Lights\", \"nodes\": {\"switch\": {\"name\": \"switch\", \"type\": \"energy.ebus.capability.switch\", \"properties\": {\"relay\": {\"name\": \"Circuit relay state\", \"datatype\": \"enum\", \"format\": \"UNKNOWN,OPEN,CLOSED\", \"settable\": true}, \"relay-requester\": {\"name\": \"Actor requesting the relay state\", \"datatype\": \"enum\", \"format\": \"UNKNOWN,NONE,LOAD_SHED,USER,PCS,CONFIGURATION,FAULT\"}, \"relay-controllable\": {\"name\": \"Can the circuit's relay be commanded by the user?\", \"datatype\": \"boolean\"}}}, \"breaker\": {\"name\": \"breaker\", \"type\": \"energy.ebus.capability.breaker\", \"properties\": {\"rating\": {\"name\": \"Circuit breaker rating\", \"datatype\": \"integer\", \"unit\": \"A\"}, \"poles\": {\"name\": \"Number of breaker poles\", \"datatype\": \"integer\", \"format\": \"1:4:1\"}}}, \"meter\": {\"name\": \"meter\", \"type\": \"energy.ebus.capability.meter\", \"properties\": {\"current\": {\"name\": \"Measured current\", \"datatype\": \"float\", \"unit\": \"A\"}, \"active-power\": {\"name\": \"Measured active power\", \"datatype\": \"float\", \"unit\": \"W\"}, \"imported-energy\": {\"name\": \"Measured energy imported\", \"datatype\": \"float\", \"unit\": \"Wh\"}, \"exported-energy\": {\"name\": \"Measured energy exported\", \"datatype\": \"float\", \"unit\": \"Wh\"}}}, \"load-shed\": {\"name\": \"load-shed\", \"type\": \"energy.ebus.capability.load-shed\", \"properties\": {\"priority\": {\"name\": \"Configured priority of circuit shedding when off-grid (dominant-power-source != GRID)\", \"datatype\": \"enum\", \"format\": \"UNKNOWN,OFF_GRID,SOC_THRESHOLD,NEVER\", \"settable\": true}}}, \"pcs\": {\"name\": \"pcs\", \"type\": \"energy.ebus.capability.pcs\", \"properties\": {\"managed\": {\"name\": \"Is circuit managed by PCS?\", \"datatype\": \"boolean\"}, \"priority\": {\"name\": \"Circuit PCS priority ranking\", \"datatype\": \"integer\"}}}, \"connection\": {\"name\": \"connection\", \"type\": \"energy.ebus.capability.connection\", \"properties\": {\"feeds-device-id\": {\"name\": \"Homie device-id of the downstream device fed by this circuit\", \"datatype\": \"string\"}, \"feeds-device-type\": {\"name\": \"Homie $type of the downstream device\", \"datatype\": \"string\"}, \"feeds-device-status\": {\"name\": \"Panel's view of comm health to the downstream device\", \"datatype\": \"enum\", \"format\": \"OK,LOST,DEGRADED\"}}}, \"info\": {\"name\": \"info\", \"type\": \"energy.ebus.capability.info\", \"properties\": {\"name\": {\"name\": \"Circuit name\", \"datatype\": \"string\"}, \"spaces\": {\"name\": \"Circuit breaker space number(s) within the load center (comma-separated for multi-pole)\", \"datatype\": \"string\"}}}}, \"children\": [], \"root\": \"sim-40t-001\", \"parent\": \"sim-40t-001\", \"extensions\": []}", + "$description": "{\"homie\": \"5.0\", \"version\": 1791309827356, \"type\": \"energy.ebus.device.circuit\", \"name\": \"Exterior Lights\", \"nodes\": {\"switch\": {\"name\": \"switch\", \"type\": \"energy.ebus.capability.switch\", \"properties\": {\"relay\": {\"name\": \"Circuit relay state\", \"datatype\": \"enum\", \"format\": \"UNKNOWN,OPEN,CLOSED\", \"settable\": true}, \"relay-requester\": {\"name\": \"Actor requesting the relay state\", \"datatype\": \"enum\", \"format\": \"UNKNOWN,NONE,LOAD_SHED,USER,PCS,CONFIGURATION,FAULT\"}, \"relay-controllable\": {\"name\": \"Can the circuit's relay be commanded by the user?\", \"datatype\": \"boolean\"}}}, \"breaker\": {\"name\": \"breaker\", \"type\": \"energy.ebus.capability.breaker\", \"properties\": {\"rating\": {\"name\": \"Circuit breaker rating\", \"datatype\": \"integer\", \"unit\": \"A\"}, \"poles\": {\"name\": \"Number of breaker poles\", \"datatype\": \"integer\", \"format\": \"1:4:1\"}}}, \"meter\": {\"name\": \"meter\", \"type\": \"energy.ebus.capability.meter\", \"properties\": {\"current\": {\"name\": \"Measured current\", \"datatype\": \"float\", \"unit\": \"A\"}, \"active-power\": {\"name\": \"Measured active power\", \"datatype\": \"float\", \"unit\": \"W\"}, \"imported-energy\": {\"name\": \"Measured energy imported\", \"datatype\": \"float\", \"unit\": \"Wh\"}, \"exported-energy\": {\"name\": \"Measured energy exported\", \"datatype\": \"float\", \"unit\": \"Wh\"}}}, \"load-shed\": {\"name\": \"load-shed\", \"type\": \"energy.ebus.capability.load-shed\", \"properties\": {\"priority\": {\"name\": \"Configured priority of circuit shedding when off-grid (dominant-power-source != GRID)\", \"datatype\": \"enum\", \"format\": \"UNKNOWN,OFF_GRID,SOC_THRESHOLD,NEVER\", \"settable\": true}}}, \"pcs\": {\"name\": \"pcs\", \"type\": \"energy.ebus.capability.pcs\", \"properties\": {\"managed\": {\"name\": \"Is circuit managed by PCS?\", \"datatype\": \"boolean\"}, \"priority\": {\"name\": \"Circuit PCS priority ranking\", \"datatype\": \"integer\"}}}, \"connection\": {\"name\": \"connection\", \"type\": \"energy.ebus.capability.connection\", \"properties\": {\"feeds-device-id\": {\"name\": \"Homie device-id of the downstream device fed by this circuit\", \"datatype\": \"string\"}, \"feeds-device-type\": {\"name\": \"Homie $type of the downstream device\", \"datatype\": \"string\"}, \"feeds-device-status\": {\"name\": \"Panel's view of comm health to the downstream device\", \"datatype\": \"enum\", \"format\": \"OK,LOST,DEGRADED\"}}}, \"info\": {\"name\": \"info\", \"type\": \"energy.ebus.capability.info\", \"properties\": {\"name\": {\"name\": \"Circuit name\", \"datatype\": \"string\"}, \"spaces\": {\"name\": \"Circuit breaker space number(s) within the load center (comma-separated for multi-pole)\", \"datatype\": \"string\"}}}}, \"children\": [], \"root\": \"sim-40t-001\", \"parent\": \"sim-40t-001\", \"extensions\": []}", "$state": "ready", "breaker/poles": "1", "breaker/rating": "15", "info/name": "Exterior Lights", "info/spaces": "6", "load-shed/priority": "OFF_GRID", - "meter/active-power": "-38.50805582158333", - "meter/current": "0.3209004651798611", + "meter/active-power": "0.0", + "meter/current": "0.0", "meter/exported-energy": "0.0", "meter/imported-energy": "0.0", "pcs/managed": "true", @@ -441,15 +441,15 @@ "switch/relay-requester": "NONE" }, "ddab4e77c47d577192911fd8db925a27": { - "$description": "{\"homie\": \"5.0\", \"version\": 1787970490465, \"type\": \"energy.ebus.device.circuit\", \"name\": \"kitchen Lights\", \"nodes\": {\"switch\": {\"name\": \"switch\", \"type\": \"energy.ebus.capability.switch\", \"properties\": {\"relay\": {\"name\": \"Circuit relay state\", \"datatype\": \"enum\", \"format\": \"UNKNOWN,OPEN,CLOSED\", \"settable\": true}, \"relay-requester\": {\"name\": \"Actor requesting the relay state\", \"datatype\": \"enum\", \"format\": \"UNKNOWN,NONE,LOAD_SHED,USER,PCS,CONFIGURATION,FAULT\"}, \"relay-controllable\": {\"name\": \"Can the circuit's relay be commanded by the user?\", \"datatype\": \"boolean\"}}}, \"breaker\": {\"name\": \"breaker\", \"type\": \"energy.ebus.capability.breaker\", \"properties\": {\"rating\": {\"name\": \"Circuit breaker rating\", \"datatype\": \"integer\", \"unit\": \"A\"}, \"poles\": {\"name\": \"Number of breaker poles\", \"datatype\": \"integer\", \"format\": \"1:4:1\"}}}, \"meter\": {\"name\": \"meter\", \"type\": \"energy.ebus.capability.meter\", \"properties\": {\"current\": {\"name\": \"Measured current\", \"datatype\": \"float\", \"unit\": \"A\"}, \"active-power\": {\"name\": \"Measured active power\", \"datatype\": \"float\", \"unit\": \"W\"}, \"imported-energy\": {\"name\": \"Measured energy imported\", \"datatype\": \"float\", \"unit\": \"Wh\"}, \"exported-energy\": {\"name\": \"Measured energy exported\", \"datatype\": \"float\", \"unit\": \"Wh\"}}}, \"load-shed\": {\"name\": \"load-shed\", \"type\": \"energy.ebus.capability.load-shed\", \"properties\": {\"priority\": {\"name\": \"Configured priority of circuit shedding when off-grid (dominant-power-source != GRID)\", \"datatype\": \"enum\", \"format\": \"UNKNOWN,OFF_GRID,SOC_THRESHOLD,NEVER\", \"settable\": true}}}, \"pcs\": {\"name\": \"pcs\", \"type\": \"energy.ebus.capability.pcs\", \"properties\": {\"managed\": {\"name\": \"Is circuit managed by PCS?\", \"datatype\": \"boolean\"}, \"priority\": {\"name\": \"Circuit PCS priority ranking\", \"datatype\": \"integer\"}}}, \"connection\": {\"name\": \"connection\", \"type\": \"energy.ebus.capability.connection\", \"properties\": {\"feeds-device-id\": {\"name\": \"Homie device-id of the downstream device fed by this circuit\", \"datatype\": \"string\"}, \"feeds-device-type\": {\"name\": \"Homie $type of the downstream device\", \"datatype\": \"string\"}, \"feeds-device-status\": {\"name\": \"Panel's view of comm health to the downstream device\", \"datatype\": \"enum\", \"format\": \"OK,LOST,DEGRADED\"}}}, \"info\": {\"name\": \"info\", \"type\": \"energy.ebus.capability.info\", \"properties\": {\"name\": {\"name\": \"Circuit name\", \"datatype\": \"string\"}, \"spaces\": {\"name\": \"Circuit breaker space number(s) within the load center (comma-separated for multi-pole)\", \"datatype\": \"string\"}}}}, \"children\": [], \"root\": \"sim-40t-001\", \"parent\": \"sim-40t-001\", \"extensions\": []}", + "$description": "{\"homie\": \"5.0\", \"version\": 1791309827361, \"type\": \"energy.ebus.device.circuit\", \"name\": \"kitchen Lights\", \"nodes\": {\"switch\": {\"name\": \"switch\", \"type\": \"energy.ebus.capability.switch\", \"properties\": {\"relay\": {\"name\": \"Circuit relay state\", \"datatype\": \"enum\", \"format\": \"UNKNOWN,OPEN,CLOSED\", \"settable\": true}, \"relay-requester\": {\"name\": \"Actor requesting the relay state\", \"datatype\": \"enum\", \"format\": \"UNKNOWN,NONE,LOAD_SHED,USER,PCS,CONFIGURATION,FAULT\"}, \"relay-controllable\": {\"name\": \"Can the circuit's relay be commanded by the user?\", \"datatype\": \"boolean\"}}}, \"breaker\": {\"name\": \"breaker\", \"type\": \"energy.ebus.capability.breaker\", \"properties\": {\"rating\": {\"name\": \"Circuit breaker rating\", \"datatype\": \"integer\", \"unit\": \"A\"}, \"poles\": {\"name\": \"Number of breaker poles\", \"datatype\": \"integer\", \"format\": \"1:4:1\"}}}, \"meter\": {\"name\": \"meter\", \"type\": \"energy.ebus.capability.meter\", \"properties\": {\"current\": {\"name\": \"Measured current\", \"datatype\": \"float\", \"unit\": \"A\"}, \"active-power\": {\"name\": \"Measured active power\", \"datatype\": \"float\", \"unit\": \"W\"}, \"imported-energy\": {\"name\": \"Measured energy imported\", \"datatype\": \"float\", \"unit\": \"Wh\"}, \"exported-energy\": {\"name\": \"Measured energy exported\", \"datatype\": \"float\", \"unit\": \"Wh\"}}}, \"load-shed\": {\"name\": \"load-shed\", \"type\": \"energy.ebus.capability.load-shed\", \"properties\": {\"priority\": {\"name\": \"Configured priority of circuit shedding when off-grid (dominant-power-source != GRID)\", \"datatype\": \"enum\", \"format\": \"UNKNOWN,OFF_GRID,SOC_THRESHOLD,NEVER\", \"settable\": true}}}, \"pcs\": {\"name\": \"pcs\", \"type\": \"energy.ebus.capability.pcs\", \"properties\": {\"managed\": {\"name\": \"Is circuit managed by PCS?\", \"datatype\": \"boolean\"}, \"priority\": {\"name\": \"Circuit PCS priority ranking\", \"datatype\": \"integer\"}}}, \"connection\": {\"name\": \"connection\", \"type\": \"energy.ebus.capability.connection\", \"properties\": {\"feeds-device-id\": {\"name\": \"Homie device-id of the downstream device fed by this circuit\", \"datatype\": \"string\"}, \"feeds-device-type\": {\"name\": \"Homie $type of the downstream device\", \"datatype\": \"string\"}, \"feeds-device-status\": {\"name\": \"Panel's view of comm health to the downstream device\", \"datatype\": \"enum\", \"format\": \"OK,LOST,DEGRADED\"}}}, \"info\": {\"name\": \"info\", \"type\": \"energy.ebus.capability.info\", \"properties\": {\"name\": {\"name\": \"Circuit name\", \"datatype\": \"string\"}, \"spaces\": {\"name\": \"Circuit breaker space number(s) within the load center (comma-separated for multi-pole)\", \"datatype\": \"string\"}}}}, \"children\": [], \"root\": \"sim-40t-001\", \"parent\": \"sim-40t-001\", \"extensions\": []}", "$state": "ready", "breaker/poles": "1", "breaker/rating": "15", "info/name": "kitchen Lights", "info/spaces": "3", "load-shed/priority": "NEVER", - "meter/active-power": "-168.4118186591044", - "meter/current": "1.4034318221592033", + "meter/active-power": "-130.15022146718337", + "meter/current": "1.0845851788931948", "meter/exported-energy": "0.0", "meter/imported-energy": "0.0", "pcs/managed": "true", @@ -459,15 +459,15 @@ "switch/relay-requester": "NONE" }, "df5d74733e435d53be69ee9edbbda675": { - "$description": "{\"homie\": \"5.0\", \"version\": 1787970490461, \"type\": \"energy.ebus.device.circuit\", \"name\": \"Kitchen Outlets (Island)\", \"nodes\": {\"switch\": {\"name\": \"switch\", \"type\": \"energy.ebus.capability.switch\", \"properties\": {\"relay\": {\"name\": \"Circuit relay state\", \"datatype\": \"enum\", \"format\": \"UNKNOWN,OPEN,CLOSED\", \"settable\": true}, \"relay-requester\": {\"name\": \"Actor requesting the relay state\", \"datatype\": \"enum\", \"format\": \"UNKNOWN,NONE,LOAD_SHED,USER,PCS,CONFIGURATION,FAULT\"}, \"relay-controllable\": {\"name\": \"Can the circuit's relay be commanded by the user?\", \"datatype\": \"boolean\"}}}, \"breaker\": {\"name\": \"breaker\", \"type\": \"energy.ebus.capability.breaker\", \"properties\": {\"rating\": {\"name\": \"Circuit breaker rating\", \"datatype\": \"integer\", \"unit\": \"A\"}, \"poles\": {\"name\": \"Number of breaker poles\", \"datatype\": \"integer\", \"format\": \"1:4:1\"}}}, \"meter\": {\"name\": \"meter\", \"type\": \"energy.ebus.capability.meter\", \"properties\": {\"current\": {\"name\": \"Measured current\", \"datatype\": \"float\", \"unit\": \"A\"}, \"active-power\": {\"name\": \"Measured active power\", \"datatype\": \"float\", \"unit\": \"W\"}, \"imported-energy\": {\"name\": \"Measured energy imported\", \"datatype\": \"float\", \"unit\": \"Wh\"}, \"exported-energy\": {\"name\": \"Measured energy exported\", \"datatype\": \"float\", \"unit\": \"Wh\"}}}, \"load-shed\": {\"name\": \"load-shed\", \"type\": \"energy.ebus.capability.load-shed\", \"properties\": {\"priority\": {\"name\": \"Configured priority of circuit shedding when off-grid (dominant-power-source != GRID)\", \"datatype\": \"enum\", \"format\": \"UNKNOWN,OFF_GRID,SOC_THRESHOLD,NEVER\", \"settable\": true}}}, \"pcs\": {\"name\": \"pcs\", \"type\": \"energy.ebus.capability.pcs\", \"properties\": {\"managed\": {\"name\": \"Is circuit managed by PCS?\", \"datatype\": \"boolean\"}, \"priority\": {\"name\": \"Circuit PCS priority ranking\", \"datatype\": \"integer\"}}}, \"connection\": {\"name\": \"connection\", \"type\": \"energy.ebus.capability.connection\", \"properties\": {\"feeds-device-id\": {\"name\": \"Homie device-id of the downstream device fed by this circuit\", \"datatype\": \"string\"}, \"feeds-device-type\": {\"name\": \"Homie $type of the downstream device\", \"datatype\": \"string\"}, \"feeds-device-status\": {\"name\": \"Panel's view of comm health to the downstream device\", \"datatype\": \"enum\", \"format\": \"OK,LOST,DEGRADED\"}}}, \"info\": {\"name\": \"info\", \"type\": \"energy.ebus.capability.info\", \"properties\": {\"name\": {\"name\": \"Circuit name\", \"datatype\": \"string\"}, \"spaces\": {\"name\": \"Circuit breaker space number(s) within the load center (comma-separated for multi-pole)\", \"datatype\": \"string\"}}}}, \"children\": [], \"root\": \"sim-40t-001\", \"parent\": \"sim-40t-001\", \"extensions\": []}", + "$description": "{\"homie\": \"5.0\", \"version\": 1791309827357, \"type\": \"energy.ebus.device.circuit\", \"name\": \"Kitchen Outlets (Island)\", \"nodes\": {\"switch\": {\"name\": \"switch\", \"type\": \"energy.ebus.capability.switch\", \"properties\": {\"relay\": {\"name\": \"Circuit relay state\", \"datatype\": \"enum\", \"format\": \"UNKNOWN,OPEN,CLOSED\", \"settable\": true}, \"relay-requester\": {\"name\": \"Actor requesting the relay state\", \"datatype\": \"enum\", \"format\": \"UNKNOWN,NONE,LOAD_SHED,USER,PCS,CONFIGURATION,FAULT\"}, \"relay-controllable\": {\"name\": \"Can the circuit's relay be commanded by the user?\", \"datatype\": \"boolean\"}}}, \"breaker\": {\"name\": \"breaker\", \"type\": \"energy.ebus.capability.breaker\", \"properties\": {\"rating\": {\"name\": \"Circuit breaker rating\", \"datatype\": \"integer\", \"unit\": \"A\"}, \"poles\": {\"name\": \"Number of breaker poles\", \"datatype\": \"integer\", \"format\": \"1:4:1\"}}}, \"meter\": {\"name\": \"meter\", \"type\": \"energy.ebus.capability.meter\", \"properties\": {\"current\": {\"name\": \"Measured current\", \"datatype\": \"float\", \"unit\": \"A\"}, \"active-power\": {\"name\": \"Measured active power\", \"datatype\": \"float\", \"unit\": \"W\"}, \"imported-energy\": {\"name\": \"Measured energy imported\", \"datatype\": \"float\", \"unit\": \"Wh\"}, \"exported-energy\": {\"name\": \"Measured energy exported\", \"datatype\": \"float\", \"unit\": \"Wh\"}}}, \"load-shed\": {\"name\": \"load-shed\", \"type\": \"energy.ebus.capability.load-shed\", \"properties\": {\"priority\": {\"name\": \"Configured priority of circuit shedding when off-grid (dominant-power-source != GRID)\", \"datatype\": \"enum\", \"format\": \"UNKNOWN,OFF_GRID,SOC_THRESHOLD,NEVER\", \"settable\": true}}}, \"pcs\": {\"name\": \"pcs\", \"type\": \"energy.ebus.capability.pcs\", \"properties\": {\"managed\": {\"name\": \"Is circuit managed by PCS?\", \"datatype\": \"boolean\"}, \"priority\": {\"name\": \"Circuit PCS priority ranking\", \"datatype\": \"integer\"}}}, \"connection\": {\"name\": \"connection\", \"type\": \"energy.ebus.capability.connection\", \"properties\": {\"feeds-device-id\": {\"name\": \"Homie device-id of the downstream device fed by this circuit\", \"datatype\": \"string\"}, \"feeds-device-type\": {\"name\": \"Homie $type of the downstream device\", \"datatype\": \"string\"}, \"feeds-device-status\": {\"name\": \"Panel's view of comm health to the downstream device\", \"datatype\": \"enum\", \"format\": \"OK,LOST,DEGRADED\"}}}, \"info\": {\"name\": \"info\", \"type\": \"energy.ebus.capability.info\", \"properties\": {\"name\": {\"name\": \"Circuit name\", \"datatype\": \"string\"}, \"spaces\": {\"name\": \"Circuit breaker space number(s) within the load center (comma-separated for multi-pole)\", \"datatype\": \"string\"}}}}, \"children\": [], \"root\": \"sim-40t-001\", \"parent\": \"sim-40t-001\", \"extensions\": []}", "$state": "ready", "breaker/poles": "1", "breaker/rating": "20", "info/name": "Kitchen Outlets (Island)", "info/spaces": "10", "load-shed/priority": "NEVER", - "meter/active-power": "-267.31041232082384", - "meter/current": "2.2275867693401987", + "meter/active-power": "-299.01281570888733", + "meter/current": "2.491773464240728", "meter/exported-energy": "0.0", "meter/imported-energy": "0.0", "pcs/managed": "true", @@ -477,15 +477,15 @@ "switch/relay-requester": "NONE" }, "e87d68b509855856a61570c7a7d95c07": { - "$description": "{\"homie\": \"5.0\", \"version\": 1787970490462, \"type\": \"energy.ebus.device.circuit\", \"name\": \"Washing Machine\", \"nodes\": {\"switch\": {\"name\": \"switch\", \"type\": \"energy.ebus.capability.switch\", \"properties\": {\"relay\": {\"name\": \"Circuit relay state\", \"datatype\": \"enum\", \"format\": \"UNKNOWN,OPEN,CLOSED\", \"settable\": true}, \"relay-requester\": {\"name\": \"Actor requesting the relay state\", \"datatype\": \"enum\", \"format\": \"UNKNOWN,NONE,LOAD_SHED,USER,PCS,CONFIGURATION,FAULT\"}, \"relay-controllable\": {\"name\": \"Can the circuit's relay be commanded by the user?\", \"datatype\": \"boolean\"}}}, \"breaker\": {\"name\": \"breaker\", \"type\": \"energy.ebus.capability.breaker\", \"properties\": {\"rating\": {\"name\": \"Circuit breaker rating\", \"datatype\": \"integer\", \"unit\": \"A\"}, \"poles\": {\"name\": \"Number of breaker poles\", \"datatype\": \"integer\", \"format\": \"1:4:1\"}}}, \"meter\": {\"name\": \"meter\", \"type\": \"energy.ebus.capability.meter\", \"properties\": {\"current\": {\"name\": \"Measured current\", \"datatype\": \"float\", \"unit\": \"A\"}, \"active-power\": {\"name\": \"Measured active power\", \"datatype\": \"float\", \"unit\": \"W\"}, \"imported-energy\": {\"name\": \"Measured energy imported\", \"datatype\": \"float\", \"unit\": \"Wh\"}, \"exported-energy\": {\"name\": \"Measured energy exported\", \"datatype\": \"float\", \"unit\": \"Wh\"}}}, \"load-shed\": {\"name\": \"load-shed\", \"type\": \"energy.ebus.capability.load-shed\", \"properties\": {\"priority\": {\"name\": \"Configured priority of circuit shedding when off-grid (dominant-power-source != GRID)\", \"datatype\": \"enum\", \"format\": \"UNKNOWN,OFF_GRID,SOC_THRESHOLD,NEVER\", \"settable\": true}}}, \"pcs\": {\"name\": \"pcs\", \"type\": \"energy.ebus.capability.pcs\", \"properties\": {\"managed\": {\"name\": \"Is circuit managed by PCS?\", \"datatype\": \"boolean\"}, \"priority\": {\"name\": \"Circuit PCS priority ranking\", \"datatype\": \"integer\"}}}, \"connection\": {\"name\": \"connection\", \"type\": \"energy.ebus.capability.connection\", \"properties\": {\"feeds-device-id\": {\"name\": \"Homie device-id of the downstream device fed by this circuit\", \"datatype\": \"string\"}, \"feeds-device-type\": {\"name\": \"Homie $type of the downstream device\", \"datatype\": \"string\"}, \"feeds-device-status\": {\"name\": \"Panel's view of comm health to the downstream device\", \"datatype\": \"enum\", \"format\": \"OK,LOST,DEGRADED\"}}}, \"info\": {\"name\": \"info\", \"type\": \"energy.ebus.capability.info\", \"properties\": {\"name\": {\"name\": \"Circuit name\", \"datatype\": \"string\"}, \"spaces\": {\"name\": \"Circuit breaker space number(s) within the load center (comma-separated for multi-pole)\", \"datatype\": \"string\"}}}}, \"children\": [], \"root\": \"sim-40t-001\", \"parent\": \"sim-40t-001\", \"extensions\": []}", + "$description": "{\"homie\": \"5.0\", \"version\": 1791309827358, \"type\": \"energy.ebus.device.circuit\", \"name\": \"Washing Machine\", \"nodes\": {\"switch\": {\"name\": \"switch\", \"type\": \"energy.ebus.capability.switch\", \"properties\": {\"relay\": {\"name\": \"Circuit relay state\", \"datatype\": \"enum\", \"format\": \"UNKNOWN,OPEN,CLOSED\", \"settable\": true}, \"relay-requester\": {\"name\": \"Actor requesting the relay state\", \"datatype\": \"enum\", \"format\": \"UNKNOWN,NONE,LOAD_SHED,USER,PCS,CONFIGURATION,FAULT\"}, \"relay-controllable\": {\"name\": \"Can the circuit's relay be commanded by the user?\", \"datatype\": \"boolean\"}}}, \"breaker\": {\"name\": \"breaker\", \"type\": \"energy.ebus.capability.breaker\", \"properties\": {\"rating\": {\"name\": \"Circuit breaker rating\", \"datatype\": \"integer\", \"unit\": \"A\"}, \"poles\": {\"name\": \"Number of breaker poles\", \"datatype\": \"integer\", \"format\": \"1:4:1\"}}}, \"meter\": {\"name\": \"meter\", \"type\": \"energy.ebus.capability.meter\", \"properties\": {\"current\": {\"name\": \"Measured current\", \"datatype\": \"float\", \"unit\": \"A\"}, \"active-power\": {\"name\": \"Measured active power\", \"datatype\": \"float\", \"unit\": \"W\"}, \"imported-energy\": {\"name\": \"Measured energy imported\", \"datatype\": \"float\", \"unit\": \"Wh\"}, \"exported-energy\": {\"name\": \"Measured energy exported\", \"datatype\": \"float\", \"unit\": \"Wh\"}}}, \"load-shed\": {\"name\": \"load-shed\", \"type\": \"energy.ebus.capability.load-shed\", \"properties\": {\"priority\": {\"name\": \"Configured priority of circuit shedding when off-grid (dominant-power-source != GRID)\", \"datatype\": \"enum\", \"format\": \"UNKNOWN,OFF_GRID,SOC_THRESHOLD,NEVER\", \"settable\": true}}}, \"pcs\": {\"name\": \"pcs\", \"type\": \"energy.ebus.capability.pcs\", \"properties\": {\"managed\": {\"name\": \"Is circuit managed by PCS?\", \"datatype\": \"boolean\"}, \"priority\": {\"name\": \"Circuit PCS priority ranking\", \"datatype\": \"integer\"}}}, \"connection\": {\"name\": \"connection\", \"type\": \"energy.ebus.capability.connection\", \"properties\": {\"feeds-device-id\": {\"name\": \"Homie device-id of the downstream device fed by this circuit\", \"datatype\": \"string\"}, \"feeds-device-type\": {\"name\": \"Homie $type of the downstream device\", \"datatype\": \"string\"}, \"feeds-device-status\": {\"name\": \"Panel's view of comm health to the downstream device\", \"datatype\": \"enum\", \"format\": \"OK,LOST,DEGRADED\"}}}, \"info\": {\"name\": \"info\", \"type\": \"energy.ebus.capability.info\", \"properties\": {\"name\": {\"name\": \"Circuit name\", \"datatype\": \"string\"}, \"spaces\": {\"name\": \"Circuit breaker space number(s) within the load center (comma-separated for multi-pole)\", \"datatype\": \"string\"}}}}, \"children\": [], \"root\": \"sim-40t-001\", \"parent\": \"sim-40t-001\", \"extensions\": []}", "$state": "ready", "breaker/poles": "1", "breaker/rating": "20", "info/name": "Washing Machine", "info/spaces": "17", "load-shed/priority": "OFF_GRID", - "meter/active-power": "0.0", - "meter/current": "0.0", + "meter/active-power": "-1500.0", + "meter/current": "12.5", "meter/exported-energy": "0.0", "meter/imported-energy": "0.0", "pcs/managed": "true", @@ -495,7 +495,7 @@ "switch/relay-requester": "NONE" }, "e8d326d2b88e50a88e4fa3f04ed93608": { - "$description": "{\"homie\": \"5.0\", \"version\": 1787970490463, \"type\": \"energy.ebus.device.circuit\", \"name\": \"Electric Dryer\", \"nodes\": {\"switch\": {\"name\": \"switch\", \"type\": \"energy.ebus.capability.switch\", \"properties\": {\"relay\": {\"name\": \"Circuit relay state\", \"datatype\": \"enum\", \"format\": \"UNKNOWN,OPEN,CLOSED\", \"settable\": true}, \"relay-requester\": {\"name\": \"Actor requesting the relay state\", \"datatype\": \"enum\", \"format\": \"UNKNOWN,NONE,LOAD_SHED,USER,PCS,CONFIGURATION,FAULT\"}, \"relay-controllable\": {\"name\": \"Can the circuit's relay be commanded by the user?\", \"datatype\": \"boolean\"}}}, \"breaker\": {\"name\": \"breaker\", \"type\": \"energy.ebus.capability.breaker\", \"properties\": {\"rating\": {\"name\": \"Circuit breaker rating\", \"datatype\": \"integer\", \"unit\": \"A\"}, \"poles\": {\"name\": \"Number of breaker poles\", \"datatype\": \"integer\", \"format\": \"1:4:1\"}}}, \"meter\": {\"name\": \"meter\", \"type\": \"energy.ebus.capability.meter\", \"properties\": {\"current\": {\"name\": \"Measured current\", \"datatype\": \"float\", \"unit\": \"A\"}, \"active-power\": {\"name\": \"Measured active power\", \"datatype\": \"float\", \"unit\": \"W\"}, \"imported-energy\": {\"name\": \"Measured energy imported\", \"datatype\": \"float\", \"unit\": \"Wh\"}, \"exported-energy\": {\"name\": \"Measured energy exported\", \"datatype\": \"float\", \"unit\": \"Wh\"}}}, \"load-shed\": {\"name\": \"load-shed\", \"type\": \"energy.ebus.capability.load-shed\", \"properties\": {\"priority\": {\"name\": \"Configured priority of circuit shedding when off-grid (dominant-power-source != GRID)\", \"datatype\": \"enum\", \"format\": \"UNKNOWN,OFF_GRID,SOC_THRESHOLD,NEVER\", \"settable\": true}}}, \"pcs\": {\"name\": \"pcs\", \"type\": \"energy.ebus.capability.pcs\", \"properties\": {\"managed\": {\"name\": \"Is circuit managed by PCS?\", \"datatype\": \"boolean\"}, \"priority\": {\"name\": \"Circuit PCS priority ranking\", \"datatype\": \"integer\"}}}, \"connection\": {\"name\": \"connection\", \"type\": \"energy.ebus.capability.connection\", \"properties\": {\"feeds-device-id\": {\"name\": \"Homie device-id of the downstream device fed by this circuit\", \"datatype\": \"string\"}, \"feeds-device-type\": {\"name\": \"Homie $type of the downstream device\", \"datatype\": \"string\"}, \"feeds-device-status\": {\"name\": \"Panel's view of comm health to the downstream device\", \"datatype\": \"enum\", \"format\": \"OK,LOST,DEGRADED\"}}}, \"info\": {\"name\": \"info\", \"type\": \"energy.ebus.capability.info\", \"properties\": {\"name\": {\"name\": \"Circuit name\", \"datatype\": \"string\"}, \"spaces\": {\"name\": \"Circuit breaker space number(s) within the load center (comma-separated for multi-pole)\", \"datatype\": \"string\"}}}}, \"children\": [], \"root\": \"sim-40t-001\", \"parent\": \"sim-40t-001\", \"extensions\": []}", + "$description": "{\"homie\": \"5.0\", \"version\": 1791309827359, \"type\": \"energy.ebus.device.circuit\", \"name\": \"Electric Dryer\", \"nodes\": {\"switch\": {\"name\": \"switch\", \"type\": \"energy.ebus.capability.switch\", \"properties\": {\"relay\": {\"name\": \"Circuit relay state\", \"datatype\": \"enum\", \"format\": \"UNKNOWN,OPEN,CLOSED\", \"settable\": true}, \"relay-requester\": {\"name\": \"Actor requesting the relay state\", \"datatype\": \"enum\", \"format\": \"UNKNOWN,NONE,LOAD_SHED,USER,PCS,CONFIGURATION,FAULT\"}, \"relay-controllable\": {\"name\": \"Can the circuit's relay be commanded by the user?\", \"datatype\": \"boolean\"}}}, \"breaker\": {\"name\": \"breaker\", \"type\": \"energy.ebus.capability.breaker\", \"properties\": {\"rating\": {\"name\": \"Circuit breaker rating\", \"datatype\": \"integer\", \"unit\": \"A\"}, \"poles\": {\"name\": \"Number of breaker poles\", \"datatype\": \"integer\", \"format\": \"1:4:1\"}}}, \"meter\": {\"name\": \"meter\", \"type\": \"energy.ebus.capability.meter\", \"properties\": {\"current\": {\"name\": \"Measured current\", \"datatype\": \"float\", \"unit\": \"A\"}, \"active-power\": {\"name\": \"Measured active power\", \"datatype\": \"float\", \"unit\": \"W\"}, \"imported-energy\": {\"name\": \"Measured energy imported\", \"datatype\": \"float\", \"unit\": \"Wh\"}, \"exported-energy\": {\"name\": \"Measured energy exported\", \"datatype\": \"float\", \"unit\": \"Wh\"}}}, \"load-shed\": {\"name\": \"load-shed\", \"type\": \"energy.ebus.capability.load-shed\", \"properties\": {\"priority\": {\"name\": \"Configured priority of circuit shedding when off-grid (dominant-power-source != GRID)\", \"datatype\": \"enum\", \"format\": \"UNKNOWN,OFF_GRID,SOC_THRESHOLD,NEVER\", \"settable\": true}}}, \"pcs\": {\"name\": \"pcs\", \"type\": \"energy.ebus.capability.pcs\", \"properties\": {\"managed\": {\"name\": \"Is circuit managed by PCS?\", \"datatype\": \"boolean\"}, \"priority\": {\"name\": \"Circuit PCS priority ranking\", \"datatype\": \"integer\"}}}, \"connection\": {\"name\": \"connection\", \"type\": \"energy.ebus.capability.connection\", \"properties\": {\"feeds-device-id\": {\"name\": \"Homie device-id of the downstream device fed by this circuit\", \"datatype\": \"string\"}, \"feeds-device-type\": {\"name\": \"Homie $type of the downstream device\", \"datatype\": \"string\"}, \"feeds-device-status\": {\"name\": \"Panel's view of comm health to the downstream device\", \"datatype\": \"enum\", \"format\": \"OK,LOST,DEGRADED\"}}}, \"info\": {\"name\": \"info\", \"type\": \"energy.ebus.capability.info\", \"properties\": {\"name\": {\"name\": \"Circuit name\", \"datatype\": \"string\"}, \"spaces\": {\"name\": \"Circuit breaker space number(s) within the load center (comma-separated for multi-pole)\", \"datatype\": \"string\"}}}}, \"children\": [], \"root\": \"sim-40t-001\", \"parent\": \"sim-40t-001\", \"extensions\": []}", "$state": "ready", "breaker/poles": "2", "breaker/rating": "30", @@ -513,15 +513,15 @@ "switch/relay-requester": "NONE" }, "f482dc963f2654de922bfd1a40d30ee0": { - "$description": "{\"homie\": \"5.0\", \"version\": 1787970490463, \"type\": \"energy.ebus.device.circuit\", \"name\": \"Smoke Detectors\", \"nodes\": {\"switch\": {\"name\": \"switch\", \"type\": \"energy.ebus.capability.switch\", \"properties\": {\"relay\": {\"name\": \"Circuit relay state\", \"datatype\": \"enum\", \"format\": \"UNKNOWN,OPEN,CLOSED\", \"settable\": true}, \"relay-requester\": {\"name\": \"Actor requesting the relay state\", \"datatype\": \"enum\", \"format\": \"UNKNOWN,NONE,LOAD_SHED,USER,PCS,CONFIGURATION,FAULT\"}, \"relay-controllable\": {\"name\": \"Can the circuit's relay be commanded by the user?\", \"datatype\": \"boolean\"}}}, \"breaker\": {\"name\": \"breaker\", \"type\": \"energy.ebus.capability.breaker\", \"properties\": {\"rating\": {\"name\": \"Circuit breaker rating\", \"datatype\": \"integer\", \"unit\": \"A\"}, \"poles\": {\"name\": \"Number of breaker poles\", \"datatype\": \"integer\", \"format\": \"1:4:1\"}}}, \"meter\": {\"name\": \"meter\", \"type\": \"energy.ebus.capability.meter\", \"properties\": {\"current\": {\"name\": \"Measured current\", \"datatype\": \"float\", \"unit\": \"A\"}, \"active-power\": {\"name\": \"Measured active power\", \"datatype\": \"float\", \"unit\": \"W\"}, \"imported-energy\": {\"name\": \"Measured energy imported\", \"datatype\": \"float\", \"unit\": \"Wh\"}, \"exported-energy\": {\"name\": \"Measured energy exported\", \"datatype\": \"float\", \"unit\": \"Wh\"}}}, \"load-shed\": {\"name\": \"load-shed\", \"type\": \"energy.ebus.capability.load-shed\", \"properties\": {\"priority\": {\"name\": \"Configured priority of circuit shedding when off-grid (dominant-power-source != GRID)\", \"datatype\": \"enum\", \"format\": \"UNKNOWN,OFF_GRID,SOC_THRESHOLD,NEVER\", \"settable\": true}}}, \"pcs\": {\"name\": \"pcs\", \"type\": \"energy.ebus.capability.pcs\", \"properties\": {\"managed\": {\"name\": \"Is circuit managed by PCS?\", \"datatype\": \"boolean\"}, \"priority\": {\"name\": \"Circuit PCS priority ranking\", \"datatype\": \"integer\"}}}, \"connection\": {\"name\": \"connection\", \"type\": \"energy.ebus.capability.connection\", \"properties\": {\"feeds-device-id\": {\"name\": \"Homie device-id of the downstream device fed by this circuit\", \"datatype\": \"string\"}, \"feeds-device-type\": {\"name\": \"Homie $type of the downstream device\", \"datatype\": \"string\"}, \"feeds-device-status\": {\"name\": \"Panel's view of comm health to the downstream device\", \"datatype\": \"enum\", \"format\": \"OK,LOST,DEGRADED\"}}}, \"info\": {\"name\": \"info\", \"type\": \"energy.ebus.capability.info\", \"properties\": {\"name\": {\"name\": \"Circuit name\", \"datatype\": \"string\"}, \"spaces\": {\"name\": \"Circuit breaker space number(s) within the load center (comma-separated for multi-pole)\", \"datatype\": \"string\"}}}}, \"children\": [], \"root\": \"sim-40t-001\", \"parent\": \"sim-40t-001\", \"extensions\": []}", + "$description": "{\"homie\": \"5.0\", \"version\": 1791309827359, \"type\": \"energy.ebus.device.circuit\", \"name\": \"Smoke Detectors\", \"nodes\": {\"switch\": {\"name\": \"switch\", \"type\": \"energy.ebus.capability.switch\", \"properties\": {\"relay\": {\"name\": \"Circuit relay state\", \"datatype\": \"enum\", \"format\": \"UNKNOWN,OPEN,CLOSED\", \"settable\": true}, \"relay-requester\": {\"name\": \"Actor requesting the relay state\", \"datatype\": \"enum\", \"format\": \"UNKNOWN,NONE,LOAD_SHED,USER,PCS,CONFIGURATION,FAULT\"}, \"relay-controllable\": {\"name\": \"Can the circuit's relay be commanded by the user?\", \"datatype\": \"boolean\"}}}, \"breaker\": {\"name\": \"breaker\", \"type\": \"energy.ebus.capability.breaker\", \"properties\": {\"rating\": {\"name\": \"Circuit breaker rating\", \"datatype\": \"integer\", \"unit\": \"A\"}, \"poles\": {\"name\": \"Number of breaker poles\", \"datatype\": \"integer\", \"format\": \"1:4:1\"}}}, \"meter\": {\"name\": \"meter\", \"type\": \"energy.ebus.capability.meter\", \"properties\": {\"current\": {\"name\": \"Measured current\", \"datatype\": \"float\", \"unit\": \"A\"}, \"active-power\": {\"name\": \"Measured active power\", \"datatype\": \"float\", \"unit\": \"W\"}, \"imported-energy\": {\"name\": \"Measured energy imported\", \"datatype\": \"float\", \"unit\": \"Wh\"}, \"exported-energy\": {\"name\": \"Measured energy exported\", \"datatype\": \"float\", \"unit\": \"Wh\"}}}, \"load-shed\": {\"name\": \"load-shed\", \"type\": \"energy.ebus.capability.load-shed\", \"properties\": {\"priority\": {\"name\": \"Configured priority of circuit shedding when off-grid (dominant-power-source != GRID)\", \"datatype\": \"enum\", \"format\": \"UNKNOWN,OFF_GRID,SOC_THRESHOLD,NEVER\", \"settable\": true}}}, \"pcs\": {\"name\": \"pcs\", \"type\": \"energy.ebus.capability.pcs\", \"properties\": {\"managed\": {\"name\": \"Is circuit managed by PCS?\", \"datatype\": \"boolean\"}, \"priority\": {\"name\": \"Circuit PCS priority ranking\", \"datatype\": \"integer\"}}}, \"connection\": {\"name\": \"connection\", \"type\": \"energy.ebus.capability.connection\", \"properties\": {\"feeds-device-id\": {\"name\": \"Homie device-id of the downstream device fed by this circuit\", \"datatype\": \"string\"}, \"feeds-device-type\": {\"name\": \"Homie $type of the downstream device\", \"datatype\": \"string\"}, \"feeds-device-status\": {\"name\": \"Panel's view of comm health to the downstream device\", \"datatype\": \"enum\", \"format\": \"OK,LOST,DEGRADED\"}}}, \"info\": {\"name\": \"info\", \"type\": \"energy.ebus.capability.info\", \"properties\": {\"name\": {\"name\": \"Circuit name\", \"datatype\": \"string\"}, \"spaces\": {\"name\": \"Circuit breaker space number(s) within the load center (comma-separated for multi-pole)\", \"datatype\": \"string\"}}}}, \"children\": [], \"root\": \"sim-40t-001\", \"parent\": \"sim-40t-001\", \"extensions\": []}", "$state": "ready", "breaker/poles": "1", "breaker/rating": "15", "info/name": "Smoke Detectors", "info/spaces": "40", "load-shed/priority": "NEVER", - "meter/active-power": "-4.979369456246601", - "meter/current": "0.04149474546872167", + "meter/active-power": "-4.459854363032833", + "meter/current": "0.03716545302527361", "meter/exported-energy": "0.0", "meter/imported-energy": "0.0", "pcs/managed": "true", @@ -531,15 +531,15 @@ "switch/relay-requester": "NONE" }, "f58f82be999a59d6b795c45cbde9ea63": { - "$description": "{\"homie\": \"5.0\", \"version\": 1787970490459, \"type\": \"energy.ebus.device.circuit\", \"name\": \"Master Bedroom Lights\", \"nodes\": {\"switch\": {\"name\": \"switch\", \"type\": \"energy.ebus.capability.switch\", \"properties\": {\"relay\": {\"name\": \"Circuit relay state\", \"datatype\": \"enum\", \"format\": \"UNKNOWN,OPEN,CLOSED\", \"settable\": true}, \"relay-requester\": {\"name\": \"Actor requesting the relay state\", \"datatype\": \"enum\", \"format\": \"UNKNOWN,NONE,LOAD_SHED,USER,PCS,CONFIGURATION,FAULT\"}, \"relay-controllable\": {\"name\": \"Can the circuit's relay be commanded by the user?\", \"datatype\": \"boolean\"}}}, \"breaker\": {\"name\": \"breaker\", \"type\": \"energy.ebus.capability.breaker\", \"properties\": {\"rating\": {\"name\": \"Circuit breaker rating\", \"datatype\": \"integer\", \"unit\": \"A\"}, \"poles\": {\"name\": \"Number of breaker poles\", \"datatype\": \"integer\", \"format\": \"1:4:1\"}}}, \"meter\": {\"name\": \"meter\", \"type\": \"energy.ebus.capability.meter\", \"properties\": {\"current\": {\"name\": \"Measured current\", \"datatype\": \"float\", \"unit\": \"A\"}, \"active-power\": {\"name\": \"Measured active power\", \"datatype\": \"float\", \"unit\": \"W\"}, \"imported-energy\": {\"name\": \"Measured energy imported\", \"datatype\": \"float\", \"unit\": \"Wh\"}, \"exported-energy\": {\"name\": \"Measured energy exported\", \"datatype\": \"float\", \"unit\": \"Wh\"}}}, \"load-shed\": {\"name\": \"load-shed\", \"type\": \"energy.ebus.capability.load-shed\", \"properties\": {\"priority\": {\"name\": \"Configured priority of circuit shedding when off-grid (dominant-power-source != GRID)\", \"datatype\": \"enum\", \"format\": \"UNKNOWN,OFF_GRID,SOC_THRESHOLD,NEVER\", \"settable\": true}}}, \"pcs\": {\"name\": \"pcs\", \"type\": \"energy.ebus.capability.pcs\", \"properties\": {\"managed\": {\"name\": \"Is circuit managed by PCS?\", \"datatype\": \"boolean\"}, \"priority\": {\"name\": \"Circuit PCS priority ranking\", \"datatype\": \"integer\"}}}, \"connection\": {\"name\": \"connection\", \"type\": \"energy.ebus.capability.connection\", \"properties\": {\"feeds-device-id\": {\"name\": \"Homie device-id of the downstream device fed by this circuit\", \"datatype\": \"string\"}, \"feeds-device-type\": {\"name\": \"Homie $type of the downstream device\", \"datatype\": \"string\"}, \"feeds-device-status\": {\"name\": \"Panel's view of comm health to the downstream device\", \"datatype\": \"enum\", \"format\": \"OK,LOST,DEGRADED\"}}}, \"info\": {\"name\": \"info\", \"type\": \"energy.ebus.capability.info\", \"properties\": {\"name\": {\"name\": \"Circuit name\", \"datatype\": \"string\"}, \"spaces\": {\"name\": \"Circuit breaker space number(s) within the load center (comma-separated for multi-pole)\", \"datatype\": \"string\"}}}}, \"children\": [], \"root\": \"sim-40t-001\", \"parent\": \"sim-40t-001\", \"extensions\": []}", + "$description": "{\"homie\": \"5.0\", \"version\": 1791309827356, \"type\": \"energy.ebus.device.circuit\", \"name\": \"Master Bedroom Lights\", \"nodes\": {\"switch\": {\"name\": \"switch\", \"type\": \"energy.ebus.capability.switch\", \"properties\": {\"relay\": {\"name\": \"Circuit relay state\", \"datatype\": \"enum\", \"format\": \"UNKNOWN,OPEN,CLOSED\", \"settable\": true}, \"relay-requester\": {\"name\": \"Actor requesting the relay state\", \"datatype\": \"enum\", \"format\": \"UNKNOWN,NONE,LOAD_SHED,USER,PCS,CONFIGURATION,FAULT\"}, \"relay-controllable\": {\"name\": \"Can the circuit's relay be commanded by the user?\", \"datatype\": \"boolean\"}}}, \"breaker\": {\"name\": \"breaker\", \"type\": \"energy.ebus.capability.breaker\", \"properties\": {\"rating\": {\"name\": \"Circuit breaker rating\", \"datatype\": \"integer\", \"unit\": \"A\"}, \"poles\": {\"name\": \"Number of breaker poles\", \"datatype\": \"integer\", \"format\": \"1:4:1\"}}}, \"meter\": {\"name\": \"meter\", \"type\": \"energy.ebus.capability.meter\", \"properties\": {\"current\": {\"name\": \"Measured current\", \"datatype\": \"float\", \"unit\": \"A\"}, \"active-power\": {\"name\": \"Measured active power\", \"datatype\": \"float\", \"unit\": \"W\"}, \"imported-energy\": {\"name\": \"Measured energy imported\", \"datatype\": \"float\", \"unit\": \"Wh\"}, \"exported-energy\": {\"name\": \"Measured energy exported\", \"datatype\": \"float\", \"unit\": \"Wh\"}}}, \"load-shed\": {\"name\": \"load-shed\", \"type\": \"energy.ebus.capability.load-shed\", \"properties\": {\"priority\": {\"name\": \"Configured priority of circuit shedding when off-grid (dominant-power-source != GRID)\", \"datatype\": \"enum\", \"format\": \"UNKNOWN,OFF_GRID,SOC_THRESHOLD,NEVER\", \"settable\": true}}}, \"pcs\": {\"name\": \"pcs\", \"type\": \"energy.ebus.capability.pcs\", \"properties\": {\"managed\": {\"name\": \"Is circuit managed by PCS?\", \"datatype\": \"boolean\"}, \"priority\": {\"name\": \"Circuit PCS priority ranking\", \"datatype\": \"integer\"}}}, \"connection\": {\"name\": \"connection\", \"type\": \"energy.ebus.capability.connection\", \"properties\": {\"feeds-device-id\": {\"name\": \"Homie device-id of the downstream device fed by this circuit\", \"datatype\": \"string\"}, \"feeds-device-type\": {\"name\": \"Homie $type of the downstream device\", \"datatype\": \"string\"}, \"feeds-device-status\": {\"name\": \"Panel's view of comm health to the downstream device\", \"datatype\": \"enum\", \"format\": \"OK,LOST,DEGRADED\"}}}, \"info\": {\"name\": \"info\", \"type\": \"energy.ebus.capability.info\", \"properties\": {\"name\": {\"name\": \"Circuit name\", \"datatype\": \"string\"}, \"spaces\": {\"name\": \"Circuit breaker space number(s) within the load center (comma-separated for multi-pole)\", \"datatype\": \"string\"}}}}, \"children\": [], \"root\": \"sim-40t-001\", \"parent\": \"sim-40t-001\", \"extensions\": []}", "$state": "ready", "breaker/poles": "1", "breaker/rating": "15", "info/name": "Master Bedroom Lights", "info/spaces": "1", "load-shed/priority": "NEVER", - "meter/active-power": "-36.213549214637766", - "meter/current": "0.30177957678864803", + "meter/active-power": "-3.768833839902223", + "meter/current": "0.03140694866585186", "meter/exported-energy": "0.0", "meter/imported-energy": "0.0", "pcs/managed": "true", @@ -549,7 +549,7 @@ "switch/relay-requester": "NONE" }, "sim-40t-001": { - "$description": "{\"homie\": \"5.0\", \"version\": 1787970490466, \"type\": \"energy.ebus.device.distribution-enclosure\", \"name\": \"Span Panel\", \"nodes\": {\"info\": {\"name\": \"info\", \"type\": \"energy.ebus.capability.info\", \"properties\": {\"vendor-name\": {\"name\": \"Vendor name\", \"datatype\": \"string\"}, \"model\": {\"name\": \"Model\", \"datatype\": \"enum\", \"format\": \"MAIN_16,MLO_24,MAIN_32,MAIN_40,MLO_48\"}, \"serial-number\": {\"name\": \"Serial number\", \"datatype\": \"string\"}, \"hardware-version\": {\"name\": \"Hardware version\", \"datatype\": \"string\"}, \"firmware-version\": {\"name\": \"Firmware version\", \"datatype\": \"string\"}, \"data-model-version\": {\"name\": \"eBus data-model version (parent/child schema discriminator)\", \"datatype\": \"string\"}}}, \"door\": {\"name\": \"door\", \"type\": \"energy.ebus.capability.door\", \"properties\": {\"state\": {\"name\": \"Door state\", \"datatype\": \"enum\", \"format\": \"UNKNOWN,OPEN,CLOSED\"}}}, \"meter\": {\"name\": \"meter\", \"type\": \"energy.ebus.capability.meter\", \"properties\": {\"voltage-a\": {\"name\": \"L1 voltage\", \"datatype\": \"float\", \"unit\": \"V\"}, \"voltage-b\": {\"name\": \"L2 voltage\", \"datatype\": \"float\", \"unit\": \"V\"}}}, \"breaker\": {\"name\": \"breaker\", \"type\": \"energy.ebus.capability.breaker\", \"properties\": {\"rating\": {\"name\": \"Main breaker rating\", \"datatype\": \"integer\", \"unit\": \"A\"}}}, \"pcs\": {\"name\": \"pcs\", \"type\": \"energy.ebus.capability.pcs\", \"properties\": {\"enabled\": {\"name\": \"PCS system enabled\", \"datatype\": \"boolean\"}, \"active\": {\"name\": \"PCS system actively controlling one (or more) loads\", \"datatype\": \"boolean\"}, \"import-limit\": {\"name\": \"The power import limit currently being managed to\", \"datatype\": \"float\", \"unit\": \"A\"}, \"binding-constraint\": {\"name\": \"Which constraint class currently sets the import limit\", \"datatype\": \"enum\", \"format\": \"FSR,DOE,VOLTAGE,OFF_GRID,REQUESTED,OPERATOR,NONE,UNKNOWN\"}, \"feed-import-limit\": {\"name\": \"Limit of maximum power feeding the distribution enclosure\", \"datatype\": \"float\", \"unit\": \"A\"}, \"feed-import-limit-enablement\": {\"name\": \"Enablement status of the feed-import-limit\", \"datatype\": \"enum\", \"format\": \"UNSPECIFIED,UNCONFIGURED,DISABLED,ENABLED\"}, \"feed-import-limit-active\": {\"name\": \"Is feed-import-limit currently being enforced?\", \"datatype\": \"boolean\"}, \"operator-import-limit\": {\"name\": \"Operator-imposed maximum import limit\", \"datatype\": \"float\", \"unit\": \"A\"}, \"operator-import-limit-enablement\": {\"name\": \"Enablement status of the operator-import-limit\", \"datatype\": \"enum\", \"format\": \"UNSPECIFIED,UNCONFIGURED,DISABLED,ENABLED\"}, \"operator-import-limit-active\": {\"name\": \"Is operator-import-limit currently being enforced?\", \"datatype\": \"boolean\"}, \"off-grid-import-limit\": {\"name\": \"Off-Grid limit maximum import power\", \"datatype\": \"float\", \"unit\": \"A\"}, \"off-grid-import-limit-enablement\": {\"name\": \"Enablement status of the off-grid-import-limit\", \"datatype\": \"enum\", \"format\": \"UNSPECIFIED,UNCONFIGURED,DISABLED,ENABLED\"}, \"off-grid-import-limit-active\": {\"name\": \"Is off-grid-import-limit currently being enforced?\", \"datatype\": \"boolean\"}, \"requested-import-limit\": {\"name\": \"Requested limit maximum import power\", \"datatype\": \"float\", \"unit\": \"A\"}, \"requested-import-limit-enablement\": {\"name\": \"Enablement status of the requested-import-limit\", \"datatype\": \"enum\", \"format\": \"UNSPECIFIED,UNCONFIGURED,DISABLED,ENABLED\"}, \"requested-import-limit-active\": {\"name\": \"Is requested-import-limit currently being enforced?\", \"datatype\": \"boolean\"}}}, \"shed-forecast\": {\"name\": \"shed-forecast\", \"type\": \"energy.ebus.capability.shed-forecast\", \"properties\": {\"total-time-remaining\": {\"name\": \"Estimated total time before all sheddable circuits are shed (off-grid runtime)\", \"datatype\": \"integer\", \"unit\": \"min\"}, \"time-to-priority-shed\": {\"name\": \"Estimated time before the next priority tier is shed\", \"datatype\": \"integer\", \"unit\": \"min\"}, \"full-charge-total-time-remaining\": {\"name\": \"Estimated total time assuming BESS starts at full charge\", \"datatype\": \"integer\", \"unit\": \"min\"}, \"full-charge-time-to-priority-shed\": {\"name\": \"Estimated time to next priority shed assuming BESS starts at full charge\", \"datatype\": \"integer\", \"unit\": \"min\"}, \"confidence\": {\"name\": \"Confidence of the shed-forecast estimate\", \"datatype\": \"enum\", \"format\": \"LOW,MEDIUM,HIGH\"}}}, \"shed\": {\"name\": \"shed\", \"type\": \"energy.ebus.capability.shed\", \"properties\": {\"asserted-islanding-state\": {\"name\": \"Consumer-asserted islanding-state (grid-state override during MID/BESS comm-loss)\", \"datatype\": \"enum\", \"format\": \"NONE,ON_GRID,OFF_GRID\", \"settable\": true}, \"policy\": {\"name\": \"Shed policy (algorithm and parameters)\", \"datatype\": \"json\", \"format\": \"{\\\"$id\\\":\\\"soc-priority.v1\\\",\\\"type\\\":\\\"object\\\",\\\"required\\\":[\\\"algorithm\\\",\\\"parameters\\\"],\\\"additionalProperties\\\":false,\\\"properties\\\":{\\\"algorithm\\\":{\\\"const\\\":\\\"soc-priority.v1\\\"},\\\"parameters\\\":{\\\"type\\\":\\\"object\\\",\\\"required\\\":[\\\"soc-threshold-shed\\\",\\\"soc-threshold-release\\\"],\\\"additionalProperties\\\":false,\\\"properties\\\":{\\\"soc-threshold-shed\\\":{\\\"type\\\":\\\"integer\\\",\\\"minimum\\\":0,\\\"maximum\\\":100,\\\"description\\\":\\\"SoC percent below which SOC_THRESHOLD circuits shed\\\"},\\\"soc-threshold-release\\\":{\\\"type\\\":\\\"integer\\\",\\\"minimum\\\":0,\\\"maximum\\\":100,\\\"description\\\":\\\"SoC percent above which shed SOC_THRESHOLD circuits restore\\\"}}}}}\"}}}, \"power-flows\": {\"name\": \"power-flows\", \"type\": \"energy.ebus.capability.power-flows\", \"properties\": {\"pv\": {\"name\": \"PV power flow\", \"datatype\": \"float\", \"unit\": \"W\"}, \"battery\": {\"name\": \"Battery/BESS power flow\", \"datatype\": \"float\", \"unit\": \"W\"}, \"grid\": {\"name\": \"Grid power flow\", \"datatype\": \"float\", \"unit\": \"W\"}, \"site\": {\"name\": \"Site power flow\", \"datatype\": \"float\", \"unit\": \"W\"}}}, \"status\": {\"name\": \"status\", \"type\": \"energy.ebus.capability.status\", \"properties\": {\"relay\": {\"name\": \"Main relay\", \"datatype\": \"enum\", \"format\": \"UNKNOWN,OPEN,CLOSED\"}, \"ethernet\": {\"name\": \"Is Ethernet network interface operational?\", \"datatype\": \"boolean\"}, \"wifi\": {\"name\": \"Is Wi-Fi network interface operational?\", \"datatype\": \"boolean\"}, \"wifi-ssid\": {\"name\": \"SSID to which Wi-Fi network interface is connected\", \"datatype\": \"string\"}, \"cloud-connection\": {\"name\": \"Device connected to vendor cloud?\", \"datatype\": \"enum\", \"format\": \"UNKNOWN,UNCONNECTED,CONNECTED\"}, \"postal-code\": {\"name\": \"Postal (Zip) code\", \"datatype\": \"string\"}, \"time-zone\": {\"name\": \"Time zone\", \"datatype\": \"string\"}}}}, \"children\": [\"sim-40t-001-SIM-BESS-40T-001\", \"f58f82be999a59d6b795c45cbde9ea63\", \"bb8914a16ba2543a82a88c22e461943e\", \"72b4343c886e5c98bca64a131b6003ce\", \"68213a7c393f54918706bf62a3b92047\", \"db9deedb6ba7580397507c1dac4d4da4\", \"cafc279d283d567280deb2fce6be8438\", \"be820f5432c353e8b60329b6ee8e2a9b\", \"d163b097bbfb5cf1af4420f396c76e2d\", \"df5d74733e435d53be69ee9edbbda675\", \"09a79266163d540c862d5efbe8ef67d3\", \"5239be04f4725708a6f37d750fd5b4ae\", \"14c507fcbb5f539ba40b60b5e5655a72\", \"17e98544c51a59d98331dd263df2abe1\", \"51ab52ca7e085204bd300a35731c1501\", \"768f5f7afac95b09a32fa6b8ece84041\", \"e87d68b509855856a61570c7a7d95c07\", \"780a20adb8045467aa6ae9c66d3fd7f0\", \"d6e020a36d315281b4cac1cfd10f0cce\", \"bc07adcee8ff5945a29c618a54bef7e6\", \"c48878d21ad9590882e5c369f23a9a4e\", \"f482dc963f2654de922bfd1a40d30ee0\", \"e8d326d2b88e50a88e4fa3f04ed93608\", \"93294e528d045baa9190721acfb243d3\", \"9a67992e4e735d8a81340adb44120c11\", \"0c941ad4041050cc830e740ddddb2f23\", \"3feb088e635f50bcad1ad38c9e79f82c\", \"9c22d40aa8f25a82bf22e62aa1891c4b\", \"a83191fcac585bda9d6fe05ca79b8a4f\", \"be87c32bda4f5cd9abbf6d3995ae28c0\", \"ddab4e77c47d577192911fd8db925a27\", \"sim-40t-001-sim-evse-sim-40t-001\", \"sim-40t-001-sim-evse-sim-40t-001-2\", \"sim-40t-001-lugs-up\", \"sim-40t-001-lugs-dn\", \"sim-40t-001-pv-1\"], \"extensions\": []}", + "$description": "{\"homie\": \"5.0\", \"version\": 1791309827361, \"type\": \"energy.ebus.device.distribution-enclosure\", \"name\": \"Span Panel\", \"nodes\": {\"info\": {\"name\": \"info\", \"type\": \"energy.ebus.capability.info\", \"properties\": {\"vendor-name\": {\"name\": \"Vendor name\", \"datatype\": \"string\"}, \"model\": {\"name\": \"Model\", \"datatype\": \"enum\", \"format\": \"MAIN_16,MLO_24,MAIN_32,MAIN_40,MLO_48\"}, \"serial-number\": {\"name\": \"Serial number\", \"datatype\": \"string\"}, \"hardware-version\": {\"name\": \"Hardware version\", \"datatype\": \"string\"}, \"firmware-version\": {\"name\": \"Firmware version\", \"datatype\": \"string\"}, \"data-model-version\": {\"name\": \"eBus data-model version (parent/child schema discriminator)\", \"datatype\": \"string\"}}}, \"door\": {\"name\": \"door\", \"type\": \"energy.ebus.capability.door\", \"properties\": {\"state\": {\"name\": \"Door state\", \"datatype\": \"enum\", \"format\": \"UNKNOWN,OPEN,CLOSED\"}}}, \"meter\": {\"name\": \"meter\", \"type\": \"energy.ebus.capability.meter\", \"properties\": {\"voltage-a\": {\"name\": \"L1 voltage\", \"datatype\": \"float\", \"unit\": \"V\"}, \"voltage-b\": {\"name\": \"L2 voltage\", \"datatype\": \"float\", \"unit\": \"V\"}}}, \"breaker\": {\"name\": \"breaker\", \"type\": \"energy.ebus.capability.breaker\", \"properties\": {\"rating\": {\"name\": \"Main breaker rating\", \"datatype\": \"integer\", \"unit\": \"A\"}}}, \"pcs\": {\"name\": \"pcs\", \"type\": \"energy.ebus.capability.pcs\", \"properties\": {\"enabled\": {\"name\": \"PCS system enabled\", \"datatype\": \"boolean\"}, \"active\": {\"name\": \"PCS system actively controlling one (or more) loads\", \"datatype\": \"boolean\"}, \"import-limit\": {\"name\": \"The power import limit currently being managed to\", \"datatype\": \"float\", \"unit\": \"A\"}, \"binding-constraint\": {\"name\": \"Which constraint class currently sets the import limit\", \"datatype\": \"enum\", \"format\": \"FSR,DOE,VOLTAGE,OFF_GRID,REQUESTED,OPERATOR,NONE,UNKNOWN\"}, \"feed-import-limit\": {\"name\": \"Limit of maximum power feeding the distribution enclosure\", \"datatype\": \"float\", \"unit\": \"A\"}, \"feed-import-limit-enablement\": {\"name\": \"Enablement status of the feed-import-limit\", \"datatype\": \"enum\", \"format\": \"UNSPECIFIED,UNCONFIGURED,DISABLED,ENABLED\"}, \"feed-import-limit-active\": {\"name\": \"Is feed-import-limit currently being enforced?\", \"datatype\": \"boolean\"}, \"operator-import-limit\": {\"name\": \"Operator-imposed maximum import limit\", \"datatype\": \"float\", \"unit\": \"A\"}, \"operator-import-limit-enablement\": {\"name\": \"Enablement status of the operator-import-limit\", \"datatype\": \"enum\", \"format\": \"UNSPECIFIED,UNCONFIGURED,DISABLED,ENABLED\"}, \"operator-import-limit-active\": {\"name\": \"Is operator-import-limit currently being enforced?\", \"datatype\": \"boolean\"}, \"off-grid-import-limit\": {\"name\": \"Off-Grid limit maximum import power\", \"datatype\": \"float\", \"unit\": \"A\"}, \"off-grid-import-limit-enablement\": {\"name\": \"Enablement status of the off-grid-import-limit\", \"datatype\": \"enum\", \"format\": \"UNSPECIFIED,UNCONFIGURED,DISABLED,ENABLED\"}, \"off-grid-import-limit-active\": {\"name\": \"Is off-grid-import-limit currently being enforced?\", \"datatype\": \"boolean\"}, \"requested-import-limit\": {\"name\": \"Requested limit maximum import power\", \"datatype\": \"float\", \"unit\": \"A\"}, \"requested-import-limit-enablement\": {\"name\": \"Enablement status of the requested-import-limit\", \"datatype\": \"enum\", \"format\": \"UNSPECIFIED,UNCONFIGURED,DISABLED,ENABLED\"}, \"requested-import-limit-active\": {\"name\": \"Is requested-import-limit currently being enforced?\", \"datatype\": \"boolean\"}}}, \"shed-forecast\": {\"name\": \"shed-forecast\", \"type\": \"energy.ebus.capability.shed-forecast\", \"properties\": {\"total-time-remaining\": {\"name\": \"Estimated total time before all sheddable circuits are shed (off-grid runtime)\", \"datatype\": \"integer\", \"unit\": \"min\"}, \"time-to-priority-shed\": {\"name\": \"Estimated time before the next priority tier is shed\", \"datatype\": \"integer\", \"unit\": \"min\"}, \"full-charge-total-time-remaining\": {\"name\": \"Estimated total time assuming BESS starts at full charge\", \"datatype\": \"integer\", \"unit\": \"min\"}, \"full-charge-time-to-priority-shed\": {\"name\": \"Estimated time to next priority shed assuming BESS starts at full charge\", \"datatype\": \"integer\", \"unit\": \"min\"}, \"confidence\": {\"name\": \"Confidence of the shed-forecast estimate\", \"datatype\": \"enum\", \"format\": \"LOW,MEDIUM,HIGH\"}}}, \"shed\": {\"name\": \"shed\", \"type\": \"energy.ebus.capability.shed\", \"properties\": {\"asserted-islanding-state\": {\"name\": \"Consumer-asserted islanding-state (grid-state override during MID/BESS comm-loss)\", \"datatype\": \"enum\", \"format\": \"NONE,ON_GRID,OFF_GRID\", \"settable\": true}, \"policy\": {\"name\": \"Shed policy (algorithm and parameters)\", \"datatype\": \"json\", \"format\": \"{\\\"$id\\\":\\\"soc-priority.v1\\\",\\\"type\\\":\\\"object\\\",\\\"required\\\":[\\\"algorithm\\\",\\\"parameters\\\"],\\\"additionalProperties\\\":false,\\\"properties\\\":{\\\"algorithm\\\":{\\\"const\\\":\\\"soc-priority.v1\\\"},\\\"parameters\\\":{\\\"type\\\":\\\"object\\\",\\\"required\\\":[\\\"soc-threshold-shed\\\",\\\"soc-threshold-release\\\"],\\\"additionalProperties\\\":false,\\\"properties\\\":{\\\"soc-threshold-shed\\\":{\\\"type\\\":\\\"integer\\\",\\\"minimum\\\":0,\\\"maximum\\\":100,\\\"description\\\":\\\"SoC percent below which SOC_THRESHOLD circuits shed\\\"},\\\"soc-threshold-release\\\":{\\\"type\\\":\\\"integer\\\",\\\"minimum\\\":0,\\\"maximum\\\":100,\\\"description\\\":\\\"SoC percent above which shed SOC_THRESHOLD circuits restore\\\"}}}}}\"}}}, \"power-flows\": {\"name\": \"power-flows\", \"type\": \"energy.ebus.capability.power-flows\", \"properties\": {\"pv\": {\"name\": \"PV power flow\", \"datatype\": \"float\", \"unit\": \"W\"}, \"battery\": {\"name\": \"Battery/BESS power flow\", \"datatype\": \"float\", \"unit\": \"W\"}, \"grid\": {\"name\": \"Grid power flow\", \"datatype\": \"float\", \"unit\": \"W\"}, \"site\": {\"name\": \"Site power flow\", \"datatype\": \"float\", \"unit\": \"W\"}}}, \"status\": {\"name\": \"status\", \"type\": \"energy.ebus.capability.status\", \"properties\": {\"relay\": {\"name\": \"Main relay\", \"datatype\": \"enum\", \"format\": \"UNKNOWN,OPEN,CLOSED\"}, \"ethernet\": {\"name\": \"Is Ethernet network interface operational?\", \"datatype\": \"boolean\"}, \"wifi\": {\"name\": \"Is Wi-Fi network interface operational?\", \"datatype\": \"boolean\"}, \"wifi-ssid\": {\"name\": \"SSID to which Wi-Fi network interface is connected\", \"datatype\": \"string\"}, \"cloud-connection\": {\"name\": \"Device connected to vendor cloud?\", \"datatype\": \"enum\", \"format\": \"UNKNOWN,UNCONNECTED,CONNECTED\"}, \"postal-code\": {\"name\": \"Postal (Zip) code\", \"datatype\": \"string\"}, \"time-zone\": {\"name\": \"Time zone\", \"datatype\": \"string\"}}}}, \"children\": [\"sim-40t-001-SIM-BESS-40T-001\", \"f58f82be999a59d6b795c45cbde9ea63\", \"bb8914a16ba2543a82a88c22e461943e\", \"72b4343c886e5c98bca64a131b6003ce\", \"68213a7c393f54918706bf62a3b92047\", \"db9deedb6ba7580397507c1dac4d4da4\", \"cafc279d283d567280deb2fce6be8438\", \"be820f5432c353e8b60329b6ee8e2a9b\", \"d163b097bbfb5cf1af4420f396c76e2d\", \"df5d74733e435d53be69ee9edbbda675\", \"09a79266163d540c862d5efbe8ef67d3\", \"5239be04f4725708a6f37d750fd5b4ae\", \"14c507fcbb5f539ba40b60b5e5655a72\", \"17e98544c51a59d98331dd263df2abe1\", \"51ab52ca7e085204bd300a35731c1501\", \"768f5f7afac95b09a32fa6b8ece84041\", \"e87d68b509855856a61570c7a7d95c07\", \"780a20adb8045467aa6ae9c66d3fd7f0\", \"d6e020a36d315281b4cac1cfd10f0cce\", \"bc07adcee8ff5945a29c618a54bef7e6\", \"c48878d21ad9590882e5c369f23a9a4e\", \"f482dc963f2654de922bfd1a40d30ee0\", \"e8d326d2b88e50a88e4fa3f04ed93608\", \"93294e528d045baa9190721acfb243d3\", \"9a67992e4e735d8a81340adb44120c11\", \"0c941ad4041050cc830e740ddddb2f23\", \"3feb088e635f50bcad1ad38c9e79f82c\", \"9c22d40aa8f25a82bf22e62aa1891c4b\", \"a83191fcac585bda9d6fe05ca79b8a4f\", \"be87c32bda4f5cd9abbf6d3995ae28c0\", \"ddab4e77c47d577192911fd8db925a27\", \"sim-40t-001-sim-evse-sim-40t-001\", \"sim-40t-001-sim-evse-sim-40t-001-2\", \"sim-40t-001-lugs-up\", \"sim-40t-001-lugs-dn\", \"sim-40t-001-pv-1\"], \"extensions\": []}", "$state": "ready", "breaker/rating": "200", "door/state": "CLOSED", @@ -577,10 +577,10 @@ "pcs/requested-import-limit": "0.0", "pcs/requested-import-limit-active": "false", "pcs/requested-import-limit-enablement": "UNCONFIGURED", - "power-flows/battery": "-3500.0", - "power-flows/grid": "-12622.528713582125", - "power-flows/pv": "-149.7002163837844", - "power-flows/site": "16272.22892996591", + "power-flows/battery": "-2870.06529347341", + "power-flows/grid": "-0.0", + "power-flows/pv": "-4471.364786233336", + "power-flows/site": "7341.430079706746", "shed-forecast/confidence": "HIGH", "shed-forecast/full-charge-time-to-priority-shed": "3038", "shed-forecast/full-charge-total-time-remaining": "4320", @@ -597,7 +597,7 @@ "status/wifi-ssid": "sim-wifi" }, "sim-40t-001-SIM-BESS-40T-001": { - "$description": "{\"homie\": \"5.0\", \"version\": 1787970490466, \"type\": \"energy.ebus.device.bess\", \"name\": \"Battery\", \"nodes\": {\"info\": {\"name\": \"info\", \"type\": \"energy.ebus.capability.info\", \"properties\": {\"vendor-name\": {\"name\": \"Vendor name\", \"datatype\": \"string\"}, \"model\": {\"name\": \"Model\", \"datatype\": \"string\"}, \"part-number\": {\"name\": \"Part number\", \"datatype\": \"string\"}, \"serial-number\": {\"name\": \"Serial number\", \"datatype\": \"string\"}, \"firmware-version\": {\"name\": \"Firmware version\", \"datatype\": \"string\"}, \"nameplate-capacity\": {\"name\": \"Nameplate capacity\", \"datatype\": \"float\", \"unit\": \"kWh\"}}}, \"soc\": {\"name\": \"soc\", \"type\": \"energy.ebus.capability.soc\", \"properties\": {\"soc\": {\"name\": \"State of charge\", \"datatype\": \"float\", \"unit\": \"%\"}, \"soe\": {\"name\": \"State of energy\", \"datatype\": \"float\", \"unit\": \"kWh\"}}}, \"meter\": {\"name\": \"meter\", \"type\": \"energy.ebus.capability.meter\", \"properties\": {\"active-power\": {\"name\": \"Active power\", \"datatype\": \"float\", \"unit\": \"W\"}}}, \"status\": {\"name\": \"status\", \"type\": \"energy.ebus.capability.status\", \"properties\": {\"communication-state\": {\"name\": \"Communication state\", \"datatype\": \"enum\", \"format\": \"OK,DEGRADED,LOST,UNKNOWN\"}}}}, \"children\": [\"sim-40t-001-SIM-BESS-40T-001-mid\"], \"root\": \"sim-40t-001\", \"parent\": \"sim-40t-001\", \"extensions\": []}", + "$description": "{\"homie\": \"5.0\", \"version\": 1791309827361, \"type\": \"energy.ebus.device.bess\", \"name\": \"Battery\", \"nodes\": {\"info\": {\"name\": \"info\", \"type\": \"energy.ebus.capability.info\", \"properties\": {\"vendor-name\": {\"name\": \"Vendor name\", \"datatype\": \"string\"}, \"model\": {\"name\": \"Model\", \"datatype\": \"string\"}, \"part-number\": {\"name\": \"Part number\", \"datatype\": \"string\"}, \"serial-number\": {\"name\": \"Serial number\", \"datatype\": \"string\"}, \"firmware-version\": {\"name\": \"Firmware version\", \"datatype\": \"string\"}, \"nameplate-capacity\": {\"name\": \"Nameplate capacity\", \"datatype\": \"float\", \"unit\": \"kWh\"}}}, \"soc\": {\"name\": \"soc\", \"type\": \"energy.ebus.capability.soc\", \"properties\": {\"soc\": {\"name\": \"State of charge\", \"datatype\": \"float\", \"unit\": \"%\"}, \"soe\": {\"name\": \"State of energy\", \"datatype\": \"float\", \"unit\": \"kWh\"}}}, \"meter\": {\"name\": \"meter\", \"type\": \"energy.ebus.capability.meter\", \"properties\": {\"active-power\": {\"name\": \"Active power\", \"datatype\": \"float\", \"unit\": \"W\"}}}, \"status\": {\"name\": \"status\", \"type\": \"energy.ebus.capability.status\", \"properties\": {\"communication-state\": {\"name\": \"Communication state\", \"datatype\": \"enum\", \"format\": \"OK,DEGRADED,LOST,UNKNOWN\"}}}}, \"children\": [\"sim-40t-001-SIM-BESS-40T-001-mid\"], \"root\": \"sim-40t-001\", \"parent\": \"sim-40t-001\", \"extensions\": []}", "$state": "ready", "info/firmware-version": "sim-bess/v0.1.0", "info/model": "SPAN Battery", @@ -605,13 +605,13 @@ "info/part-number": "SPN-BESS-001", "info/serial-number": "SIM-BESS-40T-001", "info/vendor-name": "Span", - "meter/active-power": "-3500.0", + "meter/active-power": "2870.06529347341", "soc/soc": "50.0", "soc/soe": "6.75", "status/communication-state": "OK" }, "sim-40t-001-SIM-BESS-40T-001-mid": { - "$description": "{\"homie\": \"5.0\", \"version\": 1787970490466, \"type\": \"energy.ebus.device.mid\", \"name\": \"Microgrid Interconnect Device\", \"nodes\": {\"info\": {\"name\": \"info\", \"type\": \"energy.ebus.capability.info\", \"properties\": {\"vendor-name\": {\"name\": \"Vendor name\", \"datatype\": \"string\"}, \"serial-number\": {\"name\": \"Serial number\", \"datatype\": \"string\"}, \"model\": {\"name\": \"Model\", \"datatype\": \"string\"}, \"firmware-version\": {\"name\": \"Firmware version\", \"datatype\": \"string\"}, \"hardware-version\": {\"name\": \"Hardware version\", \"datatype\": \"string\"}}}, \"grid\": {\"name\": \"grid\", \"type\": \"energy.ebus.capability.grid\", \"properties\": {\"islanding-state\": {\"name\": \"Islanding state of the BESS-integrated grid-forming device\", \"datatype\": \"enum\", \"format\": \"ON_GRID,OFF_GRID,UNKNOWN\"}, \"grid-state\": {\"name\": \"Sensed grid condition\", \"datatype\": \"enum\", \"format\": \"UP,DOWN,DEGRADED,UNKNOWN\"}, \"grid-forming-entity\": {\"name\": \"Identity of the currently grid-forming entity\", \"datatype\": \"string\"}}}}, \"children\": [], \"root\": \"sim-40t-001\", \"parent\": \"sim-40t-001-SIM-BESS-40T-001\", \"extensions\": []}", + "$description": "{\"homie\": \"5.0\", \"version\": 1791309827361, \"type\": \"energy.ebus.device.mid\", \"name\": \"Microgrid Interconnect Device\", \"nodes\": {\"info\": {\"name\": \"info\", \"type\": \"energy.ebus.capability.info\", \"properties\": {\"vendor-name\": {\"name\": \"Vendor name\", \"datatype\": \"string\"}, \"serial-number\": {\"name\": \"Serial number\", \"datatype\": \"string\"}, \"model\": {\"name\": \"Model\", \"datatype\": \"string\"}, \"firmware-version\": {\"name\": \"Firmware version\", \"datatype\": \"string\"}, \"hardware-version\": {\"name\": \"Hardware version\", \"datatype\": \"string\"}}}, \"grid\": {\"name\": \"grid\", \"type\": \"energy.ebus.capability.grid\", \"properties\": {\"islanding-state\": {\"name\": \"Islanding state of the BESS-integrated grid-forming device\", \"datatype\": \"enum\", \"format\": \"ON_GRID,OFF_GRID,UNKNOWN\"}, \"grid-state\": {\"name\": \"Sensed grid condition\", \"datatype\": \"enum\", \"format\": \"UP,DOWN,DEGRADED,UNKNOWN\"}, \"grid-forming-entity\": {\"name\": \"Identity of the currently grid-forming entity\", \"datatype\": \"string\"}}}}, \"children\": [], \"root\": \"sim-40t-001\", \"parent\": \"sim-40t-001-SIM-BESS-40T-001\", \"extensions\": []}", "$state": "ready", "grid/grid-forming-entity": "GRID", "grid/grid-state": "UP", @@ -623,7 +623,7 @@ "info/vendor-name": "Span" }, "sim-40t-001-lugs-dn": { - "$description": "{\"homie\": \"5.0\", \"version\": 1787970490466, \"type\": \"energy.ebus.device.lugs\", \"name\": \"Downstream lugs\", \"nodes\": {\"meter\": {\"name\": \"meter\", \"type\": \"energy.ebus.capability.meter\", \"properties\": {\"current-a\": {\"name\": \"L1 current\", \"datatype\": \"float\", \"unit\": \"A\"}, \"current-b\": {\"name\": \"L2 current\", \"datatype\": \"float\", \"unit\": \"A\"}, \"active-power\": {\"name\": \"Active power\", \"datatype\": \"float\", \"unit\": \"W\"}, \"imported-energy\": {\"name\": \"Imported energy\", \"datatype\": \"float\", \"unit\": \"Wh\"}, \"exported-energy\": {\"name\": \"Exported energy\", \"datatype\": \"float\", \"unit\": \"Wh\"}}}, \"connection\": {\"name\": \"connection\", \"type\": \"energy.ebus.capability.connection\", \"properties\": {\"fed-by-device-id\": {\"name\": \"Homie device-id of the upstream device feeding this lugs\", \"datatype\": \"string\"}, \"fed-by-device-type\": {\"name\": \"Homie $type of the upstream device\", \"datatype\": \"string\"}, \"fed-by-device-status\": {\"name\": \"Panel's view of comm health to the upstream device\", \"datatype\": \"enum\", \"format\": \"OK,LOST,DEGRADED\"}, \"feeds-device-id\": {\"name\": \"Homie device-id of the downstream device fed by this lugs\", \"datatype\": \"string\"}, \"feeds-device-type\": {\"name\": \"Homie $type of the downstream device\", \"datatype\": \"string\"}, \"feeds-device-status\": {\"name\": \"Panel's view of comm health to the downstream device\", \"datatype\": \"enum\", \"format\": \"OK,LOST,DEGRADED\"}}}, \"info\": {\"name\": \"info\", \"type\": \"energy.ebus.capability.info\", \"properties\": {\"direction\": {\"name\": \"Lugs feed direction: upstream or downstream\", \"datatype\": \"enum\", \"format\": \"UPSTREAM,DOWNSTREAM\"}}}}, \"children\": [], \"root\": \"sim-40t-001\", \"parent\": \"sim-40t-001\", \"extensions\": []}", + "$description": "{\"homie\": \"5.0\", \"version\": 1791309827361, \"type\": \"energy.ebus.device.lugs\", \"name\": \"Downstream lugs\", \"nodes\": {\"meter\": {\"name\": \"meter\", \"type\": \"energy.ebus.capability.meter\", \"properties\": {\"current-a\": {\"name\": \"L1 current\", \"datatype\": \"float\", \"unit\": \"A\"}, \"current-b\": {\"name\": \"L2 current\", \"datatype\": \"float\", \"unit\": \"A\"}, \"active-power\": {\"name\": \"Active power\", \"datatype\": \"float\", \"unit\": \"W\"}, \"imported-energy\": {\"name\": \"Imported energy\", \"datatype\": \"float\", \"unit\": \"Wh\"}, \"exported-energy\": {\"name\": \"Exported energy\", \"datatype\": \"float\", \"unit\": \"Wh\"}}}, \"connection\": {\"name\": \"connection\", \"type\": \"energy.ebus.capability.connection\", \"properties\": {\"fed-by-device-id\": {\"name\": \"Homie device-id of the upstream device feeding this lugs\", \"datatype\": \"string\"}, \"fed-by-device-type\": {\"name\": \"Homie $type of the upstream device\", \"datatype\": \"string\"}, \"fed-by-device-status\": {\"name\": \"Panel's view of comm health to the upstream device\", \"datatype\": \"enum\", \"format\": \"OK,LOST,DEGRADED\"}, \"feeds-device-id\": {\"name\": \"Homie device-id of the downstream device fed by this lugs\", \"datatype\": \"string\"}, \"feeds-device-type\": {\"name\": \"Homie $type of the downstream device\", \"datatype\": \"string\"}, \"feeds-device-status\": {\"name\": \"Panel's view of comm health to the downstream device\", \"datatype\": \"enum\", \"format\": \"OK,LOST,DEGRADED\"}}}, \"info\": {\"name\": \"info\", \"type\": \"energy.ebus.capability.info\", \"properties\": {\"direction\": {\"name\": \"Lugs feed direction: upstream or downstream\", \"datatype\": \"enum\", \"format\": \"UPSTREAM,DOWNSTREAM\"}}}}, \"children\": [], \"root\": \"sim-40t-001\", \"parent\": \"sim-40t-001\", \"extensions\": []}", "$state": "ready", "info/direction": "DOWNSTREAM", "meter/active-power": "0", @@ -633,20 +633,20 @@ "meter/imported-energy": "0.0" }, "sim-40t-001-lugs-up": { - "$description": "{\"homie\": \"5.0\", \"version\": 1787970490466, \"type\": \"energy.ebus.device.lugs\", \"name\": \"Upstream lugs\", \"nodes\": {\"meter\": {\"name\": \"meter\", \"type\": \"energy.ebus.capability.meter\", \"properties\": {\"current-a\": {\"name\": \"L1 current\", \"datatype\": \"float\", \"unit\": \"A\"}, \"current-b\": {\"name\": \"L2 current\", \"datatype\": \"float\", \"unit\": \"A\"}, \"active-power\": {\"name\": \"Active power\", \"datatype\": \"float\", \"unit\": \"W\"}, \"imported-energy\": {\"name\": \"Imported energy\", \"datatype\": \"float\", \"unit\": \"Wh\"}, \"exported-energy\": {\"name\": \"Exported energy\", \"datatype\": \"float\", \"unit\": \"Wh\"}}}, \"connection\": {\"name\": \"connection\", \"type\": \"energy.ebus.capability.connection\", \"properties\": {\"fed-by-device-id\": {\"name\": \"Homie device-id of the upstream device feeding this lugs\", \"datatype\": \"string\"}, \"fed-by-device-type\": {\"name\": \"Homie $type of the upstream device\", \"datatype\": \"string\"}, \"fed-by-device-status\": {\"name\": \"Panel's view of comm health to the upstream device\", \"datatype\": \"enum\", \"format\": \"OK,LOST,DEGRADED\"}, \"feeds-device-id\": {\"name\": \"Homie device-id of the downstream device fed by this lugs\", \"datatype\": \"string\"}, \"feeds-device-type\": {\"name\": \"Homie $type of the downstream device\", \"datatype\": \"string\"}, \"feeds-device-status\": {\"name\": \"Panel's view of comm health to the downstream device\", \"datatype\": \"enum\", \"format\": \"OK,LOST,DEGRADED\"}}}, \"info\": {\"name\": \"info\", \"type\": \"energy.ebus.capability.info\", \"properties\": {\"direction\": {\"name\": \"Lugs feed direction: upstream or downstream\", \"datatype\": \"enum\", \"format\": \"UPSTREAM,DOWNSTREAM\"}}}}, \"children\": [], \"root\": \"sim-40t-001\", \"parent\": \"sim-40t-001\", \"extensions\": []}", + "$description": "{\"homie\": \"5.0\", \"version\": 1791309827361, \"type\": \"energy.ebus.device.lugs\", \"name\": \"Upstream lugs\", \"nodes\": {\"meter\": {\"name\": \"meter\", \"type\": \"energy.ebus.capability.meter\", \"properties\": {\"current-a\": {\"name\": \"L1 current\", \"datatype\": \"float\", \"unit\": \"A\"}, \"current-b\": {\"name\": \"L2 current\", \"datatype\": \"float\", \"unit\": \"A\"}, \"active-power\": {\"name\": \"Active power\", \"datatype\": \"float\", \"unit\": \"W\"}, \"imported-energy\": {\"name\": \"Imported energy\", \"datatype\": \"float\", \"unit\": \"Wh\"}, \"exported-energy\": {\"name\": \"Exported energy\", \"datatype\": \"float\", \"unit\": \"Wh\"}}}, \"connection\": {\"name\": \"connection\", \"type\": \"energy.ebus.capability.connection\", \"properties\": {\"fed-by-device-id\": {\"name\": \"Homie device-id of the upstream device feeding this lugs\", \"datatype\": \"string\"}, \"fed-by-device-type\": {\"name\": \"Homie $type of the upstream device\", \"datatype\": \"string\"}, \"fed-by-device-status\": {\"name\": \"Panel's view of comm health to the upstream device\", \"datatype\": \"enum\", \"format\": \"OK,LOST,DEGRADED\"}, \"feeds-device-id\": {\"name\": \"Homie device-id of the downstream device fed by this lugs\", \"datatype\": \"string\"}, \"feeds-device-type\": {\"name\": \"Homie $type of the downstream device\", \"datatype\": \"string\"}, \"feeds-device-status\": {\"name\": \"Panel's view of comm health to the downstream device\", \"datatype\": \"enum\", \"format\": \"OK,LOST,DEGRADED\"}}}, \"info\": {\"name\": \"info\", \"type\": \"energy.ebus.capability.info\", \"properties\": {\"direction\": {\"name\": \"Lugs feed direction: upstream or downstream\", \"datatype\": \"enum\", \"format\": \"UPSTREAM,DOWNSTREAM\"}}}}, \"children\": [], \"root\": \"sim-40t-001\", \"parent\": \"sim-40t-001\", \"extensions\": []}", "$state": "ready", "connection/fed-by-device-id": "sim-40t-001-SIM-BESS-40T-001", "connection/fed-by-device-status": "OK", "connection/fed-by-device-type": "energy.ebus.device.bess", "info/direction": "UPSTREAM", - "meter/active-power": "16122.528713582125", - "meter/current-a": "56.08466500436126", - "meter/current-b": "80.76474454855284", + "meter/active-power": "2870.06529347341", + "meter/current-a": "59.9988016043002", + "meter/current-b": "38.44115561186716", "meter/exported-energy": "0.0", "meter/imported-energy": "0.0" }, "sim-40t-001-pv-1": { - "$description": "{\"homie\": \"5.0\", \"version\": 1787970490466, \"type\": \"energy.ebus.device.pv\", \"name\": \"Solar\", \"nodes\": {\"info\": {\"name\": \"info\", \"type\": \"energy.ebus.capability.info\", \"properties\": {\"vendor-name\": {\"name\": \"Vendor name\", \"datatype\": \"string\"}, \"model\": {\"name\": \"Model\", \"datatype\": \"string\"}, \"serial-number\": {\"name\": \"Serial number\", \"datatype\": \"string\"}, \"firmware-version\": {\"name\": \"Firmware version\", \"datatype\": \"string\"}, \"nominal-power\": {\"name\": \"Nominal power\", \"datatype\": \"float\", \"unit\": \"W\"}}}}, \"children\": [], \"root\": \"sim-40t-001\", \"parent\": \"sim-40t-001\", \"extensions\": []}", + "$description": "{\"homie\": \"5.0\", \"version\": 1791309827361, \"type\": \"energy.ebus.device.pv\", \"name\": \"Solar\", \"nodes\": {\"info\": {\"name\": \"info\", \"type\": \"energy.ebus.capability.info\", \"properties\": {\"vendor-name\": {\"name\": \"Vendor name\", \"datatype\": \"string\"}, \"model\": {\"name\": \"Model\", \"datatype\": \"string\"}, \"serial-number\": {\"name\": \"Serial number\", \"datatype\": \"string\"}, \"firmware-version\": {\"name\": \"Firmware version\", \"datatype\": \"string\"}, \"nominal-power\": {\"name\": \"Nominal power\", \"datatype\": \"float\", \"unit\": \"W\"}}}}, \"children\": [], \"root\": \"sim-40t-001\", \"parent\": \"sim-40t-001\", \"extensions\": []}", "$state": "ready", "info/firmware-version": "sim-pv/v0.1.0", "info/model": "IQ8PLUS-72-2-US", @@ -654,10 +654,9 @@ "info/vendor-name": "Enphase" }, "sim-40t-001-sim-evse-sim-40t-001": { - "$description": "{\"homie\": \"5.0\", \"version\": 1787970490465, \"type\": \"energy.ebus.device.evse\", \"name\": \"SPAN Drive - Garage\", \"nodes\": {\"info\": {\"name\": \"info\", \"type\": \"energy.ebus.capability.info\", \"properties\": {\"vendor-name\": {\"name\": \"Vendor name\", \"datatype\": \"string\"}, \"model\": {\"name\": \"Model\", \"datatype\": \"string\"}, \"part-number\": {\"name\": \"Part number\", \"datatype\": \"string\"}, \"serial-number\": {\"name\": \"Serial number\", \"datatype\": \"string\"}, \"firmware-version\": {\"name\": \"Firmware version\", \"datatype\": \"string\"}}}, \"switch\": {\"name\": \"switch\", \"type\": \"energy.ebus.capability.switch\", \"properties\": {\"lock-state\": {\"name\": \"Lock state\", \"datatype\": \"enum\", \"format\": \"UNLOCKED,LOCKED\"}}}, \"status\": {\"name\": \"status\", \"type\": \"energy.ebus.capability.status\", \"properties\": {\"status\": {\"name\": \"Status\", \"datatype\": \"enum\", \"format\": \"AVAILABLE,PREPARING,CHARGING,UNAVAILABLE\"}}}, \"meter\": {\"name\": \"meter\", \"type\": \"energy.ebus.capability.meter\", \"properties\": {\"advertised-current\": {\"name\": \"Current EVSE is advertising to the EV\", \"datatype\": \"float\", \"unit\": \"A\"}}}, \"config\": {\"name\": \"config\", \"type\": \"energy.ebus.capability.config\", \"properties\": {\"user-max-charge-current\": {\"name\": \"User-configured maximum EVSE charge current (ceiling)\", \"datatype\": \"integer\", \"settable\": true, \"unit\": \"A\"}, \"max-charge-current\": {\"name\": \"Commissioned maximum EVSE charge current (installer-configured)\", \"datatype\": \"integer\", \"unit\": \"A\"}}}}, \"children\": [], \"root\": \"sim-40t-001\", \"parent\": \"sim-40t-001\", \"extensions\": []}", + "$description": "{\"homie\": \"5.0\", \"version\": 1791309827361, \"type\": \"energy.ebus.device.evse\", \"name\": \"SPAN Drive - Garage\", \"nodes\": {\"info\": {\"name\": \"info\", \"type\": \"energy.ebus.capability.info\", \"properties\": {\"vendor-name\": {\"name\": \"Vendor name\", \"datatype\": \"string\"}, \"model\": {\"name\": \"Model\", \"datatype\": \"string\"}, \"part-number\": {\"name\": \"Part number\", \"datatype\": \"string\"}, \"serial-number\": {\"name\": \"Serial number\", \"datatype\": \"string\"}, \"firmware-version\": {\"name\": \"Firmware version\", \"datatype\": \"string\"}}}, \"switch\": {\"name\": \"switch\", \"type\": \"energy.ebus.capability.switch\", \"properties\": {\"lock-state\": {\"name\": \"Lock state\", \"datatype\": \"enum\", \"format\": \"UNLOCKED,LOCKED\"}}}, \"status\": {\"name\": \"status\", \"type\": \"energy.ebus.capability.status\", \"properties\": {\"status\": {\"name\": \"Status\", \"datatype\": \"enum\", \"format\": \"AVAILABLE,PREPARING,CHARGING,UNAVAILABLE\"}}}, \"meter\": {\"name\": \"meter\", \"type\": \"energy.ebus.capability.meter\", \"properties\": {\"advertised-current\": {\"name\": \"Current EVSE is advertising to the EV\", \"datatype\": \"float\", \"unit\": \"A\"}}}, \"config\": {\"name\": \"config\", \"type\": \"energy.ebus.capability.config\", \"properties\": {\"user-max-charge-current\": {\"name\": \"User-configured maximum EVSE charge current (ceiling)\", \"datatype\": \"integer\", \"format\": \"6:32\", \"settable\": true, \"unit\": \"A\"}, \"max-charge-current\": {\"name\": \"Commissioned maximum EVSE charge current (installer-configured)\", \"datatype\": \"integer\", \"unit\": \"A\"}}}}, \"children\": [], \"root\": \"sim-40t-001\", \"parent\": \"sim-40t-001\", \"extensions\": []}", "$state": "ready", "config/max-charge-current": "32", - "config/user-max-charge-current": "32", "info/firmware-version": "sim/v0.1.0", "info/model": "SPAN Drive", "info/part-number": "SPN-DRV-001", @@ -668,10 +667,9 @@ "switch/lock-state": "UNLOCKED" }, "sim-40t-001-sim-evse-sim-40t-001-2": { - "$description": "{\"homie\": \"5.0\", \"version\": 1787970490465, \"type\": \"energy.ebus.device.evse\", \"name\": \"SPAN Drive - Driveway\", \"nodes\": {\"info\": {\"name\": \"info\", \"type\": \"energy.ebus.capability.info\", \"properties\": {\"vendor-name\": {\"name\": \"Vendor name\", \"datatype\": \"string\"}, \"model\": {\"name\": \"Model\", \"datatype\": \"string\"}, \"part-number\": {\"name\": \"Part number\", \"datatype\": \"string\"}, \"serial-number\": {\"name\": \"Serial number\", \"datatype\": \"string\"}, \"firmware-version\": {\"name\": \"Firmware version\", \"datatype\": \"string\"}}}, \"switch\": {\"name\": \"switch\", \"type\": \"energy.ebus.capability.switch\", \"properties\": {\"lock-state\": {\"name\": \"Lock state\", \"datatype\": \"enum\", \"format\": \"UNLOCKED,LOCKED\"}}}, \"status\": {\"name\": \"status\", \"type\": \"energy.ebus.capability.status\", \"properties\": {\"status\": {\"name\": \"Status\", \"datatype\": \"enum\", \"format\": \"AVAILABLE,PREPARING,CHARGING,UNAVAILABLE\"}}}, \"meter\": {\"name\": \"meter\", \"type\": \"energy.ebus.capability.meter\", \"properties\": {\"advertised-current\": {\"name\": \"Current EVSE is advertising to the EV\", \"datatype\": \"float\", \"unit\": \"A\"}}}, \"config\": {\"name\": \"config\", \"type\": \"energy.ebus.capability.config\", \"properties\": {\"user-max-charge-current\": {\"name\": \"User-configured maximum EVSE charge current (ceiling)\", \"datatype\": \"integer\", \"settable\": true, \"unit\": \"A\"}, \"max-charge-current\": {\"name\": \"Commissioned maximum EVSE charge current (installer-configured)\", \"datatype\": \"integer\", \"unit\": \"A\"}}}}, \"children\": [], \"root\": \"sim-40t-001\", \"parent\": \"sim-40t-001\", \"extensions\": []}", + "$description": "{\"homie\": \"5.0\", \"version\": 1791309827361, \"type\": \"energy.ebus.device.evse\", \"name\": \"SPAN Drive - Driveway\", \"nodes\": {\"info\": {\"name\": \"info\", \"type\": \"energy.ebus.capability.info\", \"properties\": {\"vendor-name\": {\"name\": \"Vendor name\", \"datatype\": \"string\"}, \"model\": {\"name\": \"Model\", \"datatype\": \"string\"}, \"part-number\": {\"name\": \"Part number\", \"datatype\": \"string\"}, \"serial-number\": {\"name\": \"Serial number\", \"datatype\": \"string\"}, \"firmware-version\": {\"name\": \"Firmware version\", \"datatype\": \"string\"}}}, \"switch\": {\"name\": \"switch\", \"type\": \"energy.ebus.capability.switch\", \"properties\": {\"lock-state\": {\"name\": \"Lock state\", \"datatype\": \"enum\", \"format\": \"UNLOCKED,LOCKED\"}}}, \"status\": {\"name\": \"status\", \"type\": \"energy.ebus.capability.status\", \"properties\": {\"status\": {\"name\": \"Status\", \"datatype\": \"enum\", \"format\": \"AVAILABLE,PREPARING,CHARGING,UNAVAILABLE\"}}}, \"meter\": {\"name\": \"meter\", \"type\": \"energy.ebus.capability.meter\", \"properties\": {\"advertised-current\": {\"name\": \"Current EVSE is advertising to the EV\", \"datatype\": \"float\", \"unit\": \"A\"}}}, \"config\": {\"name\": \"config\", \"type\": \"energy.ebus.capability.config\", \"properties\": {\"user-max-charge-current\": {\"name\": \"User-configured maximum EVSE charge current (ceiling)\", \"datatype\": \"integer\", \"format\": \"6:32\", \"settable\": true, \"unit\": \"A\"}, \"max-charge-current\": {\"name\": \"Commissioned maximum EVSE charge current (installer-configured)\", \"datatype\": \"integer\", \"unit\": \"A\"}}}}, \"children\": [], \"root\": \"sim-40t-001\", \"parent\": \"sim-40t-001\", \"extensions\": []}", "$state": "ready", "config/max-charge-current": "32", - "config/user-max-charge-current": "32", "info/firmware-version": "sim/v0.1.0", "info/model": "SPAN Drive", "info/part-number": "SPN-DRV-001", diff --git a/tests/emitter_adapter/test_firmware_conventions.py b/tests/emitter_adapter/test_firmware_conventions.py new file mode 100644 index 0000000..c46441b --- /dev/null +++ b/tests/emitter_adapter/test_firmware_conventions.py @@ -0,0 +1,72 @@ +"""Which side of SPAN release 202639 a PanelBench panel publishes. + +The emitter reads the panel's `firmware-version` once, at construction. A +`/`-separated segment `r` plus six digits below 202639 keeps the earlier +conventions; anything else, including the shipped configs' `sim/v0.1.0`, gets +the current ones. Two conventions differ: the BESS meter's sign, and whether an +EVSE's `config/user-max-charge-current` is published before a user sets it. +""" + +from __future__ import annotations + +from pathlib import Path + +import pytest + +from panelbench.emitter_adapter import runtime as emitter_runtime +from panelbench.emitter_adapter.runtime import CloneRuntime, bess_config_from_engine +from panelbench.emitter_adapter.wire_capture import RecordingTransport +from tests._helpers import ( + CURRENT_FIRMWARE, + EARLIER_FIRMWARE, + clone, + default_config, + published, + write_config, +) + +pytestmark = pytest.mark.asyncio + + +async def _ticked(tmp_path: Path, firmware: str) -> tuple[CloneRuntime, RecordingTransport]: + """The default panel at *firmware*, at night, after one tick.""" + config = default_config() + config["firmware_version"] = firmware + # Night, so the battery is discharging to cover load and its sign is observable. + # The default battery is self-consumption, which ignores `discharge_hours`: it + # discharges whenever load exceeds PV and its charge is above the reserve. + config["simulation_params"]["use_simulation_time"] = True + config["simulation_params"]["simulation_start_time"] = "2026-06-15T22:00:00" + runtime, recorder = await clone(write_config(tmp_path / "panel.yaml", config)) + await emitter_runtime.publish_tick(runtime) + return runtime, recorder + + +@pytest.mark.parametrize( + ("firmware", "same_sign"), [(EARLIER_FIRMWARE, True), (CURRENT_FIRMWARE, False)] +) +async def test_the_bess_meter_frame_follows_the_firmware( + tmp_path: Path, firmware: str, same_sign: bool +) -> None: + runtime, recorder = await _ticked(tmp_path, firmware) + battery = bess_config_from_engine(runtime.engine) + assert battery is not None + + meter = float(published(recorder, battery.instance_id, "meter/active-power")) + flow = float(published(recorder, runtime.engine.serial_number, "power-flows/battery")) + + assert flow < 0, "the battery discharges at night, so power flows out of it" + assert (meter < 0) if same_sign else (meter > 0) + + +@pytest.mark.parametrize( + ("firmware", "preset"), [(EARLIER_FIRMWARE, True), (CURRENT_FIRMWARE, False)] +) +async def test_the_evse_limit_is_preset_only_before_202639( + tmp_path: Path, firmware: str, preset: bool +) -> None: + _runtime, recorder = await _ticked(tmp_path, firmware) + + limits = [t for t in recorder.retained if t.endswith("/config/user-max-charge-current")] + + assert bool(limits) is preset diff --git a/tests/emitter_adapter/test_islanding_assertion.py b/tests/emitter_adapter/test_islanding_assertion.py new file mode 100644 index 0000000..71366a5 --- /dev/null +++ b/tests/emitter_adapter/test_islanding_assertion.py @@ -0,0 +1,36 @@ +"""What a write to `shed/asserted-islanding-state` does on a PanelBench panel. + +PanelBench registers no handler of its own: it passes the emitter an empty +`SetterRegistry`, so the emitter's built-in handler decides. That handler follows +a SPAN panel, accepting `ON_GRID` or `OFF_GRID` only while the panel's link to +some battery is not known to be healthy. Home Assistant's dominant-power-source +control writes this property, so the rule reaches a user. +""" + +from __future__ import annotations + +import pytest + +from panelbench.emitter_adapter import runtime as emitter_runtime +from panelbench.emitter_adapter.runtime import CloneRuntime +from tests._helpers import DEFAULT_CONFIG, clone, published + +pytestmark = pytest.mark.asyncio + +_ASSERTION = "shed/asserted-islanding-state" + + +def _assert(runtime: CloneRuntime, value: str) -> None: + handler = runtime.setters.get("panel", _ASSERTION) + assert handler is not None, "the emitter registers a default islanding handler" + handler("panel", runtime.engine.serial_number, _ASSERTION, value) + + +async def test_an_assertion_is_ignored_while_the_battery_link_is_healthy() -> None: + runtime, recorder = await clone(DEFAULT_CONFIG) + await emitter_runtime.publish_tick(runtime) + + _assert(runtime, "OFF_GRID") + await emitter_runtime.publish_tick(runtime) + + assert published(recorder, runtime.engine.serial_number, _ASSERTION) == "NONE" diff --git a/tests/emitter_adapter/test_shed_requires_a_battery.py b/tests/emitter_adapter/test_shed_requires_a_battery.py new file mode 100644 index 0000000..6671fdb --- /dev/null +++ b/tests/emitter_adapter/test_shed_requires_a_battery.py @@ -0,0 +1,43 @@ +"""A panel without a battery publishes no load-shed state. + +`devices/distribution-enclosure.md` publishes `shed-forecast` "only when at +least one BESS is commissioned; omitted otherwise" (line 196), and `shed` under +the "same presence rule" (line 202), at the specification commit `.ebus-spec.json` +pins. Without a battery there is no off-grid runtime to forecast or shed against, +so a consumer offered either node would show a control and estimates that mean +nothing. +""" + +from __future__ import annotations + +import json +from pathlib import Path + +import pytest + +from panelbench.emitter_adapter import runtime as emitter_runtime +from tests._helpers import clone, default_config, published, write_config + +pytestmark = pytest.mark.asyncio + +_SHED_NODES = ("shed", "shed-forecast") + + +async def test_a_panel_without_a_battery_declares_and_publishes_no_shed_nodes( + tmp_path: Path, +) -> None: + config = default_config() + config["bess"] = {"enabled": False} + runtime, recorder = await clone(write_config(tmp_path / "no_battery.yaml", config)) + await emitter_runtime.publish_tick(runtime) + panel = runtime.engine.serial_number + + nodes = json.loads(published(recorder, panel, "$description"))["nodes"] + values = [ + topic + for topic in recorder.retained + if topic.startswith(tuple(f"ebus/5/{panel}/{node}/" for node in _SHED_NODES)) + ] + + assert not [node for node in _SHED_NODES if node in nodes] + assert values == [] diff --git a/tests/fidelity/fixtures/unvalued_by_both_baseline.json b/tests/fidelity/fixtures/unvalued_by_both_baseline.json index 3fd47e6..ed5cc49 100644 --- a/tests/fidelity/fixtures/unvalued_by_both_baseline.json +++ b/tests/fidelity/fixtures/unvalued_by_both_baseline.json @@ -80,6 +80,8 @@ "energy.ebus.device.circuit::kitchen Lights connection/feeds-device-id", "energy.ebus.device.circuit::kitchen Lights connection/feeds-device-status", "energy.ebus.device.circuit::kitchen Lights connection/feeds-device-type", + "energy.ebus.device.evse::SPAN Drive - Driveway config/user-max-charge-current", + "energy.ebus.device.evse::SPAN Drive - Garage config/user-max-charge-current", "energy.ebus.device.lugs::Downstream lugs connection/fed-by-device-id", "energy.ebus.device.lugs::Downstream lugs connection/fed-by-device-status", "energy.ebus.device.lugs::Downstream lugs connection/fed-by-device-type", diff --git a/tests/fidelity/test_declared_but_unvalued.py b/tests/fidelity/test_declared_but_unvalued.py index fd65aff..b5a267d 100644 --- a/tests/fidelity/test_declared_but_unvalued.py +++ b/tests/fidelity/test_declared_but_unvalued.py @@ -34,7 +34,7 @@ Shrinking this file is not the goal — being right about each line is. Membership was audited against the specification and SPAN's r202633 topic reference, and -what remains is there for three different reasons: +what remains is there for four different reasons: `connection/feeds-device-*` on a mixed-load circuit is *correct* absence, not a gap. The catalog omits the triple "when mixed-load with no commissioned @@ -62,6 +62,12 @@ topology this producer does not have, on firmware behaviour nobody has observed. + An EVSE's `config/user-max-charge-current` is *correct* absence too. SPAN + firmware r202639 leaves it unpublished until a user sets a limit, and the + emitter follows that for any firmware string naming no earlier release. The + `sim/v0.1.0` both producers read from this config names none, so these lines + leave only if the config comes to name an earlier release. + `panel status/wifi-ssid` is the line that left. It was valued because the enclosure device model defines it (MAY), r202633 documents it as the MQTT successor to the panel's Wi-Fi REST endpoint, and consumers read the flat From 597b74c70cb1591860e4831033ba273febb3daea Mon Sep 17 00:00:00 2001 From: cayossarian <23534755+cayossarian@users.noreply.github.com> Date: Tue, 6 Oct 2026 11:16:59 -0700 Subject: [PATCH 02/95] refactor(emitter): build the emitter from one PanelDefinition --- src/panelbench/emitter_adapter/definition.py | 76 ++++++++++++++++++++ src/panelbench/emitter_adapter/runtime.py | 67 ++++------------- tests/emitter_adapter/test_definition.py | 61 ++++++++++++++++ tests/emitter_adapter/test_runtime.py | 6 +- 4 files changed, 152 insertions(+), 58 deletions(-) create mode 100644 src/panelbench/emitter_adapter/definition.py create mode 100644 tests/emitter_adapter/test_definition.py diff --git a/src/panelbench/emitter_adapter/definition.py b/src/panelbench/emitter_adapter/definition.py new file mode 100644 index 0000000..663e653 --- /dev/null +++ b/src/panelbench/emitter_adapter/definition.py @@ -0,0 +1,76 @@ +"""What a PanelBench panel *is*, as the emitter takes it: one ``PanelDefinition``. + +The config stays the source of truth; it also says how the panel behaves, which a +definition deliberately does not. This module reads the makeup half of it — the +manifest, the native battery and the load-shedding policy — and, for import, +writes the emitter-option half back, so both directions live side by side and +cannot drift apart unnoticed. +""" + +from __future__ import annotations + +from typing import TYPE_CHECKING + +from ebus_panel_sim import BESSConfig, ChargeMode, LoadSheddingConfig, PanelDefinition + +from panelbench.emitter_adapter.instance_ids import bess_device_id +from panelbench.emitter_adapter.spec_generator import build_manifest + +if TYPE_CHECKING: + from panelbench.config_types import BESSConfigYAML, PanelConfig, SimulationConfig + +_DEFAULT_SOC_SHED_THRESHOLD_PCT = 20.0 +_DEFAULT_INITIAL_SOC_PCT = 50.0 +"""``BESSConfig``'s own default, used when the YAML states no starting charge.""" + + +def build_definition(config: SimulationConfig) -> PanelDefinition: + """The panel *config* describes, as one definition the emitter is built from.""" + battery = bess_config(config["panel_config"]["serial_number"], config.get("bess") or {}) + return PanelDefinition( + manifest=build_manifest(config), + bess_configs=() if battery is None else (battery,), + load_shedding=load_shedding_config(config["panel_config"]), + ) + + +def bess_config(serial_number: str, bess: BESSConfigYAML) -> BESSConfig | None: + """The emitter's native battery for a YAML ``bess`` section, or ``None`` when disabled.""" + if not bess.get("enabled"): + return None + raw_mode = bess.get("charge_mode", "self-consumption") + mode: ChargeMode = "backup-only" if raw_mode == "backup-only" else "self-consumption" + return BESSConfig( + instance_id=bess_device_id(serial_number, bess), + nameplate_capacity_kwh=float(bess.get("nameplate_capacity_kwh", 13.5)), + max_charge_w=float(bess.get("max_charge_w", 3500.0)), + max_discharge_w=float(bess.get("max_discharge_w", 3500.0)), + charge_efficiency=float(bess.get("charge_efficiency", 0.95)), + discharge_efficiency=float(bess.get("discharge_efficiency", 0.95)), + backup_reserve_pct=float(bess.get("backup_reserve_pct", 20.0)), + charge_mode=mode, + charge_hours=tuple(bess.get("charge_hours", [10, 11, 12, 13, 14, 15])), + discharge_hours=tuple(bess.get("discharge_hours", [17, 18, 19, 20, 21])), + initial_soc_pct=_initial_soc_pct(bess), + ) + + +def _initial_soc_pct(bess: BESSConfigYAML) -> float: + """The battery's starting charge as the emitter's percentage. + + The YAML states it once, as ``initial_soe_kwh``, which also seeds the manifest's + ``initial-soe-kwh``; a second key for the same fact could disagree with it. + Absent, or with no capacity to divide by, it is the emitter's own default. + """ + soe = bess.get("initial_soe_kwh") + nameplate = float(bess.get("nameplate_capacity_kwh", 13.5)) + if soe is None or nameplate <= 0: + return _DEFAULT_INITIAL_SOC_PCT + return float(soe) / nameplate * 100.0 + + +def load_shedding_config(panel: PanelConfig) -> LoadSheddingConfig: + """The panel's off-grid shed policy.""" + return LoadSheddingConfig( + soc_threshold_pct=float(panel.get("soc_shed_threshold", _DEFAULT_SOC_SHED_THRESHOLD_PCT)), + ) diff --git a/src/panelbench/emitter_adapter/runtime.py b/src/panelbench/emitter_adapter/runtime.py index 05d0bf1..fea7b6a 100644 --- a/src/panelbench/emitter_adapter/runtime.py +++ b/src/panelbench/emitter_adapter/runtime.py @@ -1,9 +1,10 @@ """Per-clone wiring between simulator engine and emitter wire layer. -``start_clone`` builds the manifest from the engine's config, instantiates an -``Emitter`` (with optional BESS + load-shedding native-device configs), opens the -per-clone MQTT client, runs the cold-start lifecycle, and returns a ``CloneRuntime`` -the simulator's panel instance holds across ticks. +``start_clone`` builds the panel's ``PanelDefinition`` from the engine's config +(manifest, optional native BESS, load-shedding policy), instantiates an +``Emitter`` from it, opens the per-clone MQTT client, runs the cold-start +lifecycle, and returns a ``CloneRuntime`` the simulator's panel instance holds +across ticks. ``publish_tick`` collects the engine's per-circuit signed power into a ``TickInputs`` and hands it to ``Emitter.publish_tick``. The emitter does the @@ -21,11 +22,9 @@ # Not re-exported from the package root, unlike every other name above. from ebus_panel_sim import ( BESSConfig, - ChargeMode, DeviceManifest, EbusPanelSnapshot, Emitter, - LoadSheddingConfig, MqttDeviceTransport, PanelEnvelopeTick, SetterRegistry, @@ -33,12 +32,11 @@ ) from panelbench.const import DEFAULT_WIFI_SSID +from panelbench.emitter_adapter.definition import bess_config, build_definition from panelbench.emitter_adapter.instance_ids import ( - bess_device_id, evse_device_id, stable_circuit_uuid, ) -from panelbench.emitter_adapter.spec_generator import build_manifest from panelbench.emitter_adapter.transport import LoopBoundTransport if TYPE_CHECKING: @@ -169,28 +167,7 @@ async def subscribe(self, topic: str) -> None: def bess_config_from_engine(engine: DynamicSimulationEngine) -> BESSConfig | None: """Build the emitter-side BESSConfig from the engine's loaded clone profile. Returns None when the profile has no BESS enabled.""" - bess = engine.config.get("bess") or {} - return _build_bess_config(engine.serial_number, bess) - - -def _build_bess_config(serial_number: str, bess: BESSConfigYAML) -> BESSConfig | None: - """Build a BESSConfig dataclass from a typed YAML section.""" - if not bess.get("enabled"): - return None - raw_mode = bess.get("charge_mode", "self-consumption") - mode: ChargeMode = "backup-only" if raw_mode == "backup-only" else "self-consumption" - return BESSConfig( - instance_id=bess_device_id(serial_number, bess), - nameplate_capacity_kwh=float(bess.get("nameplate_capacity_kwh", 13.5)), - max_charge_w=float(bess.get("max_charge_w", 3500.0)), - max_discharge_w=float(bess.get("max_discharge_w", 3500.0)), - charge_efficiency=float(bess.get("charge_efficiency", 0.95)), - discharge_efficiency=float(bess.get("discharge_efficiency", 0.95)), - backup_reserve_pct=float(bess.get("backup_reserve_pct", 20.0)), - charge_mode=mode, - charge_hours=tuple(bess.get("charge_hours", [10, 11, 12, 13, 14, 15])), - discharge_hours=tuple(bess.get("discharge_hours", [17, 18, 19, 20, 21])), - ) + return bess_config(engine.serial_number, engine.config.get("bess") or {}) def update_bess_config_live(runtime: CloneRuntime, bess_yaml: BESSConfigYAML) -> None: @@ -207,15 +184,6 @@ def update_bess_config_live(runtime: CloneRuntime, bess_yaml: BESSConfigYAML) -> runtime.emitter.update_bess_config(new_cfg) -def _load_shedding_config_from_engine( - engine: DynamicSimulationEngine, -) -> LoadSheddingConfig: - panel_cfg = engine.config["panel_config"] - return LoadSheddingConfig( - soc_threshold_pct=float(panel_cfg.get("soc_shed_threshold", 20.0)), - ) - - def _resolve_broker( config_broker: BrokerConfigYAML, fallback: BrokerConnection | None, @@ -253,8 +221,8 @@ async def start_clone( broker: BrokerConnection | None = None, transport: MqttDeviceTransport | None = None, ) -> CloneRuntime: - """Assemble the emitter for ``engine``: build manifest, open MQTT, run - lifecycle. Returns a runtime the panel holds across ticks. + """Assemble the emitter for ``engine``: build its definition, open MQTT, + run lifecycle. Returns a runtime the panel holds across ticks. Broker connection precedence (highest first): 1. ``broker:`` section in the YAML config (config explicitness wins). @@ -270,7 +238,8 @@ async def start_clone( does. Its lifecycle stays with whoever supplied it — the same rule the SDK applies to an injected client, and the reason ``MqttDeviceTransport`` has no ``start`` or ``stop``.""" - manifest = build_manifest(engine.config) + definition = build_definition(engine.config) + manifest = definition.manifest panel_id = engine.config["panel_config"]["serial_number"] uuid_to_circuit_id = { @@ -315,19 +284,7 @@ async def start_clone( loop_bound.start() transport = loop_bound - # The emitter Phase 2 reshape pluralised the BESS-config parameter: - # ``bess_configs`` is a tuple keyed internally by ``instance_id``. The - # simulator models a single BESS per panel today, so we wrap the - # optional config in a one-element tuple (or empty tuple when absent). - bess_cfg = bess_config_from_engine(engine) - bess_configs: tuple[BESSConfig, ...] = (bess_cfg,) if bess_cfg is not None else () - emitter = Emitter( - manifest, - setters, - mqttc=transport, - bess_configs=bess_configs, - load_shedding_config=_load_shedding_config_from_engine(engine), - ) + emitter = Emitter.from_definition(definition, setters, mqttc=transport) runtime = CloneRuntime( engine=engine, diff --git a/tests/emitter_adapter/test_definition.py b/tests/emitter_adapter/test_definition.py new file mode 100644 index 0000000..1ecc591 --- /dev/null +++ b/tests/emitter_adapter/test_definition.py @@ -0,0 +1,61 @@ +"""`build_definition` is PanelBench's single statement of what a panel *is*.""" + +from __future__ import annotations + +from typing import TYPE_CHECKING + +import pytest +from ebus_panel_sim import LoadSheddingConfig + +from panelbench.emitter_adapter.definition import ( + bess_config, + build_definition, + load_shedding_config, +) +from panelbench.emitter_adapter.instance_ids import bess_device_id +from panelbench.emitter_adapter.spec_generator import build_manifest +from tests._helpers import default_config + +if TYPE_CHECKING: + from panelbench.config_types import BESSConfigYAML + + +def test_the_definition_carries_the_manifest_battery_and_shed_policy() -> None: + config = default_config() + serial = config["panel_config"]["serial_number"] + + definition = build_definition(config) + + assert definition.manifest == build_manifest(config) + assert definition.variant == "span" + assert [b.instance_id for b in definition.bess_configs] == [ + bess_device_id(serial, config["bess"]) + ] + assert definition.load_shedding == load_shedding_config(config["panel_config"]) + + +def test_a_panel_without_a_battery_has_no_native_battery() -> None: + config = default_config() + config["bess"] = {"enabled": False} + + assert build_definition(config).bess_configs == () + + +def test_the_shed_threshold_defaults_to_twenty_percent() -> None: + panel = default_config()["panel_config"] + panel.pop("soc_shed_threshold", None) + + assert load_shedding_config(panel) == LoadSheddingConfig(soc_threshold_pct=20.0) + + +def test_a_disabled_battery_builds_no_config() -> None: + assert bess_config("sim-x", {"enabled": False}) is None + + +@pytest.mark.parametrize(("bess", "soc"), [({"initial_soe_kwh": 2.5}, 25.0), ({}, 50.0)]) +def test_the_starting_charge_is_initial_soe_kwh(bess: BESSConfigYAML, soc: float) -> None: + """One fact, one key: the emitter's percentage comes from the YAML's kWh.""" + battery = bess_config("sim-x", {"enabled": True, "nameplate_capacity_kwh": 10.0, **bess}) + + assert battery is not None + assert battery.initial_soc_pct == soc diff --git a/tests/emitter_adapter/test_runtime.py b/tests/emitter_adapter/test_runtime.py index d06236a..ddefe72 100644 --- a/tests/emitter_adapter/test_runtime.py +++ b/tests/emitter_adapter/test_runtime.py @@ -5,10 +5,10 @@ from unittest.mock import MagicMock from panelbench.const import DEFAULT_WIFI_SSID +from panelbench.emitter_adapter.definition import load_shedding_config from panelbench.emitter_adapter.instance_ids import stable_circuit_uuid from panelbench.emitter_adapter.runtime import ( _evse_tick_inputs, - _load_shedding_config_from_engine, _panel_envelope, bess_config_from_engine, ) @@ -75,14 +75,14 @@ def testbess_config_from_engine_uses_explicit_instance_id() -> None: def test_load_shedding_config_default_threshold() -> None: engine = MagicMock() engine.config = {"panel_config": {"serial_number": "x"}} - cfg = _load_shedding_config_from_engine(engine) + cfg = load_shedding_config(engine.config["panel_config"]) assert cfg.soc_threshold_pct == 20.0 def test_load_shedding_config_custom_threshold() -> None: engine = MagicMock() engine.config = {"panel_config": {"serial_number": "x", "soc_shed_threshold": 35.0}} - cfg = _load_shedding_config_from_engine(engine) + cfg = load_shedding_config(engine.config["panel_config"]) assert cfg.soc_threshold_pct == 35.0 From a73229c62cae44713262ecbc338380e16dab0e92 Mon Sep 17 00:00:00 2001 From: cayossarian <23534755+cayossarian@users.noreply.github.com> Date: Tue, 6 Oct 2026 11:26:22 -0700 Subject: [PATCH 03/95] feat(battery): model the panel's link to its battery --- CHANGELOG.md | 5 + README.md | 1 + src/panelbench/app.py | 8 + src/panelbench/bess_link.py | 20 +++ src/panelbench/dashboard/context.py | 3 + src/panelbench/dashboard/routes.py | 12 ++ src/panelbench/dashboard/static/dashboard.css | 7 + .../templates/partials/runtime_controls.html | 25 +++ src/panelbench/emitter_adapter/runtime.py | 24 ++- src/panelbench/engine.py | 53 ++++-- src/panelbench/panel.py | 14 +- .../test_islanding_assertion.py | 61 ++++++- tests/test_bess_link.py | 152 ++++++++++++++++++ 13 files changed, 365 insertions(+), 20 deletions(-) create mode 100644 src/panelbench/bess_link.py create mode 100644 tests/test_bess_link.py diff --git a/CHANGELOG.md b/CHANGELOG.md index 8dcc91d..b541565 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,11 @@ ## Unreleased +### Added + +- **The dashboard can set the health of the panel's link to its battery**, which is what a SPAN panel requires before it honours Home Assistant's dominant + power source control. + ### Changed - **Home Assistant's dominant power source control is now ignored while the panel's link to its battery is healthy**, as a SPAN panel ignores it. diff --git a/README.md b/README.md index d91d36b..775588a 100644 --- a/README.md +++ b/README.md @@ -135,6 +135,7 @@ The dashboard runs on port 18080 and provides full control over the simulated pa - **Speed acceleration** — 1x to 360x time acceleration - **Grid online/offline** — toggle to test backup behavior and load shedding - **Islandable toggle** — controls whether PV operates during grid outage +- **Battery link** — sets the health of the panel's link to its battery; Home Assistant's dominant power source control is honoured only while it is not OK - **Live power chart** — real-time grid, solar, and battery power flows ### Recorder Replay diff --git a/src/panelbench/app.py b/src/panelbench/app.py index d5d8c99..71d0099 100644 --- a/src/panelbench/app.py +++ b/src/panelbench/app.py @@ -41,6 +41,8 @@ from panelbench.schema import HomieSchemaRegistry, load_schema, render_for_panel if TYPE_CHECKING: + from ebus_panel_sim import BESSCommunication + from panelbench.certs import CertificateBundle from panelbench.config_types import BESSConfigYAML from panelbench.engine import DynamicSimulationEngine @@ -249,6 +251,11 @@ def _set_grid_islandable(self, islandable: bool) -> None: if engine is not None: engine.set_grid_islandable(islandable) + def _set_bess_link(self, link: BESSCommunication) -> None: + engine = self._get_first_engine() + if engine is not None: + engine.set_bess_link(link) + def _set_circuit_priority(self, circuit_id: str, priority: str) -> None: engine = self._get_first_engine() if engine is not None: @@ -834,6 +841,7 @@ async def run(self) -> None: set_time_acceleration=self._set_time_acceleration, set_grid_online=self._set_grid_online, set_grid_islandable=self._set_grid_islandable, + set_bess_link=self._set_bess_link, set_circuit_priority=self._set_circuit_priority, set_circuit_relay=self._set_circuit_relay, apply_bess_config_live=self.apply_bess_config_live, diff --git a/src/panelbench/bess_link.py b/src/panelbench/bess_link.py new file mode 100644 index 0000000..b79b9ec --- /dev/null +++ b/src/panelbench/bess_link.py @@ -0,0 +1,20 @@ +"""Health of the panel's link to its battery, as a producer reports it. + +The values are the emitter's ``BESSCommunication`` — the ``status`` catalog's +``communication-state`` enum. Kept in one place so the engine, which stores the +requested health, and the dashboard, which validates what a user sends, agree +on what is legal without either re-deriving it. +""" + +from __future__ import annotations + +from typing import Final, TypeIs, get_args + +from ebus_panel_sim import BESSCommunication + +BESS_LINKS: Final[frozenset[str]] = frozenset(get_args(BESSCommunication)) + + +def is_bess_link(value: object) -> TypeIs[BESSCommunication]: + """Whether *value* is a link health the emitter accepts.""" + return value in BESS_LINKS diff --git a/src/panelbench/dashboard/context.py b/src/panelbench/dashboard/context.py index 4947d6a..3c69f0f 100644 --- a/src/panelbench/dashboard/context.py +++ b/src/panelbench/dashboard/context.py @@ -9,6 +9,8 @@ from collections.abc import Awaitable, Callable from pathlib import Path + from ebus_panel_sim import BESSCommunication + from panelbench.config_types import BESSConfigYAML from panelbench.history import HistoryProvider @@ -38,6 +40,7 @@ class DashboardContext: set_time_acceleration: Callable[[float], None] = lambda _: None set_grid_online: Callable[[bool], None] = lambda _: None set_grid_islandable: Callable[[bool], None] = lambda _: None + set_bess_link: Callable[[BESSCommunication], None] = lambda _: None set_circuit_priority: Callable[[str, str], None] = lambda _id, _pri: None set_circuit_relay: Callable[[str, str], None] = lambda _id, _state: None apply_bess_config_live: Callable[[str, BESSConfigYAML], bool] = lambda _f, _c: False diff --git a/src/panelbench/dashboard/routes.py b/src/panelbench/dashboard/routes.py index e1bc0fa..84cf855 100644 --- a/src/panelbench/dashboard/routes.py +++ b/src/panelbench/dashboard/routes.py @@ -24,6 +24,7 @@ from datetime import UTC, datetime from zoneinfo import ZoneInfo +from panelbench.bess_link import BESS_LINKS, is_bess_link from panelbench.const import https_port_for from panelbench.dashboard.keys import ( APP_KEY_DASHBOARD_CONTEXT, @@ -627,6 +628,7 @@ def setup_routes(app: web.Application) -> None: app.router.add_post("/set-acceleration", handle_set_acceleration) app.router.add_post("/set-grid-state", handle_set_grid_state) app.router.add_post("/set-grid-islandable", handle_set_grid_islandable) + app.router.add_post("/set-bess-link", handle_set_bess_link) app.router.add_post("/entities/{id}/relay", handle_set_relay) app.router.add_post("/entities/{id}/toggle-replay", handle_toggle_replay) app.router.add_post("/entities/{id}/restore-recorder", handle_restore_recorder) @@ -1279,6 +1281,16 @@ async def handle_set_grid_islandable(request: web.Request) -> web.Response: return web.json_response({"ok": True, "islandable": islandable}) +async def handle_set_bess_link(request: web.Request) -> web.Response: + """Set the health of the panel's link to its battery.""" + data = await request.json() + link = str(data.get("link", "OK")).upper() + if not is_bess_link(link): + raise web.HTTPBadRequest(text=f"link must be one of {sorted(BESS_LINKS)}, got {link!r}") + _ctx(request).set_bess_link(link) + return web.json_response({"ok": True, "link": link}) + + async def handle_set_relay(request: web.Request) -> web.Response: """Toggle a circuit relay (OPEN/CLOSED). diff --git a/src/panelbench/dashboard/static/dashboard.css b/src/panelbench/dashboard/static/dashboard.css index 2afd1fe..10e3a62 100644 --- a/src/panelbench/dashboard/static/dashboard.css +++ b/src/panelbench/dashboard/static/dashboard.css @@ -1084,6 +1084,13 @@ legend { font-weight: 600; } +.bess-link-control { + display: inline-flex; + align-items: center; + gap: 0.35rem; + font-size: 0.85rem; +} + /* EVSE charging schedule */ .evse-schedule { margin-top: 0.75rem; diff --git a/src/panelbench/dashboard/templates/partials/runtime_controls.html b/src/panelbench/dashboard/templates/partials/runtime_controls.html index 96aa7b9..80d2b02 100644 --- a/src/panelbench/dashboard/templates/partials/runtime_controls.html +++ b/src/panelbench/dashboard/templates/partials/runtime_controls.html @@ -38,6 +38,15 @@

Runtime Controls

+
@@ -312,6 +321,17 @@

Live Power Flows

} }); + var bessLinkControl = document.getElementById('bess-link-control'); + var bessLinkSelect = document.getElementById('bess-link-select'); + + bessLinkSelect.addEventListener('change', function() { + busyFetch(bessLinkSelect, 'set-bess-link', { + method: 'POST', + headers: {'Content-Type': 'application/json'}, + body: JSON.stringify({link: bessLinkSelect.value}) + }); + }); + // -- Relay toggle (click status dot) -- document.addEventListener('click', function(e) { var dot = e.target.closest('.circuit-status-toggle'); @@ -550,8 +570,13 @@

Live Power Flows

islandableBtn.classList.add('islandable-off'); islandableBtn.textContent = 'Not Islandable'; } + bessLinkControl.style.display = ''; + if (data.bess_link && document.activeElement !== bessLinkSelect) { + bessLinkSelect.value = data.bess_link; + } } else { islandableBtn.style.display = 'none'; + bessLinkControl.style.display = 'none'; } // Grid status text (SOC + shedding) diff --git a/src/panelbench/emitter_adapter/runtime.py b/src/panelbench/emitter_adapter/runtime.py index fea7b6a..0095873 100644 --- a/src/panelbench/emitter_adapter/runtime.py +++ b/src/panelbench/emitter_adapter/runtime.py @@ -21,6 +21,7 @@ # Not re-exported from the package root, unlike every other name above. from ebus_panel_sim import ( + BESSCommunication, BESSConfig, DeviceManifest, EbusPanelSnapshot, @@ -308,15 +309,30 @@ async def publish_tick(runtime: CloneRuntime) -> EbusPanelSnapshot: and hand it to the emitter for publication.""" raw = await runtime.engine.get_tick_inputs() tick = TickInputs( - current_time=raw["current_time"], - grid_online=raw["grid_online"], - circuits=raw["circuits"], - evse=_evse_tick_inputs(runtime.engine.config, raw["circuits"]), + current_time=raw.current_time, + grid_online=raw.grid_online, + circuits=raw.circuits, + evse=_evse_tick_inputs(runtime.engine.config, raw.circuits), envelope=_panel_envelope(runtime.engine.config), + bess_communication=_bess_communication(runtime.engine, raw.bess_link), ) return runtime.emitter.publish_tick(tick) +def _bess_communication( + engine: DynamicSimulationEngine, link: BESSCommunication +) -> dict[str, BESSCommunication]: + """The link keyed by the battery the engine's config enables now. + + Empty without one, because the emitter refuses a tick that names a battery it + was not configured with, and a battery left out of the tick reads as ``OK``. + Keyed from the live config rather than the emitter, so a battery disabled + mid-run stops receiving the link on the next tick. + """ + battery = bess_config_from_engine(engine) + return {} if battery is None else {battery.instance_id: link} + + async def stop_clone(runtime: CloneRuntime, *, graceful: bool = True) -> None: """Tear down, letting the loop turn before the client goes away. diff --git a/src/panelbench/engine.py b/src/panelbench/engine.py index c0a66b5..5bfb9c8 100644 --- a/src/panelbench/engine.py +++ b/src/panelbench/engine.py @@ -17,6 +17,7 @@ import copy import random import threading +from dataclasses import dataclass from datetime import datetime from pathlib import Path from typing import TYPE_CHECKING, Any @@ -25,6 +26,7 @@ import yaml from panelbench.behavior_mutable_state import BehaviorEngineMutableState +from panelbench.bess_link import BESS_LINKS, is_bess_link from panelbench.circuit import SimulatedCircuit from panelbench.clock import SimulationClock from panelbench.config_defaults import normalize_circuit_templates @@ -32,7 +34,7 @@ from panelbench.inverter import template_inverter_type if TYPE_CHECKING: - from ebus_panel_sim import BESSDevice + from ebus_panel_sim import BESSCommunication, BESSDevice from panelbench.config_types import ( CircuitTemplateExtended, @@ -54,6 +56,18 @@ PANEL_OFF_GRID = "PANEL_OFF_GRID" +@dataclass(frozen=True, slots=True) +class EngineTick: + """One tick of the engine's driving signal, which ``publish_tick`` maps onto ``TickInputs``.""" + + current_time: float + grid_online: bool + circuits: dict[str, float] + """Signed instant power per circuit, keyed by emitter instance id.""" + bess_link: BESSCommunication + """The requested health of the panel's link to its battery.""" + + # --------------------------------------------------------------------------- # RealisticBehaviorEngine (unchanged — power modulation logic) # --------------------------------------------------------------------------- @@ -613,6 +627,9 @@ def __init__( # Grid control state self._forced_grid_offline: bool = False + # Battery link control state: what the panel reports about its link to the battery. + self._bess_link: BESSCommunication = "OK" + # Tab synchronization tracking self._tab_sync_groups: dict[int, str] = {} # tab_number -> sync_group_id self._sync_group_power: dict[str, float] = {} # sync_group_id -> total_power @@ -750,6 +767,21 @@ def set_grid_online(self, online: bool) -> None: if self._behavior_engine is not None: self._behavior_engine.set_grid_offline(not online) + @property + def bess_link(self) -> BESSCommunication: + """The requested health of the panel's link to its battery.""" + return self._bess_link + + def set_bess_link(self, link: str) -> None: + """Set the health of the panel's link to its battery, from the next tick. + + Reaches the wire only while a battery is configured, since without one + there is no link to report. + """ + if not is_bess_link(link): + raise ValueError(f"battery link must be one of {sorted(BESS_LINKS)}, got {link!r}") + self._bess_link = link + @property def is_grid_islandable(self) -> bool: """Whether PV can operate when grid is disconnected.""" @@ -848,7 +880,7 @@ def get_power_summary(self) -> dict[str, object]: Returns a dict suitable for dashboard rendering with keys: ``grid_w``, ``pv_w``, ``battery_w``, ``consumption_w``, - ``simulation_time``, ``grid_online``, ``has_battery``, + ``simulation_time``, ``grid_online``, ``has_battery``, ``bess_link``, ``is_islandable``, ``soc_pct``, ``soc_threshold``, ``shed_ids``, ``user_open_ids``, ``all_off``, ``time_zone``. """ @@ -889,6 +921,7 @@ def get_power_summary(self) -> dict[str, object]: "simulation_time": sim_time, "grid_online": self.grid_online, "has_battery": self.has_battery, + "bess_link": self._bess_link, "is_islandable": self.is_grid_islandable, "soc_pct": None, "soc_threshold": soc_threshold, @@ -904,14 +937,15 @@ def get_power_summary(self) -> dict[str, object]: # Snapshot generation # ------------------------------------------------------------------ - async def get_tick_inputs(self) -> dict[str, Any]: + async def get_tick_inputs(self) -> EngineTick: """v0.3.0 contract: return per-tick driving signal for ``Emitter.publish_tick``. - Returns a dict containing: + Returns an ``EngineTick`` containing: current_time: float (epoch seconds) grid_online: bool circuits: dict[str, float] — keyed by emitter instance_id (UUID), value is signed instant_power_w + bess_link: the requested battery link health The simulator no longer constructs panel-level fields, energy accumulators, or device snapshots — the emitter does that work.""" @@ -938,11 +972,12 @@ async def get_tick_inputs(self) -> dict[str, Any]: signed = -mag if circuit.energy_mode == "producer" else mag circuit_powers[stable_circuit_uuid(panel_id, cid)] = signed - return { - "current_time": current_time, - "grid_online": self.grid_online, - "circuits": circuit_powers, - } + return EngineTick( + current_time=current_time, + grid_online=self.grid_online, + circuits=circuit_powers, + bess_link=self._bess_link, + ) # ------------------------------------------------------------------ # Modeling computation diff --git a/src/panelbench/panel.py b/src/panelbench/panel.py index 1aa1cd4..d9d22ff 100644 --- a/src/panelbench/panel.py +++ b/src/panelbench/panel.py @@ -120,11 +120,12 @@ def _last_battery(self) -> EbusBatterySnapshot | None: def get_power_summary(self) -> dict[str, Any] | None: """Power summary in the legacy shape dashboard / HA-API consumers expect. - Live values (grid, pv, battery, consumption, SOC) are sourced from the - emitter's last snapshot — the authoritative post-redesign location for - panel state. The engine still owns the static envelope (grid_online - flag, configured battery presence, shed/override sets, recorder bounds, - clock acceleration, timezone, soc threshold).""" + Live values (grid, pv, battery, consumption, SOC, battery link) are + sourced from the emitter's last snapshot — the authoritative + post-redesign location for panel state. The engine still owns the + static envelope (grid_online flag, configured battery presence, + shed/override sets, recorder bounds, clock acceleration, timezone, soc + threshold).""" if self._engine is None: return None summary = self._engine.get_power_summary() @@ -149,6 +150,9 @@ def get_power_summary(self) -> dict[str, Any] | None: summary["soc_pct"] = ( round(batt.soe_percentage, 1) if batt.soe_percentage is not None else None ) + # What the wire published, which is what a consumer sees; the + # engine's own value is only what was asked for. + summary["bess_link"] = batt.communication or "OK" else: summary["battery_w"] = 0.0 summary["soc_pct"] = None diff --git a/tests/emitter_adapter/test_islanding_assertion.py b/tests/emitter_adapter/test_islanding_assertion.py index 71366a5..ed32f53 100644 --- a/tests/emitter_adapter/test_islanding_assertion.py +++ b/tests/emitter_adapter/test_islanding_assertion.py @@ -9,15 +9,25 @@ from __future__ import annotations +from typing import TYPE_CHECKING + import pytest from panelbench.emitter_adapter import runtime as emitter_runtime -from panelbench.emitter_adapter.runtime import CloneRuntime -from tests._helpers import DEFAULT_CONFIG, clone, published +from panelbench.emitter_adapter.runtime import ( + CloneRuntime, + bess_config_from_engine, + update_bess_config_live, +) +from tests._helpers import DEFAULT_CONFIG, clone, default_config, published, write_config + +if TYPE_CHECKING: + from pathlib import Path pytestmark = pytest.mark.asyncio _ASSERTION = "shed/asserted-islanding-state" +_LINK = "status/communication-state" def _assert(runtime: CloneRuntime, value: str) -> None: @@ -34,3 +44,50 @@ async def test_an_assertion_is_ignored_while_the_battery_link_is_healthy() -> No await emitter_runtime.publish_tick(runtime) assert published(recorder, runtime.engine.serial_number, _ASSERTION) == "NONE" + + +async def test_an_assertion_is_accepted_while_the_battery_link_is_lost() -> None: + runtime, recorder = await clone(DEFAULT_CONFIG) + await emitter_runtime.publish_tick(runtime) + + runtime.engine.set_bess_link("LOST") + await emitter_runtime.publish_tick(runtime) + _assert(runtime, "OFF_GRID") + await emitter_runtime.publish_tick(runtime) + + battery = bess_config_from_engine(runtime.engine) + assert battery is not None + assert published(recorder, battery.instance_id, _LINK) == "LOST" + assert published(recorder, runtime.engine.serial_number, _ASSERTION) == "OFF_GRID" + + +async def test_a_link_set_without_a_battery_is_not_sent(tmp_path: Path) -> None: + config = default_config() + config["bess"] = {"enabled": False} + runtime, recorder = await clone(write_config(tmp_path / "no_battery.yaml", config)) + + runtime.engine.set_bess_link("LOST") + # Naming a battery the emitter was not configured with would raise + # EmitterStateError, so without one the tick carries no link at all. + assert emitter_runtime._bess_communication(runtime.engine, "LOST") == {} + await emitter_runtime.publish_tick(runtime) + + assert not [topic for topic in recorder.retained if topic.endswith(f"/{_LINK}")] + + +async def test_a_battery_disabled_mid_run_stops_receiving_the_link() -> None: + runtime, recorder = await clone(DEFAULT_CONFIG) + battery = bess_config_from_engine(runtime.engine) + assert battery is not None + runtime.engine.set_bess_link("LOST") + await emitter_runtime.publish_tick(runtime) + assert published(recorder, battery.instance_id, _LINK) == "LOST" + + update_bess_config_live(runtime, {"enabled": False}) + + # The link is keyed from the live config, so the disabled battery gets nothing. + # The emitter keeps the battery it was built with, and one left out of the tick + # reads as OK. + assert emitter_runtime._bess_communication(runtime.engine, "LOST") == {} + await emitter_runtime.publish_tick(runtime) + assert published(recorder, battery.instance_id, _LINK) == "OK" diff --git a/tests/test_bess_link.py b/tests/test_bess_link.py new file mode 100644 index 0000000..036e9fe --- /dev/null +++ b/tests/test_bess_link.py @@ -0,0 +1,152 @@ +"""The battery link: a runtime control, carried on every tick, like the grid toggle.""" + +from __future__ import annotations + +import re +from typing import TYPE_CHECKING, get_args + +import pytest +from aiohttp.test_utils import TestClient, TestServer +from ebus_panel_sim import BESSCommunication + +from panelbench.dashboard import DashboardContext, create_dashboard_app +from panelbench.emitter_adapter import runtime as emitter_runtime +from panelbench.engine import DynamicSimulationEngine +from panelbench.panel import PanelInstance +from tests._helpers import DEFAULT_CONFIG, default_config, write_config + +if TYPE_CHECKING: + from pathlib import Path + + from aiohttp import web + +_DASHBOARD_CONFIG = """\ +panel_config: + serial_number: sim-link-0001 + total_tabs: 8 + main_size: 200 +circuit_templates: + plain: + relay_behavior: controllable + priority: OFF_GRID + breaker_rating: 20 + energy_profile: + mode: consumer + power_range: + min: 50 + max: 150 +circuits: +- id: plain + name: Plain + template: plain + tabs: [1] +""" + + +@pytest.mark.asyncio +async def test_the_tick_carries_the_requested_link() -> None: + engine = DynamicSimulationEngine(config_path=DEFAULT_CONFIG) + await engine.initialize_async() + + assert (await engine.get_tick_inputs()).bess_link == "OK" + engine.set_bess_link("LOST") + assert (await engine.get_tick_inputs()).bess_link == "LOST" + + +def test_an_unknown_link_health_is_refused() -> None: + engine = DynamicSimulationEngine(config_path=DEFAULT_CONFIG) + with pytest.raises(ValueError, match="battery link must be one of"): + engine.set_bess_link("FLAKY") + + +@pytest.mark.asyncio +async def test_the_summary_reports_the_published_link( + tmp_path: Path, amqtt_broker: tuple[str, int] +) -> None: + """The dashboard shows what the wire carries, not what was asked for: a battery + disabled mid-run is still published, out of the tick, as ``OK``.""" + host, port = amqtt_broker + config = default_config() + config["broker"] = {"host": host, "port": port} + panel = PanelInstance(write_config(tmp_path / "panel.yaml", config), tick_interval=3600) + await panel.start() + try: + assert panel.engine is not None + assert panel.runtime is not None + panel.engine.set_bess_link("LOST") + await emitter_runtime.publish_tick(panel.runtime) + summary = panel.get_power_summary() + assert summary is not None + assert summary["bess_link"] == "LOST" + + panel.update_bess_config({"enabled": False}) + await emitter_runtime.publish_tick(panel.runtime) + summary = panel.get_power_summary() + assert summary is not None + assert panel.engine.bess_link == "LOST" + assert summary["bess_link"] == "OK" + finally: + await panel.stop() + + +@pytest.fixture +def client_and_calls(tmp_path: Path) -> tuple[web.Application, list[str]]: + cfg_dir = tmp_path / "cfg" + cfg_dir.mkdir() + (cfg_dir / "panel.yaml").write_text(_DASHBOARD_CONFIG, encoding="utf-8") + calls: list[str] = [] + ctx = DashboardContext( + config_dir=cfg_dir, + config_filter="panel.yaml", + get_panel_configs=lambda: {}, + get_panel_ports=lambda: {}, + request_reload=lambda: None, + set_bess_link=calls.append, + ) + return create_dashboard_app(ctx), calls + + +@pytest.mark.asyncio +@pytest.mark.parametrize(("sent", "stored"), [("LOST", "LOST"), ("degraded", "DEGRADED")]) +async def test_the_endpoint_sets_the_link( + client_and_calls: tuple[web.Application, list[str]], sent: str, stored: str +) -> None: + app, calls = client_and_calls + async with TestClient(TestServer(app)) as client: + resp = await client.post("/set-bess-link", json={"link": sent}) + assert resp.status == 200 + assert await resp.json() == {"ok": True, "link": stored} + assert calls == [stored] + + +@pytest.mark.asyncio +async def test_an_unknown_link_never_reaches_the_engine( + client_and_calls: tuple[web.Application, list[str]], +) -> None: + app, calls = client_and_calls + async with TestClient(TestServer(app)) as client: + resp = await client.post("/set-bess-link", json={"link": "FLAKY"}) + assert resp.status == 400 + assert "FLAKY" in await resp.text() + assert calls == [] + + +@pytest.mark.asyncio +async def test_the_dashboard_offers_every_link_health( + client_and_calls: tuple[web.Application, list[str]], +) -> None: + """The control is rendered, hidden until a summary reports a battery, and its + options are exactly the emitter's link healths.""" + app, _calls = client_and_calls + async with TestClient(TestServer(app)) as client: + resp = await client.get("/") + assert resp.status == 200 + page = await resp.text() + + assert 'id="bess-link-control" style="display:none"' in page + select = re.search(r'', page, re.DOTALL) + assert select is not None, "the control renders its select" + assert set(re.findall(r'