IRremoteESP8266
Loading...
Searching...
No Matches
ir_Bosch.h
Go to the documentation of this file.
1// Copyright 2022 Nico Thien
5
6// Supports:
7// Brand: Bosch, Model: CL3000i-Set 26 E A/C
8// Brand: Bosch, Model: RG10A(G2S)BGEF remote
9// Brand: Durastar, Model: RG10R(M2S)/BGEFU1 remote
10
11
12#ifndef IR_BOSCH_H_
13#define IR_BOSCH_H_
14
15#define __STDC_LIMIT_MACROS
16#include <stdint.h>
17#include <algorithm>
18#include <cstring>
19#include "IRremoteESP8266.h"
20#include "IRsend.h"
21#include "IRrecv.h"
22#include "IRtext.h"
23#include "IRutils.h"
24#ifndef UNIT_TEST
25#include <Arduino.h>
26#endif
27#ifdef UNIT_TEST
28#include "IRsend_test.h"
29#endif
30
31// Constants
32const uint16_t kBoschHdrMark = 4366;
33const uint16_t kBoschBitMark = 502;
34const uint16_t kBoschHdrSpace = 4415;
35const uint16_t kBoschOneSpace = 1645;
36const uint16_t kBoschZeroSpace = 571;
37const uint16_t kBoschFooterSpace = 5235;
38const uint16_t kBoschFreq = 38000; // Hz. (Guessing the most common frequency.)
39const uint16_t kBosch144NrOfSections = 3;
40const uint16_t kBosch144BytesPerSection = 6;
41
46using std::min;
47using std::max;
48using std::memcpy;
49using std::memcmp;
50
51// Modes Bit[0] to Section 3 Bit[1-2] to Section 1
52// ModeS3 ModeS1
53const uint8_t kBosch144Cool = 0b000;
54const uint8_t kBosch144Dry = 0b011;
55const uint8_t kBosch144Auto = 0b101;
56const uint8_t kBosch144Heat = 0b110;
57const uint8_t kBosch144Fan = 0b010;
58
59// Fan Control Bit[0-5] to Section 3 Bit[6-8] to Section 1
60// FanS3 FanS1
61const uint16_t kBosch144Fan20 = 0b111001010;
62const uint16_t kBosch144Fan40 = 0b100010100;
63const uint16_t kBosch144Fan60 = 0b010011110;
64const uint16_t kBosch144Fan80 = 0b001101000;
65const uint16_t kBosch144Fan100 = 0b001110010;
66const uint16_t kBosch144FanAuto = 0b101110011;
67const uint16_t kBosch144FanAuto0 = 0b000110011;
68
69// Temperature
70const uint8_t kBosch144CelsiusMin = 16;
71const uint8_t kBosch144CelsiusMax = 30;
72const uint8_t kBosch144CelsiusMap[] = {
73 // Bit[0] to Section 3: TempS4 (the "half-degree" bit)
74 // Bit[1] to Section 3: TempS3
75 // Bit[1-4] to Section 1: TempS1
76 0b000010, // 16C
77 0b000000, // 17C
78 0b000100, // 18C
79 0b001100, // 19C
80 0b001000, // 20C
81 0b011000, // 21C
82 0b011100, // 22C
83 0b010100, // 23C
84 0b010000, // 24C
85 0b110000, // 25C
86 0b110100, // 26C
87 0b100100, // 27C
88 0b100000, // 28C
89 0b101000, // 29C
90 0b101100 // 30C
91};
92
93const uint8_t kBosch144FahrenheitMin = 60;
94const uint8_t kBosch144FahrenheitMax = 86;
95const uint8_t kBosch144FahrenheitMap[] = {
96 // Bit[0] to Section 3: TempS4
97 // Bit[1] to Section 3: TempS3
98 // Bit[1-4] to Section 1: TempS1
99 0b000010, // 60F
100 0b000011, // 61F
101 0b000000, // 62F
102 0b000001, // 63F
103 0b000100, // 64F
104 0b000101, // 65F
105 0b001100, // 66F
106 0b001101, // 67F
107 0b001000, // 68F
108 0b001001, // 69F
109 0b011000, // 70F
110 0b011001, // 71F
111 0b011100, // 72F
112 0b010100, // 73F
113 0b010101, // 74F
114 0b010000, // 75F
115 0b010001, // 76F
116 0b110000, // 77F
117 0b110001, // 78F
118 0b110100, // 79F
119 0b110101, // 80F
120 0b100100, // 81F
121 0b100000, // 82F
122 0b100001, // 83F
123 0b101000, // 84F
124 0b101001, // 85F
125 0b101100 // 86F
126};
127
128// "OFF" is a 96bit-message the same as Coolix protocol
129const uint8_t kBosch144Off[] = {0xB2, 0x4D, 0x7B, 0x84, 0xE0, 0x1F,
130 0xB2, 0x4D, 0x7B, 0x84, 0xE0, 0x1F};
131
132// On, 25C, Mode: Auto
134 0xB2, 0x4D, 0x1F, 0xE0, 0xC8, 0x37,
135 0xB2, 0x4D, 0x1F, 0xE0, 0xC8, 0x37,
136 0xD5, 0x65, 0x00, 0x00, 0x00, 0x3A};
137
140 struct {
141 uint8_t :8; // Fixed value 0b10110010 / 0xB2. ############
142 uint8_t InnvertS1_1 :8; // Invert byte 0b01001101 / 0x4D #
143 uint8_t :5; // not used (without timer use) #
144 uint8_t FanS1 :3; // Fan speed bits in Section 1 #
145 uint8_t InnvertS1_2 :8; // Invert byte # Section 1
146 uint8_t :2; // not used (without timer use) # =
147 uint8_t ModeS1 :2; // Operation mode bits S1 # Section 2
148 uint8_t TempS1 :4; // Desired temperature (Celsius) S2 #
149 uint8_t InnvertS1_3 :8; // Invert byte (without timer use) ############
150
151 uint8_t :8; // Fixed value 0b10110010 / 0xB2. ############
152 uint8_t InnvertS2_1 :8; // Invert byte 0b01001101 / 0x4D #
153 uint8_t :5; // not used (without timer use) #
154 uint8_t FanS2 :3; // Fan speed bits in Section 2 #
155 uint8_t InnvertS2_2 :8; // Invert byte # Section 2
156 uint8_t :2; // not used (without timer use) # =
157 uint8_t ModeS2 :2; // Operation mode bits S2 # Section 1
158 uint8_t TempS2 :4; // Desired temperature (Celsius) S2 #
159 uint8_t InnvertS2_3 :8; // Invert byte (without timer use) ###########
160
161 uint8_t :8; // Fixed value 0b11010101 / 0xD5 ###########
162 uint8_t ModeS3 :1; // ModeBit in Section 3 #
163 uint8_t FanS3 :6; // Fan speed bits in Section 3 #
164 uint8_t :1; // Unknown #
165 uint8_t :5; // Unknown #
166 uint8_t TempS4 :1; // Desired temp #
167 uint8_t :1; // Unknown #
168 uint8_t Quiet :1; // Silent-Mode # Section 3
169 uint8_t UseFahrenheit :1; // Fahrenheit or Celcius #
170 uint8_t :3; // Unknown #
171 uint8_t TempS3 :1; // Desired temp. Bit in Section3 #
172 uint8_t :3; // Unknown #
173 uint8_t :8; // Unknown #
174 uint8_t ChecksumS3 :8; // Checksum from byte 13-17 ###########
175 };
176};
177
178// Classes
179
182 public:
183 explicit IRBosch144AC(const uint16_t pin, const bool inverted = false,
184 const bool use_modulation = true);
185 void stateReset(void);
186#if SEND_BOSCH144
187 void send(const uint16_t repeat = 0);
192 int8_t calibrate(void) { return _irsend.calibrate(); }
193#endif // SEND_BOSCH144
194 void begin();
195 void setPower(const bool state);
196 bool getPower(void) const;
197 void setTemp(const uint8_t temp, const bool fahrenheit = false);
198 uint8_t getTemp(void) const;
199 void setUseFahrenheit(const bool on);
200 bool getUseFahrenheit(void) const;
201 void setFan(const uint16_t speed);
202 uint16_t getFan(void) const;
203 void setMode(const uint8_t mode);
204 uint8_t getMode(void) const;
205 void setQuiet(const bool on);
206 bool getQuiet(void) const;
207 uint8_t* getRaw(void);
208 void setRaw(const uint8_t new_code[],
209 const uint16_t length = kBosch144StateLength);
210 static uint8_t convertMode(const stdAc::opmode_t mode);
211 static uint16_t convertFan(const stdAc::fanspeed_t speed);
212 static stdAc::opmode_t toCommonMode(const uint8_t mode);
213 static stdAc::fanspeed_t toCommonFanSpeed(const uint16_t speed);
214 stdAc::state_t toCommon(void) const;
215 String toString(void) const;
216#ifndef UNIT_TEST
217
218 private:
220#else
222 IRsendTest _irsend;
224#endif
226
227 // Internal State settings
229
230 void setInvertBytes();
231 void setCheckSumS3();
232 void setTempRaw(const uint8_t code);
233 uint8_t getTempRaw(void) const;
234};
235
236#endif // IR_BOSCH_H_
const uint16_t kBosch144StateLength
Definition IRremoteESP8266.h:1197
std::string String
Definition IRremoteESP8266.h:1564
Class for handling detailed Bosch144 A/C messages.
Definition ir_Bosch.h:181
bool getUseFahrenheit(void) const
Definition ir_Bosch.cpp:145
uint8_t getTempRaw(void) const
void setRaw(const uint8_t new_code[], const uint16_t length=kBosch144StateLength)
Set the internal state from a valid code for this protocol.
Definition ir_Bosch.cpp:78
static stdAc::fanspeed_t toCommonFanSpeed(const uint16_t speed)
Convert a native fan speed into its stdAc equivalent.
Definition ir_Bosch.cpp:241
IRsend _irsend
Instance of the IR send class.
Definition ir_Bosch.h:219
void setUseFahrenheit(const bool on)
Definition ir_Bosch.cpp:141
Bosch144Protocol _
The state of the IR remote in IR code form.
Definition ir_Bosch.h:225
void stateReset(void)
Reset the internal state to a fixed known good state.
Definition ir_Bosch.cpp:47
uint8_t getTemp(void) const
Definition ir_Bosch.cpp:122
void setTempRaw(const uint8_t code)
Definition ir_Bosch.cpp:97
uint16_t getFan(void) const
Definition ir_Bosch.cpp:156
bool getPower(void) const
Definition ir_Bosch.cpp:93
void setInvertBytes()
Definition ir_Bosch.cpp:298
uint8_t getMode(void) const
Definition ir_Bosch.cpp:171
static stdAc::opmode_t toCommonMode(const uint8_t mode)
Convert a native mode into its stdAc equivalent.
Definition ir_Bosch.cpp:228
void setQuiet(const bool on)
Set the Quiet mode of the A/C.
Definition ir_Bosch.cpp:177
void setMode(const uint8_t mode)
Set the desired operation mode.
Definition ir_Bosch.cpp:162
uint8_t * getRaw(void)
Get a copy of the internal state as a valid code for this protocol.
Definition ir_Bosch.cpp:69
bool powerFlag
Definition ir_Bosch.h:228
void setCheckSumS3()
Definition ir_Bosch.cpp:304
void begin()
Set up hardware to be able to send a message.
Definition ir_Bosch.cpp:53
void setTemp(const uint8_t temp, const bool fahrenheit=false)
Set the temp. in degrees.
Definition ir_Bosch.cpp:107
static uint16_t convertFan(const stdAc::fanspeed_t speed)
Convert a stdAc::fanspeed_t enum into it's native speed.
Definition ir_Bosch.cpp:208
void send(const uint16_t repeat=0)
Send the current internal state as an IR message.
Definition ir_Bosch.cpp:58
int8_t calibrate(void)
Run the calibration to calculate uSec timing offsets for this platform.
Definition ir_Bosch.h:192
void setFan(const uint16_t speed)
Set the speed of the fan.
Definition ir_Bosch.cpp:151
String toString(void) const
Convert the current internal state into a human readable string.
Definition ir_Bosch.cpp:280
bool getQuiet(void) const
Get the Quiet mode of the A/C.
Definition ir_Bosch.cpp:185
stdAc::state_t toCommon(void) const
Convert the current internal state into its stdAc::state_t equivalent.
Definition ir_Bosch.cpp:254
void setPower(const bool state)
Definition ir_Bosch.cpp:89
static uint8_t convertMode(const stdAc::opmode_t mode)
Convert a stdAc::opmode_t enum into its native mode.
Definition ir_Bosch.cpp:190
Class for sending all basic IR protocols.
Definition IRsend.h:249
int8_t calibrate(uint16_t hz=38000U)
Calculate & set any offsets to account for execution times during sending.
Definition IRsend.cpp:209
const uint16_t kBoschOneSpace
Definition ir_Bosch.h:35
const uint8_t kBosch144FahrenheitMin
Definition ir_Bosch.h:93
const uint8_t kBosch144Fan
Definition ir_Bosch.h:57
const uint16_t kBoschZeroSpace
Definition ir_Bosch.h:36
const uint16_t kBosch144BytesPerSection
Definition ir_Bosch.h:40
const uint16_t kBoschFreq
Definition ir_Bosch.h:38
const uint8_t kBosch144Off[]
Definition ir_Bosch.h:129
const uint8_t kBosch144CelsiusMin
Definition ir_Bosch.h:70
const uint8_t kBosch144Dry
Definition ir_Bosch.h:54
const uint16_t kBoschFooterSpace
Definition ir_Bosch.h:37
const uint8_t kBosch144CelsiusMap[]
Definition ir_Bosch.h:72
const uint16_t kBosch144Fan100
Definition ir_Bosch.h:65
const uint16_t kBosch144Fan80
Definition ir_Bosch.h:64
const uint16_t kBosch144Fan40
Definition ir_Bosch.h:62
const uint16_t kBosch144Fan60
Definition ir_Bosch.h:63
const uint8_t kBosch144CelsiusMax
Definition ir_Bosch.h:71
const uint8_t kBosch144Heat
Definition ir_Bosch.h:56
const uint16_t kBoschHdrMark
Definition ir_Bosch.h:32
const uint16_t kBosch144FanAuto0
Definition ir_Bosch.h:67
const uint16_t kBosch144Fan20
Definition ir_Bosch.h:61
const uint16_t kBosch144NrOfSections
Definition ir_Bosch.h:39
const uint16_t kBoschHdrSpace
Definition ir_Bosch.h:34
const uint8_t kBosch144FahrenheitMap[]
Definition ir_Bosch.h:95
const uint8_t kBosch144DefaultState[kBosch144StateLength]
Definition ir_Bosch.h:133
const uint8_t kBosch144FahrenheitMax
Definition ir_Bosch.h:94
const uint8_t kBosch144Cool
Definition ir_Bosch.h:53
const uint16_t kBoschBitMark
Definition ir_Bosch.h:33
const uint8_t kBosch144Auto
Definition ir_Bosch.h:55
const uint16_t kBosch144FanAuto
Definition ir_Bosch.h:66
String addBoolToString(const bool value, const String label, const bool precomma)
Create a String with a colon separated flag suitable for Humans. e.g. "Power: On".
Definition IRutils.cpp:555
String addFanToString(const uint8_t speed, const uint8_t high, const uint8_t low, const uint8_t automatic, const uint8_t quiet, const uint8_t medium, const uint8_t maximum, const uint8_t medium_high)
Create a String of human output for the given fan speed. e.g. "Fan: 0 (Auto)".
Definition IRutils.cpp:849
String addTempToString(const uint16_t degrees, const bool celsius, const bool precomma, const bool isSensorTemp)
Create a String of human output for a given temperature. e.g. "Temp: 25C".
Definition IRutils.cpp:744
String addModeToString(const uint8_t mode, const uint8_t automatic, const uint8_t cool, const uint8_t heat, const uint8_t dry, const uint8_t fan)
Create a String of human output for the given operating mode. e.g. "Mode: 1 (Cool)".
Definition IRutils.cpp:782
fanspeed_t
Common A/C settings for Fan Speeds.
Definition IRsend.h:61
opmode_t
Common A/C settings for A/C operating modes.
Definition IRsend.h:49
Structure to hold a common A/C state.
Definition IRsend.h:114
Definition ir_Bosch.h:138
uint8_t TempS2
Definition ir_Bosch.h:158
uint8_t FanS1
Definition ir_Bosch.h:144
uint8_t FanS3
Definition ir_Bosch.h:163
uint8_t TempS4
Definition ir_Bosch.h:166
uint8_t ModeS3
Definition ir_Bosch.h:162
uint8_t ChecksumS3
Definition ir_Bosch.h:174
uint8_t InnvertS2_1
Definition ir_Bosch.h:152
uint8_t InnvertS1_1
Definition ir_Bosch.h:142
uint8_t FanS2
Definition ir_Bosch.h:154
uint8_t InnvertS1_3
Definition ir_Bosch.h:149
uint8_t ModeS1
Definition ir_Bosch.h:147
uint8_t Quiet
Definition ir_Bosch.h:168
uint8_t TempS1
Definition ir_Bosch.h:148
uint8_t InnvertS2_3
Definition ir_Bosch.h:159
uint8_t InnvertS1_2
Definition ir_Bosch.h:145
uint8_t TempS3
Definition ir_Bosch.h:171
uint8_t ModeS2
Definition ir_Bosch.h:157
uint8_t InnvertS2_2
Definition ir_Bosch.h:155
uint8_t raw[kBosch144StateLength]
The state in IR code form.
Definition ir_Bosch.h:139
uint8_t UseFahrenheit
Definition ir_Bosch.h:169