2 * Copyright (c) 2010-2024 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(19, 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(DECT302_THING_TYPE));
99 assertTrue(discovery.getSupportedThingTypes().contains(DECT400_THING_TYPE));
100 assertTrue(discovery.getSupportedThingTypes().contains(DECT440_THING_TYPE));
101 assertTrue(discovery.getSupportedThingTypes().contains(DECT500_THING_TYPE));
102 assertTrue(discovery.getSupportedThingTypes().contains(POWERLINE546E_THING_TYPE));
103 assertTrue(discovery.getSupportedThingTypes().contains(COMETDECT_THING_TYPE));
104 assertTrue(discovery.getSupportedThingTypes().contains(HAN_FUN_CONTACT_THING_TYPE));
105 assertTrue(discovery.getSupportedThingTypes().contains(HAN_FUN_SWITCH_THING_TYPE));
106 assertTrue(discovery.getSupportedThingTypes().contains(HAN_FUN_ON_OFF_THING_TYPE));
107 assertTrue(discovery.getSupportedThingTypes().contains(HAN_FUN_BLINDS_THING_TYPE));
108 assertTrue(discovery.getSupportedThingTypes().contains(HAN_FUN_COLOR_BULB_THING_TYPE));
109 assertTrue(discovery.getSupportedThingTypes().contains(HAN_FUN_DIMMABLE_BULB_THING_TYPE));
110 assertTrue(discovery.getSupportedThingTypes().contains(GROUP_HEATING_THING_TYPE));
111 assertTrue(discovery.getSupportedThingTypes().contains(GROUP_SWITCH_THING_TYPE));
114 @SuppressWarnings("null")
116 public void invalidDiscoveryResult() throws JAXBException, XMLStreamException {
117 // attribute productname is important for a valid discovery result
120 "<devicelist version=\"1\">" +
121 "<device identifier=\"08761 0954669\" id=\"20\" functionbitmask=\"1280\" fwversion=\"03.86\" manufacturer=\"AVM\" productname=\"\">" +
122 "<present>1</present>" +
123 "<name>FRITZ!DECT Repeater 100 #5</name>" +
125 "<celsius>230</celsius>" +
126 "<offset>0</offset>" +
132 XMLStreamReader xsr = JAXBUtils.XMLINPUTFACTORY.createXMLStreamReader(new StringReader(xml));
133 Unmarshaller u = JAXBUtils.JAXBCONTEXT_DEVICES.createUnmarshaller();
134 DeviceListModel devices = u.unmarshal(xsr, DeviceListModel.class).getValue();
136 assertNotNull(devices);
137 assertEquals(1, devices.getDevicelist().size());
139 AVMFritzBaseModel device = devices.getDevicelist().get(0);
140 assertNotNull(device);
142 discovery.onDeviceAdded(device);
143 assertNull(discoveryResult);
146 @SuppressWarnings("null")
148 public void validDECTRepeater100Result() throws JAXBException, XMLStreamException {
151 "<devicelist version=\"1\">" +
152 "<device identifier=\"08761 0954669\" id=\"20\" functionbitmask=\"1280\" fwversion=\"03.86\" manufacturer=\"AVM\" productname=\"FRITZ!DECT Repeater 100\">" +
153 "<present>1</present>" +
154 "<name>FRITZ!DECT Repeater 100 #5</name>" +
156 "<celsius>230</celsius>" +
157 "<offset>0</offset>" +
163 XMLStreamReader xsr = JAXBUtils.XMLINPUTFACTORY.createXMLStreamReader(new StringReader(xml));
164 Unmarshaller u = JAXBUtils.JAXBCONTEXT_DEVICES.createUnmarshaller();
165 DeviceListModel devices = u.unmarshal(xsr, DeviceListModel.class).getValue();
167 assertNotNull(devices);
168 assertEquals(1, devices.getDevicelist().size());
170 AVMFritzBaseModel device = devices.getDevicelist().get(0);
171 assertNotNull(device);
172 assertEquals(1, device.getPresent());
174 discovery.onDeviceAdded(device);
175 assertNotNull(discoveryResult);
177 assertEquals(DiscoveryResultFlag.NEW, discoveryResult.getFlag());
178 assertEquals(new ThingUID("avmfritz:FRITZ_DECT_Repeater_100:1:087610954669"), discoveryResult.getThingUID());
179 assertEquals(DECT100_THING_TYPE, discoveryResult.getThingTypeUID());
180 assertEquals(BRIGE_THING_ID, discoveryResult.getBridgeUID());
181 assertEquals("087610954669", discoveryResult.getProperties().get(CONFIG_AIN));
182 assertEquals("AVM", discoveryResult.getProperties().get(PROPERTY_VENDOR));
183 assertEquals("FRITZ!DECT Repeater 100", discoveryResult.getProperties().get(PRODUCT_NAME));
184 assertEquals("087610954669", discoveryResult.getProperties().get(PROPERTY_SERIAL_NUMBER));
185 assertEquals("03.86", discoveryResult.getProperties().get(PROPERTY_FIRMWARE_VERSION));
186 assertEquals(CONFIG_AIN, discoveryResult.getRepresentationProperty());
188 final String deviceNotPresentXml = xml.replace("<present>1</present>", "<present>0</present>");
189 devices = (DeviceListModel) u.unmarshal(new StringReader(deviceNotPresentXml));
190 assertNotNull(devices);
191 assertEquals(1, devices.getDevicelist().size());
193 device = devices.getDevicelist().get(0);
194 assertNotNull(device);
195 assertEquals(0, device.getPresent());
197 discovery.onDeviceAdded(device);
198 assertNull(discoveryResult);
201 @SuppressWarnings("null")
203 public void validDECT200DiscoveryResult() throws JAXBException, XMLStreamException {
206 "<devicelist version=\"1\">" +
207 "<device identifier=\"08761 0000434\" id=\"17\" functionbitmask=\"2944\" fwversion=\"03.83\" manufacturer=\"AVM\" productname=\"FRITZ!DECT 200\">" +
208 "<present>1</present>" +
209 "<name>FRITZ!DECT 200 #1</name>" +
212 "<mode>manuell</mode>" +
214 "<devicelock>1</devicelock>" +
217 "<voltage>232850</voltage>" +
218 "<power>45</power>" +
219 "<energy>166</energy>" +
222 "<celsius>255</celsius>" +
223 "<offset>0</offset>" +
229 XMLStreamReader xsr = JAXBUtils.XMLINPUTFACTORY.createXMLStreamReader(new StringReader(xml));
230 Unmarshaller u = JAXBUtils.JAXBCONTEXT_DEVICES.createUnmarshaller();
231 DeviceListModel devices = u.unmarshal(xsr, DeviceListModel.class).getValue();
233 assertNotNull(devices);
234 assertEquals(1, devices.getDevicelist().size());
236 AVMFritzBaseModel device = devices.getDevicelist().get(0);
237 assertNotNull(device);
239 discovery.onDeviceAdded(device);
240 assertNotNull(discoveryResult);
242 assertEquals(DiscoveryResultFlag.NEW, discoveryResult.getFlag());
243 assertEquals(new ThingUID("avmfritz:FRITZ_DECT_200:1:087610000434"), discoveryResult.getThingUID());
244 assertEquals(DECT200_THING_TYPE, discoveryResult.getThingTypeUID());
245 assertEquals(BRIGE_THING_ID, discoveryResult.getBridgeUID());
246 assertEquals("087610000434", discoveryResult.getProperties().get(CONFIG_AIN));
247 assertEquals("AVM", discoveryResult.getProperties().get(PROPERTY_VENDOR));
248 assertEquals("FRITZ!DECT 200", discoveryResult.getProperties().get(PRODUCT_NAME));
249 assertEquals("087610000434", discoveryResult.getProperties().get(PROPERTY_SERIAL_NUMBER));
250 assertEquals("03.83", discoveryResult.getProperties().get(PROPERTY_FIRMWARE_VERSION));
251 assertEquals(CONFIG_AIN, discoveryResult.getRepresentationProperty());
254 @SuppressWarnings("null")
256 public void validDECT210DiscoveryResult() throws JAXBException, XMLStreamException {
259 "<devicelist version=\"1\">" +
260 "<device identifier=\"08761 0000434\" id=\"17\" functionbitmask=\"2944\" fwversion=\"03.83\" manufacturer=\"AVM\" productname=\"FRITZ!DECT 210\">" +
261 "<present>1</present>" +
262 "<name>FRITZ!DECT 210 #1</name>" +
265 "<mode>manuell</mode>" +
267 "<devicelock>1</devicelock>" +
270 "<voltage>232850</voltage>" +
271 "<power>45</power>" +
272 "<energy>166</energy>" +
275 "<celsius>255</celsius>" +
276 "<offset>0</offset>" +
282 XMLStreamReader xsr = JAXBUtils.XMLINPUTFACTORY.createXMLStreamReader(new StringReader(xml));
283 Unmarshaller u = JAXBUtils.JAXBCONTEXT_DEVICES.createUnmarshaller();
284 DeviceListModel devices = u.unmarshal(xsr, DeviceListModel.class).getValue();
286 assertNotNull(devices);
287 assertEquals(1, devices.getDevicelist().size());
289 AVMFritzBaseModel device = devices.getDevicelist().get(0);
290 assertNotNull(device);
292 discovery.onDeviceAdded(device);
293 assertNotNull(discoveryResult);
295 assertEquals(DiscoveryResultFlag.NEW, discoveryResult.getFlag());
296 assertEquals(new ThingUID("avmfritz:FRITZ_DECT_210:1:087610000434"), discoveryResult.getThingUID());
297 assertEquals(DECT210_THING_TYPE, discoveryResult.getThingTypeUID());
298 assertEquals(BRIGE_THING_ID, discoveryResult.getBridgeUID());
299 assertEquals("087610000434", discoveryResult.getProperties().get(CONFIG_AIN));
300 assertEquals("AVM", discoveryResult.getProperties().get(PROPERTY_VENDOR));
301 assertEquals("FRITZ!DECT 210", discoveryResult.getProperties().get(PRODUCT_NAME));
302 assertEquals("087610000434", discoveryResult.getProperties().get(PROPERTY_SERIAL_NUMBER));
303 assertEquals("03.83", discoveryResult.getProperties().get(PROPERTY_FIRMWARE_VERSION));
304 assertEquals(CONFIG_AIN, discoveryResult.getRepresentationProperty());
307 @SuppressWarnings("null")
309 public void validCometDECTDiscoveryResult() throws JAXBException, XMLStreamException {
312 "<devicelist version=\"1\">" +
313 "<device identifier=\"08761 0000435\" id=\"18\" functionbitmask=\"320\" fwversion=\"03.50\" manufacturer=\"AVM\" productname=\"Comet DECT\">" +
314 "<present>1</present>" +
315 "<name>Comet DECT #1</name>" +
317 "<celsius>220</celsius>" +
318 "<offset>-10</offset>" +
322 "<tsoll>42</tsoll>" +
323 "<absenk>28</absenk>" +
324 "<komfort>42</komfort>" +
326 "<devicelock>0</devicelock>" +
327 "<errorcode>0</errorcode>" +
328 "<batterylow>0</batterylow>" +
330 "<endperiod>1484341200</endperiod>" +
331 "<tchange>28</tchange>" +
338 XMLStreamReader xsr = JAXBUtils.XMLINPUTFACTORY.createXMLStreamReader(new StringReader(xml));
339 Unmarshaller u = JAXBUtils.JAXBCONTEXT_DEVICES.createUnmarshaller();
340 DeviceListModel devices = u.unmarshal(xsr, DeviceListModel.class).getValue();
342 assertNotNull(devices);
343 assertEquals(1, devices.getDevicelist().size());
345 AVMFritzBaseModel device = devices.getDevicelist().get(0);
346 assertNotNull(device);
348 discovery.onDeviceAdded(device);
349 assertNotNull(discoveryResult);
351 assertEquals(DiscoveryResultFlag.NEW, discoveryResult.getFlag());
352 assertEquals(new ThingUID("avmfritz:Comet_DECT:1:087610000435"), discoveryResult.getThingUID());
353 assertEquals(COMETDECT_THING_TYPE, discoveryResult.getThingTypeUID());
354 assertEquals(BRIGE_THING_ID, discoveryResult.getBridgeUID());
355 assertEquals("087610000435", discoveryResult.getProperties().get(CONFIG_AIN));
356 assertEquals("AVM", discoveryResult.getProperties().get(PROPERTY_VENDOR));
357 assertEquals("Comet DECT", discoveryResult.getProperties().get(PRODUCT_NAME));
358 assertEquals("087610000435", discoveryResult.getProperties().get(PROPERTY_SERIAL_NUMBER));
359 assertEquals("03.50", discoveryResult.getProperties().get(PROPERTY_FIRMWARE_VERSION));
360 assertEquals(CONFIG_AIN, discoveryResult.getRepresentationProperty());
363 @SuppressWarnings("null")
365 public void validDECT300DiscoveryResult() throws JAXBException, XMLStreamException {
368 "<devicelist version=\"1\">" +
369 "<device identifier=\"08761 0000435\" id=\"18\" functionbitmask=\"320\" fwversion=\"03.50\" manufacturer=\"AVM\" productname=\"FRITZ!DECT 300\">" +
370 "<present>1</present>" +
371 "<name>FRITZ!DECT 300 #1</name>" +
373 "<celsius>220</celsius>" +
374 "<offset>-10</offset>" +
378 "<tsoll>42</tsoll>" +
379 "<absenk>28</absenk>" +
380 "<komfort>42</komfort>" +
382 "<devicelock>0</devicelock>" +
383 "<errorcode>0</errorcode>" +
384 "<batterylow>0</batterylow>" +
386 "<endperiod>1484341200</endperiod>" +
387 "<tchange>28</tchange>" +
394 XMLStreamReader xsr = JAXBUtils.XMLINPUTFACTORY.createXMLStreamReader(new StringReader(xml));
395 Unmarshaller u = JAXBUtils.JAXBCONTEXT_DEVICES.createUnmarshaller();
396 DeviceListModel devices = u.unmarshal(xsr, DeviceListModel.class).getValue();
398 assertNotNull(devices);
399 assertEquals(1, devices.getDevicelist().size());
401 AVMFritzBaseModel device = devices.getDevicelist().get(0);
402 assertNotNull(device);
404 discovery.onDeviceAdded(device);
405 assertNotNull(discoveryResult);
407 assertEquals(DiscoveryResultFlag.NEW, discoveryResult.getFlag());
408 assertEquals(new ThingUID("avmfritz:FRITZ_DECT_300:1:087610000435"), discoveryResult.getThingUID());
409 assertEquals(DECT300_THING_TYPE, discoveryResult.getThingTypeUID());
410 assertEquals(BRIGE_THING_ID, discoveryResult.getBridgeUID());
411 assertEquals("087610000435", discoveryResult.getProperties().get(CONFIG_AIN));
412 assertEquals("AVM", discoveryResult.getProperties().get(PROPERTY_VENDOR));
413 assertEquals("FRITZ!DECT 300", discoveryResult.getProperties().get(PRODUCT_NAME));
414 assertEquals("087610000435", discoveryResult.getProperties().get(PROPERTY_SERIAL_NUMBER));
415 assertEquals("03.50", discoveryResult.getProperties().get(PROPERTY_FIRMWARE_VERSION));
416 assertEquals(CONFIG_AIN, discoveryResult.getRepresentationProperty());
419 @SuppressWarnings("null")
421 public void validDECT301DiscoveryResult() throws JAXBException, XMLStreamException {
424 "<devicelist version=\"1\">" +
425 "<device identifier=\"08761 0000435\" id=\"18\" functionbitmask=\"320\" fwversion=\"03.50\" manufacturer=\"AVM\" productname=\"FRITZ!DECT 301\">" +
426 "<present>1</present>" +
427 "<name>FRITZ!DECT 301 #1</name>" +
429 "<celsius>220</celsius>" +
430 "<offset>-10</offset>" +
434 "<tsoll>42</tsoll>" +
435 "<absenk>28</absenk>" +
436 "<komfort>42</komfort>" +
438 "<devicelock>0</devicelock>" +
439 "<errorcode>0</errorcode>" +
440 "<batterylow>0</batterylow>" +
442 "<endperiod>1484341200</endperiod>" +
443 "<tchange>28</tchange>" +
450 XMLStreamReader xsr = JAXBUtils.XMLINPUTFACTORY.createXMLStreamReader(new StringReader(xml));
451 Unmarshaller u = JAXBUtils.JAXBCONTEXT_DEVICES.createUnmarshaller();
452 DeviceListModel devices = u.unmarshal(xsr, DeviceListModel.class).getValue();
454 assertNotNull(devices);
455 assertEquals(1, devices.getDevicelist().size());
457 AVMFritzBaseModel device = devices.getDevicelist().get(0);
458 assertNotNull(device);
460 discovery.onDeviceAdded(device);
461 assertNotNull(discoveryResult);
463 assertEquals(DiscoveryResultFlag.NEW, discoveryResult.getFlag());
464 assertEquals(new ThingUID("avmfritz:FRITZ_DECT_301:1:087610000435"), discoveryResult.getThingUID());
465 assertEquals(DECT301_THING_TYPE, discoveryResult.getThingTypeUID());
466 assertEquals(BRIGE_THING_ID, discoveryResult.getBridgeUID());
467 assertEquals("087610000435", discoveryResult.getProperties().get(CONFIG_AIN));
468 assertEquals("AVM", discoveryResult.getProperties().get(PROPERTY_VENDOR));
469 assertEquals("FRITZ!DECT 301", discoveryResult.getProperties().get(PRODUCT_NAME));
470 assertEquals("087610000435", discoveryResult.getProperties().get(PROPERTY_SERIAL_NUMBER));
471 assertEquals("03.50", discoveryResult.getProperties().get(PROPERTY_FIRMWARE_VERSION));
472 assertEquals(CONFIG_AIN, discoveryResult.getRepresentationProperty());
475 @SuppressWarnings("null")
477 public void validPowerline546EDiscoveryResult() throws JAXBException, XMLStreamException {
480 "<devicelist version=\"1\">" +
481 "<device identifier=\"5C:49:79:F0:A3:84\" id=\"19\" functionbitmask=\"640\" fwversion=\"06.92\" manufacturer=\"AVM\" productname=\"FRITZ!Powerline 546E\">" +
482 "<present>1</present>" +
483 "<name>FRITZ!Powerline 546E #1</name>" +
486 "<mode>manuell</mode>" +
488 "<devicelock>1</devicelock>" +
491 "<voltage>232850</voltage>" +
493 "<energy>2087</energy>" +
499 XMLStreamReader xsr = JAXBUtils.XMLINPUTFACTORY.createXMLStreamReader(new StringReader(xml));
500 Unmarshaller u = JAXBUtils.JAXBCONTEXT_DEVICES.createUnmarshaller();
501 DeviceListModel devices = u.unmarshal(xsr, DeviceListModel.class).getValue();
503 assertNotNull(devices);
504 assertEquals(1, devices.getDevicelist().size());
506 AVMFritzBaseModel device = devices.getDevicelist().get(0);
507 assertNotNull(device);
509 discovery.onDeviceAdded(device);
510 assertNotNull(discoveryResult);
512 assertEquals(DiscoveryResultFlag.NEW, discoveryResult.getFlag());
513 assertEquals(new ThingUID("avmfritz:FRITZ_Powerline_546E:1:5C_49_79_F0_A3_84"), discoveryResult.getThingUID());
514 assertEquals(POWERLINE546E_THING_TYPE, discoveryResult.getThingTypeUID());
515 assertEquals(BRIGE_THING_ID, discoveryResult.getBridgeUID());
516 assertEquals("5C:49:79:F0:A3:84", discoveryResult.getProperties().get(CONFIG_AIN));
517 assertEquals("AVM", discoveryResult.getProperties().get(PROPERTY_VENDOR));
518 assertEquals("FRITZ!Powerline 546E", discoveryResult.getProperties().get(PRODUCT_NAME));
519 assertEquals("5C:49:79:F0:A3:84", discoveryResult.getProperties().get(PROPERTY_SERIAL_NUMBER));
520 assertEquals("06.92", discoveryResult.getProperties().get(PROPERTY_FIRMWARE_VERSION));
521 assertEquals(CONFIG_AIN, discoveryResult.getRepresentationProperty());
524 @SuppressWarnings("null")
526 public void invalidHANFUNContactDiscoveryResult() throws JAXBException, XMLStreamException {
529 "<devicelist version=\"1\">" +
530 "<device identifier=\"11934 0059578\" id=\"406\" functionbitmask=\"1\" fwversion=\"00.00\" manufacturer=\"0x0feb\" productname=\"HAN-FUN\">" +
531 "<present>1</present>" +
532 "<name>HAN-FUN #2</name>" +
537 XMLStreamReader xsr = JAXBUtils.XMLINPUTFACTORY.createXMLStreamReader(new StringReader(xml));
538 Unmarshaller u = JAXBUtils.JAXBCONTEXT_DEVICES.createUnmarshaller();
539 DeviceListModel devices = u.unmarshal(xsr, DeviceListModel.class).getValue();
541 assertNotNull(devices);
542 assertEquals(1, devices.getDevicelist().size());
544 AVMFritzBaseModel device = devices.getDevicelist().get(0);
545 assertNotNull(device);
547 discovery.onDeviceAdded(device);
548 assertNull(discoveryResult);
551 @SuppressWarnings("null")
553 public void validHANFUNMagneticContactDiscoveryResult() throws JAXBException, XMLStreamException {
556 "<devicelist version=\"1\">" +
557 "<device identifier=\"11934 0059578-1\" id=\"2000\" functionbitmask=\"8208\" fwversion=\"0.0\" manufacturer=\"0x0feb\" productname=\"HAN-FUN\">" +
558 "<present>1</present>" +
559 "<name>HAN-FUN #2: Unit #2</name>" +
561 "<etsideviceid>406</etsideviceid>" +
562 "<unittype>513</unittype>" +
563 "<interfaces>256</interfaces>" +
572 XMLStreamReader xsr = JAXBUtils.XMLINPUTFACTORY.createXMLStreamReader(new StringReader(xml));
573 Unmarshaller u = JAXBUtils.JAXBCONTEXT_DEVICES.createUnmarshaller();
574 DeviceListModel devices = u.unmarshal(xsr, DeviceListModel.class).getValue();
576 assertNotNull(devices);
577 assertEquals(1, devices.getDevicelist().size());
579 AVMFritzBaseModel device = devices.getDevicelist().get(0);
580 assertNotNull(device);
582 discovery.onDeviceAdded(device);
583 assertNotNull(discoveryResult);
585 assertEquals(DiscoveryResultFlag.NEW, discoveryResult.getFlag());
586 assertEquals(new ThingUID("avmfritz:HAN_FUN_CONTACT:1:119340059578_1"), discoveryResult.getThingUID());
587 assertEquals(HAN_FUN_CONTACT_THING_TYPE, discoveryResult.getThingTypeUID());
588 assertEquals(BRIGE_THING_ID, discoveryResult.getBridgeUID());
589 assertEquals("119340059578-1", discoveryResult.getProperties().get(CONFIG_AIN));
590 assertEquals("0x0feb", discoveryResult.getProperties().get(PROPERTY_VENDOR));
591 assertEquals("HAN-FUN", discoveryResult.getProperties().get(PRODUCT_NAME));
592 assertEquals("119340059578-1", discoveryResult.getProperties().get(PROPERTY_SERIAL_NUMBER));
593 assertEquals("0.0", discoveryResult.getProperties().get(PROPERTY_FIRMWARE_VERSION));
594 assertEquals(CONFIG_AIN, discoveryResult.getRepresentationProperty());
597 @SuppressWarnings("null")
599 public void validHANFUNOpticalContactDiscoveryResult() throws JAXBException, XMLStreamException {
602 "<devicelist version=\"1\">" +
603 "<device identifier=\"11934 0059578-1\" id=\"2001\" functionbitmask=\"8208\" fwversion=\"0.0\" manufacturer=\"0x0feb\" productname=\"HAN-FUN\">" +
604 "<present>1</present>" +
605 "<name>HAN-FUN #3: Unit #3</name>" +
607 "<etsideviceid>406</etsideviceid>" +
608 "<unittype>514</unittype>" +
609 "<interfaces>256</interfaces>" +
618 XMLStreamReader xsr = JAXBUtils.XMLINPUTFACTORY.createXMLStreamReader(new StringReader(xml));
619 Unmarshaller u = JAXBUtils.JAXBCONTEXT_DEVICES.createUnmarshaller();
620 DeviceListModel devices = u.unmarshal(xsr, DeviceListModel.class).getValue();
622 assertNotNull(devices);
623 assertEquals(1, devices.getDevicelist().size());
625 AVMFritzBaseModel device = devices.getDevicelist().get(0);
626 assertNotNull(device);
628 discovery.onDeviceAdded(device);
629 assertNotNull(discoveryResult);
631 assertEquals(DiscoveryResultFlag.NEW, discoveryResult.getFlag());
632 assertEquals(new ThingUID("avmfritz:HAN_FUN_CONTACT:1:119340059578_1"), discoveryResult.getThingUID());
633 assertEquals(HAN_FUN_CONTACT_THING_TYPE, discoveryResult.getThingTypeUID());
634 assertEquals(BRIGE_THING_ID, discoveryResult.getBridgeUID());
635 assertEquals("119340059578-1", discoveryResult.getProperties().get(CONFIG_AIN));
636 assertEquals("0x0feb", discoveryResult.getProperties().get(PROPERTY_VENDOR));
637 assertEquals("HAN-FUN", discoveryResult.getProperties().get(PRODUCT_NAME));
638 assertEquals("119340059578-1", discoveryResult.getProperties().get(PROPERTY_SERIAL_NUMBER));
639 assertEquals("0.0", discoveryResult.getProperties().get(PROPERTY_FIRMWARE_VERSION));
640 assertEquals(CONFIG_AIN, discoveryResult.getRepresentationProperty());
643 @SuppressWarnings("null")
645 public void validHANFUNMotionSensorDiscoveryResult() throws JAXBException, XMLStreamException {
648 "<devicelist version=\"1\">" +
649 "<device identifier=\"11934 0059578-1\" id=\"2002\" functionbitmask=\"8208\" fwversion=\"0.0\" manufacturer=\"0x0feb\" productname=\"HAN-FUN\">" +
650 "<present>1</present>" +
651 "<name>HAN-FUN #3: Unit #3</name>" +
653 "<etsideviceid>408</etsideviceid>" +
654 "<unittype>515</unittype>" +
655 "<interfaces>32513,256</interfaces>" +
664 XMLStreamReader xsr = JAXBUtils.XMLINPUTFACTORY.createXMLStreamReader(new StringReader(xml));
665 Unmarshaller u = JAXBUtils.JAXBCONTEXT_DEVICES.createUnmarshaller();
666 DeviceListModel devices = u.unmarshal(xsr, DeviceListModel.class).getValue();
668 assertNotNull(devices);
669 assertEquals(1, devices.getDevicelist().size());
671 AVMFritzBaseModel device = devices.getDevicelist().get(0);
672 assertNotNull(device);
674 discovery.onDeviceAdded(device);
675 assertNotNull(discoveryResult);
677 assertEquals(DiscoveryResultFlag.NEW, discoveryResult.getFlag());
678 assertEquals(new ThingUID("avmfritz:HAN_FUN_CONTACT:1:119340059578_1"), discoveryResult.getThingUID());
679 assertEquals(HAN_FUN_CONTACT_THING_TYPE, discoveryResult.getThingTypeUID());
680 assertEquals(BRIGE_THING_ID, discoveryResult.getBridgeUID());
681 assertEquals("119340059578-1", discoveryResult.getProperties().get(CONFIG_AIN));
682 assertEquals("0x0feb", discoveryResult.getProperties().get(PROPERTY_VENDOR));
683 assertEquals("HAN-FUN", discoveryResult.getProperties().get(PRODUCT_NAME));
684 assertEquals("119340059578-1", discoveryResult.getProperties().get(PROPERTY_SERIAL_NUMBER));
685 assertEquals("0.0", discoveryResult.getProperties().get(PROPERTY_FIRMWARE_VERSION));
686 assertEquals(CONFIG_AIN, discoveryResult.getRepresentationProperty());
689 @SuppressWarnings("null")
691 public void validHANFUNMSmokeDetectorDiscoveryResult() throws JAXBException, XMLStreamException {
694 "<devicelist version=\"1\">" +
695 "<device identifier=\"11324 0059952-1\" id=\"2003\" functionbitmask=\"8208\" fwversion=\"0.0\" manufacturer=\"0x2c3c\" productname=\"HAN-FUN\">" +
696 "<present>1</present>" +
697 "<name>HAN-FUN #4: Unit #4</name>" +
699 "<etsideviceid>407</etsideviceid>" +
700 "<unittype>516</unittype>" +
701 "<interfaces>256</interfaces>" +
710 XMLStreamReader xsr = JAXBUtils.XMLINPUTFACTORY.createXMLStreamReader(new StringReader(xml));
711 Unmarshaller u = JAXBUtils.JAXBCONTEXT_DEVICES.createUnmarshaller();
712 DeviceListModel devices = u.unmarshal(xsr, DeviceListModel.class).getValue();
714 assertNotNull(devices);
715 assertEquals(1, devices.getDevicelist().size());
717 AVMFritzBaseModel device = devices.getDevicelist().get(0);
718 assertNotNull(device);
720 discovery.onDeviceAdded(device);
721 assertNotNull(discoveryResult);
723 assertEquals(DiscoveryResultFlag.NEW, discoveryResult.getFlag());
724 assertEquals(new ThingUID("avmfritz:HAN_FUN_CONTACT:1:113240059952_1"), discoveryResult.getThingUID());
725 assertEquals(HAN_FUN_CONTACT_THING_TYPE, discoveryResult.getThingTypeUID());
726 assertEquals(BRIGE_THING_ID, discoveryResult.getBridgeUID());
727 assertEquals("113240059952-1", discoveryResult.getProperties().get(CONFIG_AIN));
728 assertEquals("0x2c3c", discoveryResult.getProperties().get(PROPERTY_VENDOR));
729 assertEquals("HAN-FUN", discoveryResult.getProperties().get(PRODUCT_NAME));
730 assertEquals("113240059952-1", discoveryResult.getProperties().get(PROPERTY_SERIAL_NUMBER));
731 assertEquals("0.0", discoveryResult.getProperties().get(PROPERTY_FIRMWARE_VERSION));
732 assertEquals(CONFIG_AIN, discoveryResult.getRepresentationProperty());
735 @SuppressWarnings("null")
737 public void validHANFUNSwitchtDiscoveryResult() throws JAXBException, XMLStreamException {
740 "<devicelist version=\"1\">" +
741 "<device identifier=\"11934 0059578-1\" id=\"2001\" functionbitmask=\"8200\" fwversion=\"0.0\" manufacturer=\"0x0feb\" productname=\"HAN-FUN\">" +
742 "<present>1</present>" +
743 "<name>HAN-FUN #2: Unit #2</name>" +
745 "<etsideviceid>412</etsideviceid>" +
746 "<unittype>273</unittype>" +
747 "<interfaces>772</interfaces>" +
750 "<lastpressedtimestamp>1529590797</lastpressedtimestamp>" +
756 XMLStreamReader xsr = JAXBUtils.XMLINPUTFACTORY.createXMLStreamReader(new StringReader(xml));
757 Unmarshaller u = JAXBUtils.JAXBCONTEXT_DEVICES.createUnmarshaller();
758 DeviceListModel devices = u.unmarshal(xsr, DeviceListModel.class).getValue();
760 assertNotNull(devices);
761 assertEquals(1, devices.getDevicelist().size());
763 AVMFritzBaseModel device = devices.getDevicelist().get(0);
764 assertNotNull(device);
766 discovery.onDeviceAdded(device);
767 assertNotNull(discoveryResult);
769 assertEquals(DiscoveryResultFlag.NEW, discoveryResult.getFlag());
770 assertEquals(new ThingUID("avmfritz:HAN_FUN_SWITCH:1:119340059578_1"), discoveryResult.getThingUID());
771 assertEquals(HAN_FUN_SWITCH_THING_TYPE, discoveryResult.getThingTypeUID());
772 assertEquals(BRIGE_THING_ID, discoveryResult.getBridgeUID());
773 assertEquals("119340059578-1", discoveryResult.getProperties().get(CONFIG_AIN));
774 assertEquals("0x0feb", discoveryResult.getProperties().get(PROPERTY_VENDOR));
775 assertEquals("HAN-FUN", discoveryResult.getProperties().get(PRODUCT_NAME));
776 assertEquals("119340059578-1", discoveryResult.getProperties().get(PROPERTY_SERIAL_NUMBER));
777 assertEquals("0.0", discoveryResult.getProperties().get(PROPERTY_FIRMWARE_VERSION));
778 assertEquals(CONFIG_AIN, discoveryResult.getRepresentationProperty());
781 @SuppressWarnings("null")
783 public void validHANFUNBlindDiscoveryResult() throws JAXBException, XMLStreamException {
786 "<devicelist version=\"1\">" +
787 "<device identifier=\"14276 0503450-1\" id=\"2000\" functionbitmask=\"335888\" fwversion=\"0.0\" manufacturer=\"0x37c4\" productname=\"Rollotron 1213\">"+
788 "<present>1</present>"+
789 "<txbusy>0</txbusy>"+
790 "<name>Rollotron 1213 #1</name>"+
792 "<endpositionsset>1</endpositionsset>"+
793 "<mode>manuell</mode>"+
797 "<levelpercentage>10</levelpercentage>"+
800 "<etsideviceid>406</etsideviceid>"+
801 "<unittype>281</unittype>"+
802 "<interfaces>256,513,516,517</interfaces>"+
806 "<lastalertchgtimestamp></lastalertchgtimestamp>"+
812 XMLStreamReader xsr = JAXBUtils.XMLINPUTFACTORY.createXMLStreamReader(new StringReader(xml));
813 Unmarshaller u = JAXBUtils.JAXBCONTEXT_DEVICES.createUnmarshaller();
814 DeviceListModel devices = u.unmarshal(xsr, DeviceListModel.class).getValue();
816 assertNotNull(devices);
817 assertEquals(1, devices.getDevicelist().size());
819 AVMFritzBaseModel device = devices.getDevicelist().get(0);
820 assertNotNull(device);
822 discovery.onDeviceAdded(device);
823 assertNotNull(discoveryResult);
825 assertEquals(DiscoveryResultFlag.NEW, discoveryResult.getFlag());
826 assertEquals(new ThingUID("avmfritz:HAN_FUN_BLINDS:1:142760503450_1"), discoveryResult.getThingUID());
827 assertEquals(HAN_FUN_BLINDS_THING_TYPE, discoveryResult.getThingTypeUID());
828 assertEquals(BRIGE_THING_ID, discoveryResult.getBridgeUID());
829 assertEquals("142760503450-1", discoveryResult.getProperties().get(CONFIG_AIN));
830 assertEquals("0x37c4", discoveryResult.getProperties().get(PROPERTY_VENDOR));
831 assertEquals("Rollotron 1213", discoveryResult.getProperties().get(PRODUCT_NAME));
832 assertEquals("142760503450-1", discoveryResult.getProperties().get(PROPERTY_SERIAL_NUMBER));
833 assertEquals("0.0", discoveryResult.getProperties().get(PROPERTY_FIRMWARE_VERSION));
834 assertEquals(CONFIG_AIN, discoveryResult.getRepresentationProperty());
837 @SuppressWarnings("null")
839 public void validHeatingGroupDiscoveryResult() throws JAXBException, XMLStreamException {
842 "<devicelist version=\"1\">" +
843 "<group identifier=\"F0:A3:7F-900\" id=\"20000\" functionbitmask=\"4160\" fwversion=\"1.0\" manufacturer=\"AVM\" productname=\"\">" +
844 "<present>1</present>" +
845 "<name>Schlafzimmer</name>" +
848 "<tsoll>253</tsoll>" +
849 "<absenk>33</absenk>" +
850 "<komfort>40</komfort>" +
852 "<devicelock>0</devicelock>" +
853 "<errorcode>0</errorcode>" +
854 "<batterylow>0</batterylow>" +
855 "<windowopenactiv>0</windowopenactiv>" +
856 "<battery>1</battery>" +
858 "<endperiod>1546293600</endperiod>" +
859 "<tchange>33</tchange>" +
861 "<summeractive>1</summeractive>" +
862 "<holidayactive>0</holidayactive>" +
865 "<masterdeviceid>1000</masterdeviceid>" +
866 "<members>20000</members>" +
872 XMLStreamReader xsr = JAXBUtils.XMLINPUTFACTORY.createXMLStreamReader(new StringReader(xml));
873 Unmarshaller u = JAXBUtils.JAXBCONTEXT_DEVICES.createUnmarshaller();
874 DeviceListModel devices = u.unmarshal(xsr, DeviceListModel.class).getValue();
876 assertNotNull(devices);
877 assertEquals(1, devices.getDevicelist().size());
879 AVMFritzBaseModel device = devices.getDevicelist().get(0);
880 assertNotNull(device);
882 discovery.onDeviceAdded(device);
883 assertNotNull(discoveryResult);
885 assertEquals(DiscoveryResultFlag.NEW, discoveryResult.getFlag());
886 assertEquals(new ThingUID("avmfritz:FRITZ_GROUP_HEATING:1:F0_A3_7F_900"), discoveryResult.getThingUID());
887 assertEquals(GROUP_HEATING_THING_TYPE, discoveryResult.getThingTypeUID());
888 assertEquals(BRIGE_THING_ID, discoveryResult.getBridgeUID());
889 assertEquals("F0:A3:7F-900", discoveryResult.getProperties().get(CONFIG_AIN));
890 assertEquals("AVM", discoveryResult.getProperties().get(PROPERTY_VENDOR));
891 assertEquals("", discoveryResult.getProperties().get(PRODUCT_NAME));
892 assertEquals("F0:A3:7F-900", discoveryResult.getProperties().get(PROPERTY_SERIAL_NUMBER));
893 assertEquals("1.0", discoveryResult.getProperties().get(PROPERTY_FIRMWARE_VERSION));
894 assertEquals("1000", discoveryResult.getProperties().get(PROPERTY_MASTER));
895 assertEquals("20000", discoveryResult.getProperties().get(PROPERTY_MEMBERS));
896 assertEquals(CONFIG_AIN, discoveryResult.getRepresentationProperty());
899 @SuppressWarnings("null")
901 public void validSwitchGroupDiscoveryResult() throws JAXBException, XMLStreamException {
904 "<devicelist version=\"1\">" +
905 "<group identifier=\"F0:A3:7F-900\" id=\"20001\" functionbitmask=\"6784\" fwversion=\"1.0\" manufacturer=\"AVM\" productname=\"\">" +
906 "<present>1</present>" +
907 "<name>Schlafzimmer</name>" +
910 "<mode>manuell</mode>" +
912 "<devicelock>0</devicelock>" +
915 "<voltage>232850</voltage>" +
917 "<energy>2087</energy>" +
920 "<masterdeviceid>1000</masterdeviceid>" +
921 "<members>20000</members>" +
927 XMLStreamReader xsr = JAXBUtils.XMLINPUTFACTORY.createXMLStreamReader(new StringReader(xml));
928 Unmarshaller u = JAXBUtils.JAXBCONTEXT_DEVICES.createUnmarshaller();
929 DeviceListModel devices = u.unmarshal(xsr, DeviceListModel.class).getValue();
931 assertNotNull(devices);
932 assertEquals(1, devices.getDevicelist().size());
934 AVMFritzBaseModel device = devices.getDevicelist().get(0);
935 assertNotNull(device);
937 discovery.onDeviceAdded(device);
938 assertNotNull(discoveryResult);
940 assertEquals(DiscoveryResultFlag.NEW, discoveryResult.getFlag());
941 assertEquals(new ThingUID("avmfritz:FRITZ_GROUP_SWITCH:1:F0_A3_7F_900"), discoveryResult.getThingUID());
942 assertEquals(GROUP_SWITCH_THING_TYPE, discoveryResult.getThingTypeUID());
943 assertEquals(BRIGE_THING_ID, discoveryResult.getBridgeUID());
944 assertEquals("F0:A3:7F-900", discoveryResult.getProperties().get(CONFIG_AIN));
945 assertEquals("AVM", discoveryResult.getProperties().get(PROPERTY_VENDOR));
946 assertEquals("", discoveryResult.getProperties().get(PRODUCT_NAME));
947 assertEquals("F0:A3:7F-900", discoveryResult.getProperties().get(PROPERTY_SERIAL_NUMBER));
948 assertEquals("1.0", discoveryResult.getProperties().get(PROPERTY_FIRMWARE_VERSION));
949 assertEquals("1000", discoveryResult.getProperties().get(PROPERTY_MASTER));
950 assertEquals("20000", discoveryResult.getProperties().get(PROPERTY_MEMBERS));
951 assertEquals(CONFIG_AIN, discoveryResult.getRepresentationProperty());