From 32e7dbd7300d03ca7070fda4ff31b03c90585df5 Mon Sep 17 00:00:00 2001 From: Andrey Klimov Date: Mon, 14 Feb 2022 01:32:46 +0300 Subject: [PATCH] remove topics on complete, homie fixed, deflt name --- lighthub/main.cpp | 125 +++++++++++++++++++++++++++---------------- lighthub/textconst.h | 6 +-- 2 files changed, 83 insertions(+), 48 deletions(-) diff --git a/lighthub/main.cpp b/lighthub/main.cpp index fa45287..62d29ba 100644 --- a/lighthub/main.cpp +++ b/lighthub/main.cpp @@ -376,7 +376,7 @@ void mqttCallback(char *topic, byte *payload, unsigned int length) debugSerial<1)) { - // mqttClient.publish(topic, ""); + if(!strcmp_P(itemName,CMDTOPIC_P) && payload && (strlen((char*) payload)>1)) { + mqttClient.deleteTopic(topic); cmd_parse((char *)payload); return;// -4; } if (itemName[0]=='$') return;// -6; //Skipping homie stuff - //debugSerial<0) && savedTopic[0] && lanStatus != RETAINING_COLLECTING) + + //if (lanStatus != RETAINING_COLLECTING && (mqttClient.isRetained())) { - debugSerial<1) syslogPort = aJson.getArrayItem(udpSyslogArr, 1)->valueint; _inet_ntoa_r(Ethernet.localIP(),syslogDeviceHostname,sizeof(syslogDeviceHostname)); @@ -519,6 +524,7 @@ void setupSyslog() if (mqttArr) deviceName = getStringFromConfig(mqttArr, 0); if (deviceName) udpSyslog.appName(deviceName); + else udpSyslog.appName(lighthub); udpSyslog.defaultPriority(LOG_KERN); syslogInitialized=true; @@ -777,92 +783,119 @@ void onMQTTConnect(){ // High level homie topics publishing //strncpy_P(topic, outprefix, sizeof(topic)); setTopic(topic,sizeof(topic),T_DEV); - strncat_P(topic, state_P, sizeof(topic)); - strncpy_P(buf, ready_P, sizeof(buf)); + strncat_P(topic, state_P, sizeof(topic)-1); + strncpy_P(buf, ready_P, sizeof(buf)-1); mqttClient.publish(topic,buf,true); //strncpy_P(topic, outprefix, sizeof(topic)); setTopic(topic,sizeof(topic),T_DEV); - strncat_P(topic, name_P, sizeof(topic)); - strncpy_P(buf, nameval_P, sizeof(buf)); - strncat_P(buf,(verval_P),sizeof(buf)); + strncat_P(topic, name_P, sizeof(topic)-1); + strncpy_P(buf, nameval_P, sizeof(buf)-1); + strncat_P(buf,(verval_P),sizeof(buf)-1); mqttClient.publish(topic,buf,true); //strncpy_P(topic, outprefix, sizeof(topic)); setTopic(topic,sizeof(topic),T_DEV); - strncat_P(topic, stats_P, sizeof(topic)); - strncpy_P(buf, statsval_P, sizeof(buf)); + strncat_P(topic, stats_P, sizeof(topic)-1); + strncpy_P(buf, statsval_P, sizeof(buf)-1); mqttClient.publish(topic,buf,true); #ifndef NO_HOMIE // strncpy_P(topic, outprefix, sizeof(topic)); setTopic(topic,sizeof(topic),T_DEV); - strncat_P(topic, homie_P, sizeof(topic)); - strncpy_P(buf, homiever_P, sizeof(buf)); + strncat_P(topic, homie_P, sizeof(topic)-1); + strncpy_P(buf, homiever_P, sizeof(buf)-1); mqttClient.publish(topic,buf,true); configLocked++; if (items) { char datatype[32]="\0"; char format [64]="\0"; aJsonObject * item = items->child; - while (items && item) + + int nodesLen=0; + while (items && item) { if (item->type == aJson_Array && aJson.getArraySize(item)>0) { /// strncat(buf,item->name,sizeof(buf)); /// strncat(buf,",",sizeof(buf)); - + nodesLen+=strlen(item->name)+1; switch ( aJson.getArrayItem(item, I_TYPE)->valueint) { case CH_THERMO: - strncpy_P(datatype,float_P,sizeof(datatype)); + strncpy_P(datatype,float_P,sizeof(datatype)-1); format[0]=0; break; case CH_RELAY: case CH_GROUP: - strncpy_P(datatype,enum_P,sizeof(datatype)); - strncpy_P(format,enumformat_P,sizeof(format)); + strncpy_P(datatype,int_P,sizeof(datatype)-1); + strncpy_P(format,intformat_P,sizeof(format)-1); break; case CH_RGBW: + case CH_RGBWW: case CH_RGB: - strncpy_P(datatype,color_P,sizeof(datatype)); - strncpy_P(format,hsv_P,sizeof(format)); + strncpy_P(datatype,color_P,sizeof(datatype)-1); + strncpy_P(format,hsv_P,sizeof(format)-1); break; case CH_DIMMER: case CH_MODBUS: case CH_PWM: case CH_VCTEMP: case CH_VC: - strncpy_P(datatype,int_P,sizeof(datatype)); - strncpy_P(format,intformat_P,sizeof(format)); + strncpy_P(datatype,int_P,sizeof(datatype)-1); + strncpy_P(format,intformat_P,sizeof(format)-1); break; } //switch - //strncpy_P(topic, outprefix, sizeof(topic)); setTopic(topic,sizeof(topic),T_DEV); - - strncat(topic,item->name,sizeof(topic)); - strncat(topic,"/",sizeof(topic)); + strncat(topic,item->name,sizeof(topic)-1); + strncat(topic,"/cmd/",sizeof(topic)-1); strncat_P(topic,datatype_P,sizeof(topic)); + mqttClient.publish_P(topic,enum_P,true); + + setTopic(topic,sizeof(topic),T_DEV); + strncat(topic,item->name,sizeof(topic)-1); + strncat(topic,"/cmd/",sizeof(topic)-1); + strncat_P(topic,format_P,sizeof(topic)); + mqttClient.publish_P(topic,enumformat_P,true); + + setTopic(topic,sizeof(topic),T_DEV); + strncat(topic,item->name,sizeof(topic)-1); + strncat(topic,"/set/",sizeof(topic)-1); + strncat_P(topic,datatype_P,sizeof(topic)-1); mqttClient.publish(topic,datatype,true); if (format[0]) { - //strncpy_P(topic, outprefix, sizeof(topic)); setTopic(topic,sizeof(topic),T_DEV); - - strncat(topic,item->name,sizeof(topic)); - strncat(topic,"/",sizeof(topic)); - strncat_P(topic,format_P,sizeof(topic)); + strncat(topic,item->name,sizeof(topic)-1); + strncat(topic,"/set/",sizeof(topic)); + strncat_P(topic,format_P,sizeof(topic)-1); mqttClient.publish(topic,format,true); } - yield(); - item = item->next; } //if + yield(); + item = item->next; + } //while + //strncpy_P(topic, outprefix, sizeof(topic)); setTopic(topic,sizeof(topic),T_DEV); - strncat_P(topic, nodes_P, sizeof(topic)); - /// mqttClient.publish(topic,buf,true); + strncat_P(topic, nodes_P, sizeof(topic)-1); + //debugSerial<> "<child; + while (items && item) + { + if (item->type == aJson_Array && aJson.getArraySize(item)>0) + { + mqttClient.write((uint8_t*)item->name,strlen(item->name)); + if (item->next) mqttClient.write(','); + } + yield(); + item = item->next; + } + mqttClient.endPublish(); } configLocked--; #endif @@ -893,6 +926,8 @@ void ip_ready_config_loaded_connecting_to_broker() { deviceName = getStringFromConfig(mqttArr, 0); + if (!deviceName) deviceName = (char*) lighthub; + infoSerial<