Add DC monitor mode (MON) sensor (Closes: #70)

This commit is contained in:
Sebastian Muszynski 2022-06-15 12:05:35 +02:00
parent a0f5353d40
commit e641fd472e
8 changed files with 147 additions and 4 deletions

View File

@ -178,10 +178,11 @@ jobs:
esphome -s external_components_source components config debug-esp8266-example.yaml
- run: |
esphome -s external_components_source components config tests/emulator-all-keys.yaml
esphome -s external_components_source components config tests/fake-bmv700.yaml
esphome -s external_components_source components config tests/fake-bmv600.yaml
esphome -s external_components_source components config tests/fake-phoenix-inverter.yaml
esphome -s external_components_source components config tests/fake-bmv700.yaml
esphome -s external_components_source components config tests/fake-bmv710.yaml
esphome -s external_components_source components config tests/fake-multi-rs-solar.yaml
esphome -s external_components_source components config tests/fake-phoenix-inverter.yaml
esphome -s external_components_source components config tests/fake-smartsolar-mppt.yaml
esphome-compile:

View File

@ -81,6 +81,7 @@ CONF_MIN_AUXILIARY_BATTERY_VOLTAGE = "min_auxiliary_battery_voltage"
CONF_MAX_AUXILIARY_BATTERY_VOLTAGE = "max_auxiliary_battery_voltage"
CONF_AMOUNT_OF_DISCHARGED_ENERGY = "amount_of_discharged_energy"
CONF_AMOUNT_OF_CHARGED_ENERGY = "amount_of_charged_energy"
CONF_DC_MONITOR_MODE_ID = "dc_monitor_mode_id"
UNIT_AMPERE_HOURS = "Ah"
@ -135,6 +136,7 @@ SENSORS = [
CONF_MAX_AUXILIARY_BATTERY_VOLTAGE,
CONF_AMOUNT_OF_DISCHARGED_ENERGY,
CONF_AMOUNT_OF_CHARGED_ENERGY,
CONF_DC_MONITOR_MODE_ID,
]
@ -438,6 +440,12 @@ CONFIG_SCHEMA = cv.Schema(
accuracy_decimals=0,
device_class=DEVICE_CLASS_POWER,
),
cv.Optional(CONF_DC_MONITOR_MODE_ID): sensor.sensor_schema(
unit_of_measurement=UNIT_EMPTY,
icon=ICON_EMPTY,
accuracy_decimals=0,
device_class=DEVICE_CLASS_EMPTY,
),
}
)

View File

@ -22,6 +22,7 @@ CONF_SERIAL_NUMBER = "serial_number"
CONF_ALARM_CONDITION_ACTIVE = "alarm_condition_active"
CONF_ALARM_REASON = "alarm_reason"
CONF_MODEL_DESCRIPTION = "model_description"
CONF_DC_MONITOR_MODE = "dc_monitor_mode"
TEXT_SENSORS = [
CONF_CHARGING_MODE,
@ -37,6 +38,7 @@ TEXT_SENSORS = [
CONF_ALARM_CONDITION_ACTIVE,
CONF_ALARM_REASON,
CONF_MODEL_DESCRIPTION,
CONF_DC_MONITOR_MODE,
]
@ -79,6 +81,9 @@ CONFIG_SCHEMA = cv.Schema(
cv.Optional(CONF_MODEL_DESCRIPTION): text_sensor.TEXT_SENSOR_SCHEMA.extend(
{cv.GenerateID(): cv.declare_id(text_sensor.TextSensor)}
),
cv.Optional(CONF_DC_MONITOR_MODE): text_sensor.TEXT_SENSOR_SCHEMA.extend(
{cv.GenerateID(): cv.declare_id(text_sensor.TextSensor)}
),
}
)

View File

@ -272,6 +272,49 @@ static const std::string device_mode_text(int value) {
}
}
static const std::string dc_monitor_mode_text(int value) {
switch (value) {
case -9:
return "Solar charger";
case -8:
return "Wind turbine";
case -7:
return "Shaft generator";
case -6:
return "Alternator";
case -5:
return "Fuel cell";
case -4:
return "Water generator";
case -3:
return "DC/DC charger";
case -2:
return "AC charger";
case -1:
return "Generic source";
case 0:
return "Battery monitor (BMV)";
case 1:
return "Generic load";
case 2:
return "Electric drive";
case 3:
return "Fridge";
case 4:
return "Water pump";
case 5:
return "Bilge pump";
case 6:
return "DC system";
case 7:
return "Inverter";
case 8:
return "Water heater";
default:
return "Unknown";
}
}
static const std::string device_type_text(int value) {
switch (value) {
case 0x203:
@ -906,7 +949,12 @@ void VictronComponent::handle_value_() {
return;
}
// @TODO: "MON" DC monitor mode
if (label_ == "MON") {
value = atoi(value_.c_str()); // NOLINT(cert-err34-c)
this->publish_state_(dc_monitor_mode_id_sensor_, (float) value);
this->publish_state_(dc_monitor_mode_text_sensor_, dc_monitor_mode_text(value));
return;
}
ESP_LOGD(TAG, "Unhandled property: %s %s", label_.c_str(), value_.c_str());
}

View File

@ -81,6 +81,9 @@ class VictronComponent : public uart::UARTDevice, public Component {
void set_device_mode_id_sensor(sensor::Sensor *device_mode_id_sensor) {
device_mode_id_sensor_ = device_mode_id_sensor;
}
void set_dc_monitor_mode_id_sensor(sensor::Sensor *dc_monitor_mode_id_sensor) {
dc_monitor_mode_id_sensor_ = dc_monitor_mode_id_sensor;
}
void set_charging_mode_text_sensor(text_sensor::TextSensor *charging_mode_text_sensor) {
charging_mode_text_sensor_ = charging_mode_text_sensor;
@ -107,6 +110,9 @@ class VictronComponent : public uart::UARTDevice, public Component {
void set_serial_number_text_sensor(text_sensor::TextSensor *serial_number_text_sensor) {
serial_number_text_sensor_ = serial_number_text_sensor;
}
void set_dc_monitor_mode_text_sensor(text_sensor::TextSensor *dc_monitor_mode_text_sensor) {
dc_monitor_mode_text_sensor_ = dc_monitor_mode_text_sensor;
}
void set_battery_temperature_sensor(sensor::Sensor *battery_temperature_sensor) {
battery_temperature_sensor_ = battery_temperature_sensor;
@ -230,6 +236,7 @@ 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};
sensor::Sensor *dc_monitor_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};
@ -239,6 +246,7 @@ class VictronComponent : public uart::UARTDevice, public Component {
text_sensor::TextSensor *firmware_version_24bit_text_sensor_{nullptr};
text_sensor::TextSensor *device_type_text_sensor_{nullptr};
text_sensor::TextSensor *serial_number_text_sensor_{nullptr};
text_sensor::TextSensor *dc_monitor_mode_text_sensor_{nullptr};
sensor::Sensor *battery_temperature_sensor_{nullptr};
sensor::Sensor *instantaneous_power_sensor_{nullptr};

View File

@ -99,6 +99,8 @@ sensor:
name: "${name} amount of discharged energy"
amount_of_charged_energy:
name: "${name} amount of charged energy"
dc_monitor_mode_id:
name: "${name} dc monitor mode id"
text_sensor:
- platform: victron
@ -115,10 +117,11 @@ text_sensor:
name: "${name} device type"
serial_number:
name: "${name} serial number"
dc_monitor_mode:
name: "${name} dc monitor mode"
binary_sensor:
- platform: victron
victron_id: victron0
relay_state:
name: "${name} relay state"
# TODO: MON

View File

@ -88,6 +88,7 @@ interval:
- uart.write: "VS\t12200\r\n"
- uart.write: "WARN\t1\r\n"
- uart.write: "FWE\t109FF\r\n"
- uart.write: "MON\t-1\r\n"
- uart.write: "Checksum\t⸮:A0922001C0004\r\n"
- uart.write: ":A052200EB00000039\r\n"
- uart.write: ":A8DED00221699\r\n"

69
tests/fake-bmv710.yaml Normal file
View File

@ -0,0 +1,69 @@
substitutions:
name: fake-multi-rs-solar
tx_pin: GPIO4
rx_pin: GPIO5
esphome:
name: ${name}
platform: ESP8266
board: d1_mini
wifi:
ssid: !secret wifi_ssid
password: !secret wifi_password
api:
ota:
logger:
level: DEBUG
uart:
baud_rate: 19200
tx_pin: ${tx_pin}
rx_pin: ${rx_pin}
debug:
direction: BOTH
dummy_receiver: true
after:
delimiter: "\n"
sequence:
- lambda: UARTDebug::log_string(direction, bytes);
interval:
- interval: 3s
then:
- uart.write: "V\t12800\r\n"
- uart.write: "VS\t12800\r\n"
- uart.write: "VM\t1280\r\n"
- uart.write: "DM\t120\r\n"
- uart.write: "I\t15000\r\n"
- uart.write: "T\t25\r\n"
- uart.write: "P\t130\r\n"
- uart.write: "CE\t13500\r\n"
- uart.write: "SOC\t876\r\n"
- uart.write: "TTG\t45\r\n"
- uart.write: "Alarm\tOFF\r\n"
- uart.write: "Relay\tOFF\r\n"
- uart.write: "AR\t1\r\n"
- uart.write: "H1\t55000\r\n"
- uart.write: "H2\t15000\r\n"
- uart.write: "H3\t13000\r\n"
- uart.write: "H4\t230\r\n"
- uart.write: "H5\t12\r\n"
- uart.write: "H6\t234000\r\n"
- uart.write: "H7\t11000\r\n"
- uart.write: "H8\t14800\r\n"
- uart.write: "H9\t7200\r\n"
- uart.write: "H10\t45\r\n"
- uart.write: "H11\t5\r\n"
- uart.write: "H12\t0\r\n"
- uart.write: "H15\t11500\r\n"
- uart.write: "H16\t14800\r\n"
- uart.write: "H17\t34\r\n"
- uart.write: "H18\t45\r\n"
- uart.write: "BMV\t702\r\n"
- uart.write: "FW\t1.19\r\n"
- uart.write: "PID\t0x204\r\n"
- uart.write: "MON\t-1\r\n"
- uart.write: "Checksum\t?\r\n"
- uart.write: "\r\n"