
board_detail.jpg
1297.7 KB

ha_dashboard.png
38.8 KB

nachtaufnahme.png
1335.9 KB
1# ============================================================================
2# ESPHome Konfiguration: Motorsteuerung via ESP32 + 2 Relais
3# >>> ZEITBASIERTE Steuerung mit REED-KONTAKT (untere Endlage) <<<
4# ============================================================================
5# Hardware:
6# - ESP32 D1 Mini (Wemos D1 Mini ESP32 Formfaktor)
7# - 2x Relaismodul (LOW-aktiv, mit 5V versorgt, 3.3V Logik)
8# - 1x Taster (physisch, für Toggle-Steuerung mit STOP)
9# - 1x WS2812B LED-Stripe (optional, für visuelle Rückmeldung)
10# - 1x Reed-Kontakt (Referenz/Endlage "Position unten")
11# - Original-Motorsteuerplatine mit Endschaltern (bleibt erhalten)
12#
13# Funktion:
14# - ESP32 simuliert UP/DOWN-Tastendruck über Relais (parallel zum Original)
15# - HOCH: fährt zeitbasiert (laufzeit_hoch) nach oben
16# - RUNTER: fährt bis der Reed "ganz unten" meldet (Zeit als Backup)
17# - Physischer Taster: Toggle HOCH/RUNTER + STOP während Fahrt
18# - LED-Stripe: Lauflicht-Animation NUR bei Dämmerung/Nacht:
19# rot = fährt (hoch ODER runter)
20# grün → warmweiß = oben angekommen, bleibt dauerhaft an
21# aus = unten angekommen / manuell gestoppt
22# - Auto-Schließen: fährt nach X Minuten "oben" automatisch wieder nach unten
23# - Dämmerungs-Erkennung über Sonnenstand (kein Lichtsensor nötig)
24# - Sicherheit: Interlock verhindert gleichzeitiges UP+DOWN
25# - Software-Timeout als zusätzliche Absicherung
26# ============================================================================
27
28substitutions:
29 # --- Geräte-Identifikation ---
30 device_name: schreibtisch # Technischer Name (keine Leerzeichen!)
31 friendly_name: Schreibtisch # Anzeigename (mit Leerzeichen erlaubt)
32
33 # --- GPIO-Pins für ESP32 D1 Mini ---
34 gpio_relay_up: GPIO19 # Pin D6 - Steuert UP-Relais (HOCH fahren) [vorher GPIO18]
35 gpio_relay_down: GPIO18 # Pin D5 - Steuert DOWN-Relais (RUNTER fahren) [vorher GPIO19]
36
37 # --- GPIO-Pin für physischen Taster ---
38 gpio_button: GPIO23 # Pin D7 - Physischer Taster (gegen GND)
39
40 # --- WS2812 LED-Stripe (optional) ---
41 gpio_led_data: GPIO16 # Pin D4 - Datenleitung zum WS2812-Stripe
42 num_leds: "94" # Anzahl LEDs im Stripe
43
44 # --- GPIO-Pin für Reed-Kontakt (untere Endlage) ---
45 gpio_reed_closed: GPIO33 # Reed-Kontakt für "Position unten"
46
47 # Frei bleiben: GPIO32, GPIO25, GPIO26, D1, D2 (für spätere Erweiterungen)
48
49 # --- Laufzeiten ---
50 laufzeit_hoch: "19s" # Zeit für volle Aufwärtsfahrt
51 laufzeit_runter: "16s" # RUNTER-Backup, falls Reed nicht auslöst (immer etwas länger als laufzeit_hoch!)
52
53 # --- Interlock-Wartezeit ---
54 interlock_wait: "500ms" # Pause beim Umschalten UP<->DOWN
55
56 # --- Auto-Schließen ---
57 # Wie lange bleibt der Tisch oben, bevor er automatisch wieder runterfährt?
58 # Erlaubte Werte: "2min", "10min", "30min", "1h" usw.
59 # Zum Deaktivieren: Zeile "- script.execute: auto_close_timer" in run_up_full auskommentieren.
60 auto_close_zeit: "5min" # Wartezeit bis zum automatischen Schließen
61
62 # --- Standort für Sonnenstand / Dämmerung ---
63 # HIER DEINE EIGENEN KOORDINATEN EINTRAGEN (z.B. von https://www.openstreetmap.org)
64 latitude: "0.0°" # <-- Breitengrad eintragen
65 longitude: "0.0°" # <-- Längengrad eintragen
66
67 # --- LED-Lauflicht Parameter ---
68 anim_breite: "6" # Breite des roten Blocks in LEDs (bei 94 LEDs: 5-8 empfohlen)
69 anim_delay: "30" # Geschwindigkeit in ms (kleiner = schneller)
70
71
72# ============================================================================
73# Basis-Konfiguration
74# ============================================================================
75esphome:
76 name: ${device_name}
77 friendly_name: ${friendly_name}
78
79 on_boot:
80 priority: 600
81 then:
82 # SICHERHEIT: Beide Relais beim Start garantiert ausschalten
83 - switch.turn_off: relay_up
84 - switch.turn_off: relay_down
85
86esp32:
87 board: wemos_d1_mini32
88 framework:
89 type: arduino
90 advanced:
91 sram1_as_iram: true
92 minimum_chip_revision: "3.1"
93 variant: ESP32
94
95# ============================================================================
96# WiFi-Konfiguration
97# ============================================================================
98wifi:
99 networks:
100 - ssid: !secret wifi_ssid
101 password: !secret wifi_password
102
103 # Optionale statische IP: eigene Werte eintragen oder diesen Block entfernen
104 # (dann bezieht der ESP32 seine IP per DHCP vom Router)
105 manual_ip:
106 static_ip: !secret static_ip # Gewünschte statische IP (in secrets.yaml)
107 gateway: !secret gateway # Router-IP (in secrets.yaml)
108 subnet: 255.255.255.0 # Subnetzmaske
109
110 ap:
111 ssid: "ESP_${device_name}"
112 password: !secret ap_password
113
114captive_portal:
115
116# ============================================================================
117# Logging & API
118# ============================================================================
119logger:
120 level: INFO
121
122api:
123
124ota:
125 - platform: esphome
126
127web_server:
128 port: 80
129
130# ============================================================================
131# Zeit + Sonnenstand
132# ============================================================================
133time:
134 - platform: sntp
135 id: sntp_time
136 - platform: homeassistant
137 id: ha_time
138
139sun:
140 latitude: ${latitude}
141 longitude: ${longitude}
142 id: meine_sonne
143
144# ============================================================================
145# Globale Variablen
146# ============================================================================
147globals:
148 # --- Toggle-Status für physischen Taster ---
149 - id: last_direction_up
150 type: bool
151 restore_value: yes
152 initial_value: 'true' # Startwert: nächster Druck = HOCH
153
154 # --- Status "oben/offen" ---
155 - id: box_ist_offen
156 type: bool
157 restore_value: yes
158 initial_value: 'false'
159
160 # --- LED-Animations-Zustand (für addressable_lambda) ---
161 # Aktuelle Position des Lauflicht-Blocks (0 = ganz links/außen)
162 - id: led_pos
163 type: int
164 restore_value: no
165 initial_value: '0'
166
167 # Laufrichtung des Lauflicht-Blocks (true = vorwärts/innen, false = rückwärts/außen)
168 - id: led_forward
169 type: bool
170 restore_value: no
171 initial_value: 'true'
172
173# ============================================================================
174# WS2812 LED-Stripe (ESP32 RMT – Nachfolger von neopixelbus)
175# ============================================================================
176light:
177 - platform: esp32_rmt_led_strip
178 rgb_order: GRB
179 chipset: WS2812
180 pin: ${gpio_led_data} # GPIO16 (D4)
181 num_leds: ${num_leds}
182 id: desk_led
183 name: "${friendly_name} LED-Beleuchtung"
184 default_transition_length: 300ms
185 restore_mode: ALWAYS_OFF
186 effects:
187 # --- Standard-Effekte (manuell über HA wählbar) ---
188 - random:
189 name: "Random"
190 transition_length: 500ms
191 update_interval: 1s
192 - strobe:
193 name: "Strobe"
194 - pulse:
195 name: "Pulse"
196 transition_length: 1s
197 update_interval: 1s
198 - addressable_rainbow:
199 name: "Rainbow"
200 speed: 10
201 width: 50
202 - addressable_scan:
203 name: "Scan"
204 move_interval: 100ms
205 - addressable_color_wipe:
206 name: "Color Wipe"
207
208 # --- Statusanzeige: Rotes Lauflicht während Fahrt (hoch UND runter) ---
209 # Zwei rote Blöcke starten außen und laufen gegenläufig aufeinander zu und zurück.
210 # Breite und Geschwindigkeit über substitutions konfigurierbar.
211 - addressable_lambda:
212 name: "Lauflicht Rot"
213 update_interval: 16ms
214 lambda: |-
215 const int16_t LAST = it.size() - 1;
216 const int16_t ANIM_B = ${anim_breite};
217 // Maximale Position ohne Überschneidung der beiden Blöcke
218 const int16_t MAX_POS = (LAST - 2 * ANIM_B + 1) / 2;
219
220 if (initial_run) {
221 id(led_pos) = 0;
222 id(led_forward) = true;
223 it.all() = Color(0, 0, 0);
224 }
225
226 // Zweiter Block: symmetrisch von rechts, läuft entgegengesetzt
227 int16_t pos2 = LAST - ANIM_B - id(led_pos) + 1;
228
229 // Alles löschen, dann neu zeichnen (sauber und korrekt auch bei wenig LEDs)
230 it.all() = Color(0, 0, 0);
231 it.range(id(led_pos), id(led_pos) + ANIM_B) = Color(255, 0, 0);
232 // Zweiten Block nur zeichnen wenn kein Überlapp mit dem ersten
233 if (pos2 > id(led_pos) + ANIM_B) {
234 it.range(pos2, pos2 + ANIM_B) = Color(255, 0, 0);
235 }
236
237 // Position weiterbewegen (hin und her)
238 if (id(led_forward)) {
239 if (id(led_pos) < MAX_POS) {
240 id(led_pos)++;
241 } else {
242 id(led_forward) = false; // Umkehren
243 }
244 } else {
245 if (id(led_pos) > 0) {
246 id(led_pos)--;
247 } else {
248 id(led_forward) = true; // Umkehren
249 }
250 }
251
252 delay(${anim_delay});
253
254# ============================================================================
255# Binary Sensors (Taster + Reed-Endlage + Statusanzeigen)
256# ============================================================================
257binary_sensor:
258 # --- Physischer Toggle-Taster mit STOP-Funktion ---
259 - platform: gpio
260 id: physical_button
261 name: "${friendly_name} Wandtaster (Status)"
262 pin:
263 number: ${gpio_button} # GPIO23 (D7)
264 mode: INPUT_PULLUP
265 inverted: true # LOW = gedrückt (true)
266 filters:
267 - delayed_on: 50ms
268 - delayed_off: 50ms
269 on_press:
270 then:
271 - lambda: |-
272 // Prüfen ob Motor gerade fährt (eines der Relais ist aktiv)
273 bool is_moving = id(relay_up).state || id(relay_down).state;
274
275 if (is_moving) {
276 // Motor fährt -> STOP
277 id(stop_all).execute();
278 ESP_LOGD("button", "Taster gedrückt: STOP");
279 } else {
280 // Motor steht -> Toggle HOCH/RUNTER
281 if (id(last_direction_up)) {
282 id(run_up_full).execute();
283 id(last_direction_up) = false;
284 ESP_LOGD("button", "Taster gedrückt: HOCH");
285 } else {
286 id(run_down_full).execute();
287 id(last_direction_up) = true;
288 ESP_LOGD("button", "Taster gedrückt: RUNTER");
289 }
290 }
291
292 # --- Reed-Kontakt: untere Endlage "Position unten" ---
293 # ROLLE: Stoppt das Runterfahren hart, sobald "ganz unten" erreicht ist.
294 - platform: gpio
295 id: reed_closed
296 name: "${friendly_name} Endlage Unten erreicht"
297 pin:
298 number: ${gpio_reed_closed} # GPIO33
299 mode: INPUT_PULLUP
300 inverted: true # Kontakt geschlossen = ON / offen = OFF
301 filters:
302 - delayed_on: 100ms
303 - delayed_off: 100ms
304 on_press:
305 then:
306 # Reed schließt = Tisch fast unten -> kurz nachfahren bis echter Anschlag, dann stoppen
307 - delay: 400ms # Nachlaufzeit anpassen (200-600ms) bis Tisch ganz unten
308 - lambda: |-
309 if (id(relay_down).state) {
310 id(relay_down).turn_off();
311 id(box_ist_offen) = false;
312 ESP_LOGD("reed", "Untere Endlage erreicht -> STOP");
313 }
314 - script.execute: led_aus # Tisch unten: LEDs ausschalten
315 on_release:
316 then:
317 # Reed öffnet = Tisch verlässt untere Position -> rotes Lauflicht starten
318 - script.execute: led_fahrt_start
319
320 # --- Virtueller Sensor: Motor in Bewegung ---
321 - platform: template
322 id: desk_moving
323 name: "${friendly_name} Motor fährt gerade"
324 lambda: |-
325 return (id(relay_up).state || id(relay_down).state);
326
327 # --- Dämmerungs-Sensor (nur Anzeige in HA) ---
328 # !sun.is_above_horizon() = true wenn Sonne unter dem Horizont → Dämmerung/Nacht
329 # Hinweis: WiFi-Fallback nur in den LED-Scripts relevant (or: not: wifi.connected)
330 - platform: template
331 id: ist_daemmerung
332 name: "${friendly_name} Dämmerung aktiv"
333 lambda: |-
334 return !id(meine_sonne).is_above_horizon() || id(daemmerung_override).state;
335
336# ============================================================================
337# Sensoren (Monitoring)
338# ============================================================================
339sensor:
340 # --- WiFi-Signalstärke ---
341 - platform: wifi_signal
342 name: "${friendly_name} WiFi Signal"
343 update_interval: 60s
344
345 # --- Betriebszeit (Uptime) ---
346 - platform: uptime
347 name: "${friendly_name} Uptime"
348 update_interval: 60s
349
350# ============================================================================
351# Schalter
352# ============================================================================
353switch:
354 # --- Dämmerungs-Override (zum Testen) ---
355 # Wenn EIN: LEDs verhalten sich so als wäre es Nacht, unabhängig vom Sonnenstand.
356 # Zum Testen der LED-Logik tagsüber einfach diesen Schalter in HA aktivieren.
357 - platform: template
358 name: "${friendly_name} Dämmerung Test-Override"
359 id: daemmerung_override
360 icon: "mdi:weather-night"
361 optimistic: true
362 restore_mode: ALWAYS_OFF
363
364 # --- UP-Relais (HOCH fahren) ---
365 - platform: gpio
366 id: relay_up
367 name: "${friendly_name} UP (direkt)"
368 internal: true
369 pin:
370 number: ${gpio_relay_up} # GPIO19 (D6)
371 mode: OUTPUT
372 inverted: false
373 interlock: [relay_down]
374 interlock_wait_time: ${interlock_wait}
375 restore_mode: ALWAYS_OFF
376
377 # --- DOWN-Relais (RUNTER fahren) ---
378 - platform: gpio
379 id: relay_down
380 name: "${friendly_name} DOWN (direkt)"
381 internal: true
382 pin:
383 number: ${gpio_relay_down} # GPIO18 (D5)
384 mode: OUTPUT
385 inverted: false
386 interlock: [relay_up]
387 interlock_wait_time: ${interlock_wait}
388 restore_mode: ALWAYS_OFF
389
390# ============================================================================
391# Skripte
392# ============================================================================
393script:
394
395 # ==========================================================================
396 # LED-Hilfs-Skripte – Statusanzeige (NUR aktiv bei Dämmerung/Nacht)
397 # ==========================================================================
398
399 # --- LED AUS: Animationen stoppen und Stripe ausschalten ---
400 - id: led_aus
401 mode: restart
402 then:
403 # Laufende grüne Überblend-Animation abbrechen (falls gerade aktiv)
404 - script.stop: led_oben_fertig
405 - light.turn_off:
406 id: desk_led
407 transition_length: 300ms
408
409 # --- LED FAHRT: Rotes Lauflicht starten (nur bei Dämmerung / kein WiFi) ---
410 - id: led_fahrt_start
411 mode: restart
412 then:
413 - if:
414 condition:
415 or:
416 - not:
417 - wifi.connected:
418 - lambda: 'return !id(meine_sonne).is_above_horizon() || id(daemmerung_override).state;'
419 then:
420 # Rotes Lauflicht einschalten (läuft bis led_aus aufgerufen wird)
421 - light.turn_on:
422 id: desk_led
423 brightness: 1.0
424 effect: "Lauflicht Rot"
425
426 # --- LED OBEN FERTIG: Grüner Blitz -> dauerhaft Warmweiß (nur bei Dämmerung / kein WiFi) ---
427 - id: led_oben_fertig
428 mode: restart
429 then:
430 - if:
431 condition:
432 or:
433 - not:
434 - wifi.connected:
435 - lambda: 'return !id(meine_sonne).is_above_horizon() || id(daemmerung_override).state;'
436 then:
437 # 1. Laufenden Effekt explizit stoppen (addressable_lambda überschreibt sonst sofort)
438 - light.turn_off:
439 id: desk_led
440 transition_length: 0ms
441 - delay: 50ms
442 # 2. Grün aufleuchten: Signal "oben angekommen!"
443 - light.turn_on:
444 id: desk_led
445 red: 0.0
446 green: 1.0
447 blue: 0.0
448 brightness: 1.0
449 transition_length: 200ms
450 # 3. Kurz grün halten
451 - delay: 2s
452 # 4. Sanfter Übergang auf Warmweiß – bleibt dauerhaft an bis nächster Befehl
453 - light.turn_on:
454 id: desk_led
455 red: 1.0
456 green: 0.78
457 blue: 0.39
458 brightness: 1.0
459 transition_length: 1s
460
461 # ==========================================================================
462 # Motor-Skripte
463 # ==========================================================================
464
465 # --- STOP: Motor sofort anhalten, LEDs ausschalten ---
466 - id: stop_all
467 then:
468 - script.stop: auto_close_timer
469 - script.stop: led_oben_fertig # Laufende Grün-Animation abbrechen
470 - switch.turn_off: relay_up
471 - switch.turn_off: relay_down
472 - script.execute: led_aus # LEDs ausschalten
473
474 # --- HOCH (voll): zeitbasiert nach oben fahren ---
475 - id: run_up_full
476 mode: restart
477 then:
478 - script.execute: stop_all
479 - delay: 200ms # Kurze Pause (Interlock/Mechanik)
480 # Lauflicht direkt starten – Reed on_release feuert nur wenn Tisch vorher ganz unten war
481 - script.execute: led_fahrt_start
482 - switch.turn_on: relay_up
483 - logger.log: "Fahre HOCH (zeitbasiert)"
484 - delay: ${laufzeit_hoch}
485 - switch.turn_off: relay_up
486 - lambda: 'id(box_ist_offen) = true;'
487 - script.execute: led_oben_fertig # Grün -> Warmweiß (nur bei Dämmerung)
488 - script.execute: auto_close_timer # Auto-Close-Timer starten
489 - logger.log: "HOCH abgeschlossen -> offen"
490
491 # --- RUNTER (voll): bis Reed "unten" meldet (Zeit als Backup) ---
492 - id: run_down_full
493 mode: restart
494 then:
495 - script.execute: stop_all
496 - delay: 200ms
497 # Falls schon unten (Reed geschlossen): gar nicht erst losfahren
498 - if:
499 condition:
500 binary_sensor.is_on: reed_closed
501 then:
502 - logger.log: "Bereits ganz unten (Reed) - keine Fahrt noetig"
503 - lambda: 'id(box_ist_offen) = false;'
504 else:
505 # Rotes Lauflicht starten (Reed ist oben offen, on_release feuert nicht)
506 - script.execute: led_fahrt_start
507 - switch.turn_on: relay_down
508 - logger.log: "Fahre RUNTER (bis Reed / Backup-Zeit)"
509 # Im Normalfall stoppt der Reed-Kontakt (on_press oben) die Fahrt.
510 # Backup: falls der Reed NICHT auslöst, nach Laufzeit hart stoppen.
511 - delay: ${laufzeit_runter}
512 - if:
513 condition:
514 switch.is_on: relay_down
515 then:
516 # Reed hat nicht ausgelöst -> Backup-Stopp
517 - switch.turn_off: relay_down
518 - logger.log: "RUNTER Backup-Timeout - hart gestoppt"
519 - script.execute: led_aus # LEDs nach Backup ausschalten
520 - lambda: 'id(box_ist_offen) = false;'
521
522 # --- AUTO-CLOSE: nach X Minuten "oben" automatisch runter ---
523 - id: auto_close_timer
524 mode: restart
525 then:
526 - delay: ${auto_close_zeit}
527 - logger.log: "Auto-Schliessen: Zeit abgelaufen, fahre runter"
528 - script.execute: run_down_full
529
530# ============================================================================
531# Buttons (Komfort-Bedienung für Home Assistant / Web-Interface)
532# ============================================================================
533button:
534 # --- HOCH Button ---
535 - platform: template
536 name: "${friendly_name} Fahrt HOCH"
537 icon: "mdi:arrow-up-bold"
538 on_press:
539 - script.execute: run_up_full
540
541 # --- RUNTER Button ---
542 - platform: template
543 name: "${friendly_name} Fahrt RUNTER"
544 icon: "mdi:arrow-down-bold"
545 on_press:
546 - script.execute: run_down_full
547
548 # --- STOP Button ---
549 - platform: template
550 name: "${friendly_name} STOPP (Alles anhalten)"
551 icon: "mdi:stop"
552 on_press:
553 - script.execute: stop_all
554
555# ============================================================================
556# Text-Sensoren (IP-Adresse, SSID)
557# ============================================================================
558text_sensor:
559 - platform: wifi_info
560 ip_address:
561 name: "${friendly_name} IP"
562 ssid:
563 name: "${friendly_name} SSID"
564
565# ============================================================================
566# WICHTIGE HINWEISE ZUR VERKABELUNG
567# ============================================================================
568#
569# ESP32 zu Relais-Modul (Steuer-Seite):
570# - ESP32 3V3 → Relais VCC
571# - ESP32 GND → Relais GND
572# - ESP32 GPIO19 (D6) → Relais IN1 (UP)
573# - ESP32 GPIO18 (D5) → Relais IN2 (DOWN)
574#
575# Relais-Modul zu Motorplatine (Schalt-Seite):
576# - Motorplatine COM → Relais 1 COM + Relais 2 COM (Brücke!)
577# - Motorplatine UP → Relais 1 NO
578# - Motorplatine DOWN→ Relais 2 NO
579#
580# Physischer Taster: GPIO23 (D7) gegen GND
581# Reed-Kontakt: GPIO33 gegen GND
582# WS2812 Daten: GPIO16 (D4)
583#
584# ============================================================================
585# SICHERHEITS- & BEDIENHINWEISE
586# ============================================================================
587#
588# 1. RUNTER-STOPP:
589# - Im Normalfall stoppt der REED beim Erreichen "ganz unten" (on_press).
590# - Die Backup-Zeit (laufzeit_runter) stoppt nur, falls der Reed NICHT auslöst.
591#
592# 2. HOCH-STOPP:
593# - Rein zeitbasiert (laufzeit_hoch). Zeit ggf. an echte Fahrzeit anpassen.
594#
595# 3. INTERLOCK: NIEMALS entfernen (verhindert gleichzeitiges UP+DOWN)
596#
597# 4. RELAIS-LOGIK: Bei LOW-aktivem Modul "inverted: true" bei beiden Relais
598#
599# 5. STROM: ESP32 über USB (5V), Relais über 3V3, KEINE 28V-Verbindung!
600#
601# 6. LED NUR BEI DÄMMERUNG: LEDs sind nur aktiv wenn die Sonne unter dem Horizont ist.
602# Berechnung erfolgt über die sun:-Komponente mit Koordinaten aus den substitutions.
603# Ohne WiFi sind LEDs immer aktiv (autarker Betrieb).
604#
605# 7. LED-SEQUENZ (nur bei Dämmerung, gesteuert durch Reed-Kontakt):
606# - Reed öffnet (Tisch verlässt Unten): rotes Lauflicht startet
607# - Reed schließt (Tisch erreicht Unten): LEDs aus
608# - Motor HOCH stoppt (Tisch oben, kein Sensor): 2s grün -> dauerhaft warmweiß
609# - Manueller STOPP: LEDs aus
610#
611# 8. LED-ANPASSUNG:
612# - anim_breite: Blockbreite in LEDs (bei 94 LEDs: 5-8 empfohlen)
613# - anim_delay: Geschwindigkeit in ms (kleiner = schneller, z.B. 20-60)
614#
615# ============================================================================
pcb.jpg
2218.8 KB

schaltplan.png
50.4 KB

schaltplan_relay_detail.png
10.5 KB
thumb.png
702.3 KB

verkabelung.jpg
6327.9 KB