daily log data: fix units#3379
Merged
Merged
Conversation
Contributor
There was a problem hiding this comment.
Pull request overview
This PR introduces a “legacy” unit conversion step when publishing daily/monthly/yearly log payloads to MQTT, and refactors existing log testdata into pytest fixtures to support updated integration/unit tests.
Changes:
- Added
convert_legacy_units()and applied it when publishing daily/monthly/yearly logs inCommand. - Refactored
process_log_testdata.pyfrom module-level dicts into pytest fixtures and adjusted integration tests accordingly. - Added a
Command.getDailyLogpublishing test with new fixture-based expected payload.
Reviewed changes
Copilot reviewed 6 out of 6 changed files in this pull request and generated 4 comments.
Show a summary per file
| File | Description |
|---|---|
| packages/helpermodules/measurement_logging/process_log.py | Adds convert_legacy_units() (unit conversion) and replaces prior large comment block with a new sample payload comment. |
| packages/helpermodules/measurement_logging/process_log_testdata.py | Converts static dict testdata into pytest fixtures. |
| packages/helpermodules/measurement_logging/process_log_integration_test.py | Updates tests to use fixture-based testdata via pytest_plugins. |
| packages/helpermodules/command.py | Applies convert_legacy_units() when publishing daily/monthly/yearly logs. |
| packages/helpermodules/command_test.py | Adds a test asserting published daily-log payload after unit conversion; registers fixture plugins. |
| packages/helpermodules/command_test_data.py | Adds fixture containing expected converted daily-log payload for Command test. |
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
Comment on lines
+166
to
+168
| for value in ("energy_imported", "energy_exported", "power_average", "power_imported", "power_exported"): | ||
| if value in entry[type][module].keys(): | ||
| entry[type][module][value] = entry[type][module][value] / 1000 |
Comment on lines
+161
to
+171
| for entry in data["entries"]: | ||
| for type in ("bat", "counter", "cp", "pv", "sh", "hc"): | ||
| if type in entry: | ||
| for module in entry[type].keys(): | ||
| try: | ||
| for value in ("energy_imported", "energy_exported", "power_average", "power_imported", "power_exported"): | ||
| if value in entry[type][module].keys(): | ||
| entry[type][module][value] = entry[type][module][value] / 1000 | ||
| except KeyError: | ||
| log.exception( | ||
| f"Fehler beim Konvertieren der Einheiten von {type} {module} in Eintrag {entry['timestamp']}") |
Comment on lines
+162
to
+171
| for type in ("bat", "counter", "cp", "pv", "sh", "hc"): | ||
| if type in entry: | ||
| for module in entry[type].keys(): | ||
| try: | ||
| for value in ("energy_imported", "energy_exported", "power_average", "power_imported", "power_exported"): | ||
| if value in entry[type][module].keys(): | ||
| entry[type][module][value] = entry[type][module][value] / 1000 | ||
| except KeyError: | ||
| log.exception( | ||
| f"Fehler beim Konvertieren der Einheiten von {type} {module} in Eintrag {entry['timestamp']}") |
Comment on lines
824
to
+834
| def getDailyLog(self, connection_id: str, payload: dict) -> None: | ||
| Pub().pub(f'openWB/set/log/daily/{payload["data"]["date"]}', | ||
| get_daily_log(payload["data"]["date"])) | ||
| convert_legacy_units(get_daily_log(payload["data"]["date"]))) | ||
|
|
||
| def getMonthlyLog(self, connection_id: str, payload: dict) -> None: | ||
| Pub().pub(f'openWB/set/log/monthly/{payload["data"]["date"]}', | ||
| get_monthly_log(payload["data"]["date"])) | ||
| convert_legacy_units(get_monthly_log(payload["data"]["date"]))) | ||
|
|
||
| def getYearlyLog(self, connection_id: str, payload: dict) -> None: | ||
| Pub().pub(f'openWB/set/log/yearly/{payload["data"]["date"]}', | ||
| get_yearly_log(payload["data"]["date"])) | ||
| convert_legacy_units(get_yearly_log(payload["data"]["date"]))) |
Comment on lines
+171
to
+183
| def convert_legacy_units(data: dict) -> dict: | ||
| for entry in data["entries"]: | ||
| for group in ("bat", "counter", "cp", "pv", "sh", "hc"): | ||
| if group in entry: | ||
| for module in entry[group].keys(): | ||
| try: | ||
| for value in KWH_KEYS: | ||
| if value in entry[group][module].keys(): | ||
| entry[group][module][value] = entry[group][module][value] / 1000 | ||
| except KeyError: | ||
| log.exception( | ||
| f"Fehler beim Konvertieren der Einheiten von {group} {module} in Eintrag " | ||
| f"{entry['timestamp']}") |
Comment on lines
+177
to
+180
| for value in KWH_KEYS: | ||
| if value in entry[group][module].keys(): | ||
| entry[group][module][value] = entry[group][module][value] / 1000 | ||
| except KeyError: |
Comment on lines
+160
to
+168
| KWH_KEYS = ("energy_imported", | ||
| "energy_imported_grid", | ||
| "energy_imported_pv", | ||
| "energy_imported_bat", | ||
| "energy_imported_cp", | ||
| "energy_exported", | ||
| "power_average", | ||
| "power_imported", | ||
| "power_exported") |
Comment on lines
+50
to
+74
| # {'entries': [{'bat': {'all': {'energy_exported': 0.0, # kWh | ||
| # 'energy_imported': 0.0, # kWh | ||
| # 'exported': 50.75, # Wh | ||
| # 'imported': 2551.98, # Wh | ||
| # 'power_average': 0.0, # kW | ||
| # 'power_exported': 0, # kW | ||
| # 'power_imported': 0.0, # kW | ||
| # 'soc': 100}, # % | ||
| # 'bat2': {'energy_exported': 0.0, # kWh | ||
| # 'energy_imported': 0.0, # kWh | ||
| # 'exported': 50.75, # Wh | ||
| # 'imported': 2551.98, # Wh | ||
| # 'power_average': 0.0, # kW | ||
| # 'power_exported': 0, # kW | ||
| # 'power_imported': 0.0, # kW | ||
| # 'soc': 100}}, # % | ||
| # 'counter': {'counter0': {'energy_exported': 4.421, # kWh | ||
| # 'energy_imported': 0.0, # kWh | ||
| # 'exported': 24425.677, # Wh | ||
| # 'grid': True, | ||
| # 'imported': 90.379, # Wh | ||
| # 'power_average': -7.139, # kW | ||
| # 'power_exported': 7.139, # kW | ||
| # 'power_imported': 0}}, # kW | ||
| # 'cp': {'all': {'energy_exported': 0.0, # kWh |
Comment on lines
824
to
+834
| def getDailyLog(self, connection_id: str, payload: dict) -> None: | ||
| Pub().pub(f'openWB/set/log/daily/{payload["data"]["date"]}', | ||
| get_daily_log(payload["data"]["date"])) | ||
| convert_legacy_units(get_daily_log(payload["data"]["date"]))) | ||
|
|
||
| def getMonthlyLog(self, connection_id: str, payload: dict) -> None: | ||
| Pub().pub(f'openWB/set/log/monthly/{payload["data"]["date"]}', | ||
| get_monthly_log(payload["data"]["date"])) | ||
| convert_legacy_units(get_monthly_log(payload["data"]["date"]))) | ||
|
|
||
| def getYearlyLog(self, connection_id: str, payload: dict) -> None: | ||
| Pub().pub(f'openWB/set/log/yearly/{payload["data"]["date"]}', | ||
| get_yearly_log(payload["data"]["date"])) | ||
| convert_legacy_units(get_yearly_log(payload["data"]["date"]))) |
Comment on lines
828
to
+834
| def getMonthlyLog(self, connection_id: str, payload: dict) -> None: | ||
| Pub().pub(f'openWB/set/log/monthly/{payload["data"]["date"]}', | ||
| get_monthly_log(payload["data"]["date"])) | ||
| convert_legacy_units(get_monthly_log(payload["data"]["date"]))) | ||
|
|
||
| def getYearlyLog(self, connection_id: str, payload: dict) -> None: | ||
| Pub().pub(f'openWB/set/log/yearly/{payload["data"]["date"]}', | ||
| get_yearly_log(payload["data"]["date"])) | ||
| convert_legacy_units(get_yearly_log(payload["data"]["date"]))) |
Comment on lines
+50
to
+71
| # {'entries': [{'bat': {'all': {'energy_exported': 0.0, # kWh | ||
| # 'energy_imported': 0.0, # kWh | ||
| # 'exported': 50.75, # Wh | ||
| # 'imported': 2551.98, # Wh | ||
| # 'power_average': 0.0, # kW | ||
| # 'power_exported': 0, # kW | ||
| # 'power_imported': 0.0, # kW | ||
| # 'soc': 100}, # % | ||
| # 'bat2': {'energy_exported': 0.0, # kWh | ||
| # 'energy_imported': 0.0, # kWh | ||
| # 'exported': 50.75, # Wh | ||
| # 'imported': 2551.98, # Wh | ||
| # 'power_average': 0.0, # kW | ||
| # 'power_exported': 0, # kW | ||
| # 'power_imported': 0.0, # kW | ||
| # 'soc': 100}}, # % | ||
| # 'counter': {'counter0': {'energy_exported': 4.421, # kWh | ||
| # 'energy_imported': 0.0, # kWh | ||
| # 'exported': 24425.677, # Wh | ||
| # 'grid': True, | ||
| # 'imported': 90.379, # Wh | ||
| # 'power_average': -7.139, # kW |
Comment on lines
+171
to
+180
| def convert_legacy_units(data: dict) -> dict: | ||
| for entry in data["entries"]: | ||
| for group in ("bat", "counter", "cp", "pv", "sh", "hc"): | ||
| if group in entry: | ||
| for module in entry[group].keys(): | ||
| try: | ||
| for value in UNIT_KEYS_KILO: | ||
| if value in entry[group][module].keys(): | ||
| entry[group][module][value] = decimal_divide(entry[group][module][value], 1000) | ||
| except KeyError: |
Comment on lines
+171
to
+183
| def convert_legacy_units(data: dict) -> dict: | ||
| for entry in data["entries"]: | ||
| for group in ("bat", "counter", "cp", "pv", "sh", "hc"): | ||
| if group in entry: | ||
| for module in entry[group].keys(): | ||
| try: | ||
| for value in UNIT_KEYS_KILO: | ||
| if value in entry[group][module].keys(): | ||
| entry[group][module][value] = decimal_divide(entry[group][module][value], 1000) | ||
| except KeyError: | ||
| log.exception( | ||
| f"Fehler beim Konvertieren der Einheiten von {group} {module} in Eintrag " | ||
| f"{entry['timestamp']}") |
Comment on lines
824
to
+834
| def getDailyLog(self, connection_id: str, payload: dict) -> None: | ||
| Pub().pub(f'openWB/set/log/daily/{payload["data"]["date"]}', | ||
| get_daily_log(payload["data"]["date"])) | ||
| convert_legacy_units(get_daily_log(payload["data"]["date"]))) | ||
|
|
||
| def getMonthlyLog(self, connection_id: str, payload: dict) -> None: | ||
| Pub().pub(f'openWB/set/log/monthly/{payload["data"]["date"]}', | ||
| get_monthly_log(payload["data"]["date"])) | ||
| convert_legacy_units(get_monthly_log(payload["data"]["date"]))) | ||
|
|
||
| def getYearlyLog(self, connection_id: str, payload: dict) -> None: | ||
| Pub().pub(f'openWB/set/log/yearly/{payload["data"]["date"]}', | ||
| get_yearly_log(payload["data"]["date"])) | ||
| convert_legacy_units(get_yearly_log(payload["data"]["date"]))) |
Comment on lines
+60
to
+63
| def test_getDailyLog(regular_daily_log_entry, | ||
| regular_daily_log_entry_processed_legacy_converted, | ||
| mock_pub, | ||
| monkeypatch): |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
"energy_imported", "energy_exported", "power_average", "power_imported", "power_exported" sind in kWh bzw kW entgegen der üblichen Wh bzw W. Um die Schnittstelle konsistent zu halten, wird vor dem Publishen im Command eine Legacy-Anpassung der Einheiten durchgeführt.