ESPHome 2025.5.0
Loading...
Searching...
No Matches
component_iterator.cpp
Go to the documentation of this file.
2
4
5#ifdef USE_API
8#endif
9
10namespace esphome {
11
12void ComponentIterator::begin(bool include_internal) {
13 this->state_ = IteratorState::BEGIN;
14 this->at_ = 0;
15 this->include_internal_ = include_internal;
16}
18 bool advance_platform = false;
19 bool success = true;
20 switch (this->state_) {
22 // not started
23 return;
25 if (this->on_begin()) {
26 advance_platform = true;
27 } else {
28 return;
29 }
30 break;
31#ifdef USE_BINARY_SENSOR
33 if (this->at_ >= App.get_binary_sensors().size()) {
34 advance_platform = true;
35 } else {
36 auto *binary_sensor = App.get_binary_sensors()[this->at_];
37 if (binary_sensor->is_internal() && !this->include_internal_) {
38 success = true;
39 break;
40 } else {
41 success = this->on_binary_sensor(binary_sensor);
42 }
43 }
44 break;
45#endif
46#ifdef USE_COVER
48 if (this->at_ >= App.get_covers().size()) {
49 advance_platform = true;
50 } else {
51 auto *cover = App.get_covers()[this->at_];
52 if (cover->is_internal() && !this->include_internal_) {
53 success = true;
54 break;
55 } else {
56 success = this->on_cover(cover);
57 }
58 }
59 break;
60#endif
61#ifdef USE_FAN
63 if (this->at_ >= App.get_fans().size()) {
64 advance_platform = true;
65 } else {
66 auto *fan = App.get_fans()[this->at_];
67 if (fan->is_internal() && !this->include_internal_) {
68 success = true;
69 break;
70 } else {
71 success = this->on_fan(fan);
72 }
73 }
74 break;
75#endif
76#ifdef USE_LIGHT
78 if (this->at_ >= App.get_lights().size()) {
79 advance_platform = true;
80 } else {
81 auto *light = App.get_lights()[this->at_];
82 if (light->is_internal() && !this->include_internal_) {
83 success = true;
84 break;
85 } else {
86 success = this->on_light(light);
87 }
88 }
89 break;
90#endif
91#ifdef USE_SENSOR
93 if (this->at_ >= App.get_sensors().size()) {
94 advance_platform = true;
95 } else {
96 auto *sensor = App.get_sensors()[this->at_];
97 if (sensor->is_internal() && !this->include_internal_) {
98 success = true;
99 break;
100 } else {
101 success = this->on_sensor(sensor);
102 }
103 }
104 break;
105#endif
106#ifdef USE_SWITCH
108 if (this->at_ >= App.get_switches().size()) {
109 advance_platform = true;
110 } else {
111 auto *a_switch = App.get_switches()[this->at_];
112 if (a_switch->is_internal() && !this->include_internal_) {
113 success = true;
114 break;
115 } else {
116 success = this->on_switch(a_switch);
117 }
118 }
119 break;
120#endif
121#ifdef USE_BUTTON
123 if (this->at_ >= App.get_buttons().size()) {
124 advance_platform = true;
125 } else {
126 auto *button = App.get_buttons()[this->at_];
127 if (button->is_internal() && !this->include_internal_) {
128 success = true;
129 break;
130 } else {
131 success = this->on_button(button);
132 }
133 }
134 break;
135#endif
136#ifdef USE_TEXT_SENSOR
138 if (this->at_ >= App.get_text_sensors().size()) {
139 advance_platform = true;
140 } else {
141 auto *text_sensor = App.get_text_sensors()[this->at_];
142 if (text_sensor->is_internal() && !this->include_internal_) {
143 success = true;
144 break;
145 } else {
146 success = this->on_text_sensor(text_sensor);
147 }
148 }
149 break;
150#endif
151#ifdef USE_API
152 case IteratorState ::SERVICE:
153 if (this->at_ >= api::global_api_server->get_user_services().size()) {
154 advance_platform = true;
155 } else {
156 auto *service = api::global_api_server->get_user_services()[this->at_];
157 success = this->on_service(service);
158 }
159 break;
160#endif
161#ifdef USE_ESP32_CAMERA
163 if (esp32_camera::global_esp32_camera == nullptr) {
164 advance_platform = true;
165 } else {
166 if (esp32_camera::global_esp32_camera->is_internal() && !this->include_internal_) {
167 advance_platform = success = true;
168 break;
169 } else {
170 advance_platform = success = this->on_camera(esp32_camera::global_esp32_camera);
171 }
172 }
173 break;
174#endif
175#ifdef USE_CLIMATE
177 if (this->at_ >= App.get_climates().size()) {
178 advance_platform = true;
179 } else {
180 auto *climate = App.get_climates()[this->at_];
181 if (climate->is_internal() && !this->include_internal_) {
182 success = true;
183 break;
184 } else {
185 success = this->on_climate(climate);
186 }
187 }
188 break;
189#endif
190#ifdef USE_NUMBER
192 if (this->at_ >= App.get_numbers().size()) {
193 advance_platform = true;
194 } else {
195 auto *number = App.get_numbers()[this->at_];
196 if (number->is_internal() && !this->include_internal_) {
197 success = true;
198 break;
199 } else {
200 success = this->on_number(number);
201 }
202 }
203 break;
204#endif
205#ifdef USE_DATETIME_DATE
207 if (this->at_ >= App.get_dates().size()) {
208 advance_platform = true;
209 } else {
210 auto *date = App.get_dates()[this->at_];
211 if (date->is_internal() && !this->include_internal_) {
212 success = true;
213 break;
214 } else {
215 success = this->on_date(date);
216 }
217 }
218 break;
219#endif
220#ifdef USE_DATETIME_TIME
222 if (this->at_ >= App.get_times().size()) {
223 advance_platform = true;
224 } else {
225 auto *time = App.get_times()[this->at_];
226 if (time->is_internal() && !this->include_internal_) {
227 success = true;
228 break;
229 } else {
230 success = this->on_time(time);
231 }
232 }
233 break;
234#endif
235#ifdef USE_DATETIME_DATETIME
237 if (this->at_ >= App.get_datetimes().size()) {
238 advance_platform = true;
239 } else {
240 auto *datetime = App.get_datetimes()[this->at_];
241 if (datetime->is_internal() && !this->include_internal_) {
242 success = true;
243 break;
244 } else {
245 success = this->on_datetime(datetime);
246 }
247 }
248 break;
249#endif
250#ifdef USE_TEXT
252 if (this->at_ >= App.get_texts().size()) {
253 advance_platform = true;
254 } else {
255 auto *text = App.get_texts()[this->at_];
256 if (text->is_internal() && !this->include_internal_) {
257 success = true;
258 break;
259 } else {
260 success = this->on_text(text);
261 }
262 }
263 break;
264#endif
265#ifdef USE_SELECT
267 if (this->at_ >= App.get_selects().size()) {
268 advance_platform = true;
269 } else {
270 auto *select = App.get_selects()[this->at_];
271 if (select->is_internal() && !this->include_internal_) {
272 success = true;
273 break;
274 } else {
275 success = this->on_select(select);
276 }
277 }
278 break;
279#endif
280#ifdef USE_LOCK
282 if (this->at_ >= App.get_locks().size()) {
283 advance_platform = true;
284 } else {
285 auto *a_lock = App.get_locks()[this->at_];
286 if (a_lock->is_internal() && !this->include_internal_) {
287 success = true;
288 break;
289 } else {
290 success = this->on_lock(a_lock);
291 }
292 }
293 break;
294#endif
295#ifdef USE_VALVE
297 if (this->at_ >= App.get_valves().size()) {
298 advance_platform = true;
299 } else {
300 auto *valve = App.get_valves()[this->at_];
301 if (valve->is_internal() && !this->include_internal_) {
302 success = true;
303 break;
304 } else {
305 success = this->on_valve(valve);
306 }
307 }
308 break;
309#endif
310#ifdef USE_MEDIA_PLAYER
312 if (this->at_ >= App.get_media_players().size()) {
313 advance_platform = true;
314 } else {
315 auto *media_player = App.get_media_players()[this->at_];
316 if (media_player->is_internal() && !this->include_internal_) {
317 success = true;
318 break;
319 } else {
320 success = this->on_media_player(media_player);
321 }
322 }
323 break;
324#endif
325#ifdef USE_ALARM_CONTROL_PANEL
327 if (this->at_ >= App.get_alarm_control_panels().size()) {
328 advance_platform = true;
329 } else {
330 auto *a_alarm_control_panel = App.get_alarm_control_panels()[this->at_];
331 if (a_alarm_control_panel->is_internal() && !this->include_internal_) {
332 success = true;
333 break;
334 } else {
335 success = this->on_alarm_control_panel(a_alarm_control_panel);
336 }
337 }
338 break;
339#endif
340#ifdef USE_EVENT
342 if (this->at_ >= App.get_events().size()) {
343 advance_platform = true;
344 } else {
345 auto *event = App.get_events()[this->at_];
346 if (event->is_internal() && !this->include_internal_) {
347 success = true;
348 break;
349 } else {
350 success = this->on_event(event);
351 }
352 }
353 break;
354#endif
355#ifdef USE_UPDATE
357 if (this->at_ >= App.get_updates().size()) {
358 advance_platform = true;
359 } else {
360 auto *update = App.get_updates()[this->at_];
361 if (update->is_internal() && !this->include_internal_) {
362 success = true;
363 break;
364 } else {
365 success = this->on_update(update);
366 }
367 }
368 break;
369#endif
371 if (this->on_end()) {
372 this->state_ = IteratorState::NONE;
373 }
374 return;
375 }
376
377 if (advance_platform) {
378 this->state_ = static_cast<IteratorState>(static_cast<uint32_t>(this->state_) + 1);
379 this->at_ = 0;
380 } else if (success) {
381 this->at_++;
382 }
383}
384bool ComponentIterator::on_end() { return true; }
385bool ComponentIterator::on_begin() { return true; }
386#ifdef USE_API
388#endif
389#ifdef USE_ESP32_CAMERA
391#endif
392#ifdef USE_MEDIA_PLAYER
394#endif
395} // namespace esphome
const std::vector< button::Button * > & get_buttons()
const std::vector< datetime::TimeEntity * > & get_times()
const std::vector< valve::Valve * > & get_valves()
const std::vector< fan::Fan * > & get_fans()
const std::vector< switch_::Switch * > & get_switches()
const std::vector< sensor::Sensor * > & get_sensors()
const std::vector< text_sensor::TextSensor * > & get_text_sensors()
const std::vector< lock::Lock * > & get_locks()
const std::vector< datetime::DateTimeEntity * > & get_datetimes()
const std::vector< select::Select * > & get_selects()
const std::vector< text::Text * > & get_texts()
const std::vector< climate::Climate * > & get_climates()
const std::vector< light::LightState * > & get_lights()
const std::vector< update::UpdateEntity * > & get_updates()
const std::vector< datetime::DateEntity * > & get_dates()
const std::vector< alarm_control_panel::AlarmControlPanel * > & get_alarm_control_panels()
const std::vector< cover::Cover * > & get_covers()
const std::vector< media_player::MediaPlayer * > & get_media_players()
const std::vector< binary_sensor::BinarySensor * > & get_binary_sensors()
const std::vector< event::Event * > & get_events()
const std::vector< number::Number * > & get_numbers()
virtual bool on_text(text::Text *text)=0
virtual bool on_media_player(media_player::MediaPlayer *media_player)
virtual bool on_alarm_control_panel(alarm_control_panel::AlarmControlPanel *a_alarm_control_panel)=0
virtual bool on_date(datetime::DateEntity *date)=0
virtual bool on_cover(cover::Cover *cover)=0
virtual bool on_datetime(datetime::DateTimeEntity *datetime)=0
virtual bool on_select(select::Select *select)=0
void begin(bool include_internal=false)
virtual bool on_button(button::Button *button)=0
virtual bool on_camera(esp32_camera::ESP32Camera *camera)
virtual bool on_sensor(sensor::Sensor *sensor)=0
virtual bool on_text_sensor(text_sensor::TextSensor *text_sensor)=0
virtual bool on_valve(valve::Valve *valve)=0
virtual bool on_service(api::UserServiceDescriptor *service)
virtual bool on_fan(fan::Fan *fan)=0
virtual bool on_number(number::Number *number)=0
virtual bool on_switch(switch_::Switch *a_switch)=0
virtual bool on_climate(climate::Climate *climate)=0
virtual bool on_time(datetime::TimeEntity *time)=0
virtual bool on_light(light::LightState *light)=0
virtual bool on_event(event::Event *event)=0
virtual bool on_lock(lock::Lock *a_lock)=0
virtual bool on_update(update::UpdateEntity *update)=0
virtual bool on_binary_sensor(binary_sensor::BinarySensor *binary_sensor)=0
const std::vector< UserServiceDescriptor * > & get_user_services() const
Definition api_server.h:131
APIServer * global_api_server
ESP32Camera * global_esp32_camera
Providing packet encoding functions for exchanging data with a remote host.
Definition a01nyub.cpp:7
Application App
Global storage of Application pointer - only one Application can exist.