本帖最后由 bugensui 于 2023-1-15 16:12 编辑
目前我想实现这样的功能,在每天6点后,当家里任一成员,被人体传感器识别到(当天只触发一次,后面的成员不触发),就触发dlna音响,利于tts功能播报当天天气预报(ha装的是彩云天气),
3个难点,我不知道怎么弄,1,怎么样把每天6点后-24点前设为条件,2,怎么样只触发一次,用什么思路,3,怎么样在彩云天气里提取 当天天气成文字,赋值给 tts服务
请大佬指点
2023/1/15日更新,谢谢大佬(dscao )指点,已经完成了我想要的功能,相关代码思路如下,供新手参考!这个主要是给家里的父母用的,早上起来,就能听到当天的天气播报。
这个是自动化的逻辑代码,大家根据自己情况,修改,下面有代码解读
复制代码
alias: 入户门检测并语音播报天气预报
description: 人体运动检测每天7点后tts播放天气预报(当天仅一次)
trigger:
- type: motion
platform: device
device_id: 29ed2d4c12de88c9d69fd177cd6a00d1
entity_id: binary_sensor.lumi_lumi_sensor_motion_aq2_iaszone
domain: binary_sensor
condition: []
action:
- if:
- condition: and
conditions:
- condition: time
after: "07:00:00"
- condition: state
entity_id: counter.ttstian_qi_yu_bao_can_shu
state: "0"
then:
- service: script.1673699489033
data: {}
- delay:
hours: 0
minutes: 0
seconds: 2
milliseconds: 0
- service: counter.increment
data: {}
target:
entity_id: counter.ttstian_qi_yu_bao_can_shu
mode: single
复制代码
代码解释:
当入户门玄关处人体传感器(我家里客厅灯的开关处放了个aqara绿米人体传感器,我家里早上开灯或者干什么,必须会经过这个区域,大家可以根据自己家里实际情况部署)检测到有人,下面的动作选择如果就,如果达到什么条件,就触发相关动作,如果的条件,我设置了2个,1是时间必须是当天7点后,大家根据自己情况设置,2,我设置了个tts参数,这个参数要等于0,实际上就是辅助元素里的计数器,初始值是0,歩长是1,最好选中当 Home Assistant 启动时,还原为最近一次的值,不然HA重启后,会变0会乱。
这2个条件and都符合,才执行我想要的动作,动作:主要2个,1,执行tts语音播报天气预报的脚本,代码在下面。2,之前的条件TTS触发参数(辅助元素里的计数器)+1或者增加(调用的是counter.increment这个服务,实体选择辅助元素里的那个自己新建的计数器即可),这样当天就不触发这个自动化动作了。
alias: 语音播报天气预报
sequence:
- service: media_player.volume_set
data:
volume_level: 0.6
target:
entity_id: media_player.can_716928
- delay:
hours: 0
minutes: 0
seconds: 2
milliseconds: 0
- service: tts.edge_tts
data:
entity_id: media_player.can_716928
message: >-
{{ states("sensor.zzwtime") }}好,现在是北京时间:{{ states("sensor.time")
}},客厅温度为{{states("sensor.keting_temperature")|round
}}度、客厅湿度为{{states("sensor.zhi_neng_yao_kong_humidity")|round
}}%,今天天气{{state_attr("weather.wo_de_jia","forecast_hourly")
}},{{state_attr("weather.wo_de_jia","forecast_minutely")
}},室外温度{{states("sensor.wo_de_jia_wen_du")|round }}度。
mode: single
icon: mdi:weather-cloudy
复制代码
代码简单讲解,这个脚本,就是先设置dlna音响的音量为60%,然后延迟2秒,调用edge的tts服务,用dlna音响播放指定的文字内容(message )
{{ states("sensor.zzwtime") }}好,现在是北京时间:{{ states("sensor.time")
}},客厅温度为{{states("sensor.keting_temperature")|round
}}度、客厅湿度为{{states("sensor.zhi_neng_yao_kong_humidity")|round
}}%,今天天气{{state_attr("weather.wo_de_jia","forecast_hourly")
}},{{state_attr("weather.wo_de_jia","forecast_minutely")
}},室外温度{{states("sensor.wo_de_jia_wen_du")|round }}度。
复制代码
sensor.zzwtime是我自定义的一个传感器函数,代码如下,主要是根据当天时间,转换成是早上中午下午晚上等等这些, sensor.time是系统里内置的一个时间传感器,可以显示当天的时间,不含日期。这2个,需要加在 configuration.yaml,代码在下面, sensor.keting_temperature和 sensor.zhi_neng_yao_kong_humidity是我自己买的一个温湿度传感器,后面的就是彩云天气的实体里的当天的天气预报,当前的室外温度,我加了 round 处理,就是让他始终是整数,不是小数
sensor.zzwtime和sensor.time代码
复制代码
# 自定义Sensor.
- platform: template
sensors:
zzwtime:
friendly_name: 'zzwtime'
icon_template: mdi:clock-time-three-outline
value_template: "{% if now().hour >= 6 and now().hour < 9 %}早上{%- elif now().hour >= 9 and now().hour < 12 %}上午{%- elif now().hour >= 12 and now().hour < 13 %}中午{%- elif now().hour >= 13 and now().hour < 18 %}下午{%- elif now().hour >= 18 and now().hour < 24 %}晚上{% else %}凌晨{% endif %} "
复制代码
sensor:
# 日期和时间传感器
- platform: time_date
display_options:
- 'time'
- 'date'
- 'date_time'
- 'date_time_utc'
- 'date_time_iso'
- 'time_date'
- 'time_utc'
- 'beat'
复制代码