Add motion-activated light control blueprint and CLAUDE.md
- Create motion-light-control.yaml blueprint for motion-activated lighting - Includes configurable quiet hours to prevent activation during night - Supports multiple lights with brightness and transition controls - Add CLAUDE.md documentation for repository guidance 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
112
CLAUDE.md
Normal file
112
CLAUDE.md
Normal file
@ -0,0 +1,112 @@
|
||||
# CLAUDE.md
|
||||
|
||||
This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.
|
||||
|
||||
## Project Overview
|
||||
This is a Home Assistant Blueprints repository containing reusable automation templates for smart home systems. All blueprints are YAML configuration files that can be imported directly into Home Assistant.
|
||||
|
||||
## Common Development Tasks
|
||||
|
||||
### Testing & Validation
|
||||
- **Blueprint Validation**: Use Home Assistant's built-in blueprint importer to validate YAML syntax
|
||||
- **Template Testing**: Test Jinja2 templates in Home Assistant Developer Tools → Template tab
|
||||
- **Live Testing**: Import blueprint into Home Assistant and create test automation to verify behavior
|
||||
|
||||
### Working with Blueprints
|
||||
When modifying or creating blueprints:
|
||||
1. Follow the standard Home Assistant blueprint schema structure
|
||||
2. Always include comprehensive descriptions for user clarity
|
||||
3. Provide sensible defaults for all input parameters
|
||||
4. Use proper selectors for entity inputs (entity, device, area selectors)
|
||||
5. Test templates for edge cases (unavailable entities, null states)
|
||||
|
||||
## Architecture & Code Structure
|
||||
|
||||
### Blueprint Components
|
||||
Every blueprint follows this structure:
|
||||
- **blueprint:** Metadata section with name, description, domain (always "automation")
|
||||
- **input:** User-configurable parameters with selectors and defaults
|
||||
- **trigger:** Event triggers (state changes, time patterns, device events)
|
||||
- **condition:** Optional conditional logic
|
||||
- **variables:** Template variables for complex logic
|
||||
- **action:** Automation actions to execute
|
||||
- **mode:** Execution mode (single, restart, queued, parallel)
|
||||
|
||||
### Key Patterns
|
||||
|
||||
#### Template Safety
|
||||
Always use fallback defaults in templates:
|
||||
```yaml
|
||||
{{ states('sensor.temperature') | float(0) }}
|
||||
{{ state_attr('device.battery', 'battery_level') | int(100) }}
|
||||
```
|
||||
|
||||
#### Entity Expansion
|
||||
Use expand() for working with entity groups:
|
||||
```yaml
|
||||
{% for entity_id in expand(battery_sensors) | map(attribute='entity_id') | list %}
|
||||
```
|
||||
|
||||
#### Z-Wave Event Handling
|
||||
Z-Wave central scene events follow this pattern:
|
||||
```yaml
|
||||
trigger:
|
||||
- platform: event
|
||||
event_type: zwave_js_value_notification
|
||||
event_data:
|
||||
command_class: 91 # Central Scene
|
||||
property_key: "001" # Scene ID
|
||||
```
|
||||
|
||||
#### Complex State Calculations
|
||||
Use namespace objects for accumulating values:
|
||||
```yaml
|
||||
{% set ns = namespace(total=0, count=0) %}
|
||||
{% for entity in entities %}
|
||||
{% set ns.total = ns.total + states(entity) | float(0) %}
|
||||
{% set ns.count = ns.count + 1 %}
|
||||
{% endfor %}
|
||||
```
|
||||
|
||||
## Blueprint Categories
|
||||
|
||||
### HVAC & Climate Control
|
||||
- **hvac-failure-monitor.yaml**: Monitors HVAC performance using temperature differentials
|
||||
- **fan-management.yaml**: Bathroom fan automation with light triggers
|
||||
- **fan-cadence.yaml**: Periodic fan cycling with override protection
|
||||
|
||||
### Power & Energy
|
||||
- **power-monitoring.yaml**: Detects power spikes for appliance identification
|
||||
- **battery-monitor.yaml**: Multi-device battery level monitoring
|
||||
|
||||
### Smart Switches & Scenes
|
||||
- **multi-tap-automation.yaml**: Z-Wave switch multi-tap scene control
|
||||
- **multi-tap-automation-homeseer-and-zooz.yaml**: Enhanced multi-tap with HomeSeer/Zooz support
|
||||
- **indication.yaml**: HomeSeer WD200+ LED indicator control
|
||||
|
||||
### Security & Utility
|
||||
- **simulated-presence.yaml**: Random light automation for security
|
||||
- **state-opposite.yaml**: Bidirectional entity state synchronization
|
||||
|
||||
## Important Implementation Notes
|
||||
|
||||
### Input Validation
|
||||
- Use proper selector types (number with min/max, boolean, entity with domain filter)
|
||||
- Always provide defaults to prevent undefined errors
|
||||
- Use multi-select for flexibility where appropriate
|
||||
|
||||
### Error Handling
|
||||
- Check entity availability before actions
|
||||
- Use conditional sequences for optional actions
|
||||
- Implement proper fallbacks for missing data
|
||||
|
||||
### Performance Considerations
|
||||
- Use appropriate automation modes (single for exclusive, restart for updates)
|
||||
- Minimize template complexity in frequently-triggered automations
|
||||
- Consider using time patterns instead of constant state monitoring
|
||||
|
||||
### Common Issues & Solutions
|
||||
- **Template errors**: Test in Developer Tools first
|
||||
- **Entity unavailable**: Add availability checks in conditions
|
||||
- **Z-Wave events not firing**: Verify device supports Central Scene command class
|
||||
- **HVAC monitoring false positives**: Adjust temperature thresholds and time windows
|
183
motion-light-control.yaml
Normal file
183
motion-light-control.yaml
Normal file
@ -0,0 +1,183 @@
|
||||
blueprint:
|
||||
name: Motion-Activated Light Control
|
||||
description: >
|
||||
Turns lights on when motion is detected and keeps them on for a specified duration
|
||||
after motion stops. Includes an optional quiet hours period where lights will not
|
||||
turn on automatically (but can still be controlled manually).
|
||||
|
||||
Features:
|
||||
- Multiple light support
|
||||
- Configurable timeout after motion stops
|
||||
- Optional quiet hours (e.g., nighttime) when lights won't turn on
|
||||
- Brightness control during activation
|
||||
- Option to only activate when lights are currently off
|
||||
domain: automation
|
||||
input:
|
||||
motion_sensor:
|
||||
name: Motion Sensor
|
||||
description: The motion sensor that will trigger the lights
|
||||
selector:
|
||||
entity:
|
||||
domain: binary_sensor
|
||||
device_class:
|
||||
- motion
|
||||
- occupancy
|
||||
target_lights:
|
||||
name: Lights to Control
|
||||
description: The light(s) to turn on when motion is detected
|
||||
selector:
|
||||
target:
|
||||
entity:
|
||||
domain: light
|
||||
no_motion_duration:
|
||||
name: No Motion Duration
|
||||
description: How long to wait after motion stops before turning lights off
|
||||
default: 300
|
||||
selector:
|
||||
number:
|
||||
min: 10
|
||||
max: 3600
|
||||
unit_of_measurement: seconds
|
||||
mode: slider
|
||||
brightness_pct:
|
||||
name: Brightness Percentage
|
||||
description: Brightness level when turning on lights (0-100%)
|
||||
default: 100
|
||||
selector:
|
||||
number:
|
||||
min: 1
|
||||
max: 100
|
||||
unit_of_measurement: "%"
|
||||
mode: slider
|
||||
enable_quiet_hours:
|
||||
name: Enable Quiet Hours
|
||||
description: Enable a period where lights won't turn on automatically
|
||||
default: false
|
||||
selector:
|
||||
boolean:
|
||||
quiet_hours_start:
|
||||
name: Quiet Hours Start Time
|
||||
description: Start of quiet hours (lights won't turn on during this period)
|
||||
default: "22:00:00"
|
||||
selector:
|
||||
time:
|
||||
quiet_hours_end:
|
||||
name: Quiet Hours End Time
|
||||
description: End of quiet hours
|
||||
default: "06:00:00"
|
||||
selector:
|
||||
time:
|
||||
only_when_off:
|
||||
name: Only Activate When Lights Are Off
|
||||
description: Only turn on lights if they are currently off (prevents interference with manual control)
|
||||
default: true
|
||||
selector:
|
||||
boolean:
|
||||
transition_time:
|
||||
name: Transition Time
|
||||
description: Transition time in seconds when turning lights on or off
|
||||
default: 1
|
||||
selector:
|
||||
number:
|
||||
min: 0
|
||||
max: 10
|
||||
unit_of_measurement: seconds
|
||||
mode: slider
|
||||
|
||||
mode: restart
|
||||
max_exceeded: silent
|
||||
|
||||
variables:
|
||||
quiet_hours_enabled: !input enable_quiet_hours
|
||||
quiet_start: !input quiet_hours_start
|
||||
quiet_end: !input quiet_hours_end
|
||||
only_if_off: !input only_when_off
|
||||
brightness: !input brightness_pct
|
||||
transition: !input transition_time
|
||||
lights: !input target_lights
|
||||
|
||||
# Calculate if we're currently in quiet hours
|
||||
in_quiet_hours: >
|
||||
{% if quiet_hours_enabled %}
|
||||
{% set current_time = now().strftime('%H:%M:%S') %}
|
||||
{% if quiet_start < quiet_end %}
|
||||
{{ quiet_start <= current_time < quiet_end }}
|
||||
{% else %}
|
||||
{{ current_time >= quiet_start or current_time < quiet_end }}
|
||||
{% endif %}
|
||||
{% else %}
|
||||
false
|
||||
{% endif %}
|
||||
|
||||
# Check if any target lights are currently on
|
||||
any_lights_on: >
|
||||
{% set light_entities = [] %}
|
||||
{% if lights.entity_id is defined %}
|
||||
{% if lights.entity_id is string %}
|
||||
{% set light_entities = [lights.entity_id] %}
|
||||
{% else %}
|
||||
{% set light_entities = lights.entity_id %}
|
||||
{% endif %}
|
||||
{% endif %}
|
||||
{% if lights.device_id is defined %}
|
||||
{% for device in lights.device_id %}
|
||||
{% set light_entities = light_entities + device_entities(device) | select('match', 'light.*') | list %}
|
||||
{% endfor %}
|
||||
{% endif %}
|
||||
{% if lights.area_id is defined %}
|
||||
{% for area in lights.area_id %}
|
||||
{% set light_entities = light_entities + area_entities(area) | select('match', 'light.*') | list %}
|
||||
{% endfor %}
|
||||
{% endif %}
|
||||
{% for entity in light_entities %}
|
||||
{% if states(entity) == 'on' %}
|
||||
true
|
||||
{% endif %}
|
||||
{% else %}
|
||||
false
|
||||
{% endfor %}
|
||||
|
||||
trigger:
|
||||
- platform: state
|
||||
entity_id: !input motion_sensor
|
||||
to: "on"
|
||||
id: motion_detected
|
||||
- platform: state
|
||||
entity_id: !input motion_sensor
|
||||
to: "off"
|
||||
for:
|
||||
seconds: !input no_motion_duration
|
||||
id: motion_stopped
|
||||
|
||||
condition: []
|
||||
|
||||
action:
|
||||
- choose:
|
||||
# Motion detected - turn on lights if conditions are met
|
||||
- conditions:
|
||||
- condition: trigger
|
||||
id: motion_detected
|
||||
- condition: template
|
||||
value_template: "{{ not in_quiet_hours }}"
|
||||
- condition: or
|
||||
conditions:
|
||||
- condition: template
|
||||
value_template: "{{ not only_if_off }}"
|
||||
- condition: template
|
||||
value_template: "{{ not any_lights_on }}"
|
||||
sequence:
|
||||
- service: light.turn_on
|
||||
target: !input target_lights
|
||||
data:
|
||||
brightness_pct: "{{ brightness }}"
|
||||
transition: "{{ transition }}"
|
||||
|
||||
# Motion stopped for duration - turn off lights
|
||||
- conditions:
|
||||
- condition: trigger
|
||||
id: motion_stopped
|
||||
sequence:
|
||||
- service: light.turn_off
|
||||
target: !input target_lights
|
||||
data:
|
||||
transition: "{{ transition }}"
|
Reference in New Issue
Block a user