#ifndef HEALTH_MONITOR_H #define HEALTH_MONITOR_H #include #include "config_manager.h" #include "mqtt_client.h" #include "acuvim_reader.h" #include "acuvim_registers.h" struct AlertThresholds { float overvoltage; float undervoltage; float overcurrent; float voltage_imbalance_pct; float current_imbalance_pct; float freq_low; float freq_high; float low_pf; float high_thd; uint8_t modbus_consecutive_errors; float modbus_error_rate_pct; }; class HealthMonitor { public: void begin(ConfigManager& config, MqttClient& mqtt, AcuvimReader& acuvim); void evaluate(const AcuvimData& data); void setThresholds(const AlertThresholds& t) { _thresholds = t; } const AlertThresholds& getThresholds() const { return _thresholds; } private: ConfigManager* _config; MqttClient* _mqtt; AcuvimReader* _acuvim; AlertThresholds _thresholds; // Active alert flags for deduplication bool _alertOvervoltageA; bool _alertOvervoltageB; bool _alertOvervoltageC; bool _alertUndervoltageA; bool _alertUndervoltageB; bool _alertUndervoltageC; bool _alertOvercurrentA; bool _alertOvercurrentB; bool _alertOvercurrentC; bool _alertVoltageImbalance; bool _alertCurrentImbalance; bool _alertFreqDeviation; bool _alertLowPF; bool _alertHighTHD; bool _alertModbusLoss; bool _alertModbusErrorRate; void publishAlert(const char* alert, const char* severity, const String& message, float value, float threshold, const char* phase = nullptr); void checkVoltage(float value, const char* phase, bool& overFlag, bool& underFlag); void checkCurrent(float value, const char* phase, bool& flag); }; #endif