]> git.basschouten.com Git - openhab-addons.git/blob
045d7ec9eeb68bf28cee4c95db5ba956df170fad
[openhab-addons.git] /
1 /**
2  * Copyright (c) 2010-2020 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=\"288\" fwversion=\"04.90\" manufacturer=\"AVM\" productname=\"FRITZ!DECT 440\"><present>1</present><name>FRITZ!DECT 440 #15</name><temperature><celsius>230</celsius><offset>0</offset></temperature><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.isPowermeter());
102         assertFalse(device.isHeatingThermostat());
103
104         assertNull(device.getSwitch());
105
106         assertNotNull(device.getTemperature());
107         assertEquals(new BigDecimal("23.0"), device.getTemperature().getCelsius());
108         assertEquals(new BigDecimal("0.0"), device.getTemperature().getOffset());
109
110         assertNull(device.getPowermeter());
111
112         assertNull(device.getHkr());
113     }
114
115     @Test
116     public void validateDECT200Model() {
117         Optional<AVMFritzBaseModel> optionalDevice = findModel("FRITZ!DECT 200");
118         assertTrue(optionalDevice.isPresent());
119         assertTrue(optionalDevice.get() instanceof DeviceModel);
120
121         DeviceModel device = (DeviceModel) optionalDevice.get();
122         assertEquals("FRITZ!DECT 200", device.getProductName());
123         assertEquals("087610000434", device.getIdentifier());
124         assertEquals("17", device.getDeviceId());
125         assertEquals("03.83", device.getFirmwareVersion());
126         assertEquals("AVM", device.getManufacturer());
127
128         assertEquals(1, device.getPresent());
129         assertEquals("FRITZ!DECT 200 #1", device.getName());
130
131         assertFalse(device.isButton());
132         assertFalse(device.isHANFUNButton());
133         assertFalse(device.isHANFUNAlarmSensor());
134         assertFalse(device.isDectRepeater());
135         assertTrue(device.isSwitchableOutlet());
136         assertTrue(device.isTempSensor());
137         assertTrue(device.isPowermeter());
138         assertFalse(device.isHeatingThermostat());
139
140         assertNotNull(device.getSwitch());
141         assertEquals(SwitchModel.ON, device.getSwitch().getState());
142         assertEquals(MODE_MANUAL, device.getSwitch().getMode());
143         assertEquals(BigDecimal.ZERO, device.getSwitch().getLock());
144         assertEquals(BigDecimal.ZERO, device.getSwitch().getDevicelock());
145
146         assertNotNull(device.getTemperature());
147         assertEquals(new BigDecimal("25.5"), device.getTemperature().getCelsius());
148         assertEquals(new BigDecimal("0.0"), device.getTemperature().getOffset());
149
150         validatePowerMeter(device.getPowermeter());
151
152         assertNull(device.getHkr());
153     }
154
155     @Test
156     public void validateDECT210Model() {
157         Optional<AVMFritzBaseModel> optionalDevice = findModel("FRITZ!DECT 210");
158         assertTrue(optionalDevice.isPresent());
159         assertTrue(optionalDevice.get() instanceof DeviceModel);
160
161         DeviceModel device = (DeviceModel) optionalDevice.get();
162         assertEquals("FRITZ!DECT 210", device.getProductName());
163         assertEquals("087610000438", device.getIdentifier());
164         assertEquals("18", device.getDeviceId());
165         assertEquals("03.83", device.getFirmwareVersion());
166         assertEquals("AVM", device.getManufacturer());
167
168         assertEquals(1, device.getPresent());
169         assertEquals("FRITZ!DECT 210 #8", device.getName());
170
171         assertFalse(device.isButton());
172         assertFalse(device.isHANFUNButton());
173         assertFalse(device.isHANFUNAlarmSensor());
174         assertFalse(device.isDectRepeater());
175         assertTrue(device.isSwitchableOutlet());
176         assertTrue(device.isTempSensor());
177         assertTrue(device.isPowermeter());
178         assertFalse(device.isHeatingThermostat());
179
180         assertNotNull(device.getSwitch());
181         assertEquals(SwitchModel.ON, device.getSwitch().getState());
182         assertEquals(MODE_MANUAL, device.getSwitch().getMode());
183         assertEquals(BigDecimal.ZERO, device.getSwitch().getLock());
184         assertEquals(BigDecimal.ZERO, device.getSwitch().getDevicelock());
185
186         assertNotNull(device.getTemperature());
187         assertEquals(new BigDecimal("25.5"), device.getTemperature().getCelsius());
188         assertEquals(new BigDecimal("0.0"), device.getTemperature().getOffset());
189
190         validatePowerMeter(device.getPowermeter());
191
192         assertNull(device.getHkr());
193     }
194
195     @Test
196     public void validateDECT300Model() {
197         Optional<AVMFritzBaseModel> optionalDevice = findModel("FRITZ!DECT 300");
198         assertTrue(optionalDevice.isPresent());
199         assertTrue(optionalDevice.get() instanceof DeviceModel);
200
201         DeviceModel device = (DeviceModel) optionalDevice.get();
202         assertEquals("FRITZ!DECT 300", device.getProductName());
203         assertEquals("087610000437", device.getIdentifier());
204         assertEquals("20", device.getDeviceId());
205         assertEquals("03.50", device.getFirmwareVersion());
206         assertEquals("AVM", device.getManufacturer());
207
208         assertEquals(0, device.getPresent());
209         assertEquals("FRITZ!DECT 300 #1", device.getName());
210
211         assertFalse(device.isButton());
212         assertFalse(device.isHANFUNButton());
213         assertFalse(device.isHANFUNAlarmSensor());
214         assertFalse(device.isDectRepeater());
215         assertFalse(device.isSwitchableOutlet());
216         assertTrue(device.isTempSensor());
217         assertFalse(device.isPowermeter());
218         assertTrue(device.isHeatingThermostat());
219
220         assertNull(device.getSwitch());
221
222         assertNotNull(device.getTemperature());
223         assertEquals(new BigDecimal("22.0"), device.getTemperature().getCelsius());
224         assertEquals(new BigDecimal("-1.0"), device.getTemperature().getOffset());
225
226         assertNull(device.getPowermeter());
227
228         validateHeatingModel(device.getHkr());
229     }
230
231     @Test
232     public void validateDECT301Model() {
233         Optional<AVMFritzBaseModel> optionalDevice = findModel("FRITZ!DECT 301");
234         assertTrue(optionalDevice.isPresent());
235         assertTrue(optionalDevice.get() instanceof DeviceModel);
236
237         DeviceModel device = (DeviceModel) optionalDevice.get();
238         assertEquals("FRITZ!DECT 301", device.getProductName());
239         assertEquals("087610000436", device.getIdentifier());
240         assertEquals("21", device.getDeviceId());
241         assertEquals("03.50", device.getFirmwareVersion());
242         assertEquals("AVM", device.getManufacturer());
243
244         assertEquals(0, device.getPresent());
245         assertEquals("FRITZ!DECT 301 #1", device.getName());
246
247         assertFalse(device.isButton());
248         assertFalse(device.isHANFUNButton());
249         assertFalse(device.isHANFUNAlarmSensor());
250         assertFalse(device.isDectRepeater());
251         assertFalse(device.isSwitchableOutlet());
252         assertTrue(device.isTempSensor());
253         assertFalse(device.isPowermeter());
254         assertTrue(device.isHeatingThermostat());
255
256         assertNull(device.getSwitch());
257
258         assertNotNull(device.getTemperature());
259         assertEquals(new BigDecimal("22.0"), device.getTemperature().getCelsius());
260         assertEquals(new BigDecimal("-1.0"), device.getTemperature().getOffset());
261
262         assertNull(device.getPowermeter());
263
264         validateHeatingModel(device.getHkr());
265     }
266
267     @Test
268     public void validateCometDECTModel() {
269         Optional<AVMFritzBaseModel> optionalDevice = findModel("Comet DECT");
270         assertTrue(optionalDevice.isPresent());
271         assertTrue(optionalDevice.get() instanceof DeviceModel);
272
273         DeviceModel device = (DeviceModel) optionalDevice.get();
274         assertEquals("Comet DECT", device.getProductName());
275         assertEquals("087610000435", device.getIdentifier());
276         assertEquals("22", device.getDeviceId());
277         assertEquals("03.50", device.getFirmwareVersion());
278         assertEquals("AVM", device.getManufacturer());
279
280         assertEquals(0, device.getPresent());
281         assertEquals("Comet DECT #1", device.getName());
282
283         assertFalse(device.isButton());
284         assertFalse(device.isHANFUNButton());
285         assertFalse(device.isHANFUNAlarmSensor());
286         assertFalse(device.isDectRepeater());
287         assertFalse(device.isSwitchableOutlet());
288         assertTrue(device.isTempSensor());
289         assertFalse(device.isPowermeter());
290         assertTrue(device.isHeatingThermostat());
291
292         assertNull(device.getSwitch());
293
294         assertNotNull(device.getTemperature());
295         assertEquals(new BigDecimal("22.0"), device.getTemperature().getCelsius());
296         assertEquals(new BigDecimal("-1.0"), device.getTemperature().getOffset());
297
298         assertNull(device.getPowermeter());
299
300         validateHeatingModel(device.getHkr());
301     }
302
303     @Test
304     public void validateDECT400Model() {
305         Optional<AVMFritzBaseModel> optionalDevice = findModelByIdentifier("130960007307");
306         assertTrue(optionalDevice.isPresent());
307         assertTrue(optionalDevice.get() instanceof DeviceModel);
308
309         DeviceModel device = (DeviceModel) optionalDevice.get();
310         assertEquals("FRITZ!DECT 400", device.getProductName());
311         assertEquals("130960007307", device.getIdentifier());
312         assertEquals("29", device.getDeviceId());
313         assertEquals("04.90", device.getFirmwareVersion());
314         assertEquals("AVM", device.getManufacturer());
315
316         assertEquals(1, device.getPresent());
317         assertEquals("FRITZ!DECT 400 #14", device.getName());
318
319         assertTrue(device.isButton());
320         assertFalse(device.isHANFUNButton());
321         assertFalse(device.isHANFUNAlarmSensor());
322         assertFalse(device.isDectRepeater());
323         assertFalse(device.isSwitchableOutlet());
324         assertFalse(device.isTempSensor());
325         assertFalse(device.isPowermeter());
326         assertFalse(device.isHeatingThermostat());
327
328         assertEquals(new BigDecimal("100"), device.getBattery());
329         assertEquals(BatteryModel.BATTERY_OFF, device.getBatterylow());
330
331         assertEquals(2, device.getButtons().size());
332         assertEquals("FRITZ!DECT 400 #14: kurz", device.getButtons().get(0).getName());
333         assertEquals(1549195586, device.getButtons().get(0).getLastpressedtimestamp());
334         assertEquals("FRITZ!DECT 400 #14: lang", device.getButtons().get(1).getName());
335         assertEquals(1549195595, device.getButtons().get(1).getLastpressedtimestamp());
336
337         assertNull(device.getAlert());
338
339         assertNull(device.getSwitch());
340
341         assertNull(device.getTemperature());
342
343         assertNull(device.getPowermeter());
344
345         assertNull(device.getHkr());
346     }
347
348     @Test
349     public void validateDECT440Model() {
350         Optional<AVMFritzBaseModel> optionalDevice = findModelByIdentifier("130960007308");
351         assertTrue(optionalDevice.isPresent());
352         assertTrue(optionalDevice.get() instanceof DeviceModel);
353
354         DeviceModel device = (DeviceModel) optionalDevice.get();
355         assertEquals("FRITZ!DECT 440", device.getProductName());
356         assertEquals("130960007308", device.getIdentifier());
357         assertEquals("30", device.getDeviceId());
358         assertEquals("04.90", device.getFirmwareVersion());
359         assertEquals("AVM", device.getManufacturer());
360
361         assertEquals(1, device.getPresent());
362         assertEquals("FRITZ!DECT 440 #15", device.getName());
363
364         assertTrue(device.isButton());
365         assertFalse(device.isHANFUNButton());
366         assertFalse(device.isHANFUNAlarmSensor());
367         assertFalse(device.isDectRepeater());
368         assertFalse(device.isSwitchableOutlet());
369         assertTrue(device.isTempSensor());
370         assertFalse(device.isPowermeter());
371         assertFalse(device.isHeatingThermostat());
372
373         assertEquals(new BigDecimal("100"), device.getBattery());
374         assertEquals(BatteryModel.BATTERY_OFF, device.getBatterylow());
375
376         assertEquals(4, device.getButtons().size());
377         final ButtonModel topRight = device.getButtons().get(0);
378         assertEquals("130960007308-1", topRight.getIdentifier());
379         assertEquals("5000", topRight.getButtonId());
380         assertEquals("FRITZ!DECT 440 #15: Oben rechts", topRight.getName());
381         assertEquals(1549195586, topRight.getLastpressedtimestamp());
382         final ButtonModel bottomRight = device.getButtons().get(1);
383         assertEquals("130960007308-3", bottomRight.getIdentifier());
384         assertEquals("5001", bottomRight.getButtonId());
385         assertEquals("FRITZ!DECT 440 #15: Unten rechts", bottomRight.getName());
386         assertEquals(1549195595, bottomRight.getLastpressedtimestamp());
387         final ButtonModel bottomLeft = device.getButtons().get(2);
388         assertEquals("130960007308-5", bottomLeft.getIdentifier());
389         assertEquals("5002", bottomLeft.getButtonId());
390         assertEquals("FRITZ!DECT 440 #15: Unten links", bottomLeft.getName());
391         assertEquals(1549195586, bottomLeft.getLastpressedtimestamp());
392         final ButtonModel topLeft = device.getButtons().get(3);
393         assertEquals("130960007308-7", topLeft.getIdentifier());
394         assertEquals("5003", topLeft.getButtonId());
395         assertEquals("FRITZ!DECT 440 #15: Oben links", topLeft.getName());
396         assertEquals(1549195595, topLeft.getLastpressedtimestamp());
397
398         assertNull(device.getAlert());
399
400         assertNull(device.getSwitch());
401
402         assertNotNull(device.getTemperature());
403         assertEquals(new BigDecimal("23.0"), device.getTemperature().getCelsius());
404         assertEquals(new BigDecimal("0.0"), device.getTemperature().getOffset());
405
406         assertNull(device.getPowermeter());
407
408         assertNull(device.getHkr());
409     }
410
411     @Test
412     public void validatePowerline546EModel() {
413         Optional<AVMFritzBaseModel> optionalDevice = findModel("FRITZ!Powerline 546E");
414         assertTrue(optionalDevice.isPresent());
415         assertTrue(optionalDevice.get() instanceof DeviceModel);
416
417         DeviceModel device = (DeviceModel) optionalDevice.get();
418         assertEquals("FRITZ!Powerline 546E", device.getProductName());
419         assertEquals("5C:49:79:F0:A3:84", device.getIdentifier());
420         assertEquals("30", device.getDeviceId());
421         assertEquals("06.92", device.getFirmwareVersion());
422         assertEquals("AVM", device.getManufacturer());
423
424         assertEquals(1, device.getPresent());
425         assertEquals("FRITZ!Powerline 546E #1", device.getName());
426
427         assertFalse(device.isButton());
428         assertFalse(device.isHANFUNButton());
429         assertFalse(device.isHANFUNAlarmSensor());
430         assertFalse(device.isDectRepeater());
431         assertTrue(device.isSwitchableOutlet());
432         assertFalse(device.isTempSensor());
433         assertTrue(device.isPowermeter());
434         assertFalse(device.isHeatingThermostat());
435
436         assertNotNull(device.getSwitch());
437         assertEquals(SwitchModel.OFF, device.getSwitch().getState());
438         assertEquals(MODE_MANUAL, device.getSwitch().getMode());
439         assertEquals(BigDecimal.ZERO, device.getSwitch().getLock());
440         assertEquals(BigDecimal.ONE, device.getSwitch().getDevicelock());
441
442         assertNull(device.getTemperature());
443
444         validatePowerMeter(device.getPowermeter());
445
446         assertNull(device.getHkr());
447     }
448
449     @Test
450     public void validateHANFUNContactModel() {
451         Optional<AVMFritzBaseModel> optionalDevice = findModelByIdentifier("119340059978-1");
452         assertTrue(optionalDevice.isPresent());
453         assertTrue(optionalDevice.get() instanceof DeviceModel);
454
455         DeviceModel device = (DeviceModel) optionalDevice.get();
456         assertEquals("HAN-FUN", device.getProductName());
457         assertEquals("119340059978-1", device.getIdentifier());
458         assertEquals("2000", device.getDeviceId());
459         assertEquals("0.0", device.getFirmwareVersion());
460         assertEquals("0x0feb", device.getManufacturer());
461
462         assertEquals(0, device.getPresent());
463         assertEquals("HAN-FUN #2: Unit #2", device.getName());
464
465         assertFalse(device.isButton());
466         assertFalse(device.isHANFUNButton());
467         assertTrue(device.isHANFUNAlarmSensor());
468         assertFalse(device.isDectRepeater());
469         assertFalse(device.isSwitchableOutlet());
470         assertFalse(device.isTempSensor());
471         assertFalse(device.isPowermeter());
472         assertFalse(device.isHeatingThermostat());
473
474         assertTrue(device.getButtons().isEmpty());
475
476         assertNotNull(device.getAlert());
477         assertEquals(BigDecimal.ONE, device.getAlert().getState());
478
479         assertNull(device.getSwitch());
480
481         assertNull(device.getTemperature());
482
483         assertNull(device.getPowermeter());
484
485         assertNull(device.getHkr());
486     }
487
488     @Test
489     public void validateHANFUNSwitchModel() {
490         Optional<AVMFritzBaseModel> optionalDevice = findModelByIdentifier("119340059979-1");
491         assertTrue(optionalDevice.isPresent());
492         assertTrue(optionalDevice.get() instanceof DeviceModel);
493
494         DeviceModel device = (DeviceModel) optionalDevice.get();
495         assertEquals("HAN-FUN", device.getProductName());
496         assertEquals("119340059979-1", device.getIdentifier());
497         assertEquals("2001", device.getDeviceId());
498         assertEquals("0.0", device.getFirmwareVersion());
499         assertEquals("0x0feb", device.getManufacturer());
500
501         assertEquals(0, device.getPresent());
502         assertEquals("HAN-FUN #2: Unit #2", device.getName());
503
504         assertFalse(device.isButton());
505         assertTrue(device.isHANFUNButton());
506         assertFalse(device.isHANFUNAlarmSensor());
507         assertFalse(device.isDectRepeater());
508         assertFalse(device.isSwitchableOutlet());
509         assertFalse(device.isTempSensor());
510         assertFalse(device.isPowermeter());
511         assertFalse(device.isHeatingThermostat());
512
513         assertEquals(1, device.getButtons().size());
514         assertEquals(1529590797, device.getButtons().get(0).getLastpressedtimestamp());
515
516         assertNull(device.getAlert());
517
518         assertNull(device.getSwitch());
519
520         assertNull(device.getTemperature());
521
522         assertNull(device.getPowermeter());
523
524         assertNull(device.getHkr());
525     }
526
527     @Test
528     public void validateHeatingGroupModel() {
529         Optional<AVMFritzBaseModel> optionalGroup = findModelByIdentifier("F0:A3:7F-901");
530         assertTrue(optionalGroup.isPresent());
531         assertTrue(optionalGroup.get() instanceof GroupModel);
532
533         GroupModel group = (GroupModel) optionalGroup.get();
534         assertEquals("", group.getProductName());
535         assertEquals("F0:A3:7F-901", group.getIdentifier());
536         assertEquals("20001", group.getDeviceId());
537         assertEquals("1.0", group.getFirmwareVersion());
538         assertEquals("AVM", group.getManufacturer());
539
540         assertEquals(1, group.getPresent());
541         assertEquals("Schlafzimmer", group.getName());
542
543         assertFalse(group.isButton());
544         assertFalse(group.isHANFUNButton());
545         assertFalse(group.isHANFUNAlarmSensor());
546         assertFalse(group.isDectRepeater());
547         assertFalse(group.isSwitchableOutlet());
548         assertFalse(group.isTempSensor());
549         assertFalse(group.isPowermeter());
550         assertTrue(group.isHeatingThermostat());
551
552         assertNull(group.getSwitch());
553
554         assertNull(group.getPowermeter());
555
556         validateHeatingModel(group.getHkr());
557
558         assertNotNull(group.getGroupinfo());
559         assertEquals("0", group.getGroupinfo().getMasterdeviceid());
560         assertEquals("20,21,22", group.getGroupinfo().getMembers());
561     }
562
563     @Test
564     public void validateSwitchGroupModel() {
565         Optional<AVMFritzBaseModel> optionalGroup = findModelByIdentifier("F0:A3:7F-900");
566         assertTrue(optionalGroup.isPresent());
567         assertTrue(optionalGroup.get() instanceof GroupModel);
568
569         GroupModel group = (GroupModel) optionalGroup.get();
570         assertEquals("", group.getProductName());
571         assertEquals("F0:A3:7F-900", group.getIdentifier());
572         assertEquals("20000", group.getDeviceId());
573         assertEquals("1.0", group.getFirmwareVersion());
574         assertEquals("AVM", group.getManufacturer());
575
576         assertEquals(1, group.getPresent());
577         assertEquals("Schlafzimmer", group.getName());
578
579         assertFalse(group.isButton());
580         assertFalse(group.isHANFUNButton());
581         assertFalse(group.isHANFUNAlarmSensor());
582         assertFalse(group.isDectRepeater());
583         assertTrue(group.isSwitchableOutlet());
584         assertFalse(group.isTempSensor());
585         assertTrue(group.isPowermeter());
586         assertFalse(group.isHeatingThermostat());
587
588         assertNotNull(group.getSwitch());
589         assertEquals(SwitchModel.ON, group.getSwitch().getState());
590         assertEquals(MODE_MANUAL, group.getSwitch().getMode());
591         assertEquals(BigDecimal.ZERO, group.getSwitch().getLock());
592         assertEquals(BigDecimal.ZERO, group.getSwitch().getDevicelock());
593
594         validatePowerMeter(group.getPowermeter());
595
596         assertNull(group.getHkr());
597
598         assertNotNull(group.getGroupinfo());
599         assertEquals("17", group.getGroupinfo().getMasterdeviceid());
600         assertEquals("17,18", group.getGroupinfo().getMembers());
601     }
602
603     private Optional<AVMFritzBaseModel> findModel(String name) {
604         return devices.getDevicelist().stream().filter(it -> name.equals(it.getProductName())).findFirst();
605     }
606
607     private Optional<AVMFritzBaseModel> findModelByIdentifier(String identifier) {
608         return devices.getDevicelist().stream().filter(it -> identifier.equals(it.getIdentifier())).findFirst();
609     }
610
611     private void validatePowerMeter(PowerMeterModel model) {
612         assertNotNull(model);
613         assertEquals(new BigDecimal("230.051"), model.getVoltage());
614         assertEquals(new BigDecimal("0.000"), model.getPower());
615         assertEquals(new BigDecimal("2087"), model.getEnergy());
616     }
617
618     private void validateHeatingModel(HeatingModel model) {
619         assertNotNull(model);
620         assertEquals(new BigDecimal(44), model.getTist());
621         assertEquals(new BigDecimal(42), model.getTsoll());
622         assertEquals(new BigDecimal(28), model.getAbsenk());
623         assertEquals(new BigDecimal(42), model.getKomfort());
624         assertEquals(BigDecimal.ONE, model.getLock());
625         assertEquals(BigDecimal.ONE, model.getDevicelock());
626         assertEquals(BigDecimal.ZERO, model.getWindowopenactiv());
627         assertEquals(BigDecimal.ZERO, model.getBoostactive());
628         assertEquals(new BigDecimal("100"), model.getBattery());
629         assertEquals(BatteryModel.BATTERY_OFF, model.getBatterylow());
630         assertEquals(MODE_AUTO, model.getMode());
631         assertEquals(MODE_COMFORT, model.getRadiatorMode());
632
633         assertNotNull(model.getNextchange());
634         assertEquals(1484341200, model.getNextchange().getEndperiod());
635         assertEquals(new BigDecimal(28), model.getNextchange().getTchange());
636     }
637 }