@@ -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-
735693void 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
865823void mqttPublishData () {
0 commit comments