ESP

Updated July 19, 2022 by luwol03, Shaquu and GogoVega

What is an ESP?

ESP is a microcontroller integrated circuit with Wi-Fi connection and very inexpensive. There are several versions of ESP, including ESP32, which is the latest version. ESP32 is more powerful and integrates Bluetooth connection. A popular option is Itead Sonoff modules which integrate an ESP, but the original firmware is not fully “open” so it cannot be easily added to systems like Node-RED. To solve this problem, ESP Easy or Tasmota firmware can be used to transform the ESP module into a simple multi-function sensor device for home automation solutions.

Why use an ESP with Node-RED?

Tasmota and ESP Easy integrate easily with many home automation solutions, usually over MQTT protocol. Node-RED has a full set of MQTT nodes, so using this hardware (or anything with MQTT) is simple and robust. There are various “MQTT standards” which may be compatible with Tasmota and ESP Easy including Domoticz, Homey, and HomeAssistant; these “standards” are MQTT topic and payload structures which are generally used to make discovery of devices easier.

Which ESP to choose?

Buy the one which does what you want! There are various choices:

  • Plug-and-play modules (Itead Sonoff, Magic Home LED controllers, Shelly, and more)
  • DIY hardware like ESP8285, ESP8266, ESP32, or similar with your own set of devices attached to the GPIO

Which firmware to choose for Flashing?

There are many firmware options, including simply writing your own using the Arduino IDE. We will focus on the two which seem most popular; they are similar in their operation. If you want to use a simple sensor, then Tasmota could be an easier starting point. If you want to create rules on-device (advanced use) then ESP Easy may be more robust.

Using in Node-RED

The use in Node-RED is done using the nodes MQTT in and MQTT out. If you don’t have an MQTT Server, you can install Aedes, which runs great inside Node-RED. You must then configure the address of the server (if using Aedes this will be localhost or the IP of your Node-RED instance) and the identifiers in the MQTT node as well as the Topic. The Topic is very important, it must match the topics your devices are using. We will discuss using Domoticz topics and the default Tasmota topics below.

Domoticz Topic

If your ESP device has Domoticz topics enabled, then the message will follow this format. The advantage of using Domoticz topics is having the standard format message, and is useful for those who are comfortable with the Domoticz topic structure. The identifier of your ESP will be idx in the message.

Topic : domoticz/in for MQTT in and domoticz/out for MQTT out node.

Example message at the output of the MQTT in node:

msg.payload = {
    "idx": 1,
    "nvalue": 0,
    "svalue": '',
    "RSSI": 10,
    "Battery": 100
}

Read more about MQTT for Domoticz

Manual Topic

Topic or %topic% is the identifier (name) of your ESP, such as Light1, DeskLamp, GarageSensor, etc. depending on how you have named your devices. Messages using this topic structure will have a topic of %prefix%/%topic%/%event% where %prefix% is one of the 3 described below, %topic% is the identifier, and %event% is the event happening (could be POWER, SENSOR, TELE, or more depending on your device).

Tasmota uses 3 prefixes for forming a FullTopic:

cmnd - prefix to issue commands; ask for status
stat - reports back status or configuration message
tele - reports telemetry info at specified intervals

Read more about MQTT

MQTT Nodes in Node-RED

Before starting, add an MQTT in node, then let’s go to the configuration:

  • MQTT Server

Put the IP address and port of your server. User advance, you can choose the desired mqtt protocol.

MQTT Server

And put, if you have, the logins of your server.

MQTT Server Login

  • MQTT Properties

Put the Topic as described above and select “A parsed JSON object” in Output.

MQTT Properties

Adding to NRCHKB

To connect the MQTT nodes to HomeKit, I offer you some examples for a Topic configuration with Domoticz and manual.

Here is a screenshot of the general structure of your flow:

Basic Principle

Read more about Supported Peripherals by Tasmota

Domoticz Topic

  • Doorbell

State to HK node:

if (msg.payload.idx == 1 && msg.payload.nvalue == 1) {
    msg = {
        "payload": {
            "ProgrammableSwitchEvent": 0
        }
    }
    return msg;
} else {
    return;
}
  • Fan/LightBulb/Outlet/Switch

State to HK node:

if (msg.payload.idx == 1) {
    msg = {
        "payload": {
            "On": (msg.payload.nvalue) ? true : false
        }
    }
    return msg;
} else {
    return;
}

State to MQTT node:

msg = {
    "payload": {
        "idx": 1,
        "nvalue": (msg.payload.On) ? 1 : 0
    }
};
return msg;
  • Humidity Sensor

State to HK node:

if (msg.payload.idx == 1) {
    msg = {
        "payload": {
            "CurrentRelativeHumidity": msg.payload.nvalue
        }
    }
    return msg;
} else {
    return;
}
  • Light Sensor
if (msg.payload.idx == 1) {
    msg = {
        "payload": {
            "CurrentAmbientLightLevel": parseInt(msg.payload.svalue)
        }
    }
    return msg;
} else {
    return;
}
  • Temperature Sensor

State to HK node:

if (msg.payload.idx == 1) {
    msg = {
        "payload": {
            "CurrentTemperature": parseInt(msg.payload.svalue)
        }
    }
    return msg;
} else {
    return;
}
  • Temperature + Humidity Sensor

State to HK node:

let Read = msg.payload.svalue.split(/\;/g);

msg1 = {
    "payload": {
        "CurrentTemperature": Read[0]
    }
};
msg2 = {
    "payload": {
        "CurrentRelativeHumidity": Read[1]
    }
};

if (msg.payload.idx == 1) {
    return [msg1, msg2];
} else {
    return;
}

Manual Topic

  • Fan/LightBulb/Outlet

Topic in = stat/Light1/POWER

State to HK node:

let State;

if (msg.payload == "ON") {
    State = true
} else if (msg.payload == "OFF") {
    State = false
}
msg = {
    "payload": {
        "On": State
    }
};
return msg;

Topic out = cmnd/Light1/POWER

State to MQTT node:

let State;

if (msg.payload.On) {
    State = "ON"
} else {
    State = "OFF"
}
msg = {
    "payload": State
};
return msg;
  • Humidity Sensor

Topic in = tele/Humidity/SENSOR

State to HK node:

msg = {
    "payload": {
        "CurrentRelativeHumidity": msg.payload.Humidity
    }
};
return msg;
  • Temperature Sensor

Topic in = tele/Temp/SENSOR

State to HK node:

msg = {
    "payload": {
        "CurrentTemperature": msg.payload.Temperature
    }
};
return msg;
  • Light Sensor

Topic in = tele/Light_Sensor/SENSOR

State to HK node:

msg = {
    "payload": {
        "CurrentAmbientLightLevel": msg.payload.Illuminance
    }
};
return msg;

Edit this page on GitHub