@thomasv je zou haast de hele MV box opensource gaan produceren. De controller heb je al, de rest is een standaard motor en veel plastic en schuim 😌
Ik ben eens flink aan het klussen gegaan met mijn nieuwe OpenAir Mini in mijn Orcon, samen met het setje van 4 sensoren.
Mijn uitgangspunten:
Disclaimer: ik ben beginner met ESPHome, ESP32, YAML en ik ben al helemaal geen c++ developer, onderstaande code heb ik grotendeels met Claude eruit geperst (en gevalideerd met andere models en roestige oude matige dev skills van lang geleden).
Voor mij werkt dit nu en ben ik best tevreden, maar: er is nu heel veel functionaliteit in de c++ Lambda gekomen, wat natuurlijk een beetje voorbij gaat aan het ESPhome concept. Pak ik het te complex aan?
Opmerkingen, correcties, aanvullingen en alles wat er tussen zit meer dan welkom.
Edit: bugfixes, code optimalisatie en commentaren gefikst
Edit2: Nu met een configureerbare day/night mode waarin naar wens de auto high speed en hold speed gedurende de dag en nacht anders gezet kunnen worden. Omdat mijn Orcon boven de 50% redelijk hoorbaar is in een stil huis vind ik dat gedurende de nacht minder acceptabel.
Edit3: meer bugfixes, er stond oude foute code op de sensors in de on_value.
Mijn uitgangspunten:
- Ik wil dat de Orcon zelfs zonder HA en HomeKit (mijn primaire interface) sensorgestuurd kan draaien
- Ik wil naast een auto-mode ook een off-mode en manual-3-standen modus hebben, waarin sensordata niet meer leidend is
- Ik wil de manual mode zowel vanuit HA als HK kunnen aansturen
- Ik wil dat ik eventueel nog automatiseringen in HA of HK kan maken op basis van weetikveel, maar daarmee dus de logica op het ESP bordje buiten spel kan zetten
- De handmatige bediening in HomeKit is nodig omdat ik daar twee 4 remotes in keuken en badkamer gebruik, als ik weet dat ik fors ga koken of k*kken dan wil ik meteen naar standje 'paniek' kunnen met een druk op de knop
- Ik wil een configureerbare day/night stand voor auto mode, waarbij naar keuze de high en auto speed in de nacht anders (lager) gezet kunnen worden ivm geluid van de installatie.
Disclaimer: ik ben beginner met ESPHome, ESP32, YAML en ik ben al helemaal geen c++ developer, onderstaande code heb ik grotendeels met Claude eruit geperst (en gevalideerd met andere models en roestige oude matige dev skills van lang geleden).
Voor mij werkt dit nu en ben ik best tevreden, maar: er is nu heel veel functionaliteit in de c++ Lambda gekomen, wat natuurlijk een beetje voorbij gaat aan het ESPhome concept. Pak ik het te complex aan?
Opmerkingen, correcties, aanvullingen en alles wat er tussen zit meer dan welkom.
Edit: bugfixes, code optimalisatie en commentaren gefikst
Edit2: Nu met een configureerbare day/night mode waarin naar wens de auto high speed en hold speed gedurende de dag en nacht anders gezet kunnen worden. Omdat mijn Orcon boven de 50% redelijk hoorbaar is in een stil huis vind ik dat gedurende de nacht minder acceptabel.
Edit3: meer bugfixes, er stond oude foute code op de sensors in de on_value.
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
| esphome: name: orcon friendly_name: Orcon on_boot: then: - delay: 15s # After reboot >> Auto mode - select.set: id: ventilation_manual_control option: "AUTO" - script.execute: evaluate_air_quality esp32: board: esp32dev framework: type: esp-idf logger: level: DEBUG wifi: ssid: !secret wifi_ssid password: !secret wifi_password ap: ssid: "Orcon_Fallback" password: !secret wifi_password api: encryption: key: !secret api_encryption_key ota: - platform: esphome password: !secret ota_password captive_portal: time: - platform: homeassistant id: homeassistant_time substitutions: # Night mode configuration night_mode_start: 22 # hour in 24h format, start of night night_mode_end: 7 # hour in 24h format, end of night # Thresholds for sensors voc_threshold: "200" co2_threshold: "800" humidity_threshold: "60" nox_threshold: "5" # Fan speeds in auto mode fan_speed_high_day: "40" # Fan speed when triggered by sensor thresholds during day window fan_speed_high_night: "30" #Fan speed when triggered by sensor thresholds during night window fan_speed_hold_day: "35" # Fanspeed when in Hold mode during day window fan_speed_hold_night: "25" # Fanspeed when in Hold mode during day window fan_speed_low: "15" # Default idle speed # Fan speeds in manual mode manual_idle: "15" manual_low: "35" manual_medium: "55" manual_high: "85" # Timing (seconds) hold_time_seconds: "300" # hold duration after high state cooldown_seconds: "30" # min seconds between evaluations # Global vars for auto mode globals: - id: fan_hold_until type: time_t initial_value: '0' - id: last_evaluation_time type: time_t initial_value: '0' - id: current_target_speed type: int initial_value: '15' - id: auto_mode_active type: bool initial_value: 'true' # Select function for manual control in Home Assistant and HomeKit (exported via HomeBridge) select: - platform: template name: "Manual Control" id: ventilation_manual_control optimistic: true options: - "UIT" - "AUTO" - "RUST" - "LAAG" - "MEDIUM" - "HOOG" initial_option: "RUST" icon: "mdi:fan" on_value: - logger.log: format: "Manual control changed to: %s" args: ['x.c_str()'] level: INFO - script.execute: evaluate_air_quality status_led: pin: number: GPIO33 # From V1.4.0 The Sensor pins on the Open AIR Mini are swapped. Correct example is below: uart: #UART For Sensor 2 - rx_pin: GPIO13 tx_pin: GPIO12 baud_rate: 9600 id: uart_sensor_2 #UART For Sensor 1 - rx_pin: GPIO25 tx_pin: GPIO26 baud_rate: 9600 id: uart_sensor_1 i2c: #I2C For Sensor 2 - id: i2c_sensor_2 sda: GPIO19 scl: GPIO18 scan: false frequency: 400kHz #I2C For Sensor 1 - id: i2c_sensor_1 sda: GPIO16 scl: GPIO4 scan: false frequency: 400kHz script: - id: evaluate_air_quality mode: single then: - lambda: |- auto now = id(homeassistant_time).now(); auto ts = now.timestamp; std::string current_mode = id(ventilation_manual_control).state; ESP_LOGD("air_quality", "Evaluation start: VOC=%.0f CO2=%.0f RH=%.0f NOx=%.0f", id(sgp4x_voc_index).state, id(scd4x_co2).state, id(sht4x_air_humidity).state, id(sgp4x_nox_index).state); // === DAY/NIGHT PROFILE === int current_hour = now.hour; bool is_night; if (${night_mode_start} < ${night_mode_end}) { is_night = (current_hour >= ${night_mode_start} && current_hour < ${night_mode_end}); } else { // night passes midnight (e.g. 22 -> 07) is_night = (current_hour >= ${night_mode_start} || current_hour < ${night_mode_end}); } int high_speed = is_night ? ${fan_speed_high_night} : ${fan_speed_high_day}; int hold_speed = is_night ? ${fan_speed_hold_night} : ${fan_speed_hold_day}; ESP_LOGI("air_quality", "Profile active: %s (high=%d%%, hold=%d%%)", is_night ? "NIGHT" : "DAY", high_speed, hold_speed); // === MANUAL MODES === if (!id(auto_mode_active)) { int manual_speed = 0; if (current_mode == "UIT") manual_speed = 0; else if (current_mode == "RUST") manual_speed = ${manual_idle}; else if (current_mode == "LAAG") manual_speed = ${manual_low}; else if (current_mode == "MEDIUM") manual_speed = ${manual_medium}; else if (current_mode == "HOOG") manual_speed = ${manual_high}; if (id(current_target_speed) != manual_speed || (manual_speed == 0 && id(fan_motor).state) || (manual_speed > 0 && !id(fan_motor).state)) { ESP_LOGI("manual_control", "Manual mode '%s' - setting fan to %d%%", current_mode.c_str(), manual_speed); if (manual_speed == 0) { auto call = id(fan_motor).make_call(); call.set_state(false); call.perform(); } else { auto call = id(fan_motor).turn_on(); call.set_speed(manual_speed); call.perform(); } id(current_target_speed) = manual_speed; } return; } // === AUTO MODE === ESP_LOGD("air_quality", "AUTO mode active"); // Reset only if current target is not one of the valid AUTO values if (id(current_target_speed) != ${fan_speed_low} && id(current_target_speed) != high_speed && id(current_target_speed) != hold_speed) { ESP_LOGI("air_quality", "Switch to AUTO - fan to %d%% (clean start)", ${fan_speed_low}); auto call = id(fan_motor).turn_on(); call.set_speed(${fan_speed_low}); call.perform(); id(current_target_speed) = ${fan_speed_low}; id(fan_hold_until) = 0; // reset any old hold timer } // cooldown check if (ts - id(last_evaluation_time) < ${cooldown_seconds}) { ESP_LOGV("air_quality", "Cooldown active, evaluation skipped"); return; } id(last_evaluation_time) = ts; // read sensor values float voc = id(sgp4x_voc_index).state; float co2 = id(scd4x_co2).state; float humidity = id(sht4x_air_humidity).state; float nox = id(sgp4x_nox_index).state; if (isnan(voc) || isnan(co2) || isnan(humidity) || isnan(nox)) { ESP_LOGW("air_quality", "One or more sensors have invalid values"); return; } // threshold check bool voc_high = (voc > ${voc_threshold}); bool co2_high = (co2 > ${co2_threshold}); bool humidity_high = (humidity > ${humidity_threshold}); bool nox_high = (nox > ${nox_threshold}); bool any_high = voc_high || co2_high || humidity_high || nox_high; ESP_LOGD("air_quality", "Thresholds: VOC %s (%.0f>%s) CO2 %s (%.0f>%s) RH %s (%.0f>%s) NOx %s (%.0f>%s)", voc_high ? "HIGH" : "ok", voc, "${voc_threshold}", co2_high ? "HIGH" : "ok", co2, "${co2_threshold}", humidity_high ? "HIGH" : "ok", humidity, "${humidity_threshold}", nox_high ? "HIGH" : "ok", nox, "${nox_threshold}"); int current_speed = id(current_target_speed); if (any_high) { if (current_speed != high_speed) { std::string high_sensors = ""; if (voc_high) high_sensors += "VOC(" + to_string((int)voc) + ") "; if (co2_high) high_sensors += "CO2(" + to_string((int)co2) + ") "; if (humidity_high) high_sensors += "RH(" + to_string((int)humidity) + "%) "; if (nox_high) high_sensors += "NOx(" + to_string((int)nox) + ") "; ESP_LOGI("air_quality", "Sensors too high: %s - fan to %d%%", high_sensors.c_str(), high_speed); auto call = id(fan_motor).turn_on(); call.set_speed(high_speed); call.perform(); id(current_target_speed) = high_speed; id(fan_hold_until) = 0; } } else { if (current_speed == high_speed) { ESP_LOGI("air_quality", "Sensors normal - start %d min hold at %d%%", ${hold_time_seconds}/60, hold_speed); auto call = id(fan_motor).turn_on(); call.set_speed(hold_speed); call.perform(); id(current_target_speed) = hold_speed; id(fan_hold_until) = ts + ${hold_time_seconds}; } else if (current_speed == hold_speed) { if (ts >= id(fan_hold_until)) { ESP_LOGI("air_quality", "Hold done - fan to %d%%", ${fan_speed_low}); auto call = id(fan_motor).turn_on(); call.set_speed(${fan_speed_low}); call.perform(); id(current_target_speed) = ${fan_speed_low}; } else { long time_left = id(fan_hold_until) - ts; ESP_LOGD("air_quality", "Hold active - %ld sec left", time_left); } } } sensor: - platform: pulse_counter #reports the fan tacho pin: GPIO14 unit_of_measurement: "rpm" name: 'Fan Tacho' id: orcon_rpm update_interval: 5s - platform: wifi_signal # Reports the WiFi signal strength/RSSI in dB name: "WiFi Signal dB" id: wifi_signal_db update_interval: 30s entity_category: "diagnostic" device_class: "signal_strength" - platform: copy # Reports the WiFi signal strength in % source_id: wifi_signal_db name: "WiFi Signal Percent" filters: - lambda: return min(max(2 * (x + 100.0), 0.0), 100.0); unit_of_measurement: "%" entity_category: "diagnostic" device_class: "signal_strength" - platform: sht4x i2c_id: i2c_sensor_1 # check for need of co2 heater, these are conservative values #heater_max_duty: 0.01 #heater_power: Low #heater_time: Short update_interval: 30s temperature: name: "SHT4x Temperature" id: sht4x_air_temperature accuracy_decimals: 2 state_class: measurement device_class: temperature # No delta filters and on_value trigger, sensor not part of automation humidity: name: "SHT4x Humidity" id: sht4x_air_humidity accuracy_decimals: 2 state_class: measurement device_class: humidity # Trigger central evaluation at new value that is >2% filters: - delta: 2% on_value: - script.execute: id: evaluate_air_quality - platform: sgp4x i2c_id: i2c_sensor_1 update_interval: 30s compensation: temperature_source: sht4x_air_temperature humidity_source: sht4x_air_humidity voc: name: "SGP4x VOC Index" id: sgp4x_voc_index state_class: measurement device_class: volatile_organic_compounds # Trigger central evaluation at new value that is >5% filters: - delta: 5% on_value: - script.execute: id: evaluate_air_quality nox: name: "SGP4x NOx Index" id: sgp4x_nox_index state_class: measurement device_class: nitrous_oxide # Trigger central evaluation at new value that is >2% filters: - delta: 2% on_value: - script.execute: id: evaluate_air_quality - platform: scd4x i2c_id: i2c_sensor_1 update_interval: 30s co2: name: "SCD4x CO2" id: scd4x_co2 state_class: measurement device_class: carbon_dioxide # Trigger central evaluation at new value that is >25ppm filters: - delta: 25 on_value: - script.execute: id: evaluate_air_quality temperature: name: "SCD4x Temperature" id: scd4x_temperature accuracy_decimals: 2 state_class: measurement device_class: temperature # No delta filters and on_value trigger, sensor not part of automation humidity: name: "SCD4x Humidity" id: scd4x_humidity accuracy_decimals: 2 state_class: measurement device_class: humidity # No delta filters and on_value trigger, sensor not part of automation output: - id: orcon_fan platform: ledc pin: GPIO15 inverted: true # Slow rise of values -due to delta- may cause no triggering of evaluation, so running every 2 minutes regardless interval: - interval: 2min then: - script.execute: id: evaluate_air_quality trigger_source: "watchdog" fan: - id: fan_motor name: "Fan" platform: speed output: orcon_fan |
[ Voor 15% gewijzigd door Odie op 11-09-2025 16:16 . Reden: Nog een bugfix ]
Voor zover ik weet: Gewoon niet.djuro499 schreef op zaterdag 6 september 2025 @ 11:33:
[...]
Zou je kunnen uitleggen hoe de Open AIR mini precies werkt i.c.m. een perilex schakelaar? Werkt de override van beide kanten en kan je b.v. de schakelaar gebruiken als de wifi of HA uitvalt?
Perilex werd gebruikt om oude boxen te regelen. Ik weet het niet zeker, maar het zou me niets verbazen als ze gewoon direct op de spoelen van de motor zijn aangesloten, want de echte ouderwetse systemen hebben natuurlijk geen enkele electronische regeling.Ik zit te kijken naar Silent/Reno met perilex (bv. the last resort of als ik ga verhuizen) of naar de gewone randaarde variant als er geen toegevoegde waarde is.
Nog een punt, ik probeer zo veel mogelijk ethernet te gebruiken, maar met de valve's ben ik sowieso afhankelijk van de wifi.
Nieuwe boxen kunnen een motor traploos regelen.
De Open Air gaat daar nog overheen door er wifi besturing aan toe te voegen.
Een perilex is dan echt niet meer nodig. Als je een standaard box koopt zit er meestal een afstandsbediening bij.
En sturing via OpenAir gaat nog beter, omdat je hem kunt programmeren om te reageren op vochtpercentages, op tijden en op meerdere knoppen.
De afstandsbediening die je bij een box krijgt werkt niet met OA. Reden is dat OA de hele printplaat vervangt, inclusief de radio-ontvanger van de afstandsbediening.
Als HA uitvalt gaat de OpenAir naar een 'disconnected mode'. Het is programmeerbaar wat hij dan doet.
Hij kan bv gewoon basic op vochtigheidslevels reageren: veel vocht=hard draaien.
Wel heeft de OpenAir een web-interface. In geval van nood kun je er naartoe met een browser en zelf de instellingen & fanspeed veranderen.
Echter je wilt wel zsm je HA weer aan de praat krijgen, dat klopt.
In het geval van perilex komt ook nog bij dat de indeling van de stekkerdoos anders is per merk. Even een Duco perilex box aansluiten op een doos waar voorheen een Orcon zat gaat dus niet werken. Zal je eerst de stekkerdoos open moeten maken en twee of drie draadjes anders moeten lussen.
Perilex zelf heeft namelijk wel een standaard, maar dat is voor vermogen aanleveren in de keuken aan een kookplaat bijv. Voor ventilatieboxen wordt het gebruikt als handige interface voor regeling met een driestandenschakelaar en dan gaan blijkbaar alle standaarden overboord.
En als je het dan toch al open moet maken, waarom niet gewoon meteen die doos vervangen voor een reguliere stekkerdoos en de driestandenschakelaar van de muur halen en op die plek een draadloos bedieningspaneel plaatsen? Heb ik hier in ieder geval wel gedaan en nog geen moment spijt van gehad.
Perilex zelf heeft namelijk wel een standaard, maar dat is voor vermogen aanleveren in de keuken aan een kookplaat bijv. Voor ventilatieboxen wordt het gebruikt als handige interface voor regeling met een driestandenschakelaar en dan gaan blijkbaar alle standaarden overboord.
En als je het dan toch al open moet maken, waarom niet gewoon meteen die doos vervangen voor een reguliere stekkerdoos en de driestandenschakelaar van de muur halen en op die plek een draadloos bedieningspaneel plaatsen? Heb ik hier in ieder geval wel gedaan en nog geen moment spijt van gehad.
Dat had ik inderdaad ook. In de fotos op GitHub lijkt hij ook op een andere locatie te zitten.mrwiggs schreef op donderdag 11 september 2025 @ 14:44:
Kan het kloppen dat dit schroefgaatje op de verkeerde plek zit?
[Afbeelding]
@The_ Mad_Ping heb je nog tijd om mijn vragen te beantwoorden? Onder andere over bovenstaande schroefgas, maar ook over de firmware: Ik zou namelijk graag een eigen ESPHome firmware maken en erop zetten, maar het apparaat wordt helaas niet herkend door ESPHome device builder..
Volgens mij ligt dat aan je systeem. Bij Orcon dient de perilex simpelweg om een stand te signaleren. Drie pinnen voeren de L, N en PE aan en twee pinnen signaleren afwijking van 'laag' naar 'midden' en 'hoog' door stroom van L op een van beide pinnen te zetten. Die komt binnen op de Orcon controller.
Op de controller zit 'gewoon' de motor met een eigen L+N aansluiting en een motor-controller kabel zoals ik die ook in mijn RF versie had waar een 0-10v of PWM signaal wordt gezet en waar je een tacho op terug leest.
Aangezien de OpenAir die hele controller vervangt zou deze versie dus ook gewoon geschikt zijn voor OpenAir: je gooit de Perilexstekker, de driestanden schakelaar en de Orcon controller bij het grof vuil, sluit een normale 230V stekker op de OpenAir aan en prikt de motor met voeding en aansturing ook op de OpenAir.
Met deze oplossing is de Perilex serie ook geschikt voor RF, wat wel blijkt uit de RF ontvanger die er ook in lijkt te zitten.
*note: tot zover de theorie, gebaseerd op de MVS-15-xxxP handleiding https://community.homey.a...met-perilex-stekker/29653
Maar ik had vroeger een MV die middels perilex keihard de motor aanstuurde door de 230V op een andere set windingen te zetten. Niets traploos aan. Het zal dus erg aan de leeftijd en merk van je box liggen. De hamvraag: wat voor soort motor zit er in je box, de rest is bijvangst.
Dat kan dus alleen als je systeem geen directe koppeling tussen de driestanden schakelaar heeft qua voeding, oudere systemen hebben dat wel zijn niet niet geschikt om later te retrofitten met RF en variabele aansturing.Caelorum schreef op donderdag 11 september 2025 @ 15:04:
En als je het dan toch al open moet maken, waarom niet gewoon meteen die doos vervangen voor een reguliere stekkerdoos en de driestandenschakelaar van de muur halen en op die plek een draadloos bedieningspaneel plaatsen? Heb ik hier in ieder geval wel gedaan en nog geen moment spijt van gehad.
@Odie hoe bedoel je dit? In mijn geval gingen alle kabels naar de badkamer waar de box hing en van daaruit de voeding naar de driestandenschakelaar een verdieping lager, om weer drie voedingsdraden terug te krijgen. Elk van die waren op een aparte ingang van de box aangesloten. (De box kwam uit 1989 en was echt een enorm oud ding. Ook rechtstreeks 230v op de goede ingang voor een andere snelheid).
In zo'n systeem krijgt de box wel enkel voeding vanuit de driestandenschakelaar, maar kan je deze ook vrij eenvoudig compleet ombouwen.
En mocht het draad niet eerst via de goede ruimte gaan kan je ook vanaf de driestandenschakelaar 1 van de draden opnieuw trekken en direct doorlussen.
In zo'n systeem krijgt de box wel enkel voeding vanuit de driestandenschakelaar, maar kan je deze ook vrij eenvoudig compleet ombouwen.
En mocht het draad niet eerst via de goede ruimte gaan kan je ook vanaf de driestandenschakelaar 1 van de draden opnieuw trekken en direct doorlussen.
[ Voor 9% gewijzigd door Caelorum op 11-09-2025 22:10 ]
Er zijn twee manieren om een motor op verschillende snelheden aan te sturen: via een stuursignaal (meestal 0-10v of een pwm signaal dat de motor zelf vertaalt in een traploze snelheid via spannings- of frequentie regeling) of door de 230v direct naar de motor te sturen maar naar gelang de wenste snelheid een andere set windingen aan te spreken (Dahlander- of meerwikkelmotor). De eerste methode is traploos, de tweede niet.
MVs van het eerste type zijn makkelijk te converteren van perilex aansluiting met driestanden schakelaar naar iets traploos en draadloos, de tweede niet.
Of je dus kan ombouwen hangt heel erg af van de leeftijd van de box en hoe hij intern werkt. Van de Orcon MVS serie weet ik zeker dat je makkelijk om kunt met minimale aanpassingen omdat bij de perilex uitvoering de keuze simpelweg vertaald wordt door de controller naar een PWM signaal op de motor. Controller eruit, Open Air erin, standaars 230v stekker eraan en klaar.
MVs van het eerste type zijn makkelijk te converteren van perilex aansluiting met driestanden schakelaar naar iets traploos en draadloos, de tweede niet.
Of je dus kan ombouwen hangt heel erg af van de leeftijd van de box en hoe hij intern werkt. Van de Orcon MVS serie weet ik zeker dat je makkelijk om kunt met minimale aanpassingen omdat bij de perilex uitvoering de keuze simpelweg vertaald wordt door de controller naar een PWM signaal op de motor. Controller eruit, Open Air erin, standaars 230v stekker eraan en klaar.
Oh ok, ik denk dat we hier langs elkaar heen praten. Ik had het over het ombouwen van de perilexdoos naar een schukodoos. Zodat een moderne MV met 'normale' stekker gebruikt kan worden incl afstandsbediening. En deze kan worden omgebouwd. Niet het ombouwen van de oude MV zelf.
Ik ging er vanuit dat die dusdanig oud was dat een nieuwe MV box sowieso efficiënter en stiller zal werken.
Ik ging er vanuit dat die dusdanig oud was dat een nieuwe MV box sowieso efficiënter en stiller zal werken.
[ Voor 23% gewijzigd door Caelorum op 12-09-2025 07:32 ]
Een aantal maanden terug heb ik een OpenAIR Sense Pro besteld. Ik gebruikte al een OpenAIR mini met twee OpenAIR valves voor de aansturing van de mechanische ventilatie. Op verzoek van @The_ Mad_Ping heb ik een review geschreven over mijn eigen ervaringen met de Sense Pro, in combinatie met de OpenAIR mini en de twee kleppen. Om het ook relevant te maken voor mensen die niet op dit forum komen, maar de Sense Pro zien op het Tindie platform, heb ik de review in het Engels geschreven. Het is een aardig verhaal geworden, maar de TL/DR is dat ik super tevreden ben en dat de huidige setup 10x beter is dan hoe ons huis werd opgeleverd (proprietary CO2 sensor, draadloos verbonden met ventilatie, drempelwaardes niet in te stellen, etc.).
:strip_exif()/f/image/rlFBkE79jquNbfsZwal0kIAd.jpg?f=fotoalbum_large)
The 3D-printed housing feels sturdy and purposeful, not some flimsy prototype. The fit is tight, screw points line up well, and there’s enough airflow through the design that the sensors aren’t suffocated. You will need a small allen key to disassemble the housing.
Pop the lid and it’s tidy inside!
Housing removed
:strip_exif()/f/image/0bW5nxv72UPHON8WLeXVV2CG.jpg?f=fotoalbum_large)
Overview of PCB
:strip_exif()/f/image/YaOWR6VsBekE74xdv4w6qMeV.jpg?f=fotoalbum_large)
Sensors
:strip_exif()/f/image/48tkEtrJC83XrEFBT3xQlhLC.jpg?f=fotoalbum_large)
Espressif ESP32 board
:strip_exif()/f/image/Mo8DJfRfV4OB82lCnfIXlxfC.jpg?f=fotoalbum_large)
You can clearly see the ESP32 at the heart of it and a well-laid-out PCB. Sensor placement looks deliberate (good for airflow and heat isolation), and the cable routing is neat. Exactly what I would expect from a “Pro” unit. Finally there are leds at the bottom which can be set to a specific color.
OpenAIR Sense Pro entities
/f/image/p9pAs2fuVpppCRwWplouqZNr.png?f=fotoalbum_large)
OpenAIR light toggle
/f/image/b1LBa51qfvcrLNBiMeI8CcxD.png?f=fotoalbum_large)
Automation example
/f/image/CHVGM4m8O2ElHRvlQBBdMYTz.png?f=fotoalbum_large)
I love using the device’s light as a subtle air quality indicator. In the example it's based on VOC, but you can of course combine several metrics. Green when air is fresh, orange when it’s getting stale, red when it’s time to take action.
Here’s the exact automation I’m running, using the VOC index sensor from the OpenAIR Sense Pro and driving its light accordingly:
My hands-on with the Open AIR Sense Pro
Short version: This thing is a little powerhouse of an air monitor. It’s ESP32-based, crammed with very accurate sensors, and wrapped in a clean 3D-printed shell. It looks good on a shelf, and it plays super nicely with Home Assistant.Unboxing and build
:strip_exif()/f/image/rlFBkE79jquNbfsZwal0kIAd.jpg?f=fotoalbum_large)
The 3D-printed housing feels sturdy and purposeful, not some flimsy prototype. The fit is tight, screw points line up well, and there’s enough airflow through the design that the sensors aren’t suffocated. You will need a small allen key to disassemble the housing.
Pop the lid and it’s tidy inside!
Housing removed
:strip_exif()/f/image/0bW5nxv72UPHON8WLeXVV2CG.jpg?f=fotoalbum_large)
Overview of PCB
:strip_exif()/f/image/YaOWR6VsBekE74xdv4w6qMeV.jpg?f=fotoalbum_large)
Sensors
:strip_exif()/f/image/48tkEtrJC83XrEFBT3xQlhLC.jpg?f=fotoalbum_large)
Espressif ESP32 board
:strip_exif()/f/image/Mo8DJfRfV4OB82lCnfIXlxfC.jpg?f=fotoalbum_large)
You can clearly see the ESP32 at the heart of it and a well-laid-out PCB. Sensor placement looks deliberate (good for airflow and heat isolation), and the cable routing is neat. Exactly what I would expect from a “Pro” unit. Finally there are leds at the bottom which can be set to a specific color.
Sensors
You have a couple of options when it comes to the sensors that will be installed. All of them are from Senserion with high accuracy.- Temperature and humidity
- Additionally: CO2
- Additionally: VOC and NOx
- Additionally: SPS30 particle sensor
Home Assistant integration
Adding it to Home Assistant is painless with ESPHome auto-discovery, and you immediately get a bunch of useful entities. I'm primarily using the CO2 and VOC metrics to monitor air quality. I've built some simple automations to use the controllable light entity that’s perfect for ambient feedback.OpenAIR Sense Pro entities
/f/image/p9pAs2fuVpppCRwWplouqZNr.png?f=fotoalbum_large)
OpenAIR light toggle
/f/image/b1LBa51qfvcrLNBiMeI8CcxD.png?f=fotoalbum_large)
Automation example
/f/image/CHVGM4m8O2ElHRvlQBBdMYTz.png?f=fotoalbum_large)
I love using the device’s light as a subtle air quality indicator. In the example it's based on VOC, but you can of course combine several metrics. Green when air is fresh, orange when it’s getting stale, red when it’s time to take action.
Here’s the exact automation I’m running, using the VOC index sensor from the OpenAIR Sense Pro and driving its light accordingly:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
| alias: "Climate: Air quality (VOC) ground floor" description: "" triggers: - trigger: numeric_state entity_id: - sensor.open_air_sense_pro_5328e0_voc_index below: 150 id: voc_green - trigger: numeric_state entity_id: - sensor.open_air_sense_pro_5328e0_voc_index above: 150 below: 350 id: voc_orange - trigger: numeric_state entity_id: - sensor.open_air_sense_pro_5328e0_voc_index above: 350 id: voc_red - trigger: time at: "23:00:00" id: night_mode conditions: [] actions: - choose: - conditions: - condition: trigger id: - voc_green - condition: time before: "23:00:00" after: "07:00:00" sequence: - action: light.turn_on metadata: {} data: rgb_color: - 40 - 148 - 25 brightness_pct: 50 target: device_id: cc9911744abac6684f3ea1a363b6098a - conditions: - condition: time before: "23:00:00" after: "07:00:00" - condition: trigger id: - voc_orange sequence: - action: light.turn_on metadata: {} data: rgb_color: - 242 - 157 - 38 brightness_pct: 50 target: device_id: cc9911744abac6684f3ea1a363b6098a - conditions: - condition: trigger id: - voc_red - condition: time before: "23:00:00" after: "07:00:00" sequence: - action: light.turn_on metadata: {} data: rgb_color: - 213 - 20 - 7 brightness_pct: 100 target: device_id: cc9911744abac6684f3ea1a363b6098a - conditions: - condition: trigger id: - night_mode sequence: - action: light.turn_off metadata: {} data: {} target: device_id: cc9911744abac6684f3ea1a363b6098a mode: single |
Combining the Sense Pro with other OpenAIR devices
My setup is a combination of the Sense Pro for monitoring CO2, VOC and NOx, the OpenAIR mini to control mechanical ventilation and two OpenAIR valves to open or close valves. The valves are optional, but help with conserving energy. E.g. when somebody is taking a shower (first floor), an automation will set the ventilation to max speed and will set the valve that is connected to the ground floor to only 20% open. That helps to preserve the heat downstairs, while quickly bringing the humidity down in the bathroom. The overall goal is to make this as "set-and-forget" as possible. The air quality should be healthy, energy should be conserved (maintaining the air quality) and all of that needs to happen without manual intervention. I've written a couple of automations with some helpers in Home Assistant to make that happen.Day-to-day impressions
- The Sense Pro readings are stable and react quickly to cooking, aerosols, or a closed room.
- The ambient light feedback is surprisingly useful; And you can also decide to let it respond to other triggers.
- 3D-printed shell looks “maker-y” in a good way. Clean lines, not rough. Of course you can also make your own case, just keep in mind the device needs some airflow, so don't put it in a sealed box.
Verdict:
This is a high-accuracy air quality monitor that plugs straight into Home Assistant and gives you the option to run practical automations out of the box. I'm very happy with the OpenAIR Sense Pro and would definitely recommend it. Solid build, thoughtful internals, and a great HA experience.
Bedankt allemaal voor jullie reacties!
De bedoeling is inderdaad om een nieuwe MV te plaatsen en ik vroeg me af of ik de 3-standen schakelaar met perilex toch zou kunnen gebruiken in het geval dat mijn netwerk platligt.
En trouwens, het schema van die van mij ziet er zo uit:
:strip_exif()/f/image/YPZ5sjMj7JVK9wXuApesdxC9.jpg?f=fotoalbum_large)
Misschien maak ik het onnodig ingewikkeld, maar ik dacht even aan een scenario als het te lang duurt om mijn netwerk te herstellen. Een goed geprogrammeerde 'disconnected mode' zou voldoende moeten zijn.
Ik vind de OA met ethernet port heel interessant en de compacte Duco Reno zou goed passen bij mij want ik heb maar 3 afzuigkanalen (wel met minder vermogen 325 m³/h t.o.v. 400 m³/h van de Silent). Daarnaast ondersteunt hij een perilex-schakelaar. Dit sluit aan bij mijn vragen aan @The_ Mad_Ping, aangezien ik de volgende scenario's in gedachten heb:
De 3-standenschakelaar/perilex zou daarachter kunnen, als 'last resort', maar misschien niet de moeite waard.
De bedoeling is inderdaad om een nieuwe MV te plaatsen en ik vroeg me af of ik de 3-standen schakelaar met perilex toch zou kunnen gebruiken in het geval dat mijn netwerk platligt.
Als de stand van de Perilex-schakelaar uit te lezen is, verwacht ik dat alle draden op de OA printplaat aangesloten zijn.The_ Mad_Ping schreef op woensdag 21 mei 2025 @ 14:50:
Oh ja, bijna vergeten! De Reno ondersteunt ook de Perilex-connector.
Dus als je een variant met Perilex gebruikt, kun je die gewoon blijven gebruiken. Extra handig: de stand van de Perilex-schakelaar is ook uit te lezen in Home Assistant!
En trouwens, het schema van die van mij ziet er zo uit:
:strip_exif()/f/image/YPZ5sjMj7JVK9wXuApesdxC9.jpg?f=fotoalbum_large)
Dat is goed om te weten!Tarquin schreef op donderdag 11 september 2025 @ 14:31:
Als HA uitvalt gaat de OpenAir naar een 'disconnected mode'. Het is programmeerbaar wat hij dan doet.
Hij kan bv gewoon basic op vochtigheidslevels reageren: veel vocht=hard draaien.
Bedoel je OpenAir als een wifi access point of gewoon als een wifi client?Tarquin schreef op donderdag 11 september 2025 @ 14:31:
Wel heeft de OpenAir een web-interface. In geval van nood kun je er naartoe met een browser en zelf de instellingen & fanspeed veranderen.
Misschien maak ik het onnodig ingewikkeld, maar ik dacht even aan een scenario als het te lang duurt om mijn netwerk te herstellen. Een goed geprogrammeerde 'disconnected mode' zou voldoende moeten zijn.
Ik vind de OA met ethernet port heel interessant en de compacte Duco Reno zou goed passen bij mij want ik heb maar 3 afzuigkanalen (wel met minder vermogen 325 m³/h t.o.v. 400 m³/h van de Silent). Daarnaast ondersteunt hij een perilex-schakelaar. Dit sluit aan bij mijn vragen aan @The_ Mad_Ping, aangezien ik de volgende scenario's in gedachten heb:
- HA-besturing, via ethernet of wifi.
- Autonome 'disconnected mode', als het netwerk niet beschikbaar is.
- 3-standenschakelaar/perilex, als een 'override' van de 'disconnected mode'.
De 3-standenschakelaar/perilex zou daarachter kunnen, als 'last resort', maar misschien niet de moeite waard.
Kleine nuance, dat is maar hoe je hem configureert he. Het kán. Ik heb juist voor een “ESP-centric” opzet gekozen waarbij de OpenAir autonoom werkt maar altijd van buiten af te overriden is.Als HA uitvalt gaat de OpenAir naar een 'disconnected mode'.
Overigens bevat mijn bovenstaande config een bug die ik bij de (poging tot een andere) laatste bugfix juist geïntroduceerd heb. Hij is bij mij gefikst, maar ik mag m’n post niet meer editen. Aangezien ik nog verder ga refinen de komende tijd (ik wil het ventilatie gedrag nog iets meer vraaggestuurd maken waarbij de mate van luchtvervuiling stapsgewijs meer of minder ventilatie vraagt) dus als je interesse in de laatste versie hebt, let me know.
De ESP kan je optioneel een web interface geven waarmee hij direct te besturen is, dat is dus in cliënt mode. De AP mode kickt in als hij geen verbinding kan maken met de geconfigureerde wifi. Dat staat weer los van de “disconnected” mode, wat slaat op of de ESP verbinding met HA heeft over de API.
En als je het bont wil maken kan je ook nog API calls vanuit andere software of systemen direct op de ESP doen, ik heb even zitten spelen met JSON calls direct uit HomeKit op de ESP, maar uiteindelijk vind ik m’n huidige aanpak de beste omdat daarmee ook een feedback loop terug naar HomeKit is (die toont daadwerkelijk in welke stand mijn ventilatie staat).
Ik ben in hele korte tijd fanboy van ESPHome en ook zeker de Open Air geworden, leuk spul…
Ik zou persoonlijk de perilex ditchen en wellicht vervangen door iets draadloos, genoeg opties (inclusief draadloze schakelaars die in een standaard frame moeten passen). Maar als je hem wil behouden, je zou hem kunnen aansluiten op twee GPIO pinnen van de ESP OpenAir, maar dat wordt een beetje knutselen. Je zou van een van de sensor headers de SCL/SDA pinnen als digitale input kunnen configureren met daar de twee perilex schakelstanden eraan.
[ Voor 12% gewijzigd door Odie op 12-09-2025 19:04 ]