This commit is contained in:
Home Assistant Version Control
2026-10-09 00:32:55 +00:00
parent 61558e3763
commit 47f2505ac8
7 changed files with 1623 additions and 41 deletions
@@ -0,0 +1,140 @@
# ha_mcp_backup
schema_version: 1
domain: automation
entity_id: '1791477238729'
captured: '2026-10-09T00:32:47.977680+00:00'
tool: ha_config_set_automation
config:
id: '1791477238729'
alias: SparkX i7 - Deduct filament in Spoolman on print complete
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.
triggers:
- trigger: state
entity_id: sensor.sparkx_i7_print_status
from: printing
to: completed
conditions: []
actions:
- 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) }}'
- 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 }}'
- 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 }}'
- variables:
helper_idx: '{{ old_slot.split('' '')[-1] if old_slot.split('' '')[-1] in [''1'',
''2'', ''3'', ''4''] else '''' }}'
- variables:
nonhelper_g: '{{ final_grams if (final_grams | float > 0) and (spool_id not
in ['''', ''unknown'', ''unavailable'']) and (helper_idx == '''') else 0 }}'
- if:
condition: template
value_template: '{{ final_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: '{{ final_grams | float(0) }}'
- if:
condition: template
value_template: '{{ helper_idx != '''' }}'
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) }}'
default:
- action: notify.persistent_notification
data:
title: 'Spoolman: no spool for slot color'
message: '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.'
- action: notify.mobile_app_francos_ipad
data:
title: 'Spoolman: no spool for slot color'
message: '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.'
- action: notify.mobile_app_sm_f956w
data:
title: 'Spoolman: no spool for slot color'
message: '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.'
- 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) }}'
- 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''] %}{% endif %}{{ ns.l | join(''\n'')
}}'
- if:
condition: template
value_template: '{{ summary_total | float > 0 }}'
then:
- action: notify.persistent_notification
data:
title: Print complete - Spoolman updated
message: 'Print complete - Spoolman deducted {{ summary_total }} g
{{ summary_lines }}'
- action: notify.mobile_app_francos_ipad
data:
title: Print complete - Spoolman updated
message: 'Print complete - Spoolman deducted {{ summary_total }} g
{{ summary_lines }}'
- action: notify.mobile_app_sm_f956w
data:
title: Print complete - Spoolman updated
message: 'Print complete - Spoolman deducted {{ summary_total }} g
{{ summary_lines }}'
- 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: ''
mode: single
@@ -0,0 +1,151 @@
# ha_mcp_backup
schema_version: 1
domain: automation
entity_id: '1791477238762'
captured: '2026-10-09T00:32:47.861324+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 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 with remaining
weight matches that color. Register the new roll in Spoolman, 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 with remaining
weight matches that color. Register the new roll in Spoolman, 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 with remaining
weight matches that color. Register the new roll in Spoolman, 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
File diff suppressed because it is too large Load Diff
+3
View File
@@ -4155,3 +4155,6 @@
{"timestamp": "2026-10-09T00:31:08.025982+00:00", "tool_name": "ha_config_get_dashboard", "parameters": {"url_path": "sparkx-i7", "list_only": false, "force_reload": false, "entity_id": "sensor.sparkx_i7_active_filament_slot", "card_type": null, "heading": null, "include_config": false, "include_screenshot": false, "view_path": null, "mode": null, "query": null}, "execution_time_ms": 88.17911148071289, "success": true, "error_message": null, "response_size_bytes": 1379, "user_context": null}
{"timestamp": "2026-10-09T00:31:09.198470+00:00", "tool_name": "ha_config_get_automation", "parameters": {"identifier": "1791477238729"}, "execution_time_ms": 1289.0384197235107, "success": true, "error_message": null, "response_size_bytes": 5811, "user_context": null}
{"timestamp": "2026-10-09T00:31:09.481568+00:00", "tool_name": "ha_config_get_automation", "parameters": {"identifier": "1791477238762"}, "execution_time_ms": 1559.7484111785889, "success": true, "error_message": null, "response_size_bytes": 5503, "user_context": null}
{"timestamp": "2026-10-09T00:32:48.159296+00:00", "tool_name": "ha_config_set_dashboard", "parameters": {"url_path": "sparkx-i7", "config": null, "python_transform": "config['views'][3]['sections'][0]['cards'][10]['content'] = config['views'][3]['sections'][0]['cards'][10]['content'].replace('http://2c829f0e-spoolman.local.hass.io:7912', 'http://192.168.1.140:7912')", "config_hash": "3e1e0c8a1bbb7498", "title": null, "icon": null, "require_admin": null, "show_in_sidebar": null, "MandatoryBPS": false, "BestPracticeKey": null, "return_screenshot": false, "view_path": null, "patch": null}, "execution_time_ms": 165.86875915527344, "success": true, "error_message": null, "response_size_bytes": 1030, "user_context": null}
{"timestamp": "2026-10-09T00:32:50.390327+00:00", "tool_name": "ha_config_set_automation", "parameters": {"config": null, "identifier": "1791477238762", "python_transform": "config['description'] = config['description'].replace('from the Spoolman spool matching the previous slot color hex', 'from the Spoolman spool in the CFS Lite location matching the previous slot color hex')\nfor s in config['actions'][1]['choose'][1]['sequence'][2]['then'][0]['default']:\n d = s['data']\n d['message'] = d['message'].replace('no Spoolman spool with remaining weight matches that color', 'no Spoolman spool in the CFS Lite location with remaining weight matches that color').replace('Register the new roll in Spoolman, then adjust manually if needed.', 'Register the new roll in Spoolman with location CFS Lite, then adjust manually if needed.')", "config_hash": "733d8e8ed285ab77", "take_control_of_blueprint": false, "category": null, "wait": true, "enabled": null, "run_actions": false, "MandatoryBPS": false, "BestPracticeKey": null}, "execution_time_ms": 2440.6590461730957, "success": true, "error_message": null, "response_size_bytes": 7646, "user_context": null}
{"timestamp": "2026-10-09T00:32:51.251728+00:00", "tool_name": "ha_config_set_automation", "parameters": {"config": null, "identifier": "1791477238729", "python_transform": "config['description'] = config['description'].replace('from the Spoolman spool matching the latched slot color', 'from the Spoolman spool in the CFS Lite location matching the latched slot color')\nfor s in config['actions'][5]['then'][0]['default']:\n d = s['data']\n d['message'] = d['message'].replace('no Spoolman spool with remaining weight matches that color', 'no Spoolman spool in the CFS Lite location with remaining weight matches that color').replace('Register the new roll in Spoolman, then adjust manually if needed.', 'Register the new roll in Spoolman with location CFS Lite, then adjust manually if needed.')", "config_hash": "3e4b8c309716746d", "take_control_of_blueprint": false, "category": null, "wait": true, "enabled": null, "run_actions": false, "MandatoryBPS": false, "BestPracticeKey": null}, "execution_time_ms": 3172.0316410064697, "success": true, "error_message": null, "response_size_bytes": 7608, "user_context": null}
+1 -1
View File
@@ -1036,7 +1036,7 @@
},
{
"type": "markdown",
"content": "**Spoolman UI:** [http://2c829f0e-spoolman.local.hass.io:7912](http://2c829f0e-spoolman.local.hass.io:7912)\n\nEach CFS slot is matched to the Spoolman spool with the same **color hex** that still has stock (remaining > 0) **and whose location is CFS Lite**. All 4 rolls live in the **CFS Lite** location in Spoolman.\n\n**Replaced a roll?** Register the new roll in Spoolman with the same color hex and location CFS Lite. No Home Assistant changes needed — a same-color roll in another location (e.g. Storage) is ignored, and exhausted spools are skipped automatically.",
"content": "**Spoolman UI:** [http://192.168.1.140:7912](http://192.168.1.140:7912)\n\nEach CFS slot is matched to the Spoolman spool with the same **color hex** that still has stock (remaining > 0) **and whose location is CFS Lite**. All 4 rolls live in the **CFS Lite** location in Spoolman.\n\n**Replaced a roll?** Register the new roll in Spoolman with the same color hex and location CFS Lite. No Home Assistant changes needed — a same-color roll in another location (e.g. Storage) is ignored, and exhausted spools are skipped automatically.",
"grid_options": {
"columns": "full"
}
+27 -25
View File
@@ -4377,10 +4377,11 @@
- id: '1791477238729'
alias: SparkX i7 - Deduct filament in Spoolman on print complete
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.
delta since last checkpoint x g/cm) from the Spoolman spool in the CFS Lite location
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.
triggers:
- trigger: state
entity_id: sensor.sparkx_i7_print_status
@@ -4441,25 +4442,25 @@
title: 'Spoolman: no spool for slot color'
message: '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.'
}}) 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: '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.'
}}) 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: '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.'
}}) 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.'
- 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'')
@@ -4512,9 +4513,10 @@
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.'
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
@@ -4607,23 +4609,23 @@
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 with remaining
weight matches that color. Register the new roll in Spoolman, then
adjust manually if needed.'
| 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 with remaining
weight matches that color. Register the new roll in Spoolman, then
adjust manually if needed.'
| 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 with remaining
weight matches that color. Register the new roll in Spoolman, then
adjust manually if needed.'
| 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
+15 -15
View File
@@ -4,7 +4,7 @@
"state": "ON",
"led_brightness": 100,
"countdown_to_turn_off": 0,
"voltage": 119.6,
"voltage": 119.2,
"countdown_to_turn_on": 0,
"ac_frequency": 60,
"power_factor": 0.62,
@@ -15,9 +15,9 @@
"latest_source": "https://raw.githubusercontent.com/Koenkk/zigbee-OTA/master/images/ThirdReality/SmartPlug_Zigbee_PROD_OTA_V101_1.01.01.ota",
"latest_release_notes": null
},
"power": 24.5,
"power": 192.1,
"linkquality": 149,
"current": 0.46,
"current": 2.54,
"power_on_behavior": "on"
},
"0xffffb40e0607af27": {
@@ -27,7 +27,7 @@
"led_brightness": 100,
"countdown_to_turn_off": 0,
"countdown_to_turn_on": 0,
"power": 2.1,
"power": 1.9,
"current": 0.09,
"energy": 54.08,
"power_factor": 0.18,
@@ -45,9 +45,9 @@
"state": "ON",
"led_brightness": 100,
"countdown_to_turn_off": 0,
"voltage": 119.6,
"voltage": 119,
"countdown_to_turn_on": 0,
"energy": 103.89,
"energy": 103.9,
"power_factor": 0.2,
"ac_frequency": 60,
"update": {
@@ -58,7 +58,7 @@
"latest_release_notes": null
},
"linkquality": 145,
"power": 84.5,
"power": 83.8,
"current": 0.83,
"power_on_behavior": "on"
},
@@ -74,12 +74,12 @@
"led_brightness": 100,
"countdown_to_turn_off": 0,
"countdown_to_turn_on": 0,
"voltage": 118,
"voltage": 118.5,
"state": "ON",
"ac_frequency": 60,
"energy": 211.06,
"power": 100,
"current": 0.92,
"power": 101.5,
"current": 0.93,
"power_factor": 0.95,
"update": {
"state": "idle",
@@ -95,7 +95,7 @@
"led_brightness": 100,
"countdown_to_turn_off": 0,
"countdown_to_turn_on": 0,
"voltage": 118.9,
"voltage": 119,
"energy": 100.77,
"state": "ON",
"power": 10.8,
@@ -114,12 +114,12 @@
},
"0xffffb40e060895b3": {
"state": "ON",
"voltage": 119.5,
"voltage": 119.4,
"ac_frequency": 60,
"energy": 14.23,
"current": 0.01,
"power": 0.1,
"power_factor": 0.11,
"power_factor": 0.22,
"linkquality": 116,
"update": {
"state": "idle",
@@ -136,7 +136,7 @@
"0xffffb40e0608864e": {
"led_brightness": 100,
"countdown_to_turn_off": 0,
"voltage": 119.9,
"voltage": 120.1,
"energy": 34.53,
"countdown_to_turn_on": 0,
"state": "ON",
@@ -224,7 +224,7 @@
},
"0xb40e060fffe717c5": {
"battery": 100,
"occupancy": true,
"occupancy": false,
"tamper": false,
"battery_low": false,
"linkquality": 145,