]> git.basschouten.com Git - openhab-addons.git/blob
af0287ee18f343addde6c9eba63994933c680a7c
[openhab-addons.git] /
1 /**
2  * Copyright (c) 2010-2020 Contributors to the openHAB project
3  *
4  * See the NOTICE file(s) distributed with this work for additional
5  * information.
6  *
7  * This program and the accompanying materials are made available under the
8  * terms of the Eclipse Public License 2.0 which is available at
9  * http://www.eclipse.org/legal/epl-2.0
10  *
11  * SPDX-License-Identifier: EPL-2.0
12  */
13 package org.openhab.binding.avmfritz.internal.discovery;
14
15 import static org.openhab.core.thing.Thing.*;
16 import static org.junit.Assert.*;
17 import static org.openhab.binding.avmfritz.internal.AVMFritzBindingConstants.*;
18
19 import java.io.StringReader;
20 import java.util.Collection;
21 import java.util.Collections;
22
23 import javax.xml.bind.JAXBException;
24 import javax.xml.bind.Unmarshaller;
25
26 import org.eclipse.jdt.annotation.NonNullByDefault;
27 import org.eclipse.jdt.annotation.Nullable;
28 import org.openhab.core.config.discovery.DiscoveryListener;
29 import org.openhab.core.config.discovery.DiscoveryResult;
30 import org.openhab.core.config.discovery.DiscoveryResultFlag;
31 import org.openhab.core.config.discovery.DiscoveryService;
32 import org.openhab.core.thing.ThingTypeUID;
33 import org.openhab.core.thing.ThingUID;
34 import org.junit.After;
35 import org.junit.Before;
36 import org.junit.Test;
37 import org.openhab.binding.avmfritz.internal.dto.AVMFritzBaseModel;
38 import org.openhab.binding.avmfritz.internal.dto.DeviceListModel;
39 import org.openhab.binding.avmfritz.internal.handler.AVMFritzThingHandlerOSGiTest;
40 import org.openhab.binding.avmfritz.internal.util.JAXBUtils;
41
42 /**
43  * Tests for {@link AVMFritzDiscoveryService}.
44  *
45  * @author Christoph Weitkamp - Initial contribution
46  */
47 @NonNullByDefault
48 public class AVMFritzDiscoveryServiceOSGiTest extends AVMFritzThingHandlerOSGiTest {
49
50     private static final ThingUID BRIGE_THING_ID = new ThingUID("avmfritz:fritzbox:1");
51
52     private @Nullable DiscoveryResult discoveryResult;
53     private @NonNullByDefault({}) AVMFritzDiscoveryService discovery;
54
55     private final DiscoveryListener listener = new DiscoveryListener() {
56         @Override
57         public void thingRemoved(DiscoveryService source, ThingUID thingUID) {
58             discoveryResult = null;
59         }
60
61         @Override
62         public void thingDiscovered(DiscoveryService source, DiscoveryResult result) {
63             discoveryResult = result;
64         }
65
66         @Override
67         public @Nullable Collection<ThingUID> removeOlderResults(DiscoveryService source, long timestamp,
68                 @Nullable Collection<ThingTypeUID> thingTypeUIDs, @Nullable ThingUID bridgeUID) {
69             return Collections.emptyList();
70         }
71     };
72
73     @Override
74     @Before
75     public void setUp() {
76         super.setUp();
77         discovery = new AVMFritzDiscoveryService();
78         discovery.setThingHandler(bridgeHandler);
79         discovery.addDiscoveryListener(listener);
80     }
81
82     @After
83     public void cleanUp() {
84         discoveryResult = null;
85     }
86
87     @Test
88     public void correctSupportedTypes() {
89         assertEquals(12, discovery.getSupportedThingTypes().size());
90         assertTrue(discovery.getSupportedThingTypes().contains(DECT100_THING_TYPE));
91         assertTrue(discovery.getSupportedThingTypes().contains(DECT200_THING_TYPE));
92         assertTrue(discovery.getSupportedThingTypes().contains(DECT210_THING_TYPE));
93         assertTrue(discovery.getSupportedThingTypes().contains(DECT300_THING_TYPE));
94         assertTrue(discovery.getSupportedThingTypes().contains(DECT301_THING_TYPE));
95         assertTrue(discovery.getSupportedThingTypes().contains(DECT400_THING_TYPE));
96         assertTrue(discovery.getSupportedThingTypes().contains(PL546E_THING_TYPE));
97         assertTrue(discovery.getSupportedThingTypes().contains(COMETDECT_THING_TYPE));
98         assertTrue(discovery.getSupportedThingTypes().contains(HAN_FUN_CONTACT_THING_TYPE));
99         assertTrue(discovery.getSupportedThingTypes().contains(HAN_FUN_SWITCH_THING_TYPE));
100         assertTrue(discovery.getSupportedThingTypes().contains(GROUP_HEATING_THING_TYPE));
101         assertTrue(discovery.getSupportedThingTypes().contains(GROUP_SWITCH_THING_TYPE));
102     }
103
104     @Test
105     public void invalidDiscoveryResult() throws JAXBException {
106         // attribute productname is important for a valid discovery result
107         //@formatter:off
108         String xml =
109                 "<devicelist version=\"1\">" +
110                     "<device identifier=\"08761 0954669\" id=\"20\" functionbitmask=\"1280\" fwversion=\"03.86\" manufacturer=\"AVM\" productname=\"\">" +
111                         "<present>1</present>" +
112                         "<name>FRITZ!DECT Repeater 100 #5</name>" +
113                         "<temperature>" +
114                             "<celsius>230</celsius>" +
115                             "<offset>0</offset>" +
116                         "</temperature>" +
117                     "</device>" +
118                 "</devicelist>";
119         //@formatter:on
120
121         Unmarshaller u = JAXBUtils.JAXBCONTEXT_DEVICES.createUnmarshaller();
122         DeviceListModel devices = (DeviceListModel) u.unmarshal(new StringReader(xml));
123         assertNotNull(devices);
124         assertEquals(1, devices.getDevicelist().size());
125
126         AVMFritzBaseModel device = devices.getDevicelist().get(0);
127         assertNotNull(device);
128
129         discovery.onDeviceAdded(device);
130         assertNull(discoveryResult);
131     }
132
133     @Test
134     public void validDECTRepeater100Result() throws JAXBException {
135         //@formatter:off
136         final String xml =
137                 "<devicelist version=\"1\">" +
138                     "<device identifier=\"08761 0954669\" id=\"20\" functionbitmask=\"1280\" fwversion=\"03.86\" manufacturer=\"AVM\" productname=\"FRITZ!DECT Repeater 100\">" +
139                         "<present>1</present>" +
140                         "<name>FRITZ!DECT Repeater 100 #5</name>" +
141                         "<temperature>" +
142                             "<celsius>230</celsius>" +
143                             "<offset>0</offset>" +
144                         "</temperature>" +
145                     "</device>" +
146                 "</devicelist>";
147         //@formatter:on
148
149         final Unmarshaller u = JAXBUtils.JAXBCONTEXT_DEVICES.createUnmarshaller();
150         DeviceListModel devices = (DeviceListModel) u.unmarshal(new StringReader(xml));
151         assertNotNull(devices);
152         assertEquals(1, devices.getDevicelist().size());
153
154         AVMFritzBaseModel device = devices.getDevicelist().get(0);
155         assertNotNull(device);
156         assertEquals(1, device.getPresent());
157
158         discovery.onDeviceAdded(device);
159         assertNotNull(discoveryResult);
160
161         assertEquals(DiscoveryResultFlag.NEW, discoveryResult.getFlag());
162         assertEquals(new ThingUID("avmfritz:FRITZ_DECT_Repeater_100:1:087610954669"), discoveryResult.getThingUID());
163         assertEquals(DECT100_THING_TYPE, discoveryResult.getThingTypeUID());
164         assertEquals(BRIGE_THING_ID, discoveryResult.getBridgeUID());
165         assertEquals("087610954669", discoveryResult.getProperties().get(CONFIG_AIN));
166         assertEquals("AVM", discoveryResult.getProperties().get(PROPERTY_VENDOR));
167         assertEquals("20", discoveryResult.getProperties().get(PROPERTY_MODEL_ID));
168         assertEquals("087610954669", discoveryResult.getProperties().get(PROPERTY_SERIAL_NUMBER));
169         assertEquals("03.86", discoveryResult.getProperties().get(PROPERTY_FIRMWARE_VERSION));
170         assertEquals(CONFIG_AIN, discoveryResult.getRepresentationProperty());
171
172         final String deviceNotPresentXml = xml.replace("<present>1</present>", "<present>0</present>");
173         devices = (DeviceListModel) u.unmarshal(new StringReader(deviceNotPresentXml));
174         assertNotNull(devices);
175         assertEquals(1, devices.getDevicelist().size());
176
177         device = devices.getDevicelist().get(0);
178         assertNotNull(device);
179         assertEquals(0, device.getPresent());
180
181         discovery.onDeviceAdded(device);
182         assertNull(discoveryResult);
183     }
184
185     @Test
186     public void validDECT200DiscoveryResult() throws JAXBException {
187         //@formatter:off
188         String xml =
189                 "<devicelist version=\"1\">" +
190                     "<device identifier=\"08761 0000434\" id=\"17\" functionbitmask=\"2944\" fwversion=\"03.83\" manufacturer=\"AVM\" productname=\"FRITZ!DECT 200\">" +
191                         "<present>1</present>" +
192                         "<name>FRITZ!DECT 200 #1</name>" +
193                         "<switch>" +
194                             "<state>0</state>" +
195                             "<mode>manuell</mode>" +
196                             "<lock>0</lock>" +
197                             "<devicelock>1</devicelock>" +
198                         "</switch>" +
199                         "<powermeter>" +
200                             "<voltage>232850</voltage>" +
201                             "<power>45</power>" +
202                             "<energy>166</energy>" +
203                         "</powermeter>" +
204                         "<temperature>" +
205                             "<celsius>255</celsius>" +
206                             "<offset>0</offset>" +
207                         "</temperature>" +
208                      "</device>" +
209                 "</devicelist>";
210         //@formatter:on
211
212         Unmarshaller u = JAXBUtils.JAXBCONTEXT_DEVICES.createUnmarshaller();
213         DeviceListModel devices = (DeviceListModel) u.unmarshal(new StringReader(xml));
214         assertNotNull(devices);
215         assertEquals(1, devices.getDevicelist().size());
216
217         AVMFritzBaseModel device = devices.getDevicelist().get(0);
218         assertNotNull(device);
219
220         discovery.onDeviceAdded(device);
221         assertNotNull(discoveryResult);
222
223         assertEquals(DiscoveryResultFlag.NEW, discoveryResult.getFlag());
224         assertEquals(new ThingUID("avmfritz:FRITZ_DECT_200:1:087610000434"), discoveryResult.getThingUID());
225         assertEquals(DECT200_THING_TYPE, discoveryResult.getThingTypeUID());
226         assertEquals(BRIGE_THING_ID, discoveryResult.getBridgeUID());
227         assertEquals("087610000434", discoveryResult.getProperties().get(CONFIG_AIN));
228         assertEquals("AVM", discoveryResult.getProperties().get(PROPERTY_VENDOR));
229         assertEquals("17", discoveryResult.getProperties().get(PROPERTY_MODEL_ID));
230         assertEquals("087610000434", discoveryResult.getProperties().get(PROPERTY_SERIAL_NUMBER));
231         assertEquals("03.83", discoveryResult.getProperties().get(PROPERTY_FIRMWARE_VERSION));
232         assertEquals(CONFIG_AIN, discoveryResult.getRepresentationProperty());
233     }
234
235     @Test
236     public void validDECT210DiscoveryResult() throws JAXBException {
237         //@formatter:off
238         String xml =
239                 "<devicelist version=\"1\">" +
240                     "<device identifier=\"08761 0000434\" id=\"17\" functionbitmask=\"2944\" fwversion=\"03.83\" manufacturer=\"AVM\" productname=\"FRITZ!DECT 210\">" +
241                         "<present>1</present>" +
242                         "<name>FRITZ!DECT 210 #1</name>" +
243                         "<switch>" +
244                             "<state>0</state>" +
245                             "<mode>manuell</mode>" +
246                             "<lock>0</lock>" +
247                             "<devicelock>1</devicelock>" +
248                         "</switch>" +
249                         "<powermeter>" +
250                             "<voltage>232850</voltage>" +
251                             "<power>45</power>" +
252                             "<energy>166</energy>" +
253                         "</powermeter>" +
254                         "<temperature>" +
255                             "<celsius>255</celsius>" +
256                             "<offset>0</offset>" +
257                         "</temperature>" +
258                     "</device>" +
259                 "</devicelist>";
260         //@formatter:on
261
262         Unmarshaller u = JAXBUtils.JAXBCONTEXT_DEVICES.createUnmarshaller();
263         DeviceListModel devices = (DeviceListModel) u.unmarshal(new StringReader(xml));
264         assertNotNull(devices);
265         assertEquals(1, devices.getDevicelist().size());
266
267         AVMFritzBaseModel device = devices.getDevicelist().get(0);
268         assertNotNull(device);
269
270         discovery.onDeviceAdded(device);
271         assertNotNull(discoveryResult);
272
273         assertEquals(DiscoveryResultFlag.NEW, discoveryResult.getFlag());
274         assertEquals(new ThingUID("avmfritz:FRITZ_DECT_210:1:087610000434"), discoveryResult.getThingUID());
275         assertEquals(DECT210_THING_TYPE, discoveryResult.getThingTypeUID());
276         assertEquals(BRIGE_THING_ID, discoveryResult.getBridgeUID());
277         assertEquals("087610000434", discoveryResult.getProperties().get(CONFIG_AIN));
278         assertEquals("AVM", discoveryResult.getProperties().get(PROPERTY_VENDOR));
279         assertEquals("17", discoveryResult.getProperties().get(PROPERTY_MODEL_ID));
280         assertEquals("087610000434", discoveryResult.getProperties().get(PROPERTY_SERIAL_NUMBER));
281         assertEquals("03.83", discoveryResult.getProperties().get(PROPERTY_FIRMWARE_VERSION));
282         assertEquals(CONFIG_AIN, discoveryResult.getRepresentationProperty());
283     }
284
285     @Test
286     public void validCometDECTDiscoveryResult() throws JAXBException {
287         //@formatter:off
288         String xml =
289                 "<devicelist version=\"1\">" +
290                     "<device identifier=\"08761 0000435\" id=\"18\" functionbitmask=\"320\" fwversion=\"03.50\" manufacturer=\"AVM\" productname=\"Comet DECT\">" +
291                         "<present>1</present>" +
292                         "<name>Comet DECT #1</name>" +
293                         "<temperature>" +
294                             "<celsius>220</celsius>" +
295                             "<offset>-10</offset>" +
296                         "</temperature>" +
297                         "<hkr>" +
298                             "<tist>44</tist>" +
299                             "<tsoll>42</tsoll>" +
300                             "<absenk>28</absenk>" +
301                             "<komfort>42</komfort>" +
302                             "<lock>0</lock>" +
303                             "<devicelock>0</devicelock>" +
304                             "<errorcode>0</errorcode>" +
305                             "<batterylow>0</batterylow>" +
306                             "<nextchange>" +
307                                 "<endperiod>1484341200</endperiod>" +
308                                 "<tchange>28</tchange>" +
309                             "</nextchange>" +
310                         "</hkr>" +
311                      "</device>" +
312                  "</devicelist>";
313         //@formatter:on
314
315         Unmarshaller u = JAXBUtils.JAXBCONTEXT_DEVICES.createUnmarshaller();
316         DeviceListModel devices = (DeviceListModel) u.unmarshal(new StringReader(xml));
317         assertNotNull(devices);
318         assertEquals(1, devices.getDevicelist().size());
319
320         AVMFritzBaseModel device = devices.getDevicelist().get(0);
321         assertNotNull(device);
322
323         discovery.onDeviceAdded(device);
324         assertNotNull(discoveryResult);
325
326         assertEquals(DiscoveryResultFlag.NEW, discoveryResult.getFlag());
327         assertEquals(new ThingUID("avmfritz:Comet_DECT:1:087610000435"), discoveryResult.getThingUID());
328         assertEquals(COMETDECT_THING_TYPE, discoveryResult.getThingTypeUID());
329         assertEquals(BRIGE_THING_ID, discoveryResult.getBridgeUID());
330         assertEquals("087610000435", discoveryResult.getProperties().get(CONFIG_AIN));
331         assertEquals("AVM", discoveryResult.getProperties().get(PROPERTY_VENDOR));
332         assertEquals("18", discoveryResult.getProperties().get(PROPERTY_MODEL_ID));
333         assertEquals("087610000435", discoveryResult.getProperties().get(PROPERTY_SERIAL_NUMBER));
334         assertEquals("03.50", discoveryResult.getProperties().get(PROPERTY_FIRMWARE_VERSION));
335         assertEquals(CONFIG_AIN, discoveryResult.getRepresentationProperty());
336     }
337
338     @Test
339     public void validDECT300DiscoveryResult() throws JAXBException {
340         //@formatter:off
341         String xml =
342                 "<devicelist version=\"1\">" +
343                     "<device identifier=\"08761 0000435\" id=\"18\" functionbitmask=\"320\" fwversion=\"03.50\" manufacturer=\"AVM\" productname=\"FRITZ!DECT 300\">" +
344                         "<present>1</present>" +
345                         "<name>FRITZ!DECT 300 #1</name>" +
346                         "<temperature>" +
347                             "<celsius>220</celsius>" +
348                             "<offset>-10</offset>" +
349                         "</temperature>" +
350                         "<hkr>" +
351                             "<tist>44</tist>" +
352                             "<tsoll>42</tsoll>" +
353                             "<absenk>28</absenk>" +
354                             "<komfort>42</komfort>" +
355                             "<lock>0</lock>" +
356                             "<devicelock>0</devicelock>" +
357                             "<errorcode>0</errorcode>" +
358                             "<batterylow>0</batterylow>" +
359                             "<nextchange>" +
360                                 "<endperiod>1484341200</endperiod>" +
361                                 "<tchange>28</tchange>" +
362                             "</nextchange>" +
363                         "</hkr>" +
364                     "</device>" +
365                 "</devicelist>";
366         //@formatter:on
367
368         Unmarshaller u = JAXBUtils.JAXBCONTEXT_DEVICES.createUnmarshaller();
369         DeviceListModel devices = (DeviceListModel) u.unmarshal(new StringReader(xml));
370         assertNotNull(devices);
371         assertEquals(1, devices.getDevicelist().size());
372
373         AVMFritzBaseModel device = devices.getDevicelist().get(0);
374         assertNotNull(device);
375
376         discovery.onDeviceAdded(device);
377         assertNotNull(discoveryResult);
378
379         assertEquals(DiscoveryResultFlag.NEW, discoveryResult.getFlag());
380         assertEquals(new ThingUID("avmfritz:FRITZ_DECT_300:1:087610000435"), discoveryResult.getThingUID());
381         assertEquals(DECT300_THING_TYPE, discoveryResult.getThingTypeUID());
382         assertEquals(BRIGE_THING_ID, discoveryResult.getBridgeUID());
383         assertEquals("087610000435", discoveryResult.getProperties().get(CONFIG_AIN));
384         assertEquals("AVM", discoveryResult.getProperties().get(PROPERTY_VENDOR));
385         assertEquals("18", discoveryResult.getProperties().get(PROPERTY_MODEL_ID));
386         assertEquals("087610000435", discoveryResult.getProperties().get(PROPERTY_SERIAL_NUMBER));
387         assertEquals("03.50", discoveryResult.getProperties().get(PROPERTY_FIRMWARE_VERSION));
388         assertEquals(CONFIG_AIN, discoveryResult.getRepresentationProperty());
389     }
390
391     @Test
392     public void validDECT301DiscoveryResult() throws JAXBException {
393         //@formatter:off
394         String xml =
395                 "<devicelist version=\"1\">" +
396                     "<device identifier=\"08761 0000435\" id=\"18\" functionbitmask=\"320\" fwversion=\"03.50\" manufacturer=\"AVM\" productname=\"FRITZ!DECT 301\">" +
397                         "<present>1</present>" +
398                         "<name>FRITZ!DECT 301 #1</name>" +
399                         "<temperature>" +
400                         "<celsius>220</celsius>" +
401                         "<offset>-10</offset>" +
402                     "</temperature>" +
403                     "<hkr>" +
404                         "<tist>44</tist>" +
405                         "<tsoll>42</tsoll>" +
406                         "<absenk>28</absenk>" +
407                         "<komfort>42</komfort>" +
408                         "<lock>0</lock>" +
409                         "<devicelock>0</devicelock>" +
410                         "<errorcode>0</errorcode>" +
411                         "<batterylow>0</batterylow>" +
412                         "<nextchange>" +
413                             "<endperiod>1484341200</endperiod>" +
414                             "<tchange>28</tchange>" +
415                         "</nextchange>" +
416                     "</hkr>" +
417                 "</device>" +
418             "</devicelist>";
419         //@formatter:on
420
421         Unmarshaller u = JAXBUtils.JAXBCONTEXT_DEVICES.createUnmarshaller();
422         DeviceListModel devices = (DeviceListModel) u.unmarshal(new StringReader(xml));
423         assertNotNull(devices);
424         assertEquals(1, devices.getDevicelist().size());
425
426         AVMFritzBaseModel device = devices.getDevicelist().get(0);
427         assertNotNull(device);
428
429         discovery.onDeviceAdded(device);
430         assertNotNull(discoveryResult);
431
432         assertEquals(DiscoveryResultFlag.NEW, discoveryResult.getFlag());
433         assertEquals(new ThingUID("avmfritz:FRITZ_DECT_301:1:087610000435"), discoveryResult.getThingUID());
434         assertEquals(DECT301_THING_TYPE, discoveryResult.getThingTypeUID());
435         assertEquals(BRIGE_THING_ID, discoveryResult.getBridgeUID());
436         assertEquals("087610000435", discoveryResult.getProperties().get(CONFIG_AIN));
437         assertEquals("AVM", discoveryResult.getProperties().get(PROPERTY_VENDOR));
438         assertEquals("18", discoveryResult.getProperties().get(PROPERTY_MODEL_ID));
439         assertEquals("087610000435", discoveryResult.getProperties().get(PROPERTY_SERIAL_NUMBER));
440         assertEquals("03.50", discoveryResult.getProperties().get(PROPERTY_FIRMWARE_VERSION));
441         assertEquals(CONFIG_AIN, discoveryResult.getRepresentationProperty());
442     }
443
444     @Test
445     public void validPowerline546EDiscoveryResult() throws JAXBException {
446         //@formatter:off
447         String xml =
448                 "<devicelist version=\"1\">" +
449                     "<device identifier=\"5C:49:79:F0:A3:84\" id=\"19\" functionbitmask=\"640\" fwversion=\"06.92\" manufacturer=\"AVM\" productname=\"FRITZ!Powerline 546E\">" +
450                         "<present>1</present>" +
451                         "<name>FRITZ!Powerline 546E #1</name>" +
452                         "<switch>" +
453                             "<state>0</state>" +
454                             "<mode>manuell</mode>" +
455                             "<lock>0</lock>" +
456                             "<devicelock>1</devicelock>" +
457                         "</switch>" +
458                         "<powermeter>" +
459                             "<voltage>232850</voltage>" +
460                             "<power>0</power>" +
461                             "<energy>2087</energy>" +
462                         "</powermeter>" +
463                     "</device>" +
464                 "</devicelist>";
465         //@formatter:on
466
467         Unmarshaller u = JAXBUtils.JAXBCONTEXT_DEVICES.createUnmarshaller();
468         DeviceListModel devices = (DeviceListModel) u.unmarshal(new StringReader(xml));
469         assertNotNull(devices);
470         assertEquals(1, devices.getDevicelist().size());
471
472         AVMFritzBaseModel device = devices.getDevicelist().get(0);
473         assertNotNull(device);
474
475         discovery.onDeviceAdded(device);
476         assertNotNull(discoveryResult);
477
478         assertEquals(DiscoveryResultFlag.NEW, discoveryResult.getFlag());
479         assertEquals(new ThingUID("avmfritz:FRITZ_Powerline_546E:1:5C_49_79_F0_A3_84"), discoveryResult.getThingUID());
480         assertEquals(PL546E_THING_TYPE, discoveryResult.getThingTypeUID());
481         assertEquals(BRIGE_THING_ID, discoveryResult.getBridgeUID());
482         assertEquals("5C:49:79:F0:A3:84", discoveryResult.getProperties().get(CONFIG_AIN));
483         assertEquals("AVM", discoveryResult.getProperties().get(PROPERTY_VENDOR));
484         assertEquals("19", discoveryResult.getProperties().get(PROPERTY_MODEL_ID));
485         assertEquals("5C:49:79:F0:A3:84", discoveryResult.getProperties().get(PROPERTY_SERIAL_NUMBER));
486         assertEquals("06.92", discoveryResult.getProperties().get(PROPERTY_FIRMWARE_VERSION));
487         assertEquals(CONFIG_AIN, discoveryResult.getRepresentationProperty());
488     }
489
490     @Test
491     public void invalidHANFUNContactDiscoveryResult() throws JAXBException {
492         //@formatter:off
493         String xml =
494                 "<devicelist version=\"1\">" +
495                     "<device identifier=\"11934 0059578\" id=\"406\" functionbitmask=\"1\" fwversion=\"00.00\" manufacturer=\"0x0feb\" productname=\"HAN-FUN\">" +
496                         "<present>1</present>" +
497                         "<name>HAN-FUN #2</name>" +
498                     "</device>" +
499                 "</devicelist>";
500         //@formatter:on
501
502         Unmarshaller u = JAXBUtils.JAXBCONTEXT_DEVICES.createUnmarshaller();
503         DeviceListModel devices = (DeviceListModel) u.unmarshal(new StringReader(xml));
504         assertNotNull(devices);
505         assertEquals(1, devices.getDevicelist().size());
506
507         AVMFritzBaseModel device = devices.getDevicelist().get(0);
508         assertNotNull(device);
509
510         discovery.onDeviceAdded(device);
511         assertNull(discoveryResult);
512     }
513
514     @Test
515     public void validHANFUNMagneticContactDiscoveryResult() throws JAXBException {
516         //@formatter:off
517         String xml =
518                 "<devicelist version=\"1\">" +
519                     "<device identifier=\"11934 0059578-1\" id=\"2000\" functionbitmask=\"8208\" fwversion=\"0.0\" manufacturer=\"0x0feb\" productname=\"HAN-FUN\">" +
520                         "<present>1</present>" +
521                         "<name>HAN-FUN #2: Unit #2</name>" +
522                         "<etsiunitinfo>" +
523                             "<etsideviceid>406</etsideviceid>" +
524                             "<unittype>513</unittype>" +
525                             "<interfaces>256</interfaces>" +
526                         "</etsiunitinfo>" +
527                         "<alert>" +
528                             "<state/>" +
529                         "</alert>" +
530                     "</device>" +
531                 "</devicelist>";
532         //@formatter:on
533
534         Unmarshaller u = JAXBUtils.JAXBCONTEXT_DEVICES.createUnmarshaller();
535         DeviceListModel devices = (DeviceListModel) u.unmarshal(new StringReader(xml));
536         assertNotNull(devices);
537         assertEquals(1, devices.getDevicelist().size());
538
539         AVMFritzBaseModel device = devices.getDevicelist().get(0);
540         assertNotNull(device);
541
542         discovery.onDeviceAdded(device);
543         assertNotNull(discoveryResult);
544
545         assertEquals(DiscoveryResultFlag.NEW, discoveryResult.getFlag());
546         assertEquals(new ThingUID("avmfritz:HAN_FUN_CONTACT:1:119340059578_1"), discoveryResult.getThingUID());
547         assertEquals(HAN_FUN_CONTACT_THING_TYPE, discoveryResult.getThingTypeUID());
548         assertEquals(BRIGE_THING_ID, discoveryResult.getBridgeUID());
549         assertEquals("119340059578-1", discoveryResult.getProperties().get(CONFIG_AIN));
550         assertEquals("0x0feb", discoveryResult.getProperties().get(PROPERTY_VENDOR));
551         assertEquals("2000", discoveryResult.getProperties().get(PROPERTY_MODEL_ID));
552         assertEquals("119340059578-1", discoveryResult.getProperties().get(PROPERTY_SERIAL_NUMBER));
553         assertEquals("0.0", discoveryResult.getProperties().get(PROPERTY_FIRMWARE_VERSION));
554         assertEquals(CONFIG_AIN, discoveryResult.getRepresentationProperty());
555     }
556
557     @Test
558     public void validHANFUNOpticalContactDiscoveryResult() throws JAXBException {
559         //@formatter:off
560         String xml =
561                 "<devicelist version=\"1\">" +
562                     "<device identifier=\"11934 0059578-1\" id=\"2001\" functionbitmask=\"8208\" fwversion=\"0.0\" manufacturer=\"0x0feb\" productname=\"HAN-FUN\">" +
563                         "<present>1</present>" +
564                         "<name>HAN-FUN #3: Unit #3</name>" +
565                         "<etsiunitinfo>" +
566                             "<etsideviceid>406</etsideviceid>" +
567                             "<unittype>514</unittype>" +
568                             "<interfaces>256</interfaces>" +
569                         "</etsiunitinfo>" +
570                         "<alert>" +
571                             "<state/>" +
572                         "</alert>" +
573                     "</device>" +
574                 "</devicelist>";
575         //@formatter:on
576
577         Unmarshaller u = JAXBUtils.JAXBCONTEXT_DEVICES.createUnmarshaller();
578         DeviceListModel devices = (DeviceListModel) u.unmarshal(new StringReader(xml));
579         assertNotNull(devices);
580         assertEquals(1, devices.getDevicelist().size());
581
582         AVMFritzBaseModel device = devices.getDevicelist().get(0);
583         assertNotNull(device);
584
585         discovery.onDeviceAdded(device);
586         assertNotNull(discoveryResult);
587
588         assertEquals(DiscoveryResultFlag.NEW, discoveryResult.getFlag());
589         assertEquals(new ThingUID("avmfritz:HAN_FUN_CONTACT:1:119340059578_1"), discoveryResult.getThingUID());
590         assertEquals(HAN_FUN_CONTACT_THING_TYPE, discoveryResult.getThingTypeUID());
591         assertEquals(BRIGE_THING_ID, discoveryResult.getBridgeUID());
592         assertEquals("119340059578-1", discoveryResult.getProperties().get(CONFIG_AIN));
593         assertEquals("0x0feb", discoveryResult.getProperties().get(PROPERTY_VENDOR));
594         assertEquals("2001", discoveryResult.getProperties().get(PROPERTY_MODEL_ID));
595         assertEquals("119340059578-1", discoveryResult.getProperties().get(PROPERTY_SERIAL_NUMBER));
596         assertEquals("0.0", discoveryResult.getProperties().get(PROPERTY_FIRMWARE_VERSION));
597         assertEquals(CONFIG_AIN, discoveryResult.getRepresentationProperty());
598     }
599
600     @Test
601     public void validHANFUNMotionSensorDiscoveryResult() throws JAXBException {
602         //@formatter:off
603         String xml =
604                 "<devicelist version=\"1\">" +
605                     "<device identifier=\"11934 0059578-1\" id=\"2002\" functionbitmask=\"8208\" fwversion=\"0.0\" manufacturer=\"0x0feb\" productname=\"HAN-FUN\">" +
606                         "<present>1</present>" +
607                         "<name>HAN-FUN #3: Unit #3</name>" +
608                         "<etsiunitinfo>" +
609                             "<etsideviceid>408</etsideviceid>" +
610                             "<unittype>515</unittype>" +
611                             "<interfaces>32513,256</interfaces>" +
612                         "</etsiunitinfo>" +
613                         "<alert>" +
614                             "<state>0</state>" +
615                         "</alert>" +
616                     "</device>" +
617                 "</devicelist>";
618         //@formatter:on
619
620         Unmarshaller u = JAXBUtils.JAXBCONTEXT_DEVICES.createUnmarshaller();
621         DeviceListModel devices = (DeviceListModel) u.unmarshal(new StringReader(xml));
622         assertNotNull(devices);
623         assertEquals(1, devices.getDevicelist().size());
624
625         AVMFritzBaseModel device = devices.getDevicelist().get(0);
626         assertNotNull(device);
627
628         discovery.onDeviceAdded(device);
629         assertNotNull(discoveryResult);
630
631         assertEquals(DiscoveryResultFlag.NEW, discoveryResult.getFlag());
632         assertEquals(new ThingUID("avmfritz:HAN_FUN_CONTACT:1:119340059578_1"), discoveryResult.getThingUID());
633         assertEquals(HAN_FUN_CONTACT_THING_TYPE, discoveryResult.getThingTypeUID());
634         assertEquals(BRIGE_THING_ID, discoveryResult.getBridgeUID());
635         assertEquals("119340059578-1", discoveryResult.getProperties().get(CONFIG_AIN));
636         assertEquals("0x0feb", discoveryResult.getProperties().get(PROPERTY_VENDOR));
637         assertEquals("2002", discoveryResult.getProperties().get(PROPERTY_MODEL_ID));
638         assertEquals("119340059578-1", discoveryResult.getProperties().get(PROPERTY_SERIAL_NUMBER));
639         assertEquals("0.0", discoveryResult.getProperties().get(PROPERTY_FIRMWARE_VERSION));
640         assertEquals(CONFIG_AIN, discoveryResult.getRepresentationProperty());
641     }
642
643     @Test
644     public void validHANFUNMSmokeDetectorDiscoveryResult() throws JAXBException {
645         //@formatter:off
646         String xml =
647                 "<devicelist version=\"1\">" +
648                     "<device identifier=\"11324 0059952-1\" id=\"2003\" functionbitmask=\"8208\" fwversion=\"0.0\" manufacturer=\"0x2c3c\" productname=\"HAN-FUN\">" +
649                         "<present>1</present>" +
650                         "<name>HAN-FUN #4: Unit #4</name>" +
651                         "<etsiunitinfo>" +
652                             "<etsideviceid>407</etsideviceid>" +
653                             "<unittype>516</unittype>" +
654                             "<interfaces>256</interfaces>" +
655                         "</etsiunitinfo>" +
656                         "<alert>" +
657                             "<state>0</state>" +
658                         "</alert>" +
659                     "</device>" +
660                 "</devicelist>";
661         //@formatter:on
662
663         Unmarshaller u = JAXBUtils.JAXBCONTEXT_DEVICES.createUnmarshaller();
664         DeviceListModel devices = (DeviceListModel) u.unmarshal(new StringReader(xml));
665         assertNotNull(devices);
666         assertEquals(1, devices.getDevicelist().size());
667
668         AVMFritzBaseModel device = devices.getDevicelist().get(0);
669         assertNotNull(device);
670
671         discovery.onDeviceAdded(device);
672         assertNotNull(discoveryResult);
673
674         assertEquals(DiscoveryResultFlag.NEW, discoveryResult.getFlag());
675         assertEquals(new ThingUID("avmfritz:HAN_FUN_CONTACT:1:113240059952_1"), discoveryResult.getThingUID());
676         assertEquals(HAN_FUN_CONTACT_THING_TYPE, discoveryResult.getThingTypeUID());
677         assertEquals(BRIGE_THING_ID, discoveryResult.getBridgeUID());
678         assertEquals("113240059952-1", discoveryResult.getProperties().get(CONFIG_AIN));
679         assertEquals("0x2c3c", discoveryResult.getProperties().get(PROPERTY_VENDOR));
680         assertEquals("2003", discoveryResult.getProperties().get(PROPERTY_MODEL_ID));
681         assertEquals("113240059952-1", discoveryResult.getProperties().get(PROPERTY_SERIAL_NUMBER));
682         assertEquals("0.0", discoveryResult.getProperties().get(PROPERTY_FIRMWARE_VERSION));
683         assertEquals(CONFIG_AIN, discoveryResult.getRepresentationProperty());
684     }
685
686     @Test
687     public void validHANFUNSwitchtDiscoveryResult() throws JAXBException {
688         //@formatter:off
689         String xml =
690                 "<devicelist version=\"1\">" +
691                     "<device identifier=\"11934 0059578-1\" id=\"2001\" functionbitmask=\"8200\" fwversion=\"0.0\" manufacturer=\"0x0feb\" productname=\"HAN-FUN\">" +
692                         "<present>1</present>" +
693                         "<name>HAN-FUN #2: Unit #2</name>" +
694                         "<etsiunitinfo>" +
695                             "<etsideviceid>412</etsideviceid>" +
696                             "<unittype>273</unittype>" +
697                             "<interfaces>772</interfaces>" +
698                         "</etsiunitinfo>" +
699                         "<button>" +
700                             "<lastpressedtimestamp>1529590797</lastpressedtimestamp>" +
701                         "</button>" +
702                     "</device>" +
703                 "</devicelist>";
704         //@formatter:on
705
706         Unmarshaller u = JAXBUtils.JAXBCONTEXT_DEVICES.createUnmarshaller();
707         DeviceListModel devices = (DeviceListModel) u.unmarshal(new StringReader(xml));
708         assertNotNull(devices);
709         assertEquals(1, devices.getDevicelist().size());
710
711         AVMFritzBaseModel device = devices.getDevicelist().get(0);
712         assertNotNull(device);
713
714         discovery.onDeviceAdded(device);
715         assertNotNull(discoveryResult);
716
717         assertEquals(DiscoveryResultFlag.NEW, discoveryResult.getFlag());
718         assertEquals(new ThingUID("avmfritz:HAN_FUN_SWITCH:1:119340059578_1"), discoveryResult.getThingUID());
719         assertEquals(HAN_FUN_SWITCH_THING_TYPE, discoveryResult.getThingTypeUID());
720         assertEquals(BRIGE_THING_ID, discoveryResult.getBridgeUID());
721         assertEquals("119340059578-1", discoveryResult.getProperties().get(CONFIG_AIN));
722         assertEquals("0x0feb", discoveryResult.getProperties().get(PROPERTY_VENDOR));
723         assertEquals("2001", discoveryResult.getProperties().get(PROPERTY_MODEL_ID));
724         assertEquals("119340059578-1", discoveryResult.getProperties().get(PROPERTY_SERIAL_NUMBER));
725         assertEquals("0.0", discoveryResult.getProperties().get(PROPERTY_FIRMWARE_VERSION));
726         assertEquals(CONFIG_AIN, discoveryResult.getRepresentationProperty());
727     }
728
729     @Test
730     public void validHeatingGroupDiscoveryResult() throws JAXBException {
731         //@formatter:off
732         String xml =
733                 "<devicelist version=\"1\">" +
734                     "<group identifier=\"F0:A3:7F-900\" id=\"20000\" functionbitmask=\"4160\" fwversion=\"1.0\" manufacturer=\"AVM\" productname=\"\">" +
735                         "<present>1</present>" +
736                         "<name>Schlafzimmer</name>" +
737                         "<hkr>" +
738                             "<tist>0</tist>" +
739                             "<tsoll>253</tsoll>" +
740                             "<absenk>33</absenk>" +
741                             "<komfort>40</komfort>" +
742                             "<lock>1</lock>" +
743                             "<devicelock>0</devicelock>" +
744                             "<errorcode>0</errorcode>" +
745                             "<batterylow>0</batterylow>" +
746                             "<windowopenactiv>0</windowopenactiv>" +
747                             "<battery>1</battery>" +
748                             "<nextchange>" +
749                                 "<endperiod>1546293600</endperiod>" +
750                                 "<tchange>33</tchange>" +
751                             "</nextchange>" +
752                             "<summeractive>1</summeractive>" +
753                             "<holidayactive>0</holidayactive>" +
754                         "</hkr>" +
755                         "<groupinfo>" +
756                             "<masterdeviceid>1000</masterdeviceid>" +
757                             "<members>20000</members>" +
758                         "</groupinfo>" +
759                     "</group>" +
760                 "</devicelist>";
761         //@formatter:on
762
763         Unmarshaller u = JAXBUtils.JAXBCONTEXT_DEVICES.createUnmarshaller();
764         DeviceListModel devices = (DeviceListModel) u.unmarshal(new StringReader(xml));
765         assertNotNull(devices);
766         assertEquals(1, devices.getDevicelist().size());
767
768         AVMFritzBaseModel device = devices.getDevicelist().get(0);
769         assertNotNull(device);
770
771         discovery.onDeviceAdded(device);
772         assertNotNull(discoveryResult);
773
774         assertEquals(DiscoveryResultFlag.NEW, discoveryResult.getFlag());
775         assertEquals(new ThingUID("avmfritz:FRITZ_GROUP_HEATING:1:F0_A3_7F_900"), discoveryResult.getThingUID());
776         assertEquals(GROUP_HEATING_THING_TYPE, discoveryResult.getThingTypeUID());
777         assertEquals(BRIGE_THING_ID, discoveryResult.getBridgeUID());
778         assertEquals("F0:A3:7F-900", discoveryResult.getProperties().get(CONFIG_AIN));
779         assertEquals("AVM", discoveryResult.getProperties().get(PROPERTY_VENDOR));
780         assertEquals("20000", discoveryResult.getProperties().get(PROPERTY_MODEL_ID));
781         assertEquals("F0:A3:7F-900", discoveryResult.getProperties().get(PROPERTY_SERIAL_NUMBER));
782         assertEquals("1.0", discoveryResult.getProperties().get(PROPERTY_FIRMWARE_VERSION));
783         assertEquals("1000", discoveryResult.getProperties().get(PROPERTY_MASTER));
784         assertEquals("20000", discoveryResult.getProperties().get(PROPERTY_MEMBERS));
785         assertEquals(CONFIG_AIN, discoveryResult.getRepresentationProperty());
786     }
787
788     @Test
789     public void validSwitchGroupDiscoveryResult() throws JAXBException {
790         //@formatter:off
791         String xml =
792                 "<devicelist version=\"1\">" +
793                     "<group identifier=\"F0:A3:7F-900\" id=\"20001\" functionbitmask=\"6784\" fwversion=\"1.0\" manufacturer=\"AVM\" productname=\"\">" +
794                         "<present>1</present>" +
795                         "<name>Schlafzimmer</name>" +
796                         "<switch>" +
797                             "<state>1</state>" +
798                             "<mode>manuell</mode>" +
799                             "<lock>0</lock>" +
800                             "<devicelock>0</devicelock>" +
801                         "</switch>" +
802                         "<powermeter>" +
803                             "<voltage>232850</voltage>" +
804                             "<power>0</power>" +
805                             "<energy>2087</energy>" +
806                         "</powermeter>" +
807                         "<groupinfo>" +
808                             "<masterdeviceid>1000</masterdeviceid>" +
809                             "<members>20000</members>" +
810                         "</groupinfo>" +
811                     "</group>" +
812                 "</devicelist>";
813         //@formatter:on
814
815         Unmarshaller u = JAXBUtils.JAXBCONTEXT_DEVICES.createUnmarshaller();
816         DeviceListModel devices = (DeviceListModel) u.unmarshal(new StringReader(xml));
817         assertNotNull(devices);
818         assertEquals(1, devices.getDevicelist().size());
819
820         AVMFritzBaseModel device = devices.getDevicelist().get(0);
821         assertNotNull(device);
822
823         discovery.onDeviceAdded(device);
824         assertNotNull(discoveryResult);
825
826         assertEquals(DiscoveryResultFlag.NEW, discoveryResult.getFlag());
827         assertEquals(new ThingUID("avmfritz:FRITZ_GROUP_SWITCH:1:F0_A3_7F_900"), discoveryResult.getThingUID());
828         assertEquals(GROUP_SWITCH_THING_TYPE, discoveryResult.getThingTypeUID());
829         assertEquals(BRIGE_THING_ID, discoveryResult.getBridgeUID());
830         assertEquals("F0:A3:7F-900", discoveryResult.getProperties().get(CONFIG_AIN));
831         assertEquals("AVM", discoveryResult.getProperties().get(PROPERTY_VENDOR));
832         assertEquals("20001", discoveryResult.getProperties().get(PROPERTY_MODEL_ID));
833         assertEquals("F0:A3:7F-900", discoveryResult.getProperties().get(PROPERTY_SERIAL_NUMBER));
834         assertEquals("1.0", discoveryResult.getProperties().get(PROPERTY_FIRMWARE_VERSION));
835         assertEquals("1000", discoveryResult.getProperties().get(PROPERTY_MASTER));
836         assertEquals("20000", discoveryResult.getProperties().get(PROPERTY_MEMBERS));
837         assertEquals(CONFIG_AIN, discoveryResult.getRepresentationProperty());
838     }
839 }