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

 找回密码
 立即注册
查看: 2471|回复: 13

[进阶教程] 8.9日更新! 玩转自动化,控制孩子看电视或其它的时间

[复制链接]

16

主题

269

帖子

2819

积分

论坛DIY达人

积分
2819
金钱
2535
HASS币
60
发表于 2024-5-29 11:24:32 | 显示全部楼层 |阅读模式
本帖最后由 花落花空 于 2024-8-9 21:10 编辑

8月9日更新:增加每半个小时提示休息,并一定时间后才能观看的设置

之前的自动化只限制了总的观看时间,但孩子一看是会停不下来的,这样肯定不行。单次限时安排上!
再之前的基础上,需要新增一个辅助元素值,用于记录单次时间。以及一个休息模式开关。然后又新增了一个儿童模式的开关,家长观看的时候关掉,就不会计时及关闭了。
拼接图 (2).jpeg

然后创建一条自动化,条件是单次时间累计到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

时间累加.png
ui编辑长这样。
提示:
微信图片_20240529112130.png
复制代码,自动化切换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的样子

对应UI显示

对于关机的处理,我是先推送一个提示视频。然后等待13秒,在执行脚本script.tv_power,这个脚本是调用红外发送关机指令。可自行改成适合的。最后给电视盒子发个回桌面的命令。

然后把三个辅助元素放到ui里,完事儿。
设置ui.png

好了,砖抛完了。


单次时间实体和儿童模式开关

单次时间实体和儿童模式开关
拼接图 (1).jpeg

评分

参与人数 3金钱 +30 收起 理由
bainiu + 10 感谢楼主分享!
summ99111 + 8 感谢楼主分享!
隔壁的王叔叔 + 12 感谢楼主分享!

查看全部评分

回复

使用道具 举报

10

主题

1332

帖子

4252

积分

论坛元老

Rank: 8Rank: 8

积分
4252
金钱
2920
HASS币
0
发表于 2024-5-29 11:52:50 | 显示全部楼层
感谢楼主分享
回复

使用道具 举报

75

主题

1976

帖子

8181

积分

元老级技术达人

积分
8181
金钱
6155
HASS币
430

活跃会员教程狂人

发表于 2024-5-29 11:58:44 | 显示全部楼层
我还再用老的组件统计时间:
sensor:
  - platform: history_stats
    name: tv_time_on
    entity_id: media_player.tv
    state: 'on'
    type: time
    start: '{{ now().replace(hour=0).replace(minute=0).replace(second=0) }}'
    end: '{{ now() }}'


可怜的孩子。
所有过往,皆为序章。
回复

使用道具 举报

16

主题

269

帖子

2819

积分

论坛DIY达人

积分
2819
金钱
2535
HASS币
60
 楼主| 发表于 2024-5-29 12:14:03 | 显示全部楼层
咸味土豆 发表于 2024-5-29 11:58
我还再用老的组件统计时间:

惊现大佬,我没用电视自带系统,但统计盒子的应该也行。不过这个是只要开着就统计吧
回复

使用道具 举报

75

主题

1976

帖子

8181

积分

元老级技术达人

积分
8181
金钱
6155
HASS币
430

活跃会员教程狂人

发表于 2024-5-29 12:57:57 | 显示全部楼层
本帖最后由 咸味土豆 于 2024-5-29 12:59 编辑
花落花空 发表于 2024-5-29 12:14
惊现大佬,我没用电视自带系统,但统计盒子的应该也行。不过这个是只要开着就统计吧 ...

嗯,以前好像是L大佬分享的,这个也是每天清零,统计一种状态持续的时间。你这个就很有用了,联动控制。让孩子只能哇哇大哭啊。
所有过往,皆为序章。
回复

使用道具 举报

66

主题

779

帖子

4407

积分

论坛元老

Rank: 8Rank: 8

积分
4407
金钱
3623
HASS币
20
发表于 2024-5-29 13:04:27 | 显示全部楼层
学习了
之前我那个是洗衣机统计时间和功率并提醒
回复

使用道具 举报

26

主题

211

帖子

2274

积分

论坛技术达人

积分
2274
金钱
2058
HASS币
20
发表于 2024-5-29 13:52:20 | 显示全部楼层
用这个 mediasession2mqtt-1.1.0.apk (136.09 KB, 下载次数: 9)


回复

使用道具 举报

0

主题

20

帖子

123

积分

注册会员

Rank: 2

积分
123
金钱
103
HASS币
0
发表于 2024-5-29 14:39:53 | 显示全部楼层
感觉好复杂啊
回复

使用道具 举报

16

主题

269

帖子

2819

积分

论坛DIY达人

积分
2819
金钱
2535
HASS币
60
 楼主| 发表于 2024-5-29 15:44:38 | 显示全部楼层

抄作业的话复制粘贴,然后改判断实体就行了,,至于推送关机提示视频这些都可以省去,直接执行关电视就行。当然累计时间的那个数值得创建一个。需要在ui设置时间就加上另外一个数值和两个时间
回复

使用道具 举报

0

主题

20

帖子

123

积分

注册会员

Rank: 2

积分
123
金钱
103
HASS币
0
发表于 2024-5-29 15:51:38 | 显示全部楼层
暂时我还感觉抄不来,等我潜心研究研究,再过来抄作业
回复

使用道具 举报

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

本版积分规则

Archiver|手机版|小黑屋|Hassbian

GMT+8, 2024-11-24 22:44 , Processed in 0.175205 second(s), 36 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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