Broadlink RM4 Pro – RF Fernbedienungen anlernen
Wir hatten noch einen 24V LED Strip rumfliegen, den wir nun unter einem Regal über unserem Schreibtisch geklebt haben, also als Schriebtischlampe. Dieser ist leider so stark, dass er doch auch blendet. Also hab ich bei Amazon einen <$>günstigen Dimmer</$> bestellt.
Dieser kommt mit einer RF Fernbedienung. Ich hab ja einen <$>Broadlink RM4 Pro</$> daheim, um im Wohnzimmer die IR Fernbedienungen zu ersetzen. Der kann auch RF im Bereich 433 MHZ, passt also für das System.
Nun habe ich allerdings Schwierigkeiten die RF Fernbedienung anzulernen. Im Home Assistant Log sagt er, kein Signal vor TimeOut erkannt. Das Problem haben offenbar einige Leute, weshalb es mehrere Wege gibt, die Codes anders anzulernen und dann zu exportieren.
Das eigentliche Problem:
Man muss für das Anlernen erstmal die Frequenz „sweepen“. Dafür ist ein kontinuierliches Signal erforderlich, welches die Fernbedienung aber nicht aussendet. Und den Button rapide zu klicken ist schwer reproduzierbar. Besser wäre, man könnte die 433,92 MHZ einfach vorgeben beim Anlernen. Aber Nunja.
Die offizielle HomeAssistant Dokumentation schlägt mehrere Wege vor, die bei mir alle NICHT funktioniert haben. Ich hab die aus SEO Gründen unten mal mit eingebaut. Hier aber meiner Meinung nach der Beste weg, den ich ganz tief im GitHub gefunden hab, tatsächlich auch erst 2 Monate alt. Danke an „LumpMaroon“!
TL;DR
Falls ihr den gleichen Dimmer habt: hier die Codes:
{
"version": 1,
"minor_version": 1,
"key": "broadlink_remote_MAC-ADRESS_codes",
"data": {
"BTF LIGHTING Mini-HF-Dimmer-Controller": {
"on": "scAMAQCfBgAPAAGKDiYpDA4mKQwpDA8lDyYOJg8mKAwpDSgNJw0oDQ4nDScOJg4nDScOJg8lDyYOJygMDwABkQ4mKQwOJikMKQwPJQ8lDyYPJSkMKQwpDCgNKA0OJw0nDiYOJg4nDScOJg8mDiYpDA4AAZIOJygMDyYoDSkMDiYOJw0nDiYpDCgNKA0oDSgNDScOJg4nDiYOJw4mDiYOJg8mKA0OAAGSDiYpDA4mKQwpDA8lDyYOJg8lKQwpDSgMKQwoDg0nDiYOJg4mDyYOJw4mDiYOJygMDwABkQ8mKA0OJigNKQwOJg4nDiYPJSkMKA0oDSgNKA0NJw4nDiYOJg4nDiYOJg4mDyYoDQ4ABdw=",
"off": "scCkAACfBgAQAAGKDyUpDA8mKQsqCw8mDicOJg4mKQwoDSkMKA0oDQ4mDicOJg4nDScOJg8lDyYpDA4mDwABkA4mKQwPJSkNKA0OJg4nDiYOJikMKA0oDSgNKA0OJg4nDiYOJg8mDiYOJg8mKA0OJg8AAZEPJigMDyYoDSkMDiYOJg8mDiYpDCgNKA0oDSgNDiYOJw4mDiYOJw4mDyUPJigNDiYPAAXc",
"dimmen": "scAMAQCfBgAOAAGLDyUpDA8lKQwpDA8mDiYPJg4mKQwpDCgNKA4oDA4mDyYOJw0nDiYPJQ8mKQwOJikMDgABjw4mKQwPJSkMKQ0OJg4mDyYPJSkMKA0oDSkMKA0OJw4mDiYOJg8mDyUPJigNDiYpDA8AAZEOJikMDyYoDSkMDiYPJg4mDyUpDCkNKAwpDCkNDScOJg4nDiYOJg4nDiYoDQ4nKAwPAAGRDyUpDA8mKA0pDA4mDyUPJg8mKAwpDCkMKQwoDQ4nDiYOJg8mDiYOJw4mKQwOJikMDwABkQ8mKAwPJigNKQwOJg8mDiYPJSkMKQwoDSkMKA4NJw4mDiYPJQ8mDyUPJigNDiYpDA8ABdw=",
"heller": "scDYAACfBgARAAGKDyUqCw8mKQwpDA4mDyYOJg4mKQ0oDCkMKA4nDg0nDScOJw0nDiYOJg8mKA0OJg8lDwABjw4mKQwPJSkNKAwPJg4nDScOJikMKA0oDSgNKA0OJw0nDiYOJg8mDiYPJigNDiYOJg8AAZIOJikMDiYpDCkMDyUPJg4mDyYoDCkMKQ0oDScODScOJg4mDyUPJg4nDiYpDA4mDyYOAAGSDiYpDA8lKQwpDQ4mDiYPJg8lKQwoDSgNKA0oDQ4mDicOJg4mDicOJg4mKQ0OJg8lDwAF3A==",
"10": "scCkAACfBgAQAAGKECQpDA8mKQwpDA4mDyYOJg8lKQ0oDCkMKA0oDg0nDScOJg4nDiYPJg4mKA0oDSgMDwABjw4mKQwPJSkMKQwPJg4mDicOJikLKQ0oDSgNJw4NJw4mDicOJg4nDScOJigNKA0pDA4AAZEOJygMDyUpDSgMDyYOJg4nDiYpDCgNKA0oDScODScOJg8mDiYOJw0nDiYpDCgNKQwOAAXc",
"20": "scCkAACfBgARAAGKDiYpDA8lKQwpDA8mDiYOJg8mKA0oDSgNKA0oDQ0nDicNJw4mDiYPJigMDyYOJg8mDgABkQ8mKQsPJigNKA0OJg4mDyYPJSkMKA0oDSgNKA0OJg4nDiYOJg4nDiYpDA4nDScOJg8AAZEPJSkMDyYoDSgNDiYOJg8mDyUpDCkMKA0oDSgNDicNJw4mDiYOJw4mKQwOJw0nDiYPAAXc",
"40": "scCkAACfBgAPAAGKDyYpCw8mKQwoDQ4mDyUPJg4mKQwoDSgNKA0oDQ4nDScOJg4mDicNJykMDiYoDQ4nDgABig4nKAwPJSkNKA0OJg4mDyYOJikMKA0oDSgNKA0NJw4mDyYOJg4mDyYoDQ4mKA0OJg8AAZEOJikMDyUpDSgMDyUPJg4nDiYoDSgNKA0oDCkMDicOJg4nDiYOJg4mKQwPJigNDiYPAAXc",
"60": "scDYAACfBgAPAAGKDyYpCw8mKQspDQ4mDyUPJg4mKQwoDSgNKA0oDQ0nDicNJw4mDiYPJigNDiYpDCgNDgABiw4nKAwPJigNKQwOJg8lDyYOJikMKA0oDSgNKA0NJw4nDiYOJg4nDiYoDQ4nKAwpDA4AAZEOJikMDyUpDSgMDyYOJg4nDiYpDCgNKA0oDSgNDScOJg8lDyYOJw4mKAwPJigNKA0OAAGRDiYpDA8lKQ0oDA8mDiYPJg4mKQwoDSgNKA0oDQ0nDiYPJQ8mDiYPJigMDyYoDSgNDgAF3A==",
"80": "scAMAQCfBgAOAAGLDyUpDA8lKQwpDQ0nDiYPJQ8mKQwoDSgNKA0oDQ0nDicNJw4mDiYPJigNDiYoDSgNDgABiw4nKAwPJSkNKA0OJg4mDyYOJikMKA0oDicNKAwOJw4nDScOJg4mDicoDQ4mKA0oDQ4AAZEOJikMDyUpDSgMDyYOJg4nDiYoDSgNKA0oDSgNDScOJg4nDiYOJg8mKA0OJigNKA0OAAGRDyUpDA8mKA0oDQ4mDyUPJg4mKQwpDCgNKA0oDQ0oDScOJg4mDicOJigNDicoDCkMDgABkQ4mKQwPJikMKQsPJg4mDyYPJSkMKQwoDSgNKA0OJg4nDiYOJg8mDiYoDQ4nKAwpDA8ABdw=",
"100": "scCkAACfBgAQAAGKDyUpDA8mKA0oDQ4mDiYOJw4mKQwoDSgNKA0oDQ0nDiYPJg4mDicOJigNKA0OJg4mDwABkA8mKAwPJikMKQwOJg4nDiYPJSkMKQ0oDCgNKA0OJg8mDiYOJg4nDiYpDCgNDicOJg4AAZEPJigMDyYoDSkMDiYPJg4mDyUpDCkMKA0oDSgNDiYPJg4mDiYOJw4mKQwoDQ4nDiYOAAXc",
"jump": "scCoAACfBgAOAAGLDicoDQ4mKAwpDQ4mDiYPJg4mKQwoDSgNHAgEDicSCCcOJw0nDiYOJg8mKQwoDQ4mKA0OAAGLDiYpDA4nKA0oDA8mDicNJw4mKA0oDSgNKA0oDQ0tCCYOJg8mDSgNJygNCAcZDQ0nKA0OAAGRDiYoDQ4mKQ0oDA4mDyUPJw0nKA0oDScOJw4nDQgtDiYOJg4mDyYOJygMKQ0NJygNDgAF3A==",
"fade": "scDYAACfBgAQAAGKDyUqDA8lKQwpDA4nDiYOJg4nKA0oDSgNJw4nDg0nDiYOJw4mDiYOJygNKAwpDA4nDgABjA4mKQwOJikMKQwPJQ8mDiYPJigMKQ0oDCkMKA4NJw4mDiYOJg8mDiYpDCkMKA0OJg8AAZAPJigNDiYpDCkMDiYOJg8mDyUpDCkNJw0pDCgNDicOJg4mDiYPJg4mKQwoDSgNDiYPAAGQDyYpCw8mKA0pDA4mDyUPJg8lKQwpDCgNKQwoDQ4mDyYOJg4mDicOJikMKA0oDQ4mDwAF3A==",
"strobe": "scCkAACfBgAQAAGLDiYpDA8lKQwpDQ0nDiYOJg8mKA0oDSgNJw4oDQ0nDSgNJw4mDiYOJygNKAwpDScODgABiw0nKA0OJigNKQwOJg8mDiYOJikMKQ0oDCkMKA4NJw4mDiYOJg4nDiYoDSgNKA0oDQ4AAZENJygNDiYoDSgNDiYOJg4nDiYpDCgNKA0oDSgNDiYOJw4mDiYOJw4mKA0oDSgNKAwPAAXc"
}
}
Broadlink App
Die App hatten wir damals benutzt um unseren RM4 Pro zu entsperren und ins WLAN zu hängen. Dazu ein kleiner Guide hier. Diese nutzen wir jetzt um den Broadlink direkt in die richtige Frequenz zu schummeln. Dazu müssen wir uns einmal durch den ganzen Dialog klicken, bis wir eine RF Fernbedienung anlernen können. Das ist eigentlich selbst erklärend. Wenn ihr bei diesem Screen angelangt seid, haltet kurz Inne, denn nun kommt erst ein anderer Schritt:
Home Assistant Dienst
Jetzt gehen wir erstmal in den Home Assistant Dienst unter Entwicklerwerkzeuge und basteln uns das wie gewohnt zusammen.
bzw. als YAML:
service: remote.learn_command
target:
entity_id:
- remote.broadlink_ir_transmitter
data:
command_type: rf
command: "on"
device: schreibtischlampe-dimmer
timeout: 15
Buttons anlernen
Jetzt kommt der Clou: Wir drücken jetzt relativ schnell hintereinander zuerst in der Broadlink app auf „Next“, damit der Broadlink RM4 Pro auf der eingestellten Frequenz (hier 433,92 MHZ) sucht. Dann im Dienst auf „Dienst ausführen“ und dann sofort auf der Fernbedienung auf den richtigen Knopf. Und dann nochmal auf den gleichen Knopf. Nun lernen die App und HomeAssistant gleichzeitig den Code. Das ganze braucht etwas richtiges Timing, klappt aber deutlich besser als die anderen Varianten.
Wenn ein Button erfolgreich angelernt wurde, könnt ihr in der App einfach oben links auf den Pfeil zurück klicken, um hier nicht die 30 Sekunden warten zu müssen und dann den Prozess erneut machen. Nicht vergessen, den Namen des Commands zu ändern beim nächsten Durchgang!
Wenn ihr Unsicher seid ob es geklappt hat, checkt einfach mit dem File-Editor unter .storage, ob der Code hinzugefügt wurde. Das wird glaube ich nur Sichtbar, wenn ihr was im Erweiterten Modus umstellt. Dazu im alten Guide mehr.
So gehts. Ich mach damit jetzt weiter im Projekt. Viel spaß beim Anlernen! Dankt nicht mir, sondern LumpMaroon auf GitHub.
Script und Switch Anlegen
Ich nutze eine .yaml file im Packages Ordner und lege mir für jeden Befehl ein Script an. Außerdem prüfe ich den An / Aus Status mit einem input Boolean und nutze einen Switch um das on bzw. das off Script zu feuern:
input_boolean:
schreibtischlampe_power:
name: Schreibtischlampe
switch:
- platform: template
switches:
schreibtischlampe:
value_template: "{{ states('input_boolean.schreibtischlampe_power') }}"
unique_id: switch.schreibtischlampe
turn_on:
- service: script.turn_on
target:
entity_id: script.schreibtischlampe_an
- service: input_boolean.toggle
target:
entity_id: input_boolean.schreibtischlampe_power
turn_off:
- service: script.turn_on
target:
entity_id: script.schreibtischlampe_aus
- service: input_boolean.toggle
target:
entity_id: input_boolean.schreibtischlampe_power
script:
schreibtischlampe_10:
alias: Schreibtischlampe 10%
sequence:
- service: remote.send_command
target:
entity_id: remote.broadlink_ir_transmitter
data:
num_repeats: 1
delay_secs: 0.4
hold_secs: 0
device: schreibtischlampe-dimmer
command: "10"
mode: single
icon: mdi:desk-lamp
schreibtischlampe_20:
alias: Schreibtischlampe 20%
sequence:
- service: remote.send_command
target:
entity_id: remote.broadlink_ir_transmitter
data:
num_repeats: 1
delay_secs: 0.4
hold_secs: 0
device: schreibtischlampe-dimmer
command: "20"
mode: single
icon: mdi:desk-lamp
schreibtischlampe_40:
alias: Schreibtischlampe 40%
sequence:
- service: remote.send_command
target:
entity_id: remote.broadlink_ir_transmitter
data:
num_repeats: 1
delay_secs: 0.4
hold_secs: 0
device: schreibtischlampe-dimmer
command: "40"
mode: single
icon: mdi:desk-lamp
schreibtischlampe_60:
alias: Schreibtischlampe 60%
sequence:
- service: remote.send_command
target:
entity_id: remote.broadlink_ir_transmitter
data:
num_repeats: 1
delay_secs: 0.4
hold_secs: 0
device: schreibtischlampe-dimmer
command: "60"
mode: single
icon: mdi:desk-lamp
schreibtischlampe_80:
alias: Schreibtischlampe 80%
sequence:
- service: remote.send_command
target:
entity_id: remote.broadlink_ir_transmitter
data:
num_repeats: 1
delay_secs: 0.4
hold_secs: 0
device: schreibtischlampe-dimmer
command: "80"
mode: single
icon: mdi:desk-lamp
schreibtischlampe_100:
alias: Schreibtischlampe 100%
sequence:
- service: remote.send_command
target:
entity_id: remote.broadlink_ir_transmitter
data:
num_repeats: 1
delay_secs: 0.4
hold_secs: 0
device: schreibtischlampe-dimmer
command: "100"
mode: single
icon: mdi:desk-lamp
schreibtischlampe_on:
alias: Schreibtischlampe on
sequence:
- service: remote.send_command
target:
entity_id: remote.broadlink_ir_transmitter
data:
num_repeats: 1
delay_secs: 0.4
hold_secs: 0
device: schreibtischlampe-dimmer
command: "on"
mode: single
icon: mdi:desk-lamp
schreibtischlampe_off:
alias: Schreibtischlampe off
sequence:
- service: remote.send_command
target:
entity_id: remote.broadlink_ir_transmitter
data:
num_repeats: 1
delay_secs: 0.4
hold_secs: 0
device: schreibtischlampe-dimmer
command: "off"
mode: single
icon: mdi:desk-lamp
schreibtischlampe_heller:
alias: Schreibtischlampe heller
sequence:
- service: remote.send_command
target:
entity_id: remote.broadlink_ir_transmitter
data:
num_repeats: 1
delay_secs: 0.4
hold_secs: 0
device: schreibtischlampe-dimmer
command: "heller"
mode: single
icon: mdi:desk-lamp
schreibtischlampe_dunkler:
alias: Schreibtischlampe dunkler
sequence:
- service: remote.send_command
target:
entity_id: remote.broadlink_ir_transmitter
data:
num_repeats: 1
delay_secs: 0.4
hold_secs: 0
device: schreibtischlampe-dimmer
command: "dunkler"
mode: single
icon: mdi:desk-lamp
Man könnte auch direkt einen Switch anlegen, der die Codes feuert, aber der hat bei mir nicht korrekt funktioniert. Der Status wird nicht gescheit getrackt und im Dashboard sieht der komisch aus.
Hiernach muss HomeAssistant neu gestartet werden, damit die switches etc. erkannt werden. YAML Neu laden reicht nicht. Danach die Änderungen werden einfach durch YAML neu laden wirksam.
Jetzt kann man im UI alle Scripte einmal manuell feuern, um alle Codes zu testen. Wenn alles klappt, top!
Helligkeit steuerung
Die Helligkeit ist hiermit nicht so leicht steuerbar. Ich hab mir überlegt den Heller bzw. Dunkler button zu nutzen um die Helligkeit zu steuern. Dazu muss der aktuelle Wert berücksichtigt werden. Wenn der neue Höher ist als der alte, soll die Differenz betrachtet werden. Positiv = Heller Button, negativ = dunkler Button. Die Distanz wird dann durch Anzahl an Buttonpresses überschritten und so die korrekte Helligkeit gesetzt.
Template Light
Ich probiere das erste mal ein Template Light aus. Dies gibt mir vor, die Helligkeit von 0 – 255 zu steuern. Die aktuelle Helligkeit speichere ich also in einer Input Number von 0 bis 255 mit Schrittgröße 1. Da die Fernbedienung von 0 bis 100 in 10er Schritten schaltet, muss ich hier halt etwas umrechnen. In die Scripte für die Helligkeitsstufen füge ich jeweils einen Befehl ein, der die Helligkeitsstufe in der Input_Number hinterlegt (in ca. 25er Schritten), so dass die aktuelle Helligkeit mitläuft. Hier das neue YAML:
input_boolean:
schreibtischlampe_power:
name: Schreibtischlampe
input_number:
schreibtischlampe_helligkeit:
name: Schreibtischlampe Helligkeit
initial: 130
min: 0
max: 255
step: 1
schreibtischlampe_helligkeit_old:
name: Schreibtischlampe Helligkeit old
initial: 130
min: 0
max: 255
step: 1
light:
- platform: template
lights:
schreibtisch_light:
friendly_name: "Schreibtisch Light"
value_template: "{{ states('input_boolean.schreibtischlampe_power') }}"
level_template: "{{ state_attr('input_number.schreibtischlampe_helligkeit')|int > 0 }}"
turn_on:
- service: script.turn_on
target:
entity_id: script.schreibtischlampe_an
- service: input_boolean.toggle
target:
entity_id: input_boolean.schreibtischlampe_power
turn_off:
- service: script.turn_on
target:
entity_id: script.schreibtischlampe_aus
- service: input_boolean.toggle
target:
entity_id: input_boolean.schreibtischlampe_power
set_level:
- service: input_number.set_value
data:
value: "{{ brightness }}"
entity_id: input_number.schreibtischlampe_helligkeit
- service: switch.turn_on
data_template:
entity_id:
- switch.schreibtischlampe
supports_transition_template: "{{ true }}"
# switch:
# - platform: template
# switches:
# schreibtischlampe:
# value_template: "{{ states('input_boolean.schreibtischlampe_power') }}"
# unique_id: switch.schreibtischlampe
# turn_on:
# - service: script.turn_on
# target:
# entity_id: script.schreibtischlampe_an
# - service: input_boolean.toggle
# target:
# entity_id: input_boolean.schreibtischlampe_power
# turn_off:
# - service: script.turn_on
# target:
# entity_id: script.schreibtischlampe_aus
# - service: input_boolean.toggle
# target:
# entity_id: input_boolean.schreibtischlampe_power
script:
schreibtischlampe_10:
alias: Schreibtischlampe 10%
sequence:
- service: remote.send_command
target:
entity_id: remote.broadlink_ir_transmitter
data:
num_repeats: 1
delay_secs: 0.4
hold_secs: 0
device: schreibtischlampe-dimmer
command: "10"
- service: input_number.set_value
target:
entity_id: input_number.schreibtischlampe_helligkeit
data:
value: 25
mode: single
icon: mdi:desk-lamp
schreibtischlampe_20:
alias: Schreibtischlampe 20%
sequence:
- service: remote.send_command
target:
entity_id: remote.broadlink_ir_transmitter
data:
num_repeats: 1
delay_secs: 0.4
hold_secs: 0
device: schreibtischlampe-dimmer
command: "20"
- service: input_number.set_value
target:
entity_id: input_number.schreibtischlampe_helligkeit
data:
value: 51
mode: single
icon: mdi:desk-lamp
schreibtischlampe_40:
alias: Schreibtischlampe 40%
sequence:
- service: remote.send_command
target:
entity_id: remote.broadlink_ir_transmitter
data:
num_repeats: 1
delay_secs: 0.4
hold_secs: 0
device: schreibtischlampe-dimmer
command: "40"
- service: input_number.set_value
target:
entity_id: input_number.schreibtischlampe_helligkeit
data:
value: 102
mode: single
icon: mdi:desk-lamp
schreibtischlampe_60:
alias: Schreibtischlampe 60%
sequence:
- service: remote.send_command
target:
entity_id: remote.broadlink_ir_transmitter
data:
num_repeats: 1
delay_secs: 0.4
hold_secs: 0
device: schreibtischlampe-dimmer
command: "60"
- service: input_number.set_value
target:
entity_id: input_number.schreibtischlampe_helligkeit
data:
value: 153
mode: single
icon: mdi:desk-lamp
schreibtischlampe_80:
alias: Schreibtischlampe 80%
sequence:
- service: remote.send_command
target:
entity_id: remote.broadlink_ir_transmitter
data:
num_repeats: 1
delay_secs: 0.4
hold_secs: 0
device: schreibtischlampe-dimmer
command: "80"
- service: input_number.set_value
target:
entity_id: input_number.schreibtischlampe_helligkeit
data:
value: 204
mode: single
icon: mdi:desk-lamp
schreibtischlampe_100:
alias: Schreibtischlampe 100%
sequence:
- service: remote.send_command
target:
entity_id: remote.broadlink_ir_transmitter
data:
num_repeats: 1
delay_secs: 0.4
hold_secs: 0
device: schreibtischlampe-dimmer
command: "100"
- service: input_number.set_value
target:
entity_id: input_number.schreibtischlampe_helligkeit
data:
value: 255
mode: single
icon: mdi:desk-lamp
# schreibtischlampe_on:
# alias: Schreibtischlampe on
# sequence:
# - service: remote.send_command
# target:
# entity_id: remote.broadlink_ir_transmitter
# data:
# num_repeats: 1
# delay_secs: 0.4
# hold_secs: 0
# device: schreibtischlampe-dimmer
# command: "on"
# mode: single
# icon: mdi:desk-lamp
# schreibtischlampe_off:
# alias: Schreibtischlampe off
# sequence:
# - service: remote.send_command
# target:
# entity_id: remote.broadlink_ir_transmitter
# data:
# num_repeats: 1
# delay_secs: 0.4
# hold_secs: 0
# device: schreibtischlampe-dimmer
# command: "off"
# mode: single
# icon: mdi:desk-lamp
schreibtischlampe_heller:
alias: Schreibtischlampe heller
sequence:
- service: remote.send_command
target:
entity_id: remote.broadlink_ir_transmitter
data:
num_repeats: 1
delay_secs: 0.4
hold_secs: 0
device: schreibtischlampe-dimmer
command: "heller"
mode: single
icon: mdi:desk-lamp
schreibtischlampe_dunkler:
alias: Schreibtischlampe dunkler
sequence:
- service: remote.send_command
target:
entity_id: remote.broadlink_ir_transmitter
data:
num_repeats: 1
delay_secs: 0.4
hold_secs: 0
device: schreibtischlampe-dimmer
command: "dunkler"
mode: single
icon: mdi:desk-lamp
Node-RED
Für die beschriebene Logik habe ich mit Node-Red einen Flow gemacht:
[{"id":"d9722400ba171cc1","type":"tab","label":"Broadlink RF","disabled":false,"info":"","env":[]},{"id":"6c3dac3e6934cf28","type":"RM","z":"d9722400ba171cc1","name":"RM4 pro","device":"452e41bd0e0312fa","action":"learn","remote":"","button":"","fix":1,"RFSweep":"true","x":140,"y":420,"wires":[["42af928410cb8f22"]]},{"id":"8e13f9e739f50044","type":"inject","z":"d9722400ba171cc1","name":"manual inject","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"","payloadType":"date","x":130,"y":340,"wires":[["6c3dac3e6934cf28"]]},{"id":"42af928410cb8f22","type":"template","z":"d9722400ba171cc1","name":"","field":"payload","fieldType":"msg","format":"handlebars","syntax":"mustache","template":"{{payload.data}}","output":"str","x":140,"y":500,"wires":[["d3dd1dd10d7cf774"]]},{"id":"d3dd1dd10d7cf774","type":"debug","z":"d9722400ba171cc1","name":"debug","active":false,"tosidebar":true,"console":false,"tostatus":false,"complete":"payload","targetType":"msg","statusVal":"","statusType":"auto","x":130,"y":580,"wires":[]},{"id":"209882f15cc01747","type":"comment","z":"d9722400ba171cc1","name":"LEARN IR","info":"learn IR","x":100,"y":280,"wires":[]},{"id":"3caa4dc2a8d23b45","type":"poll-state","z":"d9722400ba171cc1","name":"","server":"c1eed9d5.7b0d28","version":3,"exposeAsEntityConfig":"","updateInterval":"60","updateIntervalType":"num","updateIntervalUnits":"seconds","outputInitially":true,"outputOnChanged":true,"entityId":"input_number.schreibtischlampe_helligkeit","stateType":"num","ifState":"","ifStateType":"str","ifStateOperator":"is","outputs":1,"outputProperties":[{"property":"payload","propertyType":"msg","value":"","valueType":"entityState"},{"property":"data","propertyType":"msg","value":"","valueType":"entity"},{"property":"topic","propertyType":"msg","value":"","valueType":"triggerId"}],"x":570,"y":300,"wires":[["0748ebcd18f2cc78"]]},{"id":"1507ab6353a76864","type":"debug","z":"d9722400ba171cc1","name":"debug","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"payload","targetType":"msg","statusVal":"","statusType":"auto","x":1330,"y":320,"wires":[]},{"id":"0748ebcd18f2cc78","type":"function","z":"d9722400ba171cc1","name":"Math","func":"msg.headers = msg.originalHeaders;\nvar helligkeitOld = Number(global.get('homeassistant.homeAssistant.states[\"input_number.schreibtischlampe_helligkeit_old\"].state'));\nvar helligkeit = Number(msg.payload);\n\nvar delta = 0;\nvar direction = \"none\";\n\nif (helligkeit > helligkeitOld){\n delta = helligkeit - helligkeitOld;\n delta = delta / 255 * 10;\n direction = \"heller\";\n \n helligkeitOld = helligkeit;\n}\nelse if (helligkeit < helligkeitOld){\n delta = helligkeitOld - helligkeit;\n delta = delta / 255 * 10;\n direction = \"dunkler\";\n \n helligkeitOld = helligkeit;\n}\nelse if (helligkeit == helligkeitOld){\n delta = 0;\n}\nmsg.payload = {};\nmsg.payload.delta = parseFloat(delta).toFixed(0) ;\nmsg.payload.direction = direction;\nmsg.payload.helligkeitOld = helligkeitOld;\n\nfor (var i = 0; i < delta; i++){\n node.send(msg); \n}\n\n//return msg;","outputs":1,"timeout":0,"noerr":0,"initialize":"","finalize":"","libs":[],"x":890,"y":400,"wires":[["d58673ec8e10f5b2","e0d8c40f5aa82221","4d24a735516b4a7a","1507ab6353a76864"]]},{"id":"41d03bc8e9cfeae2","type":"api-call-service","z":"d9722400ba171cc1","name":"10%","server":"c1eed9d5.7b0d28","version":5,"debugenabled":false,"domain":"script","service":"schreibtischlampe_10","areaId":[],"deviceId":[],"entityId":[],"data":"","dataType":"jsonata","mergeContext":"","mustacheAltTags":false,"outputProperties":[],"queue":"none","x":1490,"y":280,"wires":[[]]},{"id":"fcb28687bd35741a","type":"api-call-service","z":"d9722400ba171cc1","name":"20%","server":"c1eed9d5.7b0d28","version":5,"debugenabled":false,"domain":"script","service":"schreibtischlampe_20","areaId":[],"deviceId":[],"entityId":[],"data":"","dataType":"jsonata","mergeContext":"","mustacheAltTags":false,"outputProperties":[],"queue":"none","x":1490,"y":320,"wires":[[]]},{"id":"fc51f9b43c48cf45","type":"api-call-service","z":"d9722400ba171cc1","name":"40%","server":"c1eed9d5.7b0d28","version":5,"debugenabled":false,"domain":"script","service":"schreibtischlampe_40","areaId":[],"deviceId":[],"entityId":[],"data":"","dataType":"jsonata","mergeContext":"","mustacheAltTags":false,"outputProperties":[],"queue":"none","x":1490,"y":360,"wires":[[]]},{"id":"e7e76d07fab18a66","type":"api-call-service","z":"d9722400ba171cc1","name":"60%","server":"c1eed9d5.7b0d28","version":5,"debugenabled":false,"domain":"script","service":"schreibtischlampe_60","areaId":[],"deviceId":[],"entityId":[],"data":"","dataType":"jsonata","mergeContext":"","mustacheAltTags":false,"outputProperties":[],"queue":"none","x":1490,"y":400,"wires":[[]]},{"id":"cbb364a578b0acef","type":"api-call-service","z":"d9722400ba171cc1","name":"80%","server":"c1eed9d5.7b0d28","version":5,"debugenabled":false,"domain":"script","service":"schreibtischlampe_80","areaId":[],"deviceId":[],"entityId":[],"data":"","dataType":"jsonata","mergeContext":"","mustacheAltTags":false,"outputProperties":[],"queue":"none","x":1490,"y":440,"wires":[[]]},{"id":"8fb249698d25cb70","type":"api-call-service","z":"d9722400ba171cc1","name":"100%","server":"c1eed9d5.7b0d28","version":5,"debugenabled":false,"domain":"script","service":"schreibtischlampe_100","areaId":[],"deviceId":[],"entityId":[],"data":"","dataType":"jsonata","mergeContext":"","mustacheAltTags":false,"outputProperties":[],"queue":"none","x":1490,"y":480,"wires":[[]]},{"id":"d58673ec8e10f5b2","type":"switch","z":"d9722400ba171cc1","name":"Richtung","property":"payload.direction","propertyType":"msg","rules":[{"t":"eq","v":"heller","vt":"str"},{"t":"eq","v":"dunkler","vt":"str"},{"t":"eq","v":"none","vt":"str"}],"checkall":"false","repair":false,"outputs":3,"x":1060,"y":400,"wires":[["6a07ebb37e99581b"],["e0d088b0fc5387ec"],[]]},{"id":"e0d088b0fc5387ec","type":"api-call-service","z":"d9722400ba171cc1","name":"dunkler","server":"c1eed9d5.7b0d28","version":5,"debugenabled":false,"domain":"script","service":"schreibtischlampe_dunkler","areaId":[],"deviceId":[],"entityId":[],"data":"","dataType":"jsonata","mergeContext":"","mustacheAltTags":false,"outputProperties":[],"queue":"none","x":1280,"y":440,"wires":[[]]},{"id":"6a07ebb37e99581b","type":"api-call-service","z":"d9722400ba171cc1","name":"heller","server":"c1eed9d5.7b0d28","version":5,"debugenabled":false,"domain":"script","service":"schreibtischlampe_heller","areaId":[],"deviceId":[],"entityId":[],"data":"","dataType":"jsonata","mergeContext":"","mustacheAltTags":false,"outputProperties":[],"queue":"none","x":1270,"y":400,"wires":[[]]},{"id":"e0d8c40f5aa82221","type":"api-call-service","z":"d9722400ba171cc1","name":"","server":"c1eed9d5.7b0d28","version":5,"debugenabled":false,"domain":"input_number","service":"set_value","areaId":[],"deviceId":[],"entityId":["input_number.schreibtischlampe_helligkeit_old"],"data":"{\"value\":payload.helligkeitOld}","dataType":"jsonata","mergeContext":"","mustacheAltTags":false,"outputProperties":[],"queue":"none","x":1030,"y":600,"wires":[[]]},{"id":"4d24a735516b4a7a","type":"api-call-service","z":"d9722400ba171cc1","name":"","server":"c1eed9d5.7b0d28","version":5,"debugenabled":false,"domain":"input_number","service":"set_value","areaId":[],"deviceId":[],"entityId":["input_number.schreibtischlampe_delta"],"data":"{\"value\":payload.delta}","dataType":"jsonata","mergeContext":"","mustacheAltTags":false,"outputProperties":[],"queue":"none","x":1050,"y":540,"wires":[[]]},{"id":"b1c613b420186db7","type":"api-call-service","z":"d9722400ba171cc1","name":"heller","server":"c1eed9d5.7b0d28","version":5,"debugenabled":false,"domain":"script","service":"schreibtischlampe_heller","areaId":[],"deviceId":[],"entityId":[],"data":"","dataType":"jsonata","mergeContext":"","mustacheAltTags":false,"outputProperties":[],"queue":"none","x":1490,"y":520,"wires":[[]]},{"id":"1a4304d30d5ff3cd","type":"api-call-service","z":"d9722400ba171cc1","name":"dunkler","server":"c1eed9d5.7b0d28","version":5,"debugenabled":false,"domain":"script","service":"schreibtischlampe_dunkler","areaId":[],"deviceId":[],"entityId":[],"data":"","dataType":"jsonata","mergeContext":"","mustacheAltTags":false,"outputProperties":[],"queue":"none","x":1500,"y":560,"wires":[[]]},{"id":"452e41bd0e0312fa","type":"rmdevice","folder":"","mac":"24dfa7e471aa","host":"192.168.178.81","devType":"272a"},{"id":"c1eed9d5.7b0d28","type":"server","name":"Home Assistant","addon":true}]
Flow-Entwicklung
Ich frage mit einem Poll State Node immer bei Änderung der Input Number Helligkeit dessen Wert ab und schiebe den per MSG an den nächsten Node. Das ist sozusagen mein Trigger-Event. Dieser Wert geht in einen Funktions-Node und dort wird dann die Mathematik ausgeführt.
msg.headers = msg.originalHeaders;
var helligkeitOld = Number(global.get('homeassistant.homeAssistant.states["input_number.schreibtischlampe_helligkeit_old"].state'));
var helligkeit = Number(msg.payload);
var delta = 0;
var direction = "none";
if (helligkeit > helligkeitOld){
delta = helligkeit - helligkeitOld;
delta = delta / 255 * 10;
direction = "heller";
helligkeitOld = helligkeit;
}
else if (helligkeit < helligkeitOld){
delta = helligkeitOld - helligkeit;
delta = delta / 255 * 10;
direction = "dunkler";
helligkeitOld = helligkeit;
}
else if (helligkeit == helligkeitOld){
delta = 0;
}
msg.payload = {};
msg.payload.delta = parseFloat(delta).toFixed(0) ;
msg.payload.direction = direction;
msg.payload.helligkeitOld = helligkeitOld;
for (var i = 0; i < delta; i++){
node.send(msg);
}
//return msg;
Hier lese ich auch direkt den Status einer Helfer-Variablen „helligkeitOld“ – ebenfalls eine input_number ein. Dann vergleiche ich einfach welcher Wert größer ist, berechne die Differenz und lege die Richtung fest. Das ist jetzt ganz schön für dumme Programmiert so, aber hey, es funktioniert.
Am Ende überschreibe ich dann Helligkeit Old mit dem aktuellen wert für den nächsten Durchgang.
Eigentlich wollte ich dann im Script ein Template für die Wiederholungen (Delta) anlegen, das hat aber nicht geklappt, daher feuere ich das heller bzw. das dunkler script mit einer Wiederholung einfach in mit einer Loop, die so oft Durchläuft, wie delta groß ist.
Welches Script (heller oder dunkler), lege ich einfach mit einem Switch Node fest.
Und die letzten beiden Nodes sind einfach die service-Calls für die Scripte:
Schön wäre noch, wenn der RM4 Pro auch als Receiver fungieren könnte, damit das ganze auch funktioniert, wenn die originale Fernbedienung benutzt wird. Da werde ich aber wahrscheinlich extra Hardware brauchen, oder jemand kennt einen Weg, den Learning Mode dazu zu nutzen. Das gern in die Kommentare.
Dashboard
Zum Schluss kann man dann einfach das Template Light in sein Dashboard legen und ggf. auch zu Alexa oder Google Home pushen. Es funktioniert fast einwandfrei 🙂 Bei mir sind die Wiederholungen etwas schnell hintereinander, da muss ich noch etwas nachbessern.
Update:
Hab in den Flow noch delay nodes mit 1msg / sek.
Thats it! Viel Erfolg bei euren LED Projekten!
Hier sind jetzt noch die anderen Wege, aus der Broadlink Home Assistant Doku beschrieben:
Workaround 1: Mit Broadlink Manager
https://sourceforge.net/projects/broadlink-manager/
Hat bei mir aber nicht funktioniert:
Gerät wird nicht erkannt. Sonst einfach Scan, dann Connect und dann learn Command.
Workaround 2: Python!
Hat leider auch das Problem, das die Frequenz gesweept wird. Ihr braucht PIP und könnt dann alles in der CLI machen.
pip install broadlink
python3
import broadlink
Und dann die Befehle aus der Doku befolgen. Es gibt leider sehr wenig Rückmeldung, daher für mich einer der schlechtesten Lösungswege.
Workaround 3: NodeRed (Nur IR)
Diesen Weg wollte ich eigentlich gehen, bis ich am Ende gemerkt hab, dass so nur Infrarot Fernbedienungen funktionieren. Da ich diesen Part schon vorbereitet hatte, lass ich ihn auch mal drin, da auch paar Interessante Sachen dabei sind.
Im NodeRed gibt es Panele, die man hinzufügen kann. Wir müssen also eins für Broadlink installieren. Dazu gehen wir oben rechts aufs Hamburger Menu und dann auf Panele verwalten.
Im neuen Fenster wechseln wir auf den Reiter Installation und suchen Broadlink. Wir brauchen die zweite hier in der Liste „node-red-contrib-broadlink-control“.
Neuer Flow
Nun müsste Links in der Node Liste ganz unten das Panel für Broadlink drin sein.
Wir brauchen den obersten Node mit Namen „RM“
Diese können wir durch doppelklick aktivieren und dann auf lernen setzen. Außerdem müssen wir auf das kleine Stift Icon klicken um das Gerät zu konfigurieren. Hier brauchen wir IP und Mac Adresse.
Die Mac Adresse finden wir unter der Broadlink integration, die IP im Router Interface oder einen Network Scanner. Die Mac-Adresse muss ohne Doppelpunkte eingegeben werden.
Nun können wir die Fernbedienung drücken und den Code kopieren.
RF Commands mit NodeRed senden
Man kann NodeRed auch benutzen, um diese Codes zu senden.
RF Command mit Script senden
# Example configuration.yaml entry
script:
turn_on_ac:
sequence:
- service: remote.send_command
target:
entity_id: remote.bedroom
data:
device: television
command:
- turn on
- b64:code
RF Command als Switch
Status wird nicht wirklich gespeichert und funktioniert nur so meh. Lieber Script, Switch oder Light und Input Boolean kombinieren, wie oben.
switch:
- platform: broadlink
mac: MAC_ADDRESS
switches:
- name: Philips TV
command_on: JgAcAB0dHB44HhweGx4cHR06HB0cHhwdHB8bHhwADQUAAAAAAAAAAAAAAAA=
command_off: JgAaABweOR4bHhwdHB4dHRw6HhsdHR0dOTocAA0FAAAAAAAAAAAAAAAAAAA=
Wenn ihr bis hier gekommen seid, not bad!
Happy RF-ing!
$ Die mit einem $ gekennzeichneten Links, sind Affiliate Links. Wenn du über diese in den Shop gelangst und etwas kaufst, bekomme ich eine kleine Provision