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(15, discovery.getSupportedThingTypes().size());
93 assertTrue(discovery.getSupportedThingTypes().contains(DECT100_THING_TYPE));
94 assertTrue(discovery.getSupportedThingTypes().contains(DECT200_THING_TYPE));
95 assertTrue(discovery.getSupportedThingTypes().contains(DECT210_THING_TYPE));
96 assertTrue(discovery.getSupportedThingTypes().contains(DECT300_THING_TYPE));
97 assertTrue(discovery.getSupportedThingTypes().contains(DECT301_THING_TYPE));
98 assertTrue(discovery.getSupportedThingTypes().contains(DECT400_THING_TYPE));
99 assertTrue(discovery.getSupportedThingTypes().contains(DECT440_THING_TYPE));
100 assertTrue(discovery.getSupportedThingTypes().contains(PL546E_THING_TYPE));
101 assertTrue(discovery.getSupportedThingTypes().contains(COMETDECT_THING_TYPE));
102 assertTrue(discovery.getSupportedThingTypes().contains(HAN_FUN_CONTACT_THING_TYPE));
103 assertTrue(discovery.getSupportedThingTypes().contains(HAN_FUN_SWITCH_THING_TYPE));
104 assertTrue(discovery.getSupportedThingTypes().contains(HAN_FUN_ON_OFF_THING_TYPE));
105 assertTrue(discovery.getSupportedThingTypes().contains(HAN_FUN_BLINDS_THING_TYPE));
106 assertTrue(discovery.getSupportedThingTypes().contains(GROUP_HEATING_THING_TYPE));
107 assertTrue(discovery.getSupportedThingTypes().contains(GROUP_SWITCH_THING_TYPE));
110 @SuppressWarnings("null")
112 public void invalidDiscoveryResult() throws JAXBException, XMLStreamException {
113 // attribute productname is important for a valid discovery result
116 "<devicelist version=\"1\">" +
117 "<device identifier=\"08761 0954669\" id=\"20\" functionbitmask=\"1280\" fwversion=\"03.86\" manufacturer=\"AVM\" productname=\"\">" +
118 "<present>1</present>" +
119 "<name>FRITZ!DECT Repeater 100 #5</name>" +
121 "<celsius>230</celsius>" +
122 "<offset>0</offset>" +
128 XMLStreamReader xsr = JAXBUtils.XMLINPUTFACTORY.createXMLStreamReader(new StringReader(xml));
129 Unmarshaller u = JAXBUtils.JAXBCONTEXT_DEVICES.createUnmarshaller();
130 DeviceListModel devices = u.unmarshal(xsr, DeviceListModel.class).getValue();
132 assertNotNull(devices);
133 assertEquals(1, devices.getDevicelist().size());
135 AVMFritzBaseModel device = devices.getDevicelist().get(0);
136 assertNotNull(device);
138 discovery.onDeviceAdded(device);
139 assertNull(discoveryResult);
142 @SuppressWarnings("null")
144 public void validDECTRepeater100Result() throws JAXBException, XMLStreamException {
147 "<devicelist version=\"1\">" +
148 "<device identifier=\"08761 0954669\" id=\"20\" functionbitmask=\"1280\" fwversion=\"03.86\" manufacturer=\"AVM\" productname=\"FRITZ!DECT Repeater 100\">" +
149 "<present>1</present>" +
150 "<name>FRITZ!DECT Repeater 100 #5</name>" +
152 "<celsius>230</celsius>" +
153 "<offset>0</offset>" +
159 XMLStreamReader xsr = JAXBUtils.XMLINPUTFACTORY.createXMLStreamReader(new StringReader(xml));
160 Unmarshaller u = JAXBUtils.JAXBCONTEXT_DEVICES.createUnmarshaller();
161 DeviceListModel devices = u.unmarshal(xsr, DeviceListModel.class).getValue();
163 assertNotNull(devices);
164 assertEquals(1, devices.getDevicelist().size());
166 AVMFritzBaseModel device = devices.getDevicelist().get(0);
167 assertNotNull(device);
168 assertEquals(1, device.getPresent());
170 discovery.onDeviceAdded(device);
171 assertNotNull(discoveryResult);
173 assertEquals(DiscoveryResultFlag.NEW, discoveryResult.getFlag());
174 assertEquals(new ThingUID("avmfritz:FRITZ_DECT_Repeater_100:1:087610954669"), discoveryResult.getThingUID());
175 assertEquals(DECT100_THING_TYPE, discoveryResult.getThingTypeUID());
176 assertEquals(BRIGE_THING_ID, discoveryResult.getBridgeUID());
177 assertEquals("087610954669", discoveryResult.getProperties().get(CONFIG_AIN));
178 assertEquals("AVM", discoveryResult.getProperties().get(PROPERTY_VENDOR));
179 assertEquals("FRITZ!DECT Repeater 100", discoveryResult.getProperties().get(PRODUCT_NAME));
180 assertEquals("087610954669", discoveryResult.getProperties().get(PROPERTY_SERIAL_NUMBER));
181 assertEquals("03.86", discoveryResult.getProperties().get(PROPERTY_FIRMWARE_VERSION));
182 assertEquals(CONFIG_AIN, discoveryResult.getRepresentationProperty());
184 final String deviceNotPresentXml = xml.replace("<present>1</present>", "<present>0</present>");
185 devices = (DeviceListModel) u.unmarshal(new StringReader(deviceNotPresentXml));
186 assertNotNull(devices);
187 assertEquals(1, devices.getDevicelist().size());
189 device = devices.getDevicelist().get(0);
190 assertNotNull(device);
191 assertEquals(0, device.getPresent());
193 discovery.onDeviceAdded(device);
194 assertNull(discoveryResult);
197 @SuppressWarnings("null")
199 public void validDECT200DiscoveryResult() throws JAXBException, XMLStreamException {
202 "<devicelist version=\"1\">" +
203 "<device identifier=\"08761 0000434\" id=\"17\" functionbitmask=\"2944\" fwversion=\"03.83\" manufacturer=\"AVM\" productname=\"FRITZ!DECT 200\">" +
204 "<present>1</present>" +
205 "<name>FRITZ!DECT 200 #1</name>" +
208 "<mode>manuell</mode>" +
210 "<devicelock>1</devicelock>" +
213 "<voltage>232850</voltage>" +
214 "<power>45</power>" +
215 "<energy>166</energy>" +
218 "<celsius>255</celsius>" +
219 "<offset>0</offset>" +
225 XMLStreamReader xsr = JAXBUtils.XMLINPUTFACTORY.createXMLStreamReader(new StringReader(xml));
226 Unmarshaller u = JAXBUtils.JAXBCONTEXT_DEVICES.createUnmarshaller();
227 DeviceListModel devices = u.unmarshal(xsr, DeviceListModel.class).getValue();
229 assertNotNull(devices);
230 assertEquals(1, devices.getDevicelist().size());
232 AVMFritzBaseModel device = devices.getDevicelist().get(0);
233 assertNotNull(device);
235 discovery.onDeviceAdded(device);
236 assertNotNull(discoveryResult);
238 assertEquals(DiscoveryResultFlag.NEW, discoveryResult.getFlag());
239 assertEquals(new ThingUID("avmfritz:FRITZ_DECT_200:1:087610000434"), discoveryResult.getThingUID());
240 assertEquals(DECT200_THING_TYPE, discoveryResult.getThingTypeUID());
241 assertEquals(BRIGE_THING_ID, discoveryResult.getBridgeUID());
242 assertEquals("087610000434", discoveryResult.getProperties().get(CONFIG_AIN));
243 assertEquals("AVM", discoveryResult.getProperties().get(PROPERTY_VENDOR));
244 assertEquals("FRITZ!DECT 200", discoveryResult.getProperties().get(PRODUCT_NAME));
245 assertEquals("087610000434", discoveryResult.getProperties().get(PROPERTY_SERIAL_NUMBER));
246 assertEquals("03.83", discoveryResult.getProperties().get(PROPERTY_FIRMWARE_VERSION));
247 assertEquals(CONFIG_AIN, discoveryResult.getRepresentationProperty());
250 @SuppressWarnings("null")
252 public void validDECT210DiscoveryResult() throws JAXBException, XMLStreamException {
255 "<devicelist version=\"1\">" +
256 "<device identifier=\"08761 0000434\" id=\"17\" functionbitmask=\"2944\" fwversion=\"03.83\" manufacturer=\"AVM\" productname=\"FRITZ!DECT 210\">" +
257 "<present>1</present>" +
258 "<name>FRITZ!DECT 210 #1</name>" +
261 "<mode>manuell</mode>" +
263 "<devicelock>1</devicelock>" +
266 "<voltage>232850</voltage>" +
267 "<power>45</power>" +
268 "<energy>166</energy>" +
271 "<celsius>255</celsius>" +
272 "<offset>0</offset>" +
278 XMLStreamReader xsr = JAXBUtils.XMLINPUTFACTORY.createXMLStreamReader(new StringReader(xml));
279 Unmarshaller u = JAXBUtils.JAXBCONTEXT_DEVICES.createUnmarshaller();
280 DeviceListModel devices = u.unmarshal(xsr, DeviceListModel.class).getValue();
282 assertNotNull(devices);
283 assertEquals(1, devices.getDevicelist().size());
285 AVMFritzBaseModel device = devices.getDevicelist().get(0);
286 assertNotNull(device);
288 discovery.onDeviceAdded(device);
289 assertNotNull(discoveryResult);
291 assertEquals(DiscoveryResultFlag.NEW, discoveryResult.getFlag());
292 assertEquals(new ThingUID("avmfritz:FRITZ_DECT_210:1:087610000434"), discoveryResult.getThingUID());
293 assertEquals(DECT210_THING_TYPE, discoveryResult.getThingTypeUID());
294 assertEquals(BRIGE_THING_ID, discoveryResult.getBridgeUID());
295 assertEquals("087610000434", discoveryResult.getProperties().get(CONFIG_AIN));
296 assertEquals("AVM", discoveryResult.getProperties().get(PROPERTY_VENDOR));
297 assertEquals("FRITZ!DECT 210", discoveryResult.getProperties().get(PRODUCT_NAME));
298 assertEquals("087610000434", discoveryResult.getProperties().get(PROPERTY_SERIAL_NUMBER));
299 assertEquals("03.83", discoveryResult.getProperties().get(PROPERTY_FIRMWARE_VERSION));
300 assertEquals(CONFIG_AIN, discoveryResult.getRepresentationProperty());
303 @SuppressWarnings("null")
305 public void validCometDECTDiscoveryResult() throws JAXBException, XMLStreamException {
308 "<devicelist version=\"1\">" +
309 "<device identifier=\"08761 0000435\" id=\"18\" functionbitmask=\"320\" fwversion=\"03.50\" manufacturer=\"AVM\" productname=\"Comet DECT\">" +
310 "<present>1</present>" +
311 "<name>Comet DECT #1</name>" +
313 "<celsius>220</celsius>" +
314 "<offset>-10</offset>" +
318 "<tsoll>42</tsoll>" +
319 "<absenk>28</absenk>" +
320 "<komfort>42</komfort>" +
322 "<devicelock>0</devicelock>" +
323 "<errorcode>0</errorcode>" +
324 "<batterylow>0</batterylow>" +
326 "<endperiod>1484341200</endperiod>" +
327 "<tchange>28</tchange>" +
334 XMLStreamReader xsr = JAXBUtils.XMLINPUTFACTORY.createXMLStreamReader(new StringReader(xml));
335 Unmarshaller u = JAXBUtils.JAXBCONTEXT_DEVICES.createUnmarshaller();
336 DeviceListModel devices = u.unmarshal(xsr, DeviceListModel.class).getValue();
338 assertNotNull(devices);
339 assertEquals(1, devices.getDevicelist().size());
341 AVMFritzBaseModel device = devices.getDevicelist().get(0);
342 assertNotNull(device);
344 discovery.onDeviceAdded(device);
345 assertNotNull(discoveryResult);
347 assertEquals(DiscoveryResultFlag.NEW, discoveryResult.getFlag());
348 assertEquals(new ThingUID("avmfritz:Comet_DECT:1:087610000435"), discoveryResult.getThingUID());
349 assertEquals(COMETDECT_THING_TYPE, discoveryResult.getThingTypeUID());
350 assertEquals(BRIGE_THING_ID, discoveryResult.getBridgeUID());
351 assertEquals("087610000435", discoveryResult.getProperties().get(CONFIG_AIN));
352 assertEquals("AVM", discoveryResult.getProperties().get(PROPERTY_VENDOR));
353 assertEquals("Comet DECT", discoveryResult.getProperties().get(PRODUCT_NAME));
354 assertEquals("087610000435", discoveryResult.getProperties().get(PROPERTY_SERIAL_NUMBER));
355 assertEquals("03.50", discoveryResult.getProperties().get(PROPERTY_FIRMWARE_VERSION));
356 assertEquals(CONFIG_AIN, discoveryResult.getRepresentationProperty());
359 @SuppressWarnings("null")
361 public void validDECT300DiscoveryResult() throws JAXBException, XMLStreamException {
364 "<devicelist version=\"1\">" +
365 "<device identifier=\"08761 0000435\" id=\"18\" functionbitmask=\"320\" fwversion=\"03.50\" manufacturer=\"AVM\" productname=\"FRITZ!DECT 300\">" +
366 "<present>1</present>" +
367 "<name>FRITZ!DECT 300 #1</name>" +
369 "<celsius>220</celsius>" +
370 "<offset>-10</offset>" +
374 "<tsoll>42</tsoll>" +
375 "<absenk>28</absenk>" +
376 "<komfort>42</komfort>" +
378 "<devicelock>0</devicelock>" +
379 "<errorcode>0</errorcode>" +
380 "<batterylow>0</batterylow>" +
382 "<endperiod>1484341200</endperiod>" +
383 "<tchange>28</tchange>" +
390 XMLStreamReader xsr = JAXBUtils.XMLINPUTFACTORY.createXMLStreamReader(new StringReader(xml));
391 Unmarshaller u = JAXBUtils.JAXBCONTEXT_DEVICES.createUnmarshaller();
392 DeviceListModel devices = u.unmarshal(xsr, DeviceListModel.class).getValue();
394 assertNotNull(devices);
395 assertEquals(1, devices.getDevicelist().size());
397 AVMFritzBaseModel device = devices.getDevicelist().get(0);
398 assertNotNull(device);
400 discovery.onDeviceAdded(device);
401 assertNotNull(discoveryResult);
403 assertEquals(DiscoveryResultFlag.NEW, discoveryResult.getFlag());
404 assertEquals(new ThingUID("avmfritz:FRITZ_DECT_300:1:087610000435"), discoveryResult.getThingUID());
405 assertEquals(DECT300_THING_TYPE, discoveryResult.getThingTypeUID());
406 assertEquals(BRIGE_THING_ID, discoveryResult.getBridgeUID());
407 assertEquals("087610000435", discoveryResult.getProperties().get(CONFIG_AIN));
408 assertEquals("AVM", discoveryResult.getProperties().get(PROPERTY_VENDOR));
409 assertEquals("FRITZ!DECT 300", discoveryResult.getProperties().get(PRODUCT_NAME));
410 assertEquals("087610000435", discoveryResult.getProperties().get(PROPERTY_SERIAL_NUMBER));
411 assertEquals("03.50", discoveryResult.getProperties().get(PROPERTY_FIRMWARE_VERSION));
412 assertEquals(CONFIG_AIN, discoveryResult.getRepresentationProperty());
415 @SuppressWarnings("null")
417 public void validDECT301DiscoveryResult() throws JAXBException, XMLStreamException {
420 "<devicelist version=\"1\">" +
421 "<device identifier=\"08761 0000435\" id=\"18\" functionbitmask=\"320\" fwversion=\"03.50\" manufacturer=\"AVM\" productname=\"FRITZ!DECT 301\">" +
422 "<present>1</present>" +
423 "<name>FRITZ!DECT 301 #1</name>" +
425 "<celsius>220</celsius>" +
426 "<offset>-10</offset>" +
430 "<tsoll>42</tsoll>" +
431 "<absenk>28</absenk>" +
432 "<komfort>42</komfort>" +
434 "<devicelock>0</devicelock>" +
435 "<errorcode>0</errorcode>" +
436 "<batterylow>0</batterylow>" +
438 "<endperiod>1484341200</endperiod>" +
439 "<tchange>28</tchange>" +
446 XMLStreamReader xsr = JAXBUtils.XMLINPUTFACTORY.createXMLStreamReader(new StringReader(xml));
447 Unmarshaller u = JAXBUtils.JAXBCONTEXT_DEVICES.createUnmarshaller();
448 DeviceListModel devices = u.unmarshal(xsr, DeviceListModel.class).getValue();
450 assertNotNull(devices);
451 assertEquals(1, devices.getDevicelist().size());
453 AVMFritzBaseModel device = devices.getDevicelist().get(0);
454 assertNotNull(device);
456 discovery.onDeviceAdded(device);
457 assertNotNull(discoveryResult);
459 assertEquals(DiscoveryResultFlag.NEW, discoveryResult.getFlag());
460 assertEquals(new ThingUID("avmfritz:FRITZ_DECT_301:1:087610000435"), discoveryResult.getThingUID());
461 assertEquals(DECT301_THING_TYPE, discoveryResult.getThingTypeUID());
462 assertEquals(BRIGE_THING_ID, discoveryResult.getBridgeUID());
463 assertEquals("087610000435", discoveryResult.getProperties().get(CONFIG_AIN));
464 assertEquals("AVM", discoveryResult.getProperties().get(PROPERTY_VENDOR));
465 assertEquals("FRITZ!DECT 301", discoveryResult.getProperties().get(PRODUCT_NAME));
466 assertEquals("087610000435", discoveryResult.getProperties().get(PROPERTY_SERIAL_NUMBER));
467 assertEquals("03.50", discoveryResult.getProperties().get(PROPERTY_FIRMWARE_VERSION));
468 assertEquals(CONFIG_AIN, discoveryResult.getRepresentationProperty());
471 @SuppressWarnings("null")
473 public void validPowerline546EDiscoveryResult() throws JAXBException, XMLStreamException {
476 "<devicelist version=\"1\">" +
477 "<device identifier=\"5C:49:79:F0:A3:84\" id=\"19\" functionbitmask=\"640\" fwversion=\"06.92\" manufacturer=\"AVM\" productname=\"FRITZ!Powerline 546E\">" +
478 "<present>1</present>" +
479 "<name>FRITZ!Powerline 546E #1</name>" +
482 "<mode>manuell</mode>" +
484 "<devicelock>1</devicelock>" +
487 "<voltage>232850</voltage>" +
489 "<energy>2087</energy>" +
495 XMLStreamReader xsr = JAXBUtils.XMLINPUTFACTORY.createXMLStreamReader(new StringReader(xml));
496 Unmarshaller u = JAXBUtils.JAXBCONTEXT_DEVICES.createUnmarshaller();
497 DeviceListModel devices = u.unmarshal(xsr, DeviceListModel.class).getValue();
499 assertNotNull(devices);
500 assertEquals(1, devices.getDevicelist().size());
502 AVMFritzBaseModel device = devices.getDevicelist().get(0);
503 assertNotNull(device);
505 discovery.onDeviceAdded(device);
506 assertNotNull(discoveryResult);
508 assertEquals(DiscoveryResultFlag.NEW, discoveryResult.getFlag());
509 assertEquals(new ThingUID("avmfritz:FRITZ_Powerline_546E:1:5C_49_79_F0_A3_84"), discoveryResult.getThingUID());
510 assertEquals(PL546E_THING_TYPE, discoveryResult.getThingTypeUID());
511 assertEquals(BRIGE_THING_ID, discoveryResult.getBridgeUID());
512 assertEquals("5C:49:79:F0:A3:84", discoveryResult.getProperties().get(CONFIG_AIN));
513 assertEquals("AVM", discoveryResult.getProperties().get(PROPERTY_VENDOR));
514 assertEquals("FRITZ!Powerline 546E", discoveryResult.getProperties().get(PRODUCT_NAME));
515 assertEquals("5C:49:79:F0:A3:84", discoveryResult.getProperties().get(PROPERTY_SERIAL_NUMBER));
516 assertEquals("06.92", discoveryResult.getProperties().get(PROPERTY_FIRMWARE_VERSION));
517 assertEquals(CONFIG_AIN, discoveryResult.getRepresentationProperty());
520 @SuppressWarnings("null")
522 public void invalidHANFUNContactDiscoveryResult() throws JAXBException, XMLStreamException {
525 "<devicelist version=\"1\">" +
526 "<device identifier=\"11934 0059578\" id=\"406\" functionbitmask=\"1\" fwversion=\"00.00\" manufacturer=\"0x0feb\" productname=\"HAN-FUN\">" +
527 "<present>1</present>" +
528 "<name>HAN-FUN #2</name>" +
533 XMLStreamReader xsr = JAXBUtils.XMLINPUTFACTORY.createXMLStreamReader(new StringReader(xml));
534 Unmarshaller u = JAXBUtils.JAXBCONTEXT_DEVICES.createUnmarshaller();
535 DeviceListModel devices = u.unmarshal(xsr, DeviceListModel.class).getValue();
537 assertNotNull(devices);
538 assertEquals(1, devices.getDevicelist().size());
540 AVMFritzBaseModel device = devices.getDevicelist().get(0);
541 assertNotNull(device);
543 discovery.onDeviceAdded(device);
544 assertNull(discoveryResult);
547 @SuppressWarnings("null")
549 public void validHANFUNMagneticContactDiscoveryResult() throws JAXBException, XMLStreamException {
552 "<devicelist version=\"1\">" +
553 "<device identifier=\"11934 0059578-1\" id=\"2000\" functionbitmask=\"8208\" fwversion=\"0.0\" manufacturer=\"0x0feb\" productname=\"HAN-FUN\">" +
554 "<present>1</present>" +
555 "<name>HAN-FUN #2: Unit #2</name>" +
557 "<etsideviceid>406</etsideviceid>" +
558 "<unittype>513</unittype>" +
559 "<interfaces>256</interfaces>" +
568 XMLStreamReader xsr = JAXBUtils.XMLINPUTFACTORY.createXMLStreamReader(new StringReader(xml));
569 Unmarshaller u = JAXBUtils.JAXBCONTEXT_DEVICES.createUnmarshaller();
570 DeviceListModel devices = u.unmarshal(xsr, DeviceListModel.class).getValue();
572 assertNotNull(devices);
573 assertEquals(1, devices.getDevicelist().size());
575 AVMFritzBaseModel device = devices.getDevicelist().get(0);
576 assertNotNull(device);
578 discovery.onDeviceAdded(device);
579 assertNotNull(discoveryResult);
581 assertEquals(DiscoveryResultFlag.NEW, discoveryResult.getFlag());
582 assertEquals(new ThingUID("avmfritz:HAN_FUN_CONTACT:1:119340059578_1"), discoveryResult.getThingUID());
583 assertEquals(HAN_FUN_CONTACT_THING_TYPE, discoveryResult.getThingTypeUID());
584 assertEquals(BRIGE_THING_ID, discoveryResult.getBridgeUID());
585 assertEquals("119340059578-1", discoveryResult.getProperties().get(CONFIG_AIN));
586 assertEquals("0x0feb", discoveryResult.getProperties().get(PROPERTY_VENDOR));
587 assertEquals("HAN-FUN", discoveryResult.getProperties().get(PRODUCT_NAME));
588 assertEquals("119340059578-1", discoveryResult.getProperties().get(PROPERTY_SERIAL_NUMBER));
589 assertEquals("0.0", discoveryResult.getProperties().get(PROPERTY_FIRMWARE_VERSION));
590 assertEquals(CONFIG_AIN, discoveryResult.getRepresentationProperty());
593 @SuppressWarnings("null")
595 public void validHANFUNOpticalContactDiscoveryResult() throws JAXBException, XMLStreamException {
598 "<devicelist version=\"1\">" +
599 "<device identifier=\"11934 0059578-1\" id=\"2001\" functionbitmask=\"8208\" fwversion=\"0.0\" manufacturer=\"0x0feb\" productname=\"HAN-FUN\">" +
600 "<present>1</present>" +
601 "<name>HAN-FUN #3: Unit #3</name>" +
603 "<etsideviceid>406</etsideviceid>" +
604 "<unittype>514</unittype>" +
605 "<interfaces>256</interfaces>" +
614 XMLStreamReader xsr = JAXBUtils.XMLINPUTFACTORY.createXMLStreamReader(new StringReader(xml));
615 Unmarshaller u = JAXBUtils.JAXBCONTEXT_DEVICES.createUnmarshaller();
616 DeviceListModel devices = u.unmarshal(xsr, DeviceListModel.class).getValue();
618 assertNotNull(devices);
619 assertEquals(1, devices.getDevicelist().size());
621 AVMFritzBaseModel device = devices.getDevicelist().get(0);
622 assertNotNull(device);
624 discovery.onDeviceAdded(device);
625 assertNotNull(discoveryResult);
627 assertEquals(DiscoveryResultFlag.NEW, discoveryResult.getFlag());
628 assertEquals(new ThingUID("avmfritz:HAN_FUN_CONTACT:1:119340059578_1"), discoveryResult.getThingUID());
629 assertEquals(HAN_FUN_CONTACT_THING_TYPE, discoveryResult.getThingTypeUID());
630 assertEquals(BRIGE_THING_ID, discoveryResult.getBridgeUID());
631 assertEquals("119340059578-1", discoveryResult.getProperties().get(CONFIG_AIN));
632 assertEquals("0x0feb", discoveryResult.getProperties().get(PROPERTY_VENDOR));
633 assertEquals("HAN-FUN", discoveryResult.getProperties().get(PRODUCT_NAME));
634 assertEquals("119340059578-1", discoveryResult.getProperties().get(PROPERTY_SERIAL_NUMBER));
635 assertEquals("0.0", discoveryResult.getProperties().get(PROPERTY_FIRMWARE_VERSION));
636 assertEquals(CONFIG_AIN, discoveryResult.getRepresentationProperty());
639 @SuppressWarnings("null")
641 public void validHANFUNMotionSensorDiscoveryResult() throws JAXBException, XMLStreamException {
644 "<devicelist version=\"1\">" +
645 "<device identifier=\"11934 0059578-1\" id=\"2002\" functionbitmask=\"8208\" fwversion=\"0.0\" manufacturer=\"0x0feb\" productname=\"HAN-FUN\">" +
646 "<present>1</present>" +
647 "<name>HAN-FUN #3: Unit #3</name>" +
649 "<etsideviceid>408</etsideviceid>" +
650 "<unittype>515</unittype>" +
651 "<interfaces>32513,256</interfaces>" +
660 XMLStreamReader xsr = JAXBUtils.XMLINPUTFACTORY.createXMLStreamReader(new StringReader(xml));
661 Unmarshaller u = JAXBUtils.JAXBCONTEXT_DEVICES.createUnmarshaller();
662 DeviceListModel devices = u.unmarshal(xsr, DeviceListModel.class).getValue();
664 assertNotNull(devices);
665 assertEquals(1, devices.getDevicelist().size());
667 AVMFritzBaseModel device = devices.getDevicelist().get(0);
668 assertNotNull(device);
670 discovery.onDeviceAdded(device);
671 assertNotNull(discoveryResult);
673 assertEquals(DiscoveryResultFlag.NEW, discoveryResult.getFlag());
674 assertEquals(new ThingUID("avmfritz:HAN_FUN_CONTACT:1:119340059578_1"), discoveryResult.getThingUID());
675 assertEquals(HAN_FUN_CONTACT_THING_TYPE, discoveryResult.getThingTypeUID());
676 assertEquals(BRIGE_THING_ID, discoveryResult.getBridgeUID());
677 assertEquals("119340059578-1", discoveryResult.getProperties().get(CONFIG_AIN));
678 assertEquals("0x0feb", discoveryResult.getProperties().get(PROPERTY_VENDOR));
679 assertEquals("HAN-FUN", discoveryResult.getProperties().get(PRODUCT_NAME));
680 assertEquals("119340059578-1", discoveryResult.getProperties().get(PROPERTY_SERIAL_NUMBER));
681 assertEquals("0.0", discoveryResult.getProperties().get(PROPERTY_FIRMWARE_VERSION));
682 assertEquals(CONFIG_AIN, discoveryResult.getRepresentationProperty());
685 @SuppressWarnings("null")
687 public void validHANFUNMSmokeDetectorDiscoveryResult() throws JAXBException, XMLStreamException {
690 "<devicelist version=\"1\">" +
691 "<device identifier=\"11324 0059952-1\" id=\"2003\" functionbitmask=\"8208\" fwversion=\"0.0\" manufacturer=\"0x2c3c\" productname=\"HAN-FUN\">" +
692 "<present>1</present>" +
693 "<name>HAN-FUN #4: Unit #4</name>" +
695 "<etsideviceid>407</etsideviceid>" +
696 "<unittype>516</unittype>" +
697 "<interfaces>256</interfaces>" +
706 XMLStreamReader xsr = JAXBUtils.XMLINPUTFACTORY.createXMLStreamReader(new StringReader(xml));
707 Unmarshaller u = JAXBUtils.JAXBCONTEXT_DEVICES.createUnmarshaller();
708 DeviceListModel devices = u.unmarshal(xsr, DeviceListModel.class).getValue();
710 assertNotNull(devices);
711 assertEquals(1, devices.getDevicelist().size());
713 AVMFritzBaseModel device = devices.getDevicelist().get(0);
714 assertNotNull(device);
716 discovery.onDeviceAdded(device);
717 assertNotNull(discoveryResult);
719 assertEquals(DiscoveryResultFlag.NEW, discoveryResult.getFlag());
720 assertEquals(new ThingUID("avmfritz:HAN_FUN_CONTACT:1:113240059952_1"), discoveryResult.getThingUID());
721 assertEquals(HAN_FUN_CONTACT_THING_TYPE, discoveryResult.getThingTypeUID());
722 assertEquals(BRIGE_THING_ID, discoveryResult.getBridgeUID());
723 assertEquals("113240059952-1", discoveryResult.getProperties().get(CONFIG_AIN));
724 assertEquals("0x2c3c", discoveryResult.getProperties().get(PROPERTY_VENDOR));
725 assertEquals("HAN-FUN", discoveryResult.getProperties().get(PRODUCT_NAME));
726 assertEquals("113240059952-1", discoveryResult.getProperties().get(PROPERTY_SERIAL_NUMBER));
727 assertEquals("0.0", discoveryResult.getProperties().get(PROPERTY_FIRMWARE_VERSION));
728 assertEquals(CONFIG_AIN, discoveryResult.getRepresentationProperty());
731 @SuppressWarnings("null")
733 public void validHANFUNSwitchtDiscoveryResult() throws JAXBException, XMLStreamException {
736 "<devicelist version=\"1\">" +
737 "<device identifier=\"11934 0059578-1\" id=\"2001\" functionbitmask=\"8200\" fwversion=\"0.0\" manufacturer=\"0x0feb\" productname=\"HAN-FUN\">" +
738 "<present>1</present>" +
739 "<name>HAN-FUN #2: Unit #2</name>" +
741 "<etsideviceid>412</etsideviceid>" +
742 "<unittype>273</unittype>" +
743 "<interfaces>772</interfaces>" +
746 "<lastpressedtimestamp>1529590797</lastpressedtimestamp>" +
752 XMLStreamReader xsr = JAXBUtils.XMLINPUTFACTORY.createXMLStreamReader(new StringReader(xml));
753 Unmarshaller u = JAXBUtils.JAXBCONTEXT_DEVICES.createUnmarshaller();
754 DeviceListModel devices = u.unmarshal(xsr, DeviceListModel.class).getValue();
756 assertNotNull(devices);
757 assertEquals(1, devices.getDevicelist().size());
759 AVMFritzBaseModel device = devices.getDevicelist().get(0);
760 assertNotNull(device);
762 discovery.onDeviceAdded(device);
763 assertNotNull(discoveryResult);
765 assertEquals(DiscoveryResultFlag.NEW, discoveryResult.getFlag());
766 assertEquals(new ThingUID("avmfritz:HAN_FUN_SWITCH:1:119340059578_1"), discoveryResult.getThingUID());
767 assertEquals(HAN_FUN_SWITCH_THING_TYPE, discoveryResult.getThingTypeUID());
768 assertEquals(BRIGE_THING_ID, discoveryResult.getBridgeUID());
769 assertEquals("119340059578-1", discoveryResult.getProperties().get(CONFIG_AIN));
770 assertEquals("0x0feb", discoveryResult.getProperties().get(PROPERTY_VENDOR));
771 assertEquals("HAN-FUN", discoveryResult.getProperties().get(PRODUCT_NAME));
772 assertEquals("119340059578-1", discoveryResult.getProperties().get(PROPERTY_SERIAL_NUMBER));
773 assertEquals("0.0", discoveryResult.getProperties().get(PROPERTY_FIRMWARE_VERSION));
774 assertEquals(CONFIG_AIN, discoveryResult.getRepresentationProperty());
777 @SuppressWarnings("null")
779 public void validHANFUNBlindDiscoveryResult() throws JAXBException, XMLStreamException {
782 "<devicelist version=\"1\">" +
783 "<device identifier=\"14276 0503450-1\" id=\"2000\" functionbitmask=\"335888\" fwversion=\"0.0\" manufacturer=\"0x37c4\" productname=\"Rollotron 1213\">"+
784 "<present>1</present>"+
785 "<txbusy>0</txbusy>"+
786 "<name>Rollotron 1213 #1</name>"+
788 "<endpositionsset>1</endpositionsset>"+
789 "<mode>manuell</mode>"+
793 "<levelpercentage>10</levelpercentage>"+
796 "<etsideviceid>406</etsideviceid>"+
797 "<unittype>281</unittype>"+
798 "<interfaces>256,513,516,517</interfaces>"+
802 "<lastalertchgtimestamp></lastalertchgtimestamp>"+
808 XMLStreamReader xsr = JAXBUtils.XMLINPUTFACTORY.createXMLStreamReader(new StringReader(xml));
809 Unmarshaller u = JAXBUtils.JAXBCONTEXT_DEVICES.createUnmarshaller();
810 DeviceListModel devices = u.unmarshal(xsr, DeviceListModel.class).getValue();
812 assertNotNull(devices);
813 assertEquals(1, devices.getDevicelist().size());
815 AVMFritzBaseModel device = devices.getDevicelist().get(0);
816 assertNotNull(device);
818 discovery.onDeviceAdded(device);
819 assertNotNull(discoveryResult);
821 assertEquals(DiscoveryResultFlag.NEW, discoveryResult.getFlag());
822 assertEquals(new ThingUID("avmfritz:HAN_FUN_BLINDS:1:142760503450_1"), discoveryResult.getThingUID());
823 assertEquals(HAN_FUN_BLINDS_THING_TYPE, discoveryResult.getThingTypeUID());
824 assertEquals(BRIGE_THING_ID, discoveryResult.getBridgeUID());
825 assertEquals("142760503450-1", discoveryResult.getProperties().get(CONFIG_AIN));
826 assertEquals("0x37c4", discoveryResult.getProperties().get(PROPERTY_VENDOR));
827 assertEquals("Rollotron 1213", discoveryResult.getProperties().get(PRODUCT_NAME));
828 assertEquals("142760503450-1", discoveryResult.getProperties().get(PROPERTY_SERIAL_NUMBER));
829 assertEquals("0.0", discoveryResult.getProperties().get(PROPERTY_FIRMWARE_VERSION));
830 assertEquals(CONFIG_AIN, discoveryResult.getRepresentationProperty());
833 @SuppressWarnings("null")
835 public void validHeatingGroupDiscoveryResult() throws JAXBException, XMLStreamException {
838 "<devicelist version=\"1\">" +
839 "<group identifier=\"F0:A3:7F-900\" id=\"20000\" functionbitmask=\"4160\" fwversion=\"1.0\" manufacturer=\"AVM\" productname=\"\">" +
840 "<present>1</present>" +
841 "<name>Schlafzimmer</name>" +
844 "<tsoll>253</tsoll>" +
845 "<absenk>33</absenk>" +
846 "<komfort>40</komfort>" +
848 "<devicelock>0</devicelock>" +
849 "<errorcode>0</errorcode>" +
850 "<batterylow>0</batterylow>" +
851 "<windowopenactiv>0</windowopenactiv>" +
852 "<battery>1</battery>" +
854 "<endperiod>1546293600</endperiod>" +
855 "<tchange>33</tchange>" +
857 "<summeractive>1</summeractive>" +
858 "<holidayactive>0</holidayactive>" +
861 "<masterdeviceid>1000</masterdeviceid>" +
862 "<members>20000</members>" +
868 XMLStreamReader xsr = JAXBUtils.XMLINPUTFACTORY.createXMLStreamReader(new StringReader(xml));
869 Unmarshaller u = JAXBUtils.JAXBCONTEXT_DEVICES.createUnmarshaller();
870 DeviceListModel devices = u.unmarshal(xsr, DeviceListModel.class).getValue();
872 assertNotNull(devices);
873 assertEquals(1, devices.getDevicelist().size());
875 AVMFritzBaseModel device = devices.getDevicelist().get(0);
876 assertNotNull(device);
878 discovery.onDeviceAdded(device);
879 assertNotNull(discoveryResult);
881 assertEquals(DiscoveryResultFlag.NEW, discoveryResult.getFlag());
882 assertEquals(new ThingUID("avmfritz:FRITZ_GROUP_HEATING:1:F0_A3_7F_900"), discoveryResult.getThingUID());
883 assertEquals(GROUP_HEATING_THING_TYPE, discoveryResult.getThingTypeUID());
884 assertEquals(BRIGE_THING_ID, discoveryResult.getBridgeUID());
885 assertEquals("F0:A3:7F-900", discoveryResult.getProperties().get(CONFIG_AIN));
886 assertEquals("AVM", discoveryResult.getProperties().get(PROPERTY_VENDOR));
887 assertEquals("", discoveryResult.getProperties().get(PRODUCT_NAME));
888 assertEquals("F0:A3:7F-900", discoveryResult.getProperties().get(PROPERTY_SERIAL_NUMBER));
889 assertEquals("1.0", discoveryResult.getProperties().get(PROPERTY_FIRMWARE_VERSION));
890 assertEquals("1000", discoveryResult.getProperties().get(PROPERTY_MASTER));
891 assertEquals("20000", discoveryResult.getProperties().get(PROPERTY_MEMBERS));
892 assertEquals(CONFIG_AIN, discoveryResult.getRepresentationProperty());
895 @SuppressWarnings("null")
897 public void validSwitchGroupDiscoveryResult() throws JAXBException, XMLStreamException {
900 "<devicelist version=\"1\">" +
901 "<group identifier=\"F0:A3:7F-900\" id=\"20001\" functionbitmask=\"6784\" fwversion=\"1.0\" manufacturer=\"AVM\" productname=\"\">" +
902 "<present>1</present>" +
903 "<name>Schlafzimmer</name>" +
906 "<mode>manuell</mode>" +
908 "<devicelock>0</devicelock>" +
911 "<voltage>232850</voltage>" +
913 "<energy>2087</energy>" +
916 "<masterdeviceid>1000</masterdeviceid>" +
917 "<members>20000</members>" +
923 XMLStreamReader xsr = JAXBUtils.XMLINPUTFACTORY.createXMLStreamReader(new StringReader(xml));
924 Unmarshaller u = JAXBUtils.JAXBCONTEXT_DEVICES.createUnmarshaller();
925 DeviceListModel devices = u.unmarshal(xsr, DeviceListModel.class).getValue();
927 assertNotNull(devices);
928 assertEquals(1, devices.getDevicelist().size());
930 AVMFritzBaseModel device = devices.getDevicelist().get(0);
931 assertNotNull(device);
933 discovery.onDeviceAdded(device);
934 assertNotNull(discoveryResult);
936 assertEquals(DiscoveryResultFlag.NEW, discoveryResult.getFlag());
937 assertEquals(new ThingUID("avmfritz:FRITZ_GROUP_SWITCH:1:F0_A3_7F_900"), discoveryResult.getThingUID());
938 assertEquals(GROUP_SWITCH_THING_TYPE, discoveryResult.getThingTypeUID());
939 assertEquals(BRIGE_THING_ID, discoveryResult.getBridgeUID());
940 assertEquals("F0:A3:7F-900", discoveryResult.getProperties().get(CONFIG_AIN));
941 assertEquals("AVM", discoveryResult.getProperties().get(PROPERTY_VENDOR));
942 assertEquals("", discoveryResult.getProperties().get(PRODUCT_NAME));
943 assertEquals("F0:A3:7F-900", discoveryResult.getProperties().get(PROPERTY_SERIAL_NUMBER));
944 assertEquals("1.0", discoveryResult.getProperties().get(PROPERTY_FIRMWARE_VERSION));
945 assertEquals("1000", discoveryResult.getProperties().get(PROPERTY_MASTER));
946 assertEquals("20000", discoveryResult.getProperties().get(PROPERTY_MEMBERS));
947 assertEquals(CONFIG_AIN, discoveryResult.getRepresentationProperty());