//Create a class for music player package MusicPlayer import SmartThing.SmartThing public class MusicPlayer extends SmartThing { // id, label, and display name of the device StringBuilder id = new StringBuilder() StringBuilder label = new StringBuilder() StringBuilder displayName = new StringBuilder() // Features with numberical values MutableInteger currentLevel = new MutableInteger() // Features with string values StringBuilder currentMute = new StringBuilder() StringBuilder currentStatus = new StringBuilder() StringBuilder currentTrackData = new StringBuilder() StringBuilder currentTrackDescription = new StringBuilder() // Maps from features to values HashMap deviceValuesMap = new HashMap() HashMap deviceIntValuesMap = new HashMap() // Possible values for eventsSince method List possibleValues = new ArrayList(); MusicPlayer(Closure sendEvent, StringBuilder id, StringBuilder label, StringBuilder displayName, MutableInteger currentLevel, StringBuilder currentMute, StringBuilder currentStatus, StringBuilder currentTrackData, StringBuilder currentTrackDescription) { deviceValuesMap = deviceValueSmartThing deviceIntValuesMap = deviceIntValueSmartThing idSmartThing = id labelSmartThing = label displayNameSmartThing = displayName sendEventSmartThings = sendEvent possibleValuesSmartThings = possibleValues // Initialization this.id = id this.label = label this.currentLevel = currentLevel this.currentMute = currentMute this.currentStatus = currentStatus this.currentTrackData = currentTrackData this.currentTrackDescription = currentTrackDescription possibleValues.add("on") possibleValues.add("off") deviceValuesMap.put("status", currentStatus) deviceValuesMap.put("playpause", currentStatus) deviceValuesMap.put("trackDescription", currentTrackDescription) deviceValuesMap.put("mute", currentMute) deviceValuesMap.put("trackData", currentTrackData) deviceIntValuesMap.put("level", currentLevel) } // Methods to set values def on(LinkedHashMap metaData) { on() } def on() { action(currentStatus, "on", "status") } def off(LinkedHashMap metaData) { off() } def off() { action(currentStatus, "off", "status") } def mute(LinkedHashMap metaData) { mute() } def mute() { action(currentMute, "muted", "mute") } def unmute(LinkedHashMap metaData) { unmute() } def unmute() { action(currentMute, "unmuted", "mute") } def nextTrack(LinkedHashMap metaData) { nextTrack() } def nextTrack() { play() musicChangeEvents() } def pause(LinkedHashMap metaData) { pause() } def pause() { action(currentStatus, "pause", "status") } def play(LinkedHashMap metaData) { play() } def play() { action(currentStatus, "play", "status") } def playTrack(LinkedHashMap metaData) { playTrack() } def playTrack(String trackToPlay) { play() musicChangeEvents() } def previousTrack(LinkedHashMap metaData) { previousTrack() } def previousTrack() { play() musicChangeEvents() } def resumeTrack(LinkedHashMap metaData) { resumeTrack() } def resumeTrack(String trackToResume) { play() } def restoreTrack(LinkedHashMap metaData) { restoreTrack() } def restoreTrack(String trackToRestore) { play() musicChangeEvents() } def setLevel(LinkedHashMap metaData) { setLevel() } def setLevel(int level) { action(currentLevel, level, "level") } def setTrack(LinkedHashMap metaData) { setTrack() } def setTrack(String trackToSet) { play() } def stop(LinkedHashMap metaData) { stop() } def stop() { action(currentStatus, "stop", "status") } def action(StringBuilder variable, String newValue, String feature) { if (!variable.toString().equals(newValue)) { String tmpID = id.toString() variable.replace(0, variable.length(), newValue) println("$feature of the music player with id:$tmpID is changed to $newValue!") sendEvent([name: feature, value: newValue, deviceId: tmpID, descriptionText: "", displayed: true, linkText: "", isStateChange: false, unit: "", data: '{"info": "info"}']) } } def action(MutableInteger variable, int newValue, String feature) { if (!variable.getValue().equals(newValue)) { String tmpID = id.toString() variable.setValue(newValue) println("$feature for the thermostat with id:$tmpID is changed to $newValue!") sendEvent([name: feature, value: newValue, deviceId: tmpID, descriptionText: "", displayed: true, linkText: "", isStateChange: false, unit: "", data: '{"info": "info"}']) } } def musicChangeEvents() { sendEvent([name: "trackDescription", value: "someDescriptions", deviceId: id.toString(), descriptionText: "", displayed: true, linkText: "", isStateChange: false, unit: "", data: '{"info": "info"}']) sendEvent([name: "trackData", value: "someTrack", deviceId: id.toString(), descriptionText: "", displayed: true, linkText: "", isStateChange: false, unit: "", data: '{"info": "info"}']) } // Methods to return values def getCurrentLevel() { return currentLevel.getValue() } def getCurrentMute() { return currentMute.toString() } def getCurrentStatus() { return currentStatus.toString() } def getCurrentTrackData() { return currentTrackData.toString() } def getCurrentTrackDescription() { return currentTrackDescription.toString() } }