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