Complete IoT monitoring platform for Acuvim II power meters via ESP32. Firmware (Phases 1-7): - ESP32-WROVER-B (TTGO T-Call v1.4) with RS485 Modbus RTU - WiFi STA+AP concurrent mode with GSM/GPRS failover - Transport abstraction layer with 4 priority modes - MQTT protocol with 20 commands, LWT, QoS, exponential backoff - SD card offline buffering with JSONL rotation and non-blocking drain - OTA firmware updates with dual partition rollback protection - Watchdog timer, crash loop detection, Acuvim health monitoring - Captive portal provisioning with AP mode Console backend (Phase 8): - .NET 10 minimal API with PostgreSQL + EF Core - JWT authentication, SignalR real-time updates - MQTTnet 5.x bridge service with health monitoring - Device, telemetry, firmware, alert, group management - Rate limiting, security headers, Swagger/OpenAPI Frontend (Phase 9): - React 18 + TypeScript + Vite with Ant Design 5 - ECharts telemetry visualization, TanStack Query - SignalR live updates, device management UI - Dashboard, fleet management, firmware deployment Testing & Production (Phase 10): - 28 firmware unit tests (Modbus, JSON, config, version) - 23 xUnit backend tests (device, telemetry, command, alert) - Docker Compose with nginx, TLS MQTT, PostgreSQL - Production deployment, commissioning, and troubleshooting docs Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
43 lines
1.2 KiB
C++
43 lines
1.2 KiB
C++
#ifndef ACUVIM_READER_H
|
|
#define ACUVIM_READER_H
|
|
|
|
#include <Arduino.h>
|
|
#include <ModbusMaster.h>
|
|
#include "acuvim_registers.h"
|
|
#include "pin_config.h"
|
|
|
|
class AcuvimReader {
|
|
public:
|
|
bool begin(uint8_t slaveAddress = MODBUS_SLAVE_ADDR_DEFAULT,
|
|
uint32_t baudRate = RS485_BAUD_DEFAULT);
|
|
|
|
bool readAll(AcuvimData& data);
|
|
bool readMetering(AcuvimData& data);
|
|
bool readEnergy(AcuvimData& data);
|
|
bool readDemand(AcuvimData& data);
|
|
bool readTHD(AcuvimData& data);
|
|
|
|
uint32_t getSuccessCount() const { return _successCount; }
|
|
uint32_t getErrorCount() const { return _errorCount; }
|
|
uint8_t getLastError() const { return _lastError; }
|
|
uint32_t getLastReadDurationMs() const { return _lastReadDurationMs; }
|
|
uint32_t getConsecutiveErrors() const { return _consecutiveErrors; }
|
|
|
|
private:
|
|
ModbusMaster _modbus;
|
|
uint8_t _slaveAddr;
|
|
uint32_t _successCount;
|
|
uint32_t _errorCount;
|
|
uint8_t _lastError;
|
|
uint32_t _lastReadDurationMs;
|
|
uint32_t _consecutiveErrors;
|
|
|
|
float parseFloat32(uint16_t hiReg, uint16_t loReg);
|
|
uint8_t readRegistersWithRetry(uint16_t startReg, uint16_t count);
|
|
|
|
static void preTransmission();
|
|
static void postTransmission();
|
|
};
|
|
|
|
#endif
|