-
-
Save khenderick/1b46d7db50253813ef2a71ee37b5e242 to your computer and use it in GitHub Desktop.
- id: reset_extra_screen_time | |
alias: "Reset extra screen time" | |
mode: single | |
max_exceeded: silent | |
trigger: | |
- platform: time | |
at: "00:00:00" | |
condition: | |
condition: time | |
weekday: | |
- mon | |
action: | |
- service: input_number.set_value | |
target: | |
entity_id: input_number.child_1_extra_screen_time | |
data: | |
value: >- | |
{% if states('input_number.child_1_extra_screen_time') | int(0) >= 0 %} | |
{{ min(states('input_number.child_1_extra_screen_time') | int(0), states('sensor.child_1_weekly_screen_time_remaining') | int(0)) }} | |
{% else %} | |
{{ min(0, 0 + states('input_number.child_1_extra_screen_time') | int(0) + states('sensor.weekly_screen_time') | int(0)) }} | |
{% endif %} | |
- service: input_number.set_value | |
target: | |
entity_id: input_number.child_1_correction_screen_time | |
data: | |
value: 0 | |
- service: input_number.set_value | |
target: | |
entity_id: input_number.child_2_extra_screen_time | |
data: | |
value: >- | |
{% if states('input_number.child_2_extra_screen_time') | int(0) >= 0 %} | |
{{ min(states('input_number.child_2_extra_screen_time') | int(0), states('sensor.child_2_weekly_screen_time_remaining') | int(0)) }} | |
{% else %} | |
{{ min(0, 0 + states('input_number.child_2_extra_screen_time') | int(0) + states('sensor.weekly_screen_time') | int(0)) }} | |
{% endif %} | |
- service: input_number.set_value | |
target: | |
entity_id: input_number.child_2_correction_screen_time | |
data: | |
value: 0 |
- id: warn_screen_time_almost_used | |
alias: "Warn screen time almost used" | |
mode: queued | |
max_exceeded: silent | |
trigger: | |
- platform: template | |
value_template: "{{ states('sensor.child_1_screen_time_today') | float(0) * 60 + 10 >= 120 }}" | |
id: "child_1_day" | |
- platform: template | |
value_template: "{{ states('sensor.child_2_screen_time_today') | float(0) * 60 + 10 >= 120 }}" | |
id: "child_2_day" | |
- platform: template | |
value_template: > | |
{{ states('sensor.child_1_weekly_screen_time_threshold') | int(-1) > 0 and | |
states('sensor.child_1_screen_time_this_week') | int(0) + 10 >= states('sensor.child_1_weekly_screen_time_threshold') | int(0) }} | |
id: "child_1_week" | |
- platform: template | |
value_template: > | |
{{ states('sensor.child_2_weekly_screen_time_threshold') | int(-1) > 0 and | |
states('sensor.child_2_screen_time_this_week') | int(0) + 10 >= states('sensor.child_2_weekly_screen_time_threshold') | int(0) }} | |
id: "child_2_week" | |
variables: | |
names: | |
child_1_day: | |
message: "Child 1, je hebt bijna 2 uur van je schermtijd gebruikt." | |
child_1_week: | |
message: "Child 1, je hebt bijna je wekelijkse schermtijd gebruikt." | |
child_2_day: | |
message: "Child 2, je hebt bijna 2 uur van je schermtijd gebruikt." | |
child_2_week: | |
message: "Child 2, je hebt bijna je wekelijkse schermtijd gebruikt." | |
action: | |
- variables: | |
message: "{{ names[trigger.id].message }}" | |
- service: script.cloud_say | |
data: | |
entity_id: media_player.muse_living | |
message: "{{ message }}" | |
volume: 0.5 | |
language: "NL" | |
- id: warn_weekly_screen_time | |
alias: "Warn weekly screen time" | |
mode: queued | |
max_exceeded: silent | |
trigger: | |
- platform: template | |
value_template: "{{ states('sensor.child_1_screen_time_this_week') | int(0) >= states('sensor.child_1_weekly_screen_time_threshold') | int(-1) > 0 }}" | |
id: "child_1" | |
- platform: template | |
value_template: "{{ states('sensor.child_2_screen_time_this_week') | int(0) >= states('sensor.child_2_weekly_screen_time_threshold') | int(-1) > 0 }}" | |
id: "child_2" | |
variables: | |
names: | |
child_1: | |
pronunciation: "Child 1" | |
name: "Child 1" | |
child_2: | |
pronunciation: "Child 2" | |
name: "Child 2" | |
action: | |
- variables: | |
pronunciation: "{{ names[trigger.id].pronunciation }}" | |
name: "{{ names[trigger.id].name }}" | |
- service: script.cloud_say | |
data: | |
entity_id: media_player.muse_living | |
message: "{{ pronunciation }}, je schermtijd voor deze week is op." | |
volume: 0.5 | |
language: "NL" | |
- service: notify.own_devices | |
data: | |
title: "Screen time" | |
message: "{{ name }} is out of screen time" | |
data: | |
notification_icon: "mdi:television-off" | |
- id: notify_screen_time | |
alias: "Notify screen time" | |
mode: queued | |
max_exceeded: silent | |
variables: | |
names: | |
input_boolean.child_1_screen_time_active: | |
pronunciation: "Child 1" | |
name: "child_1" | |
input_boolean.child_2_screen_time_active: | |
pronunciation: "Child 2" | |
name: "child_2" | |
numbers: "{{ {0: 'nul', 1: 'een', 2: 'twee', 3: 'drie', 4: 'vier', 5: 'vijf', 6: 'zes', 7: 'zeven', 8: 'acht', 9: 'negen', 10: 'tien', 11: 'elf', 12: 'twaalf', 13: 'dertien', 14: 'veertien', 15: 'vijftien', 16: 'zestien', 17: 'zeventien', 18: 'achttien', 19: 'negentien', 20: 'twintig', 21: 'eenentwintig', 22: 'tweeëntwintig', 23: 'drieëntwintig', 24: 'vierentwintig', 25: 'vijfentwintig', 26: 'zesentwintig', 27: 'zevenentwintig', 28: 'achtentwintig', 29: 'negenentwintig', 30: 'dertig', 31: 'eenendertig', 32: 'tweeëndertig', 33: 'drieëndertig', 34: 'vierendertig', 35: 'vijfendertig', 36: 'zesendertig', 37: 'zevenendertig', 38: 'achtendertig', 39: 'negenendertig', 40: 'veertig', 41: 'eenenveertig', 42: 'tweeënveertig', 43: 'drieënveertig', 44: 'vierenveertig', 45: 'vijfenveertig', 46: 'zesenveertig', 47: 'zevenenveertig', 48: 'achtenveertig', 49: 'negenenveertig', 50: 'vijftig', 51: 'eenenvijftig', 52: 'tweeënvijftig', 53: 'drieënvijftig', 54: 'vierenvijftig', 55: 'vijfenvijftig', 56: 'zesenvijftig', 57: 'zevenenvijftig', 58: 'achtenvijftig', 59: 'negenenvijftig', 60: 'zestig', 61: 'eenenzestig', 62: 'tweeënzestig', 63: 'drieënzestig', 64: 'vierenzestig', 65: 'vijfenzestig', 66: 'zesenzestig', 67: 'zevenenzestig', 68: 'achtenzestig', 69: 'negenenzestig', 70: 'zeventig', 71: 'eenenzeventig', 72: 'tweeënzeventig', 73: 'drieënzeventig', 74: 'vierenzeventig', 75: 'vijfenzeventig', 76: 'zesenzeventig', 77: 'zevenenzeventig', 78: 'achtenzeventig', 79: 'negenenzeventig', 80: 'tachtig', 81: 'eenentachtig', 82: 'tweeëntachtig', 83: 'drieëntachtig', 84: 'vierentachtig', 85: 'vijfentachtig', 86: 'zesentachtig', 87: 'zevenentachtig', 88: 'achtentachtig', 89: 'negenentachtig', 90: 'negentig', 91: 'eenennegentig', 92: 'tweeënnegentig', 93: 'drieënnegentig', 94: 'vierennegentig', 95: 'vijfennegentig', 96: 'zesennegentig', 97: 'zevenennegentig', 98: 'achtennegentig', 99: 'negenennegentig'} }}" | |
trigger: | |
- platform: state | |
entity_id: input_boolean.child_1_screen_time_active | |
to: null | |
- platform: state | |
entity_id: input_boolean.child_2_screen_time_active | |
to: null | |
action: | |
- variables: | |
pronunciation: "{{ names[trigger.entity_id].pronunciation }}" | |
name: "{{ names[trigger.entity_id].name }}" | |
today: "{{ (states('sensor.' + name + '_screen_time_today') | float(0) * 60) | int(0) }}" | |
today_hours: "{{ today // 60 }}" | |
today_minutes: "{{ today % 60 }}" | |
remaining: "{{ states('sensor.' + name + '_weekly_screen_time_remaining') | int(0) }}" | |
remaining_hours: "{{ remaining // 60 }}" | |
remaining_minutes: "{{ remaining % 60 }}" | |
- service: script.cloud_say | |
data: | |
entity_id: media_player.muse_living | |
message: > | |
{{ pronunciation }}, | |
{%- if remaining > 0 -%} | |
je schermtijd is {{ 'gestart' if is_state(trigger.entity_id, 'on') else 'gestopt' }}. | |
{%- endif -%} | |
{%- if today > 0 -%} | |
Je hebt vandaag al | |
{%- if today_hours > 0 -%} | |
{{ ' ' }}{{ numbers[today_hours] }} uur | |
{%- endif -%} | |
{%- if today_hours > 0 and today_minutes > 0 -%} | |
{{ ' ' }}en | |
{%- endif -%} | |
{%- if today_minutes > 0 -%} | |
{{ ' ' }}{{ numbers[today_minutes] }} min{{ 'uut' if today_minutes == 1 else 'uten' }} | |
{%- endif %} gebruikt. | |
{%- endif -%} | |
{{ ' ' }}Je hebt | |
{%- if remaining <= 0 -%} | |
{{ ' ' }}geen tijd meer over deze week. | |
{%- else -%} | |
{{ ' ' }}nog | |
{%- if remaining_hours > 0 -%} | |
{{ ' ' }}{{ numbers[remaining_hours] }} uur | |
{%- endif -%} | |
{%- if remaining_hours > 0 and remaining_minutes > 0 -%} | |
{{ ' ' }}en | |
{%- endif -%} | |
{%- if remaining_minutes > 0 -%} | |
{{ ' ' }}{{ numbers[remaining_minutes] }} min{{ 'uut' if remaining_minutes == 1 else 'uten' }} | |
{%- endif %} over deze week. | |
{% endif %} | |
volume: 0.5 | |
language: "NL" | |
- if: | |
- "{{ remaining < 0 }}" | |
then: | |
- service: input_boolean.turn_off | |
target: | |
entity_id: "{{ trigger.entity_id }}" |
input_number.child_1_extra_screen_time: | |
icon: "mdi:gift" | |
input_number.child_1_correction_screen_time: | |
icon: "mdi:hammer" | |
input_number.child_2_extra_screen_time: | |
icon: "mdi:gift" | |
input_number.child_2_correction_screen_time: | |
icon: "mdi:hammer" |
child_1_screen_time_active: | |
name: "Child 1 is consuming screen time" | |
child_2_screen_time_active: | |
name: "Child 2 is consuming screen time" |
child_1_extra_screen_time: | |
name: "Child 1 extra screen time" | |
min: -600 | |
max: 600 | |
step: 1 | |
mode: box | |
unit_of_measurement: "min" | |
child_1_correction_screen_time: | |
name: "Child 1 correction screen time" | |
min: -1500 | |
max: 1500 | |
step: 1 | |
mode: box | |
unit_of_measurement: "min" | |
child_2_extra_screen_time: | |
name: "Child 2 extra screen time" | |
min: -600 | |
max: 600 | |
step: 1 | |
mode: box | |
unit_of_measurement: "min" | |
child_2_correction_screen_time: | |
name: "Child 2 correction screen time" | |
min: -1500 | |
max: 1500 | |
step: 1 | |
mode: box | |
unit_of_measurement: "min" |
- platform: history_stats | |
name: Child 1 screen time this week | |
entity_id: input_boolean.child_1_screen_time_active | |
state: "on" | |
type: time | |
start: "{{ as_timestamp(now().replace(hour=0, minute=0, second=0)) - now().weekday() * 86400 }}" | |
end: "{{ now() }}" | |
- platform: history_stats | |
name: Child 1 screen time today | |
entity_id: input_boolean.child_1_screen_time_active | |
state: "on" | |
type: time | |
start: "{{ now().replace(hour=0, minute=0, second=0) }}" | |
end: "{{ now() }}" | |
- platform: history_stats | |
name: Child 2 screen time this week | |
entity_id: input_boolean.child_2_screen_time_active | |
state: "on" | |
type: time | |
start: "{{ as_timestamp(now().replace(hour=0, minute=0, second=0)) - now().weekday() * 86400 }}" | |
end: "{{ now() }}" | |
- platform: history_stats | |
name: Child 2 screen time today | |
entity_id: input_boolean.child_2_screen_time_active | |
state: "on" | |
type: time | |
start: "{{ now().replace(hour=0, minute=0, second=0) }}" | |
end: "{{ now() }}" |
- unique_id: weekly_screen_time | |
name: "Weekly screen time" | |
state: "{{ 720 if is_state('binary_sensor.school_holiday', 'on') else 360 }}" | |
- unique_id: child_1_weekly_screen_time_threshold | |
name: "Child 1 weekly screen time threshold" | |
state: "{{ states('sensor.weekly_screen_time') | int(0) + states('input_number.child_1_extra_screen_time') | int(0) }}" | |
availability: "{{ states('sensor.weekly_screen_time') | is_number() and states('input_number.child_1_extra_screen_time') | is_number() }}" | |
unit_of_measurement: "min" | |
- unique_id: child_1_corrected_screen_time_this_week | |
name: "Child 1 corrected screen time this week" | |
state: "{{ states('sensor.child_1_screen_time_this_week') | float(0) * 60 - states('input_number.child_1_correction_screen_time') | int(0) }}" | |
availability: "{{ states('sensor.child_1_screen_time_this_week') | is_number() and states('input_number.child_1_correction_screen_time') | is_number() }}" | |
unit_of_measurement: "min" | |
- unique_id: child_1_weekly_screen_time_remaining | |
name: "Child 1 weekly screen time remaining" | |
state: "{{ states('sensor.child_1_weekly_screen_time_threshold') | int(0) - states('sensor.child_1_screen_time_this_week') | int(0) }}" | |
availability: "{{ states('sensor.child_1_weekly_screen_time_threshold') | is_number() and states('sensor.child_1_screen_time_this_week') | is_number() }}" | |
unit_of_measurement: "min" | |
- unique_id: child_2_weekly_screen_time_threshold | |
name: "Child 2 weekly screen time threshold" | |
state: "{{ states('sensor.weekly_screen_time') | int(0) + states('input_number.child_2_extra_screen_time') | int(0) }}" | |
availability: "{{ states('sensor.weekly_screen_time') | is_number() and states('input_number.child_2_extra_screen_time') | is_number() }}" | |
unit_of_measurement: "min" | |
- unique_id: child_2_corrected_screen_time_this_week | |
name: "Child 2 corrected screen time this week" | |
state: "{{ states('sensor.child_2_screen_time_this_week') | float(0) * 60 - states('input_number.child_2_correction_screen_time') | int(0) }}" | |
availability: "{{ states('sensor.child_2_screen_time_this_week') | is_number() and states('input_number.child_2_correction_screen_time') | is_number() }}" | |
unit_of_measurement: "min" | |
- unique_id: child_2_weekly_screen_time_remaining | |
name: "Child 2 weekly screen time remaining" | |
state: "{{ states('sensor.child_2_weekly_screen_time_threshold') | int(0) - states('sensor.child_2_screen_time_this_week') | int(0) }}" | |
availability: "{{ states('sensor.child_2_weekly_screen_time_threshold') | is_number() and states('sensor.child_2_screen_time_this_week') | is_number() }}" | |
unit_of_measurement: "min" |
hi @khenderick - this screen time app looks great! i'm running into one issue: the weekly_screen_time_remaining sensor isn't working for me. It's showing the weekly time threshold, without subtracting the time used this week.
This is the sensor template code i'm using (with the XXX's replaced by my kid's name):
- unique_id: xxxxx_weekly_screen_time_remaining
name: "Xxxxx weekly screen time remaining"
state: "{{ states('sensor.xxxxx_weekly_screen_time_threshold') | int(0) - states('sensor.xxxxx_screen_time_this_week') | int(0) }}"
availability: "{{ states('sensor.xxxxx_weekly_screen_time_threshold') | is_number() and states('sensor.xxxxx_screen_time_this_week') | is_number() }}"
unit_of_measurement: "min"
Seems like a pretty basic subtraction function - not sure why it's not working (but i'm new to home assistant and this coding format). Both the weekly_screen_time_threshold and the screen_time_this_week sensors shows the correct number - not sure why it's not just subtracting. Any idea what I'm doing wrong here? Thanks in advance!
Never mind - i figured it out! It's treating the screen_time_this_week as Hours, but subtracting it from minutes - so an hour of screen time consumed recorded as just one minute in the weekly total. I added a * 60, and changed the int to float, and now it's working properly!
Yeah, some entities cannot be reloaded, and need a restart. Glad it's working now 😊.