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