2 * Copyright (c) 2010-2023 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.dto;
15 import static org.junit.jupiter.api.Assertions.*;
16 import static org.openhab.binding.avmfritz.internal.AVMFritzBindingConstants.*;
18 import java.io.StringReader;
19 import java.math.BigDecimal;
20 import java.util.Optional;
22 import javax.xml.bind.JAXBException;
23 import javax.xml.bind.Unmarshaller;
24 import javax.xml.stream.XMLStreamException;
25 import javax.xml.stream.XMLStreamReader;
27 import org.eclipse.jdt.annotation.NonNullByDefault;
28 import org.junit.jupiter.api.BeforeEach;
29 import org.junit.jupiter.api.Test;
30 import org.openhab.binding.avmfritz.internal.util.JAXBUtils;
33 * Tests for {@link DeviceListModel}.
35 * @author Christoph Weitkamp - Initial contribution
36 * @author Ulrich Mertin - Added support for HAN-FUN blinds
39 public class AVMFritzDeviceListModelTest {
41 private @NonNullByDefault({}) DeviceListModel devices;
43 @SuppressWarnings("null")
45 public void setUp() throws JAXBException, XMLStreamException {
48 "<devicelist version=\"1\">"
49 + "<group identifier=\"F0:A3:7F-900\" id=\"20000\" functionbitmask=\"6784\" fwversion=\"1.0\" manufacturer=\"AVM\" productname=\"\"><present>1</present><name>Schlafzimmer</name><switch><state>1</state><mode>manuell</mode><lock>0</lock><devicelock>0</devicelock></switch><powermeter><voltage>230051</voltage><power>0</power><energy>2087</energy></powermeter><groupinfo><masterdeviceid>17</masterdeviceid><members>17,18</members></groupinfo></group>"
50 + "<group identifier=\"F0:A3:7F-901\" id=\"20001\" functionbitmask=\"4160\" fwversion=\"1.0\" manufacturer=\"AVM\" productname=\"\"><present>1</present><name>Schlafzimmer</name><temperature><celsius>220</celsius><offset>-10</offset></temperature><hkr><tist>44</tist><tsoll>42</tsoll><absenk>28</absenk><komfort>42</komfort><lock>1</lock><devicelock>1</devicelock><errorcode>0</errorcode><windowopenactiv>0</windowopenactiv><windowopenactiveendtime>0</windowopenactiveendtime><boostactive>0</boostactive><boostactiveendtime>0</boostactiveendtime><batterylow>0</batterylow><battery>100</battery><nextchange><endperiod>1484341200</endperiod><tchange>28</tchange></nextchange></hkr><groupinfo><masterdeviceid>0</masterdeviceid><members>20,21,22</members></groupinfo></group>"
51 + "<device identifier=\"08761 0000434\" id=\"17\" functionbitmask=\"35712\" fwversion=\"03.83\" manufacturer=\"AVM\" productname=\"FRITZ!DECT 200\"><present>1</present><name>FRITZ!DECT 200 #1</name><switch><state>1</state><mode>manuell</mode><lock>0</lock><devicelock>0</devicelock></switch><powermeter><voltage>230051</voltage><power>0</power><energy>2087</energy></powermeter><temperature><celsius>255</celsius><offset>0</offset></temperature></device>"
52 + "<device identifier=\"08761 0000438\" id=\"18\" functionbitmask=\"35712\" fwversion=\"03.83\" manufacturer=\"AVM\" productname=\"FRITZ!DECT 210\"><present>1</present><name>FRITZ!DECT 210 #8</name><switch><state>1</state><mode>manuell</mode><lock>0</lock><devicelock>0</devicelock></switch><powermeter><voltage>230051</voltage><power>0</power><energy>2087</energy></powermeter><temperature><celsius>255</celsius><offset>0</offset></temperature></device>"
53 + "<device identifier=\"08761 0000437\" id=\"20\" functionbitmask=\"320\" fwversion=\"03.50\" manufacturer=\"AVM\" productname=\"FRITZ!DECT 300\"><present>0</present><name>FRITZ!DECT 300 #1</name><temperature><celsius>220</celsius><offset>-10</offset></temperature><hkr><tist>44</tist><tsoll>42</tsoll><absenk>28</absenk><komfort>42</komfort><lock>1</lock><devicelock>1</devicelock><errorcode>0</errorcode><windowopenactiv>0</windowopenactiv><windowopenactiveendtime>0</windowopenactiveendtime><boostactive>0</boostactive><boostactiveendtime>0</boostactiveendtime><batterylow>0</batterylow><battery>100</battery><nextchange><endperiod>1484341200</endperiod><tchange>28</tchange></nextchange></hkr></device>"
54 + "<device identifier=\"08761 0000436\" id=\"21\" functionbitmask=\"320\" fwversion=\"03.50\" manufacturer=\"AVM\" productname=\"FRITZ!DECT 301\"><present>0</present><name>FRITZ!DECT 301 #1</name><temperature><celsius>220</celsius><offset>-10</offset></temperature><hkr><tist>44</tist><tsoll>42</tsoll><absenk>28</absenk><komfort>42</komfort><lock>1</lock><devicelock>1</devicelock><errorcode>0</errorcode><windowopenactiv>0</windowopenactiv><windowopenactiveendtime>0</windowopenactiveendtime><boostactive>0</boostactive><boostactiveendtime>0</boostactiveendtime><batterylow>0</batterylow><battery>100</battery><nextchange><endperiod>1484341200</endperiod><tchange>28</tchange></nextchange></hkr></device>"
55 + "<device identifier=\"08761 0000435\" id=\"22\" functionbitmask=\"320\" fwversion=\"03.50\" manufacturer=\"AVM\" productname=\"Comet DECT\"><present>0</present><name>Comet DECT #1</name><temperature><celsius>220</celsius><offset>-10</offset></temperature><hkr><tist>44</tist><tsoll>42</tsoll><absenk>28</absenk><komfort>42</komfort><lock>1</lock><devicelock>1</devicelock><errorcode>0</errorcode><windowopenactiv>0</windowopenactiv><windowopenactiveendtime>0</windowopenactiveendtime><boostactive>0</boostactive><boostactiveendtime>0</boostactiveendtime><batterylow>0</batterylow><battery>100</battery><nextchange><endperiod>1484341200</endperiod><tchange>28</tchange></nextchange></hkr></device>"
56 + "<device identifier=\"5C:49:79:F0:A3:84\" id=\"30\" functionbitmask=\"640\" fwversion=\"06.92\" manufacturer=\"AVM\" productname=\"FRITZ!Powerline 546E\"><present>1</present><name>FRITZ!Powerline 546E #1</name><switch><state>0</state><mode>manuell</mode><lock>0</lock><devicelock>1</devicelock></switch><powermeter><voltage>230051</voltage><power>0</power><energy>2087</energy></powermeter></device>"
57 + "<device identifier=\"08761 0000439\" id=\"40\" functionbitmask=\"1280\" fwversion=\"03.86\" manufacturer=\"AVM\" productname=\"FRITZ!DECT Repeater 100\"><present>1</present><name>FRITZ!DECT Repeater 100 #5</name><temperature><celsius>230</celsius><offset>0</offset></temperature></device>"
58 + "<device identifier=\"11934 0059978-1\" id=\"2000\" functionbitmask=\"8208\" fwversion=\"0.0\" manufacturer=\"0x0feb\" productname=\"HAN-FUN\"><present>0</present><name>HAN-FUN #2: Unit #2</name><etsiunitinfo><etsideviceid>406</etsideviceid><unittype>514</unittype><interfaces>256</interfaces></etsiunitinfo><alert><state>1</state></alert></device>"
59 + "<device identifier=\"11934 0059979-1\" id=\"2001\" functionbitmask=\"8200\" fwversion=\"0.0\" manufacturer=\"0x0feb\" productname=\"HAN-FUN\"><present>0</present><name>HAN-FUN #2: Unit #2</name><etsiunitinfo><etsideviceid>412</etsideviceid><unittype>273</unittype><interfaces>772</interfaces></etsiunitinfo><button><lastpressedtimestamp>1529590797</lastpressedtimestamp></button></device>"
60 + "<device identifier=\"13096 0007307\" id=\"29\" functionbitmask=\"32\" fwversion=\"04.90\" manufacturer=\"AVM\" productname=\"FRITZ!DECT 400\"><present>1</present><name>FRITZ!DECT 400 #14</name><battery>100</battery><batterylow>0</batterylow><button identifier=\"13096 0007307-0\" id=\"5000\"><name>FRITZ!DECT 400 #14: kurz</name><lastpressedtimestamp>1549195586</lastpressedtimestamp></button><button identifier=\"13096 0007307-9\" id=\"5001\"><name>FRITZ!DECT 400 #14: lang</name><lastpressedtimestamp>1549195595</lastpressedtimestamp></button></device>"
61 + "<device identifier=\"13096 0007308\" id=\"30\" functionbitmask=\"1048864\" fwversion=\"05.10\" manufacturer=\"AVM\" productname=\"FRITZ!DECT 440\"><present>1</present><name>FRITZ!DECT 440 #15</name><temperature><celsius>230</celsius><offset>0</offset></temperature><humidity><rel_humidity>43</rel_humidity></humidity><battery>100</battery><batterylow>0</batterylow><button identifier=\"13096 0007308-1\" id=\"5000\"><name>FRITZ!DECT 440 #15: Oben rechts</name><lastpressedtimestamp>1549195586</lastpressedtimestamp></button><button identifier=\"13096 0007308-3\" id=\"5001\"><name>FRITZ!DECT 440 #15: Unten rechts</name><lastpressedtimestamp>1549195595</lastpressedtimestamp></button><button identifier=\"13096 0007308-5\" id=\"5002\"><name>FRITZ!DECT 440 #15: Unten links</name><lastpressedtimestamp>1549195586</lastpressedtimestamp></button><button identifier=\"13096 0007308-7\" id=\"5003\"><name>FRITZ!DECT 440 #15: Oben links</name><lastpressedtimestamp>1549195595</lastpressedtimestamp></button></device>"
62 + "<device identifier=\"14276 0503450-1\" id=\"2000\" functionbitmask=\"335888\" fwversion=\"0.0\" manufacturer=\"0x37c4\" productname=\"Rollotron 1213\"><present>1</present><txbusy>0</txbusy><name>Rollotron 1213 #1</name><blind><endpositionsset>1</endpositionsset><mode>manuell</mode></blind><levelcontrol><level>26</level><levelpercentage>10</levelpercentage></levelcontrol><etsiunitinfo><etsideviceid>406</etsideviceid><unittype>281</unittype><interfaces>256,513,516,517</interfaces></etsiunitinfo><alert><state>0</state><lastalertchgtimestamp></lastalertchgtimestamp></alert></device>"
63 + "<device identifier=\"11324 0824499-1\" id=\"2002\" functionbitmask=\"40960\" fwversion=\"0.0\" manufacturer=\"0x2c3c\" productname=\"HAN-FUN\">\n"
64 + " <present>1</present>\n"
65 + " <txbusy>0</txbusy>\n"
66 + " <name>Steckdose innen</name>\n"
68 + " <state>0</state>\n"
71 + " <etsideviceid>408</etsideviceid>\n"
72 + " <unittype>263</unittype>\n"
73 + " <interfaces>512,768</interfaces>\n"
74 + " </etsiunitinfo>\n"
76 + "<device identifier=\"11324 0584796-1\" id=\"2001\" functionbitmask=\"40960\" fwversion=\"0.0\" manufacturer=\"0x2c3c\" productname=\"HAN-FUN\">\n"
77 + " <present>1</present>\n"
78 + " <txbusy>0</txbusy>\n"
79 + " <name>Steckdose außen</name>\n"
81 + " <state>0</state>\n"
84 + " <etsideviceid>407</etsideviceid>\n"
85 + " <unittype>262</unittype>\n"
86 + " <interfaces>512</interfaces>\n"
87 + " </etsiunitinfo>\n"
89 + "<device identifier=\"12701 0027533-1\" id=\"2002\" functionbitmask=\"237572\" fwversion=\"0.0\" manufacturer=\"0x319d\" productname=\"HAN-FUN\">\n"
90 + " <present>0</present>\n"
91 + " <txbusy>0</txbusy>\n"
92 + " <name>SmartHome LED-Lampe #1</name>\n"
94 + " <state>0</state>\n"
97 + " <level>26</level>\n"
98 + " <levelpercentage>10</levelpercentage>\n"
99 + " </levelcontrol>\n"
100 + " <colorcontrol supported_modes=\"0\" current_mode=\"\" fullcolorsupport=\"0\" mapped=\"0\">\n"
101 + " <hue>254</hue>\n"
102 + " <saturation>100</saturation>\n"
103 + " <unmapped_hue></unmapped_hue>\n"
104 + " <unmapped_saturation></unmapped_saturation>\n"
105 + " <temperature>2700</temperature>\n"
106 + " </colorcontrol>\n"
107 + " <etsiunitinfo>\n"
108 + " <etsideviceid>407</etsideviceid>\n"
109 + " <unittype>278</unittype>\n"
110 + " <interfaces>512,514,513</interfaces>\n"
111 + " </etsiunitinfo>\n"
115 XMLStreamReader xsr = JAXBUtils.XMLINPUTFACTORY.createXMLStreamReader(new StringReader(xml));
116 Unmarshaller u = JAXBUtils.JAXBCONTEXT_DEVICES.createUnmarshaller();
117 devices = u.unmarshal(xsr, DeviceListModel.class).getValue();
121 public void validateDeviceListModel() {
122 assertNotNull(devices);
123 assertEquals(17, devices.getDevicelist().size());
124 assertEquals("1", devices.getXmlApiVersion());
128 public void validateDECTRepeater100Model() {
129 Optional<AVMFritzBaseModel> optionalDevice = findModelByIdentifier("087610000439");
130 assertTrue(optionalDevice.isPresent());
131 assertTrue(optionalDevice.get() instanceof DeviceModel);
133 DeviceModel device = (DeviceModel) optionalDevice.get();
134 assertEquals("FRITZ!DECT Repeater 100", device.getProductName());
135 assertEquals("087610000439", device.getIdentifier());
136 assertEquals("40", device.getDeviceId());
137 assertEquals("03.86", device.getFirmwareVersion());
138 assertEquals("AVM", device.getManufacturer());
140 assertEquals(1, device.getPresent());
141 assertEquals("FRITZ!DECT Repeater 100 #5", device.getName());
143 assertFalse(device.isButton());
144 assertFalse(device.isHANFUNButton());
145 assertFalse(device.isHANFUNAlarmSensor());
146 assertTrue(device.isDectRepeater());
147 assertFalse(device.isSwitchableOutlet());
148 assertTrue(device.isTemperatureSensor());
149 assertFalse(device.isHumiditySensor());
150 assertFalse(device.isPowermeter());
151 assertFalse(device.isHeatingThermostat());
152 assertFalse(device.isHANFUNBlinds());
154 assertNull(device.getSwitch());
156 assertNotNull(device.getTemperature());
157 assertEquals(new BigDecimal("23.0"), device.getTemperature().getCelsius());
158 assertEquals(new BigDecimal("0.0"), device.getTemperature().getOffset());
160 assertNull(device.getPowermeter());
162 assertNull(device.getHkr());
164 assertNull(device.getLevelControlModel());
168 public void validateDECT200Model() {
169 Optional<AVMFritzBaseModel> optionalDevice = findModel("FRITZ!DECT 200");
170 assertTrue(optionalDevice.isPresent());
171 assertTrue(optionalDevice.get() instanceof DeviceModel);
173 DeviceModel device = (DeviceModel) optionalDevice.get();
174 assertEquals("FRITZ!DECT 200", device.getProductName());
175 assertEquals("087610000434", device.getIdentifier());
176 assertEquals("17", device.getDeviceId());
177 assertEquals("03.83", device.getFirmwareVersion());
178 assertEquals("AVM", device.getManufacturer());
180 assertEquals(1, device.getPresent());
181 assertEquals("FRITZ!DECT 200 #1", device.getName());
183 assertFalse(device.isHANFUNButton());
184 assertFalse(device.isHANFUNAlarmSensor());
185 assertFalse(device.isButton());
186 assertFalse(device.isHeatingThermostat());
187 assertTrue(device.isPowermeter());
188 assertTrue(device.isTemperatureSensor());
189 assertTrue(device.isSwitchableOutlet());
190 assertFalse(device.isDectRepeater());
191 assertTrue(device.hasMicrophone());
192 assertFalse(device.isHANFUNUnit());
193 assertTrue(device.isHANFUNOnOff());
194 assertFalse(device.isHANFUNBlinds());
195 assertFalse(device.isHumiditySensor());
197 assertNotNull(device.getSwitch());
198 assertEquals(SwitchModel.ON, device.getSwitch().getState());
199 assertEquals(MODE_MANUAL, device.getSwitch().getMode());
200 assertEquals(BigDecimal.ZERO, device.getSwitch().getLock());
201 assertEquals(BigDecimal.ZERO, device.getSwitch().getDevicelock());
203 assertNotNull(device.getTemperature());
204 assertEquals(new BigDecimal("25.5"), device.getTemperature().getCelsius());
205 assertEquals(new BigDecimal("0.0"), device.getTemperature().getOffset());
207 validatePowerMeter(device.getPowermeter());
209 assertNull(device.getHkr());
211 assertNull(device.getLevelControlModel());
215 public void validateDECT210Model() {
216 Optional<AVMFritzBaseModel> optionalDevice = findModel("FRITZ!DECT 210");
217 assertTrue(optionalDevice.isPresent());
218 assertTrue(optionalDevice.get() instanceof DeviceModel);
220 DeviceModel device = (DeviceModel) optionalDevice.get();
221 assertEquals("FRITZ!DECT 210", device.getProductName());
222 assertEquals("087610000438", device.getIdentifier());
223 assertEquals("18", device.getDeviceId());
224 assertEquals("03.83", device.getFirmwareVersion());
225 assertEquals("AVM", device.getManufacturer());
227 assertEquals(1, device.getPresent());
228 assertEquals("FRITZ!DECT 210 #8", device.getName());
230 assertFalse(device.isHANFUNButton());
231 assertFalse(device.isHANFUNAlarmSensor());
232 assertFalse(device.isButton());
233 assertFalse(device.isHeatingThermostat());
234 assertTrue(device.isPowermeter());
235 assertTrue(device.isTemperatureSensor());
236 assertTrue(device.isSwitchableOutlet());
237 assertFalse(device.isDectRepeater());
238 assertTrue(device.hasMicrophone());
239 assertFalse(device.isHANFUNUnit());
240 assertTrue(device.isHANFUNOnOff());
241 assertFalse(device.isHANFUNBlinds());
242 assertFalse(device.isHumiditySensor());
244 assertNotNull(device.getSwitch());
245 assertEquals(SwitchModel.ON, device.getSwitch().getState());
246 assertEquals(MODE_MANUAL, device.getSwitch().getMode());
247 assertEquals(BigDecimal.ZERO, device.getSwitch().getLock());
248 assertEquals(BigDecimal.ZERO, device.getSwitch().getDevicelock());
250 assertNotNull(device.getTemperature());
251 assertEquals(new BigDecimal("25.5"), device.getTemperature().getCelsius());
252 assertEquals(new BigDecimal("0.0"), device.getTemperature().getOffset());
254 validatePowerMeter(device.getPowermeter());
256 assertNull(device.getHkr());
258 assertNull(device.getLevelControlModel());
262 public void validateDECT300Model() {
263 Optional<AVMFritzBaseModel> optionalDevice = findModel("FRITZ!DECT 300");
264 assertTrue(optionalDevice.isPresent());
265 assertTrue(optionalDevice.get() instanceof DeviceModel);
267 DeviceModel device = (DeviceModel) optionalDevice.get();
268 assertEquals("FRITZ!DECT 300", device.getProductName());
269 assertEquals("087610000437", device.getIdentifier());
270 assertEquals("20", device.getDeviceId());
271 assertEquals("03.50", device.getFirmwareVersion());
272 assertEquals("AVM", device.getManufacturer());
274 assertEquals(0, device.getPresent());
275 assertEquals("FRITZ!DECT 300 #1", device.getName());
277 assertFalse(device.isButton());
278 assertFalse(device.isHANFUNButton());
279 assertFalse(device.isHANFUNAlarmSensor());
280 assertFalse(device.isDectRepeater());
281 assertFalse(device.isSwitchableOutlet());
282 assertTrue(device.isTemperatureSensor());
283 assertFalse(device.isHumiditySensor());
284 assertFalse(device.isPowermeter());
285 assertTrue(device.isHeatingThermostat());
286 assertFalse(device.isHANFUNBlinds());
288 assertNull(device.getSwitch());
290 assertNotNull(device.getTemperature());
291 assertEquals(new BigDecimal("22.0"), device.getTemperature().getCelsius());
292 assertEquals(new BigDecimal("-1.0"), device.getTemperature().getOffset());
294 assertNull(device.getPowermeter());
296 validateHeatingModel(device.getHkr());
300 public void validateDECT301Model() {
301 Optional<AVMFritzBaseModel> optionalDevice = findModel("FRITZ!DECT 301");
302 assertTrue(optionalDevice.isPresent());
303 assertTrue(optionalDevice.get() instanceof DeviceModel);
305 DeviceModel device = (DeviceModel) optionalDevice.get();
306 assertEquals("FRITZ!DECT 301", device.getProductName());
307 assertEquals("087610000436", device.getIdentifier());
308 assertEquals("21", device.getDeviceId());
309 assertEquals("03.50", device.getFirmwareVersion());
310 assertEquals("AVM", device.getManufacturer());
312 assertEquals(0, device.getPresent());
313 assertEquals("FRITZ!DECT 301 #1", device.getName());
315 assertFalse(device.isButton());
316 assertFalse(device.isHANFUNButton());
317 assertFalse(device.isHANFUNAlarmSensor());
318 assertFalse(device.isDectRepeater());
319 assertFalse(device.isSwitchableOutlet());
320 assertTrue(device.isTemperatureSensor());
321 assertFalse(device.isHumiditySensor());
322 assertFalse(device.isPowermeter());
323 assertTrue(device.isHeatingThermostat());
324 assertFalse(device.isHANFUNBlinds());
326 assertNull(device.getSwitch());
328 assertNotNull(device.getTemperature());
329 assertEquals(new BigDecimal("22.0"), device.getTemperature().getCelsius());
330 assertEquals(new BigDecimal("-1.0"), device.getTemperature().getOffset());
332 assertNull(device.getPowermeter());
334 validateHeatingModel(device.getHkr());
338 public void validateCometDECTModel() {
339 Optional<AVMFritzBaseModel> optionalDevice = findModel("Comet DECT");
340 assertTrue(optionalDevice.isPresent());
341 assertTrue(optionalDevice.get() instanceof DeviceModel);
343 DeviceModel device = (DeviceModel) optionalDevice.get();
344 assertEquals("Comet DECT", device.getProductName());
345 assertEquals("087610000435", device.getIdentifier());
346 assertEquals("22", device.getDeviceId());
347 assertEquals("03.50", device.getFirmwareVersion());
348 assertEquals("AVM", device.getManufacturer());
350 assertEquals(0, device.getPresent());
351 assertEquals("Comet DECT #1", device.getName());
353 assertFalse(device.isButton());
354 assertFalse(device.isHANFUNButton());
355 assertFalse(device.isHANFUNAlarmSensor());
356 assertFalse(device.isDectRepeater());
357 assertFalse(device.isSwitchableOutlet());
358 assertTrue(device.isTemperatureSensor());
359 assertFalse(device.isHumiditySensor());
360 assertFalse(device.isPowermeter());
361 assertTrue(device.isHeatingThermostat());
362 assertFalse(device.isHANFUNBlinds());
364 assertNull(device.getSwitch());
366 assertNotNull(device.getTemperature());
367 assertEquals(new BigDecimal("22.0"), device.getTemperature().getCelsius());
368 assertEquals(new BigDecimal("-1.0"), device.getTemperature().getOffset());
370 assertNull(device.getPowermeter());
372 validateHeatingModel(device.getHkr());
376 public void validateDECT400Model() {
377 Optional<AVMFritzBaseModel> optionalDevice = findModelByIdentifier("130960007307");
378 assertTrue(optionalDevice.isPresent());
379 assertTrue(optionalDevice.get() instanceof DeviceModel);
381 DeviceModel device = (DeviceModel) optionalDevice.get();
382 assertEquals("FRITZ!DECT 400", device.getProductName());
383 assertEquals("130960007307", device.getIdentifier());
384 assertEquals("29", device.getDeviceId());
385 assertEquals("04.90", device.getFirmwareVersion());
386 assertEquals("AVM", device.getManufacturer());
388 assertEquals(1, device.getPresent());
389 assertEquals("FRITZ!DECT 400 #14", device.getName());
391 assertTrue(device.isButton());
392 assertFalse(device.isHANFUNButton());
393 assertFalse(device.isHANFUNAlarmSensor());
394 assertFalse(device.isDectRepeater());
395 assertFalse(device.isSwitchableOutlet());
396 assertFalse(device.isTemperatureSensor());
397 assertFalse(device.isHumiditySensor());
398 assertFalse(device.isPowermeter());
399 assertFalse(device.isHeatingThermostat());
400 assertFalse(device.isHANFUNBlinds());
402 assertEquals(new BigDecimal("100"), device.getBattery());
403 assertEquals(BatteryModel.BATTERY_OFF, device.getBatterylow());
405 assertEquals(2, device.getButtons().size());
406 assertEquals("FRITZ!DECT 400 #14: kurz", device.getButtons().get(0).getName());
407 assertEquals(1549195586, device.getButtons().get(0).getLastpressedtimestamp());
408 assertEquals("FRITZ!DECT 400 #14: lang", device.getButtons().get(1).getName());
409 assertEquals(1549195595, device.getButtons().get(1).getLastpressedtimestamp());
411 assertNull(device.getAlert());
413 assertNull(device.getSwitch());
415 assertNull(device.getTemperature());
417 assertNull(device.getPowermeter());
419 assertNull(device.getHkr());
421 assertNull(device.getLevelControlModel());
425 public void validateDECT440Model() {
426 Optional<AVMFritzBaseModel> optionalDevice = findModelByIdentifier("130960007308");
427 assertTrue(optionalDevice.isPresent());
428 assertTrue(optionalDevice.get() instanceof DeviceModel);
430 DeviceModel device = (DeviceModel) optionalDevice.get();
431 assertEquals("FRITZ!DECT 440", device.getProductName());
432 assertEquals("130960007308", device.getIdentifier());
433 assertEquals("30", device.getDeviceId());
434 assertEquals("05.10", device.getFirmwareVersion());
435 assertEquals("AVM", device.getManufacturer());
437 assertEquals(1, device.getPresent());
438 assertEquals("FRITZ!DECT 440 #15", device.getName());
440 assertTrue(device.isButton());
441 assertFalse(device.isHANFUNButton());
442 assertFalse(device.isHANFUNAlarmSensor());
443 assertFalse(device.isDectRepeater());
444 assertFalse(device.isSwitchableOutlet());
445 assertTrue(device.isTemperatureSensor());
446 assertTrue(device.isHumiditySensor());
447 assertFalse(device.isPowermeter());
448 assertFalse(device.isHeatingThermostat());
449 assertFalse(device.isHANFUNBlinds());
451 assertEquals(new BigDecimal("100"), device.getBattery());
452 assertEquals(BatteryModel.BATTERY_OFF, device.getBatterylow());
454 assertEquals(4, device.getButtons().size());
455 final ButtonModel topRight = device.getButtons().get(0);
456 assertEquals("130960007308-1", topRight.getIdentifier());
457 assertEquals("5000", topRight.getButtonId());
458 assertEquals("FRITZ!DECT 440 #15: Oben rechts", topRight.getName());
459 assertEquals(1549195586, topRight.getLastpressedtimestamp());
460 final ButtonModel bottomRight = device.getButtons().get(1);
461 assertEquals("130960007308-3", bottomRight.getIdentifier());
462 assertEquals("5001", bottomRight.getButtonId());
463 assertEquals("FRITZ!DECT 440 #15: Unten rechts", bottomRight.getName());
464 assertEquals(1549195595, bottomRight.getLastpressedtimestamp());
465 final ButtonModel bottomLeft = device.getButtons().get(2);
466 assertEquals("130960007308-5", bottomLeft.getIdentifier());
467 assertEquals("5002", bottomLeft.getButtonId());
468 assertEquals("FRITZ!DECT 440 #15: Unten links", bottomLeft.getName());
469 assertEquals(1549195586, bottomLeft.getLastpressedtimestamp());
470 final ButtonModel topLeft = device.getButtons().get(3);
471 assertEquals("130960007308-7", topLeft.getIdentifier());
472 assertEquals("5003", topLeft.getButtonId());
473 assertEquals("FRITZ!DECT 440 #15: Oben links", topLeft.getName());
474 assertEquals(1549195595, topLeft.getLastpressedtimestamp());
476 assertNull(device.getAlert());
478 assertNull(device.getSwitch());
480 assertNotNull(device.getTemperature());
481 assertEquals(new BigDecimal("23.0"), device.getTemperature().getCelsius());
482 assertEquals(new BigDecimal("0.0"), device.getTemperature().getOffset());
484 assertNotNull(device.getHumidity());
485 assertEquals(new BigDecimal("43"), device.getHumidity().getRelativeHumidity());
487 assertNull(device.getPowermeter());
489 assertNull(device.getHkr());
491 assertNull(device.getLevelControlModel());
495 public void validatePowerline546EModel() {
496 Optional<AVMFritzBaseModel> optionalDevice = findModel("FRITZ!Powerline 546E");
497 assertTrue(optionalDevice.isPresent());
498 assertTrue(optionalDevice.get() instanceof DeviceModel);
500 DeviceModel device = (DeviceModel) optionalDevice.get();
501 assertEquals("FRITZ!Powerline 546E", device.getProductName());
502 assertEquals("5C:49:79:F0:A3:84", device.getIdentifier());
503 assertEquals("30", device.getDeviceId());
504 assertEquals("06.92", device.getFirmwareVersion());
505 assertEquals("AVM", device.getManufacturer());
507 assertEquals(1, device.getPresent());
508 assertEquals("FRITZ!Powerline 546E #1", device.getName());
510 assertFalse(device.isButton());
511 assertFalse(device.isHANFUNButton());
512 assertFalse(device.isHANFUNAlarmSensor());
513 assertFalse(device.isDectRepeater());
514 assertTrue(device.isSwitchableOutlet());
515 assertFalse(device.isTemperatureSensor());
516 assertFalse(device.isHumiditySensor());
517 assertTrue(device.isPowermeter());
518 assertFalse(device.isHeatingThermostat());
519 assertFalse(device.isHANFUNBlinds());
521 assertNotNull(device.getSwitch());
522 assertEquals(SwitchModel.OFF, device.getSwitch().getState());
523 assertEquals(MODE_MANUAL, device.getSwitch().getMode());
524 assertEquals(BigDecimal.ZERO, device.getSwitch().getLock());
525 assertEquals(BigDecimal.ONE, device.getSwitch().getDevicelock());
527 assertNull(device.getTemperature());
529 validatePowerMeter(device.getPowermeter());
531 assertNull(device.getHkr());
533 assertNull(device.getLevelControlModel());
537 public void validateHANFUNContactModel() {
538 Optional<AVMFritzBaseModel> optionalDevice = findModelByIdentifier("119340059978-1");
539 assertTrue(optionalDevice.isPresent());
540 assertTrue(optionalDevice.get() instanceof DeviceModel);
542 DeviceModel device = (DeviceModel) optionalDevice.get();
543 assertEquals("HAN-FUN", device.getProductName());
544 assertEquals("119340059978-1", device.getIdentifier());
545 assertEquals("2000", device.getDeviceId());
546 assertEquals("0.0", device.getFirmwareVersion());
547 assertEquals("0x0feb", device.getManufacturer());
549 assertEquals(0, device.getPresent());
550 assertEquals("HAN-FUN #2: Unit #2", device.getName());
552 assertFalse(device.isButton());
553 assertFalse(device.isHANFUNButton());
554 assertTrue(device.isHANFUNAlarmSensor());
555 assertFalse(device.isDectRepeater());
556 assertFalse(device.isSwitchableOutlet());
557 assertFalse(device.isTemperatureSensor());
558 assertFalse(device.isHumiditySensor());
559 assertFalse(device.isPowermeter());
560 assertFalse(device.isHeatingThermostat());
561 assertFalse(device.isHANFUNBlinds());
563 assertTrue(device.getButtons().isEmpty());
565 assertNotNull(device.getAlert());
566 assertEquals(BigDecimal.ONE, device.getAlert().getState());
568 assertNull(device.getSwitch());
570 assertNull(device.getTemperature());
572 assertNull(device.getPowermeter());
574 assertNull(device.getHkr());
576 assertNull(device.getLevelControlModel());
580 public void validateHANFUNSwitchModel() {
581 Optional<AVMFritzBaseModel> optionalDevice = findModelByIdentifier("119340059979-1");
582 assertTrue(optionalDevice.isPresent());
583 assertTrue(optionalDevice.get() instanceof DeviceModel);
585 DeviceModel device = (DeviceModel) optionalDevice.get();
586 assertEquals("HAN-FUN", device.getProductName());
587 assertEquals("119340059979-1", device.getIdentifier());
588 assertEquals("2001", device.getDeviceId());
589 assertEquals("0.0", device.getFirmwareVersion());
590 assertEquals("0x0feb", device.getManufacturer());
592 assertEquals(0, device.getPresent());
593 assertEquals("HAN-FUN #2: Unit #2", device.getName());
595 assertFalse(device.isButton());
596 assertTrue(device.isHANFUNButton());
597 assertFalse(device.isHANFUNAlarmSensor());
598 assertFalse(device.isDectRepeater());
599 assertFalse(device.isSwitchableOutlet());
600 assertFalse(device.isTemperatureSensor());
601 assertFalse(device.isHumiditySensor());
602 assertFalse(device.isPowermeter());
603 assertFalse(device.isHeatingThermostat());
604 assertFalse(device.isHANFUNBlinds());
606 assertEquals(1, device.getButtons().size());
607 assertEquals(1529590797, device.getButtons().get(0).getLastpressedtimestamp());
609 assertNull(device.getAlert());
611 assertNull(device.getSwitch());
613 assertNull(device.getTemperature());
615 assertNull(device.getPowermeter());
617 assertNull(device.getHkr());
619 assertNull(device.getLevelControlModel());
623 public void validateHANFUNBlindModel() {
624 Optional<AVMFritzBaseModel> optionalDevice = findModelByIdentifier("142760503450-1");
625 assertTrue(optionalDevice.isPresent());
626 assertTrue(optionalDevice.get() instanceof DeviceModel);
628 DeviceModel device = (DeviceModel) optionalDevice.get();
629 assertEquals("Rollotron 1213", device.getProductName());
630 assertEquals("142760503450-1", device.getIdentifier());
631 assertEquals("2000", device.getDeviceId());
632 assertEquals("0.0", device.getFirmwareVersion());
633 assertEquals("0x37c4", device.getManufacturer());
635 assertEquals(1, device.getPresent());
636 assertEquals("Rollotron 1213 #1", device.getName());
638 assertFalse(device.isHANFUNDevice());
639 assertFalse(device.isHANFUNButton());
640 assertTrue(device.isHANFUNAlarmSensor());
641 assertFalse(device.isButton());
642 assertFalse(device.isSwitchableOutlet());
643 assertFalse(device.isTemperatureSensor());
644 assertFalse(device.isHumiditySensor());
645 assertFalse(device.isPowermeter());
646 assertFalse(device.isDectRepeater());
647 assertFalse(device.isHeatingThermostat());
648 assertFalse(device.hasMicrophone());
649 assertTrue(device.isHANFUNUnit());
650 assertTrue(device.isHANFUNOnOff());
651 assertTrue(device.isDimmableLight());
652 assertFalse(device.isColorLight());
653 assertTrue(device.isHANFUNBlinds());
655 assertTrue(device.getButtons().isEmpty());
657 assertNotNull(device.getAlert());
658 assertEquals(BigDecimal.ZERO, device.getAlert().getState());
660 assertNull(device.getSwitch());
662 assertNull(device.getTemperature());
664 assertNull(device.getPowermeter());
666 assertNull(device.getHkr());
668 LevelControlModel levelcontrol = device.getLevelControlModel();
669 assertNotNull(levelcontrol);
670 assertEquals(BigDecimal.valueOf(26L), levelcontrol.getLevel());
671 assertEquals(BigDecimal.valueOf(10L), levelcontrol.getLevelPercentage());
675 public void validateHANFUNColorLightModel() {
676 Optional<AVMFritzBaseModel> optionalDevice = findModelByIdentifier("127010027533-1");
677 assertTrue(optionalDevice.isPresent());
678 assertTrue(optionalDevice.get() instanceof DeviceModel);
680 DeviceModel device = (DeviceModel) optionalDevice.get();
681 assertEquals("HAN-FUN", device.getProductName());
682 assertEquals("127010027533-1", device.getIdentifier());
683 assertEquals("2002", device.getDeviceId());
684 assertEquals("0.0", device.getFirmwareVersion());
685 assertEquals("0x319d", device.getManufacturer());
687 assertEquals(0, device.getPresent());
688 assertEquals("SmartHome LED-Lampe #1", device.getName());
690 assertFalse(device.isHANFUNDevice());
691 assertFalse(device.isHANFUNButton());
692 assertFalse(device.isHANFUNAlarmSensor());
693 assertFalse(device.isButton());
694 assertFalse(device.isSwitchableOutlet());
695 assertFalse(device.isTemperatureSensor());
696 assertFalse(device.isHumiditySensor());
697 assertFalse(device.isPowermeter());
698 assertFalse(device.isDectRepeater());
699 assertFalse(device.isHeatingThermostat());
700 assertFalse(device.hasMicrophone());
701 assertTrue(device.isHANFUNUnit());
702 assertTrue(device.isHANFUNOnOff());
703 assertTrue(device.isDimmableLight());
704 assertTrue(device.isColorLight());
705 assertFalse(device.isHANFUNBlinds());
707 assertTrue(device.getButtons().isEmpty());
709 assertNull(device.getAlert());
711 assertNull(device.getSwitch());
713 assertNull(device.getTemperature());
715 assertNull(device.getPowermeter());
717 assertNull(device.getHkr());
719 LevelControlModel levelcontrol = device.getLevelControlModel();
720 assertNotNull(levelcontrol);
721 assertEquals(BigDecimal.valueOf(26L), levelcontrol.getLevel());
722 assertEquals(BigDecimal.valueOf(10L), levelcontrol.getLevelPercentage());
724 ColorControlModel colorModel = device.getColorControlModel();
725 assertNotNull(colorModel);
726 assertEquals(254, colorModel.hue);
727 assertEquals(100, colorModel.saturation);
728 assertEquals(0, colorModel.unmappedHue);
729 assertEquals(0, colorModel.unmappedSaturation);
730 assertEquals(2700, colorModel.temperature);
734 public void validateHANFUNOnOffModel() {
735 Optional<AVMFritzBaseModel> optionalDevice = findModelByIdentifier("113240824499-1");
736 assertTrue(optionalDevice.isPresent());
737 assertTrue(optionalDevice.get() instanceof DeviceModel);
739 DeviceModel device = (DeviceModel) optionalDevice.get();
740 assertEquals("HAN-FUN", device.getProductName());
741 assertEquals("113240824499-1", device.getIdentifier());
742 assertEquals("2002", device.getDeviceId());
743 assertEquals("0.0", device.getFirmwareVersion());
744 assertEquals("0x2c3c", device.getManufacturer());
746 assertEquals(1, device.getPresent());
747 assertEquals("Steckdose innen", device.getName());
749 assertFalse(device.isHANFUNButton());
750 assertFalse(device.isHANFUNAlarmSensor());
751 assertFalse(device.isButton());
752 assertFalse(device.isHeatingThermostat());
753 assertFalse(device.isPowermeter());
754 assertFalse(device.isTemperatureSensor());
755 assertFalse(device.isSwitchableOutlet());
756 assertFalse(device.isDectRepeater());
757 assertFalse(device.hasMicrophone());
758 assertTrue(device.isHANFUNUnit());
759 assertTrue(device.isHANFUNOnOff());
760 assertFalse(device.isHANFUNBlinds());
761 assertFalse(device.isHumiditySensor());
763 assertTrue(device.getButtons().isEmpty());
765 assertNull(device.getAlert());
767 assertNull(device.getSwitch());
769 assertNull(device.getTemperature());
771 SimpleOnOffModel model = device.getSimpleOnOffUnit();
772 assertNotNull(model);
773 assertEquals(false, model.state);
775 assertNull(device.getPowermeter());
777 assertNull(device.getHkr());
779 assertNull(device.getLevelControlModel());
783 public void validateHeatingGroupModel() {
784 Optional<AVMFritzBaseModel> optionalGroup = findModelByIdentifier("F0:A3:7F-901");
785 assertTrue(optionalGroup.isPresent());
786 assertTrue(optionalGroup.get() instanceof GroupModel);
788 GroupModel group = (GroupModel) optionalGroup.get();
789 assertEquals("", group.getProductName());
790 assertEquals("F0:A3:7F-901", group.getIdentifier());
791 assertEquals("20001", group.getDeviceId());
792 assertEquals("1.0", group.getFirmwareVersion());
793 assertEquals("AVM", group.getManufacturer());
795 assertEquals(1, group.getPresent());
796 assertEquals("Schlafzimmer", group.getName());
798 assertFalse(group.isButton());
799 assertFalse(group.isHANFUNButton());
800 assertFalse(group.isHANFUNAlarmSensor());
801 assertFalse(group.isDectRepeater());
802 assertFalse(group.isSwitchableOutlet());
803 assertFalse(group.isTemperatureSensor());
804 assertFalse(group.isHumiditySensor());
805 assertFalse(group.isPowermeter());
806 assertTrue(group.isHeatingThermostat());
807 assertFalse(group.isHANFUNBlinds());
809 assertNull(group.getSwitch());
811 assertNull(group.getPowermeter());
813 validateHeatingModel(group.getHkr());
815 assertNotNull(group.getGroupinfo());
816 assertEquals("0", group.getGroupinfo().getMasterdeviceid());
817 assertEquals("20,21,22", group.getGroupinfo().getMembers());
821 public void validateSwitchGroupModel() {
822 Optional<AVMFritzBaseModel> optionalGroup = findModelByIdentifier("F0:A3:7F-900");
823 assertTrue(optionalGroup.isPresent());
824 assertTrue(optionalGroup.get() instanceof GroupModel);
826 GroupModel group = (GroupModel) optionalGroup.get();
827 assertEquals("", group.getProductName());
828 assertEquals("F0:A3:7F-900", group.getIdentifier());
829 assertEquals("20000", group.getDeviceId());
830 assertEquals("1.0", group.getFirmwareVersion());
831 assertEquals("AVM", group.getManufacturer());
833 assertEquals(1, group.getPresent());
834 assertEquals("Schlafzimmer", group.getName());
836 assertFalse(group.isButton());
837 assertFalse(group.isHANFUNButton());
838 assertFalse(group.isHANFUNAlarmSensor());
839 assertFalse(group.isDectRepeater());
840 assertTrue(group.isSwitchableOutlet());
841 assertFalse(group.isTemperatureSensor());
842 assertFalse(group.isHumiditySensor());
843 assertTrue(group.isPowermeter());
844 assertFalse(group.isHeatingThermostat());
845 assertFalse(group.isHANFUNBlinds());
847 assertNotNull(group.getSwitch());
848 assertEquals(SwitchModel.ON, group.getSwitch().getState());
849 assertEquals(MODE_MANUAL, group.getSwitch().getMode());
850 assertEquals(BigDecimal.ZERO, group.getSwitch().getLock());
851 assertEquals(BigDecimal.ZERO, group.getSwitch().getDevicelock());
853 validatePowerMeter(group.getPowermeter());
855 assertNull(group.getHkr());
857 assertNotNull(group.getGroupinfo());
858 assertEquals("17", group.getGroupinfo().getMasterdeviceid());
859 assertEquals("17,18", group.getGroupinfo().getMembers());
862 private Optional<AVMFritzBaseModel> findModel(String name) {
863 return devices.getDevicelist().stream().filter(it -> name.equals(it.getProductName())).findFirst();
866 private Optional<AVMFritzBaseModel> findModelByIdentifier(String identifier) {
867 return devices.getDevicelist().stream().filter(it -> identifier.equals(it.getIdentifier())).findFirst();
870 private void validatePowerMeter(PowerMeterModel model) {
871 assertNotNull(model);
872 assertEquals(new BigDecimal("230.051"), model.getVoltage());
873 assertEquals(new BigDecimal("0.000"), model.getPower());
874 assertEquals(new BigDecimal("2087"), model.getEnergy());
877 private void validateHeatingModel(HeatingModel model) {
878 assertNotNull(model);
879 assertEquals(new BigDecimal(44), model.getTist());
880 assertEquals(new BigDecimal(42), model.getTsoll());
881 assertEquals(new BigDecimal(28), model.getAbsenk());
882 assertEquals(new BigDecimal(42), model.getKomfort());
883 assertEquals(BigDecimal.ONE, model.getLock());
884 assertEquals(BigDecimal.ONE, model.getDevicelock());
885 assertEquals(BigDecimal.ZERO, model.getWindowopenactiv());
886 assertEquals(BigDecimal.ZERO, model.getBoostactive());
887 assertEquals(new BigDecimal("100"), model.getBattery());
888 assertEquals(BatteryModel.BATTERY_OFF, model.getBatterylow());
889 assertEquals(MODE_AUTO, model.getMode());
890 assertEquals(MODE_COMFORT, model.getRadiatorMode());
892 assertNotNull(model.getNextchange());
893 assertEquals(1484341200, model.getNextchange().getEndperiod());
894 assertEquals(new BigDecimal(28), model.getNextchange().getTchange());