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 делает тезис масштаба измеримым: ползунками задаёте
число узлов и частоту уплинков — и видите ёмкость шлюза и срок жизни флота.
Центральный тезис курса, который ученик должен уметь защитить:
Город масштабируется не дальнобойностью радио, а энергоэффективностью протокола. Редкость выхода в эфир даёт одновременно годы жизни от батарейки И десятки тысяч узлов на шлюз — это две стороны одной монеты.
Кто чем пользуется
- Инженер отвечает за стенд: три узла, разводка, «охота на микроамперы» мультиметром, серверная цепочка до Grafana.
- Учитель ведёт уроки от энергобюджета одного узла к арифметике города.
- Методист привязывает энергетику, ёмкость сети и безопасность к программе.
Модуль 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) vsdeepSleep(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
делает весь этот тезис измеримым: подвигайте ползунки и увидите своими глазами, где
проходит граница между «датчик на столе» и «инфраструктура города».