diff --git a/.ha_mcp/logs/mcp_usage.jsonl b/.ha_mcp/logs/mcp_usage.jsonl index bcb241d6..32241103 100644 --- a/.ha_mcp/logs/mcp_usage.jsonl +++ b/.ha_mcp/logs/mcp_usage.jsonl @@ -3947,3 +3947,5 @@ {"timestamp": "2026-10-08T16:30:47.445899+00:00", "tool_name": "ha_eval_template", "parameters": {"template": "{%- set slot = states('sensor.sparkx_i7_active_filament_slot') -%}\n{%- set ce = 'sensor.sparkx_i7_cfs_' ~ (slot | lower | replace(' ', '_')) ~ '_color' -%}\n{%- set color = states(ce) | replace('#', '') | lower -%}\n{%- set ns = namespace(id = '') -%}\n{%- for e in integration_entities('spoolman') -%}\n {%- if e.endswith('_color_hex') and (states(e) | lower) == color -%}\n {%- set ns.id = states(e[:-10] ~ '_id') -%}\n {%- endif -%}\n{%- endfor -%}\n{{ ns.id }}", "condition": null, "variables": null, "strict": false, "timeout": 3, "report_errors": true}, "execution_time_ms": 211.78388595581055, "success": true, "error_message": null, "response_size_bytes": 706, "user_context": null} {"timestamp": "2026-10-08T16:31:24.221714+00:00", "tool_name": "ha_config_set_helper", "parameters": {"helper_type": "input_text", "name": "SparkX i7 Print Spool Latch", "helper_id": "sparkx_i7_print_spool_latch", "entry_id": null, "subentry_type": null, "subentry_id": null, "show_advanced_options": false, "icon": null, "area_id": null, "labels": null, "min_value": null, "max_value": null, "step": null, "unit_of_measurement": null, "options": null, "initial": null, "mode": null, "has_date": null, "has_time": null, "restore": null, "duration": null, "monday": null, "tuesday": null, "wednesday": null, "thursday": null, "friday": null, "saturday": null, "sunday": null, "latitude": null, "longitude": null, "radius": null, "passive": null, "user_id": null, "device_trackers": null, "picture": null, "tag_id": null, "description": null, "category": null, "config": null, "wait": true, "action": null, "MandatoryBPS": false, "BestPracticeKey": null}, "execution_time_ms": 4.665613174438477, "success": false, "error_message": "{\n \"success\": false,\n \"error\": {\n \"code\": \"ENTITY_NOT_FOUND\",\n \"message\": \"Could not find input_text entity: input_text.sparkx_i7_print_spool_latch\",\n \"suggestion\": \"Verify the helper_id='sparkx_i7_print_spool_latch' exists (use ha_config_list_helpers to list current helpers)\",\n \"suggestions\": [\n \"Verify the helper_id='sparkx_i7_print_spool_latch' exists (use ha_config_list_helpers to list current helpers)\",\n \"If you meant to create a new helper named 'SparkX i7 Print Spool Latch', omit helper_id (or pass action='create')\",\n \"For Home Assistant best-practice guidance, call ha_get_skill_guide() to read SKILL.md, then the reference file its table points to, before retrying.\"\n ]\n },\n \"helper_type\": \"input_text\",\n \"data_schema\": [\n {\n \"name\": \"name\",\n \"required\": true,\n \"selector\": {\n \"text\": {}\n },\n \"description\": \"Display name.\"\n },\n {\n \"name\": \"min_value\",\n \"required\": false,\n \"selector\": {\n \"number\": {}\n },\n \"description\": \"Minimum length (0\\u2013255). Also accepts `min`.\"\n },\n {\n \"name\": \"max_value\",\n \"required\": false,\n \"selector\": {\n \"number\": {}\n },\n \"description\": \"Maximum length (0\\u2013255). Also accepts `max`.\"\n },\n {\n \"name\": \"mode\",\n \"required\": false,\n \"selector\": {\n \"select\": {\n \"options\": [\n \"text\",\n \"password\"\n ]\n }\n },\n \"description\": \"Default 'text'.\"\n },\n {\n \"name\": \"initial\",\n \"required\": false,\n \"selector\": {\n \"text\": {}\n },\n \"description\": \"When set \\u2014 even to false/0 \\u2014 disables last-state restore and forces this value on every HA restart. Omit unless you want the helper to reset to this value on every restart instead of restoring its last state.\"\n },\n {\n \"name\": \"icon\",\n \"required\": false,\n \"selector\": {\n \"text\": {}\n }\n }\n ],\n \"entity_id\": \"input_text.sparkx_i7_print_spool_latch\",\n \"helper_id\": \"sparkx_i7_print_spool_latch\",\n \"name\": \"SparkX i7 Print Spool Latch\"\n}", "response_size_bytes": null, "user_context": null} {"timestamp": "2026-10-08T16:31:30.967369+00:00", "tool_name": "ha_config_set_helper", "parameters": {"helper_type": "input_text", "name": "SparkX i7 Print Spool Latch", "helper_id": null, "entry_id": null, "subentry_type": null, "subentry_id": null, "show_advanced_options": false, "icon": null, "area_id": null, "labels": null, "min_value": null, "max_value": null, "step": null, "unit_of_measurement": null, "options": null, "initial": null, "mode": null, "has_date": null, "has_time": null, "restore": null, "duration": null, "monday": null, "tuesday": null, "wednesday": null, "thursday": null, "friday": null, "saturday": null, "sunday": null, "latitude": null, "longitude": null, "radius": null, "passive": null, "user_id": null, "device_trackers": null, "picture": null, "tag_id": null, "description": null, "category": null, "config": null, "wait": true, "action": "create", "MandatoryBPS": false, "BestPracticeKey": null}, "execution_time_ms": 119.4601058959961, "success": true, "error_message": null, "response_size_bytes": 320, "user_context": null} +{"timestamp": "2026-10-08T16:34:00.084894+00:00", "tool_name": "ha_config_set_automation", "parameters": {"config": {"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": "template", "value_template": "{{ states('sensor.sparkx_i7_filament_weight_estimated') | float(0) > 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": "[REDACTED]", "value_template": "[REDACTED]"}, "sequence": ["[REDACTED]", "[REDACTED]"]}, {"conditions": {"condition": "[REDACTED]", "value_template": "[REDACTED]"}, "sequence": ["[REDACTED]", "[REDACTED]", "[REDACTED]"]}]}], "mode": "single"}, "identifier": null, "python_transform": null, "config_hash": null, "take_control_of_blueprint": false, "category": null, "wait": true, "enabled": null, "run_actions": false, "MandatoryBPS": false, "BestPracticeKey": null}, "execution_time_ms": 1374.201774597168, "success": true, "error_message": null, "response_size_bytes": 6517, "user_context": null} +{"timestamp": "2026-10-08T16:34:00.733867+00:00", "tool_name": "ha_config_set_automation", "parameters": {"config": {"alias": "SparkX i7 - Latch print spool for Spoolman", "triggers": [{"trigger": "state", "entity_id": "sensor.sparkx_i7_print_status", "to": "printing"}, {"trigger": "state", "entity_id": "sensor.sparkx_i7_active_filament_slot"}, {"trigger": "state", "entity_id": ["sensor.sparkx_i7_cfs_box_1_slot_1_color", "sensor.sparkx_i7_cfs_box_1_slot_2_color", "sensor.sparkx_i7_cfs_box_1_slot_3_color", "sensor.sparkx_i7_cfs_box_1_slot_4_color"]}], "conditions": [{"condition": "state", "entity_id": "sensor.sparkx_i7_print_status", "state": "printing"}], "actions": [{"choose": [{"conditions": {"condition": "[REDACTED]", "value_template": "[REDACTED]"}, "sequence": ["[REDACTED]"]}]}, {"variables": {"spool_id": "{%- set slot = states('sensor.sparkx_i7_active_filament_slot') -%}\n{%- set ce = 'sensor.sparkx_i7_cfs_' ~ (slot | lower | replace(' ', '_')) ~ '_color' -%}\n{%- set color = states(ce) | replace('#', '') | lower -%}\n{%- set ns = namespace(id = '') -%}\n{%- for e in integration_entities('spoolman') -%}\n {%- if e.endswith('_color_hex') and (states(e) | lower) == color -%}\n {%- set ns.id = states(e[:-10] ~ '_id') -%}\n {%- endif -%}\n{%- endfor -%}\n{{ ns.id }}"}}, {"condition": "template", "value_template": "{{ spool_id not in ['', 'unknown', 'unavailable'] }}"}, {"action": "input_text.set_value", "target": {"entity_id": "input_text.sparkx_i7_print_spool_latch"}, "data": {"value": "{{ spool_id }}"}}], "mode": "single"}, "identifier": null, "python_transform": null, "config_hash": null, "take_control_of_blueprint": false, "category": null, "wait": true, "enabled": null, "run_actions": false, "MandatoryBPS": false, "BestPracticeKey": null}, "execution_time_ms": 2021.4054584503174, "success": true, "error_message": null, "response_size_bytes": 1773, "user_context": null} diff --git a/automations.yaml b/automations.yaml index dd6c492b..2aacc28f 100644 --- a/automations.yaml +++ b/automations.yaml @@ -1,62 +1,62 @@ -- id: "1780125759253" - alias: "Tablet: Dim Screen at Night" +- id: '1780125759253' + alias: 'Tablet: Dim Screen at Night' description: Drops tablet brightness to zero at night triggers: - - at: "23:30:00" - trigger: time + - at: '23:30:00' + trigger: time actions: - - action: notify.mobile_app_sm_t387w + - action: notify.mobile_app_sm_t387w + data: + message: command_screen_brightness_level data: - message: command_screen_brightness_level - data: - command: 0 -- id: "1780125803824" - alias: "Tablet: Restore Screen in Morning" + command: 0 +- id: '1780125803824' + alias: 'Tablet: Restore Screen in Morning' description: Restores tablet brightness to normal in the morning triggers: - - at: 07:00:00 - trigger: time + - at: 07:00:00 + trigger: time actions: - - action: notify.mobile_app_sm_t387w + - action: notify.mobile_app_sm_t387w + data: + message: command_screen_brightness_level data: - message: command_screen_brightness_level - data: - command: 180 -- id: "1780441470361" + command: 180 +- id: '1780441470361' alias: Reload Hilo Integrations on Reboot description: Reloads problematic integrations 2 minutes after Home Assistant starts up. triggers: - - trigger: homeassistant - event: start + - trigger: homeassistant + event: start conditions: [] actions: - - delay: - hours: 0 - minutes: 3 - seconds: 0 - milliseconds: 0 - - action: homeassistant.reload_config_entry - metadata: {} - target: - device_id: - - baad176ac2f415f3642e2d075bb6a977 - data: {} + - delay: + hours: 0 + minutes: 3 + seconds: 0 + milliseconds: 0 + - action: homeassistant.reload_config_entry + metadata: {} + target: + device_id: + - baad176ac2f415f3642e2d075bb6a977 + data: {} mode: single -- id: "1780509027967" +- id: '1780509027967' alias: Notify When Ring Console Battery Low - description: "" + description: '' triggers: - - trigger: numeric_state - entity_id: - - sensor.entryway_keypad_battery - below: 25 + - trigger: numeric_state + entity_id: + - sensor.entryway_keypad_battery + below: 25 conditions: [] actions: - - data: - message: Keypad Battery Low. Please Charge ASAP - title: Ring Console Battery - action: notify.notify + - data: + message: Keypad Battery Low. Please Charge ASAP + title: Ring Console Battery + action: notify.notify mode: single variables: _cafe_metadata: @@ -71,20 +71,20 @@ y: 45 graph_id: 816af3b7-3eac-47c3-8da3-8797d1774c0c graph_version: 1 -- id: "1780516946807" +- id: '1780516946807' alias: Notify When Front Door Sensor Battery Low - description: "" + description: '' triggers: - - trigger: numeric_state - entity_id: - - sensor.front_door_battery - below: 25 + - trigger: numeric_state + entity_id: + - sensor.front_door_battery + below: 25 conditions: [] actions: - - data: - message: Front Door Sensor Battery Low. Please Change Batteries ASAP. - title: Ring Console Battery - action: notify.notify + - data: + message: Front Door Sensor Battery Low. Please Change Batteries ASAP. + title: Ring Console Battery + action: notify.notify mode: single variables: _cafe_metadata: @@ -99,51 +99,51 @@ y: 45 graph_id: 816af3b7-3eac-47c3-8da3-8797d1774c0c graph_version: 1 -- id: "1780813227139" - alias: "Alert: Fridge or Freezer Power Outage" +- id: '1780813227139' + alias: 'Alert: Fridge or Freezer Power Outage' description: Triggers an alert if the fridge or freezer smart plug power consumption drops to 0W for too long. triggers: - - trigger: numeric_state - entity_id: - - sensor.freezer_power - for: - hours: 0 - minutes: 45 - seconds: 0 - below: 0.2 - id: freezer_down - - trigger: numeric_state - entity_id: - - sensor.fridge_power - for: - hours: 0 - minutes: 20 - seconds: 0 - below: 0.2 - id: fridge_down + - trigger: numeric_state + entity_id: + - sensor.freezer_power + for: + hours: 0 + minutes: 45 + seconds: 0 + below: 0.2 + id: freezer_down + - trigger: numeric_state + entity_id: + - sensor.fridge_power + for: + hours: 0 + minutes: 20 + seconds: 0 + below: 0.2 + id: fridge_down conditions: [] actions: + - if: + - condition: trigger + id: freezer_down + then: + - data: + title: "\U0001F6A8 URGENT: Freezer Power Failure" + message: The Freezer smart plug has drawn 0W of power for over 40 minutes! + Check the physical appliance immediately. + action: notify.notify + else: - if: - - condition: trigger - id: freezer_down + - condition: trigger + id: fridge_down then: - - data: - title: "\U0001F6A8 URGENT: Freezer Power Failure" - message: The Freezer smart plug has drawn 0W of power for over 40 minutes! - Check the physical appliance immediately. - action: notify.notify - else: - - if: - - condition: trigger - id: fridge_down - then: - - data: - title: "\U0001F6A8 URGENT: Fridge Power Failure" - message: The Fridge smart plug has drawn 0W of power for over 20 minutes! - Check the physical appliance immediately. - action: notify.notify - else: [] + - data: + title: "\U0001F6A8 URGENT: Fridge Power Failure" + message: The Fridge smart plug has drawn 0W of power for over 20 minutes! + Check the physical appliance immediately. + action: notify.notify + else: [] mode: single variables: _cafe_metadata: @@ -170,1730 +170,1729 @@ y: 102 graph_id: 5948b900-b45d-4c2e-ae73-c880acc3a1bf graph_version: 1 -- id: "1780989340205" - alias: "Kitchen: Coffee Maker Active Notification" +- id: '1780989340205' + alias: 'Kitchen: Coffee Maker Active Notification' description: Sends a mobile application push notification when the coffee maker power exceeds 1000W for 5 seconds. triggers: - - entity_id: sensor.coffee_maker_power - above: 1000 - for: - hours: 0 - minutes: 0 - seconds: 5 - trigger: numeric_state + - entity_id: sensor.coffee_maker_power + above: 1000 + for: + hours: 0 + minutes: 0 + seconds: 5 + trigger: numeric_state conditions: [] actions: - - data: - title: ☕ Coffee Time - message: Someone is Making Coffee - action: notify.notify - - action: notify.persistent_notification - metadata: {} - data: - title: ☕ Coffee Time - message: Someone is Making Coffee - - delay: - hours: 0 - minutes: 4 - seconds: 0 - milliseconds: 0 + - data: + title: ☕ Coffee Time + message: Someone is Making Coffee + action: notify.notify + - action: notify.persistent_notification + metadata: {} + data: + title: ☕ Coffee Time + message: Someone is Making Coffee + - delay: + hours: 0 + minutes: 4 + seconds: 0 + milliseconds: 0 mode: single -- id: "1781024962776" - alias: "Office: Light Control Motion" +- id: '1781024962776' + alias: 'Office: Light Control Motion' description: Turns on office lights when the door opens, or via motion if turned off by inactivity within the last hour. Turns off lights after 1 hour of no occupancy. Prevents motion from re-triggering if turned off manually/Alexa. Respects a master override toggle helper. triggers: - - trigger: state - entity_id: binary_sensor.office_door_contact - to: "on" - id: door_opened - - trigger: state - entity_id: binary_sensor.office_occupancy - to: "on" - id: motion_detected - - trigger: state - entity_id: binary_sensor.office_occupancy - to: "off" - for: - hours: 1 - minutes: 0 - seconds: 0 - id: turn_off_logic - - trigger: state - entity_id: input_boolean.office_keep_lights_on - to: "on" - id: keep_on_enabled + - trigger: state + entity_id: binary_sensor.office_door_contact + to: 'on' + id: door_opened + - trigger: state + entity_id: binary_sensor.office_occupancy + to: 'on' + id: motion_detected + - trigger: state + entity_id: binary_sensor.office_occupancy + to: 'off' + for: + hours: 1 + minutes: 0 + seconds: 0 + id: turn_off_logic + - trigger: state + entity_id: input_boolean.office_keep_lights_on + to: 'on' + id: keep_on_enabled conditions: [] actions: - - choose: - - conditions: - - condition: time - after: "10:00:00" - before: "20:00:00" - - condition: state - entity_id: light.playroom_light - state: "off" - - condition: state - entity_id: input_boolean.office_motion_override - state: "off" - - condition: or - conditions: - - condition: trigger - id: door_opened - - condition: and - conditions: - - condition: trigger - id: motion_detected - - condition: template - value_template: "{{ (now() - states.light.playroom_light.last_changed).total_seconds() - < 3600 and states.light.playroom_light.context.parent_id == none }}" - sequence: - - action: light.turn_on - target: - entity_id: light.playroom_light - data: {} - - conditions: - - condition: trigger - id: turn_off_logic - - condition: state - entity_id: light.playroom_light - state: "on" - - condition: state - entity_id: input_boolean.office_keep_lights_on - state: "off" - sequence: - - action: light.turn_off - target: - entity_id: light.playroom_light - data: {} - - action: notify.notify - data: - message: Office Lights Turned Off due to inactivity - title: ⚡️ Office Lights - - conditions: - - condition: trigger - id: keep_on_enabled - sequence: - - action: light.turn_on - target: - entity_id: light.playroom_light - data: {} + - choose: + - conditions: + - condition: time + after: '10:00:00' + before: '20:00:00' + - condition: state + entity_id: light.playroom_light + state: 'off' + - condition: state + entity_id: input_boolean.office_motion_override + state: 'off' + - condition: or + conditions: + - condition: trigger + id: door_opened + - condition: and + conditions: + - condition: trigger + id: motion_detected + - condition: template + value_template: '{{ (now() - states.light.playroom_light.last_changed).total_seconds() + < 3600 and states.light.playroom_light.context.parent_id == none }}' + sequence: + - action: light.turn_on + target: + entity_id: light.playroom_light + data: {} + - conditions: + - condition: trigger + id: turn_off_logic + - condition: state + entity_id: light.playroom_light + state: 'on' + - condition: state + entity_id: input_boolean.office_keep_lights_on + state: 'off' + sequence: + - action: light.turn_off + target: + entity_id: light.playroom_light + data: {} + - action: notify.notify + data: + message: Office Lights Turned Off due to inactivity + title: ⚡️ Office Lights + - conditions: + - condition: trigger + id: keep_on_enabled + sequence: + - action: light.turn_on + target: + entity_id: light.playroom_light + data: {} mode: restart -- id: "1781034724187" - alias: "Office: Turn Off Lights on Exit" +- id: '1781034724187' + alias: 'Office: Turn Off Lights on Exit' description: Turns off office lights 2 minutes after the door closes, but only if living room motion was detected after the door shut. triggers: - - trigger: state - entity_id: binary_sensor.office_door_contact - to: "off" + - trigger: state + entity_id: binary_sensor.office_door_contact + to: 'off' conditions: - - condition: state - entity_id: light.playroom_light - state: "on" - - condition: template - value_template: - "{{ states.binary_sensor.basement.last_changed > states.binary_sensor.office_door_contact.last_changed - }}" - - condition: state - entity_id: input_boolean.office_keep_lights_on - state: "off" + - condition: state + entity_id: light.playroom_light + state: 'on' + - condition: template + value_template: '{{ states.binary_sensor.basement.last_changed > states.binary_sensor.office_door_contact.last_changed + }}' + - condition: state + entity_id: input_boolean.office_keep_lights_on + state: 'off' actions: - - delay: - minutes: 2 - - action: light.turn_off - target: - entity_id: light.playroom_light - data: {} - - action: notify.notify - metadata: {} - data: - message: Office Lights Turned Off - title: ⚡️ Office Lights + - delay: + minutes: 2 + - action: light.turn_off + target: + entity_id: light.playroom_light + data: {} + - action: notify.notify + metadata: {} + data: + message: Office Lights Turned Off + title: ⚡️ Office Lights mode: single -- id: "1781102033733" +- id: '1781102033733' alias: Water Leak Detected - description: "" + description: '' triggers: - - type: moist - device_id: 59bc102f385d7a3524c8f21a5c53592b - entity_id: c268ff8842e905515de2274d09c5ab9e - domain: binary_sensor - metadata: - secondary: false - trigger: device + - type: moist + device_id: 59bc102f385d7a3524c8f21a5c53592b + entity_id: c268ff8842e905515de2274d09c5ab9e + domain: binary_sensor + metadata: + secondary: false + trigger: device conditions: [] actions: - - action: notify.notify - metadata: {} - data: - title: "\U0001F6A8 URGENT: Water Leak Detected" - message: Water Leak Detected in Basement. Check Water Heater for Leaks. - - action: persistent_notification.create - metadata: {} - data: - title: "\U0001F6A8 URGENT: Water Leak Detected" - message: Water Leak Detected in Basement. Check Water Heater for Leaks. + - action: notify.notify + metadata: {} + data: + title: "\U0001F6A8 URGENT: Water Leak Detected" + message: Water Leak Detected in Basement. Check Water Heater for Leaks. + - action: persistent_notification.create + metadata: {} + data: + title: "\U0001F6A8 URGENT: Water Leak Detected" + message: Water Leak Detected in Basement. Check Water Heater for Leaks. mode: single -- id: "1781112110968" - alias: "Freezer Safety: Alert if Plug Turns Off" +- id: '1781112110968' + alias: 'Freezer Safety: Alert if Plug Turns Off' description: Triggers an immediate notification if the freezer smart plug is turned off. triggers: - - trigger: state - entity_id: switch.freezer - to: "off" - for: - minutes: 1 + - trigger: state + entity_id: switch.freezer + to: 'off' + for: + minutes: 1 actions: - - action: notify.notify - data: - title: "\U0001F6A8 FREEZER PLUG TRIPPED!" - message: The freezer smart plug turned off. Check it immediately to prevent - food spoilage. - - action: notify.persistent_notification - metadata: {} - data: - title: "\U0001F6A8 FREEZER PLUG TRIPPED!" - message: The freezer smart plug turned off. Check it immediately to prevent - food spoilage. + - action: notify.notify + data: + title: "\U0001F6A8 FREEZER PLUG TRIPPED!" + message: The freezer smart plug turned off. Check it immediately to prevent + food spoilage. + - action: notify.persistent_notification + metadata: {} + data: + title: "\U0001F6A8 FREEZER PLUG TRIPPED!" + message: The freezer smart plug turned off. Check it immediately to prevent + food spoilage. mode: single -- id: "1781275767970" - alias: "Dishwasher: Cycle Finished Notification" +- id: '1781275767970' + alias: 'Dishwasher: Cycle Finished Notification' description: Alerts when the dishwasher finishes washing triggers: - - entity_id: - - sensor.150633095332665_progress - from: - - Dry - to: - - Complete - trigger: state + - entity_id: + - sensor.150633095332665_progress + from: + - Dry + to: + - Complete + trigger: state actions: - - action: notify.notify - data: - title: Dishwasher Done - message: The dishwasher cycle has completed successfully! + - action: notify.notify + data: + title: Dishwasher Done + message: The dishwasher cycle has completed successfully! mode: single -- id: "1781275801564" - alias: "Dishwasher: Rinse Aid Low Warning" +- id: '1781275801564' + alias: 'Dishwasher: Rinse Aid Low Warning' description: Alerts when rinse aid needs a refill triggers: - - entity_id: binary_sensor.150633095332665_rinse_aid - to: "on" - trigger: state + - entity_id: binary_sensor.150633095332665_rinse_aid + to: 'on' + trigger: state actions: - - action: notify.notify - data: - title: Dishwasher Maintenance - message: The dishwasher is low on rinse aid. Please refill it before the next - cycle! + - action: notify.notify + data: + title: Dishwasher Maintenance + message: The dishwasher is low on rinse aid. Please refill it before the next + cycle! mode: single -- id: "1781278655292" - alias: "Dishwasher: Dishwasher Started Notification" +- id: '1781278655292' + alias: 'Dishwasher: Dishwasher Started Notification' description: Alerts when the dishwasher starts washing triggers: - - entity_id: - - sensor.150633095332665_status - to: - - Running - trigger: state + - entity_id: + - sensor.150633095332665_status + to: + - Running + trigger: state conditions: [] actions: - - action: notify.notify - data: - title: Dishwasher Started - message: The dishwasher cycle has started! + - action: notify.notify + data: + title: Dishwasher Started + message: The dishwasher cycle has started! mode: single -- id: "1781279642928" - alias: "Dishwasher: Rinse Aid Refilled Notification" +- id: '1781279642928' + alias: 'Dishwasher: Rinse Aid Refilled Notification' description: Alerts when rinse aid has been refilled triggers: - - entity_id: - - binary_sensor.150633095332665_rinse_aid - to: - - "off" - trigger: state - from: - - "on" + - entity_id: + - binary_sensor.150633095332665_rinse_aid + to: + - 'off' + trigger: state + from: + - 'on' conditions: [] actions: - - action: notify.notify - data: - title: Dishwasher Maintenance - message: The dishwasher rinse aid has been refilled! + - action: notify.notify + data: + title: Dishwasher Maintenance + message: The dishwasher rinse aid has been refilled! mode: single -- id: "1781282506359" +- id: '1781282506359' alias: Dishwasher Cycle Tracker - description: "" + description: '' triggers: - - trigger: state - entity_id: - - sensor.150633095332665_progress - to: - - Complete + - trigger: state + entity_id: + - sensor.150633095332665_progress + to: + - Complete conditions: [] actions: - - action: counter.increment - target: - entity_id: - - counter.dishwasher_wash_cycles - - counter.dishwasher_total_wash_cycles - data: {} + - action: counter.increment + target: + entity_id: + - counter.dishwasher_wash_cycles + - counter.dishwasher_total_wash_cycles + data: {} mode: single -- id: "1781283625261" - alias: "Dishwasher: Create Persistent Filter Alert" +- id: '1781283625261' + alias: 'Dishwasher: Create Persistent Filter Alert' description: Pins a notification to the sidebar when the dishwasher hits 40 cycles. triggers: - - entity_id: - - counter.dishwasher_wash_cycles - above: 30 - trigger: numeric_state + - entity_id: + - counter.dishwasher_wash_cycles + above: 30 + trigger: numeric_state conditions: [] actions: - - action: persistent_notification.create - data: - title: Dishwasher Filter Maintenance - message: The dishwasher has completed 30 cycles. Please clean the physical mesh - filter and press Reset on your dashboard. - notification_id: dishwasher_filter_reminder - - action: notify.notify - metadata: {} - data: - title: Dishwasher Filter Maintenance - message: The dishwasher has completed 30 cycles. Please clean the physical mesh - filter and press Reset on your dashboard. + - action: persistent_notification.create + data: + title: Dishwasher Filter Maintenance + message: The dishwasher has completed 30 cycles. Please clean the physical mesh + filter and press Reset on your dashboard. + notification_id: dishwasher_filter_reminder + - action: notify.notify + metadata: {} + data: + title: Dishwasher Filter Maintenance + message: The dishwasher has completed 30 cycles. Please clean the physical mesh + filter and press Reset on your dashboard. mode: single -- id: "1781283661169" - alias: "Dishwasher: Clear Persistent Filter Alert" +- id: '1781283661169' + alias: 'Dishwasher: Clear Persistent Filter Alert' description: Automatically removes the sidebar notification when the counter is reset. triggers: - - entity_id: counter.dishwasher_wash_cycles - below: 10 - trigger: numeric_state + - entity_id: counter.dishwasher_wash_cycles + below: 10 + trigger: numeric_state conditions: [] actions: - - action: persistent_notification.dismiss - data: - notification_id: dishwasher_filter_reminder + - action: persistent_notification.dismiss + data: + notification_id: dishwasher_filter_reminder mode: single -- id: "1781285326960" - alias: "Tablet: Restore Screen in Morning v2" +- id: '1781285326960' + alias: 'Tablet: Restore Screen in Morning v2' description: Wakes the tablet and restores brightness/timeout triggers: - - at: 07:00:00 - trigger: time + - at: 07:00:00 + trigger: time actions: - - action: notify.mobile_app_sm_t387w + - action: notify.mobile_app_sm_t387w + data: + message: command_screen_on data: - message: command_screen_on - data: - command: turn_on - - action: notify.mobile_app_sm_t387w + command: turn_on + - action: notify.mobile_app_sm_t387w + data: + message: command_screen_off_timeout data: - message: command_screen_off_timeout - data: - command: 120000 - - action: notify.mobile_app_sm_t387w + command: 120000 + - action: notify.mobile_app_sm_t387w + data: + message: command_screen_brightness_level data: - message: command_screen_brightness_level - data: - command: 180 -- id: "1781320273276" - alias: "Tablet: Fix Greyed Out Brightness" + command: 180 +- id: '1781320273276' + alias: 'Tablet: Fix Greyed Out Brightness' description: Disables auto-brightness and restores manual slider control triggers: - - at: 07:00:00 - trigger: time + - at: 07:00:00 + trigger: time actions: - - action: notify.mobile_app_sm_t387w + - action: notify.mobile_app_sm_t387w + data: + message: command_auto_screen_brightness data: - message: command_auto_screen_brightness - data: - command: turn_off - - action: notify.mobile_app_sm_t387w + command: turn_off + - action: notify.mobile_app_sm_t387w + data: + message: command_screen_brightness_level data: - message: command_screen_brightness_level - data: - command: 180 -- id: "1781392657515" - alias: "Washing Machine: Cycle Status" + command: 180 +- id: '1781392657515' + alias: 'Washing Machine: Cycle Status' description: Triggers notifications when the washing machine starts and finishes its cycle based on power consumption with debouncing. triggers: - - entity_id: sensor.washer_power - above: 10 - id: washer_started - trigger: numeric_state - - entity_id: sensor.washer_power - below: 3 - for: - hours: 0 - minutes: 4 - seconds: 0 - id: washer_finished - trigger: numeric_state + - entity_id: sensor.washer_power + above: 10 + id: washer_started + trigger: numeric_state + - entity_id: sensor.washer_power + below: 3 + for: + hours: 0 + minutes: 4 + seconds: 0 + id: washer_finished + trigger: numeric_state conditions: [] actions: - - choose: - - conditions: - - condition: trigger - id: washer_started - - condition: state - entity_id: input_boolean.washer_running - state: "off" - sequence: - - action: input_boolean.turn_on - target: - entity_id: input_boolean.washer_running - - action: notify.notify - data: - title: Washer Started - message: The washing machine has started its cycle. - - conditions: - - condition: trigger - id: washer_finished - - condition: state - entity_id: input_boolean.washer_running - state: "on" - sequence: - - action: input_boolean.turn_off - target: - entity_id: input_boolean.washer_running - - action: notify.notify - data: - title: Washer Finished - message: The washing machine has completed its cycle. Time to empty it! -- id: "1781402128095" + - choose: + - conditions: + - condition: trigger + id: washer_started + - condition: state + entity_id: input_boolean.washer_running + state: 'off' + sequence: + - action: input_boolean.turn_on + target: + entity_id: input_boolean.washer_running + - action: notify.notify + data: + title: Washer Started + message: The washing machine has started its cycle. + - conditions: + - condition: trigger + id: washer_finished + - condition: state + entity_id: input_boolean.washer_running + state: 'on' + sequence: + - action: input_boolean.turn_off + target: + entity_id: input_boolean.washer_running + - action: notify.notify + data: + title: Washer Finished + message: The washing machine has completed its cycle. Time to empty it! +- id: '1781402128095' alias: Daily Morning Climate Report description: Triggers the weather and comfort report script every morning at 7:00 AM triggers: - - at: 07:00:00 - trigger: time + - at: 07:00:00 + trigger: time conditions: [] actions: - - action: script.weather_and_comfort_report + - action: script.weather_and_comfort_report mode: single -- id: "1781403940897" - alias: "Microwave: Cycle Status" +- id: '1781403940897' + alias: 'Microwave: Cycle Status' description: Triggers notifications when the microwave starts and finishes based on power consumption. triggers: - - entity_id: - - sensor.microwave_power - above: 100 - id: microwave_started - trigger: numeric_state - - entity_id: sensor.microwave_power - below: 3 - for: - hours: 0 - minutes: 1 - seconds: 0 - id: microwave_finished - trigger: numeric_state + - entity_id: + - sensor.microwave_power + above: 100 + id: microwave_started + trigger: numeric_state + - entity_id: sensor.microwave_power + below: 3 + for: + hours: 0 + minutes: 1 + seconds: 0 + id: microwave_finished + trigger: numeric_state conditions: [] actions: - - choose: - - conditions: - - condition: trigger - id: microwave_started - - condition: state - entity_id: input_boolean.microwave_running - state: "off" - sequence: - - action: input_boolean.turn_on - target: - entity_id: input_boolean.microwave_running - - action: notify.notify - data: - title: Microwave Started - message: The microwave is running. - - conditions: - - condition: trigger - id: microwave_finished - - condition: state - entity_id: input_boolean.microwave_running - state: "on" - sequence: - - action: input_boolean.turn_off - target: - entity_id: input_boolean.microwave_running - - action: notify.notify - data: - title: Microwave Finished - message: The microwave has finished! -- id: "1781404011664" - alias: "Ninja Toaster Oven: Cycle Status" + - choose: + - conditions: + - condition: trigger + id: microwave_started + - condition: state + entity_id: input_boolean.microwave_running + state: 'off' + sequence: + - action: input_boolean.turn_on + target: + entity_id: input_boolean.microwave_running + - action: notify.notify + data: + title: Microwave Started + message: The microwave is running. + - conditions: + - condition: trigger + id: microwave_finished + - condition: state + entity_id: input_boolean.microwave_running + state: 'on' + sequence: + - action: input_boolean.turn_off + target: + entity_id: input_boolean.microwave_running + - action: notify.notify + data: + title: Microwave Finished + message: The microwave has finished! +- id: '1781404011664' + alias: 'Ninja Toaster Oven: Cycle Status' description: Triggers notifications when the Ninja toaster oven starts and finishes cooking, with a buffer for element heat cycling. triggers: - - entity_id: sensor.ninja_power - above: 10 - id: ninja_started - trigger: numeric_state - - entity_id: sensor.ninja_power - below: 3 - for: - hours: 0 - minutes: 3 - seconds: 0 - id: ninja_finished - trigger: numeric_state + - entity_id: sensor.ninja_power + above: 10 + id: ninja_started + trigger: numeric_state + - entity_id: sensor.ninja_power + below: 3 + for: + hours: 0 + minutes: 3 + seconds: 0 + id: ninja_finished + trigger: numeric_state conditions: [] actions: - - choose: - - conditions: - - condition: trigger - id: ninja_started - - condition: state - entity_id: input_boolean.ninja_running - state: "off" - sequence: - - action: input_boolean.turn_on - target: - entity_id: input_boolean.ninja_running - - action: notify.notify - data: - title: Ninja Ovens Started - message: The Ninja toaster oven is heating up. - - conditions: - - condition: trigger - id: ninja_finished - - condition: state - entity_id: input_boolean.ninja_running - state: "on" - sequence: - - action: input_boolean.turn_off - target: - entity_id: input_boolean.ninja_running - - action: notify.notify - data: - title: Ninja Oven Finished - message: The Ninja toaster oven has finished cooking! -- id: "1781445544080" - alias: "Kitchen: Coffee Maker Cycle Status" - description: "Triggers on the high-wattage grinder spike. Dynamically waits for + - choose: + - conditions: + - condition: trigger + id: ninja_started + - condition: state + entity_id: input_boolean.ninja_running + state: 'off' + sequence: + - action: input_boolean.turn_on + target: + entity_id: input_boolean.ninja_running + - action: notify.notify + data: + title: Ninja Ovens Started + message: The Ninja toaster oven is heating up. + - conditions: + - condition: trigger + id: ninja_finished + - condition: state + entity_id: input_boolean.ninja_running + state: 'on' + sequence: + - action: input_boolean.turn_off + target: + entity_id: input_boolean.ninja_running + - action: notify.notify + data: + title: Ninja Oven Finished + message: The Ninja toaster oven has finished cooking! +- id: '1781445544080' + alias: 'Kitchen: Coffee Maker Cycle Status' + description: 'Triggers on the high-wattage grinder spike. Dynamically waits for the cycle to finish: it requires a minimum of 1 minute to pass AND the power to - drop back to the TV baseline." + drop back to the TV baseline.' triggers: - - trigger: numeric_state - entity_id: sensor.coffee_maker_power - above: 800 - id: coffee_started - - trigger: numeric_state - entity_id: sensor.coffee_maker_power - below: 15 - for: - hours: 0 - minutes: 1 - seconds: 0 - id: coffee_finished + - trigger: numeric_state + entity_id: sensor.coffee_maker_power + above: 800 + id: coffee_started + - trigger: numeric_state + entity_id: sensor.coffee_maker_power + below: 15 + for: + hours: 0 + minutes: 1 + seconds: 0 + id: coffee_finished conditions: [] actions: - - choose: - - conditions: - - condition: trigger - id: coffee_started - - condition: state - entity_id: input_boolean.coffee_maker_running - state: "off" - sequence: - - action: input_boolean.turn_on - target: - entity_id: input_boolean.coffee_maker_running - - action: notify.notify - data: - title: ☕ Coffee Time - message: Someone is making coffee. - - conditions: - - condition: trigger - id: coffee_finished - - condition: state - entity_id: input_boolean.coffee_maker_running - state: "on" - sequence: - - action: input_boolean.turn_off - target: - entity_id: input_boolean.coffee_maker_running - - action: notify.notify - data: - title: ☕ Coffee Ready - message: Your coffee is ready to enjoy! + - choose: + - conditions: + - condition: trigger + id: coffee_started + - condition: state + entity_id: input_boolean.coffee_maker_running + state: 'off' + sequence: + - action: input_boolean.turn_on + target: + entity_id: input_boolean.coffee_maker_running + - action: notify.notify + data: + title: ☕ Coffee Time + message: Someone is making coffee. + - conditions: + - condition: trigger + id: coffee_finished + - condition: state + entity_id: input_boolean.coffee_maker_running + state: 'on' + sequence: + - action: input_boolean.turn_off + target: + entity_id: input_boolean.coffee_maker_running + - action: notify.notify + data: + title: ☕ Coffee Ready + message: Your coffee is ready to enjoy! mode: single -- id: "1781793117883" +- id: '1781793117883' alias: Basement Temperature Change - description: "" + description: '' triggers: - - trigger: numeric_state - entity_id: sensor.basement_temperature - above: 15 - - trigger: numeric_state - entity_id: sensor.basement_temperature - below: 10 + - trigger: numeric_state + entity_id: sensor.basement_temperature + above: 15 + - trigger: numeric_state + entity_id: sensor.basement_temperature + below: 10 conditions: [] actions: - - action: notify.notify - metadata: {} - data: - title: Basement Temperature Change - message: "{% set t = states('sensor.basement_temperature') | float(0) %}{% - if t >= 15 %}Basement temperature changed: crossed above 15°C (current: {{ - t }}°C){% elif t <= 10 %}Basement temperature changed: crossed below 10°C - (current: {{ t }}°C){% else %}Basement temperature changed (current: {{ t - }}°C){% endif %}" + - action: notify.notify + metadata: {} + data: + title: Basement Temperature Change + message: '{% set t = states(''sensor.basement_temperature'') | float(0) %}{% + if t >= 15 %}Basement temperature changed: crossed above 15°C (current: {{ + t }}°C){% elif t <= 10 %}Basement temperature changed: crossed below 10°C + (current: {{ t }}°C){% else %}Basement temperature changed (current: {{ t + }}°C){% endif %}' mode: single -- id: "1782161891986" - alias: "Notification: Pool Sensor Low Battery" +- id: '1782161891986' + alias: 'Notification: Pool Sensor Low Battery' description: Alert when the pool temperature sensor battery drops below 15% triggers: - - entity_id: - - sensor.pool_battery - below: 15 - trigger: numeric_state + - entity_id: + - sensor.pool_battery + below: 15 + trigger: numeric_state conditions: [] actions: - - data: - title: Pool Sensor Battery Low - message: The pool temperature sensor battery is currently at {{ states('sensor.pool_battery') - }}%. Please change it soon. - action: notify.persistent_notification - - action: notify.notify - metadata: {} - data: - title: Pool Sensor Battery Low - message: The pool temperature sensor battery is currently at {{ states('sensor.pool_battery') - }}%. Please change it soon. + - data: + title: Pool Sensor Battery Low + message: The pool temperature sensor battery is currently at {{ states('sensor.pool_battery') + }}%. Please change it soon. + action: notify.persistent_notification + - action: notify.notify + metadata: {} + data: + title: Pool Sensor Battery Low + message: The pool temperature sensor battery is currently at {{ states('sensor.pool_battery') + }}%. Please change it soon. mode: single - &id001 id: commute_morning_traffic_alert_map - alias: "Commute: Morning Traffic Alert with Map" + alias: 'Commute: Morning Traffic Alert with Map' description: Checks commute times at 7:15 AM and attaches a map if traffic is bad. triggers: - - at: 07:15:00 - trigger: time + - at: 07:15:00 + trigger: time conditions: - - condition: or - conditions: - - condition: template - value_template: "{{ states('sensor.google_travel_time_work') | float(0) > - 35 }}" + - condition: or + conditions: + - condition: template + value_template: '{{ states(''sensor.google_travel_time_work'') | float(0) > + 35 }}' actions: - - action: camera.snapshot - target: - entity_id: camera.camera_commute_map + - action: camera.snapshot + target: + entity_id: camera.camera_commute_map + data: + filename: /config/www/commute_snapshot.jpg + - action: notify.notify + data: + title: "\U0001F6A8 Commute Delay Alert!" + message: "Traffic to Work is heavier than usual this morning. \n- Google Maps: + {{ states('sensor.google_travel_time_work') }} mins." data: - filename: /config/www/commute_snapshot.jpg - - action: notify.notify - data: - title: "\U0001F6A8 Commute Delay Alert!" - message: "Traffic to Work is heavier than usual this morning. \n- Google Maps: - {{ states('sensor.google_travel_time_work') }} mins." - data: - image: /local/commute_snapshot.jpg - enabled: false - - action: notify.persistent_notification - data: - title: "\U0001F6A8 Commute Delay Alert!" - message: "Traffic to Work is heavier than usual this morning. \n- Google Maps: - {{ states('sensor.google_travel_time_work') }} mins. \n![Commute Map](/local/commute_snapshot.jpg)" + image: /local/commute_snapshot.jpg + enabled: false + - action: notify.persistent_notification + data: + title: "\U0001F6A8 Commute Delay Alert!" + message: "Traffic to Work is heavier than usual this morning. \n- Google Maps: + {{ states('sensor.google_travel_time_work') }} mins. \n![Commute Map](/local/commute_snapshot.jpg)" mode: single - *id001 - *id001 -- id: "1782999027626" - alias: "Commute: Morning Traffic Alert" +- id: '1782999027626' + alias: 'Commute: Morning Traffic Alert' description: Pushes an interactive, live traffic map to my phone before the commute. triggers: - - at: 07:15:00 - trigger: time + - at: 07:15:00 + trigger: time actions: - - action: notify.notify + - action: notify.notify + data: + title: Morning Commute Traffic + message: Swipe down to view live traffic along your route. data: - title: Morning Commute Traffic - message: Swipe down to view live traffic along your route. - data: - push: - category: map - action_data: - latitude: "45.474668" - longitude: "-73.737158" - shows_traffic: true - shows_scale: true -- id: "1783000087983" + push: + category: map + action_data: + latitude: '45.474668' + longitude: '-73.737158' + shows_traffic: true + shows_scale: true +- id: '1783000087983' alias: Morning Commute Alert description: Notify when commute is longer than 35 minutes. triggers: - - trigger: time - at: 07:15:00 + - trigger: time + at: 07:15:00 conditions: - - condition: time - weekday: - - mon - - tue - - wed - - thu - - fri - - condition: or - conditions: - - condition: numeric_state - entity_id: sensor.google_travel_time_work - above: 35 + - condition: time + weekday: + - mon + - tue + - wed + - thu + - fri + - condition: or + conditions: + - condition: numeric_state + entity_id: sensor.google_travel_time_work + above: 35 actions: - - action: notify.notify - data: - title: "\U0001F697 Morning Commute" - message: "Google: {{ states('sensor.google_travel_time_work') }} min\n\n{% set - g = states('sensor.google_travel_time_work') | float(0) %} {% if g > 50 %} - \U0001F6A8 Major traffic delays. {% elif g > 40 %} ⚠️ Heavy traffic. {% else - %} \U0001F7E1 Moderate traffic. {% endif %}" + - action: notify.notify + data: + title: "\U0001F697 Morning Commute" + message: "Google: {{ states('sensor.google_travel_time_work') }} min\n\n{% set + g = states('sensor.google_travel_time_work') | float(0) %} {% if g > 50 %} + \U0001F6A8 Major traffic delays. {% elif g > 40 %} ⚠️ Heavy traffic. {% else + %} \U0001F7E1 Moderate traffic. {% endif %}" mode: single -- id: "1783162325964" +- id: '1783162325964' alias: Motion Shed - AI Description description: Takes a snapshot when the Nest camera detects motion, a person, an animal, or a doorbell press, analyzes it with AI, and sends a mobile and persistent notification. triggers: - - trigger: state - entity_id: input_boolean.blink_shed_camera_motion - to: "on" - enabled: true - - trigger: event - event_type: state_changed - event_data: - entity_id: event.front_door_front_door_motion - enabled: false - - trigger: state - entity_id: event.living_room_living_room_camera_motion - enabled: false - - trigger: state + - trigger: state + entity_id: input_boolean.blink_shed_camera_motion + to: 'on' + enabled: true + - trigger: event + event_type: state_changed + event_data: entity_id: event.front_door_front_door_motion - enabled: false - - trigger: event.received - target: - entity_id: event.entryway_entryway_camera_motion - options: - event_type: - - camera_motion - - camera_person - - camera_sound - enabled: false - - trigger: event.received - target: - device_id: 290f56e5a655e3af82cbf3cf9fd22406 - options: - event_type: - - camera_motion - - camera_person - - camera_sound - - ring - enabled: false - - trigger: event.received - target: - device_id: 679d52e0d16cf48648d11dd024b961f8 - options: - event_type: - - camera_motion - - camera_sound - - camera_person - enabled: false + enabled: false + - trigger: state + entity_id: event.living_room_living_room_camera_motion + enabled: false + - trigger: state + entity_id: event.front_door_front_door_motion + enabled: false + - trigger: event.received + target: + entity_id: event.entryway_entryway_camera_motion + options: + event_type: + - camera_motion + - camera_person + - camera_sound + enabled: false + - trigger: event.received + target: + device_id: 290f56e5a655e3af82cbf3cf9fd22406 + options: + event_type: + - camera_motion + - camera_person + - camera_sound + - ring + enabled: false + - trigger: event.received + target: + device_id: 679d52e0d16cf48648d11dd024b961f8 + options: + event_type: + - camera_motion + - camera_sound + - camera_person + enabled: false conditions: - - condition: template - value_template: "{{ trigger.event.data.new_state.attributes.event_type in ['motion', - 'person', 'animal', 'chime'] }}" - enabled: false + - condition: template + value_template: '{{ trigger.event.data.new_state.attributes.event_type in [''motion'', + ''person'', ''animal'', ''chime''] }}' + enabled: false actions: - - action: camera.record - target: - entity_id: - - camera.blink_backyard_shed - data: - duration: 10 - lookback: 0 - filename: /media/blinkshed.mp4 - enabled: false - - delay: - hours: 0 - minutes: 0 - seconds: 10 - milliseconds: 0 - enabled: false - - action: homeassistant.update_entity - target: - entity_id: camera.blink_backyard_shed - data: {} - - delay: - hours: 0 - minutes: 0 - seconds: 2 - milliseconds: 0 - - action: camera.snapshot - target: - entity_id: camera.blink_backyard_shed - data: - filename: /config/www/flush_cache.jpg - - delay: - hours: 0 - minutes: 0 - seconds: 3 - milliseconds: 0 - - action: homeassistant.update_entity - target: - entity_id: camera.blink_backyard_shed - data: {} - - delay: - hours: 0 - minutes: 0 - seconds: 2 - milliseconds: 0 - - variables: - snapshot_filename: blink_shed_{{ now().strftime('%Y%m%d_%H%M%S') }}.jpg - - variables: - notification_id: blink_shed_{{ now().strftime('%Y%m%d_%H%M%S_%f') }} - - action: camera.snapshot - target: - entity_id: camera.blink_backyard - data: - filename: /media/{{ snapshot_filename }} - - delay: - hours: 0 - minutes: 0 - seconds: 2 - milliseconds: 0 - - action: ai_task.generate_data - continue_on_error: true - data: - task_name: Blink Backyard Camera Analysis - entity_id: ai_task.ollama_ai_task_video - instructions: Describe what you see in this image in brief, but make it a little - humorous. Focus on any people, objects, animals or activities. Text needs - to be max 240 characters. - attachments: - - media_content_id: media-source://media_source/local/{{ snapshot_filename }} - media_content_type: image/jpeg - response_variable: ai_profile - - action: notify.notify - continue_on_error: true - data: - title: Motion Detected - Backyard Shed - message: "{{ ai_profile.data if ai_profile is defined and 'data' in ai_profile - else 'Motion detected, but the AI Task integration failed to return a response.' - }}" - - action: persistent_notification.create - data: - title: Motion Detected - Backyard Shed - message: "{{ ai_profile.data if ai_profile is defined and 'data' in ai_profile - else 'Motion detected, but the AI Task integration failed to return a response.' - }} + - action: camera.record + target: + entity_id: + - camera.blink_backyard_shed + data: + duration: 10 + lookback: 0 + filename: /media/blinkshed.mp4 + enabled: false + - delay: + hours: 0 + minutes: 0 + seconds: 10 + milliseconds: 0 + enabled: false + - action: homeassistant.update_entity + target: + entity_id: camera.blink_backyard_shed + data: {} + - delay: + hours: 0 + minutes: 0 + seconds: 2 + milliseconds: 0 + - action: camera.snapshot + target: + entity_id: camera.blink_backyard_shed + data: + filename: /config/www/flush_cache.jpg + - delay: + hours: 0 + minutes: 0 + seconds: 3 + milliseconds: 0 + - action: homeassistant.update_entity + target: + entity_id: camera.blink_backyard_shed + data: {} + - delay: + hours: 0 + minutes: 0 + seconds: 2 + milliseconds: 0 + - variables: + snapshot_filename: blink_shed_{{ now().strftime('%Y%m%d_%H%M%S') }}.jpg + - variables: + notification_id: blink_shed_{{ now().strftime('%Y%m%d_%H%M%S_%f') }} + - action: camera.snapshot + target: + entity_id: camera.blink_backyard + data: + filename: /media/{{ snapshot_filename }} + - delay: + hours: 0 + minutes: 0 + seconds: 2 + milliseconds: 0 + - action: ai_task.generate_data + continue_on_error: true + data: + task_name: Blink Backyard Camera Analysis + entity_id: ai_task.ollama_ai_task_video + instructions: Describe what you see in this image in brief, but make it a little + humorous. Focus on any people, objects, animals or activities. Text needs + to be max 240 characters. + attachments: + - media_content_id: media-source://media_source/local/{{ snapshot_filename }} + media_content_type: image/jpeg + response_variable: ai_profile + - action: notify.notify + continue_on_error: true + data: + title: Motion Detected - Backyard Shed + message: '{{ ai_profile.data if ai_profile is defined and ''data'' in ai_profile + else ''Motion detected, but the AI Task integration failed to return a response.'' + }}' + - action: persistent_notification.create + data: + title: Motion Detected - Backyard Shed + message: '{{ ai_profile.data if ai_profile is defined and ''data'' in ai_profile + else ''Motion detected, but the AI Task integration failed to return a response.'' + }} - ![Snapshot](/local/{{ snapshot_filename }})" - notification_id: "{{ notification_id }}" + ![Snapshot](/local/{{ snapshot_filename }})' + notification_id: '{{ notification_id }}' mode: queued max: 10 -- id: "1783452320698" +- id: '1783452320698' alias: Nest Test Motion description: Takes a snapshot when the Blink camera detects motion, analyzes it with AI, and sends a mobile and persistent notification. triggers: - - trigger: state - entity_id: - - binary_sensor.backyard - to: - - "on" + - trigger: state + entity_id: + - binary_sensor.backyard + to: + - 'on' conditions: [] actions: - - delay: 00:00:02 - - action: camera.snapshot - target: - entity_id: - - camera.front - - camera.backyard_shed - data: - filename: /media/nest_Living2.jpg - - action: camera.snapshot - target: - entity_id: camera.backyard_tree - data: - filename: /config/www/blinkTree.jpg - - delay: 00:00:02 - - action: ai_task.generate_data - continue_on_error: true - response_variable: ai_profile - data: - task_name: Blink InShed Camera Analysis - entity_id: ai_task.ollama_ai_task_video - instructions: Describe what you see in this image in brief. Focus on any people, - objects, or activities. Text needs to be max 225 characters. - attachments: - - media_content_id: media-source://media_source/local/blinkTree.jpg - media_content_type: image/jpeg - - action: notify.notify - data: - title: Motion Detected - Backyard Tree - message: "{{ ai_profile.data if ai_profile is defined and 'data' in ai_profile - else 'Motion detected, but the AI Task integration failed to return a response.' - }}" - - action: persistent_notification.create - data: - title: Motion Detected - Backyard Tree - notification_id: backyard_tree_motion - message: "{{ ai_profile.data if ai_profile is defined and 'data' in ai_profile - else 'Motion detected, but the AI Task integration failed to return a response.' - }} + - delay: 00:00:02 + - action: camera.snapshot + target: + entity_id: + - camera.front + - camera.backyard_shed + data: + filename: /media/nest_Living2.jpg + - action: camera.snapshot + target: + entity_id: camera.backyard_tree + data: + filename: /config/www/blinkTree.jpg + - delay: 00:00:02 + - action: ai_task.generate_data + continue_on_error: true + response_variable: ai_profile + data: + task_name: Blink InShed Camera Analysis + entity_id: ai_task.ollama_ai_task_video + instructions: Describe what you see in this image in brief. Focus on any people, + objects, or activities. Text needs to be max 225 characters. + attachments: + - media_content_id: media-source://media_source/local/blinkTree.jpg + media_content_type: image/jpeg + - action: notify.notify + data: + title: Motion Detected - Backyard Tree + message: '{{ ai_profile.data if ai_profile is defined and ''data'' in ai_profile + else ''Motion detected, but the AI Task integration failed to return a response.'' + }}' + - action: persistent_notification.create + data: + title: Motion Detected - Backyard Tree + notification_id: backyard_tree_motion + message: '{{ ai_profile.data if ai_profile is defined and ''data'' in ai_profile + else ''Motion detected, but the AI Task integration failed to return a response.'' + }} - ![Snapshot](/local/blinkTree.jpg)" + ![Snapshot](/local/blinkTree.jpg)' mode: queued max: 10 -- id: "1783540959739" +- id: '1783540959739' alias: Motion Front Door - AI Description description: Takes a snapshot when the Nest camera detects motion, a person, an animal, or a doorbell press, analyzes it with AI, and sends a mobile and persistent notification. triggers: - - trigger: event - event_type: state_changed - event_data: - entity_id: event.front_door_front_door_motion - enabled: false - - trigger: state - entity_id: event.living_room_living_room_camera_motion - enabled: false - - trigger: state + - trigger: event + event_type: state_changed + event_data: entity_id: event.front_door_front_door_motion - enabled: false - - trigger: event.received - target: - entity_id: event.entryway_entryway_camera_motion - options: - event_type: - - camera_motion - - camera_person - - camera_sound - enabled: false - - trigger: event.received - target: - device_id: 290f56e5a655e3af82cbf3cf9fd22406 - options: - event_type: - - camera_motion - - camera_person - - camera_sound - - ring - - trigger: event.received - target: - device_id: 679d52e0d16cf48648d11dd024b961f8 - options: - event_type: - - camera_motion - - camera_sound - - camera_person - enabled: false - - trigger: state - entity_id: - - input_boolean.blink_front_camera_motion - to: - - "on" - enabled: true + enabled: false + - trigger: state + entity_id: event.living_room_living_room_camera_motion + enabled: false + - trigger: state + entity_id: event.front_door_front_door_motion + enabled: false + - trigger: event.received + target: + entity_id: event.entryway_entryway_camera_motion + options: + event_type: + - camera_motion + - camera_person + - camera_sound + enabled: false + - trigger: event.received + target: + device_id: 290f56e5a655e3af82cbf3cf9fd22406 + options: + event_type: + - camera_motion + - camera_person + - camera_sound + - ring + - trigger: event.received + target: + device_id: 679d52e0d16cf48648d11dd024b961f8 + options: + event_type: + - camera_motion + - camera_sound + - camera_person + enabled: false + - trigger: state + entity_id: + - input_boolean.blink_front_camera_motion + to: + - 'on' + enabled: true conditions: - - condition: template - value_template: "{{ trigger.event.data.new_state.attributes.event_type in ['motion', - 'person', 'animal', 'chime'] }}" - enabled: false + - condition: template + value_template: '{{ trigger.event.data.new_state.attributes.event_type in [''motion'', + ''person'', ''animal'', ''chime''] }}' + enabled: false actions: - - action: blink.trigger_camera - target: - entity_id: camera.blink_front - data: {} - enabled: false - - delay: - hours: 0 - minutes: 0 - seconds: 10 - milliseconds: 0 - enabled: false - - action: homeassistant.update_entity - target: - entity_id: camera.blink_front - - delay: - hours: 0 - minutes: 0 - seconds: 2 - milliseconds: 0 - - variables: - snapshot_filename: blink_Front_{{ now().strftime('%Y%m%d_%H%M%S') }}.jpg - - variables: - notification_id: blink_front_{{ now().strftime('%Y%m%d_%H%M%S_%f') }} - - action: camera.snapshot - target: - entity_id: camera.blink_front - data: - filename: /media/{{ snapshot_filename }} - - action: camera.snapshot - target: - entity_id: camera.blink_front - data: - filename: /config/www/{{ snapshot_filename }} - - delay: - hours: 0 - minutes: 0 - seconds: 2 - milliseconds: 0 - - action: ai_task.generate_data - continue_on_error: true - data: - task_name: Nest Front Camera Analysis - entity_id: ai_task.google_ai_task - instructions: Describe what you see in this image in brief, but make it a little - humorous. Focus on any people, objects, animals or activities. Text needs - to be max 240 characters. - attachments: - - media_content_id: media-source://media_source/local/{{ snapshot_filename }} - media_content_type: image/jpeg - response_variable: ai_profile - - action: notify.notify - continue_on_error: true - data: - title: Motion Detected - Front Door - message: "{{ ai_profile.data if ai_profile is defined and 'data' in ai_profile - else 'Motion detected, but the AI Task integration failed to return a response.' - }}" - - action: notify.persistent_notification - data: - title: Motion Detected - Front Door - message: "{{ ai_profile.data if ai_profile is defined and 'data' in ai_profile - else 'Motion detected, but the AI Task integration failed to return a response.' - }} + - action: blink.trigger_camera + target: + entity_id: camera.blink_front + data: {} + enabled: false + - delay: + hours: 0 + minutes: 0 + seconds: 10 + milliseconds: 0 + enabled: false + - action: homeassistant.update_entity + target: + entity_id: camera.blink_front + - delay: + hours: 0 + minutes: 0 + seconds: 2 + milliseconds: 0 + - variables: + snapshot_filename: blink_Front_{{ now().strftime('%Y%m%d_%H%M%S') }}.jpg + - variables: + notification_id: blink_front_{{ now().strftime('%Y%m%d_%H%M%S_%f') }} + - action: camera.snapshot + target: + entity_id: camera.blink_front + data: + filename: /media/{{ snapshot_filename }} + - action: camera.snapshot + target: + entity_id: camera.blink_front + data: + filename: /config/www/{{ snapshot_filename }} + - delay: + hours: 0 + minutes: 0 + seconds: 2 + milliseconds: 0 + - action: ai_task.generate_data + continue_on_error: true + data: + task_name: Nest Front Camera Analysis + entity_id: ai_task.google_ai_task + instructions: Describe what you see in this image in brief, but make it a little + humorous. Focus on any people, objects, animals or activities. Text needs + to be max 240 characters. + attachments: + - media_content_id: media-source://media_source/local/{{ snapshot_filename }} + media_content_type: image/jpeg + response_variable: ai_profile + - action: notify.notify + continue_on_error: true + data: + title: Motion Detected - Front Door + message: '{{ ai_profile.data if ai_profile is defined and ''data'' in ai_profile + else ''Motion detected, but the AI Task integration failed to return a response.'' + }}' + - action: notify.persistent_notification + data: + title: Motion Detected - Front Door + message: '{{ ai_profile.data if ai_profile is defined and ''data'' in ai_profile + else ''Motion detected, but the AI Task integration failed to return a response.'' + }} - ![Snapshot](/local/{{ snapshot_filename }})" - data: - notification_id: nest_front_motion - enabled: false - - action: persistent_notification.create - metadata: {} + ![Snapshot](/local/{{ snapshot_filename }})' data: - message: "{{ ai_profile.data if ai_profile is defined and 'data' in ai_profile - else 'Motion detected, but the AI Task integration failed to return a response.' - }} ![Snapshot](/local/{{ snapshot_filename }})" - title: Motion Detected - Front Door - notification_id: "{{ notification_id }}" + notification_id: nest_front_motion + enabled: false + - action: persistent_notification.create + metadata: {} + data: + message: '{{ ai_profile.data if ai_profile is defined and ''data'' in ai_profile + else ''Motion detected, but the AI Task integration failed to return a response.'' + }} ![Snapshot](/local/{{ snapshot_filename }})' + title: Motion Detected - Front Door + notification_id: '{{ notification_id }}' mode: queued max: 10 -- id: "1783615071224" - alias: "TEST: AI Camera Motion Detection OLLAMA" +- id: '1783615071224' + alias: 'TEST: AI Camera Motion Detection OLLAMA' description: Takes a snapshot when the Nest camera detects motion, a person, an animal, or a doorbell press, analyzes it with AI, and sends a mobile and persistent notification. triggers: - - trigger: event - event_type: state_changed - event_data: - entity_id: event.front_door_front_door_motion - enabled: false - - trigger: state - entity_id: event.living_room_living_room_camera_motion - enabled: false - - trigger: state + - trigger: event + event_type: state_changed + event_data: entity_id: event.front_door_front_door_motion - enabled: false - - trigger: event.received - target: - entity_id: event.entryway_entryway_camera_motion - options: - event_type: - - camera_motion - - camera_person - - camera_sound - enabled: false - - trigger: event.received - target: - device_id: 290f56e5a655e3af82cbf3cf9fd22406 - options: - event_type: - - camera_motion - - camera_person - - camera_sound - - ring - - trigger: event.received - target: - device_id: 679d52e0d16cf48648d11dd024b961f8 - options: - event_type: - - camera_motion - - camera_sound - - camera_person - enabled: false + enabled: false + - trigger: state + entity_id: event.living_room_living_room_camera_motion + enabled: false + - trigger: state + entity_id: event.front_door_front_door_motion + enabled: false + - trigger: event.received + target: + entity_id: event.entryway_entryway_camera_motion + options: + event_type: + - camera_motion + - camera_person + - camera_sound + enabled: false + - trigger: event.received + target: + device_id: 290f56e5a655e3af82cbf3cf9fd22406 + options: + event_type: + - camera_motion + - camera_person + - camera_sound + - ring + - trigger: event.received + target: + device_id: 679d52e0d16cf48648d11dd024b961f8 + options: + event_type: + - camera_motion + - camera_sound + - camera_person + enabled: false conditions: - - condition: template - value_template: "{{ trigger.event.data.new_state.attributes.event_type in ['motion', - 'person', 'animal', 'chime'] }}" - enabled: false + - condition: template + value_template: '{{ trigger.event.data.new_state.attributes.event_type in [''motion'', + ''person'', ''animal'', ''chime''] }}' + enabled: false actions: - - action: blink.trigger_camera - target: - entity_id: camera.front - data: {} - enabled: false - - delay: - hours: 0 - minutes: 0 - seconds: 10 - milliseconds: 0 - enabled: false - - action: homeassistant.update_entity - target: - entity_id: camera.front - - variables: - snapshot_filename: blink_Front_{{ now().strftime('%Y%m%d_%H%M%S') }}.jpg - - variables: - notification_id: blink_front_{{ now().strftime('%Y%m%d_%H%M%S_%f') }} - - action: camera.snapshot - target: - entity_id: camera.blink_front - data: - filename: /media/{{ snapshot_filename }} - - action: camera.snapshot - target: - entity_id: camera.blink_front - data: - filename: /config/www/{{ snapshot_filename }} - - delay: - hours: 0 - minutes: 0 - seconds: 4 - milliseconds: 0 - - action: ai_task.generate_data - continue_on_error: true - data: - task_name: Nest Front Camera Analysis - entity_id: ai_task.ollama_ai_task_2 - instructions: Describe what you see in this image in brief. Focus on any people, - objects, animals or activities. Text needs to be max 240 characters. - attachments: - - media_content_id: media-source://media_source/local/{{ snapshot_filename }} - media_content_type: image/jpeg - response_variable: ai_profile - - action: notify.notify - continue_on_error: true - data: - title: Motion Detected - Front Door - message: "{{ ai_profile.data if ai_profile is defined and 'data' in ai_profile - else 'Motion detected, but the AI Task integration failed to return a response.' - }}" - - action: notify.persistent_notification - data: - title: Motion Detected - Front Door - message: "{{ ai_profile.data if ai_profile is defined and 'data' in ai_profile - else 'Motion detected, but the AI Task integration failed to return a response.' - }} + - action: blink.trigger_camera + target: + entity_id: camera.front + data: {} + enabled: false + - delay: + hours: 0 + minutes: 0 + seconds: 10 + milliseconds: 0 + enabled: false + - action: homeassistant.update_entity + target: + entity_id: camera.front + - variables: + snapshot_filename: blink_Front_{{ now().strftime('%Y%m%d_%H%M%S') }}.jpg + - variables: + notification_id: blink_front_{{ now().strftime('%Y%m%d_%H%M%S_%f') }} + - action: camera.snapshot + target: + entity_id: camera.blink_front + data: + filename: /media/{{ snapshot_filename }} + - action: camera.snapshot + target: + entity_id: camera.blink_front + data: + filename: /config/www/{{ snapshot_filename }} + - delay: + hours: 0 + minutes: 0 + seconds: 4 + milliseconds: 0 + - action: ai_task.generate_data + continue_on_error: true + data: + task_name: Nest Front Camera Analysis + entity_id: ai_task.ollama_ai_task_2 + instructions: Describe what you see in this image in brief. Focus on any people, + objects, animals or activities. Text needs to be max 240 characters. + attachments: + - media_content_id: media-source://media_source/local/{{ snapshot_filename }} + media_content_type: image/jpeg + response_variable: ai_profile + - action: notify.notify + continue_on_error: true + data: + title: Motion Detected - Front Door + message: '{{ ai_profile.data if ai_profile is defined and ''data'' in ai_profile + else ''Motion detected, but the AI Task integration failed to return a response.'' + }}' + - action: notify.persistent_notification + data: + title: Motion Detected - Front Door + message: '{{ ai_profile.data if ai_profile is defined and ''data'' in ai_profile + else ''Motion detected, but the AI Task integration failed to return a response.'' + }} - ![Snapshot](/local/{{ snapshot_filename }})" - data: - notification_id: nest_front_motion - enabled: false - - action: persistent_notification.create - metadata: {} + ![Snapshot](/local/{{ snapshot_filename }})' data: - message: "{{ ai_profile.data if ai_profile is defined and 'data' in ai_profile - else 'Motion detected, but the AI Task integration failed to return a response.' - }} ![Snapshot](/local/{{ snapshot_filename }})" - title: Motion Detected - Front Door - notification_id: "{{ notification_id }}" + notification_id: nest_front_motion + enabled: false + - action: persistent_notification.create + metadata: {} + data: + message: '{{ ai_profile.data if ai_profile is defined and ''data'' in ai_profile + else ''Motion detected, but the AI Task integration failed to return a response.'' + }} ![Snapshot](/local/{{ snapshot_filename }})' + title: Motion Detected - Front Door + notification_id: '{{ notification_id }}' mode: queued max: 10 -- id: "1783628026617" - alias: "Garage Door: Open Notification" - description: "" +- id: '1783628026617' + alias: 'Garage Door: Open Notification' + description: '' triggers: - - trigger: state - entity_id: - - binary_sensor.garage_door_contact - to: - - "on" + - trigger: state + entity_id: + - binary_sensor.garage_door_contact + to: + - 'on' conditions: [] actions: - - action: notify.notify - metadata: {} - data: - message: "Garage Door is Opened " - title: Garage Door + - action: notify.notify + metadata: {} + data: + message: 'Garage Door is Opened ' + title: Garage Door mode: single -- id: "1783628088925" - alias: "Garage Door: Closed Notification" - description: "" +- id: '1783628088925' + alias: 'Garage Door: Closed Notification' + description: '' triggers: - - trigger: state - entity_id: - - binary_sensor.garage_door_contact - to: - - "off" - from: - - "on" + - trigger: state + entity_id: + - binary_sensor.garage_door_contact + to: + - 'off' + from: + - 'on' conditions: [] actions: - - action: notify.notify - metadata: {} - data: - message: Garage Door Closed - title: Garage Door + - action: notify.notify + metadata: {} + data: + message: Garage Door Closed + title: Garage Door mode: single -- id: "1783643893067" +- id: '1783643893067' alias: Blink Shed Camera Motion Triggered description: Triggers local actions when the front Blink camera senses motion triggers: - - entity_id: input_boolean.blink_shed_camera_motion - to: "on" - trigger: state + - entity_id: input_boolean.blink_shed_camera_motion + to: 'on' + trigger: state conditions: [] actions: - - data: - title: Shed Door Alert - message: Motion detected on the Shed Blink camera! - action: notify.persistent_notification + - data: + title: Shed Door Alert + message: Motion detected on the Shed Blink camera! + action: notify.persistent_notification mode: single -- id: "1783647055563" +- id: '1783647055563' alias: Motion Backyard - AI Description description: Takes a snapshot when the Nest camera detects motion, a person, an animal, or a doorbell press, analyzes it with AI, and sends a mobile and persistent notification. triggers: - - trigger: state - entity_id: - - input_boolean.blink_backyard_camera_motion - to: - - "on" - enabled: true - - trigger: event - event_type: state_changed - event_data: - entity_id: event.front_door_front_door_motion - enabled: false - - trigger: state - entity_id: event.living_room_living_room_camera_motion - enabled: false - - trigger: state + - trigger: state + entity_id: + - input_boolean.blink_backyard_camera_motion + to: + - 'on' + enabled: true + - trigger: event + event_type: state_changed + event_data: entity_id: event.front_door_front_door_motion - enabled: false - - trigger: event.received - target: - entity_id: event.entryway_entryway_camera_motion - options: - event_type: - - camera_motion - - camera_person - - camera_sound - enabled: false - - trigger: event.received - target: - device_id: 290f56e5a655e3af82cbf3cf9fd22406 - options: - event_type: - - camera_motion - - camera_person - - camera_sound - - ring - enabled: false - - trigger: event.received - target: - device_id: 679d52e0d16cf48648d11dd024b961f8 - options: - event_type: - - camera_motion - - camera_sound - - camera_person - enabled: false + enabled: false + - trigger: state + entity_id: event.living_room_living_room_camera_motion + enabled: false + - trigger: state + entity_id: event.front_door_front_door_motion + enabled: false + - trigger: event.received + target: + entity_id: event.entryway_entryway_camera_motion + options: + event_type: + - camera_motion + - camera_person + - camera_sound + enabled: false + - trigger: event.received + target: + device_id: 290f56e5a655e3af82cbf3cf9fd22406 + options: + event_type: + - camera_motion + - camera_person + - camera_sound + - ring + enabled: false + - trigger: event.received + target: + device_id: 679d52e0d16cf48648d11dd024b961f8 + options: + event_type: + - camera_motion + - camera_sound + - camera_person + enabled: false conditions: - - condition: template - value_template: "{{ trigger.event.data.new_state.attributes.event_type in ['motion', - 'person', 'animal', 'chime'] }}" - enabled: false + - condition: template + value_template: '{{ trigger.event.data.new_state.attributes.event_type in [''motion'', + ''person'', ''animal'', ''chime''] }}' + enabled: false actions: - - action: blink.trigger_camera - target: - entity_id: camera.blink_backyard - data: {} - enabled: false - - delay: - hours: 0 - minutes: 0 - seconds: 10 - milliseconds: 0 - enabled: false - - action: homeassistant.update_entity - target: - entity_id: camera.blink_backyard - - delay: - hours: 0 - minutes: 0 - seconds: 2 - milliseconds: 0 - - variables: - snapshot_filename: blink_backyard_{{ now().strftime('%Y%m%d_%H%M%S') }}.jpg - - variables: - notification_id: blink_backyard_{{ now().strftime('%Y%m%d_%H%M%S_%f') }} - - action: camera.snapshot - target: - entity_id: camera.blink_backyard - data: - filename: /media/{{ snapshot_filename }} - - action: camera.snapshot - target: - entity_id: camera.blink_backyard - data: - filename: /config/www/{{ snapshot_filename }} - - delay: - hours: 0 - minutes: 0 - seconds: 2 - milliseconds: 0 - - action: ai_task.generate_data - continue_on_error: true - data: - task_name: Blink Backyard Camera Analysis - entity_id: ai_task.google_ai_task - instructions: Describe what you see in this image in brief, but make it a little - humorous. Focus on any people, objects, animals or activities. Text needs - to be max 240 characters. - attachments: - - media_content_id: media-source://media_source/local/{{ snapshot_filename }} - media_content_type: image/jpeg - response_variable: ai_profile - - action: notify.notify - continue_on_error: true - data: - title: Motion Detected - Backyard - message: "{{ ai_profile.data if ai_profile is defined and 'data' in ai_profile - else 'Motion detected, but the AI Task integration failed to return a response.' - }}" - - action: persistent_notification.create - data: - title: Motion Detected - Backyard - message: "{{ ai_profile.data if ai_profile is defined and 'data' in ai_profile - else 'Motion detected, but the AI Task integration failed to return a response.' - }} + - action: blink.trigger_camera + target: + entity_id: camera.blink_backyard + data: {} + enabled: false + - delay: + hours: 0 + minutes: 0 + seconds: 10 + milliseconds: 0 + enabled: false + - action: homeassistant.update_entity + target: + entity_id: camera.blink_backyard + - delay: + hours: 0 + minutes: 0 + seconds: 2 + milliseconds: 0 + - variables: + snapshot_filename: blink_backyard_{{ now().strftime('%Y%m%d_%H%M%S') }}.jpg + - variables: + notification_id: blink_backyard_{{ now().strftime('%Y%m%d_%H%M%S_%f') }} + - action: camera.snapshot + target: + entity_id: camera.blink_backyard + data: + filename: /media/{{ snapshot_filename }} + - action: camera.snapshot + target: + entity_id: camera.blink_backyard + data: + filename: /config/www/{{ snapshot_filename }} + - delay: + hours: 0 + minutes: 0 + seconds: 2 + milliseconds: 0 + - action: ai_task.generate_data + continue_on_error: true + data: + task_name: Blink Backyard Camera Analysis + entity_id: ai_task.google_ai_task + instructions: Describe what you see in this image in brief, but make it a little + humorous. Focus on any people, objects, animals or activities. Text needs + to be max 240 characters. + attachments: + - media_content_id: media-source://media_source/local/{{ snapshot_filename }} + media_content_type: image/jpeg + response_variable: ai_profile + - action: notify.notify + continue_on_error: true + data: + title: Motion Detected - Backyard + message: '{{ ai_profile.data if ai_profile is defined and ''data'' in ai_profile + else ''Motion detected, but the AI Task integration failed to return a response.'' + }}' + - action: persistent_notification.create + data: + title: Motion Detected - Backyard + message: '{{ ai_profile.data if ai_profile is defined and ''data'' in ai_profile + else ''Motion detected, but the AI Task integration failed to return a response.'' + }} - ![Snapshot](/local/{{ snapshot_filename }})" - notification_id: "{{ notification_id }}" + ![Snapshot](/local/{{ snapshot_filename }})' + notification_id: '{{ notification_id }}' mode: queued max: 10 -- id: "1783649304797" +- id: '1783649304797' alias: Motion Inside Shed - AI Description description: Takes a snapshot when the Nest camera detects motion, a person, an animal, or a doorbell press, analyzes it with AI, and sends a mobile and persistent notification. triggers: - - trigger: state - entity_id: - - input_boolean.blink_inside_shed_camera_motion - to: - - "on" - enabled: true - - trigger: event - event_type: state_changed - event_data: - entity_id: event.front_door_front_door_motion - enabled: false - - trigger: state - entity_id: event.living_room_living_room_camera_motion - enabled: false - - trigger: state + - trigger: state + entity_id: + - input_boolean.blink_inside_shed_camera_motion + to: + - 'on' + enabled: true + - trigger: event + event_type: state_changed + event_data: entity_id: event.front_door_front_door_motion - enabled: false - - trigger: event.received - target: - entity_id: event.entryway_entryway_camera_motion - options: - event_type: - - camera_motion - - camera_person - - camera_sound - enabled: false - - trigger: event.received - target: - device_id: 290f56e5a655e3af82cbf3cf9fd22406 - options: - event_type: - - camera_motion - - camera_person - - camera_sound - - ring - enabled: false - - trigger: event.received - target: - device_id: 679d52e0d16cf48648d11dd024b961f8 - options: - event_type: - - camera_motion - - camera_sound - - camera_person - enabled: false + enabled: false + - trigger: state + entity_id: event.living_room_living_room_camera_motion + enabled: false + - trigger: state + entity_id: event.front_door_front_door_motion + enabled: false + - trigger: event.received + target: + entity_id: event.entryway_entryway_camera_motion + options: + event_type: + - camera_motion + - camera_person + - camera_sound + enabled: false + - trigger: event.received + target: + device_id: 290f56e5a655e3af82cbf3cf9fd22406 + options: + event_type: + - camera_motion + - camera_person + - camera_sound + - ring + enabled: false + - trigger: event.received + target: + device_id: 679d52e0d16cf48648d11dd024b961f8 + options: + event_type: + - camera_motion + - camera_sound + - camera_person + enabled: false conditions: - - condition: template - value_template: "{{ trigger.event.data.new_state.attributes.event_type in ['motion', - 'person', 'animal', 'chime'] }}" - enabled: false + - condition: template + value_template: '{{ trigger.event.data.new_state.attributes.event_type in [''motion'', + ''person'', ''animal'', ''chime''] }}' + enabled: false actions: - - action: blink.trigger_camera - target: - entity_id: camera.blink_backyard_tree - data: {} - enabled: false - - delay: - hours: 0 - minutes: 0 - seconds: 10 - milliseconds: 0 - enabled: false - - action: homeassistant.update_entity - target: - entity_id: camera.blink_backyard_tree - - delay: - hours: 0 - minutes: 0 - seconds: 2 - milliseconds: 0 - - variables: - snapshot_filename: blink_Inshed_{{ now().strftime('%Y%m%d_%H%M%S') }}.jpg - - variables: - notification_id: blink_Inshed_{{ now().strftime('%Y%m%d_%H%M%S_%f') }} - - action: camera.snapshot - target: - entity_id: camera.blink_backyard_tree - data: - filename: /media/{{ snapshot_filename }} - - action: camera.snapshot - target: - entity_id: camera.blink_backyard_tree - data: - filename: /config/www/{{ snapshot_filename }} - - delay: - hours: 0 - minutes: 0 - seconds: 2 - milliseconds: 0 - - action: ai_task.generate_data - continue_on_error: true - data: - task_name: Blink InShed Camera Analysis - entity_id: ai_task.google_ai_task - instructions: Describe what you see in this image in brief, but make it a little - humorous. Focus on any people, objects, animals or activities. Text needs - to be max 240 characters. - attachments: - - media_content_id: media-source://media_source/local/{{ snapshot_filename }} - media_content_type: image/jpeg - response_variable: ai_profile - - action: notify.notify - continue_on_error: true - data: - title: Motion Detected - Backyard Inside Shed - message: "{{ ai_profile.data if ai_profile is defined and 'data' in ai_profile - else 'Motion detected, but the AI Task integration failed to return a response.' - }}" - - action: persistent_notification.create - data: - title: Motion Detected - Backyard - message: "{{ ai_profile.data if ai_profile is defined and 'data' in ai_profile - else 'Motion detected, but the AI Task integration failed to return a response.' - }}" - notification_id: "{{ notification_id }}" + - action: blink.trigger_camera + target: + entity_id: camera.blink_backyard_tree + data: {} + enabled: false + - delay: + hours: 0 + minutes: 0 + seconds: 10 + milliseconds: 0 + enabled: false + - action: homeassistant.update_entity + target: + entity_id: camera.blink_backyard_tree + - delay: + hours: 0 + minutes: 0 + seconds: 2 + milliseconds: 0 + - variables: + snapshot_filename: blink_Inshed_{{ now().strftime('%Y%m%d_%H%M%S') }}.jpg + - variables: + notification_id: blink_Inshed_{{ now().strftime('%Y%m%d_%H%M%S_%f') }} + - action: camera.snapshot + target: + entity_id: camera.blink_backyard_tree + data: + filename: /media/{{ snapshot_filename }} + - action: camera.snapshot + target: + entity_id: camera.blink_backyard_tree + data: + filename: /config/www/{{ snapshot_filename }} + - delay: + hours: 0 + minutes: 0 + seconds: 2 + milliseconds: 0 + - action: ai_task.generate_data + continue_on_error: true + data: + task_name: Blink InShed Camera Analysis + entity_id: ai_task.google_ai_task + instructions: Describe what you see in this image in brief, but make it a little + humorous. Focus on any people, objects, animals or activities. Text needs + to be max 240 characters. + attachments: + - media_content_id: media-source://media_source/local/{{ snapshot_filename }} + media_content_type: image/jpeg + response_variable: ai_profile + - action: notify.notify + continue_on_error: true + data: + title: Motion Detected - Backyard Inside Shed + message: '{{ ai_profile.data if ai_profile is defined and ''data'' in ai_profile + else ''Motion detected, but the AI Task integration failed to return a response.'' + }}' + - action: persistent_notification.create + data: + title: Motion Detected - Backyard + message: '{{ ai_profile.data if ai_profile is defined and ''data'' in ai_profile + else ''Motion detected, but the AI Task integration failed to return a response.'' + }}' + notification_id: '{{ notification_id }}' mode: queued max: 10 -- id: "1783736251030" - alias: "Office: Teams Webhook Busy Light" +- id: '1783736251030' + alias: 'Office: Teams Webhook Busy Light' description: Triggers light based on Windows 11 Teams log file status changes triggers: - - webhook_id: office_teams_meeting_status_webhook_secret_99 - allowed_methods: - - POST - local_only: false - trigger: webhook + - webhook_id: office_teams_meeting_status_webhook_secret_99 + allowed_methods: + - POST + local_only: false + trigger: webhook conditions: [] actions: - - choose: - - conditions: - - condition: template - value_template: "{{ trigger.json.status in ['busy', 'do not disturb'] - }}" - sequence: - - target: - entity_id: light.night_light - data: - brightness_pct: 100 - rgb_color: - - 255 - - 0 - - 0 - action: light.turn_on - - conditions: - - condition: template - value_template: "{{ trigger.json.status in ['available', 'offline', 'away'] - }}" - sequence: - - target: - entity_id: light.night_light - data: - brightness_pct: 20 - rgb_color: - - 255 - - 255 - - 255 - action: light.turn_on + - choose: + - conditions: + - condition: template + value_template: '{{ trigger.json.status in [''busy'', ''do not disturb''] + }}' + sequence: + - target: + entity_id: light.night_light + data: + brightness_pct: 100 + rgb_color: + - 255 + - 0 + - 0 + action: light.turn_on + - conditions: + - condition: template + value_template: '{{ trigger.json.status in [''available'', ''offline'', ''away''] + }}' + sequence: + - target: + entity_id: light.night_light + data: + brightness_pct: 20 + rgb_color: + - 255 + - 255 + - 255 + action: light.turn_on mode: single -- id: "1783737753660" - alias: "Office: Manual Meeting Status Busy Light - Working Hours" - description: "Work hours: Toggle controls Red/Green (Motion ignored). After hours - OR Away Mode: Pure motion night light (Toggle ignored)." +- id: '1783737753660' + alias: 'Office: Manual Meeting Status Busy Light - Working Hours' + description: 'Work hours: Toggle controls Red/Green (Motion ignored). After hours + OR Away Mode: Pure motion night light (Toggle ignored).' triggers: - - id: status_changed - entity_id: input_boolean.in_a_meeting - trigger: state - - id: motion_detected - entity_id: binary_sensor.night_light_occupancy - trigger: state - to: "on" - - id: motion_cleared - entity_id: binary_sensor.night_light_occupancy - trigger: state - to: "off" + - id: status_changed + entity_id: input_boolean.in_a_meeting + trigger: state + - id: motion_detected + entity_id: binary_sensor.night_light_occupancy + trigger: state + to: 'on' + - id: motion_cleared + entity_id: binary_sensor.night_light_occupancy + trigger: state + to: 'off' conditions: [] actions: - - choose: - - conditions: - - condition: trigger - id: status_changed - - condition: state - entity_id: input_boolean.in_a_meeting - state: "on" - - condition: state - entity_id: input_boolean.away_mode - state: "off" - - condition: time - after: 08:00:00 - before: "18:00:00" - weekday: - - mon - - tue - - wed - - thu - - fri - sequence: - - target: - entity_id: light.night_light - data: - brightness_pct: 100 - rgb_color: - - 255 - - 0 - - 0 - action: light.turn_on - - conditions: - - condition: trigger - id: status_changed - - condition: state - entity_id: input_boolean.in_a_meeting - state: "off" - - condition: state - entity_id: input_boolean.away_mode - state: "off" - - condition: time - after: 08:00:00 - before: "18:00:00" - weekday: - - mon - - tue - - wed - - thu - - fri - sequence: - - target: - entity_id: light.night_light - data: - brightness_pct: 20 - rgb_color: - - 5 - - 245 - - 45 - action: light.turn_on - - conditions: - - condition: trigger - id: motion_detected - - condition: or - conditions: - - condition: state - entity_id: input_boolean.away_mode - state: "on" - - condition: not - conditions: - - condition: time - after: 08:00:00 - before: "18:00:00" - weekday: - - mon - - tue - - wed - - thu - - fri - sequence: - - target: - entity_id: light.night_light - data: - brightness_pct: 30 - rgb_color: - - 255 - - 255 - - 255 - action: light.turn_on - - conditions: - - condition: trigger - id: motion_cleared - - condition: or - conditions: - - condition: state - entity_id: input_boolean.away_mode - state: "on" - - condition: not - conditions: - - condition: time - after: 08:00:00 - before: "18:00:00" - weekday: - - mon - - tue - - wed - - thu - - fri - sequence: - - target: - entity_id: light.night_light - action: light.turn_off + - choose: + - conditions: + - condition: trigger + id: status_changed + - condition: state + entity_id: input_boolean.in_a_meeting + state: 'on' + - condition: state + entity_id: input_boolean.away_mode + state: 'off' + - condition: time + after: 08:00:00 + before: '18:00:00' + weekday: + - mon + - tue + - wed + - thu + - fri + sequence: + - target: + entity_id: light.night_light + data: + brightness_pct: 100 + rgb_color: + - 255 + - 0 + - 0 + action: light.turn_on + - conditions: + - condition: trigger + id: status_changed + - condition: state + entity_id: input_boolean.in_a_meeting + state: 'off' + - condition: state + entity_id: input_boolean.away_mode + state: 'off' + - condition: time + after: 08:00:00 + before: '18:00:00' + weekday: + - mon + - tue + - wed + - thu + - fri + sequence: + - target: + entity_id: light.night_light + data: + brightness_pct: 20 + rgb_color: + - 5 + - 245 + - 45 + action: light.turn_on + - conditions: + - condition: trigger + id: motion_detected + - condition: or + conditions: + - condition: state + entity_id: input_boolean.away_mode + state: 'on' + - condition: not + conditions: + - condition: time + after: 08:00:00 + before: '18:00:00' + weekday: + - mon + - tue + - wed + - thu + - fri + sequence: + - target: + entity_id: light.night_light + data: + brightness_pct: 30 + rgb_color: + - 255 + - 255 + - 255 + action: light.turn_on + - conditions: + - condition: trigger + id: motion_cleared + - condition: or + conditions: + - condition: state + entity_id: input_boolean.away_mode + state: 'on' + - condition: not + conditions: + - condition: time + after: 08:00:00 + before: '18:00:00' + weekday: + - mon + - tue + - wed + - thu + - fri + sequence: + - target: + entity_id: light.night_light + action: light.turn_off mode: restart -- id: "1783738120074" - alias: "Office: Webhook Toggle Meeting Status" +- id: '1783738120074' + alias: 'Office: Webhook Toggle Meeting Status' description: Toggles the meeting status boolean when the secret webhook URL is opened triggers: - - webhook_id: toggle_my_meeting_status_secret_abc123 - allowed_methods: - - POST - - GET - local_only: false - trigger: webhook + - webhook_id: toggle_my_meeting_status_secret_abc123 + allowed_methods: + - POST + - GET + local_only: false + trigger: webhook conditions: [] actions: - - target: - entity_id: input_boolean.in_a_meeting - action: input_boolean.toggle + - target: + entity_id: input_boolean.in_a_meeting + action: input_boolean.toggle mode: single -- id: "1783806626578" - alias: "Office: TEST Meeting Status Lights" - description: "DEDICATED TESTING: Forces Red/Green colors anytime the switch is toggled. - Disable production automation before using." +- id: '1783806626578' + alias: 'Office: TEST Meeting Status Lights' + description: 'DEDICATED TESTING: Forces Red/Green colors anytime the switch is toggled. + Disable production automation before using.' triggers: - - entity_id: input_boolean.in_a_meeting - trigger: state + - entity_id: input_boolean.in_a_meeting + trigger: state conditions: [] actions: - - choose: - - conditions: - - condition: state - entity_id: input_boolean.in_a_meeting - state: "on" - sequence: - - target: - entity_id: light.night_light - data: - brightness_pct: 100 - rgb_color: - - 255 - - 0 - - 0 - action: light.turn_on - - conditions: - - condition: state - entity_id: input_boolean.in_a_meeting - state: "off" - sequence: - - target: - entity_id: light.night_light - data: - brightness_pct: 20 - rgb_color: - - 5 - - 245 - - 45 - action: light.turn_on + - choose: + - conditions: + - condition: state + entity_id: input_boolean.in_a_meeting + state: 'on' + sequence: + - target: + entity_id: light.night_light + data: + brightness_pct: 100 + rgb_color: + - 255 + - 0 + - 0 + action: light.turn_on + - conditions: + - condition: state + entity_id: input_boolean.in_a_meeting + state: 'off' + sequence: + - target: + entity_id: light.night_light + data: + brightness_pct: 20 + rgb_color: + - 5 + - 245 + - 45 + action: light.turn_on mode: single -- id: "1783824363227" +- id: '1783824363227' alias: Downstairs Bathroom Light Control description: Turn on bathroom switch when occupied, turn off after 30 minutes of no occupancy. triggers: - - entity_id: binary_sensor.downstairs_bathroom_occupancy - to: "on" - id: motion_detected - trigger: state - - entity_id: binary_sensor.downstairs_bathroom_occupancy - to: "off" - for: - hours: 0 - minutes: 30 - seconds: 0 - id: motion_clear - trigger: state + - entity_id: binary_sensor.downstairs_bathroom_occupancy + to: 'on' + id: motion_detected + trigger: state + - entity_id: binary_sensor.downstairs_bathroom_occupancy + to: 'off' + for: + hours: 0 + minutes: 30 + seconds: 0 + id: motion_clear + trigger: state conditions: [] actions: - - choose: - - conditions: - - condition: trigger - id: motion_detected - sequence: - - target: - entity_id: switch.downstairs_bathroom_switch - action: switch.turn_on - - conditions: - - condition: trigger - id: motion_clear - sequence: - - target: - entity_id: switch.downstairs_bathroom_switch - action: switch.turn_off + - choose: + - conditions: + - condition: trigger + id: motion_detected + sequence: + - target: + entity_id: switch.downstairs_bathroom_switch + action: switch.turn_on + - conditions: + - condition: trigger + id: motion_clear + sequence: + - target: + entity_id: switch.downstairs_bathroom_switch + action: switch.turn_off mode: restart -- id: "1783896963375" - alias: "Office: Smart Button Toggles Meeting Status - IKEA BILRESA" +- id: '1783896963375' + alias: 'Office: Smart Button Toggles Meeting Status - IKEA BILRESA' description: Toggles the meeting input boolean when the smart button is pressed triggers: - - trigger: event - event_type: state_changed - event_data: - entity_id: event.office_button_button_1 + - trigger: event + event_type: state_changed + event_data: + entity_id: event.office_button_button_1 conditions: [] actions: - - target: - entity_id: input_boolean.in_a_meeting - action: input_boolean.toggle + - target: + entity_id: input_boolean.in_a_meeting + action: input_boolean.toggle mode: single -- id: "1783901121760" +- id: '1783901121760' alias: Ikea BILRESA scroll wheel - Bedroom Switch - description: "" + description: '' use_blueprint: path: BoGu5/kea BILRESA scroll wheel (sensors for scroll, events for press).yaml input: remote: c7289314a586fc3739316abfeee0cdf5 click_action_ch1: - - action: light.toggle - metadata: {} - target: - entity_id: light.bedroom_lights - data: {} + - action: light.toggle + metadata: {} + target: + entity_id: light.bedroom_lights + data: {} scroll_wheel_target_ch1: - - light.bedroom_lights - scroll_wheel_mode_ch1: "lights: color temp only" -- id: "1783904189553" + - light.bedroom_lights + scroll_wheel_mode_ch1: 'lights: color temp only' +- id: '1783904189553' alias: IKEA Bilresa Scrollwheel - Bedroom Light Control V1 - Atomic - description: "" + description: '' use_blueprint: path: stone13/ikea_bilresa_atomic_v1.yaml input: @@ -1909,34 +1908,34 @@ event_taste_3: event.bedroom_switch_button_9 scroll_logic_4_5: brightness scroll_logic_7_8: brightness -- id: "1783905541495" +- id: '1783905541495' alias: Ikea Bilresa Switch Bedroom Light Control - description: "" + description: '' use_blueprint: path: jhol-byte/Ikea_bilresa_scroll_wheel.yaml input: remote: c7289314a586fc3739316abfeee0cdf5 click_action_ch1: - - action: light.toggle - metadata: {} - target: - entity_id: light.bedroom_lights - data: {} + - action: light.toggle + metadata: {} + target: + entity_id: light.bedroom_lights + data: {} scroll_wheel_target_ch1: - - light.bedroom_lights -- id: "1783906561328" + - light.bedroom_lights +- id: '1783906561328' alias: IKEA BILRESA - Light Controller for PLAYROOM TEST2 - description: "" + description: '' use_blueprint: path: SvKRO/ha-blueprint-ikea-bilresa-scrollwheel_en.yaml input: remote_device: 353fb9eb9f1b2a138e468b02fb9fbf06 input_click_1: - - action: light.toggle - metadata: {} - target: - device_id: 2f8c5ab2ca0d4be31919fba6df365813 - data: {} + - action: light.toggle + metadata: {} + target: + device_id: 2f8c5ab2ca0d4be31919fba6df365813 + data: {} input_light_1: device_id: 2f8c5ab2ca0d4be31919fba6df365813 input_mode_1: brightness @@ -1951,73 +1950,73 @@ entity_id: light.bedroom_lights input_sens_3: 10 input_transition_2: 0 -- id: "1783909375854" - alias: "Office: Playroom Light Toggle - IKEA BILRESA" +- id: '1783909375854' + alias: 'Office: Playroom Light Toggle - IKEA BILRESA' description: Toggles the meeting input boolean when the smart button is pressed triggers: - - trigger: event - event_type: state_changed - event_data: - entity_id: event.office_button_button_2 + - trigger: event + event_type: state_changed + event_data: + entity_id: event.office_button_button_2 conditions: [] actions: - - action: light.toggle - metadata: {} - target: - device_id: 2f8c5ab2ca0d4be31919fba6df365813 - data: {} + - action: light.toggle + metadata: {} + target: + device_id: 2f8c5ab2ca0d4be31919fba6df365813 + data: {} mode: single -- id: "1783960650360" - alias: "Bedroom: Ikea Bilresa Scrollwheel - Light Control" - description: "" +- id: '1783960650360' + alias: 'Bedroom: Ikea Bilresa Scrollwheel - Light Control' + description: '' use_blueprint: path: jhol-byte/Ikea_bilresa_scroll_wheel.yaml input: remote: c7289314a586fc3739316abfeee0cdf5 click_action_ch1: - - action: light.toggle - metadata: {} - target: - entity_id: light.bedroom_lights - data: {} + - action: light.toggle + metadata: {} + target: + entity_id: light.bedroom_lights + data: {} scroll_wheel_target_ch1: - - light.bedroom_lights + - light.bedroom_lights scroll_wheel_mode_ext_ch1: instant long_click_action_ch1: - - action: light.turn_on - metadata: {} - target: - entity_id: light.bedroom_lights - data: - brightness_pct: 80 + - action: light.turn_on + metadata: {} + target: + entity_id: light.bedroom_lights + data: + brightness_pct: 80 double_click_action_ch1: - - action: light.toggle - metadata: {} - target: - entity_id: light.bedroom_lights - data: - brightness_pct: 25 + - action: light.toggle + metadata: {} + target: + entity_id: light.bedroom_lights + data: + brightness_pct: 25 dim_turns_lights_on: true click_action_ch2: - - action: light.toggle - metadata: {} - target: - entity_id: light.bedroom_lights - data: {} + - action: light.toggle + metadata: {} + target: + entity_id: light.bedroom_lights + data: {} scroll_wheel_target_ch2: - - light.bedroom_lights + - light.bedroom_lights scroll_wheel_mode_ext_ch2: instant click_action_ch3: - - action: light.toggle - metadata: {} - target: - entity_id: light.bedroom_lights - data: {} + - action: light.toggle + metadata: {} + target: + entity_id: light.bedroom_lights + data: {} scroll_wheel_target_ch3: - - light.bedroom_lights + - light.bedroom_lights scroll_wheel_mode_ext_ch3: instant -- id: "1783962246983" - alias: "OFFICE: IKEA BILRESA E2489 Dual Button (Matter) - In Meeting and Away Mode" +- id: '1783962246983' + alias: 'OFFICE: IKEA BILRESA E2489 Dual Button (Matter) - In Meeting and Away Mode' description: Ikea BILRESA E2489 Dual Button controls in Meeting toggle, and enable Away Mode use_blueprint: @@ -2027,942 +2026,941 @@ button1_event: event.office_button_button_1 button2_event: event.office_button_button_2 button1_single: - - action: input_boolean.toggle - metadata: {} - target: - entity_id: input_boolean.in_a_meeting - data: {} + - action: input_boolean.toggle + metadata: {} + target: + entity_id: input_boolean.in_a_meeting + data: {} button2_single: - - action: input_boolean.toggle - metadata: {} + - action: input_boolean.toggle + metadata: {} + target: + entity_id: light.office_lamp_2 + data: {} + button2_double: + - choose: + - conditions: + - condition: template + value_template: '{{ states(''input_text.office_lamp_previous_color'') + == '''' }}' + sequence: + - action: light.turn_on + target: + entity_id: light.office_lamp_2 + - action: input_text.set_value + target: + entity_id: input_text.office_lamp_previous_color + data: + value: '{{ state_attr(''light.office_lamp_2'', ''rgb_color'') | join('','') + }}' + - action: light.turn_on + target: + entity_id: light.office_lamp_2 + data: + rgb_color: + - 135 + - 206 + - 250 + default: + - action: light.turn_on target: entity_id: light.office_lamp_2 - data: {} - button2_double: - - choose: - - conditions: - - condition: template - value_template: "{{ states('input_text.office_lamp_previous_color') - == '' }}" - sequence: - - action: light.turn_on - target: - entity_id: light.office_lamp_2 - - action: input_text.set_value - target: - entity_id: input_text.office_lamp_previous_color - data: - value: "{{ state_attr('light.office_lamp_2', 'rgb_color') | join(',') - }}" - - action: light.turn_on - target: - entity_id: light.office_lamp_2 - data: - rgb_color: - - 135 - - 206 - - 250 - default: - - action: light.turn_on - target: - entity_id: light.office_lamp_2 - data: - rgb_color: "{{ states('input_text.office_lamp_previous_color').split(',') - | map('int') | list }}" - - action: input_text.set_value - target: - entity_id: input_text.office_lamp_previous_color - data: - value: "" + data: + rgb_color: '{{ states(''input_text.office_lamp_previous_color'').split('','') + | map(''int'') | list }}' + - action: input_text.set_value + target: + entity_id: input_text.office_lamp_previous_color + data: + value: '' button1_long_press: [] button2_long_press: [] -- id: "1783972932942" - alias: "Notification: Office Meeting Status" +- id: '1783972932942' + alias: 'Notification: Office Meeting Status' description: Sends a notification when entering or leaving a meeting triggers: - - entity_id: input_boolean.in_a_meeting - to: "on" - id: meeting_started - trigger: state - - entity_id: input_boolean.in_a_meeting - to: "off" - id: meeting_ended - trigger: state + - entity_id: input_boolean.in_a_meeting + to: 'on' + id: meeting_started + trigger: state + - entity_id: input_boolean.in_a_meeting + to: 'off' + id: meeting_ended + trigger: state conditions: [] actions: - - choose: - - alias: Meeting Started Notification - conditions: - - condition: trigger - id: meeting_started - sequence: - - action: notify.notify - data: - title: Meeting Active - message: "Your status is now set to: \U0001F534 DO NOT ENTER" - - alias: Meeting Ended Notification - conditions: - - condition: trigger - id: meeting_ended - sequence: - - action: notify.notify - data: - title: Meeting Ended - message: "Your status is now set to: \U0001F7E2 AVAILABLE" -- id: "1784037118280" - alias: "Blink Safeguard: Auto Reset Stuck Toggles" + - choose: + - alias: Meeting Started Notification + conditions: + - condition: trigger + id: meeting_started + sequence: + - action: notify.notify + data: + title: Meeting Active + message: "Your status is now set to: \U0001F534 DO NOT ENTER" + - alias: Meeting Ended Notification + conditions: + - condition: trigger + id: meeting_ended + sequence: + - action: notify.notify + data: + title: Meeting Ended + message: "Your status is now set to: \U0001F7E2 AVAILABLE" +- id: '1784037118280' + alias: 'Blink Safeguard: Auto Reset Stuck Toggles' description: Forces stuck Blink helper toggles to turn off after 2 minutes and logs the event triggers: - - trigger: state - entity_id: - - input_boolean.blink_backyard_camera_motion - - input_boolean.blink_front_camera_motion - - input_boolean.blink_inside_shed_camera_motion - - input_boolean.blink_shed_camera_motion - to: "on" - for: - minutes: 2 + - trigger: state + entity_id: + - input_boolean.blink_backyard_camera_motion + - input_boolean.blink_front_camera_motion + - input_boolean.blink_inside_shed_camera_motion + - input_boolean.blink_shed_camera_motion + to: 'on' + for: + minutes: 2 conditions: [] actions: - - action: logbook.log - data: - name: Blink Safeguard - message: Alexa failed to clear motion. Forcing auto-reset. - entity_id: "{{ trigger.entity_id }}" - - action: input_boolean.turn_off - target: - entity_id: "{{ trigger.entity_id }}" + - action: logbook.log + data: + name: Blink Safeguard + message: Alexa failed to clear motion. Forcing auto-reset. + entity_id: '{{ trigger.entity_id }}' + - action: input_boolean.turn_off + target: + entity_id: '{{ trigger.entity_id }}' mode: parallel -- id: "1784070582456" - alias: "Office: Lamp and lights control with IKEA Scroll Wheel" - description: "" +- id: '1784070582456' + alias: 'Office: Lamp and lights control with IKEA Scroll Wheel' + description: '' use_blueprint: path: jhol-byte/Ikea_bilresa_scroll_wheel.yaml input: remote: c9c7e25e54eb6ac497a6791fe9cf70fe click_action_ch1: - - action: light.toggle - metadata: {} - target: - device_id: 2f8c5ab2ca0d4be31919fba6df365813 - data: {} + - action: light.toggle + metadata: {} + target: + device_id: 2f8c5ab2ca0d4be31919fba6df365813 + data: {} scroll_wheel_target_ch1: - - light.playroom_light + - light.playroom_light scroll_wheel_mode_ext_ch1: instant long_click_action_ch1: - - action: light.turn_on - metadata: {} - target: - entity_id: light.playroom_light - data: - brightness_step_pct: 30 + - action: light.turn_on + metadata: {} + target: + entity_id: light.playroom_light + data: + brightness_step_pct: 30 double_click_action_ch1: [] click_action_ch2: - - action: light.toggle - metadata: {} - target: - entity_id: light.office_lamp_2 - data: - color_temp_kelvin: 5564 + - action: light.toggle + metadata: {} + target: + entity_id: light.office_lamp_2 + data: + color_temp_kelvin: 5564 scroll_wheel_target_ch2: - - light.office_lamp_2 + - light.office_lamp_2 scroll_wheel_mode_ext_ch2: instant double_click_action_ch2: [] - scroll_wheel_mode_ch2: "lights: dim" + scroll_wheel_mode_ch2: 'lights: dim' on_hold_action_ch2: - - action: light.turn_on - metadata: {} - target: - entity_id: light.office_lamp_2 - data: - color_temp_kelvin: 5765 + - action: light.turn_on + metadata: {} + target: + entity_id: light.office_lamp_2 + data: + color_temp_kelvin: 5765 triple_click_action_ch2: - - action: light.turn_on - metadata: {} - target: - entity_id: light.office_lamp_2 - data: - color_temp_kelvin: 2348 + - action: light.turn_on + metadata: {} + target: + entity_id: light.office_lamp_2 + data: + color_temp_kelvin: 2348 click_action_ch3: - - action: light.toggle - metadata: {} - target: - entity_id: light.bedroom_lamp_2 - data: {} + - action: light.toggle + metadata: {} + target: + entity_id: light.bedroom_lamp_2 + data: {} scroll_wheel_target_ch3: - - light.bedroom_lamp_2 + - light.bedroom_lamp_2 scroll_wheel_mode_ext_ch3: instant on_hold_action_ch1: - - action: light.turn_on - metadata: {} - target: - entity_id: light.playroom_light - data: - brightness_pct: 30 + - action: light.turn_on + metadata: {} + target: + entity_id: light.playroom_light + data: + brightness_pct: 30 dim_turns_lights_on: true -- id: "1784073759556" - alias: "Office: Desk Lamp Meeting Alert" +- id: '1784073759556' + alias: 'Office: Desk Lamp Meeting Alert' description: Flashes the desk lamp red when meeting starts, green when it ends, then returns to original state. triggers: - - trigger: state - entity_id: input_boolean.in_a_meeting - to: "on" - id: meeting_on - - trigger: state - entity_id: input_boolean.in_a_meeting - to: "off" - id: meeting_off + - trigger: state + entity_id: input_boolean.in_a_meeting + to: 'on' + id: meeting_on + - trigger: state + entity_id: input_boolean.in_a_meeting + to: 'off' + id: meeting_off conditions: - - condition: state - entity_id: input_boolean.meeting_lamp_override - state: "off" - - condition: state - entity_id: input_boolean.away_mode - state: "off" + - condition: state + entity_id: input_boolean.meeting_lamp_override + state: 'off' + - condition: state + entity_id: input_boolean.away_mode + state: 'off' actions: - - choose: - - conditions: - - condition: trigger - id: meeting_on - sequence: - - action: scene.create - data: - scene_id: desk_lamp_before_alert - snapshot_entities: - - light.office_lamp_2 - - action: light.turn_on - target: - entity_id: light.office_lamp_2 - data: - brightness_pct: 100 - hs_color: - - 0 - - 100 - transition: 0.5 - - delay: - seconds: 1.5 - - action: scene.turn_on - target: - entity_id: scene.desk_lamp_before_alert - data: - transition: 1 - - conditions: - - condition: trigger - id: meeting_off - sequence: - - action: scene.create - data: - scene_id: desk_lamp_before_alert - snapshot_entities: - - light.office_lamp_2 - - action: light.turn_on - target: - entity_id: light.office_lamp_2 - data: - brightness_pct: 100 - hs_color: - - 120 - - 100 - transition: 0.5 - - delay: - seconds: 1.5 - - action: scene.turn_on - target: - entity_id: scene.desk_lamp_before_alert - data: - transition: 1 - default: [] + - choose: + - conditions: + - condition: trigger + id: meeting_on + sequence: + - action: scene.create + data: + scene_id: desk_lamp_before_alert + snapshot_entities: + - light.office_lamp_2 + - action: light.turn_on + target: + entity_id: light.office_lamp_2 + data: + brightness_pct: 100 + hs_color: + - 0 + - 100 + transition: 0.5 + - delay: + seconds: 1.5 + - action: scene.turn_on + target: + entity_id: scene.desk_lamp_before_alert + data: + transition: 1 + - conditions: + - condition: trigger + id: meeting_off + sequence: + - action: scene.create + data: + scene_id: desk_lamp_before_alert + snapshot_entities: + - light.office_lamp_2 + - action: light.turn_on + target: + entity_id: light.office_lamp_2 + data: + brightness_pct: 100 + hs_color: + - 120 + - 100 + transition: 0.5 + - delay: + seconds: 1.5 + - action: scene.turn_on + target: + entity_id: scene.desk_lamp_before_alert + data: + transition: 1 + default: [] mode: queued max: 2 -- id: "1784153893584" - alias: "Office: Manual Meeting Status Busy Light (Night Light) - Working Hours + - Motion Detection - v2" - description: "Work hours: Automatically turns Green or Red at 8 AM depending on +- id: '1784153893584' + alias: 'Office: Manual Meeting Status Busy Light (Night Light) - Working Hours + + Motion Detection - v2' + description: 'Work hours: Automatically turns Green or Red at 8 AM depending on status. Toggle controls Red/Green. At 6 PM, light clears and switches to motion detection. After hours OR Away Mode: Pure motion night light. Instant transition - when Away changes. Only triggers motion if dark." + when Away changes. Only triggers motion if dark.' triggers: - - id: status_changed - entity_id: input_boolean.in_a_meeting - trigger: state - - id: away_changed - entity_id: input_boolean.away_mode - trigger: state - - id: motion_detected - entity_id: binary_sensor.night_light_occupancy - trigger: state - to: "on" - - id: motion_cleared - entity_id: binary_sensor.night_light_occupancy - trigger: state - to: "off" - - id: work_day_started - trigger: time - at: 08:00:00 - - id: work_day_ended - trigger: time - at: "18:00:00" - - trigger: homeassistant - event: start - id: ha_started + - id: status_changed + entity_id: input_boolean.in_a_meeting + trigger: state + - id: away_changed + entity_id: input_boolean.away_mode + trigger: state + - id: motion_detected + entity_id: binary_sensor.night_light_occupancy + trigger: state + to: 'on' + - id: motion_cleared + entity_id: binary_sensor.night_light_occupancy + trigger: state + to: 'off' + - id: work_day_started + trigger: time + at: 08:00:00 + - id: work_day_ended + trigger: time + at: '18:00:00' + - trigger: homeassistant + event: start + id: ha_started conditions: [] actions: - - variables: - is_work_hours: "{{ 8 <= now().hour < 18 and now().isoweekday() in [1,2,3,4,5] - }}" - is_away: "{{ is_state('input_boolean.away_mode', 'on') }}" - is_dark: "{{ states('sensor.night_light_illuminance') | float(0) < 15 }}" - - choose: - - alias: "--- HA RESTART: SET INITIAL LIGHT STATE ---" + - variables: + is_work_hours: '{{ 8 <= now().hour < 18 and now().isoweekday() in [1,2,3,4,5] + }}' + is_away: '{{ is_state(''input_boolean.away_mode'', ''on'') }}' + is_dark: '{{ states(''sensor.night_light_illuminance'') | float(0) < 15 }}' + - choose: + - alias: '--- HA RESTART: SET INITIAL LIGHT STATE ---' + conditions: + - condition: template + value_template: '{{ trigger.id == ''ha_started'' }}' + sequence: + - choose: + - alias: 'Work hours, not away, in meeting: Red' conditions: - - condition: template - value_template: "{{ trigger.id == 'ha_started' }}" + - condition: template + value_template: '{{ is_work_hours and not is_away and is_state(''input_boolean.in_a_meeting'', + ''on'') }}' sequence: - - choose: - - alias: "Work hours, not away, in meeting: Red" - conditions: - - condition: template - value_template: "{{ is_work_hours and not is_away and is_state('input_boolean.in_a_meeting', - 'on') }}" - sequence: - - action: light.turn_on - target: - entity_id: light.night_light - data: - brightness_pct: 100 - rgb_color: - - 255 - - 0 - - 0 - - alias: "Work hours, not away, not in meeting: Green" - conditions: - - condition: template - value_template: "{{ is_work_hours and not is_away and is_state('input_boolean.in_a_meeting', - 'off') }}" - sequence: - - action: light.turn_on - target: - entity_id: light.night_light - data: - brightness_pct: 30 - rgb_color: - - 5 - - 245 - - 45 - - alias: "After hours or away, motion on and dark: Warm light" - conditions: - - condition: template - value_template: - "{{ (not is_work_hours or is_away) and is_dark and is_state('binary_sensor.night_light_occupancy', - 'on') }}" - sequence: - - action: light.turn_on - target: - entity_id: light.night_light - data: - brightness_pct: 40 - color_temp_kelvin: 2700 - - alias: "After hours or away, no motion or not dark: Light off" - conditions: - - condition: template - value_template: "{{ not is_work_hours or is_away }}" - sequence: - - action: light.turn_off - target: - entity_id: light.night_light - - alias: "--- WORKING HOURS MODE ---" + - action: light.turn_on + target: + entity_id: light.night_light + data: + brightness_pct: 100 + rgb_color: + - 255 + - 0 + - 0 + - alias: 'Work hours, not away, not in meeting: Green' conditions: - - condition: template - value_template: "{{ is_work_hours and not is_away and (trigger.id in ['status_changed', - 'work_day_started'] or (trigger.id == 'away_changed' and not is_away)) - }}" + - condition: template + value_template: '{{ is_work_hours and not is_away and is_state(''input_boolean.in_a_meeting'', + ''off'') }}' sequence: - - choose: - - alias: "Meeting is active: Set light to solid Red (100%)" - conditions: - - condition: state - entity_id: input_boolean.in_a_meeting - state: "on" - sequence: - - action: light.turn_on - target: - entity_id: light.night_light - data: - brightness_pct: 100 - rgb_color: - - 255 - - 0 - - 0 - - alias: "Meeting is inactive: Set light to solid Green (20%)" - conditions: - - condition: state - entity_id: input_boolean.in_a_meeting - state: "off" - sequence: - - action: light.turn_on - target: - entity_id: light.night_light - data: - brightness_pct: 30 - rgb_color: - - 5 - - 245 - - 45 - - alias: "--- WORK DAY ENDED: CLEAR LIGHT ---" + - action: light.turn_on + target: + entity_id: light.night_light + data: + brightness_pct: 30 + rgb_color: + - 5 + - 245 + - 45 + - alias: 'After hours or away, motion on and dark: Warm light' conditions: - - condition: template - value_template: "{{ trigger.id == 'work_day_ended' }}" + - condition: template + value_template: '{{ (not is_work_hours or is_away) and is_dark and is_state(''binary_sensor.night_light_occupancy'', + ''on'') }}' sequence: - - action: light.turn_off - target: - entity_id: light.night_light - - alias: "--- AFTER HOURS / AWAY: MOTION DETECTED ---" + - action: light.turn_on + target: + entity_id: light.night_light + data: + brightness_pct: 40 + color_temp_kelvin: 2700 + - alias: 'After hours or away, no motion or not dark: Light off' conditions: - - condition: template - value_template: "{{ is_dark and (not is_work_hours or is_away) and trigger.id - == 'motion_detected' }}" + - condition: template + value_template: '{{ not is_work_hours or is_away }}' sequence: - - action: light.turn_on - target: - entity_id: light.night_light - data: - brightness_pct: 40 - color_temp_kelvin: 2700 - - alias: "--- AFTER HOURS / AWAY: MOTION CLEARED ---" + - action: light.turn_off + target: + entity_id: light.night_light + - alias: '--- WORKING HOURS MODE ---' + conditions: + - condition: template + value_template: '{{ is_work_hours and not is_away and (trigger.id in [''status_changed'', + ''work_day_started''] or (trigger.id == ''away_changed'' and not is_away)) + }}' + sequence: + - choose: + - alias: 'Meeting is active: Set light to solid Red (100%)' conditions: - - condition: template - value_template: "{{ (not is_work_hours or is_away) and trigger.id == 'motion_cleared' - }}" + - condition: state + entity_id: input_boolean.in_a_meeting + state: 'on' sequence: - - delay: 00:00:05 - - action: light.turn_off - target: - entity_id: light.night_light - - alias: "--- INSTANT AWAY TRANSITION ---" + - action: light.turn_on + target: + entity_id: light.night_light + data: + brightness_pct: 100 + rgb_color: + - 255 + - 0 + - 0 + - alias: 'Meeting is inactive: Set light to solid Green (20%)' conditions: - - condition: template - value_template: "{{ trigger.id == 'away_changed' and is_away }}" + - condition: state + entity_id: input_boolean.in_a_meeting + state: 'off' sequence: - - action: light.turn_off - target: - entity_id: light.night_light - - alias: "--- FALLBACK: MEETING ENDS AFTER HOURS ---" - conditions: - - condition: template - value_template: "{{ not is_work_hours and trigger.id == 'status_changed' - and is_state('input_boolean.in_a_meeting', 'off') }}" - sequence: - - action: light.turn_off - target: - entity_id: light.night_light + - action: light.turn_on + target: + entity_id: light.night_light + data: + brightness_pct: 30 + rgb_color: + - 5 + - 245 + - 45 + - alias: '--- WORK DAY ENDED: CLEAR LIGHT ---' + conditions: + - condition: template + value_template: '{{ trigger.id == ''work_day_ended'' }}' + sequence: + - action: light.turn_off + target: + entity_id: light.night_light + - alias: '--- AFTER HOURS / AWAY: MOTION DETECTED ---' + conditions: + - condition: template + value_template: '{{ is_dark and (not is_work_hours or is_away) and trigger.id + == ''motion_detected'' }}' + sequence: + - action: light.turn_on + target: + entity_id: light.night_light + data: + brightness_pct: 40 + color_temp_kelvin: 2700 + - alias: '--- AFTER HOURS / AWAY: MOTION CLEARED ---' + conditions: + - condition: template + value_template: '{{ (not is_work_hours or is_away) and trigger.id == ''motion_cleared'' + }}' + sequence: + - delay: 00:00:05 + - action: light.turn_off + target: + entity_id: light.night_light + - alias: '--- INSTANT AWAY TRANSITION ---' + conditions: + - condition: template + value_template: '{{ trigger.id == ''away_changed'' and is_away }}' + sequence: + - action: light.turn_off + target: + entity_id: light.night_light + - alias: '--- FALLBACK: MEETING ENDS AFTER HOURS ---' + conditions: + - condition: template + value_template: '{{ not is_work_hours and trigger.id == ''status_changed'' + and is_state(''input_boolean.in_a_meeting'', ''off'') }}' + sequence: + - action: light.turn_off + target: + entity_id: light.night_light mode: restart -- id: "1784246257858" +- id: '1784246257858' alias: Sync Alexa Volume Slider description: Syncs the Alexa Master Volume slider with the currently selected speaker. triggers: - - entity_id: input_number.alexa_master_volume - id: slider_changed - trigger: state - - entity_id: input_select.alexa_target_device - id: speaker_changed - trigger: state + - entity_id: input_number.alexa_master_volume + id: slider_changed + trigger: state + - entity_id: input_select.alexa_target_device + id: speaker_changed + trigger: state conditions: [] actions: - - choose: - - conditions: - - condition: trigger - id: slider_changed - sequence: - - action: media_player.volume_set - target: - entity_id: "{{ states('input_select.alexa_target_device') }}" - data: - volume_level: "{{ states('input_number.alexa_master_volume') | float / - 100 }}" - - conditions: - - condition: trigger - id: speaker_changed - sequence: - - action: input_number.set_value - target: - entity_id: input_number.alexa_master_volume - data: - value: "{% set target = states('input_select.alexa_target_device') %} {% - if state_attr(target, 'volume_level') != none %}\n {{ (state_attr(target, - 'volume_level') | float * 100) | round(0) }}\n{% else %}\n 20\n{% endif - %}" + - choose: + - conditions: + - condition: trigger + id: slider_changed + sequence: + - action: media_player.volume_set + target: + entity_id: '{{ states(''input_select.alexa_target_device'') }}' + data: + volume_level: '{{ states(''input_number.alexa_master_volume'') | float / + 100 }}' + - conditions: + - condition: trigger + id: speaker_changed + sequence: + - action: input_number.set_value + target: + entity_id: input_number.alexa_master_volume + data: + value: "{% set target = states('input_select.alexa_target_device') %} {% + if state_attr(target, 'volume_level') != none %}\n {{ (state_attr(target, + 'volume_level') | float * 100) | round(0) }}\n{% else %}\n 20\n{% endif + %}" mode: restart - id: ai_agent_auto_1784596277269 alias: Blink All Camera Motion AI Notification Version 3 description: Sends a notification when motion is detected by any Blink camera, capturing a snapshot and analyzing it with AI for the description. triggers: - - entity_id: binary_sensor.blink_backyard_shed_motion - id: shed - to: "on" - trigger: state - - entity_id: binary_sensor.blink_backyard_tree_motion - id: tree - to: "on" - trigger: state - - entity_id: binary_sensor.blink_front_motion - id: front - to: "on" - trigger: state - - trigger: state - entity_id: binary_sensor.blink_garage_side_motion - to: "on" - id: garage + - entity_id: binary_sensor.blink_backyard_shed_motion + id: shed + to: 'on' + trigger: state + - entity_id: binary_sensor.blink_backyard_tree_motion + id: tree + to: 'on' + trigger: state + - entity_id: binary_sensor.blink_front_motion + id: front + to: 'on' + trigger: state + - trigger: state + entity_id: binary_sensor.blink_garage_side_motion + to: 'on' + id: garage actions: - - action: shell_command.cleanup_blink_snapshots - - choose: - - conditions: - - condition: trigger - id: shed - sequence: - - action: switch.turn_on - target: - entity_id: switch.backyard_shed_refresh_snapshot - - delay: - seconds: 20 - - action: homeassistant.update_entity - target: - entity_id: camera.blink_backyard_shed - - delay: - seconds: 3 - - variables: - snapshot_filename: blink_shed_{{ now().strftime('%Y%m%d_%H%M%S') }}.jpg - - variables: - notification_id: blink_backyard_{{ now().strftime('%Y%m%d_%H%M%S_%f') }} - - variables: - title: Motion Detected - Backyard Shed - - action: camera.snapshot - target: - entity_id: camera.blink_backyard_shed - data: - filename: /media/{{ snapshot_filename }} - - action: camera.snapshot - target: - entity_id: camera.blink_backyard_shed - data: - filename: /config/www/{{ snapshot_filename }} - - conditions: - - condition: trigger - id: tree - sequence: - - action: switch.turn_on - target: - entity_id: switch.backyard_tree_refresh_snapshot - - delay: - seconds: 20 - - action: homeassistant.update_entity - target: - entity_id: camera.blink_backyard_tree - - delay: - seconds: 3 - - variables: - snapshot_filename: blink_tree_{{ now().strftime('%Y%m%d_%H%M%S') }}.jpg - - variables: - notification_id: blink_backyard_{{ now().strftime('%Y%m%d_%H%M%S_%f') }} - - variables: - title: Motion Detected - Backyard Tree - - action: camera.snapshot - target: - entity_id: camera.blink_backyard_tree - data: - filename: /media/{{ snapshot_filename }} - - action: camera.snapshot - target: - entity_id: camera.blink_backyard_tree - data: - filename: /config/www/{{ snapshot_filename }} - - conditions: - - condition: trigger - id: front - sequence: - - action: switch.turn_on - target: - entity_id: switch.front_refresh_snapshot - - delay: - seconds: 20 - - action: homeassistant.update_entity - target: - entity_id: camera.front - - delay: - seconds: 3 - - variables: - snapshot_filename: blink_Front_{{ now().strftime('%Y%m%d_%H%M%S') }}.jpg - - variables: - notification_id: blink_front_{{ now().strftime('%Y%m%d_%H%M%S_%f') }} - - variables: - title: Motion Detected - Front Door - - action: camera.snapshot - target: - entity_id: camera.blink_front - data: - filename: /media/{{ snapshot_filename }} - - action: camera.snapshot - target: - entity_id: camera.blink_front - data: - filename: /config/www/{{ snapshot_filename }} - - conditions: - - condition: trigger - id: garage - sequence: - - action: switch.turn_on - target: - entity_id: switch.garage_side_refresh_snapshot - - delay: - seconds: 20 - - action: homeassistant.update_entity - target: - entity_id: camera.garage_side - - delay: - seconds: 3 - - variables: - snapshot_filename: blink_garage_{{ now().strftime('%Y%m%d_%H%M%S') }}.jpg - - variables: - notification_id: blink_garage_{{ now().strftime('%Y%m%d_%H%M%S_%f') }} - - variables: - title: Motion Detected - Garage Side - - action: camera.snapshot - target: - entity_id: camera.blink_garage_side - data: - filename: /media/{{ snapshot_filename }} - - action: camera.snapshot - target: - entity_id: camera.blink_garage_side - data: - filename: /config/www/{{ snapshot_filename }} - default: - - delay: - seconds: 2 + - action: shell_command.cleanup_blink_snapshots + - choose: + - conditions: + - condition: trigger + id: shed + sequence: + - action: switch.turn_on + target: + entity_id: switch.backyard_shed_refresh_snapshot + - delay: + seconds: 20 + - action: homeassistant.update_entity + target: + entity_id: camera.blink_backyard_shed + - delay: + seconds: 3 + - variables: + snapshot_filename: blink_shed_{{ now().strftime('%Y%m%d_%H%M%S') }}.jpg + - variables: + notification_id: blink_backyard_{{ now().strftime('%Y%m%d_%H%M%S_%f') }} + - variables: + title: Motion Detected - Backyard Shed + - action: camera.snapshot + target: + entity_id: camera.blink_backyard_shed + data: + filename: /media/{{ snapshot_filename }} + - action: camera.snapshot + target: + entity_id: camera.blink_backyard_shed + data: + filename: /config/www/{{ snapshot_filename }} + - conditions: + - condition: trigger + id: tree + sequence: + - action: switch.turn_on + target: + entity_id: switch.backyard_tree_refresh_snapshot + - delay: + seconds: 20 + - action: homeassistant.update_entity + target: + entity_id: camera.blink_backyard_tree + - delay: + seconds: 3 + - variables: + snapshot_filename: blink_tree_{{ now().strftime('%Y%m%d_%H%M%S') }}.jpg + - variables: + notification_id: blink_backyard_{{ now().strftime('%Y%m%d_%H%M%S_%f') }} + - variables: + title: Motion Detected - Backyard Tree + - action: camera.snapshot + target: + entity_id: camera.blink_backyard_tree + data: + filename: /media/{{ snapshot_filename }} + - action: camera.snapshot + target: + entity_id: camera.blink_backyard_tree + data: + filename: /config/www/{{ snapshot_filename }} + - conditions: + - condition: trigger + id: front + sequence: + - action: switch.turn_on + target: + entity_id: switch.front_refresh_snapshot + - delay: + seconds: 20 + - action: homeassistant.update_entity + target: + entity_id: camera.front + - delay: + seconds: 3 + - variables: + snapshot_filename: blink_Front_{{ now().strftime('%Y%m%d_%H%M%S') }}.jpg + - variables: + notification_id: blink_front_{{ now().strftime('%Y%m%d_%H%M%S_%f') }} + - variables: + title: Motion Detected - Front Door + - action: camera.snapshot + target: + entity_id: camera.blink_front + data: + filename: /media/{{ snapshot_filename }} + - action: camera.snapshot + target: + entity_id: camera.blink_front + data: + filename: /config/www/{{ snapshot_filename }} + - conditions: + - condition: trigger + id: garage + sequence: + - action: switch.turn_on + target: + entity_id: switch.garage_side_refresh_snapshot + - delay: + seconds: 20 + - action: homeassistant.update_entity + target: + entity_id: camera.garage_side + - delay: + seconds: 3 + - variables: + snapshot_filename: blink_garage_{{ now().strftime('%Y%m%d_%H%M%S') }}.jpg + - variables: + notification_id: blink_garage_{{ now().strftime('%Y%m%d_%H%M%S_%f') }} + - variables: + title: Motion Detected - Garage Side + - action: camera.snapshot + target: + entity_id: camera.blink_garage_side + data: + filename: /media/{{ snapshot_filename }} + - action: camera.snapshot + target: + entity_id: camera.blink_garage_side + data: + filename: /config/www/{{ snapshot_filename }} + default: - delay: seconds: 2 - - action: ai_task.generate_data - continue_on_error: true - response_variable: ai_profile - data: - attachments: - - media_content_id: media-source://media_source/local/{{ snapshot_filename }} - media_content_type: image/jpeg - entity_id: ai_task.ollama_ai_task_video - instructions: Describe what you see in this image in brief, but make it a very - funny. Focus on any people, objects, animals or activities. - task_name: Blink Camera Analysis - - action: notify.notify - continue_on_error: true - data: - message: "{{ ai_profile.data if ai_profile is defined and 'data' in ai_profile - else 'Motion detected, but the AI Task integration failed to return a response.' - }}" - title: "{{ title }}" - - action: persistent_notification.create - data: - message: "{{ ai_profile.data if ai_profile is defined and 'data' in ai_profile - else 'Motion detected, but the AI Task integration failed to return a response.' - }} + - delay: + seconds: 2 + - action: ai_task.generate_data + continue_on_error: true + response_variable: ai_profile + data: + attachments: + - media_content_id: media-source://media_source/local/{{ snapshot_filename }} + media_content_type: image/jpeg + entity_id: ai_task.ollama_ai_task_video + instructions: Describe what you see in this image in brief, but make it a very + funny. Focus on any people, objects, animals or activities. + task_name: Blink Camera Analysis + - action: notify.notify + continue_on_error: true + data: + message: '{{ ai_profile.data if ai_profile is defined and ''data'' in ai_profile + else ''Motion detected, but the AI Task integration failed to return a response.'' + }}' + title: '{{ title }}' + - action: persistent_notification.create + data: + message: '{{ ai_profile.data if ai_profile is defined and ''data'' in ai_profile + else ''Motion detected, but the AI Task integration failed to return a response.'' + }} - ![Snapshot](/local/{{ snapshot_filename }})" - notification_id: "{{ notification_id }}" - title: "{{ title }}" + ![Snapshot](/local/{{ snapshot_filename }})' + notification_id: '{{ notification_id }}' + title: '{{ title }}' max: 10 mode: parallel -- id: "1784597653614" +- id: '1784597653614' alias: New automation - description: "" + description: '' triggers: [] conditions: [] actions: - - action: webrtc.create_link - metadata: {} - data: - open_limit: 1 - time_to_live: 60 - entity: camera.blink_backyard_shed + - action: webrtc.create_link + metadata: {} + data: + open_limit: 1 + time_to_live: 60 + entity: camera.blink_backyard_shed mode: single -- id: "1784599010203" +- id: '1784599010203' alias: Motion Backyard - AI Description - Version 2 description: Takes a snapshot when the Nest camera detects motion, a person, an animal, or a doorbell press, analyzes it with AI, and sends a mobile and persistent notification. triggers: - - trigger: state - entity_id: binary_sensor.blink_backyard_motion - to: "on" - enabled: true - - trigger: event - event_type: state_changed - event_data: - entity_id: event.front_door_front_door_motion - enabled: false - - trigger: state - entity_id: event.living_room_living_room_camera_motion - enabled: false - - trigger: state + - trigger: state + entity_id: binary_sensor.blink_backyard_motion + to: 'on' + enabled: true + - trigger: event + event_type: state_changed + event_data: entity_id: event.front_door_front_door_motion - enabled: false - - trigger: event.received - target: - entity_id: event.entryway_entryway_camera_motion - options: - event_type: - - camera_motion - - camera_person - - camera_sound - enabled: false - - trigger: event.received - target: - device_id: 290f56e5a655e3af82cbf3cf9fd22406 - options: - event_type: - - camera_motion - - camera_person - - camera_sound - - ring - enabled: false - - trigger: event.received - target: - device_id: 679d52e0d16cf48648d11dd024b961f8 - options: - event_type: - - camera_motion - - camera_sound - - camera_person - enabled: false + enabled: false + - trigger: state + entity_id: event.living_room_living_room_camera_motion + enabled: false + - trigger: state + entity_id: event.front_door_front_door_motion + enabled: false + - trigger: event.received + target: + entity_id: event.entryway_entryway_camera_motion + options: + event_type: + - camera_motion + - camera_person + - camera_sound + enabled: false + - trigger: event.received + target: + device_id: 290f56e5a655e3af82cbf3cf9fd22406 + options: + event_type: + - camera_motion + - camera_person + - camera_sound + - ring + enabled: false + - trigger: event.received + target: + device_id: 679d52e0d16cf48648d11dd024b961f8 + options: + event_type: + - camera_motion + - camera_sound + - camera_person + enabled: false conditions: - - condition: template - value_template: "{{ (now() - state_attr(this.entity_id, 'last_triggered')).total_seconds() - > 60 }}" - - condition: template - value_template: "{{ trigger.event.data.new_state.attributes.event_type in ['motion', - 'person', 'animal', 'chime'] }}" - enabled: false + - condition: template + value_template: '{{ (now() - state_attr(this.entity_id, ''last_triggered'')).total_seconds() + > 60 }}' + - condition: template + value_template: '{{ trigger.event.data.new_state.attributes.event_type in [''motion'', + ''person'', ''animal'', ''chime''] }}' + enabled: false actions: - - action: shell_command.cleanup_blink_snapshots - - action: switch.turn_on - target: - entity_id: switch.backyard_refresh_snapshot - - delay: - hours: 0 - minutes: 0 - seconds: 20 - milliseconds: 0 - - action: homeassistant.update_entity - target: - entity_id: camera.blink_backyard - enabled: true - data: - entity_id: - - camera.blink_backyard - - delay: - hours: 0 - minutes: 0 - seconds: 3 - milliseconds: 0 - - action: blink.trigger_camera - target: - entity_id: camera.blink_backyard - data: {} - enabled: false - - delay: - hours: 0 - minutes: 0 - seconds: 10 - milliseconds: 0 - enabled: false - - variables: - snapshot_filename: blink_backyard_{{ now().strftime('%Y%m%d_%H%M%S') }}.jpg - - variables: - notification_id: blink_backyard_{{ now().strftime('%Y%m%d_%H%M%S_%f') }} - - action: camera.snapshot - target: - entity_id: camera.blink_backyard - data: - filename: /media/{{ snapshot_filename }} - - action: camera.snapshot - target: - entity_id: camera.blink_backyard - data: - filename: /config/www/{{ snapshot_filename }} - - delay: - hours: 0 - minutes: 0 - seconds: 2 - milliseconds: 0 - - action: ai_task.generate_data - continue_on_error: true - data: - task_name: Blink Backyard Camera Analysis - entity_id: ai_task.ollama_ai_task_video - instructions: Describe what you see in this image in brief, but make it a very - funny. Focus on any people, objects, animals or activities. - attachments: - - media_content_id: media-source://media_source/local/{{ snapshot_filename }} - media_content_type: image/jpeg - response_variable: ai_profile - - action: notify.notify - continue_on_error: true - data: - title: Motion Detected - Backyard - message: "{{ ai_profile.data if ai_profile is defined and 'data' in ai_profile - else 'Motion detected, but the AI Task integration failed to return a response.' - }}" - - action: persistent_notification.create - data: - title: Motion Detected - Backyard - message: "{{ ai_profile.data if ai_profile is defined and 'data' in ai_profile - else 'Motion detected, but the AI Task integration failed to return a response.' - }} + - action: shell_command.cleanup_blink_snapshots + - action: switch.turn_on + target: + entity_id: switch.backyard_refresh_snapshot + - delay: + hours: 0 + minutes: 0 + seconds: 20 + milliseconds: 0 + - action: homeassistant.update_entity + target: + entity_id: camera.blink_backyard + enabled: true + data: + entity_id: + - camera.blink_backyard + - delay: + hours: 0 + minutes: 0 + seconds: 3 + milliseconds: 0 + - action: blink.trigger_camera + target: + entity_id: camera.blink_backyard + data: {} + enabled: false + - delay: + hours: 0 + minutes: 0 + seconds: 10 + milliseconds: 0 + enabled: false + - variables: + snapshot_filename: blink_backyard_{{ now().strftime('%Y%m%d_%H%M%S') }}.jpg + - variables: + notification_id: blink_backyard_{{ now().strftime('%Y%m%d_%H%M%S_%f') }} + - action: camera.snapshot + target: + entity_id: camera.blink_backyard + data: + filename: /media/{{ snapshot_filename }} + - action: camera.snapshot + target: + entity_id: camera.blink_backyard + data: + filename: /config/www/{{ snapshot_filename }} + - delay: + hours: 0 + minutes: 0 + seconds: 2 + milliseconds: 0 + - action: ai_task.generate_data + continue_on_error: true + data: + task_name: Blink Backyard Camera Analysis + entity_id: ai_task.ollama_ai_task_video + instructions: Describe what you see in this image in brief, but make it a very + funny. Focus on any people, objects, animals or activities. + attachments: + - media_content_id: media-source://media_source/local/{{ snapshot_filename }} + media_content_type: image/jpeg + response_variable: ai_profile + - action: notify.notify + continue_on_error: true + data: + title: Motion Detected - Backyard + message: '{{ ai_profile.data if ai_profile is defined and ''data'' in ai_profile + else ''Motion detected, but the AI Task integration failed to return a response.'' + }}' + - action: persistent_notification.create + data: + title: Motion Detected - Backyard + message: '{{ ai_profile.data if ai_profile is defined and ''data'' in ai_profile + else ''Motion detected, but the AI Task integration failed to return a response.'' + }} - ![Snapshot](/local/{{ snapshot_filename }})" - notification_id: "{{ notification_id }}" + ![Snapshot](/local/{{ snapshot_filename }})' + notification_id: '{{ notification_id }}' mode: queued max: 10 -- id: "1784601034537" +- id: '1784601034537' alias: Motion Front Door - AI Description - Version 3 description: Takes a snapshot when the Nest camera detects motion, a person, an animal, or a doorbell press, analyzes it with AI, and sends a mobile and persistent notification. triggers: - - trigger: event - event_type: state_changed - event_data: - entity_id: event.front_door_front_door_motion - enabled: false - - trigger: state - entity_id: event.living_room_living_room_camera_motion - enabled: false - - trigger: state + - trigger: event + event_type: state_changed + event_data: entity_id: event.front_door_front_door_motion - enabled: false - - trigger: event.received - target: - entity_id: event.entryway_entryway_camera_motion - options: - event_type: - - camera_motion - - camera_person - - camera_sound - enabled: false - - trigger: event.received - target: - device_id: 290f56e5a655e3af82cbf3cf9fd22406 - options: - event_type: - - camera_motion - - camera_person - - camera_sound - - ring - - trigger: event.received - target: - device_id: 679d52e0d16cf48648d11dd024b961f8 - options: - event_type: - - camera_motion - - camera_sound - - camera_person - enabled: false - - trigger: state - entity_id: - - input_boolean.blink_front_camera_motion - to: - - "on" - enabled: true + enabled: false + - trigger: state + entity_id: event.living_room_living_room_camera_motion + enabled: false + - trigger: state + entity_id: event.front_door_front_door_motion + enabled: false + - trigger: event.received + target: + entity_id: event.entryway_entryway_camera_motion + options: + event_type: + - camera_motion + - camera_person + - camera_sound + enabled: false + - trigger: event.received + target: + device_id: 290f56e5a655e3af82cbf3cf9fd22406 + options: + event_type: + - camera_motion + - camera_person + - camera_sound + - ring + - trigger: event.received + target: + device_id: 679d52e0d16cf48648d11dd024b961f8 + options: + event_type: + - camera_motion + - camera_sound + - camera_person + enabled: false + - trigger: state + entity_id: + - input_boolean.blink_front_camera_motion + to: + - 'on' + enabled: true conditions: - - condition: template - value_template: "{{ (now() - state_attr(this.entity_id, 'last_triggered')).total_seconds() - > 60 }}" - - condition: template - value_template: "{{ trigger.event.data.new_state.attributes.event_type in ['motion', - 'person', 'animal', 'chime'] }}" - enabled: false + - condition: template + value_template: '{{ (now() - state_attr(this.entity_id, ''last_triggered'')).total_seconds() + > 60 }}' + - condition: template + value_template: '{{ trigger.event.data.new_state.attributes.event_type in [''motion'', + ''person'', ''animal'', ''chime''] }}' + enabled: false actions: - - action: shell_command.cleanup_blink_snapshots - - action: switch.turn_on - target: - entity_id: switch.front_refresh_snapshot - - delay: - hours: 0 - minutes: 0 - seconds: 20 - milliseconds: 0 - - action: homeassistant.update_entity - target: - entity_id: camera.front - enabled: true - data: - entity_id: - - camera.front - - delay: - hours: 0 - minutes: 0 - seconds: 3 - milliseconds: 0 - - action: blink.trigger_camera - target: - entity_id: camera.front - data: {} - enabled: false - - delay: - hours: 0 - minutes: 0 - seconds: 10 - milliseconds: 0 - enabled: false - - variables: - snapshot_filename: blink_Front_{{ now().strftime('%Y%m%d_%H%M%S') }}.jpg - - variables: - notification_id: blink_front_{{ now().strftime('%Y%m%d_%H%M%S_%f') }} - - action: camera.snapshot - target: - entity_id: camera.blink_front - data: - filename: /media/{{ snapshot_filename }} - - action: camera.snapshot - target: - entity_id: camera.blink_front - data: - filename: /config/www/{{ snapshot_filename }} - - delay: - hours: 0 - minutes: 0 - seconds: 2 - milliseconds: 0 - - action: ai_task.generate_data - continue_on_error: true - data: - task_name: Blink Front Camera Analysis - entity_id: ai_task.ollama_ai_task_video - instructions: Describe what you see in this image in brief, but make it a very - funny. Focus on any people, objects, animals or activities. - attachments: - - media_content_id: media-source://media_source/local/{{ snapshot_filename }} - media_content_type: image/jpeg - response_variable: ai_profile - - action: notify.notify - continue_on_error: true - data: - title: Motion Detected - Front Door - message: "{{ ai_profile.data if ai_profile is defined and 'data' in ai_profile - else 'Motion detected, but the AI Task integration failed to return a response.' - }}" - - action: persistent_notification.create - data: - title: Motion Detected - Front Door - message: "{{ ai_profile.data if ai_profile is defined and 'data' in ai_profile - else 'Motion detected, but the AI Task integration failed to return a response.' - }} + - action: shell_command.cleanup_blink_snapshots + - action: switch.turn_on + target: + entity_id: switch.front_refresh_snapshot + - delay: + hours: 0 + minutes: 0 + seconds: 20 + milliseconds: 0 + - action: homeassistant.update_entity + target: + entity_id: camera.front + enabled: true + data: + entity_id: + - camera.front + - delay: + hours: 0 + minutes: 0 + seconds: 3 + milliseconds: 0 + - action: blink.trigger_camera + target: + entity_id: camera.front + data: {} + enabled: false + - delay: + hours: 0 + minutes: 0 + seconds: 10 + milliseconds: 0 + enabled: false + - variables: + snapshot_filename: blink_Front_{{ now().strftime('%Y%m%d_%H%M%S') }}.jpg + - variables: + notification_id: blink_front_{{ now().strftime('%Y%m%d_%H%M%S_%f') }} + - action: camera.snapshot + target: + entity_id: camera.blink_front + data: + filename: /media/{{ snapshot_filename }} + - action: camera.snapshot + target: + entity_id: camera.blink_front + data: + filename: /config/www/{{ snapshot_filename }} + - delay: + hours: 0 + minutes: 0 + seconds: 2 + milliseconds: 0 + - action: ai_task.generate_data + continue_on_error: true + data: + task_name: Blink Front Camera Analysis + entity_id: ai_task.ollama_ai_task_video + instructions: Describe what you see in this image in brief, but make it a very + funny. Focus on any people, objects, animals or activities. + attachments: + - media_content_id: media-source://media_source/local/{{ snapshot_filename }} + media_content_type: image/jpeg + response_variable: ai_profile + - action: notify.notify + continue_on_error: true + data: + title: Motion Detected - Front Door + message: '{{ ai_profile.data if ai_profile is defined and ''data'' in ai_profile + else ''Motion detected, but the AI Task integration failed to return a response.'' + }}' + - action: persistent_notification.create + data: + title: Motion Detected - Front Door + message: '{{ ai_profile.data if ai_profile is defined and ''data'' in ai_profile + else ''Motion detected, but the AI Task integration failed to return a response.'' + }} - ![Snapshot](/local/{{ snapshot_filename }})" - notification_id: "{{ notification_id }}" + ![Snapshot](/local/{{ snapshot_filename }})' + notification_id: '{{ notification_id }}' mode: queued max: 10 -- id: "1784601274723" +- id: '1784601274723' alias: Motion Shed - AI Description - Version 2 description: Takes a snapshot when the shed's Blink camera detects motion, analyzes it with AI, and sends a mobile and persistent notification. Structurally mirrors @@ -2972,368 +2970,368 @@ and camera.backyard_tree to confirm which physical camera is which, then rename if needed. triggers: - - trigger: state - entity_id: binary_sensor.blink_backyard_shed_motion - to: "on" - enabled: true - - trigger: event - event_type: state_changed - event_data: - entity_id: event.front_door_front_door_motion - enabled: false - - trigger: state - entity_id: event.living_room_living_room_camera_motion - enabled: false - - trigger: state + - trigger: state + entity_id: binary_sensor.blink_backyard_shed_motion + to: 'on' + enabled: true + - trigger: event + event_type: state_changed + event_data: entity_id: event.front_door_front_door_motion - enabled: false - - trigger: event.received - target: - entity_id: event.entryway_entryway_camera_motion - options: - event_type: - - camera_motion - - camera_person - - camera_sound - enabled: false - - trigger: event.received - target: - device_id: 290f56e5a655e3af82cbf3cf9fd22406 - options: - event_type: - - camera_motion - - camera_person - - camera_sound - - ring - enabled: false - - trigger: event.received - target: - device_id: 679d52e0d16cf48648d11dd024b961f8 - options: - event_type: - - camera_motion - - camera_sound - - camera_person - enabled: false + enabled: false + - trigger: state + entity_id: event.living_room_living_room_camera_motion + enabled: false + - trigger: state + entity_id: event.front_door_front_door_motion + enabled: false + - trigger: event.received + target: + entity_id: event.entryway_entryway_camera_motion + options: + event_type: + - camera_motion + - camera_person + - camera_sound + enabled: false + - trigger: event.received + target: + device_id: 290f56e5a655e3af82cbf3cf9fd22406 + options: + event_type: + - camera_motion + - camera_person + - camera_sound + - ring + enabled: false + - trigger: event.received + target: + device_id: 679d52e0d16cf48648d11dd024b961f8 + options: + event_type: + - camera_motion + - camera_sound + - camera_person + enabled: false conditions: - - condition: template - value_template: "{{ (now() - state_attr(this.entity_id, 'last_triggered')).total_seconds() - > 60 }}" - - condition: template - value_template: "{{ trigger.event.data.new_state.attributes.event_type in ['motion', - 'person', 'animal', 'chime'] }}" - enabled: false + - condition: template + value_template: '{{ (now() - state_attr(this.entity_id, ''last_triggered'')).total_seconds() + > 60 }}' + - condition: template + value_template: '{{ trigger.event.data.new_state.attributes.event_type in [''motion'', + ''person'', ''animal'', ''chime''] }}' + enabled: false actions: - - action: shell_command.cleanup_blink_snapshots - - action: switch.turn_on - target: - entity_id: switch.backyard_shed_refresh_snapshot - - delay: - hours: 0 - minutes: 0 - seconds: 30 - milliseconds: 0 - - action: homeassistant.update_entity - target: - entity_id: camera.blink_backyard_shed - enabled: true - data: - entity_id: - - camera.blink_backyard_shed - - delay: - hours: 0 - minutes: 0 - seconds: 5 - milliseconds: 0 - - action: camera.record - target: - entity_id: - - camera.blink_backyard_shed - data: - duration: 10 - lookback: 0 - filename: /media/blinkshed.mp4 - enabled: false - - delay: - hours: 0 - minutes: 0 - seconds: 10 - milliseconds: 0 - enabled: false - - variables: - snapshot_filename: blink_shed_{{ now().strftime('%Y%m%d_%H%M%S') }}.jpg - - variables: - notification_id: blink_backyard_{{ now().strftime('%Y%m%d_%H%M%S_%f') }} - - action: camera.snapshot - target: - entity_id: camera.blink_backyard_shed - data: - filename: /media/{{ snapshot_filename }} - - action: camera.snapshot - target: - entity_id: camera.blink_backyard_shed - data: - filename: /config/www/{{ snapshot_filename }} - - delay: - hours: 0 - minutes: 0 - seconds: 2 - milliseconds: 0 - - action: ai_task.generate_data - continue_on_error: true - response_variable: ai_profile - data: - task_name: Blink Shed Camera Analysis - entity_id: ai_task.ollama_ai_task_video - instructions: Describe what you see in this image in brief, but make it a very - funny. Focus on any people, objects, animals or activities. - attachments: - - media_content_id: media-source://media_source/local/{{ snapshot_filename }} - media_content_type: image/jpeg - - action: notify.notify - continue_on_error: true - data: - title: Motion Detected - Backyard Shed - message: "{{ ai_profile.data if ai_profile is defined and 'data' in ai_profile - else 'Motion detected, but the AI Task integration failed to return a response.' - }}" - - action: persistent_notification.create - data: - title: Motion Detected - Backyard Shed - message: "{{ ai_profile.data if ai_profile is defined and 'data' in ai_profile - else 'Motion detected, but the AI Task integration failed to return a response.' - }} + - action: shell_command.cleanup_blink_snapshots + - action: switch.turn_on + target: + entity_id: switch.backyard_shed_refresh_snapshot + - delay: + hours: 0 + minutes: 0 + seconds: 30 + milliseconds: 0 + - action: homeassistant.update_entity + target: + entity_id: camera.blink_backyard_shed + enabled: true + data: + entity_id: + - camera.blink_backyard_shed + - delay: + hours: 0 + minutes: 0 + seconds: 5 + milliseconds: 0 + - action: camera.record + target: + entity_id: + - camera.blink_backyard_shed + data: + duration: 10 + lookback: 0 + filename: /media/blinkshed.mp4 + enabled: false + - delay: + hours: 0 + minutes: 0 + seconds: 10 + milliseconds: 0 + enabled: false + - variables: + snapshot_filename: blink_shed_{{ now().strftime('%Y%m%d_%H%M%S') }}.jpg + - variables: + notification_id: blink_backyard_{{ now().strftime('%Y%m%d_%H%M%S_%f') }} + - action: camera.snapshot + target: + entity_id: camera.blink_backyard_shed + data: + filename: /media/{{ snapshot_filename }} + - action: camera.snapshot + target: + entity_id: camera.blink_backyard_shed + data: + filename: /config/www/{{ snapshot_filename }} + - delay: + hours: 0 + minutes: 0 + seconds: 2 + milliseconds: 0 + - action: ai_task.generate_data + continue_on_error: true + response_variable: ai_profile + data: + task_name: Blink Shed Camera Analysis + entity_id: ai_task.ollama_ai_task_video + instructions: Describe what you see in this image in brief, but make it a very + funny. Focus on any people, objects, animals or activities. + attachments: + - media_content_id: media-source://media_source/local/{{ snapshot_filename }} + media_content_type: image/jpeg + - action: notify.notify + continue_on_error: true + data: + title: Motion Detected - Backyard Shed + message: '{{ ai_profile.data if ai_profile is defined and ''data'' in ai_profile + else ''Motion detected, but the AI Task integration failed to return a response.'' + }}' + - action: persistent_notification.create + data: + title: Motion Detected - Backyard Shed + message: '{{ ai_profile.data if ai_profile is defined and ''data'' in ai_profile + else ''Motion detected, but the AI Task integration failed to return a response.'' + }} - ![Snapshot](/local/{{ snapshot_filename }})" - notification_id: "{{ notification_id }}" + ![Snapshot](/local/{{ snapshot_filename }})' + notification_id: '{{ notification_id }}' mode: queued max: 10 -- id: "1784601377055" +- id: '1784601377055' alias: Motion Garage - AI Description - Version 2 description: Takes a snapshot when garage motion is detected and analyzes it with AI. Deliberately uses the 'backyard_tree' Blink camera (switch.backyard_tree_refresh_snapshot / camera.backyard_tree) as the garage-monitoring camera -- entity names don't match the physical location, but this pairing is intentional, not a bug. triggers: - - trigger: state - entity_id: binary_sensor.blink_backyard_tree_motion - to: "on" - enabled: true - - trigger: event - event_type: state_changed - event_data: - entity_id: event.front_door_front_door_motion - enabled: false - - trigger: state - entity_id: event.living_room_living_room_camera_motion - enabled: false - - trigger: state + - trigger: state + entity_id: binary_sensor.blink_backyard_tree_motion + to: 'on' + enabled: true + - trigger: event + event_type: state_changed + event_data: entity_id: event.front_door_front_door_motion - enabled: false - - trigger: event.received - target: - entity_id: event.entryway_entryway_camera_motion - options: - event_type: - - camera_motion - - camera_person - - camera_sound - enabled: false - - trigger: event.received - target: - device_id: 290f56e5a655e3af82cbf3cf9fd22406 - options: - event_type: - - camera_motion - - camera_person - - camera_sound - - ring - enabled: false - - trigger: event.received - target: - device_id: 679d52e0d16cf48648d11dd024b961f8 - options: - event_type: - - camera_motion - - camera_sound - - camera_person - enabled: false + enabled: false + - trigger: state + entity_id: event.living_room_living_room_camera_motion + enabled: false + - trigger: state + entity_id: event.front_door_front_door_motion + enabled: false + - trigger: event.received + target: + entity_id: event.entryway_entryway_camera_motion + options: + event_type: + - camera_motion + - camera_person + - camera_sound + enabled: false + - trigger: event.received + target: + device_id: 290f56e5a655e3af82cbf3cf9fd22406 + options: + event_type: + - camera_motion + - camera_person + - camera_sound + - ring + enabled: false + - trigger: event.received + target: + device_id: 679d52e0d16cf48648d11dd024b961f8 + options: + event_type: + - camera_motion + - camera_sound + - camera_person + enabled: false conditions: - - condition: template - value_template: "{{ (now() - state_attr(this.entity_id, 'last_triggered')).total_seconds() - > 60 }}" - - condition: template - value_template: "{{ trigger.event.data.new_state.attributes.event_type in ['motion', - 'person', 'animal', 'chime'] }}" - enabled: false + - condition: template + value_template: '{{ (now() - state_attr(this.entity_id, ''last_triggered'')).total_seconds() + > 60 }}' + - condition: template + value_template: '{{ trigger.event.data.new_state.attributes.event_type in [''motion'', + ''person'', ''animal'', ''chime''] }}' + enabled: false actions: - - action: shell_command.cleanup_blink_snapshots - - action: switch.turn_on - target: - entity_id: switch.backyard_tree_refresh_snapshot - - delay: - hours: 0 - minutes: 0 - seconds: 30 - milliseconds: 0 - - action: homeassistant.update_entity - target: - entity_id: camera.blink_backyard_tree - enabled: true - data: - entity_id: - - camera.blink_backyard_tree - - delay: - hours: 0 - minutes: 0 - seconds: 5 - milliseconds: 0 - - action: blink.trigger_camera - target: - entity_id: camera.blink_backyard_tree - data: {} - enabled: false - - delay: - hours: 0 - minutes: 0 - seconds: 10 - milliseconds: 0 - enabled: false - - variables: - snapshot_filename: blink_Inshed_{{ now().strftime('%Y%m%d_%H%M%S') }}.jpg - - variables: - notification_id: blink_Inshed_{{ now().strftime('%Y%m%d_%H%M%S_%f') }} - - action: camera.snapshot - target: - entity_id: camera.blink_backyard_tree - data: - filename: /media/{{ snapshot_filename }} - - action: camera.snapshot - target: - entity_id: camera.blink_backyard_tree - data: - filename: /config/www/{{ snapshot_filename }} - - delay: - hours: 0 - minutes: 0 - seconds: 2 - milliseconds: 0 - - action: ai_task.generate_data - continue_on_error: true - data: - task_name: Blink InShed Camera Analysis - entity_id: ai_task.ollama_ai_task_video - instructions: Describe what you see in this image in brief, but make it a very - funny. Focus on any people, objects, animals or activities. - attachments: - - media_content_id: media-source://media_source/local/{{ snapshot_filename }} - media_content_type: image/jpeg - response_variable: ai_profile - - action: notify.notify - continue_on_error: true - data: - title: Motion Detected - Garage - message: "{{ ai_profile.data if ai_profile is defined and 'data' in ai_profile - else 'Motion detected, but the AI Task integration failed to return a response.' - }}" - - action: persistent_notification.create - data: - title: Motion Detected - Garage - message: "{{ ai_profile.data if ai_profile is defined and 'data' in ai_profile - else 'Motion detected, but the AI Task integration failed to return a response.' - }} + - action: shell_command.cleanup_blink_snapshots + - action: switch.turn_on + target: + entity_id: switch.backyard_tree_refresh_snapshot + - delay: + hours: 0 + minutes: 0 + seconds: 30 + milliseconds: 0 + - action: homeassistant.update_entity + target: + entity_id: camera.blink_backyard_tree + enabled: true + data: + entity_id: + - camera.blink_backyard_tree + - delay: + hours: 0 + minutes: 0 + seconds: 5 + milliseconds: 0 + - action: blink.trigger_camera + target: + entity_id: camera.blink_backyard_tree + data: {} + enabled: false + - delay: + hours: 0 + minutes: 0 + seconds: 10 + milliseconds: 0 + enabled: false + - variables: + snapshot_filename: blink_Inshed_{{ now().strftime('%Y%m%d_%H%M%S') }}.jpg + - variables: + notification_id: blink_Inshed_{{ now().strftime('%Y%m%d_%H%M%S_%f') }} + - action: camera.snapshot + target: + entity_id: camera.blink_backyard_tree + data: + filename: /media/{{ snapshot_filename }} + - action: camera.snapshot + target: + entity_id: camera.blink_backyard_tree + data: + filename: /config/www/{{ snapshot_filename }} + - delay: + hours: 0 + minutes: 0 + seconds: 2 + milliseconds: 0 + - action: ai_task.generate_data + continue_on_error: true + data: + task_name: Blink InShed Camera Analysis + entity_id: ai_task.ollama_ai_task_video + instructions: Describe what you see in this image in brief, but make it a very + funny. Focus on any people, objects, animals or activities. + attachments: + - media_content_id: media-source://media_source/local/{{ snapshot_filename }} + media_content_type: image/jpeg + response_variable: ai_profile + - action: notify.notify + continue_on_error: true + data: + title: Motion Detected - Garage + message: '{{ ai_profile.data if ai_profile is defined and ''data'' in ai_profile + else ''Motion detected, but the AI Task integration failed to return a response.'' + }}' + - action: persistent_notification.create + data: + title: Motion Detected - Garage + message: '{{ ai_profile.data if ai_profile is defined and ''data'' in ai_profile + else ''Motion detected, but the AI Task integration failed to return a response.'' + }} - ![Snapshot](/local/{{ snapshot_filename }})" - notification_id: "{{ notification_id }}" + ![Snapshot](/local/{{ snapshot_filename }})' + notification_id: '{{ notification_id }}' mode: queued max: 10 -- id: "1785027869879" +- id: '1785027869879' alias: Alfred Lock - Silent Force Hardware Sync description: Mutes living room Echo, forces Alexa to check physical lock state, and restores volume. triggers: - - minutes: /15 - trigger: time_pattern + - minutes: /15 + trigger: time_pattern actions: - - action: scene.create - data: - scene_id: echo_volume_snapshot - snapshot_entities: - - media_player.living_room_1_2 - - action: media_player.volume_set - target: - entity_id: media_player.living_room_1_2 - data: - volume_level: 0 - - action: media_player.play_media - target: - entity_id: media_player.living_room_1_2 - data: - media: - media_content_id: Is the front door locked? - media_content_type: custom - metadata: {} - - delay: - seconds: 5 - - action: scene.turn_on - target: - entity_id: scene.echo_volume_snapshot + - action: scene.create + data: + scene_id: echo_volume_snapshot + snapshot_entities: + - media_player.living_room_1_2 + - action: media_player.volume_set + target: + entity_id: media_player.living_room_1_2 + data: + volume_level: 0 + - action: media_player.play_media + target: + entity_id: media_player.living_room_1_2 + data: + media: + media_content_id: Is the front door locked? + media_content_type: custom + metadata: {} + - delay: + seconds: 5 + - action: scene.turn_on + target: + entity_id: scene.echo_volume_snapshot mode: single -- id: "1785108022773" +- id: '1785108022773' alias: Alfred Lock - Auto Sync on Door Contact description: Forces a lock state resync whenever the front door opens or closes. triggers: - - entity_id: binary_sensor.front_door - to: - - open - - "off" - trigger: state + - entity_id: binary_sensor.front_door + to: + - open + - 'off' + trigger: state actions: - - action: homeassistant.update_entity - target: - entity_id: input_boolean.alfred_lock_sync_switch - - action: homeassistant.update_entity - target: - entity_id: lock.alfred_front_door + - action: homeassistant.update_entity + target: + entity_id: input_boolean.alfred_lock_sync_switch + - action: homeassistant.update_entity + target: + entity_id: lock.alfred_front_door mode: single - id: doorbell_flash_kitchen_lights - alias: "Doorbell: Flash Kitchen Lights" + alias: 'Doorbell: Flash Kitchen Lights' description: Flashes all kitchen lights when the front doorbell rings, then restores their original state (on or off). triggers: - - trigger: state - entity_id: event.front_door_front_door_chime + - trigger: state + entity_id: event.front_door_front_door_chime conditions: [] actions: - - action: scene.create - data: - scene_id: kitchen_lights_before_doorbell - snapshot_entities: - - light.kitchen_group_kitchen_group_home_kitchen_sink_light - - light.kitchen_island_switch - - light.kitchen_kitchen_home_kitchen - - light.kitchen_kitchen_home_kitchen_group - - light.kitchen_spotlight_switch - - action: light.turn_on - target: - entity_id: - - light.kitchen_group_kitchen_group_home_kitchen_sink_light - - light.kitchen_island_switch - - light.kitchen_kitchen_home_kitchen - - light.kitchen_kitchen_home_kitchen_group - - light.kitchen_spotlight_switch - data: - flash: long - - delay: - seconds: 5 - - action: scene.turn_on - target: - entity_id: scene.kitchen_lights_before_doorbell - data: - transition: 1 + - action: scene.create + data: + scene_id: kitchen_lights_before_doorbell + snapshot_entities: + - light.kitchen_group_kitchen_group_home_kitchen_sink_light + - light.kitchen_island_switch + - light.kitchen_kitchen_home_kitchen + - light.kitchen_kitchen_home_kitchen_group + - light.kitchen_spotlight_switch + - action: light.turn_on + target: + entity_id: + - light.kitchen_group_kitchen_group_home_kitchen_sink_light + - light.kitchen_island_switch + - light.kitchen_kitchen_home_kitchen + - light.kitchen_kitchen_home_kitchen_group + - light.kitchen_spotlight_switch + data: + flash: long + - delay: + seconds: 5 + - action: scene.turn_on + target: + entity_id: scene.kitchen_lights_before_doorbell + data: + transition: 1 mode: single -- id: "1785688553432" - alias: "Basement: Switch Toggles Living Room Lights" +- id: '1785688553432' + alias: 'Basement: Switch Toggles Living Room Lights' description: Ikea BILRESA E2489 Dual Button (Basement Switch) toggles the Dining Room Switch light on Button 1 single press. Button 2 single press dims to 30% and restores the previous brightness. @@ -3344,52 +3342,52 @@ button1_event: event.basement_switch_button_1 button2_event: event.basement_switch_button_2 button1_single: - - action: light.toggle - metadata: {} + - action: light.toggle + metadata: {} + target: + entity_id: light.living_room_living_room_home_living_room + data: {} + button2_single: + - choose: + - conditions: + - condition: template + value_template: '{{ states(''input_text.living_room_previous_brightness'') + in ['''', ''unknown'', ''unavailable'', none] }}' + sequence: + - action: light.turn_on + target: + entity_id: light.living_room_living_room_home_living_room + data: {} + - action: input_text.set_value + target: + entity_id: input_text.living_room_previous_brightness + data: + value: '{{ state_attr(''light.living_room_living_room_home_living_room'', + ''brightness'') }}' + - action: light.turn_on + target: + entity_id: light.living_room_living_room_home_living_room + data: + brightness_pct: 30 + default: + - action: light.turn_on target: entity_id: light.living_room_living_room_home_living_room - data: {} - button2_single: - - choose: - - conditions: - - condition: template - value_template: "{{ states('input_text.living_room_previous_brightness') - in ['', 'unknown', 'unavailable', none] }}" - sequence: - - action: light.turn_on - target: - entity_id: light.living_room_living_room_home_living_room - data: {} - - action: input_text.set_value - target: - entity_id: input_text.living_room_previous_brightness - data: - value: "{{ state_attr('light.living_room_living_room_home_living_room', - 'brightness') }}" - - action: light.turn_on - target: - entity_id: light.living_room_living_room_home_living_room - data: - brightness_pct: 30 - default: - - action: light.turn_on - target: - entity_id: light.living_room_living_room_home_living_room - data: - brightness: "{{ states('input_text.living_room_previous_brightness') - | int }}" - - action: input_text.set_value - target: - entity_id: input_text.living_room_previous_brightness - data: - value: "" - button1_long_press: - - action: switch.toggle - metadata: {} + data: + brightness: '{{ states(''input_text.living_room_previous_brightness'') + | int }}' + - action: input_text.set_value target: - entity_id: switch.filter - data: {} -- id: "1786068561172" + entity_id: input_text.living_room_previous_brightness + data: + value: '' + button1_long_press: + - action: switch.toggle + metadata: {} + target: + entity_id: switch.filter + data: {} +- id: '1786068561172' alias: 3D Printer Running - Playroom Light & Basement Heat description: When the 3D printer running helper turns on, turn on the SparkX i7 light and the local 3D printer light at bright white, turn on the bedroom lamp, @@ -3397,320 +3395,320 @@ off, turn both printer lights off after 3 minutes, turn off the bedroom lamp after 10 minutes, and turn off the filter after 1 hour. triggers: - - entity_id: input_boolean.3d_printer_running - id: printer_started - to: "on" - trigger: state - - entity_id: input_boolean.3d_printer_running - id: printer_stopped - to: "off" - trigger: state + - entity_id: input_boolean.3d_printer_running + id: printer_started + to: 'on' + trigger: state + - entity_id: input_boolean.3d_printer_running + id: printer_stopped + to: 'off' + trigger: state actions: - - choose: - - conditions: - - condition: trigger - id: printer_started - sequence: - - action: light.turn_on - target: - entity_id: light.sparkx_i7_light - - action: light.turn_on - continue_on_error: true - data: - brightness_pct: 100 - rgb_color: - - 255 - - 255 - - 255 - target: - entity_id: light.3d_printer_lights_local - - action: light.turn_on - data: - brightness_pct: 100 - target: - entity_id: light.bedroom_lamp_2 - - action: climate.set_temperature - data: - hvac_mode: heat - temperature: 22 - target: - entity_id: climate.basement - - action: switch.turn_on - target: - entity_id: switch.filter - - conditions: - - condition: trigger - id: printer_stopped - sequence: - - parallel: - - sequence: - - delay: - minutes: 3 - - action: light.turn_off - target: - entity_id: light.sparkx_i7_light - - action: light.turn_off - continue_on_error: true - target: - entity_id: light.3d_printer_lights_local - - delay: - minutes: 7 - - action: light.turn_off - target: - entity_id: light.bedroom_lamp_2 - - sequence: - - delay: - hours: 1 - - action: switch.turn_off - target: - entity_id: switch.filter + - choose: + - conditions: + - condition: trigger + id: printer_started + sequence: + - action: light.turn_on + target: + entity_id: light.sparkx_i7_light + - action: light.turn_on + continue_on_error: true + data: + brightness_pct: 100 + rgb_color: + - 255 + - 255 + - 255 + target: + entity_id: light.3d_printer_lights_local + - action: light.turn_on + data: + brightness_pct: 100 + target: + entity_id: light.bedroom_lamp_2 + - action: climate.set_temperature + data: + hvac_mode: heat + temperature: 22 + target: + entity_id: climate.basement + - action: switch.turn_on + target: + entity_id: switch.filter + - conditions: + - condition: trigger + id: printer_stopped + sequence: + - parallel: + - sequence: + - delay: + minutes: 3 + - action: light.turn_off + target: + entity_id: light.sparkx_i7_light + - action: light.turn_off + continue_on_error: true + target: + entity_id: light.3d_printer_lights_local + - delay: + minutes: 7 + - action: light.turn_off + target: + entity_id: light.bedroom_lamp_2 + - sequence: + - delay: + hours: 1 + - action: switch.turn_off + target: + entity_id: switch.filter mode: restart -- id: "1786107704090" +- id: '1786107704090' alias: Count OctoPrint Print Outcomes description: Legacy alias retained for entity stability. Increments the existing print counters for SparkX i7 completed, stopped, and error states. triggers: - - entity_id: sensor.sparkx_i7_print_status - from: printing - id: done - to: completed - trigger: state - - entity_id: sensor.sparkx_i7_print_status - from: - - printing - - paused - id: failed - to: - - stopped - - error - trigger: state + - entity_id: sensor.sparkx_i7_print_status + from: printing + id: done + to: completed + trigger: state + - entity_id: sensor.sparkx_i7_print_status + from: + - printing + - paused + id: failed + to: + - stopped + - error + trigger: state actions: - - choose: - - conditions: - - condition: trigger - id: done - sequence: - - action: counter.increment - target: - entity_id: counter.octoprint_successful_prints - - conditions: - - condition: trigger - id: failed - sequence: - - action: counter.increment - target: - entity_id: counter.octoprint_failed_prints + - choose: + - conditions: + - condition: trigger + id: done + sequence: + - action: counter.increment + target: + entity_id: counter.octoprint_successful_prints + - conditions: + - condition: trigger + id: failed + sequence: + - action: counter.increment + target: + entity_id: counter.octoprint_failed_prints mode: single -- id: "1787462132503" +- id: '1787462132503' alias: 3D Print Complete Snapshot - Telegram description: Sends a Telegram photo with a SparkX i7 camera snapshot when a print finishes successfully. Mobile completion notifications are handled by the Creality integration. triggers: - - entity_id: sensor.sparkx_i7_print_status - from: printing - to: completed - trigger: state + - entity_id: sensor.sparkx_i7_print_status + from: printing + to: completed + trigger: state actions: - - variables: - completion_message: "{% set file = trigger.to_state.attributes.get('file', - '') %} {% set name = 'Print' if file in ['', none, 'unknown', 'unavailable'] - else file.split('/')[-1].replace('.gcode', '') %} {% set seconds = trigger.to_state.attributes.get('job_time_s', - 0) | int(0) %} {{ name }} finished successfully at {{ now().strftime('%I:%M - %p').lstrip('0') }}. Total time: {% if seconds >= 3600 %}{{ seconds // - 3600 }}h {{ ((seconds % 3600) // 60) }}m {% else %}{{ ((seconds % 3600) // - 60) }}m{% endif %}" - - variables: - sparkx_needs_light: "{{ not is_state('light.sparkx_i7_light', 'on') }}" - bedroom_needs_light: "{{ not is_state('light.bedroom_lamp_2', 'on') }}" - - if: - - condition: template - value_template: "{{ sparkx_needs_light }}" - then: - - action: light.turn_on - continue_on_error: true - target: - entity_id: light.sparkx_i7_light - - if: - - condition: template - value_template: "{{ bedroom_needs_light }}" - then: - - action: light.turn_on - continue_on_error: true - target: - entity_id: light.bedroom_lamp_2 - - delay: - seconds: 3 - - action: camera.snapshot - data: - filename: /config/www/sparkx_i7_complete_snapshot.jpg + - variables: + completion_message: '{% set file = trigger.to_state.attributes.get(''file'', + '''') %} {% set name = ''Print'' if file in ['''', none, ''unknown'', ''unavailable''] + else file.split(''/'')[-1].replace(''.gcode'', '''') %} {% set seconds = trigger.to_state.attributes.get(''job_time_s'', + 0) | int(0) %} {{ name }} finished successfully at {{ now().strftime(''%I:%M + %p'').lstrip(''0'') }}. Total time: {% if seconds >= 3600 %}{{ seconds // + 3600 }}h {{ ((seconds % 3600) // 60) }}m {% else %}{{ ((seconds % 3600) // + 60) }}m{% endif %}' + - variables: + sparkx_needs_light: '{{ not is_state(''light.sparkx_i7_light'', ''on'') }}' + bedroom_needs_light: '{{ not is_state(''light.bedroom_lamp_2'', ''on'') }}' + - if: + - condition: template + value_template: '{{ sparkx_needs_light }}' + then: + - action: light.turn_on + continue_on_error: true target: - entity_id: camera.sparkx_i7_printer_camera - - delay: - seconds: 2 - - if: - - condition: template - value_template: "{{ sparkx_needs_light }}" - then: - - action: light.turn_off - continue_on_error: true - target: - entity_id: light.sparkx_i7_light - - if: - - condition: template - value_template: "{{ bedroom_needs_light }}" - then: - - action: light.turn_off - continue_on_error: true - target: - entity_id: light.bedroom_lamp_2 - - action: telegram_bot.send_photo - data: - caption: "{{ completion_message }}" - file: /config/www/sparkx_i7_complete_snapshot.jpg - parse_mode: plain_text + entity_id: light.sparkx_i7_light + - if: + - condition: template + value_template: '{{ bedroom_needs_light }}' + then: + - action: light.turn_on + continue_on_error: true target: - entity_id: notify.franco + entity_id: light.bedroom_lamp_2 + - delay: + seconds: 3 + - action: camera.snapshot + data: + filename: /config/www/sparkx_i7_complete_snapshot.jpg + target: + entity_id: camera.sparkx_i7_printer_camera + - delay: + seconds: 2 + - if: + - condition: template + value_template: '{{ sparkx_needs_light }}' + then: + - action: light.turn_off + continue_on_error: true + target: + entity_id: light.sparkx_i7_light + - if: + - condition: template + value_template: '{{ bedroom_needs_light }}' + then: + - action: light.turn_off + continue_on_error: true + target: + entity_id: light.bedroom_lamp_2 + - action: telegram_bot.send_photo + data: + caption: '{{ completion_message }}' + file: /config/www/sparkx_i7_complete_snapshot.jpg + parse_mode: plain_text + target: + entity_id: notify.franco mode: single -- id: "1787462157568" +- id: '1787462157568' alias: 3D Print Early Layers Snapshot description: Telegram-only snapshots from all 3 printer cameras. Fires at 5%, 25%, 50% and 75% print progress. Lights the SparkX i7 and bedroom lamp only if they are currently off, then restores whatever state they were in before capturing. triggers: - - above: 5 - entity_id: sensor.sparkx_i7_print_progress - trigger: numeric_state - - above: 25 - entity_id: sensor.sparkx_i7_print_progress - trigger: numeric_state - - above: 50 - entity_id: sensor.sparkx_i7_print_progress - trigger: numeric_state - - above: 75 - entity_id: sensor.sparkx_i7_print_progress - trigger: numeric_state + - above: 5 + entity_id: sensor.sparkx_i7_print_progress + trigger: numeric_state + - above: 25 + entity_id: sensor.sparkx_i7_print_progress + trigger: numeric_state + - above: 50 + entity_id: sensor.sparkx_i7_print_progress + trigger: numeric_state + - above: 75 + entity_id: sensor.sparkx_i7_print_progress + trigger: numeric_state conditions: - - condition: state - entity_id: sensor.sparkx_i7_print_status - state: printing + - condition: state + entity_id: sensor.sparkx_i7_print_status + state: printing actions: - - variables: - milestone: "{% set above = trigger.get('above', 0) | int(0) %}{% if above - >= 75 %} 75% complete{% elif above >= 50 %} 50% complete{% elif above >= 25 - %} 25% complete{% elif above >= 5 %} 5% complete{% else %} Print progress - {{ above }}%{% endif %}" - tag: p{{ trigger.get('above', 0) | int(0) }} - - variables: - bedroom_needs_light: "{{ not is_state('light.bedroom_lamp_2', 'on') }}" - message: "{% set file = state_attr('sensor.sparkx_i7_print_status', 'file') - or '' %} {% set name = 'Print' if file in ['', none, 'unknown', 'unavailable'] - else file.split('/')[-1].replace('.gcode', '') %} {% set pct = states('sensor.sparkx_i7_print_progress') - | int(0) %} {% set left = states('sensor.sparkx_i7_print_time_left') | int(0) - %} 3D print · {{ milestone }} · {{ name }} at {{ pct }}%{% if left > 0 %} - · {{ (left // 3600) }}h {{ ((left % 3600) // 60) }}m left{% endif %}" - sparkx_needs_light: "{{ not is_state('light.sparkx_i7_light', 'on') }}" - - if: - - condition: template - value_template: "{{ sparkx_needs_light }}" - then: - - action: light.turn_on - continue_on_error: true - target: - entity_id: light.sparkx_i7_light - - if: - - condition: template - value_template: "{{ bedroom_needs_light }}" - then: - - action: light.turn_on - continue_on_error: true - target: - entity_id: light.bedroom_lamp_2 - - delay: - seconds: 3 - - parallel: - - action: camera.snapshot - data: - filename: /config/www/sparkx_{{ tag }}.jpg - target: - entity_id: camera.sparkx_i7_printer_camera - - action: camera.snapshot - data: - filename: /config/www/ender5_{{ tag }}.jpg - target: - entity_id: camera.endercamera_duckdns_org - - action: camera.snapshot - data: - filename: /config/www/ender_cam2_{{ tag }}.jpg - target: - entity_id: camera.endercamera2_duckdns_org - - delay: - seconds: 2 - - if: - - condition: template - value_template: "{{ sparkx_needs_light }}" - then: - - action: light.turn_off - continue_on_error: true - target: - entity_id: light.sparkx_i7_light - - if: - - condition: template - value_template: "{{ bedroom_needs_light }}" - then: - - action: light.turn_off - continue_on_error: true - target: - entity_id: light.bedroom_lamp_2 - - action: telegram_bot.send_photo - data: - caption: SparkX i7 — {{ message }} - file: /config/www/sparkx_{{ tag }}.jpg - parse_mode: plain_text + - variables: + milestone: '{% set above = trigger.get(''above'', 0) | int(0) %}{% if above + >= 75 %} 75% complete{% elif above >= 50 %} 50% complete{% elif above >= 25 + %} 25% complete{% elif above >= 5 %} 5% complete{% else %} Print progress + {{ above }}%{% endif %}' + tag: p{{ trigger.get('above', 0) | int(0) }} + - variables: + bedroom_needs_light: '{{ not is_state(''light.bedroom_lamp_2'', ''on'') }}' + message: '{% set file = state_attr(''sensor.sparkx_i7_print_status'', ''file'') + or '''' %} {% set name = ''Print'' if file in ['''', none, ''unknown'', ''unavailable''] + else file.split(''/'')[-1].replace(''.gcode'', '''') %} {% set pct = states(''sensor.sparkx_i7_print_progress'') + | int(0) %} {% set left = states(''sensor.sparkx_i7_print_time_left'') | int(0) + %} 3D print · {{ milestone }} · {{ name }} at {{ pct }}%{% if left > 0 %} + · {{ (left // 3600) }}h {{ ((left % 3600) // 60) }}m left{% endif %}' + sparkx_needs_light: '{{ not is_state(''light.sparkx_i7_light'', ''on'') }}' + - if: + - condition: template + value_template: '{{ sparkx_needs_light }}' + then: + - action: light.turn_on + continue_on_error: true target: - entity_id: notify.franco - - action: telegram_bot.send_photo - data: - caption: Back Camera — {{ message }} - file: /config/www/ender5_{{ tag }}.jpg - parse_mode: plain_text + entity_id: light.sparkx_i7_light + - if: + - condition: template + value_template: '{{ bedroom_needs_light }}' + then: + - action: light.turn_on + continue_on_error: true target: - entity_id: notify.franco - - action: telegram_bot.send_photo + entity_id: light.bedroom_lamp_2 + - delay: + seconds: 3 + - parallel: + - action: camera.snapshot data: - caption: Bed Camera — {{ message }} - file: /config/www/ender_cam2_{{ tag }}.jpg - parse_mode: plain_text + filename: /config/www/sparkx_{{ tag }}.jpg target: - entity_id: notify.franco + entity_id: camera.sparkx_i7_printer_camera + - action: camera.snapshot + data: + filename: /config/www/ender5_{{ tag }}.jpg + target: + entity_id: camera.endercamera_duckdns_org + - action: camera.snapshot + data: + filename: /config/www/ender_cam2_{{ tag }}.jpg + target: + entity_id: camera.endercamera2_duckdns_org + - delay: + seconds: 2 + - if: + - condition: template + value_template: '{{ sparkx_needs_light }}' + then: + - action: light.turn_off + continue_on_error: true + target: + entity_id: light.sparkx_i7_light + - if: + - condition: template + value_template: '{{ bedroom_needs_light }}' + then: + - action: light.turn_off + continue_on_error: true + target: + entity_id: light.bedroom_lamp_2 + - action: telegram_bot.send_photo + data: + caption: SparkX i7 — {{ message }} + file: /config/www/sparkx_{{ tag }}.jpg + parse_mode: plain_text + target: + entity_id: notify.franco + - action: telegram_bot.send_photo + data: + caption: Back Camera — {{ message }} + file: /config/www/ender5_{{ tag }}.jpg + parse_mode: plain_text + target: + entity_id: notify.franco + - action: telegram_bot.send_photo + data: + caption: Bed Camera — {{ message }} + file: /config/www/ender_cam2_{{ tag }}.jpg + parse_mode: plain_text + target: + entity_id: notify.franco max: 4 mode: parallel -- id: "1787530101996" - alias: "Alert: Thread node offline" - description: "Early warning when a Matter-over-Thread device loses its mesh attachment +- id: '1787530101996' + alias: 'Alert: Thread node offline' + description: 'Early warning when a Matter-over-Thread device loses its mesh attachment behind the Google TV Streamer border router. The six Thread nodes die in waves - when the Streamer's Thread stack wedges; this pings Franco's phone within ~3 + when the Streamer''s Thread stack wedges; this pings Franco''s phone within ~3 minutes of the first drop instead of hours later. Recovery procedure: cold-boot - (unplug ~30s) the TV Streamer - see decision note 2026-08-23-thread-outage-fix-cold-boot-google-tv-2." + (unplug ~30s) the TV Streamer - see decision note 2026-08-23-thread-outage-fix-cold-boot-google-tv-2.' triggers: - - entity_id: - - light.bedroom_lamp_2 - - light.office_lamp_2 - - sensor.bedroom_switch_battery - for: - minutes: 3 - to: unavailable - trigger: state + - entity_id: + - light.bedroom_lamp_2 + - light.office_lamp_2 + - sensor.bedroom_switch_battery + for: + minutes: 3 + to: unavailable + trigger: state actions: - - action: notify.mobile_app_sm_f956w - data: - message: "{{ ['light.bedroom_lamp_2', 'light.office_lamp_2', 'sensor.bedroom_switch_battery'] - | select('is_state', 'unavailable') | join(', ') }} lost the mesh. Fix: - unplug/replug the TV Streamer." - title: Thread node offline + - action: notify.mobile_app_sm_f956w + data: + message: '{{ [''light.bedroom_lamp_2'', ''light.office_lamp_2'', ''sensor.bedroom_switch_battery''] + | select(''is_state'', ''unavailable'') | join('', '') }} lost the mesh. Fix: + unplug/replug the TV Streamer.' + title: Thread node offline max_exceeded: silent mode: single -- id: "1787723383610" +- id: '1787723383610' alias: 3D Printer Lights Control - Scroll Wheel description: Controls the SparkX i7 light, local 3D printer light, and bedroom lamp from the 3D printer scroll wheel. Right-scroll turns lights on; left-scroll turns @@ -3718,64 +3716,20 @@ use_blueprint: input: click_action_ch1: - - choose: - - conditions: - - condition: state - entity_id: light.sparkx_i7_light - state: "on" - sequence: - - action: light.turn_off - target: - entity_id: light.sparkx_i7_light - - action: light.turn_off - continue_on_error: true - target: - entity_id: light.3d_printer_lights_local - default: - - action: light.turn_on - target: - entity_id: light.sparkx_i7_light - - action: light.turn_on - continue_on_error: true - target: - entity_id: light.3d_printer_lights_local - click_action_ch2: - - else: - - action: light.turn_on - target: - entity_id: light.sparkx_i7_light - - action: light.turn_on - continue_on_error: true - target: - entity_id: light.3d_printer_lights_local - - action: light.turn_on - target: - entity_id: light.bedroom_lamp_2 - if: - - condition: or - conditions: - - condition: state - entity_id: light.sparkx_i7_light - state: "on" - - condition: state - entity_id: light.3d_printer_lights_local - state: "on" - - condition: state - entity_id: light.bedroom_lamp_2 - state: "on" - then: - - action: light.turn_off - target: - entity_id: light.sparkx_i7_light - - action: light.turn_off - continue_on_error: true - target: - entity_id: light.3d_printer_lights_local - - action: light.turn_off - target: - entity_id: light.bedroom_lamp_2 - click_action_ch3: [] - double_click_action_ch1: + - choose: + - conditions: + - condition: state + entity_id: light.sparkx_i7_light + state: 'on' + sequence: + - action: light.turn_off + target: + entity_id: light.sparkx_i7_light + - action: light.turn_off + continue_on_error: true + target: + entity_id: light.3d_printer_lights_local + default: - action: light.turn_on target: entity_id: light.sparkx_i7_light @@ -3783,6 +3737,50 @@ continue_on_error: true target: entity_id: light.3d_printer_lights_local + click_action_ch2: + - else: + - action: light.turn_on + target: + entity_id: light.sparkx_i7_light + - action: light.turn_on + continue_on_error: true + target: + entity_id: light.3d_printer_lights_local + - action: light.turn_on + target: + entity_id: light.bedroom_lamp_2 + if: + - condition: or + conditions: + - condition: state + entity_id: light.sparkx_i7_light + state: 'on' + - condition: state + entity_id: light.3d_printer_lights_local + state: 'on' + - condition: state + entity_id: light.bedroom_lamp_2 + state: 'on' + then: + - action: light.turn_off + target: + entity_id: light.sparkx_i7_light + - action: light.turn_off + continue_on_error: true + target: + entity_id: light.3d_printer_lights_local + - action: light.turn_off + target: + entity_id: light.bedroom_lamp_2 + click_action_ch3: [] + double_click_action_ch1: + - action: light.turn_on + target: + entity_id: light.sparkx_i7_light + - action: light.turn_on + continue_on_error: true + target: + entity_id: light.3d_printer_lights_local double_click_action_ch2: [] long_click_action_ch1: [] long_click_action_ch2: [] @@ -3798,302 +3796,302 @@ scroll_wheel_target_ch2: [] scroll_wheel_target_ch3: [] scroll_wheel_user_action_ch1: - - choose: - - conditions: - - condition: template - value_template: "{{ scroll_direction == 'right' }}" - sequence: - - action: light.turn_on - target: - entity_id: light.sparkx_i7_light - - action: light.turn_on - continue_on_error: true - target: - entity_id: light.3d_printer_lights_local - - conditions: - - condition: template - value_template: "{{ scroll_direction == 'left' }}" - sequence: - - action: light.turn_off - target: - entity_id: light.sparkx_i7_light - - action: light.turn_off - continue_on_error: true - target: - entity_id: light.3d_printer_lights_local + - choose: + - conditions: + - condition: template + value_template: '{{ scroll_direction == ''right'' }}' + sequence: + - action: light.turn_on + target: + entity_id: light.sparkx_i7_light + - action: light.turn_on + continue_on_error: true + target: + entity_id: light.3d_printer_lights_local + - conditions: + - condition: template + value_template: '{{ scroll_direction == ''left'' }}' + sequence: + - action: light.turn_off + target: + entity_id: light.sparkx_i7_light + - action: light.turn_off + continue_on_error: true + target: + entity_id: light.3d_printer_lights_local scroll_wheel_user_action_ch2: - - choose: - - conditions: - - condition: template - value_template: "{{ scroll_direction == 'right' }}" - sequence: - - action: light.turn_on - target: - entity_id: light.sparkx_i7_light - - action: light.turn_on - continue_on_error: true - target: - entity_id: light.3d_printer_lights_local - - action: light.turn_on - target: - entity_id: light.bedroom_lamp_2 - - conditions: - - condition: template - value_template: "{{ scroll_direction == 'left' }}" - sequence: - - action: light.turn_off - target: - entity_id: light.sparkx_i7_light - - action: light.turn_off - continue_on_error: true - target: - entity_id: light.3d_printer_lights_local - - action: light.turn_off - target: - entity_id: light.bedroom_lamp_2 + - choose: + - conditions: + - condition: template + value_template: '{{ scroll_direction == ''right'' }}' + sequence: + - action: light.turn_on + target: + entity_id: light.sparkx_i7_light + - action: light.turn_on + continue_on_error: true + target: + entity_id: light.3d_printer_lights_local + - action: light.turn_on + target: + entity_id: light.bedroom_lamp_2 + - conditions: + - condition: template + value_template: '{{ scroll_direction == ''left'' }}' + sequence: + - action: light.turn_off + target: + entity_id: light.sparkx_i7_light + - action: light.turn_off + continue_on_error: true + target: + entity_id: light.3d_printer_lights_local + - action: light.turn_off + target: + entity_id: light.bedroom_lamp_2 path: jhol-byte/Ikea_bilresa_scroll_wheel.yaml -- id: "1787723814939" +- id: '1787723814939' alias: 3D Printer Lights - Toggle from Boolean description: Turns the SparkX i7 light and local 3D printer light on or off when input_boolean.3d_printer_lights changes. triggers: - - entity_id: input_boolean.3d_printer_lights - trigger: state + - entity_id: input_boolean.3d_printer_lights + trigger: state actions: - - else: - - action: light.turn_off - target: - entity_id: light.sparkx_i7_light - - action: light.turn_off - continue_on_error: true - target: - entity_id: light.3d_printer_lights_local - if: - - condition: state - entity_id: input_boolean.3d_printer_lights - state: "on" - then: - - action: light.turn_on - target: - entity_id: light.sparkx_i7_light - - action: light.turn_on - continue_on_error: true - target: - entity_id: light.3d_printer_lights_local - mode: single -- id: "1787723854939" - alias: 3D Printer Lights - Sync Boolean - description: Keeps the SparkX and local printer lights aligned when either light - is manually turned on or off. Brightness and color-only updates are ignored. - triggers: - - entity_id: light.sparkx_i7_light - from: "off" - id: sparkx_on - to: "on" - trigger: state - - entity_id: light.sparkx_i7_light - from: "on" - id: sparkx_off - to: "off" - trigger: state - - entity_id: light.3d_printer_lights_local - from: "off" - id: local_on - to: "on" - trigger: state - - entity_id: light.3d_printer_lights_local - from: "on" - id: local_off - to: "off" - trigger: state - - event: start - id: ha_start - trigger: homeassistant - actions: - - choose: - - conditions: - - condition: trigger - id: - - sparkx_on - - local_on - sequence: - - action: light.turn_on - continue_on_error: true - target: - entity_id: - - light.sparkx_i7_light - - light.3d_printer_lights_local - - conditions: - - condition: trigger - id: - - sparkx_off - - local_off - sequence: - - action: light.turn_off - continue_on_error: true - target: - entity_id: - - light.sparkx_i7_light - - light.3d_printer_lights_local - - conditions: - - condition: trigger - id: ha_start - sequence: - - delay: - seconds: 15 - - if: - - condition: or - conditions: - - condition: state - entity_id: light.sparkx_i7_light - state: "on" - - condition: state - entity_id: light.3d_printer_lights_local - state: "on" - then: - - action: light.turn_on - continue_on_error: true - target: - entity_id: - - light.sparkx_i7_light - - light.3d_printer_lights_local - mode: single -- id: "1787790202454" - alias: Z2M Error Monitor - description: Notifies when Zigbee2MQTT logs an error - triggers: - - trigger: mqtt - topic: zigbee2mqtt/bridge/logging - conditions: - - condition: template - value_template: "{{ trigger.payload_json.level == 'error' }}" - actions: - - action: notify.notify - data: - title: Z2M Error - message: "{{ trigger.payload_json.message }}" - mode: single -- id: "1787941729593" - alias: Filter plug health alert - description: Notify (mobile push + persistent notification) when the Filter plug - goes unavailable for 2+ minutes. - triggers: - - trigger: state - entity_id: switch.filter - to: unavailable - for: - minutes: 2 - id: offline - actions: - - choose: - - conditions: - - condition: trigger - id: offline - sequence: - - action: notify.notify - data: - title: Filter plug offline - message: Filter plug offline - unavailable for 2+ minutes. Check the plug. - - action: notify.persistent_notification - data: - title: Filter plug offline - message: Filter plug offline - unavailable for 2+ minutes. Check the plug. - mode: single -- id: "1789399923492" - alias: 3D Printer Running - Reconcile on HA Start - description: When Home Assistant starts during an active SparkX i7 print, re-apply - the print-started actions for both printer lights, the bedroom, basement heat, - and filter after devices settle. - triggers: - - event: start - trigger: homeassistant - conditions: + - else: + - action: light.turn_off + target: + entity_id: light.sparkx_i7_light + - action: light.turn_off + continue_on_error: true + target: + entity_id: light.3d_printer_lights_local + if: - condition: state - entity_id: input_boolean.3d_printer_running - state: "on" - - condition: template - value_template: "{{ states('sensor.sparkx_i7_print_status') in ['printing', - 'paused'] }}" - actions: - - delay: - seconds: 15 + entity_id: input_boolean.3d_printer_lights + state: 'on' + then: - action: light.turn_on target: entity_id: light.sparkx_i7_light - action: light.turn_on continue_on_error: true - data: - brightness_pct: 100 - rgb_color: - - 255 - - 255 - - 255 target: entity_id: light.3d_printer_lights_local - - action: light.turn_on - data: - brightness_pct: 100 - target: - entity_id: light.bedroom_lamp_2 - - action: climate.set_temperature - data: - hvac_mode: heat - temperature: 22 - target: - entity_id: climate.basement - - action: switch.turn_on - target: - entity_id: switch.filter mode: single -- id: "1789655883265" +- id: '1787723854939' + alias: 3D Printer Lights - Sync Boolean + description: Keeps the SparkX and local printer lights aligned when either light + is manually turned on or off. Brightness and color-only updates are ignored. + triggers: + - entity_id: light.sparkx_i7_light + from: 'off' + id: sparkx_on + to: 'on' + trigger: state + - entity_id: light.sparkx_i7_light + from: 'on' + id: sparkx_off + to: 'off' + trigger: state + - entity_id: light.3d_printer_lights_local + from: 'off' + id: local_on + to: 'on' + trigger: state + - entity_id: light.3d_printer_lights_local + from: 'on' + id: local_off + to: 'off' + trigger: state + - event: start + id: ha_start + trigger: homeassistant + actions: + - choose: + - conditions: + - condition: trigger + id: + - sparkx_on + - local_on + sequence: + - action: light.turn_on + continue_on_error: true + target: + entity_id: + - light.sparkx_i7_light + - light.3d_printer_lights_local + - conditions: + - condition: trigger + id: + - sparkx_off + - local_off + sequence: + - action: light.turn_off + continue_on_error: true + target: + entity_id: + - light.sparkx_i7_light + - light.3d_printer_lights_local + - conditions: + - condition: trigger + id: ha_start + sequence: + - delay: + seconds: 15 + - if: + - condition: or + conditions: + - condition: state + entity_id: light.sparkx_i7_light + state: 'on' + - condition: state + entity_id: light.3d_printer_lights_local + state: 'on' + then: + - action: light.turn_on + continue_on_error: true + target: + entity_id: + - light.sparkx_i7_light + - light.3d_printer_lights_local + mode: single +- id: '1787790202454' + alias: Z2M Error Monitor + description: Notifies when Zigbee2MQTT logs an error + triggers: + - trigger: mqtt + topic: zigbee2mqtt/bridge/logging + conditions: + - condition: template + value_template: '{{ trigger.payload_json.level == ''error'' }}' + actions: + - action: notify.notify + data: + title: Z2M Error + message: '{{ trigger.payload_json.message }}' + mode: single +- id: '1787941729593' + alias: Filter plug health alert + description: Notify (mobile push + persistent notification) when the Filter plug + goes unavailable for 2+ minutes. + triggers: + - trigger: state + entity_id: switch.filter + to: unavailable + for: + minutes: 2 + id: offline + actions: + - choose: + - conditions: + - condition: trigger + id: offline + sequence: + - action: notify.notify + data: + title: Filter plug offline + message: Filter plug offline - unavailable for 2+ minutes. Check the plug. + - action: notify.persistent_notification + data: + title: Filter plug offline + message: Filter plug offline - unavailable for 2+ minutes. Check the plug. + mode: single +- id: '1789399923492' + alias: 3D Printer Running - Reconcile on HA Start + description: When Home Assistant starts during an active SparkX i7 print, re-apply + the print-started actions for both printer lights, the bedroom, basement heat, + and filter after devices settle. + triggers: + - event: start + trigger: homeassistant + conditions: + - condition: state + entity_id: input_boolean.3d_printer_running + state: 'on' + - condition: template + value_template: '{{ states(''sensor.sparkx_i7_print_status'') in [''printing'', + ''paused''] }}' + actions: + - delay: + seconds: 15 + - action: light.turn_on + target: + entity_id: light.sparkx_i7_light + - action: light.turn_on + continue_on_error: true + data: + brightness_pct: 100 + rgb_color: + - 255 + - 255 + - 255 + target: + entity_id: light.3d_printer_lights_local + - action: light.turn_on + data: + brightness_pct: 100 + target: + entity_id: light.bedroom_lamp_2 + - action: climate.set_temperature + data: + hvac_mode: heat + temperature: 22 + target: + entity_id: climate.basement + - action: switch.turn_on + target: + entity_id: switch.filter + mode: single +- id: '1789655883265' alias: 3D Printer Running - Reset Stale Boolean description: If input_boolean.3d_printer_running is commanded on while already on (e.g. after a printer crash left it on, so no off->on transition fires the main automation), force a quick off->on bounce so the main automation runs its print-started actions. The >5s stale check prevents responding to its own bounce. triggers: - - event_data: - domain: input_boolean - service: turn_on - event_type: call_service - id: cmd_on - trigger: event + - event_data: + domain: input_boolean + service: turn_on + event_type: call_service + id: cmd_on + trigger: event conditions: - - condition: state - entity_id: input_boolean.3d_printer_running - state: "on" - - condition: template - value_template: "{% set sd = trigger.event.data.get('service_data', {}) %} + - condition: state + entity_id: input_boolean.3d_printer_running + state: 'on' + - condition: template + value_template: '{% set sd = trigger.event.data.get(''service_data'', {}) %} - {% set eid = sd.get('entity_id') %} + {% set eid = sd.get(''entity_id'') %} - {% set tgt = sd.get('target', {}) if sd else {} %} + {% set tgt = sd.get(''target'', {}) if sd else {} %} - {% set tid = tgt.get('entity_id') %} + {% set tid = tgt.get(''entity_id'') %} - {% set ns = namespace(hits=[]) %} + {% set ns = namespace(hits=[]) %} - {% for item in [eid, tid] if item %} + {% for item in [eid, tid] if item %} - {% if item is string %}{% set ns.hits = ns.hits + [item] %}{% elif item is sequence - %}{% set ns.hits = ns.hits + item %}{% endif %} + {% if item is string %}{% set ns.hits = ns.hits + [item] %}{% elif item is sequence + %}{% set ns.hits = ns.hits + item %}{% endif %} - {% endfor %} + {% endfor %} - {{ 'input_boolean.3d_printer_running' in ns.hits and (now() - states['input_boolean.3d_printer_running'].last_changed).total_seconds() - > 5 }}" + {{ ''input_boolean.3d_printer_running'' in ns.hits and (now() - states[''input_boolean.3d_printer_running''].last_changed).total_seconds() + > 5 }}' actions: - - action: input_boolean.turn_off - target: - entity_id: input_boolean.3d_printer_running - - delay: - seconds: 2 - - action: input_boolean.turn_on - target: - entity_id: input_boolean.3d_printer_running + - action: input_boolean.turn_off + target: + entity_id: input_boolean.3d_printer_running + - delay: + seconds: 2 + - action: input_boolean.turn_on + target: + entity_id: input_boolean.3d_printer_running mode: single -- id: "1771000000001" - alias: "3D PRINTER: IKEA BILRESA E2489 Dual Button (Matter) - Cancel & Park" +- id: '1771000000001' + alias: '3D PRINTER: IKEA BILRESA E2489 Dual Button (Matter) - Cancel & Park' description: Legacy alias retained for entity stability. Button 1 stops the active SparkX i7 print, waits 5 seconds, then homes XY/Z as the closest available replacement for parking. @@ -4101,10 +4099,10 @@ input: button1_event: event.3d_printer_control_button_1 button1_single: - - action: button.press - target: - entity_id: button.sparkx_i7_stop_print - data: {} + - action: button.press + target: + entity_id: button.sparkx_i7_stop_print + data: {} button2_event: event.3d_printer_control_button_2 target_device: c2a0b26ffccdfc1fcde0c1b4700d1d0f path: censay/ikea-bilresa-e2489-matter-smart-button.yaml @@ -4114,265 +4112,361 @@ running helper without retriggering the helper when it is already in the desired state. triggers: - - entity_id: sensor.sparkx_i7_print_status - from: - - idle - - self-testing - - completed - - stopped - - error - - processing - - unknown - - "off" - id: print_started - to: printing - trigger: state - - entity_id: sensor.sparkx_i7_print_status - from: - - printing - - paused - id: print_stopped - to: - - completed - - stopped - - error - - idle - - processing - - self-testing - - "off" - - unknown - trigger: state - - event: start - id: ha_start - trigger: homeassistant + - entity_id: sensor.sparkx_i7_print_status + from: + - idle + - self-testing + - completed + - stopped + - error + - processing + - unknown + - 'off' + id: print_started + to: printing + trigger: state + - entity_id: sensor.sparkx_i7_print_status + from: + - printing + - paused + id: print_stopped + to: + - completed + - stopped + - error + - idle + - processing + - self-testing + - 'off' + - unknown + trigger: state + - event: start + id: ha_start + trigger: homeassistant conditions: [] actions: - - choose: + - choose: + - conditions: + - condition: trigger + id: print_started + sequence: + - if: + - condition: state + entity_id: input_boolean.3d_printer_running + state: 'off' + then: + - action: input_boolean.turn_on + target: + entity_id: input_boolean.3d_printer_running + - conditions: + - condition: trigger + id: print_stopped + sequence: + - if: + - condition: state + entity_id: input_boolean.3d_printer_running + state: 'on' + then: + - action: input_boolean.turn_off + target: + entity_id: input_boolean.3d_printer_running + - conditions: + - condition: trigger + id: ha_start + sequence: + - delay: + seconds: 20 + - choose: - conditions: - - condition: trigger - id: print_started + - condition: state + entity_id: sensor.sparkx_i7_print_status + state: printing sequence: - - if: - - condition: state - entity_id: input_boolean.3d_printer_running - state: "off" - then: - - action: input_boolean.turn_on - target: - entity_id: input_boolean.3d_printer_running + - if: + - condition: state + entity_id: input_boolean.3d_printer_running + state: 'off' + then: + - action: input_boolean.turn_on + target: + entity_id: input_boolean.3d_printer_running - conditions: - - condition: trigger - id: print_stopped + - condition: template + value_template: '{{ states(''sensor.sparkx_i7_print_status'') in [''completed'', + ''stopped'', ''error'', ''idle'', ''processing'', ''self-testing'', + ''off'', ''unknown''] }}' sequence: - - if: - - condition: state - entity_id: input_boolean.3d_printer_running - state: "on" - then: - - action: input_boolean.turn_off - target: - entity_id: input_boolean.3d_printer_running - - conditions: - - condition: trigger - id: ha_start - sequence: - - delay: - seconds: 20 - - choose: - - conditions: - - condition: state - entity_id: sensor.sparkx_i7_print_status - state: printing - sequence: - - if: - - condition: state - entity_id: input_boolean.3d_printer_running - state: "off" - then: - - action: input_boolean.turn_on - target: - entity_id: input_boolean.3d_printer_running - - conditions: - - condition: template - value_template: "{{ states('sensor.sparkx_i7_print_status') in ['completed', - 'stopped', 'error', 'idle', 'processing', 'self-testing', - 'off', 'unknown'] }}" - sequence: - - if: - - condition: state - entity_id: input_boolean.3d_printer_running - state: "on" - then: - - action: input_boolean.turn_off - target: - entity_id: input_boolean.3d_printer_running + - if: + - condition: state + entity_id: input_boolean.3d_printer_running + state: 'on' + then: + - action: input_boolean.turn_off + target: + entity_id: input_boolean.3d_printer_running mode: single -- id: "1789900000001" +- id: '1789900000001' alias: 3D Print - Safe to Remove description: After a successful SparkX i7 print, wait for the bed and nozzle to stay at or below 35 degrees for 5 minutes, then notify all existing print devices. triggers: - - entity_id: sensor.sparkx_i7_print_status - from: printing - id: print_completed - to: completed - trigger: state - - entity_id: sensor.sparkx_i7_print_status - id: new_print - to: printing - trigger: state + - entity_id: sensor.sparkx_i7_print_status + from: printing + id: print_completed + to: completed + trigger: state + - entity_id: sensor.sparkx_i7_print_status + id: new_print + to: printing + trigger: state actions: - - choose: - - conditions: - - condition: trigger - id: print_completed + - choose: + - conditions: + - condition: trigger + id: print_completed + sequence: + - variables: + print_name: '{% set file = trigger.to_state.attributes.get(''file'', '''') + %} {% if file in ['''', none, ''unknown'', ''unavailable''] %}The print + {% else %}{{ file.split(''/'')[-1].replace(''.gcode'', '''') }} {% endif + %}' + - repeat: sequence: + - continue_on_timeout: false + timeout: 02:00:00 + wait_template: '{{ is_state(''sensor.sparkx_i7_print_status'', ''completed'') + and states(''sensor.sparkx_i7_bed_temperature'') | float(100) <= 35 + and states(''sensor.sparkx_i7_nozzle_temperature'') | float(300) <= + 35 }}' + - delay: + minutes: 5 + - if: + - condition: template + value_template: '{{ is_state(''sensor.sparkx_i7_print_status'', ''completed'') + and states(''sensor.sparkx_i7_bed_temperature'') | float(100) <= 35 + and states(''sensor.sparkx_i7_nozzle_temperature'') | float(300) <= + 35 }}' + then: - variables: - print_name: "{% set file = trigger.to_state.attributes.get('file', '') - %} {% if file in ['', none, 'unknown', 'unavailable'] %}The print - {% else %}{{ file.split('/')[-1].replace('.gcode', '') }} {% endif - %}" - - repeat: - sequence: - - continue_on_timeout: false - timeout: 02:00:00 - wait_template: "{{ is_state('sensor.sparkx_i7_print_status', 'completed') - and states('sensor.sparkx_i7_bed_temperature') | float(100) <= 35 - and states('sensor.sparkx_i7_nozzle_temperature') | float(300) <= - 35 }}" - - delay: - minutes: 5 - - if: - - condition: template - value_template: "{{ is_state('sensor.sparkx_i7_print_status', 'completed') - and states('sensor.sparkx_i7_bed_temperature') | float(100) <= 35 - and states('sensor.sparkx_i7_nozzle_temperature') | float(300) <= - 35 }}" - then: - - variables: - bed_temp: "{{ states('sensor.sparkx_i7_bed_temperature') | float(0) - | round(1) }}" - nozzle_temp: "{{ states('sensor.sparkx_i7_nozzle_temperature') | - float(0) | round(1) }}" - safe_message: "{{ print_name }} is cool enough to remove. Bed: {{ - bed_temp }} °C, nozzle: {{ nozzle_temp }} °C." - - action: notify.send_message - data: - message: "{{ safe_message }}" - title: 3D print safe to remove - target: - entity_id: notify.sm_f956w - - action: notify.send_message - data: - message: "{{ safe_message }}" - title: 3D print safe to remove - target: - entity_id: notify.motorola_one_vision - - action: notify.send_message - data: - message: "{{ safe_message }}" - title: 3D print safe to remove - target: - entity_id: notify.francos_ipad - - action: notify.send_message - data: - message: "{{ safe_message }}" - title: 3D print safe to remove - target: - entity_id: notify.sm_t387w - - action: notify.send_message - data: - message: "{{ safe_message }}" - title: 3D print safe to remove - target: - entity_id: notify.franco - - stop: Safe-to-remove notification sent. - while: - - condition: template - value_template: "{{ is_state('sensor.sparkx_i7_print_status', 'completed') - }}" + bed_temp: '{{ states(''sensor.sparkx_i7_bed_temperature'') | float(0) + | round(1) }}' + nozzle_temp: '{{ states(''sensor.sparkx_i7_nozzle_temperature'') | + float(0) | round(1) }}' + safe_message: '{{ print_name }} is cool enough to remove. Bed: {{ + bed_temp }} °C, nozzle: {{ nozzle_temp }} °C.' + - action: notify.send_message + data: + message: '{{ safe_message }}' + title: 3D print safe to remove + target: + entity_id: notify.sm_f956w + - action: notify.send_message + data: + message: '{{ safe_message }}' + title: 3D print safe to remove + target: + entity_id: notify.motorola_one_vision + - action: notify.send_message + data: + message: '{{ safe_message }}' + title: 3D print safe to remove + target: + entity_id: notify.francos_ipad + - action: notify.send_message + data: + message: '{{ safe_message }}' + title: 3D print safe to remove + target: + entity_id: notify.sm_t387w + - action: notify.send_message + data: + message: '{{ safe_message }}' + title: 3D print safe to remove + target: + entity_id: notify.franco + - stop: Safe-to-remove notification sent. + while: + - condition: template + value_template: '{{ is_state(''sensor.sparkx_i7_print_status'', ''completed'') + }}' mode: restart - id: sparkx_i7_cfs_auto_recover alias: SparkX i7 - CFS Info Auto Recover - description: "The ha_creality_ws integration drops its CFS sensors to unavailable + description: 'The ha_creality_ws integration drops its CFS sensors to unavailable whenever the integration is reloaded, and they only come back when the printer is asked. A state trigger only fires on the transition, so this retries the recovery rather than relying on a single attempt: up to 3 tries spaced 2 minutes apart, - then it gives up and writes a logbook entry instead of retrying forever." + then it gives up and writes a logbook entry instead of retrying forever.' triggers: - - entity_id: sensor.sparkx_i7_cfs_box_1_temperature - id: cfs_unavailable - to: unavailable - trigger: state - - event: start - id: ha_start - trigger: homeassistant + - entity_id: sensor.sparkx_i7_cfs_box_1_temperature + id: cfs_unavailable + to: unavailable + trigger: state + - event: start + id: ha_start + trigger: homeassistant conditions: [] actions: - - choose: - - conditions: - - condition: trigger - id: cfs_unavailable - sequence: - - delay: - minutes: 2 - - conditions: - - condition: trigger - id: ha_start - sequence: - - delay: - seconds: 60 - - repeat: - count: 3 - sequence: - - else: [] - if: - - condition: template - value_template: "{{ is_state('sensor.sparkx_i7_cfs_box_1_temperature', - 'unavailable') }}" - then: - - action: ha_creality_ws.request_cfs_info - target: - device_id: 1196bfc60ac925f3874be27098978ef6 - - delay: - seconds: 30 - - if: + - choose: + - conditions: + - condition: trigger + id: cfs_unavailable + sequence: + - delay: + minutes: 2 + - conditions: + - condition: trigger + id: ha_start + sequence: + - delay: + seconds: 60 + - repeat: + count: 3 + sequence: + - else: [] + if: - condition: template - value_template: "{{ is_state('sensor.sparkx_i7_cfs_box_1_temperature', 'unavailable') - }}" - then: - - action: logbook.log - data: - entity_id: sensor.sparkx_i7_cfs_box_1_temperature - message: CFS info still unavailable after 3 recovery attempts; giving up until - the next state change - name: SparkX i7 CFS + value_template: '{{ is_state(''sensor.sparkx_i7_cfs_box_1_temperature'', + ''unavailable'') }}' + then: + - action: ha_creality_ws.request_cfs_info + target: + device_id: 1196bfc60ac925f3874be27098978ef6 + - delay: + seconds: 30 + - if: + - condition: template + value_template: '{{ is_state(''sensor.sparkx_i7_cfs_box_1_temperature'', ''unavailable'') + }}' + then: + - action: logbook.log + data: + entity_id: sensor.sparkx_i7_cfs_box_1_temperature + message: CFS info still unavailable after 3 recovery attempts; giving up until + the next state change + name: SparkX i7 CFS mode: single -- id: "1790973987624" +- id: '1790973987624' alias: CFS Box 1 - Desiccant Pack Due - description: "Notify when the SparkX i7 CFS box 1 humidity stays at or above 34% + description: 'Notify when the SparkX i7 CFS box 1 humidity stays at or above 34% for 60 minutes, meaning the desiccant pack needs replacing. The short spikes - that happen when the box is opened to swap a filament never last that long." + that happen when the box is opened to swap a filament never last that long.' triggers: - - above: 33.9 - entity_id: sensor.sparkx_i7_cfs_box_1_humidity - for: - minutes: 60 - trigger: numeric_state + - above: 33.9 + entity_id: sensor.sparkx_i7_cfs_box_1_humidity + for: + minutes: 60 + trigger: numeric_state actions: - - action: notify.notify - data: - message: CFS box 1 humidity has been {{ reading }}% or higher for 60 minutes - (threshold 34%). Time to replace the desiccant pack. - title: "CFS Box 1: replace desiccant pack" - - action: notify.persistent_notification - data: - message: CFS box 1 humidity has been {{ reading }}% or higher for 60 minutes - (threshold 34%). Time to replace the desiccant pack. - title: "CFS Box 1: replace desiccant pack" + - action: notify.notify + data: + message: CFS box 1 humidity has been {{ reading }}% or higher for 60 minutes + (threshold 34%). Time to replace the desiccant pack. + title: 'CFS Box 1: replace desiccant pack' + - action: notify.persistent_notification + data: + message: CFS box 1 humidity has been {{ reading }}% or higher for 60 minutes + (threshold 34%). Time to replace the desiccant pack. + title: 'CFS Box 1: replace desiccant pack' mode: single variables: - reading: "{{ states('sensor.sparkx_i7_cfs_box_1_humidity') | float | round(0) - | int }}" + reading: '{{ states(''sensor.sparkx_i7_cfs_box_1_humidity'') | float | round(0) + | int }}' +- 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: template + value_template: '{{ states(''sensor.sparkx_i7_filament_weight_estimated'') | float(0) + > 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 — 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 — 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 — nothing deducted.' + mode: single +- id: '1791477238762' + alias: SparkX i7 - Latch print spool for Spoolman + triggers: + - trigger: state + entity_id: sensor.sparkx_i7_print_status + to: printing + - trigger: state + entity_id: sensor.sparkx_i7_active_filament_slot + - trigger: state + entity_id: + - sensor.sparkx_i7_cfs_box_1_slot_1_color + - sensor.sparkx_i7_cfs_box_1_slot_2_color + - sensor.sparkx_i7_cfs_box_1_slot_3_color + - sensor.sparkx_i7_cfs_box_1_slot_4_color + conditions: + - condition: state + entity_id: sensor.sparkx_i7_print_status + state: printing + actions: + - choose: + - conditions: + condition: template + value_template: '{{ trigger.entity_id == ''sensor.sparkx_i7_print_status'' + }}' + sequence: + - action: input_text.set_value + target: + entity_id: input_text.sparkx_i7_print_spool_latch + data: + value: '' + - variables: + spool_id: "{%- set slot = states('sensor.sparkx_i7_active_filament_slot') -%}\n{%- + set ce = 'sensor.sparkx_i7_cfs_' ~ (slot | lower | replace(' ', '_')) ~ '_color' + -%}\n{%- set color = states(ce) | replace('#', '') | lower -%}\n{%- set ns + = namespace(id = '') -%}\n{%- for e in integration_entities('spoolman') -%}\n + \ {%- if e.endswith('_color_hex') and (states(e) | lower) == color -%}\n {%- + set ns.id = states(e[:-10] ~ '_id') -%}\n {%- endif -%}\n{%- endfor -%}\n{{ + ns.id }}" + - condition: template + value_template: '{{ spool_id not in ['''', ''unknown'', ''unavailable''] }}' + - action: input_text.set_value + target: + entity_id: input_text.sparkx_i7_print_spool_latch + data: + value: '{{ spool_id }}' + mode: single diff --git a/zigbee2mqtt/state.json b/zigbee2mqtt/state.json index 012867c8..b697f28e 100644 --- a/zigbee2mqtt/state.json +++ b/zigbee2mqtt/state.json @@ -45,10 +45,10 @@ "state": "ON", "led_brightness": 100, "countdown_to_turn_off": 0, - "voltage": 118.8, + "voltage": 118.1, "countdown_to_turn_on": 0, - "energy": 103.62, - "power_factor": 0.2, + "energy": 103.63, + "power_factor": 0.9, "ac_frequency": 60, "update": { "state": "idle", @@ -58,8 +58,8 @@ "latest_release_notes": null }, "linkquality": 145, - "power": 1.7, - "current": 0.1, + "power": 87.9, + "current": 0.85, "power_on_behavior": "on" }, "0xb40e060fffe031e3": { @@ -77,9 +77,9 @@ "voltage": 117.8, "state": "ON", "ac_frequency": 60, - "energy": 210.32, - "power": 103.4, - "current": 0.95, + "energy": 210.33, + "power": 96.1, + "current": 0.89, "power_factor": 0.93, "update": { "state": "idle", @@ -98,7 +98,7 @@ "voltage": 118.8, "energy": 100.67, "state": "ON", - "power": 10.7, + "power": 10.6, "current": 0.32, "ac_frequency": 60, "power_factor": 0.5, @@ -119,7 +119,7 @@ "energy": 14.2, "current": 0.01, "power": 0.2, - "power_factor": 0.22, + "power_factor": 0.11, "linkquality": 116, "update": { "state": "idle",