Skip to content

Instantly share code, notes, and snippets.

@eodabas
Last active July 25, 2025 13:20
Show Gist options
  • Save eodabas/880612a39c4ff04e573dc921ff3aabdf to your computer and use it in GitHub Desktop.
Save eodabas/880612a39c4ff04e573dc921ff3aabdf to your computer and use it in GitHub Desktop.
My Home Assistant Dashboard for my Bambulab P1S Printer
type: sections
max_columns: 3
title: P1S
path: p1s
sections:
- type: grid
cards:
- type: heading
heading_style: subtitle
badges:
- type: entity
show_state: false
show_icon: true
entity: sensor.p1s_current_stage
color: "#ff000000"
visibility:
- condition: screen
media_query: "(min-width: 1024px)"
- type: custom:mushroom-template-card
primary: "Printer State: {{ state_translated(\"binary_sensor.p1s_print_error\") }}"
secondary: >-
Error Code: {{ state_attr("binary_sensor.p1s_print_error",
"code")|replace("_", "-") }}
{% if state_attr("binary_sensor.p1s_print_error", "error") != None
and state_attr("binary_sensor.p1s_print_error", "error") != "" %}
({{ state_attr("binary_sensor.p1s_print_error", "error") }})
{% endif %}
icon: mdi:information-slab-circle
entity: binary_sensor.p1s_print_error
icon_color: red
fill_container: true
grid_options:
columns: full
visibility:
- condition: state
entity: binary_sensor.p1s_print_error
state_not: "off"
tap_action:
action: more-info
- type: custom:mushroom-template-card
primary: "HMS State: {{ state_translated(\"binary_sensor.p1s_hms_errors\") }}"
secondary: >-
Error Code: {{ state_attr("binary_sensor.p1s_hms_errors",
"1-Code")|replace("_", "-") }}
{% if state_attr("binary_sensor.p1s_hms_errors", "1-Error") != None
and state_attr("binary_sensor.p1s_hms_errors", "error") != ""
and state_attr("binary_sensor.p1s_hms_errors", "error") != "unknown" %}
({{ state_attr("binary_sensor.p1s_hms_errors", "error") }})
{% endif %}
icon: mdi:information-slab-circle
entity: binary_sensor.p1s_hms_errors
icon_color: red
fill_container: true
grid_options:
columns: full
visibility:
- condition: state
entity: binary_sensor.p1s_hms_errors
state_not: "off"
tap_action:
action: more-info
column_span: 3
- type: grid
cards:
- type: heading
icon: mdi:printer-3d
heading_style: subtitle
heading: Printer
badges:
- type: entity
show_state: true
show_icon: true
entity: light.p1s_chamber_light
tap_action:
action: toggle
name: Light
state_content:
- name
- state
color: state
- type: entity
show_state: true
show_icon: true
entity: sensor.p1s_current_stage
icon: mdi:printer-3d
color: state
- show_state: false
show_name: true
camera_view: auto
type: picture-entity
entity: image.p1s_camera
- type: picture
image_entity: image.p1s_cover_image
grid_options:
columns: 6
rows: 4
theme: macOS Theme
card_mod:
style: |
ha-card {
align-content: center;
background: linear-gradient(#999999, #111111);
//background: url('data:image/svg+xml;utf8,<?xml version="1.0" encoding="UTF-8"?><svg xmlns="http://www.w3.org/2000/svg" width="30" height="30" viewBox="0 0 4 4"><rect width="5" height="5" fill="%23ffffff50" /><path d="M0,0V5H1V0zM2,0V5H3V0zM4,0V5H5V0zM0,0H5V1H0zM0,2H5V3H0zM0,4H5V5H0z" fill="%23aaaaaa50" fill-rule="evenodd"/></svg>');
}
img {
filter: drop-shadow(0px 5px 2px #00000055);
}
- type: custom:stack-in-card
horizontal: true
cards:
- type: markdown
content: >
<div><font size="5">{{ states.sensor.p1s_task_name.state[:60]
}}</font></div>
<table width=100%><tr><td align=left>Printed layers<td
align=right><font color=#77fc54 ; size="4">{{
states.sensor.p1s_current_layer.state}}</font>/{{states.sensor.p1s_total_layer_count.state}}</td></tr></table>
<table width=100%><tr> <td align=left><font
size="5";color=#77fc54>{{
states.sensor.p1s_print_progress.state}}%<td align=right> {% if
(states.sensor.p1s_remaining_time.state | int) == 0 %}
Success
{% else %}
<font color=#959595>-{{(states.sensor.p1s_remaining_time.state | int/60) | int }}h{{ states.sensor.p1s_remaining_time.state| int % 60 }}m
{% endif %} </td> </tr></table>
card_mod:
style:
.: |
ha-card {
position: absolute;
top: 0px;
}
ha-markdown:
$: |
div {
height: 135px;
overflow: hidden;
word-break: break-words;
hyphens: auto!important;
hyphenate-character: " ";
}
grid_options:
columns: 6
rows: 3
- type: custom:entity-progress-card
entity: sensor.p1s_print_progress
unit: "%"
show_more_info: false
bar_size: small
bar_color: var(--green-color)
layout: horizontal
icon: none
hide:
- icon
- name
- secondary_info
grid_options:
columns: 6
rows: 1
card_mod:
style: |
ha-card {
height: 100%;
align-content: end;
}
grid_options:
columns: 6
rows: 4
- type: custom:ha-bambulab-print_control-card
printer: 27069188e8387ed3d25eae2602210d3b
grid_options:
columns: full
rows: auto
card_mod:
style: |
div.control-container {
width: 100%;
overflow: hidden;
}
div.buttons-container {
gap: 0px
}
- type: custom:mushroom-fan-card
entity: fan.teckin_plug_4_bentobox_external_socket_1
name: Bento Ext
grid_options:
columns: 4
rows: 1
tap_action:
action: more-info
icon_animation: true
- type: custom:mushroom-fan-card
entity: fan.teckin_plug_2_bentobox_internal_socket_1
name: Bento Int
grid_options:
columns: 4
rows: 1
tap_action:
action: more-info
icon_animation: true
- type: custom:mushroom-template-card
primary: Air Purifier
secondary: |
{% if states(config.entity) == "on" %}
{% if state_attr(config.entity, "mode") == "manual" %}
{{ state_attr(config.entity, "percentage") }}%
{% else %}
{{ state_attr(config.entity, "mode") | capitalize }}
{% endif %}
{% if state_attr(config.entity, "mode") in [ "manual", "auto"] %}
● {{ state_translated('sensor.levoit_131s_air_purifier_air_quality') | capitalize }}
{% endif %}
{% else %}
{{ state_translated(config.entity) }}
{% endif %}
icon: |
{% if is_state(config.entity, 'on') %}
mdi:fan
{% else %}
mdi:fan-off
{% endif %}
entity: fan.levoit_131s_air_purifier
tap_action:
action: more-info
grid_options:
columns: 4
rows: 1
badge_icon: |
{% if states(config.entity) == "on" %}
{% if state_attr(config.entity, "mode") == "sleep" %}
mdi:power-sleep
{% endif %}{% endif %}
badge_color: orange
card_mod:
style:
mushroom-shape-icon$: |
.shape {
{% if is_state(config.entity, 'on') %}
--icon-color: rgb(var(--rgb-state-fan));
--shape-color: rgba(var(--rgb-state-fan), 0.2);
{% endif %}
display: flex;
}
mushroom-shape-icon: |
ha-state-icon {
{% if is_state(config.entity, 'on') %}
{% if state_attr(config.entity, "mode") == "auto" %}
{% if is_state('sensor.levoit_131s_air_purifier_air_quality', 'excellent') %}
animation: spin 8s linear infinite;
{% elif is_state('sensor.levoit_131s_air_purifier_air_quality', 'good') %}
animation: spin {{ 1 / (1.5 * (33 / 100) ** 0.5) }}s linear infinite;
{% elif is_state('sensor.levoit_131s_air_purifier_air_quality', 'fine') %}
animation: spin {{ 1 / (1.5 * (66 / 100) ** 0.5) }}s linear infinite;
{% elif is_state('sensor.levoit_131s_air_purifier_air_quality', 'bad') %}
animation: spin {{ 1 / (1.5 * (100 / 100) ** 0.5) }}s linear infinite;
{% endif %}
{% elif state_attr(config.entity, "mode") == "manual" %}
animation: spin {{ 1 / (1.5 * (state_attr(config.entity, "percentage") / 100) ** 0.5) }}s linear infinite;
{% endif %}
{% else %}
--shape-animation: none;
{% endif %}
}
- type: custom:mushroom-fan-card
entity: fan.p1s_chamber_fan
name: Chamber
grid_options:
columns: 4
rows: 1
tap_action:
action: more-info
icon_animation: true
- type: custom:mushroom-fan-card
entity: fan.p1s_aux_fan
name: Aux
grid_options:
columns: 4
rows: 1
tap_action:
action: more-info
icon_animation: true
- type: custom:mushroom-fan-card
entity: fan.p1s_cooling_fan
name: Cooling
grid_options:
columns: 4
rows: 1
tap_action:
action: more-info
icon_animation: true
- type: grid
cards:
- type: heading
icon: mdi:camera-control
heading_style: subtitle
badges: []
heading: Status
- show_name: true
show_icon: true
show_state: true
type: glance
entities:
- entity: sensor.p1s_nozzle_temperature
icon: mdi:printer-3d-nozzle-heat
name: Nozzle
card_mod:
style: |
:host {
--paper-item-icon-color: white;
--icon-primary-color: white;
}
state-badge {
background-color: #D5AE43;
border-radius: 50%;
}
div {
white-space: unset !important;
text-wrap: balance !important;
}
- entity: sensor.p1s_bed_temperature
icon: mdi:train-car-flatbed
name: Print Bed
card_mod:
style: |
:host {
--paper-item-icon-color: white;
--icon-primary-color: white;
}
state-badge {
background-color: #4DAE51;
border-radius: 50%;
}
div {
white-space: unset !important;
text-wrap: balance !important;
}
- entity: sensor.p1s_chamber_multi_sensor_temperature
icon: mdi:printer-3d
name: Chamber
card_mod:
style: |
:host {
--paper-item-icon-color: white;
--icon-primary-color: white;
}
state-badge {
background-color: #6594E4;
border-radius: 50%;
}
div {
white-space: unset !important;
text-wrap: balance !important;
}
- entity: select.p1s_printing_speed
name: Speed
icon: mdi:window-close
card_mod:
style: |
{% set current_sensor = "select.p1s_printing_speed" %}
:host {
--paper-item-icon-color: white;
--icon-primary-color: white;
{% if is_state(current_sensor, "silent") %}
--card-mod-icon: mdi:speedometer-slow;
{% elif is_state(current_sensor, "standard") %}
--card-mod-icon: mdi:speedometer-medium;
{% elif is_state(current_sensor, "sport") %}
--card-mod-icon: mdi:speedometer;
{% elif is_state(current_sensor, "ludicrous") %}
--card-mod-icon: mdi:rocket-launch;
{% else %}
--card-mod-icon: mdi:window-close
{% endif %}
}
state-badge {
background-color: orange;
border-radius: 50%;
}
div {
white-space: unset !important;
text-wrap: balance !important;
}
state_color: false
card_mod:
style: |
ha-card {
font-size: 12px;
height: 100%
}
ha-card.type-glance .entities {
align-items: flex-start !important;
}
- type: heading
heading: Ext. Spool
heading_style: subtitle
grid_options:
columns: 3
icon: mdi:alpha-e-box
- type: heading
heading: AMS
heading_style: subtitle
grid_options:
columns: 9
badges:
- type: entity
show_state: true
show_icon: true
entity: sensor.p1s_ams_1_multi_sensor_temperature
tap_action:
action: more-info
- type: entity
show_state: true
show_icon: true
entity: sensor.p1s_ams_1_multi_sensor_humidity
tap_action:
action: more-info
- type: entity
show_state: true
show_icon: true
entity: sensor.p1s_ams_1_humidity_index
tap_action:
action: more-info
icon: mdi:alpha-a-box
tap_action:
action: perform-action
perform_action: input_boolean.toggle
target:
entity_id: input_boolean.enable_ha_bambulab_ams_spool_cards
- type: custom:ha-bambulab-spool-card
header: Header Text
subtitle: Subtitle Text
show_header: true
show_type: true
spool: 463cf2384c0f8deb41635045674cde41
card_mod:
style:
.: |
ha-card {
background: var(--ha-card-background, var(--card-background-color, #fff));
-webkit-backdrop-filter: var(--ha-card-backdrop-filter, none);
backdrop-filter: var(--ha-card-backdrop-filter, none);
box-shadow: var(--ha-card-box-shadow, none);
box-sizing: border-box;
border-radius: var(--ha-card-border-radius, 12px);
border-width: var(--ha-card-border-width, 1px);
border-style: solid;
border-color: var(--ha-card-border-color, var(--divider-color, #e0e0e0));
color: var(--primary-text-color);
display: block;
transition: all .3sease-out;
position: relative;
}
ha-bambulab-spool {
xbackground-color: red!important;
margin: 5px;
}
ha-bambulab-spool $ ams-popup: |
div.ha-bambulab-spool-card-container {
xbackground-color: cyan;
}
div.ha-bambulab-spool-card-holder {
border: 7px solid rgba(0,0,0,0) !important;
background: none !important;
}
div.ha-bambulab-spool-container {
border: 2px solid rgba(0,0,0,0);
}
div.ha-bambulab-spool-card-holder {
width: 62px;
margin-left: auto;
margin-right: auto;
}
div.ha-bambulab-spool-info {
background: none;
font-weight: 500;
font-size: 12px;
line-height: 16px;
color: var(--card-primary-color);
letter-spacing: 0.1px;
text-overflow: ellipsis;
overflow: hidden;
}
div.v-string-roll {
xbackground-image: url('data:image/svg+xml;utf8,<?xml version="1.0" encoding="UTF-8"?><svg xmlns="http://www.w3.org/2000/svg" width="30" height="30" viewBox="0 0 4 4"><rect width="5" height="5" fill="%23ffffff50" /><path d="M0,0V5H1V0zM2,0V5H3V0zM4,0V5H5V0zM0,0H5V1H0zM0,2H5V3H0zM0,4H5V5H0z" fill="%23aaaaaa50" fill-rule="evenodd"/></svg>') !important;
}
div.v-string-layer {
background-color: rgba(0, 0, 0, 0.1);
}
visibility:
- condition: state
entity: input_boolean.enable_ha_bambulab_ams_spool_cards
state: "on"
- type: horizontal-stack
cards:
- type: custom:ha-bambulab-ams-card
entity: ""
header: ""
subtitle: ""
style: vector
ams: 489dc2f60789a8ab9cacb6acadd201a4
show_type: true
show_info_bar: false
card_mod:
style:
.: |
ha-card {
background: var(--ha-card-background, var(--card-background-color, #fff));
-webkit-backdrop-filter: var(--ha-card-backdrop-filter, none);
backdrop-filter: var(--ha-card-backdrop-filter, none);
box-shadow: var(--ha-card-box-shadow, none);
box-sizing: border-box;
border-radius: var(--ha-card-border-radius, 12px);
border-width: var(--ha-card-border-width, 1px);
border-style: solid;
border-color: var(--ha-card-border-color, var(--divider-color, #e0e0e0));
color: var(--primary-text-color);
display: block;
transition: all .3sease-out;
position: relative;
}
ha-bambulab-spool {
padding: 0px 0px !important;
}
ha-bambulab-spool $:
ams-popup: |
div.ha-bambulab-spool-card-container {
xbackground-color: cyan;
}
div.ha-bambulab-spool-card-holder {
border: 7px solid rgba(0,0,0,0) !important;
background: none !important;
}
div.ha-bambulab-spool-container {
border: 2px solid rgba(0,0,0,0);
}
div.ha-bambulab-spool-card-holder {
width: 62px;
margin-left: auto;
margin-right: auto;
}
div.ha-bambulab-spool-info {
background: none;
font-weight: 500;
font-size: 12px;
line-height: 16px;
color: var(--card-primary-color);
letter-spacing: 0.1px;
text-overflow: ellipsis;
overflow: hidden;
}
div.v-string-roll {
xbackground-image: url('data:image/svg+xml;utf8,<?xml version="1.0" encoding="UTF-8"?><svg xmlns="http://www.w3.org/2000/svg" width="30" height="30" viewBox="0 0 4 4"><rect width="5" height="5" fill="%23ffffff50" /><path d="M0,0V5H1V0zM2,0V5H3V0zM4,0V5H5V0zM0,0H5V1H0zM0,2H5V3H0zM0,4H5V5H0z" fill="%23aaaaaa50" fill-rule="evenodd"/></svg>') !important;
}
div.v-string-layer {
background-color: rgba(0, 0, 0, 0.1);
}
grid_options:
columns: 9
rows: 3
visibility:
- condition: state
entity: input_boolean.enable_ha_bambulab_ams_spool_cards
state: "on"
- type: custom:stack-in-card
mode: horizontal
keep:
outer_padding: true;
cards:
- type: custom:mushroom-template-card
entity: sensor.p1s_externalspool_external_spool
primary: >
{% if states(config.entity) in [ "", "unknown" ] %}Unknown {{
state_attr(config.entity, 'type') }}{% else %}{{
state_translated(config.entity) }}{% endif %}
secondary: |
{% if state_attr(config.entity, 'remain') > -1 %}{{
state_attr(config.entity, 'remain') }}%{% endif %}
icon: >
{% if is_state_attr(config.entity, "active", true) %}
mdi:printer-3d-nozzle
{% elif is_state_attr(config.entity, 'empty', true) or
is_state_attr(config.entity, 'name', "") or
is_state_attr(config.entity, 'color', "#00000000") %}
mdi:help
{% else %}
mdi:
{% endif %}
layout: vertical
multiline_secondary: true
tap_action:
action: more-info
card_mod:
style:
.: |
ha-card { height: 140px !important; }
mushroom-card { }
mushroom-state-item$: |
div.container { justify-content: normal; }
mushroom-state-info$: |
.primary {
white-space: pre-wrap!important;
height: 60px;
font-size: var(--card-secondary-font-size)!important;
line-height: var(--card-secondary-line-height)!important;
}
mushroom-shape-icon$: |
.shape {
--filament-color: {{ state_attr(config.entity, 'color') }};
display: flex;
box-shadow: 0 0 0 5px var(--shape-color) !important;
{% if is_state_attr(config.entity, 'empty', true) or is_state_attr(config.entity, 'name', "") or is_state_attr(config.entity, 'color', "#00000000") %}
background: url('data:image/svg+xml;utf8,<?xml version="1.0" encoding="UTF-8"?><svg xmlns="http://www.w3.org/2000/svg" width="30" height="30" viewBox="0 0 4 4"><rect width="5" height="5" fill="%23ffffff50" /><path d="M0,0V5H1V0zM2,0V5H3V0zM4,0V5H5V0zM0,0H5V1H0zM0,2H5V3H0zM0,4H5V5H0z" fill="%23aaaaaa50" fill-rule="evenodd"/></svg>');
background-color: white!important;
--icon-color: white;
{% else %}
background-color: var(--filament-color)!important;
--icon-color: var(--filament-color);
{% endif %}
border-radius: 50% !important;
}
ha-state-icon$: |
@keyframes shake {
50% {
transform: translate3d(4px, 0, 0);
}
}
ha-icon {
{% if is_state_attr(config.entity, "active", true) %}
animation: shake 0.2s infinite linear;
{% endif %}
filter: invert(1) grayscale(1) brightness(500%) opacity(0.5);
}
grid_options:
columns: 3
rows: auto
visibility:
- condition: state
entity: input_boolean.enable_ha_bambulab_ams_spool_cards
state: "off"
- type: custom:stack-in-card
mode: horizontal
keep:
outer_padding: true;
cards:
- type: custom:mushroom-template-card
entity: sensor.p1s_ams_1_tray_1
primary: >
{{ state_translated(config.entity) }}{% if
is_state_attr(config.entity, "name", None) %} {{
state_attr(config.entity, 'type') }}{% endif %}
secondary: |
{% if state_attr(config.entity, 'remain') > -1 %}{{
state_attr(config.entity, 'remain') }}%{% endif %}
icon: |
{% if is_state_attr(config.entity, "active", true) %}
mdi:printer-3d-nozzle
{% elif is_state_attr(config.entity, 'empty', true) %}
mdi:slash-forward
{% elif is_state_attr(config.entity, 'color', "#00000000") %}
mdi:help
{% else %}
mdi:
{% endif %}
layout: vertical
multiline_secondary: true
tap_action:
action: more-info
card_mod:
style:
.: |
ha-card { height: 140px !important; }
mushroom-card { }
mushroom-state-item$: |
div.container { justify-content: normal; }
mushroom-state-info$: |
.primary {
white-space: pre-wrap!important;
height: 60px;
font-size: var(--card-secondary-font-size)!important;
line-height: var(--card-secondary-line-height)!important;
}
mushroom-shape-icon$: |
.shape {
--filament-color: {{ state_attr(config.entity, 'color') }};
display: flex;
box-shadow: 0 0 0 5px var(--shape-color) !important;
{% if is_state_attr(config.entity, 'empty', true) or is_state_attr(config.entity, 'color', "#00000000") %}
background: url('data:image/svg+xml;utf8,<?xml version="1.0" encoding="UTF-8"?><svg xmlns="http://www.w3.org/2000/svg" width="30" height="30" viewBox="0 0 4 4"><rect width="5" height="5" fill="%23ffffff50" /><path d="M0,0V5H1V0zM2,0V5H3V0zM4,0V5H5V0zM0,0H5V1H0zM0,2H5V3H0zM0,4H5V5H0z" fill="%23aaaaaa50" fill-rule="evenodd"/></svg>');
background-color: white!important;
--icon-color: white;
{% else %}
background-color: var(--filament-color)!important;
--icon-color: var(--filament-color);
{% endif %}
border-radius: 50% !important;
}
ha-state-icon$: |
@keyframes shake {
50% {
transform: translate3d(4px, 0, 0);
}
}
ha-icon {
{% if is_state_attr(config.entity, "active", true) %}
animation: shake 0.2s infinite linear;
{% endif %}
filter: invert(1) grayscale(1) brightness(500%) opacity(0.5);
}
- type: custom:mushroom-template-card
entity: sensor.p1s_ams_1_tray_2
primary: >
{{ state_translated(config.entity) }}{% if
is_state_attr(config.entity, "name", None) %} {{
state_attr(config.entity, 'type') }}{% endif %}
secondary: |
{% if state_attr(config.entity, 'remain') > -1 %}{{
state_attr(config.entity, 'remain') }}%{% endif %}
icon: |
{% if is_state_attr(config.entity, "active", true) %}
mdi:printer-3d-nozzle
{% elif is_state_attr(config.entity, 'empty', true) %}
mdi:slash-forward
{% elif is_state_attr(config.entity, 'color', "#00000000") %}
mdi:help
{% else %}
mdi:
{% endif %}
layout: vertical
multiline_secondary: true
tap_action:
action: more-info
card_mod:
style:
.: |
ha-card { height: 140px !important; }
mushroom-card { }
mushroom-state-item$: |
div.container { justify-content: normal; }
mushroom-state-info$: |
.primary {
white-space: pre-wrap!important;
height: 60px;
font-size: var(--card-secondary-font-size)!important;
line-height: var(--card-secondary-line-height)!important;
}
mushroom-shape-icon$: |
.shape {
--filament-color: {{ state_attr(config.entity, 'color') }};
display: flex;
box-shadow: 0 0 0 5px var(--shape-color) !important;
{% if is_state_attr(config.entity, 'empty', true) or is_state_attr(config.entity, 'color', "#00000000") %}
background: url('data:image/svg+xml;utf8,<?xml version="1.0" encoding="UTF-8"?><svg xmlns="http://www.w3.org/2000/svg" width="30" height="30" viewBox="0 0 4 4"><rect width="5" height="5" fill="%23ffffff50" /><path d="M0,0V5H1V0zM2,0V5H3V0zM4,0V5H5V0zM0,0H5V1H0zM0,2H5V3H0zM0,4H5V5H0z" fill="%23aaaaaa50" fill-rule="evenodd"/></svg>');
background-color: white!important;
--icon-color: white;
{% else %}
background-color: var(--filament-color)!important;
--icon-color: var(--filament-color);
{% endif %}
border-radius: 50% !important;
}
ha-state-icon$: |
@keyframes shake {
50% {
transform: translate3d(4px, 0, 0);
}
}
ha-icon {
{% if is_state_attr(config.entity, "active", true) %}
animation: shake 0.2s infinite linear;
{% endif %}
filter: invert(1) grayscale(1) brightness(500%) opacity(0.5);
}
- type: custom:mushroom-template-card
entity: sensor.p1s_ams_1_tray_3
primary: >
{{ state_translated(config.entity) }}{% if
is_state_attr(config.entity, "name", None) %} {{
state_attr(config.entity, 'type') }}{% endif %}
secondary: |
{% if state_attr(config.entity, 'remain') > -1 %}{{
state_attr(config.entity, 'remain') }}%{% endif %}
icon: |
{% if is_state_attr(config.entity, "active", true) %}
mdi:printer-3d-nozzle
{% elif is_state_attr(config.entity, 'empty', true) %}
mdi:slash-forward
{% elif is_state_attr(config.entity, 'color', "#00000000") %}
mdi:help
{% else %}
mdi:
{% endif %}
layout: vertical
multiline_secondary: true
tap_action:
action: more-info
card_mod:
style:
.: |
ha-card { height: 140px !important; }
mushroom-card { }
mushroom-state-item$: |
div.container { justify-content: normal; }
mushroom-state-info$: |
.primary {
white-space: pre-wrap!important;
height: 60px;
font-size: var(--card-secondary-font-size)!important;
line-height: var(--card-secondary-line-height)!important;
}
mushroom-shape-icon$: |
.shape {
--filament-color: {{ state_attr(config.entity, 'color') }};
display: flex;
box-shadow: 0 0 0 5px var(--shape-color) !important;
{% if is_state_attr(config.entity, 'empty', true) or is_state_attr(config.entity, 'color', "#00000000") %}
background: url('data:image/svg+xml;utf8,<?xml version="1.0" encoding="UTF-8"?><svg xmlns="http://www.w3.org/2000/svg" width="30" height="30" viewBox="0 0 4 4"><rect width="5" height="5" fill="%23ffffff50" /><path d="M0,0V5H1V0zM2,0V5H3V0zM4,0V5H5V0zM0,0H5V1H0zM0,2H5V3H0zM0,4H5V5H0z" fill="%23aaaaaa50" fill-rule="evenodd"/></svg>');
background-color: white!important;
--icon-color: white;
{% else %}
background-color: var(--filament-color)!important;
--icon-color: var(--filament-color);
{% endif %}
border-radius: 50% !important;
}
ha-state-icon$: |
@keyframes shake {
50% {
transform: translate3d(4px, 0, 0);
}
}
ha-icon {
{% if is_state_attr(config.entity, "active", true) %}
animation: shake 0.2s infinite linear;
{% endif %}
filter: invert(1) grayscale(1) brightness(500%) opacity(0.5);
}
- type: custom:mushroom-template-card
entity: sensor.p1s_ams_1_tray_4
primary: >
{{ state_translated(config.entity) }}{% if
is_state_attr(config.entity, "name", None) %} {{
state_attr(config.entity, 'type') }}{% endif %}
secondary: |
{% if state_attr(config.entity, 'remain') > -1 %}{{
state_attr(config.entity, 'remain') }}%{% endif %}
icon: |
{% if is_state_attr(config.entity, "active", true) %}
mdi:printer-3d-nozzle
{% elif is_state_attr(config.entity, 'empty', true) %}
mdi:slash-forward
{% elif is_state_attr(config.entity, 'color', "#00000000") %}
mdi:help
{% else %}
mdi:
{% endif %}
layout: vertical
multiline_secondary: true
tap_action:
action: more-info
card_mod:
style:
.: |
ha-card { height: 140px !important; }
mushroom-card { }
mushroom-state-item$: |
div.container { justify-content: normal; }
mushroom-state-info$: |
.primary {
white-space: pre-wrap!important;
height: 60px;
font-size: var(--card-secondary-font-size)!important;
line-height: var(--card-secondary-line-height)!important;
}
mushroom-shape-icon$: |
.shape {
--filament-color: {{ state_attr(config.entity, 'color') }};
display: flex;
box-shadow: 0 0 0 5px var(--shape-color) !important;
{% if is_state_attr(config.entity, 'empty', true) or is_state_attr(config.entity, 'color', "#00000000") %}
background: url('data:image/svg+xml;utf8,<?xml version="1.0" encoding="UTF-8"?><svg xmlns="http://www.w3.org/2000/svg" width="30" height="30" viewBox="0 0 4 4"><rect width="5" height="5" fill="%23ffffff50" /><path d="M0,0V5H1V0zM2,0V5H3V0zM4,0V5H5V0zM0,0H5V1H0zM0,2H5V3H0zM0,4H5V5H0z" fill="%23aaaaaa50" fill-rule="evenodd"/></svg>');
background-color: white!important;
--icon-color: white;
{% else %}
background-color: var(--filament-color)!important;
--icon-color: var(--filament-color);
{% endif %}
border-radius: 50% !important;
}
ha-state-icon$: |
@keyframes shake {
50% {
transform: translate3d(4px, 0, 0);
}
}
ha-icon {
{% if is_state_attr(config.entity, "active", true) %}
animation: shake 0.2s infinite linear;
{% endif %}
filter: invert(1) grayscale(1) brightness(500%) opacity(0.5);
}
grid_options:
columns: 9
rows: auto
visibility:
- condition: state
entity: input_boolean.enable_ha_bambulab_ams_spool_cards
state: "off"
- type: heading
icon: fas:temperature-half
heading: Temperatures
heading_style: subtitle
- type: custom:mini-graph-card
name: Nozzle Temp.
line_width: 7
font_size: 60
animate: true
decimals: 1
points_per_hour: 60
unit: " "
show:
labels: false
points: false
state: true
fill: false
tap_action:
action: none
state_map:
- value: "005"
label: "Off"
entities:
- entity: sensor.p1s_nozzle_target_temperature
name: Target
state_adaptive_color: true
show_state: true
show_fill: true
show_line: true
font_size: 50
smooth: false
- entity: sensor.p1s_nozzle_temperature
name: Nozzle
state_adaptive_color: true
show_state: true
show_fill: false
hours_to_show: 6
grid_options:
columns: 6
- type: custom:mini-graph-card
name: Bed Temp.
line_width: 7
font_size: 60
animate: true
decimals: 1
points_per_hour: 60
unit: " "
show:
labels: false
points: false
state: true
fill: false
tap_action:
action: none
state_map:
- value: "005"
label: "Off"
entities:
- entity: sensor.p1s_bed_target_temperature
name: Target
state_adaptive_color: true
show_state: true
show_fill: true
show_line: true
font_size: 50
smooth: false
- entity: sensor.p1s_bed_temperature
name: Bed
state_adaptive_color: true
show_state: true
show_fill: false
hours_to_show: 6
grid_options:
columns: 6
- type: grid
cards:
- type: heading
icon: fas:temperature-half
heading: Temperature History
heading_style: subtitle
- chart_type: line
period: 5minute
type: statistics-graph
entities:
- entity: sensor.p1s_nozzle_temperature
name: Nozzle
- entity: sensor.p1s_bed_temperature
name: Bed
- entity: sensor.p1s_chamber_multi_sensor_temperature
name: Chamber
- entity: sensor.p1s_ams_1_multi_sensor_temperature
name: AMS
stat_types:
- mean
days_to_show: 0.2
- type: heading
icon: mdi:fan
heading: Fans
heading_style: subtitle
- chart_type: line
period: 5minute
type: statistics-graph
entities:
- entity: sensor.p1s_aux_fan_speed
name: Aux
- entity: sensor.p1s_cooling_fan_speed
name: Cooling
- entity: sensor.p1s_chamber_fan_speed
name: Chamber
- entity: sensor.p1s_heatbreak_fan_speed
name: Heat Break
stat_types:
- mean
days_to_show: 0.2
logarithmic_scale: false
- type: heading
icon: fas:triangle-exclamation
heading: Errors History
heading_style: subtitle
- type: custom:multiple-logbook-card
entities:
- entity: binary_sensor.p1s_print_error
attributes:
- value: code
- value: error
hidden_state:
- "off"
- unavailable
- entity: binary_sensor.p1s_hms_errors
attributes:
- value: 1-Code
label: Code
- value: 1-Error
label: Error
- value: 1-Wiki
label: Wiki
type: url
link_label: Click to visit
- value: count
hidden_state:
- "off"
- unavailable
show:
state: false
duration: true
start_date: true
end_date: false
icon: true
separator: true
entity_name: true
custom_logs: false
grid_options:
columns: 12
subview: true
cards: []
badges: []
top_margin: false
header:
layout: responsive
badges_position: bottom
type: custom:stack-in-card
horizontal: true
cards:
- type: custom:mushroom-template-card
primary: |
P1S - {{ state_translated("sensor.p1s_current_stage") }}
secondary: "{{ state_translated(\"sensor.p1s_task_name\") }}"
icon: none
icon_color: blue
layout: horizontal
fill_container: false
multiline_secondary: true
tap_action:
action: navigate
navigation_path: /lovelace/p1s
card_mod:
style:
.: |
ha-card {
dheight: 140px !important;
--icon-size: 96px ;
}
mushroom-card { }
mushroom-state-item$: |
div.container {
justify-content: normal;
flex-direction: row-reverse;
{% if (states("sensor.p1s_print_progress") | int) == 100 %}
padding-bottom: 10px;
{% else %}
padding-bottom: 0px;
{% endif %}
}
mushroom-state-info$: |
.primary {
white-space: pre-wrap!important;
height: 45px;
align-content: flex-end;
color: green !important;
font-size: 16px !important;
}
.secondary {
}
mushroom-shape-icon$: |
.shape {
display: flex;
xbox-shadow: 0 0 0 5px var(--shape-color) !important;
background: url("{{ state_attr('image.p1s_cover_image', 'entity_picture') }}");
background:
center / contain no-repeat
url("{{ state_attr('image.p1s_cover_image', 'entity_picture') }}"),
linear-gradient(#999999, #444444);
border-radius: 20% !important;
}
- type: custom:entity-progress-card
entity: sensor.p1s_print_progress
unit: "%"
show_more_info: false
bar_size: small
bar_color: var(--green-color)
layout: horizontal
icon: none
hide:
- icon
- name
- secondary_info
tap_action:
action: navigate
navigation_path: /lovelace/p1s
card_mod:
style: |
ha-card {
height: 10px;
margin-top: 0px;
margin-bottom: 0px;
}
visibility:
- condition: numeric_state
entity: sensor.p1s_print_progress
below: 100
- type: markdown
content: |
<table width=100%>
<tr>
<td align=left valign=top>
<font size=2>Time Left</font><br />
<strong>
-{{ (states("sensor.p1s_remaining_time") | int/60) | int }}h{{states("sensor.p1s_remaining_time") | int % 60 }}m
</strong>
</td>
<td align=left valign=top width=78>
<font size=2>ETA</font><br />
<strong>{{ as_datetime(states("sensor.p1s_end_time")).strftime("%H:%M") }}</strong>
<font size=1>{{ as_datetime(states("sensor.p1s_end_time")).strftime("%b%-d") }}</font>
</td>
</tr>
</table>
card_mod:
style: |
ha-markdown {
padding-top: 0px !important;
padding-bottom: 4px !important;
padding-left: 10px !important;
}
navigate_to: /lovelace/p1s
visibility:
- condition: numeric_state
entity: sensor.p1s_print_progress
below: 100
grid_options:
columns: 12
rows: auto
@3DJupp
Copy link

3DJupp commented May 3, 2025

thanks - that was the solution!!

@doobes
Copy link

doobes commented Jul 23, 2025

Help!

I'm having trouble with this part:

image

Code for this section looks like:

`
type: custom:stack-in-card
horizontal: true
cards:

  • type: markdown
    content: >

    {{ states.sensor.frog_p1s_task_name.state [:60] }}
    Printed layers{{ states.sensor.frog_p1s_current_layer.state}}/{{states.sensor.frog_p1s_total_layer_count.state}}
    {{ states.sensor.frog_p1s_print_progress.state}}% {% if (states.sensor.frog_p1s_remaining_time.state | int) == 0 %} Success {% else %} -{{(states.sensor.frog_p1s_remaining_time.state | int/60) | int }}h{{ states.sensor.frog_p1s_remaining_time.state| int % 60 }}m {% endif %}
    card_mod: style: .: | ha-card { position: absolute; top: 0px; } ha-markdown: $: | div { height: 135px; overflow: hidden; word-break: break-words; hyphens: auto!important; hyphenate-character: " "; } grid_options: columns: 6 rows: 3
  • type: custom:entity-progress-card
    entity: sensor.frog_p1s_print_progress
    unit: "%"
    show_more_info: false
    bar_size: small
    bar_color: var(--green-color)
    layout: horizontal
    icon: none
    hide:

    • icon
    • name
    • secondary_info
      grid_options:
      columns: 6
      rows: 1
      card_mod:
      style: |
      ha-card {
      height: 100%;
      align-content: end;
      }
      grid_options:
      columns: 6
      rows: 4
      `

So, couple things here.

  1. The sensor states. How are they set up?
  2. Something is improperly configured. Have no idea what.

Thanks for any guidance

@doobes
Copy link

doobes commented Jul 23, 2025

Sorry for the weird formatting.

chris

@doobes
Copy link

doobes commented Jul 25, 2025

I got the card working, but am still looking for mere info on the sensor states.

Thank you!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment