Willkommen zum zweiten Teil der Erweiterung unseres Smart Homes mit 433MHz-Geräten. Wir werden uns mit dem Hinzufügen und Überwachen dieser Geräte über deine Sonoff RF BridgeR2 beschäftigen, die du bereits erfolgreich in den Home Assistant integriert hast, wie in meinem vorherigen Artikel beschrieben. Mit der Bridge sind wir bereit, die nächste Stufe der Steuerung und Überwachung deiner Hausautomatisierung zu erkunden.
Einbindung des RF-Geräts in den Home Assistant.
Erfassen der RF-Befehle
Wir brauchen das Gerät, das wir dem Home Assistant hinzufügen wollen. Der Hauptzweck, warum ich dieses Projekt begonnen habe, war, meinen Deckenventilator hinzuzufügen, der zu den komplexeren Dingen gehört, die man über eine RF-Bridge hinzufügen kann, da viele Zustände voneinander abhängen können. Zuerst brauchst du die RF-Quelle, in diesem Fall die Fernbedienung:
Du kannst die Frequenz (433,9 MHz) sehen, das ist der wichtige Teil. Als Nächstes musst du die Registerkarte Ereignisse des Home Assistant im Bereich Entwicklertools aufrufen. Hier kannst du anfangen, auf esphome.rf_code_received
-Ereignisse zu hören.
Wenn du jetzt eine Taste auf der Fernbedienung drückst, solltest du etwas wie das hier sehen:
Hier siehst du, was die Datenoptionen bedeuten:
- sync (int): RF Sync timing
- low (int): RF Low timing
- high (int): RF high timing
- code (int): RF code
- id (ID): Die ID der RF Bridge, wenn du mehrere Komponenten hast.
Das Wichtigste ist hier der Code. Das ist die Nutzlast, die du wiederverwenden willst, um das Gerät deiner Wahl über den Home Assistant zu steuern. Gehe alle Optionen der Fernbedienung durch und kopiere die Codes und die entsprechenden Aktionen.
Helfer Entitäten hinzufügen
Der nächste Schritt ist in deinem Fall vielleicht nicht notwendig. Home Assistant soll den Zustand des Deckenventilators verfolgen, deshalb müssen wir einige Hilfsentitäten verwenden. So können wir die von der RF-Bridge erfassten Zustandsänderungen verfolgen und den Zustand der Entitäten ändern, ohne automatisch die entsprechenden turn_on/turn_off-Dienste aufzurufen. Das ist wichtig, weil die meisten Fernbedienungen denselben RF-Code verwenden, um ein Gerät ein- und auszuschalten.
Hinzufügen von Schaltern
Um ein einfaches binäres Gerät wie eine Lampe zu steuern, ist es am einfachsten, eine eigene Schaltervorlage zu verwenden. Bei mir sieht sie etwa so aus:
- platform: template switches: deckenventilator_licht: friendly_name: "Deckenventilator Licht" value_template: "{{ is_state('input_boolean.deckenventilator_licht', 'on') }}" turn_on: - service: esphome.rf_bridge_send_rf_code data: sync: 11514 low: 590 high: 1772 code: 11261709 - service: input_boolean.turn_on target: entity_id: input_boolean.deckenventilator_licht turn_off: - service: esphome.rf_bridge_send_rf_code data: sync: 11514 low: 590 high: 1772 code: 11261709 - service: input_boolean.turn_off target: entity_id: input_boolean.deckenventilator_licht
Die Wertvorlage verfolgt den Zustand der Entität input_boolean
. So können wir den Zustand der Entität ändern, ohne die Funktionen turn_on/turn_off aufrufen zu müssen. Dann fügen wir einfach einen Dienstaufruf zu den turn_on/turn_off-Funktionen hinzu, der den Code sendet, den wir zuvor erfasst haben. Im Fall der Deckenventilatorlampe handelt es sich um einen binären Schalter, der jedes Mal denselben Befehl sendet.
Nachdem die Schalter-Entität erstellt wurde, existiert sie nun im Home Assistant und kann bereits unser Licht steuern. Prima! Jetzt kannst du einen Helfer hinzufügen, der den Gerätetyp des Schalters von Schalter auf Licht ändert, um die Integration abzuschließen.
Jetzt gibt es allerdings ein kleines Problem: Wenn wir die Fernbedienung außerhalb von Home Assistant verwenden, weiß sie nichts von dieser Änderung und ändert den Status des Geräts nicht. Dies kann durch eine Automatisierung gelöst werden:
alias: Deckenventilator RF Bridge description: "" trigger: - platform: event event_type: esphome.rf_code_received event_data: code: 00abd70d id: licht_toggle
Wir können das Ereignis rf_code_received
wieder verwenden, um auf RF-Befehle zu hören, die von unserer Fernbedienung gesendet werden! Auf diese Weise können wir den Zustand unserer Entität entsprechend ändern:
action: - choose: - conditions: - condition: trigger id: - licht_toggle sequence: - service: light.toggle data: {} target: entity_id: light.deckenventilator_licht
Wenn du also den Zustand einer Entität verfolgen willst, die außerhalb von Home Assistant geändert wird, empfehle ich dir, Helfer-Entitäten zu verwenden und den Zustand mit einer Automatisierung entsprechend zu ändern.
Damit ist die Integration einer 433MHz-Licht-Entität abgeschlossen. Der Prozess ist derselbe für jede andere binäre Einheit, die du hinzufügen möchtest.
Einbindung komplexerer Geräte
Ich wollte jedoch meinen Deckenventilator integrieren, der etwas komplizierter ist. Er hat 5 verschiedene Geschwindigkeiten, kann die Richtung umkehren, das Licht ein- und ausschalten und den Ventilator ein- und ausschalten. Zum Glück hat Home Assistant eine Ventilatorvorlage integriert. Damit können wir eine benutzerdefinierte Einheit erstellen, die mehr Funktionen bietet als nur das binäre Ein- und Ausschalten, wenn wir den Ventilator als einfachen Schalter hinzufügen.
Auch hier verwenden wir eine input_boolean
-Helper-Entity, damit wir den Zustand der Entität ändern können, ohne den send_rf_code
-Dienst aufzurufen:
- platform: template fans: deckenventilator: friendly_name: "Deckenventilator" unique_id: deckenventilator_schlafzimmer value_template: "{{ is_state('input_boolean.deckenventilator', 'on') }}"
Das sollte dir weitgehend bekannt vorkommen. Hier wird einfach ein Ventilator hinzugefügt, den du ein- und ausschalten kannst, was die Art und Weise nachahmt, wie wir zuvor das Licht integriert haben. Das value_template
wird auch hier verwendet, um den Zustand der Entitäten auf den der Hilfsfunktion zu setzen.
direction_template: > {% if is_state('input_select.deckenventilator_richtung', 'Vorwärts') %} forward {% else %} reverse {% endif %}
Die Richtungsvorlage legt die Richtung des Ventilators fest, die auf der Benutzeroberfläche angezeigt wird. Dafür verwenden wir eine andere Hilfsentität.
set_direction: - service: esphome.rf_bridge_send_rf_code data: sync: 0x2c90 low: 0x024a high: 0x06ee code: 0x00abd70c - service: input_select.select_next data: cycle: true target: entity_id: input_select.deckenventilator_richtung
Um die Richtung des Ventilators ändern zu können, senden wir einfach den entsprechenden RF-Befehl und ändern den Zustand unserer Helfer-Entität.
turn_on: - service: esphome.rf_bridge_send_rf_code data: sync: 0x2c8e low: 0x024e high: 0x06ea code: 0x00abd703 - service: input_boolean.turn_on target: entity_id: input_boolean.deckenventilator turn_off: - service: esphome.rf_bridge_send_rf_code data: sync: 0x2c8e low: 0x024e high: 0x06ea code: 0x00abd703 - service: input_boolean.turn_off target: entity_id: input_boolean.deckenventilator
Das Aus- und Einschalten des Ventilators ist identisch mit dem anderer boolescher Entitäten.
percentage_template: > {{ states('input_number.deckenventilator_geschwindigkeit') if is_state('input_boolean.deckenventilator', 'on') else 0 }} speed_count: 5
Das percentage_template steuert lediglich, wie die Geschwindigkeit in Prozent in der Benutzeroberfläche angezeigt wird. Wenn die Geschwindigkeit 0 ist, ist der Ventilator ausgeschaltet, ansonsten eingeschaltet.
set_percentage: - if: - condition: template value_template: "{{ percentage > 0}}" then: - service: input_number.set_value target: entity_id: input_number.deckenventilator_geschwindigkeit data: value: "{{ percentage }}" - choose: - conditions: - condition: state entity_id: input_number.deckenventilator_geschwindigkeit state: "20.0" sequence: - service: esphome.rf_bridge_send_rf_code data: sync: 11514 low: 590 high: 1772 code: 11261701 - conditions: - condition: state entity_id: input_number.deckenventilator_geschwindigkeit state: "40.0" sequence: - service: esphome.rf_bridge_send_rf_code data: sync: 11514 low: 590 high: 1772 code: 11261706 - conditions: - condition: state entity_id: input_number.deckenventilator_geschwindigkeit state: "60.0" sequence: - service: esphome.rf_bridge_send_rf_code data: sync: 11514 low: 590 high: 1772 code: 11261702 - conditions: - condition: state entity_id: input_number.deckenventilator_geschwindigkeit state: "80.0" sequence: - service: esphome.rf_bridge_send_rf_code data: sync: 11514 low: 590 high: 1772 code: 11261705 - conditions: - condition: state entity_id: input_number.deckenventilator_geschwindigkeit state: "100.0" sequence: - service: esphome.rf_bridge_send_rf_code data: sync: 11514 low: 590 high: 1772 code: 11261698 - service: input_boolean.turn_on data: {} target: entity_id: input_boolean.deckenventilator else: - service: fan.turn_off data: {} target: entity_id: fan.deckenventilator
Das Einstellen der tatsächlichen Geschwindigkeit ist etwas mühsamer. Wenn der angegebene Prozentsatz 0 ist, rufen wir die Funktion turn_off des Ventilators auf, die auch die entsprechende Helper-Entität ändert. Wenn der Wert nicht 0 ist, wird der entsprechende Befehl gesendet und sichergestellt, dass der Ventilator eingeschaltet ist.
In einer separaten Automatisierung sorgen wir dafür, dass wir auch die Befehle der RF-Fernbedienung verfolgen:
alias: Deckenventilator RF Bridge description: "" trigger: - platform: event event_type: esphome.rf_code_received event_data: code: 00abd70d id: licht_toggle alias: Licht an/aus - platform: event event_type: esphome.rf_code_received event_data: code: 00abd703 id: fan_toggle alias: Ventilator an/aus - alias: Wintermodus platform: event event_type: esphome.rf_code_received event_data: code: 00abd70c id: modus_remote condition: [] action: - choose: - conditions: - condition: trigger id: - licht_toggle sequence: - service: homeassistant.toggle data: {} target: entity_id: input_boolean.deckenventilator_licht - conditions: - condition: trigger id: - fan_toggle sequence: - service: homeassistant.toggle data: {} target: entity_id: input_boolean.deckenventilator - conditions: - condition: trigger id: - modus_remote sequence: - service: homeassistant.toggle data: {} target: entity_id: input_boolean.deckenventilator_wintermodus - service: input_boolean.turn_on data: {} target: entity_id: input_boolean.deckenventilator mode: single
Und… Das war’s! Du solltest jetzt einen vollständig integrierten Ventilator haben.
Fehlersuche und Tipps
Es ist möglich und sogar sehr wahrscheinlich, dass der Zustand der Entitäten im Home Assistant und der über RF-Befehle gesteuerten Geräte gelegentlich voneinander abweichen. Das kann zum Beispiel passieren, wenn Befehle zu schnell hintereinander aufgerufen werden: Nur einer der Befehle kommt tatsächlich beim Gerät an, aber beide Befehle ändern die Entität im Home Assistant. Wenn du also den Ventilator schnell ein- und ausschaltest, kann er eingeschaltet werden, während der Zustand der Entität ausgeschaltet ist.
Ich habe im Moment keine Lösung dafür, da wir keine Möglichkeit haben, den tatsächlichen Zustand der Geräte zu verfolgen, aber das solltest du im Hinterkopf behalten.
Fazit
Es ist eigentlich ziemlich billig und einfach, 433MHz-gesteuerte Geräte zum Home Assistant hinzuzufügen. Der größte Zeitaufwand bestand darin, herauszufinden, wie man die benutzerdefinierte Ventilatorvorlage erstellt und sicherstellt, dass die Zustände so funktionieren, wie sie sollen. Deshalb habe ich diesen Artikel verfasst – ich hoffe, er spart dir etwas Zeit! Wenn er dir geholfen hat und du eine der oben genannten Komponenten brauchst, würde ich mich über einen Kauf über einen der Affiliate-Links freuen – oder lade mich auf einen Kaffee ein, wenn wir uns mal treffen!
Hallo Dennis,
Super Erklärung, top beschrieben. Leider kriege ich bei „Hören auf Ereignisse“ keine Liste.
Habe schon alles ausprobiert.
ich versuche Gerade meine Markise zu automatisieren und in Home Assistent zu integrieren.
Bei mir ist es ein Problem mit Syntax bei ESPHome yaml Datei.
Kannst du mir vielleicht deine vollständige yaml. zukommen lassen. Es wäre sehr lieb von Dir.
Gruß Sergej
Danke
Hier ist die YAML der RF-Bridge, wenn du die meinst:
esphome:
name: rf-bridge
friendly_name: rf-bridge
esp8266:
board: esp01_1m
# Enable logging
logger:
baud_rate: 0
# Enable Home Assistant API
api:
encryption:
key: !secret api_key
services:
- service: send_rf_code
variables:
sync: int
low: int
high: int
code: int
then:
- rf_bridge.send_code:
sync: !lambda "return sync;"
low: !lambda "return low;"
high: !lambda "return high;"
code: !lambda "return code;"
- service: learn
then:
- rf_bridge.learn
ota:
- platform: esphome
password: !secret ota_password
wifi:
ssid: !secret wifi_ssid
password: !secret wifi_password
# Enable fallback hotspot (captive portal) in case wifi connection fails
ap:
ssid: "Rf-Bridge Fallback Hotspot"
password: !secret fallback_password
status_led:
pin: GPIO13
binary_sensor:
- platform: status
name: Sonoff RF Bridge Status
# Sensors for ESP version and WIFI information
text_sensor:
# ESPHome version
- platform: version
hide_timestamp: true
name: "ESPHome Version"
# IP address and connected SSID
- platform: wifi_info
ip_address:
name: "IP Address"
icon: mdi:wifi
ssid:
name: "Connected SSID"
icon: mdi:wifi-strength-2
button:
# Restart the ESP
- platform: restart
name: "Restart"
- platform: template
name: "Learn"
on_press:
then:
- rf_bridge.learn
uart:
tx_pin: 1
rx_pin: 3
baud_rate: 19200
sensor:
# WiFi signal
- platform: wifi_signal
name: "WiFi Signal"
update_interval: 120s
- platform: uptime
name: Sonoff RF Bridge Uptime
rf_bridge:
on_code_received:
then:
- homeassistant.event:
event: esphome.rf_code_received
data:
sync: !lambda "return format_hex(data.sync);"
low: !lambda "return format_hex(data.low);"
high: !lambda "return format_hex(data.high);"
code: !lambda "return format_hex(data.code);"
captive_portal:
super. danke.
Die Markise hat auf/Stop/zu Tasten wenn ich die Codes auslese, dann habe ich z.b bei „Zu“ Taste jedes mal unterschiedliche Kombination von sync low high und Code.. ist es normal?
Hallo Dennis,
sehr gute Beschreibung mit der ich das Flashen und die Codes, die von meiner Fernbedienung
an die 433 Schalter gesandt werden, aufzeichnen konnte.
Die Codes habe ich in Dein Template (das yaml unterhalb von „Hinzufügen von Schaltern“) eingetragen.
Habe dann versucht ein Template anzulegen und habe den Template Code in das Feld „Wert-Template“ kopiert
und eine zusätzliche erste Zeile mit „switch:“ angelegt.
Es ergibt sich ein „Helper“ mit Typ „template“.
Ich verstehe nicht genau was ich jetzt noch tun muss (schalten lässt sich so bisher leider noch nichts)
Hast Du einen Tipp für mich?
Grüße Werner
Hast du zunächst erstmal verifiziert, dass das Senden von RF-Codes funktioniert? Das kannst du mit dem Service `esphome.rf_bridge_send_rf_code` machen. Wenn das funktioniert, ist es eigentlich relativ einfach. Die Schaltervorlage sollte dann bei jedem triggern den entsprechenden Code senden.
Hallo!
Ich schaffe es leider nicht, das Sonoff-Teil in den Programmiermodus zu versetzen.
Deine Anleitung interpretiere ich so: Taste gedrückt halten und dabei den an der Sonoff-Platine angeschlossenen UART Adapter mittels USB Stecker in den Computer. Dabei ist bei mir die blaue LED dunkel, kein Blinken, kein Leuchten. Gefunden wird nix.
Auf einer anderen Seite steht, man solle im Betrieb die Platine mittels UART Adapter anstecken und die Taste 5S drücken, biss sie 2x schnell und einmal langsam blinkt. Loslassen. Dann wieder 5s drücken und man ist im Programmiermodus. Klappt bei mir ebensp wenig.
Bitte um Hilfe und Danke für Deine Seite!
Uff, lass mich nochmal daran erinnern, wie das genau war. Ich meine das es darum ging, die Reset-Taste gedrückt zu halten, während man den Adapter in den USB-Port steckt. Ich glaube, der springende Punkt war, dass er gedrückt sein muss, während die Bridge startet. Das ist ja der Fall, sobald sie Strom bekommt – ergo beim Einstecken des Adapters. Allerdings ist das tatsächlich ein bisschen Fummelarbeit. Ich habe auch ein paar Anläufe gebraucht.
bei hat es z.b. mit ftdi nicht funktioniert aber mit cp2102 ohne Probleme. Taste gedrückt halten Adapter rein Taste loslassen. Flaschen.