Розробка мобільних додатків для моніторингу енергоспоживання
Лічильник електроенергії, до якого можна підключитися через Modbus RTU, виводить сирі регістри: напругу, струм, активну та реактивну потужність, накопичену енергію в кВт·ч. Перетворити це в зрозумілий дашборд — завдання мобільного додатка. Але перед дашбордом стоїть важливіше завдання: як отримати і доставити ці дані на телефон.
Протоколи лічильників та шлюзи
Промислові лічильники (Меркурій 230, АГАТ, Eastron SDM630) спілкуються через Modbus RTU по RS-485. Розумні лічильники для житлового сектора (Sagemcom, Itron) — DLMS/COSEM, M-Bus або P1-порт (Голландський розумний лічильник). Нові комерційні лічильники з GPRS/NB-IoT модулем — облачний API виробника.
Для Modbus-лічильників потрібен RS-485 → Ethernet шлюз (Moxa NPort, Anybus X-gateway) або IoT-шлюз з Modbus-агентом. Мобільний додаток завжди працює з backend або MQTT-брокером — ніколи з лічильником напрямкуемо.
Для P1-порту (Нідерланди, Бельгія) існують P1-to-MQTT адаптери — маленькі пристрої ESP32/Raspberry Pi, які парсять DSMR-телеграми й публікують у MQTT.
Обробка даних: агрегація та зберігання
Лічильник видає миттєві значення. Додатку потрібні тренди за годину, день, місяць — це вимагає агрегації та зберігання. На backend — InfluxDB або TimescaleDB (розширення PostgreSQL). TimescaleDB підходить для невеликих інсталяцій: SQL-запити, функція time_bucket:
SELECT
time_bucket('1 hour', time) AS hour,
device_id,
MAX(active_energy_kwh) - MIN(active_energy_kwh) AS consumption_kwh,
AVG(active_power_w) AS avg_power_w
FROM energy_readings
WHERE device_id = $1
AND time BETWEEN $2 AND $3
GROUP BY 1, 2
ORDER BY 1;
Різниця між MAX і MIN накопленої енергії за період — це спживання за цей період. Проста й надійна формула, яка не вимагає розрахунку дельт.
Мобільний додаток: реальний дашборд
На Flutter з BLoC:
class EnergyDashboardBloc extends Bloc<EnergyEvent, EnergyDashboardState> {
final EnergyRepository _repo;
StreamSubscription? _realtimeSub;
EnergyDashboardBloc(this._repo) : super(EnergyDashboardInitial()) {
on<LoadDashboard>((event, emit) async {
emit(EnergyDashboardLoading());
try {
final current = await _repo.getCurrentReadings(event.meterId);
final todayChart = await _repo.getHourlyConsumption(
event.meterId,
DateTime.now().subtract(const Duration(hours: 24)),
DateTime.now(),
);
emit(EnergyDashboardLoaded(current: current, hourlyChart: todayChart));
_startRealtimeUpdates(event.meterId);
} catch (e) {
emit(EnergyDashboardError(message: e.toString()));
}
});
on<RealtimeUpdated>((event, emit) {
if (state is EnergyDashboardLoaded) {
emit((state as EnergyDashboardLoaded).copyWith(current: event.reading));
}
});
}
void _startRealtimeUpdates(String meterId) {
_realtimeSub = _repo.realtimeStream(meterId)
.listen((reading) => add(RealtimeUpdated(reading)));
}
}
Картки дашборда: активна потужність (кВт), напруга по фазах (для трифазних лічильників — три значення), cosφ (коефіцієнт потужності), спживання за поточний день, спживання за місяц порівняно з попереднім місяцем.
Графік споживання
fl_chart з BarChart для почасового споживання — стандарт у енергетичних додатках. Кольорова кодировка за тарифними зонами (нічний тариф — синій, денний — оранжевий):
BarChartGroupData buildHourBarGroup(int hour, double consumption) {
final isNightTariff = hour < 7 || hour >= 23;
return BarChartGroupData(
x: hour,
barRods: [
BarChartRodData(
toY: consumption,
color: isNightTariff ? Colors.blue.shade300 : Colors.orange.shade400,
width: 12,
borderRadius: const BorderRadius.vertical(top: Radius.circular(4)),
),
],
);
}
Алерти за порогами
Моніторинг перевищення договірної потужності — одна з ключових функцій для комерційних об'єктів. Перевищення максимальної потужності призводить до штрафів від енергопостачальника. Логіка на backend перевіряє скковзну 15-хвилинну максимум, мобільний додаток отримує алерт через FCM/APNs.
Для Android push-повідомлення з PRIORITY_HIGH через FCM Data Message (не Notification Message) — доставляється навіть у режимі Doze. FCM Data Message обробляється в FirebaseMessagingService.onMessageReceived() і відображається як локальне повідомлення зі спеціальним звуком.
Моніторинг кількох об'єктів
Для управління компаній, які контролюють 50-100 об'єктів — список об'єктів з кольоровою індикацією статусу (норма/перевищення/немає даних), сортування за споживанням. Ледиве завантаження через ListView.builder з пагінацією по 20 об'єктів.
Розробка додатка для моніторингу одного лічильника з дашбордом та історичними даними: 3-4 тижні. Моніторинг кількох об'єктів з управлінням навантаженням та алертами: 2-3 місяці. Вартість розраховується після аналізу обладнання та вимог.







