Gosund SP111 i Esphome - problem z kalibracją

Od kilku godzin walczę z kalibracją tego gniazdka po wgraniu esphome.
Za każdym razem daje nieprawidłowe odczyty. Jedynie z czym sobie poradziłem to z Voltage. Jest już w miarę dokładny.
Niestety W i A niekiedy po wyłączeniu urządzenia dają odczyty nawet na minusie.
Mój config:

esphome:
  name: skuter
  platform: esp8266
  board: esp01_1m
  esp8266_restore_from_flash: true
# Enable logging
logger:

# Enable Home Assistant API
api:
  encryption:
    key: "key"

ota:
  password: "passw"

wifi:
  ssid: !secret wifi_ssid
  password: !secret wifi_password
#  use_address: 192.168.254.15
# Optional manual IP
  manual_ip:
    static_ip: 192.168.254.19
    gateway: 192.168.254.254
    subnet: 255.255.255.0

  # Enable fallback hotspot (captive portal) in case wifi connection fails
  ap:
    ssid: "Skuter Fallback Hotspot"
    password: "pass"

time:
  - platform: homeassistant
    id: homeassistant_time
    timezone: Europe/Warsaw

substitutions:
  plug_name: skuter 
  # Higher value gives lower watt readout
  current_res: "0.0012"
  # Lower value gives lower voltage readout
  voltage_div: "771"

# Enable Web server
web_server:
  port: 80

sensor:
  - platform: wifi_signal
    name: "${plug_name} - WiFi Signal"
    update_interval: 60s
  
  - platform: uptime
    name: "${plug_name} - Uptime"
    icon: mdi:clock-outline
    update_interval: 60s
    
  - platform: hlw8012
    sel_pin:
      number: GPIO12
      inverted: True
    cf_pin: GPIO05
    cf1_pin: GPIO04
    current_resistor: ${current_res}
    voltage_divider: ${voltage_div}
    
    current:
      name: "${plug_name} - Ampere"
      unit_of_measurement: A
      accuracy_decimals: 3
      icon: mdi:flash-outline
      filters:
      # Map from sensor -> measured value
        - calibrate_linear:
            - 0.25416 -> 0
            - 0.17338 -> 0
            - 0.43453 -> 0.4167
            - 0.43856 -> 0.4267
            - -0.61162 -> 0.000
    voltage:
      name: "${plug_name} - Volt"
      unit_of_measurement: V
      accuracy_decimals: 1
      icon: mdi:flash-outline
      filters:
      # Map from sensor -> measured value
        - calibrate_linear:
            - 242.96107 -> 239
            - 239.74483 -> 236
 
    power:
      name: "${plug_name} - Watt"
      unit_of_measurement: W
      id: "${plug_name}_Wattage"
      icon: mdi:flash-outline
      accuracy_decimals: 0
      filters:
      # Map from sensor -> measured value
        - calibrate_linear:
            - -51.42855 -> 0.000
            - 18.58305 -> 0.000
            - 8.94716 -> 0.000
            - 5.31689 -> 0.000
            - 3.58723 -> 0
            - 2.62106 -> 0
            - 91.60732 -> 100
            - 166.78029 -> 75
            - 199.75945 -> 100
    change_mode_every: 4
    update_interval: 3s
    
  - platform: total_daily_energy
    name: "${plug_name} - Consumption"
    power_id: "${plug_name}_Wattage"
    filters:
        # Multiplication factor from W to kW is 0.001
        - multiply: 0.001
    unit_of_measurement: kWh
    icon: mdi:clock-alert 

text_sensor:
  - platform: version
    name: "${plug_name} - ESPHome Version"
  - platform: wifi_info
    ip_address:
      name: skuter IP Address
    ssid:
      name: skuter Connected SSID
    bssid:
      name: skuter Connected BSSID
    mac_address:
      name: skuter Mac Wifi Address
    scan_results:
      name: skuter Latest Scan Results
  
binary_sensor:
  # Binary sensor for the button press
  - platform: gpio
    name: Physical Button Sensor
    pin:
      number: GPIO13
      inverted: true
    on_press:
      - switch.toggle: relay

switch:
  # Switch to toggle the relay
  - platform: gpio
    id: relay
    name: skuter
    pin: GPIO15
    on_turn_on:
      - light.turn_on: led
    on_turn_off:
      - light.turn_off: led

output:
  # Relay state led
  - platform: esp8266_pwm
    id: state_led
    pin:
      number: GPIO00
      inverted: true

light:
  # Relay state light
  - platform: monochromatic
    output: state_led
    id: led

# Uses the red LED as a ESPhome status indicator
status_led:
  pin:
    number: GPIO2
    inverted: true

captive_portal:

To była moja konfiguracja, obecnie nie używam już EspHome, może ci w czymś pomoże.
https://pastebin.com/hh9ch23U

substitutions:
  plug_name: lodowka
  # Higher value gives lower watt readout
  current_res: "0.00221"
  # Lower value gives lower voltage readout
  voltage_div: "945"



esphome:
  name: lodowka
  platform: ESP8266
  board: esp8285

# WiFi connection
wifi:
  ssid: 'lan'
  password: 'pass'
  manual_ip:
    static_ip: 192.168.1.94
    gateway: 192.168.1.100
    subnet: 255.255.255.0
    dns1: 192.168.1.100
    dns2: 192.168.1.100
    
# Enable logging
logger:

# Enable Web server
#web_server:
#  port: 80

# Enable Home Assistant API
api:
  password: 'PASSWORD'

ota:
  password: 'PASSWORD'

time:
  - platform: homeassistant
    id: homeassistant_time
    

binary_sensor:
  - platform: gpio
    name: "${plug_name}_button"
    pin:
      number: GPIO3
      inverted: True
    on_press:
      - switch.toggle: relay
  - platform: status
    name: ${plug_name}_Status
    
    
    
switch:
- platform: gpio
  id: relay
  name: "${plug_name}_Relay"
  pin: GPIO14
  icon: mdi:power-socket-eu
  restore_mode: ALWAYS_ON
  on_turn_on:
    - switch.turn_on: blue_led
  on_turn_off:
    - switch.turn_off: blue_led

- platform: gpio
  id: blue_led
  name: "${plug_name}_LED_Blue"
  icon: mdi:led-on
  pin: GPIO1
  inverted: True
  restore_mode: ALWAYS_ON

- platform: gpio
  id: red_led
  name: "${plug_name}_LED_Red"
  pin: GPIO13
  inverted: True
  restore_mode: ALWAYS_OFF

sensor:
  - platform: hlw8012
    sel_pin:
      number: GPIO12
      inverted: True
    cf_pin: GPIO04
    cf1_pin: GPIO05
    # Higher value gives lower watt readout
    current_resistor: 0.00221
    # Lower value gives lower voltage readout
    voltage_divider: 794
    current:
      name: "${plug_name}_Amperage"
      icon: mdi:current-ac
      unit_of_measurement: A
    voltage:
      name: "${plug_name}_Voltage"
      icon: mdi:flash-circle
      unit_of_measurement: V
    power:
      name: "${plug_name}_Wattage"
      unit_of_measurement: W
      id: "${plug_name}_Wattage"
    change_mode_every: 8
    update_interval: 10s
  - platform: total_daily_energy
    name: "${plug_name}_Total Daily Energy"
    icon: mdi:circle-slice-3
    power_id: "${plug_name}_Wattage"
    filters:
        # Multiplication factor from W to kW is 0.001
        - multiply: 0.001
    unit_of_measurement: kWh
      
# Extra sensor to keep track of plug uptime

  - platform: uptime
    id: uptime_sec

text_sensor:
  - platform: template
    name: ${plug_name}_Uptime Sensor
    lambda: |-
      int seconds = (id(uptime_sec).state);
      int days = seconds / (24 * 3600);
      seconds = seconds % (24 * 3600); 
      int hours = seconds / 3600;
      seconds = seconds % 3600;
      int minutes = seconds /  60;
      seconds = seconds % 60;
      return { (String(days) +"d " + String(hours) +"h " + String(minutes) +"m "+ String(seconds) +"s").c_str() };
    icon: mdi:clock-start
    update_interval: 113s

#  - platform: uptime
#    name: ${plug_name}_Uptime Sensor
    
#  - platform: wifi_signal
#    name: ${plug_name}_Wi-Fi_Signal
#    update_interval: 60s

#text_sensor:
#  - platform: version
#    name: ${plug_name}_firmware_version
``

Dzięki. Poradziłem sobie ustawiając current_res i voltage_div.
A wiesz może co wpisać, żeby gniazdko wyłączyło się po przekroczeniu zadanej mocy np. 2000W? max_power: 2000 ?

W kwestii poprzedniego pytania - w konfiguracji moim zdaniem mapy wartości były niewłaściwe (lewa kolumna raczej powinna zawierać wartości rosnąco), punkty kalibracyjne powinny być daleko od siebie (i zakładając liniowy przebieg właściwie im mniej tym lepiej - optymalne są 2 lub 3 punkty w wypadku takiego gniazdka - np. grzałka/czajnik 2kW i grzałka 500W oczywiście zmierzone innym przyrządem, we wskazania którego wierzysz, a w zerze możesz przyjąć zero).
Musisz też brać pod uwagę wpływ szumów - dokładność pomiaru w najlepszym miejscu (dla bardzo dużych prądów i mocy - bliskich obciążalności) jest nie gorsza niż 1%, natomiast dla bardzo małych wartości szum bywa wyższy niż mierzona wartość - dlatego fabryczny soft w gniazdach bazujących na tym i podobnych układach pomiarowych po prostu odfiltrowuje wartości dla mocy poniżej 0,5W i prezentuje zero.

Musisz sobie napisać prostą automatyzację (aby to było przetwarzane lokalnie)

Mam miernik Uni-T UT33C. Za pomocą niego sprawdzam aktualne napięcie w gniazdku. A co do W i A zrobiłem sobie takie gniazdko testowe jak na zdjęciu. W środku siedzi Shelly 1PM

Urządzenia które podpinam:
żarówka 7,5W
żarówka 75W
żarówka 100W
suszarka z 3ma trybami pracy

1 polubienie

Tylko jak prawidłowo dobrać te wartości?

Jako wartość current_resistor podajesz rezystancję bocznika pomiaru prądu (wartość w omach, prawdopodobnie to jeden miliom, czyli 0.001 oma, on ma nadruk R001), a voltage_divider to przełożenie dzielnika napięcia (niestety na podstawie zdjęć z sieci nie podpowiem jaka to wartość, ale w jakimś stopniu prawdopodobne jest, że jedną z gałęzi jest rezystor z nadrukiem 105 czyli 1 megaom, ale od stopnia podziału zależy wskazywane napięcie, więc w prosty sposób to obliczysz, mierząc równocześnie rzeczywiste napięcie sieci), wszystko zgodnie z dokumentacją

i z prawa Ohma

Aby poznać wartości trzeba otworzyć urządzenie, zbadać jego schemat elektryczny (ustrój pomiarowy MUSI być w kluczowych miejscach zgodny ze swoją dokumentacją, ogólny schemat jest na 7 stronie tego chińskiego datasheeta), tzn. tak najłatwiej, bo wystarczy odczytać wartości z elementów smd i podstawić do wzoru.

na rysunku górną gałąź dzielnika napięcia przykryłem niebieską kreską (jak widać tu to koło 3 megaomów - to 6 rezystorów 470k szeregowo, a dolna gałąź na zielono to 1k - jeden kiloom), w praktyce te wartości są prawdopodobnie inne - wspominany 1M najprawdopodobniej jest górną gałęzią, więc by uzyskać podobny stosunek podziału jak w konstrukcji referencyjnej rezystor z dolnej gałęzi musiałby mieć wartość około 330 omów (typowe oznaczenie to 331 ale możliwe, że jest opisany inaczej, bo może mieć inną wartość - prawdopodobnie nie jest to wartość krytyczna, jeśli komuś się chce policzyć to kalkulator w rękę), w ramce fioletowej jest bocznik, który na zdjęciach PCB tego smartpluga w sieci ma dokładnie taką wartość jak na referencyjnym schemacie), ponieważ rezystor stanowiący bocznik jest dobrze widoczny to sugeruję użyć wartość z niego odczytaną.

Biorąc pod uwagę wartości dzielnika napięcia podane w YAMLach przez przedmówców możliwe, że wartość rezystora dolnej gałęzi to 1k2 (potencjalne oznaczenie czterocyfrowe to 1211 lub 122 jeśli trzycyfrowe), jakkolwiek w konfiguracji bierzemy nie faktyczne wartości rezystorów lecz stopień podziału napięcia, to można go dobrać eksperymentalnie w łatwy sposób.