找回密码
 立即注册
搜索
查看: 185|回复: 8

[进阶教程] 跨平台智能家居打通——红外方案

[复制链接]

8

主题

132

回帖

626

积分

高级会员

积分
626
金钱
486
HASS币
0
发表于 昨天 19:04 | 显示全部楼层 |阅读模式
本帖最后由 a3d21 于 2025-7-1 19:07 编辑

智能家居平台有很多:小米、华为、涂鸦、aqara…,无法互通,很不方便。尤其是当买了多个平台设备时,每次操作都得想想用哪个平台APP,呼叫哪个语音助手去执行。
但几乎所有平台都支持红外(IR),而且红外是一种本地协议,可以用红外来本地化打通不同平台。
1 控制流程



                               
登录/注册后可看大图
cross-platform-smart-home.png
第一步,就是DIY一个IR接收器,用来接收自定义IR编码(建议使用NEC码)。
2 使用esphome制作IR接收器
使用esphome可以很容易编译固件,制作DIY设备,几乎0代码。
硬件可以使用 esp32/esp8266 + 红外接收头。可以买模块自己焊接,也买成品模块或者兼容设备,如ct30w。可参考 刷机教程 进行刷机。
我使用的是ct30w,以下是ct30w对应的配置文件。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
esphome:
  name: ir2ha

esp8266:
  board: esp01_1m

# Enable logging
logger:
  # level: DEBUG

web_server:
  port: 80

# Enable Home Assistant API
api:
  actions:
    - action: send_raw_ir
      variables:
        raw_data: 'int[]'
      then:
        - remote_transmitter.transmit_raw:
              code: !lambda 'return raw_data;'
              carrier_frequency: 38kHz
    - action: send_nec_ir
      variables:
        address: int
        command: int
      then:
        - remote_transmitter.transmit_nec:
            address: !lambda 'return address;' #0x1234
            command: !lambda 'return command;'  #0x78AB

ota:
  - platform: esphome
    password: ""

wifi:
  ssid: "1111"
  password: "11111111"

  # Enable fallback hotspot (captive portal) in case wifi connection fails
  ap:
    ssid: "ir2ha Fallback Hotspot"  # 通电后登录配置WIFI
    password: "66668888"

captive_portal:

output:
  - platform: gpio
    id: LEDD5
    pin:
      number: GPIO15

remote_receiver:
  - pin:
      number: GPIO5
      inverted: True
    id: IR_receiver
    tolerance: 55%
    dump: [nec]
    on_nec: # 使用nec码
      then:
        - homeassistant.event:
            event: esphome.ir_received
            data:
              address: !lambda 'return x.address;'
              command: !lambda 'return x.command;'
              protocol: "nec"
              device: "ir2ha"

remote_transmitter:
  - pin: GPIO14
    carrier_duty_percent: 50%
    id: IR_transmitter
    on_transmit:
      then:
        - output.turn_on: LEDD5
    on_complete:
      then:
        - output.turn_off: LEDD5


button:         
  - platform: template
    name: "media_fan_power" # 测试用
    on_press:
      then:
        - remote_transmitter.transmit_raw:
            code: [9018, -4395, 634, -1594, 635, -480, 633, -481, 634, -480, 634, -481, 634, -480, 634, -482, 633, -480, 634, -481, 635, -1593, 634, -1595, 634, -1595, 633, -1595, 634, -1594, 634, -1595, 633, -1599, 631, -1594, 633, -1595, 634, -481, 634,
                 -480, 634, -480, 634, -480, 634, -480, 634, -480, 634, -480, 634, -481, 634, -1594, 634, -1594, 634, -1596, 633, -1594, 634, -1595, 634, -1594, 634, -1595, 634, -1594, 634, -480, 635, -480, 634, -480, 634, -481, 634, -479, 634, -481, 634, -480, 634,
                 -481, 633, -1594, 635, -1594, 635, -1594, 634, -1594, 634, -1595, 634, -1594, 634]
            carrier_frequency: 38kHz

  - platform: template
    name: "media_fan_speed"
    on_press:
      then:
        - remote_transmitter.transmit_raw:
            code: [9017, -4392, 635, -1595, 634, -480, 634, -480, 634, -481, 633, -481, 634, -480, 634, -481, 634, -480, 634, -480, 634, -1595, 634, -1595, 634, -1595, 635, -1595, 634, -1595, 634, -1595, 635, -1595, 634, -1595, 634, -1595, 634, -1595, 634,
                  -480, 634, -481, 634, -481, 634, -480, 633, -481, 634, -481, 634, -480, 634, -481, 633, -1595, 634, -1595, 634, -1595, 634, -1595, 634, -1595, 634, -1594, 634, -1595, 634, -1595, 634, -480, 634, -480, 634, -480, 635, -480, 634, -480, 634, -480, 635,
                  -480, 634, -480, 634, -1595, 634, -1594, 633, -1596, 634, -1595, 634, -1595, 634]
            carrier_frequency: 38kHz
3 测试IR转发HA事件
断电重启IR接收器,Home Assistant设备页面会自动发现设备,将其添加进来。
到“开发者工具”->“动作”标签页,可以测试发自定义NEC码。NEC码由address和command两个uint16(0-65535)组成(省略repeats)。

                               
登录/注册后可看大图
从路由器查看IR接收器地址,浏览器访问,可查看红外接收日志。
Home Assistant至“开发者工具”->“事件”标签页,测试红外转发是否成功。

                               
登录/注册后可看大图
4 自定义IR码并配置自动化
按需自定义NEC码功能,最好用文档记录
1
2
3
4
5
6
addr: 6666
10001  开台灯
10002  关台灯
10003  开除湿机
10004  关除湿机
...
在红外音箱上,创建相应红外设备,用发自定义NEC码动作对设备学习。

                               
登录/注册后可看大图
Home Assistant上定义自动化,响应红外事件操作。

                               
登录/注册后可看大图
如果使用node-red,配置起来更直观。

                               
登录/注册后可看大图
总结
这种打通方式,原理是为Home Assistant制作一个红外遥控接收器,把音箱当遥控器使用。
实际上,IR接收器也能发IR,当房子有多个IR接收器时,可以进行IR中继。

                               
登录/注册后可看大图
ir-relay.png
更多有趣玩法期待你来解锁


回复

使用道具 举报

25

主题

361

回帖

1574

积分

金牌会员

积分
1574
金钱
1188
HASS币
0
发表于 昨天 22:49 | 显示全部楼层
红外最大的问题在于只能控制没有状态。
回复

使用道具 举报

8

主题

99

回帖

366

积分

中级会员

积分
366
金钱
259
HASS币
0
发表于 昨天 22:55 | 显示全部楼层
还有部分音箱没有红外功能
回复

使用道具 举报

8

主题

132

回帖

626

积分

高级会员

积分
626
金钱
486
HASS币
0
 楼主| 发表于 昨天 23:09 | 显示全部楼层
itispip 发表于 2025-7-1 22:49
红外最大的问题在于只能控制没有状态。

是的,所以“开”和“关”尽量拆分成不同指令,做成幂等的。
能跨平台控制已经很不错了
回复

使用道具 举报

8

主题

132

回帖

626

积分

高级会员

积分
626
金钱
486
HASS币
0
 楼主| 发表于 昨天 23:13 | 显示全部楼层
本帖最后由 a3d21 于 2025-7-1 23:20 编辑
hlqhome 发表于 2025-7-1 22:55
还有部分音箱没有红外功能

可以买个支持学码和接不同平台的红外控制器(如涂鸦),可以曲线实现;不过需要云上绕一下,反应会慢点。
回复

使用道具 举报

24

主题

160

回帖

1440

积分

论坛UI达人

积分
1440
金钱
1251
HASS币
50
发表于 4 小时前 | 显示全部楼层
没有状态反馈是硬伤,命令没办法确认执行状态,也没法查询实时状态
回复

使用道具 举报

31

主题

1453

回帖

6676

积分

元老级技术达人

积分
6676
金钱
5167
HASS币
100
发表于 3 小时前 | 显示全部楼层
看着就累,还是从最开始就规划清楚,避免浪费精力
回复

使用道具 举报

8

主题

132

回帖

626

积分

高级会员

积分
626
金钱
486
HASS币
0
 楼主| 发表于 2 小时前 | 显示全部楼层
gasment 发表于 2025-7-2 10:04
没有状态反馈是硬伤,命令没办法确认执行状态,也没法查询实时状态

确实,不过跨平台基本都有这问题
回复

使用道具 举报

8

主题

132

回帖

626

积分

高级会员

积分
626
金钱
486
HASS币
0
 楼主| 发表于 2 小时前 | 显示全部楼层
25989406 发表于 2025-7-2 11:22
看着就累,还是从最开始就规划清楚,避免浪费精力

主要用米家,这个折腾主要是好玩哈哈
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-7-2 14:28 , Processed in 0.450087 second(s), 7 queries , MemCached On.

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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