# MQTT IR transceiver ESP8266 based gateway between MQTT and IR. Code compatible with [PlatformIO](http://platformio.org/). 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](https://irdb.globalcache.com/Home/Database) ) * Storing raw IR messages on flash and transmitting via IR * Constant current IR LED emitter circuit (based on [Analysir schematic](https://www.analysir.com/blog/2013/11/22/constant-current-infrared-led-circuit/) ) * MQTT over SSL support * OTA updates ## Working modes ### IR transmitting ![alt text](docs/ir-mode-sender.png "IR transmitting mode") ### IR receiving ![alt text](docs/ir-mode-receiver.png "IR receiving mode") ## 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 ![alt text](docs/ir-transceiver_schematic.png "Basic schematic") ### BOM * D1,D2 - 1N4148 * Q1 - NPN transistor * IR1 - IR receiver * IR LED1, IR LED2 - Infrared LED * R1 - 3.3kΩ * R2 - 2.5Ω ### Requirements: * [Visual Studio Code](https://code.visualstudio.com/) * [PlatformIO IDE extenstion](https://docs.platformio.org/en/latest/ide/vscode.html) * [GIT](https://git-scm.com/downloads) ### 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: ```java Group gIR (All) Switch ir_philips_on "Philips Power" (gIR) {mqtt=">[mosquitto:esp8266/02/sender/RC5/12:command:ON:56]", autoupdate="false"} Switch ir_philips_volp "Vol+" (gIR) {mqtt=">[mosquitto:esp8266/02/sender/RC5/12:command:ON:1040]", autoupdate="false"} Number ir_in_lg "LG IR command [%d]" (gIR) {mqtt="<[mosquitto:esp8266/02/receiver/NEC/32:state:default]"} Switch ir_adb_star "ADB 0"