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'