]> git.basschouten.com Git - openhab-addons.git/blob
a6a3aca56f9a6a4e4035cc05a18a24d18466e3d1
[openhab-addons.git] /
1 /**
2  * Copyright (c) 2010-2021 Contributors to the openHAB project
3  *
4  * See the NOTICE file(s) distributed with this work for additional
5  * information.
6  *
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
10  *
11  * SPDX-License-Identifier: EPL-2.0
12  */
13 package org.openhab.binding.avmfritz.internal.dto;
14
15 import static org.junit.jupiter.api.Assertions.*;
16 import static org.openhab.binding.avmfritz.internal.AVMFritzBindingConstants.*;
17
18 import java.io.StringReader;
19 import java.math.BigDecimal;
20 import java.util.Optional;
21
22 import javax.xml.bind.JAXBException;
23 import javax.xml.bind.Unmarshaller;
24
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;
31
32 /**
33  * Tests for {@link DeviceListModel}.
34  *
35  * @author Christoph Weitkamp - Initial contribution
36  */
37 @NonNullByDefault
38 public class AVMFritzDeviceListModelTest {
39
40     private final Logger logger = LoggerFactory.getLogger(AVMFritzDeviceListModelTest.class);
41
42     private @NonNullByDefault({}) DeviceListModel devices;
43
44     @BeforeEach
45     public void setUp() {
46         //@formatter:off
47         final String xml =
48                 "<devicelist version=\"1\">" +
49                     "<group identifier=\"F0:A3:7F-900\" id=\"20000\" functionbitmask=\"6784\" fwversion=\"1.0\" manufacturer=\"AVM\" productname=\"\"><present>1</present><name>Schlafzimmer</name><switch><state>1</state><mode>manuell</mode><lock>0</lock><devicelock>0</devicelock></switch><powermeter><voltage>230051</voltage><power>0</power><energy>2087</energy></powermeter><groupinfo><masterdeviceid>17</masterdeviceid><members>17,18</members></groupinfo></group>" +
50                     "<group identifier=\"F0:A3:7F-901\" id=\"20001\" functionbitmask=\"4160\" fwversion=\"1.0\" manufacturer=\"AVM\" productname=\"\"><present>1</present><name>Schlafzimmer</name><temperature><celsius>220</celsius><offset>-10</offset></temperature><hkr><tist>44</tist><tsoll>42</tsoll><absenk>28</absenk><komfort>42</komfort><lock>1</lock><devicelock>1</devicelock><errorcode>0</errorcode><windowopenactiv>0</windowopenactiv><windowopenactiveendtime>0</windowopenactiveendtime><boostactive>0</boostactive><boostactiveendtime>0</boostactiveendtime><batterylow>0</batterylow><battery>100</battery><nextchange><endperiod>1484341200</endperiod><tchange>28</tchange></nextchange></hkr><groupinfo><masterdeviceid>0</masterdeviceid><members>20,21,22</members></groupinfo></group>" +
51                     "<device identifier=\"08761 0000434\" id=\"17\" functionbitmask=\"2944\" fwversion=\"03.83\" manufacturer=\"AVM\" productname=\"FRITZ!DECT 200\"><present>1</present><name>FRITZ!DECT 200 #1</name><switch><state>1</state><mode>manuell</mode><lock>0</lock><devicelock>0</devicelock></switch><powermeter><voltage>230051</voltage><power>0</power><energy>2087</energy></powermeter><temperature><celsius>255</celsius><offset>0</offset></temperature></device>" +
52                     "<device identifier=\"08761 0000438\" id=\"18\" functionbitmask=\"2944\" fwversion=\"03.83\" manufacturer=\"AVM\" productname=\"FRITZ!DECT 210\"><present>1</present><name>FRITZ!DECT 210 #8</name><switch><state>1</state><mode>manuell</mode><lock>0</lock><devicelock>0</devicelock></switch><powermeter><voltage>230051</voltage><power>0</power><energy>2087</energy></powermeter><temperature><celsius>255</celsius><offset>0</offset></temperature></device>" +
53                     "<device identifier=\"08761 0000437\" id=\"20\" functionbitmask=\"320\" fwversion=\"03.50\" manufacturer=\"AVM\" productname=\"FRITZ!DECT 300\"><present>0</present><name>FRITZ!DECT 300 #1</name><temperature><celsius>220</celsius><offset>-10</offset></temperature><hkr><tist>44</tist><tsoll>42</tsoll><absenk>28</absenk><komfort>42</komfort><lock>1</lock><devicelock>1</devicelock><errorcode>0</errorcode><windowopenactiv>0</windowopenactiv><windowopenactiveendtime>0</windowopenactiveendtime><boostactive>0</boostactive><boostactiveendtime>0</boostactiveendtime><batterylow>0</batterylow><battery>100</battery><nextchange><endperiod>1484341200</endperiod><tchange>28</tchange></nextchange></hkr></device>" +
54                     "<device identifier=\"08761 0000436\" id=\"21\" functionbitmask=\"320\" fwversion=\"03.50\" manufacturer=\"AVM\" productname=\"FRITZ!DECT 301\"><present>0</present><name>FRITZ!DECT 301 #1</name><temperature><celsius>220</celsius><offset>-10</offset></temperature><hkr><tist>44</tist><tsoll>42</tsoll><absenk>28</absenk><komfort>42</komfort><lock>1</lock><devicelock>1</devicelock><errorcode>0</errorcode><windowopenactiv>0</windowopenactiv><windowopenactiveendtime>0</windowopenactiveendtime><boostactive>0</boostactive><boostactiveendtime>0</boostactiveendtime><batterylow>0</batterylow><battery>100</battery><nextchange><endperiod>1484341200</endperiod><tchange>28</tchange></nextchange></hkr></device>" +
55                     "<device identifier=\"08761 0000435\" id=\"22\" functionbitmask=\"320\" fwversion=\"03.50\" manufacturer=\"AVM\" productname=\"Comet DECT\"><present>0</present><name>Comet DECT #1</name><temperature><celsius>220</celsius><offset>-10</offset></temperature><hkr><tist>44</tist><tsoll>42</tsoll><absenk>28</absenk><komfort>42</komfort><lock>1</lock><devicelock>1</devicelock><errorcode>0</errorcode><windowopenactiv>0</windowopenactiv><windowopenactiveendtime>0</windowopenactiveendtime><boostactive>0</boostactive><boostactiveendtime>0</boostactiveendtime><batterylow>0</batterylow><battery>100</battery><nextchange><endperiod>1484341200</endperiod><tchange>28</tchange></nextchange></hkr></device>" +
56                     "<device identifier=\"5C:49:79:F0:A3:84\" id=\"30\" functionbitmask=\"640\" fwversion=\"06.92\" manufacturer=\"AVM\" productname=\"FRITZ!Powerline 546E\"><present>1</present><name>FRITZ!Powerline 546E #1</name><switch><state>0</state><mode>manuell</mode><lock>0</lock><devicelock>1</devicelock></switch><powermeter><voltage>230051</voltage><power>0</power><energy>2087</energy></powermeter></device>" +
57                     "<device identifier=\"08761 0000439\" id=\"40\" functionbitmask=\"1280\" fwversion=\"03.86\" manufacturer=\"AVM\" productname=\"FRITZ!DECT Repeater 100\"><present>1</present><name>FRITZ!DECT Repeater 100 #5</name><temperature><celsius>230</celsius><offset>0</offset></temperature></device>" +
58                     "<device identifier=\"11934 0059978-1\" id=\"2000\" functionbitmask=\"8208\" fwversion=\"0.0\" manufacturer=\"0x0feb\" productname=\"HAN-FUN\"><present>0</present><name>HAN-FUN #2: Unit #2</name><etsiunitinfo><etsideviceid>406</etsideviceid><unittype>514</unittype><interfaces>256</interfaces></etsiunitinfo><alert><state>1</state></alert></device>" +
59                     "<device identifier=\"11934 0059979-1\" id=\"2001\" functionbitmask=\"8200\" fwversion=\"0.0\" manufacturer=\"0x0feb\" productname=\"HAN-FUN\"><present>0</present><name>HAN-FUN #2: Unit #2</name><etsiunitinfo><etsideviceid>412</etsideviceid><unittype>273</unittype><interfaces>772</interfaces></etsiunitinfo><button><lastpressedtimestamp>1529590797</lastpressedtimestamp></button></device>" +
60                     "<device identifier=\"13096 0007307\" id=\"29\" functionbitmask=\"32\" fwversion=\"04.90\" manufacturer=\"AVM\" productname=\"FRITZ!DECT 400\"><present>1</present><name>FRITZ!DECT 400 #14</name><battery>100</battery><batterylow>0</batterylow><button identifier=\"13096 0007307-0\" id=\"5000\"><name>FRITZ!DECT 400 #14: kurz</name><lastpressedtimestamp>1549195586</lastpressedtimestamp></button><button identifier=\"13096 0007307-9\" id=\"5001\"><name>FRITZ!DECT 400 #14: lang</name><lastpressedtimestamp>1549195595</lastpressedtimestamp></button></device>" +
61                     "<device identifier=\"13096 0007308\" id=\"30\" functionbitmask=\"1048864\" fwversion=\"05.10\" manufacturer=\"AVM\" productname=\"FRITZ!DECT 440\"><present>1</present><name>FRITZ!DECT 440 #15</name><temperature><celsius>230</celsius><offset>0</offset></temperature><humidity><rel_humidity>43</rel_humidity></humidity><battery>100</battery><batterylow>0</batterylow><button identifier=\"13096 0007308-1\" id=\"5000\"><name>FRITZ!DECT 440 #15: Oben rechts</name><lastpressedtimestamp>1549195586</lastpressedtimestamp></button><button identifier=\"13096 0007308-3\" id=\"5001\"><name>FRITZ!DECT 440 #15: Unten rechts</name><lastpressedtimestamp>1549195595</lastpressedtimestamp></button><button identifier=\"13096 0007308-5\" id=\"5002\"><name>FRITZ!DECT 440 #15: Unten links</name><lastpressedtimestamp>1549195586</lastpressedtimestamp></button><button identifier=\"13096 0007308-7\" id=\"5003\"><name>FRITZ!DECT 440 #15: Oben links</name><lastpressedtimestamp>1549195595</lastpressedtimestamp></button></device>" +
62                 "</devicelist>";
63         //@formatter:off
64         try {
65             Unmarshaller u = JAXBUtils.JAXBCONTEXT_DEVICES.createUnmarshaller();
66             devices = (DeviceListModel) u.unmarshal(new StringReader(xml));
67         } catch (JAXBException e) {
68             logger.error("Exception creating Unmarshaller: {}", e.getLocalizedMessage(), e);
69         }
70     }
71
72     @Test
73     public void validateDeviceListModel() {
74         assertNotNull(devices);
75         assertEquals(13, devices.getDevicelist().size());
76         assertEquals("1", devices.getXmlApiVersion());
77     }
78
79     @Test
80     public void validateDECTRepeater100Model() {
81         Optional<AVMFritzBaseModel> optionalDevice = findModelByIdentifier("087610000439");
82         assertTrue(optionalDevice.isPresent());
83         assertTrue(optionalDevice.get() instanceof DeviceModel);
84
85         DeviceModel device = (DeviceModel) optionalDevice.get();
86         assertEquals("FRITZ!DECT Repeater 100", device.getProductName());
87         assertEquals("087610000439", device.getIdentifier());
88         assertEquals("40", device.getDeviceId());
89         assertEquals("03.86", device.getFirmwareVersion());
90         assertEquals("AVM", device.getManufacturer());
91
92         assertEquals(1, device.getPresent());
93         assertEquals("FRITZ!DECT Repeater 100 #5", device.getName());
94
95         assertFalse(device.isButton());
96         assertFalse(device.isHANFUNButton());
97         assertFalse(device.isHANFUNAlarmSensor());
98         assertTrue(device.isDectRepeater());
99         assertFalse(device.isSwitchableOutlet());
100         assertTrue(device.isTempSensor());
101         assertFalse(device.isHumiditySensor());
102         assertFalse(device.isPowermeter());
103         assertFalse(device.isHeatingThermostat());
104
105         assertNull(device.getSwitch());
106
107         assertNotNull(device.getTemperature());
108         assertEquals(new BigDecimal("23.0"), device.getTemperature().getCelsius());
109         assertEquals(new BigDecimal("0.0"), device.getTemperature().getOffset());
110
111         assertNull(device.getPowermeter());
112
113         assertNull(device.getHkr());
114     }
115
116     @Test
117     public void validateDECT200Model() {
118         Optional<AVMFritzBaseModel> optionalDevice = findModel("FRITZ!DECT 200");
119         assertTrue(optionalDevice.isPresent());
120         assertTrue(optionalDevice.get() instanceof DeviceModel);
121
122         DeviceModel device = (DeviceModel) optionalDevice.get();
123         assertEquals("FRITZ!DECT 200", device.getProductName());
124         assertEquals("087610000434", device.getIdentifier());
125         assertEquals("17", device.getDeviceId());
126         assertEquals("03.83", device.getFirmwareVersion());
127         assertEquals("AVM", device.getManufacturer());
128
129         assertEquals(1, device.getPresent());
130         assertEquals("FRITZ!DECT 200 #1", device.getName());
131
132         assertFalse(device.isButton());
133         assertFalse(device.isHANFUNButton());
134         assertFalse(device.isHANFUNAlarmSensor());
135         assertFalse(device.isDectRepeater());
136         assertTrue(device.isSwitchableOutlet());
137         assertTrue(device.isTempSensor());
138         assertFalse(device.isHumiditySensor());
139         assertTrue(device.isPowermeter());
140         assertFalse(device.isHeatingThermostat());
141
142         assertNotNull(device.getSwitch());
143         assertEquals(SwitchModel.ON, device.getSwitch().getState());
144         assertEquals(MODE_MANUAL, device.getSwitch().getMode());
145         assertEquals(BigDecimal.ZERO, device.getSwitch().getLock());
146         assertEquals(BigDecimal.ZERO, device.getSwitch().getDevicelock());
147
148         assertNotNull(device.getTemperature());
149         assertEquals(new BigDecimal("25.5"), device.getTemperature().getCelsius());
150         assertEquals(new BigDecimal("0.0"), device.getTemperature().getOffset());
151
152         validatePowerMeter(device.getPowermeter());
153
154         assertNull(device.getHkr());
155     }
156
157     @Test
158     public void validateDECT210Model() {
159         Optional<AVMFritzBaseModel> optionalDevice = findModel("FRITZ!DECT 210");
160         assertTrue(optionalDevice.isPresent());
161         assertTrue(optionalDevice.get() instanceof DeviceModel);
162
163         DeviceModel device = (DeviceModel) optionalDevice.get();
164         assertEquals("FRITZ!DECT 210", device.getProductName());
165         assertEquals("087610000438", device.getIdentifier());
166         assertEquals("18", device.getDeviceId());
167         assertEquals("03.83", device.getFirmwareVersion());
168         assertEquals("AVM", device.getManufacturer());
169
170         assertEquals(1, device.getPresent());
171         assertEquals("FRITZ!DECT 210 #8", device.getName());
172
173         assertFalse(device.isButton());
174         assertFalse(device.isHANFUNButton());
175         assertFalse(device.isHANFUNAlarmSensor());
176         assertFalse(device.isDectRepeater());
177         assertTrue(device.isSwitchableOutlet());
178         assertTrue(device.isTempSensor());
179         assertFalse(device.isHumiditySensor());
180         assertTrue(device.isPowermeter());
181         assertFalse(device.isHeatingThermostat());
182
183         assertNotNull(device.getSwitch());
184         assertEquals(SwitchModel.ON, device.getSwitch().getState());
185         assertEquals(MODE_MANUAL, device.getSwitch().getMode());
186         assertEquals(BigDecimal.ZERO, device.getSwitch().getLock());
187         assertEquals(BigDecimal.ZERO, device.getSwitch().getDevicelock());
188
189         assertNotNull(device.getTemperature());
190         assertEquals(new BigDecimal("25.5"), device.getTemperature().getCelsius());
191         assertEquals(new BigDecimal("0.0"), device.getTemperature().getOffset());
192
193         validatePowerMeter(device.getPowermeter());
194
195         assertNull(device.getHkr());
196     }
197
198     @Test
199     public void validateDECT300Model() {
200         Optional<AVMFritzBaseModel> optionalDevice = findModel("FRITZ!DECT 300");
201         assertTrue(optionalDevice.isPresent());
202         assertTrue(optionalDevice.get() instanceof DeviceModel);
203
204         DeviceModel device = (DeviceModel) optionalDevice.get();
205         assertEquals("FRITZ!DECT 300", device.getProductName());
206         assertEquals("087610000437", device.getIdentifier());
207         assertEquals("20", device.getDeviceId());
208         assertEquals("03.50", device.getFirmwareVersion());
209         assertEquals("AVM", device.getManufacturer());
210
211         assertEquals(0, device.getPresent());
212         assertEquals("FRITZ!DECT 300 #1", device.getName());
213
214         assertFalse(device.isButton());
215         assertFalse(device.isHANFUNButton());
216         assertFalse(device.isHANFUNAlarmSensor());
217         assertFalse(device.isDectRepeater());
218         assertFalse(device.isSwitchableOutlet());
219         assertTrue(device.isTempSensor());
220         assertFalse(device.isHumiditySensor());
221         assertFalse(device.isPowermeter());
222         assertTrue(device.isHeatingThermostat());
223
224         assertNull(device.getSwitch());
225
226         assertNotNull(device.getTemperature());
227         assertEquals(new BigDecimal("22.0"), device.getTemperature().getCelsius());
228         assertEquals(new BigDecimal("-1.0"), device.getTemperature().getOffset());
229
230         assertNull(device.getPowermeter());
231
232         validateHeatingModel(device.getHkr());
233     }
234
235     @Test
236     public void validateDECT301Model() {
237         Optional<AVMFritzBaseModel> optionalDevice = findModel("FRITZ!DECT 301");
238         assertTrue(optionalDevice.isPresent());
239         assertTrue(optionalDevice.get() instanceof DeviceModel);
240
241         DeviceModel device = (DeviceModel) optionalDevice.get();
242         assertEquals("FRITZ!DECT 301", device.getProductName());
243         assertEquals("087610000436", device.getIdentifier());
244         assertEquals("21", device.getDeviceId());
245         assertEquals("03.50", device.getFirmwareVersion());
246         assertEquals("AVM", device.getManufacturer());
247
248         assertEquals(0, device.getPresent());
249         assertEquals("FRITZ!DECT 301 #1", device.getName());
250
251         assertFalse(device.isButton());
252         assertFalse(device.isHANFUNButton());
253         assertFalse(device.isHANFUNAlarmSensor());
254         assertFalse(device.isDectRepeater());
255         assertFalse(device.isSwitchableOutlet());
256         assertTrue(device.isTempSensor());
257         assertFalse(device.isHumiditySensor());
258         assertFalse(device.isPowermeter());
259         assertTrue(device.isHeatingThermostat());
260
261         assertNull(device.getSwitch());
262
263         assertNotNull(device.getTemperature());
264         assertEquals(new BigDecimal("22.0"), device.getTemperature().getCelsius());
265         assertEquals(new BigDecimal("-1.0"), device.getTemperature().getOffset());
266
267         assertNull(device.getPowermeter());
268
269         validateHeatingModel(device.getHkr());
270     }
271
272     @Test
273     public void validateCometDECTModel() {
274         Optional<AVMFritzBaseModel> optionalDevice = findModel("Comet DECT");
275         assertTrue(optionalDevice.isPresent());
276         assertTrue(optionalDevice.get() instanceof DeviceModel);
277
278         DeviceModel device = (DeviceModel) optionalDevice.get();
279         assertEquals("Comet DECT", device.getProductName());
280         assertEquals("087610000435", device.getIdentifier());
281         assertEquals("22", device.getDeviceId());
282         assertEquals("03.50", device.getFirmwareVersion());
283         assertEquals("AVM", device.getManufacturer());
284
285         assertEquals(0, device.getPresent());
286         assertEquals("Comet DECT #1", device.getName());
287
288         assertFalse(device.isButton());
289         assertFalse(device.isHANFUNButton());
290         assertFalse(device.isHANFUNAlarmSensor());
291         assertFalse(device.isDectRepeater());
292         assertFalse(device.isSwitchableOutlet());
293         assertTrue(device.isTempSensor());
294         assertFalse(device.isHumiditySensor());
295         assertFalse(device.isPowermeter());
296         assertTrue(device.isHeatingThermostat());
297
298         assertNull(device.getSwitch());
299
300         assertNotNull(device.getTemperature());
301         assertEquals(new BigDecimal("22.0"), device.getTemperature().getCelsius());
302         assertEquals(new BigDecimal("-1.0"), device.getTemperature().getOffset());
303
304         assertNull(device.getPowermeter());
305
306         validateHeatingModel(device.getHkr());
307     }
308
309     @Test
310     public void validateDECT400Model() {
311         Optional<AVMFritzBaseModel> optionalDevice = findModelByIdentifier("130960007307");
312         assertTrue(optionalDevice.isPresent());
313         assertTrue(optionalDevice.get() instanceof DeviceModel);
314
315         DeviceModel device = (DeviceModel) optionalDevice.get();
316         assertEquals("FRITZ!DECT 400", device.getProductName());
317         assertEquals("130960007307", device.getIdentifier());
318         assertEquals("29", device.getDeviceId());
319         assertEquals("04.90", device.getFirmwareVersion());
320         assertEquals("AVM", device.getManufacturer());
321
322         assertEquals(1, device.getPresent());
323         assertEquals("FRITZ!DECT 400 #14", device.getName());
324
325         assertTrue(device.isButton());
326         assertFalse(device.isHANFUNButton());
327         assertFalse(device.isHANFUNAlarmSensor());
328         assertFalse(device.isDectRepeater());
329         assertFalse(device.isSwitchableOutlet());
330         assertFalse(device.isTempSensor());
331         assertFalse(device.isHumiditySensor());
332         assertFalse(device.isPowermeter());
333         assertFalse(device.isHeatingThermostat());
334
335         assertEquals(new BigDecimal("100"), device.getBattery());
336         assertEquals(BatteryModel.BATTERY_OFF, device.getBatterylow());
337
338         assertEquals(2, device.getButtons().size());
339         assertEquals("FRITZ!DECT 400 #14: kurz", device.getButtons().get(0).getName());
340         assertEquals(1549195586, device.getButtons().get(0).getLastpressedtimestamp());
341         assertEquals("FRITZ!DECT 400 #14: lang", device.getButtons().get(1).getName());
342         assertEquals(1549195595, device.getButtons().get(1).getLastpressedtimestamp());
343
344         assertNull(device.getAlert());
345
346         assertNull(device.getSwitch());
347
348         assertNull(device.getTemperature());
349
350         assertNull(device.getPowermeter());
351
352         assertNull(device.getHkr());
353     }
354
355     @Test
356     public void validateDECT440Model() {
357         Optional<AVMFritzBaseModel> optionalDevice = findModelByIdentifier("130960007308");
358         assertTrue(optionalDevice.isPresent());
359         assertTrue(optionalDevice.get() instanceof DeviceModel);
360
361         DeviceModel device = (DeviceModel) optionalDevice.get();
362         assertEquals("FRITZ!DECT 440", device.getProductName());
363         assertEquals("130960007308", device.getIdentifier());
364         assertEquals("30", device.getDeviceId());
365         assertEquals("05.10", device.getFirmwareVersion());
366         assertEquals("AVM", device.getManufacturer());
367
368         assertEquals(1, device.getPresent());
369         assertEquals("FRITZ!DECT 440 #15", device.getName());
370
371         assertTrue(device.isButton());
372         assertFalse(device.isHANFUNButton());
373         assertFalse(device.isHANFUNAlarmSensor());
374         assertFalse(device.isDectRepeater());
375         assertFalse(device.isSwitchableOutlet());
376         assertTrue(device.isTempSensor());
377         assertTrue(device.isHumiditySensor());
378         assertFalse(device.isPowermeter());
379         assertFalse(device.isHeatingThermostat());
380
381         assertEquals(new BigDecimal("100"), device.getBattery());
382         assertEquals(BatteryModel.BATTERY_OFF, device.getBatterylow());
383
384         assertEquals(4, device.getButtons().size());
385         final ButtonModel topRight = device.getButtons().get(0);
386         assertEquals("130960007308-1", topRight.getIdentifier());
387         assertEquals("5000", topRight.getButtonId());
388         assertEquals("FRITZ!DECT 440 #15: Oben rechts", topRight.getName());
389         assertEquals(1549195586, topRight.getLastpressedtimestamp());
390         final ButtonModel bottomRight = device.getButtons().get(1);
391         assertEquals("130960007308-3", bottomRight.getIdentifier());
392         assertEquals("5001", bottomRight.getButtonId());
393         assertEquals("FRITZ!DECT 440 #15: Unten rechts", bottomRight.getName());
394         assertEquals(1549195595, bottomRight.getLastpressedtimestamp());
395         final ButtonModel bottomLeft = device.getButtons().get(2);
396         assertEquals("130960007308-5", bottomLeft.getIdentifier());
397         assertEquals("5002", bottomLeft.getButtonId());
398         assertEquals("FRITZ!DECT 440 #15: Unten links", bottomLeft.getName());
399         assertEquals(1549195586, bottomLeft.getLastpressedtimestamp());
400         final ButtonModel topLeft = device.getButtons().get(3);
401         assertEquals("130960007308-7", topLeft.getIdentifier());
402         assertEquals("5003", topLeft.getButtonId());
403         assertEquals("FRITZ!DECT 440 #15: Oben links", topLeft.getName());
404         assertEquals(1549195595, topLeft.getLastpressedtimestamp());
405
406         assertNull(device.getAlert());
407
408         assertNull(device.getSwitch());
409
410         assertNotNull(device.getTemperature());
411         assertEquals(new BigDecimal("23.0"), device.getTemperature().getCelsius());
412         assertEquals(new BigDecimal("0.0"), device.getTemperature().getOffset());
413
414         assertNotNull(device.getHumidity());
415         assertEquals(new BigDecimal("43"), device.getHumidity().getRelativeHumidity());
416
417         assertNull(device.getPowermeter());
418
419         assertNull(device.getHkr());
420     }
421
422     @Test
423     public void validatePowerline546EModel() {
424         Optional<AVMFritzBaseModel> optionalDevice = findModel("FRITZ!Powerline 546E");
425         assertTrue(optionalDevice.isPresent());
426         assertTrue(optionalDevice.get() instanceof DeviceModel);
427
428         DeviceModel device = (DeviceModel) optionalDevice.get();
429         assertEquals("FRITZ!Powerline 546E", device.getProductName());
430         assertEquals("5C:49:79:F0:A3:84", device.getIdentifier());
431         assertEquals("30", device.getDeviceId());
432         assertEquals("06.92", device.getFirmwareVersion());
433         assertEquals("AVM", device.getManufacturer());
434
435         assertEquals(1, device.getPresent());
436         assertEquals("FRITZ!Powerline 546E #1", device.getName());
437
438         assertFalse(device.isButton());
439         assertFalse(device.isHANFUNButton());
440         assertFalse(device.isHANFUNAlarmSensor());
441         assertFalse(device.isDectRepeater());
442         assertTrue(device.isSwitchableOutlet());
443         assertFalse(device.isTempSensor());
444         assertFalse(device.isHumiditySensor());
445         assertTrue(device.isPowermeter());
446         assertFalse(device.isHeatingThermostat());
447
448         assertNotNull(device.getSwitch());
449         assertEquals(SwitchModel.OFF, device.getSwitch().getState());
450         assertEquals(MODE_MANUAL, device.getSwitch().getMode());
451         assertEquals(BigDecimal.ZERO, device.getSwitch().getLock());
452         assertEquals(BigDecimal.ONE, device.getSwitch().getDevicelock());
453
454         assertNull(device.getTemperature());
455
456         validatePowerMeter(device.getPowermeter());
457
458         assertNull(device.getHkr());
459     }
460
461     @Test
462     public void validateHANFUNContactModel() {
463         Optional<AVMFritzBaseModel> optionalDevice = findModelByIdentifier("119340059978-1");
464         assertTrue(optionalDevice.isPresent());
465         assertTrue(optionalDevice.get() instanceof DeviceModel);
466
467         DeviceModel device = (DeviceModel) optionalDevice.get();
468         assertEquals("HAN-FUN", device.getProductName());
469         assertEquals("119340059978-1", device.getIdentifier());
470         assertEquals("2000", device.getDeviceId());
471         assertEquals("0.0", device.getFirmwareVersion());
472         assertEquals("0x0feb", device.getManufacturer());
473
474         assertEquals(0, device.getPresent());
475         assertEquals("HAN-FUN #2: Unit #2", device.getName());
476
477         assertFalse(device.isButton());
478         assertFalse(device.isHANFUNButton());
479         assertTrue(device.isHANFUNAlarmSensor());
480         assertFalse(device.isDectRepeater());
481         assertFalse(device.isSwitchableOutlet());
482         assertFalse(device.isTempSensor());
483         assertFalse(device.isHumiditySensor());
484         assertFalse(device.isPowermeter());
485         assertFalse(device.isHeatingThermostat());
486
487         assertTrue(device.getButtons().isEmpty());
488
489         assertNotNull(device.getAlert());
490         assertEquals(BigDecimal.ONE, device.getAlert().getState());
491
492         assertNull(device.getSwitch());
493
494         assertNull(device.getTemperature());
495
496         assertNull(device.getPowermeter());
497
498         assertNull(device.getHkr());
499     }
500
501     @Test
502     public void validateHANFUNSwitchModel() {
503         Optional<AVMFritzBaseModel> optionalDevice = findModelByIdentifier("119340059979-1");
504         assertTrue(optionalDevice.isPresent());
505         assertTrue(optionalDevice.get() instanceof DeviceModel);
506
507         DeviceModel device = (DeviceModel) optionalDevice.get();
508         assertEquals("HAN-FUN", device.getProductName());
509         assertEquals("119340059979-1", device.getIdentifier());
510         assertEquals("2001", device.getDeviceId());
511         assertEquals("0.0", device.getFirmwareVersion());
512         assertEquals("0x0feb", device.getManufacturer());
513
514         assertEquals(0, device.getPresent());
515         assertEquals("HAN-FUN #2: Unit #2", device.getName());
516
517         assertFalse(device.isButton());
518         assertTrue(device.isHANFUNButton());
519         assertFalse(device.isHANFUNAlarmSensor());
520         assertFalse(device.isDectRepeater());
521         assertFalse(device.isSwitchableOutlet());
522         assertFalse(device.isTempSensor());
523         assertFalse(device.isHumiditySensor());
524         assertFalse(device.isPowermeter());
525         assertFalse(device.isHeatingThermostat());
526
527         assertEquals(1, device.getButtons().size());
528         assertEquals(1529590797, device.getButtons().get(0).getLastpressedtimestamp());
529
530         assertNull(device.getAlert());
531
532         assertNull(device.getSwitch());
533
534         assertNull(device.getTemperature());
535
536         assertNull(device.getPowermeter());
537
538         assertNull(device.getHkr());
539     }
540
541     @Test
542     public void validateHeatingGroupModel() {
543         Optional<AVMFritzBaseModel> optionalGroup = findModelByIdentifier("F0:A3:7F-901");
544         assertTrue(optionalGroup.isPresent());
545         assertTrue(optionalGroup.get() instanceof GroupModel);
546
547         GroupModel group = (GroupModel) optionalGroup.get();
548         assertEquals("", group.getProductName());
549         assertEquals("F0:A3:7F-901", group.getIdentifier());
550         assertEquals("20001", group.getDeviceId());
551         assertEquals("1.0", group.getFirmwareVersion());
552         assertEquals("AVM", group.getManufacturer());
553
554         assertEquals(1, group.getPresent());
555         assertEquals("Schlafzimmer", group.getName());
556
557         assertFalse(group.isButton());
558         assertFalse(group.isHANFUNButton());
559         assertFalse(group.isHANFUNAlarmSensor());
560         assertFalse(group.isDectRepeater());
561         assertFalse(group.isSwitchableOutlet());
562         assertFalse(group.isTempSensor());
563         assertFalse(group.isHumiditySensor());
564         assertFalse(group.isPowermeter());
565         assertTrue(group.isHeatingThermostat());
566
567         assertNull(group.getSwitch());
568
569         assertNull(group.getPowermeter());
570
571         validateHeatingModel(group.getHkr());
572
573         assertNotNull(group.getGroupinfo());
574         assertEquals("0", group.getGroupinfo().getMasterdeviceid());
575         assertEquals("20,21,22", group.getGroupinfo().getMembers());
576     }
577
578     @Test
579     public void validateSwitchGroupModel() {
580         Optional<AVMFritzBaseModel> optionalGroup = findModelByIdentifier("F0:A3:7F-900");
581         assertTrue(optionalGroup.isPresent());
582         assertTrue(optionalGroup.get() instanceof GroupModel);
583
584         GroupModel group = (GroupModel) optionalGroup.get();
585         assertEquals("", group.getProductName());
586         assertEquals("F0:A3:7F-900", group.getIdentifier());
587         assertEquals("20000", group.getDeviceId());
588         assertEquals("1.0", group.getFirmwareVersion());
589         assertEquals("AVM", group.getManufacturer());
590
591         assertEquals(1, group.getPresent());
592         assertEquals("Schlafzimmer", group.getName());
593
594         assertFalse(group.isButton());
595         assertFalse(group.isHANFUNButton());
596         assertFalse(group.isHANFUNAlarmSensor());
597         assertFalse(group.isDectRepeater());
598         assertTrue(group.isSwitchableOutlet());
599         assertFalse(group.isTempSensor());
600         assertFalse(group.isHumiditySensor());
601         assertTrue(group.isPowermeter());
602         assertFalse(group.isHeatingThermostat());
603
604         assertNotNull(group.getSwitch());
605         assertEquals(SwitchModel.ON, group.getSwitch().getState());
606         assertEquals(MODE_MANUAL, group.getSwitch().getMode());
607         assertEquals(BigDecimal.ZERO, group.getSwitch().getLock());
608         assertEquals(BigDecimal.ZERO, group.getSwitch().getDevicelock());
609
610         validatePowerMeter(group.getPowermeter());
611
612         assertNull(group.getHkr());
613
614         assertNotNull(group.getGroupinfo());
615         assertEquals("17", group.getGroupinfo().getMasterdeviceid());
616         assertEquals("17,18", group.getGroupinfo().getMembers());
617     }
618
619     private Optional<AVMFritzBaseModel> findModel(String name) {
620         return devices.getDevicelist().stream().filter(it -> name.equals(it.getProductName())).findFirst();
621     }
622
623     private Optional<AVMFritzBaseModel> findModelByIdentifier(String identifier) {
624         return devices.getDevicelist().stream().filter(it -> identifier.equals(it.getIdentifier())).findFirst();
625     }
626
627     private void validatePowerMeter(PowerMeterModel model) {
628         assertNotNull(model);
629         assertEquals(new BigDecimal("230.051"), model.getVoltage());
630         assertEquals(new BigDecimal("0.000"), model.getPower());
631         assertEquals(new BigDecimal("2087"), model.getEnergy());
632     }
633
634     private void validateHeatingModel(HeatingModel model) {
635         assertNotNull(model);
636         assertEquals(new BigDecimal(44), model.getTist());
637         assertEquals(new BigDecimal(42), model.getTsoll());
638         assertEquals(new BigDecimal(28), model.getAbsenk());
639         assertEquals(new BigDecimal(42), model.getKomfort());
640         assertEquals(BigDecimal.ONE, model.getLock());
641         assertEquals(BigDecimal.ONE, model.getDevicelock());
642         assertEquals(BigDecimal.ZERO, model.getWindowopenactiv());
643         assertEquals(BigDecimal.ZERO, model.getBoostactive());
644         assertEquals(new BigDecimal("100"), model.getBattery());
645         assertEquals(BatteryModel.BATTERY_OFF, model.getBatterylow());
646         assertEquals(MODE_AUTO, model.getMode());
647         assertEquals(MODE_COMFORT, model.getRadiatorMode());
648
649         assertNotNull(model.getNextchange());
650         assertEquals(1484341200, model.getNextchange().getEndperiod());
651         assertEquals(new BigDecimal(28), model.getNextchange().getTchange());
652     }
653 }