Background

A friend of mine recommended a smart plug Athom PG01EU16A that supports Tasmota, so I purchased two of them from AliExpress for €15.26 with free shipping. However, upon arrival, I discovered that although the appearance of the plugs was identical, the printed model number was ELIVCO LSPA9 instead.

plugs

There are no external screws, according to this post [Archive], we can crack it open by applying pressure to the top sides.

disassembled

Hardware

After disassembling it, I saw a model number CB2S printed on the Wi-Fi module, a quick search showed that it's another Tuya module based on the Beken BK7231 series ARM SoC, this is the third time I stepped on these landmines from Tuya.

pcb-1

And what made things worse is that the CB2S module has a unique pinout that is not similar to any commonly available ESP modules:

cb2s
esp-modules

Source: https://www.iot-experiments.com/esp8266/

Update: @Oscar has found a drop-in replacement module: TYWE2S Replacement Module (ESP-02S)

Anyway, I removed the module and reverse-engineered the circuit: the IC in the lower left corner is an "AMS1117-3.3" voltage regulator, it provides the +3.3 V power source for the Wi-Fi module as well as some other components; to its right is a "BL0937" AC power monitoring IC, which is used to measure the voltage, current and power on the plug.

pcb-2

The main circuit can be organized as follows, with components labeled as per their actual PCB silkscreen printings, some less important components have been omitted:

schematic

We can replace the CB2S module with a common ESP module and connect the necessary pins; note that pin P26 which is connected to the relay should not use ESP GPIOs that will be pulled up at boot, such as 1, 2, 3, 16, etc., to avoid unintended powering.

done

Here I used an ESP-12F module, with corresponding pins selected as:

CB2S ESP-12F
3V3 VCC
GND GND
P6 GPIO5
P7 GPIO4
P8 GPIO2
RX1 GPIO13
P24 GPIO12
P26 GPIO14

And remember to pull up EN and pull down GPIO15.

Software

ESPHome configuration example:

substitutions:
  device_name: 'Plug 1'

esphome:
  name: plug-1
  comment: 'ELIVCO LSPA9 Smart Plug 1'

esp8266:
  board: esp12e
  restore_from_flash: true

preferences:
  flash_write_interval: 10min  # reduce write frequency to flash to avoid wearing it out, adjust it as needed

logger:
  level: WARN
#  baud_rate: 115200

wifi:
  fast_connect: true
  networks:
    - ssid: !secret wifi_ssid
      bssid: !secret wifi_bssid
      password: !secret wifi_password
  domain: !secret domain_name

api:
ota:
  password: !secret ota_password

button:
  # for hard restart
  - platform: restart
    id: restart_button
    name: 'Restart ${device_name}'
    entity_category: diagnostic

status_led:  # the built-in blue LED in the button
  pin:
    number: 2
    inverted: true

switch:
  # the power relay
  - platform: gpio
    id: relay
    pin: 14
    name: '${device_name}'
    restore_mode: RESTORE_DEFAULT_OFF  # attempt to restore state on start and defaults to OFF if failed
    icon: mdi:power-socket-de

binary_sensor:
  # the button
  - platform: gpio
    id: switch_button
    pin:
      number: 13
      inverted: true
    on_release:
      then:
        - switch.toggle: relay
    internal: true

sensor:
  - platform: hlw8012
    model: BL0937  # note that the model must be specified to use special calculation parameters
    current_resistor: 0.001  # adjust it according to the actual resistor value on board
    voltage_divider: 1600  # (680×1000×3+1000)/1000 = 2041, adjust it according to the actual resistor values on board
    sel_pin:
      number: 12
      inverted: true  # the logic of BL0937 is opposite from HLW8012
    cf_pin: 4
    cf1_pin: 5
    current:
      name: '${device_name} Current'
    voltage:
      name: '${device_name} Voltage'
    power:
      name: '${device_name} Power'
    energy:
      name: '${device_name} Energy'
      # convert to kWh
      filters:
        - multiply: 0.001
      unit_of_measurement: 'kWh'
      accuracy_decimals: 4
    update_interval: 60s
    change_mode_every: 3

BL0937 Voltage Divider Calculation

The parameter voltage_divider of the hlw8012 component needs to be calculated based on the actual voltage divider resistors, otherwise the voltage data will be inaccurate.

voltage_divider (Optional, float): The value of the voltage divider on the board as (R_upstream + R_downstream) / R_downstream. Defaults to the Sonoff POW’s value 2351.

Source: https://esphome.io/components/sensor/hlw8012.html#configuration-variables

According to the actual circuit, the voltage divider used in this smart plug is as follows:

voltage-divider

So the theoretical value should be (680×1000×3+1000)÷1000=2041, but then the actual result is wrong; after lots of trial-and-error, I found 1600 as a relatively accurate value, but I still don't know why.

After that, we can add it directly in Home Assistant:

hass

10 Comments

dima · 2023-02-05 at 07:36

thank so much for your research! I'v redone successfully 3 plugs according to your method

Oscar P · 2023-03-01 at 14:46

Hi Zry.io,
I'm thinking about replacing the old CB2S with an ESP02, do you think I could?
Apart from that I don't know how to flash it, I didn't even google it I'll find it out!!
thanks a lot!

    zry98 · 2023-03-01 at 21:03

    Hi, if by ESP02 you mean those tiny ones with only 8 pins (5 usable IO pins), I think it's still possible to do the job by giving up the blue LED indicator (connected on P8).

      Oscar P · 2023-03-01 at 22:55

      Ok, I'll give a try tomorrow, thaks a lot for such a very quick answer!!!!

        Oscar P · 2023-03-11 at 12:16

        Hi again Zry.io, I'm afraid i need some help. Yesterday I tried with ESP02 replacing the old CB2S but for some reason the relay doesn't work. According to your schema, the pin that goes to the relay is P26 which corresponds to GPIO14 in my ESP02, I have tested it with and without inverted but it still doesn't work. Any hints? Could it be that the relay is somehow broken?
        Many thanks
        Oscar

          zry98 · 2023-03-11 at 20:44

          Hi Oscar, are you sure it's an ESP02 with 8 pins like this? Since I've never used one of these, and couldn't find any other official docs other than this, it says that GPIO14 (although I only see GPIO15 in its photo) is also connected to CH_PD (CHIP_EN in datasheet) so it won't work as a GPIO. Can you confirm the model and pins?

Oscar P · 2023-03-11 at 22:30

Hi zry98, it is like this: https://templates.blakadder.com/ESP-02S.html
Many thanks again for your fast answer!!!

    zry98 · 2023-03-21 at 04:29

    I had no idea that modules like this existed! it will make replacing CB2S modules with Beken SoC so much easier. However you will have to change the ESPHome config to match the GPIOs.

Alex · 2023-04-22 at 14:32

Hello. I came here by accident, and I want to share good news. You do not need to change CB2S! This chip can be flashed to ESPHome (like almost all chips from TUYA). And you don’t even need to open it, it is patched on the air! See LibreTuya, CloudCutter.

Original comment:

Привет. Случайно сюда попал, и хочу поделиться хорошими новостями. Можно не менять CB2S! Этот чип можно прошивать в ESPHOME (как почти все чипы от TUYA). Причем не нужно даже вскрывать, прошивается по воздуху! Поищите - LibreTuya, CloudCutter.
Простите за мой английский 🙂

    zry98 · 2023-04-23 at 23:13

    Hi Alex, thanks for your comment! I have been following LibreTuya's development since they started the project, but because it's a large and slow project, and it was barely usable at the time when I got my two plugs (early February 2022), I didn't choose it. If I buy any other devices using BK723X SoC in the future, I will definitely give it a try!

    Привет, Алекс! Спасибо за комментарий! Я следил за развитием LibreTuya с самого начала проекта, но поскольку это большой и медленный проект, и к тому же он едва работал в то время, когда я купил две розетки (в начале февраля 2022 года), я не выбрал его. Если в будущем я куплю еще какие-либо устройства с SoC BK723X, то обязательно попробую LibreTuya!

Leave a Reply

Avatar placeholder

Your email address will not be published. Required fields are marked *