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

 找回密码
 立即注册
查看: 12886|回复: 12

[技术探讨] 如何将只有一种状态的Switch做成可以区分on或off的虚拟开关?

[复制链接]

16

主题

171

帖子

757

积分

高级会员

Rank: 4

积分
757
金钱
581
HASS币
40
发表于 2020-5-31 20:54:10 | 显示全部楼层 |阅读模式
本帖最后由 icase 于 2020-6-1 23:43 编辑

事情缘由是这样的:

最近一直论坛里学习各位大佬的红外遥控的方法。最后选择了还有存货的魅族红外遥控,按照 https://bbs.hassbian.com/thread-8083-1-1.html 实现了空调的遥控。在录码的时候顺便录了电视遥控器的码,但是遗憾的是,最后只解析出一个开关机的码。能实现开关机我已经很满足,但是接下来又遇到问题了。

这个问题就是只有一个码,开关机都用这个(点开以后,发送完红外码,开关又会自动弹回,所以始终是“关”的状态),在homekit里就不能方便的实现“开”和“关”的siri操作。于是我翻遍了论坛,也按照一些大佬的实例和官方的template文档自己写了下,想办法定义一个额外的虚拟开关来实现操作,其中为了判断电视开关机的状态,又加了一个虚拟传感器作为条件判断,来定时ping电视的状态。但最后由于自己代码小白的身份,耗费了8-9个小时也依然未搞定。

本来想一开始就发帖咨询,但又怕被骂伸手党,所以在折磨了一天之后,最终还是希望有大佬能帮忙解惑。

上面的情况我已经基本说清楚了,我再尝试总结一下:
1. 通过ESP32定义switch之后,只得到一个开关机一体的switch,假设这个名字叫:switch.mytv
2. 通过binary_sensor,我又设置了个定时ping电视状态的二次元sensor

目标:
在以上基础上,能再生成一个虚拟开关,以便可以在homekit里使用判断开关状态,方便用siri来开关电视。

先说声谢谢!

-----------

最终我用了如下的方法实现了,也供有类似的需求的坛友参考和指教。

switch:
  - platform: mqtt
    name: mytv
    command_topic: "home/mytv/switch/set" #此处为虚拟的topic,并不真实存在
    payload_on: "ON"
    payload_off: "OFF"
    optimistic: false
    qos: 0
    retain: true
    icon: mdi:television-classic
    
script:
  ac_mitv:
    sequence:
      - service: switch.turn_on
        data_template:
          entity_id: >
            {% if is_state('switch.mytv', 'off') %}switch.mytv_power
            {% else %}switch.mytv_power
            {% endif %}
            
automation:

  - alias: Mytv switch off
    trigger:
      payload: 'OFF'
      platform: mqtt
      topic: home/mytv/switch/set
  - condition:
      condition: state
      entity_id: binary_sensor.mytv
      state: 'on'
  - action:
      entity_id: script.ac_mitv
      service: script.toggle

  - alias: Mytv switch on
    trigger:
      payload: 'ON'
      platform: mqtt
      topic: home/mytv/switch/set
  - condition:
      condition: state
      entity_id: binary_sensor.mytv
      state: 'off'
  - action:
      entity_id: script.ac_mytv
      service: script.toggle


回复

使用道具 举报

0

主题

173

帖子

1403

积分

金牌会员

Rank: 6Rank: 6

积分
1403
金钱
1230
HASS币
0
发表于 2020-5-31 21:44:19 | 显示全部楼层
我自己是用電視的聯網狀態來確認電視是否有開啟
switch:
  - platform: template
    switches:
      sharp_tv:
        friendly_name: "電視"
        value_template: '{{ is_state("device_tracker.sharp_tv", "home") }}'
        turn_on:
          - condition: state
            entity_id: device_tracker.sharp_tv
            state: 'not_home'
          - service: switch.turn_on
            data:
              entity_id: switch.sharp_tv_power
        turn_off:
          - condition: state
            entity_id: device_tracker.sharp_tv
            state: 'home'
          - service: switch.turn_off
            data:
              entity_id: switch.sharp_tv_power
        icon_template: >-
          {% if is_state('device_tracker.sharp_tv', 'home') %}
            mdi:television
          {% else %}
            mdi:television-off
          {% endif %}


回复

使用道具 举报

16

主题

171

帖子

757

积分

高级会员

Rank: 4

积分
757
金钱
581
HASS币
40
 楼主| 发表于 2020-6-1 00:41:26 | 显示全部楼层
jasonlai79 发表于 2020-5-31 21:44
我自己是用電視的聯網狀態來確認電視是否有開啟

多谢!我Get到了。在发帖之后我曾尝试用mqtt虚拟topic来解决,也实现了相应的需求,但就是可能会有switch的开关不能和电视电源的真实状态相关联,看来我还是没看懂参数的问题,不知道switch里也可以用state参数,您这一回复,豁然开朗!
回复

使用道具 举报

33

主题

685

帖子

4373

积分

论坛元老

Rank: 8Rank: 8

积分
4373
金钱
3678
HASS币
50
发表于 2020-6-1 16:03:50 | 显示全部楼层
我是博联遥控红外控制电视,用脚本实现的


switch:
    - platform: template
        switches:
            bedroomfan:
              value_template: "{{ as_timestamp(states.script.fan_off.attributes.last_triggered) | int  < as_timestamp(states.script.fan_on.attributes.last_triggered)  | int }} "
              turn_on:
                service: script.fan_on
              turn_off:
                service: script.fan_off
                
                
# 风扇开关脚本script.yaml
                
fan_on:
  sequence:
    - service: broadlink.send
      data:
        host: 192.168.123.206
        packet: 
          - "JgBYAAABJpcSEhQSEBURFBEUERQRFBEUEzcSORI4EjgROhI4EBUSOBE5EToQFBITERURExQSEBURFBMSETkSORI4EDoTNxE5EQAFTQABJkwRAAxmAAEnSxMADQU="

fan_off:
  sequence:
    - service: broadlink.send
      data:
        host: 192.168.123.206
        packet: 
          - "JgBYAAABJpcSEhQSEBURFBEUERQRFBEUEzcSORI4EjgROhI4EBUSOBE5EToQFBITERURExQSEBURFBMSETkSORI4EDoTNxE5EQAFTQABJkwRAAxmAAEnSxMADQU="

回复

使用道具 举报

16

主题

171

帖子

757

积分

高级会员

Rank: 4

积分
757
金钱
581
HASS币
40
 楼主| 发表于 2020-6-1 16:44:11 | 显示全部楼层
本帖最后由 icase 于 2020-6-1 16:46 编辑
huang7dede 发表于 2020-6-1 16:03
我是博联遥控红外控制电视,用脚本实现的

感谢!不过魅族的不能直接使用红外码。我最后还是用了mqtt虚拟topic + 脚本 + 自动化
回复

使用道具 举报

16

主题

171

帖子

757

积分

高级会员

Rank: 4

积分
757
金钱
581
HASS币
40
 楼主| 发表于 2020-6-1 16:45:58 | 显示全部楼层
jasonlai79 发表于 2020-5-31 21:44
我自己是用電視的聯網狀態來確認電視是否有開啟

昨天又测试了很久,发现如果这样设置的话,开机的时候因为电视有启动-联网-状态判断这个延迟,switch按钮会回弹,所以最后还是用了mqtt+脚本+自动化,稍后我也把代码发出来。再次感谢
回复

使用道具 举报

2

主题

291

帖子

1502

积分

论坛积极会员

积分
1502
金钱
1211
HASS币
0
发表于 2020-6-1 17:50:27 | 显示全部楼层
这个是个硬文章啊,特地过来学习。
回复

使用道具 举报

0

主题

173

帖子

1403

积分

金牌会员

Rank: 6Rank: 6

积分
1403
金钱
1230
HASS币
0
发表于 2020-6-1 20:43:24 | 显示全部楼层
icase 发表于 2020-6-1 16:45
昨天又测试了很久,发现如果这样设置的话,开机的时候因为电视有启动-联网-状态判断这个延迟,switch按钮 ...

其實如果有功率偵測的插座也是可以用來作為開機判定
回复

使用道具 举报

16

主题

171

帖子

757

积分

高级会员

Rank: 4

积分
757
金钱
581
HASS币
40
 楼主| 发表于 2020-6-1 23:40:21 | 显示全部楼层
jasonlai79 发表于 2020-6-1 20:43
其實如果有功率偵測的插座也是可以用來作為開機判定

的确是,这样对状态判断就没有延时了
回复

使用道具 举报

3

主题

136

帖子

1478

积分

金牌会员

Rank: 6Rank: 6

积分
1478
金钱
1342
HASS币
0
发表于 2020-8-6 00:10:43 | 显示全部楼层
huang7dede 发表于 2020-6-1 16:03
我是博联遥控红外控制电视,用脚本实现的

你好。小白求助,为什么虚拟的按钮打开后会划回去。ON 没一会就OFF了
回复

使用道具 举报

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

本版积分规则

Archiver|手机版|小黑屋|Hassbian

GMT+8, 2024-4-27 07:59 , Processed in 0.150619 second(s), 31 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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