Skip to content

Cheap and Easy Control of 8 Relays through Home Assistant

Home Assistant and ESPHome

Following up on my previous post of the Cheap and Easy series, I’m going to show you how you can control 8 relay channels for about 25 bucks and in about 30 minutes. If you’re not familiar with Home Assistant or ESPHome, check out my previous post.

In this project, I use a Wemos D1 Mini as the wifi enable the controller to interface with the relay module using the IO expansion shield.  The magic of this setup is using the IO module and soldering it directly onto the relay board.  This eliminates the narly mess you see you when would typically have 8 channels of relays.  As a bonus, since you are only using 8 of the available 16 channels on the IO module, you could use the remaining 8 IO to do all sorts of other things.

Shopping list:

  1. Wemos D1 Mini – The Wemos D1 Mini is an ESP8266 based microcontroller that will handle the heavy lifting of WiFi and communicating to your Home Assistant instance [ Amazon, 3 Pack, Amazon, 5 Pack ]
  2. MCP23017 IO Expansion Module – This is what you will use to allow you to drive all 8 relay channels with minimal effort [ Amazon ]
  3. 8 Channel Relay Board – I added the DHT to get temperature and humidity data [ Amazon ]
  4. Assorted Dupont Jumpers – Always have a bunch of these handy, they have a tendency to disappear and get used up in projects. [ Amazon ]OPTIONAL: If you want to control 12v or 24v loads
  5. Appropriate DC power supply for your loads – This will vary on what you are trying to control, links to some options. [ Amazon 12v 5A | Amazon 24v 3A ]
  6. LM2596S DC-DC power regulator – It converts garage door’s 12V DC to 5V DC for the Wemos or use a microUSB cable. [ Amazon ]
  7. Soldering Iron Kit – It’s likely that you already have this if you’ve been DIYing for a while [ Amazon ]

Installation is cake

You will need to provide 5v DC power to power the system.  To get started, you will want to place the IO module over the pins of the relay module.  Make sure to line these up correctly as I’ve indicated below.  If you don’t, it’s a big pain to remove it and put it back on correctly, especially if you’ve soldered it in place.  Ask me how I know.
The IO module will have a total of 4 wires connected to it:  two for +5v and GND from the power supply, and two for the I2C (SDA and SCL) from the Wemos.
The IO module will have a total of 4 wires connected to it:  two for +5v and GND from the power supply, and two for the I2C (SDA and SCL) from the Wemos.
That’s it!

Wiring for all of the devices

Pay careful attention to the alignment of the pins

Soldered IO module on to the relay module

Since it’s likely that you will want to switch/power things that are of higher voltage than the 5v rail you need to power the Wemos, I’ve included the 12v and 24v optional power supplies.  Be sure that you do not connect any of these higher voltages to any of the logic pins on the Wemos or the IO, only connect them to the relay output terminals.

ESPHome config

I created the 8 channels as output switches and for the time being omitted the remaining 8 channels which can be configured as inputs or outputs.  I created a new device, named it esphome_relay_board using a D1 mini board with the following config:


The components above include

  • An I2C component to enable I2C communication
  • A MCP23017 component for the IO module
  • A switch restart component to reboot the Wemos
  • A switch GPIO component for the relay
  • A status LED component for indicating networking/error status.

Now can compile the firmware and flash it to your Wemos D1.  Again, if you’re not familiar with how to do this, reference the videos linked above.  Once it’s flashed, power cycle the device.  Now you should be able to open the web GUI for the device by either going to it’s IP or going to http://esphome_relay_board.local in your browser, or whatever you named it.  When the page loads up, you should test out the relay switches by hitting the button next to them.

Integration into Home Assistant

Now to integrate it into Home Assistant, you will need to go to configuration > integrations.  Assuming you have discovery enabled, you will have a new ESPHome device, click configure and add it to your system.  If you don’t have any existing conflicting entities, your entity names should match the ones I have.  I’m using the following config for lovelace:

This provides you with a simple switch list who’s icon shows you the state of the relay.


Published inDIY HardwareESPHomeHome AssistantHome Automation


  1. zws zws

    Very good tutorial. Thank you!

  2. DK DK

    It would probably be easier to use two separate 8 channel boards with two IO modules if you need 16 channels

  3. Anonymous Anonymous

    There’s a bug in the code:
    sda: D2
    scl: D1
    scan: True

    D1 and D2 should be the other way around:
    sda: D1
    scl: D2
    scan: True

  4. DK DK

    Awesome thanks for catching it!! Fixed.

  5. DK DK

    I would imagine it wouldn’t line up. If you want easiest wiring option, do two multiples of the 8 channel setup. You’ll just have to change the address of the second MCP module with the onboard solder pads.

  6. David David

    Hi! I think the commercial controllers are doing something more than a straight relay to control valves.

    I get really bad water hammer when my valve gets turned off via my outdoor Z-wave switch. I tried borrowing my friend’s new Orbit controller, and amazingly the hammer is gone.

    My suspicion is that the Orbit is soft powering off the valves. Perhaps some kind of RC circuit with a long time constant to slowly close the solenoid?

  7. DK DK

    Not sure. From what I’ve seen a lot of the commercial ones use a valve, which are inherently slow. On the other hand, the solenoid you mentioned, is typically very fast as they operate in a linear motion driven by magnets.

  8. David David

    My bad, I confused your article with another similar one I was reading which was geared towards a DIY irrigation controller

  9. Titus Titus

    Hey, I just went through your tutorial and I have everything set up, but I’m not able to control the relay. The web server for the relay spins up fine and I am able to toggle the states for different channels, however that does not seem to have any effect. I do see in the logs that I2C devices were found and etc. I also checked to make sure the relay is getting proper voltage on it’s VCC pin using a voltmeter. It seems to be getting 5.4V so that should be fine. Any ideas of what I could do to trouble shoot this further?

  10. BBK BBK

    Nice work, though, you have also forgot that ESPs run 3.3V on all their digital IO pins.
    You need a 3.3V – 5V logic level converter (e.g. not to ruin your ESP soon. Since you use i2c should use a bidirectional fast one.

    I hope this helps in the stabilization of your projects!

  11. BobT BobT

    Am ready to order the parts, but not sure about the comment from BBK on the voltage converter. Do I need that and how is it connected.

  12. BBK BBK

    BobT: officially GPIOs are only supporting 3.3V (

    The Espressif ESP8266 datasheet, on page 19 defines also 3.6v and 12mA max current:

    Though, there are people who has tested it and it works with 5V, though, it highly depends on the hw implementation (“clones”, since Espressif releases their specifications based on which others are also manufacturing boards).

    In this special case though, we could be lucky, since this relay board could be operated with isolated 3.3V for the I/O and giving 5V to the relays/transistors. Check the datasheet of the relay board, page 3:

    “It is sometimes possible to use this relay boards with 3.3V signals, if the JD-VCC (Relay Power) is provided from a +5V supply and the VCC to JD-VCC jumper is removed. That 5V relay supply could be totally isolated from the 3.3V device, or have a common ground if opto-isolation is not needed. If used with isolated 3.3V signals, VCC (To the input of the opto-isolator, next to the IN pins) should be connected to the 3.3V device’s +3.3V supply.”

    Do not misunderstand me, I am not saying that the connection presented by D Khaz is not working, or bad, but according to the datasheets, it is not compliant. I am just building an automated sprinkler solution based on esp8266 and this type of relays, and would want it to be on the safe side, have it work reliable.

    I would also be curious about D Khaz’s opinion on the topic too.

  13. BobT BobT

    BBK, Thanks for the quick response. I agree with the 3.3v for the I/O, but I noticed that the interface came in various physical configurations. I found one from AliExpress that matched the physical configuration in the write-up: but could not find any electrical specs.

    Another version of the MCP23017 IO indicates it is compatible with both 3.3v and 5V levels: but has a different physical configuration.

    I was unable to find the specifications on the relay board. If you have them please send me a link.

Leave a Reply

Your email address will not be published.

If I've helped yuy me a coffee If I've helped you, buy me a coffee