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