241 lines
9.2 KiB
Markdown
241 lines
9.2 KiB
Markdown
# AI Camera Motion Automations - Optimization Session
|
|
|
|
**Date:** 2026-07-24 (updated)
|
|
**Automations Modified:**
|
|
- Motion Backyard - AI Description - Version 2
|
|
- Motion Front Door - AI Description - Version 2
|
|
- Motion Shed - AI Description - Version 2
|
|
- Motion Garage - AI Description - Version 2
|
|
|
|
---
|
|
|
|
## Session 1 (Earlier today)
|
|
|
|
### 1. Added Snapshot Cleanup (shell_command)
|
|
|
|
**File:** `configuration.yaml`
|
|
|
|
```yaml
|
|
shell_command:
|
|
cleanup_blink_snapshots: "find /media -name 'blink_*.jpg' -mmin +60 -delete"
|
|
```
|
|
|
|
### 2. Removed Duplicate Snapshot
|
|
|
|
Removed the second `camera.snapshot` to `/config/www/` from all 4 automations.
|
|
|
|
### 3. Added Snapshot Cleanup Action
|
|
|
|
Added `shell_command.cleanup_blink_snapshots` as first action in each automation.
|
|
|
|
### 4. Removed Empty `data: {}` from Switch Actions
|
|
|
|
Cleaned up unnecessary empty `data: {}` blocks.
|
|
|
|
### 5. Added 60-Second Cooldown Condition
|
|
|
|
Added rate-limiting condition using hardcoded entity references:
|
|
```yaml
|
|
value_template: "{{ (now() - state_attr('automation.<entity_id>', 'last_triggered')).total_seconds() > 60 }}"
|
|
```
|
|
|
|
---
|
|
|
|
## Session 2 (This session)
|
|
|
|
### 1. Fixed Spook Warnings - Hardcoded Entity References
|
|
|
|
**File:** `automations.yaml` (all 4 automations)
|
|
|
|
**Before:**
|
|
```yaml
|
|
value_template: "{{ (now() - state_attr('automation.motion_backyard_ai_description_version_2', 'last_triggered')).total_seconds() > 60 }}"
|
|
```
|
|
|
|
**After:**
|
|
```yaml
|
|
value_template: "{{ (now() - state_attr(this.entity_id, 'last_triggered')).total_seconds() > 60 }}"
|
|
```
|
|
|
|
**Reason:** Spook reported unknown entities because the automation referenced itself by hardcoded entity ID. Using `this.entity_id` resolves this.
|
|
|
|
---
|
|
|
|
### 2. Re-added Second Snapshot to `/config/www/`
|
|
|
|
**File:** `automations.yaml` (all 4 automations)
|
|
|
|
Reverted the Session 1 change. Added back the second `camera.snapshot` to `/config/www/` for each automation. This is needed because persistent notifications use `/local/` which maps to `/config/www/`, not `/media/`.
|
|
|
|
```yaml
|
|
- 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 }}
|
|
```
|
|
|
|
---
|
|
|
|
### 3. Updated Shell Command Cleanup
|
|
|
|
**File:** `configuration.yaml`
|
|
|
|
**Before:**
|
|
```yaml
|
|
cleanup_blink_snapshots: "find /media -name 'blink_*.jpg' -mmin +60 -delete"
|
|
```
|
|
|
|
**After:**
|
|
```yaml
|
|
cleanup_blink_snapshots: "find /media /config/www -name 'blink_*.jpg' -mmin +60 -delete"
|
|
```
|
|
|
|
**Reason:** Now that we save to both `/media/` and `/config/www/`, both directories need cleanup. Requires HA restart to take effect.
|
|
|
|
---
|
|
|
|
### 4. Created `/config/www/` Directory
|
|
|
|
The directory did not exist, so `camera.snapshot` to `/config/www/` was silently failing.
|
|
|
|
---
|
|
|
|
### 5. Added Images Back to Persistent Notifications
|
|
|
|
**File:** `automations.yaml` (Front Door, Shed, Garage)
|
|
|
|
Added `` to the persistent notification message for all 3 automations. The Backyard automation already had this.
|
|
|
|
---
|
|
|
|
### 6. Fixed Front Door Persistent Notification
|
|
|
|
**File:** `automations.yaml`
|
|
|
|
**Before:** Used broken `notify.persistent_notification` action (with duplicate `data:` keys) AND a separate `persistent_notification.create` without image.
|
|
|
|
**After:** Single `persistent_notification.create` with image in message, matching the working Backyard pattern.
|
|
|
|
---
|
|
|
|
### 7. Fixed Camera Targets (Critical Bug)
|
|
|
|
**File:** `automations.yaml`
|
|
|
|
| Automation | Before (WRONG) | After (CORRECT) |
|
|
|---|---|---|
|
|
| Front Door | `camera.blink_backyard` | `camera.blink_front` |
|
|
| Shed | `camera.blink_backyard` | `camera.blink_backyard_shed` |
|
|
| Backyard | `camera.blink_backyard` | `camera.blink_backyard` (correct) |
|
|
| Garage | `camera.blink_backyard_tree` | `camera.blink_backyard_tree` (correct) |
|
|
|
|
**Reason:** Front Door and Shed were both snapshotting the backyard camera instead of their own cameras.
|
|
|
|
---
|
|
|
|
### 8. Updated Front Door AI Task Name
|
|
|
|
**Before:** `Nest Front Camera Analysis`
|
|
**After:** `Blink Front Camera Analysis`
|
|
|
|
**Reason:** This is a Blink camera, not a Nest camera.
|
|
|
|
---
|
|
|
|
## Final State of All 4 Automations
|
|
|
|
| Automation | Camera | Filename Prefix | Snapshot Paths | Persistent Notification |
|
|
|---|---|---|---|---|
|
|
| Backyard | `camera.blink_backyard` | `blink_backyard_` | `/media/` + `/config/www/` | `![Snapshot]` included |
|
|
| Front Door | `camera.blink_front` | `blink_Front_` | `/media/` + `/config/www/` | `![Snapshot]` included |
|
|
| Shed | `camera.blink_backyard_shed` | `blink_shed_` | `/media/` + `/config/www/` | `![Snapshot]` included |
|
|
| Garage | `camera.blink_backyard_tree` | `blink_Inshed_` | `/media/` + `/config/www/` | `![Snapshot]` included |
|
|
|
|
---
|
|
|
|
## System Architecture - Blink Cameras via Homebridge
|
|
|
|
**Critical Context:** Blink cameras are exposed to Home Assistant via **Homebridge**, NOT the native Blink integration.
|
|
|
|
**Why:** The built-in Blink integration stopped working. The user reverted to Homebridge which exposes the cameras again. However, there are 2 Homebridge plugins - one does NOT have the "force snapshot" capability.
|
|
|
|
**Homebridge Plugin:** `Homebridge Blink Cameras New API F12C` (confirmed via entity `button.homebridge_blink_cameras_new_api_f12c_identify`)
|
|
|
|
**Camera Entities (all via Homebridge):**
|
|
- `camera.blink_backyard` - Backyard
|
|
- `camera.blink_front` - Front
|
|
- `camera.blink_backyard_shed` - Shed
|
|
- `camera.blink_backyard_tree` - Garage (mislabeled - physically monitors garage area)
|
|
- `camera.blink_garage_side` - Garage Side
|
|
- `camera.blink_thermopump` - Thermopump
|
|
|
|
**Refresh Snapshot Switches:**
|
|
- `switch.backyard_refresh_snapshot`
|
|
- `switch.front_refresh_snapshot`
|
|
- `switch.backyard_shed_refresh_snapshot`
|
|
- `switch.backyard_tree_refresh_snapshot`
|
|
- `switch.garage_side_refresh_snapshot`
|
|
- `switch.thermopump_refresh_snapshot`
|
|
|
|
---
|
|
|
|
## Known Limitations
|
|
|
|
### Homebridge Integration Limitations (CRITICAL)
|
|
|
|
1. **No Force Refresh Capability** - The Homebridge Blink integration exposes cameras as basic entities with `supported_features: 0`. This means:
|
|
- No `blink.trigger_camera` service (old Blink integration feature - DISABLED in automations)
|
|
- No way to force the camera to take a fresh snapshot on demand
|
|
- `camera.snapshot` action simply saves whatever image is currently cached by the integration
|
|
|
|
2. **Stale Image Problem** - When automation triggers:
|
|
- `switch.*_refresh_snapshot` is turned on (purpose unclear - may not actually work)
|
|
- Delays (30s + 5s) are used to give Blink time to update
|
|
- `homeassistant.update_entity` is called to poll
|
|
- `camera.snapshot` saves the current cached image (which may be OLD)
|
|
|
|
3. **Image Cache Timing** - Blink cameras cache images and update them periodically. There's no guaranteed way to force a fresh capture through Homebridge.
|
|
|
|
### Other Limitations
|
|
|
|
- Blink API throttling may cause stale snapshots when multiple automations run in quick succession
|
|
- `camera.snapshot` returns success but may not write file if Blink hasn't refreshed its image cache
|
|
- `shell_command` cleanup update requires HA restart to take effect
|
|
- The `switch.*_refresh_snapshot` switches may be non-functional remnants from the old Blink integration
|
|
|
|
---
|
|
|
|
## Testing Results (2026-07-24)
|
|
|
|
- **Front Door**: **GOLD STANDARD** - Most reliable automation. Gets the latest image almost every time. Image processing via Ollama works correctly. This is the reference implementation the others should match.
|
|
- **Backyard**: Working correctly - correct image, Ollama processing successful
|
|
- **Shed**: Working correctly - correct image, Ollama processing successful
|
|
- **Garage**: **ISSUE** - Sometimes uses stale/old image. The Homebridge integration may not have refreshed the camera's cached image before snapshot is taken.
|
|
|
|
**Note:** All 4 automations ran and captured the correct camera images. However, the **Garage automation** has been observed using old/stale images. This is a known limitation of the Homebridge integration - there's no guaranteed way to force a fresh snapshot. Long-term observation needed to determine if this is a timing issue or a hard limitation.
|
|
|
|
---
|
|
|
|
## Session 3 (Current - 2026-07-24)
|
|
|
|
### Issue Reported: Garage Automation Using Stale Image
|
|
|
|
**Problem:** User ran the garage automation and it used an old/cached image from the Blink camera instead of a fresh snapshot.
|
|
|
|
**Investigation Findings:**
|
|
1. The `blink.trigger_camera` action in the automation is **DISABLED** (line 2880-2884) - this is old code from when the built-in Blink integration was working
|
|
2. The built-in Blink integration **stopped working**, so the user reverted to **Homebridge** to expose cameras
|
|
3. The Homebridge Blink integration (`Homebridge Blink Cameras New API F12C`) does NOT provide a "force snapshot" capability
|
|
4. Camera entities have `supported_features: 0` - no special capabilities exposed
|
|
5. The `switch.*_refresh_snapshot` switches may not actually trigger a fresh capture
|
|
|
|
**Root Cause:** This is a **hard limitation** of the Homebridge integration. The `camera.snapshot` action saves whatever image is currently cached by the integration. There's no way to force the camera to take a new photo on demand.
|
|
|
|
**Resolution:** User will monitor for a few days to see if the issue persists. The 30s + 5s delays in the automation are intended to give Blink time to update its cache, but this is not guaranteed to work.
|