Як я зробив свій моніторинг для домашньої сонячної електростанції — і чому вам, можливо, теж стане в нагоді

💡 Усі статті, обговорення, новини про Mobile — в одному місці. Приєднуйтесь до Mobile спільноти!

Привіт, ДОУ. Я Іван, інженер-розробник. Останні кілька місяців, окрім основної роботи, я повільно і впевнено пиляю свій pet-project, який непомітно перетворився на стартап — Svitgrid. Це моніторинг для домашніх сонячних електростанцій: мобільний застосунок, бекенд на GCP і власна залізяка на ESP32.

Цей пост — не «купуйте, будь ласка». Цей пост — для тих, хто або вже має панелі, або копає в бік ембеддед, або хоче подивитися, як виглядає реальний side-project, який доїхав до App Store і Play Market, а не помер на стадії «архітектурного діаграмування в Excalidraw».

Контекст: чому взагалі це з’явилось

У мене, як і в багатьох з нас за останні три роки, з’явилася потреба не сидіти без світла. Купив гібридний інвертор Deye, акумулятори, панелі. До інвертора йде «фірмовий» застосунок (хто має — той зрозуміє, як це працює, і що з ним відбувається при перших же −10 на вулиці).

Натомість я хотів:

  • мати по-людськи зроблений UI для зміни налаштувань інвертора — без шаманства з регістрами та трьох вкладених меню в стилі Win95.
  • бачити графіки в реальному часі, без 30-секундних спінерів;
  • розуміти, звідки зараз тече ват (PV → батарея → дім → мережа);
  • мати прогноз на декілька днів з урахуванням погоди, щоб планувати споживання;
  • ділитися доступом з родиною без «пересилки логіну і пароля»;

Спойлер: жоден з існуючих застосунків не закривав це нормально. Solarman, SolarAssistant, Home Assistant з купою YAML — у кожного є свій сорт болю. Ну і я програміст, я не можу просто терпіти — я мушу поверх свого болю накодити ще більше болю. Так і вийшов Svitgrid.

Що це таке, одним абзацом

Це застосунок для iOS/Android (плюс веб) + бекенд + опціональна edge-залізяка, яка стоїть біля інвертора і шле телеметрію в хмару 24/7. Технологічно: Flutter + Riverpod на мобільному, TypeScript + Fastify на API, Cloud Run + Firestore + Cloud Functions на GCP, ESP-IDF © на залізі.

Архітектура одним поглядом

Два паралельні шляхи доставки даних з інвертора у хмару — про це нижче окремо.

Що реально працює прямо зараз

1. Активна підтримка Deye (та родичів)

Я почав з 3-фазного Deye SG04LP3 (бо він стоїть у мене), і поступово розширив підтримку на 15+ моделей з тим самим протокольним стеком: усі однофазні і трифазні гібриди Deye, Sunsynk (це ребренд Deye), Sol-Ark (це теж ребренд для США), а також Victron через нативний Modbus TCP.

Регістрова мапа взята з open-source реверс-інженірингу спільноти (kbialek/deye-inverter-mqtt, kellerza/sunsynk) і відмаплена в єдину абстракцію — packages/inverter_protocol, спільну для застосунку і прошивки.

Якщо у вас Deye/Sunsynk/Sol-Ark — з ~95% імовірністю воно «просто заведеться» через ваш існуючий WiFi-стік (LSW-3, LSE-3, тощо).

2. Два режими збору даних: Mobile Harvester vs Edge

Ось тут найцікавіше архітектурне рішення.

Mobile Harvester — режим, у якому ваш телефон (з відкритим застосунком, у домашньому WiFi) сам опитує інвертор раз на N секунд і шле в хмару. Нуль додаткового заліза, нуль вартості, заведеться за 60 секунд — ідеально, щоб «помацати» продукт.

На практиці частина юзерів навіть виділяє під це окремий старий телефон, який живе на зарядці поруч з інвертором. Працює, але чесно: це костиль. Обмежень багато — iOS/Android агресивно вбивають фонові процеси, WiFi може відвалитися, телефон може перезавантажитися «для оновлень». У реальних умовах режим часто збоїть і в графіку утворюються «діри», про які застосунок чесно повідомляє.

Edge connector — невеличка плата на ESP32-S3, яка живиться від USB-C і робить те саме 24/7, незалежно від телефона. Опитує інвертор через WiFi, буферизує локально (на випадок втрати інтернету — ~3 години в кільцевому буфері в окремій flash-партиції), шле батчами з gzip-стисненням. Тих самих «дір» більше нема.

Чесно про статус заліза: зараз я роздаю hand-made пристрої власної збірки (два готові модулі ESP32-S3 + ESP32-H2, з’єднані по UART, у 3D-друкованому корпусі — фото нижче). Працює, але виглядає як «зроблено інженером для інженерів».

Паралельно вже розробляється повноцінна PCB-плата — з усім на одній платі, з кнопками RESET/BOOT для обох чіпів, перемикачем USB між S3/H2 для прошивки, нормальним BOM’ом і корпусом. Ось як це виглядає в 3D-рендері з KiCad:

План: коли перша партія приїде з фабрики і пройде валідацію — переходимо на «ship-ready» формат: розпакував → увімкнув → працює.

Як отримати залізяку. Якщо хочете edge-пристрій у себе вже зараз — це поточна hand-made-партія, і її можна замовити тут: svitgrid.app/gateway. Перші користувачі отримують пристрій, мою особисту увагу до сетапу і пріоритет у бета-каналі OTA.

Користувач сам вирішує, з чого почати: спробуйте з телефона, сподобалось — додайте залізяку.

2.1. Підтримка multi-inverter топологій

Окремо — про конфігурації з більш ніж одним інвертором. Я свідомо вкладаюсь у це, бо домогосподарства з 8+ кВт сонця часто мають паралельну зв’язку Deye master + slave (один master керує, slave-и тягнуть навантаження). Бачив достатньо випадків, коли в таких сетапах фірмовий застосунок або взагалі не бачить slave-інвертор, або показує його як окремий «дім» без агрегації — це боляче.

У Svitgrid це працює нормально: команди йдуть тільки в master (slave-и керуються через inter-inverter link), але метрики читаються з кожного індивідуально. Виглядає це ось так — реальний дім «RubHome», 5.9 кВт сумарної генерації з 4 PV-стрінгів, master і slave з власними батареями і температурою, 5.1 кВт експорту в мережу, плюс інтеграція з розумним навантаженням (лампочка зліва внизу) і виведений графік відключень нагорі:

Що з рештою топологій: наразі добре підтримується Deye master-slave (включно з мікс-конфігураціями). У roadmap:

  • 3-фазні «віртуальні» зв’язки (3 однофазних інвертори, по одному на фазу);
  • Victron-системи з кількома MultiPlus-II у parallel/split-phase через GX-bridge;
  • гібридні сетапи з різними поколіннями інверторів (стара система + добавлений новий).

Якщо у вас екзотична конфігурація і ви готові побути піддослідним кроликом — пишіть, я люблю такі кейси.

3. OTA-оновлення прошивки edge-пристрою

Залізо, яке не можна оновити — це залізо, яке ти не наважишся розіслати людям. Тому з самого початку було зроблено:

  • A/B-партиції на ESP32 з автоматичним rollback’ом, якщо нова прошивка не бутається;
  • бінарник лежить у GCS, метадані — у Firestore;
  • з адмінки одним API-викликом я викочую апдейт спочатку на свій девайс — і тут є відкрите дизайн-питання, яке я ще не закрив: чи продовжувати «push-модель» (я виштовхую апдейт на флот поетапно), чи перейти на opt-in від користувача («є нова прошивка, тицніть, якщо готові»). Перше зручніше для мене, друге чесніше для юзера — і ближче до тієї ж філософії підписаних команд, про яку нижче;
  • пристрій рапортує прогрес 0–100% у heartbeat;
  • SHA256 перевіряється на пристрої перед перемиканням розділу.

Перші пару раундів я флешав руками через USB і їздив у гості до користувачів. З третього раунду — пуш у production з ноута, ~хвилина до встановлення.

Чесно про фейли: OTA — це круто, поки воно працює. Але є клас змін, які через OTA не доїдеш: правки в bootloader, перерозбивка partition table, заміна самого OTA-стеку, або — мій улюблений жанр — пристрій, який вже окотився від попередньої «впевненої» прошивки і тепер просто не бутається.

У такі моменти єдиний робочий план — взяти ноут, USB-кабель і фізично дістатися до пристрою. Кілька разів я просив користувачів відправити девайс назад Новою Поштою, забирав посилку у відділенні, відкривав ноут прямо на стійці, перепрошивав на місці і одразу відправляв назад тим самим відділенням. Виглядало це приблизно так:

Сюди ж зараховую той випадок, коли я змінив sdkconfig-параметр консолі з UART0 на USBSERIALJTAG, не подумавши, і пристрій після OTA мовчки завис без жодного логу. Три години діагностики, повернення на старий конфіг руками через USB. Тепер у CI крутиться lint, який не дає такому коміту проїхати. Кожен фейл — новий тест.

4. Графіки, прогнози, план дня

Stream-графіки внеску PV/батареї/мережі, графіки фазних напруг, місячні/річні агрегати. Прогноз генерації на завтра — на основі вашої геолокації, кута/азимуту панелей, прогнозу хмарності з open-meteo.

Поверх прогнозу — дві окремі інтеграції з українським енергоринком, які варто не плутати.

  1. Графіки планових відключень** — ті самі, що публікують обленерго по чергах. Я тягну їх **для всіх регіонів України** (а не тільки Києва), щоб людина з Тернополя чи Запоріжжя теж бачила свою чергу прямо в календарі. Видно, де доведеться їхати на батареях, а де можна спокійно вмикати пралку.

    Чесно: цей шматок поки що **найменш стабільний** у системі. Обленерго люблять міняти формат сторінок без попередження, місцями віддають PDF-и замість JSON, а нумерація черг між областями виглядає так, ніби її проєктували різні люди в різних реальностях. Я постійно шукаю кращі способи дістати ці дані — якщо у вас є знайомі в обленерго з API чи pre-publish-фідом, я готовий поставити пиво.

  2. РДН — Ринок на Добу Наперед** — це оптова біржа електроенергії, де ціни на наступну добу визначаються погодинно (типово публікуються вдень напередодні). Я підтягую цей фід і показую погодинні ціни поруч з прогнозом генерації. Для prosumer’а це означає чітку відповідь на питання «коли продавати в мережу, а коли краще тримати в батареї» — і пропозиції планувальника типу «продати 11:00–12:00» виходять не з повітря, а з реальної біржової ціни на цей слот.

4.1. Зелений тариф і еко-метрики

Для тих, хто продає надлишок у мережу — у застосунку є повноцінний розрахунок виплат за зеленим тарифом. Не просто «ви відправили X кВт·год», а кінцева сума в гривнях з усім, що навколо: нараховано, мінус ПДФО 18%, мінус військовий збір 5%, сальдо в кВт·год. Виглядає це ось так, реальний RubHome за квітень:

70 кВт·год згенеровано за день, 60.2 з них пішло в мережу, ₴9061.82 чистими за місяць — для активного prosumer це різниця між «застосунок для гіків» і «застосунок, який окуповує сам себе». Поруч — екологічний вплив: скільки CO₂ уникнули, у скількох деревах це виражається. Дрібниця, але приємно.

4.2. Планувальник: коли застосунок підказує, а не лише показує

Більшість моніторингових застосунків зупиняються на «ось вам графік, далі думайте самі». Я хотів іти далі: щоб система сама пропонувала, що робити з цим днем — на основі прогнозу генерації, тарифу, прогнозу відключень і стану батареї.

Виглядає це як список пропозицій з обґрунтуванням «чому» і ціною «якщо пропустити». Не Excel, не «ось вам кнопка», а конкретно:

Юзер дивиться, тицяє «Затвердити» — і пристрій уже без участі телефона виконує сценарій у потрібні години. Все це опціонально, з можливістю редагувати кожну подію руками, і — нагадую секцію про безпеку — кожна команда інвертору підписується ключем користувача, а не лежить у моєму бекенді як «робота для CRON’а».

5. App Store і Google Play

Так, по-дорослому, з усіма колами пекла навколо distribution-сертифікатів, App Store Connect API keys, fastlane’ом і keystore.jks.

Чесно про модель: зараз застосунок доступний усім, без реклами. У майбутньому планую перейти на підписку — це єдиний спосіб тримати інфраструктуру, оновлення прошивок та підтримку нових інверторів живими, не перетворюючи продукт на чергову «безкоштовну дойну корову з рекламою всередині». Early-access користувачі отримають окремі плюшки — деталі ще обкатую разом зі спільнотою в Telegram.

Залізо: hand-made партія

Поточна ревізія edge-пристрою — це ESP32-S3 Super Mini у ролі основного контролера + ESP32-H2 як Zigbee-координатор (для розумних розеток і керованого навантаження). Дві плати спілкуються по UART, все живиться від одного USB-C, корпус — друкований на 3D. Так, ось буквально так, партіями, ночами:

Зібраний пристрій виглядає вже значно цивільніше:

Поточну партію я роблю сам, малими тиражами. Тестують на ~24 реальних будинках. Зараз ще «hand-made» серія під робочою назвою SunMk0, далі — нормальні PCB (рендер уже бачили вище).

Модель безпеки: ваш інвертор — не власність хмари

Окрема тема, на яку я витратив непропорційно багато думання — хто має право посилати команди вашому інвертору.

Звідки взялася ця параноя: у ранніх версіях ніякої такої моделі не було. Я зі свого ноута у Львові спокійно міняв налаштування інвертора користувачу в Івано-Франківську. Працювало як магія, відчувалося як суперсила — і це було дуже страшно. Якщо я можу, значить, рано чи пізно зможе хтось ще. Тому архітектура переїхала на крипто.

У стандартному варіанті (Solarman & Co.) це виглядає так: ваш інвертор підключений до серверу виробника, у них є кнопка «вимкнути / переключити режим», і теоретично будь-хто, хто отримав доступ до їхнього бекенду (співробітник, зломщик, державний орган у будь-якій юрисдикції), може смикнути ваше реле. Я з цим не згоден як user, тому в Svitgrid побудована інша модель:

  • кожен пристрій / користувач має пару ключів (приватний + публічний);
  • приватний ключ ніколи не залишає клієнта (телефона або edge-пристрою);
  • будь-яка команда інвертору повинна бути криптографічно підписана приватним ключем;
  • хмара фізично не вміє згенерувати валідну команду — вона лише транспорт, релей між підписаним повідомленням і виконавцем.

Практичні наслідки:

  • я, як автор сервісу, не можу з вашого імені перемкнути ваш інвертор у режим «продати все в мережу о 3:00». Навіть якщо захочу. Навіть якщо мені виставлять пістолет до скроні.
  • якщо мої сервери одного дня скомпрометують — атакувальник побачить ваші графіки, але не зможе керувати залізом. Це принципова межа.

Для мене це не «фіча з бекаба маркетингу». Це базова домовленість з користувачем: ви платите за моніторинг, ви не платите за те, щоб віддати мені ключі від хати.

Що в roadmap

  • Інтеграція з Home Assistant — це топ-1 запит від спільноти, і це найближче. План: окрема HA-add-on, яка з’їсть дані з нашого API і експоне сенсори в HA. Хто з вас в HA сидить — пишіть в коменти, що для вас «mandatory», а що «nice to have».
  • Smart-load control через Zigbee — увімкнути бойлер коли SOC > 80%, вимкнути конвектори коли йде імпорт.
  • Розширення підтримки інверторів — у списку Huawei, Solis, Growatt. Якщо у вас стоїть щось екзотичне — пишіть, разом покопаємо регістрову мапу.

Спільнота

У мене є Telegram-чат, де живуть власники станцій (і трохи нердів-ембеддерів). Там можна:

  • задати тупе питання типу «чому в мене PV2 показує −1W вночі» — і отримати відповідь без снобізму;
  • репортнути баг — я зазвичай реагую того ж дня;
  • запропонувати фічу;
  • порівняти свої цифри з іншими користувачами — хтось на півдні постить скриншоти грудневих 8 кВт о 13:00, і це окремий жанр зимового стенд-апу.

Підписатися: t.me/ OvJeNH3sIhEyNjIy

Чесний disclaimer

Це не «вилизаний enterprise». Це pet-project, який росте з кожним новим юзером і кожним новим репортом про те, що «о 03:17 девайс перезавантажився, ось логи». Іноді я викочую беті в продакшн швидше, ніж треба. Іноді ловлю епічні баги (наприклад, нещодавно з’ясував, що зміна sdkconfig на USBSERIALJTAG mовчки вішає S3 — і витратив на це 3 години). Але це жива система: фічі під реальних людей, які мені пишуть «у мене так, а можна зробити отак».

Якщо хочете подискутувати про інженерні рішення (як ми боремося з нестабільним WiFi на edge, як організована аґреґація телеметрії, як зроблена RBAC на multi-household) — заходьте в коментарі, відповідатиму особисто.

TL;DR

  • Що: моніторинг сонячних станцій (iOS/Android/Web) + опціональна edge-залізяка на ESP32. Зараз — open access; далі — підписка.
  • Для кого: Deye/Sunsynk/Sol-Ark/Victron — підтримка з коробки.
  • Як спробувати:
  • Завантажте з App Store або Google Play.
  • Запустіть Mobile Harvester з домашнього WiFi — за 60 секунд побачите свій інвертор у застосунку.
  • Як купити edge-залізяку: svitgrid.app/gateway (поточна hand-made-партія, обмежена кількість).
  • Спільнота і питання: Telegram-чат — я там щодня.

Дякую, що дочитали. Питання, критика, баги — все вітається.

P.S. Так, я знаю, що поки не запостиш у ДОУ — ти не справжній український pet-project. Тепер усе як треба.

👍ПодобаєтьсяСподобалось35
До обраногоВ обраному8
LinkedIn
Дозволені теги: blockquote, a, pre, code, ul, ol, li, b, i, del.
Ctrl + Enter
Дозволені теги: blockquote, a, pre, code, ul, ol, li, b, i, del.
Ctrl + Enter

Звучить круто. Радий, що такі проекти з’являються!!

Навіть недочитав — вже побіг ставити апку. Після слів

мати по-людськи зроблений UI для зміни налаштувань інвертора — без шаманства з регістрами та трьох вкладених меню в стилі Win95.

Пойняв шо людина поняла цю дею

Оце потужна стаття, дякую, було цікаво почитати)
побільше б таких на доу

З додатком з перших...Бувають роги, бувають шишки...Але проєкт росте, змінюється і розвивається! Тому автора потрібно підтримати в дуже потрібному починанні! Тільки вперед!

Оооо треба чекнути, бо дійсно UX «рідних» додатків дуже не дружній)

Виглядає супер!

Ідеально б мати LAN (ще ідеальніше PoE)

маю в планах три види edge пристроїв — Edge Device, що працює по Wifi(Modbus TCP), аналог свистка, який конектиться до інвертора напряму, та на DIN-рейку

Проблема прямого конекту девайсу до інвертора — ви перестаєте писати дані в Deye. Відповідно, в випадку звернення до служби підтримки, чи то гарантійного випадку — в вас не буде даних, відповідно Ваш кейс не зможуть вирішити. Тому, поки так.

ви перестаєте писати дані в Deye

А це реальна проблема? Ну, тобто, якщо купив інвертор без WiFi модуля і дані не пишуться — гарантії не буде, чи що? Я такого не зустрічав в умовах.

В принципі, я б радше не давав доступу Deye до свого інвертору. Саме тому модуль і не підключаю.

Вже були історії з мишками та диванами...

insider.razer.com/...​ng-and-reconnecting-42226

www.ibtimes.co.uk/...​ettings-heres-why-1614108

www.macrumors.com/...​ficate-breaks-macos-apps

www.pcworld.com/...​rs-during-aws-outage.html

Навіть думати не хочу, що буде, як щось почне переналаштовувати інвертор...

Мене це не лякає, а от є люди, яким важлива гарантія. Я погоджуюсь, що давати доступ виробнику на управління інвертором — така собі штука.

Перепрошую, багато в цій темі не розумію, але наскільки відомо, то у батьків, інвертор Huawei, тоді питання чи підійде Svitgrid? Також, цікаво як працює прогнозування, прибутку та вироблення електроенергії, що знаходиться під капотом? Ви написали власну модель машинного навчання чи там все простіше?

Для Huawei поки що нема підтрики, але я радо взявся би за інтеграцію, якби були добровольці

Як працює прогноз — це фізика, не ML

Жодної нейромережі чи «штучного інтелекту» під капотом немає. Логіка
така:

  1. Беремо погоду з сервісу Open-Meteo: на 24 години вперед — хмарність, температура, кут падіння сонця.
  2. Рахуємо геометрію: знаючи координати дому та орієнтацію панелей (нахил, азимут), обчислюємо, скільки сонячної енергії падає на панелі щогодини. Це класичні астрономічні формули — sunrise/sunset, висота сонця над горизонтом.
  3. Враховуємо втрати: панелі гріються (і втрачають ~0.4% на кожен градус понад 25°C), є втрати в кабелях, інверторі, бруд на склі. Закладаємо це коефіцієнтом ~0.82.
  4. Калібруємось під конкретний дім: щодня порівнюємо, скільки прогнозували vs скільки реально виробили, і коригуємо коефіцієнт. Якщо у когось панелі в тіні дерева або старі — модель сама «вивчить» це за кілька днів.
  5. Ранкова поправка: коли вже почався день і видно, що йде краще/гірше за прогноз, перераховуємо залишок дня.

Про пиво стаття буде? ;)

Дуже подобається дизайн, те, що я хотів бачити в застосунку моніторингу.

У моїх батьків інвертор Anern і доводиться користуватися Sun House — хто знає, той знає. Гіршої апки у всіх сенсах я не зустрічав.

Привіт, дякую. Якщо інвертор ваших батьків підтримує Modbus TCP — ходіть інтегруватись :)

Підписатись на коментарі