Add command `StatusRetain`

Add command ``StatusRetain`` (#11109)
This commit is contained in:
Theo Arends 2022-08-19 14:24:55 +02:00
parent 49ada1cab9
commit 103808ce44
9 changed files with 32 additions and 14 deletions

View File

@ -7,6 +7,7 @@ All notable changes to this project will be documented in this file.
### Added ### Added
- Zigbee device plugin mechanism with commands ``ZbLoad``, ``ZbUnload`` and ``ZbLoadDump`` (#16252) - Zigbee device plugin mechanism with commands ``ZbLoad``, ``ZbUnload`` and ``ZbLoadDump`` (#16252)
- ESP32-S3 support for internal temperature sensor - ESP32-S3 support for internal temperature sensor
- Command ``StatusRetain`` (#11109)
### Changed ### Changed
- ESP32 NimBLE library from v1.3.6 to v1.4.0 - ESP32 NimBLE library from v1.3.6 to v1.4.0

View File

@ -109,6 +109,7 @@ The latter links can be used for OTA upgrades too like ``OtaUrl http://ota.tasmo
## Changelog v12.1.0.1 ## Changelog v12.1.0.1
### Added ### Added
- Command ``StatusRetain`` (#11109)
- Zigbee device plugin mechanism with commands ``ZbLoad``, ``ZbUnload`` and ``ZbLoadDump`` [#16252](https://github.com/arendst/Tasmota/issues/16252) - 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 - ESP32-S3 support for internal temperature sensor

View File

@ -416,6 +416,7 @@
#define D_CMND_SENSORRETAIN "SensorRetain" #define D_CMND_SENSORRETAIN "SensorRetain"
#define D_CMND_INFORETAIN "InfoRetain" #define D_CMND_INFORETAIN "InfoRetain"
#define D_CMND_STATERETAIN "StateRetain" #define D_CMND_STATERETAIN "StateRetain"
#define D_CMND_STATUSRETAIN "StatusRetain"
#define D_CMND_PUBLISH "Publish" #define D_CMND_PUBLISH "Publish"
#define D_CMND_FILEUPLOAD "FileUpload" #define D_CMND_FILEUPLOAD "FileUpload"
#define D_CMND_FILEDOWNLOAD "FileDownload" #define D_CMND_FILEDOWNLOAD "FileDownload"

View File

@ -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 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_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 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; } SOBitfield5;

View File

@ -131,6 +131,7 @@
#define MQTT_SENSOR_RETAIN false // [SensorRetain] Sensor may send retain flag (false = off, true = on) #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_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_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_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 #define MQTT_NO_RETAIN false // [SetOption104] No Retain - disable all MQTT retained messages, some brokers don't support it: AWS IoT, Losant

View File

@ -989,6 +989,7 @@ void SettingsDefaultSet2(void) {
flag.mqtt_sensor_retain |= MQTT_SENSOR_RETAIN; flag.mqtt_sensor_retain |= MQTT_SENSOR_RETAIN;
flag5.mqtt_info_retain |= MQTT_INFO_RETAIN; flag5.mqtt_info_retain |= MQTT_INFO_RETAIN;
flag5.mqtt_state_retain |= MQTT_STATE_RETAIN; flag5.mqtt_state_retain |= MQTT_STATE_RETAIN;
flag5.mqtt_status_retain |= MQTT_STATUS_RETAIN;
flag5.mqtt_switches |= MQTT_SWITCHES; flag5.mqtt_switches |= MQTT_SWITCHES;
flag5.mqtt_persistent |= ~MQTT_CLEAN_SESSION; flag5.mqtt_persistent |= ~MQTT_CLEAN_SESSION;
// flag.mqtt_serial |= 0; // flag.mqtt_serial |= 0;

View File

@ -651,7 +651,7 @@ void CmndStatusResponse(uint32_t index) {
all_status.replace("}{", ","); all_status.replace("}{", ",");
char cmnd_status[10]; // STATUS11 char cmnd_status[10]; // STATUS11
snprintf_P(cmnd_status, sizeof(cmnd_status), PSTR(D_CMND_STATUS "0")); 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; all_status = (const char*) nullptr;
} else { } else {
if (0 == index) { all_status = ""; } if (0 == index) { all_status = ""; }
@ -662,7 +662,7 @@ void CmndStatusResponse(uint32_t index) {
char cmnd_status[10]; // STATUS11 char cmnd_status[10]; // STATUS11
char number[4] = { 0 }; char number[4] = { 0 };
snprintf_P(cmnd_status, sizeof(cmnd_status), PSTR(D_CMND_STATUS "%s"), (index) ? itoa(index, number, 10) : ""); 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_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_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_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, ModuleNr(), EscapeJSONString(SettingsText(SET_DEVICENAME)).c_str(), stemp, TasmotaGlobal.mqtt_topic,
SettingsText(SET_MQTT_BUTTON_TOPIC), TasmotaGlobal.power, Settings->poweronstate, Settings->ledstate, SettingsText(SET_MQTT_BUTTON_TOPIC), TasmotaGlobal.power, Settings->poweronstate, Settings->ledstate,
Settings->ledmask, Settings->save_data, Settings->ledmask, Settings->save_data,
@ -710,7 +710,9 @@ void CmndStatus(void)
Settings->flag.mqtt_sensor_retain, // CMND_SENSORRETAIN Settings->flag.mqtt_sensor_retain, // CMND_SENSORRETAIN
Settings->flag.mqtt_power_retain, // CMND_POWERRETAIN Settings->flag.mqtt_power_retain, // CMND_POWERRETAIN
Settings->flag5.mqtt_info_retain, // CMND_INFORETAIN 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); CmndStatusResponse(0);
} }

View File

@ -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_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_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_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 #endif // FIRMWARE_MINIMAL_ONLY
; ;
@ -92,8 +92,8 @@ void (* const MqttCommand[])(void) PROGMEM = {
#endif // USE_MQTT_FILE #endif // USE_MQTT_FILE
&CmndMqttHost, &CmndMqttPort, &CmndMqttRetry, &CmndStateText, &CmndMqttClient, &CmndMqttHost, &CmndMqttPort, &CmndMqttRetry, &CmndStateText, &CmndMqttClient,
&CmndFullTopic, &CmndPrefix, &CmndGroupTopic, &CmndTopic, &CmndPublish, &CmndMqttlog, &CmndFullTopic, &CmndPrefix, &CmndGroupTopic, &CmndTopic, &CmndPublish, &CmndMqttlog,
&CmndButtonTopic, &CmndSwitchTopic, &CmndButtonRetain, &CmndSwitchRetain, &CmndPowerRetain, &CmndSensorRetain, &CmndButtonTopic, &CmndSwitchTopic, &CmndButtonRetain, &CmndSwitchRetain, &CmndPowerRetain,
&CmndInfoRetain, &CmndStateRetain &CmndSensorRetain, &CmndInfoRetain, &CmndStateRetain, &CmndStatusRetain
#endif // FIRMWARE_MINIMAL_ONLY #endif // FIRMWARE_MINIMAL_ONLY
}; };
@ -1654,9 +1654,9 @@ void CmndInfoRetain(void) {
ResponseClear(); ResponseClear();
MqttPublishPrefixTopic_P(TELE, PSTR(D_RSLT_INFO), Settings->flag5.mqtt_info_retain); // CMND_INFORETAIN 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) { void CmndStateRetain(void) {
@ -1665,9 +1665,20 @@ void CmndStateRetain(void) {
ResponseClear(); ResponseClear();
MqttPublishPrefixTopic_P(STAT, PSTR(D_RSLT_STATE), Settings->flag5.mqtt_state_retain); // CMND_STATERETAIN 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
} }
/*********************************************************************************************\ /*********************************************************************************************\

View File

@ -199,7 +199,7 @@ a_setoption = [[
"(Wifi) Wait 1 second for wifi connection solving some FRITZ!Box modem issues (1)", "(Wifi) Wait 1 second for wifi connection solving some FRITZ!Box modem issues (1)",
"(Zigbee) Disable Battery auto-probe and using auto-binding", "(Zigbee) Disable Battery auto-probe and using auto-binding",
"(Zigbee) Include time in `ZbReceived` messages like other sensors", "(Zigbee) Include time in `ZbReceived` messages like other sensors",
"" "(MQTT) Retain on Status"
],[ ],[
"","","","", "","","","",
"","","","", "","","","",
@ -319,7 +319,7 @@ else:
obj = json.load(fp) obj = json.load(fp)
def StartDecode(): 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)) # print("Decoding\n{}".format(obj))