Compare commits

..

2 Commits

Author SHA1 Message Date
claus 59b118b111 Add maintenance dashboard and summary counter 2026-04-09 07:35:15 +02:00
claus d664735226 Simplify heating dashboard layout 2026-04-08 19:37:09 +02:00
5 changed files with 1886 additions and 346 deletions
+11
View File
@@ -462,3 +462,14 @@ cards:
- entity: input_datetime.vacation_end - entity: input_datetime.vacation_end
name: Slutter name: Slutter
- type: conditional
conditions:
- condition: numeric_state
entity: sensor.antal_vedligeholdskort
above: 0
card:
type: tile
entity: sensor.antal_vedligeholdskort
name: Vedligehold
icon: mdi:wrench-cog
+212 -346
View File
@@ -9,216 +9,213 @@ sections:
- type: grid - type: grid
cards: cards:
- type: heading
heading: Andreas
- type: horizontal-stack
cards:
- type: custom:apexcharts-card
graph_span: 24h
header:
show: true
title: Temperaturer
show_states: true
colorize_states: true
now:
show: true
label: Nu
apex_config:
chart:
height: 240
grid:
strokeDashArray: 2
xaxis:
type: datetime
labels:
datetimeFormatter:
hour: HH:mm
yaxis:
decimalsInFloat: 1
tickAmount: 6
series:
- entity: sensor.sovevaerelse_stue_temperatur
name: Netatmo
- entity: sensor.hue_motion_sensor_2_temperature_2
name: Hue
- type: vertical-stack
cards:
- type: thermostat
entity: climate.andreas
name: Gulvvarme
- type: grid
columns: 2
square: false
cards:
- type: custom:button-card
entity: climate.andreas
name: -0.5°
icon: mdi:minus
tap_action:
action: call-service
service: climate.set_temperature
service_data:
entity_id: climate.andreas
temperature: '[[[ return Math.max(7, (entity.attributes.temperature || 0) - 0.5); ]]]'
- type: custom:button-card
entity: climate.andreas
name: +0.5°
icon: mdi:plus
tap_action:
action: call-service
service: climate.set_temperature
service_data:
entity_id: climate.andreas
temperature: '[[[ return Math.min(35, (entity.attributes.temperature || 0) + 0.5); ]]]'
- type: grid
cards:
- type: heading
heading: Daniel
- type: horizontal-stack
cards:
- type: custom:apexcharts-card
graph_span: 24h
header:
show: true
title: Temperaturer
show_states: true
colorize_states: true
now:
show: true
label: Nu
apex_config:
chart:
height: 240
grid:
strokeDashArray: 2
xaxis:
type: datetime
labels:
datetimeFormatter:
hour: HH:mm
yaxis:
decimalsInFloat: 1
tickAmount: 6
series:
- entity: sensor.sovevaerelse_daniel_temperatur
name: Netatmo
- entity: sensor.hue_motion_sensor_2_temperature
name: Hue
- type: vertical-stack
cards:
- type: thermostat
entity: climate.daniel
name: Gulvvarme
- type: grid
columns: 2
square: false
cards:
- type: custom:button-card
entity: climate.daniel
name: -0.5°
icon: mdi:minus
tap_action:
action: call-service
service: climate.set_temperature
service_data:
entity_id: climate.daniel
temperature: '[[[ return Math.max(7, (entity.attributes.temperature || 0) - 0.5); ]]]'
- type: custom:button-card
entity: climate.daniel
name: +0.5°
icon: mdi:plus
tap_action:
action: call-service
service: climate.set_temperature
service_data:
entity_id: climate.daniel
temperature: '[[[ return Math.min(35, (entity.attributes.temperature || 0) + 0.5); ]]]'
- type: grid
cards:
- type: heading
heading: Kontor
- type: horizontal-stack
cards:
- type: custom:apexcharts-card
graph_span: 24h
header:
show: true
title: Temperaturer
show_states: true
colorize_states: true
now:
show: true
label: Nu
apex_config:
chart:
height: 240
grid:
strokeDashArray: 2
xaxis:
type: datetime
labels:
datetimeFormatter:
hour: HH:mm
yaxis:
decimalsInFloat: 1
tickAmount: 6
series:
- entity: sensor.kontor_motion_temperatur
name: Hue
- type: vertical-stack
cards:
- type: thermostat
entity: climate.kontor
name: Gulvvarme
- type: grid
columns: 2
square: false
cards:
- type: custom:button-card
entity: climate.kontor
name: -0.5°
icon: mdi:minus
tap_action:
action: call-service
service: climate.set_temperature
service_data:
entity_id: climate.kontor
temperature: '[[[ return Math.max(7, (entity.attributes.temperature || 0) - 0.5); ]]]'
- type: custom:button-card
entity: climate.kontor
name: +0.5°
icon: mdi:plus
tap_action:
action: call-service
service: climate.set_temperature
service_data:
entity_id: climate.kontor
temperature: '[[[ return Math.min(35, (entity.attributes.temperature || 0) + 0.5); ]]]'
- type: grid
cards:
- type: heading
heading: Stue
- type: custom:apexcharts-card - type: custom:apexcharts-card
graph_span: 24h graph_span: 24h
header: header:
show: true show: true
title: Temperaturer title: Andreas
show_states: true
colorize_states: true
now:
show: true
label: Nu
apex_config:
chart:
height: 240
grid:
strokeDashArray: 2
xaxis:
type: datetime
labels:
datetimeFormatter:
hour: HH:mm
yaxis:
decimalsInFloat: 1
tickAmount: 6
series:
- entity: sensor.sovevaerelse_stue_temperatur
name: Netatmo
- entity: sensor.hue_motion_sensor_2_temperature_2
name: Hue
- type: thermostat
entity: climate.andreas
name: Andreas
- type: grid
cards:
- type: custom:apexcharts-card
graph_span: 24h
header:
show: true
title: Daniel
show_states: true
colorize_states: true
now:
show: true
label: Nu
apex_config:
chart:
height: 240
grid:
strokeDashArray: 2
xaxis:
type: datetime
labels:
datetimeFormatter:
hour: HH:mm
yaxis:
decimalsInFloat: 1
tickAmount: 6
series:
- entity: sensor.sovevaerelse_daniel_temperatur
name: Netatmo
- entity: sensor.hue_motion_sensor_2_temperature
name: Hue
- type: thermostat
entity: climate.daniel
name: Daniel
- type: grid
cards:
- type: custom:apexcharts-card
graph_span: 24h
header:
show: true
title: Sovevaerelse
show_states: true
colorize_states: true
now:
show: true
label: Nu
apex_config:
chart:
height: 240
grid:
strokeDashArray: 2
xaxis:
type: datetime
labels:
datetimeFormatter:
hour: HH:mm
yaxis:
decimalsInFloat: 1
tickAmount: 6
series:
- entity: sensor.sovevaerelse_temperatur
name: Netatmo
- entity: sensor.hue_motion_sensor_1_temperature_2
name: Hue sovevaerelse
- entity: sensor.hue_motion_sensor_1_temperature
name: Hue skab
- type: thermostat
entity: climate.sovev_prelse
name: Sovevaerelse
- type: grid
cards:
- type: custom:apexcharts-card
graph_span: 24h
header:
show: true
title: Kontor
show_states: true
colorize_states: true
now:
show: true
label: Nu
apex_config:
chart:
height: 240
grid:
strokeDashArray: 2
xaxis:
type: datetime
labels:
datetimeFormatter:
hour: HH:mm
yaxis:
decimalsInFloat: 1
tickAmount: 6
series:
- entity: sensor.kontor_motion_temperatur
name: Hue
- type: thermostat
entity: climate.kontor
name: Kontor
- type: grid
cards:
- type: custom:apexcharts-card
graph_span: 24h
header:
show: true
title: Gang
show_states: true
colorize_states: true
now:
show: true
label: Nu
apex_config:
chart:
height: 240
grid:
strokeDashArray: 2
xaxis:
type: datetime
labels:
datetimeFormatter:
hour: HH:mm
yaxis:
decimalsInFloat: 1
tickAmount: 6
series:
- entity: sensor.gang_sensor_temperature
name: Hue
- type: thermostat
entity: climate.fordelingsgang
name: Gang
- type: grid
cards:
- type: custom:apexcharts-card
graph_span: 24h
header:
show: true
title: Bad
show_states: true
colorize_states: true
now:
show: true
label: Nu
apex_config:
chart:
height: 240
grid:
strokeDashArray: 2
xaxis:
type: datetime
labels:
datetimeFormatter:
hour: HH:mm
yaxis:
decimalsInFloat: 1
tickAmount: 6
series:
- entity: sensor.bad_motion_sensor_temperature
name: Hue
- type: grid
cards:
- type: custom:apexcharts-card
graph_span: 24h
header:
show: true
title: Stue
show_states: true show_states: true
colorize_states: true colorize_states: true
now: now:
@@ -245,84 +242,11 @@ sections:
- type: grid - type: grid
cards: cards:
- type: heading
heading: Sovevaerelse
- type: horizontal-stack
cards:
- type: custom:apexcharts-card
graph_span: 24h
header:
show: true
title: Temperaturer
show_states: true
colorize_states: true
now:
show: true
label: Nu
apex_config:
chart:
height: 240
grid:
strokeDashArray: 2
xaxis:
type: datetime
labels:
datetimeFormatter:
hour: HH:mm
yaxis:
decimalsInFloat: 1
tickAmount: 6
series:
- entity: sensor.sovevaerelse_temperatur
name: Netatmo
- entity: sensor.hue_motion_sensor_1_temperature_2
name: Hue sovevaerelse
- entity: sensor.hue_motion_sensor_1_temperature
name: Hue skab
- type: vertical-stack
cards:
- type: thermostat
entity: climate.sovev_prelse
name: Gulvvarme
- type: grid
columns: 2
square: false
cards:
- type: custom:button-card
entity: climate.sovev_prelse
name: -0.5°
icon: mdi:minus
tap_action:
action: call-service
service: climate.set_temperature
service_data:
entity_id: climate.sovev_prelse
temperature: '[[[ return Math.max(7, (entity.attributes.temperature || 0) - 0.5); ]]]'
- type: custom:button-card
entity: climate.sovev_prelse
name: +0.5°
icon: mdi:plus
tap_action:
action: call-service
service: climate.set_temperature
service_data:
entity_id: climate.sovev_prelse
temperature: '[[[ return Math.min(35, (entity.attributes.temperature || 0) + 0.5); ]]]'
- type: grid
cards:
- type: heading
heading: Bad
- type: custom:apexcharts-card - type: custom:apexcharts-card
graph_span: 24h graph_span: 24h
header: header:
show: true show: true
title: Temperaturer title: Forgang
show_states: true show_states: true
colorize_states: true colorize_states: true
now: now:
@@ -342,73 +266,15 @@ sections:
decimalsInFloat: 1 decimalsInFloat: 1
tickAmount: 6 tickAmount: 6
series: series:
- entity: sensor.bad_motion_sensor_temperature - entity: sensor.forgang_sensor_temperature
name: Hue name: Hue
- type: thermostat
entity: climate.forgang
name: Forgang
- type: grid - type: grid
cards: cards:
- type: heading - type: thermostat
heading: Gang entity: climate.lille_bad
name: Lille bad
- type: horizontal-stack
cards:
- type: custom:apexcharts-card
graph_span: 24h
header:
show: true
title: Temperaturer
show_states: true
colorize_states: true
now:
show: true
label: Nu
apex_config:
chart:
height: 240
grid:
strokeDashArray: 2
xaxis:
type: datetime
labels:
datetimeFormatter:
hour: HH:mm
yaxis:
decimalsInFloat: 1
tickAmount: 6
series:
- entity: sensor.gang_sensor_temperature
name: Gang
- entity: sensor.forgang_sensor_temperature
name: Forgang
- type: vertical-stack
cards:
- type: thermostat
entity: climate.fordelingsgang
name: Gulvvarme
- type: grid
columns: 2
square: false
cards:
- type: custom:button-card
entity: climate.fordelingsgang
name: -0.5°
icon: mdi:minus
tap_action:
action: call-service
service: climate.set_temperature
service_data:
entity_id: climate.fordelingsgang
temperature: '[[[ return Math.max(7, (entity.attributes.temperature || 0) - 0.5); ]]]'
- type: custom:button-card
entity: climate.fordelingsgang
name: +0.5°
icon: mdi:plus
tap_action:
action: call-service
service: climate.set_temperature
service_data:
entity_id: climate.fordelingsgang
temperature: '[[[ return Math.min(35, (entity.attributes.temperature || 0) + 0.5); ]]]'
File diff suppressed because it is too large Load Diff
+3
View File
@@ -0,0 +1,3 @@
vis_alle_vedligehold:
name: Vis alle vedligehold
icon: mdi:eye-outline
+197
View File
@@ -0,0 +1,197 @@
- binary_sensor:
- name: Vedligehold bil
unique_id: maintenance_car_needed
state: >-
{{
states('sensor.snowywhite_tpms_front_left') | float(99) < 39
or states('sensor.snowywhite_tpms_front_right') | float(99) < 39
or states('sensor.snowywhite_tpms_rear_left') | float(99) < 39
or states('sensor.snowywhite_tpms_rear_right') | float(99) < 39
}}
- name: Vedligehold stovsuger
unique_id: maintenance_vacuum_needed
state: >-
{{
is_state('binary_sensor.roborock_s8_pro_ultra_dock_clean_water_box', 'on')
or is_state('binary_sensor.roborock_s8_pro_ultra_dock_dirty_water_box', 'on')
or (states('sensor.roborock_s8_pro_ultra_vacuum_error') not in ['none', 'unknown', 'unavailable'])
or (states('sensor.roborock_s8_pro_ultra_dock_error') not in ['ok', 'unknown', 'unavailable'])
or states('sensor.roborock_s8_pro_ultra_filter_restlevetid') | float(999) < 20
or states('sensor.roborock_s8_pro_ultra_dock_maintenance_brush_time_left') | float(999) < 20
}}
- name: Vedligehold opvasker
unique_id: maintenance_dishwasher_needed
state: >-
{{
is_state('binary_sensor.dishwasher_info_2', 'on')
or is_state('binary_sensor.dishwasher_svigt', 'on')
or is_state('sensor.dishwasher_status_2', 'service')
or states('sensor.dishwasher_powerdisk_level') | float(999) < 20
or states('sensor.dishwasher_salt_level') | float(999) < 20
or states('sensor.dishwasher_rinse_aid_level') | float(999) < 20
}}
- name: Vedligehold stovsuger fejl
unique_id: maintenance_vacuum_error_active
state: >-
{{ states('sensor.roborock_s8_pro_ultra_vacuum_error') not in ['none', 'unknown', 'unavailable'] }}
- name: Vedligehold dock fejl
unique_id: maintenance_dock_error_active
state: >-
{{ states('sensor.roborock_s8_pro_ultra_dock_error') not in ['ok', 'unknown', 'unavailable'] }}
- name: Vedligehold batterier
unique_id: maintenance_batteries_needed
state: >-
{{
[
states('sensor.andreas_switch_battery') | float(100),
states('sensor.daniel_switch_battery') | float(100),
states('sensor.stue_switch_battery') | float(100),
states('sensor.indkorsel_sensor_battery') | float(100),
states('sensor.stue_motion_batteri') | float(100),
states('sensor.hue_motion_sensor_1_battery') | float(100),
states('sensor.hue_motion_sensor_1_battery_2') | float(100),
states('sensor.hue_motion_sensor_2_battery') | float(100),
states('sensor.hue_motion_sensor_2_battery_2') | float(100),
states('sensor.bad_motion_sensor_battery') | float(100),
states('sensor.gang_sensor_battery') | float(100),
states('sensor.forgang_sensor_battery') | float(100),
states('sensor.kontor_motion_batteri') | float(100),
states('sensor.garage_sensor_battery') | float(100),
states('sensor.anne_battery') | float(100),
states('sensor.midt_battery') | float(100),
states('sensor.terrasse_dor_battery') | float(100),
states('sensor.venstre_battery') | float(100),
states('sensor.syd_batteri') | float(100),
states('sensor.hojre_battery') | float(100)
] | min < 20
}}
- name: Vedligehold Home Assistant
unique_id: maintenance_home_assistant_needed
state: >-
{{
is_state('binary_sensor.home_assistant_website_update_available', 'on')
or is_state('update.hacs_update', 'on')
or states('sensor.hacs') | int(0) > 0
}}
- name: Vedligehold affald
unique_id: maintenance_garbage_needed
state: >-
{{
states('sensor.affalddk_norgardsvej_22_restaffald') | float(999) <= 1
or states('sensor.affalddk_norgardsvej_22_papir_plast') | float(999) <= 1
or states('sensor.affalddk_norgardsvej_22_haveaffald') | float(999) <= 1
}}
- name: Vedligehold Synology DSM
unique_id: maintenance_synology_dsm_needed
state: >-
{{
is_state('binary_sensor.dethlefsen_security_status', 'on')
or is_state('update.dethlefsen_dsm_update', 'on')
or states('sensor.dethlefsen_drive_1_status') | lower not in ['normal', 'unknown', 'unavailable', 'none']
or states('sensor.dethlefsen_drive_2_status') | lower not in ['normal', 'unknown', 'unavailable', 'none']
or states('sensor.dethlefsen_drive_3_status') | lower not in ['normal', 'unknown', 'unavailable', 'none']
or states('sensor.dethlefsen_drive_4_status') | lower not in ['normal', 'unknown', 'unavailable', 'none']
or is_state('binary_sensor.dethlefsen_drive_1_exceeded_max_bad_sectors', 'on')
or is_state('binary_sensor.dethlefsen_drive_2_exceeded_max_bad_sectors', 'on')
or is_state('binary_sensor.dethlefsen_drive_3_exceeded_max_bad_sectors', 'on')
or is_state('binary_sensor.dethlefsen_drive_4_exceeded_max_bad_sectors', 'on')
or is_state('binary_sensor.dethlefsen_drive_1_below_min_remaining_life', 'on')
or is_state('binary_sensor.dethlefsen_drive_2_below_min_remaining_life', 'on')
or is_state('binary_sensor.dethlefsen_drive_3_below_min_remaining_life', 'on')
or is_state('binary_sensor.dethlefsen_drive_4_below_min_remaining_life', 'on')
}}
- name: Vedligehold Synology disk 1 status
unique_id: maintenance_synology_drive_1_status_needed
state: >-
{{ states('sensor.dethlefsen_drive_1_status') | lower not in ['normal', 'unknown', 'unavailable', 'none'] }}
- name: Vedligehold Synology disk 2 status
unique_id: maintenance_synology_drive_2_status_needed
state: >-
{{ states('sensor.dethlefsen_drive_2_status') | lower not in ['normal', 'unknown', 'unavailable', 'none'] }}
- name: Vedligehold Synology disk 3 status
unique_id: maintenance_synology_drive_3_status_needed
state: >-
{{ states('sensor.dethlefsen_drive_3_status') | lower not in ['normal', 'unknown', 'unavailable', 'none'] }}
- name: Vedligehold Synology disk 4 status
unique_id: maintenance_synology_drive_4_status_needed
state: >-
{{ states('sensor.dethlefsen_drive_4_status') | lower not in ['normal', 'unknown', 'unavailable', 'none'] }}
- sensor:
- name: Antal vedligeholdskort
unique_id: maintenance_cards_count
unit_of_measurement: kort
icon: mdi:wrench-cog
state: >-
{{
[
1 if is_state('binary_sensor.home_assistant_website_update_available', 'on') else 0,
1 if is_state('update.hacs_update', 'on') else 0,
1 if states('sensor.hacs') | int(0) > 0 else 0,
1 if is_state('binary_sensor.dethlefsen_security_status', 'on') else 0,
1 if is_state('update.dethlefsen_dsm_update', 'on') else 0,
1 if is_state('binary_sensor.vedligehold_synology_disk_1_status', 'on') else 0,
1 if is_state('binary_sensor.vedligehold_synology_disk_2_status', 'on') else 0,
1 if is_state('binary_sensor.vedligehold_synology_disk_3_status', 'on') else 0,
1 if is_state('binary_sensor.vedligehold_synology_disk_4_status', 'on') else 0,
1 if is_state('binary_sensor.dethlefsen_drive_1_exceeded_max_bad_sectors', 'on') else 0,
1 if is_state('binary_sensor.dethlefsen_drive_2_exceeded_max_bad_sectors', 'on') else 0,
1 if is_state('binary_sensor.dethlefsen_drive_3_exceeded_max_bad_sectors', 'on') else 0,
1 if is_state('binary_sensor.dethlefsen_drive_4_exceeded_max_bad_sectors', 'on') else 0,
1 if is_state('binary_sensor.dethlefsen_drive_1_below_min_remaining_life', 'on') else 0,
1 if is_state('binary_sensor.dethlefsen_drive_2_below_min_remaining_life', 'on') else 0,
1 if is_state('binary_sensor.dethlefsen_drive_3_below_min_remaining_life', 'on') else 0,
1 if is_state('binary_sensor.dethlefsen_drive_4_below_min_remaining_life', 'on') else 0,
1 if states('sensor.affalddk_norgardsvej_22_restaffald') | float(999) <= 1 else 0,
1 if states('sensor.affalddk_norgardsvej_22_papir_plast') | float(999) <= 1 else 0,
1 if states('sensor.affalddk_norgardsvej_22_haveaffald') | float(999) <= 1 else 0,
1 if states('sensor.snowywhite_tpms_front_left') | float(99) < 39 else 0,
1 if states('sensor.snowywhite_tpms_front_right') | float(99) < 39 else 0,
1 if states('sensor.snowywhite_tpms_rear_left') | float(99) < 39 else 0,
1 if states('sensor.snowywhite_tpms_rear_right') | float(99) < 39 else 0,
1 if is_state('binary_sensor.roborock_s8_pro_ultra_dock_clean_water_box', 'on') else 0,
1 if is_state('binary_sensor.roborock_s8_pro_ultra_dock_dirty_water_box', 'on') else 0,
1 if states('sensor.roborock_s8_pro_ultra_filter_restlevetid') | float(999) < 20 else 0,
1 if states('sensor.roborock_s8_pro_ultra_dock_maintenance_brush_time_left') | float(999) < 20 else 0,
1 if is_state('binary_sensor.vedligehold_stovsuger_fejl', 'on') else 0,
1 if is_state('binary_sensor.vedligehold_dock_fejl', 'on') else 0,
1 if is_state('binary_sensor.dishwasher_info_2', 'on') else 0,
1 if is_state('binary_sensor.dishwasher_svigt', 'on') else 0,
1 if is_state('sensor.dishwasher_status_2', 'service') else 0,
1 if states('sensor.dishwasher_powerdisk_level') | float(999) < 20 else 0,
1 if states('sensor.dishwasher_salt_level') | float(999) < 20 else 0,
1 if states('sensor.dishwasher_rinse_aid_level') | float(999) < 20 else 0,
1 if states('sensor.andreas_switch_battery') | float(100) < 20 else 0,
1 if states('sensor.daniel_switch_battery') | float(100) < 20 else 0,
1 if states('sensor.stue_switch_battery') | float(100) < 20 else 0,
1 if states('sensor.indkorsel_sensor_battery') | float(100) < 20 else 0,
1 if states('sensor.stue_motion_batteri') | float(100) < 20 else 0,
1 if states('sensor.hue_motion_sensor_1_battery') | float(100) < 20 else 0,
1 if states('sensor.hue_motion_sensor_1_battery_2') | float(100) < 20 else 0,
1 if states('sensor.hue_motion_sensor_2_battery') | float(100) < 20 else 0,
1 if states('sensor.hue_motion_sensor_2_battery_2') | float(100) < 20 else 0,
1 if states('sensor.bad_motion_sensor_battery') | float(100) < 20 else 0,
1 if states('sensor.gang_sensor_battery') | float(100) < 20 else 0,
1 if states('sensor.forgang_sensor_battery') | float(100) < 20 else 0,
1 if states('sensor.kontor_motion_batteri') | float(100) < 20 else 0,
1 if states('sensor.garage_sensor_battery') | float(100) < 20 else 0,
1 if states('sensor.anne_battery') | float(100) < 20 else 0,
1 if states('sensor.midt_battery') | float(100) < 20 else 0,
1 if states('sensor.terrasse_dor_battery') | float(100) < 20 else 0,
1 if states('sensor.venstre_battery') | float(100) < 20 else 0,
1 if states('sensor.syd_batteri') | float(100) < 20 else 0,
1 if states('sensor.hojre_battery') | float(100) < 20 else 0
] | sum
}}