devices.esphome.io
SUPERNIGHT Double Outlet Plug
SUPERNIGHT Double Outlet Plug
Device Type: plugElectrical Standard: usBoard: esp8266
      
  
        
Flashing
As of 2022-04-12, this device can be flashed with Tuya Convert OTA (over-the-air) out of the box with no adjustments needed. Put the device in flash mode by long-holding either button until it starts fast-flashing. This device likely cannot be opened without destruction.
GPIO Pinout
| Pin | Function | 
|---|---|
| GPIO1 | Left Outlet Button (Inverted: true) | 
| GPIO3 | Left Outlet Relay | 
| GPIO4 | HLW8012 CF1 pin | 
| GPIO5 | HLW8012 CF pin | 
| GPIO12 | Right Outlet Relay | 
| GPIO13 | HLW8012 SEL pin (Inverted: true) | 
| GPIO14 | Dual red status LED (Inverted: true | 
| A0 | Right Button (ADC Analog) | 
General Notes
These devices appear to be individually calibrated for voltage, current, and power. As a result, you will need to measure with a multimeter and adjust the voltage divider, current resistor, and power draw accordingly. The observed range so far for voltage divider is 747-865, so the base configuration has been adjusted to be the average of range at 806 for likely best default settings. The observed range so far for the current resistor is 0.00113-0.0013, so the base configuration is set to 0.001215. You can adjust the voltage divider, current resistor and power line curve in the substitutions section if needed. You need to adjust the voltage divider and current resistor before making power adjustments.
There is an oddity with restoring the value of the right relay because of the analog switch and its values during boot up. Because of this, the default configuration won't allow the right button to be pressed until the device is fully booted up, otherwise it will randomly change the state of the right outlet at startup. The measured time of unavailablity of the right button is about 8 seconds as a result.
The nightlight feature cannot be controlled by the ESP IO, and cannot be disabled without physical changes.
Basic Configuration
# Basic Configesphome:  name: double-outlet-plug  platform: esp8266  board: esp8285  esp8266_restore_from_flash: true  # Because the right button is analog, its value will change to unpredictable  # values during the boot process.  We must wait until the boot process has  # loaded all sensors.  on_boot:    # 600 did not work, 250 works, and values inbetween also did not work. As a    # result, there is a delay between when you insert the plug into the wall    # and when you can use the button for the right outlet.  This is the safest    # option to restore the correct value at a minor inconvenience.    # This appears to make the right button unavailable for the first 8 seconds.    priority: 250.0    then:      globals.set:        id: allow_analog_button_input        value: 'true'
# These values may need to be calibrated per device to correct displayed values# for amperage, voltage, and power.substitutions:  # You must get current and voltage correct before calibrating power.  # Observered current resistor values from 2 units: 0.00113-0.0013  current_resistor: '0.001215'  # Observed voltage divider values from 2 units: 747-865  voltage_divider: '806'  # The value 'Power' shows by default is incorrect, to add a linear correction  # place a known entity and set the calibration data here.  calibration_pre_cal_power_value: '129.1'  calibration_expected_correct_value: '60.0'
logger:api:ota:web_server:time:  - platform: sntp    id: the_timewifi:  ssid: !secret wifi_ssid  password: !secret wifi_password  ap:    ssid: "Supernight Fallback Hotspot"    password: !secret wifi_ap_passwordcaptive_portal:
# We don't want to allow analog input until bootup is complete.globals:   - id: allow_analog_button_input     type: bool     restore_value: no     initial_value: 'false'
# GPIO14 is the red LED for both the left and right buttons together.# They cannot be controlled individually.# The blue LEDs turn on automatically with each respective relay and cannot be# controlled manually.# The nightlight is attached to a physical light sensor and is not controlled# by any IO and cannot be disabled by configuration.status_led:  pin:    number: GPIO14    inverted: true
binary_sensor:  - platform: gpio    pin:      number: GPIO1      mode: INPUT_PULLUP      inverted: true    id: left_outlet_button    on_press:      - switch.toggle: relay_left_outlet
switch:  - platform: gpio    name: "Left Outlet"    pin: GPIO3    id: relay_left_outlet    restore_mode: RESTORE_DEFAULT_OFF  - platform: gpio    name: "Right Outlet"    pin: GPIO12    id: relay_right_outlet    # I'm unsure why, but the preference randomly saved incorrectly, and should    # not be considered safe/reliable for the right outlet.    restore_mode: RESTORE_DEFAULT_OFF
sensor:  - platform: wifi_signal    name: "wifi_signal"  - platform: hlw8012    sel_pin:      number: GPIO13      inverted: true    cf_pin: GPIO5    cf1_pin: GPIO4    current_resistor: ${current_resistor}    voltage_divider: ${voltage_divider}    current:      name: "Current"    voltage:      name: "Voltage"    power:      name: "Power"      unit_of_measurement: W      id: wattage      filters:        - calibrate_linear:            # Map 0.0 (from sensor) to 0.0 (true value)            - 0.0 -> 0.0 # No load            - ${calibration_pre_cal_power_value} -> ${calibration_expected_correct_value}    energy:      name: "Energy"      unit_of_measurement: "kWh"      accuracy_decimals: 3      filters:        - multiply: 0.001    update_interval: 60s  # The right button is analog, and has a value of 4 when pressed and 1024  # when not pressed.  - platform: adc    pin: A0    id: analog_button    raw: true    # This needs to be short enough for the buttons to appear responsive.    # 100ms was chosen because it seems sufficient for momentary detection.    update_interval: 100ms    # There is no real unit of measurement for this, and default V is confusing.    unit_of_measurement: ""    # Only trigger when the change is larger than the delta of 50.    filters:      - delta: 50    on_value:      lambda: !lambda |-        if (id(allow_analog_button_input) && id(analog_button).state < 50)        {          // Right outlet button is being pushed.          id(relay_right_outlet).toggle();        }