parent
37fc7d2259
commit
bac30bbe1b
@ -279,7 +279,11 @@ void MqttDataHandler(char* topic, uint8_t* data, unsigned int data_len)
|
||||
// if (LOG_LEVEL_DEBUG_MORE <= seriallog_level) { Serial.println(dataBuf); }
|
||||
|
||||
// MQTT pre-processing
|
||||
if (XdrvMqttData(topic, strlen(topic), (char*)data, data_len)) { return; }
|
||||
XdrvMailbox.index = strlen(topic);
|
||||
XdrvMailbox.data_len = data_len;
|
||||
XdrvMailbox.topic = topic;
|
||||
XdrvMailbox.data = (char*)data;
|
||||
if (XdrvCall(FUNC_MQTT_DATA)) { return; }
|
||||
|
||||
ShowSource(SRC_MQTT);
|
||||
|
||||
|
||||
@ -199,102 +199,104 @@ void DomoticzMqttSubscribe(void)
|
||||
|
||||
bool DomoticzMqttData(void)
|
||||
{
|
||||
char stemp1[10];
|
||||
unsigned long idx = 0;
|
||||
int16_t nvalue = -1;
|
||||
bool found = false;
|
||||
|
||||
domoticz_update_flag = true;
|
||||
if (!strncmp(XdrvMailbox.topic, domoticz_out_topic, strlen(domoticz_out_topic))) {
|
||||
if (XdrvMailbox.data_len < 20) {
|
||||
return true; // No valid data
|
||||
}
|
||||
StaticJsonBuffer<400> jsonBuf;
|
||||
JsonObject& domoticz = jsonBuf.parseObject(XdrvMailbox.data);
|
||||
if (!domoticz.success()) {
|
||||
return true; // To much or invalid data
|
||||
}
|
||||
|
||||
if (strncasecmp(XdrvMailbox.topic, domoticz_out_topic, strlen(domoticz_out_topic)) != 0) {
|
||||
return false; // Process unchanged data
|
||||
}
|
||||
|
||||
// topic is domoticz/out so try to analyse
|
||||
if (XdrvMailbox.data_len < 20) {
|
||||
return true; // No valid data
|
||||
}
|
||||
StaticJsonBuffer<400> jsonBuf;
|
||||
JsonObject& domoticz = jsonBuf.parseObject(XdrvMailbox.data);
|
||||
if (!domoticz.success()) {
|
||||
return true; // To much or invalid data
|
||||
}
|
||||
// if (strcmp_P(domoticz["dtype"],PSTR("Light/Switch"))) {
|
||||
// return true;
|
||||
// }
|
||||
idx = domoticz["idx"];
|
||||
if (domoticz.containsKey("nvalue")) {
|
||||
nvalue = domoticz["nvalue"];
|
||||
}
|
||||
uint32_t idx = domoticz["idx"];
|
||||
int16_t nvalue = -1;
|
||||
if (domoticz.containsKey("nvalue")) {
|
||||
nvalue = domoticz["nvalue"];
|
||||
}
|
||||
|
||||
AddLog_P2(LOG_LEVEL_DEBUG_MORE, PSTR(D_LOG_DOMOTICZ "idx %d, nvalue %d"), idx, nvalue);
|
||||
AddLog_P2(LOG_LEVEL_DEBUG_MORE, PSTR(D_LOG_DOMOTICZ "idx %d, nvalue %d"), idx, nvalue);
|
||||
|
||||
if ((idx > 0) && (nvalue >= 0) && (nvalue <= 15)) {
|
||||
uint8_t maxdev = (devices_present > MAX_DOMOTICZ_IDX) ? MAX_DOMOTICZ_IDX : devices_present;
|
||||
for (uint32_t i = 0; i < maxdev; i++) {
|
||||
if (idx == Settings.domoticz_relay_idx[i]) {
|
||||
bool iscolordimmer = strcmp_P(domoticz["dtype"],PSTR("Color Switch")) == 0;
|
||||
snprintf_P(stemp1, sizeof(stemp1), PSTR("%d"), i +1);
|
||||
bool found = false;
|
||||
if ((idx > 0) && (nvalue >= 0) && (nvalue <= 15)) {
|
||||
uint8_t maxdev = (devices_present > MAX_DOMOTICZ_IDX) ? MAX_DOMOTICZ_IDX : devices_present;
|
||||
for (uint32_t i = 0; i < maxdev; i++) {
|
||||
if (idx == Settings.domoticz_relay_idx[i]) {
|
||||
bool iscolordimmer = strcmp_P(domoticz["dtype"],PSTR("Color Switch")) == 0;
|
||||
char stemp1[10];
|
||||
snprintf_P(stemp1, sizeof(stemp1), PSTR("%d"), i +1);
|
||||
#ifdef USE_SONOFF_IFAN
|
||||
if (IsModuleIfan() && (1 == i)) { // Idx 2 is fanspeed
|
||||
uint8_t svalue = 0;
|
||||
if (domoticz.containsKey("svalue1")) {
|
||||
svalue = domoticz["svalue1"];
|
||||
} else {
|
||||
return true; // Invalid data
|
||||
}
|
||||
svalue = (nvalue == 2) ? svalue / 10 : 0;
|
||||
if (GetFanspeed() == svalue) {
|
||||
return true; // Stop loop as already set
|
||||
}
|
||||
if (TimePassedSince(domoticz_fan_debounce) < 1000) {
|
||||
return true; // Stop loop if device in limbo
|
||||
}
|
||||
snprintf_P(XdrvMailbox.topic, XdrvMailbox.index, PSTR("/" D_CMND_FANSPEED));
|
||||
snprintf_P(XdrvMailbox.data, XdrvMailbox.data_len, PSTR("%d"), svalue);
|
||||
found = true;
|
||||
} else
|
||||
if (IsModuleIfan() && (1 == i)) { // Idx 2 is fanspeed
|
||||
uint8_t svalue = 0;
|
||||
if (domoticz.containsKey("svalue1")) {
|
||||
svalue = domoticz["svalue1"];
|
||||
} else {
|
||||
return true; // Invalid data
|
||||
}
|
||||
svalue = (nvalue == 2) ? svalue / 10 : 0;
|
||||
if (GetFanspeed() == svalue) {
|
||||
return true; // Stop loop as already set
|
||||
}
|
||||
if (TimePassedSince(domoticz_fan_debounce) < 1000) {
|
||||
return true; // Stop loop if device in limbo
|
||||
}
|
||||
snprintf_P(XdrvMailbox.topic, XdrvMailbox.index, PSTR("/" D_CMND_FANSPEED));
|
||||
snprintf_P(XdrvMailbox.data, XdrvMailbox.data_len, PSTR("%d"), svalue);
|
||||
found = true;
|
||||
} else
|
||||
#endif // USE_SONOFF_IFAN
|
||||
if (iscolordimmer && 10 == nvalue) { // Color_SetColor
|
||||
JsonObject& color = domoticz["Color"];
|
||||
uint16_t level = nvalue = domoticz["svalue1"];
|
||||
uint16_t r = color["r"]; r = r * level / 100;
|
||||
uint16_t g = color["g"]; g = g * level / 100;
|
||||
uint16_t b = color["b"]; b = b * level / 100;
|
||||
uint16_t cw = color["cw"]; cw = cw * level / 100;
|
||||
uint16_t ww = color["ww"]; ww = ww * level / 100;
|
||||
snprintf_P(XdrvMailbox.topic, XdrvMailbox.index, PSTR("/" D_CMND_COLOR));
|
||||
snprintf_P(XdrvMailbox.data, XdrvMailbox.data_len, PSTR("%02x%02x%02x%02x%02x"), r, g, b, cw, ww);
|
||||
found = true;
|
||||
}
|
||||
else if ((!iscolordimmer && 2 == nvalue) || // gswitch_sSetLevel
|
||||
(iscolordimmer && 15 == nvalue)) { // Color_SetBrightnessLevel
|
||||
if (domoticz.containsKey("svalue1")) {
|
||||
nvalue = domoticz["svalue1"];
|
||||
} else {
|
||||
return true; // Invalid data
|
||||
}
|
||||
if (light_type && (Settings.light_dimmer == nvalue) && ((power >> i) &1)) {
|
||||
return true; // State already set
|
||||
}
|
||||
snprintf_P(XdrvMailbox.topic, XdrvMailbox.index, PSTR("/" D_CMND_DIMMER));
|
||||
snprintf_P(XdrvMailbox.data, XdrvMailbox.data_len, PSTR("%d"), nvalue);
|
||||
found = true;
|
||||
}
|
||||
else if (1 == nvalue || 0 == nvalue) {
|
||||
if (((power >> i) &1) == (power_t)nvalue) {
|
||||
return true; // Stop loop
|
||||
}
|
||||
snprintf_P(XdrvMailbox.topic, XdrvMailbox.index, PSTR("/" D_CMND_POWER "%s"), (devices_present > 1) ? stemp1 : "");
|
||||
snprintf_P(XdrvMailbox.data, XdrvMailbox.data_len, PSTR("%d"), nvalue);
|
||||
found = true;
|
||||
}
|
||||
break;
|
||||
if (iscolordimmer && 10 == nvalue) { // Color_SetColor
|
||||
JsonObject& color = domoticz["Color"];
|
||||
uint16_t level = nvalue = domoticz["svalue1"];
|
||||
uint16_t r = color["r"]; r = r * level / 100;
|
||||
uint16_t g = color["g"]; g = g * level / 100;
|
||||
uint16_t b = color["b"]; b = b * level / 100;
|
||||
uint16_t cw = color["cw"]; cw = cw * level / 100;
|
||||
uint16_t ww = color["ww"]; ww = ww * level / 100;
|
||||
snprintf_P(XdrvMailbox.topic, XdrvMailbox.index, PSTR("/" D_CMND_COLOR));
|
||||
snprintf_P(XdrvMailbox.data, XdrvMailbox.data_len, PSTR("%02x%02x%02x%02x%02x"), r, g, b, cw, ww);
|
||||
found = true;
|
||||
}
|
||||
else if ((!iscolordimmer && 2 == nvalue) || // gswitch_sSetLevel
|
||||
(iscolordimmer && 15 == nvalue)) { // Color_SetBrightnessLevel
|
||||
if (domoticz.containsKey("svalue1")) {
|
||||
nvalue = domoticz["svalue1"];
|
||||
} else {
|
||||
return true; // Invalid data
|
||||
}
|
||||
if (light_type && (Settings.light_dimmer == nvalue) && ((power >> i) &1)) {
|
||||
return true; // State already set
|
||||
}
|
||||
snprintf_P(XdrvMailbox.topic, XdrvMailbox.index, PSTR("/" D_CMND_DIMMER));
|
||||
snprintf_P(XdrvMailbox.data, XdrvMailbox.data_len, PSTR("%d"), nvalue);
|
||||
found = true;
|
||||
}
|
||||
else if (1 == nvalue || 0 == nvalue) {
|
||||
if (((power >> i) &1) == (power_t)nvalue) {
|
||||
return true; // Stop loop
|
||||
}
|
||||
snprintf_P(XdrvMailbox.topic, XdrvMailbox.index, PSTR("/" D_CMND_POWER "%s"), (devices_present > 1) ? stemp1 : "");
|
||||
snprintf_P(XdrvMailbox.data, XdrvMailbox.data_len, PSTR("%d"), nvalue);
|
||||
found = true;
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (!found) { return true; } // No command received
|
||||
|
||||
AddLog_P2(LOG_LEVEL_DEBUG_MORE, PSTR(D_LOG_DOMOTICZ D_RECEIVED_TOPIC " %s, " D_DATA " %s"), XdrvMailbox.topic, XdrvMailbox.data);
|
||||
|
||||
domoticz_update_flag = false;
|
||||
}
|
||||
return false; // Process unchanged or new data
|
||||
if (!found) { return true; } // No command received
|
||||
|
||||
AddLog_P2(LOG_LEVEL_DEBUG_MORE, PSTR(D_LOG_DOMOTICZ D_RECEIVED_TOPIC " %s, " D_DATA " %s"), XdrvMailbox.topic, XdrvMailbox.data);
|
||||
|
||||
domoticz_update_flag = false;
|
||||
return false; // Process new data
|
||||
}
|
||||
|
||||
/*********************************************************************************************/
|
||||
|
||||
@ -698,10 +698,10 @@ void RulesTeleperiod(void)
|
||||
*/
|
||||
bool RulesMqttData(void)
|
||||
{
|
||||
bool serviced = false;
|
||||
if (XdrvMailbox.data_len < 1 || XdrvMailbox.data_len > 256) {
|
||||
return false;
|
||||
}
|
||||
bool serviced = false;
|
||||
String sTopic = XdrvMailbox.topic;
|
||||
String sData = XdrvMailbox.data;
|
||||
//AddLog_P2(LOG_LEVEL_DEBUG, PSTR("RUL: MQTT Topic %s, Event %s"), XdrvMailbox.topic, XdrvMailbox.data);
|
||||
|
||||
@ -847,16 +847,6 @@ void XsnsDriverState(void)
|
||||
|
||||
/*********************************************************************************************/
|
||||
|
||||
bool XdrvMqttData(char *topicBuf, uint16_t stopicBuf, char *dataBuf, uint16_t sdataBuf)
|
||||
{
|
||||
XdrvMailbox.index = stopicBuf;
|
||||
XdrvMailbox.data_len = sdataBuf;
|
||||
XdrvMailbox.topic = topicBuf;
|
||||
XdrvMailbox.data = dataBuf;
|
||||
|
||||
return XdrvCall(FUNC_MQTT_DATA);
|
||||
}
|
||||
|
||||
bool XdrvRulesProcess(void)
|
||||
{
|
||||
return XdrvCallDriver(10, FUNC_RULES_PROCESS);
|
||||
|
||||
Loading…
Reference in New Issue
Block a user