Refactor notification actions in automation files to use notify.notify_events instead of mobile app notifications. This change applies to alerts for washing machine leaks, cat medication tracking, and litter box monitoring, streamlining the notification process.

This commit is contained in:
Joshua King
2026-07-07 12:01:11 -04:00
parent 346b7c0cfa
commit 0b1dba2be7
4 changed files with 66 additions and 481 deletions
+65
View File
@@ -0,0 +1,65 @@
# CLAUDE.md
This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.
## What this repo is
The Home Assistant configuration directory (`/config` on the live HAOS host, mirrored to this git repo). It is **configuration, not application code** — there is no build or test suite. "Running" a change means HA loads it; validation is by config-check and reload, not unit tests. The repo is also mirrored to a self-hosted Gitea at `code.cubecraftcreations.com`.
Edits here only take effect after they reach the live host and HA reloads the affected domain. There is no compile step; a malformed YAML file breaks the domain it belongs to (or all of HA if it's `configuration.yaml`).
## Layout & how config is assembled
`configuration.yaml` is the root that wires everything together via `!include` directives. Understand these to know where a given entity lives:
- `packages/``!include_dir_named` — each file is a **self-contained feature** that can declare automations, sensors, MQTT entities, helpers, etc. all at once. This is where the major subsystems live (cat medication, chore tracker, litter box monitor, voice satellite alarms, integration health).
- `automations/``!include_dir_merge_list` — numbered files (`01_``07_`) group automations by theme (home/lighting, alerts, presence/security, kids, printers, dashboards, climate). `print_log_automations/` is a subfolder for the 3D-printer→Notion logging automations. All are merged into one flat list, so **`id:` and `alias:` must be globally unique** across every file.
- `helpers/` → one file per helper domain (`input_boolean`, `input_number`, `input_select`, `input_datetime`, `counter`, `timer`, `input_text`, `rest_command`, `shell_command`). Add a new helper to the matching domain file.
- `dashboards/``dashboards.yaml` registers each Lovelace dashboard; view definitions live in `dashboards/views/`.
- `themes/`, `blueprints/`, `scenes.yaml`, `scripts.yaml` — standard HA locations.
- `esphome/` → firmware for ~150 ESP devices (see below).
- `scripts/` → host-side shell/Python services that run alongside HA (not HA `script:` entities).
Secrets are referenced as `!secret <key>`; `secrets.yaml`, `known_devices.yaml`, `ip_bans.yaml` and the HA runtime DB/storage are gitignored. The `.gitignore` uses an ignore-all-then-whitelist pattern — **new file types or folders won't be tracked unless explicitly whitelisted there.**
## ESPHome devices (`esphome/`)
Two structural patterns coexist:
1. **Single-file devices** — e.g. `cat-medication-tracker.yaml`, `airqualitysensor-*.yaml`.
2. **Package-based devices** — a thin top-level entry file sets `substitutions:` (per-board pins) and pulls in shared logic via `packages: !include <dir>/<base>.yaml`. See `jarvis-satellite/`, `respeaker-satellite/`, `ha-remote/`, `family-room-remote/`. To change shared behavior edit the package dir; to change one physical device edit its top-level substitutions.
Custom C++ components/headers live alongside the YAML (`esphome/components/`, `MAX17048_component.h`, `spi_helper.h`) and are referenced via `esphome: includes:`. This framework is **arduino-type but ESP-IDF-hybrid** — use ESP-IDF headers (`driver/spi_master.h`, `driver/gpio.h`), not Arduino `SPI.h`, which is not on the include path. Display MADCTL/orientation fixes that must run after ESPHome's model init are done in an `on_boot` lambda at priority `-100` (not `init_sequence:`, which gets overwritten). The cat-medication-tracker is the worked reference for this.
### Generated ESPHome configs — DO NOT hand-edit
`esphome/chore-tracker/generate.py` is the **source of truth** for the chore tracker. It reads `chore-tracker/chores_config.yaml` and emits three files marked `AUTO-GENERATED`:
- `esphome/chore-tracker-esphome.yaml` (firmware)
- `packages/chore_tracker_ha.yaml` (HA entities/automations)
- `esphome/chore-tracker/chore-tracker-dashboard.yaml` (Lovelace)
To change chores or kids, edit `chores_config.yaml` then regenerate:
```bash
cd esphome/chore-tracker && python3 generate.py
```
Any file whose header says `AUTO-GENERATED — edit chores_config.yaml` must not be edited directly; changes will be overwritten.
## Host-side services (`scripts/`)
These run on the HA host as background processes, independent of HA itself:
- **`litter_box_analyzer.py`** — OpenCV/MQTT computer-vision service. Subscribes to base64 JPEG frames an ESP32-S3 camera publishes over MQTT, detects cat presence / box-stuck / needs-scooping, and publishes results back to `litter_box/status/*` topics. `packages/litter_box_monitor.yaml` consumes those topics as HA MQTT sensors. Requires `opencv-python numpy paho-mqtt`. Manage it with `scripts/litter_box_analyzer.sh {start|stop|restart|status}` (configurable via `MQTT_BROKER`, `MOTION_THRESHOLD`, etc. env vars).
- **`git_autocommit.sh`** — invoked by the `git_autocommit` shell_command helper; stages `/config`, commits with a timestamp, and pushes `main`. This is how HA-side edits get committed back to git.
## Print Log → Notion integration
3D-printer activity is logged to a Notion database in real time. `helpers/rest_command.yaml` defines `notion_create_print` (POST, returns page id) and `notion_update_print` (PATCH by page id); automations in `automations/print_log_automations/` (one start+finish pair per printer) call them. Key gotchas captured in `print_log_context.md`:
- `rest_command` responses are **already parsed dicts** — use `{{ notion_response.content.id }}`, never `| from_json`.
- The Notion bearer token is the full `"Bearer ntn_..."` string stored as `!secret notion_token_bearer`.
- Bambu vs. Elegoo printers expose different sensor sets (Elegoo only has `file_name` + `print_status`).
## Conventions
- **Unique ids:** automations are merged into one list — never reuse an `id:` or `alias:`.
- **Network:** IoT VLAN is `192.168.69.x` / `10.60.1.x`, main LAN `192.168.1.x`; ESP devices use `wifi_iot_ssid`. The `http:` block trusts proxy `10.60.1.1`.
- **Don't commit secrets or runtime state** — rely on the existing `.gitignore` whitelist; if you add a new tracked file type, whitelist it explicitly.
+1 -424
View File
@@ -1,197 +1,4 @@
# Safety, device, and household alert automations. # Safety, device, and household alert automations.
- id: '1739061820991'
alias: Turn off washing machine when leak sensed
description: ''
triggers:
- type: moist
device_id: 84e0d8044eb13e64c899357f840dcacb
entity_id: 2f41825acbe754ebfa788a77c197138c
domain: binary_sensor
trigger: device
conditions: []
actions:
- type: turn_off
device_id: 613a1b8ef47539c9d0ebe6a87b13ca26
entity_id: 721e7dd29be7dbcb6e634ec5d505c5f4
domain: switch
- action: notify.notify
metadata: {}
data:
message: Washing Machine Leak Sensor has been triggered - please check!
mode: single
- id: '1739841729184'
alias: Declans Closet Open Notification
description: ''
initial_state: false
triggers:
- trigger: state
entity_id:
- input_boolean.hermes_disabled_automation_placeholder
to: 'on'
conditions:
- condition: time
after: '21:00:00'
before: 07:30:00
actions:
- action: notify.mobile_app_joshuas_iphone_of_pain
metadata: {}
data:
message: Declans Closet is Open
- action: notify.mobile_app_pollys_iphone
metadata: {}
data:
message: Declans Closet is Open
mode: single
- id: '1739841929885'
alias: Jordyns Door Open Notification
description: ''
triggers:
- trigger: state
entity_id:
- binary_sensor.jordyns_door_door
to: 'on'
conditions:
- condition: time
after: '19:45:00'
before: 07:45:00
actions:
- action: notify.mobile_app_joshuas_iphone_of_pain
metadata: {}
data:
message: Jordyns door is open
mode: single
- id: '1739842035606'
alias: Declans Door Closed Notification
description: ''
initial_state: false
triggers:
- trigger: state
entity_id:
- input_boolean.hermes_disabled_automation_placeholder
to: 'off'
conditions:
- condition: time
after: '21:00:00'
before: 07:00:00
actions:
- action: notify.mobile_app_joshuas_iphone_of_pain
metadata: {}
data:
message: Declans Closet is Closed
- action: notify.mobile_app_pollys_iphone
metadata: {}
data:
message: Declans Closet is Closed
mode: single
- id: '1739932866970'
alias: Washing Machine Leak Sensor Battery Low Notification
description: ''
triggers:
- trigger: numeric_state
entity_id:
- sensor.washing_machine_water_sensor_battery
below: 25
conditions: []
actions:
- action: notify.persistent_notification
metadata: {}
data:
message: Please change washing machine leak sensor battery soon!
- action: notify.mobile_app_joshuas_iphone_of_pain
metadata: {}
data:
message: Please change washing machine leak sensor battery soon!
- action: notify.mobile_app_pollys_iphone
metadata: {}
data:
message: Please change washing machine leak sensor battery soon!
mode: single
- id: '1739932945304'
alias: Jordyn's Door Sensor Low Battery Notification
description: ''
triggers:
- trigger: numeric_state
entity_id:
- sensor.jordyns_door_battery
below: 25
conditions: []
actions:
- action: notify.persistent_notification
metadata: {}
data:
message: Please change washing machine leak sensor battery soon!
- action: notify.mobile_app_joshuas_iphone_of_pain
metadata: {}
data:
message: Please change washing machine leak sensor battery soon!
- action: notify.mobile_app_pollys_iphone
metadata: {}
data:
message: Please change washing machine leak sensor battery soon!
mode: single
- id: '1739933032829'
alias: Deep Freezer Low Battery Notification
description: ''
triggers:
- trigger: numeric_state
entity_id:
- sensor.deep_freezer_battery
below: 25
conditions: []
actions:
- action: notify.persistent_notification
metadata: {}
data:
message: Please change washing machine leak sensor battery soon!
- action: notify.mobile_app_joshuas_iphone_of_pain
metadata: {}
data:
message: Please change washing machine leak sensor battery soon!
- action: notify.mobile_app_pollys_iphone
metadata: {}
data:
message: Please change washing machine leak sensor battery soon!
mode: single
- id: '1739933290261'
alias: Deep Freezer Left Open Notification
description: ''
triggers:
- trigger: state
entity_id:
- binary_sensor.deep_freezer_door
to: 'on'
for:
hours: 0
minutes: 2
seconds: 0
conditions: []
actions:
- action: notify.html5
metadata: {}
data:
message: Deep freezer has been left open - please check.
- action: notify.persistent_notification
metadata: {}
data:
message: Deep freezer has been left open - please check.
- action: notify.mobile_app_joshuas_iphone_of_pain
metadata: {}
data:
message: Deep freezer has been left open - please check.
- action: notify.mobile_app_pollys_iphone
metadata: {}
data:
message: Deep freezer has been left open - please check.
mode: single
- id: '1742155540986' - id: '1742155540986'
alias: 'Garage Floodlight Low Battery Notification ' alias: 'Garage Floodlight Low Battery Notification '
description: '' description: ''
@@ -219,20 +26,11 @@
to: '0' to: '0'
conditions: [] conditions: []
actions: actions:
- action: notify.mobile_app_joshuas_iphone_of_pain - action: notify.notify_events
metadata: {}
data:
message: Triple Threat's Anti-Stinky Juice is Empty
- action: notify.mobile_app_pollys_iphone
metadata: {}
data:
message: Triple Threat's Anti-Stinky Juice is Empty
- action: notify.mailgun_smtp
metadata: {} metadata: {}
data: data:
message: Triple Threat's Anti-Stinky Juice is Empty message: Triple Threat's Anti-Stinky Juice is Empty
title: Triple Threat's Anti-Stinky Juice is Empty title: Triple Threat's Anti-Stinky Juice is Empty
target: joshua@cnjmail.com polly@cnjmail.com
mode: single mode: single
- id: '1742841650033' - id: '1742841650033'
@@ -246,21 +44,6 @@
to: '65' to: '65'
conditions: [] conditions: []
actions: actions:
- action: notify.mobile_app_joshuas_iphone_of_pain
metadata: {}
data:
message: The Deuce's Litter is Low
- action: notify.mobile_app_pollys_iphone
metadata: {}
data:
message: The Deuce's Litter is Low
- action: notify.mailgun_smtp
metadata: {}
data:
message: The Deuce's Litter is Low
title: The Deuce's Litter is Low
target: joshua@cnjmail.com
enabled: false
- action: notify.notify_events - action: notify.notify_events
metadata: {} metadata: {}
data: data:
@@ -278,21 +61,6 @@
enabled: true enabled: true
conditions: [] conditions: []
actions: actions:
- action: notify.mobile_app_joshuas_iphone_of_pain
metadata: {}
data:
message: Triple Threat's Litter is Low
- action: notify.mobile_app_pollys_iphone
metadata: {}
data:
message: Triple Threat's Litter is Low
- action: notify.mailgun_smtp
metadata: {}
data:
message: Triple Threat's Litter is Low
title: Triple Threat's Litter is Low
target: joshua@cnjmail.com
enabled: false
- action: notify.notify_events - action: notify.notify_events
metadata: {} metadata: {}
data: data:
@@ -311,14 +79,6 @@
to: '65' to: '65'
conditions: [] conditions: []
actions: actions:
- action: notify.mobile_app_joshuas_iphone_of_pain
metadata: {}
data:
message: Cat Crapper 3000's Litter is Low
- action: notify.mobile_app_pollys_iphone
metadata: {}
data:
message: Cat Crapper 3000's Litter is Low
- action: notify.notify_events - action: notify.notify_events
metadata: {} metadata: {}
data: data:
@@ -337,21 +97,6 @@
to: '65' to: '65'
conditions: [] conditions: []
actions: actions:
- action: notify.mobile_app_joshuas_iphone_of_pain
metadata: {}
data:
message: Poop Box's Litter is Low
- action: notify.mobile_app_pollys_iphone
metadata: {}
data:
message: Poop Box's Litter is Low
- action: notify.mailgun_smtp
metadata: {}
data:
message: Poop Box's Litter is Low
title: Poop Box's Litter is Low
target: joshua@cnjmail.com
enabled: falsef
- action: notify.notify_events - action: notify.notify_events
metadata: {} metadata: {}
data: data:
@@ -370,21 +115,6 @@
to: 'on' to: 'on'
conditions: [] conditions: []
actions: actions:
- action: notify.mobile_app_joshuas_iphone_of_pain
metadata: {}
data:
message: Cat Crapper 3000 is full of crap
- action: notify.mobile_app_pollys_iphone
metadata: {}
data:
message: Cat Crapper 3000 is full of crap
- action: notify.mailgun_smtp
metadata: {}
data:
message: Cat Crapper 3000 is full of crap
title: CLEAN Cat Crapper 3000 - it's full of crap
target: joshua@cnjmail.com
enabled: false
- action: notify.notify_events - action: notify.notify_events
metadata: {} metadata: {}
data: data:
@@ -403,25 +133,6 @@
to: 'on' to: 'on'
conditions: [] conditions: []
actions: actions:
- action: notify.mobile_app_joshuas_iphone_of_pain
metadata: {}
data:
message: The Deuce is full of deuces (laundry room)
- action: notify.mobile_app_pollys_iphone
metadata: {}
data:
message: The Deuce is full of deuces (laundry room)
- action: notify.mailgun_smtp
metadata: {}
data:
message: The Deuce is full of deuces
title: Too many dueces have been dropped!
target: joshua@cnjmail.com
enabled: false
- action: notify.mobile_app_chloes_iphone
metadata: {}
data:
message: The Deuce is full of deuces (laundry room)
- action: notify.notify_events - action: notify.notify_events
metadata: {} metadata: {}
data: data:
@@ -440,25 +151,6 @@
to: 'on' to: 'on'
conditions: [] conditions: []
actions: actions:
- action: notify.mobile_app_joshuas_iphone_of_pain
metadata: {}
data:
message: The Poop Box has runneth over (basement, left side)
- action: notify.mobile_app_pollys_iphone
metadata: {}
data:
message: The Poop Box has runneth over (basement, left side)
- action: notify.mobile_app_chloes_iphone
metadata: {}
data:
message: The Poop Box has runneth over (basement, left side)
- action: notify.mailgun_smtp
metadata: {}
data:
message: The poop box has too many presents!
title: The poop box is bursting!!
target: joshua@cnjmail.com
enabled: false
- action: notify.notify_events - action: notify.notify_events
metadata: {} metadata: {}
data: data:
@@ -477,25 +169,6 @@
to: 'on' to: 'on'
conditions: [] conditions: []
actions: actions:
- action: notify.mobile_app_joshuas_iphone_of_pain
metadata: {}
data:
message: Triple Threat can't take no more! (Basement, right side)
- action: notify.mobile_app_pollys_iphone
metadata: {}
data:
message: Triple Threat can't take no more! (Basement, right side)
- action: notify.mobile_app_chloes_iphone
metadata: {}
data:
message: Triple Threat can't take no more! (Basement, right side)
- action: notify.mailgun_smtp
metadata: {}
data:
message: The Triple Threat is down for the count!
title: Triple Threat can't take no more!
target: joshua@cnjmail.com
enabled: false
- action: notify.notify_events - action: notify.notify_events
metadata: {} metadata: {}
data: data:
@@ -535,21 +208,6 @@
to: 'on' to: 'on'
conditions: [] conditions: []
actions: actions:
- action: notify.mobile_app_joshuas_iphone_of_pain
metadata: {}
data:
message: Luma Smart Litter Box is full of crap
- action: notify.mobile_app_pollys_iphone
metadata: {}
data:
message: Luma Smart Litter Box is full of crap
- action: notify.mailgun_smtp
metadata: {}
data:
message: Luma Smart Litter Box is full of crap
title: CLEAN Luma Smart Litter Box - it's full of crap
target: joshua@cnjmail.com
enabled: false
- action: notify.notify_events - action: notify.notify_events
metadata: {} metadata: {}
data: data:
@@ -557,72 +215,6 @@
title: CLEAN Luma Smart Litter Box - it's full of crap title: CLEAN Luma Smart Litter Box - it's full of crap
mode: single mode: single
- id: '1782932601002'
alias: Luma Smart Litter Box Water Empty Notification
description: Notify when the Petlibro Luma Smart Litter Box water is empty.
triggers:
- trigger: state
entity_id:
- sensor.luma_smart_litter_box_remaining_water
enabled: true
to: '0'
conditions: []
actions:
- action: notify.mobile_app_joshuas_iphone_of_pain
metadata: {}
data:
message: Luma Smart Litter Box water is empty
- action: notify.mobile_app_pollys_iphone
metadata: {}
data:
message: Luma Smart Litter Box water is empty
- action: notify.mailgun_smtp
metadata: {}
data:
message: Luma Smart Litter Box water is empty
title: Luma Smart Litter Box water is empty
target: joshua@cnjmail.com
enabled: false
- action: notify.notify_events
metadata: {}
data:
message: Luma Smart Litter Box water is empty
title: Luma Smart Litter Box water is empty
mode: single
- id: '1782932601003'
alias: Luma Smart Litter Box Device Error Notification
description: Notify when the Petlibro Luma Smart Litter Box reports a device error.
triggers:
- trigger: state
entity_id:
- binary_sensor.luma_smart_litter_box_device_error
enabled: true
to: 'on'
conditions: []
actions:
- action: notify.mobile_app_joshuas_iphone_of_pain
metadata: {}
data:
message: "Luma Smart Litter Box has a device error: {{ states('sensor.luma_smart_litter_box_exception_message') }}"
- action: notify.mobile_app_pollys_iphone
metadata: {}
data:
message: "Luma Smart Litter Box has a device error: {{ states('sensor.luma_smart_litter_box_exception_message') }}"
- action: notify.mailgun_smtp
metadata: {}
data:
message: "Luma Smart Litter Box has a device error: {{ states('sensor.luma_smart_litter_box_exception_message') }}"
title: Luma Smart Litter Box device error
target: joshua@cnjmail.com
enabled: false
- action: notify.notify_events
metadata: {}
data:
message: "Luma Smart Litter Box has a device error: {{ states('sensor.luma_smart_litter_box_exception_message') }}"
title: Luma Smart Litter Box device error
mode: single
- id: '1782932601004' - id: '1782932601004'
alias: Luma Smart Litter Box Door Error Notification alias: Luma Smart Litter Box Door Error Notification
description: Notify when the Petlibro Luma Smart Litter Box reports a door error. description: Notify when the Petlibro Luma Smart Litter Box reports a door error.
@@ -634,21 +226,6 @@
to: 'on' to: 'on'
conditions: [] conditions: []
actions: actions:
- action: notify.mobile_app_joshuas_iphone_of_pain
metadata: {}
data:
message: Luma Smart Litter Box has a door error
- action: notify.mobile_app_pollys_iphone
metadata: {}
data:
message: Luma Smart Litter Box has a door error
- action: notify.mailgun_smtp
metadata: {}
data:
message: Luma Smart Litter Box has a door error
title: Luma Smart Litter Box door error
target: joshua@cnjmail.com
enabled: false
- action: notify.notify_events - action: notify.notify_events
metadata: {} metadata: {}
data: data:
-36
View File
@@ -50,10 +50,6 @@ automation:
entity_id: binary_sensor.cat_medication_tracker_all_cats_medicated entity_id: binary_sensor.cat_medication_tracker_all_cats_medicated
to: "on" to: "on"
action: action:
- service: notify.notify
data:
title: "Cat meds done"
message: "Penelope and Tess have both been marked medicated today."
- service: notify.notify_events - service: notify.notify_events
data: data:
title: "Cat meds done" title: "Cat meds done"
@@ -77,14 +73,6 @@ automation:
cat_name: > cat_name: >
{% if trigger.id == 'penelope' %}Penelope {% if trigger.id == 'penelope' %}Penelope
{% else %}Tess{% endif %} {% else %}Tess{% endif %}
- service: notify.mobile_app_joshuas_iphone_of_pain
data:
title: "Cat medication given"
message: "{{ cat_name }} has been marked medicated."
- service: notify.mobile_app_pollys_iphone
data:
title: "Cat medication given"
message: "{{ cat_name }} has been marked medicated."
- service: notify.notify_events - service: notify.notify_events
data: data:
title: "Cat medication given" title: "Cat medication given"
@@ -100,30 +88,6 @@ automation:
entity_id: binary_sensor.cat_medication_tracker_all_cats_medicated entity_id: binary_sensor.cat_medication_tracker_all_cats_medicated
state: "off" state: "off"
action: action:
- service: notify.mobile_app_joshuas_iphone_of_pain
data:
title: "Cat meds still needed"
message: >
{% set ns = namespace(cats=[]) %}
{% if is_state('switch.cat_medication_tracker_penelope_medicated', 'off') %}
{% set ns.cats = ns.cats + ['Penelope'] %}
{% endif %}
{% if is_state('switch.cat_medication_tracker_tess_medicated', 'off') %}
{% set ns.cats = ns.cats + ['Tess'] %}
{% endif %}
{{ ns.cats | join(' and ') }} still need medication.
- service: notify.mobile_app_pollys_iphone
data:
title: "Cat meds still needed"
message: >
{% set ns = namespace(cats=[]) %}
{% if is_state('switch.cat_medication_tracker_penelope_medicated', 'off') %}
{% set ns.cats = ns.cats + ['Penelope'] %}
{% endif %}
{% if is_state('switch.cat_medication_tracker_tess_medicated', 'off') %}
{% set ns.cats = ns.cats + ['Tess'] %}
{% endif %}
{{ ns.cats | join(' and ') }} still need medication.
- service: notify.notify_events - service: notify.notify_events
data: data:
title: "Cat meds still needed" title: "Cat meds still needed"
-21
View File
@@ -200,10 +200,6 @@ automation:
- action: timer.start - action: timer.start
target: target:
entity_id: timer.litter_box_cat_cooldown entity_id: timer.litter_box_cat_cooldown
- action: notify.mobile_app_joshuas_iphone_of_pain
data:
message: "🐱 A cat is using the litter box right now!"
title: "Litter Box Activity"
- action: notify.notify_events - action: notify.notify_events
data: data:
message: "🐱 A cat is using the litter box right now!" message: "🐱 A cat is using the litter box right now!"
@@ -243,19 +239,6 @@ automation:
- action: input_boolean.turn_on - action: input_boolean.turn_on
target: target:
entity_id: input_boolean.litter_box_stuck_notified entity_id: input_boolean.litter_box_stuck_notified
- action: notify.mobile_app_joshuas_iphone_of_pain
data:
message: "⚠️ The litter box is STUCK ROTATED CLOSED! Visual state is 'closed' — check the mechanism."
title: "Litter Box STUCK CLOSED!"
- action: notify.mobile_app_pollys_iphone
data:
message: "⚠️ The litter box is STUCK ROTATED CLOSED! Visual state is 'closed' — check the mechanism."
title: "Litter Box STUCK CLOSED!"
- action: notify.mailgun_smtp
data:
message: "The litter box camera detects the box in a rotated/closed position. The mechanism may be stuck mid-cycle."
title: "Litter Box Stuck Closed!"
target: "joshua@cnjmail.com"
- action: notify.notify_events - action: notify.notify_events
data: data:
message: "⚠️ The litter box is STUCK ROTATED CLOSED! Visual state is 'closed' — check the mechanism." message: "⚠️ The litter box is STUCK ROTATED CLOSED! Visual state is 'closed' — check the mechanism."
@@ -302,10 +285,6 @@ automation:
- action: timer.start - action: timer.start
target: target:
entity_id: timer.litter_box_scoop_cooldown entity_id: timer.litter_box_scoop_cooldown
- action: notify.mobile_app_joshuas_iphone_of_pain
data:
message: "🧹 The litter box could use a scoop! Cleanliness: {{ states('sensor.litter_box_camera_cleanliness_score') }}%"
title: "Litter Box Needs Scooping"
- action: notify.notify_events - action: notify.notify_events
data: data:
message: "🧹 The litter box could use a scoop! Cleanliness: {{ states('sensor.litter_box_camera_cleanliness_score') }}%" message: "🧹 The litter box could use a scoop! Cleanliness: {{ states('sensor.litter_box_camera_cleanliness_score') }}%"