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