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