#pragma once #include "../sy6970.h" #include "esphome/components/sensor/sensor.h" namespace esphome::sy6970 { // Template for voltage sensors (converts mV to V) template class VoltageSensor : public SY6970Listener, public sensor::Sensor { public: void on_data(const SY6970Data &data) override { uint8_t val = data.registers[REG] & MASK; uint16_t voltage_mv = BASE + (val * STEP); this->publish_state(voltage_mv * 0.001f); // Convert mV to V } }; // Template for current sensors (returns mA) template class CurrentSensor : public SY6970Listener, public sensor::Sensor { public: void on_data(const SY6970Data &data) override { uint8_t val = data.registers[REG] & MASK; uint16_t current_ma = BASE + (val * STEP); this->publish_state(current_ma); } }; // Specialized sensor types using templates using SY6970VbusVoltageSensor = VoltageSensor; using SY6970BatteryVoltageSensor = VoltageSensor; using SY6970SystemVoltageSensor = VoltageSensor; using SY6970ChargeCurrentSensor = CurrentSensor; // Precharge current sensor needs special handling (bit shift) class SY6970PrechargeCurrentSensor : public SY6970Listener, public sensor::Sensor { public: void on_data(const SY6970Data &data) override { uint8_t iprechg = (data.registers[SY6970_REG_PRECHARGE_CURRENT] >> 4) & 0x0F; uint16_t iprechg_ma = PRE_CHG_BASE_MA + (iprechg * PRE_CHG_STEP_MA); this->publish_state(iprechg_ma); } }; } // namespace esphome::sy6970