OpenDQV Cloud starter template (v0.1) — your tenant inherits this baseline. First customer edit creates v1.0 in your audit trail; pin by yaml_hash for replay. Water utility meter reading validation. Enforces Ofwat data quality requirements for meter reading records in the UK Open Water market. Validates read type classification (actual/estimated/customer/smart) per Market Operator Services Limited (MOSL) standards, meter status lifecycle values, anomaly detection on consumption volumes (readings > 1,000 m3 in a single period are likely data entry errors or leak indicators requiring investigation), and monotonic meter progression (current cumulative reading must be >= previous reading). Prevents erroneous readings from triggering incorrect billing, false leak alerts, or water efficiency misreporting under Environment Agency obligations.
| Rule | Field | Severity | What it enforces (the message your team sees) |
|---|---|---|---|
| meter_id_required | meter_id | error | meter_id is required |
| reading_date_format | reading_date | error | reading_date must be a valid date (YYYY-MM-DD) |
| consumption_m3_min | consumption_m3 | error | consumption_m3 must be >= 0 |
| consumption_m3_anomaly | consumption_m3 | warning | consumption_m3 exceeds 1,000 m3 — verify meter reading for data entry error, meter fault, or unreported leak (Ofwat PR24 leakage reporting obligations apply) |
| customer_id_required | customer_id | error | customer_id is required |
| site_id_required | site_id | error | site_id is required |
| meter_status_required | meter_status | error | meter_status is required |
| meter_status_values | meter_status | error | meter_status must be one of: active, inactive, replaced, faulty, removed, awaiting_installation, decommissioned (MOSL MDD meter asset lifecycle values) |
| read_type_values | read_type | error | read_type must be one of: actual, estimated, customer, smart, check, final (MOSL read type classification — estimated reads are not valid for billing disputes or leakage reporting) |
| tariff_zone_required | tariff_zone | error | tariff_zone is required |
| previous_reading_m3_min | previous_reading_m3 | error | previous_reading_m3 must be >= 0 |
| current_reading_monotonic | current_reading_m3 | error | current_reading_m3 must be >= previous_reading_m3 — a lower current reading indicates meter rollover, meter replacement, or data entry error. Set meter_status = replaced if meter was exchanged. |
Run your own data against this contract in the free trial — drop a CSV in the dashboard, no code, no credit card. Start free trial →