devices.esphome.io
Gosund SP111
Gosund SP111
Device Type: plugElectrical Standard: euBoard: esp8266
Warning
![]()
Looks like device chip was replaced to non-flashable custom tasmota chip.
Please be aware, that there is a new version of that outlet, often having the phrase EP2 instead or in addition to SP111, sold starting in November 2020. For that version, the tuya script does not longer work! Also a breakless opening of the plug is much harder due to a removed screw on the bottom of the device.
Flashing
The older devices 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.

Make sure the plug has that screw on the bottom!
GPIO Pinout
| Pin | Function |
|---|---|
| GPIO00 | Led1i |
| GPIO01 | None |
| GPIO02 | LedLinki |
| GPIO03 | None |
| GPIO04 | HLWBL CF1 |
| GPIO05 | BL0937 CF |
| GPIO09 | None |
| GPIO10 | None |
| GPIO12 | HLWBL SELi |
| GPIO13 | Button1 |
| GPIO14 | None |
| GPIO15 | Relay1 |
| GPIO16 | None |
Basic Configuration
substitutions: devicename: "gosund_sp111" upper_devicename: "Gosund SP111" # Higher value gives lower watt readout current_res: "0.00280" # Lower value gives lower voltage readout. In my case of about 15 of those devices this value is closest to my voltage meter voltage_div: "648"
esphome: name: $devicename
esp8266: board: esp8285# This allows the device to restore the last saved relay state, either "ON" or "OFF" for the switch later in this config restore_from_flash: true
preferences: flash_write_interval: 1min # set to 5min to prevent wearing out the onboard flash module too quickly # Enable logginglogger: baud_rate: 0 # Enable Home Assistant APIapi: encryption: key: "REDACTED"
ota: password: "REDACTED"
wifi: ssid: !secret wifi_ssid password: !secret wifi_password ap:
captive_portal:
# see: https://esphome.io/components/time.htmltime: - 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: status name: "${devicename} - Status" device_class: connectivity
# toggle relay on/off - platform: gpio pin: number: GPIO13 mode: INPUT_PULLUP inverted: True id: "${devicename}_button_state" on_press: - switch.toggle: button_switch
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: "power_wattage" filters: # Multiplication factor from W to kW is 0.001 - multiply: 0.001 unit_of_measurement: kWh icon: mdi:calendar-clock
- platform: adc pin: VCC name: "${devicename} - VCC Volt" icon: mdi:flash-outline
- platform: hlw8012 sel_pin: number: GPIO12 inverted: True cf_pin: GPIO05 cf1_pin: GPIO04 change_mode_every: 4 current_resistor: ${current_res} voltage_divider: ${voltage_div} update_interval: 3s
current: name: "${devicename} - Ampere" unit_of_measurement: A accuracy_decimals: 3 icon: mdi:current-ac
voltage: name: "${devicename} - Volt" unit_of_measurement: V accuracy_decimals: 1 icon: mdi:flash-outline
power: name: "${devicename} - Watt" unit_of_measurement: W id: "power_wattage" icon: mdi:gauge
status_led: pin: number: GPIO02 inverted: True id: led_blue
output: - platform: gpio pin: GPIO00 inverted: true id: led_red
switch: - platform: template name: "${devicename} - Switch" icon: mdi:power optimistic: true# This is where the "restore_from_flash" comes in. I set it to try to restore from flash and, if that fails, set it to ON restore_mode: RESTORE_DEFAULT_ON lambda: 'return id(relay).state;' id: button_switch turn_on_action: - switch.turn_on: relay - output.turn_on: led_red turn_off_action: - switch.turn_off: relay - output.turn_off: led_red - platform: gpio pin: GPIO15 id: relay