/* * * IKEA Symfonisk Sound Controller Driver * */ @Field String driverVersion = "v1.14 (28th August 2025)" @Field boolean debugMode = false #include BirdsLikeWires.library import groovy.transform.Field @Field int reportIntervalMinutes = 240 @Field String deviceName = "IKEA Symfonisk Sound Controller" metadata { definition (name: "$deviceName", namespace: "BirdsLikeWires", author: "Andrew Davison", importUrl: "https://raw.githubusercontent.com/birdslikewires/hubitat/main/ikea/drivers/ikea_symfonisk_sound_controller.groovy") { capability "Battery" capability "Configuration" capability "DoubleTapableButton" capability "HoldableButton" capability "Momentary" capability "PushableButton" capability "ReleasableButton" capability "SwitchLevel" attribute "action", "string" attribute "batteryState", "string" attribute "direction", "string" attribute "healthStatus", "enum", ["offline", "online"] attribute "levelChange", "integer" } } preferences { input name: "infoLogging", type: "bool", title: "Enable logging", defaultValue: true input name: "debugLogging", type: "bool", title: "Enable debug logging", defaultValue: false input name: "traceLogging", type: "bool", title: "Enable trace logging", defaultValue: false } void configureSpecifics() { updateDataValue("encoding", "MQTT") } void updateSpecifics() { return } void processMQTT(def json) { checkDriver() // Tasks if (json.action) { withDebounce("${json.device.networkAddress}", 400, { switch("${json.action}") { case "toggle": logging("${device} : Action : Button 1 Pressed", "info") sendEvent(name: "pushed", value: 1, isStateChange: true) break case "brightness_step_up": logging("${device} : Action : Button 1 Double Pressed", "info") sendEvent(name: "doubleTapped", value: 1, isStateChange: true) break case "brightness_step_down": logging("${device} : Action : Button 1 Triple Pressed", "info") sendEvent(name: "held", value: 1, isStateChange: true) break case "brightness_move_up": logging("${device} : Action : Button 2 Pressed", "info") sendEvent(name: "pushed", value: 2, isStateChange: true) sendEvent(name: "held", value: 2, isStateChange: true) state.levelChangeStart = now() break case "brightness_move_down": logging("${device} : Action : Button 3 Pressed", "info") sendEvent(name: "pushed", value: 3, isStateChange: true) sendEvent(name: "held", value: 3, isStateChange: true) state.levelChangeStart = now() break case "brightness_stop": int buttonNumber = device.currentState("held").value.toInteger() logging("${device} : Action : Button ${buttonNumber} Released", "info") sendEvent(name: "released", value: buttonNumber, isStateChange: true) if (buttonNumber == 2) { levelChange(120,"increase") } else { levelChange(120,"decrease") } break default: logging("${device} : Action : '${json.action}' is an unknown action.", "info") break } sendEvent(name: "action", value: "${json.action}", isStateChange: true) }) } // Admin String deviceNameFull = "$deviceName ${json.device.model}" device.name = "$deviceNameFull" sendEvent(name: "battery", value: "${json.battery ?: 0}", unit: "%") sendEvent(name: "numberOfButtons", value: 3, isStateChange: false) mqttProcessBasics(json) updateHealthStatus() logging("${device} : processMQTT : ${json}", "debug") }