mirror of https://github.com/arendst/Tasmota.git
parent
61aa428646
commit
9a3c3895fb
|
@ -393,6 +393,9 @@ void SetFanspeed(uint8_t fanspeed)
|
||||||
// uint8_t state = pgm_read_byte(kIFan02Speed +(speed *3) +i);
|
// uint8_t state = pgm_read_byte(kIFan02Speed +(speed *3) +i);
|
||||||
ExecuteCommandPower(i +2, state, SRC_IGNORE); // Use relay 2, 3 and 4
|
ExecuteCommandPower(i +2, state, SRC_IGNORE); // Use relay 2, 3 and 4
|
||||||
}
|
}
|
||||||
|
#ifdef USE_DOMOTICZ
|
||||||
|
DomoticzUpdateFanState(); // Command FanSpeed feedback
|
||||||
|
#endif // USE_DOMOTICZ
|
||||||
}
|
}
|
||||||
|
|
||||||
void SetPulseTimer(uint8_t index, uint16_t time)
|
void SetPulseTimer(uint8_t index, uint16_t time)
|
||||||
|
|
|
@ -335,6 +335,9 @@ void MqttPublishPowerState(byte device)
|
||||||
|
|
||||||
if ((SONOFF_IFAN02 == Settings.module) && (device > 1)) {
|
if ((SONOFF_IFAN02 == Settings.module) && (device > 1)) {
|
||||||
if (GetFanspeed() < MAX_FAN_SPEED) { // 4 occurs when fanspeed is 3 and RC button 2 is pressed
|
if (GetFanspeed() < MAX_FAN_SPEED) { // 4 occurs when fanspeed is 3 and RC button 2 is pressed
|
||||||
|
#ifdef USE_DOMOTICZ
|
||||||
|
DomoticzUpdateFanState(); // RC Button feedback
|
||||||
|
#endif // USE_DOMOTICZ
|
||||||
snprintf_P(scommand, sizeof(scommand), PSTR(D_CMND_FANSPEED));
|
snprintf_P(scommand, sizeof(scommand), PSTR(D_CMND_FANSPEED));
|
||||||
GetTopic_P(stopic, STAT, mqtt_topic, (Settings.flag.mqtt_response) ? scommand : S_RSLT_RESULT);
|
GetTopic_P(stopic, STAT, mqtt_topic, (Settings.flag.mqtt_response) ? scommand : S_RSLT_RESULT);
|
||||||
snprintf_P(mqtt_data, sizeof(mqtt_data), S_JSON_COMMAND_NVALUE, scommand, GetFanspeed());
|
snprintf_P(mqtt_data, sizeof(mqtt_data), S_JSON_COMMAND_NVALUE, scommand, GetFanspeed());
|
||||||
|
@ -425,7 +428,7 @@ void MqttConnected(void)
|
||||||
MqttPublishPrefixTopic_P(TELE, PSTR(D_RSLT_INFO "3"));
|
MqttPublishPrefixTopic_P(TELE, PSTR(D_RSLT_INFO "3"));
|
||||||
for (byte i = 1; i <= devices_present; i++) {
|
for (byte i = 1; i <= devices_present; i++) {
|
||||||
MqttPublishPowerState(i);
|
MqttPublishPowerState(i);
|
||||||
if (SONOFF_IFAN02 == Settings.module) { break; } // Only report status of light relay
|
if (SONOFF_IFAN02 == Settings.module) { break; } // Report status of light relay only
|
||||||
}
|
}
|
||||||
if (Settings.tele_period) { tele_period = Settings.tele_period -9; } // Enable TelePeriod in 9 seconds
|
if (Settings.tele_period) { tele_period = Settings.tele_period -9; } // Enable TelePeriod in 9 seconds
|
||||||
rules_flag.system_boot = 1;
|
rules_flag.system_boot = 1;
|
||||||
|
|
|
@ -42,8 +42,9 @@ char domoticz_in_topic[] = DOMOTICZ_IN_TOPIC;
|
||||||
char domoticz_out_topic[] = DOMOTICZ_OUT_TOPIC;
|
char domoticz_out_topic[] = DOMOTICZ_OUT_TOPIC;
|
||||||
|
|
||||||
boolean domoticz_subscribe = false;
|
boolean domoticz_subscribe = false;
|
||||||
int domoticz_update_timer = 0;
|
|
||||||
byte domoticz_update_flag = 1;
|
byte domoticz_update_flag = 1;
|
||||||
|
int domoticz_update_timer = 0;
|
||||||
|
unsigned long fan_debounce = 0; // iFan02 state debounce timer
|
||||||
|
|
||||||
int DomoticzBatteryQuality(void)
|
int DomoticzBatteryQuality(void)
|
||||||
{
|
{
|
||||||
|
@ -71,27 +72,45 @@ int DomoticzRssiQuality(void)
|
||||||
return WifiGetRssiAsQuality(WiFi.RSSI()) / 10;
|
return WifiGetRssiAsQuality(WiFi.RSSI()) / 10;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void MqttPublishDomoticzFanState()
|
||||||
|
{
|
||||||
|
if (Settings.flag.mqtt_enabled && Settings.domoticz_relay_idx[1]) {
|
||||||
|
char svalue[8]; // Fanspeed value
|
||||||
|
|
||||||
|
int fan_speed = GetFanspeed();
|
||||||
|
snprintf_P(svalue, sizeof(svalue), PSTR("%d"), fan_speed * 10);
|
||||||
|
snprintf_P(mqtt_data, sizeof(mqtt_data), DOMOTICZ_MESSAGE,
|
||||||
|
Settings.domoticz_relay_idx[1], (0 == fan_speed) ? 0 : 2, svalue, DomoticzBatteryQuality(), DomoticzRssiQuality());
|
||||||
|
MqttPublish(domoticz_in_topic);
|
||||||
|
|
||||||
|
fan_debounce = millis();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void DomoticzUpdateFanState()
|
||||||
|
{
|
||||||
|
if (domoticz_update_flag) {
|
||||||
|
MqttPublishDomoticzFanState();
|
||||||
|
}
|
||||||
|
domoticz_update_flag = 1;
|
||||||
|
}
|
||||||
|
|
||||||
void MqttPublishDomoticzPowerState(byte device)
|
void MqttPublishDomoticzPowerState(byte device)
|
||||||
{
|
{
|
||||||
char svalue[8]; // Dimmer or Fanspeed value
|
|
||||||
|
|
||||||
if (Settings.flag.mqtt_enabled) {
|
if (Settings.flag.mqtt_enabled) {
|
||||||
if ((device < 1) || (device > devices_present)) { device = 1; }
|
if ((device < 1) || (device > devices_present)) { device = 1; }
|
||||||
if ((SONOFF_IFAN02 == Settings.module) && Settings.domoticz_relay_idx[1] && (device > 1)) { // device (relay) 1 handled below
|
if (Settings.domoticz_relay_idx[device -1]) {
|
||||||
if (4 == device) { // Wait for device (relay) 4 to get valid GetFanspeed
|
if ((SONOFF_IFAN02 == Settings.module) && (device > 1)) {
|
||||||
uint8_t fan_speed = GetFanspeed();
|
// Fan handled by MqttPublishDomoticzFanState
|
||||||
snprintf_P(svalue, sizeof(svalue), PSTR("%d"), (int)fan_speed * 10);
|
} else {
|
||||||
|
char svalue[8]; // Dimmer value
|
||||||
|
|
||||||
|
snprintf_P(svalue, sizeof(svalue), PSTR("%d"), Settings.light_dimmer);
|
||||||
snprintf_P(mqtt_data, sizeof(mqtt_data), DOMOTICZ_MESSAGE,
|
snprintf_P(mqtt_data, sizeof(mqtt_data), DOMOTICZ_MESSAGE,
|
||||||
Settings.domoticz_relay_idx[1], (0 == fan_speed) ? 0 : 2, svalue, DomoticzBatteryQuality(), DomoticzRssiQuality());
|
Settings.domoticz_relay_idx[device -1], (power & (1 << (device -1))) ? 1 : 0, (light_type) ? svalue : "", DomoticzBatteryQuality(), DomoticzRssiQuality());
|
||||||
MqttPublish(domoticz_in_topic);
|
MqttPublish(domoticz_in_topic);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if (Settings.domoticz_relay_idx[device -1]) {
|
|
||||||
snprintf_P(svalue, sizeof(svalue), PSTR("%d"), Settings.light_dimmer);
|
|
||||||
snprintf_P(mqtt_data, sizeof(mqtt_data), DOMOTICZ_MESSAGE,
|
|
||||||
Settings.domoticz_relay_idx[device -1], (power & (1 << (device -1))) ? 1 : 0, (light_type) ? svalue : "", DomoticzBatteryQuality(), DomoticzRssiQuality());
|
|
||||||
MqttPublish(domoticz_in_topic);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -110,7 +129,12 @@ void DomoticzMqttUpdate(void)
|
||||||
if (domoticz_update_timer <= 0) {
|
if (domoticz_update_timer <= 0) {
|
||||||
domoticz_update_timer = Settings.domoticz_update_timer;
|
domoticz_update_timer = Settings.domoticz_update_timer;
|
||||||
for (byte i = 1; i <= devices_present; i++) {
|
for (byte i = 1; i <= devices_present; i++) {
|
||||||
MqttPublishDomoticzPowerState(i);
|
if ((SONOFF_IFAN02 == Settings.module) && (i > 1)) {
|
||||||
|
MqttPublishDomoticzFanState();
|
||||||
|
break;
|
||||||
|
} else {
|
||||||
|
MqttPublishDomoticzPowerState(i);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -192,14 +216,21 @@ boolean DomoticzMqttData(void)
|
||||||
bool iscolordimmer = strcmp_P(domoticz["dtype"],PSTR("Color Switch")) == 0;
|
bool iscolordimmer = strcmp_P(domoticz["dtype"],PSTR("Color Switch")) == 0;
|
||||||
snprintf_P(stemp1, sizeof(stemp1), PSTR("%d"), i +1);
|
snprintf_P(stemp1, sizeof(stemp1), PSTR("%d"), i +1);
|
||||||
if ((SONOFF_IFAN02 == Settings.module) && (1 == i)) { // Idx 2 is fanspeed
|
if ((SONOFF_IFAN02 == Settings.module) && (1 == i)) { // Idx 2 is fanspeed
|
||||||
int16_t svalue = 0;
|
uint8_t svalue = 0;
|
||||||
if (domoticz.containsKey("svalue1")) {
|
if (domoticz.containsKey("svalue1")) {
|
||||||
svalue = domoticz["svalue1"];
|
svalue = domoticz["svalue1"];
|
||||||
} else {
|
} else {
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
svalue = (nvalue == 2) ? svalue / 10 : 0;
|
||||||
|
if (GetFanspeed() == svalue) {
|
||||||
|
return 1; // Stop loop as already set
|
||||||
|
}
|
||||||
|
if (TimePassedSince(fan_debounce) < 1000) {
|
||||||
|
return 1; // Stop loop if device in limbo
|
||||||
|
}
|
||||||
snprintf_P(XdrvMailbox.topic, XdrvMailbox.index, PSTR("/" D_CMND_FANSPEED));
|
snprintf_P(XdrvMailbox.topic, XdrvMailbox.index, PSTR("/" D_CMND_FANSPEED));
|
||||||
snprintf_P(XdrvMailbox.data, XdrvMailbox.data_len, PSTR("%d"), (nvalue == 2) ? svalue / 10 : 0);
|
snprintf_P(XdrvMailbox.data, XdrvMailbox.data_len, PSTR("%d"), svalue);
|
||||||
found = 1;
|
found = 1;
|
||||||
}
|
}
|
||||||
else if (iscolordimmer && 10 == nvalue) { // Color_SetColor
|
else if (iscolordimmer && 10 == nvalue) { // Color_SetColor
|
||||||
|
@ -230,7 +261,7 @@ boolean DomoticzMqttData(void)
|
||||||
}
|
}
|
||||||
else if (1 == nvalue || 0 == nvalue) {
|
else if (1 == nvalue || 0 == nvalue) {
|
||||||
if (((power >> i) &1) == (power_t)nvalue) {
|
if (((power >> i) &1) == (power_t)nvalue) {
|
||||||
return 1;
|
return 1; // Stop loop
|
||||||
}
|
}
|
||||||
snprintf_P(XdrvMailbox.topic, XdrvMailbox.index, PSTR("/" D_CMND_POWER "%s"), (devices_present > 1) ? stemp1 : "");
|
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);
|
snprintf_P(XdrvMailbox.data, XdrvMailbox.data_len, PSTR("%d"), nvalue);
|
||||||
|
|
Loading…
Reference in New Issue