Aansturen van verlichting met IR afstandsbediening

Last Updated on 19 februari 2025 by Syds

Dit project heeft tot doel verlichting te kunnen aansturen m.b.v. een IR afstandsbediening.

Boven de hobby werkplek van mijn vrouw hangen twee (slimme) LSC Lampen van de Action. De schakelaar om die te bedienen zit op een lastig bereikbare plek. Tevens is het beter om die LSC Lampen vast aan de stroom te verbinden, anders loop je kans dat ze hun instellingen verliezen en opnieuw aangemeld moeten worden.

Iedereen heeft ze waarschijnlijk in de la liggen, talloze IR afstandsbedieningen van kerstverlichting, LED-strips etc. Het leek me een leuk project om mijn vrouw zo’n afstandsbediening te geven waarmee ze de werkplekverlichting aan- en uit kon zetten, en ook eventueel kon dimmen of feller zetten. Nu had ik al een WiFi thermometer gerealiseerd met een Wemos D1 mini bordje en deze hangt vlak bij de werkplek van mijn vrouw. Ik heb deze Wemos uitgebreid met een IR ontvanger.

Benodigdheden:

  • Wemos D1 mini (Aliexpress)
  • VS1838B IR Receiver (Aliexpress)
  • Soldeerbout
  • Soldeertin voor electronica
  • Paar dupont of andere dunne draadjes
  • Boormachine en 1mm boortje om gaatjes te maken
  • Montagedoosje/behuizing 
  • Lijm(pistool)
  • Stanley mes of dremel
  • USB kabeltje

Reeds geïnstalleerd en up-and-running:

  • Domoticz
  • Optioneel: MQTT
  • Optioneel: MQTT plugin voor Domoticz
  • Node Red
  • Arduino IDE op je laptop of desktop

 

Ontwerp: Een VS1838B IR Receiver aansluiten op de bestaande Wemos D1 mini WIFI Thermometer conform onderstaand schema.

 

 

VS1838B Datasheet:
According to VS1838B datasheet, it features:
IR Remote Control Receiver Built-in Filter at 38KHz Compatible with Arduino, Raspberry Pi
Simple interface to use it
Working Voltage: 2.7 – 5.5V DC
Receiver Distance: 22 – 25m
Pin Pitch: 2.54mm
Pin Length: 23mm
Size: 7.4mm x 6.2mm x 5.3mm (LWH)  

Pinout:

 Wemos D1 miniVS1838B
1D2 (GPIO4)Out
2GNDGND
33V3VCC

Montage:

  • De IR Ontvanger conform bovenstaande pinout aangesloten op de Wemos D1 mini
  • In de bovenkant van de behuizing 3 kleine gaatjes geboord waar de 3 poten van de IR Ontvanger doorheen passen
  • Op de 3 poten van de IR ontvanger 3 female dupont draadjes gemonteerd en het geheel gefixeerd m.b.v. wat warme lijm uit een lijmpistool
  • Onder in de behuizing met een stanley mes een kleine uitsparing gemaakt waardoor een USB kabeltje past

Stappenplan:

Stap 1. IR Codes in geleerd van Afstandsbediening Hiervoor een Wemos D1 mini bordje tijdelijk geflashed met onderstaande sketch m.b.v. Arduino IDE. Vooraf eerst de volgende libraries binnen Arduino IDE geïnstalleerd:

  • IRremoteESP8266
  • IRrecv
  • IRutils

(Let op, in onderstaand script is de Out van de VS1838B op D4 aangesloten)

#include <IRremoteESP8266.h>
#include <IRrecv.h>
#include <IRutils.h>

int RECV_PIN = D4; //an IR detector connected to D4
IRrecv irrecv(RECV_PIN);
decode_results results;

void setup() {   
Serial.begin(9600);   
irrecv.enableIRIn(); // Start the receiver
}

void loop() {   
if (irrecv.decode(&results)) {     
serialPrintUint64(results.value, 16);     
irrecv.resume(); // Receive the next value   
}
delay(100);
}

Vervolgens één voor één de knoppen van de afstandsbediening ingedrukt en de codes afgelezen van de seriële monitor binnen Arduino IDE. Dat leverde de volgende codes op

KnopHEXDec
On40BFA05F1652858785
Off40BFB04F4264532093
+40BF50AF2265512801
40BF10EF3182728517

(Deze stap kan eventueel overgeslagen worden, je kunt de waarden ook aflezen op het tab Devices van ESPEasy)

Stap 2. ESPEasy geconfigureerd De volgende aanpassingen in de configuratie van de WIFI thermometer aangebracht:

Toelichting op niet default waarden:

SettingWaardeReden
GPIO – SDA – None –GPIO’s vrij te maken
GPIO – SCL – None –GPIO’s vrij te maken

 IR Receiver als Device #2 toegevoegd

Toelichting op niet default waarden:

SettingWaardeToelichting
DeviceCommunication – IR Receive (TSOP4838) 
NameIR Receiver 
Enabledaangevinkt
Internal PullUpaangevinkt
GPIO – IRGPIO-4 (D2)D2
Excecute commandsaangevinkt
Code – command map #1 
Decode typeNEC 
Code [Hex]40BFA05FZie bovenstaande tabel
Command 1Publish werkplek/in,{“On”}
Code – command map #2
Decode typeNEC
Code [Hex]40BFB04F
Command 2Publish werkplek/in,{“Off”}
Code – command map #3
Decode typeNEC
Code [Hex]40BF50AF
Command 3Publish werkplek/in,{“Dim”}
Code – command map #4
Decode typeNEC
Code [Hex]40BF10EF
Command 4Publish werkplek/in,{“Feller”}
Values #1IR

Stap 4. Flow ontwikkeld in Node Red van links naar rechts, boven naar onderen

NodeWerking
werkplekMQTT server geconfigureerd
Luistert naar topic “werkplek/in”
TransformSplitst de commando’s op
On LinksStuurt On-commando voor Werkplek Irma links naar Domoticz
On RechtsStuurt On-commando voor Werkplek Irma rechts naar Domoticz
Off LinksStuurt Off-commando voor Werkplek Irma links naar Domoticz
Off RechtsStuurt Off-commando voor Werkplek Irma rechts naar Domoticz
Get Current LevelHaalt huidige waarden op van Werkplek Irma Links en stopt dat in een JSON object
Current LevelHaalt huidige dim level uit JSON object, node msg.payload.result.0.Level
Dim LinksDim Werkplek Irma links met 10%
Dim RechtsDim Werkplek Irma rechts met 10%
Feller LinksLaat Werkplek Irma links feller branden met 10%
Feller RechtsLaat Werkplek Irma rechts feller branden met 10%
DomoticzStuurt commando (in msg.payload) naar MQTT broker in topic “domoticz/in”

  Export van flow:

[{“id”:”2d73659d.eaf55a”,”type”:”tab”,”label”:”IR Receiver Werkplek Irma”,”disabled”:false,”info”:”Deze flow zorgt ervoor dat de door de ESPEasy rules gegenereerde commando’s omgezet worden naar door Domoticz te interpreteren MQTT commando’s”},{“id”:”b0539b10.521958″,”type”:”mqtt in”,”z”:”2d73659d.eaf55a”,”name”:”werkplek”,”topic”:”werkplek/in”,”qos”:”2″,”datatype”:”auto”,”broker”:”ede154bd.f75f38″,”x”:160,”y”:80,”wires”:[[“3317c7b2.cd3998”]]},{“id”:”c21743f8.6c589″,”type”:”mqtt out”,”z”:”2d73659d.eaf55a”,”name”:”domoticz”,”topic”:”domoticz/in”,”qos”:””,”retain”:””,”broker”:”ede154bd.f75f38″,”x”:1140,”y”:80,”wires”:[]},{“id”:”3317c7b2.cd3998″,”type”:”switch”,”z”:”2d73659d.eaf55a”,”name”:”Transform”,”property”:”payload”,”propertyType”:”msg”,”rules”:[{“t”:”eq”,”v”:”{\”On\”}”,”vt”:”str”},{“t”:”eq”,”v”:”{\”Off\”}”,”vt”:”str”},{“t”:”eq”,”v”:”{\”Dim\”}”,”vt”:”str”},{“t”:”eq”,”v”:”{\”Feller\”}”,”vt”:”str”}],”checkall”:”true”,”repair”:false,”outputs”:4,”x”:340,”y”:80,”wires”:[[“7c66e503.ff3a5c”,”f6b646fe.482c18″],[“b0fe1867.70ca58″,”70caeff5.2ecc7”],[“be1b2451.2d9ef8”],[“3ae0178c.5a2658”]]},{“id”:”7c66e503.ff3a5c”,”type”:”change”,”z”:”2d73659d.eaf55a”,”name”:”On Links”,”rules”:[{“t”:”set”,”p”:”payload”,”pt”:”msg”,”to”:”{\”command\”:\”switchlight\”,\”idx\”:105,\”switchcmd\”:\”On\”}”,”tot”:”str”}],”action”:””,”property”:””,”from”:””,”to”:””,”reg”:false,”x”:520,”y”:60,”wires”:[[“c21743f8.6c589”]]},{“id”:”b0fe1867.70ca58″,”type”:”change”,”z”:”2d73659d.eaf55a”,”name”:”Off Links”,”rules”:[{“t”:”set”,”p”:”payload”,”pt”:”msg”,”to”:”{\”command\”:\”switchlight\”,\”idx\”:105,\”switchcmd\”:\”Off\”}”,”tot”:”str”}],”action”:””,”property”:””,”from”:””,”to”:””,”reg”:false,”x”:520,”y”:160,”wires”:[[“c21743f8.6c589”]]},{“id”:”be1b2451.2d9ef8″,”type”:”http request”,”z”:”2d73659d.eaf55a”,”name”:”Get Current Level”,”method”:”GET”,”ret”:”obj”,”paytoqs”:”ignore”,”url”:”http://192.168.2.29:8080/json.htm?type=devices&rid=105″,”tls”:””,”persist”:false,”proxy”:””,”authType”:””,”x”:510,”y”:320,”wires”:[[“43fcd27.9ff942c”]]},{“id”:”43fcd27.9ff942c”,”type”:”change”,”z”:”2d73659d.eaf55a”,”name”:”Current Level”,”rules”:[{“t”:”set”,”p”:”payload”,”pt”:”msg”,”to”:”payload.result.0.Level”,”tot”:”msg”}],”action”:””,”property”:””,”from”:””,”to”:””,”reg”:false,”x”:720,”y”:320,”wires”:[[“65155fb8.2bb36″,”2d4abe84.59af62”]]},{“id”:”65155fb8.2bb36″,”type”:”function”,”z”:”2d73659d.eaf55a”,”name”:”Dim Links”,”func”:”if (msg.payload-10 >= 10) {\n    Level = msg.payload – 10;\n    msg.payload = ‘{\”command\”:\”switchlight\”,\”idx\”:105,\”switchcmd\”:\”SetLevel\”,\”level\”:’ + Level + ‘}’;\n} else {\n    msg.payload = ‘{\”command\”:\”switchlight\”,\”idx\”:105,\”switchcmd\”:\”Off\”}’;\n}\n\nreturn msg;”,”outputs”:1,”noerr”:0,”initialize”:””,”finalize”:””,”x”:880,”y”:320,”wires”:[[“c21743f8.6c589”]]},{“id”:”3ae0178c.5a2658″,”type”:”http request”,”z”:”2d73659d.eaf55a”,”name”:”Get Current Level”,”method”:”GET”,”ret”:”obj”,”paytoqs”:”ignore”,”url”:”http://192.168.2.29:8080/json.htm?type=devices&rid=105″,”tls”:””,”persist”:false,”proxy”:””,”authType”:””,”x”:510,”y”:440,”wires”:[[“59132b88.afc554”]]},{“id”:”59132b88.afc554″,”type”:”change”,”z”:”2d73659d.eaf55a”,”name”:”Current Level”,”rules”:[{“t”:”set”,”p”:”payload”,”pt”:”msg”,”to”:”payload.result.0.Level”,”tot”:”msg”}],”action”:””,”property”:””,”from”:””,”to”:””,”reg”:false,”x”:720,”y”:440,”wires”:[[“118cc59b.e870aa”,”4650e94b.640b58″]]},{“id”:”118cc59b.e870aa”,”type”:”function”,”z”:”2d73659d.eaf55a”,”name”:”Feller links”,”func”:”if (msg.payload+10 <= 90) {\n    Level = msg.payload + 10;\n    msg.payload = ‘{\”command\”:\”switchlight\”,\”idx\”:105,\”switchcmd\”:\”SetLevel\”,\”level\”:’ + Level + ‘}’;\n} else {\n    msg.payload = ‘{\”command\”:\”switchlight\”,\”idx\”:105,\”switchcmd\”:\”SetLevel\”,\”level\”:100}’;\n}\n\nreturn msg;”,”outputs”:1,”noerr”:0,”initialize”:””,”finalize”:””,”x”:890,”y”:440,”wires”:[[“c21743f8.6c589”]]},{“id”:”f6b646fe.482c18″,”type”:”change”,”z”:”2d73659d.eaf55a”,”name”:”On Rechts”,”rules”:[{“t”:”set”,”p”:”payload”,”pt”:”msg”,”to”:”{\”command\”:\”switchlight\”,\”idx\”:125,\”switchcmd\”:\”On\”}”,”tot”:”str”}],”action”:””,”property”:””,”from”:””,”to”:””,”reg”:false,”x”:530,”y”:100,”wires”:[[“c21743f8.6c589”]]},{“id”:”70caeff5.2ecc7″,”type”:”change”,”z”:”2d73659d.eaf55a”,”name”:”Off Rechts”,”rules”:[{“t”:”set”,”p”:”payload”,”pt”:”msg”,”to”:”{\”command\”:\”switchlight\”,\”idx\”:125,\”switchcmd\”:\”Off\”}”,”tot”:”str”}],”action”:””,”property”:””,”from”:””,”to”:””,”reg”:false,”x”:530,”y”:200,”wires”:[[“c21743f8.6c589”]]},{“id”:”2d4abe84.59af62″,”type”:”function”,”z”:”2d73659d.eaf55a”,”name”:”Dim Rechts”,”func”:”if (msg.payload-10 >= 10) {\n    Level = msg.payload – 10;\n    msg.payload = ‘{\”command\”:\”switchlight\”,\”idx\”:125,\”switchcmd\”:\”SetLevel\”,\”level\”:’ + Level + ‘}’;\n} else {\n    msg.payload = ‘{\”command\”:\”switchlight\”,\”idx\”:125,\”switchcmd\”:\”Off\”}’;\n}\n\nreturn msg;”,”outputs”:1,”noerr”:0,”initialize”:””,”finalize”:””,”x”:890,”y”:360,”wires”:[[“c21743f8.6c589”]]},{“id”:”4650e94b.640b58″,”type”:”function”,”z”:”2d73659d.eaf55a”,”name”:”Feller rechts”,”func”:”if (msg.payload+10 <= 90) {\n    Level = msg.payload + 10;\n    msg.payload = ‘{\”command\”:\”switchlight\”,\”idx\”:125,\”switchcmd\”:\”SetLevel\”,\”level\”:’ + Level + ‘}’;\n} else {\n    msg.payload = ‘{\”command\”:\”switchlight\”,\”idx\”:125,\”switchcmd\”:\”SetLevel\”,\”level\”:100}’;\n}\n\nreturn msg;”,”outputs”:1,”noerr”:0,”initialize”:””,”finalize”:””,”x”:890,”y”:480,”wires”:[[“c21743f8.6c589”]]},{“id”:”ede154bd.f75f38″,”type”:”mqtt-broker”,”z”:””,”name”:”pi”,”broker”:”192.168.2.29″,”port”:”1883″,”clientid”:””,”usetls”:false,”compatmode”:false,”keepalive”:”60″,”cleansession”:true,”birthTopic”:””,”birthQos”:”0″,”birthPayload”:””,”closeTopic”:””,”closeQos”:”0″,”closePayload”:””,”willTopic”:””,”willQos”:”0″,”willPayload”:””}]  

Stap 5. onCommand functie in TUYA plugin aangepast

/home/pi/domoticz/plugins/tuyaha/plugin.py  

Vanwege wederom een bug, of niet op de juiste wijze kunnen escapen van het “Set Level” commando, een kleine aanpassing in de onCommand functie van de TUYA plugin gemaakt. Het commando “Set Level” aangeboden vanuit MQTT wordt namelijk niet herkend door de plugin, en omgezet naar een ongewenst “Off” commando. Waarschijnlijk veroorzaakt door de spatie in het commando. Vandaar wordt er vanuit de Node RED flow het commando “SetLevel” (zonder spatie) gestuurd.  

In de onCommand functie van de TUYA plugin een kleine toevoeging gemaakt zodat het “SetLevel” commando omgezet wordt naar “Set Level”.  

def onCommand(self, Unit, Command, Level, Color):   

Domoticz.Debug(“onCommand called for Unit ” + str(Unit) + “: Parameter ‘” + str(Command) + “‘, Level: ” + str(Level))   

if Command == ‘SetLevel’:   Command = ‘Set Level’     

# Find the device for the Domoticz unit number provided  

Geef een reactie

Je e-mailadres wordt niet gepubliceerd. Vereiste velden zijn gemarkeerd met *