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.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=\"2944\" 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=\"2944\" 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>" +
65 XMLStreamReader xsr = JAXBUtils.XMLINPUTFACTORY.createXMLStreamReader(new StringReader(xml));
66 Unmarshaller u = JAXBUtils.JAXBCONTEXT_DEVICES.createUnmarshaller();
67 devices = u.unmarshal(xsr, DeviceListModel.class).getValue();
71 public void validateDeviceListModel() {
72 assertNotNull(devices);
73 assertEquals(14, devices.getDevicelist().size());
74 assertEquals("1", devices.getXmlApiVersion());
78 public void validateDECTRepeater100Model() {
79 Optional<AVMFritzBaseModel> optionalDevice = findModelByIdentifier("087610000439");
80 assertTrue(optionalDevice.isPresent());
81 assertTrue(optionalDevice.get() instanceof DeviceModel);
83 DeviceModel device = (DeviceModel) optionalDevice.get();
84 assertEquals("FRITZ!DECT Repeater 100", device.getProductName());
85 assertEquals("087610000439", device.getIdentifier());
86 assertEquals("40", device.getDeviceId());
87 assertEquals("03.86", device.getFirmwareVersion());
88 assertEquals("AVM", device.getManufacturer());
90 assertEquals(1, device.getPresent());
91 assertEquals("FRITZ!DECT Repeater 100 #5", device.getName());
93 assertFalse(device.isButton());
94 assertFalse(device.isHANFUNButton());
95 assertFalse(device.isHANFUNAlarmSensor());
96 assertTrue(device.isDectRepeater());
97 assertFalse(device.isSwitchableOutlet());
98 assertTrue(device.isTempSensor());
99 assertFalse(device.isHumiditySensor());
100 assertFalse(device.isPowermeter());
101 assertFalse(device.isHeatingThermostat());
102 assertFalse(device.isHANFUNBlinds());
104 assertNull(device.getSwitch());
106 assertNotNull(device.getTemperature());
107 assertEquals(new BigDecimal("23.0"), device.getTemperature().getCelsius());
108 assertEquals(new BigDecimal("0.0"), device.getTemperature().getOffset());
110 assertNull(device.getPowermeter());
112 assertNull(device.getHkr());
114 assertNull(device.getLevelcontrol());
118 public void validateDECT200Model() {
119 Optional<AVMFritzBaseModel> optionalDevice = findModel("FRITZ!DECT 200");
120 assertTrue(optionalDevice.isPresent());
121 assertTrue(optionalDevice.get() instanceof DeviceModel);
123 DeviceModel device = (DeviceModel) optionalDevice.get();
124 assertEquals("FRITZ!DECT 200", device.getProductName());
125 assertEquals("087610000434", device.getIdentifier());
126 assertEquals("17", device.getDeviceId());
127 assertEquals("03.83", device.getFirmwareVersion());
128 assertEquals("AVM", device.getManufacturer());
130 assertEquals(1, device.getPresent());
131 assertEquals("FRITZ!DECT 200 #1", device.getName());
133 assertFalse(device.isButton());
134 assertFalse(device.isHANFUNButton());
135 assertFalse(device.isHANFUNAlarmSensor());
136 assertFalse(device.isDectRepeater());
137 assertTrue(device.isSwitchableOutlet());
138 assertTrue(device.isTempSensor());
139 assertFalse(device.isHumiditySensor());
140 assertTrue(device.isPowermeter());
141 assertFalse(device.isHeatingThermostat());
142 assertFalse(device.isHANFUNBlinds());
144 assertNotNull(device.getSwitch());
145 assertEquals(SwitchModel.ON, device.getSwitch().getState());
146 assertEquals(MODE_MANUAL, device.getSwitch().getMode());
147 assertEquals(BigDecimal.ZERO, device.getSwitch().getLock());
148 assertEquals(BigDecimal.ZERO, device.getSwitch().getDevicelock());
150 assertNotNull(device.getTemperature());
151 assertEquals(new BigDecimal("25.5"), device.getTemperature().getCelsius());
152 assertEquals(new BigDecimal("0.0"), device.getTemperature().getOffset());
154 validatePowerMeter(device.getPowermeter());
156 assertNull(device.getHkr());
158 assertNull(device.getLevelcontrol());
162 public void validateDECT210Model() {
163 Optional<AVMFritzBaseModel> optionalDevice = findModel("FRITZ!DECT 210");
164 assertTrue(optionalDevice.isPresent());
165 assertTrue(optionalDevice.get() instanceof DeviceModel);
167 DeviceModel device = (DeviceModel) optionalDevice.get();
168 assertEquals("FRITZ!DECT 210", device.getProductName());
169 assertEquals("087610000438", device.getIdentifier());
170 assertEquals("18", device.getDeviceId());
171 assertEquals("03.83", device.getFirmwareVersion());
172 assertEquals("AVM", device.getManufacturer());
174 assertEquals(1, device.getPresent());
175 assertEquals("FRITZ!DECT 210 #8", device.getName());
177 assertFalse(device.isButton());
178 assertFalse(device.isHANFUNButton());
179 assertFalse(device.isHANFUNAlarmSensor());
180 assertFalse(device.isDectRepeater());
181 assertTrue(device.isSwitchableOutlet());
182 assertTrue(device.isTempSensor());
183 assertFalse(device.isHumiditySensor());
184 assertTrue(device.isPowermeter());
185 assertFalse(device.isHeatingThermostat());
186 assertFalse(device.isHANFUNBlinds());
188 assertNotNull(device.getSwitch());
189 assertEquals(SwitchModel.ON, device.getSwitch().getState());
190 assertEquals(MODE_MANUAL, device.getSwitch().getMode());
191 assertEquals(BigDecimal.ZERO, device.getSwitch().getLock());
192 assertEquals(BigDecimal.ZERO, device.getSwitch().getDevicelock());
194 assertNotNull(device.getTemperature());
195 assertEquals(new BigDecimal("25.5"), device.getTemperature().getCelsius());
196 assertEquals(new BigDecimal("0.0"), device.getTemperature().getOffset());
198 validatePowerMeter(device.getPowermeter());
200 assertNull(device.getHkr());
202 assertNull(device.getLevelcontrol());
206 public void validateDECT300Model() {
207 Optional<AVMFritzBaseModel> optionalDevice = findModel("FRITZ!DECT 300");
208 assertTrue(optionalDevice.isPresent());
209 assertTrue(optionalDevice.get() instanceof DeviceModel);
211 DeviceModel device = (DeviceModel) optionalDevice.get();
212 assertEquals("FRITZ!DECT 300", device.getProductName());
213 assertEquals("087610000437", device.getIdentifier());
214 assertEquals("20", device.getDeviceId());
215 assertEquals("03.50", device.getFirmwareVersion());
216 assertEquals("AVM", device.getManufacturer());
218 assertEquals(0, device.getPresent());
219 assertEquals("FRITZ!DECT 300 #1", device.getName());
221 assertFalse(device.isButton());
222 assertFalse(device.isHANFUNButton());
223 assertFalse(device.isHANFUNAlarmSensor());
224 assertFalse(device.isDectRepeater());
225 assertFalse(device.isSwitchableOutlet());
226 assertTrue(device.isTempSensor());
227 assertFalse(device.isHumiditySensor());
228 assertFalse(device.isPowermeter());
229 assertTrue(device.isHeatingThermostat());
230 assertFalse(device.isHANFUNBlinds());
232 assertNull(device.getSwitch());
234 assertNotNull(device.getTemperature());
235 assertEquals(new BigDecimal("22.0"), device.getTemperature().getCelsius());
236 assertEquals(new BigDecimal("-1.0"), device.getTemperature().getOffset());
238 assertNull(device.getPowermeter());
240 validateHeatingModel(device.getHkr());
244 public void validateDECT301Model() {
245 Optional<AVMFritzBaseModel> optionalDevice = findModel("FRITZ!DECT 301");
246 assertTrue(optionalDevice.isPresent());
247 assertTrue(optionalDevice.get() instanceof DeviceModel);
249 DeviceModel device = (DeviceModel) optionalDevice.get();
250 assertEquals("FRITZ!DECT 301", device.getProductName());
251 assertEquals("087610000436", device.getIdentifier());
252 assertEquals("21", device.getDeviceId());
253 assertEquals("03.50", device.getFirmwareVersion());
254 assertEquals("AVM", device.getManufacturer());
256 assertEquals(0, device.getPresent());
257 assertEquals("FRITZ!DECT 301 #1", device.getName());
259 assertFalse(device.isButton());
260 assertFalse(device.isHANFUNButton());
261 assertFalse(device.isHANFUNAlarmSensor());
262 assertFalse(device.isDectRepeater());
263 assertFalse(device.isSwitchableOutlet());
264 assertTrue(device.isTempSensor());
265 assertFalse(device.isHumiditySensor());
266 assertFalse(device.isPowermeter());
267 assertTrue(device.isHeatingThermostat());
268 assertFalse(device.isHANFUNBlinds());
270 assertNull(device.getSwitch());
272 assertNotNull(device.getTemperature());
273 assertEquals(new BigDecimal("22.0"), device.getTemperature().getCelsius());
274 assertEquals(new BigDecimal("-1.0"), device.getTemperature().getOffset());
276 assertNull(device.getPowermeter());
278 validateHeatingModel(device.getHkr());
282 public void validateCometDECTModel() {
283 Optional<AVMFritzBaseModel> optionalDevice = findModel("Comet DECT");
284 assertTrue(optionalDevice.isPresent());
285 assertTrue(optionalDevice.get() instanceof DeviceModel);
287 DeviceModel device = (DeviceModel) optionalDevice.get();
288 assertEquals("Comet DECT", device.getProductName());
289 assertEquals("087610000435", device.getIdentifier());
290 assertEquals("22", device.getDeviceId());
291 assertEquals("03.50", device.getFirmwareVersion());
292 assertEquals("AVM", device.getManufacturer());
294 assertEquals(0, device.getPresent());
295 assertEquals("Comet DECT #1", device.getName());
297 assertFalse(device.isButton());
298 assertFalse(device.isHANFUNButton());
299 assertFalse(device.isHANFUNAlarmSensor());
300 assertFalse(device.isDectRepeater());
301 assertFalse(device.isSwitchableOutlet());
302 assertTrue(device.isTempSensor());
303 assertFalse(device.isHumiditySensor());
304 assertFalse(device.isPowermeter());
305 assertTrue(device.isHeatingThermostat());
306 assertFalse(device.isHANFUNBlinds());
308 assertNull(device.getSwitch());
310 assertNotNull(device.getTemperature());
311 assertEquals(new BigDecimal("22.0"), device.getTemperature().getCelsius());
312 assertEquals(new BigDecimal("-1.0"), device.getTemperature().getOffset());
314 assertNull(device.getPowermeter());
316 validateHeatingModel(device.getHkr());
320 public void validateDECT400Model() {
321 Optional<AVMFritzBaseModel> optionalDevice = findModelByIdentifier("130960007307");
322 assertTrue(optionalDevice.isPresent());
323 assertTrue(optionalDevice.get() instanceof DeviceModel);
325 DeviceModel device = (DeviceModel) optionalDevice.get();
326 assertEquals("FRITZ!DECT 400", device.getProductName());
327 assertEquals("130960007307", device.getIdentifier());
328 assertEquals("29", device.getDeviceId());
329 assertEquals("04.90", device.getFirmwareVersion());
330 assertEquals("AVM", device.getManufacturer());
332 assertEquals(1, device.getPresent());
333 assertEquals("FRITZ!DECT 400 #14", device.getName());
335 assertTrue(device.isButton());
336 assertFalse(device.isHANFUNButton());
337 assertFalse(device.isHANFUNAlarmSensor());
338 assertFalse(device.isDectRepeater());
339 assertFalse(device.isSwitchableOutlet());
340 assertFalse(device.isTempSensor());
341 assertFalse(device.isHumiditySensor());
342 assertFalse(device.isPowermeter());
343 assertFalse(device.isHeatingThermostat());
344 assertFalse(device.isHANFUNBlinds());
346 assertEquals(new BigDecimal("100"), device.getBattery());
347 assertEquals(BatteryModel.BATTERY_OFF, device.getBatterylow());
349 assertEquals(2, device.getButtons().size());
350 assertEquals("FRITZ!DECT 400 #14: kurz", device.getButtons().get(0).getName());
351 assertEquals(1549195586, device.getButtons().get(0).getLastpressedtimestamp());
352 assertEquals("FRITZ!DECT 400 #14: lang", device.getButtons().get(1).getName());
353 assertEquals(1549195595, device.getButtons().get(1).getLastpressedtimestamp());
355 assertNull(device.getAlert());
357 assertNull(device.getSwitch());
359 assertNull(device.getTemperature());
361 assertNull(device.getPowermeter());
363 assertNull(device.getHkr());
365 assertNull(device.getLevelcontrol());
369 public void validateDECT440Model() {
370 Optional<AVMFritzBaseModel> optionalDevice = findModelByIdentifier("130960007308");
371 assertTrue(optionalDevice.isPresent());
372 assertTrue(optionalDevice.get() instanceof DeviceModel);
374 DeviceModel device = (DeviceModel) optionalDevice.get();
375 assertEquals("FRITZ!DECT 440", device.getProductName());
376 assertEquals("130960007308", device.getIdentifier());
377 assertEquals("30", device.getDeviceId());
378 assertEquals("05.10", device.getFirmwareVersion());
379 assertEquals("AVM", device.getManufacturer());
381 assertEquals(1, device.getPresent());
382 assertEquals("FRITZ!DECT 440 #15", device.getName());
384 assertTrue(device.isButton());
385 assertFalse(device.isHANFUNButton());
386 assertFalse(device.isHANFUNAlarmSensor());
387 assertFalse(device.isDectRepeater());
388 assertFalse(device.isSwitchableOutlet());
389 assertTrue(device.isTempSensor());
390 assertTrue(device.isHumiditySensor());
391 assertFalse(device.isPowermeter());
392 assertFalse(device.isHeatingThermostat());
393 assertFalse(device.isHANFUNBlinds());
395 assertEquals(new BigDecimal("100"), device.getBattery());
396 assertEquals(BatteryModel.BATTERY_OFF, device.getBatterylow());
398 assertEquals(4, device.getButtons().size());
399 final ButtonModel topRight = device.getButtons().get(0);
400 assertEquals("130960007308-1", topRight.getIdentifier());
401 assertEquals("5000", topRight.getButtonId());
402 assertEquals("FRITZ!DECT 440 #15: Oben rechts", topRight.getName());
403 assertEquals(1549195586, topRight.getLastpressedtimestamp());
404 final ButtonModel bottomRight = device.getButtons().get(1);
405 assertEquals("130960007308-3", bottomRight.getIdentifier());
406 assertEquals("5001", bottomRight.getButtonId());
407 assertEquals("FRITZ!DECT 440 #15: Unten rechts", bottomRight.getName());
408 assertEquals(1549195595, bottomRight.getLastpressedtimestamp());
409 final ButtonModel bottomLeft = device.getButtons().get(2);
410 assertEquals("130960007308-5", bottomLeft.getIdentifier());
411 assertEquals("5002", bottomLeft.getButtonId());
412 assertEquals("FRITZ!DECT 440 #15: Unten links", bottomLeft.getName());
413 assertEquals(1549195586, bottomLeft.getLastpressedtimestamp());
414 final ButtonModel topLeft = device.getButtons().get(3);
415 assertEquals("130960007308-7", topLeft.getIdentifier());
416 assertEquals("5003", topLeft.getButtonId());
417 assertEquals("FRITZ!DECT 440 #15: Oben links", topLeft.getName());
418 assertEquals(1549195595, topLeft.getLastpressedtimestamp());
420 assertNull(device.getAlert());
422 assertNull(device.getSwitch());
424 assertNotNull(device.getTemperature());
425 assertEquals(new BigDecimal("23.0"), device.getTemperature().getCelsius());
426 assertEquals(new BigDecimal("0.0"), device.getTemperature().getOffset());
428 assertNotNull(device.getHumidity());
429 assertEquals(new BigDecimal("43"), device.getHumidity().getRelativeHumidity());
431 assertNull(device.getPowermeter());
433 assertNull(device.getHkr());
435 assertNull(device.getLevelcontrol());
439 public void validatePowerline546EModel() {
440 Optional<AVMFritzBaseModel> optionalDevice = findModel("FRITZ!Powerline 546E");
441 assertTrue(optionalDevice.isPresent());
442 assertTrue(optionalDevice.get() instanceof DeviceModel);
444 DeviceModel device = (DeviceModel) optionalDevice.get();
445 assertEquals("FRITZ!Powerline 546E", device.getProductName());
446 assertEquals("5C:49:79:F0:A3:84", device.getIdentifier());
447 assertEquals("30", device.getDeviceId());
448 assertEquals("06.92", device.getFirmwareVersion());
449 assertEquals("AVM", device.getManufacturer());
451 assertEquals(1, device.getPresent());
452 assertEquals("FRITZ!Powerline 546E #1", device.getName());
454 assertFalse(device.isButton());
455 assertFalse(device.isHANFUNButton());
456 assertFalse(device.isHANFUNAlarmSensor());
457 assertFalse(device.isDectRepeater());
458 assertTrue(device.isSwitchableOutlet());
459 assertFalse(device.isTempSensor());
460 assertFalse(device.isHumiditySensor());
461 assertTrue(device.isPowermeter());
462 assertFalse(device.isHeatingThermostat());
463 assertFalse(device.isHANFUNBlinds());
465 assertNotNull(device.getSwitch());
466 assertEquals(SwitchModel.OFF, device.getSwitch().getState());
467 assertEquals(MODE_MANUAL, device.getSwitch().getMode());
468 assertEquals(BigDecimal.ZERO, device.getSwitch().getLock());
469 assertEquals(BigDecimal.ONE, device.getSwitch().getDevicelock());
471 assertNull(device.getTemperature());
473 validatePowerMeter(device.getPowermeter());
475 assertNull(device.getHkr());
477 assertNull(device.getLevelcontrol());
481 public void validateHANFUNContactModel() {
482 Optional<AVMFritzBaseModel> optionalDevice = findModelByIdentifier("119340059978-1");
483 assertTrue(optionalDevice.isPresent());
484 assertTrue(optionalDevice.get() instanceof DeviceModel);
486 DeviceModel device = (DeviceModel) optionalDevice.get();
487 assertEquals("HAN-FUN", device.getProductName());
488 assertEquals("119340059978-1", device.getIdentifier());
489 assertEquals("2000", device.getDeviceId());
490 assertEquals("0.0", device.getFirmwareVersion());
491 assertEquals("0x0feb", device.getManufacturer());
493 assertEquals(0, device.getPresent());
494 assertEquals("HAN-FUN #2: Unit #2", device.getName());
496 assertFalse(device.isButton());
497 assertFalse(device.isHANFUNButton());
498 assertTrue(device.isHANFUNAlarmSensor());
499 assertFalse(device.isDectRepeater());
500 assertFalse(device.isSwitchableOutlet());
501 assertFalse(device.isTempSensor());
502 assertFalse(device.isHumiditySensor());
503 assertFalse(device.isPowermeter());
504 assertFalse(device.isHeatingThermostat());
505 assertFalse(device.isHANFUNBlinds());
507 assertTrue(device.getButtons().isEmpty());
509 assertNotNull(device.getAlert());
510 assertEquals(BigDecimal.ONE, device.getAlert().getState());
512 assertNull(device.getSwitch());
514 assertNull(device.getTemperature());
516 assertNull(device.getPowermeter());
518 assertNull(device.getHkr());
520 assertNull(device.getLevelcontrol());
524 public void validateHANFUNSwitchModel() {
525 Optional<AVMFritzBaseModel> optionalDevice = findModelByIdentifier("119340059979-1");
526 assertTrue(optionalDevice.isPresent());
527 assertTrue(optionalDevice.get() instanceof DeviceModel);
529 DeviceModel device = (DeviceModel) optionalDevice.get();
530 assertEquals("HAN-FUN", device.getProductName());
531 assertEquals("119340059979-1", device.getIdentifier());
532 assertEquals("2001", device.getDeviceId());
533 assertEquals("0.0", device.getFirmwareVersion());
534 assertEquals("0x0feb", device.getManufacturer());
536 assertEquals(0, device.getPresent());
537 assertEquals("HAN-FUN #2: Unit #2", device.getName());
539 assertFalse(device.isButton());
540 assertTrue(device.isHANFUNButton());
541 assertFalse(device.isHANFUNAlarmSensor());
542 assertFalse(device.isDectRepeater());
543 assertFalse(device.isSwitchableOutlet());
544 assertFalse(device.isTempSensor());
545 assertFalse(device.isHumiditySensor());
546 assertFalse(device.isPowermeter());
547 assertFalse(device.isHeatingThermostat());
548 assertFalse(device.isHANFUNBlinds());
550 assertEquals(1, device.getButtons().size());
551 assertEquals(1529590797, device.getButtons().get(0).getLastpressedtimestamp());
553 assertNull(device.getAlert());
555 assertNull(device.getSwitch());
557 assertNull(device.getTemperature());
559 assertNull(device.getPowermeter());
561 assertNull(device.getHkr());
563 assertNull(device.getLevelcontrol());
567 public void validateHANFUNBlindModel() {
568 Optional<AVMFritzBaseModel> optionalDevice = findModelByIdentifier("142760503450-1");
569 assertTrue(optionalDevice.isPresent());
570 assertTrue(optionalDevice.get() instanceof DeviceModel);
572 DeviceModel device = (DeviceModel) optionalDevice.get();
573 assertEquals("Rollotron 1213", device.getProductName());
574 assertEquals("142760503450-1", device.getIdentifier());
575 assertEquals("2000", device.getDeviceId());
576 assertEquals("0.0", device.getFirmwareVersion());
577 assertEquals("0x37c4", device.getManufacturer());
579 assertEquals(1, device.getPresent());
580 assertEquals("Rollotron 1213 #1", device.getName());
582 assertFalse(device.isButton());
583 assertFalse(device.isHANFUNButton());
584 assertTrue(device.isHANFUNAlarmSensor());
585 assertFalse(device.isDectRepeater());
586 assertFalse(device.isSwitchableOutlet());
587 assertFalse(device.isTempSensor());
588 assertFalse(device.isHumiditySensor());
589 assertFalse(device.isPowermeter());
590 assertFalse(device.isHeatingThermostat());
591 assertTrue(device.isHANFUNBlinds());
593 assertTrue(device.getButtons().isEmpty());
595 assertNotNull(device.getAlert());
596 assertEquals(BigDecimal.ZERO, device.getAlert().getState());
598 assertNull(device.getSwitch());
600 assertNull(device.getTemperature());
602 assertNull(device.getPowermeter());
604 assertNull(device.getHkr());
606 LevelcontrolModel levelcontrol = device.getLevelcontrol();
607 assertNotNull(levelcontrol);
608 assertEquals(BigDecimal.valueOf(26L), levelcontrol.getLevel());
609 assertEquals(BigDecimal.valueOf(10L), levelcontrol.getLevelPercentage());
613 public void validateHeatingGroupModel() {
614 Optional<AVMFritzBaseModel> optionalGroup = findModelByIdentifier("F0:A3:7F-901");
615 assertTrue(optionalGroup.isPresent());
616 assertTrue(optionalGroup.get() instanceof GroupModel);
618 GroupModel group = (GroupModel) optionalGroup.get();
619 assertEquals("", group.getProductName());
620 assertEquals("F0:A3:7F-901", group.getIdentifier());
621 assertEquals("20001", group.getDeviceId());
622 assertEquals("1.0", group.getFirmwareVersion());
623 assertEquals("AVM", group.getManufacturer());
625 assertEquals(1, group.getPresent());
626 assertEquals("Schlafzimmer", group.getName());
628 assertFalse(group.isButton());
629 assertFalse(group.isHANFUNButton());
630 assertFalse(group.isHANFUNAlarmSensor());
631 assertFalse(group.isDectRepeater());
632 assertFalse(group.isSwitchableOutlet());
633 assertFalse(group.isTempSensor());
634 assertFalse(group.isHumiditySensor());
635 assertFalse(group.isPowermeter());
636 assertTrue(group.isHeatingThermostat());
637 assertFalse(group.isHANFUNBlinds());
639 assertNull(group.getSwitch());
641 assertNull(group.getPowermeter());
643 validateHeatingModel(group.getHkr());
645 assertNotNull(group.getGroupinfo());
646 assertEquals("0", group.getGroupinfo().getMasterdeviceid());
647 assertEquals("20,21,22", group.getGroupinfo().getMembers());
651 public void validateSwitchGroupModel() {
652 Optional<AVMFritzBaseModel> optionalGroup = findModelByIdentifier("F0:A3:7F-900");
653 assertTrue(optionalGroup.isPresent());
654 assertTrue(optionalGroup.get() instanceof GroupModel);
656 GroupModel group = (GroupModel) optionalGroup.get();
657 assertEquals("", group.getProductName());
658 assertEquals("F0:A3:7F-900", group.getIdentifier());
659 assertEquals("20000", group.getDeviceId());
660 assertEquals("1.0", group.getFirmwareVersion());
661 assertEquals("AVM", group.getManufacturer());
663 assertEquals(1, group.getPresent());
664 assertEquals("Schlafzimmer", group.getName());
666 assertFalse(group.isButton());
667 assertFalse(group.isHANFUNButton());
668 assertFalse(group.isHANFUNAlarmSensor());
669 assertFalse(group.isDectRepeater());
670 assertTrue(group.isSwitchableOutlet());
671 assertFalse(group.isTempSensor());
672 assertFalse(group.isHumiditySensor());
673 assertTrue(group.isPowermeter());
674 assertFalse(group.isHeatingThermostat());
675 assertFalse(group.isHANFUNBlinds());
677 assertNotNull(group.getSwitch());
678 assertEquals(SwitchModel.ON, group.getSwitch().getState());
679 assertEquals(MODE_MANUAL, group.getSwitch().getMode());
680 assertEquals(BigDecimal.ZERO, group.getSwitch().getLock());
681 assertEquals(BigDecimal.ZERO, group.getSwitch().getDevicelock());
683 validatePowerMeter(group.getPowermeter());
685 assertNull(group.getHkr());
687 assertNotNull(group.getGroupinfo());
688 assertEquals("17", group.getGroupinfo().getMasterdeviceid());
689 assertEquals("17,18", group.getGroupinfo().getMembers());
692 private Optional<AVMFritzBaseModel> findModel(String name) {
693 return devices.getDevicelist().stream().filter(it -> name.equals(it.getProductName())).findFirst();
696 private Optional<AVMFritzBaseModel> findModelByIdentifier(String identifier) {
697 return devices.getDevicelist().stream().filter(it -> identifier.equals(it.getIdentifier())).findFirst();
700 private void validatePowerMeter(PowerMeterModel model) {
701 assertNotNull(model);
702 assertEquals(new BigDecimal("230.051"), model.getVoltage());
703 assertEquals(new BigDecimal("0.000"), model.getPower());
704 assertEquals(new BigDecimal("2087"), model.getEnergy());
707 private void validateHeatingModel(HeatingModel model) {
708 assertNotNull(model);
709 assertEquals(new BigDecimal(44), model.getTist());
710 assertEquals(new BigDecimal(42), model.getTsoll());
711 assertEquals(new BigDecimal(28), model.getAbsenk());
712 assertEquals(new BigDecimal(42), model.getKomfort());
713 assertEquals(BigDecimal.ONE, model.getLock());
714 assertEquals(BigDecimal.ONE, model.getDevicelock());
715 assertEquals(BigDecimal.ZERO, model.getWindowopenactiv());
716 assertEquals(BigDecimal.ZERO, model.getBoostactive());
717 assertEquals(new BigDecimal("100"), model.getBattery());
718 assertEquals(BatteryModel.BATTERY_OFF, model.getBatterylow());
719 assertEquals(MODE_AUTO, model.getMode());
720 assertEquals(MODE_COMFORT, model.getRadiatorMode());
722 assertNotNull(model.getNextchange());
723 assertEquals(1484341200, model.getNextchange().getEndperiod());
724 assertEquals(new BigDecimal(28), model.getNextchange().getTchange());