Skip to content

Commit

Permalink
Feature: add nice Icons for HA autoconfiguration (#413)
Browse files Browse the repository at this point in the history
* add Icons for Battery and Victron device sensors in Home Assistant
  overriding the boring default icon for many sensors

Signed-off-by: Martin Dummer <[email protected]>
  • Loading branch information
madmartin authored Sep 4, 2023
1 parent 8c36532 commit a7a38e7
Show file tree
Hide file tree
Showing 4 changed files with 68 additions and 51 deletions.
4 changes: 2 additions & 2 deletions include/MqttHandlePylontechHass.h
Original file line number Diff line number Diff line change
Expand Up @@ -12,8 +12,8 @@ class MqttHandlePylontechHassClass {

private:
void publish(const String& subtopic, const String& payload);
void publishBinarySensor(const char* caption, const char* subTopic, const char* payload_on, const char* payload_off);
void publishSensor(const char* caption, const char* subTopic, const char* deviceClass = NULL, const char* stateClass = NULL, const char* unitOfMeasurement = NULL);
void publishBinarySensor(const char* caption, const char* icon, const char* subTopic, const char* payload_on, const char* payload_off);
void publishSensor(const char* caption, const char* icon, const char* subTopic, const char* deviceClass = NULL, const char* stateClass = NULL, const char* unitOfMeasurement = NULL);
void createDeviceInfo(JsonObject& object);

bool _wasConnected = false;
Expand Down
4 changes: 2 additions & 2 deletions include/MqttHandleVedirectHass.h
Original file line number Diff line number Diff line change
Expand Up @@ -13,8 +13,8 @@ class MqttHandleVedirectHassClass {

private:
void publish(const String& subtopic, const String& payload);
void publishBinarySensor(const char* caption, const char* subTopic, const char* payload_on, const char* payload_off);
void publishSensor(const char* caption, const char* subTopic, const char* deviceClass = NULL, const char* stateClass = NULL, const char* unitOfMeasurement = NULL);
void publishBinarySensor(const char* caption, const char* icon, const char* subTopic, const char* payload_on, const char* payload_off);
void publishSensor(const char* caption, const char* icon, const char* subTopic, const char* deviceClass = NULL, const char* stateClass = NULL, const char* unitOfMeasurement = NULL);
void createDeviceInfo(JsonObject& object);

bool _wasConnected = false;
Expand Down
46 changes: 27 additions & 19 deletions src/MqttHandlVedirectHass.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -55,32 +55,32 @@ void MqttHandleVedirectHassClass::publishConfig()
}

// device info
publishBinarySensor("MPPT load output state", "LOAD", "ON", "OFF");
publishSensor("MPPT serial number", "SER");
publishSensor("MPPT firmware number", "FW");
publishSensor("MPPT state of operation", "CS");
publishSensor("MPPT error code", "ERR");
publishSensor("MPPT off reason", "OR");
publishSensor("MPPT tracker operation mode", "MPPT");
publishSensor("MPPT Day sequence number (0...364)", "HSDS", NULL, "total", "d");
publishBinarySensor("MPPT load output state", "mdi:export", "LOAD", "ON", "OFF");
publishSensor("MPPT serial number", "mdi:counter", "SER");
publishSensor("MPPT firmware number", "mdi:counter", "FW");
publishSensor("MPPT state of operation", "mdi:wrench", "CS");
publishSensor("MPPT error code", "mdi:bell", "ERR");
publishSensor("MPPT off reason", "mdi:wrench", "OR");
publishSensor("MPPT tracker operation mode", "mdi:wrench", "MPPT");
publishSensor("MPPT Day sequence number (0...364)", "mdi:calendar-month-outline", "HSDS", NULL, "total", "d");

// battery info
publishSensor("Battery voltage", "V", "voltage", "measurement", "V");
publishSensor("Battery current", "I", "current", "measurement", "A");
publishSensor("Battery voltage", NULL, "V", "voltage", "measurement", "V");
publishSensor("Battery current", NULL, "I", "current", "measurement", "A");

// panel info
publishSensor("Panel voltage", "VPV", "voltage", "measurement", "V");
publishSensor("Panel power", "PPV", "power", "measurement", "W");
publishSensor("Panel yield total", "H19", "energy", "total_increasing", "kWh");
publishSensor("Panel yield today", "H20", "energy", "total", "kWh");
publishSensor("Panel maximum power today", "H21", "power", "measurement", "W");
publishSensor("Panel yield yesterday", "H22", "energy", "total", "kWh");
publishSensor("Panel maximum power yesterday", "H23", "power", "measurement", "W");
publishSensor("Panel voltage", NULL, "VPV", "voltage", "measurement", "V");
publishSensor("Panel power", NULL, "PPV", "power", "measurement", "W");
publishSensor("Panel yield total", NULL, "H19", "energy", "total_increasing", "kWh");
publishSensor("Panel yield today", NULL, "H20", "energy", "total", "kWh");
publishSensor("Panel maximum power today", NULL, "H21", "power", "measurement", "W");
publishSensor("Panel yield yesterday", NULL, "H22", "energy", "total", "kWh");
publishSensor("Panel maximum power yesterday", NULL, "H23", "power", "measurement", "W");

yield();
}

void MqttHandleVedirectHassClass::publishSensor(const char* caption, const char* subTopic, const char* deviceClass, const char* stateClass, const char* unitOfMeasurement )
void MqttHandleVedirectHassClass::publishSensor(const char* caption, const char* icon, const char* subTopic, const char* deviceClass, const char* stateClass, const char* unitOfMeasurement )
{
String serial = VeDirect.veFrame.SER;

Expand All @@ -105,6 +105,10 @@ void MqttHandleVedirectHassClass::publishSensor(const char* caption, const char*
root[F("stat_t")] = statTopic;
root[F("uniq_id")] = serial + "_" + sensorId;

if (icon != NULL) {
root[F("icon")] = icon;
}

if (unitOfMeasurement != NULL) {
root[F("unit_of_meas")] = unitOfMeasurement;
}
Expand All @@ -127,7 +131,7 @@ void MqttHandleVedirectHassClass::publishSensor(const char* caption, const char*
publish(configTopic, buffer);

}
void MqttHandleVedirectHassClass::publishBinarySensor(const char* caption, const char* subTopic, const char* payload_on, const char* payload_off)
void MqttHandleVedirectHassClass::publishBinarySensor(const char* caption, const char* icon, const char* subTopic, const char* payload_on, const char* payload_off)
{
String serial = VeDirect.veFrame.SER;

Expand All @@ -154,6 +158,10 @@ void MqttHandleVedirectHassClass::publishBinarySensor(const char* caption, const
root[F("pl_on")] = payload_on;
root[F("pl_off")] = payload_off;

if (icon != NULL) {
root[F("icon")] = icon;
}

JsonObject deviceObj = root.createNestedObject("dev");
createDeviceInfo(deviceObj);

Expand Down
65 changes: 37 additions & 28 deletions src/MqttHandlePylontechHass.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -51,47 +51,47 @@ void MqttHandlePylontechHassClass::publishConfig()
}

// device info
publishSensor("Manufacturer", "manufacturer");
publishSensor("Manufacturer", "mdi:factory", "manufacturer");

// battery info
publishSensor("Battery voltage", "voltage", "voltage", "measurement", "V");
publishSensor("Battery current", "current", "current", "measurement", "A");
publishSensor("Temperature", "temperature", "temperature", "measurement", "°C");
publishSensor("State of Charge (SOC)", "stateOfCharge", "battery", "measurement", "%");
publishSensor("State of Health (SOH)", "stateOfHealth", NULL, "measurement", "%");
publishSensor("Charge voltage (BMS)", "settings/chargeVoltage", "voltage", "measurement", "V");
publishSensor("Charge current limit", "settings/chargeCurrentLimitation", "current", "measurement", "A");
publishSensor("Discharge current limit", "settings/dischargeCurrentLimitation", "current", "measurement", "A");
publishSensor("Battery voltage", NULL, "voltage", "voltage", "measurement", "V");
publishSensor("Battery current", NULL, "current", "current", "measurement", "A");
publishSensor("Temperature", NULL, "temperature", "temperature", "measurement", "°C");
publishSensor("State of Charge (SOC)", NULL, "stateOfCharge", "battery", "measurement", "%");
publishSensor("State of Health (SOH)", "mdi:heart-plus", "stateOfHealth", NULL, "measurement", "%");
publishSensor("Charge voltage (BMS)", NULL, "settings/chargeVoltage", "voltage", "measurement", "V");
publishSensor("Charge current limit", NULL, "settings/chargeCurrentLimitation", "current", "measurement", "A");
publishSensor("Discharge current limit", NULL, "settings/dischargeCurrentLimitation", "current", "measurement", "A");

publishBinarySensor("Alarm Discharge current", "alarm/overCurrentDischarge", "1", "0");
publishBinarySensor("Warning Discharge current", "warning/highCurrentDischarge", "1", "0");
publishBinarySensor("Alarm Discharge current", "mdi:alert", "alarm/overCurrentDischarge", "1", "0");
publishBinarySensor("Warning Discharge current", "mdi:alert-outline", "warning/highCurrentDischarge", "1", "0");

publishBinarySensor("Alarm Temperature low", "alarm/underTemperature", "1", "0");
publishBinarySensor("Warning Temperature low", "warning/lowTemperature", "1", "0");
publishBinarySensor("Alarm Temperature low", "mdi:thermometer-low", "alarm/underTemperature", "1", "0");
publishBinarySensor("Warning Temperature low", "mdi:thermometer-low", "warning/lowTemperature", "1", "0");

publishBinarySensor("Alarm Temperature high", "alarm/overTemperature", "1", "0");
publishBinarySensor("Warning Temperature high", "warning/highTemperature", "1", "0");
publishBinarySensor("Alarm Temperature high", "mdi:thermometer-high", "alarm/overTemperature", "1", "0");
publishBinarySensor("Warning Temperature high", "mdi:thermometer-high", "warning/highTemperature", "1", "0");

publishBinarySensor("Alarm Voltage low", "alarm/underVoltage", "1", "0");
publishBinarySensor("Warning Voltage low", "warning/lowVoltage", "1", "0");
publishBinarySensor("Alarm Voltage low", "mdi:alert", "alarm/underVoltage", "1", "0");
publishBinarySensor("Warning Voltage low", "mdi:alert-outline", "warning/lowVoltage", "1", "0");

publishBinarySensor("Alarm Voltage high", "alarm/overVoltage", "1", "0");
publishBinarySensor("Warning Voltage high", "warning/highVoltage", "1", "0");
publishBinarySensor("Alarm Voltage high", "mdi:alert", "alarm/overVoltage", "1", "0");
publishBinarySensor("Warning Voltage high", "mdi:alert-outline", "warning/highVoltage", "1", "0");

publishBinarySensor("Alarm BMS internal", "alarm/bmsInternal", "1", "0");
publishBinarySensor("Warning BMS internal", "warning/bmsInternal", "1", "0");
publishBinarySensor("Alarm BMS internal", "mdi:alert", "alarm/bmsInternal", "1", "0");
publishBinarySensor("Warning BMS internal", "mdi:alert-outline", "warning/bmsInternal", "1", "0");

publishBinarySensor("Alarm High charge current", "alarm/overCurrentCharge", "1", "0");
publishBinarySensor("Warning High charge current", "warning/highCurrentCharge", "1", "0");
publishBinarySensor("Alarm High charge current", "mdi:alert", "alarm/overCurrentCharge", "1", "0");
publishBinarySensor("Warning High charge current", "mdi:alert-outline", "warning/highCurrentCharge", "1", "0");

publishBinarySensor("Charge enabled", "charging/chargeEnabled", "1", "0");
publishBinarySensor("Discharge enabled", "charging/dischargeEnabled", "1", "0");
publishBinarySensor("Charge immediately", "charging/chargeImmediately", "1", "0");
publishBinarySensor("Charge enabled", "mdi:battery-arrow-up", "charging/chargeEnabled", "1", "0");
publishBinarySensor("Discharge enabled", "mdi:battery-arrow-down", "charging/dischargeEnabled", "1", "0");
publishBinarySensor("Charge immediately", "mdi:alert", "charging/chargeImmediately", "1", "0");

yield();
}

void MqttHandlePylontechHassClass::publishSensor(const char* caption, const char* subTopic, const char* deviceClass, const char* stateClass, const char* unitOfMeasurement )
void MqttHandlePylontechHassClass::publishSensor(const char* caption, const char* icon, const char* subTopic, const char* deviceClass, const char* stateClass, const char* unitOfMeasurement )
{
String sensorId = caption;
sensorId.replace(" ", "_");
Expand All @@ -115,6 +115,10 @@ void MqttHandlePylontechHassClass::publishSensor(const char* caption, const char
root[F("stat_t")] = statTopic;
root[F("uniq_id")] = serial + "_" + sensorId;

if (icon != NULL) {
root[F("icon")] = icon;
}

if (unitOfMeasurement != NULL) {
root[F("unit_of_meas")] = unitOfMeasurement;
}
Expand All @@ -137,7 +141,8 @@ void MqttHandlePylontechHassClass::publishSensor(const char* caption, const char
publish(configTopic, buffer);

}
void MqttHandlePylontechHassClass::publishBinarySensor(const char* caption, const char* subTopic, const char* payload_on, const char* payload_off)

void MqttHandlePylontechHassClass::publishBinarySensor(const char* caption, const char* icon, const char* subTopic, const char* payload_on, const char* payload_off)
{
String sensorId = caption;
sensorId.replace(" ", "_");
Expand All @@ -163,6 +168,10 @@ void MqttHandlePylontechHassClass::publishBinarySensor(const char* caption, cons
root[F("pl_on")] = payload_on;
root[F("pl_off")] = payload_off;

if (icon != NULL) {
root[F("icon")] = icon;
}

JsonObject deviceObj = root.createNestedObject("dev");
createDeviceInfo(deviceObj);

Expand Down

0 comments on commit a7a38e7

Please sign in to comment.