Inhalt

Eigene Beleuchtung in Home Assistant

Inspiration

Mein Onkel hat vor über einem Jahr selbst mit der gleichen Wolke eine kleine Lampe gebaut, die jedoch nicht auf WLED basierte sondern auf einem selbstgeschrieben Webserver weak-web222-led, der von außen erreichbar war, über eine kleine Webseite konnte man die aktuelle Farbe setzen.

Planung

Die passende Wolke habe ich schon letztes Jahr in einem 1 € Shop gefunden. LED Streifen habe ich eigentlich immer auf Lager, das sind die BTF Lightning WS2812B eco (gibt es bei Amazon und bei AliExpress) - die sind preiswert und tun ihren Dienst. Mikrocontroller habe ich ebenso immer da, hier ein wemos D1 mini, mit einem ESP8266 Chip, 4 MB Flash. Das reicht locker für WLED und bietet aufgrund des großen Flash Speichers auch später die Möglichkeit für OTA Updates.

Umsetzung

Zerlegen & Löten

Natürlich muss es nicht die gleiche Wolke sein, es kann auch eine andere Deko sein. Wichtig ist nur, dass das Plastik halbwegs durchsichtig ist, damit man die Beleuchtung auch sieht. Ideal sind welche, die bereits eine Beleuchtung innen haben.

Eine Deko-Wolke aus dem 1€ Shop
Das Foto hat einen leichten Rosa-Stich, eigentlich ist die Wolke weiß…

Zuerst muss die aktuelle Beleuchtung entfernt werden, dazu kann das Batteriefach mit einem Schlitzschraubendreher und etwas sanfter Gewalt. Meist ist das auch einfach nur gesteckt, nichtmal geklebt.

Das Innenleben der 1€ LED Wolke
Übersichtliches Innenleben

Innen ist, wie erwartet, nicht viel drin. Eine LED die einen Farbwechsel macht, Widerstand, Schalter, Batteriefach - mehr nicht, alles sehr eng verbaut.

Jetzt wird einfach der Mikrocontroller genommen und mit einem Stück LED Strip verbunden. Für die Wolke reichten mir 7 LEDs, was auch vom Energiebedarf her ok ist, wenn der Strip direkt an den Mikrcontroller gelötet wird. Bitte auf die Richtung in den Strips achten, dafür sind da kleine Pfeile aufgedruckt, dann einfach 5V, GND, D4 (GPIO2) an den Strip löten.

/ha-2024-wolke/wolke-loetpfusch.jpg
Löten war nie meine größte Kunst… aber es funktioniert!

Danach kann der Strip in der Wolke befestigt werden und alle Elektronik darin verborgen werden. Da das Batteriefach sich nicht mehr reindrücken ließ, habe ich die Öffnung mit Duct Tape verschlosse. Es sollte jetzt nur noch das USB Kabel rausgucken.

Flashen & Konfigurieren

Danach wird der Mikrocontroller mit WLED geflasht, das ist ein einfacher Prozess, denn WLED bietet ein Web-Flashtool an, dafür muss nur die Seite geöffnet werden, der Mikrocontroller per USB an den PC angeschlossen werden und die Seite erkennt den Mikrocontroller und bietet die Möglichkeit, WLED zu flashen. Im letzten Schritt wird sogar noch das WLAN konfiguriert, das ist wirklich einfach.

Jetzt kann das Webinterface von WLED aufgerufen werden. Entweder ist im Abschluss vom Flashen bereits die IP angezeigt worden oder es muss im Router nachgeschaut werden. Im Interface muss einmal oben auf Config geklickt werden, dann auf LED Preferences um dort

1
2
3
4
5
6
Maximum Current:    400 mA
LED Output:         WS281x
Color Order:        GRB         # passt meistens, sonst testen
Length:             7           # Anzahl der LEDs
GPIO:               2           # D4 ist GPIO2
Off Refresh:        true

Weiter unten bei Defaults können noch einige Standards gesetzt werden, z.B. die Helligkeit oder ob nach Stromausfall die letzte Einstellung wiederhergestellt werden soll. Hier kann auch ein Preset als Standard gesetzt werden.

Am Ende unten auf Save klicken, dann ist die Wolke schon einsatzbereit.

In der Übersicht kann jetzt schon mal eine Vorlage angelegt werden, wie die Wolke sich normalerweise verhalten soll. Diese Vorlage kann dann auch als Default gesetzt werden, auf das die Wolke immer zurückkehrt, wenn sie neu eingeschaltet wird.

Als Test habe ich mal Regenbogen eingestellt:

Integration in Home Assistant

Die Integration in Home Assistant ist sehr einfach, es wird nur das WLED Integration hinzugefügt, dort die IP des Mikrocontrollers eingetragen und schon ist die Wolke in Home Assistant verfügbar. Die Integration wird aber meist so schnell von Home Assistant im Netz erkannt, dass sie möglicherweise bereits in der Benachrichtigungsleiste angezeigt wird.

Anwendungsideen

Es können beispielsweise Szenen erstellt werden, die die Wolke in verschiedenen Farben und Mustern leuchten lässt. Auch kann die Wolke in Automatisierungen eingebunden werden, z.B. kann die Wolke sich blau färben, wenn es draußen regnet, oder gelb bei Gewitter.

Der Szeneneditor zeigt direkt im Gerät an, wie die Szene aussehen wird, beim Speichern und Verlassen kehrt das Gerät automatisch zur Ausgangslage zurück, sehr praktisch!

Wolke als Timer

Ich verwende die Wolke hauptsächlich als Timer, für verschiedenes von Pizza im Ofen bis Waschmaschine fertig. Das könnte je nach dem natürlich selbst wieder automatisiert werden, wenn z.B. die Waschmaschine ein IoT Gerät wäre. In meinem Fall ist aber der Timer einfach ein Widget auf dem Dashboard mit verschiedenen Zeitvorgaben, die ich dann einfach per Klick starten kann.

Dashboard in Home Assistant
Übersichtliche Timerauswahl

Damit das funktioniert, muss in den Einstellungen unter Geräte und Dienste, Helfer ein neuer Helfer erstellt werden, der dann als Timer fungiert. Von da aus kann eine Automatisierung erstellt werden, die auf das Timer Event timer.finished reagiert.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
alias: Wolke orange blinken bei Timer Ablauf Wolke
description: >-
  Activates the 'wolke1 - state alert amber' scene when 'timer.timer_wolke'
  finishes.  
trigger:
  - platform: event
    event_type: timer.finished
    event_data:
      entity_id: timer.timer_wolke
action:
  - service: scene.turn_on
    target:
      entity_id: scene.wolke1_state_alert_amber
    data: {}
  - service: notify.mobile_app_<device-id>
    metadata: {}
    data:
      message: Timer abgelaufen
      title: Wolke
mode: single

Alert Amber ist eine Szene, die die Wolke orange färbt und dann den Effekt Breathe aktiviert, das ist ein langsames Auf- und Abdimmen. Das ist im Raum gut sichtbar aber nicht zu aufdringlich. Zusätzlich wird eine Benachrichtigung auf das Handy geschickt, dass der Timer abgelaufen ist.

  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
# Dashboard Konfiguration
title: Dashboard Demo
views:
  - title: Wolke Demo
    path: wolke-demo
    icon: mdi:cloud-clock
    subview: false
    badges: []
    cards:
      # 1. Timer Status / Restzeit
      - type: entities
        entities:
          - timer.timer_wolke
      # 2. Timer Reset / Startzeiten
      - square: true
        type: grid
        cards:
          - show_name: false
            show_icon: true
            type: button
            tap_action:
              action: toggle
            entity: scene.wolke1_state_idle
            name: Reset
            icon: mdi:timer-check-outline
          - show_name: true
            show_icon: true
            type: button
            entity: timer.timer_wolke
            show_state: false
            tap_action:
              action: call-service
              service: timer.start
              target:
                entity_id: timer.timer_wolke
              data:
                duration: '00:05:00'
            name: 5 Min
            hold_action:
              action: call-service
              service: timer.cancel
              target:
                entity_id: timer.timer_wolke
            icon: mdi:cloud-clock-outline
          - show_name: true
            show_icon: true
            type: button
            entity: timer.timer_wolke
            show_state: false
            tap_action:
              action: call-service
              service: timer.start
              target:
                entity_id: timer.timer_wolke
              data:
                duration: '00:10:00'
            name: 10 Min
            hold_action:
              action: call-service
              service: timer.cancel
              target:
                entity_id: timer.timer_wolke
            icon: mdi:cloud-clock-outline
          - show_name: true
            show_icon: true
            type: button
            entity: timer.timer_wolke
            show_state: false
            tap_action:
              action: call-service
              service: timer.start
              target:
                entity_id: timer.timer_wolke
              data:
                duration: '00:15:00'
            name: 15 Min
            hold_action:
              action: call-service
              service: timer.cancel
              target:
                entity_id: timer.timer_wolke
            icon: mdi:cloud-clock-outline
          - show_name: true
            show_icon: true
            type: button
            entity: timer.timer_wolke
            show_state: false
            tap_action:
              action: call-service
              service: timer.start
              target:
                entity_id: timer.timer_wolke
              data:
                duration: '00:30:00'
            name: 30 Min
            hold_action:
              action: call-service
              service: timer.cancel
              target:
                entity_id: timer.timer_wolke
            icon: mdi:cloud-clock-outline
          - show_name: true
            show_icon: true
            type: button
            entity: timer.timer_wolke
            show_state: false
            tap_action:
              action: call-service
              service: timer.start
              target:
                entity_id: timer.timer_wolke
              data:
                duration: '00:45:00'
            name: 45 Min
            hold_action:
              action: call-service
              service: timer.cancel
              target:
                entity_id: timer.timer_wolke
            icon: mdi:cloud-clock-outline
          - show_name: true
            show_icon: true
            type: button
            entity: timer.timer_wolke
            show_state: false
            tap_action:
              action: call-service
              service: timer.start
              target:
                entity_id: timer.timer_wolke
              data:
                duration: '01:00:00'
            name: 60 Min
            hold_action:
              action: call-service
              service: timer.cancel
              target:
                entity_id: timer.timer_wolke
            icon: mdi:cloud-clock-outline
          - show_name: true
            show_icon: true
            type: button
            entity: timer.timer_wolke
            show_state: false
            tap_action:
              action: call-service
              service: timer.start
              target:
                entity_id: timer.timer_wolke
              data:
                duration: '01:30:00'
            name: 90 Min
            hold_action:
              action: call-service
              service: timer.cancel
              target:
                entity_id: timer.timer_wolke
            icon: mdi:cloud-clock-outline
        columns: 4