3
3
*/
4
4
package uk .me .hardill .TRADFRI2MQTT ;
5
5
6
+ import static uk .me .hardill .TRADFRI2MQTT .TradfriConstants .*;
7
+
6
8
import java .net .InetSocketAddress ;
7
9
import java .net .URI ;
8
10
import java .net .URISyntaxException ;
@@ -88,36 +90,51 @@ public void messageArrived(String topic, MqttMessage message) throws Exception {
88
90
System .out .println (command );
89
91
try {
90
92
JSONObject json = new JSONObject ();
91
- if (bulb ) {
93
+ if (bulb ) { // single bulb
92
94
JSONObject settings = new JSONObject ();
93
95
JSONArray array = new JSONArray ();
94
96
array .put (settings );
95
- json .put ("3311" , array );
97
+ json .put (LIGHT , array );
96
98
if (command .equals ("dim" )) {
97
- settings .put ("5851" , Integer .parseInt (message .toString ()));
98
- settings .put ("5712" , 3 ); // second transition
99
+ settings .put (DIMMER , Math .min (DIMMER_MAX , Math .max (DIMMER_MIN , Integer .parseInt (message .toString ()))));
100
+ settings .put (TRANSITION_TIME , 3 ); // transition in seconds
101
+ } else if (command .equals ("temperature" )) {
102
+ // not sure what the COLOR_X and COLOR_Y values do, it works without them...
103
+ switch (message .toString ()) {
104
+ case "cold" :
105
+ settings .put (COLOR , COLOR_COLD );
106
+ break ;
107
+ case "normal" :
108
+ settings .put (COLOR , COLOR_NORMAL );
109
+ break ;
110
+ case "warm" :
111
+ settings .put (COLOR , COLOR_WARM );
112
+ break ;
113
+ default :
114
+ System .err .println ("Invalid temperature supplied: " + message .toString ());
115
+ }
99
116
} else if (command .equals ("on" )) {
100
117
if (message .toString ().equals ("0" )) {
101
- settings .put ("5850" , 0 );
118
+ settings .put (ONOFF , 0 );
102
119
} else {
103
- settings .put ("5850" , 1 );
120
+ settings .put (ONOFF , 1 );
104
121
}
105
122
}
106
123
String payload = json .toString ();
107
- Main .this .set ("coaps://" + ip + "//15001 /" + id , payload );
108
- } else {
124
+ Main .this .set ("coaps://" + ip + "//" + DEVICES + " /" + id , payload );
125
+ } else { // whole group
109
126
if (command .equals ("dim" )) {
110
- json .put ("5851" , Integer .parseInt (message .toString ()));
111
- json .put ("5712" , 3 );
127
+ json .put (DIMMER , Integer .parseInt (message .toString ()));
128
+ json .put (TRANSITION_TIME , 3 );
112
129
} else {
113
130
if (message .toString ().equals ("0" )) {
114
- json .put ("5850" , 0 );
131
+ json .put (ONOFF , 0 );
115
132
} else {
116
- json .put ("5850" , 1 );
133
+ json .put (ONOFF , 1 );
117
134
}
118
135
}
119
136
String payload = json .toString ();
120
- Main .this .set ("coaps://" + ip + "//15004 /" + id , payload );
137
+ Main .this .set ("coaps://" + ip + "//" + GROUPS + " /" + id , payload );
121
138
}
122
139
} catch (Exception e ) {
123
140
e .printStackTrace ();
@@ -158,13 +175,13 @@ public void run() {
158
175
private void discover () {
159
176
//bulbs
160
177
try {
161
- URI uri = new URI ("coaps://" + ip + "//15001" );
178
+ URI uri = new URI ("coaps://" + ip + "//" + DEVICES );
162
179
CoapClient client = new CoapClient (uri );
163
180
client .setEndpoint (endPoint );
164
181
CoapResponse response = client .get ();
165
182
JSONArray array = new JSONArray (response .getResponseText ());
166
183
for (int i =0 ; i <array .length (); i ++) {
167
- String devUri = "coaps://" + ip + "//15001 /" + array .getInt (i );
184
+ String devUri = "coaps://" + ip + "//" + DEVICES + " /" + array .getInt (i );
168
185
this .watch (devUri );
169
186
}
170
187
client .shutdown ();
@@ -177,13 +194,13 @@ private void discover() {
177
194
}
178
195
179
196
try {
180
- URI uri = new URI ("coaps://" + ip + "//15004" );
197
+ URI uri = new URI ("coaps://" + ip + "//" + GROUPS );
181
198
CoapClient client = new CoapClient (uri );
182
199
client .setEndpoint (endPoint );
183
200
CoapResponse response = client .get ();
184
201
JSONArray array = new JSONArray (response .getResponseText ());
185
202
for (int i =0 ; i <array .length (); i ++) {
186
- String devUri = "coaps://" + ip + "//15004 /" + array .getInt (i );
203
+ String devUri = "coaps://" + ip + "//" + GROUPS + " /" + array .getInt (i );
187
204
this .watch (devUri );
188
205
}
189
206
client .shutdown ();
@@ -232,41 +249,62 @@ public void onLoad(CoapResponse response) {
232
249
System .out .println (response .getOptions ().toString ());
233
250
try {
234
251
JSONObject json = new JSONObject (response .getResponseText ());
235
- //TODO change this test to someting based on 5750 values
252
+ //TODO change this test to something based on 5750 values
236
253
// 2 = light?
237
254
// 0 = remote/dimmer?
238
- if (json .has ("3311" ) && (json .has ("5750" ) && json .getInt ("5750" ) == 2 )){
255
+ if (json .has (LIGHT ) && (json .has (TYPE ) && json .getInt (TYPE ) == 2 )) { // single bulb
239
256
MqttMessage message = new MqttMessage ();
240
- int state = json .getJSONArray ("3311" ).getJSONObject (0 ).getInt ("5850" );
257
+ // A 'JSONObject["5850"] not found' exception occurs if there is a registered lamp with no power
258
+ int state ;
259
+ try {
260
+ state = json .getJSONArray (LIGHT ).getJSONObject (0 ).getInt (ONOFF );
261
+ } catch (JSONException e ) {
262
+ System .err .println ("Bulb '" + json .getString (NAME ) + "' has no power on lightbulb socket" );
263
+ return ; // skip this lamp for now
264
+ }
265
+ String topic = "TRÅDFRI/bulb/" + json .getString (NAME ) + "/state/on" ;
266
+ String topic2 = "TRÅDFRI/bulb/" + json .getString (NAME ) + "/state/dim" ;
267
+ String topic3 = "TRÅDFRI/bulb/" + json .getString (NAME ) + "/state/temperature" ;
268
+
269
+ name2id .put (json .getString (NAME ), json .getInt (INSTANCE_ID ));
270
+
241
271
message .setPayload (Integer .toString (state ).getBytes ());
242
272
// message.setRetained(true);
243
- String topic = "TRÅDFRI/bulb/" + json .getString ("9001" ) + "/state/on" ;
244
- String topic2 = "TRÅDFRI/bulb/" + json .getString ("9001" ) + "/state/dim" ;
245
- name2id .put (json .getString ("9001" ), json .getInt ("9003" ));
273
+
246
274
MqttMessage message2 = new MqttMessage ();
247
- int dim = json .getJSONArray ("3311" ).getJSONObject (0 ).getInt ("5851" );
275
+ int dim = json .getJSONArray (LIGHT ).getJSONObject (0 ).getInt (DIMMER );
248
276
message2 .setPayload (Integer .toString (dim ).getBytes ());
249
277
// message2.setRetained(true);
278
+
279
+ MqttMessage message3 = new MqttMessage ();
280
+ String temperature = json .getJSONArray (LIGHT ).getJSONObject (0 ).getString (COLOR );
281
+ message3 .setPayload (temperature .getBytes ());
282
+ // message3.setRetained(true);
283
+
250
284
try {
251
285
mqttClient .publish (topic , message );
252
286
mqttClient .publish (topic2 , message2 );
287
+ mqttClient .publish (topic3 , message3 );
253
288
} catch (MqttException e ) {
254
289
// TODO Auto-generated catch block
255
290
e .printStackTrace ();
256
291
}
257
- } else if (json .has ("9018" )) {
292
+ } else if (json .has (HS_ACCESSORY_LINK )) { // groups have this entry
258
293
//room?
259
294
System .out .println ("room" );
260
- name2id .put (json .getString ("9001" ), json .getInt ("9003" ));
295
+ name2id .put (json .getString (NAME ), json .getInt (INSTANCE_ID ));
296
+
297
+ String topic = "TRÅDFRI/room/" + json .getString (NAME ) + "/state/on" ;
298
+ String topic2 = "TRÅDFRI/room/" + json .getString (NAME ) + "/state/dim" ;
299
+
261
300
MqttMessage message = new MqttMessage ();
262
- int state = json .getInt ("5850" );
301
+ int state = json .getInt (ONOFF );
263
302
message .setPayload (Integer .toString (state ).getBytes ());
264
- String topic = "TRÅDFRI/room/" + json .getString ("9001" ) + "/state/on" ;
265
- String topic2 = "TRÅDFRI/room/" + json .getString ("9001" ) + "/state/dim" ;
303
+
266
304
MqttMessage message2 = new MqttMessage ();
267
- int dim = json .getInt ("5851" );
305
+ int dim = json .getInt (DIMMER );
268
306
message2 .setPayload (Integer .toString (dim ).getBytes ());
269
-
307
+
270
308
try {
271
309
mqttClient .publish (topic , message );
272
310
mqttClient .publish (topic2 , message2 );
0 commit comments