Skip to content

Power Sentry — городская сеть контроля протечек ЖКХ на LoRaWAN

Вершинный проект курса и материал программы «Инженеры будущего»: от одного автономного датчика протечки до инженерного обоснования сети контроля ЖКХ на весь город. Три узла на E77-900MBL (STM32WLE5) с настоящим энергосбережением спят в Stop2 (~единицы мкА) и просыпаются только по делу — протечка по фронту EXTI, климат по таймеру RTC — и шлют короткие LoRaWAN-уплинки в инфраструктуру ChirpStack → Node-RED → TimescaleDB → Grafana. Исходный код, врайтап и городской документ — в firmware/Projects/LORAWAN/PowerSentray.

Соль проекта — не датчики, а энергобюджет и масштаб. Центральный тезис: город масштабируется не дальнобойностью радио, а энергоэффективностью LoRaWAN — редкость выхода в эфир (событийная модель + send-on-change) даёт одновременно годы жизни от батарейки И десятки тысяч узлов на один шлюз. Python-стенд sentry_city_sim.py делает тезис измеримым: ползунками задаёте число узлов и частоту уплинков и видите ёмкость шлюза (ALOHA, PDR) и срок жизни флота по реальным формулам LoRaWAN. Материалы рассчитаны на старшую школу и студентов.

Методическое пособие: Power Sentry — от узла до городской сети ЖКХ

Уровень: старшая школа / студенты первых курсов. Это вершинный проект курса «Радио своими руками» и материал программы «Инженеры будущего»: ученик проходит путь от одного автономного датчика протечки до инженерного обоснования сети на весь город.

Стенд: три узла на E77-900MBL (STM32WLE5) с настоящим энергосбережением — спят в Stop2 (~единицы мкА), просыпаются только по делу (протечка — по фронту EXTI, климат — по таймеру RTC), шлют короткие LoRaWAN-уплинки в инфраструктуру ChirpStack → Node-RED → TimescaleDB → Grafana. Соль проекта — не датчики, а энергобюджет и масштаб: почему именно энергоэффективность LoRaWAN позволяет одному шлюзу нести десятки тысяч узлов, а узлу — жить годами от батарейки.

Технический разбор городской сети — в CityScale_PowerSentry.md, этапы сборки и «охота на микроамперы» — в Writeup_PowerSentry.md, железо — в README_PowerSentry.md. Python-стенд sentry_city_sim.py делает тезис масштаба измеримым: ползунками задаёте число узлов и частоту уплинков — и видите ёмкость шлюза и срок жизни флота.

Центральный тезис курса, который ученик должен уметь защитить:

Город масштабируется не дальнобойностью радио, а энергоэффективностью протокола. Редкость выхода в эфир даёт одновременно годы жизни от батарейки И десятки тысяч узлов на шлюз — это две стороны одной монеты.

Кто чем пользуется

  1. Инженер отвечает за стенд: три узла, разводка, «охота на микроамперы» мультиметром, серверная цепочка до Grafana.
  2. Учитель ведёт уроки от энергобюджета одного узла к арифметике города.
  3. Методист привязывает энергетику, ёмкость сети и безопасность к программе.

Модуль 1. Энергия как бюджет: почему узел живёт годами

Урок 1. Ток сна решает всё, а не ток передачи

  • Тема: заряд как ресурс (мА·ч), баланс мощностей, порядки величин.
  • Стенд: sentry_city_sim.py (график срока жизни). Параметры: I_SLEEP, TX-бюджет.

Ход работы. Запустите uv run sentry_city_sim.py. Правый график — срок жизни узла от пары AA против частоты уплинков. Поставьте событийный режим (~2 уплинка/сут) — десятилетия; сдвиньте к «раз в минуту» — год. В нижней сводке смотрите долю бюджета, уходящую на сон.

На графике:

 срок жизни, лет (лог)
   30│●─────── событийный ЖКХ (2/сут): сон = 85% бюджета
     │      ╲___
    1│           ●── раз в минуту: эфир съел батарею
     └──────────────────► уплинков в сутки (лог)

Разбор. Заряд батареи — это бюджет в мА·ч, и он тратится двумя статьями: постоянный ток сна и импульсы активности (замер + передача). У событийного датчика активность редка, поэтому 85% заряда уходит на сон — и весь срок жизни определяется током сна (Stop2, ~2 мкА), а не пиком передачи (~45 мА). Контринтуитивно: передача жрёт в 20 000 раз больше тока, но длится доли секунды дважды в сутки, а сон «жрёт» микроамперы, но 24 часа. Отсюда инженерное правило событийных систем: воюй за ток сна. Один болтливый узел (уплинк в минуту) ломает бюджет — доля эфира растёт в сотни раз, и десятилетия превращаются в год.

Практическое задание. По формуле бюджета (в коде node_life_years) посчитайте на бумаге суточный расход при 2 уплинках/сутки и сравните вклад сна и эфира. Во сколько раз надо участить уплинки, чтобы эфир сравнялся со сном по расходу?


Урок 2. Охота на микроамперы: найти каждого едока

  • Тема: измерение малых токов, методика, систематические ошибки прибора.
  • Стенд: реальный узел + мультиметр (Writeup, этап 3). Параметр: DEBUG_NO_SLEEP.

Ход работы. По методике врайтапа: мультиметр в разрыв питания, диапазон мА → дождаться [СОН] → переключить на мкА → читать. Дети-детективы заполняют таблицу «едок → мкА → как поймали»: светодиод платы, LDO, неусыплённое радио, внутренняя подтяжка на мокром электроде, висящие входы.

Разбор. Реальный ток стенда узнаётся только измерением — кристалл в Stop2 ест ~1-2 мкА, но отладочная плата MBL добавляет своё (LDO, светодиоды, обвязка ST-Link). Это не баг проекта, а его главный урок: бюджет считает худшего участника цепи. Отдельно — измерительная культура: на диапазоне мкА шунт мультиметра роняет питание импульсной нагрузкой (burden voltage), поэтому TX-пик меряют на мА, а сон — на мкА, и ставят конденсатор 100-470 мкФ, чтобы пики брал он. Почему это важно на масштабе: в городе нет питания в колодце, и лишние 100 мкА «съеденные платой» умножаются на тысячи узлов и годы — становятся вагонами замен батарей.

Практическое задание. Датчик движения RCWL-0516 ест ~3 мА ВСЕГДА, даже при спящем камне. Посчитайте срок жизни такого узла от пары AA и объясните, почему «спящий процессор» его не спасает. Какие три выхода предлагает README?


Модуль 2. Событийная модель: send-on-change и две парадигмы

Урок 3. EXTI против RTC: разбудить по делу или по расписанию

  • Тема: прерывания и события, энергоэффективная архитектура, компромисс.
  • Параметры: attachInterruptWakeup (EXTI) vs deepSleep(ms) (RTC).

Ход работы. Разбор двух узлов по коду. Узел протечки спит НЕОГРАНИЧЕННО и будится самим датчиком (вода замыкает электрод → фронт на ноге → EXTI). Климат-узел будится таймером раз в период, меряет, решает слать или молчать. На стенде: мокрый палец на электроды мгновенно будит узел протечки из сна (EXTI ВОДА).

Разбор. Две парадигмы пробуждения — соль энергоэффективности. EXTI идеален для редких событий (вода, движение, дверь): средний ток = ток сна, потому что событий может не быть месяцами. RTC — для величин, которые надо мерить регулярно (температура), но и тут спасает send-on-change: слать только изменения плюс редкий heartbeat. «Молчит по расписанию» = «всё стабильно», а не «умер» — за это отвечает heartbeat, и именно его возраст мониторит диспетчер. Каждый несостоявшийся уплинк — это заряд, оставшийся в батарее, И место, освобождённое в эфире для других узлов.

Практическое задание. Почему для датчика протечки выбрана EXTI, а не «проверять воду раз в минуту по таймеру»? Посчитайте разницу в сроке жизни между этими двумя подходами (в стенде: 2 уплинка/сут против пробуждения раз в минуту).


Урок 4. Подтверждение и дребезг: брызги — не потоп

  • Тема: фильтрация ложных срабатываний, гистерезис, надёжность решения.
  • Параметры: LEAK_CONFIRM_MS, DRY_CONFIRM_MS, LEAK_REPEAT_MS.

Ход работы. На стенде: короткое касание мокрым пальцем (<2 с) → ложная (брызги), никакого уплинка. Держать дольше → подтверждение 2 cТРЕВОГА. Убрать → через 30 с сухо → ОТБОЙ.

Разбор. Событие «вода» подтверждается 2 секундами непрерывного контакта: брызги, конденсат, случайная капля не должны поднимать аварийный наряд. Отбой — наоборот, требует 30 с сухости (гистерезис: пороги входа и выхода разные, чтобы не «дребезжать» на границе). Пока мокро — повтор в эфир не чаще раза в 10 минут: duty cycle и батарея дороже паники. Это тот же компромисс «ложные тревоги ↔ пропуски», что в проектах RFCurtain и BeaconRadio, но здесь ценой ошибки становятся реальный наряд бригады и реальный заряд батареи в недоступном колодце.

Практическое задание. Почему подтверждение воды — 2 с, а подтверждение сухости — 30 с (в 15 раз дольше)? Что хуже для города: на 30 с позже увидеть, что подвал высох, или на 30 с раньше снять тревогу с ещё мокрого подвала?


Модуль 3. Масштаб города: арифметика LoRaWAN

Урок 5. Ёмкость шлюза: почему редкость уплинков = десятки тысяч узлов

  • Тема: ALOHA, вероятность коллизии, пропускная способность канала.
  • Стенд: sentry_city_sim.py (левый график PDR). Параметр: частота уплинков.

Ход работы. В стенде поставьте событийный режим (2 уплинка/сут) и двигайте число узлов — PDR держится у 100% до десятков тысяч. Теперь поставьте «раз в минуту» — PDR обваливается уже на сотне узлов. Один и тот же узел, разная частота эфира.

На графике:

 PDR, %
  100│●●●●●●●●●●●●●●● событийный (2/сут): 95% до ~30 000 узлов
     │              ╲
     │  раз/мин: ●╲__ 95% уже на ~100 узлах
     └──────────────────► узлов на шлюз (лог)

Разбор. Приём в LoRaWAN — это ALOHA: узлы передают когда захотят, два наложившихся во времени кадра гибнут. Доля доставленных кадров ≈ e^(−2G), где G — нагрузка канала, пропорциональная числу узлов × частоту уплинков × airtime кадра. Отсюда ключевой факт масштаба: ёмкость сети упирается не в радио, а в суммарный трафик. Сенсор, шлющий раз в сутки, позволяет 30 000+ узлов на шлюз; раз в минуту — меньше сотни. Разница в 300 раз — это не разное железо, а разная частота выхода в эфир. Вот почему городская сеть ЖКХ обязана быть событийной: только так один шлюз на район несёт десятки тысяч точек контроля.

Практическое задание. По формуле G из кода посчитайте нагрузку канала для 10 000 узлов при 2 уплинках/сут (SF10, airtime 0.29 с, 8 каналов). Оцените PDR по e^(−2G). Во сколько раз упадёт допустимое число узлов, если перейти с SF10 на SF12 (airtime ~1 с)?


Урок 6. ADR и Class A: как протокол экономит за узел

  • Тема: адаптивные системы, приёмные окна, разделение ответственности.
  • Параметры: setADR, sendReceive (Class A), SF vs airtime.

Ход работы. Разбор по документу CityScale, §3. В стенде двигайте ползунок SF и смотрите, как airtime кадра растёт с SF7 (~40 мс) до SF12 (~1 с) — и как это бьёт по ёмкости и энергии одновременно.

Разбор. Два механизма LoRaWAN работают на энергоэффективность бесплатно для узла. Class A: узел — инициатор, радио включается только на передачу и два коротких приёмных окна после неё; всё остальное время выключено — потому средний ток и решает сон, а не приём. ADR: сеть сама подсказывает каждому узлу минимальный достаточный SF — близкий к шлюзу уходит на быстрый SF7 (короче эфир = меньше энергии И меньше занятого канала), дальний в подвале — на дальнобойный SF12. Меньше SF выгоден дважды: экономит батарею узла и освобождает канал для соседей. Это пример разделения ответственности: тяжёлую работу (выбор SF по качеству линка) делает сервер, узел лишь исполняет — и остаётся простым и экономным.

Практическое задание. Почему на стенде ADR намеренно выключен (setADR(false)), а в городе включён? Что даёт городу переход тысячи узлов с фиксированного SF10 на индивидуальный ADR — по энергии и по ёмкости сети одновременно?


Урок 7. Безопасность инфраструктуры: почему город — не игрушка

  • Тема: шифрование, целостность (MIC), защита от повтора, управление ключами.
  • Параметры: AES-128/AES-CMAC LoRaWAN, FCnt, ABP vs OTAA.

Ход работы. Разбор по CityScale, §6, в связке с проектом FoxHunter (где однобайтовая подпись ломается брутфорсом за минуты). Противопоставить игрушечную подпись FoxHunter и 4-байтовый MIC LoRaWAN.

Разбор. Сеть, поднимающая аварийные наряды города, — инфраструктура, и её защита обязательна. LoRaWAN несёт её из коробки: полезная нагрузка шифруется AES-128, каждый кадр подписан 4-байтовым MIC (AES-CMAC) — подделать без ключа нереально (2³² вариантов против 256 у игрушечной подписи FoxHunter). Монотонный счётчик FCnt отбивает replay-атаку (тот же механизм, что охотник в FoxHunter применял вручную). На проде — OTAA вместо стендового ABP: сессионные ключи выдаются при подключении, не лежат в прошивке, компрометация одного узла не вскрывает сеть. Приватный ChirpStack держит данные ЖКХ и ключи под контролем города, а не в чужом облаке.

Практическое задание. Сравните защиту FoxHunter (1-байтовая подпись, ручной счётчик) и LoRaWAN (AES-CMAC 4 байта, FCnt, OTAA). Какие три слабости игрушечного протокола закрывает LoRaWAN и каким механизмом каждую? Почему для городской сети это не опционально?


Модуль 4. Экономика и защита проекта

Урок 8. От микроампера до городского бюджета: обоснование сети

  • Тема: инженерно-экономическое обоснование, CAPEX/OPEX, окупаемость.
  • Материалы: CityScale §1-2, §7 (дорожная карта).

Ход работы. Дискуссия и расчёт. Потери воды в сетях — крупная скрытая статья ЖКХ: поднятая, очищенная, закачанная вода утекает через свищи, а счётчик потребителя её не видит. Раннее обнаружение переводит «прорвало-затопило-экстренная бригада» в «датчик увидел воду ночью — слесарь к открытию». Обсудите: CAPEX сети (шлюзы + узлы, узлы бесплатны в эфире) против экономии на потерях и авариях; почему LoRaWAN бьёт альтернативы не радио, а экономикой (нет абонплаты за SIM × тысячи узлов, нет прокладки кабеля в каждый подвал).

Разбор. Инженер будущего защищает не поделку, а решение с четырьмя опорами: энергобюджет (годы автономии), ёмкость сети (город на нескольких шлюзах), модель безопасности (AES, OTAA, приватная сеть) и экономическое обоснование (окупаемость на сокращении потерь). Все четыре — прямые следствия правильного выбора технологии и событийной архитектуры. Это и есть переход от «датчик мигает» к «система, за которую город платит деньги».

Практическое задание (защита проекта). Подготовьте 5-минутную защиту сети Power Sentry для «города»: формат пакета, бюджет энергии (со своими измеренными числами из урока 2), расчёт ёмкости шлюза (из стенда), модель безопасности, фазы развёртывания. Критерий — воспроизводимость: может ли другая команда по вашему обоснованию повторить расчёт.


Приложение: таблица переноса концепций в индустрию

Концепция из проектаГде встречается за пределами лаборатории
Бюджет заряда, ток сна vs передачиЛюбая автономная электроника, IoT, носимые устройства
Событийная модель (EXTI) + send-on-changeПромышленная телеметрия, умный город, сенсорные сети
ALOHA, ёмкость канала, PDRПроектирование радиосетей, Wi-Fi, сотовая связь
ADR / адаптивная скоростьСотовые сети, Wi-Fi rate adaptation, LPWAN
Class A / приёмные окнаЭнергоэффективные протоколы, BLE, Zigbee
AES шифрование + MIC + счётчикВся защищённая связь: TLS, LoRaWAN, платёжные системы
Инженерно-экономическое обоснованиеЛюбой инфраструктурный проект, стартап, тендер

Заключение

Power Sentry ведёт ученика от одного микроампера тока сна к сети на весь город — и на каждом шаге показывает, что масштаб рождается не из мощности радио, а из энергоэффективности протокола. Событийная модель, за которую воюют в первых уроках ради лишнего года жизни от батарейки, оказывается тем же самым решением, которое позволяет одному шлюзу нести десятки тысяч узлов: редкость уплинков — это и годы, и ёмкость сразу. LoRaWAN складывает энергосбережение, дальность, ёмкость и безопасность в одну технологию, идеально совпадающую с профилем задачи ЖКХ, — и в этом совпадении, а не в отдельном рекордном параметре, и состоит инженерное решение. Стенд sentry_city_sim.py делает весь этот тезис измеримым: подвигайте ползунки и увидите своими глазами, где проходит граница между «датчик на столе» и «инфраструктура города».