Effortless Watering: How to Make a DIY ESP8266 Wi-Fi Sprinkler Controller

  • Post author:
  • Post last modified:June 1, 2023
  • Reading time:31 mins read
Here are the steps to create a DIY WiFi sprinkler controller using ESP8266:
1. Get a NodeMCU ESP8266 board, which is a cheap microcontroller that can be programmed to connect to WiFi.
2. Add a shift register for output line expansion to drive a set of relays.
3. Use the ESPHome firmware and add a custom part for the shift register.
4. Tie the ESP8266 end of the device with an instance of the Home Assistant home automation hub software.
5. Control the sprinkler outputs and apply automation scripts through Home Assistant.
6. Use Adafruit library and MCP23017 to expand the I/O commands.
7. Program the device using esphome.
8. Connect the sprinkler controller to the WiFi network.
9. Control the sprinkler system through a smartphone app or web interface.
By following these steps, you can create your own DIY WiFi sprinkler controller using ESP8266. This project is cost-effective and customizable, allowing you to tailor the system to your specific needs.

Are you tired of manually controlling your sprinkler system? Do you want an affordable and automated solution that can be controlled through a local network and integrated with Home Assistant? Look no further than the DIY WiFi sprinkler controller using ESP8266.

This complete guide will provide you with all the necessary information to build your own system and take control of your sprinklers. By utilizing the ESP8266 microcontroller, this project allows for easy integration with other smart home systems and provides expandable capabilities. With a focus on affordability, this project is perfect for those looking to innovate their home without breaking the bank.

In this guide, we’ll explore the components needed, circuit design, function of the system, and even discuss integration with Google Assistant and self-hosted controllers. Get ready to take control of your sprinkler system in a whole new way with this DIY WiFi sprinkler controller using ESP8266.

diy wifi sprinkler controller using esp8266


If you’re looking to automate and control your home sprinkler system with ease, this comprehensive article breaks down the components and background knowledge needed to build your very own DIY WiFi sprinkler controller using ESP8266. This smart sprinkler controller allows for local network reliance, easy expandability, simplicity, affordability, and manual zone control.

The circuit consists of three main parts: power supply, 8 relays, microcontroller and shift register. The prebuilt converter is used to convert 24V AC to 5V DC for the NodeMCU ESP8266 board used for WiFi interface. The common wire from sprinkler valves is connected to one side of AC power supply while the other side connects to a channel relay board that controls each sprinkler zone. A shift register is used to overcome limited GPIO pins and a 74HC595 shift register is used for serial communication to control additional IOs.

The DIY WiFi sprinkler controller also includes scheduling logic using Home Assistant as a home automation platform. The project can be improved by adding moisture sensors to use data from lawn or integrating it with Google Assistant for voice control.

With this guide on components and background knowledge in mind, you can now move onto building your very own smart sprinkler controller!


As you delve into the components section, you’ll discover a treasure trove of building blocks that will help bring your DIY WiFi sprinkler controller dreams to life. The heart of this project is the ESP8266 microcontroller board, which enables WiFi communication and control over your sprinkler system.

In addition to the ESP8266, you’ll need various other components such as protoboards, Dupont connectors, dustproof junction boxes, and screw terminals to assemble your zone sprinkler controller. The 8-channel relay board is also a crucial component in this project. It allows for individual control of each sprinkler valve by activating its corresponding relay pin through serial communication with the shift register.

With these essential parts at your disposal, you can start building your smart house automation system for watering your lawn. But before you begin assembling the circuitry, let’s take a look at why this DIY approach was chosen over existing commercial sprinkler controllers.


You may be interested to know the background behind why the decision was made to build your own wifi sprinkler controller using ESP8266 instead of opting for a pre-existing commercial system. The old Rain Bird system was replaced with a smart sprinkler system, but it lacked integrations with Home Assistant. After researching available options, you decided to build your own DIY sprinkler controller using cheap microcontroller NodeMCU ESP and additional zones for manual control.

To achieve this, you needed a local network reliance and easy expandability. You also wanted simplicity and affordability in the project. With these goals in mind, you set out to create a circuit that would allow you to control each sprinkler zone through relays connected to the NodeMCU ESP board via shift register. Finally, you planned on adding an ultrasonic distance sensor for moisture sensing capabilities in future iterations of the project.

Moving onto the next section about ‘circuit’, let’s take a closer look at how all these components come together to create your very own DIY wifi sprinkler controller using ESP8266.


Let’s dive into the Circuit section and see how all the components work together to bring your DIY WiFi sprinkler controller project to life.

The circuit consists of three main parts: power supply, 8 relays, microcontroller, and shift register. To convert 24V AC to 5V DC for ESP8266, a prebuilt converter is used as the power supply. The common wire from sprinkler valves is connected to one side of the AC power supply while another side is connected to relays that control each individual zone. An 8-channel relay board is used for this purpose.

To overcome limited GPIO pins on microcontroller NodeMCU ESP8266 board, a shift register (74HC595) is utilized for serial communication to control additional IOs. When NodeMCU receives command to turn on a sprinkler zone, the corresponding relay pin sets low through shift register outputs and activates the relay that connects COM and NO terminals. This triggers zones in which water needs to be sprayed out of sprinklers with precision timing based on user-defined schedules or weather data obtained from APIs such as Dark Sky Weather API or OpenWeatherMap API.

Moving on to its function, when a trigger for any particular zone occurs, it activates its respective relay via shift register output pins which then connect COM and NO terminals so that water can flow through it.

Now that we have understood how the circuit works, let’s explore how this mechanism leads us towards triggering different zones using Home Assistant by diving into our next subtopic – ‘Function’.


Now we’ll explore how the NodeMCU ESP8266 board and shift register work together to activate specific sprinkler zones, providing precision timing and control for your yard’s watering needs.

When a command is received by the NodeMCU through WiFi, the 74HC595 shift register sets the corresponding relay pin low. This activates the actual relays which connect COM and NO terminals, allowing current to flow to each sprinkler zone in an automated fashion as dictated by the circuit diagram.

By using additional components like screw terminals and dupont connectors, this DIY WiFi sprinkler controller can be easily expanded with local switches for manual control.

With this great video tutorial on hand from Sprinkler Warehouse, you can confidently assemble your own self-hosted home automation system that meets all of your initial goals.

The ability to control individual zones in an efficient manner means that you can save water while still maintaining healthy plants and lawn.

Now that we’ve discussed how the function of this controller works, let’s move onto its installation process into a dustproof junction box securely mounted on your garage wall.


Get your hands dirty and install the DIY WiFi sprinkler controller you’ve built using ESP8266. This installation process involves breaking down the circuit into three sections, creating protoboards for each section, and testing them independently before mounting them in a dustproof junction box on your garage wall.

This ensures that everything is working correctly before finalizing the installation. As an additional step, make sure to connect the specific wire from your older Rain Bird system to one side of the AC power supply. It’s also worth noting that this project doesn’t rely on cloud services since it uses Home Assistant integration instead.

With good reviews and a great diagram, this DIY project is simple enough to build even if you don’t have a lot of experience with electronics. Once everything is set up correctly, you’ll be able to control each sprinkler zone through Home Assistant or even add local switches for manual control.

Moving forward, our next steps will discuss how to improve this system by adding moisture sensors and integrating it with Google Assistant for voice control.

Next Steps

Ready to take your DIY sprinkler controller to the next level? In our upcoming article, we’ll discuss how to integrate moisture sensors and voice control with Google Assistant.

Adding moisture sensors allows you to use data from your lawn to determine when it needs watering, making your sprinkler system more efficient. And with voice control through Google Assistant, you can easily turn on and off zones or check the status of your sprinklers without even having to open an app.

But that’s not all! We also have more DIY WiFi projects in store for you. If you’re looking for another easy project, consider building a DIY smart garage door opener using ESP8266.

With a simple circuit diagram and some programming, you can create your own regulator for opening and closing your garage door remotely.

Stay tuned for more info on these additional projects! Now let’s dive into the project goals.

Project Goals

So, you’re interested in building your own DIY WiFi sprinkler controller using ESP8266 that meets your specific needs – great! The project goals we aim to achieve are: simplicity, affordability, and easy expandability. With these objectives in mind, you can create a reliable sprinkler system that works for you.

To get started on this project, there are a few things to keep in mind. Firstly, a common wire from the sprinkler valves connected to one side of the AC power supply is necessary. Secondly, heavy lifting won’t be required as prebuilt converters can be used to convert 24V AC to 5V DC for ESP8266. Lastly, serial communication comes into play with the use of shift registers such as the 74HC595 shift register for controlling additional IOs and overcoming limited GPIO pins.

With these steps in place and our goals set out clearly, we can begin exploring software and integration options for our DIY WiFi sprinkler controller using ESP8266.

So, now that we have established our project goals and taken care of some key elements like serial communication and power supplies, let’s move onto software and integration options which will make this project even more versatile!

Software and Integration

In this section, let’s explore the software and integration options for our DIY WiFi sprinkler controller using ESP8266. We can use Home Assistant, an open-source home automation platform, to create schedules and automate the control of our sprinklers.

The first step is to create a custom switch component that will allow us to use the 74HC595 shift register outputs in Home Assistant. We’ll need to write C++ code that defines a new class called ShiftRegisterSwitch and uses a lambda function to create each switch.

Once we have created the custom switch component, we can use Home Assistant to schedule when specific zones turn on and off based on weather conditions or time of day. For example, we can set up four watering scenarios for different areas of our yard using scripts in Home Assistant.

We can also group all of our sprinkler switches together using the group component in Home Assistant UI for easy access and control. With these integrations and software options, we can customize and automate our sprinkler system even further.

In the next section, we’ll dive into creating the custom switch component in more detail.

Custom Switch Component

Now it’s time for you to create a custom switch component that’ll allow you to use the 74HC595 shift register outputs in Home Assistant, giving you even more control over your sprinkler system. This component is created using C++ code and defines a new class called ShiftRegisterSwitch.

To implement this custom switch component, follow these steps:

  • Create a new directory called ‘custom_components’ within your Home Assistant configuration folder.
  • Create a new file within the ‘custom_components’ directory called ‘switch.py’.
  • Define the new class called ShiftRegisterSwitch using C++ code.
  • Use a Lambda function to create a vector for storing switches and create each one using the custom class.
  • Add the newly created switches to Home Assistant by adding them as entities in your configuration.yaml file.

With this custom switch component, you can easily create multiple switches for each of your sprinkler zones and group them together in the Home Assistant UI. You’ll have even more control over your sprinkler system, and you can easily control each of your sprinkler zones from the Home Assistant UI. Next up is learning about how to write C++ code to define this new class, which will give you even more control over your sprinkler system.

C++ Code

Craft a clever C++ code to create a custom switch component for your Home Assistant configuration, allowing you to control each sprinkler zone with ease. The ShiftRegisterSwitch class definition will be used to define the behavior of each individual sprinkler zone. This class will inherit from the Switch class provided by the Home Assistant API, and it will have its own implementation of the turn_on() function.

To create a vector of ShiftRegisterSwitch instances, use a lambda function that iterates over all zones and initializes them using their constructor. The constructor takes two arguments: the name of the entity and an instance of the 74HC595 shift register object. The name is used to uniquely identify each switch in Home Assistant’s UI, while the shift register object is used to set or reset specific pins depending on whether or not they should be delivering power to their corresponding relay.

Column 1Column 2Column 3Column 4Column 5
Class Name: ShiftRegisterSwitchInheritance: SwitchProperties: NameMethods: turn_on()Arguments: Entity ID, Register Object
Functionality: Control Sprinkler ZonesImplementation Language : C++Benefits: Easy Zone ControlLibraries Used : Arduino
#include <ESP8266WiFi.h>
#include <WiFiClient.h>
#include <ESP8266WebServer.h>

const char* ssid = "Your_WiFi_SSID";
const char* password = "Your_WiFi_Password";

ESP8266WebServer server(80);

// Pin connected to the relay module
const int relayPin = D1;

void setup() {
  pinMode(relayPin, OUTPUT);
  digitalWrite(relayPin, HIGH); // Turn off the sprinkler initially

  // Connect to Wi-Fi
  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED) {
    Serial.println("Connecting to WiFi...");

  // Print ESP8266 IP address
  Serial.print("WiFi connected. IP address: ");

  // Handle root URL
  server.on("/", handleRoot);

  // Handle sprinkler control URL
  server.on("/sprinkler", handleSprinkler);

  // Start the server

void loop() {

void handleRoot() {
  server.send(200, "text/plain", "DIY WiFi Sprinkler Controller using ESP8266");

void handleSprinkler() {
  if (server.hasArg("state")) {
    String state = server.arg("state");
    if (state == "on") {
      digitalWrite(relayPin, LOW); // Turn on the sprinkler
    } else if (state == "off") {
      digitalWrite(relayPin, HIGH); // Turn off the sprinkler
    server.send(200, "text/plain", "Sprinkler state: " + state);
  } else {
    server.send(400, "text/plain", "Invalid request");

Make sure to replace “Your_WiFi_SSID” and “Your_WiFi_Password” with your actual Wi-Fi credentials. Also, ensure that the relay module is connected to the ESP8266 GPIO pin specified in the relayPin variable. This code sets up a simple web server that can be accessed to control the sprinkler by sending requests to the /sprinkler URL with the query parameter state set to either “on” or “off”. The ESP8266 will control the relay based on the received state. The root URL (“/”) provides a basic welcome message.

Simple Version: require adjustments to fit your specific hardware setup and requirements

#include <Arduino.h>
#include <vector>

// Shift register library
#include <74HC595.h>

// Home Assistant API Switch class
class Switch {
  virtual void turn_on() = 0;

// Custom switch component for controlling sprinkler zones
class ShiftRegisterSwitch : public Switch {
  String entity_id;
  HC595 shift_register;

  ShiftRegisterSwitch(const String& entity, const HC595& register_obj)
    : entity_id(entity), shift_register(register_obj) {}

  void turn_on() override {
    // Implementation for turning on the switch
    // Set the corresponding pin on the shift register to deliver power to the relay
    // based on the entity_id
    // Example: shift_register.setPin(2, HIGH);

int main() {
  // Create an instance of the shift register object
  HC595 shift_register;

  // Create a vector of ShiftRegisterSwitch instances
  std::vector<ShiftRegisterSwitch> switches;

  // Lambda function to initialize the switches
  auto initialize_switches = [&]() {
    const std::vector<String> zones = { "Zone1", "Zone2", "Zone3" }; // Add more zones as needed

    for (const auto& zone : zones) {
      ShiftRegisterSwitch new_switch(zone, shift_register);

  // Initialize the switches

  // Perform other necessary setup and operations

  // Main loop
  while (true) {
    // Perform desired operations

    // Example: Turn on Zone1

    // Delay for a certain period of time

    // Perform other operations

    // Example: Turn off Zone1
    // switches[0].turn_off();

  return 0;

Now that you have created an array of switches, you can incorporate them into your Home Assistant configuration file and start controlling your sprinklers directly from within its UI! Next up is learning how to utilize lambda functions for creating these vectors and further optimizing your code for maximum efficiency.

Lambda Function

You’ll learn how to create a more efficient code by using lambda functions in the current section. This will allow you to easily iterate over all zones and initialize them with the ShiftRegisterSwitch constructor. By creating a vector of switches, you can loop through each zone and set up its corresponding switch with just a few lines of code. This not only saves time but also makes your code easier to read and maintain.

In addition to setting up each zone, this lambda function also creates a group component for all sprinkler switches in Home Assistant. This allows you to easily control all sprinkler zones as one entity or individually within the Home Assistant UI.

With these steps completed, we can move on to scheduling logic and creating watering scenarios for different areas of our yard in the next section.

Scheduling Logic

Get ready to automate your sprinkler system with scheduling logic by setting up watering scenarios for different areas of your yard using Home Assistant scripts.

With Home Assistant, you can create schedules based on time, weather conditions, or other factors. For instance, you can set a schedule to water the front lawn every Monday and Wednesday at 7am or trigger the sprinklers to turn off if it starts raining outside.

To create a watering scenario, you need to define conditions that the script will follow. This includes specifying the sprinkler zones that will be activated and how long they will run for. Once you have created a script for each scenario, you can easily activate them from the Home Assistant user interface.

With this feature in place, your sprinkler system will automatically adjust watering times based on weather conditions and save water when it’s not needed.

Now that you have created watering scenarios, it’s time to group all sprinkler switches together in the Home Assistant UI. By doing so, you’ll have an easy way of accessing all of your sprinklers in one place without having to navigate through multiple pages or menus.

With groups set up properly in Home Assistant, controlling your entire irrigation system becomes much easier than ever before!

Grouping Sprinkler Switches

Let’s simplify controlling your entire sprinkler system by grouping all sprinkler switches together in the Home Assistant UI. This will allow you to easily turn on or off multiple zones at once, without having to toggle each one individually.

To do this, simply create a new group component in Home Assistant and add all of your sprinkler switches to it. You can then control the entire group with just one click.

Once you’ve grouped your sprinkler switches together, it’s time to set up watering scenarios for different areas of your yard. In the next section, we’ll show you how to use Home Assistant scripts to automate watering based on different schedules and weather conditions.

By grouping your switches and setting up automated watering scenarios, you’ll have complete control over your sprinkler system and ensure that every area of your lawn gets the right amount of water.

Watering Scenarios

To achieve optimal watering for different areas of your yard, set up automated watering scenarios using Home Assistant scripts. First, identify the specific needs of each area and assign them to a group in Home Assistant.

For example, you may have one group for grassy areas and another for flower beds. Next, create a script for each watering scenario. In each script, specify which zones should be watered, how long they should be watered for, and at what time the watering should start.

You can also add conditions such as only watering if it hasn’t rained in the past 24 hours or skipping watering if the temperature is below freezing. Finally, schedule these scripts to run automatically using Home Assistant’s automation feature.

With this setup, you can ensure that each area of your yard receives the appropriate amount of water without any manual intervention. To further improve your DIY sprinkler system, consider adding moisture sensors to gather data about your lawn’s hydration levels and adjust watering accordingly.

Moisture Sensors

As you delve deeper into optimizing your lawn’s hydration levels, adding moisture sensors will provide valuable data for adjusting watering schedules and improving the overall health of your yard.

Moisture sensors can be placed in various locations throughout your lawn to measure soil moisture levels. With this information, you can set up automated watering schedules that ensure your grass gets exactly the right amount of water it needs.

Incorporating moisture sensors into your DIY WiFi Sprinkler Controller using ESP8266 is a straightforward process. You’ll need to add an analog-to-digital converter (ADC) to read the sensor’s output and connect it to one of the ESP8266’s analog inputs.

Once you have the readings, you can use them to adjust watering times or trigger sprinklers only when necessary. And if you want even more control over your sprinkler system, consider integrating it with Google Assistant for voice control.

Google Assistant Integration

Now that you’ve successfully built your own DIY WiFi sprinkler controller using ESP8266 and integrated it with Home Assistant, it’s time to take things a step further and add voice control through Google Assistant. With this integration, you can easily turn on or off specific zones of your sprinkler system with just your voice.

To get started, make sure your Google Assistant is connected to the same network as your sprinkler controller. Then, create a new project in the Actions Console and enable the Home Graph API. Next, configure the OAuth consent screen so that Google can access your Home Assistant instance.

Once these steps are complete, you can start building out custom voice commands for controlling your sprinklers. Here are some examples of voice commands you can use with Google Assistant:

  • “Hey Google, turn on Zone 1.”
  • “Hey Google, water the front lawn for 10 minutes.”
  • “Hey Google, stop watering.”

With this added functionality, you’ll never have to worry about fumbling with buttons on an app or forgetting to turn off a zone again. Your DIY sprinkler controller is now fully equipped with all the latest smart home features!

Self-Hosted Controller

The self-hosted controller section delves into advanced features and integrations for the ESP8266-based sprinkler system, elevating it to a sophisticated home automation project. By using Home Assistant, you can automate complex watering schedules based on weather data and soil moisture levels. In addition, you can control your sprinklers with voice commands through Google Assistant integration.

To fully utilize the power of Home Assistant, you can also add sensors to measure soil moisture levels and rain probability. This data can be used to trigger watering cycles only when needed, saving water and reducing unnecessary operation costs. With all these advanced features, your DIY WiFi Sprinkler Controller becomes more than just a simple replacement for an old Rain Bird system – it becomes a smart system that integrates seamlessly with your home automation setup.

Moving on from the self-hosted controller section, the next step is learning about automation and control.

Automation and Control

In this section, you’ll discover how to automate and control your sprinkler system with ease, using various tools and techniques.

First, you can create custom scripts in Home Assistant that trigger specific sprinkler zones based on the time of day or moisture levels. This gives you the ability to tailor your watering schedule to fit your lawn’s unique needs.

Secondly, integrating soil moisture sensors into your setup can further optimize water usage by only watering when necessary. These sensors detect when the soil is dry and automatically trigger the corresponding sprinkler zone for a specified amount of time.

Finally, utilizing data from weather APIs like darksky can help prevent over-watering by triggering the system only if rain is not expected within a certain timeframe.

With these features in place, you’ll have full control over your sprinkler system while minimizing water waste. By incorporating these automation techniques into your DIY WiFi Sprinkler Controller using ESP8266, you’ll be able to enjoy a more efficient and eco-friendly watering solution for your lawn.

In the next section, we’ll dive into how to use the probability of rain triggering with data from the darksky API to make even more informed decisions about when to water your lawn.

Probability of Rain Triggering

Learn how to make informed decisions about when to water your lawn by incorporating the probability of rain triggering with data from the darksky API in your automated sprinkler system. By utilizing this feature, you can avoid unnecessary watering and save on water bills while still ensuring that your lawn remains healthy and green.

To implement this feature, you’ll need to integrate the darksky API with your Home Assistant software. The API provides highly accurate weather forecasts for specific locations. You can use this information to determine whether or not it is necessary to water your lawn. By setting up automation rules based on the probability of rainfall, you can ensure that your sprinkler system only activates when needed. This will save both time and money.

With this advanced feature added to your DIY WiFi Sprinkler Controller using ESP8266, you’ll have full control over the watering schedule of your lawn without any guesswork involved.


Congratulations! You now have a fully functional DIY WiFi sprinkler controller using ESP8266. This project not only saves you money, but it also allows you to customize and automate your sprinkler system to fit your specific needs.

As you stand back and watch your lawn being watered with precision, take a moment to appreciate the power of technology. The ESP8266 microcontroller has transformed a basic irrigation system into an efficient and intelligent watering solution that can be controlled from anywhere in the world.

But this project is more than just convenience. It’s about taking control of your environment and making it work for you. By integrating Google Assistant or hosting your own server, you can create complex automation routines that optimize water usage based on weather conditions or soil moisture levels.

In the end, this project is symbolic of our desire to use technology to improve our lives and make our world a better place. So go ahead, embrace the power of DIY and start building your own smart sprinkler system today!