This commit is contained in:
Home Assistant Version Control committed 2026-10-15 21:02:23 +00:00
1 parent fcea77b9f2
commit 2c301030e6
3 files changed
+1475 -14

No files matched your search

File diff suppressed because it is too large. Load diff
+1 -1
View File
@@ -841,7 +841,7 @@
}, },
"card_param": "cards", "card_param": "cards",
"filter": { "filter": {
"template": "{% set ns = namespace(cards=[]) %}\n{% for n in [1, 2, 3, 4] %}\n {% set sp = namespace(ent='') %}\n {% for s in states.sensor %}\n {% if sp.ent == '' and s.entity_id.startswith('sensor.spoolman_spool_') %}\n {% set loc = (s.attributes.location | default('')) | lower %}\n {% if loc == ('cfs lite ' ~ n) %}\n {% set sp.ent = s.entity_id %}\n {% endif %}\n {% endif %}\n {% endfor %}\n {% set v = namespace(html='', label='Slot ' ~ n, border='transparent', wrap='') %}\n {% if sp.ent != '' %}\n {% set hex = state_attr(sp.ent, 'filament_color_hex') | default('44739e') %}\n {% set hex_clean = hex if hex.startswith('#') else '#' ~ hex %}\n {% set remain = (state_attr(sp.ent, 'remaining_weight') | default(states(sp.ent)) | float(0)) | round(1) %}\n {% set total = state_attr(sp.ent, 'filament_weight') | float(1000) %}\n {% set raw_pct = ((remain / total) * 100) | round(1) if total > 0 else 0 %}\n {% set pct = 0 if raw_pct < 0 else (100 if raw_pct > 100 else raw_pct) %}\n {% set rem_n = states(sp.ent) | float(-1) %}\n {% set band = 2 if (rem_n >= 0 and rem_n < 25) else (1 if (rem_n >= 0 and rem_n < 100) else 0) %}\n {% set v.wrap = ' warn-crit' if band == 2 else (' warn-low' if band == 1 else '') %}\n {% set v.border = '#d0d0d0' if hex_clean | lower in ['#ffffff', '#fff'] else 'transparent' %}\n {% set v.html = \"<div class='tube-bg'><div class='tube-fill' style='height: \" ~ pct ~ \"%; background-color: \" ~ hex_clean ~ \";'></div><div class='tube-text'>\" ~ remain ~ \"g</div></div>\" %}\n {% set v.label = 'Slot ' ~ n ~ (' ⚠' if band > 0 else '') %}\n {% else %}\n {% set v.html = \"<div class='tube-bg tube-empty'></div>\" %}\n {% set v.label = \"<span class='slot-warn'>Slot \" ~ n ~ \" — empty</span>\" %}\n {% endif %}\n {% set card = {\n \"type\": \"custom:button-card\",\n \"entity\": sp.ent if sp.ent != '' else 'sensor.sparkx_i7_active_filament_slot',\n \"show_icon\": false,\n \"show_state\": false,\n \"show_name\": false,\n \"custom_fields\": {\n \"tube\": \"<div class='tube-wrap\" ~ v.wrap ~ \"'>\" ~ v.html ~ \"<div class='slot-label'>\" ~ v.label ~ \"</div></div>\"\n },\n \"styles\": {\n \"card\": [\n {\"background\": \"transparent\"},\n {\"box-shadow\": \"none\"},\n {\"border\": \"none\"},\n {\"padding\": \"8px 2px\"},\n {\"display\": \"flex\"},\n {\"flex-direction\": \"column\"},\n {\"align-items\": \"center\"}\n ],\n \"custom_fields\": {\n \"tube\": [\n {\"width\": \"100%\"},\n {\"display\": \"flex\"},\n {\"flex-direction\": \"column\"},\n {\"align-items\": \"center\"}\n ]\n }\n },\n \"extra_styles\": \"\n .tube-wrap {\n display: flex;\n flex-direction: column;\n align-items: center;\n width: 100%;\n }\n .tube-bg {\n position: relative;\n width: 60px;\n height: 180px;\n background-color: #dedede;\n border-radius: 20px;\n overflow: hidden;\n border: 1px solid \" ~ v.border ~ \";\n display: flex;\n flex-direction: column;\n justify-content: flex-end;\n }\n .tube-empty {\n background: transparent;\n border: 2px dashed var(--error-color);\n }\n .tube-fill {\n width: 100%;\n border-radius: 0 0 19px 19px;\n }\n .tube-text {\n position: absolute;\n top: 48%;\n left: 50%;\n transform: translate(-50%, -50%);\n font-size: 13px;\n font-weight: 800;\n color: #111111;\n pointer-events: none;\n z-index: 2;\n white-space: nowrap;\n }\n .slot-label {\n margin-top: 8px;\n font-size: 12px;\n font-weight: 700;\n letter-spacing: 0.3px;\n color: var(--secondary-text-color);\n }\n .slot-warn {\n color: var(--error-color);\n }\n .warn-low .tube-bg {\n background-color: #fff6df;\n outline: 2px solid var(--warning-color);\n }\n .warn-low .slot-label {\n color: var(--warning-color);\n }\n .warn-crit .tube-bg {\n background-color: #fdecea;\n outline: 2px solid var(--error-color);\n }\n .warn-crit .slot-label {\n color: var(--error-color);\n }\n \",\n \"tap_action\": {\n \"action\": \"more-info\" if sp.ent != '' else \"none\"\n }\n } %}\n\n {% set ns.cards = ns.cards + [card] %}\n{% endfor %}\n{{ ns.cards }}\n" "template": "{% set ns = namespace(cards=[]) %}\n{% for n in [1, 2, 3, 4] %}\n {% set sp = namespace(ent='') %}\n {% for s in states.sensor %}\n {% if sp.ent == '' and s.entity_id.startswith('sensor.spoolman_spool_') %}\n {% set loc = (s.attributes.location | default('')) | lower %}\n {% if loc == ('cfs lite ' ~ n) %}\n {% set sp.ent = s.entity_id %}\n {% endif %}\n {% endif %}\n {% endfor %}\n {% set v = namespace(html='', label='Slot ' ~ n, border='transparent', wrap='', text='#111111', halo='rgba(255,255,255,0.95)') %}\n {% if sp.ent != '' %}\n {% set hex = state_attr(sp.ent, 'filament_color_hex') | default('44739e') %}\n {% set hex_clean = hex if hex.startswith('#') else '#' ~ hex %}\n {% set remain = (state_attr(sp.ent, 'remaining_weight') | default(states(sp.ent)) | float(0)) | round(1) %}\n {% set total = state_attr(sp.ent, 'filament_weight') | float(1000) %}\n {% set raw_pct = ((remain / total) * 100) | round(1) if total > 0 else 0 %}\n {% set pct = 0 if raw_pct < 0 else (100 if raw_pct > 100 else raw_pct) %}\n {% set rem_n = states(sp.ent) | float(-1) %}{% set tr = hex_clean[1:3] | int(0, 16) %}{% set tg = hex_clean[3:5] | int(0, 16) %}{% set tb = hex_clean[5:7] | int(0, 16) %}{% set lum = 0.2126 * tr + 0.7152 * tg + 0.0722 * tb %}{% set v.text = '#ffffff' if (pct >= 60 and lum <= 170) else '#111111' %}{% set v.halo = 'rgba(0,0,0,0.9)' if v.text == '#ffffff' else 'rgba(255,255,255,0.95)' %}\n {% set band = 2 if (rem_n >= 0 and rem_n < 25) else (1 if (rem_n >= 0 and rem_n < 100) else 0) %}\n {% set v.wrap = ' warn-crit' if band == 2 else (' warn-low' if band == 1 else '') %}\n {% set v.border = '#d0d0d0' if hex_clean | lower in ['#ffffff', '#fff'] else 'transparent' %}\n {% set v.html = \"<div class='tube-bg'><div class='tube-fill' style='height: \" ~ pct ~ \"%; background-color: \" ~ hex_clean ~ \";'></div><div class='tube-text'>\" ~ remain ~ \"g</div></div>\" %}\n {% set v.label = 'Slot ' ~ n ~ (' ⚠' if band > 0 else '') %}\n {% else %}\n {% set v.html = \"<div class='tube-bg tube-empty'></div>\" %}\n {% set v.label = \"<span class='slot-warn'>Slot \" ~ n ~ \" — empty</span>\" %}\n {% endif %}\n {% set card = {\n \"type\": \"custom:button-card\",\n \"entity\": sp.ent if sp.ent != '' else 'sensor.sparkx_i7_active_filament_slot',\n \"show_icon\": false,\n \"show_state\": false,\n \"show_name\": false,\n \"custom_fields\": {\n \"tube\": \"<div class='tube-wrap\" ~ v.wrap ~ \"'>\" ~ v.html ~ \"<div class='slot-label'>\" ~ v.label ~ \"</div></div>\"\n },\n \"styles\": {\n \"card\": [\n {\"background\": \"transparent\"},\n {\"box-shadow\": \"none\"},\n {\"border\": \"none\"},\n {\"padding\": \"8px 2px\"},\n {\"display\": \"flex\"},\n {\"flex-direction\": \"column\"},\n {\"align-items\": \"center\"}\n ],\n \"custom_fields\": {\n \"tube\": [\n {\"width\": \"100%\"},\n {\"display\": \"flex\"},\n {\"flex-direction\": \"column\"},\n {\"align-items\": \"center\"}\n ]\n }\n },\n \"extra_styles\": \"\n .tube-wrap {\n display: flex;\n flex-direction: column;\n align-items: center;\n width: 100%;\n }\n .tube-bg {\n position: relative;\n width: 60px;\n height: 180px;\n background-color: #dedede;\n border-radius: 20px;\n overflow: hidden;\n border: 1px solid \" ~ v.border ~ \";\n display: flex;\n flex-direction: column;\n justify-content: flex-end;\n }\n .tube-empty {\n background: transparent;\n border: 2px dashed var(--error-color);\n }\n .tube-fill {\n width: 100%;\n border-radius: 0 0 19px 19px;\n }\n .tube-text {\n position: absolute;\n top: 48%;\n left: 50%;\n transform: translate(-50%, -50%);\n font-size: 13px;\n font-weight: 800;\n color: \" ~ v.text ~ \"; text-shadow: 0 0 3px \" ~ v.halo ~ \", 0 0 6px \" ~ v.halo ~ \";\n pointer-events: none;\n z-index: 2;\n white-space: nowrap;\n }\n .slot-label {\n margin-top: 8px;\n font-size: 12px;\n font-weight: 700;\n letter-spacing: 0.3px;\n color: var(--secondary-text-color);\n }\n .slot-warn {\n color: var(--error-color);\n }\n .warn-low .tube-bg {\n background-color: #fff6df;\n outline: 2px solid var(--warning-color);\n }\n .warn-low .slot-label {\n color: var(--warning-color);\n }\n .warn-crit .tube-bg {\n background-color: #fdecea;\n outline: 2px solid var(--error-color);\n }\n .warn-crit .slot-label {\n color: var(--error-color);\n }\n \",\n \"tap_action\": {\n \"action\": \"more-info\" if sp.ent != '' else Line truncated
}, },
"type": "custom:auto-entities" "type": "custom:auto-entities"
}, },
+13 -13
View File
@@ -4,7 +4,7 @@
"state": "ON", "state": "ON",
"led_brightness": 100, "led_brightness": 100,
"countdown_to_turn_off": 0, "countdown_to_turn_off": 0,
"voltage": 119.8, "voltage": 119.3,
"countdown_to_turn_on": 0, "countdown_to_turn_on": 0,
"ac_frequency": 60, "ac_frequency": 60,
"power_factor": 0.14, "power_factor": 0.14,
@@ -47,7 +47,7 @@
"countdown_to_turn_off": 0, "countdown_to_turn_off": 0,
"voltage": 119.1, "voltage": 119.1,
"countdown_to_turn_on": 0, "countdown_to_turn_on": 0,
"energy": 109.88, "energy": 109.89,
"power_factor": 0.9, "power_factor": 0.9,
"ac_frequency": 60, "ac_frequency": 60,
"update": { "update": {
@@ -58,7 +58,7 @@
"latest_release_notes": null "latest_release_notes": null
}, },
"linkquality": 145, "linkquality": 145,
"power": 94.9, "power": 91.7,
"current": 0.89, "current": 0.89,
"power_on_behavior": "on" "power_on_behavior": "on"
}, },
@@ -74,13 +74,13 @@
"led_brightness": 100, "led_brightness": 100,
"countdown_to_turn_off": 0, "countdown_to_turn_off": 0,
"countdown_to_turn_on": 0, "countdown_to_turn_on": 0,
"voltage": 119.5, "voltage": 118.6,
"state": "ON", "state": "ON",
"ac_frequency": 60, "ac_frequency": 60,
"energy": 223.05, "energy": 223.05,
"power": 6.2, "power": 131,
"current": 0.08, "current": 1.12,
"power_factor": 0.38, "power_factor": 0.96,
"update": { "update": {
"state": "idle", "state": "idle",
"installed_version": 268513381, "installed_version": 268513381,
@@ -95,11 +95,11 @@
"led_brightness": 100, "led_brightness": 100,
"countdown_to_turn_off": 0, "countdown_to_turn_off": 0,
"countdown_to_turn_on": 0, "countdown_to_turn_on": 0,
"voltage": 119.3, "voltage": 118.8,
"energy": 104.53, "energy": 104.53,
"state": "ON", "state": "ON",
"power": 61, "power": 51.2,
"current": 0.61, "current": 0.63,
"ac_frequency": 60, "ac_frequency": 60,
"power_factor": 0.79, "power_factor": 0.79,
"update": { "update": {
@@ -114,7 +114,7 @@
}, },
"0xffffb40e060895b3": { "0xffffb40e060895b3": {
"state": "ON", "state": "ON",
"voltage": 117.8, "voltage": 117.3,
"ac_frequency": 60, "ac_frequency": 60,
"energy": 15.34, "energy": 15.34,
"current": 0.31, "current": 0.31,
@@ -136,14 +136,14 @@
"0xffffb40e0608864e": { "0xffffb40e0608864e": {
"led_brightness": 100, "led_brightness": 100,
"countdown_to_turn_off": 0, "countdown_to_turn_off": 0,
"voltage": 122, "voltage": 121.7,
"energy": 37.98, "energy": 37.98,
"countdown_to_turn_on": 0, "countdown_to_turn_on": 0,
"state": "ON", "state": "ON",
"current": 0.02, "current": 0.02,
"ac_frequency": 60, "ac_frequency": 60,
"power": 0.4, "power": 0.4,
"power_factor": 0.2, "power_factor": 0.14,
"update": { "update": {
"state": "idle", "state": "idle",
"installed_version": 268513381, "installed_version": 268513381,