2 * Copyright (c) 2010-2021 Contributors to the openHAB project
4 * See the NOTICE file(s) distributed with this work for additional
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
11 * SPDX-License-Identifier: EPL-2.0
13 package org.openhab.binding.avmfritz.internal.discovery;
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.*;
19 import java.io.StringReader;
20 import java.util.Collection;
21 import java.util.List;
23 import javax.xml.bind.JAXBException;
24 import javax.xml.bind.Unmarshaller;
25 import javax.xml.stream.XMLStreamException;
26 import javax.xml.stream.XMLStreamReader;
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;
45 * Tests for {@link AVMFritzDiscoveryService}.
47 * @author Christoph Weitkamp - Initial contribution
48 * @author Ulrich Mertin - Added support for HAN-FUN blinds
51 public class AVMFritzDiscoveryServiceOSGiTest extends AVMFritzThingHandlerOSGiTest {
53 private static final ThingUID BRIGE_THING_ID = new ThingUID("avmfritz:fritzbox:1");
55 private @Nullable DiscoveryResult discoveryResult;
56 private @NonNullByDefault({}) AVMFritzDiscoveryService discovery;
58 private final DiscoveryListener listener = new DiscoveryListener() {
60 public void thingRemoved(DiscoveryService source, ThingUID thingUID) {
61 discoveryResult = null;
65 public void thingDiscovered(DiscoveryService source, DiscoveryResult result) {
66 discoveryResult = result;
70 public @Nullable Collection<ThingUID> removeOlderResults(DiscoveryService source, long timestamp,
71 @Nullable Collection<ThingTypeUID> thingTypeUIDs, @Nullable ThingUID bridgeUID) {
80 discovery = new AVMFritzDiscoveryService();
81 discovery.setThingHandler(bridgeHandler);
82 discovery.addDiscoveryListener(listener);
86 public void cleanUp() {
87 discoveryResult = null;
91 public void correctSupportedTypes() {
92 assertEquals(18, discovery.getSupportedThingTypes().size());
93 assertTrue(discovery.getSupportedThingTypes().contains(DECT100_THING_TYPE));
94 assertTrue(discovery.getSupportedThingTypes().contains(DECT200_THING_TYPE));
95 assertTrue(discovery.getSupportedThingTypes().contains(DECT210_THING_TYPE));
96 assertTrue(discovery.getSupportedThingTypes().contains(DECT300_THING_TYPE));
97 assertTrue(discovery.getSupportedThingTypes().contains(DECT301_THING_TYPE));
98 assertTrue(discovery.getSupportedThingTypes().contains(DECT400_THING_TYPE));
99 assertTrue(discovery.getSupportedThingTypes().contains(DECT440_THING_TYPE));
100 assertTrue(discovery.getSupportedThingTypes().contains(DECT500_THING_TYPE));
101 assertTrue(discovery.getSupportedThingTypes().contains(POWERLINE546E_THING_TYPE));
102 assertTrue(discovery.getSupportedThingTypes().contains(COMETDECT_THING_TYPE));
103 assertTrue(discovery.getSupportedThingTypes().contains(HAN_FUN_CONTACT_THING_TYPE));
104 assertTrue(discovery.getSupportedThingTypes().contains(HAN_FUN_SWITCH_THING_TYPE));
105 assertTrue(discovery.getSupportedThingTypes().contains(HAN_FUN_ON_OFF_THING_TYPE));
106 assertTrue(discovery.getSupportedThingTypes().contains(HAN_FUN_BLINDS_THING_TYPE));
107 assertTrue(discovery.getSupportedThingTypes().contains(HAN_FUN_COLOR_BULB_THING_TYPE));
108 assertTrue(discovery.getSupportedThingTypes().contains(HAN_FUN_DIMMABLE_BULB_THING_TYPE));
109 assertTrue(discovery.getSupportedThingTypes().contains(GROUP_HEATING_THING_TYPE));
110 assertTrue(discovery.getSupportedThingTypes().contains(GROUP_SWITCH_THING_TYPE));
113 @SuppressWarnings("null")
115 public void invalidDiscoveryResult() throws JAXBException, XMLStreamException {
116 // attribute productname is important for a valid discovery result
119 "<devicelist version=\"1\">" +
120 "<device identifier=\"08761 0954669\" id=\"20\" functionbitmask=\"1280\" fwversion=\"03.86\" manufacturer=\"AVM\" productname=\"\">" +
121 "<present>1</present>" +
122 "<name>FRITZ!DECT Repeater 100 #5</name>" +
124 "<celsius>230</celsius>" +
125 "<offset>0</offset>" +
131 XMLStreamReader xsr = JAXBUtils.XMLINPUTFACTORY.createXMLStreamReader(new StringReader(xml));
132 Unmarshaller u = JAXBUtils.JAXBCONTEXT_DEVICES.createUnmarshaller();
133 DeviceListModel devices = u.unmarshal(xsr, DeviceListModel.class).getValue();
135 assertNotNull(devices);
136 assertEquals(1, devices.getDevicelist().size());
138 AVMFritzBaseModel device = devices.getDevicelist().get(0);
139 assertNotNull(device);
141 discovery.onDeviceAdded(device);
142 assertNull(discoveryResult);
145 @SuppressWarnings("null")
147 public void validDECTRepeater100Result() throws JAXBException, XMLStreamException {
150 "<devicelist version=\"1\">" +
151 "<device identifier=\"08761 0954669\" id=\"20\" functionbitmask=\"1280\" fwversion=\"03.86\" manufacturer=\"AVM\" productname=\"FRITZ!DECT Repeater 100\">" +
152 "<present>1</present>" +
153 "<name>FRITZ!DECT Repeater 100 #5</name>" +
155 "<celsius>230</celsius>" +
156 "<offset>0</offset>" +
162 XMLStreamReader xsr = JAXBUtils.XMLINPUTFACTORY.createXMLStreamReader(new StringReader(xml));
163 Unmarshaller u = JAXBUtils.JAXBCONTEXT_DEVICES.createUnmarshaller();
164 DeviceListModel devices = u.unmarshal(xsr, DeviceListModel.class).getValue();
166 assertNotNull(devices);
167 assertEquals(1, devices.getDevicelist().size());
169 AVMFritzBaseModel device = devices.getDevicelist().get(0);
170 assertNotNull(device);
171 assertEquals(1, device.getPresent());
173 discovery.onDeviceAdded(device);
174 assertNotNull(discoveryResult);
176 assertEquals(DiscoveryResultFlag.NEW, discoveryResult.getFlag());
177 assertEquals(new ThingUID("avmfritz:FRITZ_DECT_Repeater_100:1:087610954669"), discoveryResult.getThingUID());
178 assertEquals(DECT100_THING_TYPE, discoveryResult.getThingTypeUID());
179 assertEquals(BRIGE_THING_ID, discoveryResult.getBridgeUID());
180 assertEquals("087610954669", discoveryResult.getProperties().get(CONFIG_AIN));
181 assertEquals("AVM", discoveryResult.getProperties().get(PROPERTY_VENDOR));
182 assertEquals("FRITZ!DECT Repeater 100", discoveryResult.getProperties().get(PRODUCT_NAME));
183 assertEquals("087610954669", discoveryResult.getProperties().get(PROPERTY_SERIAL_NUMBER));
184 assertEquals("03.86", discoveryResult.getProperties().get(PROPERTY_FIRMWARE_VERSION));
185 assertEquals(CONFIG_AIN, discoveryResult.getRepresentationProperty());
187 final String deviceNotPresentXml = xml.replace("<present>1</present>", "<present>0</present>");
188 devices = (DeviceListModel) u.unmarshal(new StringReader(deviceNotPresentXml));
189 assertNotNull(devices);
190 assertEquals(1, devices.getDevicelist().size());
192 device = devices.getDevicelist().get(0);
193 assertNotNull(device);
194 assertEquals(0, device.getPresent());
196 discovery.onDeviceAdded(device);
197 assertNull(discoveryResult);
200 @SuppressWarnings("null")
202 public void validDECT200DiscoveryResult() throws JAXBException, XMLStreamException {
205 "<devicelist version=\"1\">" +
206 "<device identifier=\"08761 0000434\" id=\"17\" functionbitmask=\"2944\" fwversion=\"03.83\" manufacturer=\"AVM\" productname=\"FRITZ!DECT 200\">" +
207 "<present>1</present>" +
208 "<name>FRITZ!DECT 200 #1</name>" +
211 "<mode>manuell</mode>" +
213 "<devicelock>1</devicelock>" +
216 "<voltage>232850</voltage>" +
217 "<power>45</power>" +
218 "<energy>166</energy>" +
221 "<celsius>255</celsius>" +
222 "<offset>0</offset>" +
228 XMLStreamReader xsr = JAXBUtils.XMLINPUTFACTORY.createXMLStreamReader(new StringReader(xml));
229 Unmarshaller u = JAXBUtils.JAXBCONTEXT_DEVICES.createUnmarshaller();
230 DeviceListModel devices = u.unmarshal(xsr, DeviceListModel.class).getValue();
232 assertNotNull(devices);
233 assertEquals(1, devices.getDevicelist().size());
235 AVMFritzBaseModel device = devices.getDevicelist().get(0);
236 assertNotNull(device);
238 discovery.onDeviceAdded(device);
239 assertNotNull(discoveryResult);
241 assertEquals(DiscoveryResultFlag.NEW, discoveryResult.getFlag());
242 assertEquals(new ThingUID("avmfritz:FRITZ_DECT_200:1:087610000434"), discoveryResult.getThingUID());
243 assertEquals(DECT200_THING_TYPE, discoveryResult.getThingTypeUID());
244 assertEquals(BRIGE_THING_ID, discoveryResult.getBridgeUID());
245 assertEquals("087610000434", discoveryResult.getProperties().get(CONFIG_AIN));
246 assertEquals("AVM", discoveryResult.getProperties().get(PROPERTY_VENDOR));
247 assertEquals("FRITZ!DECT 200", discoveryResult.getProperties().get(PRODUCT_NAME));
248 assertEquals("087610000434", discoveryResult.getProperties().get(PROPERTY_SERIAL_NUMBER));
249 assertEquals("03.83", discoveryResult.getProperties().get(PROPERTY_FIRMWARE_VERSION));
250 assertEquals(CONFIG_AIN, discoveryResult.getRepresentationProperty());
253 @SuppressWarnings("null")
255 public void validDECT210DiscoveryResult() throws JAXBException, XMLStreamException {
258 "<devicelist version=\"1\">" +
259 "<device identifier=\"08761 0000434\" id=\"17\" functionbitmask=\"2944\" fwversion=\"03.83\" manufacturer=\"AVM\" productname=\"FRITZ!DECT 210\">" +
260 "<present>1</present>" +
261 "<name>FRITZ!DECT 210 #1</name>" +
264 "<mode>manuell</mode>" +
266 "<devicelock>1</devicelock>" +
269 "<voltage>232850</voltage>" +
270 "<power>45</power>" +
271 "<energy>166</energy>" +
274 "<celsius>255</celsius>" +
275 "<offset>0</offset>" +
281 XMLStreamReader xsr = JAXBUtils.XMLINPUTFACTORY.createXMLStreamReader(new StringReader(xml));
282 Unmarshaller u = JAXBUtils.JAXBCONTEXT_DEVICES.createUnmarshaller();
283 DeviceListModel devices = u.unmarshal(xsr, DeviceListModel.class).getValue();
285 assertNotNull(devices);
286 assertEquals(1, devices.getDevicelist().size());
288 AVMFritzBaseModel device = devices.getDevicelist().get(0);
289 assertNotNull(device);
291 discovery.onDeviceAdded(device);
292 assertNotNull(discoveryResult);
294 assertEquals(DiscoveryResultFlag.NEW, discoveryResult.getFlag());
295 assertEquals(new ThingUID("avmfritz:FRITZ_DECT_210:1:087610000434"), discoveryResult.getThingUID());
296 assertEquals(DECT210_THING_TYPE, discoveryResult.getThingTypeUID());
297 assertEquals(BRIGE_THING_ID, discoveryResult.getBridgeUID());
298 assertEquals("087610000434", discoveryResult.getProperties().get(CONFIG_AIN));
299 assertEquals("AVM", discoveryResult.getProperties().get(PROPERTY_VENDOR));
300 assertEquals("FRITZ!DECT 210", discoveryResult.getProperties().get(PRODUCT_NAME));
301 assertEquals("087610000434", discoveryResult.getProperties().get(PROPERTY_SERIAL_NUMBER));
302 assertEquals("03.83", discoveryResult.getProperties().get(PROPERTY_FIRMWARE_VERSION));
303 assertEquals(CONFIG_AIN, discoveryResult.getRepresentationProperty());
306 @SuppressWarnings("null")
308 public void validCometDECTDiscoveryResult() throws JAXBException, XMLStreamException {
311 "<devicelist version=\"1\">" +
312 "<device identifier=\"08761 0000435\" id=\"18\" functionbitmask=\"320\" fwversion=\"03.50\" manufacturer=\"AVM\" productname=\"Comet DECT\">" +
313 "<present>1</present>" +
314 "<name>Comet DECT #1</name>" +
316 "<celsius>220</celsius>" +
317 "<offset>-10</offset>" +
321 "<tsoll>42</tsoll>" +
322 "<absenk>28</absenk>" +
323 "<komfort>42</komfort>" +
325 "<devicelock>0</devicelock>" +
326 "<errorcode>0</errorcode>" +
327 "<batterylow>0</batterylow>" +
329 "<endperiod>1484341200</endperiod>" +
330 "<tchange>28</tchange>" +
337 XMLStreamReader xsr = JAXBUtils.XMLINPUTFACTORY.createXMLStreamReader(new StringReader(xml));
338 Unmarshaller u = JAXBUtils.JAXBCONTEXT_DEVICES.createUnmarshaller();
339 DeviceListModel devices = u.unmarshal(xsr, DeviceListModel.class).getValue();
341 assertNotNull(devices);
342 assertEquals(1, devices.getDevicelist().size());
344 AVMFritzBaseModel device = devices.getDevicelist().get(0);
345 assertNotNull(device);
347 discovery.onDeviceAdded(device);
348 assertNotNull(discoveryResult);
350 assertEquals(DiscoveryResultFlag.NEW, discoveryResult.getFlag());
351 assertEquals(new ThingUID("avmfritz:Comet_DECT:1:087610000435"), discoveryResult.getThingUID());
352 assertEquals(COMETDECT_THING_TYPE, discoveryResult.getThingTypeUID());
353 assertEquals(BRIGE_THING_ID, discoveryResult.getBridgeUID());
354 assertEquals("087610000435", discoveryResult.getProperties().get(CONFIG_AIN));
355 assertEquals("AVM", discoveryResult.getProperties().get(PROPERTY_VENDOR));
356 assertEquals("Comet DECT", discoveryResult.getProperties().get(PRODUCT_NAME));
357 assertEquals("087610000435", discoveryResult.getProperties().get(PROPERTY_SERIAL_NUMBER));
358 assertEquals("03.50", discoveryResult.getProperties().get(PROPERTY_FIRMWARE_VERSION));
359 assertEquals(CONFIG_AIN, discoveryResult.getRepresentationProperty());
362 @SuppressWarnings("null")
364 public void validDECT300DiscoveryResult() throws JAXBException, XMLStreamException {
367 "<devicelist version=\"1\">" +
368 "<device identifier=\"08761 0000435\" id=\"18\" functionbitmask=\"320\" fwversion=\"03.50\" manufacturer=\"AVM\" productname=\"FRITZ!DECT 300\">" +
369 "<present>1</present>" +
370 "<name>FRITZ!DECT 300 #1</name>" +
372 "<celsius>220</celsius>" +
373 "<offset>-10</offset>" +
377 "<tsoll>42</tsoll>" +
378 "<absenk>28</absenk>" +
379 "<komfort>42</komfort>" +
381 "<devicelock>0</devicelock>" +
382 "<errorcode>0</errorcode>" +
383 "<batterylow>0</batterylow>" +
385 "<endperiod>1484341200</endperiod>" +
386 "<tchange>28</tchange>" +
393 XMLStreamReader xsr = JAXBUtils.XMLINPUTFACTORY.createXMLStreamReader(new StringReader(xml));
394 Unmarshaller u = JAXBUtils.JAXBCONTEXT_DEVICES.createUnmarshaller();
395 DeviceListModel devices = u.unmarshal(xsr, DeviceListModel.class).getValue();
397 assertNotNull(devices);
398 assertEquals(1, devices.getDevicelist().size());
400 AVMFritzBaseModel device = devices.getDevicelist().get(0);
401 assertNotNull(device);
403 discovery.onDeviceAdded(device);
404 assertNotNull(discoveryResult);
406 assertEquals(DiscoveryResultFlag.NEW, discoveryResult.getFlag());
407 assertEquals(new ThingUID("avmfritz:FRITZ_DECT_300:1:087610000435"), discoveryResult.getThingUID());
408 assertEquals(DECT300_THING_TYPE, discoveryResult.getThingTypeUID());
409 assertEquals(BRIGE_THING_ID, discoveryResult.getBridgeUID());
410 assertEquals("087610000435", discoveryResult.getProperties().get(CONFIG_AIN));
411 assertEquals("AVM", discoveryResult.getProperties().get(PROPERTY_VENDOR));
412 assertEquals("FRITZ!DECT 300", discoveryResult.getProperties().get(PRODUCT_NAME));
413 assertEquals("087610000435", discoveryResult.getProperties().get(PROPERTY_SERIAL_NUMBER));
414 assertEquals("03.50", discoveryResult.getProperties().get(PROPERTY_FIRMWARE_VERSION));
415 assertEquals(CONFIG_AIN, discoveryResult.getRepresentationProperty());
418 @SuppressWarnings("null")
420 public void validDECT301DiscoveryResult() throws JAXBException, XMLStreamException {
423 "<devicelist version=\"1\">" +
424 "<device identifier=\"08761 0000435\" id=\"18\" functionbitmask=\"320\" fwversion=\"03.50\" manufacturer=\"AVM\" productname=\"FRITZ!DECT 301\">" +
425 "<present>1</present>" +
426 "<name>FRITZ!DECT 301 #1</name>" +
428 "<celsius>220</celsius>" +
429 "<offset>-10</offset>" +
433 "<tsoll>42</tsoll>" +
434 "<absenk>28</absenk>" +
435 "<komfort>42</komfort>" +
437 "<devicelock>0</devicelock>" +
438 "<errorcode>0</errorcode>" +
439 "<batterylow>0</batterylow>" +
441 "<endperiod>1484341200</endperiod>" +
442 "<tchange>28</tchange>" +
449 XMLStreamReader xsr = JAXBUtils.XMLINPUTFACTORY.createXMLStreamReader(new StringReader(xml));
450 Unmarshaller u = JAXBUtils.JAXBCONTEXT_DEVICES.createUnmarshaller();
451 DeviceListModel devices = u.unmarshal(xsr, DeviceListModel.class).getValue();
453 assertNotNull(devices);
454 assertEquals(1, devices.getDevicelist().size());
456 AVMFritzBaseModel device = devices.getDevicelist().get(0);
457 assertNotNull(device);
459 discovery.onDeviceAdded(device);
460 assertNotNull(discoveryResult);
462 assertEquals(DiscoveryResultFlag.NEW, discoveryResult.getFlag());
463 assertEquals(new ThingUID("avmfritz:FRITZ_DECT_301:1:087610000435"), discoveryResult.getThingUID());
464 assertEquals(DECT301_THING_TYPE, discoveryResult.getThingTypeUID());
465 assertEquals(BRIGE_THING_ID, discoveryResult.getBridgeUID());
466 assertEquals("087610000435", discoveryResult.getProperties().get(CONFIG_AIN));
467 assertEquals("AVM", discoveryResult.getProperties().get(PROPERTY_VENDOR));
468 assertEquals("FRITZ!DECT 301", discoveryResult.getProperties().get(PRODUCT_NAME));
469 assertEquals("087610000435", discoveryResult.getProperties().get(PROPERTY_SERIAL_NUMBER));
470 assertEquals("03.50", discoveryResult.getProperties().get(PROPERTY_FIRMWARE_VERSION));
471 assertEquals(CONFIG_AIN, discoveryResult.getRepresentationProperty());
474 @SuppressWarnings("null")
476 public void validPowerline546EDiscoveryResult() throws JAXBException, XMLStreamException {
479 "<devicelist version=\"1\">" +
480 "<device identifier=\"5C:49:79:F0:A3:84\" id=\"19\" functionbitmask=\"640\" fwversion=\"06.92\" manufacturer=\"AVM\" productname=\"FRITZ!Powerline 546E\">" +
481 "<present>1</present>" +
482 "<name>FRITZ!Powerline 546E #1</name>" +
485 "<mode>manuell</mode>" +
487 "<devicelock>1</devicelock>" +
490 "<voltage>232850</voltage>" +
492 "<energy>2087</energy>" +
498 XMLStreamReader xsr = JAXBUtils.XMLINPUTFACTORY.createXMLStreamReader(new StringReader(xml));
499 Unmarshaller u = JAXBUtils.JAXBCONTEXT_DEVICES.createUnmarshaller();
500 DeviceListModel devices = u.unmarshal(xsr, DeviceListModel.class).getValue();
502 assertNotNull(devices);
503 assertEquals(1, devices.getDevicelist().size());
505 AVMFritzBaseModel device = devices.getDevicelist().get(0);
506 assertNotNull(device);
508 discovery.onDeviceAdded(device);
509 assertNotNull(discoveryResult);
511 assertEquals(DiscoveryResultFlag.NEW, discoveryResult.getFlag());
512 assertEquals(new ThingUID("avmfritz:FRITZ_Powerline_546E:1:5C_49_79_F0_A3_84"), discoveryResult.getThingUID());
513 assertEquals(POWERLINE546E_THING_TYPE, discoveryResult.getThingTypeUID());
514 assertEquals(BRIGE_THING_ID, discoveryResult.getBridgeUID());
515 assertEquals("5C:49:79:F0:A3:84", discoveryResult.getProperties().get(CONFIG_AIN));
516 assertEquals("AVM", discoveryResult.getProperties().get(PROPERTY_VENDOR));
517 assertEquals("FRITZ!Powerline 546E", discoveryResult.getProperties().get(PRODUCT_NAME));
518 assertEquals("5C:49:79:F0:A3:84", discoveryResult.getProperties().get(PROPERTY_SERIAL_NUMBER));
519 assertEquals("06.92", discoveryResult.getProperties().get(PROPERTY_FIRMWARE_VERSION));
520 assertEquals(CONFIG_AIN, discoveryResult.getRepresentationProperty());
523 @SuppressWarnings("null")
525 public void invalidHANFUNContactDiscoveryResult() throws JAXBException, XMLStreamException {
528 "<devicelist version=\"1\">" +
529 "<device identifier=\"11934 0059578\" id=\"406\" functionbitmask=\"1\" fwversion=\"00.00\" manufacturer=\"0x0feb\" productname=\"HAN-FUN\">" +
530 "<present>1</present>" +
531 "<name>HAN-FUN #2</name>" +
536 XMLStreamReader xsr = JAXBUtils.XMLINPUTFACTORY.createXMLStreamReader(new StringReader(xml));
537 Unmarshaller u = JAXBUtils.JAXBCONTEXT_DEVICES.createUnmarshaller();
538 DeviceListModel devices = u.unmarshal(xsr, DeviceListModel.class).getValue();
540 assertNotNull(devices);
541 assertEquals(1, devices.getDevicelist().size());
543 AVMFritzBaseModel device = devices.getDevicelist().get(0);
544 assertNotNull(device);
546 discovery.onDeviceAdded(device);
547 assertNull(discoveryResult);
550 @SuppressWarnings("null")
552 public void validHANFUNMagneticContactDiscoveryResult() throws JAXBException, XMLStreamException {
555 "<devicelist version=\"1\">" +
556 "<device identifier=\"11934 0059578-1\" id=\"2000\" functionbitmask=\"8208\" fwversion=\"0.0\" manufacturer=\"0x0feb\" productname=\"HAN-FUN\">" +
557 "<present>1</present>" +
558 "<name>HAN-FUN #2: Unit #2</name>" +
560 "<etsideviceid>406</etsideviceid>" +
561 "<unittype>513</unittype>" +
562 "<interfaces>256</interfaces>" +
571 XMLStreamReader xsr = JAXBUtils.XMLINPUTFACTORY.createXMLStreamReader(new StringReader(xml));
572 Unmarshaller u = JAXBUtils.JAXBCONTEXT_DEVICES.createUnmarshaller();
573 DeviceListModel devices = u.unmarshal(xsr, DeviceListModel.class).getValue();
575 assertNotNull(devices);
576 assertEquals(1, devices.getDevicelist().size());
578 AVMFritzBaseModel device = devices.getDevicelist().get(0);
579 assertNotNull(device);
581 discovery.onDeviceAdded(device);
582 assertNotNull(discoveryResult);
584 assertEquals(DiscoveryResultFlag.NEW, discoveryResult.getFlag());
585 assertEquals(new ThingUID("avmfritz:HAN_FUN_CONTACT:1:119340059578_1"), discoveryResult.getThingUID());
586 assertEquals(HAN_FUN_CONTACT_THING_TYPE, discoveryResult.getThingTypeUID());
587 assertEquals(BRIGE_THING_ID, discoveryResult.getBridgeUID());
588 assertEquals("119340059578-1", discoveryResult.getProperties().get(CONFIG_AIN));
589 assertEquals("0x0feb", discoveryResult.getProperties().get(PROPERTY_VENDOR));
590 assertEquals("HAN-FUN", discoveryResult.getProperties().get(PRODUCT_NAME));
591 assertEquals("119340059578-1", discoveryResult.getProperties().get(PROPERTY_SERIAL_NUMBER));
592 assertEquals("0.0", discoveryResult.getProperties().get(PROPERTY_FIRMWARE_VERSION));
593 assertEquals(CONFIG_AIN, discoveryResult.getRepresentationProperty());
596 @SuppressWarnings("null")
598 public void validHANFUNOpticalContactDiscoveryResult() throws JAXBException, XMLStreamException {
601 "<devicelist version=\"1\">" +
602 "<device identifier=\"11934 0059578-1\" id=\"2001\" functionbitmask=\"8208\" fwversion=\"0.0\" manufacturer=\"0x0feb\" productname=\"HAN-FUN\">" +
603 "<present>1</present>" +
604 "<name>HAN-FUN #3: Unit #3</name>" +
606 "<etsideviceid>406</etsideviceid>" +
607 "<unittype>514</unittype>" +
608 "<interfaces>256</interfaces>" +
617 XMLStreamReader xsr = JAXBUtils.XMLINPUTFACTORY.createXMLStreamReader(new StringReader(xml));
618 Unmarshaller u = JAXBUtils.JAXBCONTEXT_DEVICES.createUnmarshaller();
619 DeviceListModel devices = u.unmarshal(xsr, DeviceListModel.class).getValue();
621 assertNotNull(devices);
622 assertEquals(1, devices.getDevicelist().size());
624 AVMFritzBaseModel device = devices.getDevicelist().get(0);
625 assertNotNull(device);
627 discovery.onDeviceAdded(device);
628 assertNotNull(discoveryResult);
630 assertEquals(DiscoveryResultFlag.NEW, discoveryResult.getFlag());
631 assertEquals(new ThingUID("avmfritz:HAN_FUN_CONTACT:1:119340059578_1"), discoveryResult.getThingUID());
632 assertEquals(HAN_FUN_CONTACT_THING_TYPE, discoveryResult.getThingTypeUID());
633 assertEquals(BRIGE_THING_ID, discoveryResult.getBridgeUID());
634 assertEquals("119340059578-1", discoveryResult.getProperties().get(CONFIG_AIN));
635 assertEquals("0x0feb", discoveryResult.getProperties().get(PROPERTY_VENDOR));
636 assertEquals("HAN-FUN", discoveryResult.getProperties().get(PRODUCT_NAME));
637 assertEquals("119340059578-1", discoveryResult.getProperties().get(PROPERTY_SERIAL_NUMBER));
638 assertEquals("0.0", discoveryResult.getProperties().get(PROPERTY_FIRMWARE_VERSION));
639 assertEquals(CONFIG_AIN, discoveryResult.getRepresentationProperty());
642 @SuppressWarnings("null")
644 public void validHANFUNMotionSensorDiscoveryResult() throws JAXBException, XMLStreamException {
647 "<devicelist version=\"1\">" +
648 "<device identifier=\"11934 0059578-1\" id=\"2002\" functionbitmask=\"8208\" fwversion=\"0.0\" manufacturer=\"0x0feb\" productname=\"HAN-FUN\">" +
649 "<present>1</present>" +
650 "<name>HAN-FUN #3: Unit #3</name>" +
652 "<etsideviceid>408</etsideviceid>" +
653 "<unittype>515</unittype>" +
654 "<interfaces>32513,256</interfaces>" +
663 XMLStreamReader xsr = JAXBUtils.XMLINPUTFACTORY.createXMLStreamReader(new StringReader(xml));
664 Unmarshaller u = JAXBUtils.JAXBCONTEXT_DEVICES.createUnmarshaller();
665 DeviceListModel devices = u.unmarshal(xsr, DeviceListModel.class).getValue();
667 assertNotNull(devices);
668 assertEquals(1, devices.getDevicelist().size());
670 AVMFritzBaseModel device = devices.getDevicelist().get(0);
671 assertNotNull(device);
673 discovery.onDeviceAdded(device);
674 assertNotNull(discoveryResult);
676 assertEquals(DiscoveryResultFlag.NEW, discoveryResult.getFlag());
677 assertEquals(new ThingUID("avmfritz:HAN_FUN_CONTACT:1:119340059578_1"), discoveryResult.getThingUID());
678 assertEquals(HAN_FUN_CONTACT_THING_TYPE, discoveryResult.getThingTypeUID());
679 assertEquals(BRIGE_THING_ID, discoveryResult.getBridgeUID());
680 assertEquals("119340059578-1", discoveryResult.getProperties().get(CONFIG_AIN));
681 assertEquals("0x0feb", discoveryResult.getProperties().get(PROPERTY_VENDOR));
682 assertEquals("HAN-FUN", discoveryResult.getProperties().get(PRODUCT_NAME));
683 assertEquals("119340059578-1", discoveryResult.getProperties().get(PROPERTY_SERIAL_NUMBER));
684 assertEquals("0.0", discoveryResult.getProperties().get(PROPERTY_FIRMWARE_VERSION));
685 assertEquals(CONFIG_AIN, discoveryResult.getRepresentationProperty());
688 @SuppressWarnings("null")
690 public void validHANFUNMSmokeDetectorDiscoveryResult() throws JAXBException, XMLStreamException {
693 "<devicelist version=\"1\">" +
694 "<device identifier=\"11324 0059952-1\" id=\"2003\" functionbitmask=\"8208\" fwversion=\"0.0\" manufacturer=\"0x2c3c\" productname=\"HAN-FUN\">" +
695 "<present>1</present>" +
696 "<name>HAN-FUN #4: Unit #4</name>" +
698 "<etsideviceid>407</etsideviceid>" +
699 "<unittype>516</unittype>" +
700 "<interfaces>256</interfaces>" +
709 XMLStreamReader xsr = JAXBUtils.XMLINPUTFACTORY.createXMLStreamReader(new StringReader(xml));
710 Unmarshaller u = JAXBUtils.JAXBCONTEXT_DEVICES.createUnmarshaller();
711 DeviceListModel devices = u.unmarshal(xsr, DeviceListModel.class).getValue();
713 assertNotNull(devices);
714 assertEquals(1, devices.getDevicelist().size());
716 AVMFritzBaseModel device = devices.getDevicelist().get(0);
717 assertNotNull(device);
719 discovery.onDeviceAdded(device);
720 assertNotNull(discoveryResult);
722 assertEquals(DiscoveryResultFlag.NEW, discoveryResult.getFlag());
723 assertEquals(new ThingUID("avmfritz:HAN_FUN_CONTACT:1:113240059952_1"), discoveryResult.getThingUID());
724 assertEquals(HAN_FUN_CONTACT_THING_TYPE, discoveryResult.getThingTypeUID());
725 assertEquals(BRIGE_THING_ID, discoveryResult.getBridgeUID());
726 assertEquals("113240059952-1", discoveryResult.getProperties().get(CONFIG_AIN));
727 assertEquals("0x2c3c", discoveryResult.getProperties().get(PROPERTY_VENDOR));
728 assertEquals("HAN-FUN", discoveryResult.getProperties().get(PRODUCT_NAME));
729 assertEquals("113240059952-1", discoveryResult.getProperties().get(PROPERTY_SERIAL_NUMBER));
730 assertEquals("0.0", discoveryResult.getProperties().get(PROPERTY_FIRMWARE_VERSION));
731 assertEquals(CONFIG_AIN, discoveryResult.getRepresentationProperty());
734 @SuppressWarnings("null")
736 public void validHANFUNSwitchtDiscoveryResult() throws JAXBException, XMLStreamException {
739 "<devicelist version=\"1\">" +
740 "<device identifier=\"11934 0059578-1\" id=\"2001\" functionbitmask=\"8200\" fwversion=\"0.0\" manufacturer=\"0x0feb\" productname=\"HAN-FUN\">" +
741 "<present>1</present>" +
742 "<name>HAN-FUN #2: Unit #2</name>" +
744 "<etsideviceid>412</etsideviceid>" +
745 "<unittype>273</unittype>" +
746 "<interfaces>772</interfaces>" +
749 "<lastpressedtimestamp>1529590797</lastpressedtimestamp>" +
755 XMLStreamReader xsr = JAXBUtils.XMLINPUTFACTORY.createXMLStreamReader(new StringReader(xml));
756 Unmarshaller u = JAXBUtils.JAXBCONTEXT_DEVICES.createUnmarshaller();
757 DeviceListModel devices = u.unmarshal(xsr, DeviceListModel.class).getValue();
759 assertNotNull(devices);
760 assertEquals(1, devices.getDevicelist().size());
762 AVMFritzBaseModel device = devices.getDevicelist().get(0);
763 assertNotNull(device);
765 discovery.onDeviceAdded(device);
766 assertNotNull(discoveryResult);
768 assertEquals(DiscoveryResultFlag.NEW, discoveryResult.getFlag());
769 assertEquals(new ThingUID("avmfritz:HAN_FUN_SWITCH:1:119340059578_1"), discoveryResult.getThingUID());
770 assertEquals(HAN_FUN_SWITCH_THING_TYPE, discoveryResult.getThingTypeUID());
771 assertEquals(BRIGE_THING_ID, discoveryResult.getBridgeUID());
772 assertEquals("119340059578-1", discoveryResult.getProperties().get(CONFIG_AIN));
773 assertEquals("0x0feb", discoveryResult.getProperties().get(PROPERTY_VENDOR));
774 assertEquals("HAN-FUN", discoveryResult.getProperties().get(PRODUCT_NAME));
775 assertEquals("119340059578-1", discoveryResult.getProperties().get(PROPERTY_SERIAL_NUMBER));
776 assertEquals("0.0", discoveryResult.getProperties().get(PROPERTY_FIRMWARE_VERSION));
777 assertEquals(CONFIG_AIN, discoveryResult.getRepresentationProperty());
780 @SuppressWarnings("null")
782 public void validHANFUNBlindDiscoveryResult() throws JAXBException, XMLStreamException {
785 "<devicelist version=\"1\">" +
786 "<device identifier=\"14276 0503450-1\" id=\"2000\" functionbitmask=\"335888\" fwversion=\"0.0\" manufacturer=\"0x37c4\" productname=\"Rollotron 1213\">"+
787 "<present>1</present>"+
788 "<txbusy>0</txbusy>"+
789 "<name>Rollotron 1213 #1</name>"+
791 "<endpositionsset>1</endpositionsset>"+
792 "<mode>manuell</mode>"+
796 "<levelpercentage>10</levelpercentage>"+
799 "<etsideviceid>406</etsideviceid>"+
800 "<unittype>281</unittype>"+
801 "<interfaces>256,513,516,517</interfaces>"+
805 "<lastalertchgtimestamp></lastalertchgtimestamp>"+
811 XMLStreamReader xsr = JAXBUtils.XMLINPUTFACTORY.createXMLStreamReader(new StringReader(xml));
812 Unmarshaller u = JAXBUtils.JAXBCONTEXT_DEVICES.createUnmarshaller();
813 DeviceListModel devices = u.unmarshal(xsr, DeviceListModel.class).getValue();
815 assertNotNull(devices);
816 assertEquals(1, devices.getDevicelist().size());
818 AVMFritzBaseModel device = devices.getDevicelist().get(0);
819 assertNotNull(device);
821 discovery.onDeviceAdded(device);
822 assertNotNull(discoveryResult);
824 assertEquals(DiscoveryResultFlag.NEW, discoveryResult.getFlag());
825 assertEquals(new ThingUID("avmfritz:HAN_FUN_BLINDS:1:142760503450_1"), discoveryResult.getThingUID());
826 assertEquals(HAN_FUN_BLINDS_THING_TYPE, discoveryResult.getThingTypeUID());
827 assertEquals(BRIGE_THING_ID, discoveryResult.getBridgeUID());
828 assertEquals("142760503450-1", discoveryResult.getProperties().get(CONFIG_AIN));
829 assertEquals("0x37c4", discoveryResult.getProperties().get(PROPERTY_VENDOR));
830 assertEquals("Rollotron 1213", discoveryResult.getProperties().get(PRODUCT_NAME));
831 assertEquals("142760503450-1", discoveryResult.getProperties().get(PROPERTY_SERIAL_NUMBER));
832 assertEquals("0.0", discoveryResult.getProperties().get(PROPERTY_FIRMWARE_VERSION));
833 assertEquals(CONFIG_AIN, discoveryResult.getRepresentationProperty());
836 @SuppressWarnings("null")
838 public void validHeatingGroupDiscoveryResult() throws JAXBException, XMLStreamException {
841 "<devicelist version=\"1\">" +
842 "<group identifier=\"F0:A3:7F-900\" id=\"20000\" functionbitmask=\"4160\" fwversion=\"1.0\" manufacturer=\"AVM\" productname=\"\">" +
843 "<present>1</present>" +
844 "<name>Schlafzimmer</name>" +
847 "<tsoll>253</tsoll>" +
848 "<absenk>33</absenk>" +
849 "<komfort>40</komfort>" +
851 "<devicelock>0</devicelock>" +
852 "<errorcode>0</errorcode>" +
853 "<batterylow>0</batterylow>" +
854 "<windowopenactiv>0</windowopenactiv>" +
855 "<battery>1</battery>" +
857 "<endperiod>1546293600</endperiod>" +
858 "<tchange>33</tchange>" +
860 "<summeractive>1</summeractive>" +
861 "<holidayactive>0</holidayactive>" +
864 "<masterdeviceid>1000</masterdeviceid>" +
865 "<members>20000</members>" +
871 XMLStreamReader xsr = JAXBUtils.XMLINPUTFACTORY.createXMLStreamReader(new StringReader(xml));
872 Unmarshaller u = JAXBUtils.JAXBCONTEXT_DEVICES.createUnmarshaller();
873 DeviceListModel devices = u.unmarshal(xsr, DeviceListModel.class).getValue();
875 assertNotNull(devices);
876 assertEquals(1, devices.getDevicelist().size());
878 AVMFritzBaseModel device = devices.getDevicelist().get(0);
879 assertNotNull(device);
881 discovery.onDeviceAdded(device);
882 assertNotNull(discoveryResult);
884 assertEquals(DiscoveryResultFlag.NEW, discoveryResult.getFlag());
885 assertEquals(new ThingUID("avmfritz:FRITZ_GROUP_HEATING:1:F0_A3_7F_900"), discoveryResult.getThingUID());
886 assertEquals(GROUP_HEATING_THING_TYPE, discoveryResult.getThingTypeUID());
887 assertEquals(BRIGE_THING_ID, discoveryResult.getBridgeUID());
888 assertEquals("F0:A3:7F-900", discoveryResult.getProperties().get(CONFIG_AIN));
889 assertEquals("AVM", discoveryResult.getProperties().get(PROPERTY_VENDOR));
890 assertEquals("", discoveryResult.getProperties().get(PRODUCT_NAME));
891 assertEquals("F0:A3:7F-900", discoveryResult.getProperties().get(PROPERTY_SERIAL_NUMBER));
892 assertEquals("1.0", discoveryResult.getProperties().get(PROPERTY_FIRMWARE_VERSION));
893 assertEquals("1000", discoveryResult.getProperties().get(PROPERTY_MASTER));
894 assertEquals("20000", discoveryResult.getProperties().get(PROPERTY_MEMBERS));
895 assertEquals(CONFIG_AIN, discoveryResult.getRepresentationProperty());
898 @SuppressWarnings("null")
900 public void validSwitchGroupDiscoveryResult() throws JAXBException, XMLStreamException {
903 "<devicelist version=\"1\">" +
904 "<group identifier=\"F0:A3:7F-900\" id=\"20001\" functionbitmask=\"6784\" fwversion=\"1.0\" manufacturer=\"AVM\" productname=\"\">" +
905 "<present>1</present>" +
906 "<name>Schlafzimmer</name>" +
909 "<mode>manuell</mode>" +
911 "<devicelock>0</devicelock>" +
914 "<voltage>232850</voltage>" +
916 "<energy>2087</energy>" +
919 "<masterdeviceid>1000</masterdeviceid>" +
920 "<members>20000</members>" +
926 XMLStreamReader xsr = JAXBUtils.XMLINPUTFACTORY.createXMLStreamReader(new StringReader(xml));
927 Unmarshaller u = JAXBUtils.JAXBCONTEXT_DEVICES.createUnmarshaller();
928 DeviceListModel devices = u.unmarshal(xsr, DeviceListModel.class).getValue();
930 assertNotNull(devices);
931 assertEquals(1, devices.getDevicelist().size());
933 AVMFritzBaseModel device = devices.getDevicelist().get(0);
934 assertNotNull(device);
936 discovery.onDeviceAdded(device);
937 assertNotNull(discoveryResult);
939 assertEquals(DiscoveryResultFlag.NEW, discoveryResult.getFlag());
940 assertEquals(new ThingUID("avmfritz:FRITZ_GROUP_SWITCH:1:F0_A3_7F_900"), discoveryResult.getThingUID());
941 assertEquals(GROUP_SWITCH_THING_TYPE, discoveryResult.getThingTypeUID());
942 assertEquals(BRIGE_THING_ID, discoveryResult.getBridgeUID());
943 assertEquals("F0:A3:7F-900", discoveryResult.getProperties().get(CONFIG_AIN));
944 assertEquals("AVM", discoveryResult.getProperties().get(PROPERTY_VENDOR));
945 assertEquals("", discoveryResult.getProperties().get(PRODUCT_NAME));
946 assertEquals("F0:A3:7F-900", discoveryResult.getProperties().get(PROPERTY_SERIAL_NUMBER));
947 assertEquals("1.0", discoveryResult.getProperties().get(PROPERTY_FIRMWARE_VERSION));
948 assertEquals("1000", discoveryResult.getProperties().get(PROPERTY_MASTER));
949 assertEquals("20000", discoveryResult.getProperties().get(PROPERTY_MEMBERS));
950 assertEquals(CONFIG_AIN, discoveryResult.getRepresentationProperty());