某些网络设备,比如:智能电视,小米盒子,智能机顶盒等等这些设备,开关机的遥控码都是一个键(一个码),这样呢,当电视是开机状态时,你使用了家庭影院“联动自动化”开机时,也会发出一个开关码,导致,其他的设备都正常开启了,但电视却关机了,怎样解决这个问题呢?下面我们用:ping传感器 + service_template语法 来解决这个问题!
首先,先建立ping传感器.我们应该获取到受控网络设备的ip地址,并把它的IP地址通过路由器的dhcp手动分配,固定下来,本文中,Sharp TV的ip地址是192.168.1.209
注:本文中没有使用HomeAssitant的官方组件ping和ping binary sensor,是因为“延迟太大”,弃用。小米论坛有人用米家门磁,diy一个USB“开机状态回馈器”,我觉得用于“对付没有网络功能的电视”是个不错的方法,但还是需要花钱和动手,而电视目前大多数都带wifi功能了,楼主这个方法,一分钱也不用花……
第一步:启动putty
第二步:进入HomeAssitant的主目录
cd /home/homeassistant/.homeassistant
第三步:建立一个ping_xxx.sh文件
sudo nano ping_xxx.sh
第四步:将下面的内容,复制粘贴到编辑器里
#! /bin/bash
ping -w 5 192.168.1.xxx > /dev/null 2>&1
if [ $? -eq 0 ]; then
echo "on"
else
echo "off"
fi
第五步:将上面xxx改成你想要ping的IP地址的最后三个数字,比如192.168.1.209,那就把xxx改成209
第六步:键盘输入Ctrl+X,然后Y键,保存退出。
第七步:将刚才的ping_xxx.sh文件,改名为ping_209.sh(数字要和第五步保持一致)
sudo mv ping_xxx.sh ping_209.sh
第八步:给ping_209.sh文件,赋予“可执行”权限
sudo chmod 777 ping_209.sh
第九步:执行ping_209.sh文件,看看执行结果是否正确
如果192.168.1.209这台电脑是“开机状态”,putty屏幕上将返回结果“on”;否则,将返回结果“off”。
##################putty上的工作结束,用windows资源管理器打开HA的设置文件configuration.yaml########
添加如下内容:
binary_sensor:
platform: command_line
scan_interval: 30
name: mibox
command: "/home/homeassistant/.homeassistant/ping_209.sh"
payload_on: "on"
payload_off: "off"
保存并重启HomeAssitant
再来建立这个设备(智能电视)input_boolean虚拟开关
input_boolean:
TV:
name: Sharp_TV
initial: off
下面这一步非常重要!一定要搞清楚逻辑关系!把broadlink对应的Sharp_TV的遥控码中,关机码,改成一个“废码”,也就是不起任何实际作用的发射码
- platform: broadlink
host: 192.168.1.xxx
mac: 'b4:43:0d:xx:xx:xx'
switches:
reciever:
command_on: 'JgDQACITFBIULxMvFBIULxQSFC8TExQuFC8UAAFgIhMUEhQvEy8UEhQvFBIULxMTFC4ULxQAAWAiExMTFC4ULxQSFC8TExQuFBMULhQvEwABYSITExMULhQvFBIULxMTFC4UExMvFC8TAAFhIhMTExQuFC8UEhQvExMULhQTFC4ULxMAAWEiExMTFC4ULxQSFC8TExQuFBMULhQvEwABYSITFBIULxMvFBIULxQSFC8TExQuFC8UAAFgIhMUEhQvEy8UEhQvFBIULhQTFC4ULxMADQUAAAAAAAAAAA=='
###下面这个码,就是一个没有内容的遥控器“废码”
command_off: ''
friendly_name: 'Sharp_TV_On_Off'
接下来,为这个虚拟开关,使用service_template语法来建立对应的automation
- alias: "Sharp_TV inputboolean turn on"
trigger:
platform: state
entity_id: input_boolean.Sharp_TV
to: 'on'
action:
- service_template: >
{%- if is_state('binary_sensor.Sharp_TV ', 'off') -%}
switch.turn_on
{%- else -%}
switch.turn_off
{%- endif %}
entity_id: switch.Sharp_TV _on_off
- alias: "Sharp_TV inputboolean turn off"
trigger:
platform: state
entity_id: input_boolean.Sharp_TV
to: 'off'
action:
- service_template: >
{%- if is_state('binary_sensor.Sharp_TV ', 'on') -%}
switch.turn_on
{%- else -%}
switch.turn_off
{%- endif %}
entity_id: switch.Sharp_TV_on_off
接下来,你就可以用input_boolean.sharp_tv来做测试,绝对不会出现开关机按键和电视状态“相反”的问题了!
|