diff --git a/components/votronic/binary_sensor.py b/components/votronic/binary_sensor.py index 2c00a25..33700e9 100644 --- a/components/votronic/binary_sensor.py +++ b/components/votronic/binary_sensor.py @@ -11,9 +11,19 @@ CODEOWNERS = ["@syssi"] CONF_CHARGING = "charging" CONF_DISCHARGING = "discharging" -CONF_CONTROLLER_ACTIVE = "controller_active" -CONF_CURRENT_REDUCTION = "current_reduction" -CONF_AES_ACTIVE = "aes_active" + +CONF_CHARGER_CHARGING = "charger_charging" +CONF_CHARGER_DISCHARGING = "charger_discharging" +CONF_CHARGER_CONTROLLER_ACTIVE = "charger_controller_active" +CONF_CHARGER_CURRENT_REDUCTION = "charger_current_reduction" +CONF_CHARGER_AES_ACTIVE = "charger_aes_active" + +CONF_CHARGING_CONVERTER_CHARGING = "charging_converter_charging" +CONF_CHARGING_CONVERTER_DISCHARGING = "charging_converter_discharging" +CONF_CHARGING_CONVERTER_CONTROLLER_ACTIVE = "charging_converter_controller_active" +CONF_CHARGING_CONVERTER_CURRENT_REDUCTION = "charging_converter_current_reduction" +CONF_CHARGING_CONVERTER_AES_ACTIVE = "charging_converter_aes_active" + CONF_PV_CONTROLLER_ACTIVE = "pv_controller_active" CONF_PV_CURRENT_REDUCTION = "pv_current_reduction" CONF_PV_AES_ACTIVE = "pv_aes_active" @@ -21,9 +31,16 @@ CONF_PV_AES_ACTIVE = "pv_aes_active" BINARY_SENSORS = [ CONF_CHARGING, CONF_DISCHARGING, - CONF_CONTROLLER_ACTIVE, - CONF_CURRENT_REDUCTION, - CONF_AES_ACTIVE, + CONF_CHARGER_CHARGING, + CONF_CHARGER_DISCHARGING, + CONF_CHARGER_CONTROLLER_ACTIVE, + CONF_CHARGER_CURRENT_REDUCTION, + CONF_CHARGER_AES_ACTIVE, + CONF_CHARGING_CONVERTER_CHARGING, + CONF_CHARGING_CONVERTER_DISCHARGING, + CONF_CHARGING_CONVERTER_CONTROLLER_ACTIVE, + CONF_CHARGING_CONVERTER_CURRENT_REDUCTION, + CONF_CHARGING_CONVERTER_AES_ACTIVE, CONF_PV_CONTROLLER_ACTIVE, CONF_PV_CURRENT_REDUCTION, CONF_PV_AES_ACTIVE, @@ -38,13 +55,44 @@ CONFIG_SCHEMA = cv.Schema( cv.Optional(CONF_DISCHARGING): binary_sensor.binary_sensor_schema( icon="mdi:power-plug", ), - cv.Optional(CONF_CONTROLLER_ACTIVE): binary_sensor.binary_sensor_schema( + cv.Optional(CONF_CHARGER_CHARGING): binary_sensor.binary_sensor_schema( + icon="mdi:battery-charging", + ), + cv.Optional(CONF_CHARGER_DISCHARGING): binary_sensor.binary_sensor_schema( + icon="mdi:power-plug", + ), + cv.Optional(CONF_CHARGER_CONTROLLER_ACTIVE): binary_sensor.binary_sensor_schema( icon="mdi:power", ), - cv.Optional(CONF_CURRENT_REDUCTION): binary_sensor.binary_sensor_schema( + cv.Optional(CONF_CHARGER_CURRENT_REDUCTION): binary_sensor.binary_sensor_schema( icon="mdi:car-speed-limiter", ), - cv.Optional(CONF_AES_ACTIVE): binary_sensor.binary_sensor_schema( + cv.Optional(CONF_CHARGER_AES_ACTIVE): binary_sensor.binary_sensor_schema( + icon="mdi:export", + ), + cv.Optional( + CONF_CHARGING_CONVERTER_CHARGING + ): binary_sensor.binary_sensor_schema( + icon="mdi:battery-charging", + ), + cv.Optional( + CONF_CHARGING_CONVERTER_DISCHARGING + ): binary_sensor.binary_sensor_schema( + icon="mdi:power-plug", + ), + cv.Optional( + CONF_CHARGING_CONVERTER_CONTROLLER_ACTIVE + ): binary_sensor.binary_sensor_schema( + icon="mdi:power", + ), + cv.Optional( + CONF_CHARGING_CONVERTER_CURRENT_REDUCTION + ): binary_sensor.binary_sensor_schema( + icon="mdi:car-speed-limiter", + ), + cv.Optional( + CONF_CHARGING_CONVERTER_AES_ACTIVE + ): binary_sensor.binary_sensor_schema( icon="mdi:export", ), cv.Optional(CONF_PV_CONTROLLER_ACTIVE): binary_sensor.binary_sensor_schema( diff --git a/components/votronic/sensor.py b/components/votronic/sensor.py index 4ea4732..10630e7 100644 --- a/components/votronic/sensor.py +++ b/components/votronic/sensor.py @@ -32,20 +32,46 @@ CONF_SECONDARY_BATTERY_VOLTAGE = "secondary_battery_voltage" CONF_BATTERY_CAPACITY_REMAINING = "battery_capacity_remaining" CONF_STATE_OF_CHARGE = "state_of_charge" # CONF_CURRENT = "current" +# CONF_POWER = "power" CONF_BATTERY_NOMINAL_CAPACITY = "battery_nominal_capacity" -CONF_PV_VOLTAGE = "pv_voltage" -CONF_PV_CURRENT = "pv_current" CONF_BATTERY_STATUS_BITMASK = "battery_status_bitmask" -CONF_PV_BATTERY_STATUS_BITMASK = "pv_battery_status_bitmask" -CONF_CHARGING_CONTROLLER_STATUS_BITMASK = "charging_controller_status_bitmask" -CONF_PV_CONTROLLER_STATUS_BITMASK = "pv_controller_status_bitmask" CONF_CHARGED_CAPACITY = "charged_capacity" CONF_CHARGED_ENERGY = "charged_energy" + +CONF_PV_VOLTAGE = "pv_voltage" +CONF_PV_CURRENT = "pv_current" +CONF_PV_BATTERY_STATUS_BITMASK = "pv_battery_status_bitmask" +CONF_PV_CONTROLLER_STATUS_BITMASK = "pv_controller_status_bitmask" CONF_PV_POWER = "pv_power" -CONF_CHARGING_MODE_SETTING_ID = "charging_mode_setting_id" -CONF_CONTROLLER_TEMPERATURE = "controller_temperature" +CONF_PV_MODE_SETTING_ID = "pv_mode_setting_id" CONF_PV_CONTROLLER_TEMPERATURE = "pv_controller_temperature" +CONF_CHARGER_CURRENT = "charger_current" +CONF_CHARGER_POWER = "charger_power" +CONF_CHARGER_LOAD = "charger_load" +CONF_CHARGER_BATTERY_STATUS_BITMASK = "charger_battery_status_bitmask" +CONF_CHARGER_CONTROLLER_STATUS_BITMASK = "charger_controller_status_bitmask" +CONF_CHARGER_MODE_SETTING_ID = "charger_mode_setting_id" +CONF_CHARGER_CONTROLLER_TEMPERATURE = "charger_controller_temperature" + +CONF_CHARGING_CONVERTER_BATTERY_VOLTAGE = "charging_converter_battery_voltage" +CONF_CHARGING_CONVERTER_SECONDARY_BATTERY_VOLTAGE = ( + "charging_converter_secondary_battery_voltage" +) +CONF_CHARGING_CONVERTER_CURRENT = "charging_converter_current" +CONF_CHARGING_CONVERTER_POWER = "charging_converter_power" +CONF_CHARGING_CONVERTER_LOAD = "charging_converter_load" +CONF_CHARGING_CONVERTER_CONTROLLER_TEMPERATURE = ( + "charging_converter_controller_temperature" +) +CONF_CHARGING_CONVERTER_MODE_SETTING_ID = "charging_converter_mode_setting_id" +CONF_CHARGING_CONVERTER_BATTERY_STATUS_BITMASK = ( + "charging_converter_battery_status_bitmask" +) +CONF_CHARGING_CONVERTER_CONTROLLER_STATUS_BITMASK = ( + "charging_converter_controller_status_bitmask" +) + ICON_BATTERY_CAPACITY_REMAINING = "mdi:battery-50" ICON_STATE_OF_CHARGE = "mdi:battery-50" ICON_CURRENT_DC = "mdi:current-dc" @@ -55,7 +81,7 @@ ICON_BATTERY_STATUS_BITMASK = "mdi:alert-circle-outline" ICON_PV_BATTERY_STATUS_BITMASK = "mdi:alert-circle-outline" ICON_CHARGING_CONTROLLER_STATUS_BITMASK = "mdi:alert-circle-outline" ICON_PV_CONTROLLER_STATUS_BITMASK = "mdi:alert-circle-outline" -ICON_CHARGING_MODE_SETTING_ID = "mdi:car-battery" +ICON_MODE_SETTING_ID = "mdi:car-battery" UNIT_AMPERE_HOURS = "Ah" @@ -67,15 +93,29 @@ SENSORS = [ CONF_CURRENT, CONF_POWER, CONF_BATTERY_NOMINAL_CAPACITY, + CONF_BATTERY_STATUS_BITMASK, + CONF_CHARGER_LOAD, + CONF_CHARGER_BATTERY_STATUS_BITMASK, + CONF_CHARGER_CONTROLLER_STATUS_BITMASK, + CONF_CHARGER_MODE_SETTING_ID, + CONF_CHARGER_CURRENT, + CONF_CHARGER_POWER, + CONF_CHARGER_CONTROLLER_TEMPERATURE, + CONF_CHARGING_CONVERTER_BATTERY_VOLTAGE, + CONF_CHARGING_CONVERTER_SECONDARY_BATTERY_VOLTAGE, + CONF_CHARGING_CONVERTER_CURRENT, + CONF_CHARGING_CONVERTER_POWER, + CONF_CHARGING_CONVERTER_LOAD, + CONF_CHARGING_CONVERTER_CONTROLLER_TEMPERATURE, + CONF_CHARGING_CONVERTER_MODE_SETTING_ID, + CONF_CHARGING_CONVERTER_BATTERY_STATUS_BITMASK, + CONF_CHARGING_CONVERTER_CONTROLLER_STATUS_BITMASK, CONF_PV_VOLTAGE, CONF_PV_CURRENT, CONF_PV_POWER, - CONF_BATTERY_STATUS_BITMASK, + CONF_PV_MODE_SETTING_ID, CONF_PV_BATTERY_STATUS_BITMASK, - CONF_CHARGING_CONTROLLER_STATUS_BITMASK, CONF_PV_CONTROLLER_STATUS_BITMASK, - CONF_CHARGING_MODE_SETTING_ID, - CONF_CONTROLLER_TEMPERATURE, CONF_PV_CONTROLLER_TEMPERATURE, ] @@ -131,6 +171,150 @@ CONFIG_SCHEMA = cv.Schema( device_class=DEVICE_CLASS_EMPTY, state_class=STATE_CLASS_MEASUREMENT, ), + cv.Optional(CONF_BATTERY_STATUS_BITMASK): sensor.sensor_schema( + unit_of_measurement=UNIT_EMPTY, + icon=ICON_BATTERY_STATUS_BITMASK, + accuracy_decimals=0, + device_class=DEVICE_CLASS_EMPTY, + state_class=STATE_CLASS_MEASUREMENT, + entity_category=ENTITY_CATEGORY_DIAGNOSTIC, + ), + cv.Optional(CONF_CHARGER_CURRENT): sensor.sensor_schema( + unit_of_measurement=UNIT_AMPERE, + icon=ICON_CURRENT_DC, + accuracy_decimals=3, + device_class=DEVICE_CLASS_CURRENT, + state_class=STATE_CLASS_MEASUREMENT, + ), + cv.Optional(CONF_CHARGER_POWER): sensor.sensor_schema( + unit_of_measurement=UNIT_WATT, + icon=ICON_EMPTY, + accuracy_decimals=2, + device_class=DEVICE_CLASS_POWER, + state_class=STATE_CLASS_MEASUREMENT, + ), + cv.Optional(CONF_CHARGER_LOAD): sensor.sensor_schema( + unit_of_measurement=UNIT_PERCENT, + icon=ICON_STATE_OF_CHARGE, + accuracy_decimals=0, + device_class=DEVICE_CLASS_EMPTY, + state_class=STATE_CLASS_MEASUREMENT, + ), + cv.Optional(CONF_CHARGER_BATTERY_STATUS_BITMASK): sensor.sensor_schema( + unit_of_measurement=UNIT_EMPTY, + icon=ICON_BATTERY_STATUS_BITMASK, + accuracy_decimals=0, + device_class=DEVICE_CLASS_EMPTY, + state_class=STATE_CLASS_MEASUREMENT, + entity_category=ENTITY_CATEGORY_DIAGNOSTIC, + ), + cv.Optional(CONF_CHARGER_CONTROLLER_STATUS_BITMASK): sensor.sensor_schema( + unit_of_measurement=UNIT_EMPTY, + icon=ICON_CHARGING_CONTROLLER_STATUS_BITMASK, + accuracy_decimals=0, + device_class=DEVICE_CLASS_EMPTY, + state_class=STATE_CLASS_MEASUREMENT, + entity_category=ENTITY_CATEGORY_DIAGNOSTIC, + ), + cv.Optional(CONF_CHARGER_MODE_SETTING_ID): sensor.sensor_schema( + unit_of_measurement=UNIT_EMPTY, + icon=ICON_MODE_SETTING_ID, + accuracy_decimals=0, + device_class=DEVICE_CLASS_EMPTY, + state_class=STATE_CLASS_MEASUREMENT, + entity_category=ENTITY_CATEGORY_DIAGNOSTIC, + ), + cv.Optional(CONF_PV_CONTROLLER_STATUS_BITMASK): sensor.sensor_schema( + unit_of_measurement=UNIT_EMPTY, + icon=ICON_PV_CONTROLLER_STATUS_BITMASK, + accuracy_decimals=0, + device_class=DEVICE_CLASS_EMPTY, + state_class=STATE_CLASS_MEASUREMENT, + entity_category=ENTITY_CATEGORY_DIAGNOSTIC, + ), + cv.Optional(CONF_CHARGER_CONTROLLER_TEMPERATURE): sensor.sensor_schema( + unit_of_measurement=UNIT_CELSIUS, + icon=ICON_EMPTY, + accuracy_decimals=0, + device_class=DEVICE_CLASS_TEMPERATURE, + state_class=STATE_CLASS_MEASUREMENT, + entity_category=ENTITY_CATEGORY_DIAGNOSTIC, + ), + cv.Optional(CONF_CHARGING_CONVERTER_BATTERY_VOLTAGE): sensor.sensor_schema( + unit_of_measurement=UNIT_VOLT, + icon=ICON_EMPTY, + accuracy_decimals=2, + device_class=DEVICE_CLASS_VOLTAGE, + state_class=STATE_CLASS_MEASUREMENT, + ), + cv.Optional( + CONF_CHARGING_CONVERTER_SECONDARY_BATTERY_VOLTAGE + ): sensor.sensor_schema( + unit_of_measurement=UNIT_VOLT, + icon=ICON_EMPTY, + accuracy_decimals=2, + device_class=DEVICE_CLASS_VOLTAGE, + state_class=STATE_CLASS_MEASUREMENT, + ), + cv.Optional(CONF_CHARGING_CONVERTER_LOAD): sensor.sensor_schema( + unit_of_measurement=UNIT_PERCENT, + icon=ICON_STATE_OF_CHARGE, + accuracy_decimals=0, + device_class=DEVICE_CLASS_EMPTY, + state_class=STATE_CLASS_MEASUREMENT, + ), + cv.Optional(CONF_CHARGING_CONVERTER_CURRENT): sensor.sensor_schema( + unit_of_measurement=UNIT_AMPERE, + icon=ICON_CURRENT_DC, + accuracy_decimals=3, + device_class=DEVICE_CLASS_CURRENT, + state_class=STATE_CLASS_MEASUREMENT, + ), + cv.Optional(CONF_CHARGING_CONVERTER_POWER): sensor.sensor_schema( + unit_of_measurement=UNIT_WATT, + icon=ICON_EMPTY, + accuracy_decimals=2, + device_class=DEVICE_CLASS_POWER, + state_class=STATE_CLASS_MEASUREMENT, + ), + cv.Optional( + CONF_CHARGING_CONVERTER_BATTERY_STATUS_BITMASK + ): sensor.sensor_schema( + unit_of_measurement=UNIT_EMPTY, + icon=ICON_BATTERY_STATUS_BITMASK, + accuracy_decimals=0, + device_class=DEVICE_CLASS_EMPTY, + state_class=STATE_CLASS_MEASUREMENT, + entity_category=ENTITY_CATEGORY_DIAGNOSTIC, + ), + cv.Optional( + CONF_CHARGING_CONVERTER_CONTROLLER_STATUS_BITMASK + ): sensor.sensor_schema( + unit_of_measurement=UNIT_EMPTY, + icon=ICON_CHARGING_CONTROLLER_STATUS_BITMASK, + accuracy_decimals=0, + device_class=DEVICE_CLASS_EMPTY, + state_class=STATE_CLASS_MEASUREMENT, + entity_category=ENTITY_CATEGORY_DIAGNOSTIC, + ), + cv.Optional(CONF_CHARGING_CONVERTER_MODE_SETTING_ID): sensor.sensor_schema( + unit_of_measurement=UNIT_EMPTY, + icon=ICON_MODE_SETTING_ID, + accuracy_decimals=0, + device_class=DEVICE_CLASS_EMPTY, + state_class=STATE_CLASS_MEASUREMENT, + entity_category=ENTITY_CATEGORY_DIAGNOSTIC, + ), + cv.Optional( + CONF_CHARGING_CONVERTER_CONTROLLER_TEMPERATURE + ): sensor.sensor_schema( + unit_of_measurement=UNIT_CELSIUS, + icon=ICON_EMPTY, + accuracy_decimals=0, + device_class=DEVICE_CLASS_TEMPERATURE, + state_class=STATE_CLASS_MEASUREMENT, + entity_category=ENTITY_CATEGORY_DIAGNOSTIC, + ), cv.Optional(CONF_PV_VOLTAGE): sensor.sensor_schema( unit_of_measurement=UNIT_VOLT, icon=ICON_EMPTY, @@ -152,14 +336,6 @@ CONFIG_SCHEMA = cv.Schema( device_class=DEVICE_CLASS_POWER, state_class=STATE_CLASS_MEASUREMENT, ), - cv.Optional(CONF_BATTERY_STATUS_BITMASK): sensor.sensor_schema( - unit_of_measurement=UNIT_EMPTY, - icon=ICON_BATTERY_STATUS_BITMASK, - accuracy_decimals=0, - device_class=DEVICE_CLASS_EMPTY, - state_class=STATE_CLASS_MEASUREMENT, - entity_category=ENTITY_CATEGORY_DIAGNOSTIC, - ), cv.Optional(CONF_PV_BATTERY_STATUS_BITMASK): sensor.sensor_schema( unit_of_measurement=UNIT_EMPTY, icon=ICON_PV_BATTERY_STATUS_BITMASK, @@ -168,38 +344,14 @@ CONFIG_SCHEMA = cv.Schema( state_class=STATE_CLASS_MEASUREMENT, entity_category=ENTITY_CATEGORY_DIAGNOSTIC, ), - cv.Optional(CONF_CHARGING_CONTROLLER_STATUS_BITMASK): sensor.sensor_schema( + cv.Optional(CONF_PV_MODE_SETTING_ID): sensor.sensor_schema( unit_of_measurement=UNIT_EMPTY, - icon=ICON_CHARGING_CONTROLLER_STATUS_BITMASK, + icon=ICON_MODE_SETTING_ID, accuracy_decimals=0, device_class=DEVICE_CLASS_EMPTY, state_class=STATE_CLASS_MEASUREMENT, entity_category=ENTITY_CATEGORY_DIAGNOSTIC, ), - cv.Optional(CONF_PV_CONTROLLER_STATUS_BITMASK): sensor.sensor_schema( - unit_of_measurement=UNIT_EMPTY, - icon=ICON_PV_CONTROLLER_STATUS_BITMASK, - accuracy_decimals=0, - device_class=DEVICE_CLASS_EMPTY, - state_class=STATE_CLASS_MEASUREMENT, - entity_category=ENTITY_CATEGORY_DIAGNOSTIC, - ), - cv.Optional(CONF_CHARGING_MODE_SETTING_ID): sensor.sensor_schema( - unit_of_measurement=UNIT_EMPTY, - icon=ICON_CHARGING_MODE_SETTING_ID, - accuracy_decimals=0, - device_class=DEVICE_CLASS_EMPTY, - state_class=STATE_CLASS_MEASUREMENT, - entity_category=ENTITY_CATEGORY_DIAGNOSTIC, - ), - cv.Optional(CONF_CONTROLLER_TEMPERATURE): sensor.sensor_schema( - unit_of_measurement=UNIT_CELSIUS, - icon=ICON_EMPTY, - accuracy_decimals=0, - device_class=DEVICE_CLASS_TEMPERATURE, - state_class=STATE_CLASS_MEASUREMENT, - entity_category=ENTITY_CATEGORY_DIAGNOSTIC, - ), cv.Optional(CONF_PV_CONTROLLER_TEMPERATURE): sensor.sensor_schema( unit_of_measurement=UNIT_CELSIUS, icon=ICON_EMPTY, diff --git a/components/votronic/text_sensor.py b/components/votronic/text_sensor.py index e742458..6b7109f 100644 --- a/components/votronic/text_sensor.py +++ b/components/votronic/text_sensor.py @@ -10,23 +10,30 @@ DEPENDENCIES = ["votronic"] CODEOWNERS = ["@syssi"] CONF_BATTERY_STATUS = "battery_status" -CONF_PV_BATTERY_STATUS = "pv_battery_status" -CONF_CHARGING_CONTROLLER_STATUS = "charging_controller_status" -CONF_PV_CONTROLLER_STATUS = "pv_controller_status" -CONF_CHARGING_MODE_SETTING = "charging_mode_setting" -ICON_BATTERY_STATUS = "mdi:alert-circle-outline" -ICON_PV_BATTERY_STATUS = "mdi:alert-circle-outline" -ICON_CHARGING_CONTROLLER_STATUS = "mdi:heart-pulse" -ICON_PV_CONTROLLER_STATUS = "mdi:heart-pulse" -ICON_CHARGING_MODE_SETTING = "mdi:car-battery" +CONF_CHARGER_MODE_SETTING = "charger_mode_setting" +CONF_CHARGER_CONTROLLER_STATUS = "charger_controller_status" +CONF_CHARGER_BATTERY_STATUS = "charger_battery_status" + +CONF_CHARGING_CONVERTER_MODE_SETTING = "charging_converter_mode_setting" +CONF_CHARGING_CONVERTER_BATTERY_STATUS = "charging_converter_battery_status" +CONF_CHARGING_CONVERTER_CONTROLLER_STATUS = "charging_converter_controller_status" + +CONF_PV_MODE_SETTING = "pv_mode_setting" +CONF_PV_BATTERY_STATUS = "pv_battery_status" +CONF_PV_CONTROLLER_STATUS = "pv_controller_status" TEXT_SENSORS = [ CONF_BATTERY_STATUS, + CONF_CHARGER_MODE_SETTING, + CONF_CHARGER_CONTROLLER_STATUS, + CONF_CHARGER_BATTERY_STATUS, + CONF_CHARGING_CONVERTER_MODE_SETTING, + CONF_CHARGING_CONVERTER_BATTERY_STATUS, + CONF_CHARGING_CONVERTER_CONTROLLER_STATUS, + CONF_PV_MODE_SETTING, CONF_PV_BATTERY_STATUS, - CONF_CHARGING_CONTROLLER_STATUS, CONF_PV_CONTROLLER_STATUS, - CONF_CHARGING_MODE_SETTING, ] CONFIG_SCHEMA = cv.Schema( @@ -35,35 +42,69 @@ CONFIG_SCHEMA = cv.Schema( cv.Optional(CONF_BATTERY_STATUS): text_sensor.TEXT_SENSOR_SCHEMA.extend( { cv.GenerateID(): cv.declare_id(text_sensor.TextSensor), - cv.Optional(CONF_ICON, default=ICON_BATTERY_STATUS): cv.icon, + cv.Optional(CONF_ICON, default="mdi:alert-circle-outline"): cv.icon, + } + ), + cv.Optional(CONF_CHARGER_MODE_SETTING): text_sensor.TEXT_SENSOR_SCHEMA.extend( + { + cv.GenerateID(): cv.declare_id(text_sensor.TextSensor), + cv.Optional(CONF_ICON, default="mdi:car-battery"): cv.icon, + } + ), + cv.Optional( + CONF_CHARGER_CONTROLLER_STATUS + ): text_sensor.TEXT_SENSOR_SCHEMA.extend( + { + cv.GenerateID(): cv.declare_id(text_sensor.TextSensor), + cv.Optional(CONF_ICON, default="mdi:heart-pulse"): cv.icon, + } + ), + cv.Optional(CONF_CHARGER_BATTERY_STATUS): text_sensor.TEXT_SENSOR_SCHEMA.extend( + { + cv.GenerateID(): cv.declare_id(text_sensor.TextSensor), + cv.Optional(CONF_ICON, default="mdi:alert-circle-outline"): cv.icon, + } + ), + cv.Optional( + CONF_CHARGING_CONVERTER_BATTERY_STATUS + ): text_sensor.TEXT_SENSOR_SCHEMA.extend( + { + cv.GenerateID(): cv.declare_id(text_sensor.TextSensor), + cv.Optional(CONF_ICON, default="mdi:car-battery"): cv.icon, + } + ), + cv.Optional( + CONF_CHARGING_CONVERTER_CONTROLLER_STATUS + ): text_sensor.TEXT_SENSOR_SCHEMA.extend( + { + cv.GenerateID(): cv.declare_id(text_sensor.TextSensor), + cv.Optional(CONF_ICON, default="mdi:heart-pulse"): cv.icon, + } + ), + cv.Optional( + CONF_CHARGING_CONVERTER_MODE_SETTING + ): text_sensor.TEXT_SENSOR_SCHEMA.extend( + { + cv.GenerateID(): cv.declare_id(text_sensor.TextSensor), + cv.Optional(CONF_ICON, default="mdi:car-battery"): cv.icon, + } + ), + cv.Optional(CONF_PV_MODE_SETTING): text_sensor.TEXT_SENSOR_SCHEMA.extend( + { + cv.GenerateID(): cv.declare_id(text_sensor.TextSensor), + cv.Optional(CONF_ICON, default="mdi:car-battery"): cv.icon, } ), cv.Optional(CONF_PV_BATTERY_STATUS): text_sensor.TEXT_SENSOR_SCHEMA.extend( { cv.GenerateID(): cv.declare_id(text_sensor.TextSensor), - cv.Optional(CONF_ICON, default=ICON_PV_BATTERY_STATUS): cv.icon, - } - ), - cv.Optional( - CONF_CHARGING_CONTROLLER_STATUS - ): text_sensor.TEXT_SENSOR_SCHEMA.extend( - { - cv.GenerateID(): cv.declare_id(text_sensor.TextSensor), - cv.Optional( - CONF_ICON, default=ICON_CHARGING_CONTROLLER_STATUS - ): cv.icon, + cv.Optional(CONF_ICON, default="mdi:alert-circle-outline"): cv.icon, } ), cv.Optional(CONF_PV_CONTROLLER_STATUS): text_sensor.TEXT_SENSOR_SCHEMA.extend( { cv.GenerateID(): cv.declare_id(text_sensor.TextSensor), - cv.Optional(CONF_ICON, default=ICON_PV_CONTROLLER_STATUS): cv.icon, - } - ), - cv.Optional(CONF_CHARGING_MODE_SETTING): text_sensor.TEXT_SENSOR_SCHEMA.extend( - { - cv.GenerateID(): cv.declare_id(text_sensor.TextSensor), - cv.Optional(CONF_ICON, default=ICON_CHARGING_MODE_SETTING): cv.icon, + cv.Optional(CONF_ICON, default="mdi:heart-pulse"): cv.icon, } ), } diff --git a/components/votronic/votronic.cpp b/components/votronic/votronic.cpp index 4471a9d..b80667d 100644 --- a/components/votronic/votronic.cpp +++ b/components/votronic/votronic.cpp @@ -133,8 +133,10 @@ void Votronic::on_votronic_data(const std::vector &data) { this->decode_solar_charger_data_(data); break; case VOTRONIC_FRAME_TYPE_CHARGER: + this->decode_charger_data_(data); + break; case VOTRONIC_FRAME_TYPE_CHARGING_CONVERTER: - this->decode_charger_data_(frame_type, data); + this->decode_charging_converter_data_(data); break; case VOTRONIC_FRAME_TYPE_BATTERY_COMPUTER_INFO1: this->decode_battery_computer_info1_data_(data); @@ -171,7 +173,7 @@ void Votronic::decode_solar_charger_data_(const std::vector &data) { }; ESP_LOGI(TAG, "Solar charger data received"); - ESP_LOGVV(TAG, " %s", format_hex_pretty(&data.front(), data.size()).c_str()); + ESP_LOGD(TAG, " %s", format_hex_pretty(&data.front(), data.size()).c_str()); // Byte Len Payload Description Unit Precision // 0 1 0xAA Sync Byte @@ -191,12 +193,14 @@ void Votronic::decode_solar_charger_data_(const std::vector &data) { // 11 1 0x15 Reserved this->publish_state_(this->pv_controller_temperature_sensor_, (float) data[11]); // 12 1 0x03 Charging mode setting (dip switches) - this->publish_state_(this->charging_mode_setting_id_sensor_, data[12]); - this->publish_state_(this->charging_mode_setting_text_sensor_, this->charging_mode_setting_to_string_(data[12])); + this->publish_state_(this->pv_mode_setting_id_sensor_, data[12]); + this->publish_state_(this->pv_mode_setting_text_sensor_, this->charging_mode_setting_to_string_(data[12])); // 13 1 0x00 Battery Controller Status Bitmask + ESP_LOGI(TAG, "PV - Battery Controller Status: 0x%02X", data[13]); this->publish_state_(this->pv_battery_status_bitmask_sensor_, data[13]); this->publish_state_(this->pv_battery_status_text_sensor_, this->battery_status_bitmask_to_string_(data[13])); // 14 1 0x00 PV Controller Status Bitmask + ESP_LOGI(TAG, "PV - Controller Status: 0x%02X", data[14]); this->publish_state_(this->pv_controller_status_bitmask_sensor_, data[14]); this->publish_state_(this->pv_controller_status_text_sensor_, this->solar_charger_status_bitmask_to_string_(data[14])); @@ -205,7 +209,7 @@ void Votronic::decode_solar_charger_data_(const std::vector &data) { this->publish_state_(this->pv_aes_active_binary_sensor_, (data[14] & (1 << 5))); } -void Votronic::decode_charger_data_(const uint8_t &frame_type, const std::vector &data) { +void Votronic::decode_charger_data_(const std::vector &data) { const uint32_t now = millis(); if (now - this->last_charger_data_ < this->throttle_) { return; @@ -217,7 +221,7 @@ void Votronic::decode_charger_data_(const uint8_t &frame_type, const std::vector }; ESP_LOGI(TAG, "Charger data received"); - ESP_LOGVV(TAG, " %s", format_hex_pretty(&data.front(), data.size()).c_str()); + ESP_LOGD(TAG, " %s", format_hex_pretty(&data.front(), data.size()).c_str()); // Byte Len Payload Description Unit Precision // 0 1 0xAA Sync Byte @@ -229,29 +233,83 @@ void Votronic::decode_charger_data_(const uint8_t &frame_type, const std::vector this->publish_state_(this->secondary_battery_voltage_sensor_, votronic_get_16bit(4) * 0.01f); // 6 2 0x78 0x00 Charging Current A S16 100mA/Bit float current = (float) ((int16_t) votronic_get_16bit(6)) * 0.1f; - this->publish_state_(this->current_sensor_, current); - this->publish_state_(this->power_sensor_, current * battery_voltage); - this->publish_state_(this->charging_binary_sensor_, (current > 0.0f)); - this->publish_state_(this->discharging_binary_sensor_, (current < 0.0f)); + this->publish_state_(this->charger_current_sensor_, current); + this->publish_state_(this->charger_power_sensor_, current * battery_voltage); + this->publish_state_(this->charger_charging_binary_sensor_, (current > 0.0f)); + this->publish_state_(this->charger_discharging_binary_sensor_, (current < 0.0f)); // 8 1 0x00 Reserved // 9 1 0x00 Reserved // 10 1 0xA0 Charging Power % 0-100% 1%/Bit - this->publish_state_(this->state_of_charge_sensor_, (float) data[10]); + this->publish_state_(this->charger_load_sensor_, (float) data[10]); // 11 1 0x15 Controller temperature - this->publish_state_(this->controller_temperature_sensor_, data[11] * 0.1f); + this->publish_state_(this->charger_controller_temperature_sensor_, data[11] * 0.1f); // 12 1 0x03 Charging mode setting (dip switches) - this->publish_state_(this->charging_mode_setting_id_sensor_, data[12]); - this->publish_state_(this->charging_mode_setting_text_sensor_, this->charging_mode_setting_to_string_(data[12])); + this->publish_state_(this->charger_mode_setting_id_sensor_, data[12]); + this->publish_state_(this->charger_mode_setting_text_sensor_, this->charging_mode_setting_to_string_(data[12])); // 13 1 0x00 Battery Controller Status Bitmask - this->publish_state_(this->battery_status_bitmask_sensor_, data[13]); - this->publish_state_(this->battery_status_text_sensor_, this->battery_status_bitmask_to_string_(data[13])); + ESP_LOGI(TAG, "Charger - Battery Controller Status: 0x%02X", data[13]); + this->publish_state_(this->charger_battery_status_bitmask_sensor_, data[13]); + this->publish_state_(this->charger_battery_status_text_sensor_, this->battery_status_bitmask_to_string_(data[13])); // 14 1 0x00 Charging Controller Status Bitmask - this->publish_state_(this->charging_controller_status_bitmask_sensor_, data[14]); - this->publish_state_(this->charging_controller_status_text_sensor_, + ESP_LOGI(TAG, "Charger - Controller Status: 0x%02X", data[14]); + this->publish_state_(this->charger_controller_status_bitmask_sensor_, data[14]); + this->publish_state_(this->charger_controller_status_text_sensor_, this->charger_status_bitmask_to_string_(data[14])); + this->publish_state_(this->charger_controller_active_binary_sensor_, (data[14] & (1 << 3))); + this->publish_state_(this->charger_current_reduction_binary_sensor_, (data[14] & (1 << 4))); + this->publish_state_(this->charger_aes_active_binary_sensor_, (data[14] & (1 << 5))); +} + +void Votronic::decode_charging_converter_data_(const std::vector &data) { + const uint32_t now = millis(); + if (now - this->last_charger_data_ < this->throttle_) { + return; + } + this->last_charger_data_ = now; + + auto votronic_get_16bit = [&](size_t i) -> uint16_t { + return (uint16_t(data[i + 1]) << 8) | (uint16_t(data[i + 0]) << 0); + }; + + ESP_LOGI(TAG, "Charging converter data received"); + ESP_LOGD(TAG, " %s", format_hex_pretty(&data.front(), data.size()).c_str()); + + // Byte Len Payload Description Unit Precision + // 0 1 0xAA Sync Byte + // 1 1 0x3A Frame Type + // 2 2 0xA0 0x05 Battery Voltage V U16 10mV/Bit + float battery_voltage = votronic_get_16bit(2) * 0.01f; + this->publish_state_(this->charging_converter_battery_voltage_sensor_, battery_voltage); + // 4 2 0xA4 0x06 Second Battery Voltage V U16 10mV/Bit + this->publish_state_(this->charging_converter_secondary_battery_voltage_sensor_, votronic_get_16bit(4) * 0.01f); + // 6 2 0x78 0x00 Charging Current A S16 100mA/Bit + float current = (float) ((int16_t) votronic_get_16bit(6)) * 0.1f; + this->publish_state_(this->charging_converter_current_sensor_, current); + this->publish_state_(this->charging_converter_power_sensor_, current * battery_voltage); + this->publish_state_(this->charging_converter_charging_binary_sensor_, (current > 0.0f)); + this->publish_state_(this->charging_converter_discharging_binary_sensor_, (current < 0.0f)); + // 8 1 0x00 Reserved + // 9 1 0x00 Reserved + // 10 1 0xA0 Charging Power % 0-100% 1%/Bit + this->publish_state_(this->charging_converter_load_sensor_, (float) data[10]); + // 11 1 0x15 Controller temperature + this->publish_state_(this->charging_converter_controller_temperature_sensor_, data[11] * 0.1f); + // 12 1 0x03 Charging mode setting (dip switches) + this->publish_state_(this->charging_converter_mode_setting_id_sensor_, data[12]); + this->publish_state_(this->charging_converter_mode_setting_text_sensor_, + this->charging_mode_setting_to_string_(data[12])); + // 13 1 0x00 Battery Controller Status Bitmask + ESP_LOGI(TAG, "Charging Converter - Battery Controller Status: 0x%02X", data[13]); + this->publish_state_(this->charging_converter_battery_status_bitmask_sensor_, data[13]); + this->publish_state_(this->charging_converter_battery_status_text_sensor_, + this->battery_status_bitmask_to_string_(data[13])); + // 14 1 0x00 Charging Controller Status Bitmask + ESP_LOGI(TAG, "Charging Converter - Controller Status: 0x%02X", data[14]); + this->publish_state_(this->charging_converter_controller_status_bitmask_sensor_, data[14]); + this->publish_state_(this->charging_converter_controller_status_text_sensor_, this->charger_status_bitmask_to_string_(data[14])); - this->publish_state_(this->controller_active_binary_sensor_, (data[14] & (1 << 3))); - this->publish_state_(this->current_reduction_binary_sensor_, (data[14] & (1 << 4))); - this->publish_state_(this->aes_active_binary_sensor_, (data[14] & (1 << 5))); + this->publish_state_(this->charging_converter_controller_active_binary_sensor_, (data[14] & (1 << 3))); + this->publish_state_(this->charging_converter_current_reduction_binary_sensor_, (data[14] & (1 << 4))); + this->publish_state_(this->charging_converter_aes_active_binary_sensor_, (data[14] & (1 << 5))); } void Votronic::decode_battery_computer_info1_data_(const std::vector &data) { @@ -269,7 +327,7 @@ void Votronic::decode_battery_computer_info1_data_(const std::vector &d // 0xAA 0xCA 0x03 0x05 0x0F 0x05 0xC7 0x01 0x20 0x00 0x63 0x00 0x7B 0xFE 0xFF 0x39 ESP_LOGI(TAG, "Battery computer info1 data received"); - ESP_LOGVV(TAG, " %s", format_hex_pretty(&data.front(), data.size()).c_str()); + ESP_LOGD(TAG, " %s", format_hex_pretty(&data.front(), data.size()).c_str()); // Byte Len Payload Description Unit Precision // 0 1 0xAA Sync Byte @@ -313,7 +371,7 @@ void Votronic::decode_battery_computer_info2_data_(const std::vector &d // 0xAA 0xDA 0x00 0x00 0x00 0x00 0xF8 0x11 0x5E 0x07 0x00 0x00 0x2F 0x04 0x02 0x43 ESP_LOGI(TAG, "Battery computer info2 data received"); - ESP_LOGVV(TAG, " %s", format_hex_pretty(&data.front(), data.size()).c_str()); + ESP_LOGD(TAG, " %s", format_hex_pretty(&data.front(), data.size()).c_str()); // Byte Len Payload Description Unit Precision // 0 1 0xAA Sync Byte @@ -343,8 +401,8 @@ void Votronic::decode_battery_computer_info2_data_(const std::vector &d // LiFePo4 14.4V 14.4 84 184 // LiFePo4 14.6V 14.6 86 186 // LiFePo4 14.8V 14.8 88 188 - this->publish_state_(this->charging_mode_setting_id_sensor_, data[12]); - this->publish_state_(this->charging_mode_setting_text_sensor_, this->charging_mode_setting_to_string_(data[12])); + // this->publish_state_(this->charging_mode_setting_id_sensor_, data[12]); + // this->publish_state_(this->charging_mode_setting_text_sensor_, this->charging_mode_setting_to_string_(data[12])); // 13 1 0x04 this->publish_state_(this->battery_status_bitmask_sensor_, data[13]); this->publish_state_(this->battery_status_text_sensor_, this->battery_status_bitmask_to_string_(data[13])); @@ -369,7 +427,7 @@ void Votronic::decode_battery_computer_info3_data_(const std::vector &d // 0xAA 0xFA 0x2F 0x00 0x00 0x00 0xD2 0x02 0x00 0x0A 0x00 0x00 0x28 0xD0 0x00 0xF7 ESP_LOGI(TAG, "Battery computer info3 data received"); - ESP_LOGVV(TAG, " %s", format_hex_pretty(&data.front(), data.size()).c_str()); + ESP_LOGD(TAG, " %s", format_hex_pretty(&data.front(), data.size()).c_str()); // Byte Len Payload Description Unit Precision // 0 1 0xAA Sync Byte @@ -403,9 +461,19 @@ void Votronic::dump_config() { LOG_BINARY_SENSOR("", "Charging", this->charging_binary_sensor_); LOG_BINARY_SENSOR("", "Discharging", this->discharging_binary_sensor_); - LOG_BINARY_SENSOR("", "Controller active", this->controller_active_binary_sensor_); - LOG_BINARY_SENSOR("", "Current reduction", this->current_reduction_binary_sensor_); - LOG_BINARY_SENSOR("", "AES active", this->aes_active_binary_sensor_); + + LOG_BINARY_SENSOR("", "Charger controller active", this->charger_controller_active_binary_sensor_); + LOG_BINARY_SENSOR("", "Charger current reduction", this->charger_current_reduction_binary_sensor_); + LOG_BINARY_SENSOR("", "Charger AES active", this->charger_aes_active_binary_sensor_); + + LOG_BINARY_SENSOR("", "Charging converter charging", this->charging_converter_charging_binary_sensor_); + LOG_BINARY_SENSOR("", "Charging converter discharging", this->charging_converter_discharging_binary_sensor_); + LOG_BINARY_SENSOR("", "Charging converter controller active", + this->charging_converter_controller_active_binary_sensor_); + LOG_BINARY_SENSOR("", "Charging converter current reduction", + this->charging_converter_current_reduction_binary_sensor_); + LOG_BINARY_SENSOR("", "Charging converter AES active", this->charging_converter_aes_active_binary_sensor_); + LOG_BINARY_SENSOR("", "PV controller active", this->pv_controller_active_binary_sensor_); LOG_BINARY_SENSOR("", "PV current reduction", this->pv_current_reduction_binary_sensor_); LOG_BINARY_SENSOR("", "PV AES active", this->pv_aes_active_binary_sensor_); @@ -413,26 +481,49 @@ void Votronic::dump_config() { LOG_SENSOR("", "Battery voltage", this->battery_voltage_sensor_); LOG_SENSOR("", "Secondary battery voltage", this->secondary_battery_voltage_sensor_); LOG_SENSOR("", "Battery capacity remaining", this->battery_capacity_remaining_sensor_); + LOG_SENSOR("", "Battery nominal capacity", this->battery_nominal_capacity_sensor_); LOG_SENSOR("", "State of charge", this->state_of_charge_sensor_); LOG_SENSOR("", "Current", this->current_sensor_); LOG_SENSOR("", "Power", this->power_sensor_); - LOG_SENSOR("", "Battery nominal capacity", this->battery_nominal_capacity_sensor_); + LOG_SENSOR("", "Battery status bitmask", this->battery_status_bitmask_sensor_); + LOG_SENSOR("", "PV voltage", this->pv_voltage_sensor_); LOG_SENSOR("", "PV current", this->pv_current_sensor_); LOG_SENSOR("", "PV power", this->pv_power_sensor_); - LOG_SENSOR("", "Battery status bitmask", this->battery_status_bitmask_sensor_); LOG_SENSOR("", "PV battery status bitmask", this->pv_battery_status_bitmask_sensor_); - LOG_SENSOR("", "Charging Controller status bitmask", this->charging_controller_status_bitmask_sensor_); LOG_SENSOR("", "PV Controller status bitmask", this->pv_controller_status_bitmask_sensor_); - LOG_SENSOR("", "Charging mode setting ID", this->charging_mode_setting_id_sensor_); - LOG_SENSOR("", "Controller temperature", this->controller_temperature_sensor_); LOG_SENSOR("", "PV controller temperature", this->pv_controller_temperature_sensor_); + LOG_SENSOR("", "Charger battery status bitmask", this->charger_battery_status_bitmask_sensor_); + LOG_SENSOR("", "Charger Controller status bitmask", this->charger_controller_status_bitmask_sensor_); + LOG_SENSOR("", "Charger mode setting ID", this->charger_mode_setting_id_sensor_); + LOG_SENSOR("", "Charger controller temperature", this->charger_controller_temperature_sensor_); + LOG_SENSOR("", "Charger load", this->charger_load_sensor_); + + LOG_SENSOR("", "Charging converter battery voltage", this->charging_converter_battery_voltage_sensor_); + LOG_SENSOR("", "Charging converter secondary battery voltage", + this->charging_converter_secondary_battery_voltage_sensor_); + LOG_SENSOR("", "Charging converter load", this->charging_converter_load_sensor_); + LOG_SENSOR("", "Charging converter current", this->charging_converter_current_sensor_); + LOG_SENSOR("", "Charging converter power", this->charging_converter_power_sensor_); + LOG_SENSOR("", "Charging converter battery status bitmask", this->charging_converter_battery_status_bitmask_sensor_); + LOG_SENSOR("", "Charging converter controller status bitmask", + this->charging_converter_controller_status_bitmask_sensor_); + LOG_SENSOR("", "Charging converter mode setting ID", this->charging_converter_mode_setting_id_sensor_); + LOG_SENSOR("", "Charging converter controller temperature", this->charging_converter_controller_temperature_sensor_); + LOG_TEXT_SENSOR("", "Battery status", this->battery_status_text_sensor_); + + LOG_TEXT_SENSOR("", "Charger battery status", this->charger_battery_status_text_sensor_); + LOG_TEXT_SENSOR("", "Charger controller status", this->charger_controller_status_text_sensor_); + LOG_TEXT_SENSOR("", "Charger mode setting", this->charger_mode_setting_text_sensor_); + + LOG_TEXT_SENSOR("", "Charging converter battery status", this->charging_converter_battery_status_text_sensor_); + LOG_TEXT_SENSOR("", "Charging converter controller status", this->charging_converter_controller_status_text_sensor_); + LOG_TEXT_SENSOR("", "Charging converter mode setting", this->charging_converter_mode_setting_text_sensor_); + LOG_TEXT_SENSOR("", "PV battery status", this->pv_battery_status_text_sensor_); - LOG_TEXT_SENSOR("", "Charging controller status", this->charging_controller_status_text_sensor_); LOG_TEXT_SENSOR("", "PV controller status", this->pv_controller_status_text_sensor_); - LOG_TEXT_SENSOR("", "Charging mode setting", this->charging_mode_setting_text_sensor_); this->check_uart_settings(1000); } diff --git a/components/votronic/votronic.h b/components/votronic/votronic.h index f849105..c10f6a4 100644 --- a/components/votronic/votronic.h +++ b/components/votronic/votronic.h @@ -22,14 +22,22 @@ class Votronic : public uart::UARTDevice, public PollingComponent { void set_discharging_binary_sensor(binary_sensor::BinarySensor *discharging_binary_sensor) { discharging_binary_sensor_ = discharging_binary_sensor; } - void set_controller_active_binary_sensor(binary_sensor::BinarySensor *controller_active_binary_sensor) { - controller_active_binary_sensor_ = controller_active_binary_sensor; + void set_charger_charging_binary_sensor(binary_sensor::BinarySensor *charger_charging_binary_sensor) { + charger_charging_binary_sensor_ = charger_charging_binary_sensor; } - void set_aes_active_binary_sensor(binary_sensor::BinarySensor *aes_active_binary_sensor) { - aes_active_binary_sensor_ = aes_active_binary_sensor; + void set_charger_discharging_binary_sensor(binary_sensor::BinarySensor *charger_discharging_binary_sensor) { + charger_discharging_binary_sensor_ = charger_discharging_binary_sensor; } - void set_current_reduction_binary_sensor(binary_sensor::BinarySensor *current_reduction_binary_sensor) { - current_reduction_binary_sensor_ = current_reduction_binary_sensor; + void set_charger_controller_active_binary_sensor( + binary_sensor::BinarySensor *charger_controller_active_binary_sensor) { + charger_controller_active_binary_sensor_ = charger_controller_active_binary_sensor; + } + void set_charger_aes_active_binary_sensor(binary_sensor::BinarySensor *charger_aes_active_binary_sensor) { + charger_aes_active_binary_sensor_ = charger_aes_active_binary_sensor; + } + void set_charger_current_reduction_binary_sensor( + binary_sensor::BinarySensor *charger_current_reduction_binary_sensor) { + charger_current_reduction_binary_sensor_ = charger_current_reduction_binary_sensor; } void set_pv_controller_active_binary_sensor(binary_sensor::BinarySensor *pv_controller_active_binary_sensor) { pv_controller_active_binary_sensor_ = pv_controller_active_binary_sensor; @@ -40,6 +48,26 @@ class Votronic : public uart::UARTDevice, public PollingComponent { void set_pv_current_reduction_binary_sensor(binary_sensor::BinarySensor *pv_current_reduction_binary_sensor) { pv_current_reduction_binary_sensor_ = pv_current_reduction_binary_sensor; } + void set_charging_converter_charging_binary_sensor( + binary_sensor::BinarySensor *charging_converter_charging_binary_sensor) { + charging_converter_charging_binary_sensor_ = charging_converter_charging_binary_sensor; + } + void set_charging_converter_discharging_binary_sensor( + binary_sensor::BinarySensor *charging_converter_discharging_binary_sensor) { + charging_converter_discharging_binary_sensor_ = charging_converter_discharging_binary_sensor; + } + void set_charging_converter_controller_active_binary_sensor( + binary_sensor::BinarySensor *charging_converter_controller_active_binary_sensor) { + charging_converter_controller_active_binary_sensor_ = charging_converter_controller_active_binary_sensor; + } + void set_charging_converter_current_reduction_binary_sensor( + binary_sensor::BinarySensor *charging_converter_current_reduction_binary_sensor) { + charging_converter_current_reduction_binary_sensor_ = charging_converter_current_reduction_binary_sensor; + } + void set_charging_converter_aes_active_binary_sensor( + binary_sensor::BinarySensor *charging_converter_aes_active_binary_sensor) { + charging_converter_aes_active_binary_sensor_ = charging_converter_aes_active_binary_sensor; + } void set_battery_voltage_sensor(sensor::Sensor *battery_voltage_sensor) { battery_voltage_sensor_ = battery_voltage_sensor; @@ -52,6 +80,14 @@ class Votronic : public uart::UARTDevice, public PollingComponent { } void set_current_sensor(sensor::Sensor *current_sensor) { current_sensor_ = current_sensor; } void set_power_sensor(sensor::Sensor *power_sensor) { power_sensor_ = power_sensor; } + void set_charger_current_sensor(sensor::Sensor *charger_current_sensor) { + charger_current_sensor_ = charger_current_sensor; + } + void set_charger_power_sensor(sensor::Sensor *charger_power_sensor) { charger_power_sensor_ = charger_power_sensor; } + void set_charger_load_sensor(sensor::Sensor *charger_load_sensor) { charger_load_sensor_ = charger_load_sensor; } + void set_charger_battery_status_bitmask_sensor(sensor::Sensor *charger_battery_status_bitmask_sensor) { + charger_battery_status_bitmask_sensor_ = charger_battery_status_bitmask_sensor; + } void set_pv_voltage_sensor(sensor::Sensor *pv_voltage_sensor) { pv_voltage_sensor_ = pv_voltage_sensor; } void set_pv_current_sensor(sensor::Sensor *pv_current_sensor) { pv_current_sensor_ = pv_current_sensor; } void set_pv_power_sensor(sensor::Sensor *pv_power_sensor) { pv_power_sensor_ = pv_power_sensor; } @@ -61,42 +97,94 @@ class Votronic : public uart::UARTDevice, public PollingComponent { void set_pv_battery_status_bitmask_sensor(sensor::Sensor *pv_battery_status_bitmask_sensor) { pv_battery_status_bitmask_sensor_ = pv_battery_status_bitmask_sensor; } - void set_charging_controller_status_bitmask_sensor(sensor::Sensor *charging_controller_status_bitmask_sensor) { - charging_controller_status_bitmask_sensor_ = charging_controller_status_bitmask_sensor; + void set_charger_controller_status_bitmask_sensor(sensor::Sensor *charger_controller_status_bitmask_sensor) { + charger_controller_status_bitmask_sensor_ = charger_controller_status_bitmask_sensor; } void set_pv_controller_status_bitmask_sensor(sensor::Sensor *pv_controller_status_bitmask_sensor) { pv_controller_status_bitmask_sensor_ = pv_controller_status_bitmask_sensor; } - void set_charging_mode_setting_id_sensor(sensor::Sensor *charging_mode_setting_id_sensor) { - charging_mode_setting_id_sensor_ = charging_mode_setting_id_sensor; + void set_charger_mode_setting_id_sensor(sensor::Sensor *charger_mode_setting_id_sensor) { + charger_mode_setting_id_sensor_ = charger_mode_setting_id_sensor; } - void set_controller_temperature_sensor(sensor::Sensor *controller_temperature_sensor) { - controller_temperature_sensor_ = controller_temperature_sensor; + void set_charger_battery_status_text_sensor(text_sensor::TextSensor *charger_battery_status_text_sensor) { + charger_battery_status_text_sensor_ = charger_battery_status_text_sensor; + } + void set_charger_controller_temperature_sensor(sensor::Sensor *charger_controller_temperature_sensor) { + charger_controller_temperature_sensor_ = charger_controller_temperature_sensor; } void set_pv_controller_temperature_sensor(sensor::Sensor *pv_controller_temperature_sensor) { pv_controller_temperature_sensor_ = pv_controller_temperature_sensor; } + void set_pv_mode_setting_id_sensor(sensor::Sensor *pv_mode_setting_id_sensor) { + pv_mode_setting_id_sensor_ = pv_mode_setting_id_sensor; + } void set_battery_capacity_remaining_sensor(sensor::Sensor *battery_capacity_remaining_sensor) { battery_capacity_remaining_sensor_ = battery_capacity_remaining_sensor; } void set_battery_nominal_capacity_sensor(sensor::Sensor *battery_nominal_capacity_sensor) { battery_nominal_capacity_sensor_ = battery_nominal_capacity_sensor; } + void set_charging_converter_battery_voltage_sensor(sensor::Sensor *charging_converter_battery_voltage_sensor) { + charging_converter_battery_voltage_sensor_ = charging_converter_battery_voltage_sensor; + } + void set_charging_converter_secondary_battery_voltage_sensor( + sensor::Sensor *charging_converter_secondary_battery_voltage_sensor) { + charging_converter_secondary_battery_voltage_sensor_ = charging_converter_secondary_battery_voltage_sensor; + } + void set_charging_converter_current_sensor(sensor::Sensor *charging_converter_current_sensor) { + charging_converter_current_sensor_ = charging_converter_current_sensor; + } + void set_charging_converter_power_sensor(sensor::Sensor *charging_converter_power_sensor) { + charging_converter_power_sensor_ = charging_converter_power_sensor; + } + void set_charging_converter_load_sensor(sensor::Sensor *charging_converter_load_sensor) { + charging_converter_load_sensor_ = charging_converter_load_sensor; + } + void set_charging_converter_controller_temperature_sensor( + sensor::Sensor *charging_converter_controller_temperature_sensor) { + charging_converter_controller_temperature_sensor_ = charging_converter_controller_temperature_sensor; + } + void set_charging_converter_mode_setting_id_sensor(sensor::Sensor *charging_converter_mode_setting_id_sensor) { + charging_converter_mode_setting_id_sensor_ = charging_converter_mode_setting_id_sensor; + } + void set_charging_converter_battery_status_bitmask_sensor( + sensor::Sensor *charging_converter_battery_status_bitmask_sensor) { + charging_converter_battery_status_bitmask_sensor_ = charging_converter_battery_status_bitmask_sensor; + } + void set_charging_converter_controller_status_bitmask_sensor( + sensor::Sensor *charging_converter_controller_status_bitmask_sensor) { + charging_converter_controller_status_bitmask_sensor_ = charging_converter_controller_status_bitmask_sensor; + } void set_battery_status_text_sensor(text_sensor::TextSensor *battery_status_text_sensor) { battery_status_text_sensor_ = battery_status_text_sensor; } + void set_pv_mode_setting_text_sensor(text_sensor::TextSensor *pv_mode_setting_text_sensor) { + pv_mode_setting_text_sensor_ = pv_mode_setting_text_sensor; + } void set_pv_battery_status_text_sensor(text_sensor::TextSensor *pv_battery_status_text_sensor) { pv_battery_status_text_sensor_ = pv_battery_status_text_sensor; } - void set_charging_controller_status_text_sensor(text_sensor::TextSensor *charging_controller_status_text_sensor) { - charging_controller_status_text_sensor_ = charging_controller_status_text_sensor; + void set_charger_controller_status_text_sensor(text_sensor::TextSensor *charger_controller_status_text_sensor) { + charger_controller_status_text_sensor_ = charger_controller_status_text_sensor; } void set_pv_controller_status_text_sensor(text_sensor::TextSensor *pv_controller_status_text_sensor) { pv_controller_status_text_sensor_ = pv_controller_status_text_sensor; } - void set_charging_mode_setting_text_sensor(text_sensor::TextSensor *charging_mode_setting_text_sensor) { - charging_mode_setting_text_sensor_ = charging_mode_setting_text_sensor; + void set_charger_mode_setting_text_sensor(text_sensor::TextSensor *charger_mode_setting_text_sensor) { + charger_mode_setting_text_sensor_ = charger_mode_setting_text_sensor; + } + void set_charging_converter_mode_setting_text_sensor( + text_sensor::TextSensor *charging_converter_mode_setting_text_sensor) { + charging_converter_mode_setting_text_sensor_ = charging_converter_mode_setting_text_sensor; + } + void set_charging_converter_battery_status_text_sensor( + text_sensor::TextSensor *charging_converter_battery_status_text_sensor) { + charging_converter_battery_status_text_sensor_ = charging_converter_battery_status_text_sensor; + } + void set_charging_converter_controller_status_text_sensor( + text_sensor::TextSensor *charging_converter_controller_status_text_sensor) { + charging_converter_controller_status_text_sensor_ = charging_converter_controller_status_text_sensor; } void on_votronic_data(const std::vector &data); @@ -106,9 +194,19 @@ class Votronic : public uart::UARTDevice, public PollingComponent { protected: binary_sensor::BinarySensor *charging_binary_sensor_; binary_sensor::BinarySensor *discharging_binary_sensor_; - binary_sensor::BinarySensor *controller_active_binary_sensor_; - binary_sensor::BinarySensor *aes_active_binary_sensor_; - binary_sensor::BinarySensor *current_reduction_binary_sensor_; + + binary_sensor::BinarySensor *charger_charging_binary_sensor_; + binary_sensor::BinarySensor *charger_discharging_binary_sensor_; + binary_sensor::BinarySensor *charger_controller_active_binary_sensor_; + binary_sensor::BinarySensor *charger_aes_active_binary_sensor_; + binary_sensor::BinarySensor *charger_current_reduction_binary_sensor_; + + binary_sensor::BinarySensor *charging_converter_charging_binary_sensor_; + binary_sensor::BinarySensor *charging_converter_discharging_binary_sensor_; + binary_sensor::BinarySensor *charging_converter_controller_active_binary_sensor_; + binary_sensor::BinarySensor *charging_converter_current_reduction_binary_sensor_; + binary_sensor::BinarySensor *charging_converter_aes_active_binary_sensor_; + binary_sensor::BinarySensor *pv_controller_active_binary_sensor_; binary_sensor::BinarySensor *pv_aes_active_binary_sensor_; binary_sensor::BinarySensor *pv_current_reduction_binary_sensor_; @@ -118,24 +216,50 @@ class Votronic : public uart::UARTDevice, public PollingComponent { sensor::Sensor *state_of_charge_sensor_; sensor::Sensor *current_sensor_; sensor::Sensor *power_sensor_; - sensor::Sensor *pv_voltage_sensor_; - sensor::Sensor *pv_current_sensor_; - sensor::Sensor *pv_power_sensor_; sensor::Sensor *battery_status_bitmask_sensor_; - sensor::Sensor *pv_battery_status_bitmask_sensor_; - sensor::Sensor *charging_controller_status_bitmask_sensor_; - sensor::Sensor *pv_controller_status_bitmask_sensor_; - sensor::Sensor *charging_mode_setting_id_sensor_; - sensor::Sensor *controller_temperature_sensor_; - sensor::Sensor *pv_controller_temperature_sensor_; sensor::Sensor *battery_capacity_remaining_sensor_; sensor::Sensor *battery_nominal_capacity_sensor_; + sensor::Sensor *charger_current_sensor_; + sensor::Sensor *charger_power_sensor_; + sensor::Sensor *charger_load_sensor_; + sensor::Sensor *charger_controller_temperature_sensor_; + sensor::Sensor *charger_mode_setting_id_sensor_; + sensor::Sensor *charger_battery_status_bitmask_sensor_; + sensor::Sensor *charger_controller_status_bitmask_sensor_; + + sensor::Sensor *charging_converter_battery_voltage_sensor_; + sensor::Sensor *charging_converter_secondary_battery_voltage_sensor_; + sensor::Sensor *charging_converter_current_sensor_; + sensor::Sensor *charging_converter_power_sensor_; + sensor::Sensor *charging_converter_load_sensor_; + sensor::Sensor *charging_converter_state_of_charge_sensor_; + sensor::Sensor *charging_converter_controller_temperature_sensor_; + sensor::Sensor *charging_converter_mode_setting_id_sensor_; + sensor::Sensor *charging_converter_battery_status_bitmask_sensor_; + sensor::Sensor *charging_converter_controller_status_bitmask_sensor_; + + sensor::Sensor *pv_voltage_sensor_; + sensor::Sensor *pv_current_sensor_; + sensor::Sensor *pv_power_sensor_; + sensor::Sensor *pv_battery_status_bitmask_sensor_; + sensor::Sensor *pv_controller_status_bitmask_sensor_; + sensor::Sensor *pv_controller_temperature_sensor_; + sensor::Sensor *pv_mode_setting_id_sensor_; + text_sensor::TextSensor *battery_status_text_sensor_; + + text_sensor::TextSensor *charger_mode_setting_text_sensor_; + text_sensor::TextSensor *charger_battery_status_text_sensor_; + text_sensor::TextSensor *charger_controller_status_text_sensor_; + + text_sensor::TextSensor *charging_converter_mode_setting_text_sensor_; + text_sensor::TextSensor *charging_converter_battery_status_text_sensor_; + text_sensor::TextSensor *charging_converter_controller_status_text_sensor_; + + text_sensor::TextSensor *pv_mode_setting_text_sensor_; text_sensor::TextSensor *pv_battery_status_text_sensor_; - text_sensor::TextSensor *charging_controller_status_text_sensor_; text_sensor::TextSensor *pv_controller_status_text_sensor_; - text_sensor::TextSensor *charging_mode_setting_text_sensor_; std::vector rx_buffer_; uint32_t last_byte_{0}; @@ -148,7 +272,8 @@ class Votronic : public uart::UARTDevice, public PollingComponent { uint16_t rx_timeout_{150}; void decode_solar_charger_data_(const std::vector &data); - void decode_charger_data_(const uint8_t &frame_type, const std::vector &data); + void decode_charger_data_(const std::vector &data); + void decode_charging_converter_data_(const std::vector &data); void decode_battery_computer_info1_data_(const std::vector &data); void decode_battery_computer_info2_data_(const std::vector &data); void decode_battery_computer_info3_data_(const std::vector &data); diff --git a/docs/pdus/display-link-triple-charger-doing-b2b-charging-plus-ac-charging.txt b/docs/pdus/display-link-triple-charger-doing-b2b-charging-plus-ac-charging.txt new file mode 100644 index 0000000..c56f81d --- /dev/null +++ b/docs/pdus/display-link-triple-charger-doing-b2b-charging-plus-ac-charging.txt @@ -0,0 +1,126 @@ +AA.7A.30.05.08.05.00.00.00.00.00.96.52.28.00.AE +AA.1A.30.05.37.07.0A.00.00.E0.96.0D.52.20.09.15 +AA.1A.30.05.9D.06.0A.00.00.E0.96.0D.52.20.09.BE +AA.3A.30.05.08.05.00.00.00.01.00.96.52.28.00.EF +AA.3A.30.05.08.05.00.00.00.01.00.96.52.28.00.EF +AA.1A.30.05.0C.06.0A.00.00.E0.96.0D.52.20.09.2F +AA.3A.30.05.08.05.00.00.00.01.00.96.52.28.00.EF +AA.1A.30.05.2F.07.0B.00.00.E0.96.0D.52.20.09.0C +AA.1A.30.05.C6.07.0B.00.00.E0.96.0D.52.20.09.E5 +AA.3A.30.05.08.05.00.00.00.01.00.96.52.28.00.EF +AA.3A.30.05.08.05.00.00.00.01.00.96.52.28.00.EF +AA.1A.2F.05.50.08.00.00.00.E0.96.0D.52.20.11.70 +AA.3A.30.05.08.05.0A.00.00.01.11.96.52.28.0C.F8 +AA.7A.37.05.11.05.00.00.00.00.00.96.52.28.00.B0 +AA.1A.38.05.64.08.00.00.00.E0.96.0D.52.20.11.53 +AA.1A.39.05.4C.08.00.00.00.E0.96.0E.52.20.11.79 +AA.3A.39.05.26.05.D4.00.00.01.61.96.52.28.0C.71 +AA.3A.3A.05.26.05.D5.00.00.01.63.96.52.28.0C.71 +AA.1A.3A.05.4A.08.00.00.00.E0.96.0E.52.20.11.7C +AA.7A.3B.05.25.05.00.00.00.00.00.96.52.28.00.88 +AA.1A.3B.05.52.08.00.00.00.E0.96.0F.52.20.11.64 +AA.1A.3C.05.55.08.00.00.00.E0.96.0F.52.20.11.64 +AA.3A.3C.05.2E.05.D5.00.00.01.60.96.52.28.0C.7C +AA.1A.3D.05.4F.08.00.00.00.E0.96.0F.52.20.11.7F +AA.7A.3D.05.51.05.00.00.00.00.00.96.52.28.00.FA +AA.3A.3E.05.52.05.D7.00.00.01.5E.96.52.28.0C.3E +AA.1A.3D.05.56.08.00.00.00.E0.96.10.52.20.11.79 +AA.3A.3E.05.54.05.D7.00.00.01.5E.96.52.28.0C.38 +AA.1A.3E.05.5D.08.00.00.00.E0.96.10.52.20.11.71 +AA.1A.3F.05.6F.08.00.00.00.E0.96.11.52.20.11.43 +AA.7A.40.05.58.05.00.00.00.00.00.96.52.28.00.8E +AA.1A.41.05.55.08.00.00.00.E0.96.12.52.20.11.04 +AA.3A.44.05.59.05.D3.00.00.01.61.96.52.28.0C.74 +AA.1A.44.05.44.08.00.00.00.E0.96.14.52.20.11.16 +AA.1A.44.05.3F.08.00.00.00.E0.96.14.52.20.11.6D +AA.7A.45.05.59.05.00.00.00.00.00.96.52.28.00.8A +AA.3A.45.05.58.05.D2.00.00.01.61.96.52.28.0C.75 +AA.1A.45.05.3E.08.00.00.00.E0.96.14.52.20.11.6D +AA.7A.46.05.58.05.00.00.00.00.00.96.52.28.00.88 +AA.1A.46.05.3C.08.00.00.00.E0.96.15.52.20.11.6D +AA.1A.46.05.3E.08.00.00.00.E0.96.15.52.20.11.6F +AA.3A.46.05.58.05.D1.00.00.01.61.96.52.28.0C.75 +AA.1A.47.05.55.08.00.00.00.E0.96.15.52.20.11.05 +AA.3A.47.05.58.05.D0.00.00.01.61.96.52.28.0C.75 +AA.3A.47.05.58.05.D0.00.00.01.61.96.52.28.0C.75 +AA.1A.47.05.63.08.00.00.00.E0.96.16.52.20.11.30 +AA.1A.48.05.4D.08.00.00.00.E0.96.16.52.20.11.11 +AA.3A.48.05.58.05.CF.00.00.01.61.96.52.28.0C.65 +AA.7A.48.05.58.05.00.00.00.00.00.96.52.28.00.86 +AA.1A.48.05.48.08.00.00.00.E0.96.17.52.20.11.15 +AA.3A.4A.05.58.05.CE.00.00.01.61.96.52.28.0C.66 +AA.1A.4A.05.4F.08.00.00.00.E0.96.19.52.20.11.1E +AA.1A.4B.05.95.08.00.00.00.E0.96.19.52.20.11.C5 +AA.3A.4B.05.57.05.CD.00.00.01.62.96.52.28.0C.68 +AA.7A.4B.05.58.05.00.00.00.00.00.96.52.28.00.85 +AA.1A.4B.05.AA.08.00.00.00.E0.96.19.52.20.11.FA +AA.1A.4B.05.85.08.00.00.00.E0.96.19.52.20.11.D5 +AA.7A.4B.05.58.05.00.00.00.00.00.96.52.28.00.85 +AA.7A.4B.05.58.05.00.00.00.00.00.96.52.28.00.85 +AA.1A.4B.05.88.08.00.00.00.E0.96.19.52.20.11.D8 +AA.7A.4B.05.58.05.00.00.00.00.00.96.52.28.00.85 +AA.1A.4B.05.58.08.00.00.00.E0.96.1A.52.20.11.0B +AA.1A.4B.05.83.08.00.00.00.E0.96.1A.52.20.11.D0 +AA.7A.4B.05.58.05.00.00.00.00.00.96.52.28.00.85 +AA.3A.4B.05.58.05.CC.00.00.01.61.96.52.28.0C.65 +AA.1A.4B.05.58.08.00.00.00.E0.96.1A.52.20.11.0B +AA.7A.4C.05.58.05.00.00.00.00.00.96.52.28.00.82 +AA.1A.4C.05.45.08.00.00.00.E0.96.1A.52.20.11.11 +AA.1A.4C.05.A6.08.00.00.00.E0.96.1C.52.20.11.F4 +AA.7A.4C.05.58.05.00.00.00.00.00.96.52.28.00.82 +AA.7A.4D.05.58.05.00.00.00.00.00.96.52.28.00.83 +AA.1A.4D.05.9B.08.00.00.00.E0.96.1C.52.20.11.C8 +AA.3A.4D.05.58.05.CC.00.00.01.62.96.52.28.0C.60 +AA.1A.4D.05.A6.08.00.00.00.E0.96.1C.52.20.11.F5 +AA.7A.4D.05.58.05.00.00.00.00.00.96.52.28.00.83 +AA.1A.4D.05.7D.08.00.00.00.E0.96.1D.52.20.11.2F +AA.3A.4D.05.58.05.CC.00.00.01.61.96.52.28.0C.63 +AA.1A.4D.05.8B.08.00.00.00.E0.96.1D.52.20.11.D9 +AA.7A.4D.05.58.05.00.00.00.00.00.96.52.28.00.83 +AA.1A.4D.05.A4.08.00.00.00.E0.96.1D.52.20.11.F6 +AA.1A.4D.05.63.08.00.00.00.E0.96.1D.52.20.11.31 +AA.7A.4D.05.58.05.00.00.00.00.00.96.52.28.00.83 +AA.7A.4D.05.58.05.00.00.00.00.00.96.52.28.00.83 +AA.1A.4D.05.64.08.00.00.00.E0.96.1E.52.20.11.35 +AA.3A.4E.05.58.05.CC.00.00.01.62.96.52.28.0C.63 +AA.1A.4D.05.5B.08.00.00.00.E0.96.1E.52.20.11.0A +AA.3A.4D.05.58.05.CC.00.00.01.62.96.52.28.0C.60 +AA.7A.4E.05.59.05.00.00.00.00.00.96.52.28.00.81 +AA.1A.4E.05.55.08.00.00.00.E0.96.1F.52.20.11.06 +AA.7A.4E.05.59.05.00.00.00.00.00.96.52.28.00.81 +AA.1A.4E.05.52.08.00.00.00.E0.96.1F.52.20.11.01 +AA.1A.4E.05.4F.08.00.00.00.E0.96.1F.52.20.11.1C +AA.7A.4E.05.59.05.00.00.00.00.00.96.52.28.00.81 +AA.1A.4E.05.59.08.00.00.00.E0.96.1F.52.20.11.0A +AA.1A.4E.05.72.08.00.00.00.E0.96.20.52.20.11.1E +AA.3A.4E.05.59.05.CC.00.00.01.63.96.52.28.0C.63 +AA.7A.4E.05.59.05.00.00.00.00.00.96.52.28.00.81 +AA.1A.4E.05.5E.08.00.00.00.E0.96.20.52.20.11.32 +AA.7A.4E.05.59.05.00.00.00.00.00.96.52.28.00.81 +AA.1A.4E.05.55.08.00.00.00.E0.96.20.52.20.11.39 +AA.3A.4E.05.59.05.CC.00.00.01.62.96.52.28.0C.62 +AA.1A.4E.05.59.08.00.00.00.E0.96.20.52.20.11.35 +AA.3A.4E.05.59.05.CC.00.00.01.63.96.52.28.0C.63 +AA.1A.4E.05.9F.08.00.00.00.E0.96.20.52.20.11.F3 +AA.7A.4E.05.59.05.00.00.00.00.00.96.52.28.00.81 +AA.3A.4E.05.59.05.CB.00.00.01.62.96.52.28.0C.65 +AA.1A.4E.05.4C.08.00.00.00.E0.96.22.52.20.11.22 +AA.3A.4E.05.59.05.CB.00.00.01.62.96.52.28.0C.65 +AA.3A.4E.05.59.05.CB.00.00.01.62.96.52.28.0C.65 +AA.1A.4E.05.4C.08.00.00.00.E0.96.22.52.20.11.22 +AA.3A.4E.05.59.05.CB.00.00.01.62.96.52.28.0C.65 +AA.1A.4E.05.4D.08.00.00.00.E0.96.23.52.20.11.22 +AA.7A.4E.05.59.05.00.00.00.00.00.96.52.28.00.81 +AA.1A.4E.05.61.08.00.00.00.E0.96.23.52.20.11.0E +AA.3A.4E.05.59.05.CB.00.00.01.62.96.52.28.0C.65 +AA.1A.4E.05.7F.08.00.00.00.E0.96.23.52.20.11.10 +AA.3A.4E.05.59.05.CB.00.00.01.62.96.52.28.0C.65 +AA.1A.4E.05.8E.08.00.00.00.E0.96.23.52.20.11.E1 +AA.1A.4E.05.9F.08.00.00.00.E0.96.23.52.20.11.F0 +AA.3A.4E.05.5A.05.CB.00.00.01.62.96.52.28.0C.66 +AA.1A.4E.05.9E.08.00.00.00.E0.96.23.52.20.11.F1 +AA.3A.4F.05.59.05.CB.00.00.01.62.96.52.28.0C.64 +AA.7A.4F.05.59.05.00.00.00.00.00.96.52.28.00.80 +AA.1A.4E.05.99.08.00.00.00.E0.96.23.52.20.11.F6 +AA.1A.4E.05.74.08.00.00.00.E0.96.23.52.20.11.1B +AA.3A.4E.05.59.05.CB.00.00.01.63.96.52.28.0C.64 diff --git a/docs/pdus/display-link-triple-charger-doing-pv-charging-plus-ac-charging.txt b/docs/pdus/display-link-triple-charger-doing-pv-charging-plus-ac-charging.txt new file mode 100644 index 0000000..4436305 --- /dev/null +++ b/docs/pdus/display-link-triple-charger-doing-pv-charging-plus-ac-charging.txt @@ -0,0 +1,59 @@ +AA.1A.54.05.83.08.00.00.00.E0.97.32.52.20.01.F6 +AA.7A.54.05.4A.05.2B.01.00.00.63.97.52.28.0C.CC +AA.1A.54.05.85.08.00.00.00.E0.97.32.52.20.01.F0 +AA.3A.54.05.49.05.00.00.00.01.00.97.52.28.00.CB +AA.1A.54.05.85.08.00.00.00.E0.97.32.52.20.01.F0 +AA.7A.53.05.49.05.2B.01.00.00.64.97.52.28.0C.CF +AA.1A.53.05.83.08.00.00.00.E0.97.33.52.20.01.F0 +AA.1A.54.05.85.08.00.00.00.E0.97.33.52.20.01.F1 +AA.3A.54.05.49.05.00.00.00.01.00.97.52.28.00.CB +AA.1A.54.05.83.08.00.00.00.E0.97.33.52.20.01.F7 +AA.7A.54.05.49.05.2C.01.00.00.63.97.52.28.0C.C8 +AA.7A.53.05.49.05.2C.01.00.00.63.97.52.28.0C.CF +AA.1A.54.05.7D.08.00.00.00.E0.97.33.52.20.01.09 +AA.1A.54.05.0D.08.00.00.00.E0.97.33.52.20.01.79 +AA.7A.55.05.4C.05.2B.01.00.00.64.97.52.28.0C.CC +AA.1A.56.05.1B.08.00.00.00.E0.97.34.52.20.01.6A +AA.7A.55.05.4C.05.2B.01.00.00.64.97.52.28.0C.CC +AA.1A.56.05.5B.08.00.00.00.E0.97.34.52.20.01.2A +AA.3A.56.05.4C.05.00.00.00.01.00.97.52.28.00.CC +AA.7A.56.05.4A.05.2B.01.00.00.63.97.52.28.0C.CE +AA.1A.56.05.7D.08.00.00.00.E0.97.34.52.20.01.0C +AA.7A.56.05.4B.05.2B.01.00.00.63.97.52.28.0C.CF +AA.1A.56.05.83.08.00.00.00.E0.97.34.52.20.01.F2 +AA.1A.56.05.87.08.00.00.00.E0.97.34.52.20.01.F6 +AA.3A.56.05.4B.05.00.00.00.01.00.97.52.28.00.CB +AA.7A.56.05.4B.05.2B.01.00.00.63.97.52.28.0C.CF +AA.1A.56.05.87.08.00.00.00.E0.97.34.52.20.01.F6 +AA.1A.56.05.88.08.00.00.00.E0.97.34.52.20.01.F9 +AA.7A.56.05.4A.05.2C.01.00.00.64.97.52.28.0C.CE +AA.3A.56.05.49.05.00.00.00.01.00.97.52.28.00.C9 +AA.1A.56.05.8A.08.00.00.00.E0.97.34.52.20.01.FB +AA.3A.56.05.49.05.00.00.00.01.00.97.52.28.00.C9 +AA.1A.56.05.8B.08.00.00.00.E0.97.34.52.20.01.FA +AA.1A.56.05.8A.08.00.00.00.E0.97.34.52.20.01.FB +AA.3A.56.05.49.05.00.00.00.01.00.97.52.28.00.C9 +AA.1A.56.05.88.08.00.00.00.E0.97.35.52.20.01.F8 +AA.3A.56.05.47.05.00.00.00.01.00.97.52.28.00.C7 +AA.1A.56.05.88.08.00.00.00.E0.97.35.52.20.01.F8 +AA.1A.56.05.85.08.00.00.00.E0.97.34.52.20.01.F4 +AA.7A.56.05.49.05.2B.01.00.00.64.97.52.28.0C.CA +AA.1A.49.05.83.08.10.00.00.E0.97.35.52.20.09.F4 +AA.3A.49.05.35.05.00.00.00.01.00.97.52.28.00.AA +AA.3A.46.05.30.05.00.00.00.01.00.97.52.28.00.A0 +AA.1A.46.05.BD.06.0A.00.00.E0.97.34.52.20.09.D0 +AA.1A.44.05.82.08.00.00.00.E0.97.32.52.20.11.F7 +AA.3A.44.05.2B.05.00.00.00.01.00.97.52.28.0C.B5 +AA.1A.43.05.80.08.00.00.00.E0.97.31.52.20.11.F1 +AA.7A.43.05.2A.05.00.00.00.00.00.97.52.28.00.FE +AA.3A.46.05.2E.05.41.00.00.01.29.97.52.28.0C.DA +AA.1A.46.05.82.08.00.00.00.E0.97.30.52.20.11.F7 +AA.3A.4B.05.34.05.C7.00.00.01.64.97.52.28.0C.06 +AA.1A.4C.05.82.08.00.00.00.E0.97.30.52.20.11.FD +AA.7A.4C.05.33.05.00.00.00.00.00.97.52.28.00.E8 +AA.1A.4C.05.80.08.00.00.00.E0.97.2F.52.20.11.E0 +AA.1A.4D.05.80.08.00.00.00.E0.97.2F.52.20.11.E1 +AA.1A.4E.05.7F.08.00.00.00.E0.97.2F.52.20.11.1D +AA.3A.4E.05.37.05.D1.00.00.01.64.97.52.28.0C.16 +AA.1A.4D.05.7F.08.00.00.00.E0.97.2F.52.20.11.1E +AA.1A.4D.05.80.08.00.00.00.E0.97.2F.52.20.11.E1 diff --git a/esp8266-charger-example.yaml b/esp8266-charger-example.yaml index 17c9a85..ba7ce53 100644 --- a/esp8266-charger-example.yaml +++ b/esp8266-charger-example.yaml @@ -60,12 +60,17 @@ binary_sensor: name: "${name} charging" discharging: name: "${name} discharging" - controller_active: - name: "${name} controller active" - current_reduction: - name: "${name} current reduction" - aes_active: - name: "${name} aes active" + + charger_charging: + name: "${name} charger charging" + charger_discharging: + name: "${name} charger discharging" + charger_controller_active: + name: "${name} charger controller active" + charger_current_reduction: + name: "${name} charger current reduction" + charger_aes_active: + name: "${name} charger aes active" sensor: - platform: votronic @@ -78,23 +83,28 @@ sensor: name: "${name} current" power: name: "${name} power" - state_of_charge: - name: "${name} state of charge" - controller_temperature: - name: "${name} controller temperature" - charging_mode_setting_id: - name: "${name} charging mode setting id" + + charger_current: + name: "${name} charger current" + charger_power: + name: "${name} charger power" + charger_load: + name: "${name} charger load" + charger_controller_temperature: + name: "${name} charger controller temperature" + charger_mode_setting_id: + name: "${name} charger mode setting id" battery_status_bitmask: name: "${name} battery status bitmask" - charging_controller_status_bitmask: - name: "${name} charging controller status bitmask" + charger_controller_status_bitmask: + name: "${name} charger controller status bitmask" text_sensor: - platform: votronic votronic_id: votronic0 - charging_mode_setting: - name: "${name} charging mode setting" + charger_mode_setting: + name: "${name} charger mode setting" battery_status: name: "${name} battery status" - charging_controller_status: - name: "${name} charging controller status" + charger_controller_status: + name: "${name} charger controller status" diff --git a/esp8266-charging-converter-example.yaml b/esp8266-charging-converter-example.yaml index 17c9a85..4f0eb9f 100644 --- a/esp8266-charging-converter-example.yaml +++ b/esp8266-charging-converter-example.yaml @@ -56,16 +56,16 @@ votronic: binary_sensor: - platform: votronic votronic_id: votronic0 - charging: - name: "${name} charging" - discharging: - name: "${name} discharging" - controller_active: - name: "${name} controller active" - current_reduction: - name: "${name} current reduction" - aes_active: - name: "${name} aes active" + charging_converter_charging: + name: "${name} charging converter charging" + charging_converter_discharging: + name: "${name} charging converter discharging" + charging_converter_controller_active: + name: "${name} charging converter controller active" + charging_converter_current_reduction: + name: "${name} charging converter current reduction" + charging_converter_aes_active: + name: "${name} charging converter aes active" sensor: - platform: votronic @@ -80,21 +80,32 @@ sensor: name: "${name} power" state_of_charge: name: "${name} state of charge" - controller_temperature: - name: "${name} controller temperature" - charging_mode_setting_id: - name: "${name} charging mode setting id" - battery_status_bitmask: - name: "${name} battery status bitmask" - charging_controller_status_bitmask: - name: "${name} charging controller status bitmask" + + charging_converter_battery_voltage: + name: "${name} charging converter battery voltage" + charging_converter_secondary_battery_voltage: + name: "${name} charging converter secondary battery voltage" + charging_converter_current: + name: "${name} charging converter current" + charging_converter_power: + name: "${name} charging converter power" + charging_converter_load: + name: "${name} charging converter load" + charging_converter_controller_temperature: + name: "${name} charging converter controller temperature" + charging_converter_mode_setting_id: + name: "${name} charging converter mode setting id" + charging_converter_battery_status_bitmask: + name: "${name} charging converter battery status bitmask" + charging_converter_controller_status_bitmask: + name: "${name} charging converter controller status bitmask" text_sensor: - platform: votronic votronic_id: votronic0 - charging_mode_setting: - name: "${name} charging mode setting" - battery_status: - name: "${name} battery status" - charging_controller_status: - name: "${name} charging controller status" + charging_converter_mode_setting: + name: "${name} charging converter mode setting" + charging_converter_battery_status: + name: "${name} charging converter battery status" + charging_converter_controller_status: + name: "${name} charging converter controller status" diff --git a/esp8266-smart-shunt-example.yaml b/esp8266-smart-shunt-example.yaml index 196d35a..370695e 100644 --- a/esp8266-smart-shunt-example.yaml +++ b/esp8266-smart-shunt-example.yaml @@ -76,15 +76,15 @@ sensor: name: "${name} battery nominal capacity" state_of_charge: name: "${name} state of charge" - charging_mode_setting_id: - name: "${name} charging mode setting id" + charger_mode_setting_id: + name: "${name} charger mode setting id" battery_status_bitmask: name: "${name} battery status bitmask" text_sensor: - platform: votronic votronic_id: votronic0 - charging_mode_setting: - name: "${name} charging mode setting" + charger_mode_setting: + name: "${name} charger mode setting" battery_status: name: "${name} battery status" diff --git a/esp8266-solar-charger-example.yaml b/esp8266-solar-charger-example.yaml index 40f89a6..c349abc 100644 --- a/esp8266-solar-charger-example.yaml +++ b/esp8266-solar-charger-example.yaml @@ -60,6 +60,7 @@ binary_sensor: name: "${name} charging" discharging: name: "${name} discharging" + pv_controller_active: name: "${name} pv controller active" pv_current_reduction: @@ -80,8 +81,8 @@ sensor: name: "${name} pv power" pv_controller_temperature: name: "${name} pv controller temperature" - charging_mode_setting_id: - name: "${name} charging mode setting id" + pv_mode_setting_id: + name: "${name} pv mode setting id" pv_battery_status_bitmask: name: "${name} pv battery status bitmask" pv_controller_status_bitmask: @@ -90,8 +91,8 @@ sensor: text_sensor: - platform: votronic votronic_id: votronic0 - charging_mode_setting: - name: "${name} charging mode setting" + pv_mode_setting: + name: "${name} pv mode setting" pv_battery_status: name: "${name} pv battery status" pv_controller_status: diff --git a/esp8266-triple-charger-example-debug.yaml b/esp8266-triple-charger-example-debug.yaml index 2adff55..5d4a0d7 100644 --- a/esp8266-triple-charger-example-debug.yaml +++ b/esp8266-triple-charger-example-debug.yaml @@ -1,4 +1,4 @@ -<<: !include esp8266-solar-charger-example.yaml +<<: !include esp8266-triple-charger-example.yaml logger: level: VERY_VERBOSE diff --git a/esp8266-triple-charger-example-faker.yaml b/esp8266-triple-charger-example-faker.yaml index e6cebdc..94efe5d 100644 --- a/esp8266-triple-charger-example-faker.yaml +++ b/esp8266-triple-charger-example-faker.yaml @@ -1,32 +1,58 @@ -<<: !include esp8266-solar-charger-example-debug.yaml +<<: !include esp8266-triple-charger-example-debug.yaml interval: - - interval: 6s + - interval: 10s then: - lambda: |- id(votronic0).on_votronic_data({ - 0xAA, 0x1A, 0x2F, 0x05, 0xC1, 0x06, 0x00, 0x00, 0x00, 0xE0, 0xA5, 0x18, 0x56, 0x20, 0x01, 0xDD + 0xAA, 0x3A, 0xFD, 0x04, 0xF9, 0x04, 0x00, 0x00, 0x00, 0x01, 0x00, 0x9A, 0x52, 0x28, 0x00, 0xDF }); - id(votronic0).on_votronic_data({ - 0xAA, 0x4A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4A - }); - id(votronic0).on_votronic_data({ - 0xAA, 0x3A, 0x2E, 0x05, 0xD5, 0x04, 0x00, 0x00, 0x00, 0x01, 0x00, 0xA3, 0x56, 0x28, 0x00, 0x1C - }); - id(votronic0).on_votronic_data({ - 0xAA, 0x7A, 0x2E, 0x05, 0xD5, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0xA3, 0x56, 0x28, 0x00, 0x5D - }); - - delay: 2s + + - delay: 1s + - lambda: |- id(votronic0).on_votronic_data({ - 0xAA, 0x1A, 0x2F, 0x05, 0xBF, 0x06, 0x00, 0x00, 0x00, 0xE0, 0xA2, 0x19, 0x56, 0x20, 0x01, 0xA5 + 0xAA, 0x4A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4A }); + + - delay: 1s + + - lambda: |- + id(votronic0).on_votronic_data({ + 0xAA, 0x1A, 0xFD, 0x04, 0x94, 0x05, 0x01, 0x00, 0x00, 0xE0, 0x9A, 0x11, 0x52, 0x20, 0x09, 0x63 + }); + + - delay: 1s + + - lambda: |- + id(votronic0).on_votronic_data({ + 0xAA, 0x7A, 0xFD, 0x04, 0xF9, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x9A, 0x52, 0x28, 0x00, 0x9E + }); + + - delay: 1s + + - lambda: |- + id(votronic0).on_votronic_data({ + 0xAA, 0x3A, 0x09, 0x05, 0x02, 0x05, 0xC8, 0x00, 0x00, 0x01, 0x64, 0x9A, 0x52, 0x28, 0x0C, 0x70 + }); + + - delay: 1s + + - lambda: |- id(votronic0).on_votronic_data({ 0xAA, 0x4A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4A }); + + - delay: 1s + + - lambda: |- id(votronic0).on_votronic_data({ - 0xAA, 0x3A, 0x2F, 0x05, 0xD5, 0x04, 0x00, 0x00, 0x00, 0x01, 0x00, 0xA2, 0x56, 0x28, 0x00, 0x1C + 0xAA, 0x1A, 0x0A, 0x05, 0xDD, 0x07, 0x00, 0x00, 0x00, 0xE0, 0x9A, 0x12, 0x52, 0x20, 0x11, 0xC4 }); + + - delay: 1s + + - lambda: |- id(votronic0).on_votronic_data({ - 0xAA, 0x7A, 0x2F, 0x05, 0xD5, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0xA2, 0x56, 0x28, 0x00, 0x5D + 0xAA, 0x7A, 0x0C, 0x05, 0x19, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x9A, 0x52, 0x28, 0x00, 0x8F }); diff --git a/esp8266-triple-charger-example.yaml b/esp8266-triple-charger-example.yaml index 9105857..dd46383 100644 --- a/esp8266-triple-charger-example.yaml +++ b/esp8266-triple-charger-example.yaml @@ -1,7 +1,7 @@ substitutions: name: votronic-solar-charger device_description: "Monitor a Votronic Solar Charger via the display link port (UART)" - external_components_source: github://syssi/esphome-votronic@main + external_components_source: github://syssi/esphome-votronic@verify-triple-charger-controller tx_pin: GPIO4 rx_pin: GPIO5 rx_timeout: 600ms @@ -60,12 +60,29 @@ binary_sensor: name: "${name} charging" discharging: name: "${name} discharging" - controller_active: - name: "${name} controller active" - current_reduction: - name: "${name} current reduction" - aes_active: - name: "${name} aes active" + + charger_charging: + name: "${name} charger charging" + charger_discharging: + name: "${name} charger discharging" + charger_controller_active: + name: "${name} charger controller active" + charger_current_reduction: + name: "${name} charger current reduction" + charger_aes_active: + name: "${name} charger aes active" + + charging_converter_charging: + name: "${name} charging converter charging" + charging_converter_discharging: + name: "${name} charging converter discharging" + charging_converter_controller_active: + name: "${name} charging converter controller active" + charging_converter_current_reduction: + name: "${name} charging converter current reduction" + charging_converter_aes_active: + name: "${name} charging converter aes active" + pv_controller_active: name: "${name} pv controller active" pv_current_reduction: @@ -78,32 +95,82 @@ sensor: votronic_id: votronic0 battery_voltage: name: "${name} battery voltage" - pv_voltage: - name: "${name} pv voltage" - pv_current: - name: "${name} pv current" - pv_power: - name: "${name} pv power" - controller_temperature: - name: "${name} controller temperature" - charging_mode_setting_id: - name: "${name} charging mode setting id" + current: + name: "${name} current" + power: + name: "${name} power" battery_status_bitmask: name: "${name} battery status bitmask" + + charger_current: + name: "${name} charger current" + charger_power: + name: "${name} charger power" + charger_load: + name: "${name} charger load" + charger_controller_temperature: + name: "${name} charger controller temperature" + charger_mode_setting_id: + name: "${name} charger mode setting id" + charger_battery_status_bitmask: + name: "${name} charger battery status bitmask" + charger_controller_status_bitmask: + name: "${name} charger controller status bitmask" + + charging_converter_battery_voltage: + name: "${name} charging converter battery voltage" + charging_converter_secondary_battery_voltage: + name: "${name} charging converter secondary battery voltage" + charging_converter_current: + name: "${name} charging converter current" + charging_converter_power: + name: "${name} charging converter power" + charging_converter_load: + name: "${name} charging converter load" + charging_converter_controller_temperature: + name: "${name} charging converter controller temperature" + charging_converter_mode_setting_id: + name: "${name} charging converter mode setting id" + charging_converter_battery_status_bitmask: + name: "${name} charging converter battery status bitmask" + charging_converter_controller_status_bitmask: + name: "${name} charging converter controller status bitmask" + pv_controller_status_bitmask: name: "${name} pv controller status bitmask" pv_controller_temperature: name: "${name} pv controller temperature" pv_battery_status_bitmask: name: "${name} pv battery status bitmask" + pv_voltage: + name: "${name} pv voltage" + pv_current: + name: "${name} pv current" + pv_power: + name: "${name} pv power" text_sensor: - platform: votronic votronic_id: votronic0 - charging_mode_setting: - name: "${name} charging mode setting" battery_status: name: "${name} battery status" + + charger_mode_setting: + name: "${name} charger mode setting" + charger_battery_status: + name: "${name} charger battery status" + charger_controller_status: + name: "${name} charger controller status" + + charging_converter_mode_setting: + name: "${name} charging converter mode setting" + charging_converter_battery_status: + name: "${name} charging converter battery status" + charging_converter_controller_status: + name: "${name} charging converter controller status" + + pv_mode_setting: + name: "${name} pv mode setting" pv_controller_status: name: "${name} pv controller status" pv_battery_status: