2 * Copyright (c) 2010-2020 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;
25 import org.eclipse.jdt.annotation.NonNullByDefault;
26 import org.junit.jupiter.api.BeforeEach;
27 import org.junit.jupiter.api.Test;
28 import org.openhab.binding.avmfritz.internal.util.JAXBUtils;
29 import org.slf4j.Logger;
30 import org.slf4j.LoggerFactory;
33 * Tests for {@link DeviceListModel}.
35 * @author Christoph Weitkamp - Initial contribution
38 public class AVMFritzDeviceListModelTest {
40 private final Logger logger = LoggerFactory.getLogger(AVMFritzDeviceListModelTest.class);
42 private @NonNullByDefault({}) DeviceListModel devices;
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>" +
65 Unmarshaller u = JAXBUtils.JAXBCONTEXT_DEVICES.createUnmarshaller();
66 devices = (DeviceListModel) u.unmarshal(new StringReader(xml));
67 } catch (JAXBException e) {
68 logger.error("Exception creating Unmarshaller: {}", e.getLocalizedMessage(), e);
73 public void validateDeviceListModel() {
74 assertNotNull(devices);
75 assertEquals(13, devices.getDevicelist().size());
76 assertEquals("1", devices.getXmlApiVersion());
80 public void validateDECTRepeater100Model() {
81 Optional<AVMFritzBaseModel> optionalDevice = findModelByIdentifier("087610000439");
82 assertTrue(optionalDevice.isPresent());
83 assertTrue(optionalDevice.get() instanceof DeviceModel);
85 DeviceModel device = (DeviceModel) optionalDevice.get();
86 assertEquals("FRITZ!DECT Repeater 100", device.getProductName());
87 assertEquals("087610000439", device.getIdentifier());
88 assertEquals("40", device.getDeviceId());
89 assertEquals("03.86", device.getFirmwareVersion());
90 assertEquals("AVM", device.getManufacturer());
92 assertEquals(1, device.getPresent());
93 assertEquals("FRITZ!DECT Repeater 100 #5", device.getName());
95 assertFalse(device.isButton());
96 assertFalse(device.isHANFUNButton());
97 assertFalse(device.isHANFUNAlarmSensor());
98 assertTrue(device.isDectRepeater());
99 assertFalse(device.isSwitchableOutlet());
100 assertTrue(device.isTempSensor());
101 assertFalse(device.isHumiditySensor());
102 assertFalse(device.isPowermeter());
103 assertFalse(device.isHeatingThermostat());
105 assertNull(device.getSwitch());
107 assertNotNull(device.getTemperature());
108 assertEquals(new BigDecimal("23.0"), device.getTemperature().getCelsius());
109 assertEquals(new BigDecimal("0.0"), device.getTemperature().getOffset());
111 assertNull(device.getPowermeter());
113 assertNull(device.getHkr());
117 public void validateDECT200Model() {
118 Optional<AVMFritzBaseModel> optionalDevice = findModel("FRITZ!DECT 200");
119 assertTrue(optionalDevice.isPresent());
120 assertTrue(optionalDevice.get() instanceof DeviceModel);
122 DeviceModel device = (DeviceModel) optionalDevice.get();
123 assertEquals("FRITZ!DECT 200", device.getProductName());
124 assertEquals("087610000434", device.getIdentifier());
125 assertEquals("17", device.getDeviceId());
126 assertEquals("03.83", device.getFirmwareVersion());
127 assertEquals("AVM", device.getManufacturer());
129 assertEquals(1, device.getPresent());
130 assertEquals("FRITZ!DECT 200 #1", device.getName());
132 assertFalse(device.isButton());
133 assertFalse(device.isHANFUNButton());
134 assertFalse(device.isHANFUNAlarmSensor());
135 assertFalse(device.isDectRepeater());
136 assertTrue(device.isSwitchableOutlet());
137 assertTrue(device.isTempSensor());
138 assertFalse(device.isHumiditySensor());
139 assertTrue(device.isPowermeter());
140 assertFalse(device.isHeatingThermostat());
142 assertNotNull(device.getSwitch());
143 assertEquals(SwitchModel.ON, device.getSwitch().getState());
144 assertEquals(MODE_MANUAL, device.getSwitch().getMode());
145 assertEquals(BigDecimal.ZERO, device.getSwitch().getLock());
146 assertEquals(BigDecimal.ZERO, device.getSwitch().getDevicelock());
148 assertNotNull(device.getTemperature());
149 assertEquals(new BigDecimal("25.5"), device.getTemperature().getCelsius());
150 assertEquals(new BigDecimal("0.0"), device.getTemperature().getOffset());
152 validatePowerMeter(device.getPowermeter());
154 assertNull(device.getHkr());
158 public void validateDECT210Model() {
159 Optional<AVMFritzBaseModel> optionalDevice = findModel("FRITZ!DECT 210");
160 assertTrue(optionalDevice.isPresent());
161 assertTrue(optionalDevice.get() instanceof DeviceModel);
163 DeviceModel device = (DeviceModel) optionalDevice.get();
164 assertEquals("FRITZ!DECT 210", device.getProductName());
165 assertEquals("087610000438", device.getIdentifier());
166 assertEquals("18", device.getDeviceId());
167 assertEquals("03.83", device.getFirmwareVersion());
168 assertEquals("AVM", device.getManufacturer());
170 assertEquals(1, device.getPresent());
171 assertEquals("FRITZ!DECT 210 #8", device.getName());
173 assertFalse(device.isButton());
174 assertFalse(device.isHANFUNButton());
175 assertFalse(device.isHANFUNAlarmSensor());
176 assertFalse(device.isDectRepeater());
177 assertTrue(device.isSwitchableOutlet());
178 assertTrue(device.isTempSensor());
179 assertFalse(device.isHumiditySensor());
180 assertTrue(device.isPowermeter());
181 assertFalse(device.isHeatingThermostat());
183 assertNotNull(device.getSwitch());
184 assertEquals(SwitchModel.ON, device.getSwitch().getState());
185 assertEquals(MODE_MANUAL, device.getSwitch().getMode());
186 assertEquals(BigDecimal.ZERO, device.getSwitch().getLock());
187 assertEquals(BigDecimal.ZERO, device.getSwitch().getDevicelock());
189 assertNotNull(device.getTemperature());
190 assertEquals(new BigDecimal("25.5"), device.getTemperature().getCelsius());
191 assertEquals(new BigDecimal("0.0"), device.getTemperature().getOffset());
193 validatePowerMeter(device.getPowermeter());
195 assertNull(device.getHkr());
199 public void validateDECT300Model() {
200 Optional<AVMFritzBaseModel> optionalDevice = findModel("FRITZ!DECT 300");
201 assertTrue(optionalDevice.isPresent());
202 assertTrue(optionalDevice.get() instanceof DeviceModel);
204 DeviceModel device = (DeviceModel) optionalDevice.get();
205 assertEquals("FRITZ!DECT 300", device.getProductName());
206 assertEquals("087610000437", device.getIdentifier());
207 assertEquals("20", device.getDeviceId());
208 assertEquals("03.50", device.getFirmwareVersion());
209 assertEquals("AVM", device.getManufacturer());
211 assertEquals(0, device.getPresent());
212 assertEquals("FRITZ!DECT 300 #1", device.getName());
214 assertFalse(device.isButton());
215 assertFalse(device.isHANFUNButton());
216 assertFalse(device.isHANFUNAlarmSensor());
217 assertFalse(device.isDectRepeater());
218 assertFalse(device.isSwitchableOutlet());
219 assertTrue(device.isTempSensor());
220 assertFalse(device.isHumiditySensor());
221 assertFalse(device.isPowermeter());
222 assertTrue(device.isHeatingThermostat());
224 assertNull(device.getSwitch());
226 assertNotNull(device.getTemperature());
227 assertEquals(new BigDecimal("22.0"), device.getTemperature().getCelsius());
228 assertEquals(new BigDecimal("-1.0"), device.getTemperature().getOffset());
230 assertNull(device.getPowermeter());
232 validateHeatingModel(device.getHkr());
236 public void validateDECT301Model() {
237 Optional<AVMFritzBaseModel> optionalDevice = findModel("FRITZ!DECT 301");
238 assertTrue(optionalDevice.isPresent());
239 assertTrue(optionalDevice.get() instanceof DeviceModel);
241 DeviceModel device = (DeviceModel) optionalDevice.get();
242 assertEquals("FRITZ!DECT 301", device.getProductName());
243 assertEquals("087610000436", device.getIdentifier());
244 assertEquals("21", device.getDeviceId());
245 assertEquals("03.50", device.getFirmwareVersion());
246 assertEquals("AVM", device.getManufacturer());
248 assertEquals(0, device.getPresent());
249 assertEquals("FRITZ!DECT 301 #1", device.getName());
251 assertFalse(device.isButton());
252 assertFalse(device.isHANFUNButton());
253 assertFalse(device.isHANFUNAlarmSensor());
254 assertFalse(device.isDectRepeater());
255 assertFalse(device.isSwitchableOutlet());
256 assertTrue(device.isTempSensor());
257 assertFalse(device.isHumiditySensor());
258 assertFalse(device.isPowermeter());
259 assertTrue(device.isHeatingThermostat());
261 assertNull(device.getSwitch());
263 assertNotNull(device.getTemperature());
264 assertEquals(new BigDecimal("22.0"), device.getTemperature().getCelsius());
265 assertEquals(new BigDecimal("-1.0"), device.getTemperature().getOffset());
267 assertNull(device.getPowermeter());
269 validateHeatingModel(device.getHkr());
273 public void validateCometDECTModel() {
274 Optional<AVMFritzBaseModel> optionalDevice = findModel("Comet DECT");
275 assertTrue(optionalDevice.isPresent());
276 assertTrue(optionalDevice.get() instanceof DeviceModel);
278 DeviceModel device = (DeviceModel) optionalDevice.get();
279 assertEquals("Comet DECT", device.getProductName());
280 assertEquals("087610000435", device.getIdentifier());
281 assertEquals("22", device.getDeviceId());
282 assertEquals("03.50", device.getFirmwareVersion());
283 assertEquals("AVM", device.getManufacturer());
285 assertEquals(0, device.getPresent());
286 assertEquals("Comet DECT #1", device.getName());
288 assertFalse(device.isButton());
289 assertFalse(device.isHANFUNButton());
290 assertFalse(device.isHANFUNAlarmSensor());
291 assertFalse(device.isDectRepeater());
292 assertFalse(device.isSwitchableOutlet());
293 assertTrue(device.isTempSensor());
294 assertFalse(device.isHumiditySensor());
295 assertFalse(device.isPowermeter());
296 assertTrue(device.isHeatingThermostat());
298 assertNull(device.getSwitch());
300 assertNotNull(device.getTemperature());
301 assertEquals(new BigDecimal("22.0"), device.getTemperature().getCelsius());
302 assertEquals(new BigDecimal("-1.0"), device.getTemperature().getOffset());
304 assertNull(device.getPowermeter());
306 validateHeatingModel(device.getHkr());
310 public void validateDECT400Model() {
311 Optional<AVMFritzBaseModel> optionalDevice = findModelByIdentifier("130960007307");
312 assertTrue(optionalDevice.isPresent());
313 assertTrue(optionalDevice.get() instanceof DeviceModel);
315 DeviceModel device = (DeviceModel) optionalDevice.get();
316 assertEquals("FRITZ!DECT 400", device.getProductName());
317 assertEquals("130960007307", device.getIdentifier());
318 assertEquals("29", device.getDeviceId());
319 assertEquals("04.90", device.getFirmwareVersion());
320 assertEquals("AVM", device.getManufacturer());
322 assertEquals(1, device.getPresent());
323 assertEquals("FRITZ!DECT 400 #14", device.getName());
325 assertTrue(device.isButton());
326 assertFalse(device.isHANFUNButton());
327 assertFalse(device.isHANFUNAlarmSensor());
328 assertFalse(device.isDectRepeater());
329 assertFalse(device.isSwitchableOutlet());
330 assertFalse(device.isTempSensor());
331 assertFalse(device.isHumiditySensor());
332 assertFalse(device.isPowermeter());
333 assertFalse(device.isHeatingThermostat());
335 assertEquals(new BigDecimal("100"), device.getBattery());
336 assertEquals(BatteryModel.BATTERY_OFF, device.getBatterylow());
338 assertEquals(2, device.getButtons().size());
339 assertEquals("FRITZ!DECT 400 #14: kurz", device.getButtons().get(0).getName());
340 assertEquals(1549195586, device.getButtons().get(0).getLastpressedtimestamp());
341 assertEquals("FRITZ!DECT 400 #14: lang", device.getButtons().get(1).getName());
342 assertEquals(1549195595, device.getButtons().get(1).getLastpressedtimestamp());
344 assertNull(device.getAlert());
346 assertNull(device.getSwitch());
348 assertNull(device.getTemperature());
350 assertNull(device.getPowermeter());
352 assertNull(device.getHkr());
356 public void validateDECT440Model() {
357 Optional<AVMFritzBaseModel> optionalDevice = findModelByIdentifier("130960007308");
358 assertTrue(optionalDevice.isPresent());
359 assertTrue(optionalDevice.get() instanceof DeviceModel);
361 DeviceModel device = (DeviceModel) optionalDevice.get();
362 assertEquals("FRITZ!DECT 440", device.getProductName());
363 assertEquals("130960007308", device.getIdentifier());
364 assertEquals("30", device.getDeviceId());
365 assertEquals("05.10", device.getFirmwareVersion());
366 assertEquals("AVM", device.getManufacturer());
368 assertEquals(1, device.getPresent());
369 assertEquals("FRITZ!DECT 440 #15", device.getName());
371 assertTrue(device.isButton());
372 assertFalse(device.isHANFUNButton());
373 assertFalse(device.isHANFUNAlarmSensor());
374 assertFalse(device.isDectRepeater());
375 assertFalse(device.isSwitchableOutlet());
376 assertTrue(device.isTempSensor());
377 assertTrue(device.isHumiditySensor());
378 assertFalse(device.isPowermeter());
379 assertFalse(device.isHeatingThermostat());
381 assertEquals(new BigDecimal("100"), device.getBattery());
382 assertEquals(BatteryModel.BATTERY_OFF, device.getBatterylow());
384 assertEquals(4, device.getButtons().size());
385 final ButtonModel topRight = device.getButtons().get(0);
386 assertEquals("130960007308-1", topRight.getIdentifier());
387 assertEquals("5000", topRight.getButtonId());
388 assertEquals("FRITZ!DECT 440 #15: Oben rechts", topRight.getName());
389 assertEquals(1549195586, topRight.getLastpressedtimestamp());
390 final ButtonModel bottomRight = device.getButtons().get(1);
391 assertEquals("130960007308-3", bottomRight.getIdentifier());
392 assertEquals("5001", bottomRight.getButtonId());
393 assertEquals("FRITZ!DECT 440 #15: Unten rechts", bottomRight.getName());
394 assertEquals(1549195595, bottomRight.getLastpressedtimestamp());
395 final ButtonModel bottomLeft = device.getButtons().get(2);
396 assertEquals("130960007308-5", bottomLeft.getIdentifier());
397 assertEquals("5002", bottomLeft.getButtonId());
398 assertEquals("FRITZ!DECT 440 #15: Unten links", bottomLeft.getName());
399 assertEquals(1549195586, bottomLeft.getLastpressedtimestamp());
400 final ButtonModel topLeft = device.getButtons().get(3);
401 assertEquals("130960007308-7", topLeft.getIdentifier());
402 assertEquals("5003", topLeft.getButtonId());
403 assertEquals("FRITZ!DECT 440 #15: Oben links", topLeft.getName());
404 assertEquals(1549195595, topLeft.getLastpressedtimestamp());
406 assertNull(device.getAlert());
408 assertNull(device.getSwitch());
410 assertNotNull(device.getTemperature());
411 assertEquals(new BigDecimal("23.0"), device.getTemperature().getCelsius());
412 assertEquals(new BigDecimal("0.0"), device.getTemperature().getOffset());
414 assertNotNull(device.getHumidity());
415 assertEquals(new BigDecimal("43"), device.getHumidity().getRelativeHumidity());
417 assertNull(device.getPowermeter());
419 assertNull(device.getHkr());
423 public void validatePowerline546EModel() {
424 Optional<AVMFritzBaseModel> optionalDevice = findModel("FRITZ!Powerline 546E");
425 assertTrue(optionalDevice.isPresent());
426 assertTrue(optionalDevice.get() instanceof DeviceModel);
428 DeviceModel device = (DeviceModel) optionalDevice.get();
429 assertEquals("FRITZ!Powerline 546E", device.getProductName());
430 assertEquals("5C:49:79:F0:A3:84", device.getIdentifier());
431 assertEquals("30", device.getDeviceId());
432 assertEquals("06.92", device.getFirmwareVersion());
433 assertEquals("AVM", device.getManufacturer());
435 assertEquals(1, device.getPresent());
436 assertEquals("FRITZ!Powerline 546E #1", device.getName());
438 assertFalse(device.isButton());
439 assertFalse(device.isHANFUNButton());
440 assertFalse(device.isHANFUNAlarmSensor());
441 assertFalse(device.isDectRepeater());
442 assertTrue(device.isSwitchableOutlet());
443 assertFalse(device.isTempSensor());
444 assertFalse(device.isHumiditySensor());
445 assertTrue(device.isPowermeter());
446 assertFalse(device.isHeatingThermostat());
448 assertNotNull(device.getSwitch());
449 assertEquals(SwitchModel.OFF, device.getSwitch().getState());
450 assertEquals(MODE_MANUAL, device.getSwitch().getMode());
451 assertEquals(BigDecimal.ZERO, device.getSwitch().getLock());
452 assertEquals(BigDecimal.ONE, device.getSwitch().getDevicelock());
454 assertNull(device.getTemperature());
456 validatePowerMeter(device.getPowermeter());
458 assertNull(device.getHkr());
462 public void validateHANFUNContactModel() {
463 Optional<AVMFritzBaseModel> optionalDevice = findModelByIdentifier("119340059978-1");
464 assertTrue(optionalDevice.isPresent());
465 assertTrue(optionalDevice.get() instanceof DeviceModel);
467 DeviceModel device = (DeviceModel) optionalDevice.get();
468 assertEquals("HAN-FUN", device.getProductName());
469 assertEquals("119340059978-1", device.getIdentifier());
470 assertEquals("2000", device.getDeviceId());
471 assertEquals("0.0", device.getFirmwareVersion());
472 assertEquals("0x0feb", device.getManufacturer());
474 assertEquals(0, device.getPresent());
475 assertEquals("HAN-FUN #2: Unit #2", device.getName());
477 assertFalse(device.isButton());
478 assertFalse(device.isHANFUNButton());
479 assertTrue(device.isHANFUNAlarmSensor());
480 assertFalse(device.isDectRepeater());
481 assertFalse(device.isSwitchableOutlet());
482 assertFalse(device.isTempSensor());
483 assertFalse(device.isHumiditySensor());
484 assertFalse(device.isPowermeter());
485 assertFalse(device.isHeatingThermostat());
487 assertTrue(device.getButtons().isEmpty());
489 assertNotNull(device.getAlert());
490 assertEquals(BigDecimal.ONE, device.getAlert().getState());
492 assertNull(device.getSwitch());
494 assertNull(device.getTemperature());
496 assertNull(device.getPowermeter());
498 assertNull(device.getHkr());
502 public void validateHANFUNSwitchModel() {
503 Optional<AVMFritzBaseModel> optionalDevice = findModelByIdentifier("119340059979-1");
504 assertTrue(optionalDevice.isPresent());
505 assertTrue(optionalDevice.get() instanceof DeviceModel);
507 DeviceModel device = (DeviceModel) optionalDevice.get();
508 assertEquals("HAN-FUN", device.getProductName());
509 assertEquals("119340059979-1", device.getIdentifier());
510 assertEquals("2001", device.getDeviceId());
511 assertEquals("0.0", device.getFirmwareVersion());
512 assertEquals("0x0feb", device.getManufacturer());
514 assertEquals(0, device.getPresent());
515 assertEquals("HAN-FUN #2: Unit #2", device.getName());
517 assertFalse(device.isButton());
518 assertTrue(device.isHANFUNButton());
519 assertFalse(device.isHANFUNAlarmSensor());
520 assertFalse(device.isDectRepeater());
521 assertFalse(device.isSwitchableOutlet());
522 assertFalse(device.isTempSensor());
523 assertFalse(device.isHumiditySensor());
524 assertFalse(device.isPowermeter());
525 assertFalse(device.isHeatingThermostat());
527 assertEquals(1, device.getButtons().size());
528 assertEquals(1529590797, device.getButtons().get(0).getLastpressedtimestamp());
530 assertNull(device.getAlert());
532 assertNull(device.getSwitch());
534 assertNull(device.getTemperature());
536 assertNull(device.getPowermeter());
538 assertNull(device.getHkr());
542 public void validateHeatingGroupModel() {
543 Optional<AVMFritzBaseModel> optionalGroup = findModelByIdentifier("F0:A3:7F-901");
544 assertTrue(optionalGroup.isPresent());
545 assertTrue(optionalGroup.get() instanceof GroupModel);
547 GroupModel group = (GroupModel) optionalGroup.get();
548 assertEquals("", group.getProductName());
549 assertEquals("F0:A3:7F-901", group.getIdentifier());
550 assertEquals("20001", group.getDeviceId());
551 assertEquals("1.0", group.getFirmwareVersion());
552 assertEquals("AVM", group.getManufacturer());
554 assertEquals(1, group.getPresent());
555 assertEquals("Schlafzimmer", group.getName());
557 assertFalse(group.isButton());
558 assertFalse(group.isHANFUNButton());
559 assertFalse(group.isHANFUNAlarmSensor());
560 assertFalse(group.isDectRepeater());
561 assertFalse(group.isSwitchableOutlet());
562 assertFalse(group.isTempSensor());
563 assertFalse(group.isHumiditySensor());
564 assertFalse(group.isPowermeter());
565 assertTrue(group.isHeatingThermostat());
567 assertNull(group.getSwitch());
569 assertNull(group.getPowermeter());
571 validateHeatingModel(group.getHkr());
573 assertNotNull(group.getGroupinfo());
574 assertEquals("0", group.getGroupinfo().getMasterdeviceid());
575 assertEquals("20,21,22", group.getGroupinfo().getMembers());
579 public void validateSwitchGroupModel() {
580 Optional<AVMFritzBaseModel> optionalGroup = findModelByIdentifier("F0:A3:7F-900");
581 assertTrue(optionalGroup.isPresent());
582 assertTrue(optionalGroup.get() instanceof GroupModel);
584 GroupModel group = (GroupModel) optionalGroup.get();
585 assertEquals("", group.getProductName());
586 assertEquals("F0:A3:7F-900", group.getIdentifier());
587 assertEquals("20000", group.getDeviceId());
588 assertEquals("1.0", group.getFirmwareVersion());
589 assertEquals("AVM", group.getManufacturer());
591 assertEquals(1, group.getPresent());
592 assertEquals("Schlafzimmer", group.getName());
594 assertFalse(group.isButton());
595 assertFalse(group.isHANFUNButton());
596 assertFalse(group.isHANFUNAlarmSensor());
597 assertFalse(group.isDectRepeater());
598 assertTrue(group.isSwitchableOutlet());
599 assertFalse(group.isTempSensor());
600 assertFalse(group.isHumiditySensor());
601 assertTrue(group.isPowermeter());
602 assertFalse(group.isHeatingThermostat());
604 assertNotNull(group.getSwitch());
605 assertEquals(SwitchModel.ON, group.getSwitch().getState());
606 assertEquals(MODE_MANUAL, group.getSwitch().getMode());
607 assertEquals(BigDecimal.ZERO, group.getSwitch().getLock());
608 assertEquals(BigDecimal.ZERO, group.getSwitch().getDevicelock());
610 validatePowerMeter(group.getPowermeter());
612 assertNull(group.getHkr());
614 assertNotNull(group.getGroupinfo());
615 assertEquals("17", group.getGroupinfo().getMasterdeviceid());
616 assertEquals("17,18", group.getGroupinfo().getMembers());
619 private Optional<AVMFritzBaseModel> findModel(String name) {
620 return devices.getDevicelist().stream().filter(it -> name.equals(it.getProductName())).findFirst();
623 private Optional<AVMFritzBaseModel> findModelByIdentifier(String identifier) {
624 return devices.getDevicelist().stream().filter(it -> identifier.equals(it.getIdentifier())).findFirst();
627 private void validatePowerMeter(PowerMeterModel model) {
628 assertNotNull(model);
629 assertEquals(new BigDecimal("230.051"), model.getVoltage());
630 assertEquals(new BigDecimal("0.000"), model.getPower());
631 assertEquals(new BigDecimal("2087"), model.getEnergy());
634 private void validateHeatingModel(HeatingModel model) {
635 assertNotNull(model);
636 assertEquals(new BigDecimal(44), model.getTist());
637 assertEquals(new BigDecimal(42), model.getTsoll());
638 assertEquals(new BigDecimal(28), model.getAbsenk());
639 assertEquals(new BigDecimal(42), model.getKomfort());
640 assertEquals(BigDecimal.ONE, model.getLock());
641 assertEquals(BigDecimal.ONE, model.getDevicelock());
642 assertEquals(BigDecimal.ZERO, model.getWindowopenactiv());
643 assertEquals(BigDecimal.ZERO, model.getBoostactive());
644 assertEquals(new BigDecimal("100"), model.getBattery());
645 assertEquals(BatteryModel.BATTERY_OFF, model.getBatterylow());
646 assertEquals(MODE_AUTO, model.getMode());
647 assertEquals(MODE_COMFORT, model.getRadiatorMode());
649 assertNotNull(model.getNextchange());
650 assertEquals(1484341200, model.getNextchange().getEndperiod());
651 assertEquals(new BigDecimal(28), model.getNextchange().getTchange());