1
+ #include < DaikinHeatpumpIR.h>
2
+
3
+ DaikinHeatpumpIR::DaikinHeatpumpIR () : HeatpumpIR()
4
+ {
5
+ static const char PROGMEM model[] PROGMEM = " daikin" ;
6
+ static const char PROGMEM info[] PROGMEM = " {\" mdl\" :\" daikin\" ,\" dn\" :\" Daikin\" ,\" mT\" :18,\" xT\" :30,\" fs\" :6,\" maint\" :[10,11,12,13,14,15,16,17]}}}" ;
7
+
8
+ _model = model;
9
+ _info = info;
10
+ }
11
+
12
+
13
+ // Daikin numeric values to command bytes
14
+ void DaikinHeatpumpIR::send (IRSender& IR, uint8_t powerModeCmd, uint8_t operatingModeCmd, uint8_t fanSpeedCmd, uint8_t temperatureCmd, uint8_t swingVCmd, uint8_t swingHCmd)
15
+ {
16
+ // Sensible defaults for the heat pump mode
17
+
18
+ uint8_t operatingMode = DAIKIN_AIRCON_MODE_OFF | DAIKIN_AIRCON_MODE_AUTO;
19
+ uint8_t fanSpeed = DAIKIN_AIRCON_FAN_AUTO;
20
+ uint8_t temperature = 23 ;
21
+
22
+ switch (powerModeCmd)
23
+ {
24
+ case POWER_ON:
25
+ operatingMode |= DAIKIN_AIRCON_MODE_ON;
26
+ break ;
27
+ }
28
+
29
+ switch (operatingModeCmd)
30
+ {
31
+ case MODE_AUTO:
32
+ operatingMode |= DAIKIN_AIRCON_MODE_AUTO;
33
+ break ;
34
+ case MODE_HEAT:
35
+ operatingMode |= DAIKIN_AIRCON_MODE_HEAT;
36
+ break ;
37
+ case MODE_COOL:
38
+ operatingMode |= DAIKIN_AIRCON_MODE_COOL;
39
+ break ;
40
+ case MODE_DRY:
41
+ operatingMode |= DAIKIN_AIRCON_MODE_DRY;
42
+ temperatureCmd = 0x24 ;
43
+ break ;
44
+ case MODE_FAN:
45
+ operatingMode |= DAIKIN_AIRCON_MODE_FAN;
46
+ temperatureCmd = 0xC0 ;
47
+ break ;
48
+ }
49
+
50
+ switch (fanSpeedCmd)
51
+ {
52
+ case FAN_AUTO:
53
+ fanSpeed = DAIKIN_AIRCON_FAN_AUTO;
54
+ break ;
55
+ case FAN_1:
56
+ fanSpeed = DAIKIN_AIRCON_FAN1;
57
+ break ;
58
+ case FAN_2:
59
+ fanSpeed = DAIKIN_AIRCON_FAN2;
60
+ break ;
61
+ case FAN_3:
62
+ fanSpeed = DAIKIN_AIRCON_FAN3;
63
+ break ;
64
+ case FAN_4:
65
+ fanSpeed = DAIKIN_AIRCON_FAN4;
66
+ break ;
67
+ case FAN_5:
68
+ fanSpeed = DAIKIN_AIRCON_FAN5;
69
+ break ;
70
+ }
71
+
72
+ if ((operatingModeCmd == DAIKIN_AIRCON_MODE_HEAT && temperatureCmd >= 10 && temperatureCmd <= 30 ) ||
73
+ (temperatureCmd >= 18 && temperatureCmd <= 30 ))
74
+ {
75
+ temperature = temperatureCmd << 1 ;
76
+ }
77
+
78
+ sendDaikin (IR, operatingMode, fanSpeed, temperature, swingVCmd, swingHCmd);
79
+ }
80
+
81
+
82
+ // Send the Daikin code
83
+ void DaikinHeatpumpIR::sendDaikin (IRSender& IR, uint8_t operatingMode, uint8_t fanSpeed, uint8_t temperature, uint8_t swingV, uint8_t swingH)
84
+ {
85
+ (void )swingV;
86
+ (void )swingH;
87
+
88
+ uint8_t daikinTemplate[35 ] = {
89
+ 0x11 , 0xDA , 0x27 , 0x00 , 0xC5 , 0x00 , 0x00 , 0xD7 , // First header
90
+ // 0 1 2 3 4 5 6 7
91
+ 0x11 , 0xDA , 0x27 , 0x00 , 0x42 , 0x49 , 0x05 , 0xA2 , // Second header, this seems to have the wall clock time (bytes 12 & 13 are changing)
92
+ // 8 9 10 11 12 13 14 15
93
+ 0x11 , 0xDA , 0x27 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x06 , 0x60 , 0x00 , 0x00 , 0xC0 , 0x00 , 0x00 , 0x00 };
94
+ // 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34
95
+
96
+ daikinTemplate[21 ] = operatingMode;
97
+ daikinTemplate[22 ] = temperature;
98
+ daikinTemplate[24 ] = fanSpeed;
99
+
100
+ // Checksum calculation
101
+ // * Checksums at bytes 7 and 15 are calculated the same way
102
+ uint8_t checksum = 0x00 ;
103
+
104
+ for (int i=16 ; i<34 ; i++) {
105
+ checksum += daikinTemplate[i];
106
+ }
107
+
108
+ daikinTemplate[34 ] = checksum;
109
+
110
+ // 38 kHz PWM frequency
111
+ IR.setFrequency (38 );
112
+
113
+ // Header
114
+ IR.mark (DAIKIN_AIRCON_HDR_MARK);
115
+ IR.space (DAIKIN_AIRCON_HDR_SPACE);
116
+
117
+ // First header
118
+ for (int i=0 ; i<8 ; i++) {
119
+ IR.sendIRbyte (daikinTemplate[i], DAIKIN_AIRCON_BIT_MARK, DAIKIN_AIRCON_ZERO_SPACE, DAIKIN_AIRCON_ONE_SPACE);
120
+ }
121
+
122
+ // Pause + new header
123
+ IR.mark (DAIKIN_AIRCON_BIT_MARK);
124
+ IR.space (DAIKIN_AIRCON_MSG_SPACE);
125
+ IR.mark (DAIKIN_AIRCON_HDR_MARK);
126
+ IR.space (DAIKIN_AIRCON_HDR_SPACE);
127
+
128
+ // Second header - this probably has the wall clock time
129
+ for (int i=8 ; i<16 ; i++) {
130
+ IR.sendIRbyte (daikinTemplate[i], DAIKIN_AIRCON_BIT_MARK, DAIKIN_AIRCON_ZERO_SPACE, DAIKIN_AIRCON_ONE_SPACE);
131
+ }
132
+
133
+ // Pause + new header
134
+ IR.mark (DAIKIN_AIRCON_BIT_MARK);
135
+ IR.space (DAIKIN_AIRCON_MSG_SPACE);
136
+ IR.mark (DAIKIN_AIRCON_HDR_MARK);
137
+ IR.space (DAIKIN_AIRCON_HDR_SPACE);
138
+
139
+ // Last 19 bytes - the actual payload
140
+ for (int i=16 ; i<35 ; i++) {
141
+ IR.sendIRbyte (daikinTemplate[i], DAIKIN_AIRCON_BIT_MARK, DAIKIN_AIRCON_ZERO_SPACE, DAIKIN_AIRCON_ONE_SPACE);
142
+ }
143
+
144
+ IR.mark (DAIKIN_AIRCON_BIT_MARK);
145
+ IR.space (0 );
146
+ }
0 commit comments