『瀚思彼岸』» 智能家居技术论坛

标题: S3智能插排的功能改造(本地自动化) [打印本页]

作者: polisher    时间: 2023-8-1 20:22
标题: S3智能插排的功能改造(本地自动化)
本帖最后由 polisher 于 2023-8-3 10:22 编辑

本人小白水平,未经严格测试,供有兴趣的友友把玩。如有任何建议和问题请一定劳烦告知。(参考trz0332大神的帖子)改造原因:
主要为光猫、路由器、HA服务器等设计的智能化本地执行的断开与恢复设备电源的功能。旨在当设备出现网络问题时,尝试自行断电恢复。

改造内容:
1.新增按钮:延时重启电源。该功能可远程控制电源断开,在间隔设定的时间后自动恢复供电。

2.新增选项:延时时间。可自行设定断电后的间隔时间。
3.新增选项:检测到断网重启电源。选择该项后,每间隔1分钟对互联网进行检测,如发现断网,将自动重启电源。
5.新增选项:启用故障灯。选择该项后,火零线反接与缺地线将触发红色故障灯。
4.新增显示:故障检测(互联网连接)。当“检测到断网重启电源”启用后,显示网络检测情况。
5.调整安全锁功能,当该项启用后,插线板上的电源开关将失效,并不能长按恢复功能。
6.调整插座启动模式,当本插座停电恢复后,尝试恢复上次开关状态,并默认为 开。
主要疑问:
ESPHOME自带的“Safe Mode Switch”似乎并没有什么卵用,不知道是不是我理解有误。
刷机方式:
本固件大小有660KB([attach]50388[/attach]),本插线板用的ESP8266的FLASH实在有些捉襟见肘,所以刷机只能线刷,或先用小固件OTA后再用本固件()。
[attach]50387[/attach]
  1. esphome:
  2.   name: wifis3
  3.   friendly_name: WIFI智能插线板S3
  4.   comment: 智能插线板。可检测缺地线、火零接反、联网。主要功能:延时重启电源与断网重启电源。
  5. esp8266:
  6.   board: esp01_1m
  7.   restore_from_flash: true

  8. # Enable logging
  9. logger:
  10.   level: DEBUG #WARN

  11. # Enable Home Assistant API
  12. api:
  13.   encryption:
  14.     key: "tG/74gVnhFgdPM8Pm8fTWtr/P+smTsONRX/zlcHtx4g="

  15. ota:
  16.   reboot_timeout: 8min
  17.   password: "fe26521716b51c2cbb161336ac8eb0eb"
  18.   
  19. wifi:
  20.   ssid: !secret wifi_ssid
  21.   password: !secret wifi_password

  22.   # Enable fallback hotspot (captive portal) in case wifi connection fails
  23.   ap:
  24.     ssid: "Wifis3 Fallback Hotspot"
  25.     password: "1prrZACu5khe"

  26. captive_portal:

  27. substitutions:
  28.   device_name: S3_1
  29.   button_pin: GPIO13   #按钮。插线板上的电源按键
  30.   relay_pin: GPIO5   #继电器。控制电源输出
  31.   led_r_pin: GPIO4  #故障指示灯(红色)
  32.   led_w_pin: GPIO16  #插线板状态灯。缓慢闪烁:WIFI连接中断或传感器读取失败;快速闪烁:ESPHome在设置时发现错误
  33.   alarm_pin1: GPIO12  #零火接反检测。零线地线之间是否有电压
  34.   alarm_pin2: GPIO14  #缺地线检测。地线和火线之间是否有电压
  35.   hlw8012_sel_pin: GPIO2 #HLW8012传感器sel引脚
  36.   hlw8012_sf_pin: GPIO9 #HLW8012传感器sf引脚
  37.   hlw8012_sf1_pin: GPIO10 #HLW8012传感器sf1引脚

  38. globals:
  39.    - id: Security_lock_enable #安全锁启用。1为启用,0为禁用
  40.      type: int
  41.      restore_value: yes
  42.      initial_value: "0"
  43.    - id: Disconnection_reboot_enable #检测到断网(互联网)重启电源;1为启用,0为禁用
  44.      restore_value: yes
  45.      type: int
  46.      initial_value: "0"
  47.    - id: Disconnection_rebooted_mark #断网重启标志,1为已重启,0为未重启。断网后只重启一次,如果网络恢复将重置该标志
  48.      type: int
  49.      initial_value: "0"
  50.    - id: Warning_light_enable #故障指示灯启用。1为启用,0为禁用
  51.      type: int
  52.      restore_value: yes
  53.      initial_value: "1"

  54. status_led:
  55.   pin:
  56.     number: $led_w_pin
  57.     inverted: true

  58. output:
  59.   - id: light_output
  60.     platform: gpio
  61.     pin:
  62.       number: $led_r_pin
  63.       inverted: true

  64. # 故障指示灯
  65. light:
  66.   - platform: binary
  67.     output: light_output
  68.     name: "${device_name}_Warning_light"
  69.     internal: True # 不在前端显示
  70.     id: "r_led"

  71. # 二元传感器组件   
  72. binary_sensor:
  73.   # 插线板电源按键
  74.   - platform: gpio
  75.     pin:
  76.       number: $button_pin
  77.       inverted: true
  78.       mode:
  79.         input: true
  80.         pullup: true
  81.     name: "${device_name}_Outlet button"
  82.     internal: True # 不在前端显示
  83.     on_click:
  84.     - min_length: 50ms
  85.       max_length: 1000ms
  86.       then:
  87.         - if:
  88.             condition:
  89.               lambda: 'return id(Security_lock_enable)==0  ;'
  90.             then:
  91.               - switch.toggle: "relay1"
  92.               
  93.   # 故障检测(零火反接)
  94.   - platform: gpio
  95.     device_class: PROBLEM
  96.     entity_category: DIAGNOSTIC
  97.     pin:
  98.       number: $alarm_pin1
  99.       inverted: true
  100.       mode:
  101.         input: true
  102.         pullup: true
  103.     name: "${device_name}_LNInversion"
  104.     id: lostGnd
  105.   
  106.   # 故障检测(缺地线)
  107.   - platform: gpio
  108.     device_class: PROBLEM
  109.     entity_category: DIAGNOSTIC
  110.     pin:
  111.       number: $alarm_pin2
  112.       inverted: true
  113.       mode:
  114.         input: true
  115.         pullup: true
  116.     name: "${device_name}_lostGnd"
  117.     filters:
  118.       - delayed_on: 100ms
  119.       - delayed_off: 100ms
  120.       - delayed_on_off: 100ms  #延迟开关:仅当二进制传感器至少在指定的时间段内保持在相同状态时,才发送打开或关闭值。用于解除二进制开关的抖动
  121.     id: LNInversion

  122. # hlw8012组件
  123. sensor:
  124.   - platform: hlw8012
  125.     model: BL0937
  126.     sel_pin:
  127.       number: $hlw8012_sel_pin
  128.       inverted: true
  129.     cf_pin: $hlw8012_sf_pin
  130.     cf1_pin: $hlw8012_sf1_pin
  131.     #电流
  132.     current:
  133.       name: "${device_name}_current"
  134.       entity_category: diagnostic
  135.     #电压  
  136.     voltage:
  137.       name: "${device_name}_voltage"
  138.       entity_category: diagnostic
  139.     #功率  
  140.     power:
  141.       name: "${device_name}_power"
  142.       entity_category: diagnostic
  143.     #电量  
  144.     energy:
  145.       name: "${device_name}_energy"
  146.       entity_category: diagnostic
  147.     initial_mode: CURRENT
  148.     update_interval: 30s
  149.     voltage_divider: 1066
  150.     current_resistor: 0.001


  151. button:
  152. # - platform: factory_reset
  153. #   name: "${device_name}_Reset"
  154. # - platform: safe_mode
  155. #   name: "${device_name}_SafeMode"
  156. # - platform: restart
  157. #   name: "Living Room Restart"
  158.   # 延时重启电源
  159.   - platform: template
  160.     name: "${device_name}_Delay reboot power"
  161.     icon: mdi:gesture-tap-button
  162.     on_press:
  163.       then:
  164.         - switch.turn_off: relay1
  165.         - delay: !lambda "if (id(delay_time).state) return id(delay_time).state*1000*60; else return 1*1000960;"
  166.         - switch.turn_on: relay1

  167. # 延时设置
  168. number:
  169.   - platform: template
  170.     icon: mdi:timer-settings
  171.     name: "${device_name}_Delay time"
  172.     mode: box
  173.     entity_category: config
  174.     unit_of_measurement: "分钟"
  175.     optimistic: true
  176.     min_value: 1
  177.     max_value: 60
  178.     restore_value: True
  179.     initial_value: 1
  180.     step: 1
  181.     id: delay_time

  182. # 开关组件
  183. switch:
  184.   # 继电器
  185.   - platform: gpio   
  186.     pin: $relay_pin
  187.     name: "${device_name}_relay"
  188.     id: "relay1"  
  189.     device_class: OUTLET
  190.     restore_mode: RESTORE_DEFAULT_ON # 尝试恢复状态并默认为 ON。

  191.   # 故障灯启用开关
  192.   - platform: template
  193.     name: "${device_name}_Warning light enable"
  194.     icon: mdi:lightbulb
  195.     entity_category: config
  196.     lambda: |-
  197.       if (id(Warning_light_enable)==1) {
  198.         return true;
  199.       } else {
  200.         return false;
  201.       }
  202.     id: "Warning_light_enable_switch"
  203.     turn_on_action:
  204.        - lambda: |-
  205.            id(Warning_light_enable)=1;
  206.     turn_off_action:
  207.        - lambda: |-
  208.            id(Warning_light_enable)=0;

  209.    # 检测到断网重启电源
  210.   - platform: template
  211.     name: "${device_name}_Disconnection reboot"
  212.     icon: mdi:network-off-outline
  213.     entity_category: config
  214.     lambda: |-
  215.       if (id(Disconnection_reboot_enable)==1) {
  216.         return true;
  217.       } else {
  218.         return false;
  219.       }
  220.     id: "Disconnection_reboot_enable_switch"
  221.     turn_on_action:
  222.        - lambda: |-
  223.            id(Disconnection_reboot_enable)=1;
  224.            id(network_status_text).publish_state("准备检测");
  225.     turn_off_action:
  226.        - lambda: |-
  227.            id(Disconnection_reboot_enable)=0;
  228.            id(network_status_text).publish_state("检测关闭");

  229. # 安全锁开关,开启时,插排上的开关失效
  230. lock:
  231.   - platform: template
  232.     name: "${device_name}_Security lock"
  233.     entity_category: CONFIG
  234.     id: "lock1"
  235.     lock_action:
  236.       then:
  237.         - lambda: |-
  238.             id(Security_lock_enable)=1;
  239.     unlock_action:
  240.       then:
  241.         - lambda: |-
  242.             id(Security_lock_enable)=0;
  243.     lambda: |-
  244.         if (id(Security_lock_enable)==1) {
  245.           return LOCK_STATE_LOCKED;
  246.         } else {
  247.           return LOCK_STATE_UNLOCKED;
  248.         }

  249. http_request:
  250.   useragent: esphome/device
  251.   timeout: 10s


  252. # 故障检测(互联网连接)
  253. text_sensor:
  254.   - platform: template
  255.     name: "${device_name}_Disconnection"
  256.     update_interval: never
  257.     id: network_status_text
  258.     entity_category: diagnostic     

  259. interval:
  260.   # 每秒检测一次故障,有则亮红灯
  261.   - interval: 1s
  262.     then:
  263.       - lambda: |-
  264.           if(id(Warning_light_enable)==1){
  265.             if ( id(LNInversion).state or id(lostGnd).state) {
  266.                auto call =id(r_led).turn_on();
  267.                call.perform();
  268.             } else{
  269.                 auto call =id(r_led).turn_off();
  270.                 call.perform();
  271.             }   
  272.           }
  273. # 每分钟检测一次网络,无则关闭电源输出5分钟后恢复              
  274.   - interval: 1min
  275.     then:               
  276.       - if:
  277.            condition:
  278.              lambda: 'return (id(Disconnection_reboot_enable)==1)and(id(Disconnection_rebooted_mark)==0)  ;'
  279.            then:
  280.              - lambda: id(network_status_text).publish_state("检测网络");
  281.              - http_request.get:
  282.                  url: https://sp0.baidu.com/5a1Fazu8AA54nxGko9WTAnF6hhy/su
  283.                  headers:
  284.                    Content-Type: application/json
  285.                  verify_ssl: false
  286.                  on_response:
  287.                    then:
  288.                      - if:
  289.                           condition:
  290.                             lambda: 'return (status_code>399)  ;'
  291.                           then:
  292.                             #lambda: 'id(network_status_text).publish_state("联网失败");'  
  293.                             - switch.turn_off: relay1  
  294.                             - delay: !lambda "if (id(delay_time).state) return id(delay_time).state*1000*60; else return 1*1000960;"
  295.                             - switch.turn_off: relay1
  296.                           else:
  297.                             lambda: 'id(network_status_text).publish_state("联网正常");'

  298.               
复制代码



作者: dscao    时间: 2023-8-1 20:50
在ESPHome中,Safe Mode(安全模式)是一种启动选项,用于在出现问题时禁用自定义组件或平台。具体来说,Safe Mode可以禁用自定义的setup()和loop()函数,以及一些其他的配置选项,从而使设备可以在遇到错误或问题时正常运行,而不会崩溃或陷入无限重启循环。

实际使用中,大部分情况用不上,但有时就非常有用。
我有两个esphome固件加了蓝牙代理或创米红外遥控器的tts转发网关的红外和蓝牙消息到mqtt,应该是检测的频率非常高,处理器几乎一直在忙。在OTA新固件时经常中间卡住,很难顺利刷完。
先点击safe mode让esp启动到安全模式后,再OTA更新固件就非常顺利了。
作者: polisher    时间: 2023-8-2 09:05
本帖最后由 polisher 于 2023-8-2 09:11 编辑
dscao 发表于 2023-8-1 20:50
在ESPHome中,Safe Mode(安全模式)是一种启动选项,用于在出现问题时禁用自定义组件或平台。具体来说,Sa ...

非常感谢您的讲解。原本是想用安全模式弥补内存不足导致OTA失败的问题,但可能固件过大没有起到作用。目前只能采用先OTA空固件,再OTA本固件,实在是有些愚钝但没找到更好的办法。
作者: sorrypqa    时间: 2023-8-6 05:59
1M闪存的ESP就是可恨!玩起来就是诸多不爽。
作者: lp846262100    时间: 2023-8-31 17:32
wifis3.bin 这个直接用usb刷进去就可以吗?
作者: polisher    时间: 2023-9-1 09:02
lp846262100 发表于 2023-8-31 17:32
wifis3.bin 这个直接用usb刷进去就可以吗?

可以直接刷固件。也可以自己用ESPHOME再个性化一下。
作者: lp846262100    时间: 2023-9-17 22:02
哥, 我刷了, 192.168.4.1不能访问啊?  能不能直接访问呢?
作者: sorrypqa    时间: 2023-9-18 07:55
lp846262100 发表于 2023-9-17 22:02
哥, 我刷了, 192.168.4.1不能访问啊?  能不能直接访问呢?

楼主的配置里并没有启用web,esp8266性能比较差,一般情况都不会启用这个组件,所以只能通过HA接入控制
作者: polisher    时间: 2023-9-18 09:22
lp846262100 发表于 2023-9-17 22:02
哥, 我刷了, 192.168.4.1不能访问啊?  能不能直接访问呢?

如楼上所述,8266的闪存太小,直接访问所需的WEB组件无法置入。想要直接访问,需要更换为硬件。
作者: lp846262100    时间: 2023-9-18 09:34
sorrypqa 发表于 2023-9-18 07:55
楼主的配置里并没有启用web,esp8266性能比较差,一般情况都不会启用这个组件,所以只能通过HA接入控制 ...

我加了下面配置, 似乎不太好使。 哥知道啥情况不?
web_server:  
  port: 80
作者: lp846262100    时间: 2023-9-18 22:35
lp846262100 发表于 2023-9-18 09:34
我加了下面配置, 似乎不太好使。 哥知道啥情况不?
web_server:  
  port: 80

有了, 可以访问了。。。
作者: b2b22    时间: 2023-9-29 15:57
好好好 试试看
作者: 静心    时间: 2024-1-21 18:58
问下配置加密密钥是什么
作者: polisher    时间: 2024-1-21 19:20
静心 发表于 2024-1-21 18:58
问下配置加密密钥是什么

新建时,系统自动生成
作者: 静心    时间: 2024-1-21 19:46
本帖最后由 静心 于 2024-1-21 20:09 编辑
polisher 发表于 2024-1-21 19:20
新建时,系统自动生成

谢谢,知道了,是我前面用手机设置可能输错了
作者: 静心    时间: 2024-1-21 19:55
静心 发表于 2024-1-21 19:46
E:\Download\screenshot-1705837425084.png

我是刷你的wifis3.bin 连上网后,HA里添加设备时说要密钥,
作者: 静心    时间: 2024-1-21 19:56
静心 发表于 2024-1-21 19:55
我是刷你的wifis3.bin 连上网后,HA里添加设备时说要密钥,

是哪个密码啊,
作者: polisher    时间: 2024-1-22 08:55
静心 发表于 2024-1-21 19:56
是哪个密码啊,

tG/74gVnhFgdPM8Pm8fTWtr/P+smTsONRX/zlcHtx4g=
作者: ai2online    时间: 2024-2-1 17:34
是的,没有web管理界面,并且没有单独的永久关闭,开始用的时候老是1分钟后打开,后面看到它那个1分钟延迟了S3_1_Delay time.
体验了三十分钟,觉得不妥,重新焊线刷回以前带web界面的。




欢迎光临 『瀚思彼岸』» 智能家居技术论坛 (https://bbs.hassbian.com/) Powered by Discuz! X3.5