Skip to content

v2.15.0

🐛 Bug fixes

  • title was missing as a top level field in the archived notification, now appears next to message fields at the top
  • Unrecognized scenarios now only logged as warnings if they are require_scenarios, otherwise logged at debug level. This makes it easier to auto generate scenarios from other components or automations and not have lots of log noise
  • A blank target or custom_target, as an emptied field in the action's UI editor leaves behind, is now ignored. It was taken as an explicit target, so the default recipients were not used and nothing was delivered
  • A target mapping with an invalid value, such as a mistyped entity_id, is now refused with the validation error. It was silently turned into a list of its keys, so the notification went to a target called entity_id
  • An empty list in YAML for targets is now explicitly handled, and treated as selecting no targets, and no default recipient targets. The notification will only be handled by deliveries that don't require targets, or where delivery or scenario configurations inject their own targets.

✨ Enhancements

Mobile Actions

  • An action with level: notification is what opens when the notification itself is tapped or clicked. It needs a uri or uri_template, and can be in the actions of a notification or in an action group
    • Mobile Push sends it as url for iOS and clickAction for Android, and ntfy, Gotify and HTML5 as their click url
    • An explicit url, clickAction, ntfy_click, gotify_click or html5_url wins over it
    • Where there's more than one, the action on the notification wins, then its action groups, then the first scenario
  • uri_template can be used for an action in an action group, as action_template and title_template can
  • camera is a new variable for conditions and templates, with the entity_id of the notification's camera and anything configured for it under cameras:, such as camera.alias
  • action_template, title_template and uri_template are now rendered, with the same variables as scenario conditions. They were accepted but previously sent as they were as raw templates.

📝 Other changes

  • links: section of YAML that was never implemented now completely ignored.
  • The intended function of links has been subsumed some time ago into the mobile actions, which are now available for any transport. Mobile actions can be defined with only a URI.

v2.14.0

🚨 Breaking changes

Python 3.13 and Home Assistant versions 2026.3 and earlier

As previously indicated, support for Python version 3.13 and Home Assistant 2026.2 and earlier releases is no longer assured now that 2026.10 has been released. It may continue to work on older installations, however the build checks to verify against 2026.2/py3.13 are no longer part of the pre-release or release process.

Scenario and Delivery Conditions

These are now evaluated more thoroughly at start-up, so you may find old overlooked condition errors raising repairs, these are likely to be real problems in the logic.

✨ Enhancements

Assist

  • Snoozing requests don't stop critical notifications, unless the instruction explicit asks to snooze 'even critical'
  • Built-in agent sentence How do I get help on Supernotify answers with a link to the online help page, in English and Italian

Notify Entities

  • Any scenario or delivery can be exposed as a Notify Entity, by adding notify_entity with the name to go after notify.
  • A message sent to a scenario's notify entity is a default notification with that scenario applied, and to a delivery's is one with that delivery selected
  • A repair is raised, and no entity made, if the notify entity, or a notify action of that name, already exists
  • Used as a target of supernotify.notify, it applies its scenario or selects its delivery on that notification
  • Every notify entity, including each recipient's notify.recipient_<name>, also has a legacy notify action of the same name, so the Alert integration can list them in notifiers
  • This opens up scenarios and deliveries to anything that takes a notify entity or action, see the Alert integration example

Delivery Switch Entities

  • Now has new attributes
  • last_sent_at
  • last_outcome
  • last_skip_reason

Snoozing

  • A TAG snooze also matches the automation or script that sent the notification
  • Matches by entity_id, name or alias
  • Any notification raised by an automation can be paused on its own (pause garage closed for an hour) without adding entity_id to the notify call.
  • The sender is found from the call's context, and a script started by an automation counts both.

Mobile

  • Mobile apps are updated now as they are added and removed, not only when the component starts up
  • If a mobile app is removed, its action goes away - this used to lead to stack traces in logs and the entire notification mapped as an error even if other deliveries succeeded.
  • Now it is handled separately from other exceptions and treated as a missed target within the mobile_push transport, which auto raises a repair to remove the device
  • Recipients with manually configured mobile devices now get them checked at startup, and a repair raised if that mobile is no longer known to Home Assistant. The repair links to the People documentation, and can be dismissed like other repairs.
  • Discovered mobile apps that have no notify action, like an Apple Watch, are left out of the recipient's mobile devices, and never raise this repair
  • Improved how critical priority is applied for Android mobile apps with Do Not Disturb mode
  • Android commands and TTS operations sent as independent calls
  • The companion app takes notification commands and TTS as the message of a call of their own (message: command_dnd + data.command, message: TTS + data.tts_text), not as data of an ordinary notification.
  • Now each mobile_push_command_* is sent as its own call just before the notification, so the screen is on / Do Not Disturb is off when it arrives
  • mobile_push_tts_text is sent as its own message: TTS call after the notification - one wait for all the devices, 5 seconds by default, since started together the TTS cut off the notification's own sound; new mobile_push_tts_delay changes it (0 for straight away). mobile_push_tts_locale / _engine go with it as tts_text_language / tts_engine
  • for critical, the extra calls carry ttl: 0 + priority: high like the notification (without them the TTS waited for the phone to be unlocked and was then spoken late), and the TTS goes on media_stream: alarm_stream_max (the app puts the volume back afterwards); otherwise mobile_push_alarm_stream / _max pick the stream
  • Tried on a Samsung S26 Ultra

Archive

  • enquire_archive can filter by priority ( one or more and case-insensitive ) before the limit is applied, so a month of archive can be searched for its few critical notifications in one call
  • The summary verbosity now includes missed, the count of deliveries asked for but not sent, so a partial_delivery can be explained from a summary list
  • The summary verbosity of enquire_archive leaves out delivery_provenance, about half its size - it is still there at standard and full

🐛 Bug fixes

  • Snoozing a mobile device ignored devices that had been selected via a person entity rather than as a direct target. Now it gets snoozed regardless of how selected.
  • Complex conditions could have invalid template conditions (with logic inside {{ and }}) that wouldn't be detected if prior conditions evaluated as false. Now every condition within the conditions is separately checked in strict mode.
  • A scenario's delivery given as a single delivery name, or a list of names, was rejected as invalid configuration in YAML, though documented as a way to switch those deliveries on. Now both are accepted, as well as a mapping.
  • Missing or misspelled entities are also now checked as part of conditions validation, and will be logged rather than disabling the scenario or delivery since the integration that provided the entities might start after Supernotify
  • Generic transport with ntfy.publish failed when icon, click or attach was given in data, these are now sent as the action expects
  • Chime sent the tone, duration and volume for a siren nested under a data key, which siren.turn_on rejects, so a siren chime with any of these set would fail. They are now sent as the action expects. Caught by the new automated downstream integration schema checks.

📚 Documentation

  • Help section improved, and with more examples of how Google and AI agents like ChatGPT, Claude, Kimi etc can give advice and write YAML
  • Add a recipe for Pyscript usage
  • Add a Rain Alert recipe, using the Alert integration with a scenario notify entity
  • The dashboard recipe now shows how to install the pre-built SuperNotify Cards Dashboard
  • New section on Android Commands and Spoken Text
  • Updated the Targets documentation for the target_usage control
  • New developer page on using the Supernotify plugin for the ha-repl developer shell.

📝 Other changes

  • Home Assistant compatibility for testing moved to 2026.4->2026.10 range
  • Test suite now over >2500 tests covering unit tests, integration tests and tests of example snippets inside the docs
  • For developers, there is now a custom plugin for the Homeassistant REPL developer shell, that makes live objects like scenarios,engine or delivery_registry available as shell variables to acesss via Python
  • Added automated tests for transports to ensure the service calls they make to downstream integrations meet the minimum and don't exceed the maximum of the integrations schemas

⚠️ Deprecated

  • Using ntfy.publish with the Generic transport is deprecated in favour of the ntfy transport. It carries on working, with a warning logged at start up

v2.13.2

🐛 Bug fixes

Assist

  • The answer to "What was the last notification" no longer says It wasn't sent by anything when no delivery went out, which read as though nothing had raised the notification. It now says it wasn't sent and why, for example because it was a duplicate or notifications were snoozed. Fixed and regression test.

Simulate

  • If data was provided in old notify platform style big lump, and auto-migrated to Supernotify's current form, dry_run could be lost. Fixed and regression test.

📚 Documentation

  • Re-organized developer RFCs proposals
  • New doc test for schema used inside examples, and a few minor fixes
  • Social cards slimmed down, now one card per language, and single translated ones improved

v2.13.1

✨ Enhancements

  • Every envelope is now finger printed with a hash, and this is used to make sure there are no double deliveries if mis-configured, or if there's a new fallback delivery

📚 Documentation

  • Getting Started and Concepts pages now replaced by an expanded Quick Start section, and concepts split into Basic and Advanced, and full translations for the entire section
  • New recipe - Someone at the Door
  • Recipes page now has improved navigation
  • New Frequently Asked Questions
  • Stub re-direct pages to make it easier for agents to find help and reference material despite the versioned setup

📝 Other changes

  • Automated build fixed to use correct old version of Home Assistant to ensure the target 6 month range (currently back to Python 3.13 support) is tested

v2.13.0

✨ Enhancements

These enhancements support the Supernotify Cards dashboard panels, and work too in the regular Home Assistants Actions page.

Fallback Deliveries

  • A delivery can now have one or more other deliveries list under a fallback: key
  • If the main delivery fails each of these is tried in turn
  • This also forces the primary delivery into wait-for-response rather than the usual fire-and-forget Home Assistant action calls

Dupe Detection / Simulation

  • There are now two duplicate tracking caches, to make working with the recent simulation / dry_run feature easier
  • Simulated notifications go into their own tracking cache and are ignored by real notifications
  • Simulated notifications check both caches, so you debug what would happen right now for real with that notification
Sequence Second Call
Dry run → Live Sent (was suppressed as a dupe in 2.12.0)
Live → Dry run Reported as DUPE, as a live send would be
Dry run → Dry run Reported as DUPE, so dupe handling can still be tried with dry runs alone

Archive Enquiry

  • enquire_archive has a new verbosity option
  • summary - what happened to each notification in brief, the same as the Assist / MCP tools give
  • standard - the archived notification without the debug_trace, the default for a list
  • full - everything stored, the default when asking for one notification by id
  • enquire_archive has a new period option
  • Pick a time ending now - last hour, 12 hours, day, week or month, simpler than setting after by hand. Remains limited by the max results set.
  • If you also set after, the latter gets priority
  • after and before time filters now use the Home Assistant time zone settings to be a local time
  • Faster archive scans, using the file system ctime creation time rather than examining the JSON and combining file read / json parse and filter into a single faster background task for up to 30x speedup

Snoozing

  • New HA Actions to snooze, silence (snooze without a time limit) and unsnooze

Entities

  • State icons now defined for each of the published entities, in line with the 'gold' level Home Assistant component quality scale, contributed by @lollox80
  • Switch entities now have an overridden attribute to expose if they have been manually changed

🐛 Bug fixes

  • enquire_archive now not so fussy about case when filtering for notification outcome.
  • enquire_archive no longer opens and parses archive files from outside the after / before times
  • enquire_configuration was failing when deliveries had conditions with JSON serialization error
  • Scenario binary_sensor state is now unknown unless live scenarios are switched on with scenario_control: {refresh: true}
  • Previously it showed whatever the conditions evaluated to at start up and never changed, so looked live when it wasn't
  • enquire_active_scenarios is unaffected, and always evaluates the scenarios as of now
  • Conditional scenario entities report state as unknown if scenario auto refresh left at the default off setting. Refresh control switch logged at startup.

📚 Documentation

  • Recipes now improved with tags to easily find and filter

v2.12.0

✨ Enhancements

  • Dry Run functionality was added recently or LLM chat and MCP support, and now is generally available.
    • Use it to work out what deliveries would be made for a notification, taking into account scenarios, snoozes etc.
    • Simply add dry_run: simulate to any notification data section
    • Option in Advanced section of the action screen
    • Dry Run does everything the normal notification would do, except
    • Call the actual notification integrations or send its own email
    • Move/zoom PTZ cameras or take snapshots
    • Publish Home Assistant notification events
    • Update sensor counts and last notification value
    • Archive the notification to disk Dry Run will
    • Apply the same snooze and dupe detection logic as a real message
      • force_resend available if you want to override the dupe check
    • Closes #218

🐛 Bug fixes

  • Dupe detection no longer considers a snapshot image URL when comparing notifications, since Frigate mints a unique thumbnail per detection even for the same ongoing scene, which was defeating dupe suppression for any snapshot-only alert (e.g. a camera triggering repeatedly over a short period)

v2.11.1

✨ Enhancements

  • Snoozing with assist more flexible, even with non-AI version
    • "snooze notifications for porch camera until 6am" will look for entities or scenarios matching "porch" and apply snoozes only to them
    • The response lists what the term matches now, or says so if it matches nothing, in which case no snooze is made
    • The term is matched as each notification is sent, against its scenarios and the entity_id, name or aliases of its entity_id data or camera, so consistently named scenarios and cameras are all covered
    • Also available as a TAG mobile action snooze, and a tag scope for the AI snooze tool
    • "for driveway camera" snoozes just that camera, as a camera snooze, and asks which if several cameras match
    • Ideal if there's a spider on the camera waking you up in the middle of the night
  • message is now optional for the supernotify.notify action
    • Could be a scenario, delivery or template supplies a pre-set message, or for a media-only notification that only shows image or plays chime
    • It's still required for notify.supernotify, whose schema is owned by Home Assistant as part of notify platform

🐛 Bug fixes

  • Dupe detection now measures the ttl from the first delivered notification, rather than resetting it on every suppressed dupe, so a frequently repeating alert (e.g. a camera trigger every minute) is no longer suppressed indefinitely.

📚 Documentation

  • Overhauled the Usage documents for Notifying and Targets
  • Better explanations of simple and precise targeting
  • More consistent examples, and better organization of content between the 2 pages
  • Several mistakes and unclear things remediated

Developer

  • Docstring fix for Target.select

v2.11.0 - 30/09/2026

✨ Enhancements

The way that integration transports are defined and selected for automatic eligibility in delivering notifications has been overhauled, and several older flags replaced by a more logical way based on how well a transport can definitively identify its own target addresses, as email can do with an email address, or discord with a discord_channel:xxx address.

Aside from making the code simpler, the main impact of this is that the ability to create a big flat list of targets and have them handled correctly is extended to all possible deliveries.

Here's the extreme example from the automated tests, which sends notifications off via email, SMS, mobile push, Discord, Matrix, MQTT, Telegram, HTMT5 Push and vanilla Notify Entity:

Extreme Notification
action: supernotify.notify
data:
  message: hello
  target:
    unique.recipient@example.test
    +15551234567
    mobile_app_unique_test_phone
    discord_channel:434343434
    matrix_room:!uniqueroom:example.org
    topic:home/alerts/non-critical
    telegram_chat_id:215678938
    notify.unique_html5_browser
    notify.unique_alexa_kitchen

Deliveries

  • Archived deliveries now track missed as well as skipped deliveries
  • Skipped where some rules fired to stop it happening, like occupancy or scenarios
  • Missed where for some other reason an envelope couldn't successfully be built or delivered for a requested delivery
  • Transports that have definitive links to targets all marked as default
  • Now also discord, matrix, mqtt and telegram
  • Fixes issue where adding discord_channel:xyz or topic:xyz in list of targets didn't automatically get picked up by discord
  • Transports using media_player continue to need explicit selection since so many different ways of interacting with them
  • Partial Delivery
  • Now only set for missed not skipped deliveries
  • That is if an explicitly selected (by action, recipient or scenario) delivery couldn't be made. In effect you asked for 4 deliveries, only 3 could be made.
  • Implicit deliveries that need targets (like Email or Notify Entity) and have no targets are suppressed without warnings
    • Though are accounted for in the 'delivery provenance' section of the archived notification
  • Delivery provenance only records a scenario as disabling a delivery if that delivery would otherwise have been selected, so a wildcard disable no longer lists every delivery it matched. With debug: true the full list is still recorded
  • Deliveries where the transport has been disabled are likewise suppressed without warnings (disabled deliveries were already excluded).
  • Fixes #232

Discord

  • Delivery can now be triggered automatically by using a target in style discord_channel:434343434 without any other config or action data needed

Matrix

  • Delivery can now be triggered automatically by using a target in style matrix_room:!uniqueroom:example.org without any other config or action data needed

MQTT

  • Delivery can now be triggered automatically by using a target in style topic:queue/name without any other config or action data needed

Telegram

  • Delivery can now be triggered automatically by using a target in style telegram_chat_id:215678938 without any other config or action data needed

🐛 Bug fixes

  • Simplified debug logging for Home Assistant subscriptions that could cause huge log lines and delayed close
  • Voice Occupancy (and delivery occupancy in general) only affected recipient selection, and didn't impact the delivery itself. That's fixed now, so any_in for Voice means the Alexa or TTS deliveries will only be selected if somebody is home
  • Fixes [#231]
  • Fixed migration of old target_include_re and data_keys_include_re to newer style config

📝 Other changes

v2.10.3

✨ Enhancements

Home Assistant Change Tracking

  • Improved the use of Contexts to explain why changes happened, including to scenario state, use of switch entities, and the reset_overrides action
  • Each notification shows in the logbook, from a new supernotify_notification event, with what was sent and via which deliveries, linked back to the automation, script, action call or voice command that caused it
  • A manual scenario's binary sensor, when set by a script or automation, is attributed to it in the logbook and history

📚 Documentation

Developer

  • Diagrams added for architecture, primary classes and primary flow

v2.10.2

✨ Enhancements

Media Player Transport

  • Can now play audio files, like an mp3 alert, or any other media, as well as showing images, contributed by @lollox80
  • Set media_content_id in the delivery data, relative URLs such as /local/sounds/alarm.mp3 are made absolute with the external URL
  • media_content_type defaults to music for this, and can be overridden as before

Alexa Media Player Transport

  • Play an audio file, like an mp3 doorbell chime, on Echo devices with the new audio_url data key, contributed by @lollox80
  • Wrapped in an SSML <audio> tag, followed by the message if there is one, always sent with call type tts as Alexa is silent for SSML audio in announce mode
  • Relative URLs are made absolute with the external URL. Amazon requires public https and 48kbps MP3, see the transport docs
  • Optional audio_duration extends the wait before volume restore or music resume for longer clips
  • See also the Chime Transport for another way to use Alexa Media Player for sounds, and as part of mixed set of chiming devices.

🐛 Bug fixes

Snoozing

  • Fix error handling Clear Snoozes action
  • Fix Enquire Snoozes listing expired snoozes

v2.10.1

✨ Enhancements

Home Assistant Assist

  • Built-in (non-AI) agent sentences in Italian as well as English, contributed by @lollox80
  • The answer comes back in the language of the sentence that matched, whatever the language of the assistant
  • Italian times use the 24 hour clock, so fino alle 15 works as well as fino alle 15:30
  • More flexible time handling for English times, including use of midnight or noon or short forms like 'until 2' or 'until half past 3'. 12 hour time values will be assumed as am/pm based on the current time.

People

  • Removed users added without Person entities from all occupancy checks.
  • They will also not be included for any deliveries sent to only_in or only_out devices since their presence is undefined, they will be included in the all_xxx deliveries
  • Home Assistant uses Person entities to define device ownership and occupancy

🐛 Bug fixes

  • supernotify.enquire_archive with an unknown id now names that id in its error, instead of showing {notification_id}

v2.10.0 - Assist Assist

This release introduces text and voice chat support using Home Assistant Conversation integration and Voice Assistants. Both AI and non-AI chats are supported. The Action UI is further improved with pickers for delivery and scenario.

✨ Enhancements

Action UI

  • Scenarios and deliveries now get populated for easy picking
  • The list is built when Supernotify starts up, is reloaded, or options saved - and after this doesn't take into account subsequent enable/disable actions
  • Scenario only and fallback only deliveries won't be offered as choices
  • Delivery Control free-form text and Delivery Selection moved to Advanced section

Delivery Control Options from UI

  • Two new delivery options that further reduce need to create and edit YAML config
  • Default Inclusion for Deliveries
    • Unset by default
    • Switch this to explicit or scenario to have NO deliveries fire by default, unless overridden by YAML delivery config or a scenario
    • There will only be any notification if the action explicitly selects them or they're switched on by scenario
    • This is a recommended option for full control, since it means every notification is scenario controlled and noisy notifications get filtered out easily
  • Voice Occupancy Control - set a default for the occupancy setting for all deliveries using a SPOKEN transport, for example TTS, Alexa Devices, Alexa Media Player
    • This means no Alexa notifications to an empty house, or whatever occupancy variation you like
    • Can be overridden at delivery level, though for now that needs YAML setup

Home Assistant Assist

  • First beta of integrating with Assist
  • Works with voice or the chat icon built into the app
  • For built-in (non-AI) assist
    • Send notifications, including matching only on first name (if unique)
    • Snooze / unsnooze notifications
    • Get the last notification
    • English only
  • For AI backed agents (Home Assistant 2026.3 or later)
    • Send notifications
    • Arbitrary addresses like emails and phones not accepted for safety (can be used via Recipients or Notify Entities)
    • Custom actions for mobile push also not supported for safety
    • Explain why a notification was delivered the way it was
    • Snooze or un-snooze notifications
    • Dry run a notification
    • Get help from the Supernotify documentation
  • All integration controlled via config UI, so can be fully or partially switched on or off
  • AI Tools functionality also available via Home Assistant's native MCP server

📝 Other changes

  • Action UI now has example values to help understand what fields do
  • New supernotify.enquire_archive action, contributed by @lollox80
  • Inclusion now distinguishes scenario and explicit
  • explicit can be chosen in an action or when enabled by a scenario
  • scenario can only be selected by automated conditions, so won't appear as options on the Delivery choice in Actions UI
  • Unknown delivery or scenario names in a call are now logged along with the configured names, and kept as unknown_names in the archive
  • The engine has a new dry run function, available to users via the AI tooling
  • Repair issues now list what's configured, condition issues include the error, and diagnostics include open issues. The scenario action-group repair used the wrong message, now fixed.
  • Occupancy value in transport delivery_defaults now correctly respected when building deliveries

📚 Documentation

  • Improved Italian translations, provided by @lollox80
  • llms-full.txt for agent support now includes each page's URL for better help lookup
  • Fix the web links for 'Learn More' links in Home Assistant

Note

If an option or menu entry shows without a label after upgrading, the browser is showing its cached copy of the old text - hard-refresh the page, or in the companion app use Settings > Companion app > Debugging > Reset frontend cache.

v2.9.1 - Snooze Fix

🐛 Bug fixes

Snoozing

  • Fixed truncated entity and delivery names where they had underscores
  • Fixed minutes to snooze duration ignored
  • Fixed camera notifications snooze action not snoozing
  • Fixed 'everyone' snoozes not firing
  • Improved e2e testing around snoozes

📚 Documentation

  • JSON schema IDs corrected
  • Developer documentation restructured and concepts added with diagram

v2.9.0 - Target Selection

This version brings target selection up to date with all the latest Home Assistant features, so for example you can choose to send notifications to only the first floor Alexa devices simply by choosing that floor.

✨ Enhancements

People

  • Mobile Discovery previously only automatically found mobile apps to push notifications to if the user also had a Person created in Home Assistant
  • Mobile apps will now be found for discovery if there's no Person defined
  • Recipient config now has person_id as optional, and takes a user_id (long UUID type number rather than an actual name in Home Assistant)
  • Tying together all the automation for people still benefits from having Person records, since this drives device tracking, location and occupancy and person entities can be selected from the Target Selector

Areas, Floors and Labels

  • area_id, floor_id and label_id can be used as notification targets, the same way as in any other Home Assistant action.
  • They are resolved to the entities they reference before anything else sees them, through the same core helper as an entity action, so groups are expanded and an entity inherits the area of its device.
  • An entity in more than one of them - the kitchen, the ground floor and the chime label - is kept once, each delivery's target_categories and target_select then apply to those entities, and a transport never sees a selector. An unknown area, floor or label is logged rather than silently resolving to nothing.
  • Fixes #9

Targets

  • If Supernotify itself is added as a device to the target selector, this is interpreted to mean include all "out of the box" targets, that is the default targets that would be selected if the target list were otherwise empty

Groups

  • Home Assistant groups (group.* helpers and platform groups such as media player groups) are now expanded into their member entities for every transport before target_select is applied.
  • Previously only Chime Transport expanded groups, so e.g. a group.* of media players was silently dropped by the Media Player, Alexa Media Player and Notify Entity transports.
  • Fixes #10
  • Note that with unique_targets enabled, a group in one delivery now dedupes at member level against the same members explicitly targeted in a later delivery, e.g. chime to group.speakers followed by alexa_media_player to media_player.a will skip the latter as a duplicate.

🐛 Bug fixes

  • Cameras that were switched off could appear to be idle rather than unavailable defeating the alternate camera choice or cause broken image placeholders in mobile push notifications
  • reprocess: preserve with no jpeg_opts/png_opts configured previously raised an AttributeError building the cache key, since those options are None rather than empty, so the image was never reprocessed
  • A reprocessed image keeps the format it is saved in: a PNG was written into a .jpg file, which misleads anything going by the extension, MIMEImage included

📝 Other changes

Developer

  • The cache key of a reprocessed image is a stable digest rather than hash(), which is salted per process, so a file reprocessed before the last restart is found again instead of being rewritten every time
  • All the Pillow work for an image - decoding, copying the pixels and re-encoding - now happens in one executor job: only Image.open and Image.new were kept off the event loop, while getdata()/putdata() and save() ran on it
  • Media handling now tested with webp images (in addition to existing jpeg,png and gif)
  • Test images now stamped with format so easier to see if correct image appearing
  • Fixed test cleanup so test images don't build up in local directory
  • New integration test framework, focusing at first on basic expectations for minimal, default, zero YAML installs

v2.8.0 - Proper Entities Part 2

✨ Enhancements

Delivery and Transport Switches

  • Each loaded delivery and transport now has a switch, switch.supernotify_delivery_<name> or switch.supernotify_transport_<name>, named Delivery <name> Enabled and Transport <name> Enabled, on the SuperNotify device. Switching a transport off suppresses all of its deliveries, without changing their own switches

  • Delivery switches and binary_sensors have a transport_enabled attribute, updated as the transport is switched on or off, since a delivery is only used while its transport is enabled too

Persistent Overrides

  • Switching a scenario, recipient, delivery or transport on or off now survives a Home Assistant restart and a reload, for as long as its configured enabled value - its own, or for a delivery without one, its transport's - is unchanged. Changing that value in the config takes back control. An override belongs to its switch: while the switch entity is disabled in Home Assistant, its override is not applied, and it comes back when the switch is enabled again
  • New supernotify.reset_overrides action puts everything switched on or off back to its configured state, for every kind or only for one kind, optionally returning the names reset
  • New Reset overrides button, button.supernotify_reset_overrides, on the SuperNotify device - the same as calling supernotify.reset_overrides for every kind

Debug Trace

  • Every archived notification records which source switched each delivery on or off, as delivery_provenance - default, call, scenario:<name> or recipient:<name> under enabled_by / disabled_by - where the debug trace's delivery_selection only has the combined list for each stage, so the archive shows which scenario turned a channel off, not just that one did. It is small, a few names per delivery, so unlike the rest of the debug trace it doesn't need debug: true and is kept in the minimal archive content too
  • A notification sent with debug: true is archived with its full diagnostic content, debug_trace included, whatever outcomes the archive diagnostics option selects. Before, the trace was only kept for the selected outcomes, ERROR by default, so a successful debug: true notification lost it

🚨 Breaking changes

  • Delivery and transport binary_sensors behave the same way as the recipients since v2.7.0
  • Only mirror the new switches, so are deprecated and will be removed in a future version. They are read-only real entities on the SuperNotify device, only kept for an install that already has them, for a delivery or transport that is loaded. A repair is raised once if you have one enabled
  • Writing the state of a delivery or transport binary_sensor no longer enables or disables it, use its switch instead

🐛 Bug fixes

  • A notification where a recipient switches a delivery on or off for themselves could not be archived, full or minimal - DeliveryTargetOverride.as_dict() rejected the archive's keyword arguments

📝 Other changes

  • Cleaned up some spurious or noisy debug logging for test execution

Privacy

  • Email and phone numbers redacted where identified in Diagnostics bundle, and when debug logging recipients

📚 Documentation

  • Debug recipe corrected - it is debug: true on the notification, not on the delivery, that records the trace

⚠️ Deprecated

2.7.0 - Proper Entities Part 1

Native Entities

  • Scenario and recipients are now real switch entities
  • Sent/failure notification counters are now real Home Assistant sensor entities
  • New real entities are grouped under a single SuperNotify device, instead of hand-written state writes with no Entity behind them - same entity_ids, no reconfiguration needed
  • Fixes the notification/failure counters resetting to 0 on every Home Assistant restart - they now restore their last value
  • The scenario binary_sensor stays read-only for conditional scenarios, as the place to see whether a scenario's conditions currently apply, while its new switch says whether it is enabled.
  • A scenario with no conditions has a Scenario Manual read/write binary_sensor, which stays the way to control it from outside Supernotify: while it is on the scenario applies, as if its conditions held, and its state is restored across a restart
  • The recipient binary_sensor only mirrors the recipient switch, so is deprecated and will be removed in a future version. It is read-only, and not created on a new install, or for a recipient added to an existing one. A repair is raised once if you have it enabled
  • Delivery and transport binary_sensors are otherwise unchanged for now - a separate, larger conversion to switch entities is tracked in issue #175 - but now belong to the config entry

Notify Entities

  • The notify entities created for recipients now have the timestamp changed however they were notified by SuperNotify (previously only updated if the Notify Entity itself was used, as in send_message)
  • Home Assistant context is used for the Notify Entity timestamp, so its possible to look at a sent timestamp on an entity and see why it was notified

Scenario and Recipient Switches

  • Each scenario and recipient now has a switch, switch.supernotify_scenario_<name> or switch.supernotify_recipient_<name>, to enable and disable it
  • Breaking: writing the state of a scenario or recipient binary_sensor no longer enables or disables it, use the switch instead. The scenario binary_sensor now only reports whether the scenario's conditions hold, and the recipient one mirrors the recipient's enabled flag
  • Scenario and recipient entity names are translated, and put the type first so each sorts together in the entity list: Scenario <name> and Recipient <name> for the binary_sensors, and Scenario <name> Enabled and Recipient <name> Enabled for the switches

📝 Other changes

  • HomeAssistant compatibility moved to 2026.9.3
  • Fix handling of target specific data, that could lead to targets showing up in other envelopes
  • If a camera or other image source not available, the mobile push is text only rather than showing with a broken image
  • Fix a delivery disabled in config but enabled at run-time never being used implicitly or as a fallback
  • Fix supernotify.refresh_entities failing, as it wrote entity state from outside the event loop

Internal

  • EnityCategory renamed to TargetEntityCategory to avoid naming clash with Home Assistant term

2.6.0 - Notification UI

Action Data

The new supernotify.notify action introduced in v2.0.0 has a simpler way of handling data mappings than the original legacy Notify platform way. - In the old notify the top level data could hold only message and title and everything else got pushed down to a second level nested data - From v2.6.0, the new action will detect if the old style nested data is used and remap it to the new flat style. Its still worth at some point going back over old automations, since two levels of data was always confusing. - data elements to be passed down to other actions, and not for Supernotify itself (other than running templates over them) are now named extra_data in line with the UI. The old name works fine, though the contents will get autodetected for old style nested data, whereas extra_data will be left alone. - force_resend now a top-level action data item, see also spoken_message - timestamp can now be set from the action UI. Supply a strftime format and it will be prepended to every message

Voice

  • Spoken Message is now a top-level field, so can be set easily from the Automation Actions panel or the Tools Action call. In YAML this is spoken_message

Transport Options

  • Options for transports are now self-describing, so auto generated table of options up to date and more detail
  • message_html removed from spoken only envelopes

Multimedia

  • Added missing snapshot_image_path to allowed media: options

Media Transport

  • Now uses the standard image grabbing modules, and supports the jpeg_opts and png_opts for image tuning

Documentation

  • Fix automatically generated validation schema documentation
  • Added automated test for the YAML examples in docs
  • Roadmap of technial and features added

Technical

  • message_html,timestamp and priority managed only within envelope and not passed down further to transports in the catch-all data section

2.5.3 - Voice Improvements

Spoken Notifications

  • Simplify Text
  • SSML tags now untouched and left for devices to interpret
  • Unicode Sc category now added to the simplify text filter
  • Common signs (+,-,=,%) that make sense to vocalize are omitted from the Unicode special character filter
  • Unicode is now NFC normalized prior to Unicode Mn filtering to strip out marks, so accented characters in NFD-decomposed text better handled
  • Strip URLs
  • False positive for words ending with : fixed
  • Scenario Templates
  • Simplify Text and Strip URLs is now applied after any scenario templates update message and title
  • New voice documentation page added

2.5.2

Alexa Media Player

  • Fix for auto discovery on Alexa Media Player, where every action registered by the integration hits the same function
  • Service lookup ignores target-specific instances of an action to find the target neutral one

2.5.1

Alexa Devices

  • Automatic deliveries, alexa_devices_announce_all and alexa_devices_speak_all now only select devices and ignore speaker groups so not double notifying
  • Speaker Groups are a good thing, however its not possible to work out if they are all devices or a subset from auto-discovery
  • If you want a group, then override the delivery with the group as target, or create a new delivery

Recipes

  • Simple Live Activity for a dishwasher
  • This will be improved to support progress bars etc

2.5.0 - Delivery Overhaul

Deliveries

There's an explanation of the aims and design of deliveries, transports and targets in the Roadmap section at Deliveries and Transports.

  • Every transport that is available to use is automatically available as a delivery with the same name.
  • Transports that don't have unambiguous targets are defined with selection as explicit so they won't be automatically used unless selected explicitly on a notification, or configuration overridden
  • Deliveries no longer have a default_ prefix, although existing automations which use these will automatically be switched to email,notify_entity etc
  • Auto discovery of action name for lots of transports, see list below
  • A repair is raised for any deliveries that have the same name as a transport but don't use that transport. The transport name is effectively a reserved delivery name.
  • Creating Delivery objects now only necessary if there's more than one Delivery for the same transport, like plain_email and html_email, different Telegram channels etc
    • Everything that can be done with a Delivery configuration can be done with the delivery_defaults: section of a Transport object
    • Its also possible to avoid creating Delivery objects in YAML by defining the relevant data: items in a notification action, although this gets unwieldy (the whole point of Delivery objects is to define this stuff once and not across many notifications).
  • Switch entities are only published for Transport objects that are available
  • So you won't get clutter for things like ntfy,gotfy,alexa_media_player if those are not installed
  • Default delivery creation tightened for Notify Entity and Mobile Push, so these Delivery objects don't get created if there are no mobile apps or notify entities on the Home Assistant instance.
  • Transports have a load control, switching this off means there's no attempt to auto-discover it, and it never has a Delivery or Home Assistant entities created for it
  • Transports with no automatic or manual Delivery pre-sets get unloaded, so don't appear as entities
  • Auto-configure for email will respect the direct mode if connection details present
  • Transport and Delivery now are controlled by inclusion rather than selection since that was confusing with the different but similar delivery_selection in the notification. The older keyword is still supported but deprecated.
  • Auto generated deliveries give way to manually configured deliveries of the same name, and come last in any selection battle to handle unique targets

Targets

There has a wide overhaul of how targets are categorized and tied back to transports - this has simplified the code, and should make it simpler to configure and more predictable in how it will behave. Regression tests and migration code has been used to keep it backward compatible with existing configurations. There's also a new documentation page for Target Usage.

  • A flat target list can scope an entry to a target category with a category:value prefix (e.g. topic:some/topic), as shorthand for the dictionary target form
  • Each transport now declares the target categories it accepts (entity_id selectors can further narrow by Home Assistant domain and/or registered platform), replacing the old target_categories/target_platform_select options - see Targets
  • Archive message now has uncategorized_targets and unassigned_targets to help debugging delivery issues
  • New topic, discord_channel and matrix_room categories for MQTT, Discord and Matrix
  • A target category matching a delivery's own name, or its transport's name, always reaches that delivery - so sms:1234 reaches any enabled SMS delivery, while a specific delivery name (e.g. html_email:...) pins a target to just that one
  • An error will be raised logged if there any targets that can't be mapped to a category - this won't stop the rest of the notification working, but will make it visible

Alexa Devices

  • Three automatically generated standard deliveries
  • alexa_devices - picks up on any Alexa notify entities in the target list, does nothing if no targets
  • alexa_devices_speak_all - sends notification to all speak Alexa notify entities, takes no targets
  • alexa_devices_announce_all - sends notification to all announce Alexa notify entities, takes no targets
  • This means that it is easy with a Zero YAML configuration to use Alexa announcements - just add alexa_devices_announce_all to the list of deliveries

Alexa Media Player

  • Automatically finds correct notify action by default

Discord

  • Automatically finds correct notify action by default

Email

  • The internal SMTP integration is used by default, and will reuse the Home Assistant SMTP connection details if SMTP set up via the UI

Gotify

  • Automatically finds correct notify action by default

Live Scenarios

  • Fix scenarios without entities, such as date based ones using now() being left out of periodic sweep to recompute

Notify Entity

  • Target selection for notify entities now uses Home Assistant domain that provided the entity
  • This is used for html5 and alexa_devices so that Notify Entities are handled correctly by the right transport, with the very basic notify_entity as a back stop

MQTT

  • Delivery now accepts a topic as a target, and takes payload from message. Previous behaviour remains supported.

Mobile Actions

  • Exposed group on mobile actions as mobile_push_group (previously undocumented and mis-named action_category)
  • Fixed problem with action_template and title_template producing broken buttons
  • Stop forcing mobile notifications into 'general' or 'appd' group
  • New doc page on how they work

Pushover

  • Automatically finds correct notify action by default

SMS

  • Automatically finds correct notify action by default for Twilio and Mikrotik_SMS integrations

Technical

  • Documentation auto-generation moved to probatio, retiring voluptuous-openapi
  • Improved order of fields in archive for most useful to top, and related together
  • HomeAssistant compatibility moved to 2026.9.2
  • Developer automated documentation for Transports expose the new target configurations they have
  • Manifest updated so Supernotify will wait for all its dependent integrations before starting up

2.4.2

Fixes

  • Automation editor could leave data fields at null, for example constrain_scenarios which got rejected by schema validator. Null values now explicitly allowed, and handled as unset for optional values.
  • Fixed an obscure set amalgamation bug in notification.py select_deliveries() that could cause different results for multiple deliveries

2.4.1

Data Templates

  • Templated data sections now rendered prior to downstream transport being called, e.g. if Alexa volume computed. Provided by @lollox80

Tracing Activities

  • Home Assistant context added to state changes and events driven by notifications.

Home Assistant Compatibility

  • New Repair raised if running under Python 3.13, to warn about support dropping with the HA 2026.10 release. Note that 2026.3.0 is the first Home Assistant release to require Python 3.14.

Testing

  • Automated testing of 6 month prior Home Assistant release added, and versions will be rolled to maintain compatibility check.

2.4.0

Live Scenarios

  • Scenarios can now expose their state as binary_sensor, and compute that state both reactively as underlying entities change state, or optionally with a periodic re-compute
  • New Scenario Control configuration added, with initial usage for controlling live scenario state

Snoozes

  • Active snoozes are now persisted across Home Assistant restarts, using standard Home Assistant storage for integrations, provided by @lollox80

Camera

  • Camera and image snapping now uses direct entity calls rather than Home Assistant actions and polling for results, provided by @lollox80
  • The previously hard-coded max wait time to snap an image of 20 seconds is now configurable with snap_wait in the camera configuration.
  • This is different from the existing camera_delay and PTZ controls in that its not a pause. If the camera snap is instant, then the snap_wait time will never be used, its only an allowance for cameras that are slow to snapshot.

Diagnostics

  • Integration now has a standard Home Assistant Diagnostics option, gathering info previously provided by multiple diagnostics actions, provided by @lollox80

Tracing Activities

  • Fixed missing contexts on downstream actions, a consequence of relying on code from the "legacy" Home Assistant Notification platform, which throws away context
  • If no context is passed, Supernotify creates its own, so anything that happens thereafter has a trace

Fixes

  • Notification with an unavailable attachment could fail, will now proceed with or without attachment
  • Two messages with same title and message but different camera entities, or media URLs for attachments, will not be considered as dupes
  • Additional actions now have documented options with translations, provided by @lollox80

Technical

  • The main SuperNotificationService no longer inherits from BaseNotificationClass and the latter included only as a compatibility shim to ensure current usage as a Notification sub-platform doesn't break.
  • notify.py slimmed down by moving main engine to engine.py, delivery/transport/people/scenario functionality out to registries, actions out to actions.py leaving only the Notify Entity / legacy Notification platform shims out to notify_compatibility.py

2.3.1

Occupancy

  • If no occupants defined, then occupancy will be explicitly UNDEFINED_OCCUPANTS rather than left ambiguous

Technical

  • Clean up of code and tests, tightened linting and typing rules
  • Tidied up some error handling and diagnostics for notification delivery
  • Image grab task now cleaned up if delivery times out

2.3.0

Dedicated Notify Action

  • The existing notify action is offered via the HA notify platform, so Supernotify acts as a 'sub-platform'. This has several consequences:
  • The web page in Tools | Actions or the Automations dialog is unfriendly to use with lots of things to put into data section with no help
  • The context for the notification isn't passed down by Home Assistant, since the notification platform doesn't follow the curretnt guidelines
  • This usage of the notification platform is legacy, replaced by Notify Entity which has a very limited action, just title and message
  • A new dedicated notify action is now available directly from the Supernotify platform
  • Options otherwise buried in notify.supernotify's generic data: field (priority, delivery, require_scenarios, media, etc) are promoted to their own typed, selector-driven fields, for a richer Developer Tools/automation editor UI, to make configuring even sophisticated notifications hugely easier
  • Camera and image/video URLs are broken out into separate fields to make them easier to use, and also allow the Home Assistant Camera selector to be used
  • Separate optional field for custom targets, like e-mail addresses, Telegram IDs that won't work with Home Assistant built-in selectors. Optional but unnecessary for YAML use, since the target field usage is unchanged.
  • The original context is preserved, so you can trace from a trigger like motion PIR, all the way thru to an alert call and camera PTZ movement
  • No change to the original notify.supernotify action, so nothing breaks, and there's a choice (maximum compatibility with legacy notify, so can easily switch between notify providers, or ease of use and insulated from future deprecations of HA notify)

Tracing Activities

  • Home Assistant Context is propagated to all Home Assistant services used
  • For example, if a security camera has a PTZ movement, the Home Assistant Activity view can show what triggered this
  • One important limitation - Home Assistant's own notify platform doesn't pass on the Context it receives, however the newer Notify Entity does.
  • See the 2026.9 Release Blog for more on the new UI support for this
  • An end to end integration test test_integration.test_context_propagates_to_camera_ptz_and_mobile_push demonstrates this working
  • New supernotify.notify action propagates any context it rexeives
  • Context IDs ( context id, parent context id, user id ) are saved with the archive notification JSON object for debug or analysis

Technical

  • ty type checker reinstalled, and several type usages tightened up
  • Avoided the mkdocsalypse by switching docs generation to properdocs

2.2.3

  • enquire_last_notification now has option to return the full notification with diagnostic info
  • Alexa Media Player fixes
  • Fixed wait_for_tts if auto_pause switched off
  • Fixed empty message meaning music not unpaused
  • Post announce now also uses async calls for better performance / Home Assistant conformity
  • Post announce runs if main notification fails if needed for cleanup
  • Cameras
  • Fixed default PTZ delay

2.2.2

  • Explicit camera_delay in notification respected even if there's no PTZ requested
  • Improved logging for camera PTZ and snapping
  • enquire_recipients now exposed as a Home Assistant action
  • Alexa Media Player transport has fix for #176 error when volume set

2.2.1

Alexa Media Player

  • Capture of pre-announcement state to minimize impact on audio already playing now more efficient with async rather than loop per Alexa device
  • Improved documentation for volume, pause etc control per notification
  • Added new media_auto_pause transport/delivery option to allow the audio interruption handling to be globally disabled by default
  • Can still be overridden if needed by a separate delivery definition
  • Saves delay and Amazon API calls on every notification, minimizing chance of rate limiting

Fixes

  • Log warning in Home Assistant Recorder when using camera snapshots, and a JSON serialization problem [#173]
  • Fixed deprecation version comment [#174]
  • Fixed ptz_delay applied when no PTZ preset [#172]

2.2.0

  • Recipients and Notify Entities
  • Recipients are now Notify Entities, so can be called with send_message directly from automations, and also support being member of a Notify Entity Group
  • Undocumented recipients key on notify action data now deprecated, specify recipients as regular targets
  • Improved handling of enablement or disablement of deliveries per recipient
  • Cameras - more usable without YAML config
  • ptz_method now defaults to frigate if the camera defined by the frigate integration even if no camera definition provided in config
  • ptz_delay defaults to 10 if not defined in camera config, or camera not defined at all
  • Minor fixes
  • Conditional error log handler for placeholders
  • Strict template mode undo
  • Better tests

2.1.0

Gratitude to @lollox80 for contributing 4 new transport integrations

Matrix transport

  • New native matrix transport using matrix.send_message: html/text format, threads, camera snapshot attachment, optional priority emoji prefix, room target validation. See docs/transports/matrix.md.

Kodi transport

  • New native kodi transport: on-screen overlay notifications via kodi.call_method / GUI.ShowNotification on any media_player.kodi_* entity, priority-mapped icon, camera snapshot as overlay icon. See docs/transports/kodi.md.

Discord transport

  • New native discord transport: markdown title, rich embeds, camera snapshot upload, remote image URLs, optional priority emoji prefix, 2000-char truncation. See docs/transports/discord.md.

HTML5 transport

  • New native html5 browser push transport using the modern html5.send_message entity service: priority-mapped urgency, tag/renotify, action buttons, snapshot image URL, silent/vibrate exclusivity guard. See docs/transports/html5.md.

2.0.0

Scenario state entities

  • binary_sensor.supernotify_scenario_<name> now reports the evaluated state of the scenario (on/off) instead of a hard-coded unknown. A state change of an entity a scenario's conditions reference re-evaluates only the scenarios depending on that entity; a periodic sweep covers conditions no entity change announces, such as time windows. Scenarios whose conditions reference no entity (priority-only or manually applied) stay unknown.
  • Evaluating conditions costs whatever the conditions cost, so the whole mechanism is switchable:
  • scenario_control: {refresh: false} subscribes to nothing and starts no timer
  • scenario_control: {refresh_interval: <seconds>} tunes the sweep, or disables it with 0 while keeping the reactive path
  • expose_state: false on an individual scenario keeps an expensive one out of it without turning the feature off

ConfigFlow

  • SuperNotify is now set up using the standard HomeAssistant UI ('ConfigFlow')
  • This covers basic use cases using default deliveries, like mobile push and email
  • More advanced configuration - like scenarios, cameras, transport, action configs etc - continues to require YAML configuration
  • That YAML now lives under a top-level supernotify: key, not the old notify: - platform: supernotify block - typically split out with supernotify: !include supernotify.yaml
  • The config entry is now the sole, unconditional owner of the notify.supernotify action - no more dual registration between YAML and the UI
  • A leftover notify: - platform: supernotify block is inert (nothing is registered from it) but raises a fixable repair that automates the move: writes supernotify.yaml, adds the include line, reloads immediately - no restart needed. Migrating by hand instead works just as well; either way, deleting the old block afterwards is what makes the repair stop reappearing
  • A custom name: from that old block (which determines the actual notify.<name> action, e.g. name: SuperNotifier → notify.supernotifier) is kept in sync automatically on every load, independent of whether the repair has been run yet - existing installs don't lose their action name mid-upgrade
  • Core config (archive/dupe_check/housekeeping/paths/name) is reconfigurable via UI, and now actually applies immediately via an update listener - no reload/restart needed

SMTP

  • v1.17.0 introduced a separate smtp transport to work round problems created by new Home Assistant Notify Entities. To make this less confusing, the new direct SMTP integration is merged back into the email transport, switched on by a options keyword
  • Existing deliveries will have a warning in the logs, and will attempt to redirect to the email integration in direct mode, although in practice changes will be required to config to remove the smtp transport references (which has only been available for 1 week)

Technical Changes

  • Step 1 of the roadmap updated to minimize reuse of 'legacy' integration style, then extended further to retire that legacy style entirely for the notify-platform registration
  • Details
  • config_flow.py — zero-required-field user step (reproduces minimal.yaml), options flow with archive/dupe_check/housekeeping pages, single_config_entry enforced, plus a name field determining the registered action.
  • __init__.py — CONFIG_SCHEMA/async_setup for the top-level supernotify: key; async_setup_entry unconditionally owns notify.supernotify, computing the service name from entry.data[name]; an update listener reloads the entry so options/reconfigure changes apply immediately.
  • notify.py — async_get_service (the legacy notify: platform entrypoint) reduced to a shim: raises the migration repair and syncs entry.data[name] from the legacy config on every load, but registers nothing itself.
  • manifest.json — config_flow: true, single_config_entry: true, notify added to dependencies.
  • strings.json + all 11 translations/*.json — new fields, options pages, and the migration repair's fixable flow text.
  • schema.py — split into SUPERNOTIFY_YAML_SCHEMA (8 YAML-only keys), CONFIG_ENTRY_SCHEMA (8 ConfigEntry-owned keys), FULL_CONFIG_SCHEMA (single-pass union, for tests) - _entry_full_config validates entry.data/options through CONFIG_ENTRY_SCHEMA and merges in the already-validated YAML section as-is, rather than re-validating a combined dict a second time (which would reject values a first pass already coerced, e.g. cv.template's Template objects).
  • repairs.py (new) — the legacy_yaml_config fixable repair: writes supernotify.yaml + appends the include line, validated on the event loop before writing (cv.template's bare-Jinja-string condition shorthand needs the event-loop-bound hass context, so this can't happen from the executor thread the file I/O runs in), validates configuration.yaml as a whole before and after via async_check_ha_config_file, rolls back and logs the underlying error on any failure, raises a separate persistent legacy_yaml_manual_migration_required issue when automation can't proceed, and serializes the whole write-and-reload sequence behind a lock so two concurrent attempts can't interleave.
  • Tests: test_config_flow.py, test_init.py, test_repairs.py (new), test_config_yaml.py, test_example_configs.py all updated/added for the new architecture.
  • Docs: docs/configuration/yaml.md, email.md and docs/recipes/contextual_mobile_actions.md updated for the top-level supernotify: key; docgen/schema_extractor.py updated for the renamed schema.
  • Fix log errors from accessing version in manifest.json and eager loading MQTT component
  • Silver level HA Quality Level Checks
  • Stage 2 of the roadmap partially implemented, 'Bronze' level only
  • Better testing of user supplied values in config
  • Additional services moved to shared yaml/ui config code
  • Improved exception handling
  • Template Path
  • Directory now created if specified and doesn't exist
  • Default is relative to config home rather than hard-coded to /config
  • Better logging for path actions
  • Async I/O
  • Final 2 media_grab.py Pillow image I/O wrapped as async
  • SMTP attach file now uses aiofiles

1.17.1

  • New standalone smtp integration will reuse connection details from an existing Home Assistant SMTP integration
  • Only for the new UI based SMTP configuration, not the original yaml configuration
  • This can be used to avoid defining the same information twice

1.17.0

  • Adds an alternative smtp integration which preserves the original Home Assistant behaviour
  • No need to have the overhead of pre-registering every e-mail address as a 'notify entity'
  • Attachment, template and HTML behaviour identical to existing email integration
  • Emails using smtp support Importance,Priority,X-Priority and X-MSMail-Priority headers. Values are mapped automatically from the Supernotify priority.
  • Message-Id in email header ties back to notification ID and delivery name
  • default_title option for emails without titles set in notification
  • delivery_selection of fixed overrides priority and condition filtering at delivery level, if selection is fixed, only enabled at transport or delivery level will override your command.

1.16.6

  • Upgrade dependencies and tests for HA 2026.8.0
  • Support for changes to Device Manager in HA 2026.8 and later
  • Details at https://developers.home-assistant.io/blog/2026/07/21/device-registry-single-config-entry
  • Fallback to previous behaviour for older versions of Home Assistant that don't have the new device API for config entries
  • Quality Scale re-audited
  • Roadmap added for migration to ConfigFlow and improved HA quality scale level
  • Removal and clean up instructions added to 'Getting Started' guide

1.16.5

  • Fix wildcard scenarios selecting other scenarios that wouldn't otherwise be matched
  • Test fixes by pinning pytest-homeassistant-custom-component

1.16.4

  • Upgraded to Ruff 0.16.0 and enabled full rule set, fixed resulting lint errors
  • Added EnvelopeOutcome enum to replace previous KEY_ constants
  • Archived notification now has a single outcome value for overall delivery result
  • Archived notifications have separate delivery_exceptions field for transport errors

1.16.3

  • Dependencies update, incl HA compatibility linked to 2026.7.x ( maintaining 2026.2.x for py3.13 testing )
  • Test fixes for recent HA changes

1.16.2

  • Dependencies update, incl HA compatibility linked to 2026.6.x ( maintaining 2026.2.x for py3.13 testing )

1.16.1

Mobile Push

  • Device selection (by model,manufacturer etc) now applies at delivery time not just discovery time, so the global discovery by person doesn't have to be switch off to create a phone model specific delivery

Chime

  • Device selection (by model,manufacturer etc) now applies at delivery time not just discovery time

TTS

  • Device selection (by model,manufacturer etc) now applies at delivery time not just discovery time

1.16.0

Mobile Push

  • Data sections can now be filtered in/out to any level of nesting
  • Common use case - trimming out values from Frigate blueprint like attachment or video that can result in broken thumbnails for Apple notifications
  • Fix Frigate Apple Push reciped added.

Generic

  • The nested support for data filtering introduced for Mobile Push introduced also for Generic transport

Other

  • Version of Supernotify added to archived notification

1.15.0

New transports

  • Pushover, Telegram and LaMetric, contributed by @lollox80

Multimedia

  • New media_url_prefix in platform settings to control the URL path which Home Assistant uses to expose the media directory. Make this empty to stop the directory being available via HA web UI
  • Fix media cleanup job handling of files in subdirectories
  • Removed absolute URL transform for mobile push, so companion app can resolve with appropriate URL

Mobile Push

  • By default, thumbnail image is captured at time of notification
  • Better Android integration
  • Multiple new tuning keys for data section to use Android or iOS features
  • Where they can be positively identified, iOS and Android devices are only sent data fields they support

1.14.1

PTZ

  • Mobile Push deliveries will defer until a PTZ operation complete

1.14.0

Delivery Sequencing

  • Delivieries now use asyncio.gather to maximize parallelism
  • Deliveries needing snapshot images sequence after simple service calls
  • Camera PTZ call initiated at the start, so motion can complete in background while service calls happening

New Transports

  • Gotify contributed by @lollox80
  • Ntfy is now its own transport, (with older mechanism still available in Generic Transport), contributed by @lollox80

Bug fixes

  • Multiple bug fixes contributed by @lollox80
  • GitHub actions now runs tests and lints for both py3.13 and py3.14

Diagnostics

  • Call record now has a timestamp for service call

1.13.0

Transport Generic

  • Replaced hard-coded allow-list of fields per underlying service with dynamic validation using the service's action schema to prune out unsupported fields or make type conversions.
  • Generic can also now support a much wider set of Home Assistant built-in and custom integrations reliably, pruning out data wherever a schema is provided
  • Added support for notify_events, translating standard priority and passing on image URLs in expected format. Use handle_as_domain: notify_events on Delivery options for the specific processing
  • Corrected ntfy integration handling of images and actions

Archiving

  • Use local timezone for archive notification file path

1.12.2

  • Prioritize data from action call over scenario or target derived data
  • Minor test and lint fixes for 3.14, and improved test coverage

1.12.1

  • Translations for Dutch, French, German, Hindi, Italian, Japanese, Polish, Portuguese, Simplified Chinese and Spanish
  • Vertalingen voor Nederlands, Traductions en français, Übersetzungen auf Deutsch, हिंदी में अनुवाद, Traduzioni in italiano, 日本語の翻訳, Tłumaczenia po polsku, Traduções em português, 简体中文翻译 en traducciones al español

1.12.0

Alexa Media Player

Includes major fixes and improvements contributed by @lollox80 - Alexa Media Player volume control now works, along with ability to pause and restart any music previously playing - spoken_message can now be set in data as an alternative to message for any of the voice options (TTS, Alexa Media Player, Alexa Devices)

Delivery Overrides

  • Overrides now respect message or title in the data section for channel specific messages
  • New recipe to illustrate it
  • Overrides now match against the name of a transport if there's no matching delivery
  • Delivery overrides that have indirect targets like person now correctly resolved to email / sms / slack / mobile etc
  • Explicitly enabled deliveries in action call not overridden by scenarios

1.11.1

Includes fixes and improvements contributed by @lollox80 - Icon fixes - notification_id suppressed in persistent notification if null - Archive file names sanitized for Windows/SMB - URLs in action groups allow homeassistant:// deep links - Suppress repeating condition_variables from archived envelopes - Expand templated values in data for archiving - Migrate old condition to conditions

1.11.0

Dupe Checking

  • force_resend can be set in data section to override dupe handling ( contribution by @lollox80)
  • dupe_policy_message_title_same duplicate detection policy added

Internal

  • Added more tests, focusing on transports and media_grab

1.10.1

  • Lint and type fixes

1.10.0

Includes Italian translations, fixes and improvements contributed by @lollox80

Configuration

  • New snooze config, with configurable default snooze time to replace hard coded 1 hour

Templating

  • Extra data passed via notification now available on templates as notification_data

Archive

  • Can now send HomeAssistant events in the archiver, which also enables Syslog or OTLP event creation using Remote Logger
  • debug option replaced by diagnostics to automatically switch maximal archive messages on or off depending on notification outcome, using same policy as event selection

Fixes

  • Deprecated and obsoleted icons replaced
  • Sanitizing messages for voice assistants now strips emojis and other weird unicode
  • Archive writing now async
  • Corrected MDI icons for developer tools view

1.9.4

Internal

  • __init__.py refactored into schema.py and const.py
  • Python default now 3.14, in line with Home Assistant
  • Added translations for Italian, French, German and Spanish
  • Primary target Home Assistant version now 2026.3

1.9.3

Dependencies

  • Primary target Home Assistant version now 2026.1

Scenario names

  • Added NO_SCENARIO as a reserved name for scenarios, since Home Assistant Dev Tools action panel will translate NULL into a None value
  • Scenario names now validated at startup

Action Data Validation

  • Improved handling of failures in humanize library to handle validation

1.9.2

Fixes

  • snapshot_image_path now always a string rather than path object when added back to data
  • Prevent a dict or list value for priority raising unexpected error

1.9.1

Cameras

  • Allow a separate entity id for PTZ movements, ptz_camera

1.9.0

Device Discovery

  • Now configured via options and can be used for mobile_app_ids or device_ids
  • Mobile app discovery improved, no longer needs mobile app device trackers to be configured in Home Assistant Person screen
  • Discovery now happens at Delivery level rather than Transport
  • Discovery can filter in or out device by platform, operating system, area_id, label, model or manufacturer
  • Mobile App info now has a typed class rather than dict for better type safety
  • More attributes now picked up for mobile app, incl OS name and version, app version, user_id, area_id and label
  • Discovered mobile apps are linked back to people, and recipient objects, where possible
  • Allow auto-discovered mobile apps to be disabled for notification in Recipient
  • Device discovery now also occurs for auto generated default delivery, e.g. mobile_push

Mobile Push

  • Now supports push to all known mobile apps using device discovery, not just the Device Trackers assigned in the Person integration

TTS

  • TTS Transport Adaptor supports TTS delivery to Android mobile apps

Delivery Options

  • All include options now consistently use the selection block model and named in xxxx_select pattern
  • Also means that target selection now supports inclusion or exclusion
  • Auto upgrade of previous deprecated options, though only live, config now re-written

Deprecated

All deprecations will be automatically handled in config as if newer config used, and details sent to log

Options

  • data_keys_include_re - Use data_keys_select
  • data_keys_exclude_re - Use data_keys_select
  • target_include_re - Use target_select

Transports

  • device_discovery - Use device_discovery in options:
  • device_options - Use device_options in options:
  • device_model_include - Use device_model_select in options:
  • device_model_exclude - Use device_model_select in options:

1.8.2

Debugging

  • Debug trace now holds exception traces for email templates and chime action building
  • Transport Adaptor entities now expose more transport specific attributes

Email Transport

  • Extra check on template living on file system

Example HTML Email Template

  • Now the default template always available, though overridable
  • Colours now set by priority, message_html used if set, and general cleanup
  • Example renders now on docs page

1.8.1

Generic Transport

  • Can now adapt a message for the ntfy Home Assistant integration
  • Entity selection is now specific to the domain, e.g. switch,input_text,notify

Priority

  • Custom priorities now supported ( default continues to be medium )
  • New standard priority minimum and mapping of all priorities to the common 1..5 range with 5 as critical

1.8.0

TTS Transport

  • New transport for TTS integration, hiding its complicated double entity_id call

Generic Transport

  • New raw option to switch off domain-specific shaping of data contents
  • Will now prune fields for tts

Email Transport

  • The first available smtp integration is automatically configured as DEFAULT_email delivery
  • So, zero-config usage now accepts notifications with email addresses as targets

HTML Email Templates

  • alert template object now preserved in debug_trace for archived notifications
  • alert.server.language added for Home Assistant configured language code, e.g. en
  • alert.preheader added for pre-header text, defaulting to combination of title and message
  • New options preheader_blank and preheader_length to control packing out the pre-header with blanks for cleaner inbox visibility
  • Added new strict_template to the transport option to perform more validation of template, useful when developing new templates
  • Changed Alert variables to TypedDicts
  • Added ensure_valid step before rendering
  • Switched off parse_results for rendering
  • Image now available for attachments, previously only where snapshot_url given
  • Fixed Jinja2 format and variable name issues in default template
  • action_url and action_url_title now passed to template
  • Corrected snapshot_url to be taken from media section as other transports

Media Player Transport

  • Corrected snapshot_url to be taken from media section as other transports

1.7.0

Scenario

  • Scenarios can now use regular expressions for the delivery configuration, for example .* to apply to all
  • enquire_deliveries_by_scenario action now lists which deliveries are enabled by the scenario, disabled by it, and all the scenarios to which it applies overrides
  • delivery section now has the same flexibility as on an action call - it can be a mapping, list or single string, the latter two are all that is needed to simply enable deliveries

Cameras

  • Camera entity's built in device tracker will now be used, no need for separate device tracker where this supported
  • Better diagnostics for unavailable cameras

People / Recipients

  • Automatically discovered mobile devices merge into manually registered ones rather than overwriting them
  • Enabled flag for deliveries in Recipient are now respected in delivery selection
  • Recipient overrides can now re-enable otherwise disabled deliveries, as scenarios have already been able to do
  • Like scenario, deliveries can be overridden without enabling by setting enabled: as empty value
  • recipient_enable_deliveries recorded in debug_trace as in the notification archive

Notification Archive

  • Further improvements to Notification archive object to make it easier to debug
    • Original message now at top of object
    • Envelopes for each delivery categorized into delivered,failed,skipped and no_envelopes
    • More stats on notification outcomes

Email Templates

  • Loading templates and rendering now using non-blocking IO
  • Standard Home Assistant templates used for full range of variables and filters

1.6.0

Fixes

  • Image attachments from mobile push style notifications not being picked up by e-mail
  • This affected use of the Frigate Blueprint to generate both e-mail and mobile push with image attachment
  • E2E Recipe test now in place for Frigate Blueprint notification to prevent regression

Changes

  • Better Home Assistant standards compliance
  • Exposed entities are now correctly named in the binary_sensor platform rather than inventing a new one
  • Replaced ValueError with ServiceValidationError and HomeAssistantError for HA compatibility
  • Configuration technical entity now replaced with a enquire_configuration service
  • Easier to debug failed deliveries
    • Archived notification now has a deliveries dict
    • It has all delivered and un-delivered envelopes, plus details of deliveries that had no envelopes generated.
    • Can see in one place now what happened with each selected delivery

Internal

  • Excess kwargs for Context now logged correctly
  • HomeAssistant access from notify.py now consistently via hass_api
  • Added turbojpeg dependency to allow mobile_app integration to be setup for non-mocked testing
  • Notification
  • Moved snapshot_image_path for Notification inside media
  • Moved delivery_errors into the new deliveries structure under errors
  • Cleaned up unused delivery_results
  • Generic Transport
  • Removed the default entity_id filter for target_categories option
  • Fixed the provision of targets where no target_categories defined - all targets supplied in one big list
  • Added Home Assistant quality score report and config file
  • Replaced blocking PIL image operation and BS4 html parsing with wrapped async executor
  • All http get now consistently used a HomeAssistant provided aiohttp session
  • Set PARALLEL_UPDATE to 0 since no operations outside of existing HomeAssistant services
  • Technical states are now actual entities, marked as TECHNICAL category and with icons
  • iot_class now calculated for better HA consistency
  • Moved tests to tests.components.supernotify
  • Removed lots of pointless checks on HA presence in hass_api
  • Recipient
  • Removed shadow state, now goes straight to Person

1.5.3

Chime Transport

  • Chime alias error handling improved
  • Humanize validation errors
  • Validate targets and build Target objects at start-up
  • Normalize and default the alias config at start-up
  • Chime alias can now have an empty config - where the alias is the tune and domain needs nothing else
  • scripts now run async with script.turn_on, with wait: True if delivery debug flag on
  • Chime now has MiniChimeTransport to replace the if logic and dicts for chime transports
  • Defaulting for device inclusion/exclusion from hard-coded values (DEVICE_MODEL_EXCLUDE) switched off by either explicit include or exclude ( affects Chime use of Speaker Group as default exclusion)

Media Player Transport

  • Data section now uses the modern HA style with media: subsection rather than old Alexa Media Player style, which works with new style

Archived Notification

  • Easier to check archived notifications
  • Both delivered_envelopes and undelivered_envelopes list envelopes by transport rather than a flat list
  • Centralize results handling for notification

Internal

  • More logging for device inclusion/exclusion during discovery
  • Test Context can now take yaml rather than just dicts for config snippets

1.5.2

Fixes

  • Better error handling for broken scenario conditions

1.5.1

Features

  • Generic Transport
  • Now has direct support for input_text.set_value,script,rest_command,light,siren,mqtt and switch
    • Will build a data and target to meet the rules of the automations, pruning out fields that would break the call
  • New delivery options data_keys_include_re and data_keys_exclude_re to control valid keys in data section
  • New delivery option handle_as_domain to structure an action that Generic transport adaptor doesn't know about in the same way as one that it does, like input_text or light.
  • Debugging
  • Undelivered envelopes now have a skip_reason of NO_ACTION or NO_TARGET if action call to Home Assistant skipped because of mandatory missing items

1.5.0

Features

  • Mobile Push
    • Mobile discovery now on by default
      • Use mobile_discovery: false for each recipient to switch off
    • New Recipient discovery, on by default, based on Home Assistant's person entities
      • Use recipient_discovery: false in configuration to switch off
      • Use enabled: false to switch off specific people from automatic notifications
    • Mobile Discovery can be switched off at platform or recipient level
    • Recipient now exposed as an entity
      • Recipient can be enabled or disabled in Home Assistant UI, Automations, API etc by changing entity state
    • Mobile Push delivery now configured by default
  • Multimedia
    • png_opts now available for images, pre-set for email to optimize: true
    • Camera snapshot now fixes/optimizes images like URL snapshot and Image Entity already do
    • Media now has a reprocess option to switch off image rewriting, or preserve original metadata, incl comments
    • Automatic housekeeping to purge images from media_dir, configurable by media_storage_days in housekeeping
    • purge_media service to run the media storage housekeeping on demand
  • Chime
    • Chime Aliases configuration now validated at start up, and schema published
    • Device Discovery can now include or exclude by device model
      • Chime integration uses this so doesn't select Alexa actual devices and Alexa Group devices
    • Added rest_command to supported transport methods
  • Scenarios
    • Scenario overriding improved for data and target
    • Scenarios can now disable deliveries
    • enabled can now be left null for Scenario delivery config, to apply only where delivery already selected
      • The seasonal scenario recipe demonstrates this
  • Duplicate Suppression
    • Dupe checking now happens at Envelope rather than Notification level, so same message can go out to different deliveries and/or recipients

Changes

  • enqure_people is now enquire_recipients for consistency

Internal

  • Dicts for person and delivery customization now replaced by typed classes for type safety and easier refactoring / testing
  • Refactored out common image handling code for all 3 grab methods
  • Notification slimmed down and focussed, message and title handling moved to Envelope, Notification will only prepare data and targets
  • Dupe checking code moved out of Notify to its own class
  • delivery_by_scenario pre-compute and refresh removed
  • Moved code to detect media requirements in mobile actions out of Notification and into the mobile_push transport
  • Test suite for the seasonal scenarios
  • Correct debug handling for archival, and inclusion of debug_trace

1.4.0

Features

  • Now supports the full conditions Home Assistant schema, condition is now deprecated though still supported
  • This allows simple lists of shortcut templates, for common AND type usage

Internal

  • Test config now consistently applies schema validation/enhancement

1.3.5

Fixes

  • Condition variables could be rejected in validation of Delivery conditions

Internal

  • More extensive condition testing, condition variables now always applied

1.3.4

Features

  • Improved documentation content and navigation
  • Media Player transport allows media_content_type to be overridden in data for non-image use
  • Archiving now has a debug option, which controls if debug_trace included in notifications
  • Alexa Devices transport now has unique recipients on by default ( so if accidentally an Alex 'speak' delivery and an Alexa 'announce' delivery is selected, only one of them will speak for each device)
  • Transport adaptors now count errors and report last error time and type

Internal

  • Renaming of transport tests for consistency with package names
  • Updating media_player,title_handling and chime_aliases references for consistency
  • archive module refactored into an ArchiveDirectory with all file system logic
  • New envelope specific tests
  • Improved tests by using deeper dummy/broken delivery which call through to HA API

1.3.3

Features

  • Added more direct documentation links for repairs

Bug Fixes

  • Corrected obsolete github pages docs link

1.3.2

Features

  • Exposed entities now use the alias as the 'friendly name', so shows up better in Developer Tools and entity view
  • Add debug mode for deliveries, configurable at transport or delivery level
  • Response from service stored in CallRecord in the envelope and available in the archived notifications
  • In debug mode, service calls are synchronous rather than fire'n'forget so will fail immediately rather than in the background
  • Home Assistant Actions (aka "services") that require a response be accepted are now supported

Internal

  • Transport tests re-organized and more added
  • Transport now has an override_enabled for run time control of all deliveries using the transport via HA entities UI
  • Bug fixes for null values in snoozer, and fix backward boolean compatibility for target_required

1.3.1

Internal

  • Update of 1.3.0 from beta 6 to beta 8

1.3.0

Features

  • Notify Entity transport now only selects unique targets, so if a Notify Entity has been delivered in the same notification call, for example by Alexa Devices, it won't be called again for a duplicate announcement. Closes issue#8
  • Deliver can now have a list of target inclusion regexes, useful for excluding Alexa _speak devices or for custom notifications using Generic transport
  • Target definition for Delivery or Transport can now be more flexible
  • Allows a structured dict, a single value, or list of strings.
  • Structure only required where category can't be inferred, so entity_ids, device_ids, email and phone numbers are fine
  • Deliver has a new target_usage key, taking values of:
  • no_action only uses the Delivery target if there's no target on the notification action call
  • no_delivery only uses the Delivery target if there's no target applicable to this delivery
  • merge_delivery combines the targets in the Delivery with any on the action call, only where delivery already has a target
  • merge_always combines the targets in the Delivery with any on the action call, or if there's no target on the notification, it defaults to the Delivery target
  • fixed only ever delivers to the targets in the Delivery config, ignoring any direct or indirect (for example person_id) in the action call
  • Entity states for Delivery and Transport now directly reflect configuration
  • target_required is no longer boolean (although backward compatible), and now has values always,never and optional.
  • If set to never it speeds up delivery and debug traces by not computing targets when they're not needed
  • Improved DebugTrace - more stages, shows NO_CHANGE when no effect
  • Documentation improved - core concepts and principles, transports, more schema definitions

Internal

  • Transport implementations simplified, select_targets now replaced by options to select target categories, for example entity_id and a list of inclusions regexs
  • Target now has dunder method to support subtraction, for the targets only, and a safe_copy method
  • Notification object now maintains a list of all the target values selected by deliveries, and this is archived for debug purposes ( and supports the new unique target value functionality)
  • Snoozer now uses timedelta rather than integer seconds to measure snooze length
  • More tests for common

1.2.3

  • Delivery now responsible to select targets, delegating to Transport where overridden
  • This means target category selection for generic deliveries is configured per delivery, e.g. telegram and discord
  • Target overhauled to simplify repetitive logic, minimize getattr use, and allow custom domains
  • Custom target domains now supported, so can have a discord target in addition to the standard entity_id,email etc
  • action for mobile app notifications is now mobile_action to be clearer and avoid ambiguity with mobile push actions
  • All personal target resolution now done at start up, and a Target object added to people registry entries
  • Easier to debug target selection now, and the email/sms/mobile_push transports are simpler

1.2.2

  • Consolidated all transport defaults in a single method
  • Simplified handling of transport and delivery config defaults
  • Moved target_required from transport to delivery config, since could vary per delivery for generic transport
  • Added selection_rank for delivery, and made Notify Entity transport resolve last
  • This is to support future resolution of [issue #8]
  • Notification now records a missed count, where transport runs without error but makes no deliveries
  • NotifyEntity now always auto-generates a default Delivery unless the transport is explicitly disabled
  • HomeAssistant target version now 2025.11

1.2.1

  • HACS Hassfest validator added
  • A delivery for NotifyEntity is now auto-generated for an empty platform config
  • If any deliveries are configured, then NotifyEntity must be included if needed, since won't be auto-generated
  • The old unused 'default delivery by transport' removed
  • transport.transport is now transport.name
  • Simplified notification logic by passing new Delivery object and avoiding re-lookups
  • Removed default for Delivery which had been replaced long ago by selection enum
  • Removed DEFAULT scenario and replaced by Implicit Deliveries managed by DeliveryRegistry
  • Added new enquire_implicit_deliveries Action
  • Added more tests for hass_api

1.2.0

  • DeliveryRegistry now has the delivery functionality from Context and Transport
  • DeliveryMethod is now Transport
  • Tests simplified with a new configurable TestingContext
  • Moved mqtt, states, device, condition etc access into HomeAssistantAPI from across the code base
  • NotificationArchive now owns its own Config interpretation and is built from notify
  • Context is now a passive ref container plus a little FS path manipulation

1.1.6

  • HomeAssistant logic moved from Context to HomeAssistantAPI
  • Initialization logic moved from Context to SuperNotificationService
  • References to SuperNotificationService now consistent rather than SuperNotificationAction
  • Move camera PTZ and image handling from Notification to media_grab.py

1.1.5

  • New tests for mqtt and notify entity handling and media grabbing
  • ScenarioRegistry added to move scenario logic out of Context

1.1.4

  • Explicit delivery selection in action overrides scenario disablement
  • Extended and reorganized documentation
  • Suppressed notifications now have a reason recorded, DUPE, SNOOZED, NO_SCENARIO

1.1.3

  • Move out all people functionality from Context to new PeopleRegistry
  • Move runtime model classes out of __init__.py
  • Add new Target class that holds and filters recipients
  • Simplify logic for generating recipients and envelopes
  • Experimental new MQTTTransport

1.1.2

  • Remove transport options where not relevant - chime, media_image

1.1.1

  • Options defaulting for transports improved
  • Archive checks for MQTT client first, and all file IO aio based

1.1.0

  • Refactored internal use of dictionaries for delivery config, transport defaults and targets to typed classes for easier debugging and testing
  • Dupe suppression now alphaizes hashes to avoid notification storms where a counter or timestamp defeats the dupe check
  • Actions now separate out target data for service call wherever supported
  • MQTT topic archive now works if file archive also switched on

1.0.4

  • Test fixes, archive logging, and archive publish error handling
  • Scenarios, transports and deliveries can be switched on or off via their exposed entities in Home Assistant UI or API
  • NotifyEntityTransport added as pre-production

1.0.3

  • Improve mqtt notification archiving by generating unique qualified topic per item
  • Simplify archive config to be clear what applies to file and what to mqtt

1.0.2

  • Validate mis-spelled variables in Scenario Condition templates and generate repairs

1.0.1

  • Added repairs for configuration issues
  • GitHub actions and pre-commit improvements

1.0.0

First public release of productionized home code