Add command `RfTimeout` to Sonoff RFBridge (#20937)

This commit is contained in:
Theo Arends 2024-03-14 17:21:09 +01:00
parent 0ac0dda5ba
commit cc8614da9c
3 changed files with 33 additions and 22 deletions

View File

@ -586,10 +586,11 @@
#define D_JSON_IRRECEIVED "IrReceived" #define D_JSON_IRRECEIVED "IrReceived"
// Commands xdrv_06_snfbridge.ino // Commands xdrv_06_snfbridge.ino
#define D_CMND_RFCODE "RfCode" #define D_CMND_PREFIX_RF "Rf"
#define D_CMND_RFHIGH "RfHigh" #define D_CMND_RFCODE "Code"
#define D_CMND_RFHOST "RfHost" #define D_CMND_RFHIGH "High"
#define D_CMND_RFKEY "RfKey" #define D_CMND_RFHOST "Host"
#define D_CMND_RFKEY "Key"
#define D_JSON_START_LEARNING "Start learning" #define D_JSON_START_LEARNING "Start learning"
#define D_JSON_SET_TO_DEFAULT "Set to default" #define D_JSON_SET_TO_DEFAULT "Set to default"
#define D_JSON_DEFAULT_SENT "Default sent" #define D_JSON_DEFAULT_SENT "Default sent"
@ -597,10 +598,11 @@
#define D_JSON_LEARNING_ACTIVE "Learning active" #define D_JSON_LEARNING_ACTIVE "Learning active"
#define D_JSON_LEARN_FAILED "Learn failed" #define D_JSON_LEARN_FAILED "Learn failed"
#define D_JSON_LEARNED "Learned" #define D_JSON_LEARNED "Learned"
#define D_CMND_RFLOW "RfLow" #define D_CMND_RFLOW "Low"
#define D_CMND_RFSYNC "RfSync" #define D_CMND_RFSYNC "Sync"
#define D_JSON_RFRECEIVED "RfReceived" #define D_JSON_RFRECEIVED "RfReceived"
#define D_CMND_RFRAW "RfRaw" #define D_CMND_RFRAW "Raw"
#define D_CMND_RFTIMEOUT "Timeout"
// Commands xdrv_08_serial_bridge.ino // Commands xdrv_08_serial_bridge.ino
#define D_CMND_SSERIALSEND "SSerialSend" #define D_CMND_SSERIALSEND "SSerialSend"

View File

@ -24,16 +24,16 @@
#define XDRV_06 6 #define XDRV_06 6
const uint32_t SFB_TIME_AVOID_DUPLICATE = 2000; // Milliseconds #define SFB_TIME_AVOID_DUPLICATE 2000 // Milliseconds
enum SonoffBridgeCommands { enum SonoffBridgeCommands {
CMND_RFSYNC, CMND_RFLOW, CMND_RFHIGH, CMND_RFHOST, CMND_RFCODE }; CMND_RFSYNC, CMND_RFLOW, CMND_RFHIGH, CMND_RFHOST, CMND_RFCODE };
const char kSonoffBridgeCommands[] PROGMEM = "|" // No prefix const char kSonoffBridgeCommands[] PROGMEM = D_CMND_PREFIX_RF "|" // Prefix
D_CMND_RFSYNC "|" D_CMND_RFLOW "|" D_CMND_RFHIGH "|" D_CMND_RFHOST "|" D_CMND_RFCODE "|" D_CMND_RFKEY "|" D_CMND_RFRAW; D_CMND_RFSYNC "|" D_CMND_RFLOW "|" D_CMND_RFHIGH "|" D_CMND_RFHOST "|" D_CMND_RFCODE "|" D_CMND_RFKEY "|" D_CMND_RFRAW "|" D_CMND_RFTIMEOUT;
void (* const SonoffBridgeCommand[])(void) PROGMEM = { void (* const SonoffBridgeCommand[])(void) PROGMEM = {
&CmndRfBridge, &CmndRfBridge, &CmndRfBridge, &CmndRfBridge, &CmndRfBridge, &CmndRfKey, &CmndRfRaw }; &CmndRfBridge, &CmndRfBridge, &CmndRfBridge, &CmndRfBridge, &CmndRfBridge, &CmndRfKey, &CmndRfRaw, &CmndRfTimeout };
struct SONOFFBRIDGE { struct SONOFFBRIDGE {
uint32_t last_received_id = 0; uint32_t last_received_id = 0;
@ -165,7 +165,7 @@ void SonoffBridgeReceivedRaw(void)
if (0xB1 == TasmotaGlobal.serial_in_buffer[1]) { buckets = TasmotaGlobal.serial_in_buffer[2] << 1; } // Bucket sniffing if (0xB1 == TasmotaGlobal.serial_in_buffer[1]) { buckets = TasmotaGlobal.serial_in_buffer[2] << 1; } // Bucket sniffing
ResponseTime_P(PSTR(",\"" D_CMND_RFRAW "\":{\"" D_JSON_DATA "\":\"")); ResponseTime_P(PSTR(",\"" D_CMND_PREFIX_RF D_CMND_RFRAW "\":{\"" D_JSON_DATA "\":\""));
for (uint32_t i = 0; i < TasmotaGlobal.serial_in_byte_counter; i++) { for (uint32_t i = 0; i < TasmotaGlobal.serial_in_byte_counter; i++) {
ResponseAppend_P(PSTR("%02X"), TasmotaGlobal.serial_in_buffer[i]); ResponseAppend_P(PSTR("%02X"), TasmotaGlobal.serial_in_buffer[i]);
if (0xB1 == TasmotaGlobal.serial_in_buffer[1]) { if (0xB1 == TasmotaGlobal.serial_in_buffer[1]) {
@ -176,7 +176,7 @@ void SonoffBridgeReceivedRaw(void)
} }
} }
ResponseAppend_P(PSTR("\"}}")); ResponseAppend_P(PSTR("\"}}"));
MqttPublishPrefixTopicRulesProcess_P(RESULT_OR_TELE, PSTR(D_CMND_RFRAW)); MqttPublishPrefixTopicRulesProcess_P(RESULT_OR_TELE, PSTR(D_CMND_PREFIX_RF D_CMND_RFRAW));
} }
/********************************************************************************************/ /********************************************************************************************/
@ -184,8 +184,8 @@ void SonoffBridgeReceivedRaw(void)
void SonoffBridgeLearnFailed(void) void SonoffBridgeLearnFailed(void)
{ {
SnfBridge.learn_active = 0; SnfBridge.learn_active = 0;
Response_P(S_JSON_COMMAND_INDEX_SVALUE, D_CMND_RFKEY, SnfBridge.learn_key, D_JSON_LEARN_FAILED); Response_P(S_JSON_COMMAND_INDEX_SVALUE, D_CMND_PREFIX_RF D_CMND_RFKEY, SnfBridge.learn_key, D_JSON_LEARN_FAILED);
MqttPublishPrefixTopicRulesProcess_P(RESULT_OR_STAT, PSTR(D_CMND_RFKEY)); MqttPublishPrefixTopicRulesProcess_P(RESULT_OR_STAT, PSTR(D_CMND_PREFIX_RF D_CMND_RFKEY));
} }
void SonoffBridgeReceived(void) void SonoffBridgeReceived(void)
@ -210,8 +210,8 @@ void SonoffBridgeReceived(void)
for (uint32_t i = 0; i < 9; i++) { for (uint32_t i = 0; i < 9; i++) {
Settings->rf_code[SnfBridge.learn_key][i] = TasmotaGlobal.serial_in_buffer[i +1]; Settings->rf_code[SnfBridge.learn_key][i] = TasmotaGlobal.serial_in_buffer[i +1];
} }
Response_P(S_JSON_COMMAND_INDEX_SVALUE, D_CMND_RFKEY, SnfBridge.learn_key, D_JSON_LEARNED); Response_P(S_JSON_COMMAND_INDEX_SVALUE, D_CMND_PREFIX_RF D_CMND_RFKEY, SnfBridge.learn_key, D_JSON_LEARNED);
MqttPublishPrefixTopicRulesProcess_P(RESULT_OR_STAT, PSTR(D_CMND_RFKEY)); MqttPublishPrefixTopicRulesProcess_P(RESULT_OR_STAT, PSTR(D_CMND_PREFIX_RF D_CMND_RFKEY));
} else { } else {
SonoffBridgeLearnFailed(); SonoffBridgeLearnFailed();
} }
@ -226,7 +226,7 @@ void SonoffBridgeReceived(void)
received_id = TasmotaGlobal.serial_in_buffer[7] << 16 | TasmotaGlobal.serial_in_buffer[8] << 8 | TasmotaGlobal.serial_in_buffer[9]; received_id = TasmotaGlobal.serial_in_buffer[7] << 16 | TasmotaGlobal.serial_in_buffer[8] << 8 | TasmotaGlobal.serial_in_buffer[9];
unsigned long now = millis(); unsigned long now = millis();
if (!((received_id == SnfBridge.last_received_id) && (now - SnfBridge.last_time < SFB_TIME_AVOID_DUPLICATE))) { if (!((received_id == SnfBridge.last_received_id) && (now - SnfBridge.last_time < Settings->rf_duplicate_time))) {
SnfBridge.last_received_id = received_id; SnfBridge.last_received_id = received_id;
SnfBridge.last_time = now; SnfBridge.last_time = now;
strncpy_P(rfkey, PSTR("\"" D_JSON_NONE "\""), sizeof(rfkey)); strncpy_P(rfkey, PSTR("\"" D_JSON_NONE "\""), sizeof(rfkey));
@ -244,7 +244,7 @@ void SonoffBridgeReceived(void)
} else { } else {
snprintf_P(stemp, sizeof(stemp), PSTR("\"%06X\""), received_id); snprintf_P(stemp, sizeof(stemp), PSTR("\"%06X\""), received_id);
} }
ResponseTime_P(PSTR(",\"" D_JSON_RFRECEIVED "\":{\"" D_JSON_SYNC "\":%d,\"" D_JSON_LOW "\":%d,\"" D_JSON_HIGH "\":%d,\"" D_JSON_DATA "\":%s,\"" D_CMND_RFKEY "\":%s}}"), ResponseTime_P(PSTR(",\"" D_JSON_RFRECEIVED "\":{\"" D_JSON_SYNC "\":%d,\"" D_JSON_LOW "\":%d,\"" D_JSON_HIGH "\":%d,\"" D_JSON_DATA "\":%s,\"" D_CMND_PREFIX_RF D_CMND_RFKEY "\":%s}}"),
sync_time, low_time, high_time, stemp, rfkey); sync_time, low_time, high_time, stemp, rfkey);
MqttPublishPrefixTopicRulesProcess_P(RESULT_OR_TELE, PSTR(D_JSON_RFRECEIVED)); MqttPublishPrefixTopicRulesProcess_P(RESULT_OR_TELE, PSTR(D_JSON_RFRECEIVED));
#ifdef USE_DOMOTICZ #ifdef USE_DOMOTICZ
@ -504,6 +504,13 @@ void CmndRfRaw(void)
ResponseCmndStateText(SnfBridge.receive_raw_flag); ResponseCmndStateText(SnfBridge.receive_raw_flag);
} }
void CmndRfTimeout(void) {
if (XdrvMailbox.payload >= 10) {
Settings->rf_duplicate_time = XdrvMailbox.payload;
}
ResponseCmndNumber(Settings->rf_duplicate_time);
}
#ifdef USE_WEBSERVER #ifdef USE_WEBSERVER
void SonoffBridgeAddButton(void) { void SonoffBridgeAddButton(void) {
@ -527,7 +534,7 @@ void SonoffBridgeWebGetArg(void) {
WebGetArg(PSTR("k"), tmp, sizeof(tmp)); // 1 - 16 Pre defined RF keys WebGetArg(PSTR("k"), tmp, sizeof(tmp)); // 1 - 16 Pre defined RF keys
if (strlen(tmp)) { if (strlen(tmp)) {
char command[20]; char command[20];
snprintf_P(command, sizeof(command), PSTR(D_CMND_RFKEY "%s"), tmp); snprintf_P(command, sizeof(command), PSTR(D_CMND_PREFIX_RF D_CMND_RFKEY "%s"), tmp);
ExecuteWebCommand(command); ExecuteWebCommand(command);
} }
} }
@ -560,6 +567,9 @@ bool Xdrv06(uint32_t function)
break; break;
#endif // USE_WEBSERVER #endif // USE_WEBSERVER
case FUNC_INIT: case FUNC_INIT:
if (Settings->rf_duplicate_time < 10) {
Settings->rf_duplicate_time = SFB_TIME_AVOID_DUPLICATE;
}
SnfBridge.receive_raw_flag = 0; SnfBridge.receive_raw_flag = 0;
SonoffBridgeSendCommand(0xA7); // Stop reading RF signals enabling iTead default RF handling SonoffBridgeSendCommand(0xA7); // Stop reading RF signals enabling iTead default RF handling
break; break;

View File

@ -29,13 +29,12 @@
#define D_CMND_RFSEND "Send" #define D_CMND_RFSEND "Send"
#define D_CMND_RFPROTOCOL "Protocol" #define D_CMND_RFPROTOCOL "Protocol"
#define D_CMND_RFTIMEOUT "TimeOut"
#define D_JSON_RF_PULSE "Pulse" #define D_JSON_RF_PULSE "Pulse"
#define D_JSON_RF_REPEAT "Repeat" #define D_JSON_RF_REPEAT "Repeat"
#define D_JSON_NONE_ENABLED "None Enabled" #define D_JSON_NONE_ENABLED "None Enabled"
const char kRfCommands[] PROGMEM = "Rf|" // No prefix const char kRfCommands[] PROGMEM = D_CMND_PREFIX_RF "|" // Prefix
D_CMND_RFSEND "|" D_CMND_RFPROTOCOL "|" D_CMND_RFTIMEOUT; D_CMND_RFSEND "|" D_CMND_RFPROTOCOL "|" D_CMND_RFTIMEOUT;
void (* const RfCommands[])(void) PROGMEM = { void (* const RfCommands[])(void) PROGMEM = {