diff --git a/main/ZactuatorFASTLED.ino b/main/ZactuatorFASTLED.ino index 8de9212..2380b9b 100644 --- a/main/ZactuatorFASTLED.ino +++ b/main/ZactuatorFASTLED.ino @@ -132,7 +132,7 @@ void MQTTtoFASTLEDJSON(char *topicOri, JsonObject& jsonData) - if (strstr(topicOri,(char *)catToMainTopic(subjectMQTTtoFASTLEDsetled).c_str()) != NULL) + if (cmpToMainTopic(topicOri,subjectMQTTtoFASTLEDsetled)) { trc(F("JSON parsed")); int ledNr = jsonData["led"]; @@ -160,7 +160,7 @@ void MQTTtoFASTLED(char *topicOri, char *datacallback) currentLEDState = GENERAL; long number = 0; trc(topicOri); - if (strstr(topicOri,(char *)catToMainTopic(subjectMQTTtoFASTLED).c_str()) != NULL) + if (cmpToMainTopic(topicOri,subjectMQTTtoFASTLED)) { number = (long)strtol(&datacallback[1], NULL, 16); trc(number); @@ -170,14 +170,14 @@ void MQTTtoFASTLED(char *topicOri, char *datacallback) } FastLED.show(); } - else if (strstr(topicOri,(char *)catToMainTopic(subjectMQTTtoFASTLEDsetbrightness).c_str()) != NULL) + else if (cmpToMainTopic(topicOri,subjectMQTTtoFASTLEDsetbrightness)) { number = (long)strtol(&datacallback[1], NULL, 16); trc(number); FastLED.setBrightness(number); FastLED.show(); } - else if (strstr(topicOri,(char *)catToMainTopic(subjectMQTTtoFASTLEDsetanimation).c_str()) != NULL) + else if (cmpToMainTopic(topicOri,subjectMQTTtoFASTLEDsetanimation)) { String payload = datacallback; trc(payload); diff --git a/main/ZactuatorONOFF.ino b/main/ZactuatorONOFF.ino index c8637ed..cf180d1 100644 --- a/main/ZactuatorONOFF.ino +++ b/main/ZactuatorONOFF.ino @@ -33,7 +33,7 @@ #ifdef jsonReceiving void MQTTtoONOFF(char * topicOri, JsonObject& ONOFFdata){ - if (strstr(topicOri,(char *)catToMainTopic(subjectMQTTtoONOFF).c_str()) != NULL){ + if (cmpToMainTopic(topicOri,subjectMQTTtoONOFF)){ trc(F("MQTTtoONOFF json data analysis")); int boolSWITCHTYPE = ONOFFdata["state"] | 99; int pin = ONOFFdata["pin"] | ACTUATOR_ONOFF_PIN; @@ -55,7 +55,7 @@ void MQTTtoONOFF(char * topicOri, JsonObject& ONOFFdata){ #ifdef simpleReceiving void MQTTtoONOFF(char * topicOri, char * datacallback) { - if ((strstr(topicOri,(char *)catToMainTopic(subjectMQTTtoONOFF).c_str()) != NULL) ){ + if ((cmpToMainTopic(topicOri,subjectMQTTtoONOFF)) ){ trc(F("MQTTtoONOFF")); int pin = strtol(datacallback, NULL, 10); // we will not be able to pass values > 4294967295 diff --git a/main/Zgateway2G.ino b/main/Zgateway2G.ino index da5b602..9f65d3f 100644 --- a/main/Zgateway2G.ino +++ b/main/Zgateway2G.ino @@ -107,7 +107,7 @@ bool _2GtoMQTT(){ String data = datacallback; String topic = topicOri; - if (strstr(topicOri,(char *)catToMainTopic(subjectMQTTto2G).c_str()) != NULL) { + if (cmpToMainTopic(topicOri,subjectMQTTto2G)) { trc(F("MQTTto2G data analysis")); // 2G DATA ANALYSIS String phone_number = ""; @@ -138,7 +138,7 @@ bool _2GtoMQTT(){ #ifdef jsonReceiving void MQTTto2G(char * topicOri, JsonObject& SMSdata) { - if (strstr(topicOri,(char *)catToMainTopic(subjectMQTTto2G).c_str()) != NULL){ + if (cmpToMainTopic(topicOri,subjectMQTTto2G)){ const char * sms = SMSdata["message"]; const char * phone = SMSdata["phone"]; trc(F("MQTTto2G json data analysis")); diff --git a/main/ZgatewayBT.ino b/main/ZgatewayBT.ino index 5c150aa..db4fc6e 100644 --- a/main/ZgatewayBT.ino +++ b/main/ZgatewayBT.ino @@ -1044,7 +1044,7 @@ void haRoomPresence(JsonObject& HomePresence){ #endif void MQTTtoBT(char * topicOri, JsonObject& BTdata) { // json object decoding - if (strstr(topicOri,(char *)catToMainTopic(subjectMQTTtoBTset).c_str()) != NULL){ + if (cmpToMainTopic(topicOri,subjectMQTTtoBTset)){ trc(F("MQTTtoBT json set")); // Black list & white list set diff --git a/main/ZgatewayIR.ino b/main/ZgatewayIR.ino index f667bb9..a4b7011 100644 --- a/main/ZgatewayIR.ino +++ b/main/ZgatewayIR.ino @@ -274,7 +274,7 @@ void IRtoMQTT(){ #ifdef jsonReceiving void MQTTtoIR(char * topicOri, JsonObject& IRdata) { - if (strstr(topicOri,(char *)catToMainTopic(subjectMQTTtoIR).c_str()) != NULL){ + if (cmpToMainTopic(topicOri,subjectMQTTtoIR)){ trc(F("MQTTtoIR json")); uint64_t data = IRdata["value"]; const char * raw = IRdata["raw"]; diff --git a/main/ZgatewayLORA.ino b/main/ZgatewayLORA.ino index d299c7d..b3687b8 100644 --- a/main/ZgatewayLORA.ino +++ b/main/ZgatewayLORA.ino @@ -87,7 +87,7 @@ void LORAtoMQTT(){ #ifdef jsonReceiving void MQTTtoLORA(char * topicOri, JsonObject& LORAdata) { // json object decoding - if (strstr(topicOri,(char *)catToMainTopic(subjectMQTTtoLORA).c_str()) != NULL){ + if (cmpToMainTopic(topicOri,subjectMQTTtoLORA)){ trc(F("MQTTtoLORA json")); const char * message = LORAdata["message"]; int txPower = LORAdata["txpower"]|LORA_TX_POWER; @@ -120,7 +120,7 @@ void LORAtoMQTT(){ #endif #ifdef simpleReceiving void MQTTtoLORA(char * topicOri, char * LORAdata) { // json object decoding - if (strstr(topicOri,(char *)catToMainTopic(subjectMQTTtoLORA).c_str()) != NULL){ + if (cmpToMainTopic(topicOri,subjectMQTTtoLORA)){ LoRa.beginPacket(); LoRa.print(LORAdata); LoRa.endPacket(); diff --git a/main/ZgatewayPilight.ino b/main/ZgatewayPilight.ino index 6ffcf9f..e8a165e 100644 --- a/main/ZgatewayPilight.ino +++ b/main/ZgatewayPilight.ino @@ -74,7 +74,7 @@ void MQTTtoPilight(char * topicOri, JsonObject& Pilightdata) { int result = 0; - if (strstr(topicOri,(char *)catToMainTopic(subjectMQTTtoPilight).c_str()) != NULL){ + if (cmpToMainTopic(topicOri,subjectMQTTtoPilight)){ trc(F("MQTTtoPilight json data analysis")); const char * message = Pilightdata["message"]; const char * protocol = Pilightdata["protocol"]; diff --git a/main/ZgatewayRF.ino b/main/ZgatewayRF.ino index efd5245..16335ec 100644 --- a/main/ZgatewayRF.ino +++ b/main/ZgatewayRF.ino @@ -132,7 +132,7 @@ void MQTTtoRF(char * topicOri, char * datacallback) { trc(valueBITS); } - if ((strstr(topicOri,(char *)catToMainTopic(subjectMQTTtoRF).c_str()) != NULL) && (valuePRT == 0) && (valuePLSL == 0) && (valueBITS == 0)){ + if ((cmpToMainTopic(topicOri,subjectMQTTtoRF)) && (valuePRT == 0) && (valuePLSL == 0) && (valueBITS == 0)){ trc(F("MQTTtoRF dflt")); mySwitch.setProtocol(1,350); mySwitch.send(data, 24); @@ -156,7 +156,7 @@ void MQTTtoRF(char * topicOri, char * datacallback) { #ifdef jsonReceiving void MQTTtoRF(char * topicOri, JsonObject& RFdata) { // json object decoding - if (strstr(topicOri,(char *)catToMainTopic(subjectMQTTtoRF).c_str()) != NULL){ + if (cmpToMainTopic(topicOri,subjectMQTTtoRF)){ trc(F("MQTTtoRF json")); unsigned long data = RFdata["value"]; if (data != 0) { diff --git a/main/ZgatewayRF2.ino b/main/ZgatewayRF2.ino index ae64788..859c1e4 100644 --- a/main/ZgatewayRF2.ino +++ b/main/ZgatewayRF2.ino @@ -215,7 +215,7 @@ void rf2Callback(unsigned int period, unsigned long address, unsigned long group #ifdef jsonReceiving void MQTTtoRF2(char * topicOri, JsonObject& RF2data) { // json object decoding - if (strstr(topicOri,(char *)catToMainTopic(subjectMQTTtoRF2).c_str()) != NULL){ + if (cmpToMainTopic(topicOri,subjectMQTTtoRF2)){ trc(F("MQTTtoRF2 json")); int boolSWITCHTYPE = RF2data["switchType"] | 99; if (boolSWITCHTYPE != 99) { diff --git a/main/ZgatewayRFM69.ino b/main/ZgatewayRFM69.ino index 992b1c5..1f0484a 100644 --- a/main/ZgatewayRFM69.ino +++ b/main/ZgatewayRFM69.ino @@ -184,7 +184,7 @@ bool RFM69toMQTT(void) { #ifdef simpleReceiving void MQTTtoRFM69(char * topicOri, char * datacallback) { - if(strstr(topicOri,(char *)catToMainTopic(subjectMQTTtoRFM69).c_str()) != NULL){ + if(cmpToMainTopic(topicOri,subjectMQTTtoRFM69)){ trc(F("MQTTtoRFM69 data analysis")); char data[RF69_MAX_DATA_LEN+1]; memcpy(data, (void *)datacallback, RF69_MAX_DATA_LEN); @@ -215,7 +215,7 @@ bool RFM69toMQTT(void) { #ifdef jsonReceiving void MQTTtoRFM69(char * topicOri, JsonObject& RFM69data) { - if (strstr(topicOri,(char *)catToMainTopic(subjectMQTTtoRFM69).c_str()) != NULL){ + if (cmpToMainTopic(topicOri,subjectMQTTtoRFM69)){ const char * data = RFM69data["data"]; trc(F("MQTTtoRFM69 json data analysis")); if(data){ diff --git a/main/ZgatewaySRFB.ino b/main/ZgatewaySRFB.ino index bb4f6a3..3a7ba3f 100644 --- a/main/ZgatewaySRFB.ino +++ b/main/ZgatewaySRFB.ino @@ -280,7 +280,7 @@ bool _rfbToChar(byte * in, char * out) { // RF DATA ANALYSIS const char * raw = SRFBdata["raw"]; int valueRPT = SRFBdata["repeat"]|1; - if (strstr(topicOri,(char *)catToMainTopic(subjectMQTTtoSRFB).c_str()) != NULL){ + if (cmpToMainTopic(topicOri,subjectMQTTtoSRFB)){ trc(F("MQTTtoSRFB json")); if (raw){ // send raw in priority when defined in the json trc(F("MQTTtoSRFB raw ok")); diff --git a/main/ZmqttDiscovery.ino b/main/ZmqttDiscovery.ino index 1c1962d..fcd93e0 100644 --- a/main/ZmqttDiscovery.ino +++ b/main/ZmqttDiscovery.ino @@ -50,16 +50,21 @@ String getUniqueId(String name, String sufix) } void createDiscovery(char * sensor_type, - char * state_topic, char * s_name, char * unique_id, + char * st_topic, char * s_name, char * unique_id, char * availability_topic, char * device_class, char * value_template, char * payload_on, char * payload_off, char * unit_of_meas, int off_delay, - char * payload_available, char * payload_not_avalaible, bool child_device , char * command_topic) + char * payload_available, char * payload_not_avalaible, bool child_device , char * cmd_topic) { const int JSON_MSG_CALC_BUFFER = JSON_OBJECT_SIZE(14) + JSON_OBJECT_SIZE(5)+ JSON_ARRAY_SIZE(1); StaticJsonBuffer jsonBuffer; JsonObject &sensor = jsonBuffer.createObject(); + + char state_topic[mqtt_topic_max_size]; + strcpy(state_topic,mqtt_topic); + strcat(state_topic,st_topic); sensor.set("stat_t", state_topic); //state_topic + sensor.set("name", s_name); //name sensor.set("uniq_id", unique_id); //unique_id if (device_class[0]) sensor.set("dev_cla", device_class); //device_class @@ -70,7 +75,13 @@ void createDiscovery(char * sensor_type, if (off_delay != 0) sensor.set("off_delay", off_delay); //off_delay if (payload_available[0]) sensor.set("pl_avail", payload_available); // payload_on if (payload_not_avalaible[0]) sensor.set("pl_not_avail", payload_not_avalaible); //payload_off - if (command_topic[0]) sensor.set("cmd_t", command_topic); //command_topic + + if (cmd_topic[0]) { + char command_topic[mqtt_topic_max_size]; + strcpy(command_topic,mqtt_topic); + strcat(command_topic,cmd_topic); + sensor.set("cmd_t", command_topic); //command_topic + } /*if (strcmp(s_name, Gateway_Name) == 0){ JsonArray &json_attributes = sensor.createNestedArray("json_attributes"); @@ -80,7 +91,6 @@ void createDiscovery(char * sensor_type, json_attributes.add("SSID"); }*/ - if (child_device){ const int JSON_MSG_CALC_BUFFER = JSON_OBJECT_SIZE(5) + JSON_ARRAY_SIZE(2); StaticJsonBuffer jsonDeviceBuffer; diff --git a/main/main.ino b/main/main.ino index 74af11c..64bce81 100644 --- a/main/main.ino +++ b/main/main.ino @@ -427,10 +427,16 @@ void pubMQTT(String topic, unsigned long payload){ sprintf(val, "%lu", payload); client.publish((char *)topic.c_str(),val); } - -String catToMainTopic(char * toAdd){ - String resultTopic = String(mqtt_topic) + String(toAdd); - return resultTopic; + +bool cmpToMainTopic(char * topicOri, char * toAdd){ + char topic[mqtt_topic_max_size]; + strcpy(topic,mqtt_topic); + strcat(topic,toAdd); + if (strstr(topicOri,topic) != NULL){ + return true; + }else{ + return false; + } } void reconnect() { @@ -452,7 +458,10 @@ void reconnect() { // publish version pub(version_Topic,OMG_VERSION,will_Retain); //Subscribing to topic - if (client.subscribe((char *)catToMainTopic(subjectMQTTtoX).c_str())) { + char topic[mqtt_topic_max_size]; + strcpy(topic,mqtt_topic); + strcat(topic,subjectMQTTtoX); + if (client.subscribe(topic)) { #ifdef ZgatewayRF client.subscribe(subjectMultiGTWRF); // subject on which other OMG will publish, this OMG will store these msg and by the way don't republish them if they have been already published #endif @@ -1320,7 +1329,7 @@ digitalWrite(led_send, HIGH); } void MQTTtoSYS(char * topicOri, JsonObject& SYSdata) { // json object decoding - if (strstr(topicOri,(char *)catToMainTopic(subjectMQTTtoSYSset).c_str()) != NULL){ + if (cmpToMainTopic(topicOri,subjectMQTTtoSYSset)){ trc(F("MQTTtoSYS json set")); #if defined(ESP8266) || defined(ESP32) if (SYSdata.containsKey("cmd")){