1 //Create a class for music player
3 import SmartThing.SmartThing
5 //Importing mutable integer class
6 import MutableInteger.MutableInteger
8 public class MusicPlayer extends SmartThing {
9 // id, label, and display name of the device
10 StringBuilder id = new StringBuilder()
11 StringBuilder label = new StringBuilder()
12 StringBuilder displayName = new StringBuilder()
13 // Features with numberical values
14 MutableInteger currentLevel = new MutableInteger()
15 // Features with string values
16 StringBuilder currentMute = new StringBuilder()
17 StringBuilder currentStatus = new StringBuilder()
18 StringBuilder currentTrackData = new StringBuilder()
19 StringBuilder currentTrackDescription = new StringBuilder()
20 // Maps from features to values
21 HashMap<String, StringBuilder> deviceValuesMap = new HashMap<String, StringBuilder>()
22 HashMap<String, MutableInteger> deviceIntValuesMap = new HashMap<String, MutableInteger>()
23 // Possible values for eventsSince method
24 List<StringBuilder> possibleValues = new ArrayList<StringBuilder>();
26 MusicPlayer(Closure sendEvent, StringBuilder id, StringBuilder label, StringBuilder displayName, MutableInteger currentLevel,
27 StringBuilder currentMute, StringBuilder currentStatus, StringBuilder currentTrackData, StringBuilder currentTrackDescription) {
28 deviceValuesMap = deviceValueSmartThing
29 deviceIntValuesMap = deviceIntValueSmartThing
31 labelSmartThing = label
32 displayNameSmartThing = displayName
33 sendEventSmartThings = sendEvent
34 possibleValuesSmartThings = possibleValues
39 this.currentLevel = currentLevel
40 this.currentMute = currentMute
41 this.currentStatus = currentStatus
42 this.currentTrackData = currentTrackData
43 this.currentTrackDescription = currentTrackDescription
44 possibleValues.add("on")
45 possibleValues.add("off")
47 deviceValuesMap.put("status", currentStatus)
48 deviceValuesMap.put("playpause", currentStatus)
49 deviceValuesMap.put("trackDescription", currentTrackDescription)
50 deviceValuesMap.put("mute", currentMute)
51 deviceValuesMap.put("trackData", currentTrackData)
52 deviceIntValuesMap.put("level", currentLevel)
55 // Methods to set values
56 def on(LinkedHashMap metaData) {
61 action(currentStatus, "on", "status")
64 def off(LinkedHashMap metaData) {
69 action(currentStatus, "off", "status")
72 def mute(LinkedHashMap metaData) {
77 action(currentMute, "muted", "mute")
80 def unmute(LinkedHashMap metaData) {
85 action(currentMute, "unmuted", "mute")
88 def nextTrack(LinkedHashMap metaData) {
97 def pause(LinkedHashMap metaData) {
102 action(currentStatus, "pause", "status")
105 def play(LinkedHashMap metaData) {
110 action(currentStatus, "play", "status")
113 def playTrack(LinkedHashMap metaData) {
117 def playTrack(String trackToPlay) {
122 def previousTrack(LinkedHashMap metaData) {
126 def previousTrack() {
131 def resumeTrack(LinkedHashMap metaData) {
135 def resumeTrack(String trackToResume) {
139 def restoreTrack(LinkedHashMap metaData) {
143 def restoreTrack(String trackToRestore) {
148 def setLevel(LinkedHashMap metaData) {
152 def setLevel(int level) {
153 action(currentLevel, level, "level")
156 def setTrack(LinkedHashMap metaData) {
160 def setTrack(String trackToSet) {
165 def stop(LinkedHashMap metaData) {
170 action(currentStatus, "stop", "status")
173 def action(StringBuilder variable, String newValue, String feature) {
174 if (!variable.toString().equals(newValue)) {
175 String tmpID = id.toString()
176 variable.replace(0, variable.length(), newValue)
177 println("$feature of the music player with id:$tmpID is changed to $newValue!")
178 sendEvent([name: feature, value: newValue, deviceId: tmpID, descriptionText: "",
179 displayed: true, linkText: "", isStateChange: false, unit: "", data: '{"info": "info"}'])
183 def action(MutableInteger variable, int newValue, String feature) {
184 if (!variable.getValue().equals(newValue)) {
185 String tmpID = id.toString()
186 variable.setValue(newValue)
187 println("$feature for the thermostat with id:$tmpID is changed to $newValue!")
188 sendEvent([name: feature, value: newValue, deviceId: tmpID, descriptionText: "",
189 displayed: true, linkText: "", isStateChange: false, unit: "", data: '{"info": "info"}'])
193 def musicChangeEvents() {
194 sendEvent([name: "trackDescription", value: "someDescriptions", deviceId: id.toString(), descriptionText: "",
195 displayed: true, linkText: "", isStateChange: false, unit: "", data: '{"info": "info"}'])
196 sendEvent([name: "trackData", value: "someTrack", deviceId: id.toString(), descriptionText: "",
197 displayed: true, linkText: "", isStateChange: false, unit: "", data: '{"info": "info"}'])
200 // Methods to return values
201 def getCurrentLevel() {
202 return currentLevel.getValue()
205 def getCurrentMute() {
206 return currentMute.toString()
209 def getCurrentStatus() {
210 return currentStatus.toString()
213 def getCurrentTrackData() {
214 return currentTrackData.toString()
217 def getCurrentTrackDescription() {
218 return currentTrackDescription.toString()