mirror of
https://github.com/arendst/Tasmota.git
synced 2025-07-28 05:06:32 +00:00
Expand bridge functionality
This commit is contained in:
parent
ebe642c995
commit
d5cf0fc57f
@ -71,6 +71,7 @@ const char S_JSON_COMMAND_NVALUE_ACTIVE_NVALUE[] PROGMEM = "{\"%s\":\"%d (" D
|
|||||||
|
|
||||||
const char S_JSON_COMMAND_NVALUE[] PROGMEM = "{\"%s\":%d}";
|
const char S_JSON_COMMAND_NVALUE[] PROGMEM = "{\"%s\":%d}";
|
||||||
const char S_JSON_COMMAND_SVALUE[] PROGMEM = "{\"%s\":\"%s\"}";
|
const char S_JSON_COMMAND_SVALUE[] PROGMEM = "{\"%s\":\"%s\"}";
|
||||||
|
const char S_JSON_COMMAND_XVALUE[] PROGMEM = "{\"%s\":%s}"; // %s must provide quotes on non-number
|
||||||
|
|
||||||
const char S_JSON_COMMAND_INDEX_NVALUE[] PROGMEM = "{\"%s%d\":%d}";
|
const char S_JSON_COMMAND_INDEX_NVALUE[] PROGMEM = "{\"%s%d\":%d}";
|
||||||
const char S_JSON_COMMAND_INDEX_SVALUE[] PROGMEM = "{\"%s%d\":\"%s\"}";
|
const char S_JSON_COMMAND_INDEX_SVALUE[] PROGMEM = "{\"%s%d\":\"%s\"}";
|
||||||
|
@ -406,6 +406,7 @@
|
|||||||
#define D_LEARNING_ACTIVE "Anlernen aktiv"
|
#define D_LEARNING_ACTIVE "Anlernen aktiv"
|
||||||
#define D_LEARN_FAILED "Anlernen fehlgeschlagen"
|
#define D_LEARN_FAILED "Anlernen fehlgeschlagen"
|
||||||
#define D_LEARNED "angelernt"
|
#define D_LEARNED "angelernt"
|
||||||
|
#define D_SAVED "gespeichert"
|
||||||
|
|
||||||
// xdrv_wemohue.ino
|
// xdrv_wemohue.ino
|
||||||
#define D_MULTICAST_DISABLED "Multicast deaktiviert"
|
#define D_MULTICAST_DISABLED "Multicast deaktiviert"
|
||||||
|
@ -406,6 +406,7 @@
|
|||||||
#define D_LEARNING_ACTIVE "Learning active"
|
#define D_LEARNING_ACTIVE "Learning active"
|
||||||
#define D_LEARN_FAILED "Learn failed"
|
#define D_LEARN_FAILED "Learn failed"
|
||||||
#define D_LEARNED "Learned"
|
#define D_LEARNED "Learned"
|
||||||
|
#define D_SAVED "Saved"
|
||||||
|
|
||||||
// xdrv_wemohue.ino
|
// xdrv_wemohue.ino
|
||||||
#define D_MULTICAST_DISABLED "Multicast disabled"
|
#define D_MULTICAST_DISABLED "Multicast disabled"
|
||||||
|
@ -406,6 +406,7 @@
|
|||||||
#define D_LEARNING_ACTIVE "Leren actief"
|
#define D_LEARNING_ACTIVE "Leren actief"
|
||||||
#define D_LEARN_FAILED "Leren mislukt"
|
#define D_LEARN_FAILED "Leren mislukt"
|
||||||
#define D_LEARNED "Geleerd"
|
#define D_LEARNED "Geleerd"
|
||||||
|
#define D_SAVED "Opgeslagen"
|
||||||
|
|
||||||
// xdrv_wemohue.ino
|
// xdrv_wemohue.ino
|
||||||
#define D_MULTICAST_DISABLED "Multicast uitgeschakeld"
|
#define D_MULTICAST_DISABLED "Multicast uitgeschakeld"
|
||||||
|
@ -406,6 +406,7 @@
|
|||||||
#define D_LEARNING_ACTIVE "Wyuczone aktywne"
|
#define D_LEARNING_ACTIVE "Wyuczone aktywne"
|
||||||
#define D_LEARN_FAILED "Uczenie niepowodzenie"
|
#define D_LEARN_FAILED "Uczenie niepowodzenie"
|
||||||
#define D_LEARNED "Wyuczone"
|
#define D_LEARNED "Wyuczone"
|
||||||
|
#define D_SAVED "Zapisane"
|
||||||
|
|
||||||
// xdrv_wemohue.ino
|
// xdrv_wemohue.ino
|
||||||
#define D_MULTICAST_DISABLED "Multicast jest wylaczony"
|
#define D_MULTICAST_DISABLED "Multicast jest wylaczony"
|
||||||
|
@ -32,6 +32,7 @@ uint8_t sonoff_bridge_receive_flag = 0;
|
|||||||
uint8_t sonoff_bridge_learn_key = 1;
|
uint8_t sonoff_bridge_learn_key = 1;
|
||||||
uint8_t sonoff_bridge_learn_active = 0;
|
uint8_t sonoff_bridge_learn_active = 0;
|
||||||
uint32_t sonoff_bridge_last_received_id = 0;
|
uint32_t sonoff_bridge_last_received_id = 0;
|
||||||
|
uint32_t sonoff_bridge_last_send_code = 0;
|
||||||
unsigned long sonoff_bridge_last_time = 0;
|
unsigned long sonoff_bridge_last_time = 0;
|
||||||
|
|
||||||
void SonoffBridgeReceived()
|
void SonoffBridgeReceived()
|
||||||
@ -52,7 +53,7 @@ void SonoffBridgeReceived()
|
|||||||
|
|
||||||
if (0xA2 == serial_in_buffer[0]) { // Learn timeout
|
if (0xA2 == serial_in_buffer[0]) { // Learn timeout
|
||||||
sonoff_bridge_learn_active = 0;
|
sonoff_bridge_learn_active = 0;
|
||||||
snprintf_P(mqtt_data, sizeof(mqtt_data), PSTR("{\"" D_CMND_RFKEY "%d\":\"" D_LEARN_FAILED "\"}"), sonoff_bridge_learn_key);
|
snprintf_P(mqtt_data, sizeof(mqtt_data), S_JSON_COMMAND_INDEX_SVALUE, D_CMND_RFKEY, sonoff_bridge_learn_key, D_LEARN_FAILED);
|
||||||
MqttPublishPrefixTopic_P(5, PSTR(D_CMND_RFKEY));
|
MqttPublishPrefixTopic_P(5, PSTR(D_CMND_RFKEY));
|
||||||
}
|
}
|
||||||
else if (0xA3 == serial_in_buffer[0]) { // Learned A3 20 F8 01 18 03 3E 2E 1A 22 55
|
else if (0xA3 == serial_in_buffer[0]) { // Learned A3 20 F8 01 18 03 3E 2E 1A 22 55
|
||||||
@ -63,9 +64,9 @@ void SonoffBridgeReceived()
|
|||||||
for (byte i = 0; i < 9; i++) {
|
for (byte i = 0; i < 9; i++) {
|
||||||
Settings.rf_code[sonoff_bridge_learn_key][i] = serial_in_buffer[i +1];
|
Settings.rf_code[sonoff_bridge_learn_key][i] = serial_in_buffer[i +1];
|
||||||
}
|
}
|
||||||
snprintf_P(mqtt_data, sizeof(mqtt_data), PSTR("{\"" D_CMND_RFKEY "%d\":\"" D_LEARNED "\"}"), sonoff_bridge_learn_key);
|
snprintf_P(mqtt_data, sizeof(mqtt_data), S_JSON_COMMAND_INDEX_SVALUE, D_CMND_RFKEY, sonoff_bridge_learn_key, D_LEARNED);
|
||||||
} else {
|
} else {
|
||||||
snprintf_P(mqtt_data, sizeof(mqtt_data), PSTR("{\"" D_CMND_RFKEY "%d\":\"" D_LEARN_FAILED "\"}"), sonoff_bridge_learn_key);
|
snprintf_P(mqtt_data, sizeof(mqtt_data), S_JSON_COMMAND_INDEX_SVALUE, D_CMND_RFKEY, sonoff_bridge_learn_key, D_LEARN_FAILED);
|
||||||
}
|
}
|
||||||
MqttPublishPrefixTopic_P(5, PSTR(D_CMND_RFKEY));
|
MqttPublishPrefixTopic_P(5, PSTR(D_CMND_RFKEY));
|
||||||
}
|
}
|
||||||
@ -131,11 +132,11 @@ void SonoffBridgeSendCode(uint32_t code)
|
|||||||
{
|
{
|
||||||
Serial.write(0xAA); // Start of Text
|
Serial.write(0xAA); // Start of Text
|
||||||
Serial.write(0xA5); // Send following code
|
Serial.write(0xA5); // Send following code
|
||||||
for (uint8_t i = 0; i < 6; i++) {
|
for (byte i = 0; i < 6; i++) {
|
||||||
Serial.write(Settings.rf_code[0][i]);
|
Serial.write(Settings.rf_code[0][i]);
|
||||||
}
|
}
|
||||||
Serial.write(code >> 16 & 0xff);
|
Serial.write((code >> 16) & 0xff);
|
||||||
Serial.write(code >> 8 & 0xff);
|
Serial.write((code >> 8) & 0xff);
|
||||||
Serial.write(code & 0xff);
|
Serial.write(code & 0xff);
|
||||||
Serial.write(0x55); // End of Text
|
Serial.write(0x55); // End of Text
|
||||||
Serial.flush();
|
Serial.flush();
|
||||||
@ -148,7 +149,7 @@ void SonoffBridgeSend(uint8_t idx, uint8_t key)
|
|||||||
key--; // Support 1 to 16
|
key--; // Support 1 to 16
|
||||||
Serial.write(0xAA); // Start of Text
|
Serial.write(0xAA); // Start of Text
|
||||||
Serial.write(0xA5); // Send following code
|
Serial.write(0xA5); // Send following code
|
||||||
for (uint8_t i = 0; i < 8; i++) {
|
for (byte i = 0; i < 8; i++) {
|
||||||
Serial.write(Settings.rf_code[idx][i]);
|
Serial.write(Settings.rf_code[idx][i]);
|
||||||
}
|
}
|
||||||
if (0 == idx) {
|
if (0 == idx) {
|
||||||
@ -202,6 +203,7 @@ boolean SonoffBridgeCommand(char *type, uint16_t index, char *dataBuf, uint16_t
|
|||||||
code = strtol(dataBuf, &p, radix);
|
code = strtol(dataBuf, &p, radix);
|
||||||
if (code) {
|
if (code) {
|
||||||
if (CMND_RFCODE == command_code) {
|
if (CMND_RFCODE == command_code) {
|
||||||
|
sonoff_bridge_last_send_code = code;
|
||||||
SonoffBridgeSendCode(code);
|
SonoffBridgeSendCode(code);
|
||||||
} else {
|
} else {
|
||||||
if (1 == payload) {
|
if (1 == payload) {
|
||||||
@ -215,38 +217,48 @@ boolean SonoffBridgeCommand(char *type, uint16_t index, char *dataBuf, uint16_t
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
if (CMND_RFCODE == command_code) {
|
||||||
|
code = sonoff_bridge_last_send_code;
|
||||||
} else {
|
} else {
|
||||||
if (CMND_RFCODE != command_code) {
|
code = Settings.rf_code[0][set_index] << 8 | Settings.rf_code[0][set_index +1];
|
||||||
code = Settings.rf_code[0][set_index] << 8 | Settings.rf_code[0][set_index +1];
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
if (10 == radix) {
|
if (10 == radix) {
|
||||||
snprintf_P(stemp, sizeof(stemp), PSTR("%d"), code);
|
snprintf_P(stemp, sizeof(stemp), PSTR("%d"), code);
|
||||||
} else {
|
} else {
|
||||||
snprintf_P(stemp, sizeof(stemp), PSTR("\"#%X\""), code);
|
snprintf_P(stemp, sizeof(stemp), PSTR("\"#%X\""), code);
|
||||||
}
|
}
|
||||||
snprintf_P(mqtt_data, sizeof(mqtt_data), PSTR("{\"%s\":%s}"), command, stemp);
|
snprintf_P(mqtt_data, sizeof(mqtt_data), S_JSON_COMMAND_XVALUE, command, stemp);
|
||||||
}
|
}
|
||||||
else if ((CMND_RFKEY == command_code) && (index > 0) && (index <= 16)) {
|
else if ((CMND_RFKEY == command_code) && (index > 0) && (index <= 16)) {
|
||||||
if (!sonoff_bridge_learn_active) {
|
if (!sonoff_bridge_learn_active) {
|
||||||
if (2 == payload) {
|
if (2 == payload) { // Learn RF data
|
||||||
SonoffBridgeLearn(index);
|
SonoffBridgeLearn(index);
|
||||||
snprintf_P(mqtt_data, sizeof(mqtt_data), PSTR("{\"" D_CMND_RFKEY "%d\":\"" D_START_LEARNING "\"}"), index);
|
snprintf_P(mqtt_data, sizeof(mqtt_data), S_JSON_COMMAND_INDEX_SVALUE, command, index, D_START_LEARNING);
|
||||||
}
|
}
|
||||||
else if (3 == payload) {
|
else if (3 == payload) { // Unlearn RF data
|
||||||
Settings.rf_code[index][0] = 0;
|
Settings.rf_code[index][0] = 0;
|
||||||
snprintf_P(mqtt_data, sizeof(mqtt_data), PSTR("{\"" D_CMND_RFKEY "%d\":\"" D_SET_TO_DEFAULT "\"}"), index);
|
snprintf_P(mqtt_data, sizeof(mqtt_data), S_JSON_COMMAND_INDEX_SVALUE, command, index, D_SET_TO_DEFAULT);
|
||||||
|
}
|
||||||
|
else if (4 == payload) { // Save RF data provided by RFSync, RfLow, RfHigh and last RfCode
|
||||||
|
for (byte i = 0; i < 6; i++) {
|
||||||
|
Settings.rf_code[index][i] = Settings.rf_code[0][i];
|
||||||
|
}
|
||||||
|
Settings.rf_code[index][6] = (sonoff_bridge_last_send_code >> 16) & 0xff;
|
||||||
|
Settings.rf_code[index][7] = (sonoff_bridge_last_send_code >> 8) & 0xff;
|
||||||
|
Settings.rf_code[index][8] = sonoff_bridge_last_send_code & 0xff;
|
||||||
|
snprintf_P(mqtt_data, sizeof(mqtt_data), S_JSON_COMMAND_INDEX_SVALUE, command, index, D_SAVED);
|
||||||
} else {
|
} else {
|
||||||
if ((1 == payload) || (0 == Settings.rf_code[index][0])) {
|
if ((1 == payload) || (0 == Settings.rf_code[index][0])) {
|
||||||
SonoffBridgeSend(0, index);
|
SonoffBridgeSend(0, index); // Send default RF data
|
||||||
snprintf_P(mqtt_data, sizeof(mqtt_data), PSTR("{\"" D_CMND_RFKEY "%d\":\"" D_DEFAULT_SENT "\"}"), index);
|
snprintf_P(mqtt_data, sizeof(mqtt_data), S_JSON_COMMAND_INDEX_SVALUE, command, index, D_DEFAULT_SENT);
|
||||||
} else {
|
} else {
|
||||||
SonoffBridgeSend(index, 0);
|
SonoffBridgeSend(index, 0); // Send learned RF data
|
||||||
snprintf_P(mqtt_data, sizeof(mqtt_data), PSTR("{\"" D_CMND_RFKEY "%d\":\"" D_LEARNED_SENT "\"}"), index);
|
snprintf_P(mqtt_data, sizeof(mqtt_data), S_JSON_COMMAND_INDEX_SVALUE, command, index, D_LEARNED_SENT);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
snprintf_P(mqtt_data, sizeof(mqtt_data), PSTR("{\"" D_CMND_RFKEY "%d\":\"" D_LEARNING_ACTIVE "\"}"), sonoff_bridge_learn_key);
|
snprintf_P(mqtt_data, sizeof(mqtt_data), S_JSON_COMMAND_INDEX_SVALUE, command, sonoff_bridge_learn_key, D_LEARNING_ACTIVE);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
serviced = false;
|
serviced = false;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user