<- Back to Projects

Voltas IR Mapping

Complete IR code database, fully decoded protocol documentation, and ready-to-use Home Assistant integration for the Voltas 183V DZU2 AC.

ESPHomeHome AssistantReverse EngineeringC++Python

License ESPHome Home Assistant Flipper Zero ESP32 IR Signals

Voltas 183V DZU2 IR Remote — Codes, Protocol & Home Assistant Integration

Complete IR code database, fully decoded protocol documentation, and ready-to-use Home Assistant (ESPHome) climate integration for the Voltas 183V DZU2 split AC. Also includes Flipper Zero .ir files for direct import.

Features

74 captured IR signals

  • every temperature, fan speed, mode, and feature combination

Full protocol decode

  • 48-bit NEC-extended, Gray-coded temperature, timer encoding

ESPHome climate component

  • shows up as a native AC in Home Assistant

Flipper Zero compatible

  • pre-built .ir files (full + compact remote)

Timer support

  • 0.5h to 24h, auto-off and auto-on

All features

  • Cool, Heat, Dry, Fan, Swing, Turbo, Sleep, Eco, Follow Me, Display toggle

Project Structure

voltas_ir_mapping/
  README.md                       -- this file
  PROTOCOL.md                     -- decoded IR protocol reference
  LICENSE                         -- MIT

  record_codes.py                 -- interactive Python recorder
  json_to_flipper.py              -- convert JSON to Flipper Zero .ir format
  voltas_183v_dzu2_codes.json     -- all recorded codes database
  Voltas_183V_DZU2.ir             -- Flipper Zero / IR remote (full database)
  Voltas_183V_DZU2_Remote.ir      -- Flipper Zero / IR remote (compact)

  voltas_ir_capture/              -- Arduino sketch: IR receiver/decoder
    voltas_ir_capture.ino

  voltas_ir_send/                 -- Arduino sketch: IR transmitter (test)
    voltas_ir_send.ino

  esphome/                        -- Home Assistant / ESPHome integration
    voltas_ac.yaml                -- ESPHome device config
    secrets.yaml.example          -- WiFi/API credential template
    components/
      voltas_ac/
        __init__.py               -- component registration
        climate.py                -- platform config schema
        voltas_ac.h               -- climate component (protocol impl)

Hardware

ComponentPurpose
Arduino Uno R4 WiFiCapture and test IR codes
HW-477 (VS1838B)38kHz IR receiver module
IR LED + 100 ohmIR transmitter (test)
ESP32-S3ESPHome deployment to HA

Yes, the ESP32-S3 is overpowered for this project but that’s what I had laying around.

ESP32-S3 board, top view

ESP32-S3 with transistor-driven IR LED wiring

Protocol Summary

48-bit NEC-extended variant at 38kHz. See PROTOCOL.md for full details.

B0    B1    B2       B3      B4               B5
0xB2  0x4D  command  ~B2     (temp|mode)      ~B4
  • Temperature: Gray-coded nibble in B4 upper 4 bits (17-30C)
  • Fan speed: encoded in B2 (High=0x3F, Med=0x5F, Low=0x9F, Auto=0xBF)
  • Mode: lower nibble of B4 (Cool=0x0, Dry=0x4, Heat=0xC)

Quick Start

1. Capture codes (Arduino)

# Flash receiver sketch
arduino-cli compile --fqbn arduino:renesas_uno:unor4wifi voltas_ir_capture/
arduino-cli upload  --fqbn arduino:renesas_uno:unor4wifi --port /dev/ttyACM0 voltas_ir_capture/

# Run interactive recorder
python3 record_codes.py

2. Deploy to Home Assistant (ESP32-S3)

cd esphome/
cp secrets.yaml.example secrets.yaml
# Edit secrets.yaml with your WiFi credentials
esphome run voltas_ac.yaml

The AC appears as a Climate entity in Home Assistant with:

  • Climate: temperature (17-30C), modes (Cool/Heat/Dry/Fan), fan speeds, swing
  • Buttons: Turbo toggle, Display toggle
  • Numbers: Timer Off (0-24h), Timer On (0-24h)
  • Switches: Sleep, Eco, Follow Me

3. Flipper Zero / IR Remote App

The pre-built Voltas_183V_DZU2.ir file can be imported directly into:

  • Flipper Zero: Copy to SD Card/infrared/ on the Flipper
  • IR remote apps: Any app that supports the Flipper .ir format

To regenerate after recording new codes:

python3 json_to_flipper.py

Adding New Codes

Step 1: Set up the capture hardware

Wire the VS1838B receiver to the Arduino:

HW-477 Module     Arduino Uno R4 WiFi
  S (Signal)  -->   Pin 2
  + (VCC)     -->   5V
  - (GND)     -->   GND

Step 2: Flash the receiver sketch

arduino-cli compile --fqbn arduino:renesas_uno:unor4wifi voltas_ir_capture/
arduino-cli upload  --fqbn arduino:renesas_uno:unor4wifi --port /dev/ttyACM0 voltas_ir_capture/

If the port is busy:

# Find what is using the port
lsof /dev/ttyACM0

# Kill it
fuser -k /dev/ttyACM0

# List available ports
arduino-cli board list

Step 3: Run the recorder

python3 record_codes.py

The recorder will:

  • Auto-detect the Arduino serial port
  • Load any existing codes from voltas_183v_dzu2_codes.json
  • Wait for IR signals from the receiver
  • Show decoded hex bytes for each capture
  • Detect duplicate signals automatically
  • Prompt you to label each new signal
  • Save after every capture (safe against crashes)

Step 4: Capture the signal

  1. Point the remote at the VS1838B
  2. Set the desired AC state in the app
  3. Press the button to transmit
  4. Type a descriptive label when prompted, for example:
    • cool_24c_fan_auto
    • mode_heat_27c_fan_high
    • swing_on
    • sleep_mode_on

Step 5: Analyze the new code

After capturing, check the hex bytes against the protocol:

B0 B1 B2 B3 B4 B5
  • B0/B1 should be B2 4D, B5 4A, or BA 45
  • B3 should equal ~B2
  • B5 should equal ~B4 (except timer, sleep off, eco commands)
  • Compare B2 and B4 against the tables in PROTOCOL.md

Step 6: Update the ESPHome component (if needed)

If the new code reveals a feature not yet in the ESPHome component (e.g., a new mode, turbo, sleep timer):

  1. Open esphome/components/voltas_ac/voltas_ac.h
  2. Add the new B2/B4 constants
  3. Update traits() to expose the new feature
  4. Update transmit_state_() to construct the new frame
  5. Recompile and flash the ESP32-S3

Example — adding a new toggle feature:

// In the constants section:
static const uint8_t MY_FEATURE_DATA = 0xNN;  // from captured B4

// Add a public method:
void send_my_feature() {
  this->send_frame_(SPECIAL_ADDR_HI, SPECIAL_ADDR_LO, SPECIAL_CMD, MY_FEATURE_DATA);
}

Then in voltas_ac.yaml, expose it as a button:

button:
  - platform: template
    name: 'My Feature'
    on_press:
      - lambda: |-
          ((esphome::voltas_ac::VoltasAC*)id(voltas_ac_climate))->send_my_feature();

Recorder commands

During recording, the following inputs are available:

InputAction
labelSave the signal with that label
sSkip this signal
rRedo — discard and wait for next signal
EnterAuto-label as signal_N
Ctrl+CStop recording and print summary

When a duplicate signal is detected:

InputAction
sSkip (default)
kKeep both with a new name
oOverwrite the existing entry

When a duplicate label is entered:

InputAction
rRename (default)
oOverwrite the existing entry
sSkip

Wiring Reference

IR Receiver (capture)

HW-477 Module     Arduino Uno R4 WiFi
  S (Signal)  -->   Pin 2
  + (VCC)     -->   5V
  - (GND)     -->   GND

IR Transmitter — simple (1-2m range, testing)

Arduino Pin 3  --[100 ohm]--> IR LED (+) --> IR LED (-) --> GND
ESP32-S3 GPIO4 --[100 ohm]--> IR LED (+) --> IR LED (-) --> GND

IR Transmitter — transistor (3-5m range, production)

Pin 3/GPIO4 --[1K ohm]--> NPN Base
                           NPN Emitter --> GND
                           NPN Collector --> IR LED (-)
                                            IR LED (+) --[47 ohm]--> 5V/3.3V

NPN transistor: 2N2222, BC547, or similar.

Dependencies

  • IRremote v4.x (Arduino library, for capture/test sketches)
  • pyserial (Python, for record_codes.py)
  • ESPHome (for Home Assistant deployment)
  • Arduino CLI or Arduino IDE
  • Arduino Uno R4 WiFi board support (arduino:renesas_uno)

Source

Protocol discovery started from IRremoteESP8266 PR #1243 which added support for the Voltas 122LZF Window AC. The 183V DZU2 split AC uses a different 48-bit protocol and was reverse-engineered from the original remote.

Compatible Models

Tested on the Voltas 183V DZU2 split/inverter AC. May also work with other Voltas models using the same 48-bit NEC-extended protocol with device address B2 4D. If your Voltas remote produces similar byte patterns, this integration should work directly or with minor modifications.

License

This project is licensed under the MIT License. See the LICENSE file for details.

Background by Mymind