找回密码
 立即注册

微信扫码登录

搜索
查看: 274|回复: 18

[硬件DIY] 【ESPhome】【全网首发】领普S2 星环触屏开关 软硬件完整分析 & ESPHome 适配移植

[复制链接]

72

主题

392

回帖

4291

积分

元老级技术达人

积分
4291
金钱
3792
HASS币
200
发表于 昨天 14:28 | 显示全部楼层 |阅读模式
本帖最后由 gasment 于 2026-8-6 14:53 编辑


领普S2 星环 触屏开关 软硬件完整分析 & ESPHome 适配移植

一、硬件分析

产品图

image.png

[!CAUTION]

以下所有分析与固件配置,只针对硬件版本为v1.4的领普S2,其他批次如有硬件变动,自行检查

硬件分析

  • 拆解

    • 沿着卡扣撬下背部的高压AC_DC部分
      image-20260805215820-f4vq7tn.png
    • 主控部分和AC-DC部分可分离,主控部分可独立工作(无继电器)
      image-20260805220112-cxjwxfg.png
    • 主控部分卸下4颗螺丝,沿着边框卡扣,撬开黑色底板,注意不要蛮力,防止撬坏屏幕
      image-20260805220301-pdfa0ka.png
    • 卸下盖子,可轻轻拿起主板,小心背面屏幕排线,翻过来卸下排线,可以看到屏幕的一些信息
      触控芯片是CHSC6540,使用i2c通讯,屏幕显示芯片型号未找到硬件标识
      image-20260805220602-tznezfo.png
    • 主板背面(相对于主控),下方3个从左到右分别是:红外接收器、光线传感器、红外发射器。红外接收与发射用于实现接近检测。
      右边3个微动按键,对应面板3个按钮
      image-20260805221040-mln2pvg.png
    • 主板正面,预留了一些供电与调试测试点,方便了我们后面刷机与调试
      image-20260805221236-ejgc2h7.png
    • 主控信息,丝印型号是ESP-WROOM-32D,后面测试esphome固件时发现,它并不是常规的32D,它只有单核心,规格更接近esp32-solo,附带4MB Flash
      image-20260805221832-4x1pg6t.png
      与之搭配的还有一颗来自 AP MEMORY 的 PSRAM,容量2048KB
      image-20260805222103-7lo68w3.png
    • 其他部分,接近传感器的2个档位实现,通过使用了2路具有不同限流电阻的PWM线路,来控制发射管的亮度,从而实现不同距离的检测
      image-20260805222512-jqs4ao6.png
    • 高压部分,有一个双向光耦,测试点为ZVD,表现为与市电通断相关
      image-20260805222756-j2rhua9.png
  • 主控IO功能分配分析

    • 部分通过PCB走线取得,部分通过原厂固件分析取得
      image-20260805224324-glejzcy.png

三、ESPHome移植分析

  • 触控

    • 分析:触控IC 型号为 CHSC6540,esphome有官方组件chsc6x,可尝试使用。
    • 实测:官方组件chsc6x在i2c数据处理上有偏差,无法对应 CHSC6540 格式,需要修复
    • 成果:已制作CHSC6540专用外部组件,实现触控功能移植。
    • 配置示例
    i2c:
      id: touch_i2c
      sda: GPIO26
      scl: GPIO27
      frequency: 100kHz
      scan: false
    
    touchscreen:   #s2 pcb没有使用中断引脚
      - platform: chsc6540
        id: main_touch
        i2c_id: touch_i2c
        display: main_display
        transform:  #以3按键居右为正向,需要镜像xy轴坐标
          swap_xy: false
          mirror_x: true
          mirror_y: true
  • 屏幕

    • 分析: 通过分析原厂固件,取得屏幕驱动IC为GC9307,单线SPI,分辨率240x320,esphome官方没有支持该Model,不过已取得其初始化序列,可使用CUSTOM model来驱动
    • 实测:CUSTOM model有时序影响,需要使用专有model组件。
    • 成果:已制作GC9307 领普S2专用外部组件,实现屏幕显示功能移植。
    • 配置示列:
    spi:
      id: lcd_spi
      clk_pin: GPIO18
      mosi_pin: GPIO23
      miso_pin: GPIO19
    
    display:
      - platform: gc9307_linp_s2dw3
        id: main_display
        dc_pin: GPIO21
        cs_pin: GPIO5
        reset_pin: GPIO22
        auto_clear_enabled: false
        update_interval: never
        data_rate: 80Mhz
  • 屏幕背光

    • 分析:屏幕背光通过简易PWM即可控制,但是原厂有光线传感协同,需要还原原厂协议逻辑,当前已取得原厂自动亮度逻辑协议,与光线传感ADC后处理逻辑
    • 实测: 使用通用组件(ledc/adc)无法稳定控制时序与逻辑,需要专用外部组件实现。
    • 成果:已制作领普S2专用背光与光线传感器组件,实现还原原厂自动亮度逻辑
    • 配置示列:  
    lcd_backlight_linp_s2dw3:
      id: lcd_backlight
      brightness_pwm_pin: GPIO4
      ambient_light_adc_pin: GPIO36
      min_brightness: 10%   #自动亮度下限
      max_brightness: 100%  #自动亮度上限
      backlight_brightness:   #亮度调整实体
        id: lcd_backlight_brightness
        name: "Screen Brightness"
        restore_mode: ALWAYS_ON
        icon: "mdi:brightness-percent"
        entity_category: "config"
    
      backlight_mode:  #亮度模式实体
        id: lcd_backlight_mode
        name: "Screen Brightness Mode"
        restore_value: true
        icon: "mdi:brightness-auto"
        entity_category: "config"
    
      ambient_light:  #光线二元传感器
        id: ambient_light_sensor
        name: "Ambient Light"
        ambient_light_adc_threshold: 0.1V  #二元adc阈值,如明亮境显示无光,则减少阈值,反之同理,调整步进0.01为妙。
        icon: "mdi:sun-wireless"
        device_class: light
        # on_value:  #配备action动作,可在运行时改变部分数据
        #   then:
        #     - lcd_backlight_linp_s2dw3.set_brightness_limit:
        #         id: lcd_backlight
        #         min_brightness: 1%
        #         max_brightness: 50%
    
            # - lcd_backlight_linp_s2dw3.set_ambient_light_adc_threshold:
            #     id: ambient_light_sensor
            #     threshold: 0.2V
    
  • 接近传感器

    • 分析: 通过分析原厂固件取得好红外收发协议逻辑,协议逻辑较为复杂,通用组件无法驾驭,还原其需要制作专用外部组件实现。
    • 成果:已制作领普S2专用接近传感器组件,实现原厂控制逻辑,两档可调。
    • 配置示列:
    aproch_ir_sensor_linp_s2dw3:
      id: aproch_ir_sensor
      far_output_pin: GPIO32
      near_output_pin: GPIO12
      receiver_pin: GPIO33
      distance_mode:  #档位选择实体
        id: aproch_send_level
        name: "Aproch Sensor Mode"
        restore_value: true
        icon: "mdi:map-marker-distance"
        entity_category: "config"
    
      aproch_sensor:  #接近二元传感器实体
        id: aproch_receiver
        name: "Aproch Sensor"
        device_class: motion
        filters:
          - delayed_on_off: 500ms
    
  • 电平输入输出

    • 分析: 按键和ZVD为bool输入,使用通用的binary_sensor即可,继电器使用switch或output组件即可。
  • PSRAM

    • 分析: 当前PSRAM使用ESP32默认引脚连接,直接配置psram组件即可。
    • 实测: 启动报错。调试发现,此阉割版ESP32 的 package_id 为 3,正好是esp-idf声明的不支持psram的id之一。但是考虑到原厂固件能使用,可以使用强兼方式。
    • 成果:制作外部header文件,将package_id重新映射为受支持的id,成功启用PSRAM。
    • 配置示列:  
    esphome:
      includes:
        - components/psram_oem_package_compat.h
      platformio_options:
        build_flags:
          - "-include src/psram_oem_package_compat.h"
    esp32:
      toolchain: platformio
      framework:
        sdkconfig_options:
          CONFIG_FREERTOS_UNICORE: y   #需要显式声明单核SDK
    psram:
      mode: quad
      speed: 80MHz
  • 总结

    • 全部硬件障碍已被扫平,ESPHome移植的硬件功能还原已完成

四、原厂固件读写

  • 备份原厂固件

    • 使用串口工具连接到领普S2的调试引脚,需要为主板5V供电
      image-20260805235448-07g4heo.png image-20260805235505-8lqngn4.png
    • 将IO0短接到GND,然后为5V通电,如果成功进入下载模式,屏幕将不会显示,此时可以断开IO0到GND的连接
    • 这里使用esptool来做固件读取示例(这颗esp是oem版,乐鑫官方的Flash Download tool只能读固件,回写会efuse检验报错),我使用windows pip版esphome,自带有esptool:
    • 先检查连接状态:esptool chip-id​,连接成功如图
      image-20260806004618-t0zc3lr.png
    • 然后执行全量固件读取:esptool --chip esp32 read_flash 0x0 0x400000 %USERPROFILE%\Desktop\linp_s2dw3_full_flash.bin
    • 下载过程比较漫长,耐心等待,直到进度条走完,固件会下载到桌面,文件名为linp_s2dw3_full_flash.bin,注意核对文件大小
      image-20260806003229-2plupe4.png
      image-20260806003757-53kpktw.png
    • 存放备份好此bin,日后刷回原厂固件得靠这个。
  • 刷回原厂固件

    • 依旧使用esptool,依旧短接IO0<->GND进入下载模式并连接到串口工具,然后使用chip-id功能检查连接
    • 连接成功后,执行刷写命令(不要改bin文件名,并放回桌面):esptool --chip esp32 --baud 115200 write_flash 0x0 %USERPROFILE%\Desktop\linp_s2dw3_full_flash.bin
    • 过程依旧漫长,耐心等待,直到进度条走完
      image-20260806004431-nosf7m4.png
    • 刷写完成后不会自动重启,需要拔电重新上电,就会恢复到原厂固件。因为备份的是全量固件,会直接恢复到你备份时的状态,设置和自定义数据不会丢失

五、制作ESPHome示列固件

  • 示列固件演示:




1. 下载并解压固件配置包:
游客,如果您要查看本帖隐藏内容请回复

  1. 打开解压后文件夹阿内的config.yaml,根据注释提示修改相关配置

    packages:
     - !include main.yaml
    
    #########参数配置
    substitutions:
     project_name: linp-s2dw3-screen
     friendly_name: 领普S2触屏开关
     web_user: admin       #web页面账号,可自定义
     web_passwd: admin     #web页面密码,可自定义
    
     ntp_server: 192.168.32.1  #ntp服务器,可以是ip可以是域名如ntp.aliyun.com
     remote_temperature_entity: sensor.xxxxxx         #屏保界面的温度源实体,在你的HA上挑一个
     remote_humidity_entity: sensor.xxxxxx          #屏保界面的湿度源实体,在你的HA上挑一个
     setting_auth_key: "114514"                     #设置页的授权码,必须纯数字,不要过长            
     weather_entity: weather.xxxxx                  #天气源实体,需要搭配https://github.com/hasscc/tianqi此集成使用
     weather_temperature_entity: sensor.xxxxxxx     #天气温度源实体,可以使用上方集成提供的,或者其他反应室外温度的实体
     key_1_name: "按键1"                 #按键1显示的名称,使用常规汉字字母数字,3字符以内为妙
     key_2_name: "按键2"                 #按键2显示的名称
     key_3_name: "按键3"                 #按键3显示的名称
     screen_min_brightness: 20%                #非屏保状态下的亮度下限,建议20%,暗环境不会亮度过低导致看不清
     screen_max_brightness: 100%                #非屏保状态下的亮度上限,建议100%。
     screen_saver_min_brightness: 1%                #屏保状态下的亮度下限,建议1%。暗环境不会刺眼
     screen_saver_max_brightness:  30%                #屏保状态下的亮度上限,建议30%。避免待机屏保长期高亮度
     page_1_title: "2F主卧|夜灯"                 #页码1对应的标题
     page_2_title: "2F主卧|空调"                 #页码2对应的标题
     page_3_title: "2F主卧|电蚊香"               #页码3对应的标题
     page_4_title: "2F主卧|落地扇"               #页码4对应的标题   
    
     page_1_light_entity: light.xxxxxxx  #灯光实体,需要支持色温和亮度调整
     page_1_light_changetime_entity: sensor.xxxxxxx  #灯光的操作时间记录实体,需要搭配HA辅助元素实现,见下文
    
     page_2_ac_entity: climate.xxxxxxxx              #空调climate实体
     page_2_ac_changetime_entity: sensor.xxxxxxxxxx  #空调的操作时间记录实体,需要搭配HA辅助元素实现,见下文
     page_2_ac_target_temperature_attribute: temperature       #空调目标温度属性名,不同品牌不一致,可在开发者工具中查看,例如小米为temperature、美的为target_temperature
     page_2_ac_fan_modes:      #风速档位模式名称,不同品牌不一致,可在开发者工具中查看,比如小米为auto、level1、level1...,美的为auto、silent、low....
       auto_mode: "auto"
       level_1: "level1"
       level_2: "level2"
       level_3: "level3"
       level_4: "level4"
       level_5: "level5"
     page_2_ac_swing_horizontal: "false"     #空调是否具有水平扫风功能,有就"true",无就"false"
     page_2_ac_eco_mode_sw: switch.xxxxxxxxxxx  #空调是否具有eco功能,有就填switch实体名,无就填none
     page_2_ac_sleep_mode_sw: switch.xxxxxxxxxxx   #空调是否具有睡眠模式功能,有就填switch实体名,无就填none
    
     page_4_fan_entity: fan.2fwei_yu_esp01gua_bi_shan_gua_bi_shan   #风扇fan实体,支持档位、百分比调速,可选摇头功能
     page_4_fan_changetime_entity: sensor.xxxxxxx                    #风扇操作时间记录实体,需要搭配HA辅助元素实现,见下文
     page_4_fan_timer_entity: timer.xxxxxxxxxx                      #风扇定时器实体,需要搭配HA辅助元素和自动化实现,见下文
    
     page_3_plug_entity: switch.xxxxxxxx                                #插座switch实体
     page_3_plug_changetime_entity: sensor.xxxxxxx                      #插座的操作时间记录实体,需要搭配HA辅助元素实现,见下文
     page_3_plug_timer_entity: timer.xxxxxxx                            #插座定时器实体,需要搭配HA辅助元素和自动化实现,见下文
     page_3_plug_power_entity: sensor.xxxxxxxxxx                        #插座功率实体,如没有此功能,填none
    
  2. 添加HA相关辅助元素和自动化

    • 操作时间记录实体使用辅助元素实现

      • 进入设置->设备与服务->辅助元素,右下角点击创建辅助元素,拉到最低选择Template(模板),再选择第二个“传感器”,
      • 名称按你自己喜好填写,状态一栏,按以下代码填写,注意第一行内的switch['cuco_cp2d_b5cf_switch_status'],修改为你自己的实体ID
      {%- set entity = states.switch['cuco_cp2d_b5cf_switch_status'] -%}
      
      {%- if entity is none -%}
       --·--
      {%- else -%}
       {%- set state_names = {
         'on': '打开',
         'off': '关闭',
         'cool': '制冷',
         'heat': '加热',
         'fan_only': '送风',
         'dry': '除湿',
         'auto': '自动',
         'docked': '空闲',
         'idle': '空闲',
         'cleaning': '工作中',
         'returning': '工作中',
         'returnung': '工作中',
         'working': '工作中',
         'paused': '暂停',
         'error': '错误',
         'unknown': '未知',
         'unavailable': '离线',
         'offline': '离线'
       } -%}
      
       {%- set state_text = state_names.get(entity.state, '未知') -%}
       {%- set diff_seconds = (now() - entity.last_changed).total_seconds() -%}
      
       {%- if diff_seconds &lt; 60 -%}
         {%- set time_ago = '刚刚' -%}
       {%- elif diff_seconds &lt; 3600 -%}
         {%- set minutes = (diff_seconds / 60) | int -%}
         {%- set time_ago = minutes ~ '分钟前' -%}
       {%- elif diff_seconds &lt; 86400 -%}
         {%- set hours = (diff_seconds / 3600) | int -%}
         {%- set time_ago = hours ~ '小时前' -%}
       {%- else -%}
         {%- set days = (diff_seconds / 86400) | int -%}
         {%- set time_ago = days ~ '天前' -%}
       {%- endif -%}
      
       {{- state_text ~ '·' ~ time_ago -}}
      {%- endif -%}
      • 如正确配置,会看到下方显示对应的状态,保存后将此辅助元素的实体ID填入上方config.yaml对应位置
        3F4BAC9D-2C98-47C1-AE17-75FFCCFBF1A1.png
    • 定时功能需要同时使用辅助元素和自动化

      • 添加辅助元素,选择计时器,名称按自己需要修改,“还原HA启动时的状态和时间”按你需要勾选,然后复制该计时器timer实体ID到config.yaml对应位置
      • 进入设置->自动化与场景,右下角创建自动化,新建空白自动化,然后点击右上角选项进入yaml编辑模式
      • 将下方代码粘贴到yaml内,按注释修改对应的实体ID,然后保存即可
      alias: 2F-主卧-落地扇-智能定时与手动覆盖     #自动化名称,按需修改
      description: 处理定时关闭,并在手动关闭时自动取消定时器
      triggers:
       - event_type: timer.finished
         event_data:
           entity_id: timer.2f_zhu_wo_luo_di_shan_ding_shi  #上一步创建的计时器实体ID
         id: timer_finished
         trigger: event
       - entity_id: switch.8446937734fd_switch   #需要定时的开关实体ID
         to: "off"
         id: manual_off
         trigger: state
      actions:
       - choose:
           - conditions:
               - condition: trigger
                 id: timer_finished
             sequence:
               - condition: state
                 entity_id: switch.8446937734fd_switch      #需要定时的开关实体ID
                 state: "on"
               - target:
                   entity_id: switch.8446937734fd_switch      #需要定时的开关实体ID
                 action: switch.turn_off
                 data: {}
           - conditions:
               - condition: trigger
                 id: manual_off
             sequence:
               - condition: state
                 entity_id: timer.2f_zhu_wo_luo_di_shan_ding_shi  #上一步创建的计时器实体ID
                 state: active
               - target:
                   entity_id: timer.2f_zhu_wo_luo_di_shan_ding_shi  #上一步创建的计时器实体ID
                 action: timer.cancel
                 data: {}
      mode: single
      
  3. 编译并刷写esphome固件,这里以pip版 esphome cli做示例

    • 确保config.yaml修改完毕并保存好
    • 确保文件目录结构未做变动
    • 将领普s2置于下载模式,使用esptool chip-id检查连接
    • 执行:esphome run config.yaml --upload_speed 1152000进行编译
    • 编译完成,会提示选择对应的COM口烧录,烧录完成后,拔电重启即可进入新固件
    • 注意,线刷时,每次都要先手动进入下载模式,这颗芯片因为波特率问题,无法自动进入下载模式
    • 系统启动后,搜索并连接设备发出的wifi热点,按提示进行配网
  4. HA实体提供列表
    QQ20260806-145256.png
    QQ20260806-145310.png
    QQ20260806-145315.png



评分

参与人数 7金钱 +98 HASS币 +20 收起 理由
hungheo + 12 高手,这是高手!
sorrypqa + 20 高手,这是高手!
hhh. + 16 牛而逼之!
penguinmm + 10 高手,这是高手!
adamjensen + 10 感谢楼主分享!
cmxiaoxiao + 10 牛而逼之!
admin + 20 + 20 牛而逼之!

查看全部评分

回复

使用道具 举报

3

主题

58

回帖

1394

积分

金牌会员

积分
1394
金钱
1333
HASS币
0
发表于 昨天 15:08 | 显示全部楼层
请问怎么看硬件版本是否为v1.4?
回复

使用道具 举报

1

主题

52

回帖

1131

积分

金牌会员

积分
1131
金钱
1078
HASS币
0
发表于 昨天 16:38 来自手机 | 显示全部楼层
大哥牛的一批🤙,开整
回复

使用道具 举报

72

主题

392

回帖

4291

积分

元老级技术达人

积分
4291
金钱
3792
HASS币
200
 楼主| 发表于 昨天 16:56 | 显示全部楼层
tinatiao 发表于 2026-8-6 15:08
请问怎么看硬件版本是否为v1.4?

主板背面有标识


{5142FFF6-DE3E-4842-9772-E178F3D939E3}.png
回复

使用道具 举报

0

主题

149

回帖

1736

积分

金牌会员

积分
1736
金钱
1587
HASS币
0
发表于 昨天 18:28 | 显示全部楼层
太强了,家里的都上墙了,后边再补2个按照这个搞。
回复

使用道具 举报

3

主题

118

回帖

1201

积分

金牌会员

积分
1201
金钱
1080
HASS币
0
发表于 昨天 21:52 | 显示全部楼层
真不错,搞个试试看。
回复

使用道具 举报

3

主题

118

回帖

1201

积分

金牌会员

积分
1201
金钱
1080
HASS币
0
发表于 昨天 21:54 | 显示全部楼层
真是个大工程,感觉是重造了个。
回复

使用道具 举报

3

主题

74

回帖

839

积分

高级会员

积分
839
金钱
762
HASS币
0
发表于 昨天 22:16 来自手机 | 显示全部楼层
好厉害,这是写了多少行的配置,不亚于重新做一个了
回复

使用道具 举报

5

主题

242

回帖

5438

积分

元老级技术达人

积分
5438
金钱
5176
HASS币
40
发表于 19 小时前 | 显示全部楼层
这是重新造轮子了
回复

使用道具 举报

72

主题

392

回帖

4291

积分

元老级技术达人

积分
4291
金钱
3792
HASS币
200
 楼主| 发表于 19 小时前 | 显示全部楼层
wbc 发表于 2026-8-6 22:16
好厉害,这是写了多少行的配置,不亚于重新做一个了

7000行yaml,对比我另一个30000行的,这个算是小项目
回复

使用道具 举报

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

本版积分规则

Archiver|手机版|小黑屋|Hassbian ( 晋ICP备17001384号-1 )|网站地图

GMT+8, 2026-8-7 19:37 , Processed in 0.086636 second(s), 6 queries , Redis On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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