diff --git a/src/hasp/hasp_dispatch.cpp b/src/hasp/hasp_dispatch.cpp index cd566a68..00af337f 100644 --- a/src/hasp/hasp_dispatch.cpp +++ b/src/hasp/hasp_dispatch.cpp @@ -54,25 +54,63 @@ moodlight_t moodlight; static void dispatch_config(const char* topic, const char* payload); // void dispatch_group_value(uint8_t groupid, int16_t state, lv_obj_t * obj); -static inline void dispatch_state_msg(const __FlashStringHelper* subtopic, const char* payload); -void dispatch_screenshot(const char*, const char* filename) +/* Sends the payload out on the state/subtopic + */ +void dispatch_state_subtopic(const char* subtopic, const char* payload) { -#if HASP_USE_SPIFFS > 0 || HASP_USE_LITTLEFS > 0 - - if(strlen(filename) == 0) { // no filename given - char tempfile[32]; - memcpy_P(tempfile, PSTR("/screenshot.bmp"), sizeof(tempfile)); - guiTakeScreenshot(tempfile); - } else if(strlen(filename) > 31 || filename[0] != '/') { // Invalid filename - LOG_WARNING(TAG_MSGR, "Invalid filename %s", filename); - } else { // Valid filename - guiTakeScreenshot(filename); - } - +#if !defined(HASP_USE_MQTT) && !defined(HASP_USE_TASMOTA_CLIENT) + LOG_TRACE(TAG_MSGR, F("%s => %s"), subtopic, payload); #else - LOG_WARNING(TAG_MSGR, "Failed to save %s, no storage", filename); + +#if HASP_USE_MQTT > 0 + switch(mqtt_send_state(subtopic, payload)) { + case MQTT_ERR_OK: + LOG_TRACE(TAG_MQTT_PUB, F("%s => %s"), subtopic, payload); + break; + case MQTT_ERR_PUB_FAIL: + LOG_ERROR(TAG_MQTT_PUB, F(D_MQTT_FAILED " %s => %s"), subtopic, payload); + break; + case MQTT_ERR_NO_CONN: + LOG_ERROR(TAG_MQTT, F(D_MQTT_NOT_CONNECTED)); + break; + default: + LOG_ERROR(TAG_MQTT, F(D_ERROR_UNKNOWN)); + } #endif + +#if HASP_USE_TASMOTA_CLIENT > 0 + slave_send_state(subtopic, payload); +#endif + +#endif +} + +/* Sends the data out on the state/pxby topic + */ +void dispatch_state_object(uint8_t pageid, uint8_t btnid, const char* payload) +{ + char topic[16]; + snprintf_P(topic, sizeof(topic), PSTR(HASP_OBJECT_NOTATION), pageid, btnid); + dispatch_state_subtopic(topic, payload); +} + +/* Takes and lv_obj and finds the pageid and objid + Then sends the data out on the state/pxby topic +*/ +void dispatch_obj_data(lv_obj_t* obj, const char* data) +{ + uint8_t pageid; + uint8_t objid; + + if(hasp_find_id_from_obj(obj, &pageid, &objid)) { + if(!data) return; +#if HASP_USE_MQTT > 0 + dispatch_state_object(pageid, objid, data); +#endif + } else { + LOG_ERROR(TAG_MSGR, F(D_OBJECT_UNKNOWN)); + } } // Format filesystem and erase EEPROM @@ -319,6 +357,7 @@ void dispatch_text_line(const char* cmnd) // send idle state to the client void dispatch_output_idle_state(uint8_t state) { + char topic[6]; char payload[6]; switch(state) { case HASP_SLEEP_LONG: @@ -330,17 +369,20 @@ void dispatch_output_idle_state(uint8_t state) default: memcpy_P(payload, PSTR("off"), 4); } - dispatch_state_msg(F("idle"), payload); + memcpy_P(topic, PSTR("idle"), 5); + dispatch_state_subtopic(topic, payload); } void dispatch_output_group_state(uint8_t groupid, uint16_t state) { char payload[64]; char number[16]; // Return the current state + char topic[8]; itoa(state, number, DEC); snprintf_P(payload, sizeof(payload), PSTR("{\"group\":%d,\"state\":\"%s\"}"), groupid, number); - dispatch_state_msg(F("output"), payload); + memcpy_P(topic, PSTR("output"), 7); + dispatch_state_subtopic(topic, payload); } void dispatch_send_obj_attribute_str(uint8_t pageid, uint8_t btnid, const char* attribute, const char* data) @@ -350,7 +392,7 @@ void dispatch_send_obj_attribute_str(uint8_t pageid, uint8_t btnid, const char* char payload[32 + strlen(data) + strlen(attribute)]; snprintf_P(payload, sizeof(payload), PSTR("{\"%s\":\"%s\"}"), attribute, data); - mqtt_send_object_state(pageid, btnid, payload); + dispatch_state_object(pageid, btnid, payload); } void dispatch_send_obj_attribute_int(uint8_t pageid, uint8_t btnid, const char* attribute, int32_t val) @@ -360,7 +402,7 @@ void dispatch_send_obj_attribute_int(uint8_t pageid, uint8_t btnid, const char* char payload[64 + strlen(attribute)]; snprintf_P(payload, sizeof(payload), PSTR("{\"%s\":%d}"), attribute, val); - mqtt_send_object_state(pageid, btnid, payload); + dispatch_state_object(pageid, btnid, payload); } void dispatch_send_obj_attribute_color(uint8_t pageid, uint8_t btnid, const char* attribute, uint8_t r, uint8_t g, @@ -372,7 +414,7 @@ void dispatch_send_obj_attribute_color(uint8_t pageid, uint8_t btnid, const char snprintf_P(payload, sizeof(payload), PSTR("{\"%s\":\"#%02x%02x%02x\",\"r\":%d,\"g\":%d,\"b\":%d}"), attribute, r, g, b, r, g, b); - mqtt_send_object_state(pageid, btnid, payload); + dispatch_state_object(pageid, btnid, payload); } #if HASP_USE_CONFIG > 0 @@ -468,9 +510,12 @@ static void dispatch_config(const char* topic, const char* payload) // Send output if(!update) { + char subtopic[8]; settings.remove(F("pass")); // hide password in output + size_t size = serializeJson(doc, buffer, sizeof(buffer)); - dispatch_state_msg(F("config"), buffer); + memcpy_P(subtopic, PSTR("config"), 7); + dispatch_state_subtopic(subtopic, buffer); } } #endif // HASP_USE_CONFIG @@ -523,6 +568,9 @@ void dispatch_get_event_name(uint8_t eventid, char* buffer, size_t size) case HASP_EVENT_LOST: memcpy_P(buffer, PSTR("lost"), size); break; + case HASP_EVENT_CHANGED: + memcpy_P(buffer, PSTR("changed"), size); + break; default: memcpy_P(buffer, PSTR("unknown"), size); } @@ -532,12 +580,14 @@ void dispatch_get_event_name(uint8_t eventid, char* buffer, size_t size) void dispatch_gpio_input_event(uint8_t pin, uint8_t group, uint8_t eventid) { char payload[64]; + char topic[8]; char event[8]; dispatch_get_event_name(eventid, event, sizeof(event)); snprintf_P(payload, sizeof(payload), PSTR("{\"pin\":%d,\"group\":%d,\"event\":\"%s\"}"), pin, group, event); #if HASP_USE_MQTT > 0 - mqtt_send_state(F("input"), payload); + memcpy_P(topic, PSTR("input"), 6); + dispatch_state_subtopic(topic, payload); #endif // update outputstates @@ -545,45 +595,67 @@ void dispatch_gpio_input_event(uint8_t pin, uint8_t group, uint8_t eventid) } #endif -void dispatch_object_event(lv_obj_t* obj, uint8_t eventid) +/* ============================== Event Senders ============================ */ + +// Send out the event that occured +void dispatch_object_generic_event(lv_obj_t* obj, uint8_t eventid) { - char topic[8]; - char payload[8]; - uint8_t pageid, objid; + char data[40]; + char eventname[8]; - snprintf_P(topic, sizeof(topic), PSTR("event")); - dispatch_get_event_name(eventid, payload, sizeof(payload)); - - if(hasp_find_id_from_obj(obj, &pageid, &objid)) { - dispatch_send_obj_attribute_str(pageid, objid, topic, payload); - } - - // dispatch_group_onoff(obj->user_data.groupid, dispatch_get_event_state(eventid), obj); + dispatch_get_event_name(eventid, eventname, sizeof(eventname)); + snprintf_P(data, sizeof(data), PSTR("{\"event\":\"%s\"}"), eventname); + dispatch_obj_data(obj, data); } +// Send out the on/off event, with the val +void dispatch_object_toggle_event(lv_obj_t* obj, bool state) +{ + char data[40]; + char eventname[8]; + + dispatch_get_event_name(state, eventname, sizeof(eventname)); + snprintf_P(data, sizeof(data), PSTR("{\"event\":\"%s\",\"val\":%d}"), eventname, state); + dispatch_obj_data(obj, data); +} + +// Send out the changed event, with the val void dispatch_object_value_changed(lv_obj_t* obj, int16_t state) { - char topic[4]; + char data[48]; - hasp_update_sleep_state(); // wakeup? - snprintf_P(topic, sizeof(topic), PSTR("val")); - hasp_send_obj_attribute_int(obj, topic, state); + snprintf_P(data, sizeof(data), PSTR("{\"event\":\"changed\",\"val\":%d}"), state); + dispatch_obj_data(obj, data); +} + +// Send out the changed event, with the val and text +void dispatch_object_selection_changed(lv_obj_t* obj, int16_t val, const char* text) +{ + char data[200]; + + snprintf_P(data, sizeof(data), PSTR("{\"event\":\"changed\",\"val\":%d,\"text\":\"%s\"}"), val, text); + dispatch_obj_data(obj, data); +} + +// Send out the changed event, with the color +void dispatch_object_color_changed(lv_obj_t* obj, lv_color_t color) +{ + char data[80]; + lv_color32_t c32; + c32.full = lv_color_to32(color); + + snprintf_P(data, sizeof(data), + PSTR("{\"event\":\"changed\",\"color\":\"#%02x%02x%02x\",\"r\":%d,\"g\":%d,\"b\":%d}"), c32.ch.red, + c32.ch.green, c32.ch.blue, c32.ch.red, c32.ch.green, c32.ch.blue); + dispatch_obj_data(obj, data); } /********************************************** Output States ******************************************/ +/* static inline void dispatch_state_msg(const __FlashStringHelper* subtopic, const char* payload) { -#if !defined(HASP_USE_MQTT) && !defined(HASP_USE_TASMOTA_CLIENT) - LOG_TRACE(TAG_MSGR, F("%s => %s"), String(subtopic).c_str(), payload); -#else -#if HASP_USE_MQTT > 0 - mqtt_send_state(subtopic, payload); -#endif -#if HASP_USE_TASMOTA_CLIENT > 0 - slave_send_state(subtopic, payload); -#endif -#endif -} + +}*/ // void dispatch_group_onoff(uint8_t groupid, uint16_t eventid, lv_obj_t * obj) // { @@ -624,6 +696,25 @@ void dispatch_normalized_group_value(uint8_t groupid, uint16_t value, lv_obj_t* /********************************************** Native Commands ****************************************/ +void dispatch_screenshot(const char*, const char* filename) +{ +#if HASP_USE_SPIFFS > 0 || HASP_USE_LITTLEFS > 0 + + if(strlen(filename) == 0) { // no filename given + char tempfile[32]; + memcpy_P(tempfile, PSTR("/screenshot.bmp"), sizeof(tempfile)); + guiTakeScreenshot(tempfile); + } else if(strlen(filename) > 31 || filename[0] != '/') { // Invalid filename + LOG_WARNING(TAG_MSGR, "Invalid filename %s", filename); + } else { // Valid filename + guiTakeScreenshot(filename); + } + +#else + LOG_WARNING(TAG_MSGR, "Failed to save %s, no storage", filename); +#endif +} + void dispatch_parse_json(const char*, const char* payload) { // Parse an incoming JSON array into individual commands /* if(strPayload.endsWith(",]")) { @@ -719,10 +810,12 @@ void dispatch_parse_jsonl(const char*, const char* payload) void dispatch_output_current_page() { - // Log result - char payload[4]; - itoa(haspGetPage(), payload, DEC); - dispatch_state_msg(F("page"), payload); + char topic[8]; + char payload[8]; + + memcpy_P(topic, PSTR("page"), 5); + snprintf_P(payload, sizeof(payload), PSTR("%d"), haspGetPage()); + dispatch_state_subtopic(topic, payload); } // Get or Set a page @@ -785,9 +878,12 @@ void dispatch_dim(const char*, const char* level) // Set the current state if(strlen(level) != 0) haspDevice.set_backlight_level(atoi(level)); - char payload[5]; - itoa(haspDevice.get_backlight_level(), payload, DEC); - dispatch_state_msg(F("dim"), payload); + char topic[8]; + char payload[8]; + + memcpy_P(topic, PSTR("dim"), 4); + snprintf_P(payload, sizeof(payload), PSTR("%d"), haspDevice.get_backlight_level()); + dispatch_state_subtopic(topic, payload); } void dispatch_moodlight(const char* topic, const char* payload) @@ -843,11 +939,14 @@ void dispatch_moodlight(const char* topic, const char* payload) // Return the current state char buffer[128]; + char out_topic[16]; + memcpy_P(out_topic, PSTR("moodlight"), 10); snprintf_P( - // buffer, sizeof(buffer), PSTR("{\"state\":\"%s\",\"color\":\"#%02x%02x%02x\",\"r\":%u,\"g\":%u,\"b\":%u}"), + // buffer, sizeof(buffer), + // PSTR("{\"state\":\"%s\",\"color\":\"#%02x%02x%02x\",\"r\":%u,\"g\":%u,\"b\":%u}"), buffer, sizeof(buffer), PSTR("{\"state\":\"%s\",\"color\":{\"r\":%u,\"g\":%u,\"b\":%u}}"), moodlight.power ? "on" : "off", moodlight.r, moodlight.g, moodlight.b); - dispatch_state_msg(F("moodlight"), buffer); + dispatch_state_subtopic(out_topic, buffer); } void dispatch_backlight(const char*, const char* payload) @@ -856,9 +955,11 @@ void dispatch_backlight(const char*, const char* payload) if(strlen(payload) != 0) haspDevice.set_backlight_power(Utilities::is_true(payload)); // Return the current state + char topic[8]; char buffer[4]; + memcpy_P(topic, PSTR("light"), 6); memcpy_P(buffer, haspDevice.get_backlight_power() ? PSTR("on") : PSTR("off"), sizeof(buffer)); - dispatch_state_msg(F("light"), buffer); + dispatch_state_subtopic(topic, buffer); } void dispatch_web_update(const char*, const char* espOtaUrl) @@ -925,12 +1026,12 @@ void dispatch_output_statusupdate(const char*, const char*) strcat(data, buffer); #endif - snprintf_P(buffer, sizeof(buffer), PSTR("\"heapFree\":%u,\"heapFrag\":%u,\"espCore\":\"%s\","), + snprintf_P(buffer, sizeof(buffer), PSTR("\"heapFree\":%u,\"heapFrag\":%u,\"core\":\"%s\","), haspDevice.get_free_heap(), haspDevice.get_heap_fragmentation(), haspDevice.get_core_version()); strcat(data, buffer); - snprintf_P(buffer, sizeof(buffer), PSTR("\"espCanUpdate\":\"false\",\"page\":%u,\"numPages\":%u,"), - haspGetPage(), (HASP_NUM_PAGES)); + snprintf_P(buffer, sizeof(buffer), PSTR("\"canUpdate\":\"false\",\"page\":%u,\"numPages\":%u,"), haspGetPage(), + (HASP_NUM_PAGES)); strcat(data, buffer); #if defined(ARDUINO_ARCH_ESP8266) @@ -942,7 +1043,10 @@ void dispatch_output_statusupdate(const char*, const char*) Utilities::tft_driver_name().c_str(), (TFT_WIDTH), (TFT_HEIGHT)); strcat(data, buffer); } - mqtt_send_state(F("statusupdate"), data); + + char topic[16]; + memcpy_P(topic, PSTR("statusupdate"), 13); + dispatch_state_subtopic(topic, data); dispatchLastMillis = millis(); /* if(updateEspAvailable) { diff --git a/src/hasp/hasp_dispatch.h b/src/hasp/hasp_dispatch.h index 1dba3b41..ac0e591b 100644 --- a/src/hasp/hasp_dispatch.h +++ b/src/hasp/hasp_dispatch.h @@ -22,7 +22,9 @@ enum hasp_event_t { // even = released, odd = pressed HASP_EVENT_LONG = 5, HASP_EVENT_LOST = 6, HASP_EVENT_HOLD = 7, - HASP_EVENT_DOUBLE = 8 + HASP_EVENT_DOUBLE = 8, + + HASP_EVENT_CHANGED = 32 }; /* ===== Default Event Processors ===== */ @@ -60,7 +62,6 @@ void dispatch_output_statusupdate(const char*, const char*); void dispatch_current_state(); void dispatch_gpio_input_event(uint8_t pin, uint8_t group, uint8_t eventid); -void dispatch_object_event(lv_obj_t* obj, uint8_t eventid); bool dispatch_get_event_state(uint8_t eventid); void dispatch_get_event_name(uint8_t eventid, char* buffer, size_t size); void dispatch_object_value_changed(lv_obj_t* obj, int16_t state); @@ -72,6 +73,12 @@ void dispatch_send_obj_attribute_int(uint8_t pageid, uint8_t btnid, const char* void dispatch_send_obj_attribute_color(uint8_t pageid, uint8_t btnid, const char* attribute, uint8_t r, uint8_t g, uint8_t b); +void dispatch_object_generic_event(lv_obj_t* obj, uint8_t eventid); +void dispatch_object_toggle_event(lv_obj_t* obj, bool state); +void dispatch_object_value_changed(lv_obj_t* obj, int16_t state); +void dispatch_object_selection_changed(lv_obj_t* obj, int16_t val, const char* text); +void dispatch_object_color_changed(lv_obj_t* obj, lv_color_t color); + /* ===== Getter and Setter Functions ===== */ /* ===== Read/Write Configuration ===== */ diff --git a/src/hasp/hasp_object.cpp b/src/hasp/hasp_object.cpp index 46610f2e..a91e7a76 100644 --- a/src/hasp/hasp_object.cpp +++ b/src/hasp/hasp_object.cpp @@ -269,6 +269,23 @@ void hasp_send_obj_attribute_color(lv_obj_t* obj, const char* attribute, lv_colo // ##################### Event Handlers ######################################################## +/** + * Called when a press on the system layer is detected + * @param obj pointer to a button matrix + * @param event type of event that occured + */ +void wakeup_event_handler(lv_obj_t* obj, lv_event_t event) +{ + if(obj == lv_disp_get_layer_sys(NULL)) { + hasp_update_sleep_state(); // wakeup? + + if(event == LV_EVENT_CLICKED) { + lv_obj_set_click(obj, false); // disable first touch + LOG_VERBOSE(TAG_HASP, F("Wakeup touch disabled")); + } + } +} + /** * Called when a button-style object is clicked * @param obj pointer to a button object @@ -317,7 +334,7 @@ void generic_event_handler(lv_obj_t* obj, lv_event_t event) return; case LV_EVENT_VALUE_CHANGED: - LOG_WARNING(TAG_HASP, F("Value changed Event %d occured"), event); + LOG_WARNING(TAG_HASP, F("Value changed Event %d occured"), event); // Shouldn't happen in this event handler last_press_was_short = false; return; @@ -333,28 +350,11 @@ void generic_event_handler(lv_obj_t* obj, lv_event_t event) return; } - hasp_update_sleep_state(); // wakeup? - dispatch_object_event(obj, eventid); // send object event + hasp_update_sleep_state(); // wakeup? + dispatch_object_generic_event(obj, eventid); // send object event dispatch_normalized_group_value(obj->user_data.groupid, NORMALIZE(dispatch_get_event_state(eventid), 0, 1), obj); } -/** - * Called when a press on the system layer is detected - * @param obj pointer to a button matrix - * @param event type of event that occured - */ -void wakeup_event_handler(lv_obj_t* obj, lv_event_t event) -{ - if(obj == lv_disp_get_layer_sys(NULL)) { - hasp_update_sleep_state(); // wakeup? - - if(event == LV_EVENT_CLICKED) { - lv_obj_set_click(obj, false); // disable first touch - LOG_VERBOSE(TAG_HASP, F("Wakeup touch disabled")); - } - } -} - /** * Called when a object state is toggled on/off * @param obj pointer to a switch object @@ -363,7 +363,7 @@ void wakeup_event_handler(lv_obj_t* obj, lv_event_t event) void toggle_event_handler(lv_obj_t* obj, lv_event_t event) { if(event == LV_EVENT_VALUE_CHANGED) { - char property[4]; + char property[36]; // 4 for val only bool val = 0; hasp_update_sleep_state(); // wakeup? @@ -385,8 +385,11 @@ void toggle_event_handler(lv_obj_t* obj, lv_event_t event) return; } - snprintf_P(property, sizeof(property), PSTR("val")); - hasp_send_obj_attribute_int(obj, property, val); + // snprintf_P(property, sizeof(property), PSTR("val")); + // hasp_send_obj_attribute_int(obj, property, val); + + hasp_update_sleep_state(); // wakeup? + dispatch_object_toggle_event(obj, val); dispatch_normalized_group_value(obj->user_data.groupid, NORMALIZE(val, 0, 1), obj); } else if(event == LV_EVENT_DELETE) { @@ -437,7 +440,7 @@ static void selector_event_handler(lv_obj_t* obj, lv_event_t event) const char* txt = lv_table_get_cell_value(obj, row, col); strncpy(buffer, txt, sizeof(buffer)); - snprintf_P(property, sizeof(property), PSTR("row\":%d,\"col\":%d,\"txt"), row, col); + snprintf_P(property, sizeof(property), PSTR("row\":%d,\"col\":%d,\"text"), row, col); hasp_send_obj_attribute_str(obj, property, buffer); return; } @@ -447,8 +450,10 @@ static void selector_event_handler(lv_obj_t* obj, lv_event_t event) } // set the property - snprintf_P(property, sizeof(property), PSTR("val\":%d,\"text"), val); - hasp_send_obj_attribute_str(obj, property, buffer); + // snprintf_P(property, sizeof(property), PSTR("val\":%d,\"text"), val); + // hasp_send_obj_attribute_str(obj, property, buffer); + + dispatch_object_selection_changed(obj, val, buffer); if(max > 0) dispatch_normalized_group_value(obj->user_data.groupid, NORMALIZE(val, 0, max), obj); } else if(event == LV_EVENT_DELETE) { @@ -481,6 +486,7 @@ void slider_event_handler(lv_obj_t* obj, lv_event_t event) int16_t val = 0; int16_t min = 0; int16_t max = 0; + hasp_update_sleep_state(); // wakeup? if(obj->user_data.objid == LV_HASP_SLIDER) { val = lv_slider_get_value(obj); @@ -514,7 +520,9 @@ static void cpicker_event_handler(lv_obj_t* obj, lv_event_t event) if(event == LV_EVENT_VALUE_CHANGED) { hasp_update_sleep_state(); // wakeup? - hasp_send_obj_attribute_color(obj, color, lv_cpicker_get_color(obj)); + // hasp_send_obj_attribute_color(obj, color, lv_cpicker_get_color(obj)); + dispatch_object_color_changed(obj, lv_cpicker_get_color(obj)); + } else if(event == LV_EVENT_DELETE) { LOG_VERBOSE(TAG_HASP, F(D_OBJECT_DELETED)); hasp_object_delete(obj); diff --git a/src/mqtt/hasp_mqtt.h b/src/mqtt/hasp_mqtt.h index 5760bede..aa67ff0b 100644 --- a/src/mqtt/hasp_mqtt.h +++ b/src/mqtt/hasp_mqtt.h @@ -9,9 +9,9 @@ #include "hasp_conf.h" -#ifdef WINDOWS -#define __FlashStringHelper char -#endif +// #ifdef WINDOWS +// #define __FlashStringHelper char +// #endif enum hasp_mqtt_error_t { MQTT_ERR_OK = 0, diff --git a/src/mqtt/hasp_mqtt_paho_single.cpp b/src/mqtt/hasp_mqtt_paho_single.cpp index a1e45b66..c2afbe56 100644 --- a/src/mqtt/hasp_mqtt_paho_single.cpp +++ b/src/mqtt/hasp_mqtt_paho_single.cpp @@ -251,7 +251,7 @@ int mqtt_send_state(const __FlashStringHelper* subtopic, const char* payload) return mqttPublish(tmp_topic, payload, strlen(payload), false); } -int mqtt_send_object_state(uint8_t pageid, uint8_t btnid, char* payload) +int mqtt_send_object_state(uint8_t pageid, uint8_t btnid, const char* payload) { char tmp_topic[strlen(mqttNodeTopic) + 20]; snprintf_P(tmp_topic, sizeof(tmp_topic), PSTR("%sstate/p%ub%u"), mqttNodeTopic, pageid, btnid); diff --git a/src/mqtt/hasp_mqtt_pubsubclient.cpp b/src/mqtt/hasp_mqtt_pubsubclient.cpp index 05a795cb..a485721b 100644 --- a/src/mqtt/hasp_mqtt_pubsubclient.cpp +++ b/src/mqtt/hasp_mqtt_pubsubclient.cpp @@ -128,11 +128,11 @@ void mqtt_send_lwt(bool online) bool res = mqttPublish(tmp_topic, tmp_payload, len, true); } -void mqtt_send_object_state(uint8_t pageid, uint8_t btnid, const char* payload) +int mqtt_send_object_state(uint8_t pageid, uint8_t btnid, const char* payload) { char tmp_topic[strlen(mqttNodeTopic) + 16]; snprintf_P(tmp_topic, sizeof(tmp_topic), PSTR("%sstate/" HASP_OBJECT_NOTATION), mqttNodeTopic, pageid, btnid); - mqttPublish(tmp_topic, payload, false); + return mqttPublish(tmp_topic, payload, false); } int mqtt_send_state(const char* subtopic, const char* payload)