Skip to content

Commit 5b2ad61

Browse files
committed
Abstract out fan setup
Replaces the hard-coded sonoff fan controller settings with macros which can be changed in the future to more easily enable support for different types of fan devices.
1 parent f5f75ae commit 5b2ad61

File tree

4 files changed

+22
-19
lines changed

4 files changed

+22
-19
lines changed

Diff for: sonoff/sonoff.ino

+11-10
Original file line numberDiff line numberDiff line change
@@ -91,7 +91,8 @@ const char kTasmotaCommands[] PROGMEM =
9191

9292
const char kSleepMode[] PROGMEM = "Dynamic|Normal";
9393

94-
const uint8_t kIFan02Speed[4][3] = {{6,6,6}, {7,6,6}, {7,7,6}, {7,6,7}};
94+
#define FAN_STAGES 4
95+
const uint8_t kIFan02Speed[FAN_STAGES][3] = {{6,6,6}, {7,6,6}, {7,7,6}, {7,6,7}};
9596

9697
// Global variables
9798
SerialConfig serial_config = SERIAL_8N1; // Serial interface configuration 8 data bits, No parity, 1 stop bit
@@ -375,7 +376,7 @@ uint8_t GetFanspeed(void)
375376
{
376377
uint8_t fanspeed = 0;
377378

378-
// if (SONOFF_IFAN02 == Settings.module) {
379+
// if (IS_FAN_MODULE) {
379380
/* Fanspeed is controlled by relay 2, 3 and 4 as in Sonoff 4CH.
380381
000x = 0
381382
001x = 1
@@ -562,18 +563,18 @@ void MqttDataHandler(char* topic, byte* data, unsigned int data_len)
562563
fallback_topic_flag = 0;
563564
return;
564565
}
565-
else if ((CMND_FANSPEED == command_code) && (SONOFF_IFAN02 == Settings.module)) {
566+
else if ((CMND_FANSPEED == command_code) && IS_FAN_MODULE) {
566567
if (data_len > 0) {
567568
if ('-' == dataBuf[0]) {
568569
payload = (int16_t)GetFanspeed() -1;
569-
if (payload < 0) { payload = 3; }
570+
if (payload < 0) { payload = FAN_STAGES - 1; }
570571
}
571572
else if ('+' == dataBuf[0]) {
572573
payload = GetFanspeed() +1;
573-
if (payload > 3) { payload = 0; }
574+
if (payload > FAN_STAGES - 1) { payload = 0; }
574575
}
575576
}
576-
if ((payload >= 0) && (payload <= 3) && (payload != GetFanspeed())) {
577+
if ((payload >= 0) && (payload < FAN_STAGES) && (payload != GetFanspeed())) {
577578
SetFanspeed(payload);
578579
}
579580
snprintf_P(mqtt_data, sizeof(mqtt_data), S_JSON_COMMAND_NVALUE, command, GetFanspeed());
@@ -1351,7 +1352,7 @@ void ExecuteCommandPower(byte device, byte state, int source)
13511352

13521353
// ShowSource(source);
13531354

1354-
if (SONOFF_IFAN02 == Settings.module) {
1355+
if (IS_FAN_MODULE) {
13551356
blink_mask &= 1; // No blinking on the fan relays
13561357
Settings.flag.interlock = 0; // No interlock mode as it is already done by the microcontroller
13571358
Settings.pulse_timer[1] = 0; // No pulsetimers on the fan relays
@@ -1477,7 +1478,7 @@ void PublishStatus(uint8_t payload)
14771478

14781479
if ((0 == payload) || (99 == payload)) {
14791480
uint8_t maxfn = (devices_present > MAX_FRIENDLYNAMES) ? MAX_FRIENDLYNAMES : (!devices_present) ? 1 : devices_present;
1480-
if (SONOFF_IFAN02 == Settings.module) { maxfn = 1; }
1481+
if (IS_FAN_MODULE) { maxfn = 1; }
14811482
stemp[0] = '\0';
14821483
for (byte i = 0; i < maxfn; i++) {
14831484
snprintf_P(stemp, sizeof(stemp), PSTR("%s%s\"%s\"" ), stemp, (i > 0 ? "," : ""), Settings.friendlyname[i]);
@@ -1604,7 +1605,7 @@ void MqttShowState(void)
16041605
LightState(1);
16051606
} else {
16061607
snprintf_P(mqtt_data, sizeof(mqtt_data), PSTR("%s,\"%s\":\"%s\""), mqtt_data, GetPowerDevice(stemp1, i +1, sizeof(stemp1), Settings.flag.device_index_enable), GetStateText(bitRead(power, i)));
1607-
if (SONOFF_IFAN02 == Settings.module) {
1608+
if (IS_FAN_MODULE) {
16081609
snprintf_P(mqtt_data, sizeof(mqtt_data), PSTR("%s,\"" D_CMND_FANSPEED "\":%d"), mqtt_data, GetFanspeed());
16091610
break;
16101611
}
@@ -1663,7 +1664,7 @@ void PerformEverySecond(void)
16631664
AddLog(LOG_LEVEL_DEBUG);
16641665
}
16651666

1666-
if ((4 == uptime) && (SONOFF_IFAN02 == Settings.module)) { // Microcontroller needs 3 seconds before accepting commands
1667+
if ((4 == uptime) && IS_FAN_MODULE) { // Microcontroller needs 3 seconds before accepting commands
16671668
SetDevicePower(1, SRC_RETRY); // Sync with default power on state microcontroller being Light ON and Fan OFF
16681669
SetDevicePower(power, SRC_RETRY); // Set required power on state
16691670
}

Diff for: sonoff/sonoff_template.h

+2
Original file line numberDiff line numberDiff line change
@@ -512,6 +512,8 @@ const uint8_t kModuleNiceList[MAXMODULE] PROGMEM = {
512512
WEMOS
513513
};
514514

515+
#define IS_FAN_MODULE (Settings.module == SONOFF_IFAN02)
516+
515517
// Default module settings
516518
const mytmplt kModules[MAXMODULE] PROGMEM = {
517519
{ "Sonoff Basic", // Sonoff Basic (ESP8266)

Diff for: sonoff/xdrv_01_webserver.ino

+6-6
Original file line numberDiff line numberDiff line change
@@ -625,10 +625,10 @@ void HandleRoot(void)
625625
}
626626
page += FPSTR(HTTP_TABLE100);
627627
page += F("<tr>");
628-
if (SONOFF_IFAN02 == Settings.module) {
628+
if (IS_FAN_MODULE) {
629629
snprintf_P(mqtt_data, sizeof(mqtt_data), HTTP_DEVICE_CONTROL, 36, 1, D_BUTTON_TOGGLE, "");
630630
page += mqtt_data;
631-
for (byte i = 0; i < 4; i++) {
631+
for (byte i = 0; i < FAN_STAGES; i++) {
632632
snprintf_P(stemp, sizeof(stemp), PSTR("%d"), i);
633633
snprintf_P(mqtt_data, sizeof(mqtt_data), HTTP_DEVICE_CONTROL, 16, i +2, stemp, "");
634634
page += mqtt_data;
@@ -684,7 +684,7 @@ void HandleAjaxStatusRefresh(void)
684684
if (strlen(tmp)) {
685685
ShowWebSource(SRC_WEBGUI);
686686
uint8_t device = atoi(tmp);
687-
if (SONOFF_IFAN02 == Settings.module) {
687+
if (IS_FAN_MODULE) {
688688
if (device < 2) {
689689
ExecuteCommandPower(1, POWER_TOGGLE, SRC_IGNORE);
690690
} else {
@@ -724,7 +724,7 @@ void HandleAjaxStatusRefresh(void)
724724
if (devices_present) {
725725
snprintf_P(mqtt_data, sizeof(mqtt_data), PSTR("%s{t}<tr>"), mqtt_data);
726726
uint8_t fsize = (devices_present < 5) ? 70 - (devices_present * 8) : 32;
727-
if (SONOFF_IFAN02 == Settings.module) {
727+
if (IS_FAN_MODULE) {
728728
snprintf_P(mqtt_data, sizeof(mqtt_data), HTTP_DEVICE_STATE,
729729
mqtt_data, 36, (bitRead(power, 0)) ? "bold" : "normal", 54, GetStateText(bitRead(power, 0)));
730730
uint8_t fanspeed = GetFanspeed();
@@ -1119,7 +1119,7 @@ void HandleOtherConfiguration(void)
11191119
page += FPSTR(HTTP_FORM_OTHER);
11201120
page.replace(F("{r1"), (Settings.flag.mqtt_enabled) ? F(" checked") : F(""));
11211121
uint8_t maxfn = (devices_present > MAX_FRIENDLYNAMES) ? MAX_FRIENDLYNAMES : (!devices_present) ? 1 : devices_present;
1122-
if (SONOFF_IFAN02 == Settings.module) { maxfn = 1; }
1122+
if (IS_FAN_MODULE) { maxfn = 1; }
11231123
for (byte i = 0; i < maxfn; i++) {
11241124
page += FPSTR(HTTP_FORM_OTHER2);
11251125
page.replace(F("{1"), String(i +1));
@@ -1288,7 +1288,7 @@ void HandleInformation(void)
12881288
func += F("}1" D_BOOT_COUNT "}2"); func += String(Settings.bootcount);
12891289
func += F("}1" D_RESTART_REASON "}2"); func += GetResetReason();
12901290
uint8_t maxfn = (devices_present > MAX_FRIENDLYNAMES) ? MAX_FRIENDLYNAMES : devices_present;
1291-
if (SONOFF_IFAN02 == Settings.module) { maxfn = 1; }
1291+
if (IS_FAN_MODULE) { maxfn = 1; }
12921292
for (byte i = 0; i < maxfn; i++) {
12931293
func += F("}1" D_FRIENDLY_NAME " "); func += i +1; func += F("}2"); func += Settings.friendlyname[i];
12941294
}

Diff for: sonoff/xdrv_02_mqtt.ino

+3-3
Original file line numberDiff line numberDiff line change
@@ -333,8 +333,8 @@ void MqttPublishPowerState(byte device)
333333

334334
if ((device < 1) || (device > devices_present)) { device = 1; }
335335

336-
if ((SONOFF_IFAN02 == Settings.module) && (device > 1)) {
337-
if (GetFanspeed() < 4) { // 4 occurs when fanspeed is 3 and RC button 2 is pressed
336+
if ((IS_FAN_MODULE) && (device > 1)) {
337+
if (GetFanspeed() < FAN_STAGES) { // 4 occurs when fanspeed is 3 and RC button 2 is pressed
338338
snprintf_P(scommand, sizeof(scommand), PSTR(D_CMND_FANSPEED));
339339
GetTopic_P(stopic, STAT, mqtt_topic, (Settings.flag.mqtt_response) ? scommand : S_RSLT_RESULT);
340340
snprintf_P(mqtt_data, sizeof(mqtt_data), S_JSON_COMMAND_NVALUE, scommand, GetFanspeed());
@@ -425,7 +425,7 @@ void MqttConnected(void)
425425
MqttPublishPrefixTopic_P(TELE, PSTR(D_RSLT_INFO "3"));
426426
for (byte i = 1; i <= devices_present; i++) {
427427
MqttPublishPowerState(i);
428-
if (SONOFF_IFAN02 == Settings.module) { break; } // Only report status of light relay
428+
if (IS_FAN_MODULE) { break; } // Only report status of light relay
429429
}
430430
if (Settings.tele_period) { tele_period = Settings.tele_period -9; } // Enable TelePeriod in 9 seconds
431431
rules_flag.system_boot = 1;

0 commit comments

Comments
 (0)