devices.esphome.io
Gosund SP112
Gosund SP112
Device Type: switchElectrical Standard: euBoard: esp8266
Flashing
The device can be flashed using tuya-convert. Fresh out of the factory it will be in autoconfig mode. When plugged in for the first time tuya-convert will pick it up directly.
If that doesn't work out for you, disassembly and wired flashing is explained in this (German) video.
Attention: As it turns out Tuya no longer builds them with esp chips. This means as of late 2021 you cannot flash esphome on new units.
Alternative for newer devices: see below
GPIO Pinout
| Pin | Function | 
|---|---|
| GPIO0 | LED red | 
| GPIO2 | LED blue (Inverted: true) | 
| GPIO4 | HLWBL CF1 Pin | 
| GPIO5 | BL0937 CF Pin | 
| GPIO12 | HLWBL SEL Pin (Inverted: true) | 
| GPIO13 | Relay USB | 
| GPIO14 | Relay mains (Inverted: true) | 
| A0 | Button | 
Basic Configuration
substitutions:  devicename: "gosund_sp112"  upper_devicename: "Gosund SP112"
esphome:  name: $devicename  platform: ESP8266  board: esp01_1m# This allows the device to restore the last saved relay state, either "ON" or "OFF" for the switch later in this config  esp8266_restore_from_flash: true
preferences:  flash_write_interval: 1min  # set to 5min to prevent wearing out the onboard flash module too quickly
# Reduce log level as otherwise logs would be flooded with analog sensor readingslogger:  logs:    sensor: INFO    adc: INFO
# Enable Home Assistant APIapi:
ota:  platform: esphome  password: "REDACTED"
wifi:  ssid: !secret wifi_ssid  password: !secret wifi_password  ap:
captive_portal:
# see: https://esphome.io/components/time.html, required for total_daily_energytime:  - platform: homeassistant    id: homeassistant_time
# Enable Web serverweb_server:  port: 80
text_sensor:  - platform: version    name: "${devicename} - Version"    icon: mdi:cube-outline
binary_sensor:  - platform: template    id: button1    # read analog sensor and convert it's value to binary state    lambda: return (id(button_adc).state < .5);    on_click:      # short button press toggles mains      - min_length: 10ms        max_length: 250ms        then:          - switch.toggle: switch1      # long button press toggles USB      - min_length: 250ms        max_length: 1000ms        then:          - switch.toggle: switchusb
sensor:  - platform: wifi_signal    name: "${devicename} - Wifi Signal"    update_interval: 60s    icon: mdi:wifi
  - platform: uptime    name: "${devicename} - Uptime"    update_interval: 60s    icon: mdi:clock-outline
  - platform: total_daily_energy    name: "${devicename} - Todays Usage"    power_id: "wattage"    filters:      # Multiplication factor from W to kW is 0.001      - multiply: 0.001    unit_of_measurement: kWh    icon: mdi:calendar-clock
  - platform: adc    id: button_adc    pin: A0    update_interval: .1s  - platform: hlw8012    sel_pin:      number: GPIO12      inverted: True    cf_pin: GPIO05    cf1_pin: GPIO04    current_resistor: 0.00221    voltage_divider: 775    change_mode_every: 8    update_interval: 10s    current:      id: amperage      name: Amperage      unit_of_measurement: A      accuracy_decimals: 2    voltage:      id: voltage      name: Voltage      unit_of_measurement: V      accuracy_decimals: 2    power:      id: wattage      name: Wattage      unit_of_measurement: W      accuracy_decimals: 2
status_led:  pin:    number: GPIO02    inverted: true
output:  - platform: gpio    id: led1    pin:      number: GPIO00      inverted: true
switch:  - platform: gpio    name: "${devicename} - Main"    icon: mdi:power    restore_mode: RESTORE_DEFAULT_ON    id: switch1    pin: GPIO14    on_turn_on:      - output.turn_on: led1    on_turn_off:      - output.turn_off: led1  - platform: gpio    name: "${devicename} - USB"    icon: mdi:power    restore_mode: RESTORE_DEFAULT_ON    id: switchusb    pin:      number: GPIO13      inverted: trueAlternative for newer devices
WARNING: Soldering involved, warranty broken, electric hazard, make sure you know what you are doing at your own responsibility
Replace Cuco-chip with ESP-M2: https://github.com/c-klinger/Gosund-ESPMod/tree/main (courtesy: Chris Klinger)
ESPHome basic configuration:
esphome:  name: device
esp8266:  board: esp8285
# Enable logginglogger:  logs:    sensor: INFO    adc: INFO
wifi:  ssid: !secret wifi_ssid  password: !secret wifi_password  ap:
status_led:  pin:    number: GPIO03    inverted: true
binary_sensor:  - platform: status    name: "Status"  - platform: gpio    name: "On/Off"    id: button1    pin:      number: GPIO16      inverted: true    on_click:      # short button press toggles mains      - min_length: 10ms        max_length: 250ms        then:          - switch.toggle: switch1      # long button press toggles USB      - min_length: 250ms        max_length: 5000ms        then:          - switch.toggle: switchusb
sensor:  - platform: adc    id: button_adc    pin: A0    update_interval: .1s  - platform: hlw8012    sel_pin:      number: GPIO12      inverted: True    cf_pin: GPIO05    cf1_pin: GPIO04    current_resistor: 0.00221    voltage_divider: 775    change_mode_every: 8    update_interval: 10s    current:      id: amperage      name: Amperage      unit_of_measurement: A      accuracy_decimals: 2    voltage:      id: voltage      name: Voltage      unit_of_measurement: V      accuracy_decimals: 2    power:      id: wattage      name: Wattage      unit_of_measurement: W      accuracy_decimals: 2
output:  - platform: gpio    id: led1    pin:      number: GPIO00      inverted: true
switch:  - platform: gpio    name: "Relay Mains"    id: switch1    pin: GPIO14    on_turn_on:      - output.turn_on: led1    on_turn_off:      - output.turn_off: led1  - platform: gpio    name: "Replay USB"    id: switchusb    pin:      number: GPIO13      inverted: true