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
我的门不支持接入,所以用的人体传感器。
简单来说就是里面外面各一个,开门时候,里面有人外面没人,那就 ...

有道理 多谢!
页: 1 [2] 3 4 5
查看完整版本: 彩云天气极端天气预警提醒的自动化示例分享