Repository navigation
Expand file tree
/
Copy pathquality_scale.yaml
More file actions
221 lines (218 loc) · 8.67 KB
/
Copy pathquality_scale.yaml
File metadata and controls
221 lines (218 loc) · 8.67 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
rules:
# Bronze
action-setup:
status: exempt
comment: No service actions registered.
appropriate-polling:
status: done
comment: |
DataUpdateCoordinator with appropriate intervals:
WeatherDataCoordinator 30 min, ForecastCoordinator 15 min, OptimizationCoordinator 15 min.
brands:
status: done
common-modules:
status: done
comment: helpers.py (price extraction), battery_model.py (physics), optimizer.py (DP engine), const.py.
config-flow-test-coverage:
status: done
comment: |
test_config_flow.py covers the config flow, options flow, battery subentry flow (add + reconfigure)
and PV subentry flow (add + reconfigure + delete) fully.
config-flow:
status: done
comment: |
UI setup via ConfigFlow; data_description present in all flow steps
(config/options sections and battery subentry user+reconfigure steps);
structural config in ConfigEntry.data, runtime-tunable values in ConfigEntry.options.
dependency-transparency:
status: done
comment: |
requirements: [] in manifest.json. Only external dependency is aiohttp,
used via HA's own async_get_clientsession — no extra PyPI packages.
docs-actions:
status: exempt
comment: No service actions.
docs-conditions:
status: exempt
comment: No condition platform; the integration provides no conditions.
docs-triggers:
status: exempt
comment: No trigger platform; the integration provides no triggers.
docs-high-level-description:
status: done
comment: README "What is Battery Controller?" section and the docs site home page.
docs-installation-instructions:
status: done
comment: docs/installation.md — prerequisites, sensor verification, HACS and manual installation.
docs-removal-instructions:
status: done
comment: docs/installation.md "Removal" — step-by-step removal including manual entity cleanup.
entity-event-setup:
status: done
comment: CoordinatorEntity pattern; subscriptions via async_on_remove in async_added_to_hass.
entity-unique-id:
status: done
comment: All entities — _attr_unique_id = f"{entry.entry_id}_{key}".
has-entity-name:
status: done
comment: _attr_has_entity_name = True on all entity base classes.
runtime-data:
status: done
comment: entry.runtime_data = BatteryControllerData(...) in async_setup_entry.
test-before-configure:
status: done
comment: |
async_step_user calls _test_api_connection (aiohttp GET to open-meteo.com)
before async_create_entry. On failure: errors["base"] = "cannot_connect".
test-before-setup:
status: done
comment: |
async_config_entry_first_refresh() in async_setup_entry raises ConfigEntryNotReady
if open-meteo.com is unreachable during the first setup.
unique-config-entry:
status: done
comment: async_set_unique_id(DOMAIN) + _abort_if_unique_id_configured() in async_step_user.
# Silver
action-exceptions:
status: exempt
comment: No service actions.
config-entry-unloading:
status: done
comment: |
async_unload_entry calls async_shutdown on all three coordinators
and delegates platform unload to async_unload_platforms.
docs-configuration-parameters:
status: done
comment: docs/configuration.md describes all parameters for the main entry, Battery and PV Array subentries.
docs-installation-parameters:
status: done
comment: docs/installation.md "Prerequisites" describes HA version, price sensor and HACS requirements.
entity-unavailable:
status: done
comment: |
CoordinatorEntity automatically marks entities unavailable on coordinator failure
(last_update_success=False). Sensors without data return None as native_value.
integration-owner:
status: done
comment: manifest.json codeowners — ["@bvweerd"].
log-when-unavailable:
status: done
comment: |
DataUpdateCoordinator implements log-once: first failure logs at ERROR,
subsequent failures at DEBUG, recovery at INFO. WeatherDataCoordinator inherits this behaviour.
parallel-updates:
status: done
comment: PARALLEL_UPDATES = 0 in binary_sensor, number, select, sensor and switch.
reauthentication-flow:
status: exempt
comment: The integration requires no authentication.
test-coverage:
status: done
comment: |
Total coverage 95.8% (855 tests). All modules covered; the floor is
enforced at 90% via fail_under in setup.cfg and CI reports the figure
per run. Lowest: coordinator_optimization.py 89%, __init__.py 88%,
switch.py 88% — the remaining gap is in price-extension branches and
error paths, not in the hybrid-mode hysteresis, which is covered.
# Gold
devices:
status: done
comment: |
Main device via ConfigEntry, per-battery sub-device and per-PV sub-device
linked as via_device to the main device.
diagnostics:
status: done
comment: diagnostics.py implements async_get_config_entry_diagnostics.
discovery-update-info:
status: exempt
comment: No discoverable network devices.
discovery:
status: exempt
comment: No device discovery applicable; integration reads HA sensors and open-meteo.
docs-data-update:
status: done
comment: docs/how-it-works.md "Architecture" describes the coordinator cascade with intervals.
docs-examples:
status: done
comment: docs/inverter-control.md "Example automation" with complete YAML.
docs-known-limitations:
status: done
comment: |
docs/how-it-works.md "Known limitations" covers horizon limitations, day-ahead gap,
LFP assumptions, multi-battery aggregation and consumption pattern learning period.
docs-supported-devices:
status: exempt
comment: |
Software-only integration; works via HA automations with any inverter.
No specific devices to list.
docs-supported-functions:
status: done
comment: docs/entities.md describes all platforms, entities and attributes.
docs-troubleshooting:
status: done
comment: |
docs/troubleshooting.md covers common problems and solutions: no schedule,
no arbitrage, unavailable entities, zero PV forecast, diagnostics analyzer.
docs/faq.md answers recurring questions from the issue tracker.
docs-use-cases:
status: done
comment: docs/control-modes.md + the automation examples in docs/inverter-control.md.
dynamic-devices:
status: done
comment: Battery and PV subentries can be added and removed after initial setup.
entity-category:
status: done
comment: EntityCategory.CONFIG (number, select, switch), EntityCategory.DIAGNOSTIC (status sensors).
entity-device-class:
status: done
comment: |
SensorDeviceClass.POWER, BATTERY, MONETARY, IRRADIANCE, WIND_SPEED;
BinarySensorDeviceClass.RUNNING.
entity-disabled-by-default:
status: done
comment: |
_attr_entity_registry_enabled_default = False on weather sensors (GHI, wind),
schedule sensor and battery subentry diagnostic sensors.
entity-translations:
status: done
comment: |
All entities have _attr_translation_key;
translations/en.json and translations/nl.json present.
exception-translations:
status: done
comment: |
All UpdateFailed calls in coordinator_weather, coordinator_forecast and
coordinator_optimization use translation_domain=DOMAIN + translation_key.
Translations are in strings.json and translations/en.json under "exceptions".
icon-translations:
status: done
comment: icons.json with default MDI icons for all entity types (sensor, number, select, switch, binary_sensor).
reconfiguration-flow:
status: done
comment: |
Options flow for main configuration;
battery subentry reconfigure flow and PV subentry reconfigure flow present.
repair-issues:
status: done
comment: |
ir.async_create_issue("price_sensor_unavailable") in OptimizationCoordinator
when the price sensor is unavailable and no historical price model data exists yet.
ir.async_delete_issue on recovery. Text in strings.json under "issues".
stale-devices:
status: done
comment: |
async_remove_config_entry_device in __init__.py: returns True for devices
whose subentry no longer exists (stale), False for active subentry devices
and the main device.
# Platinum
async-dependency:
status: done
comment: aiohttp is fully async; all I/O via native async or async_add_executor_job.
inject-websession:
status: done
comment: coordinator_weather.py uses async_get_clientsession(hass) — HA's own session injection.
strict-typing:
status: done
comment: |
mypy --strict passes with 0 errors across all 19 source files.
strict = true set in setup.cfg.