Зоны водоучёта и утечки
Зоны водоучёта (DMA) модели водопровода: сеть делится трубами с расходомерами, по каждой зоне — подача и минимальный ночной расход; расчёт с утечкой показывает, заметят ли её расходомеры зоны.
Возможности
- «Трубы с расходомерами» — отметить трубы, на которых стоят расходомеры (вводы зон), и «Сохранить»: сеть делится на зоны водоучёта (DMA).
- Таблица зон по выбранному расчёту: «Зона» с цветом и видом («район водоучёта», «источник», «без потребителей», ёмкости внутри), «Узлы», «Подача, л/с», «МНР, л/с» с часом минимума, «МНР / средн.».
- «Зоны на карте» — сеть на карте окрашивается по зонам: трубы с расходомерами — толстые чёрные, прочие границы (насосы, арматура, закрытые трубы) — серые.
- «Утечка в узле» и «Отверстие, см²» → «Рассчитать с утечкой» — расчёт суток с утечкой; он появляется в списке «Расчёт» как «№21 · утечка 105 (10 см²)» и сразу выбирается.
- Для расчёта с утечкой в таблице добавляются «Утечка, л/с», «Рост МНР» с порогом и «По расходомерам» — «заметна» или «не заметна»; под таблицей — расход и объём утечки за сутки, вывод по её зоне и показания каждого расходомера против базового расчёта.
Как это работает
Зоны. Зона — связная часть сети, если разрезать её по границам: трубам с расходомерами, насосам, арматуре EPANET (редукционные, регулирующие клапаны и т. п.) и закрытым трубам. Номер зоны — по числу узлов с отбором: «Зона 1» — крупнейшая. Вид: «район водоучёта» — в зоне есть отбор; «источник» — отбора нет, но есть резервуар или бак; «без потребителей» — ни того, ни другого. Отбор узла для этого — средний за сутки по графикам отбора модели. Столбец «Узлы» — число узлов с отбором (без резервуаров и баков). На карте районы водоучёта получают цвета по порядку (до восьми), девятый и дальше и зоны-источники — серые.
Расходомеры. Это только отметка трубы в модели: список хранится в модели (tgid_water_model.meters), до 500 труб; насос или узел расходомером не отмечается. Зоны и баланс пересчитываются при каждом открытии по текущему списку, поэтому после смены расходомеров баланс старых расчётов тоже считается по новым зонам.
Баланс. По каждому шагу расчёта: подача в зону = расход через её границы внутрь (минус наружу) + вода, которую отдали резервуары и баки зоны; потребление = отбор узлов зоны (вместе с утечкой). В расчёте EPANET подача равна потреблению — расхождение показывает неполные границы. «Подача, л/с» — среднее за расчёт, «МНР» (минимальный ночной расход) — наименьшая подача за шаги и час, когда он был, «МНР / средн.» — его доля от средней подачи (только у районов водоучёта). Высокая доля значит, что в подаче много расхода, не зависящего от режима потребления, — признак утечек или крупного абонента с ровным отбором.
Утечка. Утечка моделируется истечением из отверстия в узле (излучатель EPANET): Q = Cd · A · √(2g) · √P, Cd = 0,75, A — площадь отверстия, P — давление в узле; при отрицательном давлении утечки нет. Площадь — больше 0 и до 500 см², узел — только узел с отбором (Junction). Окно считает одну утечку за раз, сутки с шагом 1 ч (API принимает до 20 утечек). «Утечка, л/с» — средний расход утечки за расчёт, объём «за период» — сумма по часам.
Заметна ли. Расчёт с утечкой сравнивается с базовым — последним расчётом той же модели без утечек и отключений с тем же числом шагов (его номер — в строке «Расходомеры (…изменение против расчёта №18)»). Для каждой зоны — рост МНР; утечка «заметна», если рост больше max(0,1 л/с; 5 % базового МНР зоны) — с запасом над погрешностью учёта ~2 %. Вывод делается только для районов водоучёта. Если утечка не заметна, зону стоит разделить дополнительными расходомерами.
Что нужно для работы
- Модель водопровода и хотя бы один её расчёт: без расчёта таблица показывает только зоны.
- Смотреть зоны и баланс — любой вошедший; расходомеры без прав видны, но не меняются.
- «Сохранить» расходомеры — право «Справочники и шаблоны карточек» и включённая запись на сервере (
MUTATIONS_ENABLED). - «Рассчитать с утечкой» — право «Расчёты» и работающий расчётный движок водопровода.
- Для вывода «заметна / не заметна» — базовый расчёт без утечки («Рассчитать сутки»).
Шаги
Откройте «Инструменты» и наберите в поиске «Водопровод: расчёт сети» — пункт выделен рамкой.

Нажмите пункт — откроется окно.

Выберите модель (на снимке — учебная Net3 с расходомерами 129, 171, 204, 229, 238) и в списке «Расчёт» — расчёт с утечкой. Таблица «Зоны водоучёта (DMA)»: по каждой зоне — подача, минимальный ночной расход (МНР) с часом и его доля от средней подачи; у расчёта с утечкой — расход утечки, рост МНР против базового расчёта с порогом и вывод «заметна» или «не заметна». Расходомеры меняют в поле «Трубы с расходомерами» и кнопкой «Сохранить»; «Зоны на карте» окрашивает сеть по зонам.

Под таблицей — итог по утечке: её расход и объём за сутки, на сколько вырос ночной расход её зоны и заметят ли её расходомеры; ниже — показания каждого расходомера против базового расчёта. Новый расчёт: «Утечка в узле», «Отверстие, см²» и «Рассчитать с утечкой» — он появится в списке «Расчёт» и сразу выберется.

Примеры
Копия Алматы, своя копия Net3: расходомеры 129, 171, 204, 229, 238. Сеть разбилась на 6 зон: «Зона 1» — 49 узлов, бак 1; «Зона 2» — 21 узел, бак 2; «Зона 3» — 14 узлов, бак 3; «Зона 4» — 7 узлов; «Зона 5» и «Зона 6» — источники River и Lake. Базовый расчёт №18: «Зона 1» — подача 305,3 л/с, МНР 200,8 в 4 ч (66 %); «Зона 4» — 304,8 л/с, МНР 290,9 в 19 ч (95 %). Доля 95 % в «Зоне 4» — не утечка: в ней узел 203 с почти ровным отбором около 290 л/с круглые сутки.
Та же модель: утечка заметна. «Утечка в узле» 105, «Отверстие» 10 см² → расчёт №21 за 2 с: «Утечка в узле 105 (Зона 1): 20,9 л/с, 1 807,1 м³ за период. Ночной расход зоны вырос на 22 л/с при пороге 10 — расходомеры зоны её заметят.» В строке «Зона 1»: подача 326,2, МНР 222,8 в 4 ч, «+22, порог 10», «заметна»; в остальных районах — «не заметна».
Модель «Net3» на той же копии: утечка не заметна. Сохранённые расчёты: узел 105, 2 см² (№4) — 4,2 л/с, МНР «Зоны 1» вырос на 4,5 л/с при пороге 10 — не заметна: зона слишком велика. Узел 207, 3 см² (№5) — 6,4 л/с в «Зоне 4», рост 6,4 при пороге 14,5 — тоже нет: порог задаёт крупный ночной отбор узла 203. Узел 141, 5 см² (№3) — 11,3 л/с в «Зоне 3», рост 11,3 при пороге 0,8 — заметна.
Если не получается
- «Нет базового расчёта без утечек с тем же периодом…» — сравнивать не с чем: сначала «Рассчитать сутки» без утечки.
- «Нет базового расчёта без утечек с тем же периодом — сравнивать не с чем: рассчитайте сутки без утечки.» — нет расчёта для сравнения: нажмите «Рассчитать сутки» и повторите расчёт с утечкой (или выберите его в «Расчёт» — сравнение строится при открытии).
- «Рассчитать с утечкой» неактивна — не выбран узел, площадь вне 0…500 см², идёт другой расчёт или движок недоступен.
- «Зоны водоучёта не загрузились», «Баланс по зонам не посчитан», «Расходомеры не сохранены», «Расчёт с утечкой не выполнен» — с текстом ответа сервера.
- «Некорректные параметры запроса: Не трубы модели: …» — расходомер поставлен не на трубу (через API).
- В таблице одна большая зона — расходомеров нет или они не замыкают границу: у закольцованной сети зону отделяют несколько расходомеров сразу.
Для администратора
- Расходомеры — колонка
metersвtgid_water_model(миграцияsql/migrations/20261101_water_zones.sql). Баланс не хранится: считается по сохранённым результатам расчёта при каждом запросе. - Порог заметности (
DETECT_SHARE= 5 %,DETECT_MIN_LS= 0,1 л/с) и предел расходомеров (500) — константыdatabase/water_zones.py.
Для разработчика
- API (
routers/water.py, логика —database/water_zones.py):GET /api/v1/water/models/{id}/zones,PUT /api/v1/water/models/{id}/meters(links),GET /api/v1/water/models/{id}/runs/{run}/balance?baseline=(безbaseline— последний подходящий базовый расчёт), расчёт с утечкой —POST /api/v1/water/models/{id}/runsсleaks: [{node, area_cm2}]. - Движок: утечки —
add_leaksвwater_engine/engine.py(излучатель EPANET), расход утечки по шагам —summary.leaks[].flow_lsрасчёта. - Веб:
components/WaterZonesPanel.vue(внутриWaterDialog.vue),utils/water.ts(zoneColors,zoneFrame,ZONE_KIND_LABEL,runLabel). - Тесты: API —
tests/test_water_zones.py; веб —tests/utils/water.spec.ts(«зоны водоучёта»); e2e —e2e/functions/water.spec.ts(«зоны водоучёта: расходомеры, баланс по зонам и утечка — как в API»).
