ESPHome 2026.5.0-dev
Loading...
Searching...
No Matches
vbus_sensor.cpp
Go to the documentation of this file.
1#include "vbus_sensor.h"
3#include "esphome/core/log.h"
4
5namespace esphome {
6namespace vbus {
7
8static const char *const TAG = "vbus.sensor";
9
10static inline uint16_t get_u16(std::vector<uint8_t> &message, int start) {
11 return (message[start + 1] << 8) + message[start];
12}
13
14static inline int16_t get_i16(std::vector<uint8_t> &message, int start) {
15 return (int16_t) ((message[start + 1] << 8) + message[start]);
16}
17
19 ESP_LOGCONFIG(TAG, "Deltasol BS Plus:");
20 LOG_SENSOR(" ", "Temperature 1", this->temperature1_sensor_);
21 LOG_SENSOR(" ", "Temperature 2", this->temperature2_sensor_);
22 LOG_SENSOR(" ", "Temperature 3", this->temperature3_sensor_);
23 LOG_SENSOR(" ", "Temperature 4", this->temperature4_sensor_);
24 LOG_SENSOR(" ", "Pump Speed 1", this->pump_speed1_sensor_);
25 LOG_SENSOR(" ", "Pump Speed 2", this->pump_speed2_sensor_);
26 LOG_SENSOR(" ", "Operating Hours 1", this->operating_hours1_sensor_);
27 LOG_SENSOR(" ", "Operating Hours 2", this->operating_hours2_sensor_);
28 LOG_SENSOR(" ", "Heat Quantity", this->heat_quantity_sensor_);
29 LOG_SENSOR(" ", "System Time", this->time_sensor_);
30 LOG_SENSOR(" ", "FW Version", this->version_sensor_);
31}
32
33void DeltaSolBSPlusSensor::handle_message(std::vector<uint8_t> &message) {
34 if (this->temperature1_sensor_ != nullptr)
35 this->temperature1_sensor_->publish_state(get_i16(message, 0) * 0.1f);
36 if (this->temperature2_sensor_ != nullptr)
37 this->temperature2_sensor_->publish_state(get_i16(message, 2) * 0.1f);
38 if (this->temperature3_sensor_ != nullptr)
39 this->temperature3_sensor_->publish_state(get_i16(message, 4) * 0.1f);
40 if (this->temperature4_sensor_ != nullptr)
41 this->temperature4_sensor_->publish_state(get_i16(message, 6) * 0.1f);
42 if (this->pump_speed1_sensor_ != nullptr)
43 this->pump_speed1_sensor_->publish_state(message[8]);
44 if (this->pump_speed2_sensor_ != nullptr)
45 this->pump_speed2_sensor_->publish_state(message[9]);
46 if (this->operating_hours1_sensor_ != nullptr)
48 if (this->operating_hours2_sensor_ != nullptr)
50 if (this->heat_quantity_sensor_ != nullptr) {
51 this->heat_quantity_sensor_->publish_state(get_u16(message, 20) + get_u16(message, 22) * 1000.0f +
52 get_u16(message, 24) * 1000000.0f);
53 }
54 if (this->time_sensor_ != nullptr)
55 this->time_sensor_->publish_state(get_u16(message, 12));
56 if (this->version_sensor_ != nullptr)
57 this->version_sensor_->publish_state(get_u16(message, 26) * 0.01f);
58}
59
61 ESP_LOGCONFIG(TAG, "Deltasol BS 2009:");
62 LOG_SENSOR(" ", "Temperature 1", this->temperature1_sensor_);
63 LOG_SENSOR(" ", "Temperature 2", this->temperature2_sensor_);
64 LOG_SENSOR(" ", "Temperature 3", this->temperature3_sensor_);
65 LOG_SENSOR(" ", "Temperature 4", this->temperature4_sensor_);
66 LOG_SENSOR(" ", "Pump Speed 1", this->pump_speed1_sensor_);
67 LOG_SENSOR(" ", "Pump Speed 2", this->pump_speed2_sensor_);
68 LOG_SENSOR(" ", "Operating Hours 1", this->operating_hours1_sensor_);
69 LOG_SENSOR(" ", "Operating Hours 2", this->operating_hours2_sensor_);
70 LOG_SENSOR(" ", "Heat Quantity", this->heat_quantity_sensor_);
71 LOG_SENSOR(" ", "System Time", this->time_sensor_);
72 LOG_SENSOR(" ", "FW Version", this->version_sensor_);
73}
74
75void DeltaSolBS2009Sensor::handle_message(std::vector<uint8_t> &message) {
76 if (this->temperature1_sensor_ != nullptr)
77 this->temperature1_sensor_->publish_state(get_i16(message, 0) * 0.1f);
78 if (this->temperature2_sensor_ != nullptr)
79 this->temperature2_sensor_->publish_state(get_i16(message, 2) * 0.1f);
80 if (this->temperature3_sensor_ != nullptr)
81 this->temperature3_sensor_->publish_state(get_i16(message, 4) * 0.1f);
82 if (this->temperature4_sensor_ != nullptr)
83 this->temperature4_sensor_->publish_state(get_i16(message, 6) * 0.1f);
84 if (this->pump_speed1_sensor_ != nullptr)
85 this->pump_speed1_sensor_->publish_state(message[8]);
86 if (this->pump_speed2_sensor_ != nullptr)
87 this->pump_speed2_sensor_->publish_state(message[12]);
88 if (this->operating_hours1_sensor_ != nullptr)
90 if (this->operating_hours2_sensor_ != nullptr)
92 if (this->heat_quantity_sensor_ != nullptr) {
93 this->heat_quantity_sensor_->publish_state(get_u16(message, 28) + get_u16(message, 30) * 1000);
94 }
95 if (this->time_sensor_ != nullptr)
96 this->time_sensor_->publish_state(get_u16(message, 22));
97 if (this->version_sensor_ != nullptr)
98 this->version_sensor_->publish_state(get_u16(message, 32) * 0.01f);
99}
100
102 ESP_LOGCONFIG(TAG, "Deltasol C:");
103 LOG_SENSOR(" ", "Temperature 1", this->temperature1_sensor_);
104 LOG_SENSOR(" ", "Temperature 2", this->temperature2_sensor_);
105 LOG_SENSOR(" ", "Temperature 3", this->temperature3_sensor_);
106 LOG_SENSOR(" ", "Temperature 4", this->temperature4_sensor_);
107 LOG_SENSOR(" ", "Pump Speed 1", this->pump_speed1_sensor_);
108 LOG_SENSOR(" ", "Pump Speed 2", this->pump_speed2_sensor_);
109 LOG_SENSOR(" ", "Operating Hours 1", this->operating_hours1_sensor_);
110 LOG_SENSOR(" ", "Operating Hours 2", this->operating_hours2_sensor_);
111 LOG_SENSOR(" ", "Heat Quantity", this->heat_quantity_sensor_);
112 LOG_SENSOR(" ", "System Time", this->time_sensor_);
113}
114
115void DeltaSolCSensor::handle_message(std::vector<uint8_t> &message) {
116 if (this->temperature1_sensor_ != nullptr)
117 this->temperature1_sensor_->publish_state(get_i16(message, 0) * 0.1f);
118 if (this->temperature2_sensor_ != nullptr)
119 this->temperature2_sensor_->publish_state(get_i16(message, 2) * 0.1f);
120 if (this->temperature3_sensor_ != nullptr)
121 this->temperature3_sensor_->publish_state(get_i16(message, 4) * 0.1f);
122 if (this->temperature4_sensor_ != nullptr)
123 this->temperature4_sensor_->publish_state(get_i16(message, 6) * 0.1f);
124 if (this->pump_speed1_sensor_ != nullptr)
125 this->pump_speed1_sensor_->publish_state(message[8]);
126 if (this->pump_speed2_sensor_ != nullptr)
127 this->pump_speed2_sensor_->publish_state(message[9]);
128 if (this->operating_hours1_sensor_ != nullptr)
130 if (this->operating_hours2_sensor_ != nullptr)
132 if (this->heat_quantity_sensor_ != nullptr) {
133 this->heat_quantity_sensor_->publish_state(get_u16(message, 16) + get_u16(message, 18) * 1000.0f +
134 get_u16(message, 20) * 1000000.0f);
135 }
136 if (this->time_sensor_ != nullptr)
137 this->time_sensor_->publish_state(get_u16(message, 22));
138}
139
141 ESP_LOGCONFIG(TAG, "Deltasol CS2:");
142 LOG_SENSOR(" ", "Temperature 1", this->temperature1_sensor_);
143 LOG_SENSOR(" ", "Temperature 2", this->temperature2_sensor_);
144 LOG_SENSOR(" ", "Temperature 3", this->temperature3_sensor_);
145 LOG_SENSOR(" ", "Temperature 4", this->temperature4_sensor_);
146 LOG_SENSOR(" ", "Pump Speed", this->pump_speed_sensor_);
147 LOG_SENSOR(" ", "Operating Hours", this->operating_hours_sensor_);
148 LOG_SENSOR(" ", "Heat Quantity", this->heat_quantity_sensor_);
149 LOG_SENSOR(" ", "FW Version", this->version_sensor_);
150}
151
152void DeltaSolCS2Sensor::handle_message(std::vector<uint8_t> &message) {
153 if (this->temperature1_sensor_ != nullptr)
154 this->temperature1_sensor_->publish_state(get_i16(message, 0) * 0.1f);
155 if (this->temperature2_sensor_ != nullptr)
156 this->temperature2_sensor_->publish_state(get_i16(message, 2) * 0.1f);
157 if (this->temperature3_sensor_ != nullptr)
158 this->temperature3_sensor_->publish_state(get_i16(message, 4) * 0.1f);
159 if (this->temperature4_sensor_ != nullptr)
160 this->temperature4_sensor_->publish_state(get_i16(message, 6) * 0.1f);
161 if (this->pump_speed_sensor_ != nullptr)
162 this->pump_speed_sensor_->publish_state(message[12]);
163 if (this->operating_hours_sensor_ != nullptr)
164 this->operating_hours_sensor_->publish_state(get_u16(message, 14));
165 if (this->heat_quantity_sensor_ != nullptr) {
166 this->heat_quantity_sensor_->publish_state((static_cast<uint32_t>(get_u16(message, 26)) << 16) |
167 get_u16(message, 24));
168 }
169 if (this->version_sensor_ != nullptr)
170 this->version_sensor_->publish_state(get_u16(message, 28) * 0.01f);
171}
172
174 ESP_LOGCONFIG(TAG, "Deltasol CS4:");
175 LOG_SENSOR(" ", "Temperature 1", this->temperature1_sensor_);
176 LOG_SENSOR(" ", "Temperature 2", this->temperature2_sensor_);
177 LOG_SENSOR(" ", "Temperature 3", this->temperature3_sensor_);
178 LOG_SENSOR(" ", "Temperature 4", this->temperature4_sensor_);
179 LOG_SENSOR(" ", "Temperature 5", this->temperature5_sensor_);
180 LOG_SENSOR(" ", "Pump Speed 1", this->pump_speed1_sensor_);
181 LOG_SENSOR(" ", "Pump Speed 2", this->pump_speed2_sensor_);
182 LOG_SENSOR(" ", "Operating Hours 1", this->operating_hours1_sensor_);
183 LOG_SENSOR(" ", "Operating Hours 2", this->operating_hours2_sensor_);
184 LOG_SENSOR(" ", "Heat Quantity", this->heat_quantity_sensor_);
185 LOG_SENSOR(" ", "System Time", this->time_sensor_);
186 LOG_SENSOR(" ", "FW Version", this->version_sensor_);
187 LOG_SENSOR(" ", "Flow Rate", this->flow_rate_sensor_);
188}
189
190void DeltaSolCS4Sensor::handle_message(std::vector<uint8_t> &message) {
191 if (this->temperature1_sensor_ != nullptr)
192 this->temperature1_sensor_->publish_state(get_i16(message, 0) * 0.1f);
193 if (this->temperature2_sensor_ != nullptr)
194 this->temperature2_sensor_->publish_state(get_i16(message, 2) * 0.1f);
195 if (this->temperature3_sensor_ != nullptr)
196 this->temperature3_sensor_->publish_state(get_i16(message, 4) * 0.1f);
197 if (this->temperature4_sensor_ != nullptr)
198 this->temperature4_sensor_->publish_state(get_i16(message, 6) * 0.1f);
199 if (this->temperature5_sensor_ != nullptr)
200 this->temperature5_sensor_->publish_state(get_i16(message, 36) * 0.1f);
201 if (this->pump_speed1_sensor_ != nullptr)
202 this->pump_speed1_sensor_->publish_state(message[8]);
203 if (this->pump_speed2_sensor_ != nullptr)
204 this->pump_speed2_sensor_->publish_state(message[12]);
205 if (this->operating_hours1_sensor_ != nullptr)
207 if (this->operating_hours2_sensor_ != nullptr)
209 if (this->heat_quantity_sensor_ != nullptr) {
210 this->heat_quantity_sensor_->publish_state((static_cast<uint32_t>(get_u16(message, 30)) << 16) |
211 get_u16(message, 28));
212 }
213 if (this->time_sensor_ != nullptr)
214 this->time_sensor_->publish_state(get_u16(message, 22));
215 if (this->version_sensor_ != nullptr)
216 this->version_sensor_->publish_state(get_u16(message, 32) * 0.01f);
217 if (this->flow_rate_sensor_ != nullptr)
218 this->flow_rate_sensor_->publish_state(get_u16(message, 38));
219}
220
222 ESP_LOGCONFIG(TAG, "Deltasol CS Plus:");
223 LOG_SENSOR(" ", "Temperature 1", this->temperature1_sensor_);
224 LOG_SENSOR(" ", "Temperature 2", this->temperature2_sensor_);
225 LOG_SENSOR(" ", "Temperature 3", this->temperature3_sensor_);
226 LOG_SENSOR(" ", "Temperature 4", this->temperature4_sensor_);
227 LOG_SENSOR(" ", "Temperature 5", this->temperature5_sensor_);
228 LOG_SENSOR(" ", "Pump Speed 1", this->pump_speed1_sensor_);
229 LOG_SENSOR(" ", "Pump Speed 2", this->pump_speed2_sensor_);
230 LOG_SENSOR(" ", "Operating Hours 1", this->operating_hours1_sensor_);
231 LOG_SENSOR(" ", "Operating Hours 2", this->operating_hours2_sensor_);
232 LOG_SENSOR(" ", "Heat Quantity", this->heat_quantity_sensor_);
233 LOG_SENSOR(" ", "System Time", this->time_sensor_);
234 LOG_SENSOR(" ", "FW Version", this->version_sensor_);
235 LOG_SENSOR(" ", "Flow Rate", this->flow_rate_sensor_);
236}
237
239 if (this->temperature1_sensor_ != nullptr)
240 this->temperature1_sensor_->publish_state(get_i16(message, 0) * 0.1f);
241 if (this->temperature2_sensor_ != nullptr)
242 this->temperature2_sensor_->publish_state(get_i16(message, 2) * 0.1f);
243 if (this->temperature3_sensor_ != nullptr)
244 this->temperature3_sensor_->publish_state(get_i16(message, 4) * 0.1f);
245 if (this->temperature4_sensor_ != nullptr)
246 this->temperature4_sensor_->publish_state(get_i16(message, 6) * 0.1f);
247 if (this->temperature5_sensor_ != nullptr)
248 this->temperature5_sensor_->publish_state(get_i16(message, 36) * 0.1f);
249 if (this->pump_speed1_sensor_ != nullptr)
250 this->pump_speed1_sensor_->publish_state(message[8]);
251 if (this->pump_speed2_sensor_ != nullptr)
252 this->pump_speed2_sensor_->publish_state(message[12]);
253 if (this->operating_hours1_sensor_ != nullptr)
255 if (this->operating_hours2_sensor_ != nullptr)
257 if (this->heat_quantity_sensor_ != nullptr) {
258 this->heat_quantity_sensor_->publish_state((static_cast<uint32_t>(get_u16(message, 30)) << 16) |
259 get_u16(message, 28));
260 }
261 if (this->time_sensor_ != nullptr)
262 this->time_sensor_->publish_state(get_u16(message, 22));
263 if (this->version_sensor_ != nullptr)
264 this->version_sensor_->publish_state(get_u16(message, 32) * 0.01f);
265 if (this->flow_rate_sensor_ != nullptr)
266 this->flow_rate_sensor_->publish_state(get_u16(message, 38));
267}
268
270 ESP_LOGCONFIG(TAG, "DeltaSol BS/2 (DrainBack):");
271 LOG_SENSOR(" ", "Temperature 1", this->temperature1_sensor_);
272 LOG_SENSOR(" ", "Temperature 2", this->temperature2_sensor_);
273 LOG_SENSOR(" ", "Temperature 3", this->temperature3_sensor_);
274 LOG_SENSOR(" ", "Temperature 4", this->temperature4_sensor_);
275 LOG_SENSOR(" ", "Pump Speed 1", this->pump_speed1_sensor_);
276 LOG_SENSOR(" ", "Pump Speed 2", this->pump_speed2_sensor_);
277 LOG_SENSOR(" ", "Operating Hours 1", this->operating_hours1_sensor_);
278 LOG_SENSOR(" ", "Operating Hours 2", this->operating_hours2_sensor_);
279 LOG_SENSOR(" ", "Heat Quantity", this->heat_quantity_sensor_);
280 LOG_SENSOR(" ", "FW Version", this->version_sensor_);
281}
282
283void DeltaSolBS2Sensor::handle_message(std::vector<uint8_t> &message) {
284 if (this->temperature1_sensor_ != nullptr)
285 this->temperature1_sensor_->publish_state(get_i16(message, 0) * 0.1f);
286 if (this->temperature2_sensor_ != nullptr)
287 this->temperature2_sensor_->publish_state(get_i16(message, 2) * 0.1f);
288 if (this->temperature3_sensor_ != nullptr)
289 this->temperature3_sensor_->publish_state(get_i16(message, 4) * 0.1f);
290 if (this->temperature4_sensor_ != nullptr)
291 this->temperature4_sensor_->publish_state(get_i16(message, 6) * 0.1f);
292 if (this->pump_speed1_sensor_ != nullptr)
293 this->pump_speed1_sensor_->publish_state(message[8]);
294 if (this->pump_speed2_sensor_ != nullptr)
295 this->pump_speed2_sensor_->publish_state(message[9]);
296 if (this->operating_hours1_sensor_ != nullptr)
298 if (this->operating_hours2_sensor_ != nullptr)
300 if (this->heat_quantity_sensor_ != nullptr) {
301 float heat_wh = get_u16(message, 16) + get_u16(message, 18) * 1000.0f + get_u16(message, 20) * 1000000.0f;
302 this->heat_quantity_sensor_->publish_state(heat_wh);
303 }
304 if (this->version_sensor_ != nullptr)
305 this->version_sensor_->publish_state(get_u16(message, 24) * 0.01f);
306}
307
309 ESP_LOGCONFIG(TAG, "VBus Custom Sensor:");
310 if (this->source_ == 0xffff) {
311 ESP_LOGCONFIG(TAG, " Source address: ANY");
312 } else {
313 ESP_LOGCONFIG(TAG, " Source address: 0x%04x", this->source_);
314 }
315 if (this->dest_ == 0xffff) {
316 ESP_LOGCONFIG(TAG, " Dest address: ANY");
317 } else {
318 ESP_LOGCONFIG(TAG, " Dest address: 0x%04x", this->dest_);
319 }
320 if (this->command_ == 0xffff) {
321 ESP_LOGCONFIG(TAG, " Command: ANY");
322 } else {
323 ESP_LOGCONFIG(TAG, " Command: 0x%04x", this->command_);
324 }
325 ESP_LOGCONFIG(TAG, " Sensors:");
326 for (VBusCustomSubSensor *sensor : this->sensors_) {
327 LOG_SENSOR(" ", "-", sensor);
328 }
329}
330
331void VBusCustomSensor::handle_message(std::vector<uint8_t> &message) {
332 for (VBusCustomSubSensor *sensor : this->sensors_)
333 sensor->parse_message(message);
334}
335
336void VBusCustomSubSensor::parse_message(std::vector<uint8_t> &message) {
337 this->publish_state(this->message_parser_(message));
338}
339
340} // namespace vbus
341} // namespace esphome
void publish_state(float state)
Publish a new state to the front-end.
Definition sensor.cpp:68
void handle_message(std::vector< uint8_t > &message) override
sensor::Sensor * operating_hours1_sensor_
Definition vbus_sensor.h:62
sensor::Sensor * operating_hours2_sensor_
Definition vbus_sensor.h:63
sensor::Sensor * operating_hours1_sensor_
sensor::Sensor * pump_speed1_sensor_
sensor::Sensor * pump_speed2_sensor_
sensor::Sensor * temperature1_sensor_
sensor::Sensor * heat_quantity_sensor_
sensor::Sensor * temperature3_sensor_
sensor::Sensor * temperature4_sensor_
sensor::Sensor * operating_hours2_sensor_
sensor::Sensor * temperature2_sensor_
void handle_message(std::vector< uint8_t > &message) override
sensor::Sensor * operating_hours2_sensor_
Definition vbus_sensor.h:32
void handle_message(std::vector< uint8_t > &message) override
sensor::Sensor * operating_hours1_sensor_
Definition vbus_sensor.h:31
sensor::Sensor * temperature3_sensor_
sensor::Sensor * temperature4_sensor_
sensor::Sensor * temperature2_sensor_
sensor::Sensor * heat_quantity_sensor_
sensor::Sensor * operating_hours_sensor_
sensor::Sensor * temperature1_sensor_
void handle_message(std::vector< uint8_t > &message) override
sensor::Sensor * pump_speed_sensor_
sensor::Sensor * temperature4_sensor_
sensor::Sensor * temperature1_sensor_
void handle_message(std::vector< uint8_t > &message) override
sensor::Sensor * temperature5_sensor_
sensor::Sensor * temperature2_sensor_
sensor::Sensor * pump_speed1_sensor_
sensor::Sensor * pump_speed2_sensor_
sensor::Sensor * operating_hours2_sensor_
sensor::Sensor * operating_hours1_sensor_
sensor::Sensor * temperature3_sensor_
sensor::Sensor * heat_quantity_sensor_
sensor::Sensor * operating_hours2_sensor_
void handle_message(std::vector< uint8_t > &message) override
sensor::Sensor * operating_hours1_sensor_
sensor::Sensor * temperature2_sensor_
Definition vbus_sensor.h:87
sensor::Sensor * temperature3_sensor_
Definition vbus_sensor.h:88
void handle_message(std::vector< uint8_t > &message) override
sensor::Sensor * pump_speed1_sensor_
Definition vbus_sensor.h:90
sensor::Sensor * temperature1_sensor_
Definition vbus_sensor.h:86
sensor::Sensor * operating_hours1_sensor_
Definition vbus_sensor.h:92
sensor::Sensor * time_sensor_
Definition vbus_sensor.h:95
sensor::Sensor * pump_speed2_sensor_
Definition vbus_sensor.h:91
sensor::Sensor * operating_hours2_sensor_
Definition vbus_sensor.h:93
sensor::Sensor * temperature4_sensor_
Definition vbus_sensor.h:89
sensor::Sensor * heat_quantity_sensor_
Definition vbus_sensor.h:94
void handle_message(std::vector< uint8_t > &message) override
std::vector< VBusCustomSubSensor * > sensors_
void parse_message(std::vector< uint8_t > &message)
const char * message
Definition component.cpp:35
const char *const TAG
Definition spi.cpp:7
Providing packet encoding functions for exchanging data with a remote host.
Definition a01nyub.cpp:7
static void uint32_t