Das Licht in bestimmten weniger frequentierten Zimmer mittels Bewegungsmelder zu steuern war schon länger ein Ziel von mir. Bei meinem letzten Ikea Besuch habe ich einen Tradfri Bewegungsmelder meinem Einkauf hinzugefügt. Dieser Batteriebetriebene Sensor lässt sich dank dem Zigbee Standart mit allen Möglichen Koordinatoren verwenden. In meinem Setup verfüge ich über einen Philips Hue, Ikea Tradfri und einen direkt über Homeassistant betriebenen ZHA Koordinator. Weil der Tradfri Gateway seit einem Homeassistant Release nicht mehr zuverlässig funktioniert habe ich den Tradfri Bewegunssensor über die ZHA Integration eingebunden. Nach ungefähr einem Monat im Kleiderzimmer war die Batterie leer und musste gewechselt werden. Zudem störte mich, dass ich keine Möglichkeit hatte die Automatisierung der Lichter mit der Lichtintensität im Zimmer zu koppeln. Also entschied ich mich selber einen Sensor, basierend auf einem Passive Infrared (PIR) und einer Fotowiderstand (LDR), zu bauen.

Schaltung

An die Domäne selbst gebaute batteriebetriebene Sensoren hatte ich mich bis jetzt, vorallem aus zeitlichen Gründen, noch nicht herangetraut. Auch bei dem in diesem Artikel gebauten Sensor war ich zum Glück nicht auf eine autonome Stromversorgung angewiesen. Das erleichtert das Design ungemein, weil ich aufgrund meiner grossen Restbestände an Micro USB Kabeln einfach auf einen Wemos D1 Mini als MCU zurückgreifen konnte. Gemäss meinen Recherchen gibt es bis dato noch keinen Shield, der meine Anforderungen (PIR + LDR) erfüllt. Also nahm ich einen Wemos Prototype Shield und habe selber etwas zusammengelötet.

Komponenten

  • HC-SR505 (oben 3. von Links)
  • LDR Fotowiderstand (oben 2. von Links)
  • Wemos Prototype Shield (nicht auf dem Bild)
  • Wemos D1 Mini (oben 4. von Links)
  • Widerstand 10kΩ

lightmove_components-1024x583.jpg
lightmove_proto_top-829x1024.jpg

Dieser Prototyp meines Sensors ist nun einige Zeit in Betrieb und erfüllt seine Aufgabe sehr gut. Ich wollte noch weitere dieser Sensoren für andere Zimmer bauen und überlegte wie ich ihn zusätzlich optimieren kann. Weil das Löten auf dem Prototyp Shield etwas Fummelarbeit ist und ich auf einen PCB Hersteller in China (welcher bereits ab Bestellmengen von 5 Stück liefert) gestossen bin, habe ich mich kurzum daran gemacht eine Platine selber zu entwerfen. Ich hatte früher bereits Leiterplatten in Fritzing und Eagle gezeichnet, habe mich aber dazu entschlossen mit KiCAD etwas neues auszuprobieren. Als nicht Hobby Elektroniker kann ich alle drei Programme empfehlen. Das Resultat sieht folgendermassen aus:

lightmove_schema.png

Das Schema habe ich als Gerber Datei exportiert und beim erwähnten PCB Hersteller JLCPCB herstellen lassen. Die fünf Platinen wurden innerhalb 14 Tagen erstellt und sauber verpackt geliefert. Ich war sehr zufrieden mit der Qualität.

lightmove_pcbs-1-1024x340.jpg

Zusätzlich zu meinem geplanten Sensor habe ich noch drei Bohrungen für einen etwaigen WS2812 ähnlichen Ledstrip eingezeichnet, so dass der Sensor auch autonom funktionieren würde, falls ich mal das Bedürfnis dazu habe.

Bei diesem Hersteller gibt es die Möglichkeit SMD Komponenten direkt im Herstellungsprozess bereits auflöten zu lassen. Ich entschied mich aber dagegen, weil ich die entsprechenden Bauteile bereits besitze und das einzige Bauteil, was in Frage kommt der Widerstand R2 ist.

Firmware

Die Firmware erstelle ich, wie bei den meisten meiner Eigenentwicklugen, in ESPHome. Um die Konfiguration flexibel ändern zu können und ein wiederhohltes Flashen des Wemos zu vermeiden entschied ich mich den PIR und LDR einzeln als Sensoren zu präsentieren. Eine andere Möglichkeit wäre gewesen bereits auf dem Wemos Bewegungen nur über einem gewissen Lux zu melden. Durch die drei Bohrungen für den Ledstrip könnte der Sensor diesen so auch ohne Homeassistant steuern.

 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
substitutions:
  devicename: lightmove02

esphome:
  name: $devicename
  platform: ESP8266
  board: d1_mini

wifi:
  ssid: !secret WIFI_SSID
  password: !secret WIFI_PSK
  fast_connect: true

  # Enable fallback hotspot (captive portal) in case wifi connection fails
  ap:
    ssid: "$devicename Fallback Hotspot"
    password: !secret FALLBACK_PSK


captive_portal:

# Enable logging
logger:

# Enable Home Assistant API
api:
  password: !secret API_PASSWORD

ota:
  password: !secret API_PASSWORD
  
  
sensor:
  - platform: adc
    pin: A0
    name: "$devicename Light Intensity"
    unit_of_measurement: lx
    icon: "mdi:white-balance-sunny"
    device_class: illuminance
    update_interval: 60s
    filters:
      - multiply: 1000
      
binary_sensor:
  - platform: gpio
    pin: D2
    name: "$devicename Motion"
    device_class: motion

Gehäuse

Das Gehäuse besteht aus zwei zusammenklickbaren Teilen, die ich in FreeCAD entworfen und mit meinem 3D Drucker ausgedruckt habe. Es hat die Aussparungen für den Micro USB Anschluss des Wemos, den PIR Sensor, ein Loch um den LDR nach aussen zu führen und ein paar Lüftungsschlitze.

lightmove_Case_bottom.png

Homeassistant Blueprint

Um die Konfiguration des Sensors zu vereinfachen und ein Teilen mit der Community zu ermöglichen habe ich für die Einbindung in Homeassistant einen Blueprint erstellt. Dieser stellt dem/der BenutzerIn verschiedene Parameter für die Automatisierung zur Verfügung, so das keine Zeile Yaml selber geschrieben werden muss. Die Schwellwerte wie zum Beispiel Lichtintensität oder die Zeit nach der letzten Bewegung bis das Licht wieder ausgeht, können so bequem über einen Regler oder als Zahleingabe eingestellt werden.

 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
blueprint:
  name: Motion Room Light
  description: >
    turns lights on and off based on motion    
  domain: automation
  input:
    motion_sensor:
      name: Motion Sensor
      description: >
        Motion sensor which triggers the automation        
      selector:
        entity:
          device_class: motion
    light_sensor:
      name: Light Sensor
      description: >
        Light sensor which sets the illuminance condition        
      selector:
        entity:
          device_class: illuminance
    light_threshold:
      name: Light Intensity
      description: >
        Below which light level should the automation proceed        
      default: 300
      selector:
        number:
          min: 0
          max: 1000
          step: 10
          mode: slider
          unit_of_measurement: "lx"
    timebox_before:
      name: Before Time
      description: >
        Events after this time are ignored        
      selector:
        entity:
          domain: input_datetime
    timebox_after:
      name: After Time
      description: >
        Events before this time are ignored        
      selector:
        entity:
          domain: input_datetime
    off_delay:
      name: Off Delay
      description: >
        How long must the motion sensor be off to turn the lights off?        
      default: 120
      selector:
        number:
          min: 0
          max: 1800
          step: 1
          mode: slider
          unit_of_measurement: "sec"
    target_lights:
      name: Target Lights
      description: >
        The lights to turn on/off        
      selector:
        target:
          entity:
            domain: light
            
trigger:
  - platform: state
    entity_id: !input motion_sensor
    to: 'on'
  - platform: state
    entity_id: !input motion_sensor
    to: 'off'
    for:
      seconds: !input off_delay

condition:
  - condition: or
    conditions:
      - condition: state
        state: 'off'
        entity_id: !input motion_sensor
      - condition: and
        conditions:
          - condition: state
            state: 'on'
            entity_id: !input motion_sensor
          - condition: numeric_state
            entity_id: !input light_sensor
            below: !input light_threshold
          - condition: time
            after: !input timebox_after
            before: !input timebox_before

action:
  - service_template: '{{"light.turn_" + trigger.to_state.state}}'
    target: !input target_lights

Mit den zeitlichen Einschränkungen können zusätzliche Bedingungen gesetzt werden, in meinem Fall das die Katze in der Nacht nicht unabsichtlich die Lichter einschaltet 😁.

blueprint_ui-1024x983.png lightmove_final-715x1024.jpg