Skip to content

Instantly share code, notes, and snippets.

@eodabas
Last active April 19, 2025 07:26
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
@eodabas
Copy link
Author

eodabas commented Mar 17, 2025

Required integrations & cards

Special Thanks

Other than the great people behind the components above, I got my inspiration for the dashboard design from @bbbenji's dashboard that they shared on https://community.home-assistant.io/t/my-bambu-lab-x1c-dashboard-automations/665646

Installation

Install all the required cards above if not already installed. All the cards were the latest versions as of posting this gist. Please also note that:

  • I'm using zigbee sensors in both P1S unit to get chamber temperature and AMS unit to get AMS temperature and humidity levels.
  • There are two
  • There are two bentoboxes installed and they are controlled through Tuya Smart Sockets (types are changed to fans)
  • I'm using the image sensor camera on ha-bambulab device as for my P1S, it runs better. If you are using streaming camera entity you will need to change the camera card to any compatible one.

Dashboard

  • Copy the dashboard yaml (ha-bambulab-dashboard.yaml) into your clipboard
  • On your Home Assistant, switch to Edit Dashboard mode
  • Click "+" icon to add new view
  • Click on the kebap menu on the top left (3 vertical dots) and choose Edit in Yaml
  • Paste the dashboard code and edit the entity names to match yours

Optional

  • To switch between AMS cards (the round one and the spool icon one), create a Toggle helper named input_boolean.enable_ha_bambulab_ams_spool_cards. the ha-bambulab spool and AMS cards have the option to update the spool and AMS filament types, and the round card looks better.

Progress Card

  • Just copy the card yaml (bambulab-progress-card.yaml)
  • Add new card on the view you want to add
  • Choose manual and paste the yaml
  • Edit the entity names to match yours.

Screenshots

desktop-screenshot-round-ams desktop-screenshot-spool-ams
progress-card

ios-screenshot-1

ios-screenshot-2

ios-screenshot-3

@account-banned
Copy link

account-banned commented Mar 19, 2025

Attempting to use this dashboard, but having an issue with the middle column not appearing.

Middle column yaml

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.bobby_bambu_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.bobby_bambu_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.bobby_bambu_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.bobby_bambu_printing_speed
        name: Speed
        icon: mdi:window-close
        card_mod:
          style: |
            {% set current_sensor = "select.bobby_bambu_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: p1s_ams
    heading_style: subtitle
    grid_options:
      columns: 9
    badges:
      - type: entity
        show_state: true
        show_icon: true
        entity: sensor.bobby_bambu_p1s_ams_1_multi_sensor_temperature
        tap_action:
          action: more-info
      - type: entity
        show_state: true
        show_icon: true
        entity: sensor.bobby_bambu_p1s_ams_1_multi_sensor_humidity
        tap_action:
          action: more-info
      - type: entity
        show_state: true
        show_icon: true
        entity: sensor.bobby_bambu_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_p1s_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 $ p1s_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_p1s_ams_spool_cards
        state: "on"
  - type: horizontal-stack
    cards:
      - type: custom:ha-bambulab-p1s_ams-card
        entity: ""
        header: ""
        subtitle: ""
        style: vector
        p1s_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 $:
              p1s_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_p1s_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_eternalspool_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_p1s_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_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_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_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_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_p1s_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.bobby_bambu_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.bobby_bambu_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.bobby_bambu_target_bed_temperature
        name: Target
        state_adaptive_color: true
        show_state: true
        show_fill: true
        show_line: true
        font_size: 50
        smooth: false
      - entity: sensor.bobby_bambu_bed_temperature
        name: Bed
        state_adaptive_color: true
        show_state: true
        show_fill: false
    hours_to_show: 6
    grid_options:
      columns: 6

@eodabas
Copy link
Author

eodabas commented Mar 19, 2025

I've checked and tested your config. What I noticed is some of the cards are not displayed correctly. But nothing dramatic as "invisible middle column". I suggest you check the diff below and verify your changes. There are some obvious find/replace errors that cause some unwanted changes in card_mod configs

You should only change the entity names and device id's. here is a list for you to see what you need to check

This is the device id for AMS Unit. You can use the GUI editor of the AMS card to change this one.

  • 489dc2f60789a8ab9cacb6acadd201a4

These are the entities you should replace:

  • select.p1s_printing_speed
  • sensor.p1s_ams_1_humidity_index
  • sensor.p1s_ams_1_tray_1
  • sensor.p1s_ams_1_tray_2
  • sensor.p1s_ams_1_tray_3
  • sensor.p1s_ams_1_tray_4
  • sensor.p1s_bed_target_temperature
  • sensor.p1s_bed_temperature
  • sensor.p1s_externalspool_external_spool
  • sensor.p1s_nozzle_target_temperature
  • sensor.p1s_nozzle_temperature

These are zigbee devices in the chamber and the AMS unit.

  • sensor.p1s_ams_1_multi_sensor_humidity
  • sensor.p1s_ams_1_multi_sensor_temperature
  • sensor.p1s_chamber_multi_sensor_temperature

And this is the boolean (toggle) helper you need to create, you can use the same name:

  • input_boolean.enable_ha_bambulab_ams_spool_cards
--- middle-orig.yaml	2025-03-19 12:25:59.766911461 +0000
+++ middle-bobby.yaml	2025-03-19 12:25:42.245551316 +0000
@@ -10,7 +10,7 @@
     show_state: true
     type: glance
     entities:
-      - entity: sensor.p1s_nozzle_temperature
+      - entity: sensor.bobby_bambu_nozzle_temperature
         icon: mdi:printer-3d-nozzle-heat
         name: Nozzle
         card_mod:
@@ -27,7 +27,7 @@
               white-space: unset !important;
               text-wrap: balance !important;
             }
-      - entity: sensor.p1s_bed_temperature
+      - entity: sensor.bobby_bambu_bed_temperature
         icon: mdi:train-car-flatbed
         name: Print Bed
         card_mod:
@@ -44,7 +44,7 @@
               white-space: unset !important;
               text-wrap: balance !important;
             }
-      - entity: sensor.p1s_chamber_multi_sensor_temperature
+      - entity: sensor.bobby_bambu_chamber_multi_sensor_temperature
         icon: mdi:printer-3d
         name: Chamber
         card_mod:
@@ -61,12 +61,12 @@
               white-space: unset !important;
               text-wrap: balance !important;
             }
-      - entity: select.p1s_printing_speed
+      - entity: select.bobby_bambu_printing_speed
         name: Speed
         icon: mdi:window-close
         card_mod:
           style: |
-            {% set current_sensor = "select.p1s_printing_speed" %}
+            {% set current_sensor = "select.bobby_bambu_printing_speed" %}
             :host {
               --paper-item-icon-color: white;
               --icon-primary-color: white;
@@ -107,7 +107,7 @@
       columns: 3
     icon: mdi:alpha-e-box
   - type: heading
-    heading: AMS
+    heading: p1s_ams
     heading_style: subtitle
     grid_options:
       columns: 9
@@ -115,19 +115,19 @@
       - type: entity
         show_state: true
         show_icon: true
-        entity: sensor.p1s_ams_1_multi_sensor_temperature
+        entity: sensor.bobby_bambu_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
+        entity: sensor.bobby_bambu_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
+        entity: sensor.bobby_bambu_p1s_ams_1_humidity_index
         tap_action:
           action: more-info
     icon: mdi:alpha-a-box
@@ -135,7 +135,7 @@
       action: perform-action
       perform_action: input_boolean.toggle
       target:
-        entity_id: input_boolean.enable_ha_bambulab_ams_spool_cards
+        entity_id: input_boolean.enable_ha_bambulab_p1s_ams_spool_cards
   - type: custom:ha-bambulab-spool-card
     header: Header Text
     subtitle: Subtitle Text
@@ -164,7 +164,7 @@
             xbackground-color: red!important;
             margin: 5px;
           }
-        ha-bambulab-spool $ ams-popup: |
+        ha-bambulab-spool $ p1s_ams-popup: |
           div.ha-bambulab-spool-card-container {
               xbackground-color: cyan;
           }      
@@ -202,16 +202,16 @@
           }
     visibility:
       - condition: state
-        entity: input_boolean.enable_ha_bambulab_ams_spool_cards
+        entity: input_boolean.enable_ha_bambulab_p1s_ams_spool_cards
         state: "on"
   - type: horizontal-stack
     cards:
-      - type: custom:ha-bambulab-ams-card
+      - type: custom:ha-bambulab-p1s_ams-card
         entity: ""
         header: ""
         subtitle: ""
         style: vector
-        ams: 489dc2f60789a8ab9cacb6acadd201a4
+        p1s_ams: 489dc2f60789a8ab9cacb6acadd201a4
         show_type: true
         show_info_bar: false
         card_mod:
@@ -236,7 +236,7 @@
                 padding: 0px 0px !important;
               }
             ha-bambulab-spool $:
-              ams-popup: |
+              p1s_ams-popup: |
                 div.ha-bambulab-spool-card-container {
                     xbackground-color: cyan;
                 }      
@@ -276,7 +276,7 @@
       rows: 3
     visibility:
       - condition: state
-        entity: input_boolean.enable_ha_bambulab_ams_spool_cards
+        entity: input_boolean.enable_ha_bambulab_p1s_ams_spool_cards
         state: "on"
   - type: custom:stack-in-card
     mode: horizontal
@@ -284,7 +284,7 @@
       outer_padding: true;
     cards:
       - type: custom:mushroom-template-card
-        entity: sensor.p1s_externalspool_external_spool
+        entity: sensor.p1s_eternalspool_external_spool
         primary: >
           {% if states(config.entity) in [ "", "unknown" ] %}Unknown {{
           state_attr(config.entity, 'type') }}{% else %}{{
@@ -358,7 +358,7 @@
       rows: auto
     visibility:
       - condition: state
-        entity: input_boolean.enable_ha_bambulab_ams_spool_cards
+        entity: input_boolean.enable_ha_bambulab_p1s_ams_spool_cards
         state: "off"
   - type: custom:stack-in-card
     mode: horizontal
@@ -366,7 +366,7 @@
       outer_padding: true;
     cards:
       - type: custom:mushroom-template-card
-        entity: sensor.p1s_ams_1_tray_1
+        entity: sensor.p1s_ams_tray_1
         primary: >
           {{ state_translated(config.entity) }}{% if
           is_state_attr(config.entity, "name", None) %} {{
@@ -430,7 +430,7 @@
                 filter: invert(1) grayscale(1) brightness(500%) opacity(0.5);
               }
       - type: custom:mushroom-template-card
-        entity: sensor.p1s_ams_1_tray_2
+        entity: sensor.p1s_ams_tray_2
         primary: >
           {{ state_translated(config.entity) }}{% if
           is_state_attr(config.entity, "name", None) %} {{
@@ -494,7 +494,7 @@
                 filter: invert(1) grayscale(1) brightness(500%) opacity(0.5);
               }
       - type: custom:mushroom-template-card
-        entity: sensor.p1s_ams_1_tray_3
+        entity: sensor.p1s_ams_tray_3
         primary: >
           {{ state_translated(config.entity) }}{% if
           is_state_attr(config.entity, "name", None) %} {{
@@ -558,7 +558,7 @@
                 filter: invert(1) grayscale(1) brightness(500%) opacity(0.5);
               }
       - type: custom:mushroom-template-card
-        entity: sensor.p1s_ams_1_tray_4
+        entity: sensor.p1s_ams_tray_4
         primary: >
           {{ state_translated(config.entity) }}{% if
           is_state_attr(config.entity, "name", None) %} {{
@@ -626,7 +626,7 @@
       rows: auto
     visibility:
       - condition: state
-        entity: input_boolean.enable_ha_bambulab_ams_spool_cards
+        entity: input_boolean.enable_ha_bambulab_p1s_ams_spool_cards
         state: "off"
   - type: heading
     icon: fas:temperature-half
@@ -651,7 +651,7 @@
       - value: "005"
         label: "Off"
     entities:
-      - entity: sensor.p1s_nozzle_target_temperature
+      - entity: sensor.bobby_bambu_nozzle_target_temperature
         name: Target
         state_adaptive_color: true
         show_state: true
@@ -659,7 +659,7 @@
         show_line: true
         font_size: 50
         smooth: false
-      - entity: sensor.p1s_nozzle_temperature
+      - entity: sensor.bobby_bambu_nozzle_temperature
         name: Nozzle
         state_adaptive_color: true
         show_state: true
@@ -686,7 +686,7 @@
       - value: "005"
         label: "Off"
     entities:
-      - entity: sensor.p1s_bed_target_temperature
+      - entity: sensor.bobby_bambu_target_bed_temperature
         name: Target
         state_adaptive_color: true
         show_state: true
@@ -694,7 +694,7 @@
         show_line: true
         font_size: 50
         smooth: false
-      - entity: sensor.p1s_bed_temperature
+      - entity: sensor.bobby_bambu_bed_temperature
         name: Bed
         state_adaptive_color: true
         show_state: true

@account-banned
Copy link

Thanks for the help, I'd caught the copy/paste errors and fixed them. I had missed the AMS device id. I was able to get everything but the toggle to work. It sort of works. I can see the round icons but when I toggle to the spool icons, I get a broken card. "Custom element doesn't exist: ha-bambulab-p1s_ams-card"

Not a huge deal, just an oddity.

@eodabas
Copy link
Author

eodabas commented Mar 20, 2025

that is an another copy paste error probably. find ha-bambulab-p1s_ams-card and replace with ha-bambulab-ams-card

@account-banned
Copy link

That puts me one step closer, but the issue is now clearly a me problem. Now 'You need to select an AMS' is the error, but I have the device ID from the AMS url in home assistant.

@eodabas
Copy link
Author

eodabas commented Mar 20, 2025

did you check the yaml key? in your first config above it is p1s_ams: xxxxx but it should be ams: xxxx

@account-banned
Copy link

did you check the yaml key? in your first config above it is p1s_ams: xxxxx but it should be ams: xxxx

I did. I started from scratch to make sure I hadn't missed everything and now it's 99.99999% correct. The spool card works, with the exception of the external spool card being missing/hidden.

I appreciate all the troubleshoot. Hopefully other learn from my mistakes.

@eodabas
Copy link
Author

eodabas commented Mar 20, 2025

no worries. and I'm sure you'll figure it out. good luck and have fun

@JAnslinger
Copy link

Thank you very much. Works great! :)
Not sure why, but my Bambulab created entities with German entity names. So if someone else wants to save same time, here is the code with german entity names. You only need to change the printers name (mine is r2d2).

type: sections
title: R2D2
path: r2d2
sections:
  - type: grid
    cards:
      - type: heading
        heading_style: subtitle
        badges:
          - type: entity
            show_state: false
            show_icon: true
            entity: sensor.r2d2_name_der_aufgabe
            color: "#ff000000"
        visibility:
          - condition: screen
            media_query: "(min-width: 1024px)"
      - type: custom:mushroom-template-card
        primary: >-
          Printer State: {{ state_translated("binary_sensor.r2d2_druckfehler")
          }}
        secondary: >-
          Error Code: {{ state_attr("binary_sensor.r2d2_druckfehler",
          "code")|replace("_", "-") }}

          {% if state_attr("binary_sensor.r2d2_druckfehler", "error") != None
          and  state_attr("binary_sensor.r2d2_druckfehler", "error") != "" %}

          ({{ state_attr("binary_sensor.r2d2_druckfehler", "error") }})

          {% endif %}
        icon: mdi:information-slab-circle
        entity: binary_sensor.r2d2_druckfehler
        icon_color: red
        fill_container: true
        grid_options:
          columns: full
        visibility:
          - condition: state
            entity: binary_sensor.r2d2_druckfehler
            state_not: "off"
        tap_action:
          action: more-info
      - type: custom:mushroom-template-card
        primary: "HMS State: {{ state_translated(\"binary_sensor.r2d2_hms_fehler\") }}"
        secondary: >-
          Error Code: {{ state_attr("binary_sensor.r2d2_hms_fehler",
          "1-Code")|replace("_", "-") }}

          {% if state_attr("binary_sensor.r2d2_hms_fehler", "1-Error") != None 
            and state_attr("binary_sensor.r2d2_hms_fehler", "error") != "" 
            and state_attr("binary_sensor.r2d2_hms_fehler", "error") != "unknown" %}
          ({{ state_attr("binary_sensor.r2d2_hms_fehler", "error") }})

          {% endif %}
        icon: mdi:information-slab-circle
        entity: binary_sensor.r2d2_hms_fehler
        icon_color: red
        fill_container: true
        grid_options:
          columns: full
        visibility:
          - condition: state
            entity: binary_sensor.r2d2_hms_fehler
            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.r2d2_druckraumbeleuchtung
            tap_action:
              action: toggle
            name: Light
            state_content:
              - name
              - state
            color: state
          - type: entity
            show_state: true
            show_icon: true
            entity: sensor.r2d2_name_der_aufgabe
            icon: mdi:printer-3d
            color: state
      - show_state: false
        show_name: true
        camera_view: auto
        type: picture-entity
        entity: camera.r2d2_kamera
        camera_image: camera.r2d2_kamera
        tap_action:
          action: none
        hold_action:
          action: none
      - type: picture
        image_entity: image.r2d2_titelbild
        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.r2d2_name_der_aufgabe.state[:60] }}</font></div>

              <table width=100%><tr><td align=left>Printed layers<td
              align=right><font color=#77fc54 ; size="4">{{
              states.sensor.r2d2_aktuelle_schicht.state}}</font>/{{states.sensor.r2d2_gesamtzahl_der_schichten.state}}</td></tr></table>
              <table width=100%><tr> <td align=left><font
              size="5";color=#77fc54>{{
              states.sensor.r2d2_druckfortschritt.state}}%<td align=right>    {%
              if (states.sensor.r2d2_verbleibende_zeit.state | int) == 0 %}
                Success  
              {% else %}
                <font color=#959595>-{{(states.sensor.r2d2_verbleibende_zeit.state | int/60) | int  }}h{{ states.sensor.r2d2_verbleibende_zeit.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.r2d2_druckfortschritt
            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: YOURPRINTERIDNUMBER
        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.r2d2_druckraumlufter
        name: Chamber
        grid_options:
          columns: 4
          rows: 1
        tap_action:
          action: more-info
        icon_animation: true
      - type: custom:mushroom-fan-card
        entity: fan.r2d2_bauteillufter
        name: Aux
        grid_options:
          columns: 4
          rows: 1
        tap_action:
          action: more-info
        icon_animation: true
      - type: custom:mushroom-fan-card
        entity: fan.r2d2_druckkopflufter
        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.r2d2_temperatur_der_duse
            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.r2d2_druckbetttemperatur
            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: select.r2d2_druckgeschwindigkeit
            name: Speed
            icon: mdi:window-close
            card_mod:
              style: |
                {% set current_sensor = "select.r2d2_druckgeschwindigkeit" %}
                :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.klimasensor_aqara_ams_temperature
            tap_action:
              action: more-info
          - type: entity
            show_state: true
            show_icon: true
            entity: sensor.klimasensor_aqara_ams_humidity
            tap_action:
              action: more-info
          - type: entity
            show_state: true
            show_icon: true
            entity: sensor.r2d2_ams_index_der_luftfeuchtigkeit
            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: ac30f56e77d5793f13fe04b7ac417b37
        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: 6ebf5d1044a2ee0636ad0399710b566e
            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: 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.r2d2_zieltemperatur_der_duse
            name: Target
            state_adaptive_color: true
            show_state: true
            show_fill: true
            show_line: true
            font_size: 50
            smooth: false
          - entity: sensor.r2d2_temperatur_der_duse
            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.r2d2_druckbetttemperatur
            name: Target
            state_adaptive_color: true
            show_state: true
            show_fill: true
            show_line: true
            font_size: 50
            smooth: false
          - entity: sensor.r2d2_druckbetttemperatur
            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.r2d2_temperatur_der_duse
            name: Nozzle
          - entity: sensor.r2d2_druckbetttemperatur
            name: Bed
          - entity: sensor.r2d2_chamber_multi_sensor_temperature
            name: Chamber
          - entity: sensor.r2d2_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.r2d2_bauteillufterdrehzahl
            name: Aux
          - entity: sensor.r2d2_druckkopflufterdrehzahl
            name: Cooling
          - entity: sensor.r2d2_druckraumlufterdrehzahl
            name: Chamber
          - entity: sensor.r2d2_hotendlufterdrehzahl
            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.r2d2_druckfehler
            attributes:
              - value: code
              - value: error
            hidden_state:
              - "off"
              - unavailable
          - entity: binary_sensor.r2d2_hms_fehler
            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: false
cards: []
badges: []
top_margin: false
header:
  layout: responsive
  badges_position: bottom
visible:
  - user: a487127ce40c4fe49b79fad0fb801186
icon: mdi:printer-3d
theme: Mushroom
max_columns: 4

@3DJupp
Copy link

3DJupp commented Apr 18, 2025

Hey, is there a way to sort/reduce logbook failures, that are not really relevant?
image
In the docs i did not found some clever advice, at least, i have no working yaml yet.:
Multiple entities Logbook Card options

@eodabas
Copy link
Author

eodabas commented Apr 18, 2025

I think there is. check the hidden_state in the following example. it will hide when the 1-Code attribute has the value HMS_0C00_0300_0003_000B in binary_sensor.p1s_hms_errors

Or you can use state maps to change the icon and display some codes as "informational" maybe?

type: custom:multiple-logbook-card
entities:
  - entity: binary_sensor.p1s_print_error
    attributes:
      - value: code
        label: "Code: "
      - value: error
        label: "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
      - attribute:
          name: "1-Code"
          value: "HMS_0C00_0300_0003_000B"
show:
  state: false
  duration: true
  start_date: true
  end_date: false
  icon: true
  separator: true
  entity_name: true
custom_logs: false

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