该帖为学习成果贴 ,实现的功能为多个家人提前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 }}
复制代码
显示端配置
再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 %}
提醒消息的配置
需要配置两条动作 中间的动作我是用来测试的 可以不用
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
复制代码
评分
查看全部评分