本帖最后由 花落花空 于 2024-8-9 21:10 编辑
8月9日更新:增加每半个小时提示休息,并一定时间后才能观看的设置
之前的自动化只限制了总的观看时间,但孩子一看是会停不下来的,这样肯定不行。单次限时安排上!
再之前的基础上,需要新增一个辅助元素值,用于记录单次时间。以及一个休息模式开关。然后又新增了一个儿童模式的开关,家长观看的时候关掉,就不会计时及关闭了。
然后创建一条自动化,条件是单次时间累计到30分钟的时候,打开休息模式,然后等待一定时间(我设的15分钟),再关闭休息模式,并把单次时间归0。
具体自化配置如下
alias: 电视每30分钟开启休息模式
description: ""
trigger:
- platform: numeric_state
entity_id:
- input_number.dian_shi_dan_ci_guan_kan_shi_jian
above: 29
condition: []
action:
- service: input_boolean.turn_on
metadata: {}
data: {}
target:
entity_id: input_boolean.dian_shi_xiu_xi_zhuang_tai
- delay:
hours: 0
minutes: 15
seconds: 0
milliseconds: 0
- service: input_boolean.turn_off
metadata: {}
data: {}
target:
entity_id: input_boolean.dian_shi_xiu_xi_zhuang_tai
- service: input_number.set_value
metadata: {}
data:
value: 0
target:
entity_id: input_number.dian_shi_dan_ci_guan_kan_shi_jian
mode: single
然后在之前的累计时间自动化的动作中加上单次时间的实体。这里直接贴上完整的配置,自行修改对应实体
alias: 电视使用时间计算
description: ""
trigger:
- platform: time_pattern
minutes: /1
alias: 每分钟检测一次
condition: []
action:
- alias: 在零点后清零计数
if:
- condition: time
after: "23:59:00"
before: "00:01:00"
then:
- service: input_number.set_value
target:
entity_id:
- input_number.guan_kan_shi_jian
- input_number.dian_shi_dan_ci_guan_kan_shi_jian
data:
value: 0
- service: input_number.set_value
data:
value: 150
target:
entity_id: input_number.yun_xu_guan_kan_shi_chang
- alias: 判断功率来累加已观看时间
if:
- condition: and
conditions:
- alias: 设置功率触发范围,当前是80-301
condition: numeric_state
entity_id: sensor.tv_socket_tv_socket_switch_power
above: 90
below: 301
- condition: state
entity_id: input_boolean.dian_shi_er_tong_mo_shi
state: "on"
then:
- alias: 累计观看时间
service: input_number.increment
data: {}
target:
entity_id:
- input_number.guan_kan_shi_jian
- input_number.dian_shi_dan_ci_guan_kan_shi_jian
mode: single
然后就是判断是否在看并限制的自动化了,同样直接贴上新的配置,
alias: 电视使用时间段控制
description: ""
trigger:
- alias: 检测电视插座的功率,用于判断电视是否打开了
platform: state
entity_id:
- sensor.tv_socket_tv_socket_switch_power
condition:
- condition: and
conditions:
- alias: 通过功率判断是否在看电视
condition: numeric_state
entity_id: sensor.tv_socket_tv_socket_switch_power
above: 74
below: 301
- condition: state
entity_id: input_boolean.dian_shi_er_tong_mo_shi
state: "on"
action:
- if:
- alias: 判断是否超过了允许观看时长
condition: and
conditions:
- condition: template
value_template: >-
{{ states('input_number.guan_kan_shi_jian') | float >
states('input_number.yun_xu_guan_kan_shi_chang') | float }}
alias: 对比已观看时长和设置的允许观看时长
then:
- alias: 推送即将关机的提示视频
service: media_player.play_media
data:
media_content_id: /local/关机提示.mp4
media_content_type: video
target:
entity_id:
- media_player.ke_ting_de_dian_shi
- media_player.ke_ting_dian_shi
- delay:
hours: 0
minutes: 0
seconds: 13
milliseconds: 0
alias: 等待13秒,使视频播放完毕
- service: script.tv_power
data: {}
alias: 执行关闭电视
- service: androidtv.adb_command
target:
entity_id: media_player.android_tv_192_168_2_15
data:
command: HOME
alias: 给电视盒子发送回到桌面的命令
alias: 超过总观看时间的提示
- alias: 单次观看了半个小时
if:
- condition: state
entity_id: input_boolean.dian_shi_xiu_xi_zhuang_tai
state: "on"
then:
- alias: 推送即将关机的提示视频
service: media_player.play_media
data:
media_content_id: /local/30分钟关机提示.mp4
media_content_type: video
target:
entity_id:
- media_player.ke_ting_de_dian_shi
- media_player.ke_ting_dian_shi
- delay:
hours: 0
minutes: 0
seconds: 13
milliseconds: 0
alias: 等待13秒,使视频播放完毕
- service: script.tv_power
data: {}
alias: 执行关闭电视
- service: androidtv.adb_command
target:
entity_id: media_player.android_tv_192_168_2_15
data:
command: HOME
alias: 给电视盒子发送回到桌面的命令
- alias: 不在可观看时间
if:
- alias: 设置开启和关闭的时间段
condition: time
before: input_datetime.kai_ji_shi_jian
enabled: true
after: input_datetime.guan_ji_shi_jian
then:
- alias: 推送即将关机的提示视频
service: media_player.play_media
data:
media_content_id: /local/电视未到时间.mp4
media_content_type: video
target:
entity_id:
- media_player.ke_ting_de_dian_shi
- media_player.ke_ting_dian_shi
- delay:
hours: 0
minutes: 0
seconds: 13
milliseconds: 0
alias: 等待13秒,使视频播放完毕
- service: script.tv_power
data: {}
alias: 执行关闭电视
- service: androidtv.adb_command
target:
entity_id: media_player.android_tv_192_168_2_15
data:
command: HOME
alias: 给电视盒子发送回到桌面的命令
关于使用到的提示视频,我丢个网盘链接自取:
https://www.123pan.com/s/GwTZVv-sZR53.html 提取码:0ed6
// 以下是之前的内容
先说一下楼主自己的设备情况:1:一台有几年的海信65寸电视。机身存储很小,自带系统弃用,使用电视盒子提供内容
2:电视插座带电量计量,通过功率可以直接判断是不是在看电视。客厅有个博联的RM3 mini,接入ha后可以红外开关电视
3:盒子是魔百盒M401A刷的ATV固件,通过投屏软件的dlan接入ha可以推送视频
孩子最近电视看的比较多,所以想着控制一下时间。翻论坛看到一个使用nodered的帖子,但本着环节越少越好的原则,决定试着直接用ha的自动化实现。
那么开始实际操作。
第一步:
首先,要知道看了多久的电视。
我通过翻看Ha的服务,发现了“input_number.increment”它可以对辅助元素input_number的数值进行递增。那么就先在辅助元素里面创建一个数值,比如input_number.guan_kan_shi_jian
像这样
然后,在自动化的触发条件里有时间模式,那么就可以设置每分钟执行一次
然后环境条件判断功率范围,在正常看电视的功率就执行服务input_number.increment对数值input_number.guan_kan_shi_jian进行加1
然后还需要y一条动作,当时间在23:59-00:01这个区间的时候,通过服务input_number.set_value把数值设为0。
完整的自动化代码如下,供参考。
alias: 电视使用时间计算
description: ""
trigger:
- platform: time_pattern
minutes: /1
alias: 每分钟检测一次
condition: []
action:
- alias: 在零点后清零计数
if:
- condition: time
after: "23:59:00"
before: "00:01:00"
then:
- service: input_number.set_value
target:
entity_id: input_number.guan_kan_shi_jian
data:
value: 0
- alias: 判断功率来累加已观看时间
if:
- condition: numeric_state
entity_id: sensor.tv_socket_power
above: 80
below: 301
alias: 设置功率触发范围,当前是80-301
then:
- service: input_number.increment
data: {}
target:
entity_id: input_number.guan_kan_shi_jian
alias: 累计观看时间
mode: single
ui编辑长这样。 提示: 复制代码,自动化切换yaml,粘贴完事儿 第二步:对电视进行关机控制
现在我们知道了电视的观看时间,就可以开始控制了。
我这里使用了电视插座的功率值sensor.tv_socket_power做触发条件
如果只在自动化设置里设定可以看多久,环境条件里加一个数字类状态,选input_number.guan_kan_shi_jian ,大于填一个数值,比如120,然后加上执行动作就可以了,像下面这样
alias: 电视使用时间段控制
description: ""
trigger:
- platform: state
entity_id:
- sensor.tv_socket_power
alias: 检测电视插座的功率,用于判断电视是否打开了
condition:
- condition: numeric_state
entity_id: sensor.tv_socket_power
above: 74
below: 301
alias: 通过功率判断是否在看电视
- condition: numeric_state
entity_id: input_number.guan_kan_shi_jian
above: 120
alias: 设置到120分钟就触发
action:
- alias: 推送即将关机的提示视频
service: media_player.play_media
data:
media_content_id: /local/关机提示.mp4
media_content_type: video
target:
entity_id:
- media_player.ke_ting_de_dian_shi
- media_player.ke_ting_dian_shi
- delay:
hours: 0
minutes: 0
seconds: 13
milliseconds: 0
alias: 等待13秒,使视频播放完毕
- service: script.tv_power
data: {}
alias: 执行关闭电视
- service: androidtv.adb_command
target:
entity_id: media_player.android_tv_192_168_2_15
data:
command: HOME
alias: 给电视盒子发送回到桌面的命令
不过这样如果要修改允许观看多久的时间还要进入自动化设置,一点都不优雅。而且我还需要对时间段进行控制。
所以我又新建了三个辅助元素。
input_number.yun_xu_guan_kan_shi_chang 设置允许观看多久
input_datetime.guan_ji_shi_jian 设置过了这个时间就关电视
input_datetime.kai_ji_shi_jian 设置在这个时间之前不能开。
然后下面是完整的自动化配置
alias: 电视使用时间段控制
description: ""
trigger:
- platform: state
entity_id:
- sensor.tv_socket_power
alias: 检测电视插座的功率,用于判断电视是否打开了
condition:
- alias: 检测两个关闭电视的条件
condition: or
conditions:
- alias: 判断是否在允许时段
condition: and
conditions:
- condition: time
after: input_datetime.guan_ji_shi_jian
before: input_datetime.kai_ji_shi_jian
enabled: true
alias: 设置开启和关闭的时间段
- alias: 判断是否超过了允许观看时长
condition: and
conditions:
- condition: template
value_template: >-
{{ states('input_number.guan_kan_shi_jian') | float >
states('input_number.yun_xu_guan_kan_shi_chang') | float }}
alias: 对比已观看时长和设置的允许观看时长
- condition: numeric_state
entity_id: sensor.tv_socket_power
above: 74
below: 301
alias: 通过功率判断是否在看电视
action:
- alias: 推送即将关机的提示视频
service: media_player.play_media
data:
media_content_id: /local/关机提示.mp4
media_content_type: video
target:
entity_id:
- media_player.ke_ting_de_dian_shi
- media_player.ke_ting_dian_shi
- delay:
hours: 0
minutes: 0
seconds: 13
milliseconds: 0
alias: 等待13秒,使视频播放完毕
- service: script.tv_power
data: {}
alias: 执行关闭电视
- service: androidtv.adb_command
target:
entity_id: media_player.android_tv_192_168_2_15
data:
command: HOME
alias: 给电视盒子发送回到桌面的命令
这里环境条件使用功率判断是否在看,然后对允许观看时段判断,和已观看时间与允许观看时间进行对比,满足其中一条,并且功率在观看范围就执行关机动作。
对应UI的样子
对应UI显示
对于关机的处理,我是先推送一个提示视频。然后等待13秒,在执行脚本script.tv_power,这个脚本是调用红外发送关机指令。可自行改成适合的。最后给电视盒子发个回桌面的命令。
然后把三个辅助元素放到ui里,完事儿。
好了,砖抛完了。
|