devices.esphome.io

NOUS B3T

NOUS B3T

Device Type: relay
Electrical Standard: global
Board: esp32
Difficulty: Plug-n-flash, 2/5

NOUS B3T

This device comes pre-installed with Tasmota. To flash it with ESPHome, refer to the Migrating from Tasmotaguide. Alternatively, you can disassemble the device and solder wires to the test pads (see pinout) for manual flashing.

GPIO Pinout

PinFunction
GPIO00LED
GPIO01TX
GPIO03BL0939 RX
GPIO04Button
GPIO05Switch
GPIO12Relay
GPIO13Relay
GPIO18Switch

Basic configuration

esphome:
name: nous-b3t
friendly_name: NOUS B3T
comment: "NOUS B3T WiFi Switch/Curtain (2 channel with power monitoring)"
project:
name: "Nous.B3T"
version: "2025.6.0"
esp32:
board: esp32dev
framework:
type: esp-idf
# Enable logging
logger:
# Enable Home Assistant API
api:
ota:
- platform: esphome
wifi:
ssid: !secret wifi_ssid
password: !secret wifi_password
# Enable fallback hotspot (captive portal) in case wifi connection fails
ap:
ssid: "NOUS B3T Fallback Hotspot"
captive_portal:
uart:
tx_pin: GPIO01
rx_pin: GPIO03
baud_rate: 4800
parity: NONE
stop_bits: 2
sensor:
- platform: bl0939
voltage:
name: "RMS Voltage"
current_1:
name: "Current 1"
current_2:
name: "Current 2"
active_power_1:
name: "Active Power 1"
active_power_2:
name: "Active Power 2"
energy_1:
name: "Energy 1"
energy_2:
name: "Energy 2"
energy_total:
name: "Energy Total"
light:
- platform: status_led
name: "Status LED"
id: default_status_led
pin:
number: GPIO0
inverted: true
ignore_strapping_warning: true
entity_category: config
switch:
- platform: gpio
name: "Switch 1"
pin:
number: GPIO12
ignore_strapping_warning: true
id: relay_1
device_class: switch
restore_mode: restore_default_on
- platform: gpio
name: "Switch 2"
pin: GPIO13
id: relay_2
device_class: switch
restore_mode: restore_default_on
binary_sensor:
- platform: gpio
pin:
number: GPIO4
mode:
input: true
pullup: true
inverted: true
id: button
internal: true
filters:
- invert:
- delayed_off: 50ms
on_press:
- switch.toggle: relay_1
- switch.toggle: relay_2
- platform: gpio
name: "Switch 1 (external)"
pin:
number: GPIO05
mode: INPUT_PULLUP
inverted: true
ignore_strapping_warning: true
id: switch_1
icon: "mdi:light-switch"
entity_category: diagnostic
filters:
- delayed_on_off: 50ms
on_press:
then:
- switch.toggle: relay_1
- platform: gpio
name: "Switch 2 (external)"
pin:
number: GPIO18
mode: INPUT_PULLUP
inverted: true
id: switch_2
icon: "mdi:light-switch"
entity_category: diagnostic
filters:
- delayed_on_off: 50ms
on_press:
then:
- switch.toggle: relay_2

Configuration as light switch

This example demonstrates how to configure the 2-gang relay for use with a double rocker light switch. The relay can operate in two modes: directly toggling the connected relays, or in decoupled mode, where switch events are exposed in an event entity that can be used in automations. The NOUS B3T can also be used to control blinds. Refer to the Cover Component and Current Based Cover documentation for further instructions.

switch:
- platform: template
name: "Decoupled Mode"
id: decoupled_mode
restore_mode: RESTORE_DEFAULT_ON
optimistic: true
entity_category: config
icon: "mdi:connection"
event:
- platform: template
device_class: button
name: None
icon: "mdi:light-switch"
id: switch_event
event_types:
- switch_1
- switch_2
- failsafe
binary_sensor:
- platform: gpio
name: "Switch 1 (external)"
pin:
number: GPIO05
mode: INPUT_PULLUP
inverted: true
ignore_strapping_warning: true
id: switch_1
icon: "mdi:light-switch"
entity_category: diagnostic
filters:
- delayed_on_off: 50ms
on_multi_click:
- timing:
- OFF for at least 50ms
then:
- if:
condition:
- not:
- api.connected
- switch.is_on: decoupled_mode
then:
- switch.toggle: relay_1
else:
- if:
condition:
- switch.is_off: relay_1
then:
- switch.turn_on: relay_1
else:
- event.trigger:
id: switch_event
event_type: switch_1
- timing:
- ON for at least 50ms
then:
- if:
condition:
- not:
- api.connected
- switch.is_on: decoupled_mode
then:
- switch.toggle: relay_1
else:
- if:
condition:
- switch.is_off: relay_1
then:
- switch.turn_on: relay_1
else:
- event.trigger:
id: switch_event
event_type: switch_1
# failsafe sequence to turn on/off decoupled mode when HA automation is not working
# rocker on/off/on of off/on/off
- timing:
- ON for 50ms to 350ms
- OFF for 50ms to 350ms
- ON for at least 200ms
then:
- switch.toggle: decoupled_mode
- event.trigger:
id: switch_event
event_type: failsafe
- timing:
- OFF for 50ms to 350ms
- ON for 50ms to 350ms
- OFF for at least 200ms
then:
- switch.toggle: decoupled_mode
- event.trigger:
id: switch_event
event_type: failsafe
- platform: gpio
name: "Switch 2 (external)"
pin:
number: GPIO18
mode: INPUT_PULLUP
inverted: true
id: switch_2
icon: "mdi:light-switch"
entity_category: diagnostic
filters:
- delayed_on_off: 50ms
on_multi_click:
- timing:
- OFF for at least 50ms
then:
- if:
condition:
- not:
- api.connected
- switch.is_on: decoupled_mode
then:
- switch.toggle: relay_2
else:
- if:
condition:
- switch.is_off: relay_2
then:
- switch.turn_on: relay_2
else:
- event.trigger:
id: switch_event
event_type: switch_2
- timing:
- ON for at least 50ms
then:
- if:
condition:
- not:
- api.connected
- switch.is_on: decoupled_mode
then:
- switch.toggle: relay_2
else:
- if:
condition:
- switch.is_off: relay_2
then:
- switch.turn_on: relay_2
else:
- event.trigger:
id: switch_event
event_type: switch_2
- timing:
- ON for 50ms to 350ms
- OFF for 50ms to 350ms
- ON for at least 200ms
then:
- switch.toggle: decoupled_mode
- event.trigger:
id: switch_event
event_type: failsafe
- timing:
- OFF for 50ms to 350ms
- ON for 50ms to 350ms
- OFF for at least 200ms
then:
- switch.toggle: decoupled_mode
- event.trigger:
id: switch_event
event_type: failsafe

Pinout

Because the built-in button is connected to GPIO4, unlike on other devices, you also need to solder a wire to GPIO0 and pull it to GND to enter flash mode.

NOUS B3T Pinout

Edit this page on GitHub