IRremoteIDF
Infrared send & receive for ESP-IDF
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#include "IRplatform.h"
25#ifdef UNIT_TEST
26#include "IRsend_test.h"
27#endif
28
29// Constants
30const uint16_t kBoschHdrMark = 4366;
31const uint16_t kBoschBitMark = 456;
32const uint16_t kBoschHdrSpace = 4415;
33const uint16_t kBoschOneSpace = 1645;
34const uint16_t kBoschZeroSpace = 610;
35const uint16_t kBoschFooterSpace = 5235;
36const uint16_t kBoschFreq = 38000; // Hz. (Guessing the most common frequency.)
37const uint16_t kBosch144NrOfSections = 3;
38const uint16_t kBosch144BytesPerSection = 6;
39
44using std::min;
45using std::max;
46using std::memcpy;
47using std::memcmp;
48
49// Modes Bit[0] to Section 3 Bit[1-2] to Section 1
50// ModeS3 ModeS1
51const uint8_t kBosch144Cool = 0b000;
52const uint8_t kBosch144Dry = 0b011;
53const uint8_t kBosch144Auto = 0b101;
54const uint8_t kBosch144Heat = 0b110;
55const uint8_t kBosch144Fan = 0b010;
56
57// Fan Control Bit[0-5] to Section 3 Bit[6-8] to Section 1
58// FanS3 FanS1
59const uint16_t kBosch144Fan20 = 0b111001010;
60const uint16_t kBosch144Fan40 = 0b100010100;
61const uint16_t kBosch144Fan60 = 0b010011110;
62const uint16_t kBosch144Fan80 = 0b001101000;
63const uint16_t kBosch144Fan100 = 0b001110010;
64const uint16_t kBosch144FanAuto = 0b101110011;
65const uint16_t kBosch144FanAuto0 = 0b000110011;
66
67// Temperature
68const uint8_t kBosch144CelsiusMin = 16;
69const uint8_t kBosch144CelsiusMax = 30;
70const uint8_t kBosch144CelsiusMap[] = {
71 // Bit[0] to Section 3: TempS4 (the "half-degree" bit)
72 // Bit[1] to Section 3: TempS3
73 // Bit[1-4] to Section 1: TempS1
74 0b000010, // 16C
75 0b000000, // 17C
76 0b000100, // 18C
77 0b001100, // 19C
78 0b001000, // 20C
79 0b011000, // 21C
80 0b011100, // 22C
81 0b010100, // 23C
82 0b010000, // 24C
83 0b110000, // 25C
84 0b110100, // 26C
85 0b100100, // 27C
86 0b100000, // 28C
87 0b101000, // 29C
88 0b101100 // 30C
89};
90
91const uint8_t kBosch144FahrenheitMin = 60;
92const uint8_t kBosch144FahrenheitMax = 86;
93const uint8_t kBosch144FahrenheitMap[] = {
94 // Bit[0] to Section 3: TempS4
95 // Bit[1] to Section 3: TempS3
96 // Bit[1-4] to Section 1: TempS1
97 0b000010, // 60F
98 0b000011, // 61F
99 0b000000, // 62F
100 0b000001, // 63F
101 0b000100, // 64F
102 0b000101, // 65F
103 0b001100, // 66F
104 0b001101, // 67F
105 0b001000, // 68F
106 0b001001, // 69F
107 0b011000, // 70F
108 0b011001, // 71F
109 0b011100, // 72F
110 0b010100, // 73F
111 0b010101, // 74F
112 0b010000, // 75F
113 0b010001, // 76F
114 0b110000, // 77F
115 0b110001, // 78F
116 0b110100, // 79F
117 0b110101, // 80F
118 0b100100, // 81F
119 0b100000, // 82F
120 0b100001, // 83F
121 0b101000, // 84F
122 0b101001, // 85F
123 0b101100 // 86F
124};
125
126// "OFF" is a 96bit-message the same as Coolix protocol
127const uint8_t kBosch144Off[] = {0xB2, 0x4D, 0x7B, 0x84, 0xE0, 0x1F,
128 0xB2, 0x4D, 0x7B, 0x84, 0xE0, 0x1F};
129
130// On, 25C, Mode: Auto
132 0xB2, 0x4D, 0x1F, 0xE0, 0xC8, 0x37,
133 0xB2, 0x4D, 0x1F, 0xE0, 0xC8, 0x37,
134 0xD5, 0x65, 0x00, 0x00, 0x00, 0x3A};
135
138 struct {
139 uint8_t :8; // Fixed value 0b10110010 / 0xB2. ############
140 uint8_t InnvertS1_1 :8; // Invert byte 0b01001101 / 0x4D #
141 uint8_t :5; // not used (without timer use) #
142 uint8_t FanS1 :3; // Fan speed bits in Section 1 #
143 uint8_t InnvertS1_2 :8; // Invert byte # Section 1
144 uint8_t :2; // not used (without timer use) # =
145 uint8_t ModeS1 :2; // Operation mode bits S1 # Section 2
146 uint8_t TempS1 :4; // Desired temperature (Celsius) S2 #
147 uint8_t InnvertS1_3 :8; // Invert byte (without timer use) ############
148
149 uint8_t :8; // Fixed value 0b10110010 / 0xB2. ############
150 uint8_t InnvertS2_1 :8; // Invert byte 0b01001101 / 0x4D #
151 uint8_t :5; // not used (without timer use) #
152 uint8_t FanS2 :3; // Fan speed bits in Section 2 #
153 uint8_t InnvertS2_2 :8; // Invert byte # Section 2
154 uint8_t :2; // not used (without timer use) # =
155 uint8_t ModeS2 :2; // Operation mode bits S2 # Section 1
156 uint8_t TempS2 :4; // Desired temperature (Celsius) S2 #
157 uint8_t InnvertS2_3 :8; // Invert byte (without timer use) ###########
158
159 uint8_t :8; // Fixed value 0b11010101 / 0xD5 ###########
160 uint8_t ModeS3 :1; // ModeBit in Section 3 #
161 uint8_t FanS3 :6; // Fan speed bits in Section 3 #
162 uint8_t :1; // Unknown #
163 uint8_t :5; // Unknown #
164 uint8_t TempS4 :1; // Desired temp #
165 uint8_t :1; // Unknown #
166 uint8_t Quiet :1; // Silent-Mode # Section 3
167 uint8_t UseFahrenheit :1; // Fahrenheit or Celcius #
168 uint8_t :3; // Unknown #
169 uint8_t TempS3 :1; // Desired temp. Bit in Section3 #
170 uint8_t :3; // Unknown #
171 uint8_t :8; // Unknown #
172 uint8_t ChecksumS3 :8; // Checksum from byte 13-17 ###########
173 };
174};
175
176// Classes
177
180 public:
181 explicit IRBosch144AC(const uint16_t pin, const bool inverted = false,
182 const bool use_modulation = true);
183 void stateReset(void);
184#if SEND_BOSCH144
185 void send(const uint16_t repeat = 0);
190 int8_t calibrate(void) { return _irsend.calibrate(); }
191#endif // SEND_BOSCH144
192 void begin();
193 void setPower(const bool state);
194 bool getPower(void) const;
195 void setTemp(const uint8_t temp, const bool fahrenheit = false);
196 uint8_t getTemp(void) const;
197 void setUseFahrenheit(const bool on);
198 bool getUseFahrenheit(void) const;
199 void setFan(const uint16_t speed);
200 uint16_t getFan(void) const;
201 void setMode(const uint8_t mode);
202 uint8_t getMode(void) const;
203 void setQuiet(const bool on);
204 bool getQuiet(void) const;
205 uint8_t* getRaw(void);
206 void setRaw(const uint8_t new_code[],
207 const uint16_t length = kBosch144StateLength);
208 static uint8_t convertMode(const stdAc::opmode_t mode);
209 static uint16_t convertFan(const stdAc::fanspeed_t speed);
210 static stdAc::opmode_t toCommonMode(const uint8_t mode);
211 static stdAc::fanspeed_t toCommonFanSpeed(const uint16_t speed);
212 stdAc::state_t toCommon(void) const;
213 String toString(void) const;
214#ifndef UNIT_TEST
215
216 private:
218#else
220 IRsendTest _irsend;
222#endif
224
225 // Internal State settings
227
228 void setInvertBytes();
229 void setCheckSumS3();
230 void setTempRaw(const uint8_t code);
231 uint8_t getTempRaw(void) const;
232};
233
234#endif // IR_BOSCH_H_
std::string String
The protocol code builds human readable output with String. On ESP-IDF that is just std::string.
Definition IRplatform.h:21
const uint16_t kBosch144StateLength
Definition IRremoteESP8266.h:1196
Class for handling detailed Bosch144 A/C messages.
Definition ir_Bosch.h:179
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:217
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:223
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:226
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:190
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:256
int8_t calibrate(uint16_t hz=38000U)
Calculate & set any offsets to account for execution times during sending.
Definition IRsend.cpp:286
const uint16_t kBoschOneSpace
Definition ir_Bosch.h:33
const uint8_t kBosch144FahrenheitMin
Definition ir_Bosch.h:91
const uint8_t kBosch144Fan
Definition ir_Bosch.h:55
const uint16_t kBoschZeroSpace
Definition ir_Bosch.h:34
const uint16_t kBosch144BytesPerSection
Definition ir_Bosch.h:38
const uint16_t kBoschFreq
Definition ir_Bosch.h:36
const uint8_t kBosch144Off[]
Definition ir_Bosch.h:127
const uint8_t kBosch144CelsiusMin
Definition ir_Bosch.h:68
const uint8_t kBosch144Dry
Definition ir_Bosch.h:52
const uint16_t kBoschFooterSpace
Definition ir_Bosch.h:35
const uint8_t kBosch144CelsiusMap[]
Definition ir_Bosch.h:70
const uint16_t kBosch144Fan100
Definition ir_Bosch.h:63
const uint16_t kBosch144Fan80
Definition ir_Bosch.h:62
const uint16_t kBosch144Fan40
Definition ir_Bosch.h:60
const uint16_t kBosch144Fan60
Definition ir_Bosch.h:61
const uint8_t kBosch144CelsiusMax
Definition ir_Bosch.h:69
const uint8_t kBosch144Heat
Definition ir_Bosch.h:54
const uint16_t kBoschHdrMark
Definition ir_Bosch.h:30
const uint16_t kBosch144FanAuto0
Definition ir_Bosch.h:65
const uint16_t kBosch144Fan20
Definition ir_Bosch.h:59
const uint16_t kBosch144NrOfSections
Definition ir_Bosch.h:37
const uint16_t kBoschHdrSpace
Definition ir_Bosch.h:32
const uint8_t kBosch144FahrenheitMap[]
Definition ir_Bosch.h:93
const uint8_t kBosch144DefaultState[kBosch144StateLength]
Definition ir_Bosch.h:131
const uint8_t kBosch144FahrenheitMax
Definition ir_Bosch.h:92
const uint8_t kBosch144Cool
Definition ir_Bosch.h:51
const uint16_t kBoschBitMark
Definition ir_Bosch.h:31
const uint8_t kBosch144Auto
Definition ir_Bosch.h:53
const uint16_t kBosch144FanAuto
Definition ir_Bosch.h:64
String addBoolToString(const bool value, const String label, const bool precomma=true)
Create a String with a colon separated flag suitable for Humans. e.g. "Power: On".
Definition IRutils.cpp:554
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=0xFF, const uint8_t medium_high=0xFF)
Create a String of human output for the given fan speed. e.g. "Fan: 0 (Auto)".
Definition IRutils.cpp:843
String addTempToString(const uint16_t degrees, const bool celsius=true, const bool precomma=true, const bool isSensorTemp=false)
Create a String of human output for a given temperature. e.g. "Temp: 25C".
Definition IRutils.cpp:743
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:781
fanspeed_t
Common A/C settings for Fan Speeds.
Definition IRsend.h:67
opmode_t
Common A/C settings for A/C operating modes.
Definition IRsend.h:55
Structure to hold a common A/C state.
Definition IRsend.h:120
Definition ir_Bosch.h:136
uint8_t TempS2
Definition ir_Bosch.h:156
uint8_t FanS1
Definition ir_Bosch.h:142
uint8_t FanS3
Definition ir_Bosch.h:161
uint8_t TempS4
Definition ir_Bosch.h:164
uint8_t ModeS3
Definition ir_Bosch.h:160
uint8_t ChecksumS3
Definition ir_Bosch.h:172
uint8_t InnvertS2_1
Definition ir_Bosch.h:150
uint8_t InnvertS1_1
Definition ir_Bosch.h:140
uint8_t FanS2
Definition ir_Bosch.h:152
uint8_t InnvertS1_3
Definition ir_Bosch.h:147
uint8_t ModeS1
Definition ir_Bosch.h:145
uint8_t Quiet
Definition ir_Bosch.h:166
uint8_t TempS1
Definition ir_Bosch.h:146
uint8_t InnvertS2_3
Definition ir_Bosch.h:157
uint8_t InnvertS1_2
Definition ir_Bosch.h:143
uint8_t TempS3
Definition ir_Bosch.h:169
uint8_t ModeS2
Definition ir_Bosch.h:155
uint8_t InnvertS2_2
Definition ir_Bosch.h:153
uint8_t raw[kBosch144StateLength]
The state in IR code form.
Definition ir_Bosch.h:137
uint8_t UseFahrenheit
Definition ir_Bosch.h:167