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(16, 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(PL546E_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(GROUP_HEATING_THING_TYPE));
108 assertTrue(discovery.getSupportedThingTypes().contains(GROUP_SWITCH_THING_TYPE));
111 @SuppressWarnings("null")
113 public void invalidDiscoveryResult() throws JAXBException, XMLStreamException {
114 // attribute productname is important for a valid discovery result
117 "<devicelist version=\"1\">" +
118 "<device identifier=\"08761 0954669\" id=\"20\" functionbitmask=\"1280\" fwversion=\"03.86\" manufacturer=\"AVM\" productname=\"\">" +
119 "<present>1</present>" +
120 "<name>FRITZ!DECT Repeater 100 #5</name>" +
122 "<celsius>230</celsius>" +
123 "<offset>0</offset>" +
129 XMLStreamReader xsr = JAXBUtils.XMLINPUTFACTORY.createXMLStreamReader(new StringReader(xml));
130 Unmarshaller u = JAXBUtils.JAXBCONTEXT_DEVICES.createUnmarshaller();
131 DeviceListModel devices = u.unmarshal(xsr, DeviceListModel.class).getValue();
133 assertNotNull(devices);
134 assertEquals(1, devices.getDevicelist().size());
136 AVMFritzBaseModel device = devices.getDevicelist().get(0);
137 assertNotNull(device);
139 discovery.onDeviceAdded(device);
140 assertNull(discoveryResult);
143 @SuppressWarnings("null")
145 public void validDECTRepeater100Result() throws JAXBException, XMLStreamException {
148 "<devicelist version=\"1\">" +
149 "<device identifier=\"08761 0954669\" id=\"20\" functionbitmask=\"1280\" fwversion=\"03.86\" manufacturer=\"AVM\" productname=\"FRITZ!DECT Repeater 100\">" +
150 "<present>1</present>" +
151 "<name>FRITZ!DECT Repeater 100 #5</name>" +
153 "<celsius>230</celsius>" +
154 "<offset>0</offset>" +
160 XMLStreamReader xsr = JAXBUtils.XMLINPUTFACTORY.createXMLStreamReader(new StringReader(xml));
161 Unmarshaller u = JAXBUtils.JAXBCONTEXT_DEVICES.createUnmarshaller();
162 DeviceListModel devices = u.unmarshal(xsr, DeviceListModel.class).getValue();
164 assertNotNull(devices);
165 assertEquals(1, devices.getDevicelist().size());
167 AVMFritzBaseModel device = devices.getDevicelist().get(0);
168 assertNotNull(device);
169 assertEquals(1, device.getPresent());
171 discovery.onDeviceAdded(device);
172 assertNotNull(discoveryResult);
174 assertEquals(DiscoveryResultFlag.NEW, discoveryResult.getFlag());
175 assertEquals(new ThingUID("avmfritz:FRITZ_DECT_Repeater_100:1:087610954669"), discoveryResult.getThingUID());
176 assertEquals(DECT100_THING_TYPE, discoveryResult.getThingTypeUID());
177 assertEquals(BRIGE_THING_ID, discoveryResult.getBridgeUID());
178 assertEquals("087610954669", discoveryResult.getProperties().get(CONFIG_AIN));
179 assertEquals("AVM", discoveryResult.getProperties().get(PROPERTY_VENDOR));
180 assertEquals("FRITZ!DECT Repeater 100", discoveryResult.getProperties().get(PRODUCT_NAME));
181 assertEquals("087610954669", discoveryResult.getProperties().get(PROPERTY_SERIAL_NUMBER));
182 assertEquals("03.86", discoveryResult.getProperties().get(PROPERTY_FIRMWARE_VERSION));
183 assertEquals(CONFIG_AIN, discoveryResult.getRepresentationProperty());
185 final String deviceNotPresentXml = xml.replace("<present>1</present>", "<present>0</present>");
186 devices = (DeviceListModel) u.unmarshal(new StringReader(deviceNotPresentXml));
187 assertNotNull(devices);
188 assertEquals(1, devices.getDevicelist().size());
190 device = devices.getDevicelist().get(0);
191 assertNotNull(device);
192 assertEquals(0, device.getPresent());
194 discovery.onDeviceAdded(device);
195 assertNull(discoveryResult);
198 @SuppressWarnings("null")
200 public void validDECT200DiscoveryResult() throws JAXBException, XMLStreamException {
203 "<devicelist version=\"1\">" +
204 "<device identifier=\"08761 0000434\" id=\"17\" functionbitmask=\"2944\" fwversion=\"03.83\" manufacturer=\"AVM\" productname=\"FRITZ!DECT 200\">" +
205 "<present>1</present>" +
206 "<name>FRITZ!DECT 200 #1</name>" +
209 "<mode>manuell</mode>" +
211 "<devicelock>1</devicelock>" +
214 "<voltage>232850</voltage>" +
215 "<power>45</power>" +
216 "<energy>166</energy>" +
219 "<celsius>255</celsius>" +
220 "<offset>0</offset>" +
226 XMLStreamReader xsr = JAXBUtils.XMLINPUTFACTORY.createXMLStreamReader(new StringReader(xml));
227 Unmarshaller u = JAXBUtils.JAXBCONTEXT_DEVICES.createUnmarshaller();
228 DeviceListModel devices = u.unmarshal(xsr, DeviceListModel.class).getValue();
230 assertNotNull(devices);
231 assertEquals(1, devices.getDevicelist().size());
233 AVMFritzBaseModel device = devices.getDevicelist().get(0);
234 assertNotNull(device);
236 discovery.onDeviceAdded(device);
237 assertNotNull(discoveryResult);
239 assertEquals(DiscoveryResultFlag.NEW, discoveryResult.getFlag());
240 assertEquals(new ThingUID("avmfritz:FRITZ_DECT_200:1:087610000434"), discoveryResult.getThingUID());
241 assertEquals(DECT200_THING_TYPE, discoveryResult.getThingTypeUID());
242 assertEquals(BRIGE_THING_ID, discoveryResult.getBridgeUID());
243 assertEquals("087610000434", discoveryResult.getProperties().get(CONFIG_AIN));
244 assertEquals("AVM", discoveryResult.getProperties().get(PROPERTY_VENDOR));
245 assertEquals("FRITZ!DECT 200", discoveryResult.getProperties().get(PRODUCT_NAME));
246 assertEquals("087610000434", discoveryResult.getProperties().get(PROPERTY_SERIAL_NUMBER));
247 assertEquals("03.83", discoveryResult.getProperties().get(PROPERTY_FIRMWARE_VERSION));
248 assertEquals(CONFIG_AIN, discoveryResult.getRepresentationProperty());
251 @SuppressWarnings("null")
253 public void validDECT210DiscoveryResult() throws JAXBException, XMLStreamException {
256 "<devicelist version=\"1\">" +
257 "<device identifier=\"08761 0000434\" id=\"17\" functionbitmask=\"2944\" fwversion=\"03.83\" manufacturer=\"AVM\" productname=\"FRITZ!DECT 210\">" +
258 "<present>1</present>" +
259 "<name>FRITZ!DECT 210 #1</name>" +
262 "<mode>manuell</mode>" +
264 "<devicelock>1</devicelock>" +
267 "<voltage>232850</voltage>" +
268 "<power>45</power>" +
269 "<energy>166</energy>" +
272 "<celsius>255</celsius>" +
273 "<offset>0</offset>" +
279 XMLStreamReader xsr = JAXBUtils.XMLINPUTFACTORY.createXMLStreamReader(new StringReader(xml));
280 Unmarshaller u = JAXBUtils.JAXBCONTEXT_DEVICES.createUnmarshaller();
281 DeviceListModel devices = u.unmarshal(xsr, DeviceListModel.class).getValue();
283 assertNotNull(devices);
284 assertEquals(1, devices.getDevicelist().size());
286 AVMFritzBaseModel device = devices.getDevicelist().get(0);
287 assertNotNull(device);
289 discovery.onDeviceAdded(device);
290 assertNotNull(discoveryResult);
292 assertEquals(DiscoveryResultFlag.NEW, discoveryResult.getFlag());
293 assertEquals(new ThingUID("avmfritz:FRITZ_DECT_210:1:087610000434"), discoveryResult.getThingUID());
294 assertEquals(DECT210_THING_TYPE, discoveryResult.getThingTypeUID());
295 assertEquals(BRIGE_THING_ID, discoveryResult.getBridgeUID());
296 assertEquals("087610000434", discoveryResult.getProperties().get(CONFIG_AIN));
297 assertEquals("AVM", discoveryResult.getProperties().get(PROPERTY_VENDOR));
298 assertEquals("FRITZ!DECT 210", discoveryResult.getProperties().get(PRODUCT_NAME));
299 assertEquals("087610000434", discoveryResult.getProperties().get(PROPERTY_SERIAL_NUMBER));
300 assertEquals("03.83", discoveryResult.getProperties().get(PROPERTY_FIRMWARE_VERSION));
301 assertEquals(CONFIG_AIN, discoveryResult.getRepresentationProperty());
304 @SuppressWarnings("null")
306 public void validCometDECTDiscoveryResult() throws JAXBException, XMLStreamException {
309 "<devicelist version=\"1\">" +
310 "<device identifier=\"08761 0000435\" id=\"18\" functionbitmask=\"320\" fwversion=\"03.50\" manufacturer=\"AVM\" productname=\"Comet DECT\">" +
311 "<present>1</present>" +
312 "<name>Comet DECT #1</name>" +
314 "<celsius>220</celsius>" +
315 "<offset>-10</offset>" +
319 "<tsoll>42</tsoll>" +
320 "<absenk>28</absenk>" +
321 "<komfort>42</komfort>" +
323 "<devicelock>0</devicelock>" +
324 "<errorcode>0</errorcode>" +
325 "<batterylow>0</batterylow>" +
327 "<endperiod>1484341200</endperiod>" +
328 "<tchange>28</tchange>" +
335 XMLStreamReader xsr = JAXBUtils.XMLINPUTFACTORY.createXMLStreamReader(new StringReader(xml));
336 Unmarshaller u = JAXBUtils.JAXBCONTEXT_DEVICES.createUnmarshaller();
337 DeviceListModel devices = u.unmarshal(xsr, DeviceListModel.class).getValue();
339 assertNotNull(devices);
340 assertEquals(1, devices.getDevicelist().size());
342 AVMFritzBaseModel device = devices.getDevicelist().get(0);
343 assertNotNull(device);
345 discovery.onDeviceAdded(device);
346 assertNotNull(discoveryResult);
348 assertEquals(DiscoveryResultFlag.NEW, discoveryResult.getFlag());
349 assertEquals(new ThingUID("avmfritz:Comet_DECT:1:087610000435"), discoveryResult.getThingUID());
350 assertEquals(COMETDECT_THING_TYPE, discoveryResult.getThingTypeUID());
351 assertEquals(BRIGE_THING_ID, discoveryResult.getBridgeUID());
352 assertEquals("087610000435", discoveryResult.getProperties().get(CONFIG_AIN));
353 assertEquals("AVM", discoveryResult.getProperties().get(PROPERTY_VENDOR));
354 assertEquals("Comet DECT", discoveryResult.getProperties().get(PRODUCT_NAME));
355 assertEquals("087610000435", discoveryResult.getProperties().get(PROPERTY_SERIAL_NUMBER));
356 assertEquals("03.50", discoveryResult.getProperties().get(PROPERTY_FIRMWARE_VERSION));
357 assertEquals(CONFIG_AIN, discoveryResult.getRepresentationProperty());
360 @SuppressWarnings("null")
362 public void validDECT300DiscoveryResult() throws JAXBException, XMLStreamException {
365 "<devicelist version=\"1\">" +
366 "<device identifier=\"08761 0000435\" id=\"18\" functionbitmask=\"320\" fwversion=\"03.50\" manufacturer=\"AVM\" productname=\"FRITZ!DECT 300\">" +
367 "<present>1</present>" +
368 "<name>FRITZ!DECT 300 #1</name>" +
370 "<celsius>220</celsius>" +
371 "<offset>-10</offset>" +
375 "<tsoll>42</tsoll>" +
376 "<absenk>28</absenk>" +
377 "<komfort>42</komfort>" +
379 "<devicelock>0</devicelock>" +
380 "<errorcode>0</errorcode>" +
381 "<batterylow>0</batterylow>" +
383 "<endperiod>1484341200</endperiod>" +
384 "<tchange>28</tchange>" +
391 XMLStreamReader xsr = JAXBUtils.XMLINPUTFACTORY.createXMLStreamReader(new StringReader(xml));
392 Unmarshaller u = JAXBUtils.JAXBCONTEXT_DEVICES.createUnmarshaller();
393 DeviceListModel devices = u.unmarshal(xsr, DeviceListModel.class).getValue();
395 assertNotNull(devices);
396 assertEquals(1, devices.getDevicelist().size());
398 AVMFritzBaseModel device = devices.getDevicelist().get(0);
399 assertNotNull(device);
401 discovery.onDeviceAdded(device);
402 assertNotNull(discoveryResult);
404 assertEquals(DiscoveryResultFlag.NEW, discoveryResult.getFlag());
405 assertEquals(new ThingUID("avmfritz:FRITZ_DECT_300:1:087610000435"), discoveryResult.getThingUID());
406 assertEquals(DECT300_THING_TYPE, discoveryResult.getThingTypeUID());
407 assertEquals(BRIGE_THING_ID, discoveryResult.getBridgeUID());
408 assertEquals("087610000435", discoveryResult.getProperties().get(CONFIG_AIN));
409 assertEquals("AVM", discoveryResult.getProperties().get(PROPERTY_VENDOR));
410 assertEquals("FRITZ!DECT 300", discoveryResult.getProperties().get(PRODUCT_NAME));
411 assertEquals("087610000435", discoveryResult.getProperties().get(PROPERTY_SERIAL_NUMBER));
412 assertEquals("03.50", discoveryResult.getProperties().get(PROPERTY_FIRMWARE_VERSION));
413 assertEquals(CONFIG_AIN, discoveryResult.getRepresentationProperty());
416 @SuppressWarnings("null")
418 public void validDECT301DiscoveryResult() throws JAXBException, XMLStreamException {
421 "<devicelist version=\"1\">" +
422 "<device identifier=\"08761 0000435\" id=\"18\" functionbitmask=\"320\" fwversion=\"03.50\" manufacturer=\"AVM\" productname=\"FRITZ!DECT 301\">" +
423 "<present>1</present>" +
424 "<name>FRITZ!DECT 301 #1</name>" +
426 "<celsius>220</celsius>" +
427 "<offset>-10</offset>" +
431 "<tsoll>42</tsoll>" +
432 "<absenk>28</absenk>" +
433 "<komfort>42</komfort>" +
435 "<devicelock>0</devicelock>" +
436 "<errorcode>0</errorcode>" +
437 "<batterylow>0</batterylow>" +
439 "<endperiod>1484341200</endperiod>" +
440 "<tchange>28</tchange>" +
447 XMLStreamReader xsr = JAXBUtils.XMLINPUTFACTORY.createXMLStreamReader(new StringReader(xml));
448 Unmarshaller u = JAXBUtils.JAXBCONTEXT_DEVICES.createUnmarshaller();
449 DeviceListModel devices = u.unmarshal(xsr, DeviceListModel.class).getValue();
451 assertNotNull(devices);
452 assertEquals(1, devices.getDevicelist().size());
454 AVMFritzBaseModel device = devices.getDevicelist().get(0);
455 assertNotNull(device);
457 discovery.onDeviceAdded(device);
458 assertNotNull(discoveryResult);
460 assertEquals(DiscoveryResultFlag.NEW, discoveryResult.getFlag());
461 assertEquals(new ThingUID("avmfritz:FRITZ_DECT_301:1:087610000435"), discoveryResult.getThingUID());
462 assertEquals(DECT301_THING_TYPE, discoveryResult.getThingTypeUID());
463 assertEquals(BRIGE_THING_ID, discoveryResult.getBridgeUID());
464 assertEquals("087610000435", discoveryResult.getProperties().get(CONFIG_AIN));
465 assertEquals("AVM", discoveryResult.getProperties().get(PROPERTY_VENDOR));
466 assertEquals("FRITZ!DECT 301", discoveryResult.getProperties().get(PRODUCT_NAME));
467 assertEquals("087610000435", discoveryResult.getProperties().get(PROPERTY_SERIAL_NUMBER));
468 assertEquals("03.50", discoveryResult.getProperties().get(PROPERTY_FIRMWARE_VERSION));
469 assertEquals(CONFIG_AIN, discoveryResult.getRepresentationProperty());
472 @SuppressWarnings("null")
474 public void validPowerline546EDiscoveryResult() throws JAXBException, XMLStreamException {
477 "<devicelist version=\"1\">" +
478 "<device identifier=\"5C:49:79:F0:A3:84\" id=\"19\" functionbitmask=\"640\" fwversion=\"06.92\" manufacturer=\"AVM\" productname=\"FRITZ!Powerline 546E\">" +
479 "<present>1</present>" +
480 "<name>FRITZ!Powerline 546E #1</name>" +
483 "<mode>manuell</mode>" +
485 "<devicelock>1</devicelock>" +
488 "<voltage>232850</voltage>" +
490 "<energy>2087</energy>" +
496 XMLStreamReader xsr = JAXBUtils.XMLINPUTFACTORY.createXMLStreamReader(new StringReader(xml));
497 Unmarshaller u = JAXBUtils.JAXBCONTEXT_DEVICES.createUnmarshaller();
498 DeviceListModel devices = u.unmarshal(xsr, DeviceListModel.class).getValue();
500 assertNotNull(devices);
501 assertEquals(1, devices.getDevicelist().size());
503 AVMFritzBaseModel device = devices.getDevicelist().get(0);
504 assertNotNull(device);
506 discovery.onDeviceAdded(device);
507 assertNotNull(discoveryResult);
509 assertEquals(DiscoveryResultFlag.NEW, discoveryResult.getFlag());
510 assertEquals(new ThingUID("avmfritz:FRITZ_Powerline_546E:1:5C_49_79_F0_A3_84"), discoveryResult.getThingUID());
511 assertEquals(PL546E_THING_TYPE, discoveryResult.getThingTypeUID());
512 assertEquals(BRIGE_THING_ID, discoveryResult.getBridgeUID());
513 assertEquals("5C:49:79:F0:A3:84", discoveryResult.getProperties().get(CONFIG_AIN));
514 assertEquals("AVM", discoveryResult.getProperties().get(PROPERTY_VENDOR));
515 assertEquals("FRITZ!Powerline 546E", discoveryResult.getProperties().get(PRODUCT_NAME));
516 assertEquals("5C:49:79:F0:A3:84", discoveryResult.getProperties().get(PROPERTY_SERIAL_NUMBER));
517 assertEquals("06.92", discoveryResult.getProperties().get(PROPERTY_FIRMWARE_VERSION));
518 assertEquals(CONFIG_AIN, discoveryResult.getRepresentationProperty());
521 @SuppressWarnings("null")
523 public void invalidHANFUNContactDiscoveryResult() throws JAXBException, XMLStreamException {
526 "<devicelist version=\"1\">" +
527 "<device identifier=\"11934 0059578\" id=\"406\" functionbitmask=\"1\" fwversion=\"00.00\" manufacturer=\"0x0feb\" productname=\"HAN-FUN\">" +
528 "<present>1</present>" +
529 "<name>HAN-FUN #2</name>" +
534 XMLStreamReader xsr = JAXBUtils.XMLINPUTFACTORY.createXMLStreamReader(new StringReader(xml));
535 Unmarshaller u = JAXBUtils.JAXBCONTEXT_DEVICES.createUnmarshaller();
536 DeviceListModel devices = u.unmarshal(xsr, DeviceListModel.class).getValue();
538 assertNotNull(devices);
539 assertEquals(1, devices.getDevicelist().size());
541 AVMFritzBaseModel device = devices.getDevicelist().get(0);
542 assertNotNull(device);
544 discovery.onDeviceAdded(device);
545 assertNull(discoveryResult);
548 @SuppressWarnings("null")
550 public void validHANFUNMagneticContactDiscoveryResult() throws JAXBException, XMLStreamException {
553 "<devicelist version=\"1\">" +
554 "<device identifier=\"11934 0059578-1\" id=\"2000\" functionbitmask=\"8208\" fwversion=\"0.0\" manufacturer=\"0x0feb\" productname=\"HAN-FUN\">" +
555 "<present>1</present>" +
556 "<name>HAN-FUN #2: Unit #2</name>" +
558 "<etsideviceid>406</etsideviceid>" +
559 "<unittype>513</unittype>" +
560 "<interfaces>256</interfaces>" +
569 XMLStreamReader xsr = JAXBUtils.XMLINPUTFACTORY.createXMLStreamReader(new StringReader(xml));
570 Unmarshaller u = JAXBUtils.JAXBCONTEXT_DEVICES.createUnmarshaller();
571 DeviceListModel devices = u.unmarshal(xsr, DeviceListModel.class).getValue();
573 assertNotNull(devices);
574 assertEquals(1, devices.getDevicelist().size());
576 AVMFritzBaseModel device = devices.getDevicelist().get(0);
577 assertNotNull(device);
579 discovery.onDeviceAdded(device);
580 assertNotNull(discoveryResult);
582 assertEquals(DiscoveryResultFlag.NEW, discoveryResult.getFlag());
583 assertEquals(new ThingUID("avmfritz:HAN_FUN_CONTACT:1:119340059578_1"), discoveryResult.getThingUID());
584 assertEquals(HAN_FUN_CONTACT_THING_TYPE, discoveryResult.getThingTypeUID());
585 assertEquals(BRIGE_THING_ID, discoveryResult.getBridgeUID());
586 assertEquals("119340059578-1", discoveryResult.getProperties().get(CONFIG_AIN));
587 assertEquals("0x0feb", discoveryResult.getProperties().get(PROPERTY_VENDOR));
588 assertEquals("HAN-FUN", discoveryResult.getProperties().get(PRODUCT_NAME));
589 assertEquals("119340059578-1", discoveryResult.getProperties().get(PROPERTY_SERIAL_NUMBER));
590 assertEquals("0.0", discoveryResult.getProperties().get(PROPERTY_FIRMWARE_VERSION));
591 assertEquals(CONFIG_AIN, discoveryResult.getRepresentationProperty());
594 @SuppressWarnings("null")
596 public void validHANFUNOpticalContactDiscoveryResult() throws JAXBException, XMLStreamException {
599 "<devicelist version=\"1\">" +
600 "<device identifier=\"11934 0059578-1\" id=\"2001\" functionbitmask=\"8208\" fwversion=\"0.0\" manufacturer=\"0x0feb\" productname=\"HAN-FUN\">" +
601 "<present>1</present>" +
602 "<name>HAN-FUN #3: Unit #3</name>" +
604 "<etsideviceid>406</etsideviceid>" +
605 "<unittype>514</unittype>" +
606 "<interfaces>256</interfaces>" +
615 XMLStreamReader xsr = JAXBUtils.XMLINPUTFACTORY.createXMLStreamReader(new StringReader(xml));
616 Unmarshaller u = JAXBUtils.JAXBCONTEXT_DEVICES.createUnmarshaller();
617 DeviceListModel devices = u.unmarshal(xsr, DeviceListModel.class).getValue();
619 assertNotNull(devices);
620 assertEquals(1, devices.getDevicelist().size());
622 AVMFritzBaseModel device = devices.getDevicelist().get(0);
623 assertNotNull(device);
625 discovery.onDeviceAdded(device);
626 assertNotNull(discoveryResult);
628 assertEquals(DiscoveryResultFlag.NEW, discoveryResult.getFlag());
629 assertEquals(new ThingUID("avmfritz:HAN_FUN_CONTACT:1:119340059578_1"), discoveryResult.getThingUID());
630 assertEquals(HAN_FUN_CONTACT_THING_TYPE, discoveryResult.getThingTypeUID());
631 assertEquals(BRIGE_THING_ID, discoveryResult.getBridgeUID());
632 assertEquals("119340059578-1", discoveryResult.getProperties().get(CONFIG_AIN));
633 assertEquals("0x0feb", discoveryResult.getProperties().get(PROPERTY_VENDOR));
634 assertEquals("HAN-FUN", discoveryResult.getProperties().get(PRODUCT_NAME));
635 assertEquals("119340059578-1", discoveryResult.getProperties().get(PROPERTY_SERIAL_NUMBER));
636 assertEquals("0.0", discoveryResult.getProperties().get(PROPERTY_FIRMWARE_VERSION));
637 assertEquals(CONFIG_AIN, discoveryResult.getRepresentationProperty());
640 @SuppressWarnings("null")
642 public void validHANFUNMotionSensorDiscoveryResult() throws JAXBException, XMLStreamException {
645 "<devicelist version=\"1\">" +
646 "<device identifier=\"11934 0059578-1\" id=\"2002\" functionbitmask=\"8208\" fwversion=\"0.0\" manufacturer=\"0x0feb\" productname=\"HAN-FUN\">" +
647 "<present>1</present>" +
648 "<name>HAN-FUN #3: Unit #3</name>" +
650 "<etsideviceid>408</etsideviceid>" +
651 "<unittype>515</unittype>" +
652 "<interfaces>32513,256</interfaces>" +
661 XMLStreamReader xsr = JAXBUtils.XMLINPUTFACTORY.createXMLStreamReader(new StringReader(xml));
662 Unmarshaller u = JAXBUtils.JAXBCONTEXT_DEVICES.createUnmarshaller();
663 DeviceListModel devices = u.unmarshal(xsr, DeviceListModel.class).getValue();
665 assertNotNull(devices);
666 assertEquals(1, devices.getDevicelist().size());
668 AVMFritzBaseModel device = devices.getDevicelist().get(0);
669 assertNotNull(device);
671 discovery.onDeviceAdded(device);
672 assertNotNull(discoveryResult);
674 assertEquals(DiscoveryResultFlag.NEW, discoveryResult.getFlag());
675 assertEquals(new ThingUID("avmfritz:HAN_FUN_CONTACT:1:119340059578_1"), discoveryResult.getThingUID());
676 assertEquals(HAN_FUN_CONTACT_THING_TYPE, discoveryResult.getThingTypeUID());
677 assertEquals(BRIGE_THING_ID, discoveryResult.getBridgeUID());
678 assertEquals("119340059578-1", discoveryResult.getProperties().get(CONFIG_AIN));
679 assertEquals("0x0feb", discoveryResult.getProperties().get(PROPERTY_VENDOR));
680 assertEquals("HAN-FUN", discoveryResult.getProperties().get(PRODUCT_NAME));
681 assertEquals("119340059578-1", discoveryResult.getProperties().get(PROPERTY_SERIAL_NUMBER));
682 assertEquals("0.0", discoveryResult.getProperties().get(PROPERTY_FIRMWARE_VERSION));
683 assertEquals(CONFIG_AIN, discoveryResult.getRepresentationProperty());
686 @SuppressWarnings("null")
688 public void validHANFUNMSmokeDetectorDiscoveryResult() throws JAXBException, XMLStreamException {
691 "<devicelist version=\"1\">" +
692 "<device identifier=\"11324 0059952-1\" id=\"2003\" functionbitmask=\"8208\" fwversion=\"0.0\" manufacturer=\"0x2c3c\" productname=\"HAN-FUN\">" +
693 "<present>1</present>" +
694 "<name>HAN-FUN #4: Unit #4</name>" +
696 "<etsideviceid>407</etsideviceid>" +
697 "<unittype>516</unittype>" +
698 "<interfaces>256</interfaces>" +
707 XMLStreamReader xsr = JAXBUtils.XMLINPUTFACTORY.createXMLStreamReader(new StringReader(xml));
708 Unmarshaller u = JAXBUtils.JAXBCONTEXT_DEVICES.createUnmarshaller();
709 DeviceListModel devices = u.unmarshal(xsr, DeviceListModel.class).getValue();
711 assertNotNull(devices);
712 assertEquals(1, devices.getDevicelist().size());
714 AVMFritzBaseModel device = devices.getDevicelist().get(0);
715 assertNotNull(device);
717 discovery.onDeviceAdded(device);
718 assertNotNull(discoveryResult);
720 assertEquals(DiscoveryResultFlag.NEW, discoveryResult.getFlag());
721 assertEquals(new ThingUID("avmfritz:HAN_FUN_CONTACT:1:113240059952_1"), discoveryResult.getThingUID());
722 assertEquals(HAN_FUN_CONTACT_THING_TYPE, discoveryResult.getThingTypeUID());
723 assertEquals(BRIGE_THING_ID, discoveryResult.getBridgeUID());
724 assertEquals("113240059952-1", discoveryResult.getProperties().get(CONFIG_AIN));
725 assertEquals("0x2c3c", discoveryResult.getProperties().get(PROPERTY_VENDOR));
726 assertEquals("HAN-FUN", discoveryResult.getProperties().get(PRODUCT_NAME));
727 assertEquals("113240059952-1", discoveryResult.getProperties().get(PROPERTY_SERIAL_NUMBER));
728 assertEquals("0.0", discoveryResult.getProperties().get(PROPERTY_FIRMWARE_VERSION));
729 assertEquals(CONFIG_AIN, discoveryResult.getRepresentationProperty());
732 @SuppressWarnings("null")
734 public void validHANFUNSwitchtDiscoveryResult() throws JAXBException, XMLStreamException {
737 "<devicelist version=\"1\">" +
738 "<device identifier=\"11934 0059578-1\" id=\"2001\" functionbitmask=\"8200\" fwversion=\"0.0\" manufacturer=\"0x0feb\" productname=\"HAN-FUN\">" +
739 "<present>1</present>" +
740 "<name>HAN-FUN #2: Unit #2</name>" +
742 "<etsideviceid>412</etsideviceid>" +
743 "<unittype>273</unittype>" +
744 "<interfaces>772</interfaces>" +
747 "<lastpressedtimestamp>1529590797</lastpressedtimestamp>" +
753 XMLStreamReader xsr = JAXBUtils.XMLINPUTFACTORY.createXMLStreamReader(new StringReader(xml));
754 Unmarshaller u = JAXBUtils.JAXBCONTEXT_DEVICES.createUnmarshaller();
755 DeviceListModel devices = u.unmarshal(xsr, DeviceListModel.class).getValue();
757 assertNotNull(devices);
758 assertEquals(1, devices.getDevicelist().size());
760 AVMFritzBaseModel device = devices.getDevicelist().get(0);
761 assertNotNull(device);
763 discovery.onDeviceAdded(device);
764 assertNotNull(discoveryResult);
766 assertEquals(DiscoveryResultFlag.NEW, discoveryResult.getFlag());
767 assertEquals(new ThingUID("avmfritz:HAN_FUN_SWITCH:1:119340059578_1"), discoveryResult.getThingUID());
768 assertEquals(HAN_FUN_SWITCH_THING_TYPE, discoveryResult.getThingTypeUID());
769 assertEquals(BRIGE_THING_ID, discoveryResult.getBridgeUID());
770 assertEquals("119340059578-1", discoveryResult.getProperties().get(CONFIG_AIN));
771 assertEquals("0x0feb", discoveryResult.getProperties().get(PROPERTY_VENDOR));
772 assertEquals("HAN-FUN", discoveryResult.getProperties().get(PRODUCT_NAME));
773 assertEquals("119340059578-1", discoveryResult.getProperties().get(PROPERTY_SERIAL_NUMBER));
774 assertEquals("0.0", discoveryResult.getProperties().get(PROPERTY_FIRMWARE_VERSION));
775 assertEquals(CONFIG_AIN, discoveryResult.getRepresentationProperty());
778 @SuppressWarnings("null")
780 public void validHANFUNBlindDiscoveryResult() throws JAXBException, XMLStreamException {
783 "<devicelist version=\"1\">" +
784 "<device identifier=\"14276 0503450-1\" id=\"2000\" functionbitmask=\"335888\" fwversion=\"0.0\" manufacturer=\"0x37c4\" productname=\"Rollotron 1213\">"+
785 "<present>1</present>"+
786 "<txbusy>0</txbusy>"+
787 "<name>Rollotron 1213 #1</name>"+
789 "<endpositionsset>1</endpositionsset>"+
790 "<mode>manuell</mode>"+
794 "<levelpercentage>10</levelpercentage>"+
797 "<etsideviceid>406</etsideviceid>"+
798 "<unittype>281</unittype>"+
799 "<interfaces>256,513,516,517</interfaces>"+
803 "<lastalertchgtimestamp></lastalertchgtimestamp>"+
809 XMLStreamReader xsr = JAXBUtils.XMLINPUTFACTORY.createXMLStreamReader(new StringReader(xml));
810 Unmarshaller u = JAXBUtils.JAXBCONTEXT_DEVICES.createUnmarshaller();
811 DeviceListModel devices = u.unmarshal(xsr, DeviceListModel.class).getValue();
813 assertNotNull(devices);
814 assertEquals(1, devices.getDevicelist().size());
816 AVMFritzBaseModel device = devices.getDevicelist().get(0);
817 assertNotNull(device);
819 discovery.onDeviceAdded(device);
820 assertNotNull(discoveryResult);
822 assertEquals(DiscoveryResultFlag.NEW, discoveryResult.getFlag());
823 assertEquals(new ThingUID("avmfritz:HAN_FUN_BLINDS:1:142760503450_1"), discoveryResult.getThingUID());
824 assertEquals(HAN_FUN_BLINDS_THING_TYPE, discoveryResult.getThingTypeUID());
825 assertEquals(BRIGE_THING_ID, discoveryResult.getBridgeUID());
826 assertEquals("142760503450-1", discoveryResult.getProperties().get(CONFIG_AIN));
827 assertEquals("0x37c4", discoveryResult.getProperties().get(PROPERTY_VENDOR));
828 assertEquals("Rollotron 1213", discoveryResult.getProperties().get(PRODUCT_NAME));
829 assertEquals("142760503450-1", discoveryResult.getProperties().get(PROPERTY_SERIAL_NUMBER));
830 assertEquals("0.0", discoveryResult.getProperties().get(PROPERTY_FIRMWARE_VERSION));
831 assertEquals(CONFIG_AIN, discoveryResult.getRepresentationProperty());
834 @SuppressWarnings("null")
836 public void validHeatingGroupDiscoveryResult() throws JAXBException, XMLStreamException {
839 "<devicelist version=\"1\">" +
840 "<group identifier=\"F0:A3:7F-900\" id=\"20000\" functionbitmask=\"4160\" fwversion=\"1.0\" manufacturer=\"AVM\" productname=\"\">" +
841 "<present>1</present>" +
842 "<name>Schlafzimmer</name>" +
845 "<tsoll>253</tsoll>" +
846 "<absenk>33</absenk>" +
847 "<komfort>40</komfort>" +
849 "<devicelock>0</devicelock>" +
850 "<errorcode>0</errorcode>" +
851 "<batterylow>0</batterylow>" +
852 "<windowopenactiv>0</windowopenactiv>" +
853 "<battery>1</battery>" +
855 "<endperiod>1546293600</endperiod>" +
856 "<tchange>33</tchange>" +
858 "<summeractive>1</summeractive>" +
859 "<holidayactive>0</holidayactive>" +
862 "<masterdeviceid>1000</masterdeviceid>" +
863 "<members>20000</members>" +
869 XMLStreamReader xsr = JAXBUtils.XMLINPUTFACTORY.createXMLStreamReader(new StringReader(xml));
870 Unmarshaller u = JAXBUtils.JAXBCONTEXT_DEVICES.createUnmarshaller();
871 DeviceListModel devices = u.unmarshal(xsr, DeviceListModel.class).getValue();
873 assertNotNull(devices);
874 assertEquals(1, devices.getDevicelist().size());
876 AVMFritzBaseModel device = devices.getDevicelist().get(0);
877 assertNotNull(device);
879 discovery.onDeviceAdded(device);
880 assertNotNull(discoveryResult);
882 assertEquals(DiscoveryResultFlag.NEW, discoveryResult.getFlag());
883 assertEquals(new ThingUID("avmfritz:FRITZ_GROUP_HEATING:1:F0_A3_7F_900"), discoveryResult.getThingUID());
884 assertEquals(GROUP_HEATING_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());
896 @SuppressWarnings("null")
898 public void validSwitchGroupDiscoveryResult() throws JAXBException, XMLStreamException {
901 "<devicelist version=\"1\">" +
902 "<group identifier=\"F0:A3:7F-900\" id=\"20001\" functionbitmask=\"6784\" fwversion=\"1.0\" manufacturer=\"AVM\" productname=\"\">" +
903 "<present>1</present>" +
904 "<name>Schlafzimmer</name>" +
907 "<mode>manuell</mode>" +
909 "<devicelock>0</devicelock>" +
912 "<voltage>232850</voltage>" +
914 "<energy>2087</energy>" +
917 "<masterdeviceid>1000</masterdeviceid>" +
918 "<members>20000</members>" +
924 XMLStreamReader xsr = JAXBUtils.XMLINPUTFACTORY.createXMLStreamReader(new StringReader(xml));
925 Unmarshaller u = JAXBUtils.JAXBCONTEXT_DEVICES.createUnmarshaller();
926 DeviceListModel devices = u.unmarshal(xsr, DeviceListModel.class).getValue();
928 assertNotNull(devices);
929 assertEquals(1, devices.getDevicelist().size());
931 AVMFritzBaseModel device = devices.getDevicelist().get(0);
932 assertNotNull(device);
934 discovery.onDeviceAdded(device);
935 assertNotNull(discoveryResult);
937 assertEquals(DiscoveryResultFlag.NEW, discoveryResult.getFlag());
938 assertEquals(new ThingUID("avmfritz:FRITZ_GROUP_SWITCH:1:F0_A3_7F_900"), discoveryResult.getThingUID());
939 assertEquals(GROUP_SWITCH_THING_TYPE, discoveryResult.getThingTypeUID());
940 assertEquals(BRIGE_THING_ID, discoveryResult.getBridgeUID());
941 assertEquals("F0:A3:7F-900", discoveryResult.getProperties().get(CONFIG_AIN));
942 assertEquals("AVM", discoveryResult.getProperties().get(PROPERTY_VENDOR));
943 assertEquals("", discoveryResult.getProperties().get(PRODUCT_NAME));
944 assertEquals("F0:A3:7F-900", discoveryResult.getProperties().get(PROPERTY_SERIAL_NUMBER));
945 assertEquals("1.0", discoveryResult.getProperties().get(PROPERTY_FIRMWARE_VERSION));
946 assertEquals("1000", discoveryResult.getProperties().get(PROPERTY_MASTER));
947 assertEquals("20000", discoveryResult.getProperties().get(PROPERTY_MEMBERS));
948 assertEquals(CONFIG_AIN, discoveryResult.getRepresentationProperty());