span-panel-api-schema-1
The parent/child schema parser for span-panel-api: the multi-device Homie tree published by SPAN firmware r202633+, which reports data-model-version 1.x.
Why this is a separate distribution
span-panel-api is a transport and a dispatcher. It knows how to connect to a panel's MQTT broker, route messages, and choose a parser — but it contains no parsing code. Each wire format ships as its own distribution and registers itself under the
span_panel_api.schema_adapters entry-point group, so the bootstrap never imports this package until a panel asks for it by name.
The split matters more here than anywhere else in the workspace: this parser depends on the eBus SDK to turn the tree back into devices, and that dependency is this distribution's alone. A flat-panel install never pulls it in.
Installation
pip install "span-panel-api[schema-1]"
Installing this package is what makes parent/child panels work. span-panel-api on its own will connect and then raise SpanPanelAdapterMissingError naming the adapter it could not find.
A consumer that wants to support panels on either schema installs both adapters, and dispatch happens at runtime, per panel, from the data-model-version the panel reports:
pip install "span-panel-api[schema-0,schema-1]"
What it parses
SchemaOneAdapter maps the device tree onto the same SpanPanelSnapshot the flat adapter produces — circuits, both lugs devices, the BESS, PV and EVSE — plus the surface that only exists under the parent/child model:
- The MID (
SpanPanelSnapshot.mid). The enclosure model puts thegridcapability on a Microgrid Interconnect Device rather than on the enclosure, so islanding state, grid state and the grid-forming entity live there. - Adopted devices (
SpanPanelSnapshot.adopted_devices). A device type this parser models nothing for is reported whole — identity and readings — rather than dropped. The schema is explicitly vendor-extensible, so an unmodelled device is an expected arrival rather than a hypothetical one. - Extension properties (
SpanPanelSnapshot.extension_properties). A vendor property on a device this parser does model, carried with its value and the snapshot subject it hangs off.
Devices are sorted by declared device type, never by device id. Field metadata comes from each device's own $description rather than from a schema document, because the same capability exposes different properties on different device classes — meter is
voltage on the panel, power and energy on a circuit, and both currents on the lugs.
ControllerRoutes is how the eBus SDK reaches the panel without opening its own connection: it is an ebus_sdk.MqttControllerTransport that records Controller's subscriptions instead of making them, so a single wildcard subscription owned by
span-panel-api's transport covers the whole tree and each message is routed to whichever SDK callback asked for it.
Conformance
spec_lock.json ships with the package and records what this parser targets: the firmware range, the eBus specification commit its vocabulary was read from, and the version of every capability, device and registry it implements. The capability catalogs it
addresses are byte-copied under spec/.
Those copies exist to be checked against, never parsed in production — units and datatypes come from each device's $description, since a catalog is the superset across all hardware rather than a statement about the panel in front of you. The suite
asks the consumer's question rather than the publisher's: is every name this adapter reads one the specification defines? A consumer addressing a name that no longer exists does not fail loudly, it goes quiet — the property never arrives, metadata lookup
returns None, and an entity disappears.
Reference payloads
A retained-topic capture of a full 40-space parent/child panel, and the replay that turns it back into devices, are fixtures of the repository's test suite at tests/reference_payloads/.
span_panel_api_schema_1.reference_payloads no longer exists. It was package data until 1.1.0 — carried in this wheel because it sat inside the package directory, though no runtime path read it. A consumer that was importing it should vendor the bytes
it needs and record the release it took them from, asserting that against importlib.metadata.version("span-panel-api-schema-1") so a moved pin that outruns the copy fails loudly instead of testing against a tree no panel publishes.
Release files for span-panel-api-schema-1 1.1.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| span_panel_api_schema_1-1.1.0.tar.gz | 100.0 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| span_panel_api_schema_1-1.1.0-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 176.9 kB
Release files / span_panel_api_schema_1-1.1.0.tar.gz
| Download URL | span_panel_api_schema_1-1.1.0.tar.gz |
|---|---|
| Size | 100.0 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
a8604f7e42a0327e87bd5ca5684cc695365fe0ae497d33833a6e90e5fe04f187
|
|
BLAKE2b-256 checksum How to use checksums |
32477f5ae153b03b8ca6fcd33b70a3de7e3b9f83c2f2cc633836b5297957a5ab
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Aug 26, 2026.
Transparency logRelease files / span_panel_api_schema_1-1.1.0-py3-none-any.whl
| Download URL | span_panel_api_schema_1-1.1.0-py3-none-any.whl |
|---|---|
| Size | 77.0 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
8627b790ebea45cf36b34df48c2a6b21d54141c13a097cbe49ef5bff447d3e28
|
|
BLAKE2b-256 checksum How to use checksums |
314ad7635c2eee3cee7018c18efd889165b7218e877dc580a43666d8c9248a03
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Aug 26, 2026.
Transparency log