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;
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
36 * @author Ulrich Mertin - Added support for HAN-FUN blinds
39 public class AVMFritzDeviceListModelTest {
41 private final Logger logger = LoggerFactory.getLogger(AVMFritzDeviceListModelTest.class);
43 private @NonNullByDefault({}) DeviceListModel devices;
49 "<devicelist version=\"1\">" +
50 "<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>" +
51 "<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>" +
52 "<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>" +
53 "<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>" +
54 "<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>" +
55 "<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>" +
56 "<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>" +
57 "<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>" +
58 "<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>" +
59 "<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>" +
60 "<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>" +
61 "<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>" +
62 "<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>" +
63 "<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>" +
67 Unmarshaller u = JAXBUtils.JAXBCONTEXT_DEVICES.createUnmarshaller();
68 devices = (DeviceListModel) u.unmarshal(new StringReader(xml));
69 } catch (JAXBException e) {
70 logger.error("Exception creating Unmarshaller: {}", e.getLocalizedMessage(), e);
75 public void validateDeviceListModel() {
76 assertNotNull(devices);
77 assertEquals(14, devices.getDevicelist().size());
78 assertEquals("1", devices.getXmlApiVersion());
82 public void validateDECTRepeater100Model() {
83 Optional<AVMFritzBaseModel> optionalDevice = findModelByIdentifier("087610000439");
84 assertTrue(optionalDevice.isPresent());
85 assertTrue(optionalDevice.get() instanceof DeviceModel);
87 DeviceModel device = (DeviceModel) optionalDevice.get();
88 assertEquals("FRITZ!DECT Repeater 100", device.getProductName());
89 assertEquals("087610000439", device.getIdentifier());
90 assertEquals("40", device.getDeviceId());
91 assertEquals("03.86", device.getFirmwareVersion());
92 assertEquals("AVM", device.getManufacturer());
94 assertEquals(1, device.getPresent());
95 assertEquals("FRITZ!DECT Repeater 100 #5", device.getName());
97 assertFalse(device.isButton());
98 assertFalse(device.isHANFUNButton());
99 assertFalse(device.isHANFUNAlarmSensor());
100 assertTrue(device.isDectRepeater());
101 assertFalse(device.isSwitchableOutlet());
102 assertTrue(device.isTempSensor());
103 assertFalse(device.isHumiditySensor());
104 assertFalse(device.isPowermeter());
105 assertFalse(device.isHeatingThermostat());
106 assertFalse(device.isHANFUNBlinds());
108 assertNull(device.getSwitch());
110 assertNotNull(device.getTemperature());
111 assertEquals(new BigDecimal("23.0"), device.getTemperature().getCelsius());
112 assertEquals(new BigDecimal("0.0"), device.getTemperature().getOffset());
114 assertNull(device.getPowermeter());
116 assertNull(device.getHkr());
118 assertNull(device.getLevelcontrol());
122 public void validateDECT200Model() {
123 Optional<AVMFritzBaseModel> optionalDevice = findModel("FRITZ!DECT 200");
124 assertTrue(optionalDevice.isPresent());
125 assertTrue(optionalDevice.get() instanceof DeviceModel);
127 DeviceModel device = (DeviceModel) optionalDevice.get();
128 assertEquals("FRITZ!DECT 200", device.getProductName());
129 assertEquals("087610000434", device.getIdentifier());
130 assertEquals("17", device.getDeviceId());
131 assertEquals("03.83", device.getFirmwareVersion());
132 assertEquals("AVM", device.getManufacturer());
134 assertEquals(1, device.getPresent());
135 assertEquals("FRITZ!DECT 200 #1", device.getName());
137 assertFalse(device.isButton());
138 assertFalse(device.isHANFUNButton());
139 assertFalse(device.isHANFUNAlarmSensor());
140 assertFalse(device.isDectRepeater());
141 assertTrue(device.isSwitchableOutlet());
142 assertTrue(device.isTempSensor());
143 assertFalse(device.isHumiditySensor());
144 assertTrue(device.isPowermeter());
145 assertFalse(device.isHeatingThermostat());
146 assertFalse(device.isHANFUNBlinds());
148 assertNotNull(device.getSwitch());
149 assertEquals(SwitchModel.ON, device.getSwitch().getState());
150 assertEquals(MODE_MANUAL, device.getSwitch().getMode());
151 assertEquals(BigDecimal.ZERO, device.getSwitch().getLock());
152 assertEquals(BigDecimal.ZERO, device.getSwitch().getDevicelock());
154 assertNotNull(device.getTemperature());
155 assertEquals(new BigDecimal("25.5"), device.getTemperature().getCelsius());
156 assertEquals(new BigDecimal("0.0"), device.getTemperature().getOffset());
158 validatePowerMeter(device.getPowermeter());
160 assertNull(device.getHkr());
162 assertNull(device.getLevelcontrol());
166 public void validateDECT210Model() {
167 Optional<AVMFritzBaseModel> optionalDevice = findModel("FRITZ!DECT 210");
168 assertTrue(optionalDevice.isPresent());
169 assertTrue(optionalDevice.get() instanceof DeviceModel);
171 DeviceModel device = (DeviceModel) optionalDevice.get();
172 assertEquals("FRITZ!DECT 210", device.getProductName());
173 assertEquals("087610000438", device.getIdentifier());
174 assertEquals("18", device.getDeviceId());
175 assertEquals("03.83", device.getFirmwareVersion());
176 assertEquals("AVM", device.getManufacturer());
178 assertEquals(1, device.getPresent());
179 assertEquals("FRITZ!DECT 210 #8", device.getName());
181 assertFalse(device.isButton());
182 assertFalse(device.isHANFUNButton());
183 assertFalse(device.isHANFUNAlarmSensor());
184 assertFalse(device.isDectRepeater());
185 assertTrue(device.isSwitchableOutlet());
186 assertTrue(device.isTempSensor());
187 assertFalse(device.isHumiditySensor());
188 assertTrue(device.isPowermeter());
189 assertFalse(device.isHeatingThermostat());
190 assertFalse(device.isHANFUNBlinds());
192 assertNotNull(device.getSwitch());
193 assertEquals(SwitchModel.ON, device.getSwitch().getState());
194 assertEquals(MODE_MANUAL, device.getSwitch().getMode());
195 assertEquals(BigDecimal.ZERO, device.getSwitch().getLock());
196 assertEquals(BigDecimal.ZERO, device.getSwitch().getDevicelock());
198 assertNotNull(device.getTemperature());
199 assertEquals(new BigDecimal("25.5"), device.getTemperature().getCelsius());
200 assertEquals(new BigDecimal("0.0"), device.getTemperature().getOffset());
202 validatePowerMeter(device.getPowermeter());
204 assertNull(device.getHkr());
206 assertNull(device.getLevelcontrol());
210 public void validateDECT300Model() {
211 Optional<AVMFritzBaseModel> optionalDevice = findModel("FRITZ!DECT 300");
212 assertTrue(optionalDevice.isPresent());
213 assertTrue(optionalDevice.get() instanceof DeviceModel);
215 DeviceModel device = (DeviceModel) optionalDevice.get();
216 assertEquals("FRITZ!DECT 300", device.getProductName());
217 assertEquals("087610000437", device.getIdentifier());
218 assertEquals("20", device.getDeviceId());
219 assertEquals("03.50", device.getFirmwareVersion());
220 assertEquals("AVM", device.getManufacturer());
222 assertEquals(0, device.getPresent());
223 assertEquals("FRITZ!DECT 300 #1", device.getName());
225 assertFalse(device.isButton());
226 assertFalse(device.isHANFUNButton());
227 assertFalse(device.isHANFUNAlarmSensor());
228 assertFalse(device.isDectRepeater());
229 assertFalse(device.isSwitchableOutlet());
230 assertTrue(device.isTempSensor());
231 assertFalse(device.isHumiditySensor());
232 assertFalse(device.isPowermeter());
233 assertTrue(device.isHeatingThermostat());
234 assertFalse(device.isHANFUNBlinds());
236 assertNull(device.getSwitch());
238 assertNotNull(device.getTemperature());
239 assertEquals(new BigDecimal("22.0"), device.getTemperature().getCelsius());
240 assertEquals(new BigDecimal("-1.0"), device.getTemperature().getOffset());
242 assertNull(device.getPowermeter());
244 validateHeatingModel(device.getHkr());
248 public void validateDECT301Model() {
249 Optional<AVMFritzBaseModel> optionalDevice = findModel("FRITZ!DECT 301");
250 assertTrue(optionalDevice.isPresent());
251 assertTrue(optionalDevice.get() instanceof DeviceModel);
253 DeviceModel device = (DeviceModel) optionalDevice.get();
254 assertEquals("FRITZ!DECT 301", device.getProductName());
255 assertEquals("087610000436", device.getIdentifier());
256 assertEquals("21", device.getDeviceId());
257 assertEquals("03.50", device.getFirmwareVersion());
258 assertEquals("AVM", device.getManufacturer());
260 assertEquals(0, device.getPresent());
261 assertEquals("FRITZ!DECT 301 #1", device.getName());
263 assertFalse(device.isButton());
264 assertFalse(device.isHANFUNButton());
265 assertFalse(device.isHANFUNAlarmSensor());
266 assertFalse(device.isDectRepeater());
267 assertFalse(device.isSwitchableOutlet());
268 assertTrue(device.isTempSensor());
269 assertFalse(device.isHumiditySensor());
270 assertFalse(device.isPowermeter());
271 assertTrue(device.isHeatingThermostat());
272 assertFalse(device.isHANFUNBlinds());
274 assertNull(device.getSwitch());
276 assertNotNull(device.getTemperature());
277 assertEquals(new BigDecimal("22.0"), device.getTemperature().getCelsius());
278 assertEquals(new BigDecimal("-1.0"), device.getTemperature().getOffset());
280 assertNull(device.getPowermeter());
282 validateHeatingModel(device.getHkr());
286 public void validateCometDECTModel() {
287 Optional<AVMFritzBaseModel> optionalDevice = findModel("Comet DECT");
288 assertTrue(optionalDevice.isPresent());
289 assertTrue(optionalDevice.get() instanceof DeviceModel);
291 DeviceModel device = (DeviceModel) optionalDevice.get();
292 assertEquals("Comet DECT", device.getProductName());
293 assertEquals("087610000435", device.getIdentifier());
294 assertEquals("22", device.getDeviceId());
295 assertEquals("03.50", device.getFirmwareVersion());
296 assertEquals("AVM", device.getManufacturer());
298 assertEquals(0, device.getPresent());
299 assertEquals("Comet DECT #1", device.getName());
301 assertFalse(device.isButton());
302 assertFalse(device.isHANFUNButton());
303 assertFalse(device.isHANFUNAlarmSensor());
304 assertFalse(device.isDectRepeater());
305 assertFalse(device.isSwitchableOutlet());
306 assertTrue(device.isTempSensor());
307 assertFalse(device.isHumiditySensor());
308 assertFalse(device.isPowermeter());
309 assertTrue(device.isHeatingThermostat());
310 assertFalse(device.isHANFUNBlinds());
312 assertNull(device.getSwitch());
314 assertNotNull(device.getTemperature());
315 assertEquals(new BigDecimal("22.0"), device.getTemperature().getCelsius());
316 assertEquals(new BigDecimal("-1.0"), device.getTemperature().getOffset());
318 assertNull(device.getPowermeter());
320 validateHeatingModel(device.getHkr());
324 public void validateDECT400Model() {
325 Optional<AVMFritzBaseModel> optionalDevice = findModelByIdentifier("130960007307");
326 assertTrue(optionalDevice.isPresent());
327 assertTrue(optionalDevice.get() instanceof DeviceModel);
329 DeviceModel device = (DeviceModel) optionalDevice.get();
330 assertEquals("FRITZ!DECT 400", device.getProductName());
331 assertEquals("130960007307", device.getIdentifier());
332 assertEquals("29", device.getDeviceId());
333 assertEquals("04.90", device.getFirmwareVersion());
334 assertEquals("AVM", device.getManufacturer());
336 assertEquals(1, device.getPresent());
337 assertEquals("FRITZ!DECT 400 #14", device.getName());
339 assertTrue(device.isButton());
340 assertFalse(device.isHANFUNButton());
341 assertFalse(device.isHANFUNAlarmSensor());
342 assertFalse(device.isDectRepeater());
343 assertFalse(device.isSwitchableOutlet());
344 assertFalse(device.isTempSensor());
345 assertFalse(device.isHumiditySensor());
346 assertFalse(device.isPowermeter());
347 assertFalse(device.isHeatingThermostat());
348 assertFalse(device.isHANFUNBlinds());
350 assertEquals(new BigDecimal("100"), device.getBattery());
351 assertEquals(BatteryModel.BATTERY_OFF, device.getBatterylow());
353 assertEquals(2, device.getButtons().size());
354 assertEquals("FRITZ!DECT 400 #14: kurz", device.getButtons().get(0).getName());
355 assertEquals(1549195586, device.getButtons().get(0).getLastpressedtimestamp());
356 assertEquals("FRITZ!DECT 400 #14: lang", device.getButtons().get(1).getName());
357 assertEquals(1549195595, device.getButtons().get(1).getLastpressedtimestamp());
359 assertNull(device.getAlert());
361 assertNull(device.getSwitch());
363 assertNull(device.getTemperature());
365 assertNull(device.getPowermeter());
367 assertNull(device.getHkr());
369 assertNull(device.getLevelcontrol());
373 public void validateDECT440Model() {
374 Optional<AVMFritzBaseModel> optionalDevice = findModelByIdentifier("130960007308");
375 assertTrue(optionalDevice.isPresent());
376 assertTrue(optionalDevice.get() instanceof DeviceModel);
378 DeviceModel device = (DeviceModel) optionalDevice.get();
379 assertEquals("FRITZ!DECT 440", device.getProductName());
380 assertEquals("130960007308", device.getIdentifier());
381 assertEquals("30", device.getDeviceId());
382 assertEquals("05.10", device.getFirmwareVersion());
383 assertEquals("AVM", device.getManufacturer());
385 assertEquals(1, device.getPresent());
386 assertEquals("FRITZ!DECT 440 #15", device.getName());
388 assertTrue(device.isButton());
389 assertFalse(device.isHANFUNButton());
390 assertFalse(device.isHANFUNAlarmSensor());
391 assertFalse(device.isDectRepeater());
392 assertFalse(device.isSwitchableOutlet());
393 assertTrue(device.isTempSensor());
394 assertTrue(device.isHumiditySensor());
395 assertFalse(device.isPowermeter());
396 assertFalse(device.isHeatingThermostat());
397 assertFalse(device.isHANFUNBlinds());
399 assertEquals(new BigDecimal("100"), device.getBattery());
400 assertEquals(BatteryModel.BATTERY_OFF, device.getBatterylow());
402 assertEquals(4, device.getButtons().size());
403 final ButtonModel topRight = device.getButtons().get(0);
404 assertEquals("130960007308-1", topRight.getIdentifier());
405 assertEquals("5000", topRight.getButtonId());
406 assertEquals("FRITZ!DECT 440 #15: Oben rechts", topRight.getName());
407 assertEquals(1549195586, topRight.getLastpressedtimestamp());
408 final ButtonModel bottomRight = device.getButtons().get(1);
409 assertEquals("130960007308-3", bottomRight.getIdentifier());
410 assertEquals("5001", bottomRight.getButtonId());
411 assertEquals("FRITZ!DECT 440 #15: Unten rechts", bottomRight.getName());
412 assertEquals(1549195595, bottomRight.getLastpressedtimestamp());
413 final ButtonModel bottomLeft = device.getButtons().get(2);
414 assertEquals("130960007308-5", bottomLeft.getIdentifier());
415 assertEquals("5002", bottomLeft.getButtonId());
416 assertEquals("FRITZ!DECT 440 #15: Unten links", bottomLeft.getName());
417 assertEquals(1549195586, bottomLeft.getLastpressedtimestamp());
418 final ButtonModel topLeft = device.getButtons().get(3);
419 assertEquals("130960007308-7", topLeft.getIdentifier());
420 assertEquals("5003", topLeft.getButtonId());
421 assertEquals("FRITZ!DECT 440 #15: Oben links", topLeft.getName());
422 assertEquals(1549195595, topLeft.getLastpressedtimestamp());
424 assertNull(device.getAlert());
426 assertNull(device.getSwitch());
428 assertNotNull(device.getTemperature());
429 assertEquals(new BigDecimal("23.0"), device.getTemperature().getCelsius());
430 assertEquals(new BigDecimal("0.0"), device.getTemperature().getOffset());
432 assertNotNull(device.getHumidity());
433 assertEquals(new BigDecimal("43"), device.getHumidity().getRelativeHumidity());
435 assertNull(device.getPowermeter());
437 assertNull(device.getHkr());
439 assertNull(device.getLevelcontrol());
443 public void validatePowerline546EModel() {
444 Optional<AVMFritzBaseModel> optionalDevice = findModel("FRITZ!Powerline 546E");
445 assertTrue(optionalDevice.isPresent());
446 assertTrue(optionalDevice.get() instanceof DeviceModel);
448 DeviceModel device = (DeviceModel) optionalDevice.get();
449 assertEquals("FRITZ!Powerline 546E", device.getProductName());
450 assertEquals("5C:49:79:F0:A3:84", device.getIdentifier());
451 assertEquals("30", device.getDeviceId());
452 assertEquals("06.92", device.getFirmwareVersion());
453 assertEquals("AVM", device.getManufacturer());
455 assertEquals(1, device.getPresent());
456 assertEquals("FRITZ!Powerline 546E #1", device.getName());
458 assertFalse(device.isButton());
459 assertFalse(device.isHANFUNButton());
460 assertFalse(device.isHANFUNAlarmSensor());
461 assertFalse(device.isDectRepeater());
462 assertTrue(device.isSwitchableOutlet());
463 assertFalse(device.isTempSensor());
464 assertFalse(device.isHumiditySensor());
465 assertTrue(device.isPowermeter());
466 assertFalse(device.isHeatingThermostat());
467 assertFalse(device.isHANFUNBlinds());
469 assertNotNull(device.getSwitch());
470 assertEquals(SwitchModel.OFF, device.getSwitch().getState());
471 assertEquals(MODE_MANUAL, device.getSwitch().getMode());
472 assertEquals(BigDecimal.ZERO, device.getSwitch().getLock());
473 assertEquals(BigDecimal.ONE, device.getSwitch().getDevicelock());
475 assertNull(device.getTemperature());
477 validatePowerMeter(device.getPowermeter());
479 assertNull(device.getHkr());
481 assertNull(device.getLevelcontrol());
485 public void validateHANFUNContactModel() {
486 Optional<AVMFritzBaseModel> optionalDevice = findModelByIdentifier("119340059978-1");
487 assertTrue(optionalDevice.isPresent());
488 assertTrue(optionalDevice.get() instanceof DeviceModel);
490 DeviceModel device = (DeviceModel) optionalDevice.get();
491 assertEquals("HAN-FUN", device.getProductName());
492 assertEquals("119340059978-1", device.getIdentifier());
493 assertEquals("2000", device.getDeviceId());
494 assertEquals("0.0", device.getFirmwareVersion());
495 assertEquals("0x0feb", device.getManufacturer());
497 assertEquals(0, device.getPresent());
498 assertEquals("HAN-FUN #2: Unit #2", device.getName());
500 assertFalse(device.isButton());
501 assertFalse(device.isHANFUNButton());
502 assertTrue(device.isHANFUNAlarmSensor());
503 assertFalse(device.isDectRepeater());
504 assertFalse(device.isSwitchableOutlet());
505 assertFalse(device.isTempSensor());
506 assertFalse(device.isHumiditySensor());
507 assertFalse(device.isPowermeter());
508 assertFalse(device.isHeatingThermostat());
509 assertFalse(device.isHANFUNBlinds());
511 assertTrue(device.getButtons().isEmpty());
513 assertNotNull(device.getAlert());
514 assertEquals(BigDecimal.ONE, device.getAlert().getState());
516 assertNull(device.getSwitch());
518 assertNull(device.getTemperature());
520 assertNull(device.getPowermeter());
522 assertNull(device.getHkr());
524 assertNull(device.getLevelcontrol());
528 public void validateHANFUNSwitchModel() {
529 Optional<AVMFritzBaseModel> optionalDevice = findModelByIdentifier("119340059979-1");
530 assertTrue(optionalDevice.isPresent());
531 assertTrue(optionalDevice.get() instanceof DeviceModel);
533 DeviceModel device = (DeviceModel) optionalDevice.get();
534 assertEquals("HAN-FUN", device.getProductName());
535 assertEquals("119340059979-1", device.getIdentifier());
536 assertEquals("2001", device.getDeviceId());
537 assertEquals("0.0", device.getFirmwareVersion());
538 assertEquals("0x0feb", device.getManufacturer());
540 assertEquals(0, device.getPresent());
541 assertEquals("HAN-FUN #2: Unit #2", device.getName());
543 assertFalse(device.isButton());
544 assertTrue(device.isHANFUNButton());
545 assertFalse(device.isHANFUNAlarmSensor());
546 assertFalse(device.isDectRepeater());
547 assertFalse(device.isSwitchableOutlet());
548 assertFalse(device.isTempSensor());
549 assertFalse(device.isHumiditySensor());
550 assertFalse(device.isPowermeter());
551 assertFalse(device.isHeatingThermostat());
552 assertFalse(device.isHANFUNBlinds());
554 assertEquals(1, device.getButtons().size());
555 assertEquals(1529590797, device.getButtons().get(0).getLastpressedtimestamp());
557 assertNull(device.getAlert());
559 assertNull(device.getSwitch());
561 assertNull(device.getTemperature());
563 assertNull(device.getPowermeter());
565 assertNull(device.getHkr());
567 assertNull(device.getLevelcontrol());
571 public void validateHANFUNBlindModel() {
572 Optional<AVMFritzBaseModel> optionalDevice = findModelByIdentifier("142760503450-1");
573 assertTrue(optionalDevice.isPresent());
574 assertTrue(optionalDevice.get() instanceof DeviceModel);
576 DeviceModel device = (DeviceModel) optionalDevice.get();
577 assertEquals("Rollotron 1213", device.getProductName());
578 assertEquals("142760503450-1", device.getIdentifier());
579 assertEquals("2000", device.getDeviceId());
580 assertEquals("0.0", device.getFirmwareVersion());
581 assertEquals("0x37c4", device.getManufacturer());
583 assertEquals(1, device.getPresent());
584 assertEquals("Rollotron 1213 #1", device.getName());
586 assertFalse(device.isButton());
587 assertFalse(device.isHANFUNButton());
588 assertTrue(device.isHANFUNAlarmSensor());
589 assertFalse(device.isDectRepeater());
590 assertFalse(device.isSwitchableOutlet());
591 assertFalse(device.isTempSensor());
592 assertFalse(device.isHumiditySensor());
593 assertFalse(device.isPowermeter());
594 assertFalse(device.isHeatingThermostat());
595 assertTrue(device.isHANFUNBlinds());
597 assertTrue(device.getButtons().isEmpty());
599 assertNotNull(device.getAlert());
600 assertEquals(BigDecimal.ZERO, device.getAlert().getState());
602 assertNull(device.getSwitch());
604 assertNull(device.getTemperature());
606 assertNull(device.getPowermeter());
608 assertNull(device.getHkr());
610 LevelcontrolModel levelcontrol = device.getLevelcontrol();
611 assertNotNull(levelcontrol);
612 assertEquals(BigDecimal.valueOf(26L), levelcontrol.getLevel());
613 assertEquals(BigDecimal.valueOf(10L), levelcontrol.getLevelPercentage());
617 public void validateHeatingGroupModel() {
618 Optional<AVMFritzBaseModel> optionalGroup = findModelByIdentifier("F0:A3:7F-901");
619 assertTrue(optionalGroup.isPresent());
620 assertTrue(optionalGroup.get() instanceof GroupModel);
622 GroupModel group = (GroupModel) optionalGroup.get();
623 assertEquals("", group.getProductName());
624 assertEquals("F0:A3:7F-901", group.getIdentifier());
625 assertEquals("20001", group.getDeviceId());
626 assertEquals("1.0", group.getFirmwareVersion());
627 assertEquals("AVM", group.getManufacturer());
629 assertEquals(1, group.getPresent());
630 assertEquals("Schlafzimmer", group.getName());
632 assertFalse(group.isButton());
633 assertFalse(group.isHANFUNButton());
634 assertFalse(group.isHANFUNAlarmSensor());
635 assertFalse(group.isDectRepeater());
636 assertFalse(group.isSwitchableOutlet());
637 assertFalse(group.isTempSensor());
638 assertFalse(group.isHumiditySensor());
639 assertFalse(group.isPowermeter());
640 assertTrue(group.isHeatingThermostat());
641 assertFalse(group.isHANFUNBlinds());
643 assertNull(group.getSwitch());
645 assertNull(group.getPowermeter());
647 validateHeatingModel(group.getHkr());
649 assertNotNull(group.getGroupinfo());
650 assertEquals("0", group.getGroupinfo().getMasterdeviceid());
651 assertEquals("20,21,22", group.getGroupinfo().getMembers());
655 public void validateSwitchGroupModel() {
656 Optional<AVMFritzBaseModel> optionalGroup = findModelByIdentifier("F0:A3:7F-900");
657 assertTrue(optionalGroup.isPresent());
658 assertTrue(optionalGroup.get() instanceof GroupModel);
660 GroupModel group = (GroupModel) optionalGroup.get();
661 assertEquals("", group.getProductName());
662 assertEquals("F0:A3:7F-900", group.getIdentifier());
663 assertEquals("20000", group.getDeviceId());
664 assertEquals("1.0", group.getFirmwareVersion());
665 assertEquals("AVM", group.getManufacturer());
667 assertEquals(1, group.getPresent());
668 assertEquals("Schlafzimmer", group.getName());
670 assertFalse(group.isButton());
671 assertFalse(group.isHANFUNButton());
672 assertFalse(group.isHANFUNAlarmSensor());
673 assertFalse(group.isDectRepeater());
674 assertTrue(group.isSwitchableOutlet());
675 assertFalse(group.isTempSensor());
676 assertFalse(group.isHumiditySensor());
677 assertTrue(group.isPowermeter());
678 assertFalse(group.isHeatingThermostat());
679 assertFalse(group.isHANFUNBlinds());
681 assertNotNull(group.getSwitch());
682 assertEquals(SwitchModel.ON, group.getSwitch().getState());
683 assertEquals(MODE_MANUAL, group.getSwitch().getMode());
684 assertEquals(BigDecimal.ZERO, group.getSwitch().getLock());
685 assertEquals(BigDecimal.ZERO, group.getSwitch().getDevicelock());
687 validatePowerMeter(group.getPowermeter());
689 assertNull(group.getHkr());
691 assertNotNull(group.getGroupinfo());
692 assertEquals("17", group.getGroupinfo().getMasterdeviceid());
693 assertEquals("17,18", group.getGroupinfo().getMembers());
696 private Optional<AVMFritzBaseModel> findModel(String name) {
697 return devices.getDevicelist().stream().filter(it -> name.equals(it.getProductName())).findFirst();
700 private Optional<AVMFritzBaseModel> findModelByIdentifier(String identifier) {
701 return devices.getDevicelist().stream().filter(it -> identifier.equals(it.getIdentifier())).findFirst();
704 private void validatePowerMeter(PowerMeterModel model) {
705 assertNotNull(model);
706 assertEquals(new BigDecimal("230.051"), model.getVoltage());
707 assertEquals(new BigDecimal("0.000"), model.getPower());
708 assertEquals(new BigDecimal("2087"), model.getEnergy());
711 private void validateHeatingModel(HeatingModel model) {
712 assertNotNull(model);
713 assertEquals(new BigDecimal(44), model.getTist());
714 assertEquals(new BigDecimal(42), model.getTsoll());
715 assertEquals(new BigDecimal(28), model.getAbsenk());
716 assertEquals(new BigDecimal(42), model.getKomfort());
717 assertEquals(BigDecimal.ONE, model.getLock());
718 assertEquals(BigDecimal.ONE, model.getDevicelock());
719 assertEquals(BigDecimal.ZERO, model.getWindowopenactiv());
720 assertEquals(BigDecimal.ZERO, model.getBoostactive());
721 assertEquals(new BigDecimal("100"), model.getBattery());
722 assertEquals(BatteryModel.BATTERY_OFF, model.getBatterylow());
723 assertEquals(MODE_AUTO, model.getMode());
724 assertEquals(MODE_COMFORT, model.getRadiatorMode());
726 assertNotNull(model.getNextchange());
727 assertEquals(1484341200, model.getNextchange().getEndperiod());
728 assertEquals(new BigDecimal(28), model.getNextchange().getTchange());