S3 排插 改esphome固件 接入Home assistant 源码

闲来无事,

在B站看到有UP主说有个智能排插用的是ESP8266芯片做的

可以拆开,用ESPhome线刷成自己定义的固件,

电能功率计用的是BL0937,可以实时检测电流电压,但感觉不太准。

实物图如下

拆解刷机没有记录下来就不写了,直接上原代码

substitutions:
  device_name: s3switch05
  button_pin: GPIO13   #按钮
  relay_pin: GPIO5   #继电器
  led_r_pin: GPIO4  #白色led
  led_w_pin: GPIO16  #------红色led
  alarm_pin1: GPIO12  #零火检测 ###零线地线之间是否有电压
  alarm_pin2: GPIO14  #缺地检测##地线和火线之间是否有电压
  hlw8012_sel_pin: GPIO2
  hlw8012_sf_pin: GPIO9
  hlw8012_sf1_pin: GPIO10

esphome:
  name: s3switch05
  friendly_name: S3SWITCH05
  on_boot:
    then:
      - delay: 3s
      - switch.turn_on: "relay1"

esp8266:
  board: esp01_1m

# Enable logging
logger:

# Enable Home Assistant API
api:
  encryption:
    key: "FPoefBYLYls4gxpYtEuXVtbbcM8oGvZTU93WRwNBEX4="
  reboot_timeout: 0s
ota:
  password: "0c17bfc95c167e23cf6555a8a38d3863"



captive_portal:


wifi:
  ssid: wushi-2.4
  password: ++0123--
  manual_ip:
    static_ip: 192.168.1.117    ##固定此设备IP地址为192.168.1.100;
    gateway: 192.168.1.1        ##路由器、网关地址;
    subnet: 255.255.255.0         ##子网掩码;
    
  # Enable fallback hotspot (captive portal) in case wifi connection fails

  ap:
    ssid: "${device_name}_Fallback Hotspot"
    password: "Ioi78VkYZ5vh" 





status_led:
  pin:
    number: $led_w_pin
    inverted: true


globals:
   - id: auto_gl
     type: int
     restore_value: yes
     initial_value: "1"
   - id: flag_closealarm
     type: int
     initial_value: "1"
     restore_value: yes

output:
  - id: light_output
    platform: gpio
    pin:
      number: $led_r_pin
      inverted: true

light:
  - platform: binary
    output: light_output
    name: "${device_name}_r_led"
    id: "r_led"
    internal: true

binary_sensor:
  - platform: gpio
    pin:
      number: $button_pin
      inverted: true
      mode:
        input: true
        pullup: true
    name: "${device_name}_B1"
    on_click:
    - min_length: 50ms
      max_length: 1000ms
      then:
        - if:
            condition:
              lambda: 'return id(Lock1).state  ;'
            then:
              - switch.toggle: "relay1"
    - min_length: 3000ms
      max_length: 20000ms
      then:
        - switch.toggle: 'Lock1'  
  - platform: gpio
    pin:
      number: $alarm_pin2
      inverted: false
      mode:
        input: true
    name: "${device_name}_lostGnd"
    id: lostGnd
    filters:
      - delayed_on: 100ms
  - platform: gpio
    pin:
      number: $alarm_pin1
      inverted: true
      mode:
        input: true
    filters:
      - delayed_on: 100ms
    name: "${device_name}_LNInversion"
    id: LNInversion



sensor:
  - platform: wifi_signal
    name: "${device_name}_RSSI"
    update_interval: 60s
  - platform: hlw8012
    model: BL0937
    sel_pin:
      number: $hlw8012_sel_pin
      inverted: true
    cf_pin: $hlw8012_sf_pin
    cf1_pin: $hlw8012_sf1_pin
    current:
      name: "${device_name}_Current"
    voltage:
      name: "${device_name}_Voltage"
    power:
      name: "${device_name}_Power"
    energy:
      name: "${device_name}_Energy"
    initial_mode: CURRENT
    update_interval: 30s
    voltage_divider: 1651
    current_resistor: 0.001
text_sensor:
  - platform: wifi_info
    ip_address:
      name: '${device_name}_IP'
    mac_address:
      name: '${device_name}_MAC'

button:
  - platform: factory_reset
    name: "${device_name}_Reset"
  - platform: restart
    name: "${device_name}_Restart"
  - platform: safe_mode
    name: "${device_name}_SafeMode"
switch:  
  - platform: gpio   #继电器
    pin: $relay_pin
    name: "${device_name}_relay"
    id: "relay1"  

  - platform: template
    name: "${device_name}_CloseAlarm"
    id: "CloseAlarm"
    turn_on_action:
      then:
        - lambda: |-
            id(flag_closealarm)=1;
    turn_off_action:
      then:
        - lambda: |-
            id(flag_closealarm)=0;
    lambda: |-
        return id(flag_closealarm);


  - platform: template
    name: "${device_name}_Lock"
    id: "Lock1"
    turn_on_action:
      then:
        - lambda: |-
            id(auto_gl)=1;
    turn_off_action:
      then:
        - lambda: |-
            id(auto_gl)=0;
    lambda: |-
        return id(auto_gl);

interval:
  - interval: 1000ms
    then:
      lambda: |-
               if ( (id(LNInversion).state or id(lostGnd).state) and id(flag_closealarm) ) {
                auto call =id(r_led).toggle();
                call.perform();
               } else{
                auto call =id(r_led).turn_off();
                call.perform();
               }



通电3秒继电器自动接通

按着开关50毫秒到1秒算短按,在没有锁止的状态下,可以切换继电器通断

按着开关3秒到20秒算长按,长按切换锁止状态