diff --git a/CHANGELOG.md b/CHANGELOG.md index e134befd3..939fee5fc 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,7 @@ All notable changes to this project will be documented in this file. ### Added - Zigbee device plugin mechanism with commands ``ZbLoad``, ``ZbUnload`` and ``ZbLoadDump`` (#16252) - ESP32-S3 support for internal temperature sensor +- Command ``StatusRetain`` (#11109) ### Changed - ESP32 NimBLE library from v1.3.6 to v1.4.0 diff --git a/RELEASENOTES.md b/RELEASENOTES.md index 1e1c20d9b..a7a78948e 100644 --- a/RELEASENOTES.md +++ b/RELEASENOTES.md @@ -109,6 +109,7 @@ The latter links can be used for OTA upgrades too like ``OtaUrl http://ota.tasmo ## Changelog v12.1.0.1 ### Added +- Command ``StatusRetain`` (#11109) - Zigbee device plugin mechanism with commands ``ZbLoad``, ``ZbUnload`` and ``ZbLoadDump`` [#16252](https://github.com/arendst/Tasmota/issues/16252) - ESP32-S3 support for internal temperature sensor diff --git a/tasmota/include/i18n.h b/tasmota/include/i18n.h index 560baa0dc..3d0e5613d 100644 --- a/tasmota/include/i18n.h +++ b/tasmota/include/i18n.h @@ -416,6 +416,7 @@ #define D_CMND_SENSORRETAIN "SensorRetain" #define D_CMND_INFORETAIN "InfoRetain" #define D_CMND_STATERETAIN "StateRetain" +#define D_CMND_STATUSRETAIN "StatusRetain" #define D_CMND_PUBLISH "Publish" #define D_CMND_FILEUPLOAD "FileUpload" #define D_CMND_FILEDOWNLOAD "FileDownload" diff --git a/tasmota/include/tasmota_types.h b/tasmota/include/tasmota_types.h index cfd73de8e..b6eaad2cc 100644 --- a/tasmota/include/tasmota_types.h +++ b/tasmota/include/tasmota_types.h @@ -172,7 +172,7 @@ typedef union { // Restricted by MISRA-C Rule 18.4 bu uint32_t wait_for_wifi_result : 1; // bit 28 (v11.1.0.4) - SetOption142 - (Wifi) Wait 1 second for wifi connection solving some FRITZ!Box modem issues (1) uint32_t zigbee_no_batt_autoprobe : 1; // bit 29 (v12.0.2.4) - SetOption143 - (Zigbee) Disable Battery auto-probe and using auto-binding uint32_t zigbee_include_time : 1; // bit 30 (v12.0.2.4) - SetOption144 - (Zigbee) Include time in `ZbReceived` messages like other sensors - uint32_t spare31 : 1; // bit 31 + uint32_t mqtt_status_retain : 1; // bit 31 (v12.1.0.1) - CMND_STATUSRETAIN }; } SOBitfield5; diff --git a/tasmota/my_user_config.h b/tasmota/my_user_config.h index 1bc20f805..9f908fcd7 100644 --- a/tasmota/my_user_config.h +++ b/tasmota/my_user_config.h @@ -131,6 +131,7 @@ #define MQTT_SENSOR_RETAIN false // [SensorRetain] Sensor may send retain flag (false = off, true = on) #define MQTT_INFO_RETAIN false // [InfoRetain] Info may send retain flag (false = off, true = on) #define MQTT_STATE_RETAIN false // [StateRetain] State may send retain flag (false = off, true = on) +#define MQTT_STATUS_RETAIN false // [StatusRetain] Status may send retain flag (false = off, true = on) #define MQTT_NO_HOLD_RETAIN false // [SetOption62] Disable retain flag on HOLD messages #define MQTT_NO_RETAIN false // [SetOption104] No Retain - disable all MQTT retained messages, some brokers don't support it: AWS IoT, Losant diff --git a/tasmota/tasmota_support/settings.ino b/tasmota/tasmota_support/settings.ino index 460fc6a42..eade4dff6 100644 --- a/tasmota/tasmota_support/settings.ino +++ b/tasmota/tasmota_support/settings.ino @@ -989,6 +989,7 @@ void SettingsDefaultSet2(void) { flag.mqtt_sensor_retain |= MQTT_SENSOR_RETAIN; flag5.mqtt_info_retain |= MQTT_INFO_RETAIN; flag5.mqtt_state_retain |= MQTT_STATE_RETAIN; + flag5.mqtt_status_retain |= MQTT_STATUS_RETAIN; flag5.mqtt_switches |= MQTT_SWITCHES; flag5.mqtt_persistent |= ~MQTT_CLEAN_SESSION; // flag.mqtt_serial |= 0; diff --git a/tasmota/tasmota_support/support_command.ino b/tasmota/tasmota_support/support_command.ino index 2fa54a43f..6e5d4bf05 100644 --- a/tasmota/tasmota_support/support_command.ino +++ b/tasmota/tasmota_support/support_command.ino @@ -651,7 +651,7 @@ void CmndStatusResponse(uint32_t index) { all_status.replace("}{", ","); char cmnd_status[10]; // STATUS11 snprintf_P(cmnd_status, sizeof(cmnd_status), PSTR(D_CMND_STATUS "0")); - MqttPublishPayloadPrefixTopicRulesProcess_P(STAT, cmnd_status, all_status.c_str()); + MqttPublishPayloadPrefixTopicRulesProcess_P(STAT, cmnd_status, all_status.c_str(), Settings->flag5.mqtt_status_retain); all_status = (const char*) nullptr; } else { if (0 == index) { all_status = ""; } @@ -662,7 +662,7 @@ void CmndStatusResponse(uint32_t index) { char cmnd_status[10]; // STATUS11 char number[4] = { 0 }; snprintf_P(cmnd_status, sizeof(cmnd_status), PSTR(D_CMND_STATUS "%s"), (index) ? itoa(index, number, 10) : ""); - MqttPublishPrefixTopicRulesProcess_P(STAT, cmnd_status); + MqttPublishPrefixTopicRulesProcess_P(STAT, cmnd_status, Settings->flag5.mqtt_status_retain); } } @@ -698,7 +698,7 @@ void CmndStatus(void) D_CMND_BUTTONTOPIC "\":\"%s\",\"" D_CMND_POWER "\":%d,\"" D_CMND_POWERONSTATE "\":%d,\"" D_CMND_LEDSTATE "\":%d,\"" D_CMND_LEDMASK "\":\"%04X\",\"" D_CMND_SAVEDATA "\":%d,\"" D_JSON_SAVESTATE "\":%d,\"" D_CMND_SWITCHTOPIC "\":\"%s\",\"" D_CMND_SWITCHMODE "\":[%s],\"" D_CMND_BUTTONRETAIN "\":%d,\"" D_CMND_SWITCHRETAIN "\":%d,\"" D_CMND_SENSORRETAIN "\":%d,\"" D_CMND_POWERRETAIN "\":%d,\"" - D_CMND_INFORETAIN "\":%d,\"" D_CMND_STATERETAIN "\":%d}}"), + D_CMND_INFORETAIN "\":%d,\"" D_CMND_STATERETAIN "\":%d,\"" D_CMND_STATUSRETAIN "\":%d}}"), ModuleNr(), EscapeJSONString(SettingsText(SET_DEVICENAME)).c_str(), stemp, TasmotaGlobal.mqtt_topic, SettingsText(SET_MQTT_BUTTON_TOPIC), TasmotaGlobal.power, Settings->poweronstate, Settings->ledstate, Settings->ledmask, Settings->save_data, @@ -710,7 +710,9 @@ void CmndStatus(void) Settings->flag.mqtt_sensor_retain, // CMND_SENSORRETAIN Settings->flag.mqtt_power_retain, // CMND_POWERRETAIN Settings->flag5.mqtt_info_retain, // CMND_INFORETAIN - Settings->flag5.mqtt_state_retain); // CMND_STATERETAIN + Settings->flag5.mqtt_state_retain, // CMND_STATERETAIN + Settings->flag5.mqtt_status_retain // CMND_STATUSRETAIN + ); CmndStatusResponse(0); } diff --git a/tasmota/tasmota_xdrv_driver/xdrv_02_9_mqtt.ino b/tasmota/tasmota_xdrv_driver/xdrv_02_9_mqtt.ino index 6867454ca..7430e4ca7 100644 --- a/tasmota/tasmota_xdrv_driver/xdrv_02_9_mqtt.ino +++ b/tasmota/tasmota_xdrv_driver/xdrv_02_9_mqtt.ino @@ -66,7 +66,7 @@ const char kMqttCommands[] PROGMEM = "|" // No prefix D_CMND_MQTTHOST "|" D_CMND_MQTTPORT "|" D_CMND_MQTTRETRY "|" D_CMND_STATETEXT "|" D_CMND_MQTTCLIENT "|" D_CMND_FULLTOPIC "|" D_CMND_PREFIX "|" D_CMND_GROUPTOPIC "|" D_CMND_TOPIC "|" D_CMND_PUBLISH "|" D_CMND_MQTTLOG "|" D_CMND_BUTTONTOPIC "|" D_CMND_SWITCHTOPIC "|" D_CMND_BUTTONRETAIN "|" D_CMND_SWITCHRETAIN "|" D_CMND_POWERRETAIN "|" - D_CMND_SENSORRETAIN "|" D_CMND_INFORETAIN "|" D_CMND_STATERETAIN + D_CMND_SENSORRETAIN "|" D_CMND_INFORETAIN "|" D_CMND_STATERETAIN "|" D_CMND_STATUSRETAIN #endif // FIRMWARE_MINIMAL_ONLY ; @@ -92,8 +92,8 @@ void (* const MqttCommand[])(void) PROGMEM = { #endif // USE_MQTT_FILE &CmndMqttHost, &CmndMqttPort, &CmndMqttRetry, &CmndStateText, &CmndMqttClient, &CmndFullTopic, &CmndPrefix, &CmndGroupTopic, &CmndTopic, &CmndPublish, &CmndMqttlog, - &CmndButtonTopic, &CmndSwitchTopic, &CmndButtonRetain, &CmndSwitchRetain, &CmndPowerRetain, &CmndSensorRetain, - &CmndInfoRetain, &CmndStateRetain + &CmndButtonTopic, &CmndSwitchTopic, &CmndButtonRetain, &CmndSwitchRetain, &CmndPowerRetain, + &CmndSensorRetain, &CmndInfoRetain, &CmndStateRetain, &CmndStatusRetain #endif // FIRMWARE_MINIMAL_ONLY }; @@ -1654,9 +1654,9 @@ void CmndInfoRetain(void) { ResponseClear(); MqttPublishPrefixTopic_P(TELE, PSTR(D_RSLT_INFO), Settings->flag5.mqtt_info_retain); // CMND_INFORETAIN } - Settings->flag5.mqtt_info_retain = XdrvMailbox.payload; // CMND_INFORETAIN + Settings->flag5.mqtt_info_retain = XdrvMailbox.payload; // CMND_INFORETAIN } - ResponseCmndStateText(Settings->flag5.mqtt_info_retain); // CMND_INFORETAIN + ResponseCmndStateText(Settings->flag5.mqtt_info_retain); // CMND_INFORETAIN } void CmndStateRetain(void) { @@ -1665,9 +1665,20 @@ void CmndStateRetain(void) { ResponseClear(); MqttPublishPrefixTopic_P(STAT, PSTR(D_RSLT_STATE), Settings->flag5.mqtt_state_retain); // CMND_STATERETAIN } - Settings->flag5.mqtt_state_retain = XdrvMailbox.payload; // CMND_STATERETAIN + Settings->flag5.mqtt_state_retain = XdrvMailbox.payload; // CMND_STATERETAIN } - ResponseCmndStateText(Settings->flag5.mqtt_state_retain); // CMND_STATERETAIN + ResponseCmndStateText(Settings->flag5.mqtt_state_retain); // CMND_STATERETAIN +} + +void CmndStatusRetain(void) { + if ((XdrvMailbox.payload >= 0) && (XdrvMailbox.payload <= 1)) { + if (!XdrvMailbox.payload) { + ResponseClear(); + MqttPublishPrefixTopic_P(STAT, PSTR(D_RSLT_STATE), Settings->flag5.mqtt_status_retain); // CMND_STATUSRETAIN + } + Settings->flag5.mqtt_status_retain = XdrvMailbox.payload; // CMND_STATUSRETAIN + } + ResponseCmndStateText(Settings->flag5.mqtt_status_retain); // CMND_STATUSRETAIN } /*********************************************************************************************\ diff --git a/tools/decode-status.py b/tools/decode-status.py index b0e162f6e..a33c9782a 100755 --- a/tools/decode-status.py +++ b/tools/decode-status.py @@ -199,7 +199,7 @@ a_setoption = [[ "(Wifi) Wait 1 second for wifi connection solving some FRITZ!Box modem issues (1)", "(Zigbee) Disable Battery auto-probe and using auto-binding", "(Zigbee) Include time in `ZbReceived` messages like other sensors", - "" + "(MQTT) Retain on Status" ],[ "","","","", "","","","", @@ -319,7 +319,7 @@ else: obj = json.load(fp) def StartDecode(): - print ("\n*** decode-status.py v12.0.2.4 by Theo Arends and Jacek Ziolkowski ***") + print ("\n*** decode-status.py v12.1.0.1 by Theo Arends and Jacek Ziolkowski ***") # print("Decoding\n{}".format(obj))