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=\"35712\" fwversion=\"03.83\" manufacturer=\"AVM\" productname=\"FRITZ!DECT 200\"><present>1</present><name>FRITZ!DECT 200 #1</name><switch><state>1</state><mode>manuell</mode><lock>0</lock><devicelock>0</devicelock></switch><powermeter><voltage>230051</voltage><power>0</power><energy>2087</energy></powermeter><temperature><celsius>255</celsius><offset>0</offset></temperature></device>"
52 + "<device identifier=\"08761 0000438\" id=\"18\" functionbitmask=\"35712\" fwversion=\"03.83\" manufacturer=\"AVM\" productname=\"FRITZ!DECT 210\"><present>1</present><name>FRITZ!DECT 210 #8</name><switch><state>1</state><mode>manuell</mode><lock>0</lock><devicelock>0</devicelock></switch><powermeter><voltage>230051</voltage><power>0</power><energy>2087</energy></powermeter><temperature><celsius>255</celsius><offset>0</offset></temperature></device>"
53 + "<device identifier=\"08761 0000437\" id=\"20\" functionbitmask=\"320\" fwversion=\"03.50\" manufacturer=\"AVM\" productname=\"FRITZ!DECT 300\"><present>0</present><name>FRITZ!DECT 300 #1</name><temperature><celsius>220</celsius><offset>-10</offset></temperature><hkr><tist>44</tist><tsoll>42</tsoll><absenk>28</absenk><komfort>42</komfort><lock>1</lock><devicelock>1</devicelock><errorcode>0</errorcode><windowopenactiv>0</windowopenactiv><windowopenactiveendtime>0</windowopenactiveendtime><boostactive>0</boostactive><boostactiveendtime>0</boostactiveendtime><batterylow>0</batterylow><battery>100</battery><nextchange><endperiod>1484341200</endperiod><tchange>28</tchange></nextchange></hkr></device>"
54 + "<device identifier=\"08761 0000436\" id=\"21\" functionbitmask=\"320\" fwversion=\"03.50\" manufacturer=\"AVM\" productname=\"FRITZ!DECT 301\"><present>0</present><name>FRITZ!DECT 301 #1</name><temperature><celsius>220</celsius><offset>-10</offset></temperature><hkr><tist>44</tist><tsoll>42</tsoll><absenk>28</absenk><komfort>42</komfort><lock>1</lock><devicelock>1</devicelock><errorcode>0</errorcode><windowopenactiv>0</windowopenactiv><windowopenactiveendtime>0</windowopenactiveendtime><boostactive>0</boostactive><boostactiveendtime>0</boostactiveendtime><batterylow>0</batterylow><battery>100</battery><nextchange><endperiod>1484341200</endperiod><tchange>28</tchange></nextchange></hkr></device>"
55 + "<device identifier=\"08761 0000435\" id=\"22\" functionbitmask=\"320\" fwversion=\"03.50\" manufacturer=\"AVM\" productname=\"Comet DECT\"><present>0</present><name>Comet DECT #1</name><temperature><celsius>220</celsius><offset>-10</offset></temperature><hkr><tist>44</tist><tsoll>42</tsoll><absenk>28</absenk><komfort>42</komfort><lock>1</lock><devicelock>1</devicelock><errorcode>0</errorcode><windowopenactiv>0</windowopenactiv><windowopenactiveendtime>0</windowopenactiveendtime><boostactive>0</boostactive><boostactiveendtime>0</boostactiveendtime><batterylow>0</batterylow><battery>100</battery><nextchange><endperiod>1484341200</endperiod><tchange>28</tchange></nextchange></hkr></device>"
56 + "<device identifier=\"5C:49:79:F0:A3:84\" id=\"30\" functionbitmask=\"640\" fwversion=\"06.92\" manufacturer=\"AVM\" productname=\"FRITZ!Powerline 546E\"><present>1</present><name>FRITZ!Powerline 546E #1</name><switch><state>0</state><mode>manuell</mode><lock>0</lock><devicelock>1</devicelock></switch><powermeter><voltage>230051</voltage><power>0</power><energy>2087</energy></powermeter></device>"
57 + "<device identifier=\"08761 0000439\" id=\"40\" functionbitmask=\"1280\" fwversion=\"03.86\" manufacturer=\"AVM\" productname=\"FRITZ!DECT Repeater 100\"><present>1</present><name>FRITZ!DECT Repeater 100 #5</name><temperature><celsius>230</celsius><offset>0</offset></temperature></device>"
58 + "<device identifier=\"11934 0059978-1\" id=\"2000\" functionbitmask=\"8208\" fwversion=\"0.0\" manufacturer=\"0x0feb\" productname=\"HAN-FUN\"><present>0</present><name>HAN-FUN #2: Unit #2</name><etsiunitinfo><etsideviceid>406</etsideviceid><unittype>514</unittype><interfaces>256</interfaces></etsiunitinfo><alert><state>1</state></alert></device>"
59 + "<device identifier=\"11934 0059979-1\" id=\"2001\" functionbitmask=\"8200\" fwversion=\"0.0\" manufacturer=\"0x0feb\" productname=\"HAN-FUN\"><present>0</present><name>HAN-FUN #2: Unit #2</name><etsiunitinfo><etsideviceid>412</etsideviceid><unittype>273</unittype><interfaces>772</interfaces></etsiunitinfo><button><lastpressedtimestamp>1529590797</lastpressedtimestamp></button></device>"
60 + "<device identifier=\"13096 0007307\" id=\"29\" functionbitmask=\"32\" fwversion=\"04.90\" manufacturer=\"AVM\" productname=\"FRITZ!DECT 400\"><present>1</present><name>FRITZ!DECT 400 #14</name><battery>100</battery><batterylow>0</batterylow><button identifier=\"13096 0007307-0\" id=\"5000\"><name>FRITZ!DECT 400 #14: kurz</name><lastpressedtimestamp>1549195586</lastpressedtimestamp></button><button identifier=\"13096 0007307-9\" id=\"5001\"><name>FRITZ!DECT 400 #14: lang</name><lastpressedtimestamp>1549195595</lastpressedtimestamp></button></device>"
61 + "<device identifier=\"13096 0007308\" id=\"30\" functionbitmask=\"1048864\" fwversion=\"05.10\" manufacturer=\"AVM\" productname=\"FRITZ!DECT 440\"><present>1</present><name>FRITZ!DECT 440 #15</name><temperature><celsius>230</celsius><offset>0</offset></temperature><humidity><rel_humidity>43</rel_humidity></humidity><battery>100</battery><batterylow>0</batterylow><button identifier=\"13096 0007308-1\" id=\"5000\"><name>FRITZ!DECT 440 #15: Oben rechts</name><lastpressedtimestamp>1549195586</lastpressedtimestamp></button><button identifier=\"13096 0007308-3\" id=\"5001\"><name>FRITZ!DECT 440 #15: Unten rechts</name><lastpressedtimestamp>1549195595</lastpressedtimestamp></button><button identifier=\"13096 0007308-5\" id=\"5002\"><name>FRITZ!DECT 440 #15: Unten links</name><lastpressedtimestamp>1549195586</lastpressedtimestamp></button><button identifier=\"13096 0007308-7\" id=\"5003\"><name>FRITZ!DECT 440 #15: Oben links</name><lastpressedtimestamp>1549195595</lastpressedtimestamp></button></device>"
62 + "<device identifier=\"14276 0503450-1\" id=\"2000\" functionbitmask=\"335888\" fwversion=\"0.0\" manufacturer=\"0x37c4\" productname=\"Rollotron 1213\"><present>1</present><txbusy>0</txbusy><name>Rollotron 1213 #1</name><blind><endpositionsset>1</endpositionsset><mode>manuell</mode></blind><levelcontrol><level>26</level><levelpercentage>10</levelpercentage></levelcontrol><etsiunitinfo><etsideviceid>406</etsideviceid><unittype>281</unittype><interfaces>256,513,516,517</interfaces></etsiunitinfo><alert><state>0</state><lastalertchgtimestamp></lastalertchgtimestamp></alert></device>"
63 + "<device identifier=\"11324 0824499-1\" id=\"2002\" functionbitmask=\"40960\" fwversion=\"0.0\" manufacturer=\"0x2c3c\" productname=\"HAN-FUN\">\n"
64 + " <present>1</present>\n"
65 + " <txbusy>0</txbusy>\n"
66 + " <name>Steckdose innen</name>\n"
68 + " <state>0</state>\n"
71 + " <etsideviceid>408</etsideviceid>\n"
72 + " <unittype>263</unittype>\n"
73 + " <interfaces>512,768</interfaces>\n"
74 + " </etsiunitinfo>\n"
76 + "<device identifier=\"11324 0584796-1\" id=\"2001\" functionbitmask=\"40960\" fwversion=\"0.0\" manufacturer=\"0x2c3c\" productname=\"HAN-FUN\">\n"
77 + " <present>1</present>\n"
78 + " <txbusy>0</txbusy>\n"
79 + " <name>Steckdose außen</name>\n"
81 + " <state>0</state>\n"
84 + " <etsideviceid>407</etsideviceid>\n"
85 + " <unittype>262</unittype>\n"
86 + " <interfaces>512</interfaces>\n"
87 + " </etsiunitinfo>\n"
91 XMLStreamReader xsr = JAXBUtils.XMLINPUTFACTORY.createXMLStreamReader(new StringReader(xml));
92 Unmarshaller u = JAXBUtils.JAXBCONTEXT_DEVICES.createUnmarshaller();
93 devices = u.unmarshal(xsr, DeviceListModel.class).getValue();
97 public void validateDeviceListModel() {
98 assertNotNull(devices);
99 assertEquals(16, devices.getDevicelist().size());
100 assertEquals("1", devices.getXmlApiVersion());
104 public void validateDECTRepeater100Model() {
105 Optional<AVMFritzBaseModel> optionalDevice = findModelByIdentifier("087610000439");
106 assertTrue(optionalDevice.isPresent());
107 assertTrue(optionalDevice.get() instanceof DeviceModel);
109 DeviceModel device = (DeviceModel) optionalDevice.get();
110 assertEquals("FRITZ!DECT Repeater 100", device.getProductName());
111 assertEquals("087610000439", device.getIdentifier());
112 assertEquals("40", device.getDeviceId());
113 assertEquals("03.86", device.getFirmwareVersion());
114 assertEquals("AVM", device.getManufacturer());
116 assertEquals(1, device.getPresent());
117 assertEquals("FRITZ!DECT Repeater 100 #5", device.getName());
119 assertFalse(device.isButton());
120 assertFalse(device.isHANFUNButton());
121 assertFalse(device.isHANFUNAlarmSensor());
122 assertTrue(device.isDectRepeater());
123 assertFalse(device.isSwitchableOutlet());
124 assertTrue(device.isTemperatureSensor());
125 assertFalse(device.isHumiditySensor());
126 assertFalse(device.isPowermeter());
127 assertFalse(device.isHeatingThermostat());
128 assertFalse(device.isHANFUNBlinds());
130 assertNull(device.getSwitch());
132 assertNotNull(device.getTemperature());
133 assertEquals(new BigDecimal("23.0"), device.getTemperature().getCelsius());
134 assertEquals(new BigDecimal("0.0"), device.getTemperature().getOffset());
136 assertNull(device.getPowermeter());
138 assertNull(device.getHkr());
140 assertNull(device.getLevelControlModel());
144 public void validateDECT200Model() {
145 Optional<AVMFritzBaseModel> optionalDevice = findModel("FRITZ!DECT 200");
146 assertTrue(optionalDevice.isPresent());
147 assertTrue(optionalDevice.get() instanceof DeviceModel);
149 DeviceModel device = (DeviceModel) optionalDevice.get();
150 assertEquals("FRITZ!DECT 200", device.getProductName());
151 assertEquals("087610000434", device.getIdentifier());
152 assertEquals("17", device.getDeviceId());
153 assertEquals("03.83", device.getFirmwareVersion());
154 assertEquals("AVM", device.getManufacturer());
156 assertEquals(1, device.getPresent());
157 assertEquals("FRITZ!DECT 200 #1", device.getName());
159 assertFalse(device.isHANFUNButton());
160 assertFalse(device.isHANFUNAlarmSensor());
161 assertFalse(device.isButton());
162 assertFalse(device.isHeatingThermostat());
163 assertTrue(device.isPowermeter());
164 assertTrue(device.isTemperatureSensor());
165 assertTrue(device.isSwitchableOutlet());
166 assertFalse(device.isDectRepeater());
167 assertTrue(device.hasMicrophone());
168 assertFalse(device.isHANFUNUnit());
169 assertTrue(device.isHANFUNOnOff());
170 assertFalse(device.isHANFUNBlinds());
171 assertFalse(device.isHumiditySensor());
173 assertNotNull(device.getSwitch());
174 assertEquals(SwitchModel.ON, device.getSwitch().getState());
175 assertEquals(MODE_MANUAL, device.getSwitch().getMode());
176 assertEquals(BigDecimal.ZERO, device.getSwitch().getLock());
177 assertEquals(BigDecimal.ZERO, device.getSwitch().getDevicelock());
179 assertNotNull(device.getTemperature());
180 assertEquals(new BigDecimal("25.5"), device.getTemperature().getCelsius());
181 assertEquals(new BigDecimal("0.0"), device.getTemperature().getOffset());
183 validatePowerMeter(device.getPowermeter());
185 assertNull(device.getHkr());
187 assertNull(device.getLevelControlModel());
191 public void validateDECT210Model() {
192 Optional<AVMFritzBaseModel> optionalDevice = findModel("FRITZ!DECT 210");
193 assertTrue(optionalDevice.isPresent());
194 assertTrue(optionalDevice.get() instanceof DeviceModel);
196 DeviceModel device = (DeviceModel) optionalDevice.get();
197 assertEquals("FRITZ!DECT 210", device.getProductName());
198 assertEquals("087610000438", device.getIdentifier());
199 assertEquals("18", device.getDeviceId());
200 assertEquals("03.83", device.getFirmwareVersion());
201 assertEquals("AVM", device.getManufacturer());
203 assertEquals(1, device.getPresent());
204 assertEquals("FRITZ!DECT 210 #8", device.getName());
206 assertFalse(device.isHANFUNButton());
207 assertFalse(device.isHANFUNAlarmSensor());
208 assertFalse(device.isButton());
209 assertFalse(device.isHeatingThermostat());
210 assertTrue(device.isPowermeter());
211 assertTrue(device.isTemperatureSensor());
212 assertTrue(device.isSwitchableOutlet());
213 assertFalse(device.isDectRepeater());
214 assertTrue(device.hasMicrophone());
215 assertFalse(device.isHANFUNUnit());
216 assertTrue(device.isHANFUNOnOff());
217 assertFalse(device.isHANFUNBlinds());
218 assertFalse(device.isHumiditySensor());
220 assertNotNull(device.getSwitch());
221 assertEquals(SwitchModel.ON, device.getSwitch().getState());
222 assertEquals(MODE_MANUAL, device.getSwitch().getMode());
223 assertEquals(BigDecimal.ZERO, device.getSwitch().getLock());
224 assertEquals(BigDecimal.ZERO, device.getSwitch().getDevicelock());
226 assertNotNull(device.getTemperature());
227 assertEquals(new BigDecimal("25.5"), device.getTemperature().getCelsius());
228 assertEquals(new BigDecimal("0.0"), device.getTemperature().getOffset());
230 validatePowerMeter(device.getPowermeter());
232 assertNull(device.getHkr());
234 assertNull(device.getLevelControlModel());
238 public void validateDECT300Model() {
239 Optional<AVMFritzBaseModel> optionalDevice = findModel("FRITZ!DECT 300");
240 assertTrue(optionalDevice.isPresent());
241 assertTrue(optionalDevice.get() instanceof DeviceModel);
243 DeviceModel device = (DeviceModel) optionalDevice.get();
244 assertEquals("FRITZ!DECT 300", device.getProductName());
245 assertEquals("087610000437", device.getIdentifier());
246 assertEquals("20", device.getDeviceId());
247 assertEquals("03.50", device.getFirmwareVersion());
248 assertEquals("AVM", device.getManufacturer());
250 assertEquals(0, device.getPresent());
251 assertEquals("FRITZ!DECT 300 #1", device.getName());
253 assertFalse(device.isButton());
254 assertFalse(device.isHANFUNButton());
255 assertFalse(device.isHANFUNAlarmSensor());
256 assertFalse(device.isDectRepeater());
257 assertFalse(device.isSwitchableOutlet());
258 assertTrue(device.isTemperatureSensor());
259 assertFalse(device.isHumiditySensor());
260 assertFalse(device.isPowermeter());
261 assertTrue(device.isHeatingThermostat());
262 assertFalse(device.isHANFUNBlinds());
264 assertNull(device.getSwitch());
266 assertNotNull(device.getTemperature());
267 assertEquals(new BigDecimal("22.0"), device.getTemperature().getCelsius());
268 assertEquals(new BigDecimal("-1.0"), device.getTemperature().getOffset());
270 assertNull(device.getPowermeter());
272 validateHeatingModel(device.getHkr());
276 public void validateDECT301Model() {
277 Optional<AVMFritzBaseModel> optionalDevice = findModel("FRITZ!DECT 301");
278 assertTrue(optionalDevice.isPresent());
279 assertTrue(optionalDevice.get() instanceof DeviceModel);
281 DeviceModel device = (DeviceModel) optionalDevice.get();
282 assertEquals("FRITZ!DECT 301", device.getProductName());
283 assertEquals("087610000436", device.getIdentifier());
284 assertEquals("21", device.getDeviceId());
285 assertEquals("03.50", device.getFirmwareVersion());
286 assertEquals("AVM", device.getManufacturer());
288 assertEquals(0, device.getPresent());
289 assertEquals("FRITZ!DECT 301 #1", device.getName());
291 assertFalse(device.isButton());
292 assertFalse(device.isHANFUNButton());
293 assertFalse(device.isHANFUNAlarmSensor());
294 assertFalse(device.isDectRepeater());
295 assertFalse(device.isSwitchableOutlet());
296 assertTrue(device.isTemperatureSensor());
297 assertFalse(device.isHumiditySensor());
298 assertFalse(device.isPowermeter());
299 assertTrue(device.isHeatingThermostat());
300 assertFalse(device.isHANFUNBlinds());
302 assertNull(device.getSwitch());
304 assertNotNull(device.getTemperature());
305 assertEquals(new BigDecimal("22.0"), device.getTemperature().getCelsius());
306 assertEquals(new BigDecimal("-1.0"), device.getTemperature().getOffset());
308 assertNull(device.getPowermeter());
310 validateHeatingModel(device.getHkr());
314 public void validateCometDECTModel() {
315 Optional<AVMFritzBaseModel> optionalDevice = findModel("Comet DECT");
316 assertTrue(optionalDevice.isPresent());
317 assertTrue(optionalDevice.get() instanceof DeviceModel);
319 DeviceModel device = (DeviceModel) optionalDevice.get();
320 assertEquals("Comet DECT", device.getProductName());
321 assertEquals("087610000435", device.getIdentifier());
322 assertEquals("22", device.getDeviceId());
323 assertEquals("03.50", device.getFirmwareVersion());
324 assertEquals("AVM", device.getManufacturer());
326 assertEquals(0, device.getPresent());
327 assertEquals("Comet DECT #1", device.getName());
329 assertFalse(device.isButton());
330 assertFalse(device.isHANFUNButton());
331 assertFalse(device.isHANFUNAlarmSensor());
332 assertFalse(device.isDectRepeater());
333 assertFalse(device.isSwitchableOutlet());
334 assertTrue(device.isTemperatureSensor());
335 assertFalse(device.isHumiditySensor());
336 assertFalse(device.isPowermeter());
337 assertTrue(device.isHeatingThermostat());
338 assertFalse(device.isHANFUNBlinds());
340 assertNull(device.getSwitch());
342 assertNotNull(device.getTemperature());
343 assertEquals(new BigDecimal("22.0"), device.getTemperature().getCelsius());
344 assertEquals(new BigDecimal("-1.0"), device.getTemperature().getOffset());
346 assertNull(device.getPowermeter());
348 validateHeatingModel(device.getHkr());
352 public void validateDECT400Model() {
353 Optional<AVMFritzBaseModel> optionalDevice = findModelByIdentifier("130960007307");
354 assertTrue(optionalDevice.isPresent());
355 assertTrue(optionalDevice.get() instanceof DeviceModel);
357 DeviceModel device = (DeviceModel) optionalDevice.get();
358 assertEquals("FRITZ!DECT 400", device.getProductName());
359 assertEquals("130960007307", device.getIdentifier());
360 assertEquals("29", device.getDeviceId());
361 assertEquals("04.90", device.getFirmwareVersion());
362 assertEquals("AVM", device.getManufacturer());
364 assertEquals(1, device.getPresent());
365 assertEquals("FRITZ!DECT 400 #14", device.getName());
367 assertTrue(device.isButton());
368 assertFalse(device.isHANFUNButton());
369 assertFalse(device.isHANFUNAlarmSensor());
370 assertFalse(device.isDectRepeater());
371 assertFalse(device.isSwitchableOutlet());
372 assertFalse(device.isTemperatureSensor());
373 assertFalse(device.isHumiditySensor());
374 assertFalse(device.isPowermeter());
375 assertFalse(device.isHeatingThermostat());
376 assertFalse(device.isHANFUNBlinds());
378 assertEquals(new BigDecimal("100"), device.getBattery());
379 assertEquals(BatteryModel.BATTERY_OFF, device.getBatterylow());
381 assertEquals(2, device.getButtons().size());
382 assertEquals("FRITZ!DECT 400 #14: kurz", device.getButtons().get(0).getName());
383 assertEquals(1549195586, device.getButtons().get(0).getLastpressedtimestamp());
384 assertEquals("FRITZ!DECT 400 #14: lang", device.getButtons().get(1).getName());
385 assertEquals(1549195595, device.getButtons().get(1).getLastpressedtimestamp());
387 assertNull(device.getAlert());
389 assertNull(device.getSwitch());
391 assertNull(device.getTemperature());
393 assertNull(device.getPowermeter());
395 assertNull(device.getHkr());
397 assertNull(device.getLevelControlModel());
401 public void validateDECT440Model() {
402 Optional<AVMFritzBaseModel> optionalDevice = findModelByIdentifier("130960007308");
403 assertTrue(optionalDevice.isPresent());
404 assertTrue(optionalDevice.get() instanceof DeviceModel);
406 DeviceModel device = (DeviceModel) optionalDevice.get();
407 assertEquals("FRITZ!DECT 440", device.getProductName());
408 assertEquals("130960007308", device.getIdentifier());
409 assertEquals("30", device.getDeviceId());
410 assertEquals("05.10", device.getFirmwareVersion());
411 assertEquals("AVM", device.getManufacturer());
413 assertEquals(1, device.getPresent());
414 assertEquals("FRITZ!DECT 440 #15", device.getName());
416 assertTrue(device.isButton());
417 assertFalse(device.isHANFUNButton());
418 assertFalse(device.isHANFUNAlarmSensor());
419 assertFalse(device.isDectRepeater());
420 assertFalse(device.isSwitchableOutlet());
421 assertTrue(device.isTemperatureSensor());
422 assertTrue(device.isHumiditySensor());
423 assertFalse(device.isPowermeter());
424 assertFalse(device.isHeatingThermostat());
425 assertFalse(device.isHANFUNBlinds());
427 assertEquals(new BigDecimal("100"), device.getBattery());
428 assertEquals(BatteryModel.BATTERY_OFF, device.getBatterylow());
430 assertEquals(4, device.getButtons().size());
431 final ButtonModel topRight = device.getButtons().get(0);
432 assertEquals("130960007308-1", topRight.getIdentifier());
433 assertEquals("5000", topRight.getButtonId());
434 assertEquals("FRITZ!DECT 440 #15: Oben rechts", topRight.getName());
435 assertEquals(1549195586, topRight.getLastpressedtimestamp());
436 final ButtonModel bottomRight = device.getButtons().get(1);
437 assertEquals("130960007308-3", bottomRight.getIdentifier());
438 assertEquals("5001", bottomRight.getButtonId());
439 assertEquals("FRITZ!DECT 440 #15: Unten rechts", bottomRight.getName());
440 assertEquals(1549195595, bottomRight.getLastpressedtimestamp());
441 final ButtonModel bottomLeft = device.getButtons().get(2);
442 assertEquals("130960007308-5", bottomLeft.getIdentifier());
443 assertEquals("5002", bottomLeft.getButtonId());
444 assertEquals("FRITZ!DECT 440 #15: Unten links", bottomLeft.getName());
445 assertEquals(1549195586, bottomLeft.getLastpressedtimestamp());
446 final ButtonModel topLeft = device.getButtons().get(3);
447 assertEquals("130960007308-7", topLeft.getIdentifier());
448 assertEquals("5003", topLeft.getButtonId());
449 assertEquals("FRITZ!DECT 440 #15: Oben links", topLeft.getName());
450 assertEquals(1549195595, topLeft.getLastpressedtimestamp());
452 assertNull(device.getAlert());
454 assertNull(device.getSwitch());
456 assertNotNull(device.getTemperature());
457 assertEquals(new BigDecimal("23.0"), device.getTemperature().getCelsius());
458 assertEquals(new BigDecimal("0.0"), device.getTemperature().getOffset());
460 assertNotNull(device.getHumidity());
461 assertEquals(new BigDecimal("43"), device.getHumidity().getRelativeHumidity());
463 assertNull(device.getPowermeter());
465 assertNull(device.getHkr());
467 assertNull(device.getLevelControlModel());
471 public void validatePowerline546EModel() {
472 Optional<AVMFritzBaseModel> optionalDevice = findModel("FRITZ!Powerline 546E");
473 assertTrue(optionalDevice.isPresent());
474 assertTrue(optionalDevice.get() instanceof DeviceModel);
476 DeviceModel device = (DeviceModel) optionalDevice.get();
477 assertEquals("FRITZ!Powerline 546E", device.getProductName());
478 assertEquals("5C:49:79:F0:A3:84", device.getIdentifier());
479 assertEquals("30", device.getDeviceId());
480 assertEquals("06.92", device.getFirmwareVersion());
481 assertEquals("AVM", device.getManufacturer());
483 assertEquals(1, device.getPresent());
484 assertEquals("FRITZ!Powerline 546E #1", device.getName());
486 assertFalse(device.isButton());
487 assertFalse(device.isHANFUNButton());
488 assertFalse(device.isHANFUNAlarmSensor());
489 assertFalse(device.isDectRepeater());
490 assertTrue(device.isSwitchableOutlet());
491 assertFalse(device.isTemperatureSensor());
492 assertFalse(device.isHumiditySensor());
493 assertTrue(device.isPowermeter());
494 assertFalse(device.isHeatingThermostat());
495 assertFalse(device.isHANFUNBlinds());
497 assertNotNull(device.getSwitch());
498 assertEquals(SwitchModel.OFF, device.getSwitch().getState());
499 assertEquals(MODE_MANUAL, device.getSwitch().getMode());
500 assertEquals(BigDecimal.ZERO, device.getSwitch().getLock());
501 assertEquals(BigDecimal.ONE, device.getSwitch().getDevicelock());
503 assertNull(device.getTemperature());
505 validatePowerMeter(device.getPowermeter());
507 assertNull(device.getHkr());
509 assertNull(device.getLevelControlModel());
513 public void validateHANFUNContactModel() {
514 Optional<AVMFritzBaseModel> optionalDevice = findModelByIdentifier("119340059978-1");
515 assertTrue(optionalDevice.isPresent());
516 assertTrue(optionalDevice.get() instanceof DeviceModel);
518 DeviceModel device = (DeviceModel) optionalDevice.get();
519 assertEquals("HAN-FUN", device.getProductName());
520 assertEquals("119340059978-1", device.getIdentifier());
521 assertEquals("2000", device.getDeviceId());
522 assertEquals("0.0", device.getFirmwareVersion());
523 assertEquals("0x0feb", device.getManufacturer());
525 assertEquals(0, device.getPresent());
526 assertEquals("HAN-FUN #2: Unit #2", device.getName());
528 assertFalse(device.isButton());
529 assertFalse(device.isHANFUNButton());
530 assertTrue(device.isHANFUNAlarmSensor());
531 assertFalse(device.isDectRepeater());
532 assertFalse(device.isSwitchableOutlet());
533 assertFalse(device.isTemperatureSensor());
534 assertFalse(device.isHumiditySensor());
535 assertFalse(device.isPowermeter());
536 assertFalse(device.isHeatingThermostat());
537 assertFalse(device.isHANFUNBlinds());
539 assertTrue(device.getButtons().isEmpty());
541 assertNotNull(device.getAlert());
542 assertEquals(BigDecimal.ONE, device.getAlert().getState());
544 assertNull(device.getSwitch());
546 assertNull(device.getTemperature());
548 assertNull(device.getPowermeter());
550 assertNull(device.getHkr());
552 assertNull(device.getLevelControlModel());
556 public void validateHANFUNSwitchModel() {
557 Optional<AVMFritzBaseModel> optionalDevice = findModelByIdentifier("119340059979-1");
558 assertTrue(optionalDevice.isPresent());
559 assertTrue(optionalDevice.get() instanceof DeviceModel);
561 DeviceModel device = (DeviceModel) optionalDevice.get();
562 assertEquals("HAN-FUN", device.getProductName());
563 assertEquals("119340059979-1", device.getIdentifier());
564 assertEquals("2001", device.getDeviceId());
565 assertEquals("0.0", device.getFirmwareVersion());
566 assertEquals("0x0feb", device.getManufacturer());
568 assertEquals(0, device.getPresent());
569 assertEquals("HAN-FUN #2: Unit #2", device.getName());
571 assertFalse(device.isButton());
572 assertTrue(device.isHANFUNButton());
573 assertFalse(device.isHANFUNAlarmSensor());
574 assertFalse(device.isDectRepeater());
575 assertFalse(device.isSwitchableOutlet());
576 assertFalse(device.isTemperatureSensor());
577 assertFalse(device.isHumiditySensor());
578 assertFalse(device.isPowermeter());
579 assertFalse(device.isHeatingThermostat());
580 assertFalse(device.isHANFUNBlinds());
582 assertEquals(1, device.getButtons().size());
583 assertEquals(1529590797, device.getButtons().get(0).getLastpressedtimestamp());
585 assertNull(device.getAlert());
587 assertNull(device.getSwitch());
589 assertNull(device.getTemperature());
591 assertNull(device.getPowermeter());
593 assertNull(device.getHkr());
595 assertNull(device.getLevelControlModel());
599 public void validateHANFUNBlindModel() {
600 Optional<AVMFritzBaseModel> optionalDevice = findModelByIdentifier("142760503450-1");
601 assertTrue(optionalDevice.isPresent());
602 assertTrue(optionalDevice.get() instanceof DeviceModel);
604 DeviceModel device = (DeviceModel) optionalDevice.get();
605 assertEquals("Rollotron 1213", device.getProductName());
606 assertEquals("142760503450-1", device.getIdentifier());
607 assertEquals("2000", device.getDeviceId());
608 assertEquals("0.0", device.getFirmwareVersion());
609 assertEquals("0x37c4", device.getManufacturer());
611 assertEquals(1, device.getPresent());
612 assertEquals("Rollotron 1213 #1", device.getName());
614 assertFalse(device.isButton());
615 assertFalse(device.isHANFUNButton());
616 assertTrue(device.isHANFUNAlarmSensor());
617 assertFalse(device.isDectRepeater());
618 assertFalse(device.isSwitchableOutlet());
619 assertFalse(device.isTemperatureSensor());
620 assertFalse(device.isHumiditySensor());
621 assertFalse(device.isPowermeter());
622 assertFalse(device.isHeatingThermostat());
623 assertTrue(device.isHANFUNBlinds());
625 assertTrue(device.getButtons().isEmpty());
627 assertNotNull(device.getAlert());
628 assertEquals(BigDecimal.ZERO, device.getAlert().getState());
630 assertNull(device.getSwitch());
632 assertNull(device.getTemperature());
634 assertNull(device.getPowermeter());
636 assertNull(device.getHkr());
638 LevelControlModel levelcontrol = device.getLevelControlModel();
639 assertNotNull(levelcontrol);
640 assertEquals(BigDecimal.valueOf(26L), levelcontrol.getLevel());
641 assertEquals(BigDecimal.valueOf(10L), levelcontrol.getLevelPercentage());
645 public void validateHANFUNOnOffModel() {
646 Optional<AVMFritzBaseModel> optionalDevice = findModelByIdentifier("113240824499-1");
647 assertTrue(optionalDevice.isPresent());
648 assertTrue(optionalDevice.get() instanceof DeviceModel);
650 DeviceModel device = (DeviceModel) optionalDevice.get();
651 assertEquals("HAN-FUN", device.getProductName());
652 assertEquals("113240824499-1", device.getIdentifier());
653 assertEquals("2002", device.getDeviceId());
654 assertEquals("0.0", device.getFirmwareVersion());
655 assertEquals("0x2c3c", device.getManufacturer());
657 assertEquals(1, device.getPresent());
658 assertEquals("Steckdose innen", device.getName());
660 assertFalse(device.isHANFUNButton());
661 assertFalse(device.isHANFUNAlarmSensor());
662 assertFalse(device.isButton());
663 assertFalse(device.isHeatingThermostat());
664 assertFalse(device.isPowermeter());
665 assertFalse(device.isTemperatureSensor());
666 assertFalse(device.isSwitchableOutlet());
667 assertFalse(device.isDectRepeater());
668 assertFalse(device.hasMicrophone());
669 assertTrue(device.isHANFUNUnit());
670 assertTrue(device.isHANFUNOnOff());
671 assertFalse(device.isHANFUNBlinds());
672 assertFalse(device.isHumiditySensor());
674 assertTrue(device.getButtons().isEmpty());
676 assertNull(device.getAlert());
678 assertNull(device.getSwitch());
680 assertNull(device.getTemperature());
682 SimpleOnOffModel model = device.getSimpleOnOffUnit();
683 assertNotNull(model);
684 assertEquals(false, model.state);
686 assertNull(device.getPowermeter());
688 assertNull(device.getHkr());
690 assertNull(device.getLevelControlModel());
694 public void validateHeatingGroupModel() {
695 Optional<AVMFritzBaseModel> optionalGroup = findModelByIdentifier("F0:A3:7F-901");
696 assertTrue(optionalGroup.isPresent());
697 assertTrue(optionalGroup.get() instanceof GroupModel);
699 GroupModel group = (GroupModel) optionalGroup.get();
700 assertEquals("", group.getProductName());
701 assertEquals("F0:A3:7F-901", group.getIdentifier());
702 assertEquals("20001", group.getDeviceId());
703 assertEquals("1.0", group.getFirmwareVersion());
704 assertEquals("AVM", group.getManufacturer());
706 assertEquals(1, group.getPresent());
707 assertEquals("Schlafzimmer", group.getName());
709 assertFalse(group.isButton());
710 assertFalse(group.isHANFUNButton());
711 assertFalse(group.isHANFUNAlarmSensor());
712 assertFalse(group.isDectRepeater());
713 assertFalse(group.isSwitchableOutlet());
714 assertFalse(group.isTemperatureSensor());
715 assertFalse(group.isHumiditySensor());
716 assertFalse(group.isPowermeter());
717 assertTrue(group.isHeatingThermostat());
718 assertFalse(group.isHANFUNBlinds());
720 assertNull(group.getSwitch());
722 assertNull(group.getPowermeter());
724 validateHeatingModel(group.getHkr());
726 assertNotNull(group.getGroupinfo());
727 assertEquals("0", group.getGroupinfo().getMasterdeviceid());
728 assertEquals("20,21,22", group.getGroupinfo().getMembers());
732 public void validateSwitchGroupModel() {
733 Optional<AVMFritzBaseModel> optionalGroup = findModelByIdentifier("F0:A3:7F-900");
734 assertTrue(optionalGroup.isPresent());
735 assertTrue(optionalGroup.get() instanceof GroupModel);
737 GroupModel group = (GroupModel) optionalGroup.get();
738 assertEquals("", group.getProductName());
739 assertEquals("F0:A3:7F-900", group.getIdentifier());
740 assertEquals("20000", group.getDeviceId());
741 assertEquals("1.0", group.getFirmwareVersion());
742 assertEquals("AVM", group.getManufacturer());
744 assertEquals(1, group.getPresent());
745 assertEquals("Schlafzimmer", group.getName());
747 assertFalse(group.isButton());
748 assertFalse(group.isHANFUNButton());
749 assertFalse(group.isHANFUNAlarmSensor());
750 assertFalse(group.isDectRepeater());
751 assertTrue(group.isSwitchableOutlet());
752 assertFalse(group.isTemperatureSensor());
753 assertFalse(group.isHumiditySensor());
754 assertTrue(group.isPowermeter());
755 assertFalse(group.isHeatingThermostat());
756 assertFalse(group.isHANFUNBlinds());
758 assertNotNull(group.getSwitch());
759 assertEquals(SwitchModel.ON, group.getSwitch().getState());
760 assertEquals(MODE_MANUAL, group.getSwitch().getMode());
761 assertEquals(BigDecimal.ZERO, group.getSwitch().getLock());
762 assertEquals(BigDecimal.ZERO, group.getSwitch().getDevicelock());
764 validatePowerMeter(group.getPowermeter());
766 assertNull(group.getHkr());
768 assertNotNull(group.getGroupinfo());
769 assertEquals("17", group.getGroupinfo().getMasterdeviceid());
770 assertEquals("17,18", group.getGroupinfo().getMembers());
773 private Optional<AVMFritzBaseModel> findModel(String name) {
774 return devices.getDevicelist().stream().filter(it -> name.equals(it.getProductName())).findFirst();
777 private Optional<AVMFritzBaseModel> findModelByIdentifier(String identifier) {
778 return devices.getDevicelist().stream().filter(it -> identifier.equals(it.getIdentifier())).findFirst();
781 private void validatePowerMeter(PowerMeterModel model) {
782 assertNotNull(model);
783 assertEquals(new BigDecimal("230.051"), model.getVoltage());
784 assertEquals(new BigDecimal("0.000"), model.getPower());
785 assertEquals(new BigDecimal("2087"), model.getEnergy());
788 private void validateHeatingModel(HeatingModel model) {
789 assertNotNull(model);
790 assertEquals(new BigDecimal(44), model.getTist());
791 assertEquals(new BigDecimal(42), model.getTsoll());
792 assertEquals(new BigDecimal(28), model.getAbsenk());
793 assertEquals(new BigDecimal(42), model.getKomfort());
794 assertEquals(BigDecimal.ONE, model.getLock());
795 assertEquals(BigDecimal.ONE, model.getDevicelock());
796 assertEquals(BigDecimal.ZERO, model.getWindowopenactiv());
797 assertEquals(BigDecimal.ZERO, model.getBoostactive());
798 assertEquals(new BigDecimal("100"), model.getBattery());
799 assertEquals(BatteryModel.BATTERY_OFF, model.getBatterylow());
800 assertEquals(MODE_AUTO, model.getMode());
801 assertEquals(MODE_COMFORT, model.getRadiatorMode());
803 assertNotNull(model.getNextchange());
804 assertEquals(1484341200, model.getNextchange().getEndperiod());
805 assertEquals(new BigDecimal(28), model.getNextchange().getTchange());