span-panel-api 3.0.0b10__tar.gz → 3.0.0b11__tar.gz

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 (85) hide show
  1. {span_panel_api-3.0.0b10 → span_panel_api-3.0.0b11}/CHANGELOG.md +4 -0
  2. {span_panel_api-3.0.0b10 → span_panel_api-3.0.0b11}/PKG-INFO +1 -1
  3. {span_panel_api-3.0.0b10 → span_panel_api-3.0.0b11}/pyproject.toml +1 -1
  4. {span_panel_api-3.0.0b10 → span_panel_api-3.0.0b11}/tests/test_schema_one_panel.py +33 -1
  5. {span_panel_api-3.0.0b10 → span_panel_api-3.0.0b11}/.gitignore +0 -0
  6. {span_panel_api-3.0.0b10 → span_panel_api-3.0.0b11}/LICENSE +0 -0
  7. {span_panel_api-3.0.0b10 → span_panel_api-3.0.0b11}/README.md +0 -0
  8. {span_panel_api-3.0.0b10 → span_panel_api-3.0.0b11}/src/span_panel_api/__init__.py +0 -0
  9. {span_panel_api-3.0.0b10 → span_panel_api-3.0.0b11}/src/span_panel_api/_http.py +0 -0
  10. {span_panel_api-3.0.0b10 → span_panel_api-3.0.0b11}/src/span_panel_api/adapters.py +0 -0
  11. {span_panel_api-3.0.0b10 → span_panel_api-3.0.0b11}/src/span_panel_api/auth.py +0 -0
  12. {span_panel_api-3.0.0b10 → span_panel_api-3.0.0b11}/src/span_panel_api/const.py +0 -0
  13. {span_panel_api-3.0.0b10 → span_panel_api-3.0.0b11}/src/span_panel_api/detection.py +0 -0
  14. {span_panel_api-3.0.0b10 → span_panel_api-3.0.0b11}/src/span_panel_api/dispatch.py +0 -0
  15. {span_panel_api-3.0.0b10 → span_panel_api-3.0.0b11}/src/span_panel_api/exceptions.py +0 -0
  16. {span_panel_api-3.0.0b10 → span_panel_api-3.0.0b11}/src/span_panel_api/factory.py +0 -0
  17. {span_panel_api-3.0.0b10 → span_panel_api-3.0.0b11}/src/span_panel_api/models.py +0 -0
  18. {span_panel_api-3.0.0b10 → span_panel_api-3.0.0b11}/src/span_panel_api/mqtt/__init__.py +0 -0
  19. {span_panel_api-3.0.0b10 → span_panel_api-3.0.0b11}/src/span_panel_api/mqtt/async_client.py +0 -0
  20. {span_panel_api-3.0.0b10 → span_panel_api-3.0.0b11}/src/span_panel_api/mqtt/client.py +0 -0
  21. {span_panel_api-3.0.0b10 → span_panel_api-3.0.0b11}/src/span_panel_api/mqtt/connection.py +0 -0
  22. {span_panel_api-3.0.0b10 → span_panel_api-3.0.0b11}/src/span_panel_api/mqtt/const.py +0 -0
  23. {span_panel_api-3.0.0b10 → span_panel_api-3.0.0b11}/src/span_panel_api/mqtt/models.py +0 -0
  24. {span_panel_api-3.0.0b10 → span_panel_api-3.0.0b11}/src/span_panel_api/phase_validation.py +0 -0
  25. {span_panel_api-3.0.0b10 → span_panel_api-3.0.0b11}/src/span_panel_api/protocol.py +0 -0
  26. {span_panel_api-3.0.0b10 → span_panel_api-3.0.0b11}/src/span_panel_api/py.typed +0 -0
  27. {span_panel_api-3.0.0b10 → span_panel_api-3.0.0b11}/src/span_panel_api/reference_payloads/README.md +0 -0
  28. {span_panel_api-3.0.0b10 → span_panel_api-3.0.0b11}/src/span_panel_api/reference_payloads/__init__.py +0 -0
  29. {span_panel_api-3.0.0b10 → span_panel_api-3.0.0b11}/src/span_panel_api/reference_payloads/homie_schema.json +0 -0
  30. {span_panel_api-3.0.0b10 → span_panel_api-3.0.0b11}/src/span_panel_api/schema_drift.py +0 -0
  31. {span_panel_api-3.0.0b10 → span_panel_api-3.0.0b11}/tests/conftest.py +0 -0
  32. {span_panel_api-3.0.0b10 → span_panel_api-3.0.0b11}/tests/fixtures/configs/simulation_config_32_circuit.yaml +0 -0
  33. {span_panel_api-3.0.0b10 → span_panel_api-3.0.0b11}/tests/fixtures/configs/simulation_config_40_circuit_with_battery.yaml +0 -0
  34. {span_panel_api-3.0.0b10 → span_panel_api-3.0.0b11}/tests/fixtures/configs/simulation_config_8_tab_workshop.yaml +0 -0
  35. {span_panel_api-3.0.0b10 → span_panel_api-3.0.0b11}/tests/fixtures/flat_wire.json +0 -0
  36. {span_panel_api-3.0.0b10 → span_panel_api-3.0.0b11}/tests/fixtures/panelbench_unvalued_by_both.json +0 -0
  37. {span_panel_api-3.0.0b10 → span_panel_api-3.0.0b11}/tests/fixtures/v2/README.md +0 -0
  38. {span_panel_api-3.0.0b10 → span_panel_api-3.0.0b11}/tests/fixtures/v2/status.json +0 -0
  39. {span_panel_api-3.0.0b10 → span_panel_api-3.0.0b11}/tests/simulation_fixtures/circuits.response.txt +0 -0
  40. {span_panel_api-3.0.0b10 → span_panel_api-3.0.0b11}/tests/simulation_fixtures/panel.response.txt +0 -0
  41. {span_panel_api-3.0.0b10 → span_panel_api-3.0.0b11}/tests/simulation_fixtures/soe.response.txt +0 -0
  42. {span_panel_api-3.0.0b10 → span_panel_api-3.0.0b11}/tests/simulation_fixtures/status.response.txt +0 -0
  43. {span_panel_api-3.0.0b10 → span_panel_api-3.0.0b11}/tests/test_accumulator.py +0 -0
  44. {span_panel_api-3.0.0b10 → span_panel_api-3.0.0b11}/tests/test_adapters_discovery.py +0 -0
  45. {span_panel_api-3.0.0b10 → span_panel_api-3.0.0b11}/tests/test_adopted_control.py +0 -0
  46. {span_panel_api-3.0.0b10 → span_panel_api-3.0.0b11}/tests/test_adoption.py +0 -0
  47. {span_panel_api-3.0.0b10 → span_panel_api-3.0.0b11}/tests/test_async_mqtt_client.py +0 -0
  48. {span_panel_api-3.0.0b10 → span_panel_api-3.0.0b11}/tests/test_auth_and_homie_helpers.py +0 -0
  49. {span_panel_api-3.0.0b10 → span_panel_api-3.0.0b11}/tests/test_catalog_divergence.py +0 -0
  50. {span_panel_api-3.0.0b10 → span_panel_api-3.0.0b11}/tests/test_detection_auth.py +0 -0
  51. {span_panel_api-3.0.0b10 → span_panel_api-3.0.0b11}/tests/test_exceptions.py +0 -0
  52. {span_panel_api-3.0.0b10 → span_panel_api-3.0.0b11}/tests/test_factory_dispatch.py +0 -0
  53. {span_panel_api-3.0.0b10 → span_panel_api-3.0.0b11}/tests/test_field_metadata.py +0 -0
  54. {span_panel_api-3.0.0b10 → span_panel_api-3.0.0b11}/tests/test_live_flat_differential.py +0 -0
  55. {span_panel_api-3.0.0b10 → span_panel_api-3.0.0b11}/tests/test_mqtt_bridge.py +0 -0
  56. {span_panel_api-3.0.0b10 → span_panel_api-3.0.0b11}/tests/test_mqtt_client_connection.py +0 -0
  57. {span_panel_api-3.0.0b10 → span_panel_api-3.0.0b11}/tests/test_mqtt_connect_flow.py +0 -0
  58. {span_panel_api-3.0.0b10 → span_panel_api-3.0.0b11}/tests/test_mqtt_debounce.py +0 -0
  59. {span_panel_api-3.0.0b10 → span_panel_api-3.0.0b11}/tests/test_mqtt_homie.py +0 -0
  60. {span_panel_api-3.0.0b10 → span_panel_api-3.0.0b11}/tests/test_packaging.py +0 -0
  61. {span_panel_api-3.0.0b10 → span_panel_api-3.0.0b11}/tests/test_phase_validation_configs.py +0 -0
  62. {span_panel_api-3.0.0b10 → span_panel_api-3.0.0b11}/tests/test_phase_validation_errors.py +0 -0
  63. {span_panel_api-3.0.0b10 → span_panel_api-3.0.0b11}/tests/test_protocol_conformance.py +0 -0
  64. {span_panel_api-3.0.0b10 → span_panel_api-3.0.0b11}/tests/test_protocol_models.py +0 -0
  65. {span_panel_api-3.0.0b10 → span_panel_api-3.0.0b11}/tests/test_public_api_unchanged.py +0 -0
  66. {span_panel_api-3.0.0b10 → span_panel_api-3.0.0b11}/tests/test_redispatch_on_reconnect.py +0 -0
  67. {span_panel_api-3.0.0b10 → span_panel_api-3.0.0b11}/tests/test_reference_tree_values.py +0 -0
  68. {span_panel_api-3.0.0b10 → span_panel_api-3.0.0b11}/tests/test_schema_generation_cross_check.py +0 -0
  69. {span_panel_api-3.0.0b10 → span_panel_api-3.0.0b11}/tests/test_schema_migration_delta.py +0 -0
  70. {span_panel_api-3.0.0b10 → span_panel_api-3.0.0b11}/tests/test_schema_one_adapter.py +0 -0
  71. {span_panel_api-3.0.0b10 → span_panel_api-3.0.0b11}/tests/test_schema_one_against_simulator.py +0 -0
  72. {span_panel_api-3.0.0b10 → span_panel_api-3.0.0b11}/tests/test_schema_one_charge_limit.py +0 -0
  73. {span_panel_api-3.0.0b10 → span_panel_api-3.0.0b11}/tests/test_schema_one_circuits.py +0 -0
  74. {span_panel_api-3.0.0b10 → span_panel_api-3.0.0b11}/tests/test_schema_one_conformance.py +0 -0
  75. {span_panel_api-3.0.0b10 → span_panel_api-3.0.0b11}/tests/test_schema_one_connection_health.py +0 -0
  76. {span_panel_api-3.0.0b10 → span_panel_api-3.0.0b11}/tests/test_schema_one_devices.py +0 -0
  77. {span_panel_api-3.0.0b10 → span_panel_api-3.0.0b11}/tests/test_schema_one_discovery.py +0 -0
  78. {span_panel_api-3.0.0b10 → span_panel_api-3.0.0b11}/tests/test_schema_one_pcs.py +0 -0
  79. {span_panel_api-3.0.0b10 → span_panel_api-3.0.0b11}/tests/test_schema_one_service_entrance.py +0 -0
  80. {span_panel_api-3.0.0b10 → span_panel_api-3.0.0b11}/tests/test_schema_one_shed_forecast.py +0 -0
  81. {span_panel_api-3.0.0b10 → span_panel_api-3.0.0b11}/tests/test_schema_one_snapshot.py +0 -0
  82. {span_panel_api-3.0.0b10 → span_panel_api-3.0.0b11}/tests/test_schema_one_transport.py +0 -0
  83. {span_panel_api-3.0.0b10 → span_panel_api-3.0.0b11}/tests/test_schema_provenance.py +0 -0
  84. {span_panel_api-3.0.0b10 → span_panel_api-3.0.0b11}/tests/test_schema_zero_adapter.py +0 -0
  85. {span_panel_api-3.0.0b10 → span_panel_api-3.0.0b11}/tests/test_shared_http_client.py +0 -0
@@ -4,6 +4,10 @@ All notable changes to this project will be documented in this file.
4
4
 
5
5
  The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
6
6
 
7
+ ## [3.0.0b11]
8
+
9
+ Carries `span-panel-api-schema-1` 0.1.0b8, which restores `dominant_power_source` on a panel with no MID. No change in this distribution.
10
+
7
11
  ## [3.0.0b10]
8
12
 
9
13
  ### Changed
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: span-panel-api
3
- Version: 3.0.0b10
3
+ Version: 3.0.0b11
4
4
  Summary: A client library for SPAN Panel API
5
5
  Project-URL: Homepage, https://github.com/SpanPanel/span-panel-api
6
6
  Project-URL: Issues, https://github.com/SpanPanel/span-panel-api/issues
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "span-panel-api"
3
- version = "3.0.0b10"
3
+ version = "3.0.0b11"
4
4
  description = "A client library for SPAN Panel API"
5
5
  authors = [
6
6
  {name = "SpanPanel"}
@@ -445,7 +445,39 @@ def test_an_unresolvable_forming_entity_cannot_escape_as_a_raw_id() -> None:
445
445
 
446
446
  assert resolve_dominant_power_source(stranger, {}) == "UNKNOWN"
447
447
  assert resolve_dominant_power_source(unmapped, {"wh-1": "energy.ebus.device.water-heater"}) == "UNKNOWN"
448
- assert resolve_dominant_power_source(None, {}) is None
448
+
449
+
450
+ def test_a_panel_with_no_mid_reports_the_grid_as_forming() -> None:
451
+ """Elimination, not a guess, and it restores an answer flat already gave.
452
+
453
+ A commissioned MID is what SPAN islands with, so its absence rules out every
454
+ other value this field can take. `BATTERY` needs a BESS and a BESS brings a
455
+ MID; `PV` cannot form a grid alone, because anything that can is a
456
+ grid-forming inverter and therefore a MID; `NONE` describes a panel supplying
457
+ nothing, which is a panel that is not publishing. What remains is a generator,
458
+ and that is two cases of which only one reaches here — one wired through a MID
459
+ is named by that MID and answered before this point, while one with no MID
460
+ interface is what SPAN treats as the grid, and is the only kind an install
461
+ with no MID can have. So this keeps holding if MID-integrated generators
462
+ arrive: they bring a MID.
463
+
464
+ Observed: a live no-BESS panel read `Grid` on flat all night and went
465
+ `Unknown` the moment it upgraded, because the property moved onto a device
466
+ that install does not have. Nothing about the site changed.
467
+ """
468
+ assert resolve_dominant_power_source(None, {}) == "GRID"
469
+
470
+
471
+ def test_a_mid_that_has_not_answered_is_unknown_rather_than_grid() -> None:
472
+ """Distinct from having no MID at all, and the distinction is the whole point.
473
+
474
+ An islanding authority exists and has not said what is forming the grid. That
475
+ is genuinely unknown — unlike an install with no such authority, where the
476
+ answer is settled by what cannot be there.
477
+ """
478
+ silent = _synthetic("mid", grid__grid_forming_entity="")
479
+
480
+ assert resolve_dominant_power_source(silent, {}) is None
449
481
 
450
482
 
451
483
  def test_the_forming_device_is_named_readably_not_by_wire_id() -> None: