找回密码
 立即注册

微信扫码登录

搜索
查看: 132|回复: 8

[经验分享] 生日倒计时报警的制作

[复制链接]

1

主题

16

回帖

89

积分

论坛分享达人

积分
89
金钱
72
HASS币
0
发表于 昨天 19:56 | 显示全部楼层 |阅读模式
该帖为学习成果贴 ,实现的功能为多个家人提前10天生日提醒。后期准备再加入农历也提醒,这个是我这个小白的学习贴,编程可以多结合AI进行编程和调试。可能还有一些不健全或者BUG的地方。题外话:上面的天气的和风天气是看来各位大神的接入的目前还稳定,本想接入菜鸟的数据好像只能企业,个人好像不行样的,各位有啥好的办法来自动获取快递信息(比如家里多个人)自动显示还有到货取件码。
以下是我这个帖子学习日记,供大家参考哈。

没有生日提醒时候


                               
登录/注册后可看大图

有生日提醒时候

                               
登录/注册后可看大图

生日提醒时候的通知

                               
登录/注册后可看大图

生日设定和调试

                               
登录/注册后可看大图



再/homeassistant/configuration.yaml配置以下内容 (注意缩进)看图片缩进


input_datetime:
  birthday_dad:
    name: "爸爸生日"
    has_date: true
    has_time: false
    initial: "1975-08-28"
  birthday_mom:
    name: "妈妈生日"
    has_date: true
    has_time: false
    initial: "1978-05-18"
  birthday_yan:
    name: "妍妍生日"
    has_date: true
    has_time: false
    initial: "2017-07-13"
  birthday_yi:
    name: "伊伊生日"
    has_date: true
    has_time: false
    initial: "2022-04-11"
  birthday_wife:
    name: "老婆生日"
    has_date: true
    has_time: false
    initial: "1987-11-01"
  birthday_husband:
    name: "老公生日"
    has_date: true
    has_time: false
    initial: "1987-08-10"


sensor:
  - platform: template
    sensors:
      upcoming_birthdays:
        friendly_name: "10天内生日提醒"
        value_template: >
          {% set today = as_datetime(now()).date() %}
          {% set count = namespace(value=0) %}
          
          {% for entity in [
            'input_datetime.birthday_dad',
            'input_datetime.birthday_mom',
            'input_datetime.birthday_yan',
            'input_datetime.birthday_yi',
            'input_datetime.birthday_wife',
            'input_datetime.birthday_husband'
          ] %}
            {% set bday_state = states(entity) %}
            {% if bday_state not in ['unknown', 'unavailable', 'none', None] %}
              {% set bday_date = as_datetime(bday_state).date() %}
              {% set next_bday = bday_date.replace(year=today.year) %}
              {% if next_bday < today %}
                {% set next_bday = next_bday.replace(year=today.year + 1) %}
              {% endif %}
              {% set days_until = (next_bday - today).days %}
              {% if days_until <= 10 and days_until >= 0 %}
                {% set count.value = count.value + 1 %}
              {% endif %}
            {% endif %}
          {% endfor %}
          {{ count.value }}  
        attribute_templates:
          list: >
            {% set today = as_datetime(now()).date() %}
            {% set members = [
              {'name': '爸爸', 'entity': 'input_datetime.birthday_dad'},
              {'name': '妈妈', 'entity': 'input_datetime.birthday_mom'},
              {'name': '妍妍', 'entity': 'input_datetime.birthday_yan'},
              {'name': '伊伊', 'entity': 'input_datetime.birthday_yi'},
              {'name': '老婆', 'entity': 'input_datetime.birthday_wife'},
              {'name': '老公', 'entity': 'input_datetime.birthday_husband'}
            ] %}
            
            {% set ns = namespace(list=[]) %}
            {% for person in members %}
              {% set bday_state = states(person.entity) %}
              {% if bday_state not in ['unknown', 'unavailable', 'none', None] %}
                {% set bday_date = as_datetime(bday_state).date() %}
                {% set next_bday = bday_date.replace(year=today.year) %}
                {% if next_bday < today %}
                  {% set next_bday = next_bday.replace(year=today.year + 1) %}
                {% endif %}
                {% set days_until = (next_bday - today).days %}
                {% if days_until <= 10 and days_until >= 0 %}
                  {% set age = today.year - bday_date.year + (1 if today > next_bday else 0) %}
                  {% set ns.list = ns.list + [{
                    'name': person.name,
                    'days': days_until,
                    'age': age,
                    'date': next_bday.strftime('%m月%d日')
                  }] %}
                {% endif %}
              {% endif %}
            {% endfor %}
            {{ ns.list | to_json | trim }}  
代码1-2.png

                               
登录/注册后可看大图

显示端配置
再markdown卡片中配置
{% set target_date = '2025-01-01' %}
{% set target = strptime(target_date, '%Y-%m-%d') %}
{% set now = now() %}
{# 统一时区:将时区感知时间转为未感知时间 #}
{% set target_naive = target.replace(tzinfo=None) %}
{% set now_naive = now.replace(tzinfo=None) %}
{% set diff = (now_naive - target_naive).total_seconds() / 86400 %}
{% set diff_days = diff | abs | round(0, 'floor') | int %}
👫 我们结婚了 {{ diff_days }} 天
{% set count = states('sensor.upcoming_birthdays') | int %}{% if count > 0 %}{% set raw_list = state_attr('sensor.upcoming_birthdays', 'list') %}{% set list = raw_list | replace('\"', '"') | from_json %}{% for person in list | sort(attribute='days') %}{% if person.days == 0 %}🎉 **{{ person.name }}** 今天过 **{{ person.age }}** 岁生日! {% else %}🕑 {{ person.name }}还有{{ person.days }}天就{{ person.age }}岁了! {% endif %}{% endfor %}{% endif %}

                               
登录/注册后可看大图

type: entities
entities:
  - entity: sensor.upcoming_birthdays
    secondary_info: none
    icon: mdi:cake-variant
    card_mod:
      style: |
        :host {
          {% if states('sensor.upcoming_birthdays') == '0' %}
            display: none;
          {% endif %}
        }
  - entity: sensor.sun_next_dawn
  - entity: sensor.sun_next_dusk
theme: ios-dark-mode-blue-red-alternative



                               
登录/注册后可看大图

数据调试或者设置页面 的配置
生日设置卡片 就按这个可视化界面设置即可

                               
登录/注册后可看大图

下面有一个调试结果面板信息

type: markdown
content: |2-
    {% set today = as_datetime(now()).date() %}
              {% set members = [
                {'name': '爸爸', 'entity': 'input_datetime.birthday_dad'},
                {'name': '妈妈', 'entity': 'input_datetime.birthday_mom'},
                {'name': '妍妍', 'entity': 'input_datetime.birthday_yan'},
                {'name': '伊伊', 'entity': 'input_datetime.birthday_yi'},
                {'name': '老婆', 'entity': 'input_datetime.birthday_wife'},
                {'name': '老公', 'entity': 'input_datetime.birthday_husband'}
              ] %}
              
              **当前系统日期**: {{ today }} ({{ now().strftime('%A') }})
              ========================
              
              {% set ns = namespace(list=[]) %}
              {% for person in members %}
                {% set bday_state = states(person.entity) %}
                {% if bday_state not in ['unknown', 'unavailable', 'none', None] %}
                  {% set bday_date = as_datetime(bday_state).date() %}
                  {% set next_bday = bday_date.replace(year=today.year) %}
                  {% if next_bday < today %}
                    {% set next_bday = next_bday.replace(year=today.year + 1) %}
                  {% endif %}
                  {% set days_until = (next_bday - today).days %}
                  {% set age = today.year - bday_date.year + (1 if today > next_bday else 0) %}
                  
                  {% set ns.list = ns.list + [{
                    'name': person.name,
                    'birthday': bday_date,
                    'next_bday': next_bday,
                    'days': days_until,
                    'age': age,
                    'status': '✅ 在范围内' if days_until <= 10 and days_until >= 0 else '❌ 不在范围'
                  }] %}
                {% endif %}
              {% endfor %}
              
              **所有成员状态**:
              {% for person in ns.list | sort(attribute='days') %}
                {{ person.name }}:
                  - 生日: {{ person.birthday }}
                  - 下次生日: {{ person.next_bday }} ({{ person.next_bday.strftime('%A') }})
                  - 倒计时: {{ person.days }} 天
                  - 年龄: {{ person.age }} 岁
                  - 状态: {{ person.status }}
              {% endfor %}
              
              **10天内提醒列表**:
              {% set reminders = ns.list | selectattr('status', 'equalto', '✅ 在范围内') | list %}
              {% if reminders %}
                {% for person in reminders | sort(attribute='days') %}
                  {{ person.name }}: 还有{{ person.days }}天 ({{ person.next_bday.strftime('%m月%d日') }}满{{ person.age }}岁)
                {% endfor %}
              {% else %}
                无10天内生日
              {% endif %}


                               
登录/注册后可看大图

提醒消息的配置
需要配置两条动作 中间的动作我是用来测试的 可以不用
脚本配置1.png
alias: 10天内生日提醒
triggers:
  - at: "08:00:00"
    trigger: time
conditions:
  - condition: template
    value_template: "{{ states('sensor.upcoming_birthdays') | int > 0 }}"
actions:
  - data_template:
      notification_id: birthday_reminder
      title: 🎂 10天内生日提醒
      message: |
        {% set person = state_attr('sensor.upcoming_birthdays', 'list')[0] %}
         🎂生日提醒:{{ person.name }}还有 **{{ person.days }}** 天就  **{{ person.age }}**  岁生日了({{ person.date }})🎉🎉🎉
    action: persistent_notification.create
mode: single

                               
登录/注册后可看大图

alias: 清除生日提醒
triggers:
  - at: "00:00:10"
    trigger: time
conditions:
  - condition: template
    value_template: "{{ states('sensor.upcoming_birthdays') | int == 0 }}"
actions:
  - data:
      notification_id: birthday_reminder
    action: persistent_notification.dismiss
mode: single



                               
登录/注册后可看大图




没有生日的提醒时候

没有生日的提醒时候

有生日提醒的时候

有生日提醒的时候

生日提醒时候产生的通知

生日提醒时候产生的通知

可以做个调试页面测试程序

可以做个调试页面测试程序
1.jpg
2.png
3.png
调试页面.png
代码1-1.png
kp1.png
kp2.png
kp3.png
kp4.png
提醒1.png
提醒2.png

评分

参与人数 1金钱 +12 收起 理由
隔壁的王叔叔 + 12 感谢楼主分享!

查看全部评分

回复

使用道具 举报

5

主题

55

回帖

1000

积分

金牌会员

积分
1000
金钱
940
HASS币
0
发表于 昨天 21:19 | 显示全部楼层

研究生日卡片好久了,一直苦于没有一个好看的UI设计
image.png image.png
回复

使用道具 举报

1

主题

16

回帖

89

积分

论坛分享达人

积分
89
金钱
72
HASS币
0
 楼主| 发表于 昨天 22:32 | 显示全部楼层
chaosl 发表于 2025-7-8 21:19
研究生日卡片好久了,一直苦于没有一个好看的UI设计

我觉得没必要弄那么多数据 最近要过生日的就行了 主画面就简单显示哈 就好了 用主题好看点
回复

使用道具 举报

ZDZX 手机认证

5

主题

54

回帖

481

积分

中级会员

积分
481
金钱
422
HASS币
0
发表于 16 小时前 | 显示全部楼层
好想法,偷学一下
回复

使用道具 举报

20

主题

376

回帖

2711

积分

金牌会员

积分
2711
金钱
2300
HASS币
110
发表于 7 小时前 | 显示全部楼层
农历生日吗
回复

使用道具 举报

15

主题

495

回帖

2823

积分

金牌会员

积分
2823
金钱
2313
HASS币
0
发表于 6 小时前 | 显示全部楼层
一直用chineseholiday做生日提醒,挺好的,就是没有UI输入生日,要是作者用搞个UI就更好
回复

使用道具 举报

1

主题

16

回帖

89

积分

论坛分享达人

积分
89
金钱
72
HASS币
0
 楼主| 发表于 4 小时前 | 显示全部楼层

这个是公历的
回复

使用道具 举报

31

主题

1467

回帖

6718

积分

元老级技术达人

积分
6718
金钱
5195
HASS币
100
发表于 2 小时前 | 显示全部楼层
应该用日历组件,新建一个生日日历,剩下就用是判断最近的生日就好了
回复

使用道具 举报

1

主题

16

回帖

89

积分

论坛分享达人

积分
89
金钱
72
HASS币
0
 楼主| 发表于 1 小时前 | 显示全部楼层
25989406 发表于 2025-7-9 13:58
应该用日历组件,新建一个生日日历,剩下就用是判断最近的生日就好了

有农历么大神  我想 不管农历或者公历生日都进行提醒
回复

使用道具 举报

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

本版积分规则

Archiver|手机版|小黑屋|Hassbian ( 晋ICP备17001384号-1 )

GMT+8, 2025-7-9 16:16 , Processed in 0.669657 second(s), 12 queries , MemCached On.

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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