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

 找回密码
 立即注册
查看: 1100|回复: 3

[硬件DIY] 用Sonoff Dual R3模块改装普通插排

[复制链接]

50

主题

1300

帖子

4903

积分

论坛DIY达人

积分
4903
金钱
3603
HASS币
20
发表于 2023-1-26 18:10:59 | 显示全部楼层 |阅读模式
我对插排的要求是,插排上至少有2座常通电,不受开关控制,用于软路由、POE交换机之类需要24x7常年通电的设备,2个座受A组开关控制,接NUC主机和显示器,2个座受B组开关控制,接电视和盒子之类.....带电量统计(能用磁保持继电器最好,不过这绝对是做梦),市面上完全找不到,能买到并且能接入HA的插排要么是单控,一关全关,要么是多控,最多只有4个座,接不了几个设备,而且容易误关,要是在外面不小心把接在上面的软路由、交换机、服务器关了........
所以目前只能自己改装,用的是N年前25元特价买的航嘉插排:

20230125_102705.jpg


20230125_102903.jpg


目前能买到可以刷ESPHome,比较便宜又带有电量统计的模块只有Sonoff Dual R3:


20221124_090803.jpg
20230115_145023.jpg
20230115_145008.jpg


到手第一件事就是拆开焊上刷机线刷ESPHome:

20230115_142407.jpg

刷机用的是HassOS里Add-ons自带的ESPHome:

SNAG-2023-1-15_00001.png

20230126175316.png 20230126180056.png

刷好固件后,在图里2个点引出2条不受继电器控制但可以统计用电量的火线出来:

20230125_104458.jpg

20230125_104654.jpg


装入插排:

20230125_111204.jpg

贴好标签,分成4组,1组常电,2组受HA控制,1组由插排原来的开关控制

20230125_112747.jpg




自用的配置文件:

substitutions:
  device_name: sonoff-dualr3-005  #设备名称
  friendly_name: sonoff_dualr3_005
  button_pin: GPIO0 #按键用引脚
  relay1_pin: GPIO27 #驱动继电器1用引脚
  relay2_pin: GPIO14 #驱动继电器2用引脚
  led_state_pin: GPIO13 #蓝色指示灯引脚
  sw1_inpu_pin: GPIO32 #开关信号输入1
  sw2_inpu_pin: GPIO33 #开关信号输入2
  uart_tx_pin: GPIO25 #功率传感器通讯接口
  uart_rx_pin: GPIO26 #功率传感器通讯接口

esphome:
  name: $device_name

esp32:
  board: esp32dev
  framework:
    type: arduino

api:
  password: "12345689"
  reboot_timeout: 0s

ota:
  password: "12345689"

captive_portal:

#web_server:
#  port: 80
#  auth:
#    username: "esphome"
#    password: "12345689"

wifi:
  ssid: "ESP-WiFi"
  password: "123456789"
  fast_connect: true
  reboot_timeout: 24h
#  use_address: sonoff_dualr3_005.local #更新设备名称时,需要指定设备旧地址。
#  manual_ip:
#    static_ip: 192.168.66.163
#    gateway: 192.168.66.1
#    subnet: 255.255.255.0
#    dns1: 114.114.114.114
#    dns2: 180.76.76.76
  ap:
    ssid: "esphome"
    password: "123456789"

status_led:
  pin:
    number: $led_state_pin
    inverted: true #反转属性

logger:
  baud_rate: 0

switch:  
  - platform: gpio   #继电器
    pin: $relay1_pin
    name: "${friendly_name}_relay1"
    id: "${friendly_name}_relay1"
    restore_mode: ALWAYS_ON #启动时将初始化为ON

  - platform: gpio   #继电器
    pin: $relay2_pin
    name: "${friendly_name}_relay2"
    id: "${friendly_name}_relay2"
    restore_mode: RESTORE_DEFAULT_OFF #尝试恢复状态,如果无法恢复,则默认为 OFF

  - platform: template  #虚拟开关
    name: "${friendly_name}_Keylock"
    id: "${friendly_name}_Keylock"
    turn_on_action:
      then:
        - lambda: |-
            id(auto_gl)=1;
    turn_off_action:
      then:
        - lambda: |-
            id(auto_gl)=0;
    lambda: |-
        return id(auto_gl);

  - platform: restart #重启开关
    name: "${friendly_name}_Restart"

globals: #全局变量
   - id: auto_gl
     type: int
     restore_value: yes #启动时还原状态
     initial_value: "1" #在无法还原状态或未启用状态还原时用于初始化此变量的值

uart:
  tx_pin: GPIO25
  rx_pin: GPIO26
  baud_rate: 4800
  parity: NONE
  stop_bits: 2

sensor:
  - platform: bl0939
    update_interval: 10s
    voltage:
      name: "${friendly_name}_Voltage"
      id: "${friendly_name}_Voltage"
    current_1:
      name: "${friendly_name}_Current1"
      id: "${friendly_name}_Current1"
    current_2:
      name: "${friendly_name}_Current2"
      id: "${friendly_name}_Current2"
    active_power_1:
      name: "${friendly_name}_Power1"
      id: "${friendly_name}_Power1"
    active_power_2:
      name: "${friendly_name}_Power2"
      id: "${friendly_name}_Power2"
    energy_1:
      name: "${friendly_name}_Energy1"
      id: "${friendly_name}_Energy1"
    energy_2:
      name: "${friendly_name}_Energy2"
      id: "${friendly_name}_Energy2"
    energy_total:
      name: "${friendly_name}_EnergyTotal"
      id: "${friendly_name}_EnergyTotal"

  - platform: total_daily_energy
    name: "${friendly_name}_TotalDaily_Energy1"
    power_id: "${friendly_name}_Power1"
    restore: true #将结果存储在设备
    method: trapezoid #计算每日总能量的方法,默认为right,可选trapezoid、left或right。
#    filters:
#      - multiply: 0.001 #校准系数,原始值乘以这个数得到最终值
#    unit_of_measurement: kWh #把Wh转换为KWh

  - platform: total_daily_energy
    name: "${friendly_name}_TotalDaily_Energy2"
    power_id: "${friendly_name}_Power2"
    restore: true #将结果存储在设备
    method: trapezoid #计算每日总能量的方法,默认为right,可选trapezoid、left或right。
#    filters:
#      - multiply: 0.001 #校准系数,原始值乘以这个数得到最终值
#    unit_of_measurement: kWh #把Wh转换为KWh

  - platform: uptime
    id: uptime_s
    update_interval: 60s

  - platform: wifi_signal #WiFi信号强度
    name: "${friendly_name}_WiFi_Signal"
    update_interval: 60s

binary_sensor:
  - platform: gpio
    pin:
      number: $button_pin
      inverted: true #反转属性
      mode:
        input: true #将引脚配置为输入
        pullup: true #激活引脚上的内部上拉电阻
    name: "${friendly_name}_B1"
    id: "${friendly_name}_B1"  
    on_click: #按钮单击
    - min_length: 50ms
      max_length: 1000ms
      then:
        - if:
            condition:
              lambda: 'return id(${friendly_name}_Keylock).state  ;'
            then:
              - switch.toggle: "${friendly_name}_relay1" #切换开关状态
              - switch.toggle: "${friendly_name}_relay2" #切换开关状态
    - min_length: 3000ms #长按3秒关闭所有开关
      max_length: 6000ms
      then:
        - switch.turn_off: "${friendly_name}_relay1"
        - switch.turn_off: "${friendly_name}_relay2"
    - min_length: 10000ms #长按10秒开启或关闭按键锁
      max_length: 15000ms
      then:
        - switch.toggle: '${friendly_name}_Keylock'

  - platform: gpio
    pin:
      number: $sw1_inpu_pin
      inverted: true #反转属性
#      mode:
#        input: true
#        pullup: true
    name: "${friendly_name}_SW1"
    id: "${friendly_name}_SW1"  
#    on_click:
#    - min_length: 50ms
#      max_length: 1000ms
#      then:
#        - if:
#            condition:
#              lambda: 'return id(${friendly_name}_Keylock).state  ;'
#            then:
#              - switch.toggle: "${friendly_name}_relay1"
    on_press: #接通时触发自动化
      then:
        - if:
            condition:
              lambda: 'return id(${friendly_name}_Keylock).state  ;'
            then:
              - switch.turn_on: "${friendly_name}_relay1" #开启relay1
    on_release: #断开时触发自动化
      then:
        - if:
            condition:
              lambda: 'return id(${friendly_name}_Keylock).state  ;'
            then:
              - switch.turn_off: "${friendly_name}_relay1" #关闭relay1


  - platform: gpio
    pin:
      number: $sw2_inpu_pin
      inverted: true #反转属性
#      mode:
#        input: true
#        pullup: true
    name: "${friendly_name}_SW2"
    id: "${friendly_name}_SW2"  
#    on_click:
#    - min_length: 50ms
#      max_length: 1000ms
#      then:
#        - if:
#            condition:
#              lambda: 'return id(${friendly_name}_Keylock).state  ;'
#            then:
#              - switch.toggle: "${friendly_name}_relay2"
    on_press: #接通时触发自动化
      then:
        - if:
            condition:
              lambda: 'return id(${friendly_name}_Keylock).state  ;'
            then:
              - switch.turn_on: "${friendly_name}_relay2"
    on_release: #断开时触发自动化
      then:
        - if:
            condition:
              lambda: 'return id(${friendly_name}_Keylock).state  ;'
            then:
              - switch.turn_off: "${friendly_name}_relay2"

time:
  - platform: homeassistant
    id: homeassistant_time
# Enable time component to reset energy at midnight
#  - platform: sntp
#    id: my_time

text_sensor:
  - platform: template
    name: "${friendly_name}_Uptime"
    lambda: |-
      uint32_t dur = id(uptime_s).state;
      int dys = 0;
      int hrs = 0;
      int mnts = 0;
      if (dur > 86399) {
        dys = trunc(dur / 86400);
        dur = dur - (dys * 86400);
      }
      if (dur > 3599) {
        hrs = trunc(dur / 3600);
        dur = dur - (hrs * 3600);
      }
      if (dur > 59) {
        mnts = trunc(dur / 60);
        dur = dur - (mnts * 60);
      }
      char buffer[17];
      sprintf(buffer, "%ud %02uh %02um %02us", dys, hrs, mnts, dur);
      return {buffer};
    icon: mdi:clock-start
    update_interval: 60s   

  - platform: wifi_info
    ip_address:
      name: ${friendly_name}_IP
#    ssid:
#      name: ${friendly_name}_SSID


评分

参与人数 1金钱 +20 收起 理由
dscao + 20 感谢楼主分享!

查看全部评分

回复

使用道具 举报

1

主题

62

帖子

293

积分

中级会员

Rank: 3Rank: 3

积分
293
金钱
231
HASS币
0
发表于 2023-1-26 18:19:19 | 显示全部楼层
刚入门,学习一下。
回复

使用道具 举报

35

主题

978

帖子

4517

积分

论坛元老

Rank: 8Rank: 8

积分
4517
金钱
3539
HASS币
20
发表于 2023-1-26 18:33:18 | 显示全部楼层
学习一下,家里有一堆的DUAL R3,目前都是接入SonoffLan直接用的,但是本地模式有点问题
回复

使用道具 举报

50

主题

1300

帖子

4903

积分

论坛DIY达人

积分
4903
金钱
3603
HASS币
20
 楼主| 发表于 2023-1-26 18:41:50 | 显示全部楼层
本帖最后由 sorrypqa 于 2023-1-27 07:50 编辑
sctale 发表于 2023-1-26 18:33
学习一下,家里有一堆的DUAL R3,目前都是接入SonoffLan直接用的,但是本地模式有点问题 ...

SonoffLan这玩意用起来非常不爽,除了不太稳定,每次添加更改设备都要重启HA,而设备越多就越不喜欢动不动就重启HA,esphome固件的设备,能同时连接多台HA,可以秒发现、秒添加、秒删除,和HA真是绝配
SNAG-2023-1-26_00001.png
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|Hassbian

GMT+8, 2024-4-29 05:35 , Processed in 0.053614 second(s), 31 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表