Calendar data retrieval via "get calendar events" in automation and
text_helpers.
This commit is contained in:
@@ -1393,3 +1393,113 @@
|
|||||||
device_id: 6d1be741876624a70ab5b01b54c6fd6f
|
device_id: 6d1be741876624a70ab5b01b54c6fd6f
|
||||||
entity_id: 621e4377a089b7f5d92c7c9f2cc171a1
|
entity_id: 621e4377a089b7f5d92c7c9f2cc171a1
|
||||||
domain: switch
|
domain: switch
|
||||||
|
- id: '1773000000001'
|
||||||
|
alias: epaperframe - Kalender Events laden
|
||||||
|
description: Ruft alle Events von calendar.privat und calendar.tkrz_kalender für heute und morgen ab und schreibt sie in input_text-Helfer.
|
||||||
|
triggers:
|
||||||
|
# Täglich um 00:01 neu holen
|
||||||
|
- trigger: time
|
||||||
|
at: '00:01:00'
|
||||||
|
id: daily
|
||||||
|
actions:
|
||||||
|
# ── Events für heute (00:00 bis 23:59) holen ──
|
||||||
|
- action: calendar.get_events
|
||||||
|
target:
|
||||||
|
entity_id:
|
||||||
|
- calendar.privat
|
||||||
|
- calendar.tkrz_kalender
|
||||||
|
data:
|
||||||
|
start_date_time: "{{ now().replace(hour=0, minute=0, second=0) }}"
|
||||||
|
end_date_time: "{{ (now().replace(hour=0, minute=0, second=0) + timedelta(days=1)) }}"
|
||||||
|
response_variable: today_evts
|
||||||
|
|
||||||
|
# ── Events für morgen (00:00 bis 23:59) holen ──
|
||||||
|
- action: calendar.get_events
|
||||||
|
target:
|
||||||
|
entity_id:
|
||||||
|
- calendar.privat
|
||||||
|
- calendar.tkrz_kalender
|
||||||
|
data:
|
||||||
|
start_date_time: "{{ (now() + timedelta(days=1)).replace(hour=0, minute=0, second=0) }}"
|
||||||
|
end_date_time: "{{ (now() + timedelta(days=1)).replace(hour=0, minute=0, second=0) + timedelta(days=1) }}"
|
||||||
|
response_variable: tomorrow_evts
|
||||||
|
|
||||||
|
# ── Helper: Events als kompakte Liste formatieren ──
|
||||||
|
|
||||||
|
# Privat heute
|
||||||
|
- set_var:
|
||||||
|
name: fmt_today_privat
|
||||||
|
value: >-
|
||||||
|
{%- set evts = today_evts['calendar.privat']['events'] if 'calendar.privat' in today_evts else [] %}
|
||||||
|
{%- set items = [] %}
|
||||||
|
{%- for e in evts[:5] %}
|
||||||
|
{%- set s = (e['summary'] | default('', true) | string)[:40] if e is mapping and 'summary' in e else '-' %}
|
||||||
|
{%- set st = e['start'] if e is mapping and 'start' in e else '' %}
|
||||||
|
{%- set hhmm = st[11:16] if st|length >= 16 else '??' %}
|
||||||
|
{%- set items = items + [hhmm ~ ' - ' ~ s] %}
|
||||||
|
{%- endfor -%}
|
||||||
|
{{ items | join('│') if items else '-' }}
|
||||||
|
|
||||||
|
# Arbeit heute
|
||||||
|
- set_var:
|
||||||
|
name: fmt_today_arbeit
|
||||||
|
value: >-
|
||||||
|
{%- set evts = today_evts['calendar.tkrz_kalender']['events'] if 'calendar.tkrz_kalender' in today_evts else [] %}
|
||||||
|
{%- set items = [] %}
|
||||||
|
{%- for e in evts[:5] %}
|
||||||
|
{%- set s = (e['summary'] | default('', true) | string)[:40] if e is mapping and 'summary' in e else '-' %}
|
||||||
|
{%- set st = e['start'] if e is mapping and 'start' in e else '' %}
|
||||||
|
{%- set hhmm = st[11:16] if st|length >= 16 else '??' %}
|
||||||
|
{%- set items = items + [hhmm ~ ' - ' ~ s] %}
|
||||||
|
{%- endfor -%}
|
||||||
|
{{ items | join('│') if items else '-' }}
|
||||||
|
|
||||||
|
# Privat morgen
|
||||||
|
- set_var:
|
||||||
|
name: fmt_tomorrow_privat
|
||||||
|
value: >-
|
||||||
|
{%- set evts = tomorrow_evts['calendar.privat']['events'] if 'calendar.privat' in tomorrow_evts else [] %}
|
||||||
|
{%- set items = [] %}
|
||||||
|
{%- for e in evts[:5] %}
|
||||||
|
{%- set s = (e['summary'] | default('', true) | string)[:40] if e is mapping and 'summary' in e else '-' %}
|
||||||
|
{%- set st = e['start'] if e is mapping and 'start' in e else '' %}
|
||||||
|
{%- set hhmm = st[11:16] if st|length >= 16 else '??' %}
|
||||||
|
{%- set items = items + [hhmm ~ ' - ' ~ s] %}
|
||||||
|
{%- endfor -%}
|
||||||
|
{{ items | join('│') if items else '-' }}
|
||||||
|
|
||||||
|
# Arbeit morgen
|
||||||
|
- set_var:
|
||||||
|
name: fmt_tomorrow_arbeit
|
||||||
|
value: >-
|
||||||
|
{%- set evts = tomorrow_evts['calendar.tkrz_kalender']['events'] if 'calendar.tkrz_kalender' in tomorrow_evts else [] %}
|
||||||
|
{%- set items = [] %}
|
||||||
|
{%- for e in evts[:5] %}
|
||||||
|
{%- set s = (e['summary'] | default('', true) | string)[:40] if e is mapping and 'summary' in e else '-' %}
|
||||||
|
{%- set st = e['start'] if e is mapping and 'start' in e else '' %}
|
||||||
|
{%- set hhmm = st[11:16] if st|length >= 16 else '??' %}
|
||||||
|
{%- set items = items + [hhmm ~ ' - ' ~ s] %}
|
||||||
|
{%- endfor -%}
|
||||||
|
{{ items | join('│') if items else '-' }}
|
||||||
|
|
||||||
|
# ── input_text Helfer schreiben ──
|
||||||
|
- action: input_text.set_value
|
||||||
|
target:
|
||||||
|
entity_id: input_text.kalender_heute_privat
|
||||||
|
data:
|
||||||
|
value: "{{ fmt_today_privat }}"
|
||||||
|
- action: input_text.set_value
|
||||||
|
target:
|
||||||
|
entity_id: input_text.kalender_heute_arbeit
|
||||||
|
data:
|
||||||
|
value: "{{ fmt_today_arbeit }}"
|
||||||
|
- action: input_text.set_value
|
||||||
|
target:
|
||||||
|
entity_id: input_text.kalender_morgen_privat
|
||||||
|
data:
|
||||||
|
value: "{{ fmt_tomorrow_privat }}"
|
||||||
|
- action: input_text.set_value
|
||||||
|
target:
|
||||||
|
entity_id: input_text.kalender_morgen_arbeit
|
||||||
|
data:
|
||||||
|
value: "{{ fmt_tomorrow_arbeit }}"
|
||||||
|
|||||||
@@ -49,6 +49,9 @@ sql:
|
|||||||
# calendar integration
|
# calendar integration
|
||||||
calendar: !include calendars.yaml
|
calendar: !include calendars.yaml
|
||||||
|
|
||||||
|
# Helpers for epaperframe calendar display
|
||||||
|
input_text: !include text_helpers.yaml
|
||||||
|
|
||||||
# DB-recorder configuration
|
# DB-recorder configuration
|
||||||
recorder: !include recorder.yaml
|
recorder: !include recorder.yaml
|
||||||
|
|
||||||
|
|||||||
+26
-26
@@ -237,25 +237,25 @@ text_sensor:
|
|||||||
entity_id: weather.zuhause
|
entity_id: weather.zuhause
|
||||||
id: weather
|
id: weather
|
||||||
|
|
||||||
# ── Kalender-Ereignisse (from HA template sensors) ──
|
# ── Kalender-Ereignisse (from HA input_text helpers) ──
|
||||||
- platform: homeassistant
|
- platform: homeassistant
|
||||||
entity_id: sensor.kalender_heute_privat
|
entity_id: sensor.kalender_heute_privat
|
||||||
id: kalender_heute_privat_text
|
id: kalender_heute_privat
|
||||||
internal: true
|
internal: true
|
||||||
|
|
||||||
- platform: homeassistant
|
- platform: homeassistant
|
||||||
entity_id: sensor.kalender_heute_arbeit
|
entity_id: sensor.kalender_heute_arbeit
|
||||||
id: kalender_heute_arbeit_text
|
id: kalender_heute_arbeit
|
||||||
internal: true
|
internal: true
|
||||||
|
|
||||||
- platform: homeassistant
|
- platform: homeassistant
|
||||||
entity_id: sensor.kalender_heute_privat_uhrzeit
|
entity_id: sensor.kalender_morgen_privat
|
||||||
id: kalender_heute_privat_uhrzeit
|
id: kalender_morgen_privat
|
||||||
internal: true
|
internal: true
|
||||||
|
|
||||||
- platform: homeassistant
|
- platform: homeassistant
|
||||||
entity_id: sensor.kalender_heute_arbeit_uhrzeit
|
entity_id: sensor.kalender_morgen_arbeit
|
||||||
id: kalender_heute_arbeit_uhrzeit
|
id: kalender_morgen_arbeit
|
||||||
internal: true
|
internal: true
|
||||||
|
|
||||||
graph:
|
graph:
|
||||||
@@ -1170,33 +1170,24 @@ display:
|
|||||||
/* Event lines (Privat / Arbeit) */
|
/* Event lines (Privat / Arbeit) */
|
||||||
int eventOffsetY = 90;
|
int eventOffsetY = 90;
|
||||||
|
|
||||||
|
// Helper lambda: draw one event line at given Y offset with the given text sensor id
|
||||||
// Privat today
|
// Privat today
|
||||||
if (id(kalender_heute_privat_text).has_state() && !id(kalender_heute_privat_text).state.empty()) {
|
if (id(kalender_heute_privat).has_state() && !id(kalender_heute_privat).state.empty()) {
|
||||||
it.print(10 + leftX, 50 + leftY + eventOffsetY, id(mdi_med), TextAlign::BASELINE_LEFT, "\U0001f32e" );
|
it.print(10 + leftX, 50 + leftY + eventOffsetY, id(mdi_med), TextAlign::BASELINE_LEFT, "\U0001f32e" );
|
||||||
if (id(kalender_heute_privat_uhrzeit).has_state() && !id(kalender_heute_privat_uhrzeit).state.empty()) {
|
// Split by │ separator and display first line of events
|
||||||
it.printf(40 + leftX, 50 + leftY + eventOffsetY, id(sub_sensor_font), "%s ", id(kalender_heute_privat_uhrzeit).state.substr(0, 5).c_str());
|
auto parts = id(kalender_heute_privat).state.c_str();
|
||||||
}
|
|
||||||
size_t max_len = 38;
|
|
||||||
it.printf(40 + leftX, 50 + leftY + eventOffsetY, id(sub_sensor_font), "%s",
|
it.printf(40 + leftX, 50 + leftY + eventOffsetY, id(sub_sensor_font), "%s",
|
||||||
id(kalender_heute_privat_text).state.substr(
|
id(kalender_heute_privat).state.substr(0, 60).c_str());
|
||||||
id(kalender_heute_privat_uhrzeit).has_state() && !id(kalender_heute_privat_uhrzeit).state.empty()
|
|
||||||
? 6 : 0, max_len).c_str());
|
|
||||||
} else {
|
} else {
|
||||||
it.print(10 + leftX, 50 + leftY + eventOffsetY, id(mdi_med), TextAlign::BASELINE_LEFT, "\U0001f32e" );
|
it.print(10 + leftX, 50 + leftY + eventOffsetY, id(mdi_med), TextAlign::BASELINE_LEFT, "\U0001f32e" );
|
||||||
it.printf(40 + leftX, 50 + leftY + eventOffsetY, id(sub_sensor_font), "Kein Termin");
|
it.printf(40 + leftX, 50 + leftY + eventOffsetY, id(sub_sensor_font), "Kein Termin");
|
||||||
}
|
}
|
||||||
|
|
||||||
// Arbeit today
|
// Arbeit today
|
||||||
if (id(kalender_heute_arbeit_text).has_state() && !id(kalender_heute_arbeit_text).state.empty()) {
|
if (id(kalender_heute_arbeit).has_state() && !id(kalender_heute_arbeit).state.empty()) {
|
||||||
it.print(10 + leftX, 85 + leftY + eventOffsetY, id(mdi_med), TextAlign::BASELINE_LEFT, "\U0001f32e" );
|
it.print(10 + leftX, 85 + leftY + eventOffsetY, id(mdi_med), TextAlign::BASELINE_LEFT, "\U0001f32e" );
|
||||||
if (id(kalender_heute_arbeit_uhrzeit).has_state() && !id(kalender_heute_arbeit_uhrzeit).state.empty()) {
|
|
||||||
it.printf(40 + leftX, 85 + leftY + eventOffsetY, id(sub_sensor_font), "%s ", id(kalender_heute_arbeit_uhrzeit).state.substr(0, 5).c_str());
|
|
||||||
}
|
|
||||||
size_t max_len = 38;
|
|
||||||
it.printf(40 + leftX, 85 + leftY + eventOffsetY, id(sub_sensor_font), "%s",
|
it.printf(40 + leftX, 85 + leftY + eventOffsetY, id(sub_sensor_font), "%s",
|
||||||
id(kalender_heute_arbeit_text).state.substr(
|
id(kalender_heute_arbeit).state.substr(0, 60).c_str());
|
||||||
id(kalender_heute_arbeit_uhrzeit).has_state() && !id(kalender_heute_arbeit_uhrzeit).state.empty()
|
|
||||||
? 6 : 0, max_len).c_str());
|
|
||||||
} else {
|
} else {
|
||||||
it.print(10 + leftX, 85 + leftY + eventOffsetY, id(mdi_med), TextAlign::BASELINE_LEFT, "\U0001f32e" );
|
it.print(10 + leftX, 85 + leftY + eventOffsetY, id(mdi_med), TextAlign::BASELINE_LEFT, "\U0001f32e" );
|
||||||
it.printf(40 + leftX, 85 + leftY + eventOffsetY, id(sub_sensor_font), "Kein Termin");
|
it.printf(40 + leftX, 85 + leftY + eventOffsetY, id(sub_sensor_font), "Kein Termin");
|
||||||
@@ -1215,12 +1206,21 @@ display:
|
|||||||
it.printf(205 + rightX, 45 + rightY, id(sensor_unit), "%02d.%04d.", tomorrow_month, tomorrow_year);
|
it.printf(205 + rightX, 45 + rightY, id(sensor_unit), "%02d.%04d.", tomorrow_month, tomorrow_year);
|
||||||
|
|
||||||
/* Event lines (Privat / Arbeit) */
|
/* Event lines (Privat / Arbeit) */
|
||||||
// TODO: tomorrow events via HA template sensors
|
// Privat tomorrow
|
||||||
if (!id(kalender_heute_privat_text).has_state() || id(kalender_heute_privat_text).state.empty()) {
|
if (id(kalender_morgen_privat).has_state() && !id(kalender_morgen_privat).state.empty()) {
|
||||||
|
it.print(10 + rightX, 50 + rightY + eventOffsetY, id(mdi_med), TextAlign::BASELINE_LEFT, "\U0001f32e" );
|
||||||
|
it.printf(40 + rightX, 50 + rightY + eventOffsetY, id(sub_sensor_font), "%s",
|
||||||
|
id(kalender_morgen_privat).state.substr(0, 60).c_str());
|
||||||
|
} else {
|
||||||
it.print(10 + rightX, 50 + rightY + eventOffsetY, id(mdi_med), TextAlign::BASELINE_LEFT, "\U0001f32e" );
|
it.print(10 + rightX, 50 + rightY + eventOffsetY, id(mdi_med), TextAlign::BASELINE_LEFT, "\U0001f32e" );
|
||||||
it.printf(40 + rightX, 50 + rightY + eventOffsetY, id(sub_sensor_font), "Kein Termin");
|
it.printf(40 + rightX, 50 + rightY + eventOffsetY, id(sub_sensor_font), "Kein Termin");
|
||||||
}
|
}
|
||||||
if (!id(kalender_heute_arbeit_text).has_state() || id(kalender_heute_arbeit_text).state.empty()) {
|
// Arbeit tomorrow
|
||||||
|
if (id(kalender_morgen_arbeit).has_state() && !id(kalender_morgen_arbeit).state.empty()) {
|
||||||
|
it.print(10 + rightX, 85 + rightY + eventOffsetY, id(mdi_med), TextAlign::BASELINE_LEFT, "\U0001f32e" );
|
||||||
|
it.printf(40 + rightX, 85 + rightY + eventOffsetY, id(sub_sensor_font), "%s",
|
||||||
|
id(kalender_morgen_arbeit).state.substr(0, 60).c_str());
|
||||||
|
} else {
|
||||||
it.print(10 + rightX, 85 + rightY + eventOffsetY, id(mdi_med), TextAlign::BASELINE_LEFT, "\U0001f32e" );
|
it.print(10 + rightX, 85 + rightY + eventOffsetY, id(mdi_med), TextAlign::BASELINE_LEFT, "\U0001f32e" );
|
||||||
it.printf(40 + rightX, 85 + leftY + eventOffsetY, id(sub_sensor_font), "Kein Termin");
|
it.printf(40 + rightX, 85 + leftY + eventOffsetY, id(sub_sensor_font), "Kein Termin");
|
||||||
}
|
}
|
||||||
|
|||||||
+20
-36
@@ -145,44 +145,28 @@
|
|||||||
unit_of_measurement: 'Mbps'
|
unit_of_measurement: 'Mbps'
|
||||||
|
|
||||||
# ── Kalender-Ereignisse für epaperframe ──
|
# ── Kalender-Ereignisse für epaperframe ──
|
||||||
# Quelle: calendar.privat und calendar.tkrz_kalender
|
# Alle Events werden per Automation (automations.yaml) in input_text Helfer geschrieben.
|
||||||
# Diese Sensoren lesen das aktuelle (laufende) Event aus dem Kalendereintrag.
|
# Diese template sensors lesen nur noch daraus. Das verhindert doppelte Logik und garantiert,
|
||||||
|
# dass sowohl "heute" als auch "morgen" Events mit Titeln, Uhrzeiten und Beschreibungen verfügbar sind.
|
||||||
- text_sensor:
|
- text_sensor:
|
||||||
|
# ── HEUTE ──
|
||||||
- name: "Kalender heute Privat"
|
- name: "Kalender heute Privat"
|
||||||
unique_id: kalender_heute_privat
|
unique_id: kalender_heute_privat
|
||||||
state: >-
|
state: "{{ states('input_text.kalender_heute_privat') }}"
|
||||||
{% set desc = state_attr('calendar.privat', 'description') or '' %}
|
icon: mdi:calendar-account
|
||||||
{% set msg = state_attr('calendar.privat', 'message') or '' %}
|
|
||||||
{% if desc or msg or state_attr('calendar.privat', 'start_time') %}
|
|
||||||
{{ (msg if msg else desc) | replace('\n', ', ') | trim | truncate(60) }}
|
|
||||||
{% else %}
|
|
||||||
-
|
|
||||||
{% endif %}
|
|
||||||
- name: "Kalender heute Arbeit"
|
- name: "Kalender heute Arbeit"
|
||||||
unique_id: kalender_heute_arbeit
|
unique_id: kalender_heute_arbeit
|
||||||
state: >-
|
state: "{{ states('input_text.kalender_heute_arbeit') }}"
|
||||||
{% set desc = state_attr('calendar.tkrz_kalender', 'description') or '' %}
|
icon: mdi:calendar-account
|
||||||
{% set msg = state_attr('calendar.tkrz_kalender', 'message') or '' %}
|
|
||||||
{% if desc or msg or state_attr('calendar.tkrz_kalender', 'start_time') %}
|
# ── MORGEN ──
|
||||||
{{ (msg if msg else desc) | replace('\n', ', ') | trim | truncate(60) }}
|
- name: "Kalender morgen Privat"
|
||||||
{% else %}
|
unique_id: kalender_morgen_privat
|
||||||
-
|
state: "{{ states('input_text.kalender_morgen_privat') }}"
|
||||||
{% endif %}
|
icon: mdi:calendar-calendar-today
|
||||||
- name: "Kalender heute Privat Uhrzeit"
|
|
||||||
unique_id: kalender_heute_privat_uhrzeit
|
- name: "Kalender morgen Arbeit"
|
||||||
state: >-
|
unique_id: kalender_morgen_arbeit
|
||||||
{% set st = state_attr('calendar.privat', 'start_time') %}
|
state: "{{ states('input_text.kalender_morgen_arbeit') }}"
|
||||||
{% if st %}
|
icon: mdi:calendar-calendar-today
|
||||||
{{ as_timestamp(st) | timestamp_custom('%H:%M', true) }}
|
|
||||||
{% else %}
|
|
||||||
-
|
|
||||||
{% endif %}
|
|
||||||
- name: "Kalender heute Arbeit Uhrzeit"
|
|
||||||
unique_id: kalender_heute_arbeit_uhrzeit
|
|
||||||
state: >-
|
|
||||||
{% set st = state_attr('calendar.tkrz_kalender', 'start_time') %}
|
|
||||||
{% if st %}
|
|
||||||
{{ as_timestamp(st) | timestamp_custom('%H:%M', true) }}
|
|
||||||
{% else %}
|
|
||||||
-
|
|
||||||
{% endif %}
|
|
||||||
|
|||||||
@@ -0,0 +1,18 @@
|
|||||||
|
# Helpers for epaperframe calendar display
|
||||||
|
input_text:
|
||||||
|
- name: "Kalender heute Privat"
|
||||||
|
initial: "-"
|
||||||
|
icon: mdi:calendar-account
|
||||||
|
mode: text
|
||||||
|
- name: "Kalender heute Arbeit"
|
||||||
|
initial: "-"
|
||||||
|
icon: mdi:calendar-account
|
||||||
|
mode: text
|
||||||
|
- name: "Kalender morgen Privat"
|
||||||
|
initial: "-"
|
||||||
|
icon: mdi:calendar-calendar-today
|
||||||
|
mode: text
|
||||||
|
- name: "Kalender morgen Arbeit"
|
||||||
|
initial: "-"
|
||||||
|
icon: mdi:calendar-calendar-today
|
||||||
|
mode: text
|
||||||
Reference in New Issue
Block a user