ebus-panel-sim 0.3.0__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (66) hide show
  1. ebus_panel_sim/__init__.py +119 -0
  2. ebus_panel_sim/conventions/__init__.py +11 -0
  3. ebus_panel_sim/conventions/tab_legs.py +47 -0
  4. ebus_panel_sim/emitter.py +750 -0
  5. ebus_panel_sim/energy_integrator.py +89 -0
  6. ebus_panel_sim/exceptions.py +38 -0
  7. ebus_panel_sim/manifest.py +35 -0
  8. ebus_panel_sim/manifest_physics.py +451 -0
  9. ebus_panel_sim/native_devices/__init__.py +24 -0
  10. ebus_panel_sim/native_devices/bess.py +185 -0
  11. ebus_panel_sim/native_devices/load_shedding.py +60 -0
  12. ebus_panel_sim/native_devices/protocol.py +38 -0
  13. ebus_panel_sim/panel_meter.py +216 -0
  14. ebus_panel_sim/py.typed +0 -0
  15. ebus_panel_sim/relay_resolver.py +113 -0
  16. ebus_panel_sim/snapshot.py +301 -0
  17. ebus_panel_sim/tick_inputs.py +66 -0
  18. ebus_panel_sim/wire/__init__.py +0 -0
  19. ebus_panel_sim/wire/_sdk_seam.py +55 -0
  20. ebus_panel_sim/wire/bag_builder.py +429 -0
  21. ebus_panel_sim/wire/catalogs/breaker.json +52 -0
  22. ebus_panel_sim/wire/catalogs/charge-limit.json +37 -0
  23. ebus_panel_sim/wire/catalogs/connection.json +72 -0
  24. ebus_panel_sim/wire/catalogs/door.json +17 -0
  25. ebus_panel_sim/wire/catalogs/grid.json +38 -0
  26. ebus_panel_sim/wire/catalogs/info.json +52 -0
  27. ebus_panel_sim/wire/catalogs/load-shed.json +18 -0
  28. ebus_panel_sim/wire/catalogs/meter.json +201 -0
  29. ebus_panel_sim/wire/catalogs/pcs.json +111 -0
  30. ebus_panel_sim/wire/catalogs/power-flows.json +35 -0
  31. ebus_panel_sim/wire/catalogs/shed-forecast.json +41 -0
  32. ebus_panel_sim/wire/catalogs/shed.json +24 -0
  33. ebus_panel_sim/wire/catalogs/soc.json +35 -0
  34. ebus_panel_sim/wire/catalogs/status.json +28 -0
  35. ebus_panel_sim/wire/catalogs/switch.json +29 -0
  36. ebus_panel_sim/wire/graph_builder.py +309 -0
  37. ebus_panel_sim/wire/mapping/.gitkeep +0 -0
  38. ebus_panel_sim/wire/mapping/bess.yaml +16 -0
  39. ebus_panel_sim/wire/mapping/circuit.yaml +16 -0
  40. ebus_panel_sim/wire/mapping/evse.yaml +16 -0
  41. ebus_panel_sim/wire/mapping/lugs.yaml +16 -0
  42. ebus_panel_sim/wire/mapping/mid.yaml +16 -0
  43. ebus_panel_sim/wire/mapping/panel.yaml +15 -0
  44. ebus_panel_sim/wire/mapping/pv.yaml +16 -0
  45. ebus_panel_sim/wire/mapping_loader.py +144 -0
  46. ebus_panel_sim/wire/profile_loader.py +215 -0
  47. ebus_panel_sim/wire/profiles/.gitkeep +0 -0
  48. ebus_panel_sim/wire/profiles/bess.json +58 -0
  49. ebus_panel_sim/wire/profiles/circuit.json +88 -0
  50. ebus_panel_sim/wire/profiles/evse.json +26 -0
  51. ebus_panel_sim/wire/profiles/lugs.json +52 -0
  52. ebus_panel_sim/wire/profiles/mid.json +40 -0
  53. ebus_panel_sim/wire/profiles/panel.json +160 -0
  54. ebus_panel_sim/wire/profiles/pv.json +28 -0
  55. ebus_panel_sim/wire/profiles/span/circuit.json +19 -0
  56. ebus_panel_sim/wire/profiles/span/evse.json +52 -0
  57. ebus_panel_sim/wire/profiles/span/lugs.json +16 -0
  58. ebus_panel_sim/wire/profiles/span/panel.json +77 -0
  59. ebus_panel_sim/wire/property_bag.py +56 -0
  60. ebus_panel_sim/wire/publisher.py +36 -0
  61. ebus_panel_sim/wire/set_router.py +122 -0
  62. ebus_panel_sim-0.3.0.dist-info/METADATA +14 -0
  63. ebus_panel_sim-0.3.0.dist-info/RECORD +66 -0
  64. ebus_panel_sim-0.3.0.dist-info/WHEEL +4 -0
  65. ebus_panel_sim-0.3.0.dist-info/licenses/AUTHORS +7 -0
  66. ebus_panel_sim-0.3.0.dist-info/licenses/LICENSE +21 -0
@@ -0,0 +1,52 @@
1
+ {
2
+ "$schema": "https://ebus.energy/schemas/property-catalog.json",
3
+ "schema_version": "property-schema-v1",
4
+ "kind": "capability-catalog",
5
+ "capability": "energy.ebus.capability.info",
6
+ "version": "0.2",
7
+ "status": "DRAFT",
8
+ "date": "2026-07-30",
9
+ "properties": {
10
+ "vendor-name": {
11
+ "datatype": "string",
12
+ "req": "SHOULD",
13
+ "description": "Manufacturer name (e.g., \"SPAN\", \"Tesla\", \"Rheem\")."
14
+ },
15
+ "serial-number": {
16
+ "datatype": "string",
17
+ "req": "SHOULD",
18
+ "description": "Device serial number."
19
+ },
20
+ "model": {
21
+ "datatype": "string",
22
+ "req": "SHOULD",
23
+ "description": "The human-facing model or product designation, the name a person recognizes (e.g., `Powerwall 3`, `IQ Battery 5P`, or a configuration code such as `MAIN_32`). This is the display designation, not the orderable part code (that is `part-number`). The valid set is publisher-defined and MAY be advertised via Homie `$format` on the property."
24
+ },
25
+ "part-number": {
26
+ "datatype": "string",
27
+ "req": "MAY",
28
+ "description": "The vendor's orderable part or SKU code (e.g., Tesla `1232100-00-E`): the specific hardware variant beneath `model`, finer-grained so distinct part numbers (packaging, regional, or minor-revision variants) can share one `model`. A publisher that has both a coded identifier and a human-facing name publishes the code here and the designation in `model`, not a separate product-name property."
29
+ },
30
+ "hardware-version": {
31
+ "datatype": "string",
32
+ "req": "MAY",
33
+ "description": "Hardware revision."
34
+ },
35
+ "firmware-version": {
36
+ "datatype": "string",
37
+ "req": "SHOULD",
38
+ "description": "Firmware version. Published when the device has firmware; a bare or surveyed device (e.g., a dumb load center) omits it."
39
+ },
40
+ "data-model-version": {
41
+ "datatype": "string",
42
+ "req": "SHOULD",
43
+ "description": "Version of the eBus data model this device publishes (e.g., `\"1.0\"`)."
44
+ },
45
+ "nameplate-capacity": {
46
+ "datatype": "float",
47
+ "unit": "energy",
48
+ "req": "MAY",
49
+ "description": "Rated nameplate energy capacity, a term of art for energy-storage devices, reported in the device's native energy unit (a BESS in kWh electrical, a storage water heater in Wh thermal) via `$unit`. It is the static manufacturer rating: `soc` is roughly `soe` / `nameplate-capacity`, while the precise, dynamic denominator is `soc`'s `total-energy-storage` (which diverges from the nameplate figure as the reservoir degrades). Energy-storage device types (BESS, thermal storage) SHOULD publish it; power-rated devices (PV, inverter, EVSE) publish rated power via `nominal-power` instead."
50
+ }
51
+ }
52
+ }
@@ -0,0 +1,18 @@
1
+ {
2
+ "$schema": "https://ebus.energy/schemas/property-catalog.json",
3
+ "schema_version": "property-schema-v1",
4
+ "kind": "capability-catalog",
5
+ "capability": "energy.ebus.capability.load-shed",
6
+ "version": "0.3",
7
+ "status": "DRAFT",
8
+ "date": "2026-07-30",
9
+ "properties": {
10
+ "priority": {
11
+ "datatype": "enum",
12
+ "format": "UNKNOWN,NEVER,OFF_GRID,SOC_THRESHOLD",
13
+ "settable": true,
14
+ "req": "SHOULD",
15
+ "description": "The circuit's shedding class. Baseline (every host): `UNKNOWN`, `NEVER`, `OFF_GRID`. Optional additional triggers are advertised in the property's `$format`: `SOC_THRESHOLD` and future spec- or vendor-defined values."
16
+ }
17
+ }
18
+ }
@@ -0,0 +1,201 @@
1
+ {
2
+ "$schema": "https://ebus.energy/schemas/property-catalog.json",
3
+ "schema_version": "property-schema-v1",
4
+ "kind": "capability-catalog",
5
+ "capability": "energy.ebus.capability.meter",
6
+ "version": "0.2",
7
+ "status": "DRAFT",
8
+ "date": "2026-07-31",
9
+ "properties": {
10
+ "active-power": {
11
+ "datatype": "float",
12
+ "unit": "W",
13
+ "req": "MAY",
14
+ "description": "Total active power. Sign per the reference-direction rule below."
15
+ },
16
+ "reactive-power": {
17
+ "datatype": "float",
18
+ "unit": "var",
19
+ "req": "MAY",
20
+ "description": "Total reactive power."
21
+ },
22
+ "apparent-power": {
23
+ "datatype": "float",
24
+ "unit": "VA",
25
+ "req": "MAY",
26
+ "description": "Total apparent power."
27
+ },
28
+ "power-factor": {
29
+ "datatype": "float",
30
+ "format": "-1.0:1.0",
31
+ "req": "MAY",
32
+ "description": "System power factor, signed: positive = lagging (inductive), negative = leading (capacitive); range `[-1.0, 1.0]`."
33
+ },
34
+ "frequency": {
35
+ "datatype": "float",
36
+ "unit": "Hz",
37
+ "req": "MAY",
38
+ "description": "Line frequency."
39
+ },
40
+ "voltage": {
41
+ "datatype": "float",
42
+ "unit": "V",
43
+ "req": "MAY",
44
+ "description": "RMS voltage at a single-point meter (one measured conductor, e.g. a branch circuit or a device's single AC boundary). A split-phase or three-phase meter uses the per-conductor `voltage-{a,b,c}` instead."
45
+ },
46
+ "current": {
47
+ "datatype": "float",
48
+ "unit": "A",
49
+ "req": "MAY",
50
+ "description": "RMS current at a single-point meter (one measured conductor). A split-phase or three-phase meter uses the per-conductor `current-{a,b,c,n}` instead."
51
+ },
52
+ "imported-energy": {
53
+ "datatype": "float",
54
+ "unit": "Wh",
55
+ "req": "MAY",
56
+ "description": "Cumulative active energy imported: the energy counterpart of positive `active-power` (into the metered device / consumption in the default frame; which register accrues follows the reference-direction rule below). Monotonically non-decreasing."
57
+ },
58
+ "exported-energy": {
59
+ "datatype": "float",
60
+ "unit": "Wh",
61
+ "req": "MAY",
62
+ "description": "Cumulative active energy exported: the energy counterpart of negative `active-power` (out of the metered device / production or backfeed in the default frame; which register accrues follows the reference-direction rule below). Monotonically non-decreasing."
63
+ },
64
+ "imported-reactive-energy": {
65
+ "datatype": "float",
66
+ "unit": "varh",
67
+ "req": "MAY",
68
+ "description": "Cumulative reactive energy imported."
69
+ },
70
+ "exported-reactive-energy": {
71
+ "datatype": "float",
72
+ "unit": "varh",
73
+ "req": "MAY",
74
+ "description": "Cumulative reactive energy exported."
75
+ },
76
+ "apparent-energy-imported": {
77
+ "datatype": "float",
78
+ "unit": "VAh",
79
+ "req": "MAY",
80
+ "description": "Cumulative apparent energy imported."
81
+ },
82
+ "apparent-energy-exported": {
83
+ "datatype": "float",
84
+ "unit": "VAh",
85
+ "req": "MAY",
86
+ "description": "Cumulative apparent energy exported."
87
+ }
88
+ },
89
+ "property_patterns": {
90
+ "voltage-{a,b,c}": {
91
+ "datatype": "float",
92
+ "unit": "V",
93
+ "req": "MAY",
94
+ "description": "RMS voltage on the named phase, line-to-neutral (or line-to-virtual-neutral on a delta service).",
95
+ "expand": [
96
+ "a",
97
+ "b",
98
+ "c"
99
+ ]
100
+ },
101
+ "current-{a,b,c,n}": {
102
+ "datatype": "float",
103
+ "unit": "A",
104
+ "req": "MAY",
105
+ "description": "RMS current on the named conductor. Neutral current (`current-n`) may be measured or imputed.",
106
+ "expand": [
107
+ "a",
108
+ "b",
109
+ "c",
110
+ "n"
111
+ ]
112
+ },
113
+ "active-power-{a,b,c}": {
114
+ "datatype": "float",
115
+ "unit": "W",
116
+ "req": "MAY",
117
+ "description": "Per-phase active power. Sign matches the system `active-power`.",
118
+ "expand": [
119
+ "a",
120
+ "b",
121
+ "c"
122
+ ]
123
+ },
124
+ "reactive-power-{a,b,c}": {
125
+ "datatype": "float",
126
+ "unit": "var",
127
+ "req": "MAY",
128
+ "description": "Per-phase reactive power.",
129
+ "expand": [
130
+ "a",
131
+ "b",
132
+ "c"
133
+ ]
134
+ },
135
+ "apparent-power-{a,b,c}": {
136
+ "datatype": "float",
137
+ "unit": "VA",
138
+ "req": "MAY",
139
+ "description": "Per-phase apparent power.",
140
+ "expand": [
141
+ "a",
142
+ "b",
143
+ "c"
144
+ ]
145
+ },
146
+ "power-factor-{a,b,c}": {
147
+ "datatype": "float",
148
+ "req": "MAY",
149
+ "description": "Per-phase power factor, signed as for the system value.",
150
+ "expand": [
151
+ "a",
152
+ "b",
153
+ "c"
154
+ ]
155
+ },
156
+ "voltage-angle-{a,b,c}": {
157
+ "datatype": "float",
158
+ "unit": "°",
159
+ "req": "MAY",
160
+ "description": "Voltage angle relative to phase-A voltage (`voltage-angle-a` = `0`).",
161
+ "expand": [
162
+ "a",
163
+ "b",
164
+ "c"
165
+ ]
166
+ },
167
+ "current-angle-{a,b,c}": {
168
+ "datatype": "float",
169
+ "unit": "°",
170
+ "req": "MAY",
171
+ "description": "Current angle relative to the same-phase voltage.",
172
+ "expand": [
173
+ "a",
174
+ "b",
175
+ "c"
176
+ ]
177
+ },
178
+ "imported-energy-{a,b,c}": {
179
+ "datatype": "float",
180
+ "unit": "Wh",
181
+ "req": "MAY",
182
+ "description": "Per-conductor cumulative imported energy.",
183
+ "expand": [
184
+ "a",
185
+ "b",
186
+ "c"
187
+ ]
188
+ },
189
+ "exported-energy-{a,b,c}": {
190
+ "datatype": "float",
191
+ "unit": "Wh",
192
+ "req": "MAY",
193
+ "description": "Per-conductor cumulative exported energy.",
194
+ "expand": [
195
+ "a",
196
+ "b",
197
+ "c"
198
+ ]
199
+ }
200
+ }
201
+ }
@@ -0,0 +1,111 @@
1
+ {
2
+ "$schema": "https://ebus.energy/schemas/property-catalog.json",
3
+ "schema_version": "property-schema-v1",
4
+ "kind": "capability-catalog",
5
+ "capability": "energy.ebus.capability.pcs",
6
+ "version": "0.3",
7
+ "status": "DRAFT",
8
+ "date": "2026-07-14",
9
+ "properties": {
10
+ "enabled": {
11
+ "datatype": "boolean",
12
+ "req": "SHOULD",
13
+ "description": "Is the PCS enabled on this enclosure?"
14
+ },
15
+ "active": {
16
+ "datatype": "boolean",
17
+ "req": "SHOULD",
18
+ "description": "Is the PCS actively limiting import right now?"
19
+ },
20
+ "import-limit": {
21
+ "datatype": "float",
22
+ "unit": "A",
23
+ "req": "SHOULD",
24
+ "description": "The **effective** enforced import limit: the `min()` across all active constraints reconciled to amps (the amps-native limits below, plus the reconciled `doe` and `voltage-response`)."
25
+ },
26
+ "binding-constraint": {
27
+ "datatype": "enum",
28
+ "format": "FSR,DOE,VOLTAGE,OFF_GRID,REQUESTED,OPERATOR,NONE,UNKNOWN",
29
+ "req": "SHOULD",
30
+ "description": "Which constraint class currently sets `import-limit`: `FSR`, `DOE`, `VOLTAGE`, `OFF_GRID`, `REQUESTED`, `OPERATOR`, `NONE`, `UNKNOWN`. The provenance of the enforced limit; publishers MAY extend via `$format` (see the note on vendor-specific sources below)."
31
+ },
32
+ "feed-import-limit": {
33
+ "datatype": "float",
34
+ "unit": "A",
35
+ "req": "SHOULD",
36
+ "description": "The **FSR**: commissioned firm feed / service capacity (premises-equipment protection), set at install. The always-on floor. May be less than the main-breaker rating when the upstream feed conductor is smaller (e.g. a 200 A panel on a 100 A service feed publishes `feed-import-limit = 100`)."
37
+ },
38
+ "feed-import-limit-enablement": {
39
+ "datatype": "enum",
40
+ "format": "UNSPECIFIED,UNCONFIGURED,DISABLED,ENABLED",
41
+ "req": "SHOULD",
42
+ "description": "`UNSPECIFIED`, `UNCONFIGURED`, `DISABLED`, `ENABLED`."
43
+ },
44
+ "feed-import-limit-active": {
45
+ "datatype": "boolean",
46
+ "req": "SHOULD",
47
+ "description": "Is this constraint currently enforcing (enabled **and** its activation conditions met)? Distinct from `binding-constraint`: several constraints may be active at once, but only the most restrictive is binding."
48
+ },
49
+ "off-grid-import-limit": {
50
+ "datatype": "float",
51
+ "unit": "A",
52
+ "req": "MAY",
53
+ "description": "Import cap when islanded (from BESS / DER)."
54
+ },
55
+ "off-grid-import-limit-enablement": {
56
+ "datatype": "enum",
57
+ "format": "UNSPECIFIED,UNCONFIGURED,DISABLED,ENABLED",
58
+ "req": "MAY",
59
+ "description": "Same domain."
60
+ },
61
+ "off-grid-import-limit-active": {
62
+ "datatype": "boolean",
63
+ "req": "MAY",
64
+ "description": "Typically active only while islanded. See `feed-import-limit-active`."
65
+ },
66
+ "requested-import-limit": {
67
+ "datatype": "float",
68
+ "unit": "A",
69
+ "req": "MAY",
70
+ "description": "A **voluntary**, self-imposed temporary limit requested by the homeowner or installer (e.g. via a mobile app). Self-revocable. Distinct from an externally imposed operator cap (`operator-import-limit`) and from the utility grid envelope (`doe`)."
71
+ },
72
+ "requested-import-limit-enablement": {
73
+ "datatype": "enum",
74
+ "format": "UNSPECIFIED,UNCONFIGURED,DISABLED,ENABLED",
75
+ "req": "MAY",
76
+ "description": "Same domain."
77
+ },
78
+ "requested-import-limit-active": {
79
+ "datatype": "boolean",
80
+ "req": "MAY",
81
+ "description": "See `feed-import-limit-active`."
82
+ },
83
+ "operator-import-limit": {
84
+ "datatype": "float",
85
+ "unit": "A",
86
+ "req": "MAY",
87
+ "description": "An **externally imposed** cap set by a fleet / aggregator operator over a management API (a DER aggregator, VPP, or utility program acting through the vendor's fleet REST interface). Persists until the operator changes or clears it. Distinct from `requested-import-limit` (self-imposed) and from `doe` (the standardized IEEE 2030.5 / CSIP watts envelope): `operator-import-limit` is a vendor-API amps cap, not a CSIP DOE."
88
+ },
89
+ "operator-import-limit-enablement": {
90
+ "datatype": "enum",
91
+ "format": "UNSPECIFIED,UNCONFIGURED,DISABLED,ENABLED",
92
+ "req": "MAY",
93
+ "description": "Same domain."
94
+ },
95
+ "operator-import-limit-active": {
96
+ "datatype": "boolean",
97
+ "req": "MAY",
98
+ "description": "See `feed-import-limit-active`."
99
+ },
100
+ "managed": {
101
+ "datatype": "boolean",
102
+ "req": "MAY",
103
+ "description": "Is this circuit managed by the host's PCS?"
104
+ },
105
+ "priority": {
106
+ "datatype": "integer",
107
+ "req": "MAY",
108
+ "description": "PCS priority ranking, consulted when an active import limit is binding (which circuits shed first)."
109
+ }
110
+ }
111
+ }
@@ -0,0 +1,35 @@
1
+ {
2
+ "$schema": "https://ebus.energy/schemas/property-catalog.json",
3
+ "schema_version": "property-schema-v1",
4
+ "kind": "capability-catalog",
5
+ "capability": "energy.ebus.capability.power-flows",
6
+ "version": "0.1",
7
+ "status": "DRAFT",
8
+ "date": "2026-07-11",
9
+ "properties": {
10
+ "grid": {
11
+ "datatype": "float",
12
+ "unit": "W",
13
+ "req": "SHOULD",
14
+ "description": "Grid power flow (positive = importing from grid)."
15
+ },
16
+ "battery": {
17
+ "datatype": "float",
18
+ "unit": "W",
19
+ "req": "SHOULD",
20
+ "description": "Battery power flow (positive = discharging)."
21
+ },
22
+ "pv": {
23
+ "datatype": "float",
24
+ "unit": "W",
25
+ "req": "SHOULD",
26
+ "description": "Solar PV power flow (positive = producing)."
27
+ },
28
+ "site": {
29
+ "datatype": "float",
30
+ "unit": "W",
31
+ "req": "SHOULD",
32
+ "description": "Total site power consumption."
33
+ }
34
+ }
35
+ }
@@ -0,0 +1,41 @@
1
+ {
2
+ "$schema": "https://ebus.energy/schemas/property-catalog.json",
3
+ "schema_version": "property-schema-v1",
4
+ "kind": "capability-catalog",
5
+ "capability": "energy.ebus.capability.shed-forecast",
6
+ "version": "0.1",
7
+ "status": "DRAFT",
8
+ "date": "2026-07-11",
9
+ "properties": {
10
+ "total-time-remaining": {
11
+ "datatype": "integer",
12
+ "unit": "min",
13
+ "req": "SHOULD",
14
+ "description": "At current state of energy, total time before all backed-up loads go unpowered."
15
+ },
16
+ "time-to-priority-shed": {
17
+ "datatype": "integer",
18
+ "unit": "min",
19
+ "req": "SHOULD",
20
+ "description": "At current state of energy, time until priority-shed (e.g. `SOC_THRESHOLD`) circuits are auto-shed."
21
+ },
22
+ "full-charge-total-time-remaining": {
23
+ "datatype": "integer",
24
+ "unit": "min",
25
+ "req": "SHOULD",
26
+ "description": "At 100% state of energy, total backup-duration capability."
27
+ },
28
+ "full-charge-time-to-priority-shed": {
29
+ "datatype": "integer",
30
+ "unit": "min",
31
+ "req": "SHOULD",
32
+ "description": "At 100% state of energy, capability time until the priority-shed event."
33
+ },
34
+ "confidence": {
35
+ "datatype": "enum",
36
+ "format": "LOW,MEDIUM,HIGH",
37
+ "req": "SHOULD",
38
+ "description": "The algorithm's self-assessed confidence: `LOW`, `MEDIUM`, `HIGH`. Reflects accumulated usage history."
39
+ }
40
+ }
41
+ }
@@ -0,0 +1,24 @@
1
+ {
2
+ "$schema": "https://ebus.energy/schemas/property-catalog.json",
3
+ "schema_version": "property-schema-v1",
4
+ "kind": "capability-catalog",
5
+ "capability": "energy.ebus.capability.shed",
6
+ "version": "0.2",
7
+ "status": "DRAFT",
8
+ "date": "2026-07-30",
9
+ "properties": {
10
+ "asserted-islanding-state": {
11
+ "datatype": "enum",
12
+ "format": "NONE,ON_GRID,OFF_GRID",
13
+ "settable": true,
14
+ "req": "MAY",
15
+ "description": "Consumer-asserted islanding-state for the host's own island scope, consulted only while the host has lost or degraded communication with the device that senses that state (its MID / BESS). Advertised in `$format` as `NONE`, `ON_GRID`, `OFF_GRID` (default `NONE`). See \"Asserted islanding-state\" below."
16
+ },
17
+ "policy": {
18
+ "datatype": "json",
19
+ "settable": true,
20
+ "req": "MAY",
21
+ "description": "The host's shedding algorithm and its parameters: `{ \"algorithm\": <id>, \"parameters\": { … } }`. The parameter object's shape is advertised as a JSON Schema in the property's `$format`. See \"Shed policy\" below."
22
+ }
23
+ }
24
+ }
@@ -0,0 +1,35 @@
1
+ {
2
+ "$schema": "https://ebus.energy/schemas/property-catalog.json",
3
+ "schema_version": "property-schema-v1",
4
+ "kind": "capability-catalog",
5
+ "capability": "energy.ebus.capability.soc",
6
+ "version": "0.1",
7
+ "status": "DRAFT",
8
+ "date": "2026-07-11",
9
+ "properties": {
10
+ "soc": {
11
+ "datatype": "float",
12
+ "unit": "%",
13
+ "req": "MAY",
14
+ "description": "State of charge: the fraction of capacity currently held (`0` = empty, `100` = full). A dimensionless ratio, comparable across all reservoirs."
15
+ },
16
+ "soe": {
17
+ "datatype": "float",
18
+ "unit": "energy",
19
+ "req": "MAY",
20
+ "description": "State of energy: the energy currently stored and available to draw (the discharge side). Reported in the device's native energy unit (a BESS in kWh electrical, a water heater in Wh thermal)."
21
+ },
22
+ "total-energy-storage": {
23
+ "datatype": "float",
24
+ "unit": "energy",
25
+ "req": "MAY",
26
+ "description": "The reservoir's total energy capacity (empty to full), in the same unit as `soe`."
27
+ },
28
+ "loadup-headroom": {
29
+ "datatype": "float",
30
+ "unit": "energy",
31
+ "req": "MAY",
32
+ "description": "The energy the reservoir can absorb **now** (the charge side), approximately `total-energy-storage − soe`. The dispatchable charge a load-up / charge action can take on."
33
+ }
34
+ }
35
+ }
@@ -0,0 +1,28 @@
1
+ {
2
+ "$schema": "https://ebus.energy/schemas/property-catalog.json",
3
+ "schema_version": "property-schema-v1",
4
+ "kind": "capability-catalog",
5
+ "capability": "energy.ebus.capability.status",
6
+ "version": "0.1",
7
+ "status": "DRAFT",
8
+ "date": "2026-07-11",
9
+ "properties": {
10
+ "fault-state": {
11
+ "datatype": "enum",
12
+ "format": "OK,FAULT,UNKNOWN",
13
+ "req": "MAY",
14
+ "description": "Overall fault state: `OK`, `FAULT`, `UNKNOWN`. Publishers MAY extend the value set via `$format` for device-specific fault categories."
15
+ },
16
+ "communication-state": {
17
+ "datatype": "enum",
18
+ "format": "OK,DEGRADED,LOST,UNKNOWN",
19
+ "req": "MAY",
20
+ "description": "The publisher's view of its own communication / link health, to the device it represents (for a proxy) or to its backhaul (for a native device): `OK`, `DEGRADED`, `LOST`, `UNKNOWN`. Orthogonal to whether the eBus publisher is currently reporting to *its* consumers."
21
+ },
22
+ "active-alerts": {
23
+ "datatype": "string",
24
+ "req": "MAY",
25
+ "description": "Human-readable current alert(s), when the device exposes them."
26
+ }
27
+ }
28
+ }
@@ -0,0 +1,29 @@
1
+ {
2
+ "$schema": "https://ebus.energy/schemas/property-catalog.json",
3
+ "schema_version": "property-schema-v1",
4
+ "kind": "capability-catalog",
5
+ "capability": "energy.ebus.capability.switch",
6
+ "version": "0.1",
7
+ "status": "DRAFT",
8
+ "date": "2026-07-05",
9
+ "properties": {
10
+ "relay": {
11
+ "datatype": "enum",
12
+ "format": "OPEN,CLOSED,UNKNOWN",
13
+ "settable": true,
14
+ "req": "MUST",
15
+ "description": "Relay state: `OPEN`, `CLOSED`, `UNKNOWN`. Settable when `relay-controllable = true`."
16
+ },
17
+ "relay-controllable": {
18
+ "datatype": "boolean",
19
+ "req": "SHOULD",
20
+ "description": "True = the relay can be opened and closed by command or automatic shed. False = locked (for example a circuit commissioned as permanently on)."
21
+ },
22
+ "relay-requester": {
23
+ "datatype": "enum",
24
+ "format": "USER,LOAD_SHED,PCS,CONFIGURATION,FAULT,NONE,UNKNOWN",
25
+ "req": "SHOULD",
26
+ "description": "Source attribution for the last relay change: `USER`, `LOAD_SHED`, `PCS`, `CONFIGURATION`, `FAULT`, `NONE`, `UNKNOWN`. Publishers MAY extend via `$format`."
27
+ }
28
+ }
29
+ }