mirror of
https://github.com/KinDR007/VictronMPPT-ESPHOME.git
synced 2024-10-21 07:09:27 +00:00
Add DC monitor mode (MON
) sensor (Closes: #70)
This commit is contained in:
parent
a0f5353d40
commit
e641fd472e
5
.github/workflows/ci.yaml
vendored
5
.github/workflows/ci.yaml
vendored
@ -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:
|
||||
|
@ -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,
|
||||
),
|
||||
}
|
||||
)
|
||||
|
||||
|
@ -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)}
|
||||
),
|
||||
}
|
||||
)
|
||||
|
||||
|
@ -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());
|
||||
}
|
||||
|
@ -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};
|
||||
|
@ -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
|
||||
|
@ -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
69
tests/fake-bmv710.yaml
Normal 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"
|
Loading…
Reference in New Issue
Block a user