This commit is contained in:
Home Assistant Version Control
2026-10-12 16:31:21 +00:00
parent 98cf7a3f24
commit e306c60ee0
3 changed files with 306 additions and 0 deletions
@@ -0,0 +1,152 @@
# ha_mcp_backup
schema_version: 1
domain: automation
entity_id: '1791477238762'
captured: '2026-10-12T16:31:06.438795+00:00'
tool: ha_config_set_automation
config:
id: '1791477238762'
alias: SparkX i7 - Latch print spool for Spoolman
description: 'Segment tracking for Spoolman: at print start resets the length checkpoint
and per-slot gram counters and latches the active CFS slot. On every slot change
mid-print, deducts the exact extrusion of the finished segment (used_material_length
delta x g/cm) from the Spoolman spool in the CFS Lite location matching the previous
slot color hex (only if that spool has remaining weight), accumulates grams per
slot, notifies on no-match, then re-baselines the checkpoint and advances the
latch.'
triggers:
- trigger: state
entity_id: sensor.sparkx_i7_print_status
to: printing
id: print_started
- trigger: state
entity_id: sensor.sparkx_i7_active_filament_slot
id: slot_changed
conditions:
- condition: state
entity_id: sensor.sparkx_i7_print_status
state: printing
actions:
- variables:
new_slot: '{{ states(''sensor.sparkx_i7_active_filament_slot'') }}'
old_slot: '{{ states(''input_text.sparkx_i7_print_spool_latch'') }}'
cur: '{{ states(''sensor.sparkx_i7_used_material_length'') | float(0) }}'
- choose:
- conditions:
condition: trigger
id: print_started
sequence:
- action: input_number.set_value
target:
entity_id: input_number.sparkx_i7_spoolman_length_checkpoint
data:
value: '{{ cur }}'
- action: input_number.set_value
target:
entity_id:
- input_number.sparkx_i7_slot_1_grams
- input_number.sparkx_i7_slot_2_grams
- input_number.sparkx_i7_slot_3_grams
- input_number.sparkx_i7_slot_4_grams
data:
value: 0
- action: input_text.set_value
target:
entity_id: input_text.sparkx_i7_print_spool_latch
data:
value: '{{ new_slot if new_slot not in [''unknown'', ''unavailable''] else
'''' }}'
- conditions:
condition: template
value_template: '{{ old_slot not in ['''', ''unknown'', ''unavailable''] and
new_slot not in ['''', ''unknown'', ''unavailable''] and new_slot != old_slot
}}'
sequence:
- variables:
grams: '{{ (([cur | float - (states(''input_number.sparkx_i7_spoolman_length_checkpoint'')
| float(0)), 0] | max) * (states(''input_number.sparkx_i7_filament_g_cm'')
| float(0.03))) | round(2) }}'
color: '{{ states(''sensor.sparkx_i7_cfs_'' ~ (old_slot | lower | replace(''
'', ''_'')) ~ ''_color'') | replace(''#'', '''') | lower }}'
- variables:
spool_id: '{% set ns = namespace(id='''') %}{% for e in integration_entities(''spoolman'')
%}{% if e.endswith(''_color_hex'') and (states(e) | replace(''#'', '''')
| lower) == color and (state_attr(e[:-10], ''location'') | default('''',
true) | lower) == ''cfs lite'' %}{% set b = e[:-10] %}{% if (states(b)
| float(0)) > 0 and ns.id == '''' %}{% set ns.id = states(b ~ ''_id'')
%}{% endif %}{% endif %}{% endfor %}{{ ns.id }}'
- if:
condition: template
value_template: '{{ grams | float > 0 }}'
then:
- choose:
- conditions:
condition: template
value_template: '{{ spool_id not in ['''', ''unknown'', ''unavailable'']
}}'
sequence:
- action: spoolman.use_spool_filament
data:
id: '{{ spool_id | int(0) }}'
use_weight: '{{ grams | float(0) }}'
- if:
condition: template
value_template: '{{ old_slot.split('' '')[-1] in [''1'', ''2'', ''3'',
''4''] }}'
then:
- action: input_number.set_value
target:
entity_id: input_number.sparkx_i7_slot_{{ old_slot.split(' ')[-1]
}}_grams
data:
value: '{{ (states(''input_number.sparkx_i7_slot_'' ~ old_slot.split(''
'')[-1] ~ ''_grams'') | float(0)) + (grams | float) }}'
default:
- action: notify.persistent_notification
data:
title: 'Spoolman: no spool for slot color'
message: 'Segment of {{ grams }} g from {{ old_slot }} (color #{{ color
| upper }}) could not be deducted - no Spoolman spool in the CFS Lite
location with remaining weight matches that color. Register the new
roll in Spoolman with location CFS Lite, then adjust manually if needed.'
- action: notify.mobile_app_francos_ipad
data:
title: 'Spoolman: no spool for slot color'
message: 'Segment of {{ grams }} g from {{ old_slot }} (color #{{ color
| upper }}) could not be deducted - no Spoolman spool in the CFS Lite
location with remaining weight matches that color. Register the new
roll in Spoolman with location CFS Lite, then adjust manually if needed.'
- action: notify.mobile_app_sm_f956w
data:
title: 'Spoolman: no spool for slot color'
message: 'Segment of {{ grams }} g from {{ old_slot }} (color #{{ color
| upper }}) could not be deducted - no Spoolman spool in the CFS Lite
location with remaining weight matches that color. Register the new
roll in Spoolman with location CFS Lite, then adjust manually if needed.'
- action: input_number.set_value
target:
entity_id: input_number.sparkx_i7_spoolman_length_checkpoint
data:
value: '{{ cur }}'
- action: input_text.set_value
target:
entity_id: input_text.sparkx_i7_print_spool_latch
data:
value: '{{ new_slot }}'
- conditions:
condition: template
value_template: '{{ old_slot in ['''', ''unknown'', ''unavailable''] and new_slot
not in ['''', ''unknown'', ''unavailable''] }}'
sequence:
- action: input_number.set_value
target:
entity_id: input_number.sparkx_i7_spoolman_length_checkpoint
data:
value: '{{ cur }}'
- action: input_text.set_value
target:
entity_id: input_text.sparkx_i7_print_spool_latch
data:
value: '{{ new_slot }}'
mode: queued
max: 10
@@ -0,0 +1,152 @@
# ha_mcp_backup
schema_version: 1
domain: automation
entity_id: '1791477238762'
captured: '2026-10-12T16:31:20.387625+00:00'
tool: ha_config_set_automation
config:
id: '1791477238762'
alias: SparkX i7 - Latch print spool for Spoolman
description: 'Segment tracking for Spoolman: at print start resets the length checkpoint
and per-slot gram counters and latches the active CFS slot. On every slot change
mid-print, deducts the exact extrusion of the finished segment (used_material_length
delta x g/cm) from the Spoolman spool in the CFS Lite location matching the previous
slot color hex (only if that spool has remaining weight), accumulates grams per
slot, notifies on no-match, then re-baselines the checkpoint and advances the
latch.'
triggers:
- trigger: state
entity_id: sensor.sparkx_i7_print_status
to: printing
id: print_started
- trigger: state
entity_id: sensor.sparkx_i7_active_filament_slot
id: slot_changed
conditions:
- condition: state
entity_id: sensor.sparkx_i7_print_status
state: printing
actions:
- variables:
new_slot: '{{ states(''sensor.sparkx_i7_active_filament_slot'') }}'
old_slot: '{{ states(''input_text.sparkx_i7_print_spool_latch'') }}'
cur: '{{ states(''sensor.sparkx_i7_used_material_length'') | float(0) }}'
- choose:
- conditions:
condition: trigger
id: print_started
sequence:
- action: input_number.set_value
target:
entity_id: input_number.sparkx_i7_spoolman_length_checkpoint
data:
value: '{{ cur }}'
- action: input_number.set_value
target:
entity_id:
- input_number.sparkx_i7_slot_1_grams
- input_number.sparkx_i7_slot_2_grams
- input_number.sparkx_i7_slot_3_grams
- input_number.sparkx_i7_slot_4_grams
data:
value: 0
- action: input_text.set_value
target:
entity_id: input_text.sparkx_i7_print_spool_latch
data:
value: '{{ new_slot if new_slot not in [''unknown'', ''unavailable''] else
'''' }}'
- conditions:
condition: template
value_template: '{{ old_slot not in ['''', ''unknown'', ''unavailable''] and
new_slot not in ['''', ''unknown'', ''unavailable''] and new_slot != old_slot
}}'
sequence:
- variables:
grams: '{{ (([cur | float - (states(''input_number.sparkx_i7_spoolman_length_checkpoint'')
| float(0)), 0] | max) * (states(''input_number.sparkx_i7_filament_g_cm'')
| float(0.03))) | round(2) }}'
color: '{{ states(''sensor.sparkx_i7_cfs_'' ~ (old_slot | lower | replace(''
'', ''_'')) ~ ''_color'') | replace(''#'', '''') | lower }}'
- variables:
spool_id: '{% set ns = namespace(id='''') %}{% for e in integration_entities(''spoolman'')
%}{% if e.endswith(''_color_hex'') and (states(e) | replace(''#'', '''')
| lower) == color and (state_attr(e[:-10], ''location'') | default('''',
true) | lower) == ''cfs lite'' %}{% set b = e[:-10] %}{% if (states(b)
| float(0)) > 0 and ns.id == '''' %}{% set ns.id = states(b ~ ''_id'')
%}{% endif %}{% endif %}{% endfor %}{{ ns.id }}'
- if:
condition: template
value_template: '{{ grams | float > 0 }}'
then:
- choose:
- conditions:
condition: template
value_template: '{{ spool_id not in ['''', ''unknown'', ''unavailable'']
}}'
sequence:
- action: spoolman.use_spool_filament
data:
id: '{{ spool_id | int(0) }}'
use_weight: '{{ grams | float(0) }}'
- if:
condition: template
value_template: '{{ old_slot.split('' '')[-1] in [''1'', ''2'', ''3'',
''4''] }}'
then:
- action: input_number.set_value
target:
entity_id: input_number.sparkx_i7_slot_{{ old_slot.split(' ')[-1]
}}_grams
data:
value: '{{ (states(''input_number.sparkx_i7_slot_'' ~ old_slot.split(''
'')[-1] ~ ''_grams'') | float(0)) + (grams | float) }}'
default:
- action: notify.persistent_notification
data:
title: 'Spoolman: no spool for slot color'
message: 'Segment of {{ grams }} g from {{ old_slot }} (color #{{ color
| upper }}) could not be deducted - no Spoolman spool in the CFS Lite
location with remaining weight matches that color. Register the new
roll in Spoolman with location CFS Lite, then adjust manually if needed.'
- action: notify.mobile_app_francos_ipad
data:
title: 'Spoolman: no spool for slot color'
message: 'Segment of {{ grams }} g from {{ old_slot }} (color #{{ color
| upper }}) could not be deducted - no Spoolman spool in the CFS Lite
location with remaining weight matches that color. Register the new
roll in Spoolman with location CFS Lite, then adjust manually if needed.'
- action: notify.mobile_app_sm_f956w
data:
title: 'Spoolman: no spool for slot color'
message: 'Segment of {{ grams }} g from {{ old_slot }} (color #{{ color
| upper }}) could not be deducted - no Spoolman spool in the CFS Lite
location with remaining weight matches that color. Register the new
roll in Spoolman with location CFS Lite, then adjust manually if needed.'
- action: input_number.set_value
target:
entity_id: input_number.sparkx_i7_spoolman_length_checkpoint
data:
value: '{{ cur }}'
- action: input_text.set_value
target:
entity_id: input_text.sparkx_i7_print_spool_latch
data:
value: '{{ new_slot }}'
- conditions:
condition: template
value_template: '{{ old_slot in ['''', ''unknown'', ''unavailable''] and new_slot
not in ['''', ''unknown'', ''unavailable''] }}'
sequence:
- action: input_number.set_value
target:
entity_id: input_number.sparkx_i7_spoolman_length_checkpoint
data:
value: '{{ cur }}'
- action: input_text.set_value
target:
entity_id: input_text.sparkx_i7_print_spool_latch
data:
value: '{{ new_slot }}'
mode: queued
max: 10