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