This commit is contained in:
Home Assistant Version Control committed 2026-10-08 17:48:05 +00:00
1 parent 07ccc37338
commit fe0580a072
3 files changed
+66 -8

No files matched your search

@@ -0,0 +1,57 @@
# ha_mcp_backup
schema_version: 1
domain: automation
entity_id: automation.sparkx_i7_deduct_filament_in_spoolman_on_print_complete
captured: '2026-10-08T17:47:57.827554+00:00'
tool: ha_config_set_automation
config:
id: '1791477238729'
alias: SparkX i7 - Deduct filament in Spoolman on print complete
triggers:
- trigger: state
entity_id: sensor.sparkx_i7_print_status
from: printing
to: completed
conditions:
- condition: numeric_state
entity_id: sensor.sparkx_i7_filament_weight_estimated
above: 0
actions:
- variables:
weight: '{{ states(''sensor.sparkx_i7_filament_weight_estimated'') | float(0)
}}'
spool_id: '{{ states(''input_text.sparkx_i7_print_spool_latch'') | int(0) }}'
- choose:
- conditions:
condition: template
value_template: '{{ spool_id > 0 }}'
sequence:
- action: spoolman.use_spool_filament
data:
id: '{{ spool_id | int(0) }}'
use_weight: '{{ weight | float(0) }}'
- action: input_text.set_value
target:
entity_id: input_text.sparkx_i7_print_spool_latch
data:
value: ''
- conditions:
condition: template
value_template: '{{ spool_id <= 0 }}'
sequence:
- action: notify.persistent_notification
data:
title: Spoolman deduction skipped
message: "Print completed: {{ weight }} g used, but no Spoolman spool was\
\ latched for this print \u2014 nothing deducted."
- action: notify.mobile_app_francos_ipad
data:
title: Spoolman deduction skipped
message: "Print completed: {{ weight }} g used, but no Spoolman spool was\
\ latched for this print \u2014 nothing deducted."
- action: notify.mobile_app_sm_f956w
data:
title: Spoolman deduction skipped
message: "Print completed: {{ weight }} g used, but no Spoolman spool was\
\ latched for this print \u2014 nothing deducted."
mode: single
+1
View File
@@ -4023,3 +4023,4 @@
{"timestamp": "2026-10-08T17:45:09.204304+00:00", "tool_name": "ha_config_set_automation", "parameters": {"config": null, "identifier": "automation.sparkx_i7_latch_print_spool_for_spoolman", "python_transform": "msg = \"Segment of {{ grams }} g from {{ old_slot }} (color #{{ color | upper }}) could not be deducted - no Spoolman spool with remaining weight matches that color. Register the new roll in Spoolman, then adjust manually if needed.\"\nnt = [{'action': 'notify.persistent_notification', 'data': {'title': 'Spoolman: no spool for slot color', 'message': msg}}, {'action': 'notify.mobile_app_francos_ipad', 'data': {'title': 'Spoolman: no spool for slot color', 'message': msg}}, {'action': 'notify.mobile_app_sm_f956w', 'data': {'title': 'Spoolman: no spool for slot color', 'message': msg}}]\nconfig['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 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.'\nconfig['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'}]\nconfig['conditions'] = [{'condition': 'state', 'entity_id': 'sensor.sparkx_i7_print_status', 'state': 'printing'}]\nconfig['actions'] = [\n {'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) }}\"}},\n {'choose': [\n {'conditions': {'condition': 'trigger', 'id': 'print_started'},\n 'sequence': [\n {'action': 'input_number.set_value', 'target': {'entity_id': 'input_number.sparkx_i7_spoolman_length_checkpoint'}, 'data': {'value': '{{ cur }}'}},\n {'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}},\n {'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 '' }}\"}}\n ]},\n {'conditions': {'condition': 'template', 'value_template': \"{{ old_slot not in ['', 'unknown', 'unavailable'] and new_slot not in ['', 'unknown', 'unavailable'] and new_slot != old_slot }}\"},\n 'sequence': [\n {'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 }}\"}},\n {'variables': {'spool_id': \"{% set ns = namespace(id='') %}{% for e in integration_entities('spoolman') %}{% if e.endswith('_color_hex') and (states(e) | replace('#', '') | lower) == color %}{% set b = e[:-10] %}{% if (states(b) | float(0)) > 0 and ns.id == '' %}{% set ns.id = states(b ~ '_id') %}{% endif %}{% endif %}{% endfor %}{{ ns.id }}\"}},\n {'if': {'condition': 'template', 'value_template': '{{ grams | float > 0 }}'},\n 'then': [{'choose': [\n {'conditions': {'condition': 'template', 'value_template': \"{{ spool_id not in ['', 'unknown', 'unavailable'] }}\"},\n 'sequence': [\n {'action': 'spoolman.use_spool_filament', 'data': {'id': '{{ spool_id | int(0) }}', 'use_weight': '{{ grams | float(0) }}'}},\n {'if': {'condition': 'template', 'value_template': \"{{ old_slot.split(' ')[-1] in ['1', '2', '3', '4'] }}\"},\n '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) }}\"}}]}\n ]}\n ], 'default': nt}]},\n {'action': 'input_number.set_value', 'target': {'entity_id': 'input_number.sparkx_i7_spoolman_length_checkpoint'}, 'data': {'value': '{{ cur }}'}},\n {'action': 'input_text.set_value', 'target': {'entity_id': 'input_text.sparkx_i7_print_spool_latch'}, 'data': {'value': '{{ new_slot }}'}}\n ]},\n {'conditions': {'condition': 'template', 'value_template': \"{{ old_slot in ['', 'unknown', 'unavailable'] and new_slot not in ['', 'unknown', 'unavailable'] }}\"},\n 'sequence': [\n {'action': 'input_number.set_value'Line truncated
{"timestamp": "2026-10-08T17:45:59.218870+00:00", "tool_name": "ha_config_get_automation", "parameters": {"identifier": "automation.sparkx_i7_latch_print_spool_for_spoolman"}, "execution_time_ms": 221.19951248168945, "success": true, "error_message": null, "response_size_bytes": 5423, "user_context": null}
{"timestamp": "2026-10-08T17:45:59.226035+00:00", "tool_name": "ha_config_get_automation", "parameters": {"identifier": "automation.sparkx_i7_deduct_filament_in_spoolman_on_print_complete"}, "execution_time_ms": 229.57611083984375, "success": true, "error_message": null, "response_size_bytes": 1823, "user_context": null}
{"timestamp": "2026-10-08T17:47:57.951850+00:00", "tool_name": "ha_config_set_automation", "parameters": {"config": null, "identifier": "automation.sparkx_i7_deduct_filament_in_spoolman_on_print_complete", "python_transform": "msgc = \"Print completed: final segment of {{ final_grams }} g from {{ old_slot if old_slot else 'the active slot' }} (color #{{ color | upper }}) could not be deducted - no Spoolman spool with remaining weight matches that color. Register the new roll in Spoolman, then adjust manually if needed.\"\nnt = [{'action': 'notify.persistent_notification', 'data': {'title': 'Spoolman: no spool for slot color', 'message': msgc}}, {'action': 'notify.mobile_app_francos_ipad', 'data': {'title': 'Spoolman: no spool for slot color', 'message': msgc}}, {'action': 'notify.mobile_app_sm_f956w', 'data': {'title': 'Spoolman: no spool for slot color', 'message': msgc}}]\nms = \"Print complete - Spoolman deducted {{ summary_total }} g\\n{{ summary_lines }}\"\nns = [{'action': 'notify.persistent_notification', 'data': {'title': 'Print complete - Spoolman updated', 'message': ms}}, {'action': 'notify.mobile_app_francos_ipad', 'data': {'title': 'Print complete - Spoolman updated', 'message': ms}}, {'action': 'notify.mobile_app_sm_f956w', 'data': {'title': 'Print complete - Spoolman updated', 'message': ms}}]\nconfig['description'] = 'On print completion, deducts the final segment (used_material_length delta since last checkpoint x g/cm) from the Spoolman spool matching the latched slot color (remaining weight > 0 guard), accumulates it per slot, then sends a summary notification with total and per-slot breakdown whenever anything was deducted. Silent when total is 0. Clears the latch and re-baselines the checkpoint.'\nconfig['conditions'] = []\nconfig['actions'] = [\n {'variables': {'old_slot': \"{{ states('input_text.sparkx_i7_print_spool_latch') }}\", 'cur': \"{{ states('sensor.sparkx_i7_used_material_length') | float(0) }}\", 'checkpoint': \"{{ states('input_number.sparkx_i7_spoolman_length_checkpoint') | float(0) }}\"}},\n {'variables': {'final_grams': \"{{ (([cur | float - (checkpoint | float), 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 }}\"}},\n {'variables': {'spool_id': \"{% set ns = namespace(id='') %}{% for e in integration_entities('spoolman') %}{% if e.endswith('_color_hex') and (states(e) | replace('#', '') | lower) == color %}{% set b = e[:-10] %}{% if (states(b) | float(0)) > 0 and ns.id == '' %}{% set ns.id = states(b ~ '_id') %}{% endif %}{% endif %}{% endfor %}{{ ns.id }}\"}},\n {'variables': {'helper_idx': \"{{ old_slot.split(' ')[-1] if old_slot.split(' ')[-1] in ['1', '2', '3', '4'] else '' }}\"}},\n {'variables': {'nonhelper_g': \"{{ final_grams if (final_grams | float > 0) and (spool_id not in ['', 'unknown', 'unavailable']) and (helper_idx == '') else 0 }}\"}},\n {'if': {'condition': 'template', 'value_template': '{{ final_grams | float > 0 }}'},\n 'then': [{'choose': [\n {'conditions': {'condition': 'template', 'value_template': \"{{ spool_id not in ['', 'unknown', 'unavailable'] }}\"},\n 'sequence': [\n {'action': 'spoolman.use_spool_filament', 'data': {'id': '{{ spool_id | int(0) }}', 'use_weight': '{{ final_grams | float(0) }}'}},\n {'if': {'condition': 'template', 'value_template': \"{{ helper_idx != '' }}\"},\n 'then': [{'action': 'input_number.set_value', 'target': {'entity_id': 'input_number.sparkx_i7_slot_{{ helper_idx }}_grams'}, 'data': {'value': \"{{ (states('input_number.sparkx_i7_slot_' ~ helper_idx ~ '_grams') | float(0)) + (final_grams | float) }}\"}}]}\n ]}\n ], 'default': nt}]},\n {'variables': {'summary_total': \"{% set ns = namespace(t = 0) %}{% for n in ['1', '2', '3', '4'] %}{% set g = states('input_number.sparkx_i7_slot_' ~ n ~ '_grams') | float(0) %}{% if g > 0 %}{% set ns.t = ns.t + g %}{% endif %}{% endfor %}{{ (ns.t + (nonhelper_g | float)) | round(1) }}\"}},\n {'variables': {'summary_lines': \"{% set ns = namespace(l = []) %}{% for n in ['1', '2', '3', '4'] %}{% set g = states('input_number.sparkx_i7_slot_' ~ n ~ '_grams') | float(0) %}{% if g > 0 %}{% set ns.l = ns.l + ['Slot ' ~ n ~ ' (' ~ (states('sensor.sparkx_i7_slot_' ~ n ~ '_color_name') ~ '): ' ~ (g | round(1)) ~ ' g'] %}{% endif %}{% endfor %}{% if nonhelper_g | float > 0 %}{% set ns.l = ns.l + [(old_slot if old_slot else 'Unlatched') ~ ': ' ~ (nonhelper_g | float | round(1)) ~ ' g'] %}{{ ns.l | join('\\\\n') }}\"}},\n {'if': {'condition': 'template', 'value_template': '{{ summary_total | float > 0 }}'}, 'then': ns},\n {'action': 'input_number.set_value', 'target': {'entity_id': 'input_number.sparkx_i7_spoolman_length_checkpoint'}, 'data': {'value': '{{ cur }}'}},\n {'action': 'input_text.set_value', 'target': {'entity_id': 'input_text.sparkx_i7_print_spool_latLine truncated
+8 -8
View File
@@ -22,12 +22,12 @@
},
"0xffffb40e0607af27": {
"state": "ON",
"voltage": 119.1,
"voltage": 118.6,
"ac_frequency": 60,
"led_brightness": 100,
"countdown_to_turn_off": 0,
"countdown_to_turn_on": 0,
"power": 1.9,
"power": 2.1,
"current": 0.09,
"energy": 54.02,
"power_factor": 0.17,
@@ -47,8 +47,8 @@
"countdown_to_turn_off": 0,
"voltage": 118.1,
"countdown_to_turn_on": 0,
"energy": 103.67,
"power_factor": 0.9,
"energy": 103.68,
"power_factor": 0.89,
"ac_frequency": 60,
"update": {
"state": "idle",
@@ -58,7 +58,7 @@
"latest_release_notes": null
},
"linkquality": 145,
"power": 85.7,
"power": 85,
"current": 0.83,
"power_on_behavior": "on"
},
@@ -77,8 +77,8 @@
"voltage": 116.9,
"state": "ON",
"ac_frequency": 60,
"energy": 210.4,
"power": 113.3,
"energy": 210.41,
"power": 105.5,
"current": 0.99,
"power_factor": 0.94,
"update": {
@@ -98,7 +98,7 @@
"voltage": 118.6,
"energy": 100.68,
"state": "ON",
"power": 10.4,
"power": 10.6,
"current": 0.32,
"ac_frequency": 60,
"power_factor": 0.51,