New timer cards for mobile dashboard

This commit is contained in:
2025-02-12 13:01:47 -05:00
parent 07b31f084b
commit 7493db2682

View File

@ -305,6 +305,150 @@ decluttering_templates:
opacity: ${hass.states['[[hot_entity]]'].state === 'on' ? 0.3 : 0} !important; opacity: ${hass.states['[[hot_entity]]'].state === 'on' ? 0.3 : 0} !important;
transition: all 1s !important; transition: all 1s !important;
} }
popup_timer_card:
defaults:
name: ''
entity: ''
card:
type: conditional
conditions:
- condition: state
entity: '[[entity]]'
state_not: idle
card:
type: custom:bubble-card
card_type: button
button_type: state
entity: '[[entity]]'
name: '[[name]]'
icon: mdi:timer
sub_button:
- entity: '[[entity]]'
tap_action:
action: perform-action
perform_action: timer.start
target:
entity_id: '[[entity]]'
name: Start
icon: mdi:play
visibility: []
- entity: '[[entity]]'
name: Pause
icon: mdi:pause
tap_action:
action: perform-action
perform_action: timer.pause
target:
entity_id: '[[entity]]'
- entity: '[[entity]]'
name: Cancel
icon: mdi:cancel
tap_action:
action: perform-action
perform_action: timer.cancel
target:
entity_id: '[[entity]]'
- entity: '[[entity]]'
name: Finish
icon: mdi:clock-end
tap_action:
action: perform-action
perform_action: timer.finish
target:
entity_id: '[[entity]]'
styles: |
:host{
--circle-color: var(--bubble-accent-color, var(--accent-color));
--percentage: ${(() => {
card.timerEntity = hass.states[entity];
const now = new Date();
const endTime = new Date(card.timerEntity.attributes.finishes_at);
const runningTime = Math.round((endTime - now) / 1000);
const maxtime = Math.round(new Date("1970-01-01 " + card.timerEntity.attributes.duration + " UTC") / 1000);
const remainingTime = Math.round(new Date("1970-01-01 " + card.timerEntity.attributes.remaining + " UTC") / 1000);
var percentage = 0;
if (isNaN(runningTime)) {
percentage = 100 - Math.round( 100.0 * remainingTime / maxtime);
} else {
percentage = 100 - Math.round( 100.0 * runningTime / maxtime);
}
if (isNaN(percentage)) {
return "0%";
} else {
return "" + percentage +"%";
}
})()};
}
.bubble-icon-container {
background: radial-gradient(
var(--card-background-color) 60%,
transparent 0%
), conic-gradient(
var(--circle-color) var(--percentage) 0%,
var(--card-background-color) 0% 100%
) !important;
}
.bubble-icon-container:after {
content: "" !important;
height: 100% !important;
width: 100% !important;
position: absolute !important;
border-radius: 50% !important;
background: (var(--bubble-button-icon-background-color), 0.1) !important;
}
${(() => {
function UpdateState(){
try {
let now = new Date();
let endTime = new Date(card.timerEntity.attributes.finishes_at);
let runningTime = Math.round((endTime - now)/1000);
let hours = Math.floor(runningTime / 3600);
let minutes = Math.floor((runningTime - (hours * 3600)) / 60);
let remainingSeconds = runningTime % 60;
card.querySelector('.bubble-state').innerText =
(hours > 0 ? (hours + ":") : "") +
("0" + minutes).slice(-2) + ":" +
("0" + remainingSeconds).slice(-2);
} catch (error) {
card.querySelector('.bubble-state').innerText = card.timerEntity.attributes.duration;
}
};
if (card.timer == null && card.timerEntity.state === 'active') {
card.timer = setInterval(()=>{UpdateState()}, 500);
}else if (card.timerEntity.state != 'active'){
clearInterval(card.timer);
card.timer = null;
if (card.timerEntity.state !='paused') {
card.querySelector('.bubble-state').innerText = card.timerEntity.attributes.duration;
} else if(card.timerEntity.state==='paused') {
card.querySelector('.bubble-state').innerText = card.timerEntity.attributes.remaining;
}
}
})()}
${(() => {
subButtonIcon[0].setAttribute("icon",card.timerEntity.state != 'active' ?'mdi:play' : 'mdi:replay');
})()}
${(() => {
if (card.timerEntity.state != 'active') {
card.querySelector('.bubble-sub-button-2').classList.add("hidden");
}
})()}
${(() => {
if (card.timerEntity.state === 'idle') {
card.querySelector('.bubble-sub-button-3').classList.add("hidden");
}
})()}
${(() => {
if (card.timerEntity.state === 'idle') {
card.querySelector('.bubble-sub-button-4').classList.add("hidden");
}
})()}
views: views:
- title: Home - title: Home
path: home path: home
@ -1657,27 +1801,11 @@ views:
variables: variables:
- name: Occupied - name: Occupied
- entity: binary_sensor.living_room_occupied - entity: binary_sensor.living_room_occupied
- type: custom:timer-bar-card - type: custom:decluttering-card
filter: true template: popup_timer_card
entities: variables:
- name: Lights Timer
- entity: timer.living_room_motion_timer - entity: timer.living_room_motion_timer
name: Motion Timer
sync_issues: ignore
tap_action:
action: call-service
service: timer.finish
target:
entity_id: timer.living_room_motion_timer
hold_action:
action: more-info
double_tap_action:
action: none
modifications:
- elapsed: 40%
bar_foreground: orange
- elapsed: 80%
bar_foreground: red
compressed: true
- type: custom:bubble-card - type: custom:bubble-card
card_type: separator card_type: separator
name: Security name: Security
@ -1841,27 +1969,11 @@ views:
variables: variables:
- name: Side - name: Side
- entity: binary_sensor.downstairs_bathroom_window_2 - entity: binary_sensor.downstairs_bathroom_window_2
- type: custom:timer-bar-card - type: custom:decluttering-card
filter: true template: popup_timer_card
entities: variables:
- name: Lights Timer
- entity: timer.downstairs_bathroom_lights_timer - entity: timer.downstairs_bathroom_lights_timer
name: Motion Timer
sync_issues: ignore
tap_action:
action: call-service
service: timer.finish
target:
entity_id: timer.downstairs_bathroom_lights_timer
hold_action:
action: more-info
double_tap_action:
action: none
modifications:
- elapsed: 40%
bar_foreground: orange
- elapsed: 80%
bar_foreground: red
compressed: true
- type: vertical-stack - type: vertical-stack
cards: cards:
- type: custom:bubble-card - type: custom:bubble-card
@ -2055,27 +2167,11 @@ views:
variables: variables:
- name: Window - name: Window
- entity: binary_sensor.mud_room_window - entity: binary_sensor.mud_room_window
- type: custom:timer-bar-card - type: custom:decluttering-card
filter: true template: popup_timer_card
entities: variables:
- name: Lights Timer
- entity: timer.mud_room_motion_timer - entity: timer.mud_room_motion_timer
name: Motion Timer
sync_issues: ignore
tap_action:
action: call-service
service: timer.finish
target:
entity_id: timer.mud_room_motion_timer
hold_action:
action: more-info
double_tap_action:
action: none
modifications:
- elapsed: 40%
bar_foreground: orange
- elapsed: 80%
bar_foreground: red
compressed: true
- type: vertical-stack - type: vertical-stack
cards: cards:
- type: custom:bubble-card - type: custom:bubble-card
@ -2155,27 +2251,11 @@ views:
- entity: binary_sensor.stairway_window_lower - entity: binary_sensor.stairway_window_lower
- type: custom:bubble-card - type: custom:bubble-card
card_type: empty-column card_type: empty-column
- type: custom:timer-bar-card - type: custom:decluttering-card
filter: true template: popup_timer_card
entities: variables:
- name: Lights Timer
- entity: timer.stairwell_motion_timer - entity: timer.stairwell_motion_timer
name: Motion Timer
sync_issues: ignore
tap_action:
action: call-service
service: timer.finish
target:
entity_id: timer.stairwell_motion_timer
hold_action:
action: more-info
double_tap_action:
action: none
modifications:
- elapsed: 40%
bar_foreground: orange
- elapsed: 80%
bar_foreground: red
compressed: true
- type: grid - type: grid
cards: cards:
- type: vertical-stack - type: vertical-stack
@ -2245,36 +2325,11 @@ views:
variables: variables:
- name: Occupied - name: Occupied
- entity: binary_sensor.upstairs_hallway_occupied - entity: binary_sensor.upstairs_hallway_occupied
- type: custom:timer-bar-card - type: custom:decluttering-card
filter: true template: popup_timer_card
entities: variables:
- name: Lights Timer
- entity: timer.upstairs_hallway_motion_timer - entity: timer.upstairs_hallway_motion_timer
name: Motion Timer
sync_issues: ignore
tap_action:
action: call-service
service: timer.finish
target:
entity_id: timer.upstairs_hallway_motion_timer
hold_action:
action: more-info
double_tap_action:
action: none
modifications:
- elapsed: 40%
bar_foreground: orange
- elapsed: 80%
bar_foreground: red
compressed: true
visibility:
- condition: or
conditions:
- condition: state
entity: timer.upstairs_hallway_motion_timer
state: running
- condition: state
entity: timer.upstairs_hallway_motion_timer
state: paused
- type: vertical-stack - type: vertical-stack
cards: cards:
- type: custom:bubble-card - type: custom:bubble-card
@ -2373,39 +2428,16 @@ views:
variables: variables:
- name: Occupied - name: Occupied
- entity: binary_sensor.upstairs_bathroom_occupied - entity: binary_sensor.upstairs_bathroom_occupied
- type: custom:timer-bar-card - type: custom:decluttering-card
filter: true template: popup_timer_card
entities: variables:
- name: Lights Timer
- entity: timer.upstairs_bathroom_motion_timer - entity: timer.upstairs_bathroom_motion_timer
name: Motion Timer - type: custom:decluttering-card
sync_issues: ignore template: popup_timer_card
tap_action: variables:
action: call-service - name: Shower Mode Cooldown
service: timer.finish
target:
entity_id: timer.upstairs_bathroom_motion_timer
hold_action:
action: more-info
double_tap_action:
action: none
- entity: timer.shower_mode_cooldown - entity: timer.shower_mode_cooldown
name: Cooldown
sync_issues: ignore
tap_action:
action: call-service
service: timer.finish
target:
entity_id: timer.shower_mode_cooldown
hold_action:
action: more-info
double_tap_action:
action: none
modifications:
- elapsed: 40%
bar_foreground: orange
- elapsed: 80%
bar_foreground: red
compressed: true
- type: vertical-stack - type: vertical-stack
cards: cards:
- type: custom:bubble-card - type: custom:bubble-card
@ -2670,39 +2702,16 @@ views:
variables: variables:
- name: Occupied - name: Occupied
- entity: binary_sensor.master_bedroom_occupied - entity: binary_sensor.master_bedroom_occupied
- type: custom:timer-bar-card - type: custom:decluttering-card
filter: true template: popup_timer_card
entities: variables:
- name: Lights Timer
- entity: timer.master_bedroom_motion_timer - entity: timer.master_bedroom_motion_timer
name: Motion Timer - type: custom:decluttering-card
sync_issues: ignore template: popup_timer_card
tap_action: variables:
action: call-service - name: Shower Mode Cooldown
service: timer.finish
target:
entity_id: timer.master_bedroom_motion_timer
hold_action:
action: more-info
double_tap_action:
action: none
- entity: timer.shower_mode_cooldown - entity: timer.shower_mode_cooldown
name: Cooldown
sync_issues: ignore
tap_action:
action: call-service
service: timer.finish
target:
entity_id: timer.shower_mode_cooldown
hold_action:
action: more-info
double_tap_action:
action: none
modifications:
- elapsed: 40%
bar_foreground: orange
- elapsed: 80%
bar_foreground: red
compressed: true
- type: vertical-stack - type: vertical-stack
cards: cards:
- type: custom:bubble-card - type: custom:bubble-card
@ -2876,27 +2885,11 @@ views:
variables: variables:
- name: Occupied - name: Occupied
- entity: binary_sensor.kallen_bedroom_occupied - entity: binary_sensor.kallen_bedroom_occupied
- type: custom:timer-bar-card - type: custom:decluttering-card
filter: true template: popup_timer_card
entities: variables:
- name: Lights Timer
- entity: timer.kallen_bedroom_motion_timer - entity: timer.kallen_bedroom_motion_timer
name: Motion Timer
sync_issues: ignore
tap_action:
action: call-service
service: timer.finish
target:
entity_id: timer.kallen_bedroom_motion_timer
hold_action:
action: more-info
double_tap_action:
action: none
modifications:
- elapsed: 40%
bar_foreground: orange
- elapsed: 80%
bar_foreground: red
compressed: true
- type: vertical-stack - type: vertical-stack
cards: cards:
- type: custom:bubble-card - type: custom:bubble-card
@ -3087,27 +3080,11 @@ views:
variables: variables:
- name: Occupied - name: Occupied
- entity: binary_sensor.emma_bedroom_occupied - entity: binary_sensor.emma_bedroom_occupied
- type: custom:timer-bar-card - type: custom:decluttering-card
filter: true template: popup_timer_card
entities: variables:
- name: Lights Timer
- entity: timer.emma_bedroom_motion_timer - entity: timer.emma_bedroom_motion_timer
name: Motion Timer
sync_issues: ignore
tap_action:
action: call-service
service: timer.finish
target:
entity_id: timer.emma_bedroom_motion_timer
hold_action:
action: more-info
double_tap_action:
action: none
modifications:
- elapsed: 40%
bar_foreground: orange
- elapsed: 80%
bar_foreground: red
compressed: true
- type: grid - type: grid
cards: cards:
- type: vertical-stack - type: vertical-stack