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