Merge smart shunt support

This commit is contained in:
Sebastian Muszynski 2022-05-29 20:36:21 +02:00
parent 231f950b16
commit 5b96cb1fb6
13 changed files with 615 additions and 84 deletions

View File

@ -163,14 +163,13 @@ jobs:
shell: bash
run: 'echo -e "wifi_ssid: ssid\nwifi_password: password\nmqtt_host: host\nmqtt_username: username\nmqtt_password: password" > secrets.yaml'
- run: |
sed -i 's#source: github://KinDR007/VictronMPPT-ESPHOME@main#source: components#' esp8266-example.yaml
esphome config esp8266-example.yaml
esphome -s external_components_source components config smartsolar-mppt-esp8266-example.yaml
- run: |
sed -i 's#source: github://KinDR007/VictronMPPT-ESPHOME@main#source: components#' esp8266-example-multiple-uarts.yaml
esphome config esp8266-example-multiple-uarts.yaml
esphome -s external_components_source components config smartsolar-mppt-esp8266-example-multiple-uarts.yaml
- run: |
sed -i 's#source: github://KinDR007/VictronMPPT-ESPHOME@main#source: components#' esp8266-example-advanced.yaml
esphome config esp8266-example-advanced.yaml
esphome -s external_components_source components config smartsolar-mppt-esp8266-example-advanced.yaml
- run: |
esphome -s external_components_source components config smartshunt-esp8266-example.yaml
esphome-compile:
runs-on: ubuntu-latest
@ -208,11 +207,10 @@ jobs:
shell: bash
run: 'echo -e "wifi_ssid: ssid\nwifi_password: password\nmqtt_host: host\nmqtt_username: username\nmqtt_password: password" > secrets.yaml'
- run: |
sed -i 's#source: github://KinDR007/VictronMPPT-ESPHOME@main#source: components#' esp8266-example.yaml
esphome compile esp8266-example.yaml
esphome -s external_components_source components compile smartsolar-mppt-esp8266-example.yaml
- run: |
sed -i 's#source: github://KinDR007/VictronMPPT-ESPHOME@main#source: components#' esp8266-example-multiple-uarts.yaml
esphome compile esp8266-example-multiple-uarts.yaml
esphome -s external_components_source components compile smartsolar-mppt-esp8266-example-multiple-uarts.yaml
- run: |
sed -i 's#source: github://KinDR007/VictronMPPT-ESPHOME@main#source: components#' esp8266-example-advanced.yaml
esphome compile esp8266-example-advanced.yaml
esphome -s external_components_source components compile smartsolar-mppt-esp8266-example-advanced.yaml
- run: |
esphome -s external_components_source components compile smartshunt-esp8266-example.yaml

2
.gitignore vendored
View File

@ -1,5 +1,5 @@
.idea/
secret.yaml
secrets.yaml
.esphome/
**/.pioenvs/
**/.piolibdeps/

View File

@ -130,7 +130,19 @@ The available numeric sensors are:
- `battery_voltage`
- `device_mode_id`
- `warning_code`
- `instantaneous_power`
- `consumed_amp_hours`
- `state_of_charge`
- `time_to_go`
- `depth_of_the_deepest_discharge`
- `depth_of_the_last_discharge`
- `number_of_charge_cycles`
- `number_of_full_discharges`
- `min_battery_voltage`
- `max_battery_voltage`
- `last_full_charge`
- `amount_of_discharged_energy`
- `amount_of_charged_energy`
The available text sensors are:
- `charging_mode`
@ -140,6 +152,9 @@ The available text sensors are:
- `device_type`
- `device_mode`
- `warning`
- `alarm_condition_active`
- `alarm_reason`
- `model_description`
Binary sensors:

View File

@ -10,9 +10,13 @@ from esphome.const import (
ICON_CURRENT_AC,
ICON_EMPTY,
ICON_FLASH,
ICON_PERCENT,
ICON_POWER,
ICON_TIMELAPSE,
UNIT_AMPERE,
UNIT_EMPTY,
UNIT_MINUTE,
UNIT_PERCENT,
UNIT_VOLT,
UNIT_WATT,
UNIT_WATT_HOURS,
@ -42,6 +46,20 @@ CONF_LOAD_CURRENT = "load_current"
CONF_AC_OUT_VOLTAGE = "ac_out_voltage"
CONF_AC_OUT_CURRENT = "ac_out_current"
CONF_INSTANTANEOUS_POWER = "instantaneous_power"
CONF_CONSUMED_AMP_HOURS = "consumed_amp_hours"
CONF_STATE_OF_CHARGE = "state_of_charge"
CONF_TIME_TO_GO = "time_to_go"
CONF_DEPTH_OF_THE_DEEPEST_DISCHARGE = "depth_of_the_deepest_discharge"
CONF_DEPTH_OF_THE_LAST_DISCHARGE = "depth_of_the_last_discharge"
CONF_NUMBER_OF_CHARGE_CYCLES = "number_of_charge_cycles"
CONF_NUMBER_OF_FULL_DISCHARGES = "number_of_full_discharges"
CONF_MIN_BATTERY_VOLTAGE = "min_battery_voltage"
CONF_MAX_BATTERY_VOLTAGE = "max_battery_voltage"
CONF_LAST_FULL_CHARGE = "last_full_charge"
CONF_AMOUNT_OF_DISCHARGED_ENERGY = "amount_of_discharged_energy"
CONF_AMOUNT_OF_CHARGED_ENERGY = "amount_of_charged_energy"
SENSORS = [
CONF_BATTERY_VOLTAGE,
CONF_AC_OUT_VOLTAGE,
@ -61,6 +79,20 @@ SENSORS = [
CONF_TRACKING_MODE_ID,
CONF_DEVICE_MODE_ID,
CONF_LOAD_CURRENT,
#
CONF_INSTANTANEOUS_POWER,
CONF_CONSUMED_AMP_HOURS,
CONF_STATE_OF_CHARGE,
CONF_TIME_TO_GO,
CONF_DEPTH_OF_THE_DEEPEST_DISCHARGE,
CONF_DEPTH_OF_THE_LAST_DISCHARGE,
CONF_NUMBER_OF_CHARGE_CYCLES,
CONF_NUMBER_OF_FULL_DISCHARGES,
CONF_MIN_BATTERY_VOLTAGE,
CONF_MAX_BATTERY_VOLTAGE,
CONF_LAST_FULL_CHARGE,
CONF_AMOUNT_OF_DISCHARGED_ENERGY,
CONF_AMOUNT_OF_CHARGED_ENERGY,
]
@ -175,6 +207,84 @@ CONFIG_SCHEMA = cv.Schema(
accuracy_decimals=3,
device_class=DEVICE_CLASS_CURRENT,
),
cv.Optional(CONF_INSTANTANEOUS_POWER): sensor.sensor_schema(
unit_of_measurement=UNIT_WATT,
icon=ICON_POWER,
accuracy_decimals=0,
device_class=DEVICE_CLASS_POWER,
),
cv.Optional(CONF_CONSUMED_AMP_HOURS): sensor.sensor_schema(
unit_of_measurement=UNIT_AMPERE,
icon=ICON_CURRENT_AC,
accuracy_decimals=3,
device_class=DEVICE_CLASS_POWER,
),
cv.Optional(CONF_STATE_OF_CHARGE): sensor.sensor_schema(
unit_of_measurement=UNIT_PERCENT,
icon=ICON_PERCENT,
accuracy_decimals=0,
device_class=DEVICE_CLASS_EMPTY,
),
cv.Optional(CONF_TIME_TO_GO): sensor.sensor_schema(
unit_of_measurement=UNIT_MINUTE,
icon=ICON_TIMELAPSE,
accuracy_decimals=0,
device_class=DEVICE_CLASS_EMPTY,
),
cv.Optional(CONF_DEPTH_OF_THE_DEEPEST_DISCHARGE): sensor.sensor_schema(
unit_of_measurement=UNIT_AMPERE,
icon=ICON_CURRENT_AC,
accuracy_decimals=3,
device_class=DEVICE_CLASS_CURRENT,
),
cv.Optional(CONF_DEPTH_OF_THE_LAST_DISCHARGE): sensor.sensor_schema(
unit_of_measurement=UNIT_AMPERE,
icon=ICON_CURRENT_AC,
accuracy_decimals=3,
device_class=DEVICE_CLASS_CURRENT,
),
cv.Optional(CONF_NUMBER_OF_CHARGE_CYCLES): sensor.sensor_schema(
unit_of_measurement=UNIT_EMPTY,
icon=ICON_EMPTY,
accuracy_decimals=0,
device_class=DEVICE_CLASS_EMPTY,
),
cv.Optional(CONF_NUMBER_OF_FULL_DISCHARGES): sensor.sensor_schema(
unit_of_measurement=UNIT_EMPTY,
icon=ICON_EMPTY,
accuracy_decimals=0,
device_class=DEVICE_CLASS_EMPTY,
),
cv.Optional(CONF_MIN_BATTERY_VOLTAGE): sensor.sensor_schema(
unit_of_measurement=UNIT_VOLT,
icon=ICON_FLASH,
accuracy_decimals=3,
device_class=DEVICE_CLASS_VOLTAGE,
),
cv.Optional(CONF_MAX_BATTERY_VOLTAGE): sensor.sensor_schema(
unit_of_measurement=UNIT_VOLT,
icon=ICON_FLASH,
accuracy_decimals=3,
device_class=DEVICE_CLASS_VOLTAGE,
),
cv.Optional(CONF_LAST_FULL_CHARGE): sensor.sensor_schema(
unit_of_measurement=UNIT_MINUTE,
icon=ICON_TIMELAPSE,
accuracy_decimals=0,
device_class=DEVICE_CLASS_EMPTY,
),
cv.Optional(CONF_AMOUNT_OF_DISCHARGED_ENERGY): sensor.sensor_schema(
unit_of_measurement=UNIT_WATT_HOURS,
icon=ICON_POWER,
accuracy_decimals=0,
device_class=DEVICE_CLASS_POWER,
),
cv.Optional(CONF_AMOUNT_OF_CHARGED_ENERGY): sensor.sensor_schema(
unit_of_measurement=UNIT_WATT_HOURS,
icon=ICON_POWER,
accuracy_decimals=0,
device_class=DEVICE_CLASS_POWER,
),
}
)

View File

@ -17,6 +17,10 @@ CONF_DEVICE_MODE = "device_mode"
CONF_FIRMWARE_VERSION = "firmware_version"
CONF_DEVICE_TYPE = "device_type"
CONF_ALARM_CONDITION_ACTIVE = "alarm_condition_active"
CONF_ALARM_REASON = "alarm_reason"
CONF_MODEL_DESCRIPTION = "model_description"
TEXT_SENSORS = [
CONF_CHARGING_MODE,
CONF_ERROR,
@ -25,6 +29,10 @@ TEXT_SENSORS = [
CONF_DEVICE_MODE,
CONF_FIRMWARE_VERSION,
CONF_DEVICE_TYPE,
#
CONF_ALARM_CONDITION_ACTIVE,
CONF_ALARM_REASON,
CONF_MODEL_DESCRIPTION,
]
@ -52,6 +60,15 @@ CONFIG_SCHEMA = cv.Schema(
cv.Optional(CONF_DEVICE_TYPE): text_sensor.TEXT_SENSOR_SCHEMA.extend(
{cv.GenerateID(): cv.declare_id(text_sensor.TextSensor)}
),
cv.Optional(CONF_ALARM_CONDITION_ACTIVE): text_sensor.TEXT_SENSOR_SCHEMA.extend(
{cv.GenerateID(): cv.declare_id(text_sensor.TextSensor)}
),
cv.Optional(CONF_ALARM_REASON): text_sensor.TEXT_SENSOR_SCHEMA.extend(
{cv.GenerateID(): cv.declare_id(text_sensor.TextSensor)}
),
cv.Optional(CONF_MODEL_DESCRIPTION): text_sensor.TEXT_SENSOR_SCHEMA.extend(
{cv.GenerateID(): cv.declare_id(text_sensor.TextSensor)}
),
}
)

View File

@ -9,6 +9,8 @@ static const char *const TAG = "victron";
void VictronComponent::dump_config() {
ESP_LOGCONFIG(TAG, "Victron:");
LOG_BINARY_SENSOR(" ", "Load state", load_state_binary_sensor_);
LOG_BINARY_SENSOR(" ", "Relay state", relay_state_binary_sensor_);
LOG_SENSOR(" ", "Max Power Yesterday", max_power_yesterday_sensor_);
LOG_SENSOR(" ", "Max Power Today", max_power_today_sensor_);
LOG_SENSOR(" ", "Yield Total", yield_total_sensor_);
@ -34,8 +36,23 @@ void VictronComponent::dump_config() {
LOG_TEXT_SENSOR(" ", "Device Mode", device_mode_text_sensor_);
LOG_TEXT_SENSOR(" ", "Firmware Version", firmware_version_text_sensor_);
LOG_TEXT_SENSOR(" ", "Device Type", device_type_text_sensor_);
LOG_BINARY_SENSOR(" ", "Load state", load_state_binary_sensor_);
LOG_BINARY_SENSOR(" ", "Relay state", relay_state_binary_sensor_);
LOG_SENSOR(" ", "Instantaneous Power", instantaneous_power_sensor_);
LOG_SENSOR(" ", "Consumed Amp Hours", consumed_amp_hours_sensor_);
LOG_SENSOR(" ", "State Of Charge", state_of_charge_sensor_);
LOG_SENSOR(" ", "Time To Go", time_to_go_sensor_);
LOG_SENSOR(" ", "Depth Of The Deepest Discharge", depth_of_the_deepest_discharge_sensor_);
LOG_SENSOR(" ", "Depth Of The Last Discharge", depth_of_the_last_discharge_sensor_);
LOG_SENSOR(" ", "Number Of Charge Cycles", number_of_charge_cycles_sensor_);
LOG_SENSOR(" ", "Number Of Full Discharges", number_of_full_discharges_sensor_);
LOG_SENSOR(" ", "Min Battery Voltage", min_battery_voltage_sensor_);
LOG_SENSOR(" ", "Max Battery Voltage", max_battery_voltage_sensor_);
LOG_SENSOR(" ", "Last Full Charge", last_full_charge_sensor_);
LOG_SENSOR(" ", "Amount Of Discharged Energy", amount_of_discharged_energy_sensor_);
LOG_SENSOR(" ", "Amount Of Charged Energy", amount_of_charged_energy_sensor_);
LOG_TEXT_SENSOR(" ", "Alarm Condition Active", alarm_condition_active_text_sensor_);
LOG_TEXT_SENSOR(" ", "Alarm Reason", alarm_reason_text_sensor_);
LOG_TEXT_SENSOR(" ", "Model Description", model_description_text_sensor_);
check_uart_settings(19200);
}
@ -97,6 +114,8 @@ static const std::string charging_mode_text(int value) {
switch (value) {
case 0:
return "Off";
case 1:
return "Low power";
case 2:
return "Fault";
case 3:
@ -105,14 +124,22 @@ static const std::string charging_mode_text(int value) {
return "Absorption";
case 5:
return "Float";
case 6:
return "Storage";
case 7:
return "Equalize (manual)";
case 9:
return "Inverting";
case 11:
return "Power supply";
case 245:
return "Starting-up";
case 246:
return "Repeated absorption";
case 247:
return "Auto equalize / Recondition";
case 248:
return "BatterySafe";
case 252:
return "External control";
default:
@ -236,86 +263,144 @@ static const std::string device_type_text(int value) {
return "BMV-702";
case 0x205:
return "BMV-700H";
case 0xA389:
return "SmartShunt";
case 0xA381:
return "BMV-712 Smart";
case 0xA04C:
return "BlueSolar MPPT 75/10";
case 0x300:
return "BlueSolar MPPT 70/15";
case 0xA042:
return "BlueSolar MPPT 75/15";
case 0xA043:
return "BlueSolar MPPT 100/15";
case 0xA044:
return "BlueSolar MPPT 100/30 rev1";
case 0xA04A:
return "BlueSolar MPPT 100/30 rev2";
case 0xA041:
return "BlueSolar MPPT 150/35 rev1";
case 0xA04B:
return "BlueSolar MPPT 150/35 rev2";
case 0xA04D:
return "BlueSolar MPPT 150/45";
case 0x0300:
return "BlueSolar MPPT 70|15";
case 0xA040:
return "BlueSolar MPPT 75/50";
return "BlueSolar MPPT 75|50";
case 0xA041:
return "BlueSolar MPPT 150|35";
case 0xA042:
return "BlueSolar MPPT 75|15";
case 0xA043:
return "BlueSolar MPPT 100|15";
case 0xA044:
return "BlueSolar MPPT 100|30";
case 0xA045:
return "BlueSolar MPPT 100/50 rev1";
case 0xA049:
return "BlueSolar MPPT 100/50 rev2";
case 0xA04E:
return "BlueSolar MPPT 150/60";
return "BlueSolar MPPT 100|50";
case 0xA046:
return "BlueSolar MPPT 150/70";
case 0xA04F:
return "BlueSolar MPPT 150/85";
return "BlueSolar MPPT 150|70";
case 0xA047:
return "BlueSolar MPPT 150/100";
return "BlueSolar MPPT 150|100";
case 0xA049:
return "BlueSolar MPPT 100|50 rev2";
case 0xA04A:
return "BlueSolar MPPT 100|30 rev2";
case 0xA04B:
return "BlueSolar MPPT 150|35 rev2";
case 0xA04C:
return "BlueSolar MPPT 75|10";
case 0xA04D:
return "BlueSolar MPPT 150|45";
case 0xA04E:
return "BlueSolar MPPT 150|60";
case 0xA04F:
return "BlueSolar MPPT 150|85";
case 0xA050:
return "SmartSolar MPPT 250/100";
return "SmartSolar MPPT 250|100";
case 0xA051:
return "SmartSolar MPPT 150/100";
return "SmartSolar MPPT 150|100";
case 0xA052:
return "SmartSolar MPPT 150/85";
return "SmartSolar MPPT 150|85";
case 0xA053:
return "SmartSolar MPPT 75/15";
return "SmartSolar MPPT 75|15";
case 0xA054:
return "SmartSolar MPPT 75/10";
return "SmartSolar MPPT 75|10";
case 0xA055:
return "SmartSolar MPPT 100/15";
return "SmartSolar MPPT 100|15";
case 0xA056:
return "SmartSolar MPPT 100/30";
return "SmartSolar MPPT 100|30";
case 0xA057:
return "SmartSolar MPPT 100/50";
return "SmartSolar MPPT 100|50";
case 0xA058:
return "SmartSolar MPPT 150/35";
return "SmartSolar MPPT 150|35";
case 0xA059:
return "SmartSolar MPPT 150/100 rev2";
return "SmartSolar MPPT 150|100 rev2";
case 0xA05A:
return "SmartSolar MPPT 150/85 rev2";
return "SmartSolar MPPT 150|85 rev2";
case 0xA05B:
return "SmartSolar MPPT 250/70";
return "SmartSolar MPPT 250|70";
case 0xA05C:
return "SmartSolar MPPT 250/85";
return "SmartSolar MPPT 250|85";
case 0xA05D:
return "SmartSolar MPPT 250/60";
return "SmartSolar MPPT 250|60";
case 0xA05E:
return "SmartSolar MPPT 250/45";
return "SmartSolar MPPT 250|45";
case 0xA05F:
return "SmartSolar MPPT 100/20";
return "SmartSolar MPPT 100|20";
case 0xA060:
return "SmartSolar MPPT 100/20 48V";
return "SmartSolar MPPT 100|20 48V";
case 0xA061:
return "SmartSolar MPPT 150/45";
return "SmartSolar MPPT 150|45";
case 0xA062:
return "SmartSolar MPPT 150/60";
return "SmartSolar MPPT 150|60";
case 0xA063:
return "SmartSolar MPPT 150/70";
return "SmartSolar MPPT 150|70";
case 0xA064:
return "SmartSolar MPPT 250/85 rev2";
return "SmartSolar MPPT 250|85 rev2";
case 0xA065:
return "SmartSolar MPPT 250/100 rev2";
return "SmartSolar MPPT 250|100 rev2";
case 0xA066:
return "BlueSolar MPPT 100|20";
case 0xA067:
return "BlueSolar MPPT 100|20 48V";
case 0xA068:
return "SmartSolar MPPT 250|60 rev2";
case 0xA069:
return "SmartSolar MPPT 250|70 rev2";
case 0xA06A:
return "SmartSolar MPPT 150|45 rev2";
case 0xA06B:
return "SmartSolar MPPT 150|60 rev2";
case 0xA06C:
return "SmartSolar MPPT 150|70 rev2";
case 0xA06D:
return "SmartSolar MPPT 150|85 rev3";
case 0xA06E:
return "SmartSolar MPPT 150|100 rev3";
case 0xA06F:
return "BlueSolar MPPT 150|45 rev2";
case 0xA070:
return "BlueSolar MPPT 150|60 rev2";
case 0xA071:
return "BlueSolar MPPT 150|70 rev2";
case 0xA102:
return "SmartSolar MPPT VE.Can 150/70";
case 0xA103:
return "SmartSolar MPPT VE.Can 150/45";
case 0xA104:
return "SmartSolar MPPT VE.Can 150/60";
case 0xA105:
return "SmartSolar MPPT VE.Can 150/85";
case 0xA106:
return "SmartSolar MPPT VE.Can 150/100";
case 0xA107:
return "SmartSolar MPPT VE.Can 250/45";
case 0xA108:
return "SmartSolar MPPT VE.Can 250/60";
case 0xA109:
return "SmartSolar MPPT VE.Can 250/70";
case 0xA10A:
return "SmartSolar MPPT VE.Can 250/85";
case 0xA10B:
return "SmartSolar MPPT VE.Can 250/100";
case 0xA10C:
return "SmartSolar MPPT VE.Can 150/70 rev2";
case 0xA10D:
return "SmartSolar MPPT VE.Can 150/85 rev2";
case 0xA10E:
return "SmartSolar MPPT VE.Can 150/100 rev2";
case 0xA10F:
return "BlueSolar MPPT VE.Can 150/100";
case 0xA112:
return "BlueSolar MPPT VE.Can 250/70";
case 0xA113:
return "BlueSolar MPPT VE.Can 250/100";
case 0xA114:
return "SmartSolar MPPT VE.Can 250/70 rev2";
case 0xA115:
return "SmartSolar MPPT VE.Can 250/100 rev2";
case 0xA116:
return "SmartSolar MPPT VE.Can 250/85 rev2";
case 0xA201:
return "Phoenix Inverter 12V 250VA 230V";
case 0xA202:
@ -394,6 +479,52 @@ static const std::string device_type_text(int value) {
return "Phoenix Inverter 24V 1200VA 120V";
case 0xA27C:
return "Phoenix Inverter 48V 1200VA 120V";
case 0xA281:
return "Phoenix Inverter 12V 1600VA 230V";
case 0xA282:
return "Phoenix Inverter 24V 1600VA 230V";
case 0xA284:
return "Phoenix Inverter 48V 1600VA 230V";
case 0xA291:
return "Phoenix Inverter 12V 2000VA 230V";
case 0xA292:
return "Phoenix Inverter 24V 2000VA 230V";
case 0xA294:
return "Phoenix Inverter 48V 2000VA 230V";
case 0xA2A1:
return "Phoenix Inverter 12V 3000VA 230V";
case 0xA2A2:
return "Phoenix Inverter 24V 3000VA 230V";
case 0xA2A4:
return "Phoenix Inverter 48V 3000VA 230V";
case 0xA340:
return "Phoenix Smart IP43 Charger 12|50 (1+1)";
case 0xA341:
return "Phoenix Smart IP43 Charger 12|50 (3)";
case 0xA342:
return "Phoenix Smart IP43 Charger 24|25 (1+1)";
case 0xA343:
return "Phoenix Smart IP43 Charger 24|25 (3)";
case 0xA344:
return "Phoenix Smart IP43 Charger 12|30 (1+1)";
case 0xA345:
return "Phoenix Smart IP43 Charger 12|30 (3)";
case 0xA346:
return "Phoenix Smart IP43 Charger 24|16 (1+1)";
case 0xA347:
return "Phoenix Smart IP43 Charger 24|16 (3)";
case 0xA381:
return "BMV-712 Smart";
case 0xA382:
return "BMV-710H Smart";
case 0xA383:
return "BMV-712 Smart Rev2";
case 0xA389:
return "SmartShunt 500A/50mV";
case 0xA38A:
return "SmartShunt 1000A/50mV";
case 0xA38B:
return "SmartShunt 2000A/50mV";
default:
return "Unknown";
}
@ -443,10 +574,35 @@ void VictronComponent::handle_value_() {
// "T" °C Battery temperature
// "P" W Instantaneous power
if (label_ == "P") {
this->publish_state_(instantaneous_power_sensor_, atoi(value_.c_str())); // NOLINT(cert-err34-c)
return;
}
// "CE" mAh Consumed Amp Hours
if (label_ == "CE") {
this->publish_state_(consumed_amp_hours_sensor_, atoi(value_.c_str()) / 1000.00); // NOLINT(cert-err34-c)
return;
}
// "SOC" %o State of charge
if (label_ == "SOC") {
// Per mill to %
this->publish_state_(state_of_charge_sensor_, atoi(value_.c_str()) * 0.10); // NOLINT(cert-err34-c)
return;
}
// "TTG" min Time-to-go
if (label_ == "TTG") {
this->publish_state_(time_to_go_sensor_, atoi(value_.c_str())); // NOLINT(cert-err34-c)
return;
}
// "Alarm" Alarm condition active
if (label_ == "Alarm") {
this->publish_state_(alarm_condition_active_text_sensor_, value_);
return;
}
if (label_ == "RELAY") {
this->publish_state_(relay_state_binary_sensor_, value_ == "ON");
@ -454,16 +610,64 @@ void VictronComponent::handle_value_() {
}
// "AR" Alarm reason
if (label_ == "AR") {
this->publish_state_(alarm_reason_text_sensor_, error_code_text(atoi(value_.c_str()))); // NOLINT(cert-err34-c)
return;
}
// "OR" Off reason
// "H1" mAh Depth of the deepest discharge
if (label_ == "H1") {
// mAh -> Ah
this->publish_state_(depth_of_the_deepest_discharge_sensor_,
atoi(value_.c_str()) / 1000.0); // NOLINT(cert-err34-c)
return;
}
// "H2" mAh Depth of the last discharge
if (label_ == "H2") {
// mAh -> Ah
this->publish_state_(depth_of_the_last_discharge_sensor_, atoi(value_.c_str()) / 1000.0); // NOLINT(cert-err34-c)
return;
}
// "H3" mAh Depth of the average discharge
// "H4" Number of charge cycles
if (label_ == "H4") {
this->publish_state_(number_of_charge_cycles_sensor_, atoi(value_.c_str())); // NOLINT(cert-err34-c)
return;
}
// "H5" Number of full discharges
if (label_ == "H5") {
this->publish_state_(number_of_full_discharges_sensor_, atoi(value_.c_str())); // NOLINT(cert-err34-c)
return;
}
// "H6" mAh Cumulative Amp Hours drawn
// "H7" mV Minimum main (battery) voltage
if (label_ == "H7") {
// mV to V
this->publish_state_(min_battery_voltage_sensor_, atoi(value_.c_str()) / 1000.00); // NOLINT(cert-err34-c)
return;
}
// "H8" mV Maximum main (battery) voltage
if (label_ == "H8") {
// mV to V
this->publish_state_(max_battery_voltage_sensor_, atoi(value_.c_str()) / 1000.00); // NOLINT(cert-err34-c)
return;
}
// "H9" S Number of seconds since last full charge
if (label_ == "H9") {
// sec -> min
this->publish_state_(last_full_charge_sensor_, (float) atoi(value_.c_str()) / 60.0); // NOLINT(cert-err34-c)
return;
}
// "H10" Number of automatic synchronizations
// "H11" Number of low main voltage alarms
// "H12" Number of high main voltage alarms
@ -471,8 +675,20 @@ void VictronComponent::handle_value_() {
// "H14" Number of high auxiliary voltage alarms
// "H15" mV Minimum auxiliary (battery) voltage
// "H16" mV Maximum auxiliary (battery) voltage
// "H17" 0.01 kWh Amount of discharged energy (BMV) / Amount of produced energy (DC monitor)
if (label_ == "H17") {
// Wh
this->publish_state_(amount_of_discharged_energy_sensor_, atoi(value_.c_str()) * 10.00); // NOLINT(cert-err34-c)
return;
}
// "H18" 0.01 kWh Amount of charged energy (BMV) / Amount of consumed energy (DC monitor)
if (label_ == "H18") {
// Wh
this->publish_state_(amount_of_charged_energy_sensor_, atoi(value_.c_str()) * 10.00); // NOLINT(cert-err34-c)
return;
}
if (label_ == "H19") {
this->publish_state_(yield_total_sensor_, atoi(value_.c_str()) * 10); // NOLINT(cert-err34-c)
@ -514,6 +730,10 @@ void VictronComponent::handle_value_() {
}
// "BMV" Model description (deprecated)
if (label_ == "BMV") {
this->publish_state_(model_description_text_sensor_, value_);
return;
}
if (label_ == "FW") {
this->publish_state_once_(firmware_version_text_sensor_, value_.insert(value_.size() - 2, "."));

View File

@ -77,6 +77,54 @@ class VictronComponent : public uart::UARTDevice, public Component {
device_type_text_sensor_ = device_type_text_sensor;
}
void set_instantaneous_power_sensor(sensor::Sensor *instantaneous_power_sensor) {
instantaneous_power_sensor_ = instantaneous_power_sensor;
}
void set_consumed_amp_hours_sensor(sensor::Sensor *consumed_amp_hours_sensor) {
consumed_amp_hours_sensor_ = consumed_amp_hours_sensor;
}
void set_state_of_charge_sensor(sensor::Sensor *state_of_charge_sensor) {
state_of_charge_sensor_ = state_of_charge_sensor;
}
void set_time_to_go_sensor(sensor::Sensor *time_to_go_sensor) { time_to_go_sensor_ = time_to_go_sensor; }
void set_depth_of_the_deepest_discharge_sensor(sensor::Sensor *depth_of_the_deepest_discharge_sensor) {
depth_of_the_deepest_discharge_sensor_ = depth_of_the_deepest_discharge_sensor;
}
void set_depth_of_the_last_discharge_sensor(sensor::Sensor *depth_of_the_last_discharge_sensor) {
depth_of_the_last_discharge_sensor_ = depth_of_the_last_discharge_sensor;
}
void set_number_of_charge_cycles_sensor(sensor::Sensor *number_of_charge_cycles_sensor) {
number_of_charge_cycles_sensor_ = number_of_charge_cycles_sensor;
}
void set_number_of_full_discharges_sensor(sensor::Sensor *number_of_full_discharges_sensor) {
number_of_full_discharges_sensor_ = number_of_full_discharges_sensor;
}
void set_min_battery_voltage_sensor(sensor::Sensor *min_battery_voltage_sensor) {
min_battery_voltage_sensor_ = min_battery_voltage_sensor;
}
void set_max_battery_voltage_sensor(sensor::Sensor *max_battery_voltage_sensor) {
max_battery_voltage_sensor_ = max_battery_voltage_sensor;
}
void set_last_full_charge_sensor(sensor::Sensor *last_full_charge_sensor) {
last_full_charge_sensor_ = last_full_charge_sensor;
}
void set_amount_of_discharged_energy_sensor(sensor::Sensor *amount_of_discharged_energy_sensor) {
amount_of_discharged_energy_sensor_ = amount_of_discharged_energy_sensor;
}
void set_amount_of_charged_energy_sensor(sensor::Sensor *amount_of_charged_energy_sensor) {
amount_of_charged_energy_sensor_ = amount_of_charged_energy_sensor;
}
void set_alarm_condition_active_text_sensor(text_sensor::TextSensor *alarm_condition_active_text_sensor) {
alarm_condition_active_text_sensor_ = alarm_condition_active_text_sensor;
}
void set_alarm_reason_text_sensor(text_sensor::TextSensor *alarm_reason_text_sensor) {
alarm_reason_text_sensor_ = alarm_reason_text_sensor;
}
void set_model_description_text_sensor(text_sensor::TextSensor *model_description_text_sensor) {
model_description_text_sensor_ = model_description_text_sensor;
}
void dump_config() override;
void loop() override;
@ -111,7 +159,6 @@ class VictronComponent : public uart::UARTDevice, public Component {
sensor::Sensor *warning_code_sensor_{nullptr};
sensor::Sensor *tracking_mode_id_sensor_{nullptr};
sensor::Sensor *device_mode_id_sensor_{nullptr};
text_sensor::TextSensor *charging_mode_text_sensor_{nullptr};
text_sensor::TextSensor *error_text_sensor_{nullptr};
text_sensor::TextSensor *warning_text_sensor_{nullptr};
@ -120,6 +167,23 @@ class VictronComponent : public uart::UARTDevice, public Component {
text_sensor::TextSensor *firmware_version_text_sensor_{nullptr};
text_sensor::TextSensor *device_type_text_sensor_{nullptr};
sensor::Sensor *instantaneous_power_sensor_{nullptr};
sensor::Sensor *consumed_amp_hours_sensor_{nullptr};
sensor::Sensor *state_of_charge_sensor_{nullptr};
sensor::Sensor *time_to_go_sensor_{nullptr};
sensor::Sensor *depth_of_the_deepest_discharge_sensor_{nullptr};
sensor::Sensor *depth_of_the_last_discharge_sensor_{nullptr};
sensor::Sensor *number_of_charge_cycles_sensor_{nullptr};
sensor::Sensor *number_of_full_discharges_sensor_{nullptr};
sensor::Sensor *min_battery_voltage_sensor_{nullptr};
sensor::Sensor *max_battery_voltage_sensor_{nullptr};
sensor::Sensor *last_full_charge_sensor_{nullptr};
sensor::Sensor *amount_of_discharged_energy_sensor_{nullptr};
sensor::Sensor *amount_of_charged_energy_sensor_{nullptr};
text_sensor::TextSensor *alarm_condition_active_text_sensor_{nullptr};
text_sensor::TextSensor *alarm_reason_text_sensor_{nullptr};
text_sensor::TextSensor *model_description_text_sensor_{nullptr};
bool publishing_{true};
int state_{0};
std::string label_;

View File

@ -0,0 +1,103 @@
substitutions:
name: victron-smartshunt
external_components_source: github://KinDR007/VictronMPPT-ESPHOME@main
esphome:
name: ${name}
platform: ESP8266
board: d1_mini
external_components:
- source: ${external_components_source}
refresh: 0s
wifi:
ssid: !secret wifi_ssid
password: !secret wifi_password
ota:
# api:
logger:
baud_rate: 0
esp8266_store_log_strings_in_flash: false
mqtt:
broker: !secret mqtt_host
username: !secret mqtt_username
password: !secret mqtt_password
id: mqtt_client
uart:
id: uart0
tx_pin: D8 # Not connected! The communication is read-only
rx_pin: D7 # Connect this this GPIO and GND to the MPPT charger
baud_rate: 19200
rx_buffer_size: 256
victron:
uart_id: uart0
id: victron0
throttle: 10s
sensor:
- platform: victron
victron_id: victron0
battery_voltage:
name: "${name} battery voltage"
# TODO: VS
# TODO: VM
# TODO: DM
battery_current:
name: "${name} battery current"
# TODO: T
instantaneous_power:
name: "${name} instantaneous power"
consumed_amp_hours:
name: "${name} consumed amp hours"
state_of_charge:
name: "${name} state of charge"
time_to_go:
name: "${name} time to go"
depth_of_the_deepest_discharge:
name: "${name} depth of the deepest discharge"
depth_of_the_last_discharge:
name: "${name} depth of the last discharge"
# TODO: H3
number_of_charge_cycles:
name: "${name} number of charge cycles"
number_of_full_discharges:
name: "${name} number of full discharges"
# TODO: H6
min_battery_voltage:
name: "${name} min battery voltage"
max_battery_voltage:
name: "${name} max battery voltage"
last_full_charge:
name: "${name} last full charge"
# TODO: H10...H16
amount_of_discharged_energy:
name: "${name} amount of discharged energy"
amount_of_charged_energy:
name: "${name} amount of charged energy"
text_sensor:
- platform: victron
victron_id: victron0
alarm_condition_active:
name: "${name} alarm condition active"
alarm_reason:
name: "${name} alarm reason"
model_description:
name: "${name} model description"
firmware_version:
name: "${name} firmware version"
device_type:
name: "${name} device type"
binary_sensor:
- platform: victron
victron_id: victron0
relay_state:
name: "${name} relay state"
# TODO: MON

View File

@ -1,3 +1,11 @@
substitutions:
external_components_source: github://KinDR007/VictronMPPT-ESPHOME@main
lower_devicename: "victron"
devicename: "SmartSolar_150_35"
config_version: "v2021.05.30"
wifi_fast_connect: "false"
accuracy: "2"
esphome:
name: "${lower_devicename}"
platform: ESP8266
@ -5,21 +13,12 @@ esphome:
# board: nodemcuv2
external_components:
- source: github://KinDR007/VictronMPPT-ESPHOME@main
- source: ${external_components_source}
refresh: 0s
substitutions:
lower_devicename: "victron"
devicename: "SmartSolar_150_35"
config_version: "v2021.05.30"
wifi_fast_connect: "false"
# wifi_reboot_timeout: 0s
accuracy: "2"
wifi:
ssid: !secret wifi_ssid
password: !secret wifi_password
# reboot_timeout: $wifi_reboot_timeout
power_save_mode: none
fast_connect: $wifi_fast_connect

View File

@ -2,6 +2,7 @@ substitutions:
name: victron
device0: victron0
device1: victron1
external_components_source: github://KinDR007/VictronMPPT-ESPHOME@main
esphome:
name: ${name}
@ -9,7 +10,7 @@ esphome:
board: d1_mini
external_components:
- source: github://KinDR007/VictronMPPT-ESPHOME@main
- source: ${external_components_source}
refresh: 0s
wifi:

View File

@ -1,5 +1,6 @@
substitutions:
name: victron
name: victron-mppt
external_components_source: github://KinDR007/VictronMPPT-ESPHOME@main
esphome:
name: ${name}
@ -7,7 +8,7 @@ esphome:
board: d1_mini
external_components:
- source: github://KinDR007/VictronMPPT-ESPHOME@main
- source: ${external_components_source}
refresh: 0s
wifi:

3
test-esp8266.sh Executable file
View File

@ -0,0 +1,3 @@
#!/bin/bash
esphome -s external_components_source components ${1:-run} ${2:-smartsolar-mppt-esp8266-example.yaml}