mirror of
https://github.com/arendst/Tasmota.git
synced 2025-07-24 19:26:37 +00:00
Add rule support for IrReceive and RfReceive
5.14.0b * Add rule support for IrReceive and RfReceive (#2758)
This commit is contained in:
parent
ca08b77aad
commit
9f329d5fb0
@ -1,5 +1,6 @@
|
|||||||
/* 5.14.0b
|
/* 5.14.0b
|
||||||
* Increase rule storage space to 3 rule sets of 512 characters using commands rule1, rule2 and rule3
|
* Add two rule sets of 511 characters using commands rule1, rule2 and rule3
|
||||||
|
* Add rule support for IrReceive and RfReceive (#2758)
|
||||||
*
|
*
|
||||||
* 5.14.0a
|
* 5.14.0a
|
||||||
* Add feature information to Status 4
|
* Add feature information to Status 4
|
||||||
|
@ -889,7 +889,6 @@ void SettingsDelta()
|
|||||||
Settings.longitude = (int)((double)LONGITUDE * 1000000);
|
Settings.longitude = (int)((double)LONGITUDE * 1000000);
|
||||||
}
|
}
|
||||||
if (Settings.version < 0x050C000B) {
|
if (Settings.version < 0x050C000B) {
|
||||||
// memset(&Settings.rules, 0x00, sizeof(Settings.rules));
|
|
||||||
Settings.rules[0][0] = '\0';
|
Settings.rules[0][0] = '\0';
|
||||||
}
|
}
|
||||||
if (Settings.version < 0x050C000D) {
|
if (Settings.version < 0x050C000D) {
|
||||||
|
@ -188,7 +188,7 @@ enum LichtSubtypes {LST_NONE, LST_SINGLE, LST_COLDWARM, LST_RGB, LST_RGBW, LST_R
|
|||||||
enum LichtSchemes {LS_POWER, LS_WAKEUP, LS_CYCLEUP, LS_CYCLEDN, LS_RANDOM, LS_MAX};
|
enum LichtSchemes {LS_POWER, LS_WAKEUP, LS_CYCLEUP, LS_CYCLEDN, LS_RANDOM, LS_MAX};
|
||||||
|
|
||||||
enum XsnsFunctions {FUNC_INIT, FUNC_LOOP, FUNC_EVERY_50_MSECOND, FUNC_EVERY_SECOND, FUNC_PREP_BEFORE_TELEPERIOD, FUNC_JSON_APPEND, FUNC_WEB_APPEND, FUNC_SAVE_BEFORE_RESTART,
|
enum XsnsFunctions {FUNC_INIT, FUNC_LOOP, FUNC_EVERY_50_MSECOND, FUNC_EVERY_SECOND, FUNC_PREP_BEFORE_TELEPERIOD, FUNC_JSON_APPEND, FUNC_WEB_APPEND, FUNC_SAVE_BEFORE_RESTART,
|
||||||
FUNC_COMMAND, FUNC_MQTT_SUBSCRIBE, FUNC_MQTT_INIT, FUNC_MQTT_DATA, FUNC_SET_POWER, FUNC_SHOW_SENSOR};
|
FUNC_COMMAND, FUNC_MQTT_SUBSCRIBE, FUNC_MQTT_INIT, FUNC_MQTT_DATA, FUNC_SET_POWER, FUNC_SHOW_SENSOR, FUNC_RULES_PROCESS};
|
||||||
|
|
||||||
const uint8_t kDefaultRfCode[9] PROGMEM = { 0x21, 0x16, 0x01, 0x0E, 0x03, 0x48, 0x2E, 0x1A, 0x00 };
|
const uint8_t kDefaultRfCode[9] PROGMEM = { 0x21, 0x16, 0x01, 0x0E, 0x03, 0x48, 0x2E, 0x1A, 0x00 };
|
||||||
|
|
||||||
|
@ -1177,11 +1177,9 @@ boolean SendKey(byte key, byte device, byte state)
|
|||||||
MqttPublishDirect(stopic, (key) ? Settings.flag.mqtt_switch_retain : Settings.flag.mqtt_button_retain);
|
MqttPublishDirect(stopic, (key) ? Settings.flag.mqtt_switch_retain : Settings.flag.mqtt_button_retain);
|
||||||
#endif // USE_DOMOTICZ
|
#endif // USE_DOMOTICZ
|
||||||
result = true;
|
result = true;
|
||||||
#ifdef USE_RULES
|
|
||||||
} else {
|
} else {
|
||||||
snprintf_P(mqtt_data, sizeof(mqtt_data), PSTR("{\"%s%d\":{\"State\":%d}}"), (key) ? "Switch" : "Button", device, state);
|
snprintf_P(mqtt_data, sizeof(mqtt_data), PSTR("{\"%s%d\":{\"State\":%d}}"), (key) ? "Switch" : "Button", device, state);
|
||||||
result = RulesProcess();
|
result = XdrvRulesProcess();
|
||||||
#endif // USE_RULES
|
|
||||||
}
|
}
|
||||||
#ifdef USE_KNX
|
#ifdef USE_KNX
|
||||||
KnxSendButtonPower(key, device, state);
|
KnxSendButtonPower(key, device, state);
|
||||||
@ -1300,11 +1298,11 @@ void ExecuteCommand(char *cmnd)
|
|||||||
|
|
||||||
void PublishStatus(uint8_t payload)
|
void PublishStatus(uint8_t payload)
|
||||||
{
|
{
|
||||||
uint8_t option = 1;
|
uint8_t option = STAT;
|
||||||
char stemp[MAX_FRIENDLYNAMES * (sizeof(Settings.friendlyname[0]) +4)];
|
char stemp[MAX_FRIENDLYNAMES * (sizeof(Settings.friendlyname[0]) +4)];
|
||||||
|
|
||||||
// Workaround MQTT - TCP/IP stack queueing when SUB_PREFIX = PUB_PREFIX
|
// Workaround MQTT - TCP/IP stack queueing when SUB_PREFIX = PUB_PREFIX
|
||||||
if (!strcmp(Settings.mqtt_prefix[0],Settings.mqtt_prefix[1]) && (!payload)) option++;
|
if (!strcmp(Settings.mqtt_prefix[0],Settings.mqtt_prefix[1]) && (!payload)) option++; // TELE
|
||||||
|
|
||||||
if ((!Settings.flag.mqtt_enabled) && (6 == payload)) payload = 99;
|
if ((!Settings.flag.mqtt_enabled) && (6 == payload)) payload = 99;
|
||||||
if (!energy_flg && (9 == payload)) payload = 99;
|
if (!energy_flg && (9 == payload)) payload = 99;
|
||||||
@ -2168,6 +2166,7 @@ void SerialInput()
|
|||||||
serial_in_buffer[serial_in_byte_counter] = 0; // serial data completed
|
serial_in_buffer[serial_in_byte_counter] = 0; // serial data completed
|
||||||
snprintf_P(mqtt_data, sizeof(mqtt_data), PSTR("{\"" D_JSON_SERIALRECEIVED "\":\"%s\"}"), serial_in_buffer);
|
snprintf_P(mqtt_data, sizeof(mqtt_data), PSTR("{\"" D_JSON_SERIALRECEIVED "\":\"%s\"}"), serial_in_buffer);
|
||||||
MqttPublishPrefixTopic_P(RESULT_OR_TELE, PSTR(D_JSON_SERIALRECEIVED));
|
MqttPublishPrefixTopic_P(RESULT_OR_TELE, PSTR(D_JSON_SERIALRECEIVED));
|
||||||
|
// XdrvRulesProcess();
|
||||||
serial_in_byte_counter = 0;
|
serial_in_byte_counter = 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1700,14 +1700,12 @@ void RtcSecond()
|
|||||||
snprintf_P(log_data, sizeof(log_data), PSTR(D_LOG_APPLICATION "(" D_UTC_TIME ") %s, (" D_DST_TIME ") %s, (" D_STD_TIME ") %s"),
|
snprintf_P(log_data, sizeof(log_data), PSTR(D_LOG_APPLICATION "(" D_UTC_TIME ") %s, (" D_DST_TIME ") %s, (" D_STD_TIME ") %s"),
|
||||||
GetTime(0).c_str(), GetTime(2).c_str(), GetTime(3).c_str());
|
GetTime(0).c_str(), GetTime(2).c_str(), GetTime(3).c_str());
|
||||||
AddLog(LOG_LEVEL_DEBUG);
|
AddLog(LOG_LEVEL_DEBUG);
|
||||||
#ifdef USE_RULES
|
|
||||||
if (local_time < 1451602800) { // 2016-01-01
|
if (local_time < 1451602800) { // 2016-01-01
|
||||||
strncpy_P(mqtt_data, PSTR("{\"Time\":{\"Initialized\":1}}"), sizeof(mqtt_data));
|
strncpy_P(mqtt_data, PSTR("{\"Time\":{\"Initialized\":1}}"), sizeof(mqtt_data));
|
||||||
} else {
|
} else {
|
||||||
strncpy_P(mqtt_data, PSTR("{\"Time\":{\"Set\":1}}"), sizeof(mqtt_data));
|
strncpy_P(mqtt_data, PSTR("{\"Time\":{\"Set\":1}}"), sizeof(mqtt_data));
|
||||||
}
|
}
|
||||||
RulesProcess();
|
XdrvRulesProcess();
|
||||||
#endif // USE_RULES
|
|
||||||
} else {
|
} else {
|
||||||
ntp_sync_minute++; // Try again in next minute
|
ntp_sync_minute++; // Try again in next minute
|
||||||
}
|
}
|
||||||
@ -1788,7 +1786,7 @@ void AdcEvery50ms()
|
|||||||
adc_last_value = new_value;
|
adc_last_value = new_value;
|
||||||
uint16_t value = adc_last_value / 10;
|
uint16_t value = adc_last_value / 10;
|
||||||
snprintf_P(mqtt_data, sizeof(mqtt_data), PSTR("{\"ANALOG\":{\"A0div10\":%d}}"), (value > 99) ? 100 : value);
|
snprintf_P(mqtt_data, sizeof(mqtt_data), PSTR("{\"ANALOG\":{\"A0div10\":%d}}"), (value > 99) ? 100 : value);
|
||||||
RulesProcess();
|
XdrvRulesProcess();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -315,10 +315,8 @@ void MqttDisconnected(int state)
|
|||||||
snprintf_P(log_data, sizeof(log_data), PSTR(D_LOG_MQTT D_CONNECT_FAILED_TO " %s:%d, rc %d. " D_RETRY_IN " %d " D_UNIT_SECOND),
|
snprintf_P(log_data, sizeof(log_data), PSTR(D_LOG_MQTT D_CONNECT_FAILED_TO " %s:%d, rc %d. " D_RETRY_IN " %d " D_UNIT_SECOND),
|
||||||
Settings.mqtt_host, Settings.mqtt_port, state, mqtt_retry_counter);
|
Settings.mqtt_host, Settings.mqtt_port, state, mqtt_retry_counter);
|
||||||
AddLog(LOG_LEVEL_INFO);
|
AddLog(LOG_LEVEL_INFO);
|
||||||
#ifdef USE_RULES
|
|
||||||
strncpy_P(mqtt_data, PSTR("{\"MQTT\":{\"Disconnected\":1}}"), sizeof(mqtt_data));
|
strncpy_P(mqtt_data, PSTR("{\"MQTT\":{\"Disconnected\":1}}"), sizeof(mqtt_data));
|
||||||
RulesProcess();
|
XdrvRulesProcess();
|
||||||
#endif // USE_RULES
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void MqttConnected()
|
void MqttConnected()
|
||||||
@ -370,17 +368,13 @@ void MqttConnected()
|
|||||||
tele_period = Settings.tele_period -9;
|
tele_period = Settings.tele_period -9;
|
||||||
}
|
}
|
||||||
status_update_timer = 2;
|
status_update_timer = 2;
|
||||||
#ifdef USE_RULES
|
|
||||||
strncpy_P(mqtt_data, PSTR("{\"System\":{\"Boot\":1}}"), sizeof(mqtt_data));
|
strncpy_P(mqtt_data, PSTR("{\"System\":{\"Boot\":1}}"), sizeof(mqtt_data));
|
||||||
RulesProcess();
|
XdrvRulesProcess();
|
||||||
#endif // USE_RULES
|
|
||||||
XdrvCall(FUNC_MQTT_INIT);
|
XdrvCall(FUNC_MQTT_INIT);
|
||||||
}
|
}
|
||||||
mqtt_initial_connection_state = 0;
|
mqtt_initial_connection_state = 0;
|
||||||
#ifdef USE_RULES
|
|
||||||
strncpy_P(mqtt_data, PSTR("{\"MQTT\":{\"Connected\":1}}"), sizeof(mqtt_data));
|
strncpy_P(mqtt_data, PSTR("{\"MQTT\":{\"Connected\":1}}"), sizeof(mqtt_data));
|
||||||
RulesProcess();
|
XdrvRulesProcess();
|
||||||
#endif // USE_RULES
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef USE_MQTT_TLS
|
#ifdef USE_MQTT_TLS
|
||||||
|
@ -110,6 +110,7 @@ void IrReceiveCheck()
|
|||||||
snprintf_P(mqtt_data, sizeof(mqtt_data), PSTR("{\"" D_JSON_IRRECEIVED "\":{\"" D_JSON_IR_PROTOCOL "\":\"%s\",\"" D_JSON_IR_BITS "\":%d,\"" D_JSON_IR_DATA "\":\"%lX\"}}"),
|
snprintf_P(mqtt_data, sizeof(mqtt_data), PSTR("{\"" D_JSON_IRRECEIVED "\":{\"" D_JSON_IR_PROTOCOL "\":\"%s\",\"" D_JSON_IR_BITS "\":%d,\"" D_JSON_IR_DATA "\":\"%lX\"}}"),
|
||||||
GetTextIndexed(sirtype, sizeof(sirtype), iridx, kIrRemoteProtocols), results.bits, (uint32_t)results.value);
|
GetTextIndexed(sirtype, sizeof(sirtype), iridx, kIrRemoteProtocols), results.bits, (uint32_t)results.value);
|
||||||
MqttPublishPrefixTopic_P(RESULT_OR_TELE, PSTR(D_JSON_IRRECEIVED));
|
MqttPublishPrefixTopic_P(RESULT_OR_TELE, PSTR(D_JSON_IRRECEIVED));
|
||||||
|
XdrvRulesProcess();
|
||||||
#ifdef USE_DOMOTICZ
|
#ifdef USE_DOMOTICZ
|
||||||
unsigned long value = results.value | (iridx << 28); // [Protocol:4, Data:28]
|
unsigned long value = results.value | (iridx << 28); // [Protocol:4, Data:28]
|
||||||
DomoticzSensor(DZ_COUNT, value); // Send data as Domoticz Counter value
|
DomoticzSensor(DZ_COUNT, value); // Send data as Domoticz Counter value
|
||||||
|
@ -97,6 +97,7 @@ void SonoffBridgeReceived()
|
|||||||
snprintf_P(mqtt_data, sizeof(mqtt_data), PSTR("{\"" D_JSON_RFRECEIVED "\":{\"" D_JSON_SYNC "\":%d,\"" D_JSON_LOW "\":%d,\"" D_JSON_HIGH "\":%d,\"" D_JSON_DATA "\":\"%06X\",\"" D_CMND_RFKEY "\":%s}}"),
|
snprintf_P(mqtt_data, sizeof(mqtt_data), PSTR("{\"" D_JSON_RFRECEIVED "\":{\"" D_JSON_SYNC "\":%d,\"" D_JSON_LOW "\":%d,\"" D_JSON_HIGH "\":%d,\"" D_JSON_DATA "\":\"%06X\",\"" D_CMND_RFKEY "\":%s}}"),
|
||||||
sync_time, low_time, high_time, received_id, rfkey);
|
sync_time, low_time, high_time, received_id, rfkey);
|
||||||
MqttPublishPrefixTopic_P(RESULT_OR_TELE, PSTR(D_JSON_RFRECEIVED));
|
MqttPublishPrefixTopic_P(RESULT_OR_TELE, PSTR(D_JSON_RFRECEIVED));
|
||||||
|
XdrvRulesProcess();
|
||||||
#ifdef USE_DOMOTICZ
|
#ifdef USE_DOMOTICZ
|
||||||
DomoticzSensor(DZ_COUNT, received_id); // Send rid as Domoticz Counter value
|
DomoticzSensor(DZ_COUNT, received_id); // Send rid as Domoticz Counter value
|
||||||
#endif // USE_DOMOTICZ
|
#endif // USE_DOMOTICZ
|
||||||
|
@ -61,6 +61,7 @@ void SerialBridgeInput()
|
|||||||
serial_bridge_buffer[serial_bridge_in_byte_counter] = 0; // serial data completed
|
serial_bridge_buffer[serial_bridge_in_byte_counter] = 0; // serial data completed
|
||||||
snprintf_P(mqtt_data, sizeof(mqtt_data), PSTR("{\"" D_JSON_SSERIALRECEIVED "\":\"%s\"}"), serial_bridge_buffer);
|
snprintf_P(mqtt_data, sizeof(mqtt_data), PSTR("{\"" D_JSON_SSERIALRECEIVED "\":\"%s\"}"), serial_bridge_buffer);
|
||||||
MqttPublishPrefixTopic_P(RESULT_OR_TELE, PSTR(D_JSON_SSERIALRECEIVED));
|
MqttPublishPrefixTopic_P(RESULT_OR_TELE, PSTR(D_JSON_SSERIALRECEIVED));
|
||||||
|
// XdrvRulesProcess();
|
||||||
serial_bridge_in_byte_counter = 0;
|
serial_bridge_in_byte_counter = 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -287,7 +287,7 @@ void TimerEverySecond()
|
|||||||
#ifdef USE_RULES
|
#ifdef USE_RULES
|
||||||
if (3 == xtimer.power) { // Blink becomes Rule disregarding device and allowing use of Backlog commands
|
if (3 == xtimer.power) { // Blink becomes Rule disregarding device and allowing use of Backlog commands
|
||||||
snprintf_P(mqtt_data, sizeof(mqtt_data), PSTR("{\"Clock\":{\"Timer\":%d}}"), i +1);
|
snprintf_P(mqtt_data, sizeof(mqtt_data), PSTR("{\"Clock\":{\"Timer\":%d}}"), i +1);
|
||||||
RulesProcess();
|
XdrvRulesProcess();
|
||||||
} else
|
} else
|
||||||
#endif // USE_RULES
|
#endif // USE_RULES
|
||||||
if (devices_present) { ExecuteCommandPower(xtimer.device +1, xtimer.power); }
|
if (devices_present) { ExecuteCommandPower(xtimer.device +1, xtimer.power); }
|
||||||
|
@ -80,8 +80,6 @@
|
|||||||
enum RulesCommands { CMND_RULE, CMND_RULETIMER, CMND_EVENT, CMND_VAR, CMND_MEM };
|
enum RulesCommands { CMND_RULE, CMND_RULETIMER, CMND_EVENT, CMND_VAR, CMND_MEM };
|
||||||
const char kRulesCommands[] PROGMEM = D_CMND_RULE "|" D_CMND_RULETIMER "|" D_CMND_EVENT "|" D_CMND_VAR "|" D_CMND_MEM ;
|
const char kRulesCommands[] PROGMEM = D_CMND_RULE "|" D_CMND_RULETIMER "|" D_CMND_EVENT "|" D_CMND_VAR "|" D_CMND_MEM ;
|
||||||
|
|
||||||
char rules[MAX_RULE_SIZE];
|
|
||||||
|
|
||||||
String rules_event_value;
|
String rules_event_value;
|
||||||
unsigned long rules_timer[MAX_RULE_TIMERS] = { 0 };
|
unsigned long rules_timer[MAX_RULE_TIMERS] = { 0 };
|
||||||
uint8_t rules_quota = 0;
|
uint8_t rules_quota = 0;
|
||||||
@ -436,20 +434,16 @@ boolean RulesCommand()
|
|||||||
switch (XdrvMailbox.payload) {
|
switch (XdrvMailbox.payload) {
|
||||||
case 0: // Off
|
case 0: // Off
|
||||||
case 1: // On
|
case 1: // On
|
||||||
// Settings.flag.rules_enabled = XdrvMailbox.payload;
|
|
||||||
bitWrite(Settings.rule_enabled, index -1, XdrvMailbox.payload);
|
bitWrite(Settings.rule_enabled, index -1, XdrvMailbox.payload);
|
||||||
break;
|
break;
|
||||||
case 2: // Toggle
|
case 2: // Toggle
|
||||||
// Settings.flag.rules_enabled ^= 1;
|
|
||||||
bitWrite(Settings.rule_enabled, index -1, bitRead(Settings.rule_enabled, index -1) ^1);
|
bitWrite(Settings.rule_enabled, index -1, bitRead(Settings.rule_enabled, index -1) ^1);
|
||||||
break;
|
break;
|
||||||
case 4: // Off
|
case 4: // Off
|
||||||
case 5: // On
|
case 5: // On
|
||||||
// Settings.flag.rules_once = XdrvMailbox.payload &1;
|
|
||||||
bitWrite(Settings.rule_once, index -1, XdrvMailbox.payload &1);
|
bitWrite(Settings.rule_once, index -1, XdrvMailbox.payload &1);
|
||||||
break;
|
break;
|
||||||
case 6: // Toggle
|
case 6: // Toggle
|
||||||
// Settings.flag.rules_once ^= 1;
|
|
||||||
bitWrite(Settings.rule_once, index -1, bitRead(Settings.rule_once, index -1) ^1);
|
bitWrite(Settings.rule_once, index -1, bitRead(Settings.rule_once, index -1) ^1);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@ -526,6 +520,9 @@ boolean Xdrv10(byte function)
|
|||||||
case FUNC_COMMAND:
|
case FUNC_COMMAND:
|
||||||
result = RulesCommand();
|
result = RulesCommand();
|
||||||
break;
|
break;
|
||||||
|
case FUNC_RULES_PROCESS:
|
||||||
|
result = RulesProcess();
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
@ -175,6 +175,11 @@ boolean XdrvMqttData(char *topicBuf, uint16_t stopicBuf, char *dataBuf, uint16_t
|
|||||||
return XdrvCall(FUNC_MQTT_DATA);
|
return XdrvCall(FUNC_MQTT_DATA);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
boolean XdrvRulesProcess()
|
||||||
|
{
|
||||||
|
return XdrvCall(FUNC_RULES_PROCESS);
|
||||||
|
}
|
||||||
|
|
||||||
/*********************************************************************************************\
|
/*********************************************************************************************\
|
||||||
* Function call to all xdrv
|
* Function call to all xdrv
|
||||||
*
|
*
|
||||||
@ -188,6 +193,7 @@ boolean XdrvMqttData(char *topicBuf, uint16_t stopicBuf, char *dataBuf, uint16_t
|
|||||||
* FUNC_SHOW_SENSOR
|
* FUNC_SHOW_SENSOR
|
||||||
* FUNC_EVERY_SECOND
|
* FUNC_EVERY_SECOND
|
||||||
* FUNC_EVERY_50_MSECOND
|
* FUNC_EVERY_50_MSECOND
|
||||||
|
* FUNC_RULES_PROCESS
|
||||||
\*********************************************************************************************/
|
\*********************************************************************************************/
|
||||||
|
|
||||||
boolean XdrvCall(byte Function)
|
boolean XdrvCall(byte Function)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user