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