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