Software-Entwickler, Westernreiter und Home Automator

Ritto Doorbell: Einfach smart gemacht mit Xiaomi Tür-/Fenstersensor

Nachdem ich kläglich gescheitert bin, meine Ritto Türklingel mittels eines ESP inkl. akzeptabler Stromversorgung zu realisieren, kam mir während eines anderen Projekts für smarte Regensensoren (über welches ich später noch berichten werde) endlich die ultimative Idee und damit auch Lösung des Problems.

Seit einiger Zeit nutze ich die (Zigbee) Xiaomi/Aqara Tür-/Fenstersensoren, wofür sie gemacht wurden: *Trommelwirbel* Als Tür-/Fenstersensor!! Für ca. 6€ das Stück auf AliExpress sind diese echt günstig für ein ganz nützliches Stück Hardware: Auf Basis eines kleines Reed-Switches, also einem auf Magnetfeld reagierenden Schalter, übertragen sie immer ihren Status (Auf/Zu) genau dann, wenn er sich ändert. Und das nur mit einer CR2023 Knopfzelle, welche Monate hält!

Und ist das nicht eigentlich genau das, was ich suche, bzw. was ich versucht habe, als Schaltung zu bauen?

  • Jemand klingelt: Statusänderung von “Keiner will was von dir” zu “Dein Paket ist da!”
  • Klingelsignal fällt wieder weg: Statusänderung von “Der Paketmann ist da” zu “Mach schnell, der ist gleich weg!”
  • Und das noch super Batteriesparend!
  • Und dann noch ganz simpel via Zigbee!

Nun müssen wir also einfach den Reed-Switch schalten, wenn wer klingelt! Also häng’ ich ne fette Magnetspule an die 5V direkt neben den Switch?? Nein, Blödsinn! 🙂 Wir machen genau das, was ich in dem Artikel für die Regensensoren gefunden habe: Wir brücken den Reed-Switch einfach und “schalten”, wenn Jemand klingelt. Und das geht ganz simpel mit einem Transistor, an den wir die 5V der Ritto als Base hängen!

Tadaaaaaa: Der ultimative, low cost, batteriesparende, super simple Türsensor!

Die Schaltung dafür ist genau so simpel:

v1 (und final) meines Türklingelsensors auf Basis eines Tür-/Fenstersensors
  • 5V der Ritto gehen an die Base des Transistors
  • Emitter des Transistors and die Plusseite des Sensors (die Seite des Reed-Switches unterhalb der Batterie)
  • Collector des Transistors an die Minusseite des Sensors
  • Und GND der Ritto ziehen wir auch die Minusseite des Sensors, um die Schaltung zu vervollständigen, damit auch Elektronen fließen können 🙂

Basteln!

Zunächst öffnen wir das Gehäuse des Sensors und holen die Platine heraus. Einfach in diese Öffnung mit nem kleinen Schraubenzieher und Aufhebeln:

Leider habe ich kein Foto der Platine mit Reed Switch gemacht, aber ihr kriegt das hin 🙂
Im nächsten Schritt löten wir den eigentlichen Reed-Switch heraus. Das ist für die Schaltung zwar nicht zwingend notwendig, denn wir können ihn auch einfach so überbrücken. Aber der Switch ist ziemlich empfindlich und ich löte ihn lieber raus, um keine falschen Klingelsignale durch Störungen oder dergleichen zu kriegen. Eure Entscheidung 🙂
Wenn ihr diesen rausgelötet habt, sieht das Ganze dann so aus:

Nun löten wir ein Käbelchen an beide Seiten (also wo wir gerade den Reed-Switch abgelötet haben) und verbinden das Ganze dann wie im Diagramm mit Transistor und Ritto. Ich habe immer ein paar kleine, geätzte Platinen zur Hand, die ich mir passen säge und löte das Ganze dann darauf.
Das sieht dann so aus:

Orange geht zur Ritto EXT und schwarz natürlich zur Ritto GND.

Das Ganze könnte man vielleicht noch in das Wohntelefon selber quetschen, aber ich hab mir lieber ein kleines Gehäuse daneben gehangen, welches eigentlich ein Raspberry Pi Gehäuse ist 😉

Das wars, zumindest für den Hardware-Teil. Nun fehlt noch die:

Home Assistant Konfiguration

Da dies ein Zigbee Xiaomi/Aqara Tür-/Fenstersensor ist, müsst ihr diesen auch ganz normal in HA mittels eures Zigbee Coordinators einbinden. Da ich ein Raspbee II Shield und ZHA benutze, geht das bei mir so:

HA => Configuration => Integrations => Zigbee Home Automation (ZHA) => Coordinator auswählen => “Add devices via this device”
Nun drückt ihr einfach alle zwei Sekunden auf den kleinen Schalter am Sensor, solange bis euer Coordinator den Sensor findet. Das dauert ca. 15-20 Sekunden.

Dies legt dann einen “binary_sensor” an, welchen wir in unserer Automation benutzen (Erklärung danach):

- id: doorbell_light_flicker
  alias: "[Apartment] Flicker lights on doorbell and notify"
  trigger:
  - entity_id: binary_sensor.corridor_doorbell_sensor
    platform: state
    to: 'off'
  condition: []
  action:
  - service: script.lights_set_effect_if_online
    data:
      effect: "Doorbell"
  - service: notify.all_phones
    data:
      title: "\ud83d\udd14 Ding Dong!"
      message: "Someone's at the door!"
      data:
        channel: Doorbell

Beim Trigger aufpassen: Der Sensor steht auf “off”, wenn die Tür / das Fenster geschlossen ist, also wenn der Reed-Switch geschaltet wäre. Bei uns ist das also, wenn es klingelt. Daher ist der Trigger “state to off”.

(*Kurzer emotionaler Moment*) Diese Automation ist für mich das Herzstück meines HA, weil es der Start in die Home Automation für mich war. Genau das hier wollte ich haben. Alles andere was danach kam, war einfach weils ging 🙂 Aber zu wissen, wenn wer klingelt, während ich Kopfhörer auf habe, oder die Anlage im Wohnzimmer zu laut ist: Das wollte ich 🙂

Und genau das macht sie:

  1. Lässt alle Lampen, die online sind, “flackern” / einen Effekt abspielen
  2. Schickt meiner Freundin und mir eine Notification aufs Handy.

Da ich die ganze Wohnung voller Yeelights habe, ist das hier der Yeelight Effekt in HA:

custom_effects:
  - name: 'Doorbell'
    flow_params:
      count: 3
      transitions:
        - RGBTransition: [255, 150, 0, 600, 75]
        - RGBTransition: [47, 0, 255, 600, 75]

Und das hier das Script, welches den Effekt für alle Lampen, die an sind abspielen lässt:

lights_set_effect_if_online:
  sequence:
  - service: python_script.lights_set_effect
    data_template:
      lights: >
        {% set lights = namespace(list="") %}
        {%- for light in ["light.bedroom_bedside_lamp_andy", "light.bedroom_bedside_lamp_kristina", "light.dining_room_pendant_light_ambilight", "light.living_room_ceiling_light_ambilight", "light.living_room_big_lamp", "light.living_room_small_lamp", "light.office_desk_lamp"] -%}
          {%- if is_state(light, "on") -%}
            {% set lights.list = lights.list + light + "," %}
          {%- endif -%}
        {%- endfor -%}
        {{ lights.list }}
      effect: "{{ effect }}"

Etwas optimierungsbedürftig ist die hardcoded Liste von Lampen. Aber so oft kauf ich keine neuen Lampen, also vertretbar 🙂

Da HA bis vor ein paar Tagen mit 0.117 in Templates nur Strings und keine Listen verarbeiten konnte, baue ich hier eine kommaseparierte Liste zusammen und schicke diese an ein mini Python-Script:

lights = data.get("lights").rstrip(",")
effect = data.get("effect")

if lights is not "":
  lights = lights.split(",")

  serviceData = {
    "entity_id": lights,
    "effect": effect
  }

  hass.services.call('light', 'turn_on', serviceData)

In den nächsten Tagen werde ich dies wohl abschaffen können, nun da HA nativ Listen in Templates unterstützt.

Und so sieht das dann z.B. auf meinem Bürotisch aus, wenn der Amazonfahrer klingelt 🙂

Hier noch ein Screenshot der Notification auf meinem Smartphone (das “Ding Dong” am Ende vom Video):

Zum Anzeigen des Sensors irgendwo in Lovelace habe ich noch einen kleinen Templatesensor gebaut, der etwas schöner aussieht, als der Sensor selber. Er nutzt den device type “sound”, welcher als eine Musiknote anzeigt wird:

- platform: template
  sensors:
    corridor_doorbell:
        friendly_name: "[Corridor] Doorbell"
        device_class: "sound"
        value_template: >
          {{ is_state("binary_sensor.corridor_doorbell_sensor", "off") }}

Diesen kann man dann einfach in Lovelace anzeigen:

Und das wars! Hoffentlich kann ich Jemandem mit dieser Lösung weiterhelfen 🙂 Wenn ihr Fragen habt, einfach in die Kommentare!

Bis zum nächsten Mal!