Lustigerweise habe ich 2 verschiedene Betriebsstunden Sensoren erstellt, als ich mit dem ganzen Spaß hier angefangen habe, quasi zum lernen, evtl gehts auch deutlich einfacher…
Wenn du die Betriebsstunden kennst, kannst du folgends machen.
als erstes brauchst du, wie du schon sagst, einen History Sensor.
Hier tracke ich die Zeit, wie lang der tv “on” ist. Start ist 0Uhr, der Sensor wird also immer um Mitternacht auf 0 gestellt, damit hab ich die tägliche tv_on_time_false. ich nenne sie false weil die ausgegebene zeit falsch angezeigt wird (2.77std) und später nochmal formatiert wird.
- platform: history_stats
name: tv_on_time_false
entity_id: media_player.lg_webos
state: 'on'
type: time
start: '{{ now().replace(hour=0, minute=0, second=0) }}'
end: "{{ now() }}"
nun einen Nummer Helfer erstellen, max anpassen wenn nötig,
nach dem er erstellt wurde draufklicken und man kann die bekannten betriebsstunden eingeben.
Nun eine Automation erstellen.
sie löst jeden tag um 23:59:59uhr aus, nimmt den aktuellen tageswert von tv_on_time_false und den aktuellen total wert des helfers, total_tv_time, der ja täglich mehr wird, zählt sie zusammen und schreibt den neuen wert wieder in den Nummern Helfer
alias: Update TV total on time
trigger:
- platform: time
at: "23:59:59"
action:
- service: input_number.set_value
data:
entity_id: input_number.tv_time_total
value: "{{ total_tv_time + tv_on_time }}"
variables:
total_tv_time: "{{ states('input_number.tv_time_total') | float(0) }}"
tv_on_time: "{{ states('sensor.tv_on_time_false') | float(0) }}"
weil der nummern helfer in der ui ■■■■■■■ ausieht hab ich noch einen “kombiniere sensor …” helfer erstellt und zeige den dann an
Version 2, hier beginnt die zeit speicherung erst mit erstellen der sensoren
Ich benutze mariaDB und speichere 32 Tage, damit kann ich einen Monat an Daten anzeigen.
Tägliche play time, woche, monat
- platform: history_stats
name: ps5_play_time_false
entity_id: sensor.ps5_activity
state: 'playing'
type: time
start: '{{ now().replace(hour=0, minute=0, second=0) }}'
end: "{{ now() }}"
- platform: history_stats
name: ps5_play_time_week_false
entity_id: sensor.ps5_activity
state: 'playing'
type: time
start: "{{ as_timestamp( now().replace(hour=0, minute=0, second=0, microsecond=0) ) - now().weekday() * 86400 }}"
end: "{{ now() }}"
- platform: history_stats
name: ps5_play_time_month_false
entity_id: sensor.ps5_activity
state: 'playing'
type: time
start: "{{ now().replace(day=1, hour=0, minute=0, second=0, microsecond=0 ) }}"
end: "{{ now() }}"
Wie oben schon erwähnt, muss man die Ausgabe nochmal formatieren.
- platform: template
sensors:
ps5_play_time:
unique_id: PS5 Spielzeit
value_template: >
{% set play_time = states('sensor.ps5_play_time_false') | float(0) %}
{% set hours = play_time | int %}
{% set minutes = ((play_time - hours) * 60) | round %}
{% if hours == 0 %}
{% set text = '{} min'.format(minutes) %}
{% else %}
{% set text = '{} Std {} min'.format(hours, minutes) %}
{% endif %}
{% if play_time == 0 %}
Off
{% else %}
{{ text }}
{% endif %}
- platform: template
sensors:
ps5_play_time_week:
unique_id: PS5 Spielzeit (diese Woche)
value_template: >
{% set play_time = states('sensor.ps5_play_time_week_false') | float(0) %}
{% set hours = play_time | int %}
{% set minutes = ((play_time - hours) * 60) | round %}
{% set days = 0 %}
{% set weeks = 0 %}
{% if hours >= 24 %}
{% set days = hours // 24 %}
{% set hours = hours % 24 %}
{% endif %}
{% if days >= 7 %}
{% set weeks = days // 7 %}
{% set days = days % 7 %}
{% endif %}
{% macro phrase(value, name) %}
{%- set end = 'e' if value > 1 and name == 'Tag' else '' %}
{%- set end = 'n' if value > 1 and name == 'Woche' else end %}
{{- '{} {}{}'.format(value, name, end) if value > 0 else '' }}
{%- endmacro %}
{% set text = [phrase(weeks, 'Woche'), phrase(days, 'Tag'), phrase(hours, 'Std'), phrase(minutes, 'min')] | select('!=', '') | list | join(' ') %}
{% if text == '' %}
No Playtime
{% else %}
{{ text }}
{% endif %}
- platform: template
sensors:
ps5_play_time_month:
unique_id: PS5 Spielzeit (dieser Monat)
value_template: >
{% set play_time = states('sensor.ps5_play_time_month_false') | float(0) %}
{% set hours = play_time | int %}
{% set minutes = ((play_time - hours) * 60) | round %}
{% set days = 0 %}
{% set weeks = 0 %}
{% if hours >= 24 %}
{% set days = hours // 24 %}
{% set hours = hours % 24 %}
{% endif %}
{% if days >= 7 %}
{% set weeks = days // 7 %}
{% set days = days % 7 %}
{% endif %}
{% macro phrase(value, name) %}
{%- set end = 'e' if value > 1 and name == 'Tag' else '' %}
{%- set end = 'n' if value > 1 and name == 'Woche' else end %}
{{- '{} {}{}'.format(value, name, end) if value > 0 else '' }}
{%- endmacro %}
{% set text = [phrase(weeks, 'Woche'), phrase(days, 'Tag'), phrase(hours, 'Std'), phrase(minutes, 'min')] | select('!=', '') | list | join(' ') %}
{% if text == '' %}
No Playtime
{% else %}
{{ text }}
{% endif %}
- platform: template
sensors:
ps5_play_time_year:
unique_id: PS5 Spielzeit (dieses Jahr)
value_template: >
{% set play_time = states('sensor.ps5_play_time_year_false') | float(0) %}
{% set hours = play_time | int %}
{% set minutes = ((play_time - hours) * 60) | round %}
{% set days = 0 %}
{% set weeks = 0 %}
{% if hours >= 24 %}
{% set days = hours // 24 %}
{% set hours = hours % 24 %}
{% endif %}
{% if days >= 7 %}
{% set weeks = days // 7 %}
{% set days = days % 7 %}
{% endif %}
{% macro phrase(value, name) %}
{%- set end = 'e' if value > 1 and name == 'Tag' else '' %}
{%- set end = 'n' if value > 1 and name == 'Woche' else end %}
{{- '{} {}{}'.format(value, name, end) if value > 0 else '' }}
{%- endmacro %}
{% set text = [phrase(weeks, 'Woche'), phrase(days, 'Tag'), phrase(hours, 'Std'), phrase(minutes, 'min')] | select('!=', '') | list | join(' ') %}
{% if text == '' %}
No Playtime
{% else %}
{{ text }}
{% endif %}
wie man sieht gibt es noch einen year sensor, das ist ein “verbrauchszähler” helfer der als eingangs sensor ps5_play_time_false hat und auf ein jahrliches rest gestellt ist. ich geh mal davon, dass es dadurch ein “long term” Sensor ist und dass die Daten auch über Jahre gespeichert werden.
I Love Data
Ps: man könnt auch mit influx DB arbeiten, ich will aber nicht mit zwei DB arbeiten.