2 * Copyright (c) 2010-2023 Contributors to the openHAB project
4 * See the NOTICE file(s) distributed with this work for additional
7 * This program and the accompanying materials are made available under the
8 * terms of the Eclipse Public License 2.0 which is available at
9 * http://www.eclipse.org/legal/epl-2.0
11 * SPDX-License-Identifier: EPL-2.0
13 package org.openhab.binding.avmfritz.internal.dto;
15 import static org.junit.jupiter.api.Assertions.*;
16 import static org.openhab.binding.avmfritz.internal.AVMFritzBindingConstants.*;
18 import java.io.StringReader;
19 import java.math.BigDecimal;
20 import java.util.Optional;
22 import javax.xml.bind.JAXBException;
23 import javax.xml.bind.Unmarshaller;
24 import javax.xml.stream.XMLStreamException;
25 import javax.xml.stream.XMLStreamReader;
27 import org.eclipse.jdt.annotation.NonNullByDefault;
28 import org.junit.jupiter.api.BeforeEach;
29 import org.junit.jupiter.api.Test;
30 import org.openhab.binding.avmfritz.internal.util.JAXBUtils;
33 * Tests for {@link DeviceListModel}.
35 * @author Christoph Weitkamp - Initial contribution
36 * @author Ulrich Mertin - Added support for HAN-FUN blinds
39 public class AVMFritzDeviceListModelTest {
41 private @NonNullByDefault({}) DeviceListModel devices;
43 @SuppressWarnings("null")
45 public void setUp() throws JAXBException, XMLStreamException {
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="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>\
53 <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>\
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>\
64 <device identifier="11324 0824499-1" id="2002" functionbitmask="40960" fwversion="0.0" manufacturer="0x2c3c" productname="HAN-FUN">
67 <name>Steckdose innen</name>
72 <etsideviceid>408</etsideviceid>
73 <unittype>263</unittype>
74 <interfaces>512,768</interfaces>
77 <device identifier="11324 0584796-1" id="2001" functionbitmask="40960" fwversion="0.0" manufacturer="0x2c3c" productname="HAN-FUN">
80 <name>Steckdose außen</name>
85 <etsideviceid>407</etsideviceid>
86 <unittype>262</unittype>
87 <interfaces>512</interfaces>
90 <device identifier="12701 0027533-1" id="2002" functionbitmask="237572" fwversion="0.0" manufacturer="0x319d" productname="HAN-FUN">
93 <name>SmartHome LED-Lampe #1</name>
99 <levelpercentage>10</levelpercentage>
101 <colorcontrol supported_modes="0" current_mode="" fullcolorsupport="0" mapped="0">
103 <saturation>100</saturation>
104 <unmapped_hue></unmapped_hue>
105 <unmapped_saturation></unmapped_saturation>
106 <temperature>2700</temperature>
109 <etsideviceid>407</etsideviceid>
110 <unittype>278</unittype>
111 <interfaces>512,514,513</interfaces>
117 XMLStreamReader xsr = JAXBUtils.XMLINPUTFACTORY.createXMLStreamReader(new StringReader(xml));
118 Unmarshaller u = JAXBUtils.JAXBCONTEXT_DEVICES.createUnmarshaller();
119 devices = u.unmarshal(xsr, DeviceListModel.class).getValue();
123 public void validateDeviceListModel() {
124 assertNotNull(devices);
125 assertEquals(17, devices.getDevicelist().size());
126 assertEquals("1", devices.getXmlApiVersion());
130 public void validateDECTRepeater100Model() {
131 Optional<AVMFritzBaseModel> optionalDevice = findModelByIdentifier("087610000439");
132 assertTrue(optionalDevice.isPresent());
133 assertTrue(optionalDevice.get() instanceof DeviceModel);
135 DeviceModel device = (DeviceModel) optionalDevice.get();
136 assertEquals("FRITZ!DECT Repeater 100", device.getProductName());
137 assertEquals("087610000439", device.getIdentifier());
138 assertEquals("40", device.getDeviceId());
139 assertEquals("03.86", device.getFirmwareVersion());
140 assertEquals("AVM", device.getManufacturer());
142 assertEquals(1, device.getPresent());
143 assertEquals("FRITZ!DECT Repeater 100 #5", device.getName());
145 assertFalse(device.isButton());
146 assertFalse(device.isHANFUNButton());
147 assertFalse(device.isHANFUNAlarmSensor());
148 assertTrue(device.isDectRepeater());
149 assertFalse(device.isSwitchableOutlet());
150 assertTrue(device.isTemperatureSensor());
151 assertFalse(device.isHumiditySensor());
152 assertFalse(device.isPowermeter());
153 assertFalse(device.isHeatingThermostat());
154 assertFalse(device.isHANFUNBlinds());
156 assertNull(device.getSwitch());
158 assertNotNull(device.getTemperature());
159 assertEquals(new BigDecimal("23.0"), device.getTemperature().getCelsius());
160 assertEquals(new BigDecimal("0.0"), device.getTemperature().getOffset());
162 assertNull(device.getPowermeter());
164 assertNull(device.getHkr());
166 assertNull(device.getLevelControlModel());
170 public void validateDECT200Model() {
171 Optional<AVMFritzBaseModel> optionalDevice = findModel("FRITZ!DECT 200");
172 assertTrue(optionalDevice.isPresent());
173 assertTrue(optionalDevice.get() instanceof DeviceModel);
175 DeviceModel device = (DeviceModel) optionalDevice.get();
176 assertEquals("FRITZ!DECT 200", device.getProductName());
177 assertEquals("087610000434", device.getIdentifier());
178 assertEquals("17", device.getDeviceId());
179 assertEquals("03.83", device.getFirmwareVersion());
180 assertEquals("AVM", device.getManufacturer());
182 assertEquals(1, device.getPresent());
183 assertEquals("FRITZ!DECT 200 #1", device.getName());
185 assertFalse(device.isHANFUNButton());
186 assertFalse(device.isHANFUNAlarmSensor());
187 assertFalse(device.isButton());
188 assertFalse(device.isHeatingThermostat());
189 assertTrue(device.isPowermeter());
190 assertTrue(device.isTemperatureSensor());
191 assertTrue(device.isSwitchableOutlet());
192 assertFalse(device.isDectRepeater());
193 assertTrue(device.hasMicrophone());
194 assertFalse(device.isHANFUNUnit());
195 assertTrue(device.isHANFUNOnOff());
196 assertFalse(device.isHANFUNBlinds());
197 assertFalse(device.isHumiditySensor());
199 assertNotNull(device.getSwitch());
200 assertEquals(SwitchModel.ON, device.getSwitch().getState());
201 assertEquals(MODE_MANUAL, device.getSwitch().getMode());
202 assertEquals(BigDecimal.ZERO, device.getSwitch().getLock());
203 assertEquals(BigDecimal.ZERO, device.getSwitch().getDevicelock());
205 assertNotNull(device.getTemperature());
206 assertEquals(new BigDecimal("25.5"), device.getTemperature().getCelsius());
207 assertEquals(new BigDecimal("0.0"), device.getTemperature().getOffset());
209 validatePowerMeter(device.getPowermeter());
211 assertNull(device.getHkr());
213 assertNull(device.getLevelControlModel());
217 public void validateDECT210Model() {
218 Optional<AVMFritzBaseModel> optionalDevice = findModel("FRITZ!DECT 210");
219 assertTrue(optionalDevice.isPresent());
220 assertTrue(optionalDevice.get() instanceof DeviceModel);
222 DeviceModel device = (DeviceModel) optionalDevice.get();
223 assertEquals("FRITZ!DECT 210", device.getProductName());
224 assertEquals("087610000438", device.getIdentifier());
225 assertEquals("18", device.getDeviceId());
226 assertEquals("03.83", device.getFirmwareVersion());
227 assertEquals("AVM", device.getManufacturer());
229 assertEquals(1, device.getPresent());
230 assertEquals("FRITZ!DECT 210 #8", device.getName());
232 assertFalse(device.isHANFUNButton());
233 assertFalse(device.isHANFUNAlarmSensor());
234 assertFalse(device.isButton());
235 assertFalse(device.isHeatingThermostat());
236 assertTrue(device.isPowermeter());
237 assertTrue(device.isTemperatureSensor());
238 assertTrue(device.isSwitchableOutlet());
239 assertFalse(device.isDectRepeater());
240 assertTrue(device.hasMicrophone());
241 assertFalse(device.isHANFUNUnit());
242 assertTrue(device.isHANFUNOnOff());
243 assertFalse(device.isHANFUNBlinds());
244 assertFalse(device.isHumiditySensor());
246 assertNotNull(device.getSwitch());
247 assertEquals(SwitchModel.ON, device.getSwitch().getState());
248 assertEquals(MODE_MANUAL, device.getSwitch().getMode());
249 assertEquals(BigDecimal.ZERO, device.getSwitch().getLock());
250 assertEquals(BigDecimal.ZERO, device.getSwitch().getDevicelock());
252 assertNotNull(device.getTemperature());
253 assertEquals(new BigDecimal("25.5"), device.getTemperature().getCelsius());
254 assertEquals(new BigDecimal("0.0"), device.getTemperature().getOffset());
256 validatePowerMeter(device.getPowermeter());
258 assertNull(device.getHkr());
260 assertNull(device.getLevelControlModel());
264 public void validateDECT300Model() {
265 Optional<AVMFritzBaseModel> optionalDevice = findModel("FRITZ!DECT 300");
266 assertTrue(optionalDevice.isPresent());
267 assertTrue(optionalDevice.get() instanceof DeviceModel);
269 DeviceModel device = (DeviceModel) optionalDevice.get();
270 assertEquals("FRITZ!DECT 300", device.getProductName());
271 assertEquals("087610000437", device.getIdentifier());
272 assertEquals("20", device.getDeviceId());
273 assertEquals("03.50", device.getFirmwareVersion());
274 assertEquals("AVM", device.getManufacturer());
276 assertEquals(0, device.getPresent());
277 assertEquals("FRITZ!DECT 300 #1", device.getName());
279 assertFalse(device.isButton());
280 assertFalse(device.isHANFUNButton());
281 assertFalse(device.isHANFUNAlarmSensor());
282 assertFalse(device.isDectRepeater());
283 assertFalse(device.isSwitchableOutlet());
284 assertTrue(device.isTemperatureSensor());
285 assertFalse(device.isHumiditySensor());
286 assertFalse(device.isPowermeter());
287 assertTrue(device.isHeatingThermostat());
288 assertFalse(device.isHANFUNBlinds());
290 assertNull(device.getSwitch());
292 assertNotNull(device.getTemperature());
293 assertEquals(new BigDecimal("22.0"), device.getTemperature().getCelsius());
294 assertEquals(new BigDecimal("-1.0"), device.getTemperature().getOffset());
296 assertNull(device.getPowermeter());
298 validateHeatingModel(device.getHkr());
302 public void validateDECT301Model() {
303 Optional<AVMFritzBaseModel> optionalDevice = findModel("FRITZ!DECT 301");
304 assertTrue(optionalDevice.isPresent());
305 assertTrue(optionalDevice.get() instanceof DeviceModel);
307 DeviceModel device = (DeviceModel) optionalDevice.get();
308 assertEquals("FRITZ!DECT 301", device.getProductName());
309 assertEquals("087610000436", device.getIdentifier());
310 assertEquals("21", device.getDeviceId());
311 assertEquals("03.50", device.getFirmwareVersion());
312 assertEquals("AVM", device.getManufacturer());
314 assertEquals(0, device.getPresent());
315 assertEquals("FRITZ!DECT 301 #1", device.getName());
317 assertFalse(device.isButton());
318 assertFalse(device.isHANFUNButton());
319 assertFalse(device.isHANFUNAlarmSensor());
320 assertFalse(device.isDectRepeater());
321 assertFalse(device.isSwitchableOutlet());
322 assertTrue(device.isTemperatureSensor());
323 assertFalse(device.isHumiditySensor());
324 assertFalse(device.isPowermeter());
325 assertTrue(device.isHeatingThermostat());
326 assertFalse(device.isHANFUNBlinds());
328 assertNull(device.getSwitch());
330 assertNotNull(device.getTemperature());
331 assertEquals(new BigDecimal("22.0"), device.getTemperature().getCelsius());
332 assertEquals(new BigDecimal("-1.0"), device.getTemperature().getOffset());
334 assertNull(device.getPowermeter());
336 validateHeatingModel(device.getHkr());
340 public void validateCometDECTModel() {
341 Optional<AVMFritzBaseModel> optionalDevice = findModel("Comet DECT");
342 assertTrue(optionalDevice.isPresent());
343 assertTrue(optionalDevice.get() instanceof DeviceModel);
345 DeviceModel device = (DeviceModel) optionalDevice.get();
346 assertEquals("Comet DECT", device.getProductName());
347 assertEquals("087610000435", device.getIdentifier());
348 assertEquals("22", device.getDeviceId());
349 assertEquals("03.50", device.getFirmwareVersion());
350 assertEquals("AVM", device.getManufacturer());
352 assertEquals(0, device.getPresent());
353 assertEquals("Comet DECT #1", device.getName());
355 assertFalse(device.isButton());
356 assertFalse(device.isHANFUNButton());
357 assertFalse(device.isHANFUNAlarmSensor());
358 assertFalse(device.isDectRepeater());
359 assertFalse(device.isSwitchableOutlet());
360 assertTrue(device.isTemperatureSensor());
361 assertFalse(device.isHumiditySensor());
362 assertFalse(device.isPowermeter());
363 assertTrue(device.isHeatingThermostat());
364 assertFalse(device.isHANFUNBlinds());
366 assertNull(device.getSwitch());
368 assertNotNull(device.getTemperature());
369 assertEquals(new BigDecimal("22.0"), device.getTemperature().getCelsius());
370 assertEquals(new BigDecimal("-1.0"), device.getTemperature().getOffset());
372 assertNull(device.getPowermeter());
374 validateHeatingModel(device.getHkr());
378 public void validateDECT400Model() {
379 Optional<AVMFritzBaseModel> optionalDevice = findModelByIdentifier("130960007307");
380 assertTrue(optionalDevice.isPresent());
381 assertTrue(optionalDevice.get() instanceof DeviceModel);
383 DeviceModel device = (DeviceModel) optionalDevice.get();
384 assertEquals("FRITZ!DECT 400", device.getProductName());
385 assertEquals("130960007307", device.getIdentifier());
386 assertEquals("29", device.getDeviceId());
387 assertEquals("04.90", device.getFirmwareVersion());
388 assertEquals("AVM", device.getManufacturer());
390 assertEquals(1, device.getPresent());
391 assertEquals("FRITZ!DECT 400 #14", device.getName());
393 assertTrue(device.isButton());
394 assertFalse(device.isHANFUNButton());
395 assertFalse(device.isHANFUNAlarmSensor());
396 assertFalse(device.isDectRepeater());
397 assertFalse(device.isSwitchableOutlet());
398 assertFalse(device.isTemperatureSensor());
399 assertFalse(device.isHumiditySensor());
400 assertFalse(device.isPowermeter());
401 assertFalse(device.isHeatingThermostat());
402 assertFalse(device.isHANFUNBlinds());
404 assertEquals(new BigDecimal("100"), device.getBattery());
405 assertEquals(BatteryModel.BATTERY_OFF, device.getBatterylow());
407 assertEquals(2, device.getButtons().size());
408 assertEquals("FRITZ!DECT 400 #14: kurz", device.getButtons().get(0).getName());
409 assertEquals(1549195586, device.getButtons().get(0).getLastpressedtimestamp());
410 assertEquals("FRITZ!DECT 400 #14: lang", device.getButtons().get(1).getName());
411 assertEquals(1549195595, device.getButtons().get(1).getLastpressedtimestamp());
413 assertNull(device.getAlert());
415 assertNull(device.getSwitch());
417 assertNull(device.getTemperature());
419 assertNull(device.getPowermeter());
421 assertNull(device.getHkr());
423 assertNull(device.getLevelControlModel());
427 public void validateDECT440Model() {
428 Optional<AVMFritzBaseModel> optionalDevice = findModelByIdentifier("130960007308");
429 assertTrue(optionalDevice.isPresent());
430 assertTrue(optionalDevice.get() instanceof DeviceModel);
432 DeviceModel device = (DeviceModel) optionalDevice.get();
433 assertEquals("FRITZ!DECT 440", device.getProductName());
434 assertEquals("130960007308", device.getIdentifier());
435 assertEquals("30", device.getDeviceId());
436 assertEquals("05.10", device.getFirmwareVersion());
437 assertEquals("AVM", device.getManufacturer());
439 assertEquals(1, device.getPresent());
440 assertEquals("FRITZ!DECT 440 #15", device.getName());
442 assertTrue(device.isButton());
443 assertFalse(device.isHANFUNButton());
444 assertFalse(device.isHANFUNAlarmSensor());
445 assertFalse(device.isDectRepeater());
446 assertFalse(device.isSwitchableOutlet());
447 assertTrue(device.isTemperatureSensor());
448 assertTrue(device.isHumiditySensor());
449 assertFalse(device.isPowermeter());
450 assertFalse(device.isHeatingThermostat());
451 assertFalse(device.isHANFUNBlinds());
453 assertEquals(new BigDecimal("100"), device.getBattery());
454 assertEquals(BatteryModel.BATTERY_OFF, device.getBatterylow());
456 assertEquals(4, device.getButtons().size());
457 final ButtonModel topRight = device.getButtons().get(0);
458 assertEquals("130960007308-1", topRight.getIdentifier());
459 assertEquals("5000", topRight.getButtonId());
460 assertEquals("FRITZ!DECT 440 #15: Oben rechts", topRight.getName());
461 assertEquals(1549195586, topRight.getLastpressedtimestamp());
462 final ButtonModel bottomRight = device.getButtons().get(1);
463 assertEquals("130960007308-3", bottomRight.getIdentifier());
464 assertEquals("5001", bottomRight.getButtonId());
465 assertEquals("FRITZ!DECT 440 #15: Unten rechts", bottomRight.getName());
466 assertEquals(1549195595, bottomRight.getLastpressedtimestamp());
467 final ButtonModel bottomLeft = device.getButtons().get(2);
468 assertEquals("130960007308-5", bottomLeft.getIdentifier());
469 assertEquals("5002", bottomLeft.getButtonId());
470 assertEquals("FRITZ!DECT 440 #15: Unten links", bottomLeft.getName());
471 assertEquals(1549195586, bottomLeft.getLastpressedtimestamp());
472 final ButtonModel topLeft = device.getButtons().get(3);
473 assertEquals("130960007308-7", topLeft.getIdentifier());
474 assertEquals("5003", topLeft.getButtonId());
475 assertEquals("FRITZ!DECT 440 #15: Oben links", topLeft.getName());
476 assertEquals(1549195595, topLeft.getLastpressedtimestamp());
478 assertNull(device.getAlert());
480 assertNull(device.getSwitch());
482 assertNotNull(device.getTemperature());
483 assertEquals(new BigDecimal("23.0"), device.getTemperature().getCelsius());
484 assertEquals(new BigDecimal("0.0"), device.getTemperature().getOffset());
486 assertNotNull(device.getHumidity());
487 assertEquals(new BigDecimal("43"), device.getHumidity().getRelativeHumidity());
489 assertNull(device.getPowermeter());
491 assertNull(device.getHkr());
493 assertNull(device.getLevelControlModel());
497 public void validatePowerline546EModel() {
498 Optional<AVMFritzBaseModel> optionalDevice = findModel("FRITZ!Powerline 546E");
499 assertTrue(optionalDevice.isPresent());
500 assertTrue(optionalDevice.get() instanceof DeviceModel);
502 DeviceModel device = (DeviceModel) optionalDevice.get();
503 assertEquals("FRITZ!Powerline 546E", device.getProductName());
504 assertEquals("5C:49:79:F0:A3:84", device.getIdentifier());
505 assertEquals("30", device.getDeviceId());
506 assertEquals("06.92", device.getFirmwareVersion());
507 assertEquals("AVM", device.getManufacturer());
509 assertEquals(1, device.getPresent());
510 assertEquals("FRITZ!Powerline 546E #1", device.getName());
512 assertFalse(device.isButton());
513 assertFalse(device.isHANFUNButton());
514 assertFalse(device.isHANFUNAlarmSensor());
515 assertFalse(device.isDectRepeater());
516 assertTrue(device.isSwitchableOutlet());
517 assertFalse(device.isTemperatureSensor());
518 assertFalse(device.isHumiditySensor());
519 assertTrue(device.isPowermeter());
520 assertFalse(device.isHeatingThermostat());
521 assertFalse(device.isHANFUNBlinds());
523 assertNotNull(device.getSwitch());
524 assertEquals(SwitchModel.OFF, device.getSwitch().getState());
525 assertEquals(MODE_MANUAL, device.getSwitch().getMode());
526 assertEquals(BigDecimal.ZERO, device.getSwitch().getLock());
527 assertEquals(BigDecimal.ONE, device.getSwitch().getDevicelock());
529 assertNull(device.getTemperature());
531 validatePowerMeter(device.getPowermeter());
533 assertNull(device.getHkr());
535 assertNull(device.getLevelControlModel());
539 public void validateHANFUNContactModel() {
540 Optional<AVMFritzBaseModel> optionalDevice = findModelByIdentifier("119340059978-1");
541 assertTrue(optionalDevice.isPresent());
542 assertTrue(optionalDevice.get() instanceof DeviceModel);
544 DeviceModel device = (DeviceModel) optionalDevice.get();
545 assertEquals("HAN-FUN", device.getProductName());
546 assertEquals("119340059978-1", device.getIdentifier());
547 assertEquals("2000", device.getDeviceId());
548 assertEquals("0.0", device.getFirmwareVersion());
549 assertEquals("0x0feb", device.getManufacturer());
551 assertEquals(0, device.getPresent());
552 assertEquals("HAN-FUN #2: Unit #2", device.getName());
554 assertFalse(device.isButton());
555 assertFalse(device.isHANFUNButton());
556 assertTrue(device.isHANFUNAlarmSensor());
557 assertFalse(device.isDectRepeater());
558 assertFalse(device.isSwitchableOutlet());
559 assertFalse(device.isTemperatureSensor());
560 assertFalse(device.isHumiditySensor());
561 assertFalse(device.isPowermeter());
562 assertFalse(device.isHeatingThermostat());
563 assertFalse(device.isHANFUNBlinds());
565 assertTrue(device.getButtons().isEmpty());
567 assertNotNull(device.getAlert());
568 assertEquals(BigDecimal.ONE, device.getAlert().getState());
570 assertNull(device.getSwitch());
572 assertNull(device.getTemperature());
574 assertNull(device.getPowermeter());
576 assertNull(device.getHkr());
578 assertNull(device.getLevelControlModel());
582 public void validateHANFUNSwitchModel() {
583 Optional<AVMFritzBaseModel> optionalDevice = findModelByIdentifier("119340059979-1");
584 assertTrue(optionalDevice.isPresent());
585 assertTrue(optionalDevice.get() instanceof DeviceModel);
587 DeviceModel device = (DeviceModel) optionalDevice.get();
588 assertEquals("HAN-FUN", device.getProductName());
589 assertEquals("119340059979-1", device.getIdentifier());
590 assertEquals("2001", device.getDeviceId());
591 assertEquals("0.0", device.getFirmwareVersion());
592 assertEquals("0x0feb", device.getManufacturer());
594 assertEquals(0, device.getPresent());
595 assertEquals("HAN-FUN #2: Unit #2", device.getName());
597 assertFalse(device.isButton());
598 assertTrue(device.isHANFUNButton());
599 assertFalse(device.isHANFUNAlarmSensor());
600 assertFalse(device.isDectRepeater());
601 assertFalse(device.isSwitchableOutlet());
602 assertFalse(device.isTemperatureSensor());
603 assertFalse(device.isHumiditySensor());
604 assertFalse(device.isPowermeter());
605 assertFalse(device.isHeatingThermostat());
606 assertFalse(device.isHANFUNBlinds());
608 assertEquals(1, device.getButtons().size());
609 assertEquals(1529590797, device.getButtons().get(0).getLastpressedtimestamp());
611 assertNull(device.getAlert());
613 assertNull(device.getSwitch());
615 assertNull(device.getTemperature());
617 assertNull(device.getPowermeter());
619 assertNull(device.getHkr());
621 assertNull(device.getLevelControlModel());
625 public void validateHANFUNBlindModel() {
626 Optional<AVMFritzBaseModel> optionalDevice = findModelByIdentifier("142760503450-1");
627 assertTrue(optionalDevice.isPresent());
628 assertTrue(optionalDevice.get() instanceof DeviceModel);
630 DeviceModel device = (DeviceModel) optionalDevice.get();
631 assertEquals("Rollotron 1213", device.getProductName());
632 assertEquals("142760503450-1", device.getIdentifier());
633 assertEquals("2000", device.getDeviceId());
634 assertEquals("0.0", device.getFirmwareVersion());
635 assertEquals("0x37c4", device.getManufacturer());
637 assertEquals(1, device.getPresent());
638 assertEquals("Rollotron 1213 #1", device.getName());
640 assertFalse(device.isHANFUNDevice());
641 assertFalse(device.isHANFUNButton());
642 assertTrue(device.isHANFUNAlarmSensor());
643 assertFalse(device.isButton());
644 assertFalse(device.isSwitchableOutlet());
645 assertFalse(device.isTemperatureSensor());
646 assertFalse(device.isHumiditySensor());
647 assertFalse(device.isPowermeter());
648 assertFalse(device.isDectRepeater());
649 assertFalse(device.isHeatingThermostat());
650 assertFalse(device.hasMicrophone());
651 assertTrue(device.isHANFUNUnit());
652 assertTrue(device.isHANFUNOnOff());
653 assertTrue(device.isDimmableLight());
654 assertFalse(device.isColorLight());
655 assertTrue(device.isHANFUNBlinds());
657 assertTrue(device.getButtons().isEmpty());
659 assertNotNull(device.getAlert());
660 assertEquals(BigDecimal.ZERO, device.getAlert().getState());
662 assertNull(device.getSwitch());
664 assertNull(device.getTemperature());
666 assertNull(device.getPowermeter());
668 assertNull(device.getHkr());
670 LevelControlModel levelcontrol = device.getLevelControlModel();
671 assertNotNull(levelcontrol);
672 assertEquals(BigDecimal.valueOf(26L), levelcontrol.getLevel());
673 assertEquals(BigDecimal.valueOf(10L), levelcontrol.getLevelPercentage());
677 public void validateHANFUNColorLightModel() {
678 Optional<AVMFritzBaseModel> optionalDevice = findModelByIdentifier("127010027533-1");
679 assertTrue(optionalDevice.isPresent());
680 assertTrue(optionalDevice.get() instanceof DeviceModel);
682 DeviceModel device = (DeviceModel) optionalDevice.get();
683 assertEquals("HAN-FUN", device.getProductName());
684 assertEquals("127010027533-1", device.getIdentifier());
685 assertEquals("2002", device.getDeviceId());
686 assertEquals("0.0", device.getFirmwareVersion());
687 assertEquals("0x319d", device.getManufacturer());
689 assertEquals(0, device.getPresent());
690 assertEquals("SmartHome LED-Lampe #1", device.getName());
692 assertFalse(device.isHANFUNDevice());
693 assertFalse(device.isHANFUNButton());
694 assertFalse(device.isHANFUNAlarmSensor());
695 assertFalse(device.isButton());
696 assertFalse(device.isSwitchableOutlet());
697 assertFalse(device.isTemperatureSensor());
698 assertFalse(device.isHumiditySensor());
699 assertFalse(device.isPowermeter());
700 assertFalse(device.isDectRepeater());
701 assertFalse(device.isHeatingThermostat());
702 assertFalse(device.hasMicrophone());
703 assertTrue(device.isHANFUNUnit());
704 assertTrue(device.isHANFUNOnOff());
705 assertTrue(device.isDimmableLight());
706 assertTrue(device.isColorLight());
707 assertFalse(device.isHANFUNBlinds());
709 assertTrue(device.getButtons().isEmpty());
711 assertNull(device.getAlert());
713 assertNull(device.getSwitch());
715 assertNull(device.getTemperature());
717 assertNull(device.getPowermeter());
719 assertNull(device.getHkr());
721 LevelControlModel levelcontrol = device.getLevelControlModel();
722 assertNotNull(levelcontrol);
723 assertEquals(BigDecimal.valueOf(26L), levelcontrol.getLevel());
724 assertEquals(BigDecimal.valueOf(10L), levelcontrol.getLevelPercentage());
726 ColorControlModel colorModel = device.getColorControlModel();
727 assertNotNull(colorModel);
728 assertEquals(254, colorModel.hue);
729 assertEquals(100, colorModel.saturation);
730 assertEquals(0, colorModel.unmappedHue);
731 assertEquals(0, colorModel.unmappedSaturation);
732 assertEquals(2700, colorModel.temperature);
736 public void validateHANFUNOnOffModel() {
737 Optional<AVMFritzBaseModel> optionalDevice = findModelByIdentifier("113240824499-1");
738 assertTrue(optionalDevice.isPresent());
739 assertTrue(optionalDevice.get() instanceof DeviceModel);
741 DeviceModel device = (DeviceModel) optionalDevice.get();
742 assertEquals("HAN-FUN", device.getProductName());
743 assertEquals("113240824499-1", device.getIdentifier());
744 assertEquals("2002", device.getDeviceId());
745 assertEquals("0.0", device.getFirmwareVersion());
746 assertEquals("0x2c3c", device.getManufacturer());
748 assertEquals(1, device.getPresent());
749 assertEquals("Steckdose innen", device.getName());
751 assertFalse(device.isHANFUNButton());
752 assertFalse(device.isHANFUNAlarmSensor());
753 assertFalse(device.isButton());
754 assertFalse(device.isHeatingThermostat());
755 assertFalse(device.isPowermeter());
756 assertFalse(device.isTemperatureSensor());
757 assertFalse(device.isSwitchableOutlet());
758 assertFalse(device.isDectRepeater());
759 assertFalse(device.hasMicrophone());
760 assertTrue(device.isHANFUNUnit());
761 assertTrue(device.isHANFUNOnOff());
762 assertFalse(device.isHANFUNBlinds());
763 assertFalse(device.isHumiditySensor());
765 assertTrue(device.getButtons().isEmpty());
767 assertNull(device.getAlert());
769 assertNull(device.getSwitch());
771 assertNull(device.getTemperature());
773 SimpleOnOffModel model = device.getSimpleOnOffUnit();
774 assertNotNull(model);
775 assertEquals(false, model.state);
777 assertNull(device.getPowermeter());
779 assertNull(device.getHkr());
781 assertNull(device.getLevelControlModel());
785 public void validateHeatingGroupModel() {
786 Optional<AVMFritzBaseModel> optionalGroup = findModelByIdentifier("F0:A3:7F-901");
787 assertTrue(optionalGroup.isPresent());
788 assertTrue(optionalGroup.get() instanceof GroupModel);
790 GroupModel group = (GroupModel) optionalGroup.get();
791 assertEquals("", group.getProductName());
792 assertEquals("F0:A3:7F-901", group.getIdentifier());
793 assertEquals("20001", group.getDeviceId());
794 assertEquals("1.0", group.getFirmwareVersion());
795 assertEquals("AVM", group.getManufacturer());
797 assertEquals(1, group.getPresent());
798 assertEquals("Schlafzimmer", group.getName());
800 assertFalse(group.isButton());
801 assertFalse(group.isHANFUNButton());
802 assertFalse(group.isHANFUNAlarmSensor());
803 assertFalse(group.isDectRepeater());
804 assertFalse(group.isSwitchableOutlet());
805 assertFalse(group.isTemperatureSensor());
806 assertFalse(group.isHumiditySensor());
807 assertFalse(group.isPowermeter());
808 assertTrue(group.isHeatingThermostat());
809 assertFalse(group.isHANFUNBlinds());
811 assertNull(group.getSwitch());
813 assertNull(group.getPowermeter());
815 validateHeatingModel(group.getHkr());
817 assertNotNull(group.getGroupinfo());
818 assertEquals("0", group.getGroupinfo().getMasterdeviceid());
819 assertEquals("20,21,22", group.getGroupinfo().getMembers());
823 public void validateSwitchGroupModel() {
824 Optional<AVMFritzBaseModel> optionalGroup = findModelByIdentifier("F0:A3:7F-900");
825 assertTrue(optionalGroup.isPresent());
826 assertTrue(optionalGroup.get() instanceof GroupModel);
828 GroupModel group = (GroupModel) optionalGroup.get();
829 assertEquals("", group.getProductName());
830 assertEquals("F0:A3:7F-900", group.getIdentifier());
831 assertEquals("20000", group.getDeviceId());
832 assertEquals("1.0", group.getFirmwareVersion());
833 assertEquals("AVM", group.getManufacturer());
835 assertEquals(1, group.getPresent());
836 assertEquals("Schlafzimmer", group.getName());
838 assertFalse(group.isButton());
839 assertFalse(group.isHANFUNButton());
840 assertFalse(group.isHANFUNAlarmSensor());
841 assertFalse(group.isDectRepeater());
842 assertTrue(group.isSwitchableOutlet());
843 assertFalse(group.isTemperatureSensor());
844 assertFalse(group.isHumiditySensor());
845 assertTrue(group.isPowermeter());
846 assertFalse(group.isHeatingThermostat());
847 assertFalse(group.isHANFUNBlinds());
849 assertNotNull(group.getSwitch());
850 assertEquals(SwitchModel.ON, group.getSwitch().getState());
851 assertEquals(MODE_MANUAL, group.getSwitch().getMode());
852 assertEquals(BigDecimal.ZERO, group.getSwitch().getLock());
853 assertEquals(BigDecimal.ZERO, group.getSwitch().getDevicelock());
855 validatePowerMeter(group.getPowermeter());
857 assertNull(group.getHkr());
859 assertNotNull(group.getGroupinfo());
860 assertEquals("17", group.getGroupinfo().getMasterdeviceid());
861 assertEquals("17,18", group.getGroupinfo().getMembers());
864 private Optional<AVMFritzBaseModel> findModel(String name) {
865 return devices.getDevicelist().stream().filter(it -> name.equals(it.getProductName())).findFirst();
868 private Optional<AVMFritzBaseModel> findModelByIdentifier(String identifier) {
869 return devices.getDevicelist().stream().filter(it -> identifier.equals(it.getIdentifier())).findFirst();
872 private void validatePowerMeter(PowerMeterModel model) {
873 assertNotNull(model);
874 assertEquals(new BigDecimal("230.051"), model.getVoltage());
875 assertEquals(new BigDecimal("0.000"), model.getPower());
876 assertEquals(new BigDecimal("2087"), model.getEnergy());
879 private void validateHeatingModel(HeatingModel model) {
880 assertNotNull(model);
881 assertEquals(new BigDecimal(44), model.getTist());
882 assertEquals(new BigDecimal(42), model.getTsoll());
883 assertEquals(new BigDecimal(28), model.getAbsenk());
884 assertEquals(new BigDecimal(42), model.getKomfort());
885 assertEquals(BigDecimal.ONE, model.getLock());
886 assertEquals(BigDecimal.ONE, model.getDevicelock());
887 assertEquals(BigDecimal.ZERO, model.getWindowopenactiv());
888 assertEquals(BigDecimal.ZERO, model.getBoostactive());
889 assertEquals(new BigDecimal("100"), model.getBattery());
890 assertEquals(BatteryModel.BATTERY_OFF, model.getBatterylow());
891 assertEquals(MODE_AUTO, model.getMode());
892 assertEquals(MODE_COMFORT, model.getRadiatorMode());
894 assertNotNull(model.getNextchange());
895 assertEquals(1484341200, model.getNextchange().getEndperiod());
896 assertEquals(new BigDecimal(28), model.getNextchange().getTchange());