Merge branch 'nick1802-patch-1'
This commit is contained in:
commit
0b63b022c2
|
@ -0,0 +1,184 @@
|
|||
#include <DaikinHeatpumpARC480A14IR.h>
|
||||
|
||||
DaikinHeatpumpARC480A14IR::DaikinHeatpumpARC480A14IR() : HeatpumpIR()
|
||||
{
|
||||
static const char model[] PROGMEM = "daikin_arc480";
|
||||
static const char info[] PROGMEM = "{\"mdl\":\"daikin_arc480\",\"dn\":\"Daikin\",\"mT\":18,\"xT\":30,\"fs\":7,\"maint\":[10,11,12,13,14,15,16,17]}}}";
|
||||
|
||||
_model = model;
|
||||
_info = info;
|
||||
}
|
||||
|
||||
|
||||
// Daikin numeric values to command bytes
|
||||
void DaikinHeatpumpARC480A14IR::send(IRSender& IR, uint8_t powerModeCmd, uint8_t operatingModeCmd, uint8_t fanSpeedCmd, uint8_t temperatureCmd, uint8_t swingVCmd, uint8_t swingHCmd, uint8_t comfortModeCmd, uint8_t econoCmd, uint8_t sensorCmd, uint8_t quietCmd, uint8_t powerfulCmd)
|
||||
{
|
||||
// Sensible defaults for the heat pump mode
|
||||
|
||||
uint8_t operatingMode = DAIKIN_AIRCON_MODE_OFF;
|
||||
uint8_t fanSpeed = DAIKIN_AIRCON_FAN_AUTO;
|
||||
uint8_t temperature = 23;
|
||||
uint8_t swingV = DAIKIN_AIRCON_SWING_OFF;
|
||||
uint8_t comfortMode = DAIKIN_AIRCON_COMFORT_OFF;
|
||||
uint8_t econo = DAIKIN_AIRCON_ECONO_OFF;
|
||||
uint8_t sensor = DAIKIN_AIRCON_SENSOR_OFF;
|
||||
uint8_t quiet = DAIKIN_AIRCON_QUIET_OFF;
|
||||
uint8_t powerful = DAIKIN_AIRCON_POWERFUL_OFF;
|
||||
|
||||
switch (powerModeCmd)
|
||||
{
|
||||
case POWER_ON:
|
||||
operatingMode |= DAIKIN_AIRCON_MODE_ON;
|
||||
break;
|
||||
case POWER_OFF:
|
||||
operatingMode |= DAIKIN_AIRCON_MODE_OFF;
|
||||
}
|
||||
|
||||
switch (operatingModeCmd)
|
||||
{
|
||||
case MODE_AUTO:
|
||||
operatingMode |= DAIKIN_AIRCON_MODE_AUTO;
|
||||
break;
|
||||
case MODE_HEAT:
|
||||
operatingMode |= DAIKIN_AIRCON_MODE_HEAT;
|
||||
break;
|
||||
case MODE_COOL:
|
||||
operatingMode |= DAIKIN_AIRCON_MODE_COOL;
|
||||
break;
|
||||
case MODE_DRY:
|
||||
operatingMode |= DAIKIN_AIRCON_MODE_DRY;
|
||||
temperatureCmd = 0x24;
|
||||
break;
|
||||
case MODE_FAN:
|
||||
operatingMode |= DAIKIN_AIRCON_MODE_FAN;
|
||||
temperatureCmd = 0xC0;
|
||||
break;
|
||||
}
|
||||
|
||||
switch (fanSpeedCmd)
|
||||
{
|
||||
case FAN_AUTO:
|
||||
fanSpeed = DAIKIN_AIRCON_FAN_AUTO;
|
||||
break;
|
||||
case FAN_1:
|
||||
fanSpeed = DAIKIN_AIRCON_FAN1;
|
||||
break;
|
||||
case FAN_2:
|
||||
fanSpeed = DAIKIN_AIRCON_FAN2;
|
||||
break;
|
||||
case FAN_3:
|
||||
fanSpeed = DAIKIN_AIRCON_FAN3;
|
||||
break;
|
||||
case FAN_4:
|
||||
fanSpeed = DAIKIN_AIRCON_FAN4;
|
||||
break;
|
||||
case FAN_5:
|
||||
fanSpeed = DAIKIN_AIRCON_FAN5;
|
||||
break;
|
||||
case FAN_SILENT:
|
||||
fanSpeed = DAIKIN_AIRCON_FAN_SILENT;
|
||||
}
|
||||
|
||||
switch (swingVCmd)
|
||||
{
|
||||
case VDIR_SWING:
|
||||
swingV = DAIKIN_AIRCON_SWING_ON;
|
||||
break;
|
||||
case VDIR_UP:
|
||||
swingV = DAIKIN_AIRCON_SWING_OFF;
|
||||
break;
|
||||
}
|
||||
|
||||
if ((operatingModeCmd == MODE_HEAT && temperatureCmd >= 10 && temperatureCmd <= 30) ||
|
||||
(temperatureCmd >= 18 && temperatureCmd <= 30))
|
||||
{
|
||||
temperature = temperatureCmd << 1;
|
||||
}
|
||||
|
||||
if (comfortModeCmd) {
|
||||
comfortMode = DAIKIN_AIRCON_COMFORT_ON;
|
||||
powerful = DAIKIN_AIRCON_POWERFUL_OFF;
|
||||
fanSpeed = DAIKIN_AIRCON_FAN_AUTO;
|
||||
swingV = DAIKIN_AIRCON_SWING_OFF;
|
||||
}
|
||||
else {
|
||||
comfortMode = DAIKIN_AIRCON_COMFORT_OFF;
|
||||
}
|
||||
|
||||
if (econoCmd) {
|
||||
econo = DAIKIN_AIRCON_ECONO_ON;
|
||||
powerful = DAIKIN_AIRCON_POWERFUL_OFF;
|
||||
}
|
||||
else {
|
||||
econo = DAIKIN_AIRCON_ECONO_OFF;
|
||||
}
|
||||
|
||||
if (sensorCmd) {
|
||||
sensor = DAIKIN_AIRCON_SENSOR_ON;
|
||||
}
|
||||
else {
|
||||
sensor = DAIKIN_AIRCON_SENSOR_OFF;
|
||||
}
|
||||
|
||||
if (quietCmd) {
|
||||
quiet = DAIKIN_AIRCON_QUIET_ON;
|
||||
powerful = DAIKIN_AIRCON_POWERFUL_OFF;
|
||||
}
|
||||
else {
|
||||
quiet = DAIKIN_AIRCON_QUIET_OFF;
|
||||
}
|
||||
if (powerfulCmd) {
|
||||
powerful = DAIKIN_AIRCON_POWERFUL_ON;
|
||||
quiet = DAIKIN_AIRCON_QUIET_OFF;
|
||||
econo = DAIKIN_AIRCON_SENSOR_OFF;
|
||||
comfortMode = DAIKIN_AIRCON_COMFORT_OFF;
|
||||
}
|
||||
else {
|
||||
powerful = DAIKIN_AIRCON_POWERFUL_OFF;
|
||||
}
|
||||
|
||||
sendDaikin(IR, operatingMode, fanSpeed, temperature, swingV, swingHCmd, comfortMode, econo, sensor, quiet, powerful);
|
||||
}
|
||||
|
||||
// Send the Daikin code
|
||||
void DaikinHeatpumpARC480A14IR::sendDaikin(IRSender& IR, uint8_t operatingMode, uint8_t fanSpeed, uint8_t temperature, uint8_t swingV, uint8_t swingH, uint8_t comfortMode, uint8_t econo, uint8_t sensor, uint8_t quiet, uint8_t powerful)
|
||||
{
|
||||
(void)swingH;
|
||||
|
||||
uint8_t daikinTemplate[19] = {
|
||||
// cold @ 18c fan speed 5 MODE TEMP FAN \QUIET POWERFUL/ \specials/
|
||||
//0x11 0xDA 0x27 0x00 0x00 0x31 0x24 0x00 0xA0 0x00 0x00 0x00 0x00 0x00 0x00 0xC5 0x02 0x08 0xD6
|
||||
0x11, 0xDA, 0x27, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0xC5, 0x00, 0x08, 0x00 };
|
||||
// 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
|
||||
// | on/off timers |
|
||||
daikinTemplate[5] = operatingMode;
|
||||
daikinTemplate[6] = temperature;
|
||||
daikinTemplate[8] = fanSpeed + swingV;
|
||||
daikinTemplate[13] = quiet + powerful;
|
||||
daikinTemplate[16] = comfortMode + econo + sensor;
|
||||
|
||||
// Checksum calculation
|
||||
// * Checksums at bytes 7 and 15 are calculated the same way
|
||||
uint8_t checksum = 0x00;
|
||||
|
||||
for (int i=0; i<18; i++) {
|
||||
checksum += daikinTemplate[i];
|
||||
}
|
||||
|
||||
daikinTemplate[18] = checksum;
|
||||
|
||||
// 38 kHz PWM frequency
|
||||
IR.setFrequency(38);
|
||||
|
||||
// Header
|
||||
IR.mark(DAIKIN_AIRCON_HDR_MARK);
|
||||
IR.space(DAIKIN_AIRCON_HDR_SPACE);
|
||||
|
||||
// First header
|
||||
for (int i=0; i<19; i++) {
|
||||
IR.sendIRbyte(daikinTemplate[i], DAIKIN_AIRCON_BIT_MARK, DAIKIN_AIRCON_ZERO_SPACE, DAIKIN_AIRCON_ONE_SPACE);
|
||||
}
|
||||
|
||||
IR.mark(DAIKIN_AIRCON_BIT_MARK);
|
||||
IR.space(0);
|
||||
}
|
|
@ -0,0 +1,56 @@
|
|||
/*
|
||||
Daikin heatpump control (Daikin remote control P/N ARC480A14)
|
||||
*/
|
||||
#ifndef DaikinHeatpumpARC480A14IR_h
|
||||
#define DaikinHeatpumpARC480A14IR_h
|
||||
|
||||
#include <HeatpumpIR.h>
|
||||
|
||||
|
||||
// Daikin timing constants
|
||||
#define DAIKIN_AIRCON_HDR_MARK 3360 // 3300
|
||||
#define DAIKIN_AIRCON_HDR_SPACE 1760 // 1600
|
||||
#define DAIKIN_AIRCON_BIT_MARK 360 // 310
|
||||
#define DAIKIN_AIRCON_ONE_SPACE 1370 // 1220
|
||||
#define DAIKIN_AIRCON_ZERO_SPACE 520 // 400
|
||||
#define DAIKIN_AIRCON_MSG_SPACE 32300 // 30800
|
||||
|
||||
// Daikin codes
|
||||
#define DAIKIN_AIRCON_MODE_AUTO 0x00 // Operating mode
|
||||
#define DAIKIN_AIRCON_MODE_HEAT 0x40
|
||||
#define DAIKIN_AIRCON_MODE_COOL 0x30
|
||||
#define DAIKIN_AIRCON_MODE_DRY 0x20
|
||||
#define DAIKIN_AIRCON_MODE_FAN 0x60
|
||||
#define DAIKIN_AIRCON_MODE_OFF 0x00 // Power OFF
|
||||
#define DAIKIN_AIRCON_MODE_ON 0x01
|
||||
#define DAIKIN_AIRCON_FAN_AUTO 0xA0 // Fan speed
|
||||
#define DAIKIN_AIRCON_FAN1 0x30
|
||||
#define DAIKIN_AIRCON_FAN2 0x40
|
||||
#define DAIKIN_AIRCON_FAN3 0x50
|
||||
#define DAIKIN_AIRCON_FAN4 0x60
|
||||
#define DAIKIN_AIRCON_FAN5 0x70
|
||||
#define DAIKIN_AIRCON_FAN_SILENT 0xB0
|
||||
#define DAIKIN_AIRCON_SWING_ON 0x0F //Swing
|
||||
#define DAIKIN_AIRCON_SWING_OFF 0x00
|
||||
#define DAIKIN_AIRCON_COMFORT_ON 0x02 //Comfort mode
|
||||
#define DAIKIN_AIRCON_COMFORT_OFF 0x00
|
||||
#define DAIKIN_AIRCON_ECONO_ON 0x04 //Econo mode
|
||||
#define DAIKIN_AIRCON_ECONO_OFF 0x00
|
||||
#define DAIKIN_AIRCON_SENSOR_ON 0x08 //Sensor mode
|
||||
#define DAIKIN_AIRCON_SENSOR_OFF 0x00
|
||||
#define DAIKIN_AIRCON_QUIET_ON 0x20 //Quite mode
|
||||
#define DAIKIN_AIRCON_QUIET_OFF 0x00
|
||||
#define DAIKIN_AIRCON_POWERFUL_ON 0x01 //Powerful mode
|
||||
#define DAIKIN_AIRCON_POWERFUL_OFF 0x00
|
||||
|
||||
|
||||
class DaikinHeatpumpARC480A14IR : public HeatpumpIR
|
||||
{
|
||||
public:
|
||||
DaikinHeatpumpARC480A14IR();
|
||||
void send(IRSender& IR, uint8_t powerModeCmd, uint8_t operatingModeCmd, uint8_t fanSpeedCmd, uint8_t temperatureCmd, uint8_t swingVCmd, uint8_t swingHCmd, uint8_t comfortMode, uint8_t econo, uint8_t sensor, uint8_t quiet, uint8_t powerful);
|
||||
private:
|
||||
void sendDaikin(IRSender& IR, uint8_t operatingMode, uint8_t fanSpeed, uint8_t temperature, uint8_t swingV, uint8_t swingH, uint8_t comfortMode, uint8_t econo, uint8_t sensor, uint8_t quiet, uint8_t powerful);
|
||||
};
|
||||
|
||||
#endif
|
|
@ -30,6 +30,8 @@
|
|||
#define FAN_3 3
|
||||
#define FAN_4 4
|
||||
#define FAN_5 5
|
||||
#define FAN_SILENT 6 //SILENT/NIGHTMODE
|
||||
|
||||
|
||||
// Vertical air directions. Note that these cannot be set on all heat pumps
|
||||
#define VDIR_AUTO 0
|
||||
|
|
|
@ -0,0 +1,262 @@
|
|||
/* im a novis to coding but do try. i have bit banged this together and works for me.
|
||||
* hope this helps any one else that may need it.
|
||||
*/
|
||||
#include <DaikinHeatpumpARC480A14IR.h>
|
||||
#include <HeatpumpIR.h>
|
||||
#include <IRSender.h>
|
||||
|
||||
#include <ESP8266WiFi.h>
|
||||
#include <PubSubClient.h>
|
||||
|
||||
IRSenderESP8266 irSender(14); // IR led on Duemilanove digital pin 3, using Arduino PWM
|
||||
DaikinHeatpumpARC480A14IR *heatpumpIR;
|
||||
|
||||
const char* ssid = "SSID";// your wifi name
|
||||
const char* password = "PASS"; // your wifi password
|
||||
IPAddress ip(192, 168, 0, 53); //ESP static ip
|
||||
IPAddress gateway(192, 168, 0, 1); //Set Gateway
|
||||
IPAddress subnet(255, 255, 255, 0); //Subnet mask
|
||||
const char* mqtt_server = "192.168.0.44"; // MQTT Server address
|
||||
|
||||
const char* client_id = "ESP8266_53"; // Must be unique on the MQTT network
|
||||
const char* inTopic1 = "192.168.0.53_power"; // topic names
|
||||
const char* inTopic2 = "192.168.0.53_mode";
|
||||
const char* inTopic3 = "192.168.0.53_fan";
|
||||
const char* inTopic4 = "192.168.0.53_temp";
|
||||
const char* inTopic5 = "192.168.0.53_swing";
|
||||
const char* inTopic6 = "192.168.0.53_comfort";
|
||||
const char* inTopic7 = "192.168.0.53_econo";
|
||||
const char* inTopic8 = "192.168.0.53_sensor";
|
||||
const char* inTopic9 = "192.168.0.53_quiet";
|
||||
const char* inTopic10 = "192.168.0.53_powerful";
|
||||
|
||||
int power;
|
||||
int acmode;
|
||||
int fan;
|
||||
int temp;
|
||||
int swing;
|
||||
boolean comfort;
|
||||
boolean econo;
|
||||
boolean sensor;
|
||||
boolean quiet;
|
||||
boolean powerful;
|
||||
int high = true;
|
||||
int low = false;
|
||||
|
||||
WiFiClient espClient;
|
||||
PubSubClient client(espClient);
|
||||
|
||||
void setup() {
|
||||
Serial.begin(74880);
|
||||
setup_wifi(); //connect to wifi
|
||||
Serial.print("RSSI : ");
|
||||
Serial.println(WiFi.RSSI()); // wifi signal strength
|
||||
Serial.println();
|
||||
heatpumpIR = new DaikinHeatpumpARC480A14IR();
|
||||
client.setServer(mqtt_server, 1883);
|
||||
client.setCallback(callback);
|
||||
|
||||
power = POWER_OFF; //after power outage reset remote to these settings. does not transmit
|
||||
acmode = MODE_FAN;
|
||||
fan = FAN_1;
|
||||
temp = 26;
|
||||
swing = VDIR_AUTO;
|
||||
comfort = false;
|
||||
econo = false;
|
||||
sensor = false;
|
||||
quiet = false;
|
||||
powerful = false;
|
||||
}
|
||||
|
||||
void setup_wifi() {
|
||||
delay(10);
|
||||
WiFi.mode(WIFI_STA); //set wifi to connect to your wifi and not start a AP
|
||||
WiFi.config(ip, gateway, subnet);
|
||||
WiFi.begin(ssid, password);
|
||||
while (WiFi.status() != WL_CONNECTED) { // waits for WIFI to connect
|
||||
delay(500);
|
||||
}
|
||||
Serial.println(WiFi.localIP());
|
||||
}
|
||||
|
||||
void reconnect() { //waits for MQTT to connect then connects to topics
|
||||
// Loop until we're reconnected
|
||||
while (!client.connected()) {
|
||||
// Attempt to connect
|
||||
client.loop();
|
||||
if (client.connect(client_id)) {
|
||||
client.subscribe(inTopic1);
|
||||
client.subscribe(inTopic2);
|
||||
client.subscribe(inTopic3);
|
||||
client.subscribe(inTopic4);
|
||||
client.subscribe(inTopic5);
|
||||
client.subscribe(inTopic6);
|
||||
client.subscribe(inTopic7);
|
||||
client.subscribe(inTopic8);
|
||||
client.subscribe(inTopic9);
|
||||
client.subscribe(inTopic10);
|
||||
client.subscribe(outTopic1);
|
||||
} else {
|
||||
delay(500);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void callback(char* topic, byte* payload, unsigned int length) { // lissons for MQTT updates
|
||||
if (strcmp(topic, inTopic1) == 0) { //POWER
|
||||
if (payload[0] == '1') {
|
||||
power = POWER_ON;
|
||||
}
|
||||
else if (payload[0] == '0') {
|
||||
power = POWER_OFF;
|
||||
}
|
||||
}
|
||||
if (strcmp(topic, inTopic2) == 0) { //MODE
|
||||
if (payload[0] == 'a') {
|
||||
acmode = MODE_AUTO;
|
||||
}
|
||||
else if (payload[0] == 'h') {
|
||||
acmode = MODE_HEAT;
|
||||
}
|
||||
else if (payload[0] == 'c') {
|
||||
acmode = MODE_COOL;
|
||||
}
|
||||
else if (payload[0] == 'd') {
|
||||
acmode = MODE_DRY;
|
||||
}
|
||||
else if (payload[0] == 'f') {
|
||||
acmode = MODE_FAN;
|
||||
}
|
||||
}
|
||||
if (strcmp(topic, inTopic3) == 0) { //FAN
|
||||
if (payload[0] == 'a') {
|
||||
fan = FAN_AUTO;
|
||||
}
|
||||
else if (payload[0] == '1') {
|
||||
fan = FAN_1;
|
||||
}
|
||||
else if (payload[0] == '2') {
|
||||
fan = FAN_2;
|
||||
}
|
||||
else if (payload[0] == '3') {
|
||||
fan = FAN_3;
|
||||
}
|
||||
else if (payload[0] == '4') {
|
||||
fan = FAN_4;
|
||||
}
|
||||
else if (payload[0] == '5') {
|
||||
fan = FAN_5;
|
||||
}
|
||||
else if (payload[0] == 's') {
|
||||
fan = FAN_SILENT;
|
||||
}
|
||||
}
|
||||
if (strcmp(topic, inTopic4) == 0) { //TEMP
|
||||
if (payload[0] == '1') {
|
||||
if (payload[1] == '8') {
|
||||
temp = 18;
|
||||
}
|
||||
else if (payload[1] == '9') {
|
||||
temp = 19;
|
||||
}
|
||||
}
|
||||
else if (payload[0] == '3') {
|
||||
if (payload[1] == '0') {
|
||||
temp = 30;
|
||||
}
|
||||
else if (payload[1] == '1') {
|
||||
temp = 31;
|
||||
}
|
||||
}
|
||||
else if (payload[0] == '2') {
|
||||
if (payload[1] == '0') {
|
||||
temp = 20;
|
||||
}
|
||||
else if (payload[1] == '1') {
|
||||
temp = 21;
|
||||
}
|
||||
else if (payload[1] == '2') {
|
||||
temp = 22;
|
||||
}
|
||||
else if (payload[1] == '3') {
|
||||
temp = 23;
|
||||
}
|
||||
else if (payload[1] == '4') {
|
||||
temp = 24;
|
||||
}
|
||||
else if (payload[1] == '5') {
|
||||
temp = 25;
|
||||
}
|
||||
else if (payload[1] == '6') {
|
||||
temp = 26;
|
||||
}
|
||||
else if (payload[1] == '7') {
|
||||
temp = 27;
|
||||
}
|
||||
else if (payload[1] == '8') {
|
||||
temp = 28;
|
||||
}
|
||||
else if (payload[1] == '9') {
|
||||
temp = 29;
|
||||
}
|
||||
}
|
||||
}
|
||||
if (strcmp(topic, inTopic5) == 0) { //SWING
|
||||
if (payload[0] == 'a') {
|
||||
swing = VDIR_SWING;
|
||||
Serial.println("swing on sent");
|
||||
}
|
||||
else if (payload[0] == 'm') {
|
||||
swing = VDIR_UP;
|
||||
Serial.println("swing off sent");
|
||||
}
|
||||
}
|
||||
if (strcmp(topic, inTopic6) == 0) { //comfort
|
||||
if (payload[0] == '1') {
|
||||
comfort = high;
|
||||
}
|
||||
else if (payload[0] == '0') {
|
||||
comfort = low;
|
||||
}
|
||||
}
|
||||
if (strcmp(topic, inTopic7) == 0) { //econo
|
||||
if (payload[0] == '1') {
|
||||
econo = high;
|
||||
}
|
||||
else if (payload[0] == '0') {
|
||||
econo = low;
|
||||
}
|
||||
}
|
||||
if (strcmp(topic, inTopic8) == 0) { //sensor
|
||||
if (payload[0] == '1') {
|
||||
sensor = high;
|
||||
}
|
||||
else if (payload[0] == '0') {
|
||||
sensor = low;
|
||||
}
|
||||
}
|
||||
if (strcmp(topic, inTopic9) == 0) { //quiet
|
||||
if (payload[0] == '1') {
|
||||
quiet = high;
|
||||
}
|
||||
else if (payload[0] == '0') {
|
||||
quiet = low;
|
||||
}
|
||||
}
|
||||
if (strcmp(topic, inTopic10) == 0) { //powerful
|
||||
if (payload[0] == '1') {
|
||||
powerful = high;
|
||||
}
|
||||
else if (payload[0] == '0') {
|
||||
powerful = low;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void loop() {
|
||||
if (!client.connected()) {
|
||||
reconnect();
|
||||
}
|
||||
client.loop();
|
||||
delay(50);
|
||||
}
|
Loading…
Reference in New Issue