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(14, 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_BLINDS_THING_TYPE));
105 assertTrue(discovery.getSupportedThingTypes().contains(GROUP_HEATING_THING_TYPE));
106 assertTrue(discovery.getSupportedThingTypes().contains(GROUP_SWITCH_THING_TYPE));
109 @SuppressWarnings("null")
111 public void invalidDiscoveryResult() throws JAXBException, XMLStreamException {
112 // attribute productname is important for a valid discovery result
115 "<devicelist version=\"1\">" +
116 "<device identifier=\"08761 0954669\" id=\"20\" functionbitmask=\"1280\" fwversion=\"03.86\" manufacturer=\"AVM\" productname=\"\">" +
117 "<present>1</present>" +
118 "<name>FRITZ!DECT Repeater 100 #5</name>" +
120 "<celsius>230</celsius>" +
121 "<offset>0</offset>" +
127 XMLStreamReader xsr = JAXBUtils.XMLINPUTFACTORY.createXMLStreamReader(new StringReader(xml));
128 Unmarshaller u = JAXBUtils.JAXBCONTEXT_DEVICES.createUnmarshaller();
129 DeviceListModel devices = u.unmarshal(xsr, DeviceListModel.class).getValue();
131 assertNotNull(devices);
132 assertEquals(1, devices.getDevicelist().size());
134 AVMFritzBaseModel device = devices.getDevicelist().get(0);
135 assertNotNull(device);
137 discovery.onDeviceAdded(device);
138 assertNull(discoveryResult);
141 @SuppressWarnings("null")
143 public void validDECTRepeater100Result() throws JAXBException, XMLStreamException {
146 "<devicelist version=\"1\">" +
147 "<device identifier=\"08761 0954669\" id=\"20\" functionbitmask=\"1280\" fwversion=\"03.86\" manufacturer=\"AVM\" productname=\"FRITZ!DECT Repeater 100\">" +
148 "<present>1</present>" +
149 "<name>FRITZ!DECT Repeater 100 #5</name>" +
151 "<celsius>230</celsius>" +
152 "<offset>0</offset>" +
158 XMLStreamReader xsr = JAXBUtils.XMLINPUTFACTORY.createXMLStreamReader(new StringReader(xml));
159 Unmarshaller u = JAXBUtils.JAXBCONTEXT_DEVICES.createUnmarshaller();
160 DeviceListModel devices = u.unmarshal(xsr, DeviceListModel.class).getValue();
162 assertNotNull(devices);
163 assertEquals(1, devices.getDevicelist().size());
165 AVMFritzBaseModel device = devices.getDevicelist().get(0);
166 assertNotNull(device);
167 assertEquals(1, device.getPresent());
169 discovery.onDeviceAdded(device);
170 assertNotNull(discoveryResult);
172 assertEquals(DiscoveryResultFlag.NEW, discoveryResult.getFlag());
173 assertEquals(new ThingUID("avmfritz:FRITZ_DECT_Repeater_100:1:087610954669"), discoveryResult.getThingUID());
174 assertEquals(DECT100_THING_TYPE, discoveryResult.getThingTypeUID());
175 assertEquals(BRIGE_THING_ID, discoveryResult.getBridgeUID());
176 assertEquals("087610954669", discoveryResult.getProperties().get(CONFIG_AIN));
177 assertEquals("AVM", discoveryResult.getProperties().get(PROPERTY_VENDOR));
178 assertEquals("FRITZ!DECT Repeater 100", discoveryResult.getProperties().get(PRODUCT_NAME));
179 assertEquals("087610954669", discoveryResult.getProperties().get(PROPERTY_SERIAL_NUMBER));
180 assertEquals("03.86", discoveryResult.getProperties().get(PROPERTY_FIRMWARE_VERSION));
181 assertEquals(CONFIG_AIN, discoveryResult.getRepresentationProperty());
183 final String deviceNotPresentXml = xml.replace("<present>1</present>", "<present>0</present>");
184 devices = (DeviceListModel) u.unmarshal(new StringReader(deviceNotPresentXml));
185 assertNotNull(devices);
186 assertEquals(1, devices.getDevicelist().size());
188 device = devices.getDevicelist().get(0);
189 assertNotNull(device);
190 assertEquals(0, device.getPresent());
192 discovery.onDeviceAdded(device);
193 assertNull(discoveryResult);
196 @SuppressWarnings("null")
198 public void validDECT200DiscoveryResult() throws JAXBException, XMLStreamException {
201 "<devicelist version=\"1\">" +
202 "<device identifier=\"08761 0000434\" id=\"17\" functionbitmask=\"2944\" fwversion=\"03.83\" manufacturer=\"AVM\" productname=\"FRITZ!DECT 200\">" +
203 "<present>1</present>" +
204 "<name>FRITZ!DECT 200 #1</name>" +
207 "<mode>manuell</mode>" +
209 "<devicelock>1</devicelock>" +
212 "<voltage>232850</voltage>" +
213 "<power>45</power>" +
214 "<energy>166</energy>" +
217 "<celsius>255</celsius>" +
218 "<offset>0</offset>" +
224 XMLStreamReader xsr = JAXBUtils.XMLINPUTFACTORY.createXMLStreamReader(new StringReader(xml));
225 Unmarshaller u = JAXBUtils.JAXBCONTEXT_DEVICES.createUnmarshaller();
226 DeviceListModel devices = u.unmarshal(xsr, DeviceListModel.class).getValue();
228 assertNotNull(devices);
229 assertEquals(1, devices.getDevicelist().size());
231 AVMFritzBaseModel device = devices.getDevicelist().get(0);
232 assertNotNull(device);
234 discovery.onDeviceAdded(device);
235 assertNotNull(discoveryResult);
237 assertEquals(DiscoveryResultFlag.NEW, discoveryResult.getFlag());
238 assertEquals(new ThingUID("avmfritz:FRITZ_DECT_200:1:087610000434"), discoveryResult.getThingUID());
239 assertEquals(DECT200_THING_TYPE, discoveryResult.getThingTypeUID());
240 assertEquals(BRIGE_THING_ID, discoveryResult.getBridgeUID());
241 assertEquals("087610000434", discoveryResult.getProperties().get(CONFIG_AIN));
242 assertEquals("AVM", discoveryResult.getProperties().get(PROPERTY_VENDOR));
243 assertEquals("FRITZ!DECT 200", discoveryResult.getProperties().get(PRODUCT_NAME));
244 assertEquals("087610000434", discoveryResult.getProperties().get(PROPERTY_SERIAL_NUMBER));
245 assertEquals("03.83", discoveryResult.getProperties().get(PROPERTY_FIRMWARE_VERSION));
246 assertEquals(CONFIG_AIN, discoveryResult.getRepresentationProperty());
249 @SuppressWarnings("null")
251 public void validDECT210DiscoveryResult() throws JAXBException, XMLStreamException {
254 "<devicelist version=\"1\">" +
255 "<device identifier=\"08761 0000434\" id=\"17\" functionbitmask=\"2944\" fwversion=\"03.83\" manufacturer=\"AVM\" productname=\"FRITZ!DECT 210\">" +
256 "<present>1</present>" +
257 "<name>FRITZ!DECT 210 #1</name>" +
260 "<mode>manuell</mode>" +
262 "<devicelock>1</devicelock>" +
265 "<voltage>232850</voltage>" +
266 "<power>45</power>" +
267 "<energy>166</energy>" +
270 "<celsius>255</celsius>" +
271 "<offset>0</offset>" +
277 XMLStreamReader xsr = JAXBUtils.XMLINPUTFACTORY.createXMLStreamReader(new StringReader(xml));
278 Unmarshaller u = JAXBUtils.JAXBCONTEXT_DEVICES.createUnmarshaller();
279 DeviceListModel devices = u.unmarshal(xsr, DeviceListModel.class).getValue();
281 assertNotNull(devices);
282 assertEquals(1, devices.getDevicelist().size());
284 AVMFritzBaseModel device = devices.getDevicelist().get(0);
285 assertNotNull(device);
287 discovery.onDeviceAdded(device);
288 assertNotNull(discoveryResult);
290 assertEquals(DiscoveryResultFlag.NEW, discoveryResult.getFlag());
291 assertEquals(new ThingUID("avmfritz:FRITZ_DECT_210:1:087610000434"), discoveryResult.getThingUID());
292 assertEquals(DECT210_THING_TYPE, discoveryResult.getThingTypeUID());
293 assertEquals(BRIGE_THING_ID, discoveryResult.getBridgeUID());
294 assertEquals("087610000434", discoveryResult.getProperties().get(CONFIG_AIN));
295 assertEquals("AVM", discoveryResult.getProperties().get(PROPERTY_VENDOR));
296 assertEquals("FRITZ!DECT 210", discoveryResult.getProperties().get(PRODUCT_NAME));
297 assertEquals("087610000434", discoveryResult.getProperties().get(PROPERTY_SERIAL_NUMBER));
298 assertEquals("03.83", discoveryResult.getProperties().get(PROPERTY_FIRMWARE_VERSION));
299 assertEquals(CONFIG_AIN, discoveryResult.getRepresentationProperty());
302 @SuppressWarnings("null")
304 public void validCometDECTDiscoveryResult() throws JAXBException, XMLStreamException {
307 "<devicelist version=\"1\">" +
308 "<device identifier=\"08761 0000435\" id=\"18\" functionbitmask=\"320\" fwversion=\"03.50\" manufacturer=\"AVM\" productname=\"Comet DECT\">" +
309 "<present>1</present>" +
310 "<name>Comet DECT #1</name>" +
312 "<celsius>220</celsius>" +
313 "<offset>-10</offset>" +
317 "<tsoll>42</tsoll>" +
318 "<absenk>28</absenk>" +
319 "<komfort>42</komfort>" +
321 "<devicelock>0</devicelock>" +
322 "<errorcode>0</errorcode>" +
323 "<batterylow>0</batterylow>" +
325 "<endperiod>1484341200</endperiod>" +
326 "<tchange>28</tchange>" +
333 XMLStreamReader xsr = JAXBUtils.XMLINPUTFACTORY.createXMLStreamReader(new StringReader(xml));
334 Unmarshaller u = JAXBUtils.JAXBCONTEXT_DEVICES.createUnmarshaller();
335 DeviceListModel devices = u.unmarshal(xsr, DeviceListModel.class).getValue();
337 assertNotNull(devices);
338 assertEquals(1, devices.getDevicelist().size());
340 AVMFritzBaseModel device = devices.getDevicelist().get(0);
341 assertNotNull(device);
343 discovery.onDeviceAdded(device);
344 assertNotNull(discoveryResult);
346 assertEquals(DiscoveryResultFlag.NEW, discoveryResult.getFlag());
347 assertEquals(new ThingUID("avmfritz:Comet_DECT:1:087610000435"), discoveryResult.getThingUID());
348 assertEquals(COMETDECT_THING_TYPE, discoveryResult.getThingTypeUID());
349 assertEquals(BRIGE_THING_ID, discoveryResult.getBridgeUID());
350 assertEquals("087610000435", discoveryResult.getProperties().get(CONFIG_AIN));
351 assertEquals("AVM", discoveryResult.getProperties().get(PROPERTY_VENDOR));
352 assertEquals("Comet DECT", discoveryResult.getProperties().get(PRODUCT_NAME));
353 assertEquals("087610000435", discoveryResult.getProperties().get(PROPERTY_SERIAL_NUMBER));
354 assertEquals("03.50", discoveryResult.getProperties().get(PROPERTY_FIRMWARE_VERSION));
355 assertEquals(CONFIG_AIN, discoveryResult.getRepresentationProperty());
358 @SuppressWarnings("null")
360 public void validDECT300DiscoveryResult() throws JAXBException, XMLStreamException {
363 "<devicelist version=\"1\">" +
364 "<device identifier=\"08761 0000435\" id=\"18\" functionbitmask=\"320\" fwversion=\"03.50\" manufacturer=\"AVM\" productname=\"FRITZ!DECT 300\">" +
365 "<present>1</present>" +
366 "<name>FRITZ!DECT 300 #1</name>" +
368 "<celsius>220</celsius>" +
369 "<offset>-10</offset>" +
373 "<tsoll>42</tsoll>" +
374 "<absenk>28</absenk>" +
375 "<komfort>42</komfort>" +
377 "<devicelock>0</devicelock>" +
378 "<errorcode>0</errorcode>" +
379 "<batterylow>0</batterylow>" +
381 "<endperiod>1484341200</endperiod>" +
382 "<tchange>28</tchange>" +
389 XMLStreamReader xsr = JAXBUtils.XMLINPUTFACTORY.createXMLStreamReader(new StringReader(xml));
390 Unmarshaller u = JAXBUtils.JAXBCONTEXT_DEVICES.createUnmarshaller();
391 DeviceListModel devices = u.unmarshal(xsr, DeviceListModel.class).getValue();
393 assertNotNull(devices);
394 assertEquals(1, devices.getDevicelist().size());
396 AVMFritzBaseModel device = devices.getDevicelist().get(0);
397 assertNotNull(device);
399 discovery.onDeviceAdded(device);
400 assertNotNull(discoveryResult);
402 assertEquals(DiscoveryResultFlag.NEW, discoveryResult.getFlag());
403 assertEquals(new ThingUID("avmfritz:FRITZ_DECT_300:1:087610000435"), discoveryResult.getThingUID());
404 assertEquals(DECT300_THING_TYPE, discoveryResult.getThingTypeUID());
405 assertEquals(BRIGE_THING_ID, discoveryResult.getBridgeUID());
406 assertEquals("087610000435", discoveryResult.getProperties().get(CONFIG_AIN));
407 assertEquals("AVM", discoveryResult.getProperties().get(PROPERTY_VENDOR));
408 assertEquals("FRITZ!DECT 300", discoveryResult.getProperties().get(PRODUCT_NAME));
409 assertEquals("087610000435", discoveryResult.getProperties().get(PROPERTY_SERIAL_NUMBER));
410 assertEquals("03.50", discoveryResult.getProperties().get(PROPERTY_FIRMWARE_VERSION));
411 assertEquals(CONFIG_AIN, discoveryResult.getRepresentationProperty());
414 @SuppressWarnings("null")
416 public void validDECT301DiscoveryResult() throws JAXBException, XMLStreamException {
419 "<devicelist version=\"1\">" +
420 "<device identifier=\"08761 0000435\" id=\"18\" functionbitmask=\"320\" fwversion=\"03.50\" manufacturer=\"AVM\" productname=\"FRITZ!DECT 301\">" +
421 "<present>1</present>" +
422 "<name>FRITZ!DECT 301 #1</name>" +
424 "<celsius>220</celsius>" +
425 "<offset>-10</offset>" +
429 "<tsoll>42</tsoll>" +
430 "<absenk>28</absenk>" +
431 "<komfort>42</komfort>" +
433 "<devicelock>0</devicelock>" +
434 "<errorcode>0</errorcode>" +
435 "<batterylow>0</batterylow>" +
437 "<endperiod>1484341200</endperiod>" +
438 "<tchange>28</tchange>" +
445 XMLStreamReader xsr = JAXBUtils.XMLINPUTFACTORY.createXMLStreamReader(new StringReader(xml));
446 Unmarshaller u = JAXBUtils.JAXBCONTEXT_DEVICES.createUnmarshaller();
447 DeviceListModel devices = u.unmarshal(xsr, DeviceListModel.class).getValue();
449 assertNotNull(devices);
450 assertEquals(1, devices.getDevicelist().size());
452 AVMFritzBaseModel device = devices.getDevicelist().get(0);
453 assertNotNull(device);
455 discovery.onDeviceAdded(device);
456 assertNotNull(discoveryResult);
458 assertEquals(DiscoveryResultFlag.NEW, discoveryResult.getFlag());
459 assertEquals(new ThingUID("avmfritz:FRITZ_DECT_301:1:087610000435"), discoveryResult.getThingUID());
460 assertEquals(DECT301_THING_TYPE, discoveryResult.getThingTypeUID());
461 assertEquals(BRIGE_THING_ID, discoveryResult.getBridgeUID());
462 assertEquals("087610000435", discoveryResult.getProperties().get(CONFIG_AIN));
463 assertEquals("AVM", discoveryResult.getProperties().get(PROPERTY_VENDOR));
464 assertEquals("FRITZ!DECT 301", discoveryResult.getProperties().get(PRODUCT_NAME));
465 assertEquals("087610000435", discoveryResult.getProperties().get(PROPERTY_SERIAL_NUMBER));
466 assertEquals("03.50", discoveryResult.getProperties().get(PROPERTY_FIRMWARE_VERSION));
467 assertEquals(CONFIG_AIN, discoveryResult.getRepresentationProperty());
470 @SuppressWarnings("null")
472 public void validPowerline546EDiscoveryResult() throws JAXBException, XMLStreamException {
475 "<devicelist version=\"1\">" +
476 "<device identifier=\"5C:49:79:F0:A3:84\" id=\"19\" functionbitmask=\"640\" fwversion=\"06.92\" manufacturer=\"AVM\" productname=\"FRITZ!Powerline 546E\">" +
477 "<present>1</present>" +
478 "<name>FRITZ!Powerline 546E #1</name>" +
481 "<mode>manuell</mode>" +
483 "<devicelock>1</devicelock>" +
486 "<voltage>232850</voltage>" +
488 "<energy>2087</energy>" +
494 XMLStreamReader xsr = JAXBUtils.XMLINPUTFACTORY.createXMLStreamReader(new StringReader(xml));
495 Unmarshaller u = JAXBUtils.JAXBCONTEXT_DEVICES.createUnmarshaller();
496 DeviceListModel devices = u.unmarshal(xsr, DeviceListModel.class).getValue();
498 assertNotNull(devices);
499 assertEquals(1, devices.getDevicelist().size());
501 AVMFritzBaseModel device = devices.getDevicelist().get(0);
502 assertNotNull(device);
504 discovery.onDeviceAdded(device);
505 assertNotNull(discoveryResult);
507 assertEquals(DiscoveryResultFlag.NEW, discoveryResult.getFlag());
508 assertEquals(new ThingUID("avmfritz:FRITZ_Powerline_546E:1:5C_49_79_F0_A3_84"), discoveryResult.getThingUID());
509 assertEquals(PL546E_THING_TYPE, discoveryResult.getThingTypeUID());
510 assertEquals(BRIGE_THING_ID, discoveryResult.getBridgeUID());
511 assertEquals("5C:49:79:F0:A3:84", discoveryResult.getProperties().get(CONFIG_AIN));
512 assertEquals("AVM", discoveryResult.getProperties().get(PROPERTY_VENDOR));
513 assertEquals("FRITZ!Powerline 546E", discoveryResult.getProperties().get(PRODUCT_NAME));
514 assertEquals("5C:49:79:F0:A3:84", discoveryResult.getProperties().get(PROPERTY_SERIAL_NUMBER));
515 assertEquals("06.92", discoveryResult.getProperties().get(PROPERTY_FIRMWARE_VERSION));
516 assertEquals(CONFIG_AIN, discoveryResult.getRepresentationProperty());
519 @SuppressWarnings("null")
521 public void invalidHANFUNContactDiscoveryResult() throws JAXBException, XMLStreamException {
524 "<devicelist version=\"1\">" +
525 "<device identifier=\"11934 0059578\" id=\"406\" functionbitmask=\"1\" fwversion=\"00.00\" manufacturer=\"0x0feb\" productname=\"HAN-FUN\">" +
526 "<present>1</present>" +
527 "<name>HAN-FUN #2</name>" +
532 XMLStreamReader xsr = JAXBUtils.XMLINPUTFACTORY.createXMLStreamReader(new StringReader(xml));
533 Unmarshaller u = JAXBUtils.JAXBCONTEXT_DEVICES.createUnmarshaller();
534 DeviceListModel devices = u.unmarshal(xsr, DeviceListModel.class).getValue();
536 assertNotNull(devices);
537 assertEquals(1, devices.getDevicelist().size());
539 AVMFritzBaseModel device = devices.getDevicelist().get(0);
540 assertNotNull(device);
542 discovery.onDeviceAdded(device);
543 assertNull(discoveryResult);
546 @SuppressWarnings("null")
548 public void validHANFUNMagneticContactDiscoveryResult() throws JAXBException, XMLStreamException {
551 "<devicelist version=\"1\">" +
552 "<device identifier=\"11934 0059578-1\" id=\"2000\" functionbitmask=\"8208\" fwversion=\"0.0\" manufacturer=\"0x0feb\" productname=\"HAN-FUN\">" +
553 "<present>1</present>" +
554 "<name>HAN-FUN #2: Unit #2</name>" +
556 "<etsideviceid>406</etsideviceid>" +
557 "<unittype>513</unittype>" +
558 "<interfaces>256</interfaces>" +
567 XMLStreamReader xsr = JAXBUtils.XMLINPUTFACTORY.createXMLStreamReader(new StringReader(xml));
568 Unmarshaller u = JAXBUtils.JAXBCONTEXT_DEVICES.createUnmarshaller();
569 DeviceListModel devices = u.unmarshal(xsr, DeviceListModel.class).getValue();
571 assertNotNull(devices);
572 assertEquals(1, devices.getDevicelist().size());
574 AVMFritzBaseModel device = devices.getDevicelist().get(0);
575 assertNotNull(device);
577 discovery.onDeviceAdded(device);
578 assertNotNull(discoveryResult);
580 assertEquals(DiscoveryResultFlag.NEW, discoveryResult.getFlag());
581 assertEquals(new ThingUID("avmfritz:HAN_FUN_CONTACT:1:119340059578_1"), discoveryResult.getThingUID());
582 assertEquals(HAN_FUN_CONTACT_THING_TYPE, discoveryResult.getThingTypeUID());
583 assertEquals(BRIGE_THING_ID, discoveryResult.getBridgeUID());
584 assertEquals("119340059578-1", discoveryResult.getProperties().get(CONFIG_AIN));
585 assertEquals("0x0feb", discoveryResult.getProperties().get(PROPERTY_VENDOR));
586 assertEquals("HAN-FUN", discoveryResult.getProperties().get(PRODUCT_NAME));
587 assertEquals("119340059578-1", discoveryResult.getProperties().get(PROPERTY_SERIAL_NUMBER));
588 assertEquals("0.0", discoveryResult.getProperties().get(PROPERTY_FIRMWARE_VERSION));
589 assertEquals(CONFIG_AIN, discoveryResult.getRepresentationProperty());
592 @SuppressWarnings("null")
594 public void validHANFUNOpticalContactDiscoveryResult() throws JAXBException, XMLStreamException {
597 "<devicelist version=\"1\">" +
598 "<device identifier=\"11934 0059578-1\" id=\"2001\" functionbitmask=\"8208\" fwversion=\"0.0\" manufacturer=\"0x0feb\" productname=\"HAN-FUN\">" +
599 "<present>1</present>" +
600 "<name>HAN-FUN #3: Unit #3</name>" +
602 "<etsideviceid>406</etsideviceid>" +
603 "<unittype>514</unittype>" +
604 "<interfaces>256</interfaces>" +
613 XMLStreamReader xsr = JAXBUtils.XMLINPUTFACTORY.createXMLStreamReader(new StringReader(xml));
614 Unmarshaller u = JAXBUtils.JAXBCONTEXT_DEVICES.createUnmarshaller();
615 DeviceListModel devices = u.unmarshal(xsr, DeviceListModel.class).getValue();
617 assertNotNull(devices);
618 assertEquals(1, devices.getDevicelist().size());
620 AVMFritzBaseModel device = devices.getDevicelist().get(0);
621 assertNotNull(device);
623 discovery.onDeviceAdded(device);
624 assertNotNull(discoveryResult);
626 assertEquals(DiscoveryResultFlag.NEW, discoveryResult.getFlag());
627 assertEquals(new ThingUID("avmfritz:HAN_FUN_CONTACT:1:119340059578_1"), discoveryResult.getThingUID());
628 assertEquals(HAN_FUN_CONTACT_THING_TYPE, discoveryResult.getThingTypeUID());
629 assertEquals(BRIGE_THING_ID, discoveryResult.getBridgeUID());
630 assertEquals("119340059578-1", discoveryResult.getProperties().get(CONFIG_AIN));
631 assertEquals("0x0feb", discoveryResult.getProperties().get(PROPERTY_VENDOR));
632 assertEquals("HAN-FUN", discoveryResult.getProperties().get(PRODUCT_NAME));
633 assertEquals("119340059578-1", discoveryResult.getProperties().get(PROPERTY_SERIAL_NUMBER));
634 assertEquals("0.0", discoveryResult.getProperties().get(PROPERTY_FIRMWARE_VERSION));
635 assertEquals(CONFIG_AIN, discoveryResult.getRepresentationProperty());
638 @SuppressWarnings("null")
640 public void validHANFUNMotionSensorDiscoveryResult() throws JAXBException, XMLStreamException {
643 "<devicelist version=\"1\">" +
644 "<device identifier=\"11934 0059578-1\" id=\"2002\" functionbitmask=\"8208\" fwversion=\"0.0\" manufacturer=\"0x0feb\" productname=\"HAN-FUN\">" +
645 "<present>1</present>" +
646 "<name>HAN-FUN #3: Unit #3</name>" +
648 "<etsideviceid>408</etsideviceid>" +
649 "<unittype>515</unittype>" +
650 "<interfaces>32513,256</interfaces>" +
659 XMLStreamReader xsr = JAXBUtils.XMLINPUTFACTORY.createXMLStreamReader(new StringReader(xml));
660 Unmarshaller u = JAXBUtils.JAXBCONTEXT_DEVICES.createUnmarshaller();
661 DeviceListModel devices = u.unmarshal(xsr, DeviceListModel.class).getValue();
663 assertNotNull(devices);
664 assertEquals(1, devices.getDevicelist().size());
666 AVMFritzBaseModel device = devices.getDevicelist().get(0);
667 assertNotNull(device);
669 discovery.onDeviceAdded(device);
670 assertNotNull(discoveryResult);
672 assertEquals(DiscoveryResultFlag.NEW, discoveryResult.getFlag());
673 assertEquals(new ThingUID("avmfritz:HAN_FUN_CONTACT:1:119340059578_1"), discoveryResult.getThingUID());
674 assertEquals(HAN_FUN_CONTACT_THING_TYPE, discoveryResult.getThingTypeUID());
675 assertEquals(BRIGE_THING_ID, discoveryResult.getBridgeUID());
676 assertEquals("119340059578-1", discoveryResult.getProperties().get(CONFIG_AIN));
677 assertEquals("0x0feb", discoveryResult.getProperties().get(PROPERTY_VENDOR));
678 assertEquals("HAN-FUN", discoveryResult.getProperties().get(PRODUCT_NAME));
679 assertEquals("119340059578-1", discoveryResult.getProperties().get(PROPERTY_SERIAL_NUMBER));
680 assertEquals("0.0", discoveryResult.getProperties().get(PROPERTY_FIRMWARE_VERSION));
681 assertEquals(CONFIG_AIN, discoveryResult.getRepresentationProperty());
684 @SuppressWarnings("null")
686 public void validHANFUNMSmokeDetectorDiscoveryResult() throws JAXBException, XMLStreamException {
689 "<devicelist version=\"1\">" +
690 "<device identifier=\"11324 0059952-1\" id=\"2003\" functionbitmask=\"8208\" fwversion=\"0.0\" manufacturer=\"0x2c3c\" productname=\"HAN-FUN\">" +
691 "<present>1</present>" +
692 "<name>HAN-FUN #4: Unit #4</name>" +
694 "<etsideviceid>407</etsideviceid>" +
695 "<unittype>516</unittype>" +
696 "<interfaces>256</interfaces>" +
705 XMLStreamReader xsr = JAXBUtils.XMLINPUTFACTORY.createXMLStreamReader(new StringReader(xml));
706 Unmarshaller u = JAXBUtils.JAXBCONTEXT_DEVICES.createUnmarshaller();
707 DeviceListModel devices = u.unmarshal(xsr, DeviceListModel.class).getValue();
709 assertNotNull(devices);
710 assertEquals(1, devices.getDevicelist().size());
712 AVMFritzBaseModel device = devices.getDevicelist().get(0);
713 assertNotNull(device);
715 discovery.onDeviceAdded(device);
716 assertNotNull(discoveryResult);
718 assertEquals(DiscoveryResultFlag.NEW, discoveryResult.getFlag());
719 assertEquals(new ThingUID("avmfritz:HAN_FUN_CONTACT:1:113240059952_1"), discoveryResult.getThingUID());
720 assertEquals(HAN_FUN_CONTACT_THING_TYPE, discoveryResult.getThingTypeUID());
721 assertEquals(BRIGE_THING_ID, discoveryResult.getBridgeUID());
722 assertEquals("113240059952-1", discoveryResult.getProperties().get(CONFIG_AIN));
723 assertEquals("0x2c3c", discoveryResult.getProperties().get(PROPERTY_VENDOR));
724 assertEquals("HAN-FUN", discoveryResult.getProperties().get(PRODUCT_NAME));
725 assertEquals("113240059952-1", discoveryResult.getProperties().get(PROPERTY_SERIAL_NUMBER));
726 assertEquals("0.0", discoveryResult.getProperties().get(PROPERTY_FIRMWARE_VERSION));
727 assertEquals(CONFIG_AIN, discoveryResult.getRepresentationProperty());
730 @SuppressWarnings("null")
732 public void validHANFUNSwitchtDiscoveryResult() throws JAXBException, XMLStreamException {
735 "<devicelist version=\"1\">" +
736 "<device identifier=\"11934 0059578-1\" id=\"2001\" functionbitmask=\"8200\" fwversion=\"0.0\" manufacturer=\"0x0feb\" productname=\"HAN-FUN\">" +
737 "<present>1</present>" +
738 "<name>HAN-FUN #2: Unit #2</name>" +
740 "<etsideviceid>412</etsideviceid>" +
741 "<unittype>273</unittype>" +
742 "<interfaces>772</interfaces>" +
745 "<lastpressedtimestamp>1529590797</lastpressedtimestamp>" +
751 XMLStreamReader xsr = JAXBUtils.XMLINPUTFACTORY.createXMLStreamReader(new StringReader(xml));
752 Unmarshaller u = JAXBUtils.JAXBCONTEXT_DEVICES.createUnmarshaller();
753 DeviceListModel devices = u.unmarshal(xsr, DeviceListModel.class).getValue();
755 assertNotNull(devices);
756 assertEquals(1, devices.getDevicelist().size());
758 AVMFritzBaseModel device = devices.getDevicelist().get(0);
759 assertNotNull(device);
761 discovery.onDeviceAdded(device);
762 assertNotNull(discoveryResult);
764 assertEquals(DiscoveryResultFlag.NEW, discoveryResult.getFlag());
765 assertEquals(new ThingUID("avmfritz:HAN_FUN_SWITCH:1:119340059578_1"), discoveryResult.getThingUID());
766 assertEquals(HAN_FUN_SWITCH_THING_TYPE, discoveryResult.getThingTypeUID());
767 assertEquals(BRIGE_THING_ID, discoveryResult.getBridgeUID());
768 assertEquals("119340059578-1", discoveryResult.getProperties().get(CONFIG_AIN));
769 assertEquals("0x0feb", discoveryResult.getProperties().get(PROPERTY_VENDOR));
770 assertEquals("HAN-FUN", discoveryResult.getProperties().get(PRODUCT_NAME));
771 assertEquals("119340059578-1", discoveryResult.getProperties().get(PROPERTY_SERIAL_NUMBER));
772 assertEquals("0.0", discoveryResult.getProperties().get(PROPERTY_FIRMWARE_VERSION));
773 assertEquals(CONFIG_AIN, discoveryResult.getRepresentationProperty());
776 @SuppressWarnings("null")
778 public void validHANFUNBlindDiscoveryResult() throws JAXBException, XMLStreamException {
781 "<devicelist version=\"1\">" +
782 "<device identifier=\"14276 0503450-1\" id=\"2000\" functionbitmask=\"335888\" fwversion=\"0.0\" manufacturer=\"0x37c4\" productname=\"Rollotron 1213\">"+
783 "<present>1</present>"+
784 "<txbusy>0</txbusy>"+
785 "<name>Rollotron 1213 #1</name>"+
787 "<endpositionsset>1</endpositionsset>"+
788 "<mode>manuell</mode>"+
792 "<levelpercentage>10</levelpercentage>"+
795 "<etsideviceid>406</etsideviceid>"+
796 "<unittype>281</unittype>"+
797 "<interfaces>256,513,516,517</interfaces>"+
801 "<lastalertchgtimestamp></lastalertchgtimestamp>"+
807 XMLStreamReader xsr = JAXBUtils.XMLINPUTFACTORY.createXMLStreamReader(new StringReader(xml));
808 Unmarshaller u = JAXBUtils.JAXBCONTEXT_DEVICES.createUnmarshaller();
809 DeviceListModel devices = u.unmarshal(xsr, DeviceListModel.class).getValue();
811 assertNotNull(devices);
812 assertEquals(1, devices.getDevicelist().size());
814 AVMFritzBaseModel device = devices.getDevicelist().get(0);
815 assertNotNull(device);
817 discovery.onDeviceAdded(device);
818 assertNotNull(discoveryResult);
820 assertEquals(DiscoveryResultFlag.NEW, discoveryResult.getFlag());
821 assertEquals(new ThingUID("avmfritz:HAN_FUN_BLINDS:1:142760503450_1"), discoveryResult.getThingUID());
822 assertEquals(HAN_FUN_BLINDS_THING_TYPE, discoveryResult.getThingTypeUID());
823 assertEquals(BRIGE_THING_ID, discoveryResult.getBridgeUID());
824 assertEquals("142760503450-1", discoveryResult.getProperties().get(CONFIG_AIN));
825 assertEquals("0x37c4", discoveryResult.getProperties().get(PROPERTY_VENDOR));
826 assertEquals("Rollotron 1213", discoveryResult.getProperties().get(PRODUCT_NAME));
827 assertEquals("142760503450-1", discoveryResult.getProperties().get(PROPERTY_SERIAL_NUMBER));
828 assertEquals("0.0", discoveryResult.getProperties().get(PROPERTY_FIRMWARE_VERSION));
829 assertEquals(CONFIG_AIN, discoveryResult.getRepresentationProperty());
832 @SuppressWarnings("null")
834 public void validHeatingGroupDiscoveryResult() throws JAXBException, XMLStreamException {
837 "<devicelist version=\"1\">" +
838 "<group identifier=\"F0:A3:7F-900\" id=\"20000\" functionbitmask=\"4160\" fwversion=\"1.0\" manufacturer=\"AVM\" productname=\"\">" +
839 "<present>1</present>" +
840 "<name>Schlafzimmer</name>" +
843 "<tsoll>253</tsoll>" +
844 "<absenk>33</absenk>" +
845 "<komfort>40</komfort>" +
847 "<devicelock>0</devicelock>" +
848 "<errorcode>0</errorcode>" +
849 "<batterylow>0</batterylow>" +
850 "<windowopenactiv>0</windowopenactiv>" +
851 "<battery>1</battery>" +
853 "<endperiod>1546293600</endperiod>" +
854 "<tchange>33</tchange>" +
856 "<summeractive>1</summeractive>" +
857 "<holidayactive>0</holidayactive>" +
860 "<masterdeviceid>1000</masterdeviceid>" +
861 "<members>20000</members>" +
867 XMLStreamReader xsr = JAXBUtils.XMLINPUTFACTORY.createXMLStreamReader(new StringReader(xml));
868 Unmarshaller u = JAXBUtils.JAXBCONTEXT_DEVICES.createUnmarshaller();
869 DeviceListModel devices = u.unmarshal(xsr, DeviceListModel.class).getValue();
871 assertNotNull(devices);
872 assertEquals(1, devices.getDevicelist().size());
874 AVMFritzBaseModel device = devices.getDevicelist().get(0);
875 assertNotNull(device);
877 discovery.onDeviceAdded(device);
878 assertNotNull(discoveryResult);
880 assertEquals(DiscoveryResultFlag.NEW, discoveryResult.getFlag());
881 assertEquals(new ThingUID("avmfritz:FRITZ_GROUP_HEATING:1:F0_A3_7F_900"), discoveryResult.getThingUID());
882 assertEquals(GROUP_HEATING_THING_TYPE, discoveryResult.getThingTypeUID());
883 assertEquals(BRIGE_THING_ID, discoveryResult.getBridgeUID());
884 assertEquals("F0:A3:7F-900", discoveryResult.getProperties().get(CONFIG_AIN));
885 assertEquals("AVM", discoveryResult.getProperties().get(PROPERTY_VENDOR));
886 assertEquals("", discoveryResult.getProperties().get(PRODUCT_NAME));
887 assertEquals("F0:A3:7F-900", discoveryResult.getProperties().get(PROPERTY_SERIAL_NUMBER));
888 assertEquals("1.0", discoveryResult.getProperties().get(PROPERTY_FIRMWARE_VERSION));
889 assertEquals("1000", discoveryResult.getProperties().get(PROPERTY_MASTER));
890 assertEquals("20000", discoveryResult.getProperties().get(PROPERTY_MEMBERS));
891 assertEquals(CONFIG_AIN, discoveryResult.getRepresentationProperty());
894 @SuppressWarnings("null")
896 public void validSwitchGroupDiscoveryResult() throws JAXBException, XMLStreamException {
899 "<devicelist version=\"1\">" +
900 "<group identifier=\"F0:A3:7F-900\" id=\"20001\" functionbitmask=\"6784\" fwversion=\"1.0\" manufacturer=\"AVM\" productname=\"\">" +
901 "<present>1</present>" +
902 "<name>Schlafzimmer</name>" +
905 "<mode>manuell</mode>" +
907 "<devicelock>0</devicelock>" +
910 "<voltage>232850</voltage>" +
912 "<energy>2087</energy>" +
915 "<masterdeviceid>1000</masterdeviceid>" +
916 "<members>20000</members>" +
922 XMLStreamReader xsr = JAXBUtils.XMLINPUTFACTORY.createXMLStreamReader(new StringReader(xml));
923 Unmarshaller u = JAXBUtils.JAXBCONTEXT_DEVICES.createUnmarshaller();
924 DeviceListModel devices = u.unmarshal(xsr, DeviceListModel.class).getValue();
926 assertNotNull(devices);
927 assertEquals(1, devices.getDevicelist().size());
929 AVMFritzBaseModel device = devices.getDevicelist().get(0);
930 assertNotNull(device);
932 discovery.onDeviceAdded(device);
933 assertNotNull(discoveryResult);
935 assertEquals(DiscoveryResultFlag.NEW, discoveryResult.getFlag());
936 assertEquals(new ThingUID("avmfritz:FRITZ_GROUP_SWITCH:1:F0_A3_7F_900"), discoveryResult.getThingUID());
937 assertEquals(GROUP_SWITCH_THING_TYPE, discoveryResult.getThingTypeUID());
938 assertEquals(BRIGE_THING_ID, discoveryResult.getBridgeUID());
939 assertEquals("F0:A3:7F-900", discoveryResult.getProperties().get(CONFIG_AIN));
940 assertEquals("AVM", discoveryResult.getProperties().get(PROPERTY_VENDOR));
941 assertEquals("", discoveryResult.getProperties().get(PRODUCT_NAME));
942 assertEquals("F0:A3:7F-900", discoveryResult.getProperties().get(PROPERTY_SERIAL_NUMBER));
943 assertEquals("1.0", discoveryResult.getProperties().get(PROPERTY_FIRMWARE_VERSION));
944 assertEquals("1000", discoveryResult.getProperties().get(PROPERTY_MASTER));
945 assertEquals("20000", discoveryResult.getProperties().get(PROPERTY_MEMBERS));
946 assertEquals(CONFIG_AIN, discoveryResult.getRepresentationProperty());