This commit is contained in:
1 parent
89621bc7c3
commit
e1d22a26ed
6 files changed
+146
-20
No files matched your search
+41
-2
@@ -79,6 +79,40 @@ class HistoryTests(unittest.TestCase):
|
||||
row = pq.ParquetFile(next(self.store.path.glob("date=*/samples.parquet"))).read().to_pylist()[0]
|
||||
self.assertEqual(row["record_kind"], "history")
|
||||
self.assertEqual(row["interval_energy_wh"]["production"], 100)
|
||||
self.assertEqual(row["production_ac_w"], 1200)
|
||||
self.assertEqual(row["consumption_w"], 1440)
|
||||
self.assertEqual(row["grid_import_w"], 240)
|
||||
self.assertEqual(row["grid_export_w"], 0)
|
||||
self.assertEqual(day["slots"][120:123], [1, 1, 1])
|
||||
|
||||
def test_old_archive_normalization_preserves_delivery_state_and_live_records(self):
|
||||
old = history_sample(entry(self.when), self.source, SYSTEM)
|
||||
old["readings"] = dict.fromkeys(old["readings"])
|
||||
old["source_timestamps"] = {}
|
||||
old.pop("poll_interval_seconds")
|
||||
live = observed(self.when + timedelta(minutes=5))
|
||||
self.store.add(old)
|
||||
self.store.add(live)
|
||||
self.store.acknowledge([old["id"]], now=self.when + timedelta(hours=1))
|
||||
path = next(self.store.path.glob("date=*/samples.parquet"))
|
||||
before = {row["id"]: row for row in pq.ParquetFile(path).read().to_pylist()}
|
||||
|
||||
self.assertEqual(self.store.normalize_history(), 1)
|
||||
self.assertEqual(self.store.normalize_history(), 0)
|
||||
after = {row["id"]: row for row in pq.ParquetFile(path).read().to_pylist()}
|
||||
self.assertEqual(after[live["id"]], before[live["id"]])
|
||||
row = after[old["id"]]
|
||||
for field in ("id", "observed_at", "recorded_ns", "uploaded_at"):
|
||||
self.assertEqual(row[field], before[old["id"]][field])
|
||||
self.assertEqual(row["production_ac_w"], 1200)
|
||||
self.assertEqual(row["consumption_w"], 1440)
|
||||
self.assertIsNone(row["production_w"])
|
||||
self.assertIsNone(row["boiler_enabled"])
|
||||
self.assertEqual(self.store.pending(100), [live])
|
||||
self.assertEqual(list(self.store.records())[0]["source_timestamps"]["powerflow"], utc_text(self.when))
|
||||
# Replaying the original legacy payload still identifies the same record.
|
||||
self.store.add(old)
|
||||
self.assertEqual(self.store.status()["samples"], 2)
|
||||
|
||||
def test_partial_cloud_records_remain_missing_for_retry(self):
|
||||
stamp = int((self.when + timedelta(minutes=5)).timestamp() * 1000)
|
||||
@@ -233,16 +267,21 @@ class HistoryTests(unittest.TestCase):
|
||||
self.assertEqual(client.call_count, 1)
|
||||
|
||||
def test_chart_conversion_matches_solar_and_retains_provenance(self):
|
||||
for generated, consumed in [(1200, 1440), (2400, 1200), (0, 0)]:
|
||||
for generated, consumed in [(1200, 1440), (2400, 1200), (0, 0), (1234.56789, 3456.78901)]:
|
||||
with self.subTest(generated=generated, consumed=consumed):
|
||||
stamp = int(self.when.timestamp() * 1000)
|
||||
record = next(chart_entries({stamp: generated}, {stamp: consumed}))
|
||||
values = history_sample(record, self.source, SYSTEM)["history_interval"]["energy_wh"]
|
||||
sample = history_sample(record, self.source, SYSTEM)
|
||||
values = sample["history_interval"]["energy_wh"]
|
||||
self.assertEqual(values, {"production": generated / 12, "consumption": consumed / 12,
|
||||
"self_consumption": min(generated, consumed) / 12,
|
||||
"bought": max(0, consumed - generated) / 12,
|
||||
"sold": max(0, generated - consumed) / 12})
|
||||
self.assertEqual(record["energy_method"], "constant_power_over_five_minutes")
|
||||
self.assertEqual(sample["readings"]["production_ac_w"], generated)
|
||||
self.assertEqual(sample["readings"]["consumption_w"], consumed)
|
||||
self.assertEqual(sample["readings"]["grid_w"], consumed - generated)
|
||||
self.assertIsNone(sample["readings"]["production_w"])
|
||||
|
||||
def test_dst_days_recover_every_actual_five_minute_slot(self):
|
||||
for day, expected in [("2026-03-29", 276), ("2026-10-25", 300)]:
|
||||
|
||||
Reference in new issue
Block a user