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
- 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

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
### 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

View File

@ -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"

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 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;

View File

@ -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

View File

@ -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;

View File

@ -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);
}

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_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
}
/*********************************************************************************************\

View File

@ -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))