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

 找回密码
 立即注册
楼主: dscao

[经验分享] 彩云天气极端天气预警提醒的自动化示例分享

[复制链接]

1

主题

105

帖子

515

积分

高级会员

Rank: 4

积分
515
金钱
410
HASS币
0
发表于 2023-1-28 21:41:49 | 显示全部楼层
sirakawa 发表于 2023-1-16 16:45
现在是根据天气预报,提前几个小时语音预警,以及出门开门时候播报天气空气信息。 ...

大佬求一下代码学习学习
回复

使用道具 举报

17

主题

799

帖子

5732

积分

论坛元老

Rank: 8Rank: 8

积分
5732
金钱
4928
HASS币
0
发表于 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[0].value %}
      {% set skycon2 = states.sensor.cyweatherforecast.attributes.result.hourly.skycon[1].value %}
      {% set skycon3 = states.sensor.cyweatherforecast.attributes.result.hourly.skycon[2].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 }}

评分

参与人数 1金钱 +20 收起 理由
dscao + 20 感谢分享!

查看全部评分

回复

使用道具 举报

1

主题

105

帖子

515

积分

高级会员

Rank: 4

积分
515
金钱
410
HASS币
0
发表于 2023-1-29 19:36:49 | 显示全部楼层
sirakawa 发表于 2023-1-29 17:28
简单粗暴~出门时候进行3小时判断和提醒。
其实定义几个LIST循环能更有灵活性,不过暂时没需求,就这样了 ...

虽然很多看不懂,但还是很有启发,感谢大佬
回复

使用道具 举报

1

主题

105

帖子

515

积分

高级会员

Rank: 4

积分
515
金钱
410
HASS币
0
发表于 2023-1-29 19:42:34 | 显示全部楼层
谢谢大佬 成功装上了,大佬请教下,咱们这个怎么实现播报当前天气和未来3小时天气呀
回复

使用道具 举报

17

主题

799

帖子

5732

积分

论坛元老

Rank: 8Rank: 8

积分
5732
金钱
4928
HASS币
0
发表于 2023-1-29 22:01:02 | 显示全部楼层
本帖最后由 sirakawa 于 2023-1-29 22:13 编辑
mzlshizhu 发表于 2023-1-29 19:42
谢谢大佬 成功装上了,大佬请教下,咱们这个怎么实现播报当前天气和未来3小时天气呀 ...

我是未来3小时天气都是独立的SENSOR
自动化用STATE变更触发就好了。
不过需要用Input_boolean之类的做一些判断,防止天气一变化就播报烦。比如一天一次之类的。
当前的天气并没有做播报,已经在下雨下雪,播报也没啥用了。只有上面的代码出门时候会提示一下带伞。
回复

使用道具 举报

17

主题

799

帖子

5732

积分

论坛元老

Rank: 8Rank: 8

积分
5732
金钱
4928
HASS币
0
发表于 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 = [states.sensor.cyweatherforecast.attributes.result.hourly.skycon[0].value, states.sensor.cyweatherforecast.attributes.result.hourly.skycon[1].value, states.sensor.cyweatherforecast.attributes.result.hourly.skycon[2].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[loop.index-1] %}
                {% else %}
                  {% set rainfall.time2 = outer_loop.index %}
                  {% set rainfall.data2 = skyconKey2List[loop.index-1] %}
                {% 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 %}

评分

参与人数 1金钱 +20 收起 理由
dscao + 20 感谢分享!

查看全部评分

回复

使用道具 举报

1

主题

105

帖子

515

积分

高级会员

Rank: 4

积分
515
金钱
410
HASS币
0
发表于 2023-2-1 21:44:05 | 显示全部楼层
sirakawa 发表于 2023-1-29 22:10
播报的内容那里我也单独弄了个sensor比较省事。

感谢大佬分享
回复

使用道具 举报

1

主题

105

帖子

515

积分

高级会员

Rank: 4

积分
515
金钱
410
HASS币
0
发表于 2023-2-1 21:48:55 | 显示全部楼层
sirakawa 发表于 2023-1-29 22:10
播报的内容那里我也单独弄了个sensor比较省事。

大佬 你是怎么判断是否是要出门的,检测到家里有人的情况下,打开门就播报一次吗?
回复

使用道具 举报

17

主题

799

帖子

5732

积分

论坛元老

Rank: 8Rank: 8

积分
5732
金钱
4928
HASS币
0
发表于 2023-2-1 21:54:22 | 显示全部楼层
本帖最后由 sirakawa 于 2023-2-1 21:56 编辑
mzlshizhu 发表于 2023-2-1 21:48
大佬 你是怎么判断是否是要出门的,检测到家里有人的情况下,打开门就播报一次吗? ...

我的门不支持接入,所以用的人体传感器。
简单来说就是里面外面各一个,开门时候,里面有人外面没人,那就是里面人要出去。
外面那个要弄好位置和角度,可以做到对门有人出门时候是off,有送外卖啥的时候是on,减少打扰和误操作。

当然,这么设计,只是开门去门口拿东西也会有语音提示,不过我是觉得无所谓。想要解决其实挺困难的。需要在你还没出门的时候识别到你到底要不要出门。。。
如果你的门支持上提锁门的话,可以上提锁门的时候提示就好了。不过要把喇叭放在门口保证你在外面而且关上门了还能听的到。
回复

使用道具 举报

1

主题

105

帖子

515

积分

高级会员

Rank: 4

积分
515
金钱
410
HASS币
0
发表于 2023-2-1 22:17:38 | 显示全部楼层
sirakawa 发表于 2023-2-1 21:54
我的门不支持接入,所以用的人体传感器。
简单来说就是里面外面各一个,开门时候,里面有人外面没人,那就 ...

有道理 多谢!
回复

使用道具 举报

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

本版积分规则

Archiver|手机版|小黑屋|Hassbian

GMT+8, 2024-11-24 04:32 , Processed in 0.071907 second(s), 31 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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