MQTT IR transceiver
ESP8266 based gateway between MQTT and IR. Code compatible with PlatformIO. Works with ESP-01 (debug mode have to be disabled in globals.h)
Features
- Receiving of IR transmission and publish it as MQTT messages
- Receive MQTT messages and send IR signal (multiple formats supported - NEC, RC5, LG, SONY, Global Cache )
- Storing raw IR messages on flash and transmitting via IR
- Constant current IR LED emitter circuit (based on Analysir schematic )
- MQTT over SSL support
- OTA updates
Working modes
IR transmitting
IR receiving
Used librariers
- IRremoteESP8266 - https://github.com/markszabo/IRremoteESP8266/
- ArduinoJson - https://github.com/bblanchon/ArduinoJson
- PubSubClient - https://github.com/knolleary/pubsubclient
- WiFiManager - https://github.com/tzapu/WiFiManager
Installation
GPIO connections:
GPIO WEMOS | GPIO ESP01 | Usage |
---|---|---|
13 | 0 | IR receiver |
14 | 3 (Uart RX) | IR LED - connected via simple transistor amplifier |
15 (to +3,3V) | 2 (to GND) | Button - used for reset configuration |
2 (Wemos buildin) | not used | LED |
For ESP01 following changes have to take place:
- in platformio.ini change board from d1_mini to esp01_1m
- in globals.h comment out line "#define DEBUG X"
Schematic
BOM
- D1,D2 - 1N4148
- Q1 - NPN transistor
- IR1 - IR receiver
- IR LED1, IR LED2 - Infrared LED
- R1 - 3.3kΞ©
- R2 - 2.5Ξ©
Requirements:
1. Clone the Repository into VS Code
In VS Code press F1 enter ''git: clone'' + Enter and insert link to my repository (https://github.com/piotrC4/mqtt-ir-transceiver)
2. Modify platformio.ini (optional)
Edit platformio.ini and setup upload_port variable acording to system settings if PlatofmIO can'd identify proper COM port
3. Build binary file
In PlatformIO menu choose PROJECT TASKS -> Build
4. Upload firmware to ESP8266
Connect ESP to PC via serial adapter. In PlatformIO menu choose option PROJECT TASKS -> Upload.
Usage
Configuration
During first boot device will act as AP with SSID IRTRANS-XXXXXXXX (password is XXXXXXXX). Connect to this AP and go to http://192.168.4.1. Configure WIFI and MQTT paramters.
Resetting configuration
If during boot device have is pressed, device will go to configuration mode.
Controller β Device communication
Property | Message format | Description | Example |
---|---|---|---|
_mqtt_prefix_/sender/storeRaw/_store_id_ | \d+(,\d+) | store raw codes sequence in slot no. _store_id_, last number is frequency in kHz | Topic: "_mqtt_prefix_/sender/storeRaw/10" Message: "11,43,54,65,32" 32 - is frequency in kHz |
_mqtt_prefix_/sender/sendStoredRaw | \d+ | Transmit via IR RAW code from provided slot | Topic: "_mqtt_prefix_/sender/sendStoredRaw" Message: "1" |
_mqtt_prefix_/sender/sendStoredRawSequence | \d+(,\d+)* | Transmit via IR sequence of RAW codes from provided slots | Topic: "_mqtt_prefix_/sender/sendStoredRawSequence" Message: "1,2,3" |
_mqtt_prefix_/sender/cmd | (ls|sysinfo) | Execute on device command, replay in topic _mqtt_prefix_/sender/cmd/result | Topic: "_mqtt_prefix_/sender/cmd" Message: "sysinfo" |
_mqtt_prefix_/sender/rawMode | (1|ON|true|.*) | Turn on/off reporting to controller received by device IR raw codes | Topic: "_mqtt_prefix_/sender/rawMode" Message: "1" |
_mqtt_prefix_/wipe | .* | Wipe configuration for next boot | Topic: "_mqtt_prefix_/wipe" Message: "1" |
_mqtt_prefix_/sender/(RC_5|RC_6|NEC|SAMSUNG|SONY|LG)/(\d+) | \d+ | Send IR signal based on type | Topic: "esp8266/02sender/RC_5/12" Message: "3294" |
_mqtt_prefix_/sender/sendGC | \d+(,\d+) | Send Global Cache code | Topic: "_mqtt_prefix_/sender/sendGC" Message: "32000,43,54,65,32,...." |
_mqtt_prefix_/sender/sendRAW | \d+(,\d+) | Send RAW code with given frequency | Topic: "_mqtt_prefix_/sender/sendRAW" Message: "9000,4550,550,600,600,600,...,32" 32 is frequency in kHz |
_mqtt_prefix_/sender/otaURL | .* | Update via HTTP from URL | Topic: "_mqtt_prefix_/sender/otaURL" Message: "http://ota.server/firmware.bin" |
Device β Controller communication
Property | Message format | Direction | Example |
---|---|---|---|
_mqtt_prefix_/sender/cmd/result | .* | Result of command | |
_mqtt_prefix_/receiver/_type_/_bits_/_panas_addr_ | \d+(,\d+)* | Send to controller received IR code | Topic: "_mqtt_prefix_/receiver/RC_5/12" Message: "3294" |
_mqtt_prefix_/receiver/raw | \d+(,\d+)* | Send to controller received RAW IR code (only when RAW mode is enabled) | Topic: "_mqtt_prefix_/receiver/raw" Message: "9000,4550,550,600,600,600,..." |
Integration with OpenHab
- Run MQTT server (mosquitto is fine)
- Configure MQTT server for OpenHab transport
- Register IR Transceiver to the same MQTT server (for example MQTT prefix is 'esp8266/02')
- Example items configuration:
Group gIR <own_ir> (All)
Switch ir_philips_on
"Philips Power" <own_ir> (gIR)
{mqtt=">[mosquitto:esp8266/02/sender/RC5/12:command:ON:56]", autoupdate="false"}
Switch ir_philips_volp
"Vol+" <own_ir> (gIR)
{mqtt=">[mosquitto:esp8266/02/sender/RC5/12:command:ON:1040]", autoupdate="false"}
Number ir_in_lg
"LG IR command [%d]" <own_ir> (gIR)
{mqtt="<[mosquitto:esp8266/02/receiver/NEC/32:state:default]"}
Switch ir_adb_star
"ADB 0" <own_ir) (gIR)
{mqtt=">[mosquitto:esp8266/02/sender/sendGC:command:ON:38000,1,37,8,34,8,75,8,44,8,106,8,50,8,50,8,39,8,81,8,525,8,34,8,60,8,29,8,44,8,44,8,44,8,29,8,29,8,3058,8,34,8,75,8,44,8,106,8,50,8,50,8,39,8,81,8,525,8,34,8,101,8,70,8,44,8,44,8,44,8,29,8,29,8,3058]", autoupdate="false"}
- Using in rules:
rule lgTVturnInfoScreen
when
Item ir_in_lg received update 551549190
then
// Do somenting after button press
end
rule initIRmodule
when
System started
then
// Turn off Philips after system start
postUpdate(ir_philips_on,OFF)
// Switch LG TV to HDMI 1 by Global Cache code
publish("mosquitto","esp8266/02/sender/sendGC","38000,1,69,343,172,21,22,21,22,21,65,21,22,21,22,21,22,21,22,21,22,21,65,21,65,21,22,21,65,21,65,21,65,21,65,21,65,21,22,21,65,21,65,21,65,21,22,21,22,21,65,21,65,21,65,21,22,21,22,21,22,21,65,21,65,21,22,21,22,21,1673,343,86,21,3732")
end