17f56c904eec01df9a865d99dd9decc53283ac63
[smartthings-infrastructure.git] / MusicPlayer / MusicPlayer.groovy
1 //Create a class for music player
2 package MusicPlayer
3 import SmartThing.SmartThing
4
5 public class MusicPlayer extends SmartThing {
6         // id, label, and display name of the device
7         StringBuilder id = new StringBuilder()
8         StringBuilder label = new StringBuilder()
9         StringBuilder displayName = new StringBuilder()
10         // Features with numberical values
11         MutableInteger currentLevel = new MutableInteger()
12         // Features with string values
13         StringBuilder currentMute = new StringBuilder()
14         StringBuilder currentStatus = new StringBuilder()
15         StringBuilder currentTrackData = new StringBuilder()
16         StringBuilder currentTrackDescription = new StringBuilder()
17         // Maps from features to values
18         HashMap<String, StringBuilder> deviceValuesMap = new HashMap<String, StringBuilder>()
19         HashMap<String, MutableInteger> deviceIntValuesMap = new HashMap<String, MutableInteger>()
20         // Possible values for eventsSince method
21         List<StringBuilder> possibleValues = new ArrayList<StringBuilder>();
22         
23         MusicPlayer(Closure sendEvent, StringBuilder id, StringBuilder label, StringBuilder displayName, MutableInteger currentLevel, 
24                     StringBuilder currentMute, StringBuilder currentStatus, StringBuilder currentTrackData, StringBuilder currentTrackDescription) {
25                 deviceValuesMap = deviceValueSmartThing
26                 deviceIntValuesMap = deviceIntValueSmartThing
27                 idSmartThing = id
28                 labelSmartThing = label
29                 displayNameSmartThing = displayName
30                 sendEventSmartThings = sendEvent
31                 possibleValuesSmartThings = possibleValues
32
33                 // Initialization
34                 this.id = id
35                 this.label = label
36                 this.currentLevel = currentLevel
37                 this.currentMute = currentMute
38                 this.currentStatus = currentStatus
39                 this.currentTrackData = currentTrackData
40                 this.currentTrackDescription = currentTrackDescription
41                 possibleValues.add("on")
42                 possibleValues.add("off")
43
44                 deviceValuesMap.put("status", currentStatus)
45                 deviceValuesMap.put("playpause", currentStatus)
46                 deviceValuesMap.put("trackDescription", currentTrackDescription)
47                 deviceValuesMap.put("mute", currentMute)
48                 deviceValuesMap.put("trackData", currentTrackData)
49                 deviceIntValuesMap.put("level", currentLevel)
50         }
51
52         // Methods to set values
53         def on(LinkedHashMap metaData) {
54                 on()
55         }
56
57         def on() {
58                 action(currentStatus, "on", "status")
59         }
60
61         def off(LinkedHashMap metaData) {
62                 off()
63         }
64
65         def off() {
66                 action(currentStatus, "off", "status")
67         }
68
69         def mute(LinkedHashMap metaData) {
70                 mute()
71         }
72
73         def mute() {
74                 action(currentMute, "muted", "mute")
75         }
76
77         def unmute(LinkedHashMap metaData) {
78                 unmute()
79         }
80
81         def unmute() {
82                 action(currentMute, "unmuted", "mute")
83         }
84
85         def nextTrack(LinkedHashMap metaData) {
86                 nextTrack()
87         }
88
89         def nextTrack() {
90                 play()
91                 musicChangeEvents()
92         }
93
94         def pause(LinkedHashMap metaData) {
95                 pause()
96         }
97
98         def pause() {
99                 action(currentStatus, "pause", "status")
100         }
101
102         def play(LinkedHashMap metaData) {
103                 play()
104         }
105
106         def play() {
107                 action(currentStatus, "play", "status")
108         }
109
110         def playTrack(LinkedHashMap metaData) {
111                 playTrack()
112         }
113
114         def playTrack(String trackToPlay) {
115                 play()
116                 musicChangeEvents()
117         }
118
119         def previousTrack(LinkedHashMap metaData) {
120                 previousTrack()
121         }
122
123         def previousTrack() {
124                 play()
125                 musicChangeEvents()
126         }
127         
128         def resumeTrack(LinkedHashMap metaData) {
129                 resumeTrack()
130         }
131
132         def resumeTrack(String trackToResume) {
133                 play()
134         }
135
136         def restoreTrack(LinkedHashMap metaData) {
137                 restoreTrack()
138         }
139
140         def restoreTrack(String trackToRestore) {
141                 play()
142                 musicChangeEvents()
143         }
144
145         def setLevel(LinkedHashMap metaData) {
146                 setLevel()
147         }
148
149         def setLevel(int level) {
150                 action(currentLevel, level, "level")
151         }
152
153         def setTrack(LinkedHashMap metaData) {
154                 setTrack()
155         }
156
157         def setTrack(String trackToSet) {
158                 play()
159                 
160         }
161
162         def stop(LinkedHashMap metaData) {
163                 stop()
164         }
165
166         def stop() {
167                 action(currentStatus, "stop", "status")
168         }
169
170         def action(StringBuilder variable, String newValue, String feature) {
171                 if (!variable.toString().equals(newValue)) {
172                         String tmpID = id.toString()
173                         variable.replace(0, variable.length(), newValue)
174                         println("$feature of the music player with id:$tmpID is changed to $newValue!")
175                         sendEvent([name: feature, value: newValue, deviceId: tmpID, descriptionText: "",
176                                    displayed: true, linkText: "", isStateChange: false, unit: "", data: '{"info": "info"}'])
177                 }
178         }
179
180         def action(MutableInteger variable, int newValue, String feature) {
181                 if (!variable.getValue().equals(newValue)) {
182                         String tmpID = id.toString()
183                         variable.setValue(newValue)
184                         println("$feature for the thermostat with id:$tmpID is changed to $newValue!")
185                         sendEvent([name: feature, value: newValue, deviceId: tmpID, descriptionText: "",
186                                    displayed: true, linkText: "", isStateChange: false, unit: "", data: '{"info": "info"}'])
187                 }
188         }
189
190         def musicChangeEvents() {
191                 sendEvent([name: "trackDescription", value: "someDescriptions", deviceId: id.toString(), descriptionText: "",
192                            displayed: true, linkText: "", isStateChange: false, unit: "", data: '{"info": "info"}'])
193                 sendEvent([name: "trackData", value: "someTrack", deviceId: id.toString(), descriptionText: "",
194                            displayed: true, linkText: "", isStateChange: false, unit: "", data: '{"info": "info"}'])
195         }
196
197         // Methods to return values
198         def getCurrentLevel() {
199                 return currentLevel.getValue()
200         }
201
202         def getCurrentMute() {
203                 return currentMute.toString()
204         }
205         
206         def getCurrentStatus() {
207                 return currentStatus.toString()
208         }
209
210         def getCurrentTrackData() {
211                 return currentTrackData.toString()
212         }
213
214         def getCurrentTrackDescription() {
215                 return currentTrackDescription.toString()
216         }
217 }