Aansturen van verlichting met IR afstandsbediening

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 mini VS1838B
1 D2 (GPIO4) Out
2 GND GND
3 3V3 VCC

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

Knop HEX Dec
On 40BFA05F 1652858785
Off 40BFB04F 4264532093
+ 40BF50AF 2265512801
40BF10EF 3182728517

(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:

Setting Waarde Reden
Protocol Domoticz MQTT T.b.v. Publish van acties op MQTT broker
Unit nr 1 Als Unit nr 0 is geeft dit MQTT connection lost errors, ieder ESP device dient uniek nummer te hebben

Setting Waarde Reden
SDA   GPIO’s vrij te maken
SCL   GPIO’s vrij te maken

  IR Receiver als Device #2 toegevoegd

Setting Waarde Reden
Device Infrared input – TSOP4838  
Name IR Receiver  
IDX/Var   Niet nodig om ontvangen codes naar Domoticz te zenden
1st GPIO GPIO-4 D2
Pull UP Default
Inversed   Default
Send Data   Niet nodig om ontvangen codes naar Domoticz te zenden
Value Name 1 IR  

  Rules aangezet onder Tools, Advanced

Setting Waarde Reden
Rules Om het rules tabblad te activeren

Stap 3. Rules ontwikkeld In Rules zit een aantal onhebbelijke bugs, namelijk:

  • acties kunnen niet langer zijn dan 1 regel
  • spaties in parameters leveren in MQTT problemen op, het commando of de parameter wordt dan niet herkend omdat de spatie vervangen wordt door een komma

Daarom voor de Werkplekverlichting een werkarround ontwikkeld en een eigen MQTT topic geopend, “werkplek/in”, welke uitgelezen wordt door Node Red die het commando “On”, “Off”, “Dim” of “Feller” omzet naar een door Domoticz te interpreteren commando in het MQTT topic “domoticz/in”.

on IR Receiver#IR do

if [IR Receiver#IR] = 1652858785
Publish werkplek/in,{“On”}
elseif [IR Receiver#IR] = 4264532093
Publish werkplek/in,{“Off”}
elseif [IR Receiver#IR] = 3182728517
Publish werkplek/in,{“Dim”}
elseif [IR Receiver#IR] = 2265512801
Publish werkplek/in,{“Feller”}
endif

endon

  • De codes 1652858785, 4264532093, 3182728517 en 2265512801 zijn in stap 1. ingeleerd

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

Node Werking
werkplek MQTT server geconfigureerd
Luistert naar topic “werkplek/in”
Transform Splitst de commando’s op
On Links Stuurt On-commando voor Werkplek Irma links naar Domoticz
On Rechts Stuurt On-commando voor Werkplek Irma rechts naar Domoticz
Off Links Stuurt Off-commando voor Werkplek Irma links naar Domoticz
Off Rechts Stuurt Off-commando voor Werkplek Irma rechts naar Domoticz
Get Current Level Haalt huidige waarden op van Werkplek Irma Links en stopt dat in een JSON object
Current Level Haalt huidige dim level uit JSON object, node msg.payload.result.0.Level
Dim Links Dim Werkplek Irma links met 10%
Dim Rechts Dim Werkplek Irma rechts met 10%
Feller Links Laat Werkplek Irma links feller branden met 10%
Feller Rechts Laat Werkplek Irma rechts feller branden met 10%
Domoticz Stuurt 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 antwoord

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