{ "packageName": "Home Connect Integration v3", "author": "Craig Dewar", "version": "3.3.25", "minimumHEVersion": "2.3.0", "dateReleased": "2026-07-08", "licenseFile": "", "releaseNotes": "v3.3.25\n- App: Home Connect Integration now appears under the Integrations menu in the updated Hubitat UI (platform 2.5.0+), instead of the general Apps list\n- No action needed on older platform versions - the app continues to appear under Apps as before\n\nv3.3.24\n- FridgeFreezer: Added support for newer Bosch/Siemens models that expose settings under the Refrigeration.Common.* namespace (EcoMode, VacationMode, SabbathMode, FreshMode, ice dispenser)\n- FridgeFreezer: Event parsing accepts both the legacy and new namespaces; setters target whichever key the appliance reports, with legacy fallback (older models unaffected)\n- FridgeFreezer: Fixed aggregate door contact/anyDoorOpen getting stuck 'open' after closing a door - the generic door event no longer races the per-compartment door events\n- After updating, click Initialize on your FridgeFreezer device\n\nv3.3.23\n- Stream Driver: Fixed disconnect event overwriting 'rate limited' connection status with 'disconnected'\n- Stream Driver: Watchdog now shows rate limit expiry time and minutes remaining in logs\n- Stream Driver: Watchdog auto-corrects connectionStatus if rate limited but showing wrong status\n- Stream Driver: Connection bounces (connect then immediate disconnect) no longer trigger device refresh\n- Stream Driver: clearRateLimit now warns that server-side rate limits may still apply\n- Fixes rate limit loop where users got permanently stuck in 24-hour rate limit cycles\n- Wait for rate limit to fully expire before clicking Initialize\n\nv3.3.22\n- Stream Driver: Fixed apiGet() not checking rate limit state - GET requests now blocked when rate limited\n- Stream Driver: Prevents API call bursts on reconnect that would re-trigger rate limiting\n- Stream Driver: notifyParentReconnected() now skips device refresh when rate limited OR disconnected\n- Stream Driver: HTTP 429 backoff increased to 1 hour (was 60 seconds) and won't override longer SSE-derived rate limits\n- Stream Driver: Fixed disconnect event overwriting 'rate limited' status with 'disconnected' (hid rate limit from user)\n- Stream Driver: Watchdog now shows rate limit expiry time and minutes remaining in logs\n- Stream Driver: Watchdog auto-corrects connectionStatus if rate limited but showing 'disconnected'\n- Stream Driver: Connection bounces (connect then immediate disconnect) no longer trigger device refresh\n- Stream Driver: clearRateLimit now warns that server-side rate limits may still apply\n- App: refreshAllDeviceStatus() checks stream driver rate limit before making API calls\n- Fixes rate limit loop where users got permanently stuck in 24-hour rate limit cycles\n- DO NOT click Initialize while rate limited - wait for the rate limit to fully expire first\n\nv3.3.21\n- Stream Driver: Fixed SSE stream not auto-recovering after connection loss\n- Stream Driver: Watchdog now uses persistent cron schedule instead of fragile runIn() chain - survives hub restarts\n- Stream Driver: Watchdog now auto-recovers from ALL non-connected states (was only checking when 'connected')\n- Stream Driver: Fixed stale 'connecting' status blocking reconnection (60s timeout added)\n- Stream Driver: Fixed processingDisconnect flag getting stuck, silently ignoring disconnect events\n- Stream Driver: Reconnect attempt counter now resets so driver never permanently gives up\n- App: Child device 'Initialize and Configure' now also reconnects broken SSE stream\n- Dishwasher: Added Ambient Light (Emotion Light) support for Siemens dishwashers (SX878D26PE etc.)\n- Dishwasher: New attributes: ambientLightEnabled, ambientLightBrightness, ambientLightColor\n- Resolves issue where all appliance status updates stop after stream disconnect (reported ~March 9th)\n- After updating, click Initialize on your Stream Driver to activate the new persistent watchdog\n\nv3.3.20\n- Dishwasher: Added waterForecast and energyForecast attributes (previously unhandled events)\n- Dishwasher: Added remainingProgramTimeIsEstimated attribute\n- Dishwasher: Formatted remaining time shows '~' prefix when appliance reports time as estimated (e.g. '~00:41')\n\nv3.3.19\n- Dishwasher: Fixed remainingProgramTime not updating during cycle\n- Dishwasher: API doesn't send RemainingProgramTime SSE events until final minutes - now fetches active program via REST when cycle starts\n- Dishwasher: Added remaining time estimation from elapsed time + progress% as fallback\n- Dishwasher: Added isStateChange:true to remaining time updates to ensure Hubitat processes them\n- Dishwasher: Added debug logging around remaining time updates for diagnostics\n\nv3.3.18\n- Stream Driver: Fixed keep-alive detection (bare 'data:' messages were silently dropped since day one)\n- Stream Driver: API call counter resets now sync to Home Connect's own window via X-RateLimit-Remaining header\n- Dishwasher: Local timer ticker updates elapsed/remaining time every 60s so dashboards stay current during mid-cycle API silences\n- Dishwasher: Finished event now preserves final elapsed time, sets progress=100%, and immediately updates cyclePhase/friendlyStatus\n- Dishwasher: Ready/Inactive now properly resets cyclePhase=Idle and friendlyStatus=Ready\n- Dishwasher: SSE timing events reset ticker phase so API data always takes precedence\n\nv3.3.16\n- Stream Driver: Handle bare JSON lines in SSE messages (Hubitat may deliver data without data: prefix)\n- Dishwasher: Fixed derived states (estimatedEndTime, cyclePhase, friendlyStatus, elapsedTime) not updating when operationState is null\n- Dishwasher: Infers Run state from active timing values when operationState is missing (e.g. after driver update mid-cycle)\n- Dishwasher: Deferred jsonState and derived state updates for SSE events to ensure values persist before reading\n- Dishwasher: Seeds programStartTime from derived state when missing during active cycle\n\nv3.3.15\n- Stream Driver: Added verbose stream diagnostics toggle for debugging stale event issues\n- Stream Driver: Tracks per-appliance last event times to identify which appliance stops receiving events\n- Stream Driver: Watchdog now logs detailed health every 5 min when verbose diagnostics enabled\n- Stream Driver: Added showStreamHealth command for on-demand diagnostics\n- Stream Driver: Fixed watchdog not starting when driver code is updated on an active connection\n- After updating, enable 'verbose stream diagnostics' in Stream Driver preferences to monitor event health\n\nv3.3.13\n- All drivers now auto-initialize when driver code is updated via HPM\n- No longer need to manually click Initialize on each device after updating\n- Stream Driver automatically reconnects SSE event stream after code update\n- Appliance drivers automatically refresh status and available programs\n- Dishwasher: Elapsed program time now calculated locally when appliance doesn't report it\n- Stream Driver: Always refreshes device status on reconnect for complete state recovery\n\nv3.3.12\n- Stream Driver: Added watchdog to auto-recover silently dead SSE connections\n- Stream Driver: If no data arrives for 3 minutes (KEEP-ALIVE comes every ~55s), forces reconnect\n- Stream Driver: Fixes appliances stopping to receive real-time events until manual refresh\n- Stream Driver: Added message buffer overflow protection\n- Stream Driver: Fixed double-processing of SSE events\n- Dishwasher: Fixed jsonState showing stale values after status refresh\n- Dishwasher: Fixed z_parseActiveProgram not updating jsonState\n- After updating, click Initialize on your Stream Driver to activate the watchdog\n\nv3.3.11\n- Fixed lastCommandStatus not updating on successful commands (was only showing failures)\n- Thanks to user feedback for spotting this behavior!\n\nv3.3.10\n- FridgeFreezer: Added support for ChillerLeft, ChillerRight, and FlexCompartment doors\n- FridgeFreezer: New contact attributes for all door types (chillerLeftContact, etc.)\n- FridgeFreezer: Fixed aggregate contact to include all door types\n- Thanks to user feedback for reporting the unhandled door events!\n\nv3.3.9\n- FridgeFreezer: Added individual contact attributes (fridgeContact, freezerContact, flexZoneContact)\n- FridgeFreezer: Contact attributes use 'open'/'closed' for Rule Machine compatibility\n- Allows triggering RM rules on specific compartment doors instead of just 'any door open'\n\nv3.3.8\n- Dishwasher: cyclePhase now shows 'Idle' when Ready (was incorrectly showing 'Prewash')\n- Dishwasher: activeProgram clears to 'None' when cycle ends (improves automation reliability)\n- Dishwasher: RinseAidNearlyEmpty/SaltNearlyEmpty now initialize to 'Off' (visible immediately)\n- Dishwasher: Run Initialize to populate consumable attributes on existing installs\n- App: Updated setup instructions for current Home Connect Developer Portal\n- App: Added Default Home Connect Account for Testing requirement\n- App: Added Redirect URI format example\n\nv3.3.6\n- Fixed devices not created on first install\n- Oven: on/off now starts/stops programs instead of setting power\n- Oven: Fixed program key lookup to use API-reported keys\n- Oven: Added warnings when setting temp/duration without a program selected\n- Hood: Fixed fan speed control for Option-based hoods\n- Hood: Added FanControl compatibility (medium-low, medium-high, on)\n- Hood: Light brightness 0 now turns off light\n- Hood: Added grease filter alert handler\n- Improved 409 error messages with user-friendly translations\n- Added Actuator capability to all drivers\n- Added clear error message when optional HPM driver is missing", "documentationLink": "https://github.com/craigde/hubitat-homeconnect-v3/blob/main/README.md", "communityLink": "https://community.hubitat.com/t/release-home-connect-integration-control-bosch-siemens-thermador-and-more/160748", "payPalUrl": "https://www.paypal.com/paypalme/craigde", "apps": [ { "id": "e9f8a7b6-5c4d-3e2f-1a0b-homeconnect-v3-app", "name": "Home Connect Integration v3", "namespace": "craigde", "location": "https://raw.githubusercontent.com/craigde/hubitat-homeconnect-v3/main/apps/HomeConnectIntegration.groovy", "required": true, "oauth": true, "primary": true } ], "drivers": [ { "id": "e9f8a7b6-5c4d-3e2f-1a0b-homeconnect-v3-stream", "name": "Home Connect Stream Driver v3", "namespace": "craigde", "location": "https://raw.githubusercontent.com/craigde/hubitat-homeconnect-v3/main/drivers/HomeConnectStreamDriver.groovy", "required": true }, { "id": "e9f8a7b6-5c4d-3e2f-1a0b-homeconnect-v3-dishwasher", "name": "Home Connect Dishwasher v3", "namespace": "craigde", "location": "https://raw.githubusercontent.com/craigde/hubitat-homeconnect-v3/main/drivers/HomeConnectDishwasher.groovy", "required": false }, { "id": "e9f8a7b6-5c4d-3e2f-1a0b-homeconnect-v3-coffeemaker", "name": "Home Connect CoffeeMaker v3", "namespace": "craigde", "location": "https://raw.githubusercontent.com/craigde/hubitat-homeconnect-v3/main/drivers/HomeConnectCoffeeMaker.groovy", "required": false }, { "id": "e9f8a7b6-5c4d-3e2f-1a0b-homeconnect-v3-oven", "name": "Home Connect Oven v3", "namespace": "craigde", "location": "https://raw.githubusercontent.com/craigde/hubitat-homeconnect-v3/main/drivers/HomeConnectOven.groovy", "required": false }, { "id": "e9f8a7b6-5c4d-3e2f-1a0b-homeconnect-v3-hood", "name": "Home Connect Hood v3", "namespace": "craigde", "location": "https://raw.githubusercontent.com/craigde/hubitat-homeconnect-v3/main/drivers/HomeConnectHood.groovy", "required": false }, { "id": "e9f8a7b6-5c4d-3e2f-1a0b-homeconnect-v3-cooktop", "name": "Home Connect Cooktop v3", "namespace": "craigde", "location": "https://raw.githubusercontent.com/craigde/hubitat-homeconnect-v3/main/drivers/HomeConnectCooktop.groovy", "required": false }, { "id": "e9f8a7b6-5c4d-3e2f-1a0b-homeconnect-v3-fridgefreezer", "name": "Home Connect FridgeFreezer v3", "namespace": "craigde", "location": "https://raw.githubusercontent.com/craigde/hubitat-homeconnect-v3/main/drivers/HomeConnectFridgeFreezer.groovy", "required": false }, { "id": "e9f8a7b6-5c4d-3e2f-1a0b-homeconnect-v3-warmingdrawer", "name": "Home Connect WarmingDrawer v3", "namespace": "craigde", "location": "https://raw.githubusercontent.com/craigde/hubitat-homeconnect-v3/main/drivers/HomeConnectWarmingDrawer.groovy", "required": false }, { "id": "e9f8a7b6-5c4d-3e2f-1a0b-homeconnect-v3-washer", "name": "Home Connect Washer v3", "namespace": "craigde", "location": "https://raw.githubusercontent.com/craigde/hubitat-homeconnect-v3/main/drivers/HomeConnectWasher.groovy", "required": false }, { "id": "e9f8a7b6-5c4d-3e2f-1a0b-homeconnect-v3-dryer", "name": "Home Connect Dryer v3", "namespace": "craigde", "location": "https://raw.githubusercontent.com/craigde/hubitat-homeconnect-v3/main/drivers/HomeConnectDryer.groovy", "required": false }, { "id": "e9f8a7b6-5c4d-3e2f-1a0b-homeconnect-v3-washerdryer", "name": "Home Connect WasherDryer v3", "namespace": "craigde", "location": "https://raw.githubusercontent.com/craigde/hubitat-homeconnect-v3/main/drivers/HomeConnectWasherDryer.groovy", "required": false }, { "id": "e9f8a7b6-5c4d-3e2f-1a0b-homeconnect-v3-cookprocessor", "name": "Home Connect CookProcessor v3", "namespace": "craigde", "location": "https://raw.githubusercontent.com/craigde/hubitat-homeconnect-v3/main/drivers/HomeConnectCookProcessor.groovy", "required": false }, { "id": "e9f8a7b6-5c4d-3e2f-1a0b-homeconnect-v3-cleaningrobot", "name": "Home Connect CleaningRobot v3", "namespace": "craigde", "location": "https://raw.githubusercontent.com/craigde/hubitat-homeconnect-v3/main/drivers/HomeConnectCleaningRobot.groovy", "required": false } ] }