A Home Assistant integration for Vacasa vacation rental properties that provides calendars, occupancy sensors, and detailed property information for powerful smart home automation.
- Calendar entity for each Vacasa property showing all reservations
- Binary sensors for property occupancy status
- Property information sensors (rating, location, amenities, capacity)
- Property-specific check-in/check-out times and timezone handling
- Categorized reservations by stay type (guest, owner, maintenance, block)
- Automatic data refresh with configurable intervals
- Services for manual refresh and cache clearing
- Ensure HACS is installed in Home Assistant
- Add this repository as a custom repository in HACS:
- Go to HACS > Integrations > ⋮ > Custom repositories
- URL:
https://github.com/samspade21/vacasa-ha - Category: Integration
- Search for "Vacasa" in HACS and install
- Restart Home Assistant
- Copy the
custom_components/vacasadirectory to your Home Assistant configuration directory - Restart Home Assistant
- Go to Configuration > Integrations > Add Integration
- Search for "Vacasa" and follow the configuration steps
Configure through the Home Assistant UI:
- Go to Configuration > Integrations > Add Integration
- Search for "Vacasa"
- Enter your Vacasa username (email) and password
- Set the refresh interval (default: 8 hours)
- Click "Submit"
The integration will automatically discover all your properties and create entities.
- Entity ID:
calendar.vacasa_[property_name] - Shows all reservations with check-in/check-out times
- Categorized by reservation type
- Entity ID:
binary_sensor.vacasa_[property_name]_occupancy - State:
onwhen occupied,offwhen vacant - Attributes:
current_guest: Current guest namecurrent_checkout: Current checkout date/time (ISO format)current_reservation_type: Current reservation typenext_checkin: Next check-in date/time (ISO format)next_checkout: Next checkout date/time (ISO format)next_guest: Next guest namenext_reservation_type: Next reservation type
- Entity ID:
sensor.vacasa_[property_name]_next_stay - State: Days until next check-in
- Attributes:
stay_type: Display name (e.g., "Guest Booking")stay_category: Lowercase with underscores (e.g., "guest_booking")guest_name: Next guest namecheckin_date: Check-in date/time (ISO format)checkout_date: Checkout date/time (ISO format)
- Details: Rating, location (lat/lon), timezone, address
- Capacity: Max occupancy, adults, children, pets
- Amenities: Bedrooms, bathrooms, hot tub, pet friendly, parking
| Display Name | Category Value | Description |
|---|---|---|
| Guest Booking | guest_booking |
Regular guest reservations |
| Owner Stay | owner_stay |
Property owner staying |
| Maintenance | maintenance |
Scheduled maintenance |
| Block | block |
Property blocks/holds |
| Other | other |
Other reservation types |
Using in Automations: Use binary sensor attributes current_reservation_type or next_reservation_type for most reliable automation triggers.
vacasa.refresh_data: Manually refresh all Vacasa datavacasa.clear_cache: Clear cached data and tokens
automation:
- alias: "Set Climate Based on Occupancy"
trigger:
- platform: state
entity_id: binary_sensor.vacasa_vacation_cabin_occupancy
action:
- choose:
# Guest booking - comfortable temperature
- conditions:
- condition: template
value_template: >
{{ state_attr('binary_sensor.vacasa_vacation_cabin_occupancy', 'current_reservation_type') == 'Guest Booking' }}
sequence:
- service: climate.set_temperature
target:
entity_id: climate.living_room
data:
temperature: 70
# Owner stay - preferred settings
- conditions:
- condition: template
value_template: >
{{ state_attr('binary_sensor.vacasa_vacation_cabin_occupancy', 'current_reservation_type') == 'Owner Stay' }}
sequence:
- service: climate.set_temperature
target:
entity_id: climate.living_room
data:
temperature: 68
# Default - economy mode when vacant
default:
- service: climate.set_temperature
target:
entity_id: climate.living_room
data:
temperature: 60automation:
- alias: "Prepare for Next Guest"
trigger:
- platform: state
entity_id: binary_sensor.vacasa_vacation_cabin_occupancy
to: "off"
condition:
- condition: template
value_template: >
{% set next_checkin = state_attr('binary_sensor.vacasa_vacation_cabin_occupancy', 'next_checkin') %}
{% set hours_until = ((as_timestamp(next_checkin) - as_timestamp(now())) / 3600) | round(1) %}
{{ next_checkin is not none and hours_until < 24 and hours_until > 0 }}
action:
- service: script.prepare_for_guests
- service: notify.mobile_app
data:
message: "Preparing for guest arrival in {{ hours_until }} hours"automation:
- alias: "Prepare for Owner Stay"
trigger:
- platform: numeric_state
entity_id: sensor.vacasa_vacation_cabin_next_stay
below: 3
condition:
- condition: template
value_template: >
{{ state_attr('sensor.vacasa_vacation_cabin_next_stay', 'stay_category') == 'owner_stay' }}
action:
- service: script.prepare_for_ownerAdd to configuration.yaml:
logger:
default: info
logs:
custom_components.vacasa: debugAuthentication fails: Verify credentials in Vacasa owner portal. Two-factor authentication is not currently supported.
Calendar shows no events: Check date range (30 days past to 365 days future). Use vacasa.refresh_data service to force refresh.
Occupancy sensor incorrect: Verify check-in/check-out times in calendar. Ensure Home Assistant timezone matches property timezone.
Entities unavailable: Check debug logs for API errors. Try restarting the integration via Configuration > Integrations.
- Search GitHub issues
- Enable debug logging and review logs
- Create an issue with detailed information:
- Home Assistant version
- Integration version
- Relevant log entries
- Steps to reproduce
# Clone repository
git clone https://github.com/samspade21/vacasa-ha.git
cd vacasa-ha
# Create virtual environment
python -m venv venv
source venv/bin/activate # Windows: venv\Scripts\activate
# Install dependencies
pip install -r requirements.txt
pip install -r requirements-test.txt
# Install pre-commit hooks
pre-commit installpytest- Follow PEP 8 style guidelines
- Add type hints to functions
- Include docstrings for new code
- Use async/await for I/O operations
- Implement proper error handling
- Use appropriate logging levels
This project uses an automated release process with clear separation between manual preparation and automated deployment.
# 1. Prepare release on main branch
# - Update VERSION file with new version (e.g., "1.7.1")
# - Update custom_components/vacasa/manifest.json version field
# - Update CHANGELOG.md with release notes
# - Commit all changes: git commit -m "chore: prepare release v1.7.1"
# 2. Run the release script
./new-prod-release.sh
# 3. Review and merge the PR
# - Script creates PR from development to main
# - Review PR and ensure CI checks pass
# - Merge when ready
# 4. Automatic release creation
# - GitHub Actions automatically creates git tag
# - Release workflow creates GitHub release with assets
# - HACS is notified for distribution- GitHub CLI:
brew install gh(macOS) orsudo apt install gh(Linux) - Authentication: Run
gh auth loginbefore first use - Clean Working Directory: All changes must be committed
- Version Consistency: VERSION file and manifest.json must match
- Changelog Entry: CHANGELOG.md must contain new version section
The new-prod-release.sh script:
- ✅ Validates prerequisites (git, gh CLI authentication)
- ✅ Verifies you're on development branch with clean working directory
- ✅ Checks version consistency across VERSION, manifest.json, and CHANGELOG.md
- ✅ Pushes development branch to GitHub
- ✅ Creates pull request from development to main
- ✅ Displays PR information and next steps
After PR merge, GitHub Actions automatically:
- 🤖 Detects release merge and reads version from VERSION file
- 🏷️ Creates annotated git tag (e.g., v1.7.1)
- 📦 Triggers release workflow
- 🚀 Creates GitHub release with changelog and assets
- 📢 Notifies HACS for distribution
Issue: "GitHub CLI is not authenticated"
gh auth login
gh auth statusIssue: "Working directory is not clean"
git status
git add .
git commit -m "chore: cleanup before release"Issue: "Version mismatch"
# Check versions
cat VERSION
grep version custom_components/vacasa/manifest.json
grep "## \[" CHANGELOG.md | head -1
# Update all files to match
echo "1.7.1" > VERSION
# Edit manifest.json manually
# Ensure CHANGELOG.md has [1.7.1] entryIssue: "PR already exists"
gh pr list
gh pr close <pr-number> # Close old PR if needed
./new-prod-release.sh # Try againIssue: "Auto-tag workflow didn't trigger"
- Check commit message contains "Release v" or "prepare release v"
- Manually create tag if needed:
git checkout main git pull origin main git tag -a v1.7.1 -m "Release v1.7.1" git push origin v1.7.1
- Semantic Versioning: Use MAJOR.MINOR.PATCH format
- Consistency: Always update VERSION, manifest.json, and CHANGELOG.md together
- Changelog Format: Follow Keep a Changelog format with date
- Branch Hygiene: Keep development branch in sync with main after releases
- Testing: Test changes thoroughly before creating release PR
Contributions are welcome! Please:
- Fork the repository and create a feature branch
- Follow existing code style and standards
- Add tests for new functionality
- Update documentation as needed
- Create a pull request with clear description
Use conventional commits:
feat:- New featuresfix:- Bug fixesdocs:- Documentation changesrefactor:- Code refactoringtest:- Test updateschore:- Maintenance tasks
See CHANGELOG.md for release history and detailed changes.
This project is licensed under the MIT License - see the LICENSE file for details.
This integration is not affiliated with or endorsed by Vacasa. The Vacasa API is not officially documented and may change without notice.