diff --git a/include/BatteryStats.h b/include/BatteryStats.h index 0c50eecdb..a7eea2f97 100644 --- a/include/BatteryStats.h +++ b/include/BatteryStats.h @@ -118,6 +118,7 @@ class PylontechBatteryStats : public BatteryStats { float _chargeVoltage; float _chargeCurrentLimitation; + float _dischargeVoltageLimitation; uint16_t _stateOfHealth; float _temperature; @@ -140,6 +141,8 @@ class PylontechBatteryStats : public BatteryStats { bool _chargeEnabled; bool _dischargeEnabled; bool _chargeImmediately; + + uint8_t _moduleCount; }; class SBSBatteryStats : public BatteryStats { diff --git a/src/BatteryStats.cpp b/src/BatteryStats.cpp index 2c0366a9f..500fb497f 100644 --- a/src/BatteryStats.cpp +++ b/src/BatteryStats.cpp @@ -124,8 +124,10 @@ void PylontechBatteryStats::getLiveViewData(JsonVariant& root) const // values go into the "Status" card of the web application addLiveViewValue(root, "chargeVoltage", _chargeVoltage, "V", 1); addLiveViewValue(root, "chargeCurrentLimitation", _chargeCurrentLimitation, "A", 1); + addLiveViewValue(root, "dischargeVoltageLimitation", _dischargeVoltageLimitation, "V", 1); addLiveViewValue(root, "stateOfHealth", _stateOfHealth, "%", 0); addLiveViewValue(root, "temperature", _temperature, "°C", 1); + addLiveViewValue(root, "modules", _moduleCount, "", 0); addLiveViewTextValue(root, "chargeEnabled", (_chargeEnabled?"yes":"no")); addLiveViewTextValue(root, "dischargeEnabled", (_dischargeEnabled?"yes":"no")); @@ -380,6 +382,7 @@ void PylontechBatteryStats::mqttPublish() const MqttSettings.publish("battery/settings/chargeVoltage", String(_chargeVoltage)); MqttSettings.publish("battery/settings/chargeCurrentLimitation", String(_chargeCurrentLimitation)); + MqttSettings.publish("battery/settings/dischargeVoltageLimitation", String(_dischargeVoltageLimitation)); MqttSettings.publish("battery/stateOfHealth", String(_stateOfHealth)); MqttSettings.publish("battery/temperature", String(_temperature)); MqttSettings.publish("battery/alarm/overCurrentDischarge", String(_alarmOverCurrentDischarge)); @@ -399,6 +402,7 @@ void PylontechBatteryStats::mqttPublish() const MqttSettings.publish("battery/charging/chargeEnabled", String(_chargeEnabled)); MqttSettings.publish("battery/charging/dischargeEnabled", String(_dischargeEnabled)); MqttSettings.publish("battery/charging/chargeImmediately", String(_chargeImmediately)); + MqttSettings.publish("battery/modulesTotal", String(_moduleCount)); } void SBSBatteryStats::mqttPublish() const diff --git a/src/MqttHandleBatteryHass.cpp b/src/MqttHandleBatteryHass.cpp index a17a10b14..89327b110 100644 --- a/src/MqttHandleBatteryHass.cpp +++ b/src/MqttHandleBatteryHass.cpp @@ -55,7 +55,9 @@ void MqttHandleBatteryHassClass::loop() 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 voltage limit", NULL, "settings/dischargeVoltageLimitation", "voltage", "measurement", "V"); publishSensor("Discharge current limit", NULL, "settings/dischargeCurrentLimitation", "current", "measurement", "A"); + publishSensor("Module Count", "mdi:counter", "modulesTotal"); publishBinarySensor("Alarm Discharge current", "mdi:alert", "alarm/overCurrentDischarge", "1", "0"); publishBinarySensor("Warning Discharge current", "mdi:alert-outline", "warning/highCurrentDischarge", "1", "0"); diff --git a/src/PylontechCanReceiver.cpp b/src/PylontechCanReceiver.cpp index f75326895..4be3d44ac 100644 --- a/src/PylontechCanReceiver.cpp +++ b/src/PylontechCanReceiver.cpp @@ -18,10 +18,12 @@ void PylontechCanReceiver::onMessage(twai_message_t rx_message) _stats->_chargeVoltage = this->scaleValue(this->readUnsignedInt16(rx_message.data), 0.1); _stats->_chargeCurrentLimitation = this->scaleValue(this->readSignedInt16(rx_message.data + 2), 0.1); _stats->setDischargeCurrentLimit(this->scaleValue(this->readSignedInt16(rx_message.data + 4), 0.1), millis()); + _stats->_dischargeVoltageLimitation = this->scaleValue(this->readUnsignedInt16(rx_message.data + 6), 0.1); if (_verboseLogging) { - MessageOutput.printf("[Pylontech] chargeVoltage: %f chargeCurrentLimitation: %f dischargeCurrentLimitation: %f\r\n", - _stats->_chargeVoltage, _stats->_chargeCurrentLimitation, _stats->getDischargeCurrentLimit()); + MessageOutput.printf("[Pylontech] chargeVoltage: %f chargeCurrentLimitation: %f dischargeCurrentLimitation: %f dischargeVoltageLimitation: %f\r\n", + _stats->_chargeVoltage, _stats->_chargeCurrentLimitation, _stats->getDischargeCurrentLimit(), + _stats->_dischargeVoltageLimitation); } break; } @@ -93,6 +95,13 @@ void PylontechCanReceiver::onMessage(twai_message_t rx_message) _stats->_warningBmsInternal, _stats->_warningHighCurrentCharge); } + + _stats->_moduleCount = rx_message.data[4]; + if (_verboseLogging) { + MessageOutput.printf("[Pylontech] Modules: %d\r\n", + _stats->_moduleCount); + } + break; } @@ -155,6 +164,7 @@ void PylontechCanReceiver::dummyData() _stats->_chargeVoltage = dummyFloat(50); _stats->_chargeCurrentLimitation = dummyFloat(33); _stats->setDischargeCurrentLimit(dummyFloat(12), millis()); + _stats->_dischargeVoltageLimitation = dummyFloat(46); _stats->_stateOfHealth = 99; _stats->setVoltage(48.67, millis()); _stats->setCurrent(dummyFloat(-1), 1/*precision*/, millis()); @@ -164,6 +174,8 @@ void PylontechCanReceiver::dummyData() _stats->_dischargeEnabled = true; _stats->_chargeImmediately = false; + _stats->_moduleCount = 1; + _stats->_warningHighCurrentDischarge = false; _stats->_warningHighCurrentCharge = false; _stats->_warningLowTemperature = false;