A Home Assistant custom integration that brings entertainment event information from The Villages, Florida directly to your dashboard. Track live performances at all venues, get notified when your favorite performers are scheduled, and plan your entertainment with ease.
- Per-Venue Event Sensors: Separate sensors for each venue showing today's and tomorrow's events
- Favorite Performer Tracking: Binary sensors that alert you when your favorite artists are scheduled
- Automatic Updates: Configurable update intervals to keep event information current
- Rich Event Details: View performer names, event times, and venue information
- HACS Compatible: Easy installation and automatic updates through HACS
- UI Configuration: No YAML editing required - configure everything through the UI
- Complete Documentation - Full documentation index
- Installation & Configuration - Get started
- Entities & Attributes - Available sensors and data
- Dashboard Examples - UI card examples
- Automation Examples - Automation ideas
- Services - Manual refresh service
- Events - Home Assistant events for automations
- Troubleshooting - Common issues and solutions
- Developer Guide - For developers
- Changelog - Version history
- Open HACS in your Home Assistant instance
- Click on "Integrations"
- Click the three dots in the top right corner
- Select "Custom repositories"
- Add this repository URL and select "Integration" as the category
- Click "Install"
- Restart Home Assistant
- Download the latest release from the releases page
- Extract the
villages_eventsfolder from the zip file - Copy the folder to your
custom_componentsdirectory - Restart Home Assistant
- Go to Settings โ Devices & Services
- Click + Add Integration
- Search for "The Villages Events"
- Configure the integration:
- Update Interval: How often to fetch new event data (15-1440 minutes, default: 60)
- Favorite Performers: Comma-separated list of performer names to track (optional)
Update Interval: 60 minutes
Favorite Performers: The Fabulous Fleetwoods, Retro Express, The British Invasion
To change settings after initial setup:
- Go to Settings โ Devices & Services
- Find "The Villages Events" integration
- Click Configure
- Update your settings
- Click Submit
Manually refresh event data from The Villages calendar. This bypasses the normal update interval and fetches the latest events immediately.
Usage in Automations:
automation:
- alias: "Refresh Events Every Morning"
trigger:
- platform: time
at: "08:00:00"
action:
- service: villages_events.refreshUsage in Scripts:
script:
refresh_villages_events:
alias: "Refresh Villages Events"
sequence:
- service: villages_events.refreshCall from Developer Tools:
Go to Developer Tools โ Services, search for "Villages Events: Refresh Events", and click "Call Service".
The integration creates sensor entities for each venue with today's and tomorrow's events:
sensor.villages_events_{venue}_today- Events scheduled today at the venuesensor.villages_events_{venue}_tomorrow- Events scheduled tomorrow at the venue
State: Number of events scheduled Attributes:
venue: Venue nameperiod: "today" or "tomorrow"events: List of event details (performer, start_time, end_time, event_type)performers: List of performer names (easy access)event_count: Number of eventslast_updated: Timestamp of last data update
If you configure favorite performers, the integration creates:
binary_sensor.villages_events_favorite_today- ON when a favorite performer plays todaybinary_sensor.villages_events_favorite_tomorrow- ON when a favorite performer plays tomorrow
State: ON (favorite performing) or OFF (no favorites scheduled) Attributes:
favorite_performers: Your configured list of favoritesmatching_events: Details of events featuring your favoritesperformers: List of matching performer names (easy access)venues: List of venues where favorites are playing (easy access)count: Number of matching events
type: entities
title: Spanish Springs Tonight
entities:
- entity: sensor.villages_events_spanish_springs_today
secondary_info: last-updatedtype: markdown
content: >
## Spanish Springs Tonight
{% if states('sensor.villages_events_spanish_springs_today') | int > 0 %}
**Performers:**
{% for performer in state_attr('sensor.villages_events_spanish_springs_today', 'performers') %}
- {{ performer }}
{% endfor %}
{% else %}
No events scheduled today
{% endif %}type: markdown
content: >
## {{ state_attr('sensor.villages_events_spanish_springs_today', 'venue') }}
{% if states('sensor.villages_events_spanish_springs_today') | int > 0 %}
{% for event in state_attr('sensor.villages_events_spanish_springs_today', 'events') %}
**{{ event.performer }}**
{{ event.start_time | as_timestamp | timestamp_custom('%I:%M %p') }} -
{{ event.end_time | as_timestamp | timestamp_custom('%I:%M %p') }}
{{ event.event_type }}
---
{% endfor %}
{% else %}
No events scheduled today
{% endif %}type: conditional
conditions:
- entity: binary_sensor.villages_events_favorite_today
state: 'on'
card:
type: markdown
content: >
## ๐ต Your Favorites Are Playing Today!
{% for event in state_attr('binary_sensor.villages_events_favorite_today', 'matching_events') %}
**{{ event.performer }}** at {{ event.venue }}
{{ event.start_time | as_timestamp | timestamp_custom('%I:%M %p') }}
{% endfor %}type: vertical-stack
cards:
- type: entities
title: Today's Events
entities:
- sensor.villages_events_spanish_springs_today
- sensor.villages_events_brownwood_today
- sensor.villages_events_lake_sumter_today
- type: entities
title: Tomorrow's Events
entities:
- sensor.villages_events_spanish_springs_tomorrow
- sensor.villages_events_brownwood_tomorrow
- sensor.villages_events_lake_sumter_tomorrowThe integration fires Home Assistant events that you can use in automations:
Fired when a favorite performer is newly detected.
Event Data:
period: "today" or "tomorrow"event_count: Number of matching eventsevents: List of event detailsfavorite_performers: Your configured favorites
automation:
- alias: "Notify Favorite Performer Detected"
trigger:
- platform: event
event_type: villages_events_favorite_performer
action:
- service: notify.mobile_app
data:
title: "๐ต Favorite Performer Alert!"
message: >
{% for event in trigger.event.data.events %}
{{ event.performer }} at {{ event.venue }} {{ trigger.event.data.period }}
at {{ event.start_time | as_timestamp | timestamp_custom('%I:%M %p') }}
{% endfor %}Fired when new events are detected at any venue.
Event Data:
venue: Venue nameperiod: "today" or "tomorrow"event_count: Total number of eventsnew_count: Number of new eventsevents: List of all events
automation:
- alias: "Notify New Events at Spanish Springs"
trigger:
- platform: event
event_type: villages_events_new_events
event_data:
venue: "Spanish Springs Town Square"
action:
- service: notify.mobile_app
data:
title: "New Events at {{ trigger.event.data.venue }}"
message: >
{{ trigger.event.data.new_count }} new event(s) added for {{ trigger.event.data.period }}!
Total: {{ trigger.event.data.event_count }} eventsSend a notification with just the performer names:
automation:
- alias: "Daily Event Summary"
trigger:
- platform: time
at: "08:00:00"
condition:
- condition: numeric_state
entity_id: sensor.villages_events_spanish_springs_today
above: 0
action:
- service: notify.mobile_app
data:
title: "Tonight at Spanish Springs"
message: >
Performers: {{ state_attr('sensor.villages_events_spanish_springs_today', 'performers') | join(', ') }}Check if a specific performer is playing:
automation:
- alias: "Check for Specific Performer"
trigger:
- platform: state
entity_id: sensor.villages_events_spanish_springs_today
condition:
- condition: template
value_template: >
{{ 'The Beatles' in state_attr('sensor.villages_events_spanish_springs_today', 'performers') }}
action:
- service: notify.mobile_app
data:
title: "The Beatles are playing!"
message: "Don't miss them at Spanish Springs tonight!"You can also trigger automations based on entity state changes:
automation:
- alias: "Notify Favorite Performer Today"
trigger:
- platform: state
entity_id: binary_sensor.villages_events_favorite_today
to: 'on'
action:
- service: notify.mobile_app
data:
title: "Your Favorite Performer is Playing!"
message: >
{% for event in state_attr('binary_sensor.villages_events_favorite_today', 'matching_events') %}
{{ event.performer }} at {{ event.venue }} - {{ event.start_time | as_timestamp | timestamp_custom('%I:%M %p') }}
{% endfor %}automation:
- alias: "Daily Villages Events Summary"
trigger:
- platform: time
at: "09:00:00"
action:
# First refresh the data
- service: villages_events.refresh
# Wait for refresh to complete
- delay:
seconds: 5
# Then send notification with latest data
- service: notify.mobile_app
data:
title: "Today's Entertainment"
message: >
{% set total = states('sensor.villages_events_spanish_springs_today') | int +
states('sensor.villages_events_brownwood_today') | int +
states('sensor.villages_events_lake_sumter_today') | int %}
{{ total }} events scheduled today at The Villages!automation:
- alias: "Refresh Events Button"
trigger:
- platform: state
entity_id: input_button.refresh_villages_events
action:
- service: villages_events.refresh
- service: notify.persistent_notification
data:
title: "Villages Events"
message: "Event data refreshed successfully!"automation:
- alias: "Add Favorite Performer to Calendar"
trigger:
- platform: event
event_type: villages_events_favorite_performer
action:
- repeat:
for_each: "{{ trigger.event.data.events }}"
sequence:
- service: calendar.create_event
target:
entity_id: calendar.personal
data:
summary: "{{ repeat.item.performer }} at The Villages"
description: "{{ repeat.item.event_type }} at {{ repeat.item.venue }}"
start_date_time: "{{ repeat.item.start_time }}"
end_date_time: "{{ repeat.item.end_time }}"automation:
- alias: "Favorite Performer with Actions"
trigger:
- platform: event
event_type: villages_events_favorite_performer
action:
- service: notify.mobile_app
data:
title: "๐ต {{ trigger.event.data.events[0].performer }}"
message: >
Playing {{ trigger.event.data.period }} at {{ trigger.event.data.events[0].venue }}
{{ trigger.event.data.events[0].start_time | as_timestamp | timestamp_custom('%I:%M %p') }}
data:
actions:
- action: "ADD_TO_CALENDAR"
title: "Add to Calendar"
- action: "VIEW_VENUE"
title: "View Venue Info"automation:
- alias: "Log New Events"
trigger:
- platform: event
event_type: villages_events_new_events
action:
- service: logbook.log
data:
name: "Villages Events"
message: >
{{ trigger.event.data.new_count }} new event(s) at {{ trigger.event.data.venue }}
for {{ trigger.event.data.period }}
entity_id: sensor.villages_events_{{ trigger.event.data.venue | lower | replace(' ', '_') }}_{{ trigger.event.data.period }}This integration includes built-in code to fetch real event data from The Villages entertainment calendar API. No external libraries are required!
The integration automatically fetches live event data from The Villages calendar. Simply install the integration and it will start pulling real events.
What you'll see in the logs:
Successfully fetched events for X venues
If there are any issues connecting to The Villages API, the integration will automatically fall back to mock data for testing. You'll see a warning:
Villages events library import failed. Using mock data for development/testing.
This ensures the integration continues to work even if The Villages website is temporarily unavailable.
Problem: Sensors show "0" or "unavailable"
Solutions:
- Check your internet connection
- Verify The Villages calendar website is accessible
- Check Home Assistant logs for error messages: Settings โ System โ Logs
- Try reloading the integration: Settings โ Devices & Services โ The Villages Events โ โฎ โ Reload
- If using development mode, check that mock data is being loaded (look for "Using mock data" in logs)
Problem: Binary sensor stays OFF even though your favorite is scheduled
Solutions:
- Verify the performer name matches exactly as it appears on The Villages calendar
- Check for extra spaces or punctuation in your configuration
- Performer names are case-insensitive but must match otherwise
- Reconfigure the integration and update your favorite performers list
Problem: Integration updates too often or not often enough
Solutions:
- Reconfigure the integration and adjust the update interval
- Minimum: 15 minutes (to avoid excessive API calls)
- Maximum: 1440 minutes (24 hours)
- Recommended: 60 minutes for good balance
Problem: Expected sensor entities are missing
Solutions:
- Restart Home Assistant after installation
- Check that the integration loaded successfully in logs
- Verify the integration appears in Settings โ Devices & Services
- Try removing and re-adding the integration
Problem: Logs show repeated update failures
Solutions:
- The integration will retry automatically with exponential backoff
- After 3 consecutive failures, entities will be marked unavailable
- Check if The Villages website is accessible from your network
- Verify the
python-villages-eventslibrary is installed correctly - Wait for automatic recovery when connectivity is restored
- Services Reference - Detailed guide for the
villages_events.refreshservice - Events Reference - Complete guide for event-based automations
- Developer Documentation - Architecture and development guide
- Debugging Guide - Troubleshooting and debugging steps
For issues, feature requests, or questions:
- Open an issue on GitHub
- Check existing issues for similar problems
- Include Home Assistant version and integration version in bug reports
- Attach relevant log entries when reporting errors
This integration uses the python-villages-events library to fetch event data from The Villages calendar.
This project is licensed under the GNU General Public License v3.0 - see the LICENSE file for details.
This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.
This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.