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