Skip to content

LILYGO T-Embed CC1101

Works, with caveatsWorks as an S3 node, but you're paying for a screen, sub-GHz radio and NFC reader that ESPresense doesn't use. Buy it for those, not for presence detection.
ChipESP32-S3
Form factorHandheld with 1.9 inch screen, rotary encoder and 1300 mAh battery
Flash16 MB + 8 MB PSRAM
AntennaInternal (ESP32-S3-WROOM-1)
USBUSB-C (native USB)
InstallBrowser installer, esp32s3-cdc flavor
GPIOFunctionESPresense setting
15Peripheral power enable (must be high for the LEDs, screen, CC1101 and PN532)Outputs
148 × WS2812 RGB LEDs around the encoderLEDs
0Encoder push button (active low, also BOOT)Inputs
6User key (active low)Inputs
4Encoder A—
5Encoder B—
8Internal I2C SDA (PN532, BQ27220, BQ25896)I2C bus 1 SDA
18Internal I2C SCLI2C bus 1 SCL
21Screen backlight—
2IR emitter enable—
1IR receiver—

Paste this into the Board Template box on the node's Templates page, then Preview and Apply (firmware v5.0.0b5 or later). It sets the board's pins (and Ethernet type, if it has one) in one go. Apply it before any add-on template. The LED, input and output lists replace what was configured before, so the result doesn't depend on the node's old setup. See Templates.

{"name":"T-Embed CC1101","chip":"esp32s3","settings":{"I2C_Bus_1_SDA":8,"I2C_Bus_1_SCL":18,"batt_gauge":1,"batt_gauge_bus":1,"leds":[{"type":"grb","pin":14,"count":8,"control":"status","max_brightness":40}],"inputs":[{"name":"Encoder button","role":"button","pin":0,"type":"pullup_inverted"},{"name":"User key","role":"button","pin":6,"type":"pullup_inverted"}],"outputs":[{"name":"Peripheral power","pin":15,"type":"high"}]}}
Formatted, with what each value means
{
  "name": "T-Embed CC1101",
  "chip": "esp32s3",
  "settings": {
    "I2C_Bus_1_SDA": 8,
    "I2C_Bus_1_SCL": 18,
    "batt_gauge": 1,
    "batt_gauge_bus": 1,
    "leds": [
      {
        "type": "grb",
        "pin": 14,
        "count": 8,
        "control": "status",
        "max_brightness": 40
      }
    ],
    "inputs": [
      {
        "name": "Encoder button",
        "role": "button",
        "pin": 0,
        "type": "pullup_inverted"
      },
      {
        "name": "User key",
        "role": "button",
        "pin": 6,
        "type": "pullup_inverted"
      }
    ],
    "outputs": [
      {
        "name": "Peripheral power",
        "pin": 15,
        "type": "high"
      }
    ]
  }
}

LED type: pwm, pwm_inverted, grb, grbw, rgb or rgbw (the last four are addressable). LED control: mqtt, status, motion, count, or output (follows the output numbered byoutput). Input type: pullup, pulldown or floating, with_inverted for active-low. Output type: output, output_inverted, or high/low for a pin that's just held at that level. An output's input is the 1-based input that controls it. power takes ESPHome's hlw8012 values (a cse7766 needs only rx); sel_inverted matches ESPHome's inverted on sel_pin. eth is the Ethernet Type's option number.

Checked on a T-Embed CC1101 with v5.0.0b5 (October 2026): the LEDs (with GPIO 15 power), both buttons, and the BQ27220 gauge on I2C bus 1.

  • GPIO 15 powers the peripherals. The WS2812 LEDs share a switched supply that stays off until GPIO 15 is high. The template sets it with an Always High output, the same way the NanoC6 handles its LED power pin. Without it the LEDs stay dark.
  • LED brightness is capped. Eight LEDs at full white draw more than is comfortable on battery or a weak USB port, so the template sets max_brightness to 40, like the Atom Matrix.
  • Battery level comes from the BQ27220 fuel gauge on I2C bus 1 (the template sets Battery gauge to BQ27220). The node reports batt (%), mV and charging state, and Home Assistant gets Battery, Battery Voltage and Charging sensors. The gauge sits behind the GPIO 15 power switch, so it can take a few seconds after boot to show up. Needs firmware v5.0.0b5 or later.
  • Not used by ESPresense: the screen, encoder rotation, CC1101 sub-GHz radio, PN532 NFC reader, IR, and the BQ25896 charger.
  • The encoder button on GPIO 0 doubles as BOOT. Holding it during reset enters the bootloader, so don’t hold it while powering on.