ESPHome 2026.3.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 +
52 get_u16(message, 24) * 1000000);
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 +
134 get_u16(message, 20) * 1000000);
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((get_u16(message, 26) << 16) + get_u16(message, 24));
167 if (this->version_sensor_ != nullptr)
168 this->version_sensor_->publish_state(get_u16(message, 28) * 0.01f);
169}
170
172 ESP_LOGCONFIG(TAG, "Deltasol CS Plus:");
173 LOG_SENSOR(" ", "Temperature 1", this->temperature1_sensor_);
174 LOG_SENSOR(" ", "Temperature 2", this->temperature2_sensor_);
175 LOG_SENSOR(" ", "Temperature 3", this->temperature3_sensor_);
176 LOG_SENSOR(" ", "Temperature 4", this->temperature4_sensor_);
177 LOG_SENSOR(" ", "Temperature 5", this->temperature5_sensor_);
178 LOG_SENSOR(" ", "Pump Speed 1", this->pump_speed1_sensor_);
179 LOG_SENSOR(" ", "Pump Speed 2", this->pump_speed2_sensor_);
180 LOG_SENSOR(" ", "Operating Hours 1", this->operating_hours1_sensor_);
181 LOG_SENSOR(" ", "Operating Hours 2", this->operating_hours2_sensor_);
182 LOG_SENSOR(" ", "Heat Quantity", this->heat_quantity_sensor_);
183 LOG_SENSOR(" ", "System Time", this->time_sensor_);
184 LOG_SENSOR(" ", "FW Version", this->version_sensor_);
185 LOG_SENSOR(" ", "Flow Rate", this->flow_rate_sensor_);
186}
187
189 if (this->temperature1_sensor_ != nullptr)
190 this->temperature1_sensor_->publish_state(get_i16(message, 0) * 0.1f);
191 if (this->temperature2_sensor_ != nullptr)
192 this->temperature2_sensor_->publish_state(get_i16(message, 2) * 0.1f);
193 if (this->temperature3_sensor_ != nullptr)
194 this->temperature3_sensor_->publish_state(get_i16(message, 4) * 0.1f);
195 if (this->temperature4_sensor_ != nullptr)
196 this->temperature4_sensor_->publish_state(get_i16(message, 6) * 0.1f);
197 if (this->temperature5_sensor_ != nullptr)
198 this->temperature5_sensor_->publish_state(get_i16(message, 36) * 0.1f);
199 if (this->pump_speed1_sensor_ != nullptr)
200 this->pump_speed1_sensor_->publish_state(message[8]);
201 if (this->pump_speed2_sensor_ != nullptr)
202 this->pump_speed2_sensor_->publish_state(message[12]);
203 if (this->operating_hours1_sensor_ != nullptr)
205 if (this->operating_hours2_sensor_ != nullptr)
207 if (this->heat_quantity_sensor_ != nullptr)
208 this->heat_quantity_sensor_->publish_state((get_u16(message, 30) << 16) + get_u16(message, 28));
209 if (this->time_sensor_ != nullptr)
210 this->time_sensor_->publish_state(get_u16(message, 22));
211 if (this->version_sensor_ != nullptr)
212 this->version_sensor_->publish_state(get_u16(message, 32) * 0.01f);
213 if (this->flow_rate_sensor_ != nullptr)
214 this->flow_rate_sensor_->publish_state(get_u16(message, 38));
215}
216
218 ESP_LOGCONFIG(TAG, "DeltaSol BS/2 (DrainBack):");
219 LOG_SENSOR(" ", "Temperature 1", this->temperature1_sensor_);
220 LOG_SENSOR(" ", "Temperature 2", this->temperature2_sensor_);
221 LOG_SENSOR(" ", "Temperature 3", this->temperature3_sensor_);
222 LOG_SENSOR(" ", "Temperature 4", this->temperature4_sensor_);
223 LOG_SENSOR(" ", "Pump Speed 1", this->pump_speed1_sensor_);
224 LOG_SENSOR(" ", "Pump Speed 2", this->pump_speed2_sensor_);
225 LOG_SENSOR(" ", "Operating Hours 1", this->operating_hours1_sensor_);
226 LOG_SENSOR(" ", "Operating Hours 2", this->operating_hours2_sensor_);
227 LOG_SENSOR(" ", "Heat Quantity", this->heat_quantity_sensor_);
228 LOG_SENSOR(" ", "FW Version", this->version_sensor_);
229}
230
231void DeltaSolBS2Sensor::handle_message(std::vector<uint8_t> &message) {
232 if (this->temperature1_sensor_ != nullptr)
233 this->temperature1_sensor_->publish_state(get_i16(message, 0) * 0.1f);
234 if (this->temperature2_sensor_ != nullptr)
235 this->temperature2_sensor_->publish_state(get_i16(message, 2) * 0.1f);
236 if (this->temperature3_sensor_ != nullptr)
237 this->temperature3_sensor_->publish_state(get_i16(message, 4) * 0.1f);
238 if (this->temperature4_sensor_ != nullptr)
239 this->temperature4_sensor_->publish_state(get_i16(message, 6) * 0.1f);
240 if (this->pump_speed1_sensor_ != nullptr)
241 this->pump_speed1_sensor_->publish_state(message[8]);
242 if (this->pump_speed2_sensor_ != nullptr)
243 this->pump_speed2_sensor_->publish_state(message[9]);
244 if (this->operating_hours1_sensor_ != nullptr)
246 if (this->operating_hours2_sensor_ != nullptr)
248 if (this->heat_quantity_sensor_ != nullptr) {
249 float heat_wh = get_u16(message, 16) + get_u16(message, 18) * 1000.0f + get_u16(message, 20) * 1000000.0f;
250 this->heat_quantity_sensor_->publish_state(heat_wh);
251 }
252 if (this->version_sensor_ != nullptr)
253 this->version_sensor_->publish_state(get_u16(message, 24) * 0.01f);
254}
255
257 ESP_LOGCONFIG(TAG, "VBus Custom Sensor:");
258 if (this->source_ == 0xffff) {
259 ESP_LOGCONFIG(TAG, " Source address: ANY");
260 } else {
261 ESP_LOGCONFIG(TAG, " Source address: 0x%04x", this->source_);
262 }
263 if (this->dest_ == 0xffff) {
264 ESP_LOGCONFIG(TAG, " Dest address: ANY");
265 } else {
266 ESP_LOGCONFIG(TAG, " Dest address: 0x%04x", this->dest_);
267 }
268 if (this->command_ == 0xffff) {
269 ESP_LOGCONFIG(TAG, " Command: ANY");
270 } else {
271 ESP_LOGCONFIG(TAG, " Command: 0x%04x", this->command_);
272 }
273 ESP_LOGCONFIG(TAG, " Sensors:");
274 for (VBusCustomSubSensor *sensor : this->sensors_) {
275 LOG_SENSOR(" ", "-", sensor);
276 }
277}
278
279void VBusCustomSensor::handle_message(std::vector<uint8_t> &message) {
280 for (VBusCustomSubSensor *sensor : this->sensors_)
281 sensor->parse_message(message);
282}
283
284void VBusCustomSubSensor::parse_message(std::vector<uint8_t> &message) {
285 this->publish_state(this->message_parser_(message));
286}
287
288} // namespace vbus
289} // namespace esphome
void publish_state(float state)
Publish a new state to the front-end.
Definition sensor.cpp:65
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 * 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:38
const char *const TAG
Definition spi.cpp:7
Providing packet encoding functions for exchanging data with a remote host.
Definition a01nyub.cpp:7