Skip to content

rtclauss/hass-config

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

2,383 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

The Brewery Home Assistant Configuration 🍺

Build Status

Home Assistant configuration files (YAMLs) and AppDaemon apps.

CI + Local Validation Baseline

  • This repo pins local tooling Python in .python-version.
  • CI validates that this pinned version is still compatible with the latest official homeassistant release from PyPI.
  • Config checks run against the pinned Home Assistant image in .github/workflows/validate-config.yml so PR validation is deterministic for the current upgrade target.
  • As of 2026-05-06, latest homeassistant requires Python >=3.14.2, so .python-version is set to 3.14.3.

Branch Flow

  • main is stable/live.
  • develop is 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.
  • main only accepts promotion PRs from develop.
  • After HA validation, open a promotion PR from develop to main.

Local Setup

# 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/develop

scripts/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 Assistant Media Flow

Music playback automations now target the Music Assistant-backed Sonos entities, which are the _2 media players:

  • media_player.bedroom_sonos_2
  • media_player.bathroom_sonos_2
  • media_player.office_sonos_2
  • media_player.den_sonos_2
  • media_player.tiki_room_2

The reusable media helpers live in packages/media_player.yaml:

  • script.music_assistant_play_item: thin wrapper around music_assistant.play_media for any Music Assistant URI, URL, or plain item name. Pass media_type explicitly 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 or open.spotify.com URL and converts it into the Music Assistant provider URI used by music_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.

Adding Another Playlist

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_0 through script.bedroom_playlist_5 for cube-triggered bedroom playlists
  • script.spotify_arrival for arrival music
  • script.spotify_bedtime for bedtime music
  • script.spotify_wake_up for 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_type when 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_uri remains as a compatibility wrapper for Spotify URLs and URIs.

Searching and Queuing Music Assistant Items

The Music Assistant section on the dashboard includes a small search flow:

  1. Enter a plain-text query in input_text.music_assistant_search_query.
  2. Optionally pick a provider token from input_select.music_assistant_provider_filter.
  3. Choose the media type from input_select.music_assistant_search_media_type.
  4. Press script.music_assistant_search_music to populate input_select.music_assistant_search_results.
  5. Optionally choose a target playlist script from input_select.music_assistant_playlist_target.
  6. Use script.music_assistant_play_selected_search_result to play the selected result now or add it to the current queue.
  7. Use script.music_assistant_add_selected_search_result_to_playlist to append the selected Music Assistant URI to the chosen plists-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.

Adding Another Radio Station

Radio wake-up scripts now use Music Assistant item URIs instead of Sonos favorites or Spotify Connect source selection.

Current examples:

  • library://radio/12
  • tunein--S3NwgspV://radio/s34350
  • tunein--S3NwgspV://radio/s20620

Recommended workflow:

  1. Find the station in Music Assistant first.
  2. Copy the Music Assistant radio item URI.
  3. 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: 5

If 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.

Validation

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

Feature Docs

E-Ink Display Capability

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/white 400x300, driven by a Raspberry Pi Zero W on home/inky/owner_suite/state.
  • The owner-suite panel reports as Red wHAT (SSD1683), so the Pi service uses INKY_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 400x300 canvas.
  • 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:MM value is publish-time metadata and must not add a sensor.time trigger 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:

Device Audit (2026-03-29)

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.

Retired Devices

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.

Live Devices

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 Thread and Matter.
  • Alexa exposure may still exist for selected entities, but the Echo hardware itself has been retired.

AppDaemon Apps:

  • Sync workflow: docs/appdaemon_sync.md keeps the tracked appdaemon/ tree aligned with the live Supervisor add-on under addon_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 off over 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 as HH:mm, and POST JSON to https://<your-home-assistant>/api/webhook/ios_phone_wakeup_alarm_sync with {"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_time from the Outlook Next Meeting shortcut. Home Assistant will convert that meeting start into the existing next_work_meeting reminder 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:

  1. In Shortcuts create a Personal Automation.
  2. Choose Time of Day, set it to 9:00 PM, select Daily, and disable Run After Confirmation.
  3. Add Find Alarms and filter to the alarm you want Home Assistant to mirror.
  4. Recommended filter: Label is Wake Up and Is Enabled is On.
  5. If you only keep one wake-up alarm on the phone, using the first enabled alarm is fine.
  6. Add If and branch on whether Find Alarms has any value.
  7. In the If branch, add Get Item from List and choose the First Item.
  8. Add Get Details of Alarm and select Time.
  9. Add Format Date and use custom format HH:mm.
  10. Add Dictionary with one key: alarm_time.
  11. Set the alarm_time value to the formatted date output from the previous step.
  12. In the Otherwise branch, add Dictionary with one key: alarm_enabled.
  13. Set the alarm_enabled value to false.
  14. After the If, add Get Contents of URL.
  15. Set the URL to https://<your-home-assistant>/api/webhook/ios_phone_wakeup_alarm_sync.
  16. Set Method to POST.
  17. Set Request Body to JSON.
  18. 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

Releases

No releases published

Packages

 
 
 

Contributors