Home Assistant configuration files (YAMLs) and AppDaemon apps.
- This repo pins local tooling Python in
.python-version. - CI validates that this pinned version is still compatible with the latest official
homeassistantrelease from PyPI. - Config checks run against the pinned Home Assistant image in
.github/workflows/validate-config.ymlso PR validation is deterministic for the current upgrade target. - As of 2026-05-06, latest
homeassistantrequires Python>=3.14.2, so.python-versionis set to3.14.3.
mainis stable/live.developis the integration branch used for Home Assistant soak testing.- Start feature work in a worktree from
origin/develop. - Open feature/fix PRs to
develop, explicitly setting the base branch. mainonly accepts promotion PRs fromdevelop.- After HA validation, open a promotion PR from
developtomain.
# Use the pinned interpreter from .python-version (for example via pyenv)
python -m pip install --upgrade pip yamllint
python scripts/check_ha_python_support.py --python-version-file .python-version
uv run --with pytest pytest
python scripts/allium_weed_check.py --changed-from origin/developscripts/allium_weed_check.py runs allium check when the CLI is installed,
falls back to lightweight structural checks when it is not, and fails protected
behavior changes that touch implementation scopes without an owner-approved
update to the governing .allium spec or a classified gap in
specs/allium_weed_config.json. Always compare changed behavior to the Allium
reference first; do not edit .allium definitions automatically. CI installs
Allium CLI 3.2.3 and runs with --require-allium so full language validation
cannot be skipped silently.
Music playback automations now target the Music Assistant-backed Sonos entities, which are the _2 media players:
media_player.bedroom_sonos_2media_player.bathroom_sonos_2media_player.office_sonos_2media_player.den_sonos_2media_player.tiki_room_2
The reusable media helpers live in packages/media_player.yaml:
script.music_assistant_play_item: thin wrapper aroundmusic_assistant.play_mediafor any Music Assistant URI, URL, or plain item name. Passmedia_typeexplicitly when you need to disambiguate a track, album, artist, playlist, or radio item.script.music_assistant_search_music: searches Music Assistant from the dashboard controls and populates the result picker.script.music_assistant_play_selected_search_result: plays or queues the selected Music Assistant search result.script.music_assistant_prepare_bedroom_group: regroup bedroom/bathroom and optionally office/den depending on guest mode.script.music_assistant_prepare_arrival_group: regroup the arrival playback zone.script.music_assistant_prepare_house_party_group: regroup all Sonos players for party modes.script.music_assistant_play_spotify_uri: accepts a Spotify URI oropen.spotify.comURL and converts it into the Music Assistant provider URI used bymusic_assistant.play_media.script.music_assistant_radio_wake_up: shared wake-up flow for radio stations.
The Siri/Homebridge entrypoint for the Tiki Time party mode is script.tiki_time in packages/tiki_time.yaml.
If an existing script already picks from a list, the normal change is just to append one more URI or plain Music Assistant item name to that script's plists array in packages/media_player.yaml.
Examples:
script.bedroom_playlist_0throughscript.bedroom_playlist_5for cube-triggered bedroom playlistsscript.spotify_arrivalfor arrival musicscript.spotify_bedtimefor bedtime musicscript.spotify_wake_upfor morning music
Accepted playlist values:
spotify:playlist:...spotify:album:...spotify:artist:...https://open.spotify.com/playlist/...https://open.spotify.com/album/...https://open.spotify.com/artist/...https://open.spotify.com/track/...- Permanent internet radio playlist URLs, such as
https://somafm.com/groovesalad.pls - Music Assistant URIs or plain item names, for mixed lists that call
script.music_assistant_play_item
If you are creating a brand new script, prefer calling the helper instead of using media_player.play_media directly:
- action: script.music_assistant_play_spotify_uri
data:
entity_id: media_player.bedroom_sonos_2
spotify_uri: "spotify:playlist:37i9dQZF1DX4WYpdgoIcn6"Notes:
- The generic helper now passes Music Assistant URIs and plain item names through directly. Use
media_typewhen a name is ambiguous. - Prefer explicit URLs or Music Assistant URIs for radio entries so automations do not depend on name search resolution.
script.music_assistant_play_spotify_uriremains as a compatibility wrapper for Spotify URLs and URIs.
The Music Assistant section on the dashboard includes a small search flow:
- Enter a plain-text query in
input_text.music_assistant_search_query. - Optionally pick a provider token from
input_select.music_assistant_provider_filter. - Choose the media type from
input_select.music_assistant_search_media_type. - Press
script.music_assistant_search_musicto populateinput_select.music_assistant_search_results. - Optionally choose a target playlist script from
input_select.music_assistant_playlist_target. - Use
script.music_assistant_play_selected_search_resultto play the selected result now or add it to the current queue. - Use
script.music_assistant_add_selected_search_result_to_playlistto append the selected Music Assistant URI to the chosenplists-based script and reload scripts.
The search helper derives the Music Assistant config_entry_id dynamically from media_player.bedroom_sonos_2, so it does not depend on a hard-coded config entry. The provider dropdown refreshes from the current unfiltered search response, which keeps the options aligned with the providers that can satisfy the active query.
The supported playlist-script targets are spotify_bedtime, spotify_wake_up, spotify_arrival, and bedroom_playlist_0 through bedroom_playlist_5. Appending a result updates packages/media_player.yaml in place and then reloads Home Assistant scripts so the change is immediately available.
Radio wake-up scripts now use Music Assistant item URIs instead of Sonos favorites or Spotify Connect source selection.
Current examples:
library://radio/12tunein--S3NwgspV://radio/s34350tunein--S3NwgspV://radio/s20620
Recommended workflow:
- Find the station in Music Assistant first.
- Copy the Music Assistant radio item URI.
- Pass that URI to
script.music_assistant_radio_wake_up.
Example wrapper script:
my_new_radio_wake_up:
alias: My New Radio Wake Up
sequence:
- action: script.music_assistant_radio_wake_up
data:
radio_uri: "tunein--S3NwgspV://radio/s12345"
initial_delay: 5If you need to discover a station URI from Home Assistant, use Music Assistant search/library tools or the music_assistant.search / music_assistant.get_library services in Developer Tools and copy the returned item id.
After changing media scripts, validate the config the same way CI does:
yamllint -d "{extends: relaxed, rules: {line-length: disable, empty-lines: disable, truthy: disable}}" \
configuration.yaml automations.yaml blueprints packages zigbee2mqtt
# If Docker is available
docker run --rm -v "$PWD:/config" ghcr.io/home-assistant/home-assistant:2026.5.0 \
python -m homeassistant --config /config --script check_config- House Transition Framework
- Home Assistant Label Model
- Room Intent Policy
- Room Naming Model
- Inky E-Ink Displays
- ESPHome Layout And Bermuda BLE Proxy Notes
- EV Charging Tariff
- Tesla Departure Planner
This repo includes MQTT-backed e-ink display support for low-frequency, room-aware Home Assistant status surfaces. Home Assistant publishes compact desired-state payloads; Raspberry Pi services render, cache, suppress duplicate payloads, and refresh the physical panels.
Current deployment:
owner_suite: Pimoroni Inky wHAT red/black/white400x300, driven by a Raspberry Pi Zero W onhome/inky/owner_suite/state.- The owner-suite panel reports as
Red wHAT (SSD1683), so the Pi service usesINKY_PANEL_TYPE=auto.
Use e-ink for information that should persist calmly between meaningful Home Assistant events: wake status, weather, door/garage exceptions, trip/vacation state, guest-safe info, and similar low-frequency status. Do not use these panels for clocks, animation, minute-level dashboards, or cosmetic updates. Tri-color Inky wHAT refreshes are whole-panel, slow, and should be driven only by meaningful source changes.
Design criteria:
- Keep layouts readable from about 4 feet away on a
400x300canvas. - Prefer one title, one subtitle, and at most four status rows.
- Use Material Design Icons names in payloads when possible.
- Preserve color meaning: red is urgency/exception for owner-suite; yellow is emphasis/hospitality for future office displays.
- The footer's
Updated HH:MMvalue is publish-time metadata and must not add asensor.timetrigger or clock-tick redraws.
See docs/inky_displays.md for the payload contract, MQTT topics, renderer tests, Pi setup, and physical verification workflow.
I have Home Assistant running on an Intel NUC. This has been a work in progress since Nov 2015 (HA v0.7 or earlier).
I use the new dashboards in 0.107 to create a dashboard for guests on an Amazon Fire Tab running Fully Kiosk Browser.
Software on the NUC:
- Home Assistant via Hass.io
- Running in Hass.io
- AppDaemon
- VSCode
- Mosquitto Broker
- Music Assistant - Main playback engine for Sonos/Spotify/radio automations
Traccar - Used with OBDII Sensor to track my car.New car has built-in tracking- JupyterLab Lite Only sometimes when I need to figure out event correllation
- ESPHome - Used for Water Softener, Bed Occupancy Sensor, and BLE Proxy
- Uplift Desk custom component - Fork used for standing desk entities and controls in
packages/desk.yaml. Zwave-JSMoving to Zigbee/Thread/Matter- I Can't Believe It's Not Valetudo
- Home Assistant Google Drive Backup
- Matter Server
- rtlamr2mqtt - Local HA add-on (RTLAMR to MQTT bridge) that reads the gas utility meter via a USB RTL-SDR dongle and publishes to MQTT. Exposes
sensor.raw_house_gas_meter_reading(and..._last_seen). - Zigbee2MQTT - Zigbee control over MQTT
This section replaces the older static hardware list with a split between hardware that has been retired from service and device families that are verifiably live in the current Home Assistant instance. When an older device was replaced rather than simply removed, the retired row links to the live replacement below.
| README entry | Outcome | Replacement | Notes |
|---|---|---|---|
| Nest Thermostat | Replaced | Ecobee | No live Nest integration remains. |
| Amazon Echo | Removed | None | Echo hardware has been retired from the house. |
| Amazon Echo Dot Gen 2 | Removed | None | Echo Dot hardware has been retired from the house. |
| Amazon Fire TV | Removed | None | No live Fire TV device or integration remains. |
| HUSBZB-1 Zigbee / Z-Wave stick | Replaced | Zigbee / Thread / Matter infrastructure | The old HubZ zha and zwave_js entries are ignored or not loaded. |
| GoControl Z-Wave Thermostat | Replaced | Ecobee | The thermostat role moved to Ecobee Premium and room sensors. |
| Leviton Vizia RF+ VRS05-1LZ | Replaced | Inovelli | The old Z-Wave wall-switch footprint is now on Zigbee lighting controls. |
| Leviton Vizia coordinating remote switch | Replaced | Inovelli and IKEA | Current room-control hardware is now anchored on Zigbee switches and remotes. |
| GE Z-Wave outdoor module | Removed | None | No direct verified successor is visible in the current registry. |
| GE Z-Wave appliance switch | Removed | None | No direct verified successor is visible in the current registry. |
| Bed presence sensor using Ecolink + pressure mat | Replaced | ESPHome / ratgdo | Bed occupancy is now handled by live ESPHome bed load-cell hardware. |
| Bed Occupancy Sensor using copper foil / foam | Replaced | ESPHome / ratgdo | The original DIY bed sensor was replaced by the newer ESPHome bed-presence stack. |
| GoControl Z-Wave plug-in dimmer | Removed | None | It does not appear in the current live registry. |
| Zooz ZEN26 | Replaced | Inovelli | The old Z-Wave switch path is no longer present. |
| Inovelli ZSW31-SN Z-Wave dimmers | Replaced | Inovelli | The live system now uses Inovelli Zigbee 2-in-1 switches and dimmers. |
| Electro Llama ZZH Stick | Replaced | Zigbee / Thread / Matter infrastructure | Zigbee2MQTT now runs on a Nabu Casa ZBT-2. |
| Enbrighten 43100 Outdoor Switch | Removed | None | No current live-registry match could be confirmed. |
| Lutron Pico LZL-4B-WH-L01 reset remote | Removed | None | No current live-registry match could be confirmed. |
| SmartThings Motion Sensor | Replaced | Aqara | Current motion sensing is clearly covered by Aqara devices; this specific sensor is not live. |
| Hampton Bay / King of Fans Zigbee fan controller | Replaced | Bond | Fan control is now handled by the live Bond bridge. |
| MyQ Garage Door | Replaced | ESPHome / ratgdo | The garage door is now a live ratgdo ESPHome device. |
| Generic OBDII GPRS Real Time Tracker | Replaced | Tesla | Tesla connectivity now covers the vehicle-tracking use case. |
| Device family | Current live examples |
|---|---|
| Apple / HomePod / Apple TV | Apple TV 4K plus multiple HomePod Minis via apple_tv. |
| Ecobee | Ecobee Premium thermostat plus remote room sensors in the bedroom, office, den, basement, and guest room. |
| Sonos | Sonos One, Move, Port, and SYMFONISK picture-frame devices across both sonos and music_assistant. |
| Aqara | Motion, temperature/humidity, leak, contact, vibration, button, and cube devices on Zigbee2MQTT, plus an Aqara Motion and Light Sensor P2 on Matter. |
| IKEA | FYRTUR blinds, PARASOLL contact sensors, TRADFRI outlets and remotes, SOMRIG shortcut buttons, SYMFONISK sound remotes, and a RODRET dimmer. |
| Inovelli | Multiple Zigbee 2-in-1 switches and dimmers used for room lighting and smart-bulb mode control. |
| Philips Hue | Hue downlights, filament bulbs, outdoor fixtures, and other bulbs on Zigbee2MQTT with native Hue control enabled for devices. |
| Eaton / Halo | Halo Zigbee downlights in hallway and bathroom areas. |
| Sengled | Energy-monitoring smart plugs used for the CPAP and sump pump. |
| Securifi / Peanut Smart Plug | A live Peanut Smart Plug remains paired and in service. |
| EcoSmart | Tunable-white Zigbee bulbs still used in the owner suite lamps. |
| Xiaomi | Dafang cameras and Xiaomi BLE MiFlora plant sensors remain active. |
| ESPHome / ratgdo | Water softener sensor, bed load cells and bed presence, Bluetooth proxies, and the ratgdo garage-door controller. |
| Zigbee / Thread / Matter infrastructure | Zigbee2MQTT on Nabu Casa ZBT-2, plus active SkyConnect, Thread, OTBR, and Matter integrations. |
| Bond | Bond Bridge fan control for den, office, guest room, and owner suite fans. |
| LocalTuya / Good Earth | Good Earth / Tuya LED flat panels in kitchen and laundry areas. |
| Rachio | Rachio Gen 3 irrigation controller and zone switches. |
| SmartThings | The modified SmartThings Arrival Sensor is still paired via Zigbee2MQTT. |
| Uplift Desk | Office standing desk using the rtclauss/hass-uplift-desk custom component fork. |
| Tesla | Tesla Model 3 (Nigori) on the custom Tesla integration. |
| UniFi | The unifi integration is active for network entities, WLANs, and device trackers, although exact hardware model inventory is no longer fully represented in Home Assistant. |
| Adaptive Lighting | Active room-specific Adaptive Lighting instances across the lighting stack. |
Coordinator and protocol note:
- Zigbee has moved from the older HubZ/ZZH era to Zigbee2MQTT on
ZBT-2. - New device growth is now clearly moving toward
ThreadandMatter. - Alexa exposure may still exist for selected entities, but the Echo hardware itself has been retired.
AppDaemon Apps:
- Sync workflow:
docs/appdaemon_sync.mdkeeps the trackedappdaemon/tree aligned with the live Supervisor add-on underaddon_configs. - Bayesian Device Tracker - Merges GPS location info with bayesian binary sensor to give ground-truth location tracking. Uses bayesian data to eliminate red-herrings when arriving at home. Could be extended to other zones if you have multiple
device_trackers - Lighting Fade-In - Fades in lights from
offover a pre-defined interval on a work (non-weekend, non-holiday) day. - Music Fade-in - Fades in music when I wake up in the morning
- deConz button events - Translates Xiaomi button events into a generic sensor.
- Magic Cube - Translates Xiaomi Magic Cube events into actions controlling my living room Hue lights
- Automatic event helper - Similar to deCONZ helper this translates matic events into a generic sensor.
Nest Travel helper - When driving long distances the Nest will switch from heating/cooling back to away mode if you don't arrive home soon enough. This listens for those changes and keeps Nest from switching back to away mode.Schedy - Replacement for Nest. Work in Progress.- Thermostat Stats - Gathers historical house temperature data. Will feed into ML model to predict time to temp, etc.
Apple Shortcuts
- Set wakeup time - Slowly turn on bedroom lights in the morning before a meeting
- iOS personal automation: run every day at
9:00 PM, find the wake-up alarm you want to mirror on the phone, format its time asHH:mm, andPOSTJSON tohttps://<your-home-assistant>/api/webhook/ios_phone_wakeup_alarm_syncwith{"alarm_time":"07:30"}. If there is no enabled alarm for the next day, send{"alarm_enabled": false}instead. If JSON is awkward, the webhook also accepts query parameters. - Optional Outlook integration: on iPhone, a separate Shortcut can call the same webhook with
meeting_timefrom the OutlookNext Meetingshortcut. Home Assistant will convert that meeting start into the existingnext_work_meetingreminder time by subtracting 5 minutes. If Outlook reports no next meeting, send{"meeting_enabled": false}instead. Alarm sync and meeting sync can be sent together or as separate webhook calls.
Shortcut recipe:
- In
Shortcutscreate aPersonal Automation. - Choose
Time of Day, set it to9:00 PM, selectDaily, and disableRun After Confirmation. - Add
Find Alarmsand filter to the alarm you want Home Assistant to mirror. - Recommended filter:
Label is Wake UpandIs Enabled is On. - If you only keep one wake-up alarm on the phone, using the first enabled alarm is fine.
- Add
Ifand branch on whetherFind Alarmshas any value. - In the
Ifbranch, addGet Item from Listand choose theFirst Item. - Add
Get Details of Alarmand selectTime. - Add
Format Dateand use custom formatHH:mm. - Add
Dictionarywith one key:alarm_time. - Set the
alarm_timevalue to the formatted date output from the previous step. - In the
Otherwisebranch, addDictionarywith one key:alarm_enabled. - Set the
alarm_enabledvalue tofalse. - After the
If, addGet Contents of URL. - Set the URL to
https://<your-home-assistant>/api/webhook/ios_phone_wakeup_alarm_sync. - Set
MethodtoPOST. - Set
Request BodytoJSON. - Set the JSON payload to the dictionary output from the
If.
Expected payload when an alarm exists:
{
"alarm_time": "07:30"
}Expected payload when there is no alarm:
{
"alarm_enabled": false
}Expected payload when Outlook has a next meeting:
{
"meeting_time": "09:00"
}Expected payload when Outlook has no next meeting:
{
"meeting_enabled": false
}Combined payload example:
{
"alarm_time": "07:30",
"meeting_time": "09:00"
}Suggested Shortcut action flow:
Find Alarms
If Find Alarms has any value
Get Item from List (First Item)
Get Details of Alarm (Time)
Format Date (HH:mm)
Dictionary
alarm_time: Formatted Date
Otherwise
Dictionary
alarm_enabled: false
End If
Get Contents of URL
Suggested Outlook follow-up Shortcut flow on iPhone:
Run Shortcut (Next Meeting)
If Next Meeting has a value
Format Date (HH:mm)
Dictionary
meeting_time: Formatted Date
Otherwise
Dictionary
meeting_enabled: false
End If
Get Contents of URL