mzlshizhu
发表于 2023-1-28 21:41:49
sirakawa 发表于 2023-1-16 16:45
现在是根据天气预报,提前几个小时语音预警,以及出门开门时候播报天气空气信息。 ...
大佬求一下代码学习学习
sirakawa
发表于 2023-1-29 17:28:03
mzlshizhu 发表于 2023-1-28 21:41
大佬求一下代码学习学习
简单粗暴~出门时候进行3小时判断和提醒。
其实定义几个LIST循环能更有灵活性,不过暂时没需求,就这样了。
#------------------------------------------------------------------------------#
# 离家时天气提醒
#------------------------------------------------------------------------------#
- alias: Door Room Goout Air Alart
id: door_room_goout_air_alart
trigger:
- platform: state
entity_id: binary_sensor.door_room_door
to: "on"
condition:
# 门内有人
- condition: state
entity_id: binary_sensor.door_room_motion
state: "on"
# 门外无人
- condition: state
entity_id: binary_sensor.door_room_outdoor_motion_goout
state: "off"
# 仅限非睡眠时段
- condition: time
after: "06:50:00"
before: "22:30:00"
variables:
varAlartText: >-
{% set msg = "" %}
{% set skycon1 = states.sensor.cyweatherforecast.attributes.result.hourly.skycon.value %}
{% set skycon2 = states.sensor.cyweatherforecast.attributes.result.hourly.skycon.value %}
{% set skycon3 = states.sensor.cyweatherforecast.attributes.result.hourly.skycon.value %}
{% if skycon1 == "LIGHT_RAIN" or skycon2 == "LIGHT_RAIN" or skycon3 == "LIGHT_RAIN" %}
{% set msg = "3小时内有小雨,注意带伞" %}
{% endif %}
{% if skycon1 == "MODERATE_RAIN" or skycon2 == "MODERATE_RAIN" or skycon3 == "MODERATE_RAIN" %}
{% set msg = "3小时内有中雨,注意带伞" %}
{% endif %}
{% if skycon1 == "HEAVY_RAIN" or skycon2 == "HEAVY_RAIN" or skycon3 == "HEAVY_RAIN" %}
{% set msg = "3小时内有大雨,注意带伞" %}
{% endif %}
{% if skycon1 == "STORM_RAIN" or skycon2 == "STORM_RAIN" or skycon3 == "STORM_RAIN" %}
{% set msg = "3小时内有暴雨,没事就别出去了" %}
{% endif %}
{% if skycon1 == "LIGHT_SNOW" or skycon2 == "LIGHT_SNOW" or skycon3 == "LIGHT_SNOW" %}
{% set msg = "3小时内有小雪,注意带伞" %}
{% endif %}
{% if skycon1 == "MODERATE_SNOW" or skycon2 == "MODERATE_SNOW" or skycon3 == "MODERATE_SNOW" %}
{% set msg = "3小时内有中雪,注意带伞" %}
{% endif %}
{% if skycon1 == "HEAVY_SNOW" or skycon2 == "HEAVY_SNOW" or skycon3 == "HEAVY_SNOW" %}
{% set msg = "3小时内有大雪,注意带伞" %}
{% endif %}
{% if skycon1 == "STORM_SNOW" or skycon2 == "STORM_SNOW" or skycon3 == "STORM_SNOW" %}
{% set msg = "3小时内有暴雪,没事就别出去了" %}
{% endif %}
{% set skycon1 = states.sensor.cyweather.attributes.result.realtime.skycon %}
{% if skycon1 == "LIGHT_RAIN" %}
{% set msg = "正在下小雨,注意带伞" %}
{% endif %}
{% if skycon1 == "MODERATE_RAIN" %}
{% set msg = "正在下中雨,注意带伞" %}
{% endif %}
{% if skycon1 == "HEAVY_RAIN" %}
{% set msg = "正在下大雨,注意带伞" %}
{% endif %}
{% if skycon1 == "STORM_RAIN" %}
{% set msg = "正在下暴雨,没事就别出去了" %}
{% endif %}
{% if skycon1 == "LIGHT_SNOW" %}
{% set msg = "正在下小雪,注意带伞" %}
{% endif %}
{% if skycon1 == "MODERATE_SNOW" %}
{% set msg = "正在下中雪,注意带伞" %}
{% endif %}
{% if skycon1 == "HEAVY_SNOW" %}
{% set msg = "正在下大雪,注意带伞" %}
{% endif %}
{% if skycon1 == "STORM_SNOW" %}
{% set msg = "正在下暴雪,没事就别出去了" %}
{% endif %}
{% if states("sensor.cyweather_outside_aqi") | int > 129 %}
{% if msg != "" %}
{% set msg = msg + "," %}
{% endif %}
{% set msg = msg +"室外污染指数为" + states("sensor.cyweather_outside_aqi") + ",记得戴口罩" %}
{% endif %}
{{ msg }}
action:
# TTS
- service: >-
{% if varAlartText == "" %}
script.none
{% else %}
script.miai_tts
{% endif %}
data_template:
message: >-
{{ varAlartText }}
mzlshizhu
发表于 2023-1-29 19:36:49
sirakawa 发表于 2023-1-29 17:28
简单粗暴~出门时候进行3小时判断和提醒。
其实定义几个LIST循环能更有灵活性,不过暂时没需求,就这样了 ...
虽然很多看不懂,但还是很有启发,感谢大佬
mzlshizhu
发表于 2023-1-29 19:42:34
谢谢大佬 成功装上了,大佬请教下,咱们这个怎么实现播报当前天气和未来3小时天气呀
sirakawa
发表于 2023-1-29 22:01:02
本帖最后由 sirakawa 于 2023-1-29 22:13 编辑
mzlshizhu 发表于 2023-1-29 19:42
谢谢大佬 成功装上了,大佬请教下,咱们这个怎么实现播报当前天气和未来3小时天气呀 ...
我是未来3小时天气都是独立的SENSOR
自动化用STATE变更触发就好了。
不过需要用Input_boolean之类的做一些判断,防止天气一变化就播报烦。比如一天一次之类的。
当前的天气并没有做播报,已经在下雨下雪,播报也没啥用了。只有上面的代码出门时候会提示一下带伞。
sirakawa
发表于 2023-1-29 22:10:42
播报的内容那里我也单独弄了个sensor比较省事。
cyweather_rainfall_intensity_in_03_hour_new:
value_template: >
{# 定义LIST #}
{% set rainfall = namespace(time1="0", time2="0", data1="无", data2="无") %}
{% set skyconList = .value, states.sensor.cyweatherforecast.attributes.result.hourly.skycon.value, states.sensor.cyweatherforecast.attributes.result.hourly.skycon.value] %}
{% set skyconKey1List = ["LIGHT_RAIN","MODERATE_RAIN","HEAVY_RAIN","STORM_RAIN","LIGHT_SNOW","MODERATE_SNOW","HEAVY_SNOW","STORM_SNOW"] %}
{% set skyconKey2List = ["小雨","中雨","大雨","暴雨","小雪","中雪","大雪","暴雪"] %}
{# 循环判断123小时预报的天气,保存第一次的异常天气和最后一次的异常天气 #}
{% for skycon in skyconList %}
{% set outer_loop = loop %}
{% for skyconKey1 in skyconKey1List %}
{% if skycon == skyconKey1 %}
{% if rainfall.time1 == "0" %}
{% set rainfall.time1 = outer_loop.index %}
{% set rainfall.data1 = skyconKey2List %}
{% else %}
{% set rainfall.time2 = outer_loop.index %}
{% set rainfall.data2 = skyconKey2List %}
{% endif %}
{% endif %}
{% endfor %}
{% endfor %}
{# 无异常天气就返回无 #}
{% if rainfall.time1 == "0" or rainfall.time1 == "0" %}
{{- "无" -}}
{% else %}
{# 编辑第一次的异常天气 #}
{{- rainfall.time1 | string + "小时内会下" + rainfall.data1 -}}
{# 如果最后一次异常天气和第一次不同,就继续播报天气变化 #}
{%- if rainfall.time1 | int < rainfall.time2 | int and rainfall.data1 != rainfall.data2 %}
{{- ",并在之后" + (rainfall.time2 - rainfall.time1) | string +"小时内变为" + rainfall.data2 -}}
{% endif -%}
{% endif %}
mzlshizhu
发表于 2023-2-1 21:44:05
sirakawa 发表于 2023-1-29 22:10
播报的内容那里我也单独弄了个sensor比较省事。
感谢大佬分享
mzlshizhu
发表于 2023-2-1 21:48:55
sirakawa 发表于 2023-1-29 22:10
播报的内容那里我也单独弄了个sensor比较省事。
大佬 你是怎么判断是否是要出门的,检测到家里有人的情况下,打开门就播报一次吗?
sirakawa
发表于 2023-2-1 21:54:22
本帖最后由 sirakawa 于 2023-2-1 21:56 编辑
mzlshizhu 发表于 2023-2-1 21:48
大佬 你是怎么判断是否是要出门的,检测到家里有人的情况下,打开门就播报一次吗? ...
我的门不支持接入,所以用的人体传感器。
简单来说就是里面外面各一个,开门时候,里面有人外面没人,那就是里面人要出去。
外面那个要弄好位置和角度,可以做到对门有人出门时候是off,有送外卖啥的时候是on,减少打扰和误操作。
当然,这么设计,只是开门去门口拿东西也会有语音提示,不过我是觉得无所谓。想要解决其实挺困难的。需要在你还没出门的时候识别到你到底要不要出门。。。
如果你的门支持上提锁门的话,可以上提锁门的时候提示就好了。不过要把喇叭放在门口保证你在外面而且关上门了还能听的到。
mzlshizhu
发表于 2023-2-1 22:17:38
sirakawa 发表于 2023-2-1 21:54
我的门不支持接入,所以用的人体传感器。
简单来说就是里面外面各一个,开门时候,里面有人外面没人,那就 ...
有道理 多谢!