Repository navigation
Releases
Releases · chris9012/ics_gcal_sync
v0.8.0
Fixed
- Clearing the prefix/color/shared-prefix text fields in the options flow didn't persist — Home Assistant drops empty optional text fields from the submitted form, so the old value was silently reapplied.
Added
- Optional per-source "Source name" field to identify sources in management lists, independent of the event-title prefix.
- Per-source "games only" toggle on shareable calendars: skips events whose title doesn't look like a game ("vs"/"at" as a whole word, excluding "Practice ..."), so practices stay off shared calendars.
v0.7.0
What's New
- SportsEngine Tournament parser (
se_tourney_parser.py): fetches games directly from SE tournament bracket pages; validates conditional game slots against the division schedule to find the correct bracket opponent - Shareable calendar display names: virtual shared-calendar copies now stamp a display label between the emoji prefix and title (e.g.
⚽(Jules) Bears vs Lions) without altering the composite ID or iCalUID used for dedup - SE enricher transient errors: 5xx HTTP responses are treated as transient (warning log only, no persistent HA notification); retries once after 3 seconds
- Config flow: new steps for source shared display name and target calendar source prefix mapping
- Location abbreviations and title removals now apply to all source types (not just SE)
- Bracket seed/number prefixes stripped from SE ICS and SE Tourney titles (e.g.
[3] - Bears vs Lions→Bears vs Lions)
v0.6.0
What''s new
Multiple SportsEngine accounts
You can now configure as many SE logins as needed — one per league, club, or organization. Each calendar source gets a dropdown to pick which SE account enriches it. Add accounts via Configure → Add SE account; manage them via Edit / remove SE accounts.
Existing single-account setups continue to work without any changes (the legacy global credentials remain as a fallback).
Smart title case
A new toggle in Sync Settings (on by default) normalises event titles from all-caps or all-lowercase ICS feeds into readable mixed case:
SOCCER GAME VS OPPOSING TEAM→Soccer Game vs Opposing Team- Short all-caps abbreviations (≤ 3 chars) are preserved:
SB,TB,USA,U12 - Already mixed-case words are left untouched
Bug fixes
- SE API 400 error — API calls now include
Accept: application/jsonand a browserUser-Agent; HTTP 400 is treated as an expired cookie and triggers automatic re-login - Title-removal tokens — token matching is now case-insensitive, so tokens work regardless of how they are typed in the config or what case the ICS feed uses
- Slow HA startup — the first sync now runs in the background so the integration no longer stalls HA''s boot sequence
v0.5.0
v0.4.0 - Calendar dropdown in options flow
Changes
- Target Google Calendar field is now a searchable dropdown populated from your existing calendars
- Type a new name to create a calendar that doesn't exist yet (created automatically on first sync)
- Falls back gracefully to free-text entry if the calendar list can't be fetched
v0.3.0 - Initial Release
What's included
- Google Calendar OAuth2 authentication via Home Assistant
-
- Sync one or more ICS/iCal feeds to Google Calendar
-
- Add, update, and remove events automatically as feeds change
-
- MD5-based change detection (only modified events are updated)
-
- Composite event IDs (
uid + team_name) so the same UID from different teams is tracked independently
- Composite event IDs (
-
- Backwards-compatible with events previously synced by the GAS predecessor script
SportsEngine enrichment
- Automatic field/location lookup from the SportsEngine API
-
- Headless auto-login — re-authenticates silently when the session expires
-
- Configurable location abbreviations and title cleanup rules
-
- HA repair issue raised if login fails
Configuration
All settings managed through the Home Assistant UI:
- Add, edit, enable/disable, and remove calendar sources
-
- Sync interval and add/modify/remove toggles
-
- SportsEngine credentials, location abbreviations, and title removal tokens
Sensors
- One sensor per integration entry showing last sync time and per-calendar stats (added/modified/removed)