// The code below is extracted from my home automation controller - it is unlikely
// you will be able to use it directly, but it should help guide you in decoding
// and assembling data packets for Lennox mini-split air conditioners.
// ----------------- AIRCO SECTION -----------------
int decode_time(int Byte, int *halfhr) {
int b1, b2, b4, b8, b16, b32, hr;
// Displayed times are calculated times + half hr.
if (Byte&64) *halfhr = 0; else *halfhr = 1; // half-hr time plus half-hr offset
b16 = Byte&2 ? 16 : 0;
b8 = Byte&4 ? 8 : 0;
b4 = Byte&8 ? 4 : 0;
b2 = Byte&16 ? 2 : 0;
b1 = Byte&32 ? 1 : 0;
hr = b16+b8+b4+b2+b1;
if (Byte&64) hr += 1; // half-hr time plus half-hr offset increments hour
return hr;
}
int decode_temperature(int Byte2, int Byte5) {
int b1, b2, b4, b8, b16;
//assert((Byte2&7) == 6);
//assert((Byte5&7) == 6);
b16 = Byte2&8 ? 16 : 0;
b8 = Byte2&16 ? 8 : 0;
b4 = Byte2&32 ? 4 : 0;
b2 = Byte2&64 ? 2 : 0;
b1 = Byte2&128 ? 1 : 0;
return b16+b8+b4+b2+b1;
}
int decode_mode(int Byte1, int Byte5) {
int b1, b2, b4, b8, b16;
//assert((Byte2&7) == 6);
//assert((Byte5&7) == 6);
b4 = Byte1&32 ? 4 : 0;
b2 = Byte1&64 ? 2 : 0;
b1 = Byte1&128 ? 1 : 0;
return b1+b2+b4;
}
int decode_fan(int Byte1, int Byte5) {
int b1, b2, b4, b8, b16;
//assert((Byte2&7) == 6);
//assert((Byte5&7) == 6);
b4 = Byte1&4 ? 4 : 0;
b2 = Byte1&8 ? 2 : 0;
b1 = Byte1&16 ? 1 : 0;
return b4+b2+b1;
}
int crc1(int code[6]) {
int i, x = 0xff;
for (i = 0; i < 5; i++) {
x = x+code[i];
}
return (x^0xff)&255;
}
static long int
lennox_airco_Follow=0,
lennox_airco_led = 1,
lennox_airco_temp = 0,
lennox_airco_fan = 0,
lennox_airco_timer_off_half = 0,
lennox_airco_timer_off = 0,
lennox_airco_timer_on = 0,
lennox_airco_timer_on_half = 0,
lennox_airco_swing = 0,
lennox_airco_turbo = 0,
lennox_airco_clean = 0,
lennox_airco_power = 1,
lennox_airco_sleep = 0,
lennox_airco_direct = 0,
lennox_airco_mode = 0;
// DECODERS:
void decode_lennox(int code[6]) {
char message[1024];
int F;
switch (code[0]) {
case 0x25:
load_global("bedroom-lennox.follow", &lennox_airco_Follow); // does not alter Follow if not found.
//printf("Follow.");
if (code[4] == 0xCC) {
int i = code[3]&0x03;
if (i == 0) {
//printf("[Follow=OFF]");
if (lennox_airco_Follow == 1) {
lennox_airco_Follow = 0;
save_global("bedroom-lennox.follow", lennox_airco_Follow);
quicksay("bedroom air conditioner has turned off follow mode");
}
} else if (i == 3) {
//printf("[Follow=ON]");
if (lennox_airco_Follow == 0) {
lennox_airco_Follow = 1;
save_global("bedroom-lennox.follow", lennox_airco_Follow);
quicksay("bedroom air conditioner has turned on follow mode");
}
} else {
//printf("[Follow=%d]", i);
sprintf(message, "bedroom air conditioner did something related to follow mode. Mode value is %d", i);
quicksay(message);
}
} else {
//printf("[Follow??? %02x (%d)]", code[4], code[4]);
sprintf(message, "bedroom air conditioner did something related to follow mode. Code is %d", code[4]);
quicksay(message);
}
break;
case 0x45:
//printf("Function toggle.");
switch (code[1]) {
case 0x10: //printf("[FN=LED]");
load_global("bedroom-lennox.led", &lennox_airco_led);
if (lennox_airco_led == 0) {
lennox_airco_led = 1;
save_global("bedroom-lennox.led", lennox_airco_led);
quicksay("bedroom air conditioner turned the L E D on"); break;
} else {
lennox_airco_led = 0;
save_global("bedroom-lennox.led", lennox_airco_led);
quicksay("bedroom air conditioner turned the L E D off"); break;
}
case 0x40: //printf("[FN=SWING]");
load_global("bedroom-lennox.swing", &lennox_airco_swing);
if (lennox_airco_swing == 0) {
lennox_airco_swing = 1;
save_global("bedroom-lennox.swing", lennox_airco_swing);
quicksay("bedroom air conditioner turned swing mode on"); break;
} else {
lennox_airco_swing = 0;
save_global("bedroom-lennox.swing", lennox_airco_swing);
quicksay("bedroom air conditioner turned swing mode off"); break;
}
case 0x80: //printf("[FN=DIRECT]");
load_global("bedroom-lennox.direct", &lennox_airco_direct);
if (lennox_airco_direct == 0) {
lennox_airco_direct = 1;
save_global("bedroom-lennox.direct", lennox_airco_direct);
quicksay("bedroom air conditioner turned direct mode on"); break;
} else {
lennox_airco_direct = 0;
save_global("bedroom-lennox.direct", lennox_airco_direct);
quicksay("bedroom air conditioner turned direct mode off"); break;
}
case 0x90: //printf("[FN=TURBO]");
load_global("bedroom-lennox.turbo", &lennox_airco_turbo);
if (lennox_airco_turbo == 0) {
lennox_airco_turbo = 1;
save_global("bedroom-lennox.turbo", lennox_airco_turbo);
quicksay("bedroom air conditioner turned turbo mode on. This will help it reach the set temperature more quickly."); break;
} else {
lennox_airco_turbo = 0;
save_global("bedroom-lennox.turbo", lennox_airco_turbo);
quicksay("bedroom air conditioner turned turbo mode off"); break;
}
case 0xB0: //printf("[FN=CLEAN]");
load_global("bedroom-lennox.clean", &lennox_airco_clean);
if (lennox_airco_clean == 0) {
lennox_airco_clean = 1;
save_global("bedroom-lennox.clean", lennox_airco_clean);
quicksay("bedroom air conditioner turned cleaning mode on."); break;
} else {
lennox_airco_clean = 0;
save_global("bedroom-lennox.clean", lennox_airco_clean);
quicksay("bedroom air conditioner turned cleaning mode off"); break;
}
default:
//printf("[FN=UNKNOWN]");
sprintf(message, "bedroom air conditioner toggled some unknown mode. Code is %d", code[1]);
quicksay(message);
break;
}
break;
case 0x85:
//fprintf(stdout, "Full state change.");
{
char *mode[8] = {"cool", "dry", "auto", "heat", "fan","","",""};
load_global("bedroom-lennox.power", &lennox_airco_power);
if ((lennox_airco_power == 0) && ((code[1]&1) == 1)) {
//printf("[ON]");
lennox_airco_power = 1;
save_global("bedroom-lennox.power", lennox_airco_power);
lennox_airco_led = 1; // LED always comes on at power-up. Possibly other toggled modes (eg swing) come up consistently too. (most likely in OFF state)
save_global("bedroom-lennox.led", lennox_airco_led);
quicksay("bedroom air conditioner has been turned on");
} else if ((lennox_airco_power == 1) && ((code[1]&1) == 0)) {
//printf("[OFF]");
lennox_airco_power = 0;
save_global("bedroom-lennox.power", lennox_airco_power);
quicksay("bedroom air conditioner has been turned off");
}
load_global("bedroom-lennox.sleep", &lennox_airco_sleep);
if ((code[1]&2) == 2) {
//printf("[Sleep]");
if (lennox_airco_sleep == 0) {
lennox_airco_sleep = 1;
save_global("bedroom-lennox.sleep", lennox_airco_sleep);
quicksay("bedroom air conditioner has been put into sleep mode");
}
} else {
if (lennox_airco_sleep == 1) {
lennox_airco_sleep = 0;
save_global("bedroom-lennox.sleep", lennox_airco_sleep);
quicksay("bedroom air conditioner is no longer in sleep mode");
}
}
if (code[4] != 0xFF) {
int half;
int Hr = decode_time(code[4], &half);
//printf("[T-On=%d%s]", Hr, half ?".5":"");
load_global("bedroom-lennox.timer-on", &lennox_airco_timer_on);
load_global("bedroom-lennox.timer-on-half", &lennox_airco_timer_on_half);
if ((lennox_airco_timer_on != Hr) || (lennox_airco_timer_on_half != half)) {
lennox_airco_timer_on = Hr;
lennox_airco_timer_on_half = half;
save_global("bedroom-lennox.timer-on", lennox_airco_timer_on);
save_global("bedroom-lennox.timer-on-half", lennox_airco_timer_on_half);
sprintf(message, "bedroom air conditioner on Timer has been set to %d %s", Hr, (half ? "thirty":""));
quicksay(message);
}
}
if (code[3] != 0xFF) {
int half;
int Hr = decode_time(code[3], &half);
//printf("[T-Off=%d%s]", Hr, half ?".5":"");
load_global("bedroom-lennox.timer-off", &lennox_airco_timer_off);
load_global("bedroom-lennox.timer-off-half", &lennox_airco_timer_off_half);
if ((lennox_airco_timer_off != Hr) || (lennox_airco_timer_off_half != half)) {
lennox_airco_timer_off = Hr;
lennox_airco_timer_off_half = half;
save_global("bedroom-lennox.timer-off", lennox_airco_timer_off);
save_global("bedroom-lennox.timer-off-half", lennox_airco_timer_off_half);
sprintf(message, "bedroom air conditioner Off Timer has been manually set to %d %s", Hr, (half ? "thirty":""));
quicksay(message);
}
}
if (lennox_airco_Follow) { // global state and a toggle
//printf("[Follow]");
}
load_global("bedroom-lennox.mode", &lennox_airco_mode);
//printf("[M=%s]", mode[decode_mode(code[1], code[5])]);
if (decode_mode(code[1], code[5]) != lennox_airco_mode) {
lennox_airco_mode = decode_mode(code[1], code[5]);
save_global("bedroom-lennox.mode", lennox_airco_mode);
sprintf(message, "bedroom air conditioner mode manually changed to %s", mode[decode_mode(code[1], code[5])]);
quicksay(message);
}
load_global("bedroom-lennox.fan", &lennox_airco_fan);
if (decode_fan(code[1], code[5]) != lennox_airco_fan) {
if ((code[1]&4) == 4) {
printf("[Fan=Auto]");
save_global("bedroom-lennox.fan", decode_fan(code[1], code[5]));
quicksay("bedroom air conditioner fan manually set to automatic");
} else {
printf("[Fan=%d]", decode_fan(code[1], code[5]));
save_global("bedroom-lennox.fan", decode_fan(code[1], code[5]));
sprintf(message, "bedroom air conditioner fan speed manually set to %d", decode_fan(code[1], code[5]));
quicksay(message);
}
}
//printf("[T=%d]", F=decode_temperature(code[2], code[5])+62);
F=decode_temperature(code[2], code[5])+62;
load_global("bedroom-lennox.setpoint", &lennox_airco_temp);
if (lennox_airco_temp != F) {
lennox_airco_temp = F;
save_global("bedroom-lennox.setpoint", lennox_airco_temp);
sprintf(message, "bedroom air conditioner manually set to %d degrees F which is %d degrees C", F, (F-32)*5/9);
quicksay(message);
}
}
break;
default:
quicksay("bedroom air conditioner has received a command I don't recognise");
//printf("Unknown decode\n");
break;
}
}
// ENCODERS:
// '25' group: follow
char *construct_follow(int OnOff) {
static int code[6]; static char hex[19];
// Not at all sure yet what this is to be set to. We won't be setting this.
sprintf(hex, "25 11 f6 ff 74");
//sprintf(hex, "25 11 f6 fc 74");
return hex;
}
// '45' group. They're really all toggles.
char *construct_led(int OnOff) {
static int code[6]; static char hex[19];
sprintf(hex, "45 10 FF FF FF");
return hex;
}
char *construct_swing(int OnOff) {
static int code[6]; static char hex[19];
load_global("bedroom-lennox.swing", &lennox_airco_swing);
sprintf(hex, "45 40 FF FF FF");
return hex;
}
char *construct_direct(int OnOff) {
static int code[6]; static char hex[19];
load_global("bedroom-lennox.direct", &lennox_airco_direct);
sprintf(hex, "45 80 FF FF FF");
return hex;
}
char *construct_turbo(int OnOff) {
static int code[6]; static char hex[19];
load_global("bedroom-lennox.turbo", &lennox_airco_turbo);
sprintf(hex, "45 90 FF FF FF");
return hex;
}
char *construct_clean(int OnOff) {
static int code[6]; static char hex[19];
load_global("bedroom-lennox.clean", &lennox_airco_clean);
sprintf(hex, "45 B0 FF FF FF");
return hex;
}
// '85' group:
char *construct_packet(int Power, int Temp, int FanSpeed, int Mode, int Sleep, int TimerOn, int TimerOnHalf, int TimerOff, int TimerOffHalf) {
static int code[6]; static char hex[19];
code[0] = 0x85;
code[1] = 0;
if (Power) code[1] |= 1;
if (Sleep) code[1] |= 2;
if (FanSpeed&4) code[1] |= 4;
if (FanSpeed&2) code[1] |= 8;
if (FanSpeed&1) code[1] |= 16;
if (Mode&4) code[1] |= 32;
if (Mode&2) code[1] |= 64;
if (Mode&1) code[1] |= 128;
// all bits of code[1] filled.
Temp -= 62; code[2] = 0;
if (Temp&16) code[2] |= 8;
if (Temp&8) code[2] |= 16;
if (Temp&4) code[2] |= 32;
if (Temp&2) code[2] |= 64;
if (Temp&1) code[2] |= 128;
code[2] |= 0 | 2 | 4; // match bits 1,2,4 to remote.
code[3] = 0xff; // timer off Note 0x81 bits are not determined. Timer bits are 0x7E.
code[4] = 0xff; // timer on Easiest to ignore timer for now.
sprintf(hex, "%02x %02x %02x %02x %02x %02x ", code[0], code[1], code[2], code[3], code[4], crc1(code));
return hex;
}
void remote_command(char *hex) {
char message[1024];
sprintf(message, "ssh pi@192.168.2.49 \"lennox-bedroom %s\" &", hex);
fprintf(stderr, "EXECUTE: %s\n", message); fflush(stderr);
system(message);
fprintf(stderr, "SENT: %s\n", message); fflush(stderr);
}
void execute_lennox(char *command, char *param) {
char message[1024];
// convert command into 5-byte sequence and send to airco using system("ssh pi@192.168.2.49 \"lennox-bedroom xx xx xx xx xx\"");
fprintf(stderr, "AIRCO: '%s' '%s'\n", command, param); fflush(stderr);
if (strcmp(command, "temp")==0) {
long temp = atol(param);
if ((62 <= temp) && (temp <= 84)) {
load_global("bedroom-lennox.setpoint", &lennox_airco_temp);
if (temp > lennox_airco_temp) {
sprintf(message, "raising air conditioner temperature to %ld degrees F, which is %ld degrees C", temp, (temp-32)*5/9);
} else if (temp < lennox_airco_temp) {
sprintf(message, "lowering air conditioner temperature to %ld degrees F, which is %ld degrees C", temp, (temp-32)*5/9);
} else {
sprintf(message, "confirming air conditioner set to %ld degrees F, which is %ld degrees C", temp, (temp-32)*5/9);
}
lennox_airco_temp = temp;
save_global("bedroom-lennox.setpoint", lennox_airco_temp);
quicksay(message);
load_global("bedroom-lennox.power", &lennox_airco_power);
load_global("bedroom-lennox.fan", &lennox_airco_fan);
load_global("bedroom-lennox.mode", &lennox_airco_mode);
load_global("bedroom-lennox.sleep", &lennox_airco_sleep);
load_global("bedroom-lennox.timer-on", &lennox_airco_timer_on);
load_global("bedroom-lennox.timer-on-half", &lennox_airco_timer_on_half);
load_global("bedroom-lennox.timer-off", &lennox_airco_timer_off);
load_global("bedroom-lennox.timer-off-half", &lennox_airco_timer_off_half);
remote_command(construct_packet(lennox_airco_power, lennox_airco_temp, lennox_airco_fan, lennox_airco_mode, lennox_airco_sleep, lennox_airco_timer_on, lennox_airco_timer_on_half, lennox_airco_timer_off, lennox_airco_timer_off_half));
} else {
quicksay("bad temperature given for bedroom air conditioner");
}
} else if (strcmp(command, "power")==0) {
if (strcmp(param, "on")==0) {
load_global("bedroom-lennox.power", &lennox_airco_power);
lennox_airco_power = 1;
save_global("bedroom-lennox.power", lennox_airco_power);
lennox_airco_led = 1; // LED always on at power-up. Possibly other toggled modes (eg swing) come up consistently too. (most likely in OFF state)
save_global("bedroom-lennox.led", lennox_airco_led);
quicksay("turning bedroom air conditioner on");
load_global("bedroom-lennox.setpoint", &lennox_airco_temp);
load_global("bedroom-lennox.fan", &lennox_airco_fan);
load_global("bedroom-lennox.mode", &lennox_airco_mode);
load_global("bedroom-lennox.sleep", &lennox_airco_sleep);
load_global("bedroom-lennox.timer-on", &lennox_airco_timer_on);
load_global("bedroom-lennox.timer-on-half", &lennox_airco_timer_on_half);
load_global("bedroom-lennox.timer-off", &lennox_airco_timer_off);
load_global("bedroom-lennox.timer-off-half", &lennox_airco_timer_off_half);
remote_command(construct_packet(lennox_airco_power, lennox_airco_temp, lennox_airco_fan, lennox_airco_mode, lennox_airco_sleep, lennox_airco_timer_on, lennox_airco_timer_on_half, lennox_airco_timer_off, lennox_airco_timer_off_half));
} else if (strcmp(param, "off")==0) {
load_global("bedroom-lennox.power", &lennox_airco_power);
lennox_airco_power = 0;
save_global("bedroom-lennox.power", lennox_airco_power);
quicksay("turning bedroom air conditioner off");
load_global("bedroom-lennox.setpoint", &lennox_airco_temp);
load_global("bedroom-lennox.fan", &lennox_airco_fan);
load_global("bedroom-lennox.mode", &lennox_airco_mode);
load_global("bedroom-lennox.sleep", &lennox_airco_sleep);
load_global("bedroom-lennox.timer-on", &lennox_airco_timer_on);
load_global("bedroom-lennox.timer-on-half", &lennox_airco_timer_on_half);
load_global("bedroom-lennox.timer-off", &lennox_airco_timer_off);
load_global("bedroom-lennox.timer-off-half", &lennox_airco_timer_off_half);
remote_command(construct_packet(lennox_airco_power, lennox_airco_temp, lennox_airco_fan, lennox_airco_mode, lennox_airco_sleep, lennox_airco_timer_on, lennox_airco_timer_on_half, lennox_airco_timer_off, lennox_airco_timer_off_half));
} else {
quicksay("bad power parameter given for bedroom air conditioner");
}
} else if (strcmp(command, "led")==0) {
if (strcmp(param, "on")==0) {
load_global("bedroom-lennox.led", &lennox_airco_led);
lennox_airco_led = 1;
quicksay("turning bedroom air conditioner L E D on");
save_global("bedroom-lennox.led", lennox_airco_led);
remote_command(construct_led(lennox_airco_led));
} else if (strcmp(param, "off")==0) {
load_global("bedroom-lennox.led", &lennox_airco_led);
lennox_airco_led = 0;
quicksay("turning bedroom air conditioner L E D off");
save_global("bedroom-lennox.led", lennox_airco_led);
remote_command(construct_led(lennox_airco_led));
} else {
quicksay("bad L E D parameter given for bedroom air conditioner");
}
} else if (strcmp(command, "swing")==0) {
if (strcmp(param, "on")==0) {
load_global("bedroom-lennox.swing", &lennox_airco_swing);
lennox_airco_swing = 1;
quicksay("start bedroom air conditioner swing");
save_global("bedroom-lennox.swing", lennox_airco_swing);
remote_command(construct_swing(lennox_airco_swing));
} else if (strcmp(param, "off")==0) {
load_global("bedroom-lennox.swing", &lennox_airco_swing);
lennox_airco_swing = 0;
quicksay("stop bedroom air conditioner swing");
save_global("bedroom-lennox.swing", lennox_airco_swing);
remote_command(construct_swing(lennox_airco_swing));
} else {
quicksay("bad swing parameter given for bedroom air conditioner");
}
} else if (strcmp(command, "fan")==0) {
if (strcmp(param, "on")==0) {
load_global("bedroom-lennox.fan", &lennox_airco_fan);
lennox_airco_fan = 4; // 4 == AUTO
quicksay("turning bedroom air conditioner fan back on");
save_global("bedroom-lennox.fan", lennox_airco_fan);
load_global("bedroom-lennox.power", &lennox_airco_power);
load_global("bedroom-lennox.setpoint", &lennox_airco_temp);
load_global("bedroom-lennox.mode", &lennox_airco_mode);
load_global("bedroom-lennox.sleep", &lennox_airco_sleep);
load_global("bedroom-lennox.timer-on", &lennox_airco_timer_on);
load_global("bedroom-lennox.timer-on-half", &lennox_airco_timer_on_half);
load_global("bedroom-lennox.timer-off", &lennox_airco_timer_off);
load_global("bedroom-lennox.timer-off-half", &lennox_airco_timer_off_half);
remote_command(construct_packet(lennox_airco_power, lennox_airco_temp, lennox_airco_fan, lennox_airco_mode, lennox_airco_sleep, lennox_airco_timer_on, lennox_airco_timer_on_half, lennox_airco_timer_off, lennox_airco_timer_off_half));
} else if (strcmp(param, "off")==0) {
load_global("bedroom-lennox.fan", &lennox_airco_fan);
lennox_airco_fan = 0;
quicksay("turning bedroom air conditioner fan off");
save_global("bedroom-lennox.fan", lennox_airco_fan);
load_global("bedroom-lennox.power", &lennox_airco_power);
load_global("bedroom-lennox.setpoint", &lennox_airco_temp);
load_global("bedroom-lennox.mode", &lennox_airco_mode);
load_global("bedroom-lennox.sleep", &lennox_airco_sleep);
load_global("bedroom-lennox.timer-on", &lennox_airco_timer_on);
load_global("bedroom-lennox.timer-on-half", &lennox_airco_timer_on_half);
load_global("bedroom-lennox.timer-off", &lennox_airco_timer_off);
load_global("bedroom-lennox.timer-off-half", &lennox_airco_timer_off_half);
remote_command(construct_packet(lennox_airco_power, lennox_airco_temp, lennox_airco_fan, lennox_airco_mode, lennox_airco_sleep, lennox_airco_timer_on, lennox_airco_timer_on_half, lennox_airco_timer_off, lennox_airco_timer_off_half));
} else if (strcmp(param, "high")==0) {
load_global("bedroom-lennox.fan", &lennox_airco_fan);
lennox_airco_fan = 3;
quicksay("setting bedroom air conditioner fan to high speed");
save_global("bedroom-lennox.fan", lennox_airco_fan);
load_global("bedroom-lennox.power", &lennox_airco_power);
load_global("bedroom-lennox.setpoint", &lennox_airco_temp);
load_global("bedroom-lennox.mode", &lennox_airco_mode);
load_global("bedroom-lennox.sleep", &lennox_airco_sleep);
load_global("bedroom-lennox.timer-on", &lennox_airco_timer_on);
load_global("bedroom-lennox.timer-on-half", &lennox_airco_timer_on_half);
load_global("bedroom-lennox.timer-off", &lennox_airco_timer_off);
load_global("bedroom-lennox.timer-off-half", &lennox_airco_timer_off_half);
remote_command(construct_packet(lennox_airco_power, lennox_airco_temp, lennox_airco_fan, lennox_airco_mode, lennox_airco_sleep, lennox_airco_timer_on, lennox_airco_timer_on_half, lennox_airco_timer_off, lennox_airco_timer_off_half));
} else if (strcmp(param, "medium")==0) {
load_global("bedroom-lennox.fan", &lennox_airco_fan);
lennox_airco_fan = 2;
quicksay("setting bedroom air conditioner fan to medium speed");
save_global("bedroom-lennox.fan", lennox_airco_fan);
load_global("bedroom-lennox.power", &lennox_airco_power);
load_global("bedroom-lennox.setpoint", &lennox_airco_temp);
load_global("bedroom-lennox.mode", &lennox_airco_mode);
load_global("bedroom-lennox.sleep", &lennox_airco_sleep);
load_global("bedroom-lennox.timer-on", &lennox_airco_timer_on);
load_global("bedroom-lennox.timer-on-half", &lennox_airco_timer_on_half);
load_global("bedroom-lennox.timer-off", &lennox_airco_timer_off);
load_global("bedroom-lennox.timer-off-half", &lennox_airco_timer_off_half);
remote_command(construct_packet(lennox_airco_power, lennox_airco_temp, lennox_airco_fan, lennox_airco_mode, lennox_airco_sleep, lennox_airco_timer_on, lennox_airco_timer_on_half, lennox_airco_timer_off, lennox_airco_timer_off_half));
} else if (strcmp(param, "low")==0) {
load_global("bedroom-lennox.fan", &lennox_airco_fan);
lennox_airco_fan = 1;
quicksay("setting bedroom air conditioner fan to low speed");
save_global("bedroom-lennox.fan", lennox_airco_fan);
load_global("bedroom-lennox.power", &lennox_airco_power);
load_global("bedroom-lennox.setpoint", &lennox_airco_temp);
load_global("bedroom-lennox.mode", &lennox_airco_mode);
load_global("bedroom-lennox.sleep", &lennox_airco_sleep);
load_global("bedroom-lennox.timer-on", &lennox_airco_timer_on);
load_global("bedroom-lennox.timer-on-half", &lennox_airco_timer_on_half);
load_global("bedroom-lennox.timer-off", &lennox_airco_timer_off);
load_global("bedroom-lennox.timer-off-half", &lennox_airco_timer_off_half);
remote_command(construct_packet(lennox_airco_power, lennox_airco_temp, lennox_airco_fan, lennox_airco_mode, lennox_airco_sleep, lennox_airco_timer_on, lennox_airco_timer_on_half, lennox_airco_timer_off, lennox_airco_timer_off_half));
} else if (strcmp(param, "auto")==0) {
load_global("bedroom-lennox.fan", &lennox_airco_fan);
lennox_airco_fan = 4;
quicksay("setting bedroom air conditioner fan to automatic");
save_global("bedroom-lennox.fan", lennox_airco_fan);
load_global("bedroom-lennox.power", &lennox_airco_power);
load_global("bedroom-lennox.setpoint", &lennox_airco_temp);
load_global("bedroom-lennox.mode", &lennox_airco_mode);
load_global("bedroom-lennox.sleep", &lennox_airco_sleep);
load_global("bedroom-lennox.timer-on", &lennox_airco_timer_on);
load_global("bedroom-lennox.timer-on-half", &lennox_airco_timer_on_half);
load_global("bedroom-lennox.timer-off", &lennox_airco_timer_off);
load_global("bedroom-lennox.timer-off-half", &lennox_airco_timer_off_half);
remote_command(construct_packet(lennox_airco_power, lennox_airco_temp, lennox_airco_fan, lennox_airco_mode, lennox_airco_sleep, lennox_airco_timer_on, lennox_airco_timer_on_half, lennox_airco_timer_off, lennox_airco_timer_off_half));
} else {
quicksay("bad fan parameter given for bedroom air conditioner");
}
} else {
quicksay("bad command given for bedroom air conditioner");
}
}
// ----------------- END OF AIRCO SECTION -----------------