{ "packageName": "hubitat_SmartHQ", "author": "craigde", "version": "1.0.10", "minimumHEVersion": "2.1.9", "dateReleased": "2026-08-31", "bundles": [ { "id": "f8a2c1d4-9b3e-4f5a-8c7d-1e2f3a4b5c6d", "name": "SmartHQ Helpers Library", "namespace": "craigde", "location": "https://github.com/craigde/hubitat-SmartHQ/raw/main/SmartHQHelpersLibrary.zip", "required": true } ], "apps": [ { "id": "d1e2f3a4-b5c6-7d8e-9f0a-1b2c3d4e5f6a", "name": "SmartHQ", "namespace": "craigde", "location": "https://raw.githubusercontent.com/craigde/hubitat-SmartHQ/main/apps/smartHQ_app", "required": true, "oauth": false } ], "drivers": [ { "id": "1f2e3d4c-5b6a-4798-8765-4321fedcba98", "name": "SmartHQ Connector", "namespace": "craigde", "location": "https://raw.githubusercontent.com/craigde/hubitat-SmartHQ/main/devices/smartHQ_connector", "required": true }, { "id": "a1b2c3d4-e5f6-4a7b-8c9d-0e1f2a3b4c5d", "name": "SmartHQ Refrigerator", "namespace": "craigde", "location": "https://raw.githubusercontent.com/craigde/hubitat-SmartHQ/main/devices/smartHQ_refrigerator", "required": false }, { "id": "b2c3d4e5-f6a7-4b8c-9d0e-1f2a3b4c5d6e", "name": "SmartHQ Laundry", "namespace": "craigde", "location": "https://raw.githubusercontent.com/craigde/hubitat-SmartHQ/main/devices/smartHQ_laundry", "required": false }, { "id": "c3d4e5f6-a7b8-4c9d-0e1f-2a3b4c5d6e7f", "name": "SmartHQ Oven", "namespace": "craigde", "location": "https://raw.githubusercontent.com/craigde/hubitat-SmartHQ/main/devices/smartHQ_oven", "required": false }, { "id": "d4e5f6a7-b8c9-4d0e-1f2a-3b4c5d6e7f8a", "name": "SmartHQ Dishwasher", "namespace": "craigde", "location": "https://raw.githubusercontent.com/craigde/hubitat-SmartHQ/main/devices/smartHQ_dishwasher", "required": false }, { "id": "e5f6a7b8-c9d0-4e1f-2a3b-4c5d6e7f8a9b", "name": "SmartHQ Portable AC", "namespace": "craigde", "location": "https://raw.githubusercontent.com/craigde/hubitat-SmartHQ/main/devices/smartHQ_portableAC", "required": false }, { "id": "f6a7b8c9-d0e1-4f2a-3b4c-5d6e7f8a9b0c", "name": "SmartHQ Microwave", "namespace": "craigde", "location": "https://raw.githubusercontent.com/craigde/hubitat-SmartHQ/main/devices/smartHQ_microwave", "required": false }, { "id": "a7b8c9d0-e1f2-4a3b-4c5d-6e7f8a9b0c1d", "name": "SmartHQ Home Water Filter", "namespace": "craigde", "location": "https://raw.githubusercontent.com/craigde/hubitat-SmartHQ/main/devices/smartHQ_homeWaterFilter", "required": false }, { "id": "b8c9d0e1-f2a3-4b4c-5d6e-7f8a9b0c1d2e", "name": "SmartHQ Ice Maker", "namespace": "craigde", "location": "https://raw.githubusercontent.com/craigde/hubitat-SmartHQ/main/devices/smartHQ_iceMaker", "required": false }, { "id": "c9d0e1f2-a3b4-4c5d-6e7f-8a9b0c1d2e3f", "name": "SmartHQ Hood", "namespace": "craigde", "location": "https://raw.githubusercontent.com/craigde/hubitat-SmartHQ/main/devices/smartHQ_hood", "required": false }, { "id": "e0f1a2b3-c4d5-4e6f-7a8b-9c0d1e2f3a4b", "name": "SmartHQ Dehumidifier", "namespace": "craigde", "location": "https://raw.githubusercontent.com/craigde/hubitat-SmartHQ/main/devices/smartHQ_dehumidifier", "required": false } ], "licenseFile": "https://raw.githubusercontent.com/craigde/hubitat-SmartHQ/main/LICENSE", "releaseNotes": "1.0.10 Dishwasher pod count - diagnostics, plus a fix for rule-driven calls. This does not claim to restore pod setting for everyone, because the integration could not tell you why it was failing. The adjustNumberOfPods command was fire-and-forget: the message it sends is byte-for-byte what the reference python SDK sends, but nothing ever looked at the cloud's answer. Every websocket#api reply carries its own HTTP-style status code, and a refused request still arrives as a perfectly ordinary message - so nothing threw, the send looked successful, and the failure was invisible. Changes: (1) interpretResponse() now checks that status before dispatching and logs a warning with the reason the cloud gave, for example 'erd is not writable'. (2) Appliance control commands now carry a correlation id; buildAppCtrlSetter previously sent an empty id, matching the reference SDK, so their replies could not be matched to the command that caused them and were logged as unrecognized messages. Together these mean that if GE has changed or retired the 'dishwasher-set-pods' endpoint, running the command will now log a warning naming the reason - no need to enable debug logging - please post that log line. (3) adjustNumberOfPods normalizes its arguments. Hubitat does not pass a NUMBER command parameter as one consistent type: the device detail page gives a BigDecimal, which was already serialized correctly as 5, but a Rule Machine custom action gives a String, which was serialized as \"5\" - a JSON string where the API wants the integer 5 - and a non-numeric argument threw IllegalArgumentException out of the old 'number < 0' guard. The operation is now validated and the count coerced to an integer, with a logged warning on bad input. (4) Defensive: sendWssMap() no longer forwards a null message, which used to put the literal string \"null\" on the socket when a message builder bailed out. Also in 1.0.10, contributed separately by youzer-name (GitHub PR #18) - thank you! Dehumidifier maintenance reporting: GE appears to have retired the separate ERD codes for 'bucket full' (0x7b07) and 'clean filter' (0x7b06) and replaced them with a single DH_MAINTENANCE code (0x7832) carrying a bitmask - bit 0 set means empty the bucket, bit 1 set means clean the filter. The dehumidifier driver now parses that bitmask and emits both bucketStatus and filterStatus from it, so those two attributes start updating again on firmware that has made the switch. An unrecognized value falls through to the driver's unknown-ERD logging rather than being silently dropped. Note: SmartHQHelpersLibrary.zip has been regenerated from libraries/smarthqHelpers in this release - HPM installs the bundle first, so it must stay in sync with the library source.\n\n1.0.9 Rinse aid added\n\n1.0.8 Fix from Alan_F to support changes in hub http handling in 2.5.1.143\n\n1.0.7 - craigde - Add a 'reconnect' command to every appliance driver. It tells the SmartHQ app to re-authenticate and rebuild the shared cloud connection, so a rule can kick the connection (for example after a period of no appliance activity) the way the pre-app device driver's initialize command used to. The whole integration shares one WebSocket, so triggering reconnect on any single appliance reconnects them all. (An automatic idle watchdog in the app is planned as a follow-up so this won't require a manual rule.)\n\n1.0.6 - craigde - Login flow hardening plus handling for GE's 'test MFA' prompt. (1) Fix a full re-auth crash introduced by a change to GE's OAuth login redirect: the authorization-code parser indexed split(\"=\")[1], which threw ArrayIndexOutOfBoundsException ('Index 1 out of bounds for length 1') when the redirect contained an empty-valued param such as 'scope='. This only fired on full re-auth (refresh-token expiry/revocation), so connections kept working until a refresh failed and then could not recover. Parsing now splits on the first '=' only and tolerates valueless params. (2) Auto-skip GE's non-persistent 'We are testing MFA' interstitial: when the login redirect lands on the MFA prompt, the integration now replicates the website's 'Skip' action and continues to the real authorization-code redirect, so logins succeed without manual intervention while Skip remains available. MFA-skip flow contributed by youzer-name (GitHub PR #12) - thank you! (3) When login still returns no authorization code (an MFA wall, bad credentials, or a changed login flow), the app logs a clear warning and shows the reason on its config page instead of silently entering the reconnect backoff loop.\n\n1.0.4 - craigde - Added SmartHQ Dehumidifier driver (contributed by Alan_F from the Hubitat community). Integrated with minor edits: declared Actuator/FilterStatus/FanControl capabilities alongside the existing attributes, normalized filterStatus values to the standard normal/replace vocabulary, wrapped parse dispatch in a try/catch for consistency with the other drivers. The dehumidifier also introduces an info-level logging preference (off by default in the rest of the package) that emits each attribute change to log.info; useful if you pipe Hubitat logs to an external system. Thanks Alan_F!\n\nAlso defensive: buildDevDetails() in smarthqHelpers now returns null if userId hasn't been received from the cloud yet, so commands cleanly no-op during the brief first-install window between WebSocket open and the List-appliances response. Previously this could produce malformed messages with null userId. Note: the SmartHQHelpersLibrary.zip bundle MUST be regenerated from the current libraries/smarthqHelpers and recommitted - HPM installs the bundle first, so a stale bundle keeps an old library version on the hub regardless of what's in main.\n\n1.0.3 - craigde - Capability cleanup pass on every appliance driver so common automations and dashboard tiles work natively. Refrigerator: added TemperatureMeasurement (temperature mirrors fridgeActual) and FilterStatus (rolled up from air + water filters). Oven: added Switch (driven by upper/lower cookMode != off; on/off log a warning since ovens can't be started remotely). Dishwasher: added Actuator and Switch (on/off map to existing start/stop commands; switch attribute reflects active wash phases). Laundry: added Switch (driven by machineState run/delay states; on/off read-only). Microwave: added Switch (driven by cookStatus; on/off read-only for safety). Portable AC: added ThermostatMode and FilterStatus, dropped redundant RelaySwitch (Switch already covers it), normalized filter values to standard normal/replace, emit thermostatMode attribute. Ice Maker: added Actuator and FilterStatus, normalized filter values. Hood: added Actuator. See ROADMAP.md for Phase 2 component child-device plans (per-door ContactSensors on the fridge, child Light devices for hood and ice maker, etc).\n\n1.0.2 - craigde - Fix WebSocket connection failure (was throwing NullPointerException 'Cannot get property webSocket on null object'). Hubitat does not allow apps to use interfaces.webSocket - it is driver-only - so the WebSocket lives in a new SmartHQ Connector child device that the app spawns automatically. Connector is required and installed by HPM.\n\n1.0.1 - craigde - Architectural cleanup and reliability/security fixes. Removed deprecated SmartHQ System driver. Inlined WebSocket reconnection and OAuth code into the app (out of the shared helpers library) so device drivers no longer carry credentials. Restructured smarthqHelpers as pure utilities. WebSocket: reconnect on generic init failures (no longer dies after a NullPointerException), unschedule on init/uninstall to prevent schedule pile-up, defer subscribe/list to status:open so we don't send over an unopened socket, validate WSS endpoint before connect, clamp token-refresh re-auth delay. Auth: concatenate region + JSESSION cookies into a single Cookie header (Groovy map literal was silently dropping the region cookie). Drivers: bounds-check refrigerator and portable AC setpoints, stop forcing 'cool' mode in setCoolingSetpoint, fix decodeErdSignedByte off-by-one (0x80 now -128 not +128), drop blocking pauseExecution in microwave, wrap unprotected parse methods in try/catch, fix hood cycleSpeed null check, declare missing sabbathMode attribute on refrigerator, init numberOfButtons on oven, fix flushEvents skipping empty initializer entries, add F units to refrigerator/AC temperature events, dedupe setIntegerErd/parseIntegerErd into helpers.\n\n1.0.0 - craigde - Forked from tomw's original. Refactored to app-based architecture. Added TemperatureMeasurement capability to oven. Added F/C temperature unit support.\n\nOriginal version history (tomw):\n0.9.15 - Bugfixes for connection reliability.\n0.9.14 - Bugfix for token failure cases.\n0.9.13 - Bugfix for websocket failure case.\n0.9.12 - Hood support.\n0.9.11 - Ice Maker support.\n0.9.10 - Added selectable region for login.\n0.9.9 - Flow rate and daily usage for Home Water Filter.\n0.9.8 - Home Water Filter support.\n0.9.7 - Dishwasher commands for start, stop, and pod count management.\n0.9.6 - Additional attributes for dishwasher.\n0.9.5 - Improved Washer/Dryer support.\n0.9.4 - Improved air conditioner support.\n0.9.3 - Added Microwave support. Added Sabbath mode setting.\n0.9.2 - Make child logging follow system device setting.\n0.9.1 - Added support for Portable AC.\n0.9.0 - Initial release.", "documentationLink": "https://github.com/craigde/hubitat-SmartHQ/blob/main/README.md", "communityLink": "https://community.hubitat.com/t/support-for-ge-appliances-smarthq/85930/12" }