Skip to content

Commit 44fc1ba

Browse files
author
dingo35
committed
MQTT put announce, jsn and jsna into MQTTclient class
1 parent 95fa193 commit 44fc1ba

File tree

4 files changed

+129
-141
lines changed

4 files changed

+129
-141
lines changed

SmartEVSE-3/src/esp32.cpp

Lines changed: 90 additions & 132 deletions
Original file line numberDiff line numberDiff line change
@@ -690,176 +690,134 @@ void printRFID(char *buf) {
690690
}
691691

692692

693-
//jsn(device_class, current) expands to:
694-
// "device_class" : "current"
695-
String jsn(const String& key, const String& value) {
696-
return "\"" + key + "\" : \"" + value + "\"";
697-
}
698-
template<typename T>
699-
String jsn(const String& key, T value) {
700-
return "\"" + key + "\" : \"" + String(value) + "\"";
701-
}
702-
703-
704-
//jsna(device_class, current) expands to:
705-
// , "device_class" : "current"
706-
String jsna(const String& key, const String& value) {
707-
return ", " + jsn(key, value);
708-
}
709-
template<typename T>
710-
String jsna(const String& key, T value) {
711-
return ", " + jsn(key, value);
712-
}
713-
714-
715-
void announce(const String& entity_name, const String& domain, const String& optional_payload) {
716-
String entity_suffix = entity_name;
717-
entity_suffix.replace(" ", "");
718-
String topic = "homeassistant/" + domain + "/" + MQTTprefix + "-" + entity_suffix + "/config";
719-
720-
const String config_url = "http://" + WiFi.localIP().toString();
721-
const String device_payload = String(R"("device": {)") + jsn("model","SmartEVSE v3") + jsna("identifiers", MQTTprefix) + jsna("name", MQTTprefix) + jsna("manufacturer","Stegen") + jsna("configuration_url", config_url) + jsna("sw_version", String(VERSION)) + "}";
722-
723-
String payload = "{"
724-
+ jsn("name", entity_name)
725-
+ jsna("object_id", String(MQTTprefix + "-" + entity_suffix))
726-
+ jsna("unique_id", String(MQTTprefix + "-" + entity_suffix))
727-
+ jsna("state_topic", String(MQTTprefix + "/" + entity_suffix))
728-
+ jsna("availability_topic", String(MQTTprefix + "/connected"))
729-
+ ", " + device_payload + optional_payload
730-
+ "}";
731-
732-
MQTTclient.publish(topic.c_str(), payload.c_str(), true, 0); // Retain + QoS 0
733-
}
734-
735693
void SetupMQTTClient() {
736694
// Set up subscriptions
737695
MQTTclient.subscribe(MQTTprefix + "/Set/#",1);
738696
MQTTclient.publish(MQTTprefix+"/connected", "online", true, 0);
739697

740698
//set the parameters for and announce sensors with device class 'current':
741-
String optional_payload = jsna("device_class","current") + jsna("unit_of_measurement","A") + jsna("value_template", R"({{ value | int / 10 }})");
742-
announce("Charge Current", "sensor", optional_payload);
743-
announce("Max Current", "sensor", optional_payload);
699+
String optional_payload = MQTTclient.jsna("device_class","current") + MQTTclient.jsna("unit_of_measurement","A") + MQTTclient.jsna("value_template", R"({{ value | int / 10 }})");
700+
MQTTclient.announce("Charge Current", "sensor", optional_payload);
701+
MQTTclient.announce("Max Current", "sensor", optional_payload);
744702
if (MainsMeter.Type) {
745-
announce("Mains Current L1", "sensor", optional_payload);
746-
announce("Mains Current L2", "sensor", optional_payload);
747-
announce("Mains Current L3", "sensor", optional_payload);
703+
MQTTclient.announce("Mains Current L1", "sensor", optional_payload);
704+
MQTTclient.announce("Mains Current L2", "sensor", optional_payload);
705+
MQTTclient.announce("Mains Current L3", "sensor", optional_payload);
748706
}
749707
if (EVMeter.Type) {
750-
announce("EV Current L1", "sensor", optional_payload);
751-
announce("EV Current L2", "sensor", optional_payload);
752-
announce("EV Current L3", "sensor", optional_payload);
708+
MQTTclient.announce("EV Current L1", "sensor", optional_payload);
709+
MQTTclient.announce("EV Current L2", "sensor", optional_payload);
710+
MQTTclient.announce("EV Current L3", "sensor", optional_payload);
753711
}
754712
if (homeBatteryLastUpdate) {
755-
announce("Home Battery Current", "sensor", optional_payload);
713+
MQTTclient.announce("Home Battery Current", "sensor", optional_payload);
756714
}
757715

758716
#if MODEM
759717
//set the parameters for modem/SoC sensor entities:
760-
optional_payload = jsna("unit_of_measurement","%") + jsna("value_template", R"({{ none if (value | int == -1) else (value | int) }})");
761-
announce("EV Initial SoC", "sensor", optional_payload);
762-
announce("EV Full SoC", "sensor", optional_payload);
763-
announce("EV Computed SoC", "sensor", optional_payload);
764-
announce("EV Remaining SoC", "sensor", optional_payload);
765-
766-
optional_payload = jsna("device_class","duration") + jsna("unit_of_measurement","m") + jsna("value_template", R"({{ none if (value | int == -1) else (value | int / 60) | round }})");
767-
announce("EV Time Until Full", "sensor", optional_payload);
768-
769-
optional_payload = jsna("device_class","energy") + jsna("unit_of_measurement","Wh") + jsna("value_template", R"({{ none if (value | int == -1) else (value | int) }})");
770-
announce("EV Energy Capacity", "sensor", optional_payload);
771-
announce("EV Energy Request", "sensor", optional_payload);
772-
773-
optional_payload = jsna("value_template", R"({{ none if (value == '') else value }})");
774-
announce("EVCCID", "sensor", optional_payload);
775-
optional_payload = jsna("state_topic", String(MQTTprefix + "/RequiredEVCCID")) + jsna("command_topic", String(MQTTprefix + "/Set/RequiredEVCCID"));
776-
announce("Required EVCCID", "text", optional_payload);
718+
optional_payload = MQTTclient.jsna("unit_of_measurement","%") + MQTTclient.jsna("value_template", R"({{ none if (value | int == -1) else (value | int) }})");
719+
MQTTclient.announce("EV Initial SoC", "sensor", optional_payload);
720+
MQTTclient.announce("EV Full SoC", "sensor", optional_payload);
721+
MQTTclient.announce("EV Computed SoC", "sensor", optional_payload);
722+
MQTTclient.announce("EV Remaining SoC", "sensor", optional_payload);
723+
724+
optional_payload = MQTTclient.jsna("device_class","duration") + MQTTclient.jsna("unit_of_measurement","m") + MQTTclient.jsna("value_template", R"({{ none if (value | int == -1) else (value | int / 60) | round }})");
725+
MQTTclient.announce("EV Time Until Full", "sensor", optional_payload);
726+
727+
optional_payload = MQTTclient.jsna("device_class","energy") + MQTTclient.jsna("unit_of_measurement","Wh") + MQTTclient.jsna("value_template", R"({{ none if (value | int == -1) else (value | int) }})");
728+
MQTTclient.announce("EV Energy Capacity", "sensor", optional_payload);
729+
MQTTclient.announce("EV Energy Request", "sensor", optional_payload);
730+
731+
optional_payload = MQTTclient.jsna("value_template", R"({{ none if (value == '') else value }})");
732+
MQTTclient.announce("EVCCID", "sensor", optional_payload);
733+
optional_payload = MQTTclient.jsna("state_topic", String(MQTTprefix + "/RequiredEVCCID")) + MQTTclient.jsna("command_topic", String(MQTTprefix + "/Set/RequiredEVCCID"));
734+
MQTTclient.announce("Required EVCCID", "text", optional_payload);
777735
#endif
778736

779-
optional_payload = jsna("device_class","energy") + jsna("unit_of_measurement","Wh") + jsna("state_class","total_increasing");
737+
optional_payload = MQTTclient.jsna("device_class","energy") + MQTTclient.jsna("unit_of_measurement","Wh") + MQTTclient.jsna("state_class","total_increasing");
780738
if (MainsMeter.Type) {
781-
announce("Mains Import Active Energy", "sensor", optional_payload);
782-
announce("Mains Export Active Energy", "sensor", optional_payload);
739+
MQTTclient.announce("Mains Import Active Energy", "sensor", optional_payload);
740+
MQTTclient.announce("Mains Export Active Energy", "sensor", optional_payload);
783741
}
784742

785743
if (EVMeter.Type) {
786-
announce("EV Import Active Energy", "sensor", optional_payload);
787-
announce("EV Export Active Energy", "sensor", optional_payload);
788-
//set the parameters for and announce other sensor entities:
789-
optional_payload = jsna("device_class","power") + jsna("unit_of_measurement","W");
790-
announce("EV Charge Power", "sensor", optional_payload);
791-
optional_payload = jsna("device_class","energy") + jsna("unit_of_measurement","Wh");
792-
announce("EV Energy Charged", "sensor", optional_payload);
793-
optional_payload = jsna("device_class","energy") + jsna("unit_of_measurement","Wh") + jsna("state_class","total_increasing");
794-
announce("EV Total Energy Charged", "sensor", optional_payload);
744+
MQTTclient.announce("EV Import Active Energy", "sensor", optional_payload);
745+
MQTTclient.announce("EV Export Active Energy", "sensor", optional_payload);
746+
//set the parameters for and MQTTclient.announce other sensor entities:
747+
optional_payload = MQTTclient.jsna("device_class","power") + MQTTclient.jsna("unit_of_measurement","W");
748+
MQTTclient.announce("EV Charge Power", "sensor", optional_payload);
749+
optional_payload = MQTTclient.jsna("device_class","energy") + MQTTclient.jsna("unit_of_measurement","Wh");
750+
MQTTclient.announce("EV Energy Charged", "sensor", optional_payload);
751+
optional_payload = MQTTclient.jsna("device_class","energy") + MQTTclient.jsna("unit_of_measurement","Wh") + MQTTclient.jsna("state_class","total_increasing");
752+
MQTTclient.announce("EV Total Energy Charged", "sensor", optional_payload);
795753
}
796754

797-
//set the parameters for and announce sensor entities without device_class or unit_of_measurement:
755+
//set the parameters for and MQTTclient.announce sensor entities without device_class or unit_of_measurement:
798756
optional_payload = "";
799-
announce("EV Plug State", "sensor", optional_payload);
800-
announce("Access", "sensor", optional_payload);
801-
announce("State", "sensor", optional_payload);
802-
announce("RFID", "sensor", optional_payload);
803-
announce("RFIDLastRead", "sensor", optional_payload);
804-
announce("NrOfPhases", "sensor", optional_payload);
757+
MQTTclient.announce("EV Plug State", "sensor", optional_payload);
758+
MQTTclient.announce("Access", "sensor", optional_payload);
759+
MQTTclient.announce("State", "sensor", optional_payload);
760+
MQTTclient.announce("RFID", "sensor", optional_payload);
761+
MQTTclient.announce("RFIDLastRead", "sensor", optional_payload);
762+
MQTTclient.announce("NrOfPhases", "sensor", optional_payload);
805763

806764
#if ENABLE_OCPP && defined(SMARTEVSE_VERSION) //run OCPP only on ESP32
807-
announce("OCPP", "sensor", optional_payload);
808-
announce("OCPPConnection", "sensor", optional_payload);
765+
MQTTclient.announce("OCPP", "sensor", optional_payload);
766+
MQTTclient.announce("OCPPConnection", "sensor", optional_payload);
809767
#endif //ENABLE_OCPP
810768

811-
optional_payload = jsna("state_topic", String(MQTTprefix + "/LEDColorOff")) + jsna("command_topic", String(MQTTprefix + "/Set/ColorOff"));
812-
announce("LED Color Off", "text", optional_payload);
813-
optional_payload = jsna("state_topic", String(MQTTprefix + "/LEDColorNormal")) + jsna("command_topic", String(MQTTprefix + "/Set/ColorNormal"));
814-
announce("LED Color Normal", "text", optional_payload);
815-
optional_payload = jsna("state_topic", String(MQTTprefix + "/LEDColorSmart")) + jsna("command_topic", String(MQTTprefix + "/Set/ColorSmart"));
816-
announce("LED Color Smart", "text", optional_payload);
817-
optional_payload = jsna("state_topic", String(MQTTprefix + "/LEDColorSolar")) + jsna("command_topic", String(MQTTprefix + "/Set/ColorSolar"));
818-
announce("LED Color Solar", "text", optional_payload);
819-
optional_payload = jsna("state_topic", String(MQTTprefix + "/LEDColorCustom")) + jsna("command_topic", String(MQTTprefix + "/Set/ColorCustom"));
820-
announce("LED Color Custom", "text", optional_payload);
769+
optional_payload = MQTTclient.jsna("state_topic", String(MQTTprefix + "/LEDColorOff")) + MQTTclient.jsna("command_topic", String(MQTTprefix + "/Set/ColorOff"));
770+
MQTTclient.announce("LED Color Off", "text", optional_payload);
771+
optional_payload = MQTTclient.jsna("state_topic", String(MQTTprefix + "/LEDColorNormal")) + MQTTclient.jsna("command_topic", String(MQTTprefix + "/Set/ColorNormal"));
772+
MQTTclient.announce("LED Color Normal", "text", optional_payload);
773+
optional_payload = MQTTclient.jsna("state_topic", String(MQTTprefix + "/LEDColorSmart")) + MQTTclient.jsna("command_topic", String(MQTTprefix + "/Set/ColorSmart"));
774+
MQTTclient.announce("LED Color Smart", "text", optional_payload);
775+
optional_payload = MQTTclient.jsna("state_topic", String(MQTTprefix + "/LEDColorSolar")) + MQTTclient.jsna("command_topic", String(MQTTprefix + "/Set/ColorSolar"));
776+
MQTTclient.announce("LED Color Solar", "text", optional_payload);
777+
optional_payload = MQTTclient.jsna("state_topic", String(MQTTprefix + "/LEDColorCustom")) + MQTTclient.jsna("command_topic", String(MQTTprefix + "/Set/ColorCustom"));
778+
MQTTclient.announce("LED Color Custom", "text", optional_payload);
821779

822-
optional_payload = jsna("state_topic", String(MQTTprefix + "/CustomButton")) + jsna("command_topic", String(MQTTprefix + "/Set/CustomButton"));
780+
optional_payload = MQTTclient.jsna("state_topic", String(MQTTprefix + "/CustomButton")) + MQTTclient.jsna("command_topic", String(MQTTprefix + "/Set/CustomButton"));
823781
optional_payload += String(R"(, "options" : ["On", "Off"])");
824-
announce("Custom Button", "select", optional_payload);
825-
826-
optional_payload = jsna("device_class","duration") + jsna("unit_of_measurement","s");
827-
announce("SolarStopTimer", "sensor", optional_payload);
828-
//set the parameters for and announce diagnostic sensor entities:
829-
optional_payload = jsna("entity_category","diagnostic");
830-
announce("Error", "sensor", optional_payload);
831-
announce("WiFi SSID", "sensor", optional_payload);
832-
announce("WiFi BSSID", "sensor", optional_payload);
833-
optional_payload = jsna("entity_category","diagnostic") + jsna("device_class","signal_strength") + jsna("unit_of_measurement","dBm");
834-
announce("WiFi RSSI", "sensor", optional_payload);
835-
optional_payload = jsna("entity_category","diagnostic") + jsna("device_class","temperature") + jsna("unit_of_measurement","°C");
836-
announce("ESP Temp", "sensor", optional_payload);
837-
optional_payload = jsna("entity_category","diagnostic") + jsna("device_class","duration") + jsna("unit_of_measurement","s") + jsna("entity_registry_enabled_default","False");
838-
announce("ESP Uptime", "sensor", optional_payload);
782+
MQTTclient.announce("Custom Button", "select", optional_payload);
783+
784+
optional_payload = MQTTclient.jsna("device_class","duration") + MQTTclient.jsna("unit_of_measurement","s");
785+
MQTTclient.announce("SolarStopTimer", "sensor", optional_payload);
786+
//set the parameters for and MQTTclient.announce diagnostic sensor entities:
787+
optional_payload = MQTTclient.jsna("entity_category","diagnostic");
788+
MQTTclient.announce("Error", "sensor", optional_payload);
789+
MQTTclient.announce("WiFi SSID", "sensor", optional_payload);
790+
MQTTclient.announce("WiFi BSSID", "sensor", optional_payload);
791+
optional_payload = MQTTclient.jsna("entity_category","diagnostic") + MQTTclient.jsna("device_class","signal_strength") + MQTTclient.jsna("unit_of_measurement","dBm");
792+
MQTTclient.announce("WiFi RSSI", "sensor", optional_payload);
793+
optional_payload = MQTTclient.jsna("entity_category","diagnostic") + MQTTclient.jsna("device_class","temperature") + MQTTclient.jsna("unit_of_measurement","°C");
794+
MQTTclient.announce("ESP Temp", "sensor", optional_payload);
795+
optional_payload = MQTTclient.jsna("entity_category","diagnostic") + MQTTclient.jsna("device_class","duration") + MQTTclient.jsna("unit_of_measurement","s") + MQTTclient.jsna("entity_registry_enabled_default","False");
796+
MQTTclient.announce("ESP Uptime", "sensor", optional_payload);
839797

840798
#if MODEM
841-
optional_payload = jsna("unit_of_measurement","%") + jsna("value_template", R"({{ (value | int / 1024 * 100) | round(0) }})");
842-
announce("CP PWM", "sensor", optional_payload);
799+
optional_payload = MQTTclient.jsna("unit_of_measurement","%") + MQTTclient.jsna("value_template", R"({{ (value | int / 1024 * 100) | round(0) }})");
800+
MQTTclient.announce("CP PWM", "sensor", optional_payload);
843801

844-
optional_payload = jsna("value_template", R"({{ none if (value | int == -1) else (value | int / 1024 * 100) | round }})");
845-
optional_payload += jsna("command_topic", String(MQTTprefix + "/Set/CPPWMOverride")) + jsna("min", "-1") + jsna("max", "100") + jsna("mode","slider");
846-
optional_payload += jsna("command_template", R"({{ (value | int * 1024 / 100) | round }})");
847-
announce("CP PWM Override", "number", optional_payload);
802+
optional_payload = MQTTclient.jsna("value_template", R"({{ none if (value | int == -1) else (value | int / 1024 * 100) | round }})");
803+
optional_payload += MQTTclient.jsna("command_topic", String(MQTTprefix + "/Set/CPPWMOverride")) + MQTTclient.jsna("min", "-1") + MQTTclient.jsna("max", "100") + MQTTclient.jsna("mode","slider");
804+
optional_payload += MQTTclient.jsna("command_template", R"({{ (value | int * 1024 / 100) | round }})");
805+
MQTTclient.announce("CP PWM Override", "number", optional_payload);
848806
#endif
849-
//set the parameters for and announce select entities, overriding automatic state_topic:
850-
optional_payload = jsna("state_topic", String(MQTTprefix + "/Mode")) + jsna("command_topic", String(MQTTprefix + "/Set/Mode"));
807+
//set the parameters for and MQTTclient.announce select entities, overriding automatic state_topic:
808+
optional_payload = MQTTclient.jsna("state_topic", String(MQTTprefix + "/Mode")) + MQTTclient.jsna("command_topic", String(MQTTprefix + "/Set/Mode"));
851809
optional_payload += String(R"(, "options" : ["Off", "Normal", "Smart", "Solar", "Pause"])");
852-
announce("Mode", "select", optional_payload);
810+
MQTTclient.announce("Mode", "select", optional_payload);
853811

854-
//set the parameters for and announce number entities:
855-
optional_payload = jsna("command_topic", String(MQTTprefix + "/Set/CurrentOverride")) + jsna("min", "0") + jsna("max", MaxCurrent ) + jsna("mode","slider");
856-
optional_payload += jsna("value_template", R"({{ value | int / 10 if value | is_number else none }})") + jsna("command_template", R"({{ value | int * 10 }})");
857-
announce("Charge Current Override", "number", optional_payload);
812+
//set the parameters for and MQTTclient.announce number entities:
813+
optional_payload = MQTTclient.jsna("command_topic", String(MQTTprefix + "/Set/CurrentOverride")) + MQTTclient.jsna("min", "0") + MQTTclient.jsna("max", MaxCurrent ) + MQTTclient.jsna("mode","slider");
814+
optional_payload += MQTTclient.jsna("value_template", R"({{ value | int / 10 if value | is_number else none }})") + MQTTclient.jsna("command_template", R"({{ value | int * 10 }})");
815+
MQTTclient.announce("Charge Current Override", "number", optional_payload);
858816

859-
//set the parameters for and announce Cable Lock:
860-
optional_payload = jsna("cablelock_topic", String(MQTTprefix + "/CableLock")) + jsna("command_topic", String(MQTTprefix + "/Set/CableLock"));
817+
//set the parameters for and MQTTclient.announce Cable Lock:
818+
optional_payload = MQTTclient.jsna("cablelock_topic", String(MQTTprefix + "/CableLock")) + MQTTclient.jsna("command_topic", String(MQTTprefix + "/Set/CableLock"));
861819
optional_payload += String(R"(, "options" : ["0", "1"])");
862-
announce("Cable Lock", "select", optional_payload);
820+
MQTTclient.announce("Cable Lock", "select", optional_payload);
863821
}
864822

865823
void mqttPublishData() {

SmartEVSE-3/src/main.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -418,7 +418,7 @@ void Button::HandleSwitch(void)
418418

419419
// Reset RCM error when switch is pressed/toggled
420420
// RCM was tripped, but RCM level is back to normal
421-
if (RCmon == 1 && (ErrorFlags & RCM_TRIPPED) && digitalRead(PIN_RCM_FAULT) == LOW) {
421+
if ((ErrorFlags & RCM_TRIPPED) && (digitalRead(PIN_RCM_FAULT) == LOW || RCmon == 0)) {
422422
clearErrorFlags(RCM_TRIPPED);
423423
}
424424
// Also light up the LCD backlight
@@ -2977,7 +2977,7 @@ void Timer10ms_singlerun(void) {
29772977
// When one or more button(s) are pressed, we call GLCDMenu
29782978
if (((ButtonState != 0x07) || (ButtonState != OldButtonState)) ) {
29792979
// RCM was tripped, but RCM level is back to normal
2980-
if (getItemValue(MENU_RCMON) == 1 && (ErrorFlags & RCM_TRIPPED) && RCMFAULT == LOW) {
2980+
if ((ErrorFlags & RCM_TRIPPED) && (RCMFAULT == LOW || RCmon == 0)) {
29812981
clearErrorFlags(RCM_TRIPPED); // Clear RCM error bit
29822982
}
29832983
if (!LCDlock) GLCDMenu(ButtonState); // LCD is unlocked, enter menu

0 commit comments

Comments
 (0)