{"status": "warning", "checked_at": "2026-08-03T01:17:12.613608+02:00", "default_timezone": "Africa/Johannesburg", "thresholds": {"source_warn_minutes": 120, "source_critical_minutes": 360, "rollup_warn_minutes": 90, "rollup_critical_minutes": 240, "lag_warn_minutes": 90, "lag_critical_minutes": 240}, "summary": {"meter_count": 30, "ok_count": 24, "unknown_count": 0, "warning_count": 6, "critical_count": 0}, "source": {"configured": true, "status": "ok", "latest_measurement_ts": "2026-08-03T01:17:12.799460+02:00", "latest_measurement_age_minutes": 0.0, "subscription": {"status": "ok", "count": 1, "subscriptions": [{"name": "meters_reporting_sub", "enabled": true}]}}, "rollup": {"status": "ok", "meter_count": 30, "latest_bucket": "2026-08-03T01:00:00+02:00", "latest_updated_at": "2026-08-03T01:15:07.243910+02:00"}, "database": {"measurements_id": {"status": "ok", "configured": true, "column_type": "bigint", "current_max_id": 2460052150, "limit": null, "ids_remaining": null, "percent_used": null, "notes": ["Measurements id column is not a 32-bit integer."]}}, "known_gaps": {"status": "ok", "window_count": 39, "known_bucket_count": 16758, "windows": [{"start": "2026-06-11T09:00:00+02:00", "end": "2026-06-11T11:00:00+02:00", "duration_hours": 2, "applies_to_all_meters": false, "affected_meter_count": 9, "meters": ["meter-banana-trans", "meter-battery-transformer", "meter-fine-corner-trans", "meter-fv-building", "meter-fv-trans", "meter-local-trans", "meter-mr-building", "meter-peoples-market", "meter-solar-phase-2"], "bucket_span": 18, "reason": "Confirmed source gap at the start of the PVE3 outage recovery window; raw reporting recovery had no readings for these hourly buckets."}, {"start": "2026-06-11T09:00:00+02:00", "end": "2026-06-11T10:00:00+02:00", "duration_hours": 1, "applies_to_all_meters": false, "affected_meter_count": 2, "meters": ["meter-grid-power-bulk", "meter-subtropico-fridge"], "bucket_span": 2, "reason": "Confirmed one-hour source gap at the start of the PVE3 outage recovery window; raw reporting recovery had no readings for this hourly bucket."}, {"start": "2026-06-10T13:00:00+02:00", "end": "2026-06-10T14:00:00+02:00", "duration_hours": 1, "applies_to_all_meters": false, "affected_meter_count": 1, "meters": ["meter-solar-phase-2"], "bucket_span": 1, "reason": "Confirmed one-hour Solar Phase 2 source gap during PVE3 recovery rollup audit on 2026-06-17."}, {"start": "2026-05-17T09:00:00+02:00", "end": "2026-06-09T03:00:00+02:00", "duration_hours": 546, "applies_to_all_meters": true, "affected_meter_count": 30, "meters": [], "bucket_span": 16380, "reason": "GridBrain DB sink ran without an applied DB config; readings were not persisted until controlled restart on 2026-06-09."}, {"start": "2026-05-10T17:00:00+02:00", "end": "2026-05-11T16:00:00+02:00", "duration_hours": 23, "applies_to_all_meters": true, "affected_meter_count": 30, "meters": [], "bucket_span": 690, "reason": "PVE2 Postgres disk-full incident; missing hourly rollup window confirmed after source spool replay."}, {"start": "2026-04-08T04:00:00+02:00", "end": "2026-04-13T14:00:00+02:00", "duration_hours": 130, "applies_to_all_meters": false, "affected_meter_count": 1, "meters": ["meter-solar-phase-2"], "bucket_span": 130, "reason": "Historical Solar Phase 2 source gap observed before known-gap tracking."}, {"start": "2026-04-07T07:00:00+02:00", "end": "2026-04-07T20:00:00+02:00", "duration_hours": 13, "applies_to_all_meters": false, "affected_meter_count": 1, "meters": ["meter-battery-transformer"], "bucket_span": 13, "reason": "Historical meter-specific source gap observed before known-gap tracking."}, {"start": "2026-04-07T07:00:00+02:00", "end": "2026-04-07T09:00:00+02:00", "duration_hours": 2, "applies_to_all_meters": false, "affected_meter_count": 1, "meters": ["meter-solar-phase-2"], "bucket_span": 2, "reason": "Historical Solar Phase 2 source gap observed before known-gap tracking."}, {"start": "2026-03-12T20:00:00+02:00", "end": "2026-03-12T21:00:00+02:00", "duration_hours": 1, "applies_to_all_meters": false, "affected_meter_count": 1, "meters": ["meter-solar-phase-2"], "bucket_span": 1, "reason": "Historical Solar Phase 2 source gap observed before known-gap tracking."}, {"start": "2026-03-11T14:00:00+02:00", "end": "2026-03-12T06:00:00+02:00", "duration_hours": 16, "applies_to_all_meters": false, "affected_meter_count": 3, "meters": ["meter-fv-building", "meter-fv-trans", "meter-mr-building"], "bucket_span": 48, "reason": "Historical meter-specific source gap observed before known-gap tracking."}, {"start": "2026-03-10T11:00:00+02:00", "end": "2026-03-10T12:00:00+02:00", "duration_hours": 1, "applies_to_all_meters": false, "affected_meter_count": 1, "meters": ["meter-solar-phase-2"], "bucket_span": 1, "reason": "Historical Solar Phase 2 source gap observed before known-gap tracking."}, {"start": "2026-03-10T05:00:00+02:00", "end": "2026-03-10T06:00:00+02:00", "duration_hours": 1, "applies_to_all_meters": false, "affected_meter_count": 1, "meters": ["meter-solar-phase-2"], "bucket_span": 1, "reason": "Historical Solar Phase 2 source gap observed before known-gap tracking."}, {"start": "2026-03-06T07:00:00+02:00", "end": "2026-03-06T08:00:00+02:00", "duration_hours": 1, "applies_to_all_meters": false, "affected_meter_count": 1, "meters": ["meter-solar-phase-2"], "bucket_span": 1, "reason": "Historical Solar Phase 2 source gap observed before known-gap tracking."}, {"start": "2026-03-04T13:00:00+02:00", "end": "2026-03-04T14:00:00+02:00", "duration_hours": 1, "applies_to_all_meters": false, "affected_meter_count": 1, "meters": ["meter-solar-phase-2"], "bucket_span": 1, "reason": "Historical Solar Phase 2 source gap observed before known-gap tracking."}, {"start": "2026-03-02T02:00:00+02:00", "end": "2026-03-02T03:00:00+02:00", "duration_hours": 1, "applies_to_all_meters": false, "affected_meter_count": 1, "meters": ["meter-solar-phase-2"], "bucket_span": 1, "reason": "Historical Solar Phase 2 source gap observed before known-gap tracking."}, {"start": "2026-03-01T11:00:00+02:00", "end": "2026-03-01T12:00:00+02:00", "duration_hours": 1, "applies_to_all_meters": false, "affected_meter_count": 1, "meters": ["meter-solar-phase-2"], "bucket_span": 1, "reason": "Historical Solar Phase 2 source gap observed before known-gap tracking."}, {"start": "2026-02-21T00:00:00+02:00", "end": "2026-02-21T01:00:00+02:00", "duration_hours": 1, "applies_to_all_meters": false, "affected_meter_count": 1, "meters": ["meter-solar-phase-2"], "bucket_span": 1, "reason": "Historical Solar Phase 2 source gap observed before known-gap tracking."}, {"start": "2026-02-19T01:00:00+02:00", "end": "2026-02-19T02:00:00+02:00", "duration_hours": 1, "applies_to_all_meters": false, "affected_meter_count": 1, "meters": ["meter-solar-phase-2"], "bucket_span": 1, "reason": "Historical Solar Phase 2 source gap observed before known-gap tracking."}, {"start": "2026-02-18T22:00:00+02:00", "end": "2026-02-18T23:00:00+02:00", "duration_hours": 1, "applies_to_all_meters": false, "affected_meter_count": 1, "meters": ["meter-solar-phase-2"], "bucket_span": 1, "reason": "Historical Solar Phase 2 source gap observed before known-gap tracking."}, {"start": "2026-02-17T11:00:00+02:00", "end": "2026-02-17T12:00:00+02:00", "duration_hours": 1, "applies_to_all_meters": false, "affected_meter_count": 1, "meters": ["meter-solar-phase-2"], "bucket_span": 1, "reason": "Historical Solar Phase 2 source gap observed before known-gap tracking."}, {"start": "2026-02-16T00:00:00+02:00", "end": "2026-02-16T01:00:00+02:00", "duration_hours": 1, "applies_to_all_meters": false, "affected_meter_count": 1, "meters": ["meter-solar-phase-2"], "bucket_span": 1, "reason": "Historical Solar Phase 2 source gap observed before known-gap tracking."}, {"start": "2026-02-12T13:00:00+02:00", "end": "2026-02-17T11:00:00+02:00", "duration_hours": 118, "applies_to_all_meters": false, "affected_meter_count": 1, "meters": ["meter-battery-transformer"], "bucket_span": 118, "reason": "Historical meter-specific source gap observed before known-gap tracking."}, {"start": "2026-02-10T07:00:00+02:00", "end": "2026-02-10T08:00:00+02:00", "duration_hours": 1, "applies_to_all_meters": false, "affected_meter_count": 1, "meters": ["meter-solar-phase-2"], "bucket_span": 1, "reason": "Historical Solar Phase 2 source gap observed before known-gap tracking."}, {"start": "2026-02-08T07:00:00+02:00", "end": "2026-02-08T09:00:00+02:00", "duration_hours": 2, "applies_to_all_meters": false, "affected_meter_count": 1, "meters": ["meter-solar-phase-2"], "bucket_span": 2, "reason": "Historical Solar Phase 2 source gap observed before known-gap tracking."}, {"start": "2026-02-07T06:00:00+02:00", "end": "2026-02-07T07:00:00+02:00", "duration_hours": 1, "applies_to_all_meters": false, "affected_meter_count": 1, "meters": ["meter-solar-phase-2"], "bucket_span": 1, "reason": "Historical Solar Phase 2 source gap observed before known-gap tracking."}, {"start": "2026-01-28T16:00:00+02:00", "end": "2026-02-02T08:00:00+02:00", "duration_hours": 112, "applies_to_all_meters": false, "affected_meter_count": 1, "meters": ["meter-solar-phase-2"], "bucket_span": 112, "reason": "Historical Solar Phase 2 source gap observed before known-gap tracking."}, {"start": "2026-01-28T02:00:00+02:00", "end": "2026-01-28T03:00:00+02:00", "duration_hours": 1, "applies_to_all_meters": false, "affected_meter_count": 1, "meters": ["meter-solar-phase-2"], "bucket_span": 1, "reason": "Historical Solar Phase 2 source gap observed before known-gap tracking."}, {"start": "2026-01-27T08:00:00+02:00", "end": "2026-01-27T09:00:00+02:00", "duration_hours": 1, "applies_to_all_meters": false, "affected_meter_count": 1, "meters": ["meter-solar-phase-2"], "bucket_span": 1, "reason": "Historical Solar Phase 2 source gap observed before known-gap tracking."}, {"start": "2026-01-26T21:00:00+02:00", "end": "2026-01-26T22:00:00+02:00", "duration_hours": 1, "applies_to_all_meters": false, "affected_meter_count": 1, "meters": ["meter-solar-phase-2"], "bucket_span": 1, "reason": "Historical Solar Phase 2 source gap observed before known-gap tracking."}, {"start": "2026-01-26T14:00:00+02:00", "end": "2026-01-26T15:00:00+02:00", "duration_hours": 1, "applies_to_all_meters": false, "affected_meter_count": 1, "meters": ["meter-solar-phase-2"], "bucket_span": 1, "reason": "Historical Solar Phase 2 source gap observed before known-gap tracking."}, {"start": "2026-01-26T11:00:00+02:00", "end": "2026-01-26T12:00:00+02:00", "duration_hours": 1, "applies_to_all_meters": false, "affected_meter_count": 1, "meters": ["meter-solar-phase-2"], "bucket_span": 1, "reason": "Historical Solar Phase 2 source gap observed before known-gap tracking."}, {"start": "2026-01-24T13:00:00+02:00", "end": "2026-01-24T14:00:00+02:00", "duration_hours": 1, "applies_to_all_meters": false, "affected_meter_count": 1, "meters": ["meter-solar-phase-2"], "bucket_span": 1, "reason": "Historical Solar Phase 2 source gap observed before known-gap tracking."}, {"start": "2026-01-24T01:00:00+02:00", "end": "2026-01-24T02:00:00+02:00", "duration_hours": 1, "applies_to_all_meters": false, "affected_meter_count": 1, "meters": ["meter-solar-phase-2"], "bucket_span": 1, "reason": "Historical Solar Phase 2 source gap observed before known-gap tracking."}, {"start": "2026-01-23T13:00:00+02:00", "end": "2026-01-23T14:00:00+02:00", "duration_hours": 1, "applies_to_all_meters": false, "affected_meter_count": 1, "meters": ["meter-solar-phase-2"], "bucket_span": 1, "reason": "Historical Solar Phase 2 source gap observed before known-gap tracking."}, {"start": "2026-01-20T17:00:00+02:00", "end": "2026-01-22T14:00:00+02:00", "duration_hours": 45, "applies_to_all_meters": false, "affected_meter_count": 1, "meters": ["meter-solar-phase-2"], "bucket_span": 45, "reason": "Historical Solar Phase 2 source gap observed before known-gap tracking."}, {"start": "2026-01-19T16:00:00+02:00", "end": "2026-01-19T18:00:00+02:00", "duration_hours": 2, "applies_to_all_meters": false, "affected_meter_count": 1, "meters": ["meter-solar-phase-2"], "bucket_span": 2, "reason": "Historical Solar Phase 2 source gap observed before known-gap tracking."}, {"start": "2026-01-16T04:00:00+02:00", "end": "2026-01-16T05:00:00+02:00", "duration_hours": 1, "applies_to_all_meters": false, "affected_meter_count": 1, "meters": ["meter-solar-phase-2"], "bucket_span": 1, "reason": "Historical Solar Phase 2 source gap observed before known-gap tracking."}, {"start": "2026-01-01T00:00:00+02:00", "end": "2026-01-16T09:00:00+02:00", "duration_hours": 369, "applies_to_all_meters": false, "affected_meter_count": 1, "meters": ["meter-fine-corner-trans"], "bucket_span": 369, "reason": "Historical meter-specific source gap observed before known-gap tracking."}, {"start": "2026-01-01T00:00:00+02:00", "end": "2026-01-15T14:00:00+02:00", "duration_hours": 350, "applies_to_all_meters": false, "affected_meter_count": 1, "meters": ["meter-solar-phase-2"], "bucket_span": 350, "reason": "Historical Solar Phase 2 source gap observed before known-gap tracking."}]}, "notes": [], "meters": [{"meter": "meter-battery-transformer", "status": "ok", "source_status": "ok", "source_latest_ts": "2026-08-03T01:17:10.674322+02:00", "source_age_minutes": 0.0, "rollup_status": "ok", "rollup_last_bucket": "2026-08-03T01:00:00+02:00", "rollup_bucket_end": "2026-08-03T02:00:00+02:00", "rollup_last_sample_ts": "2026-08-03T01:15:01.322710+02:00", "rollup_updated_at": "2026-08-03T01:15:03.056728+02:00", "rollup_quality": "reset_detected", "rollup_gap_bucket_count": 0, "rollup_known_gap_bucket_count": 702, "rollup_age_minutes": 0.0, "lag_status": "ok", "source_to_rollup_lag_minutes": 2.2, "notes": ["Known rollup gap accounts for 702 hourly bucket(s)."]}, {"meter": "meter-solar-phase-2", "status": "ok", "source_status": "ok", "source_latest_ts": "2026-08-03T01:17:10.160751+02:00", "source_age_minutes": 0.0, "rollup_status": "ok", "rollup_last_bucket": "2026-08-03T01:00:00+02:00", "rollup_bucket_end": "2026-08-03T02:00:00+02:00", "rollup_last_sample_ts": "2026-08-03T01:15:02.162964+02:00", "rollup_updated_at": "2026-08-03T01:15:02.669946+02:00", "rollup_quality": "partial", "rollup_gap_bucket_count": 0, "rollup_known_gap_bucket_count": 1238, "rollup_age_minutes": 0.0, "lag_status": "ok", "source_to_rollup_lag_minutes": 2.1, "notes": ["Known rollup gap accounts for 1238 hourly bucket(s)."]}, {"meter": "meter-cold-rooms-1-14", "status": "ok", "source_status": "ok", "source_latest_ts": "2026-08-03T01:17:10.683492+02:00", "source_age_minutes": 0.0, "rollup_status": "ok", "rollup_last_bucket": "2026-08-03T01:00:00+02:00", "rollup_bucket_end": "2026-08-03T02:00:00+02:00", "rollup_last_sample_ts": "2026-08-03T01:15:03.690394+02:00", "rollup_updated_at": "2026-08-03T01:15:05.424281+02:00", "rollup_quality": "partial", "rollup_gap_bucket_count": 0, "rollup_known_gap_bucket_count": 545, "rollup_age_minutes": 0.0, "lag_status": "ok", "source_to_rollup_lag_minutes": 2.1, "notes": ["Known rollup gap accounts for 545 hourly bucket(s)."]}, {"meter": "meter-plant-room", "status": "ok", "source_status": "ok", "source_latest_ts": "2026-08-03T01:17:10.623548+02:00", "source_age_minutes": 0.0, "rollup_status": "ok", "rollup_last_bucket": "2026-08-03T01:00:00+02:00", "rollup_bucket_end": "2026-08-03T02:00:00+02:00", "rollup_last_sample_ts": "2026-08-03T01:15:00.612703+02:00", "rollup_updated_at": "2026-08-03T01:15:03.341494+02:00", "rollup_quality": "partial", "rollup_gap_bucket_count": 0, "rollup_known_gap_bucket_count": 545, "rollup_age_minutes": 0.0, "lag_status": "ok", "source_to_rollup_lag_minutes": 2.2, "notes": ["Known rollup gap accounts for 545 hourly bucket(s)."]}, {"meter": "meter-compressor-3", "status": "ok", "source_status": "ok", "source_latest_ts": "2026-08-03T01:17:10.540672+02:00", "source_age_minutes": 0.0, "rollup_status": "ok", "rollup_last_bucket": "2026-08-03T01:00:00+02:00", "rollup_bucket_end": "2026-08-03T02:00:00+02:00", "rollup_last_sample_ts": "2026-08-03T01:15:03.557504+02:00", "rollup_updated_at": "2026-08-03T01:15:06.961424+02:00", "rollup_quality": "partial", "rollup_gap_bucket_count": 0, "rollup_known_gap_bucket_count": 545, "rollup_age_minutes": 0.0, "lag_status": "ok", "source_to_rollup_lag_minutes": 2.1, "notes": ["Known rollup gap accounts for 545 hourly bucket(s)."]}, {"meter": "meter-paradise-market-trans", "status": "ok", "source_status": "ok", "source_latest_ts": "2026-08-03T01:17:11.081425+02:00", "source_age_minutes": 0.0, "rollup_status": "ok", "rollup_last_bucket": "2026-08-03T01:00:00+02:00", "rollup_bucket_end": "2026-08-03T02:00:00+02:00", "rollup_last_sample_ts": "2026-08-03T01:15:01.771399+02:00", "rollup_updated_at": "2026-08-03T01:15:04.525320+02:00", "rollup_quality": "partial", "rollup_gap_bucket_count": 0, "rollup_known_gap_bucket_count": 0, "rollup_age_minutes": 0.0, "lag_status": "ok", "source_to_rollup_lag_minutes": 2.2, "notes": []}, {"meter": "meter-condenser-3-4", "status": "ok", "source_status": "ok", "source_latest_ts": "2026-08-03T01:17:10.803448+02:00", "source_age_minutes": 0.0, "rollup_status": "ok", "rollup_last_bucket": "2026-08-03T01:00:00+02:00", "rollup_bucket_end": "2026-08-03T02:00:00+02:00", "rollup_last_sample_ts": "2026-08-03T01:15:03.815388+02:00", "rollup_updated_at": "2026-08-03T01:15:06.403942+02:00", "rollup_quality": "partial", "rollup_gap_bucket_count": 0, "rollup_known_gap_bucket_count": 545, "rollup_age_minutes": 0.0, "lag_status": "ok", "source_to_rollup_lag_minutes": 2.1, "notes": ["Known rollup gap accounts for 545 hourly bucket(s)."]}, {"meter": "meter-pumps-1-4", "status": "ok", "source_status": "ok", "source_latest_ts": "2026-08-03T01:17:10.663693+02:00", "source_age_minutes": 0.0, "rollup_status": "ok", "rollup_last_bucket": "2026-08-03T01:00:00+02:00", "rollup_bucket_end": "2026-08-03T02:00:00+02:00", "rollup_last_sample_ts": "2026-08-03T01:15:03.671497+02:00", "rollup_updated_at": "2026-08-03T01:15:06.547930+02:00", "rollup_quality": "partial", "rollup_gap_bucket_count": 0, "rollup_known_gap_bucket_count": 545, "rollup_age_minutes": 0.0, "lag_status": "ok", "source_to_rollup_lag_minutes": 2.1, "notes": ["Known rollup gap accounts for 545 hourly bucket(s)."]}, {"meter": "meter-fv-trans", "status": "warning", "source_status": "ok", "source_latest_ts": "2026-08-03T01:16:49.462627+02:00", "source_age_minutes": 0.4, "rollup_status": "ok", "rollup_last_bucket": "2026-08-03T01:00:00+02:00", "rollup_bucket_end": "2026-08-03T02:00:00+02:00", "rollup_last_sample_ts": "2026-08-03T01:15:03.693919+02:00", "rollup_updated_at": "2026-08-03T01:15:04.028394+02:00", "rollup_quality": "partial", "rollup_gap_bucket_count": 2, "rollup_known_gap_bucket_count": 587, "rollup_age_minutes": 0.0, "lag_status": "ok", "source_to_rollup_lag_minutes": 1.8, "notes": ["Historical rollup is missing 2 hourly bucket(s).", "Known rollup gap accounts for 587 hourly bucket(s)."]}, {"meter": "meter-compressor-2", "status": "ok", "source_status": "ok", "source_latest_ts": "2026-08-03T01:17:10.714402+02:00", "source_age_minutes": 0.0, "rollup_status": "ok", "rollup_last_bucket": "2026-08-03T01:00:00+02:00", "rollup_bucket_end": "2026-08-03T02:00:00+02:00", "rollup_last_sample_ts": "2026-08-03T01:15:03.716569+02:00", "rollup_updated_at": "2026-08-03T01:15:06.824226+02:00", "rollup_quality": "partial", "rollup_gap_bucket_count": 0, "rollup_known_gap_bucket_count": 545, "rollup_age_minutes": 0.0, "lag_status": "ok", "source_to_rollup_lag_minutes": 2.1, "notes": ["Known rollup gap accounts for 545 hourly bucket(s)."]}, {"meter": "meter-ripening-rooms-25-31", "status": "ok", "source_status": "ok", "source_latest_ts": "2026-08-03T01:17:10.857837+02:00", "source_age_minutes": 0.0, "rollup_status": "ok", "rollup_last_bucket": "2026-08-03T01:00:00+02:00", "rollup_bucket_end": "2026-08-03T02:00:00+02:00", "rollup_last_sample_ts": "2026-08-03T01:15:03.866414+02:00", "rollup_updated_at": "2026-08-03T01:15:05.705655+02:00", "rollup_quality": "partial", "rollup_gap_bucket_count": 0, "rollup_known_gap_bucket_count": 545, "rollup_age_minutes": 0.0, "lag_status": "ok", "source_to_rollup_lag_minutes": 2.1, "notes": ["Known rollup gap accounts for 545 hourly bucket(s)."]}, {"meter": "meter-mr-building", "status": "warning", "source_status": "ok", "source_latest_ts": "2026-08-03T01:17:07.320503+02:00", "source_age_minutes": 0.1, "rollup_status": "ok", "rollup_last_bucket": "2026-08-03T01:00:00+02:00", "rollup_bucket_end": "2026-08-03T02:00:00+02:00", "rollup_last_sample_ts": "2026-08-03T01:15:02.579130+02:00", "rollup_updated_at": "2026-08-03T01:15:04.856477+02:00", "rollup_quality": "partial", "rollup_gap_bucket_count": 4, "rollup_known_gap_bucket_count": 587, "rollup_age_minutes": 0.0, "lag_status": "ok", "source_to_rollup_lag_minutes": 2.1, "notes": ["Historical rollup is missing 4 hourly bucket(s).", "Known rollup gap accounts for 587 hourly bucket(s)."]}, {"meter": "meter-local-trans", "status": "warning", "source_status": "ok", "source_latest_ts": "2026-08-03T01:17:12.799460+02:00", "source_age_minutes": 0.0, "rollup_status": "ok", "rollup_last_bucket": "2026-08-03T01:00:00+02:00", "rollup_bucket_end": "2026-08-03T02:00:00+02:00", "rollup_last_sample_ts": "2026-08-03T01:15:00.473893+02:00", "rollup_updated_at": "2026-08-03T01:15:03.593458+02:00", "rollup_quality": "partial", "rollup_gap_bucket_count": 36, "rollup_known_gap_bucket_count": 571, "rollup_age_minutes": 0.0, "lag_status": "ok", "source_to_rollup_lag_minutes": 2.2, "notes": ["Historical rollup is missing 36 hourly bucket(s).", "Known rollup gap accounts for 571 hourly bucket(s)."]}, {"meter": "meter-solar-inverter-2", "status": "ok", "source_status": "ok", "source_latest_ts": "2026-08-03T01:17:10.837654+02:00", "source_age_minutes": 0.0, "rollup_status": "ok", "rollup_last_bucket": "2026-08-03T01:00:00+02:00", "rollup_bucket_end": "2026-08-03T02:00:00+02:00", "rollup_last_sample_ts": "2026-08-03T01:15:00.829585+02:00", "rollup_updated_at": "2026-08-03T01:15:02.429591+02:00", "rollup_quality": "partial", "rollup_gap_bucket_count": 0, "rollup_known_gap_bucket_count": 545, "rollup_age_minutes": 0.0, "lag_status": "ok", "source_to_rollup_lag_minutes": 2.2, "notes": ["Known rollup gap accounts for 545 hourly bucket(s)."]}, {"meter": "meter-peoples-market", "status": "warning", "source_status": "ok", "source_latest_ts": "2026-08-03T01:17:12.086018+02:00", "source_age_minutes": 0.0, "rollup_status": "ok", "rollup_last_bucket": "2026-08-03T01:00:00+02:00", "rollup_bucket_end": "2026-08-03T02:00:00+02:00", "rollup_last_sample_ts": "2026-08-03T01:15:02.767335+02:00", "rollup_updated_at": "2026-08-03T01:15:05.064477+02:00", "rollup_quality": "partial", "rollup_gap_bucket_count": 149, "rollup_known_gap_bucket_count": 571, "rollup_age_minutes": 0.0, "lag_status": "ok", "source_to_rollup_lag_minutes": 2.2, "notes": ["Historical rollup is missing 149 hourly bucket(s).", "Known rollup gap accounts for 571 hourly bucket(s)."]}, {"meter": "meter-ripening-rooms-32-37", "status": "ok", "source_status": "ok", "source_latest_ts": "2026-08-03T01:17:10.583528+02:00", "source_age_minutes": 0.0, "rollup_status": "ok", "rollup_last_bucket": "2026-08-03T01:00:00+02:00", "rollup_bucket_end": "2026-08-03T02:00:00+02:00", "rollup_last_sample_ts": "2026-08-03T01:15:03.597429+02:00", "rollup_updated_at": "2026-08-03T01:15:05.847657+02:00", "rollup_quality": "partial", "rollup_gap_bucket_count": 0, "rollup_known_gap_bucket_count": 545, "rollup_age_minutes": 0.0, "lag_status": "ok", "source_to_rollup_lag_minutes": 2.1, "notes": ["Known rollup gap accounts for 545 hourly bucket(s)."]}, {"meter": "meter-compressor-4", "status": "ok", "source_status": "ok", "source_latest_ts": "2026-08-03T01:17:10.820467+02:00", "source_age_minutes": 0.0, "rollup_status": "ok", "rollup_last_bucket": "2026-08-03T01:00:00+02:00", "rollup_bucket_end": "2026-08-03T02:00:00+02:00", "rollup_last_sample_ts": "2026-08-03T01:15:03.832384+02:00", "rollup_updated_at": "2026-08-03T01:15:07.103168+02:00", "rollup_quality": "partial", "rollup_gap_bucket_count": 0, "rollup_known_gap_bucket_count": 545, "rollup_age_minutes": 0.0, "lag_status": "ok", "source_to_rollup_lag_minutes": 2.1, "notes": ["Known rollup gap accounts for 545 hourly bucket(s)."]}, {"meter": "meter-ripening-rooms-a-24", "status": "ok", "source_status": "ok", "source_latest_ts": "2026-08-03T01:17:10.560712+02:00", "source_age_minutes": 0.0, "rollup_status": "ok", "rollup_last_bucket": "2026-08-03T01:00:00+02:00", "rollup_bucket_end": "2026-08-03T02:00:00+02:00", "rollup_last_sample_ts": "2026-08-03T01:15:03.577624+02:00", "rollup_updated_at": "2026-08-03T01:15:05.565324+02:00", "rollup_quality": "partial", "rollup_gap_bucket_count": 0, "rollup_known_gap_bucket_count": 545, "rollup_age_minutes": 0.0, "lag_status": "ok", "source_to_rollup_lag_minutes": 2.1, "notes": ["Known rollup gap accounts for 545 hourly bucket(s)."]}, {"meter": "meter-compressor-5", "status": "ok", "source_status": "ok", "source_latest_ts": "2026-08-03T01:17:10.754374+02:00", "source_age_minutes": 0.0, "rollup_status": "ok", "rollup_last_bucket": "2026-08-03T01:00:00+02:00", "rollup_bucket_end": "2026-08-03T02:00:00+02:00", "rollup_last_sample_ts": "2026-08-03T01:15:03.756411+02:00", "rollup_updated_at": "2026-08-03T01:15:07.243910+02:00", "rollup_quality": "partial", "rollup_gap_bucket_count": 0, "rollup_known_gap_bucket_count": 545, "rollup_age_minutes": 0.0, "lag_status": "ok", "source_to_rollup_lag_minutes": 2.1, "notes": ["Known rollup gap accounts for 545 hourly bucket(s)."]}, {"meter": "meter-grid-power-bulk", "status": "ok", "source_status": "ok", "source_latest_ts": "2026-08-03T01:17:10.673628+02:00", "source_age_minutes": 0.0, "rollup_status": "ok", "rollup_last_bucket": "2026-08-03T01:00:00+02:00", "rollup_bucket_end": "2026-08-03T02:00:00+02:00", "rollup_last_sample_ts": "2026-08-03T01:15:01.321233+02:00", "rollup_updated_at": "2026-08-03T01:15:03.197392+02:00", "rollup_quality": "partial", "rollup_gap_bucket_count": 0, "rollup_known_gap_bucket_count": 569, "rollup_age_minutes": 0.0, "lag_status": "ok", "source_to_rollup_lag_minutes": 2.2, "notes": ["Known rollup gap accounts for 569 hourly bucket(s)."]}, {"meter": "meter-compressor-1", "status": "ok", "source_status": "ok", "source_latest_ts": "2026-08-03T01:17:10.786406+02:00", "source_age_minutes": 0.0, "rollup_status": "ok", "rollup_last_bucket": "2026-08-03T01:00:00+02:00", "rollup_bucket_end": "2026-08-03T02:00:00+02:00", "rollup_last_sample_ts": "2026-08-03T01:15:03.795412+02:00", "rollup_updated_at": "2026-08-03T01:15:06.685090+02:00", "rollup_quality": "partial", "rollup_gap_bucket_count": 0, "rollup_known_gap_bucket_count": 545, "rollup_age_minutes": 0.0, "lag_status": "ok", "source_to_rollup_lag_minutes": 2.1, "notes": ["Known rollup gap accounts for 545 hourly bucket(s)."]}, {"meter": "meter-fv-building", "status": "warning", "source_status": "ok", "source_latest_ts": "2026-08-03T01:17:11.406314+02:00", "source_age_minutes": 0.0, "rollup_status": "ok", "rollup_last_bucket": "2026-08-03T01:00:00+02:00", "rollup_bucket_end": "2026-08-03T02:00:00+02:00", "rollup_last_sample_ts": "2026-08-03T01:15:02.705307+02:00", "rollup_updated_at": "2026-08-03T01:15:04.678119+02:00", "rollup_quality": "partial", "rollup_gap_bucket_count": 1, "rollup_known_gap_bucket_count": 587, "rollup_age_minutes": 0.0, "lag_status": "ok", "source_to_rollup_lag_minutes": 2.1, "notes": ["Historical rollup is missing 1 hourly bucket(s).", "Known rollup gap accounts for 587 hourly bucket(s)."]}, {"meter": "meter-solar-phase-3", "status": "ok", "source_status": "ok", "source_latest_ts": "2026-08-03T01:17:12.336376+02:00", "source_age_minutes": 0.0, "rollup_status": "ok", "rollup_last_bucket": "2026-08-03T01:00:00+02:00", "rollup_bucket_end": "2026-08-03T02:00:00+02:00", "rollup_last_sample_ts": "2026-08-03T01:14:59.721826+02:00", "rollup_updated_at": "2026-08-03T01:15:02.908496+02:00", "rollup_quality": "partial", "rollup_gap_bucket_count": 0, "rollup_known_gap_bucket_count": 0, "rollup_age_minutes": 0.0, "lag_status": "ok", "source_to_rollup_lag_minutes": 2.2, "notes": []}, {"meter": "meter-solar-inverter-1", "status": "ok", "source_status": "ok", "source_latest_ts": "2026-08-03T01:17:10.603483+02:00", "source_age_minutes": 0.0, "rollup_status": "ok", "rollup_last_bucket": "2026-08-03T01:00:00+02:00", "rollup_bucket_end": "2026-08-03T02:00:00+02:00", "rollup_last_sample_ts": "2026-08-03T01:15:00.589679+02:00", "rollup_updated_at": "2026-08-03T01:15:02.284743+02:00", "rollup_quality": "partial", "rollup_gap_bucket_count": 0, "rollup_known_gap_bucket_count": 545, "rollup_age_minutes": 0.0, "lag_status": "ok", "source_to_rollup_lag_minutes": 2.2, "notes": ["Known rollup gap accounts for 545 hourly bucket(s)."]}, {"meter": "meter-banana-trans", "status": "ok", "source_status": "ok", "source_latest_ts": "2026-08-03T01:17:11.082517+02:00", "source_age_minutes": 0.0, "rollup_status": "ok", "rollup_last_bucket": "2026-08-03T01:00:00+02:00", "rollup_bucket_end": "2026-08-03T02:00:00+02:00", "rollup_last_sample_ts": "2026-08-03T01:15:01.771680+02:00", "rollup_updated_at": "2026-08-03T01:15:03.794798+02:00", "rollup_quality": "partial", "rollup_gap_bucket_count": 0, "rollup_known_gap_bucket_count": 571, "rollup_age_minutes": 0.0, "lag_status": "ok", "source_to_rollup_lag_minutes": 2.2, "notes": ["Known rollup gap accounts for 571 hourly bucket(s)."]}, {"meter": "meter-ripening-rooms-51-58", "status": "ok", "source_status": "ok", "source_latest_ts": "2026-08-03T01:17:10.643538+02:00", "source_age_minutes": 0.0, "rollup_status": "ok", "rollup_last_bucket": "2026-08-03T01:00:00+02:00", "rollup_bucket_end": "2026-08-03T02:00:00+02:00", "rollup_last_sample_ts": "2026-08-03T01:15:03.651381+02:00", "rollup_updated_at": "2026-08-03T01:15:06.127443+02:00", "rollup_quality": "partial", "rollup_gap_bucket_count": 0, "rollup_known_gap_bucket_count": 545, "rollup_age_minutes": 0.0, "lag_status": "ok", "source_to_rollup_lag_minutes": 2.1, "notes": ["Known rollup gap accounts for 545 hourly bucket(s)."]}, {"meter": "meter-fine-corner-trans", "status": "ok", "source_status": "ok", "source_latest_ts": "2026-08-03T01:17:11.532956+02:00", "source_age_minutes": 0.0, "rollup_status": "ok", "rollup_last_bucket": "2026-08-03T01:00:00+02:00", "rollup_bucket_end": "2026-08-03T02:00:00+02:00", "rollup_last_sample_ts": "2026-08-03T01:15:02.212898+02:00", "rollup_updated_at": "2026-08-03T01:15:04.276901+02:00", "rollup_quality": "partial", "rollup_gap_bucket_count": 0, "rollup_known_gap_bucket_count": 940, "rollup_age_minutes": 0.0, "lag_status": "ok", "source_to_rollup_lag_minutes": 2.2, "notes": ["Known rollup gap accounts for 940 hourly bucket(s)."]}, {"meter": "meter-ripening-rooms-38-43", "status": "ok", "source_status": "ok", "source_latest_ts": "2026-08-03T01:17:10.769456+02:00", "source_age_minutes": 0.0, "rollup_status": "ok", "rollup_last_bucket": "2026-08-03T01:00:00+02:00", "rollup_bucket_end": "2026-08-03T02:00:00+02:00", "rollup_last_sample_ts": "2026-08-03T01:15:03.770605+02:00", "rollup_updated_at": "2026-08-03T01:15:05.985526+02:00", "rollup_quality": "partial", "rollup_gap_bucket_count": 0, "rollup_known_gap_bucket_count": 545, "rollup_age_minutes": 0.0, "lag_status": "ok", "source_to_rollup_lag_minutes": 2.1, "notes": ["Known rollup gap accounts for 545 hourly bucket(s)."]}, {"meter": "meter-subtropico-fridge", "status": "warning", "source_status": "ok", "source_latest_ts": "2026-08-03T01:17:12.798255+02:00", "source_age_minutes": 0.0, "rollup_status": "ok", "rollup_last_bucket": "2026-08-03T01:00:00+02:00", "rollup_bucket_end": "2026-08-03T02:00:00+02:00", "rollup_last_sample_ts": "2026-08-03T01:15:03.479559+02:00", "rollup_updated_at": "2026-08-03T01:15:05.282903+02:00", "rollup_quality": "partial", "rollup_gap_bucket_count": 149, "rollup_known_gap_bucket_count": 570, "rollup_age_minutes": 0.0, "lag_status": "ok", "source_to_rollup_lag_minutes": 2.2, "notes": ["Historical rollup is missing 149 hourly bucket(s).", "Known rollup gap accounts for 570 hourly bucket(s)."]}, {"meter": "meter-condenser-1-2", "status": "ok", "source_status": "ok", "source_latest_ts": "2026-08-03T01:17:10.734297+02:00", "source_age_minutes": 0.0, "rollup_status": "ok", "rollup_last_bucket": "2026-08-03T01:00:00+02:00", "rollup_bucket_end": "2026-08-03T02:00:00+02:00", "rollup_last_sample_ts": "2026-08-03T01:15:03.741648+02:00", "rollup_updated_at": "2026-08-03T01:15:06.266292+02:00", "rollup_quality": "partial", "rollup_gap_bucket_count": 0, "rollup_known_gap_bucket_count": 545, "rollup_age_minutes": 0.0, "lag_status": "ok", "source_to_rollup_lag_minutes": 2.1, "notes": ["Known rollup gap accounts for 545 hourly bucket(s)."]}]}