Hi guys,
I’ve been having the same issues and the sketch below solves it (it’s messy, but it’s a proof of concept):
/*
#define MODE_AUTO 1
#define MODE_HEAT 2
#define MODE_COOL 3
#define MODE_DRY 4
#define MODE_FAN 5
#define MODE_MAINT 6
#define FAN_AUTO 0
#define FAN_1 1
#define FAN_2 2
#define FAN_3 3
#define FAN_4 4
#define FAN_5 5
#define VDIR_AUTO 0
#define VDIR_MANUAL 0
#define VDIR_SWING 1
#define VDIR_UP 2
#define VDIR_MUP 3
#define VDIR_MIDDLE 4
#define VDIR_MDOWN 5
#define VDIR_DOWN 6
#define HDIR_AUTO 0
#define HDIR_MANUAL 0
#define HDIR_SWING 1
#define HDIR_MIDDLE 2
#define HDIR_LEFT 3
#define HDIR_MLEFT 4
#define HDIR_MRIGHT 5
#define HDIR_RIGHT 6
*/
// Enable debug prints to serial monitor
#define MY_DEBUG
// Enable and select radio type attached
#define MY_RADIO_NRF24
//#define MY_RADIO_RFM69
#define CHILD_ID_HVAC 3
#define MY_RF24_PA_LEVEL RF24_PA_MAX
// Enable repeater functionality for this node
#define MY_REPEATER_FEATURE
#include <MySensors.h>
#include <MideaHeatpumpIR.h>
//Some global variables to hold the states
int POWER_STATE;
int TEMP_STATE;
int FAN_STATE;
int MODE_STATE;
int VDIR_STATE;
int HDIR_STATE;
String HA_MODE_STATE = "Off";
String HA_FAN_STATE = "Min";
IRSenderPWM irSender(3); // IR led on Arduino digital pin 3, using Arduino PWM
HeatpumpIR *heatpumpIR = new MideaHeatpumpIR();
MyMessage msgHVACSetPointC(CHILD_ID_HVAC, V_HVAC_SETPOINT_COOL);
MyMessage msgHVACSpeed(CHILD_ID_HVAC, V_HVAC_SPEED);
MyMessage msgHVACFlowState(CHILD_ID_HVAC, V_HVAC_FLOW_STATE);
bool initialValueSent = false;
void before() {
loadState(CHILD_ID_HVAC);
}
void setup()
{
Serial.begin(115200);
}
void presentation() {
// Send the sketch version information to the gateway and Controller
sendSketchInfo("MasterBedroomUnit", "2.0.3");
Serial.println("Presenting sensor...");
// Register all sensors to gw (they will be created as child devices)
present(CHILD_ID_HVAC, S_HVAC, "");
}
void loop()
{
if (!initialValueSent) {
Serial.println("Sending initial values");
POWER_STATE = 0;
MODE_STATE = MODE_AUTO;
FAN_STATE = 1;
TEMP_STATE = 24;
sendHeatpumpCommand();
sendNewStateToGateway();
request(CHILD_ID_HVAC, V_HVAC_SETPOINT_COOL);
wait(3000, C_SET, V_HVAC_SETPOINT_COOL);
request(CHILD_ID_HVAC, V_HVAC_SPEED);
wait(3000, C_SET, V_HVAC_SPEED);
request(CHILD_ID_HVAC, V_HVAC_FLOW_STATE);
wait(3000, C_SET, V_HVAC_FLOW_STATE);
//initialValueSent = true;
}
}
void receive(const MyMessage &message) {
if (message.isAck()) {
Serial.println("This is an ack from gateway");
//return;
}
Serial.print("Incoming message for: ");
Serial.print(message.sensor);
String recvData = message.data;
recvData.trim();
Serial.print(", New status: ");
Serial.println(recvData);
switch (message.type) {
case V_HVAC_SPEED:
Serial.println("V_HVAC_SPEED");
if(recvData.equalsIgnoreCase("auto")) {
FAN_STATE = 0;
HA_FAN_STATE = "Auto";
}
else if(recvData.equalsIgnoreCase("min")) {
FAN_STATE = 1;
HA_FAN_STATE = "Min";
}
else if(recvData.equalsIgnoreCase("normal")) {
FAN_STATE = 2;
HA_FAN_STATE = "Normal";
}
else if(recvData.equalsIgnoreCase("max")) {
FAN_STATE = 3;
HA_FAN_STATE = "Max";
}
break;
case V_HVAC_SETPOINT_COOL:
Serial.println("V_HVAC_SETPOINT_COOL");
TEMP_STATE = message.getFloat();
Serial.println(TEMP_STATE);
break;
case V_HVAC_FLOW_STATE:
Serial.println("V_HVAC_FLOW_STATE");
if (recvData.equalsIgnoreCase("coolon")) {
POWER_STATE = 1;
MODE_STATE = MODE_COOL;
HA_MODE_STATE = "CoolOn";
}
else if (recvData.equalsIgnoreCase("heaton")) {
POWER_STATE = 1;
MODE_STATE = MODE_HEAT;
HA_MODE_STATE = "HeatOn";
}
else if (recvData.equalsIgnoreCase("autochangeover")) {
POWER_STATE = 1;
MODE_STATE = MODE_AUTO;
HA_MODE_STATE = "AutoChangeOver";
}
else if (recvData.equalsIgnoreCase("off")){
POWER_STATE = 0;
HA_MODE_STATE = "Off";
}
initialValueSent = true;
break;
}
sendHeatpumpCommand();
sendNewStateToGateway();
}
void sendNewStateToGateway() {
send(msgHVACSetPointC.set(TEMP_STATE));
wait(1000, C_SET, V_HVAC_SETPOINT_COOL);
char fan_state[HA_FAN_STATE.length() + 1];
HA_FAN_STATE.toCharArray(fan_state, HA_FAN_STATE.length() + 1);
send(msgHVACSpeed.set(fan_state));
wait(1000, C_SET, V_HVAC_SPEED);
char mode_state[HA_MODE_STATE.length() + 1];
HA_MODE_STATE.toCharArray(mode_state, HA_MODE_STATE.length() + 1);
send(msgHVACFlowState.set(mode_state));
wait(1000, C_SET, V_HVAC_FLOW_STATE);
}
void sendHeatpumpCommand() {
Serial.println("Power = " + (String)POWER_STATE);
Serial.println("Mode = " + (String)MODE_STATE);
Serial.println("Fan = " + (String)FAN_STATE);
Serial.println("Temp = " + (String)TEMP_STATE);
heatpumpIR->send(irSender, POWER_STATE, MODE_STATE, FAN_STATE, TEMP_STATE, VDIR_AUTO, HDIR_AUTO);
}