/**
* Copyright (c) 2010-2016 by the respective copyright holders.
*
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*/
package org.openhab.binding.stiebelheatpump.protocol;
import java.util.List;
import java.util.Map;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Ignore;
import org.junit.Test;
import org.openhab.binding.stiebelheatpump.internal.ConfigParserTest;
import org.openhab.binding.stiebelheatpump.internal.StiebelHeatPumpException;
import org.openhab.binding.stiebelheatpump.protocol.Requests.Matcher;
public class StiebelHeatPumpDataParserTest {
private DataParser parser = new DataParser();
private ConfigParserTest configParserTest = new ConfigParserTest();
private List<Request> configuration = null;
@Before
public void setUp() throws StiebelHeatPumpException {
configuration = configParserTest.getHeatPumpConfiguration();
}
// request parser tests
@Test
// request FD
public void testParseVersion() throws StiebelHeatPumpException {
// verify the version from heat pump
List<Request> result = Requests.searchIn(configuration, new Matcher<Request>() {
@Override
public boolean matches(Request r) {
return r.getName() == "Version";
}
});
byte[] response = new byte[] { (byte) 0x01, (byte) 0x00, (byte) 0xb5, (byte) 0xfd, (byte) 0x01, (byte) 0xb6,
(byte) 0x10, (byte) 0x03 };
Map<String, String> data = parser.parseRecords(response, result.get(0));
data.get("Version");
Assert.assertEquals(response[3], result.get(0).getRequestByte());
Assert.assertEquals(response[2], parser.calculateChecksum(response));
Assert.assertEquals("4.38", data.get("Version"));
}
@Test
// request FC
public void testParseTime() throws StiebelHeatPumpException {
List<Request> result = Requests.searchIn(configuration, new Matcher<Request>() {
@Override
public boolean matches(Request r) {
return r.getName() == "Time";
}
});
byte[] response = new byte[] { (byte) 0x01, (byte) 0x00, (byte) 0x79, (byte) 0xfc, (byte) 0x00, (byte) 0x02,
(byte) 0x0a, (byte) 0x21, (byte) 0x24, (byte) 0x0e, (byte) 0x00, (byte) 0x03, (byte) 0x1a, (byte) 0x10,
(byte) 0x03 };
response = parser.fixDuplicatedBytes(response);
Assert.assertEquals(response[3], result.get(0).getRequestByte());
Assert.assertEquals(response[2], parser.calculateChecksum(response));
Map<String, String> data = parser.parseRecords(response, result.get(0));
Assert.assertEquals("2", data.get("WeekDay"));
Assert.assertEquals("10", data.get("Hours"));
Assert.assertEquals("33", data.get("Minutes"));
Assert.assertEquals("36", data.get("Seconds"));
Assert.assertEquals("14", data.get("Year"));
Assert.assertEquals("3", data.get("Month"));
Assert.assertEquals("26", data.get("Day"));
}
@Test
@Ignore
// request FC
public void testParseTime2() throws StiebelHeatPumpException {
List<Request> result = Requests.searchIn(configuration, new Matcher<Request>() {
@Override
public boolean matches(Request r) {
return r.getName() == "Time";
}
});
byte[] response = new byte[] { (byte) 0x01, (byte) 0x00, (byte) 0x6a, (byte) 0xfc, (byte) 0x00, (byte) 0x06,
(byte) 0x15, (byte) 0x27, (byte) 0x0a, (byte) 0x0f, (byte) 0x00, (byte) 0x02, (byte) 0x10, (byte) 0x10,
(byte) 0x10, (byte) 0x03 };
response = parser.fixDuplicatedBytes(response);
Assert.assertEquals(response[3], result.get(0).getRequestByte());
Assert.assertEquals(response[2], parser.calculateChecksum(response));
Map<String, String> data = parser.parseRecords(response, result.get(0));
Assert.assertEquals("2", data.get("WeekDay"));
Assert.assertEquals("21", data.get("Hours"));
Assert.assertEquals("33", data.get("Minutes"));
Assert.assertEquals("36", data.get("Seconds"));
Assert.assertEquals("14", data.get("Year"));
Assert.assertEquals("2", data.get("Month"));
Assert.assertEquals("8", data.get("Day"));
}
@Test
// request O9
public void testParseOperationCounters() throws StiebelHeatPumpException {
List<Request> result = Requests.searchIn(configuration, new Matcher<Request>() {
@Override
public boolean matches(Request r) {
return r.getName() == "OperationCounters";
}
});
byte[] response = new byte[] { (byte) 0x01, (byte) 0x00, (byte) 0xea, (byte) 0x09, (byte) 0x00, (byte) 0x1a,
(byte) 0x00, (byte) 0x19, (byte) 0x0c, (byte) 0x77, (byte) 0x02, (byte) 0x28, (byte) 0x00, (byte) 0x00,
(byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x03 };
response = parser.fixDuplicatedBytes(response);
Assert.assertEquals(response[3], result.get(0).getRequestByte());
Assert.assertEquals(response[2], parser.calculateChecksum(response));
Map<String, String> data = parser.parseRecords(response, result.get(0));
Assert.assertEquals("26", data.get("CompressorA"));
Assert.assertEquals("25", data.get("CompressorB"));
Assert.assertEquals("3191", data.get("HeatingMode"));
Assert.assertEquals("552", data.get("DHWMode"));
Assert.assertEquals("0", data.get("CoolingMode"));
}
@Test
// request FB
public void testParseCurrentValues() throws StiebelHeatPumpException {
List<Request> result = Requests.searchIn(configuration, new Matcher<Request>() {
@Override
public boolean matches(Request r) {
return r.getName() == "CurrentValues";
}
});
byte[] response = new byte[] { (byte) 0x01, (byte) 0x00, (byte) 0x48, (byte) 0xfb, (byte) 0x01, (byte) 0xaa,
(byte) 0x00, (byte) 0x72, (byte) 0x01, (byte) 0x3a, (byte) 0x00, (byte) 0xa2, (byte) 0x02, (byte) 0xdc,
(byte) 0x01, (byte) 0xce, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x59,
(byte) 0x01, (byte) 0x73, (byte) 0x11, (byte) 0x18, (byte) 0x27, (byte) 0x27, (byte) 0xf4, (byte) 0xca,
(byte) 0x0c, (byte) 0x22, (byte) 0x1d, (byte) 0x00, (byte) 0x00, (byte) 0x57, (byte) 0x00, (byte) 0x00,
(byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x01, (byte) 0x00, (byte) 0x10,
(byte) 0x03 };
response = parser.fixDuplicatedBytes(response);
Assert.assertEquals(response[3], result.get(0).getRequestByte());
Assert.assertEquals(response[2], parser.calculateChecksum(response));
Map<String, String> data = parser.parseRecords(response, result.get(0));
Assert.assertEquals("42.6", data.get("CollectorTemperatur"));
Assert.assertEquals("11.4", data.get("OutsideTemperature"));
Assert.assertEquals("31.4", data.get("FlowTemperature"));
Assert.assertEquals("16.2", data.get("ReturnTemperature"));
Assert.assertEquals("73.2", data.get("HotGasTemperature"));
Assert.assertEquals("46.2", data.get("CylinderTemperature"));
Assert.assertEquals("8.9", data.get("EvaporatorTemperature"));
Assert.assertEquals("37.1", data.get("CondenserTemperature"));
Assert.assertEquals("8.9", data.get("EvaporatorTemperature"));
Assert.assertEquals("12", data.get("ExtractFanSpeed"));
Assert.assertEquals("34", data.get("SupplyFanSpeed"));
Assert.assertEquals("29", data.get("ExhaustFanSpeed"));
Assert.assertEquals("8.7", data.get("FilteredOutsideTemperature"));
}
@Test
// request 17
public void testParseSettingsNominalValues() throws StiebelHeatPumpException {
List<Request> result = Requests.searchIn(configuration, new Matcher<Request>() {
@Override
public boolean matches(Request r) {
return r.getName() == "SettingsNominalValues";
}
});
byte[] response = new byte[] { (byte) 0x01, (byte) 0x00, (byte) 0xec, (byte) 0x17, (byte) 0x00, (byte) 0xa5,
(byte) 0x00, (byte) 0x9d, (byte) 0x00, (byte) 0x64, (byte) 0x01, (byte) 0xc2, (byte) 0x01, (byte) 0xe0,
(byte) 0x00, (byte) 0x64, (byte) 0x01, (byte) 0x01, (byte) 0x00, (byte) 0x01, (byte) 0x5e, (byte) 0x01,
(byte) 0xc2, (byte) 0x02, (byte) 0x10, (byte) 0x03 };
response = parser.fixDuplicatedBytes(response);
Assert.assertEquals(response[3], result.get(0).getRequestByte());
Assert.assertEquals(response[2], parser.calculateChecksum(response));
Map<String, String> data = parser.parseRecords(response, result.get(0));
Assert.assertEquals("16.5", data.get("P01RoomTemperatureStandardMode"));
Assert.assertEquals("15.7", data.get("P02RoomTemperatureSetbackMode"));
Assert.assertEquals("10.0", data.get("P03RoomTemperatureStandby"));
Assert.assertEquals("45.0", data.get("P04DHWTemperatureStandardMode"));
Assert.assertEquals("48.0", data.get("P05DHWTemperaturSetbackMode"));
Assert.assertEquals("10.0", data.get("P06DHWTemperatureStandby"));
Assert.assertEquals("1", data.get("P07FanStageStandardMode"));
Assert.assertEquals("1", data.get("P08FanStageSetbackMode"));
Assert.assertEquals("0", data.get("P09FanStageStandby"));
Assert.assertEquals("35.0", data.get("P10HeatingCircuitTemperatureManualMode"));
Assert.assertEquals("45.0", data.get("P11DHWTemperatureManualMode"));
Assert.assertEquals("2", data.get("P12FanStageManualMode"));
}
@Test
// request 01
public void testParseSettingsVentilation() throws StiebelHeatPumpException {
List<Request> result = Requests.searchIn(configuration, new Matcher<Request>() {
@Override
public boolean matches(Request r) {
return r.getName() == "SettingsVentilation";
}
});
byte[] response = new byte[] { (byte) 0x01, (byte) 0x00, (byte) 0x2f, (byte) 0x01, (byte) 0x00, (byte) 0x73,
(byte) 0x00, (byte) 0x77, (byte) 0x00, (byte) 0xa6, (byte) 0x00, (byte) 0x73, (byte) 0x00, (byte) 0x86,
(byte) 0x00, (byte) 0xc4, (byte) 0x00, (byte) 0x38, (byte) 0x00, (byte) 0x38, (byte) 0x00, (byte) 0x38,
(byte) 0x00, (byte) 0x38, (byte) 0x00, (byte) 0x00, (byte) 0x10, (byte) 0x03 };
response = parser.fixDuplicatedBytes(response);
Assert.assertEquals(response[3], result.get(0).getRequestByte());
Assert.assertEquals(response[2], parser.calculateChecksum(response));
Map<String, String> data = parser.parseRecords(response, result.get(0));
Assert.assertEquals("115", data.get("P37FanStageSupplyAir1"));
Assert.assertEquals("119", data.get("P38FanStageSupplyAir2"));
Assert.assertEquals("166", data.get("P39FanStageSupplyAir3"));
Assert.assertEquals("115", data.get("P40FanStageExtractyAir1"));
Assert.assertEquals("134", data.get("P41FanStageExtractyAir2"));
Assert.assertEquals("196", data.get("P42FanStageExtractyAir3"));
Assert.assertEquals("56", data.get("P43VentilationTimeUnscheduledStage3"));
Assert.assertEquals("56", data.get("P44VentilationTimeUnscheduledStage2"));
Assert.assertEquals("56", data.get("P45VentilationTimeUnscheduledStage1"));
Assert.assertEquals("56", data.get("P46VentilationTimeUnscheduledStage0"));
Assert.assertEquals("0", data.get("P75OperatingModePassiveCooling"));
Assert.assertEquals("0", data.get("StoveFireplaceOperation"));
}
@Test
// request O6
public void testParseSettingsHeating1() throws StiebelHeatPumpException {
List<Request> result = Requests.searchIn(configuration, new Matcher<Request>() {
@Override
public boolean matches(Request r) {
return r.getName() == "SettingsHeating1";
}
});
byte[] response = new byte[] { (byte) 0x01, (byte) 0x00, (byte) 0xac, (byte) 0x06, (byte) 0x28, (byte) 0x1e,
(byte) 0x1e, (byte) 0x14, (byte) 0x0a, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x02, (byte) 0x00,
(byte) 0x64, (byte) 0x03, (byte) 0x02, (byte) 0xee, (byte) 0x00, (byte) 0xc8, (byte) 0x00, (byte) 0x0a,
(byte) 0x00, (byte) 0x01, (byte) 0xff, (byte) 0xce, (byte) 0x10, (byte) 0x10, (byte) 0x1a, (byte) 0x10,
(byte) 0x03 };
response = parser.fixDuplicatedBytes(response);
Assert.assertEquals(response[3], result.get(0).getRequestByte());
Assert.assertEquals(response[2], parser.calculateChecksum(response));
Map<String, String> data = parser.parseRecords(response, result.get(0));
Assert.assertEquals("4.0", data.get("P21HysteresisHeating1"));
Assert.assertEquals("3.0", data.get("P22HysteresisHeating2"));
Assert.assertEquals("3.0", data.get("P23HysteresisHeating3"));
Assert.assertEquals("2.0", data.get("P24HysteresisHeating4"));
Assert.assertEquals("1.0", data.get("P25HysteresisHeating5"));
Assert.assertEquals("0.0", data.get("P26HysteresisHeating6"));
Assert.assertEquals("0.0", data.get("P27HysteresisHeating7"));
Assert.assertEquals("0.0", data.get("P28HysteresisHeating8"));
Assert.assertEquals("2", data.get("P29SwitchingHysteresisAsymmetry"));
Assert.assertEquals("100", data.get("P30SwitchingValueIntegralPortionHeating"));
Assert.assertEquals("3", data.get("P31AmountOfUnlockedElectricalBoosterStages"));
Assert.assertEquals("75.0", data.get("MaximumFlowTemperatureHeatingMode"));
Assert.assertEquals("20.0", data.get("P49ChangeoverTemperatureSummerWinter"));
Assert.assertEquals("1.0", data.get("P50HysteresisChangeoverTemperatureSummerWinter"));
Assert.assertEquals("1", data.get("P77OutsideTemperatureAdjustment"));
Assert.assertEquals("-5.0", data.get("P78BivalencePoint"));
Assert.assertEquals("16", data.get("P79DelayedEnableReheating"));
Assert.assertEquals("2.6", data.get("OutputElectricalHeatingStage1"));
}
@Test
// request O5
public void testParseSettingsHeating2() throws StiebelHeatPumpException {
List<Request> result = Requests.searchIn(configuration, new Matcher<Request>() {
@Override
public boolean matches(Request r) {
return r.getName() == "SettingsHeating2";
}
});
byte[] response = new byte[] { (byte) 0x01, (byte) 0x00, (byte) 0x7c, (byte) 0x05, (byte) 0x00, (byte) 0x04,
(byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x05, (byte) 0x00, (byte) 0x00, (byte) 0x00,
(byte) 0x00, (byte) 0x1e, (byte) 0x00, (byte) 0x64, (byte) 0x02, (byte) 0x26, (byte) 0x00, (byte) 0x32,
(byte) 0x01, (byte) 0x5e, (byte) 0x00, (byte) 0x32, (byte) 0x10, (byte) 0x03 };
response = parser.fixDuplicatedBytes(response);
Assert.assertEquals(response[3], result.get(0).getRequestByte());
Assert.assertEquals(response[2], parser.calculateChecksum(response));
Map<String, String> data = parser.parseRecords(response, result.get(0));
Assert.assertEquals("0.4", data.get("P13IncreaseHeatingHC1"));
Assert.assertEquals("0.0", data.get("P14LowEndPointHeatingHC1"));
Assert.assertEquals("0.0", data.get("P15RoomInfluenceHeatingHC1"));
Assert.assertEquals("0.5", data.get("P16IncreaseHeatingHC2"));
Assert.assertEquals("0.0", data.get("P17LowEndPointHeatingHC2"));
Assert.assertEquals("0.0", data.get("P18RoomInfluenceHeatingHC2"));
Assert.assertEquals("30", data.get("P19TemperatureCaptureReturnFlowHC1"));
Assert.assertEquals("100", data.get("P20TemperatureCaptureReturnFlowHC2"));
Assert.assertEquals("55.0", data.get("MaxSetHeatingCircuitTemperatureHC1"));
Assert.assertEquals("5.0", data.get("MinSetHeatingCircuitTemperatureHC1"));
Assert.assertEquals("35.0", data.get("MaxSetHeatingCircuitTemperatureHC2"));
Assert.assertEquals("5.0", data.get("MinSetHeatingCircuitTemperatureHC2"));
}
@Test
// request OC
public void testParseSettingsDomesticWater() throws StiebelHeatPumpException {
List<Request> result = Requests.searchIn(configuration, new Matcher<Request>() {
@Override
public boolean matches(Request r) {
return r.getName() == "SettingsDomesticHotWater";
}
});
byte[] response = new byte[] { (byte) 0x01, (byte) 0x00, (byte) 0x8e, (byte) 0x07, (byte) 0x14, (byte) 0x5a,
(byte) 0xff, (byte) 0x9c, (byte) 0x1e, (byte) 0x07, (byte) 0x00, (byte) 0x64, (byte) 0x03, (byte) 0x02,
(byte) 0xee, (byte) 0x01, (byte) 0x10, (byte) 0x03 };
response = parser.fixDuplicatedBytes(response);
Assert.assertEquals(response[3], result.get(0).getRequestByte());
Assert.assertEquals(response[2], parser.calculateChecksum(response));
Map<String, String> data = parser.parseRecords(response, result.get(0));
Assert.assertEquals("2.0", data.get("P32StartupHysteresisDHWTemperature"));
Assert.assertEquals("90", data.get("P33TimeDelayElectricalReheating"));
Assert.assertEquals("-10.0", data.get("P34OutsideTemperatureLimitForImmElectricalReheating"));
Assert.assertEquals("30", data.get("P35PasteurisationInterval"));
Assert.assertEquals("7", data.get("P36MaxDurationDHWLoading"));
Assert.assertEquals("10.0", data.get("PasteurisationHeatupTemperature"));
Assert.assertEquals("3", data.get("NoOfEnabledElectricalReheatStagesDHWLoading"));
Assert.assertEquals("75.0", data.get("MaxFlowTemperatureDHWMode"));
Assert.assertEquals("1", data.get("CompressorShutdownDHWLoading"));
}
@Test
// request O3
public void testParseSettingsEvaporator1() throws StiebelHeatPumpException {
List<Request> result = Requests.searchIn(configuration, new Matcher<Request>() {
@Override
public boolean matches(Request r) {
return r.getName() == "SettingsEvaporator1";
}
});
byte[] response = new byte[] { (byte) 0x01, (byte) 0x00, (byte) 0x0e, (byte) 0x03, (byte) 0x00, (byte) 0x96,
(byte) 0x00, (byte) 0x0a, (byte) 0x00, (byte) 0x96, (byte) 0x00, (byte) 0x64, (byte) 0x10, (byte) 0x10,
(byte) 0x60, (byte) 0x10, (byte) 0x03 };
response = parser.fixDuplicatedBytes(response);
Assert.assertEquals(response[3], result.get(0).getRequestByte());
Assert.assertEquals(response[2], parser.calculateChecksum(response));
Map<String, String> data = parser.parseRecords(response, result.get(0));
Assert.assertEquals("15.0", data.get("UpperLimitEvaporatorTemperatureForDefrostEnd"));
Assert.assertEquals("10", data.get("MaxEvaporatorDefrostTime"));
Assert.assertEquals("15.0", data.get("LimitTemperatureCondenserElectricalReheating"));
Assert.assertEquals("10.0", data.get("LimitTemperatureCondenserDefrostTermination"));
Assert.assertEquals("16", data.get("P47CompressorRestartDelay"));
Assert.assertEquals("96", data.get("P48ExhaustFanSpeed"));
}
@Test
// request O4
public void testParseSettingsEvaporator2() throws StiebelHeatPumpException {
List<Request> result = Requests.searchIn(configuration, new Matcher<Request>() {
@Override
public boolean matches(Request r) {
return r.getName() == "SettingsEvaporator2";
}
});
byte[] response = new byte[] { (byte) 0x01, (byte) 0x00, (byte) 0x00, (byte) 0x04, (byte) 0x3c, (byte) 0x00,
(byte) 0x64, (byte) 0x00, (byte) 0x5a, (byte) 0x01, (byte) 0x10, (byte) 0x03 };
response = parser.fixDuplicatedBytes(response);
Assert.assertEquals(response[3], result.get(0).getRequestByte());
Assert.assertEquals(response[2], parser.calculateChecksum(response));
Map<String, String> data = parser.parseRecords(response, result.get(0));
Assert.assertEquals("60", data.get("MaxDefrostDurationAAExchanger"));
Assert.assertEquals("10.0", data.get("DefrostStartThreshold"));
Assert.assertEquals("90", data.get("VolumeFlowFilterReplacement"));
Assert.assertEquals("1", data.get("P85DefrostModeAAHE"));
}
@Test
// request 10
public void testParseSettingsDryHeatingProgram() throws StiebelHeatPumpException {
List<Request> result = Requests.searchIn(configuration, new Matcher<Request>() {
@Override
public boolean matches(Request r) {
return r.getName() == "SettingsDryHeatingProgram";
}
});
byte[] response = new byte[] { (byte) 0x01, (byte) 0x00, (byte) 0xa8, (byte) 0x10, (byte) 0x10, (byte) 0x00,
(byte) 0x00, (byte) 0xfa, (byte) 0x01, (byte) 0x90, (byte) 0x00, (byte) 0x02, (byte) 0x00, (byte) 0x0a,
(byte) 0x10, (byte) 0x03 };
response = parser.fixDuplicatedBytes(response);
Assert.assertEquals(response[3], result.get(0).getRequestByte());
Assert.assertEquals(response[2], parser.calculateChecksum(response));
Map<String, String> data = parser.parseRecords(response, result.get(0));
Assert.assertEquals("0", data.get("P70Start"));
Assert.assertEquals("25.0", data.get("P71BaseTemperature"));
Assert.assertEquals("40.0", data.get("P72PeakTemperature"));
Assert.assertEquals("2", data.get("P73BaseTemperatureDuration"));
Assert.assertEquals("1.0", data.get("P74Increase"));
}
@Test
// request 10
public void testAddDuplicatesInRequest1() throws StiebelHeatPumpException {
byte[] response = new byte[] { (byte) 0x01, (byte) 0x00, (byte) 0x10, (byte) 0x0f, (byte) 0x10, (byte) 0x03 };
byte[] newResponse = parser.addDuplicatedBytes(response);
byte[] resultingBytes = new byte[] { (byte) 0x01, (byte) 0x00, (byte) 0x10, (byte) 0x10, (byte) 0x0f,
(byte) 0x10, (byte) 0x03 };
Assert.assertEquals(response[2], parser.calculateChecksum(response));
for (int i = 0; i < newResponse.length; i++) {
Assert.assertEquals(resultingBytes[i], newResponse[i]);
}
}
@Test
// request 10
public void testAddDuplicatesInRequest2() throws StiebelHeatPumpException {
byte[] response = new byte[] { (byte) 0x01, (byte) 0x00, (byte) 0x11, (byte) 0x10, (byte) 0x10, (byte) 0x03 };
byte[] newResponse = parser.addDuplicatedBytes(response);
byte[] resultingBytes = new byte[] { (byte) 0x01, (byte) 0x00, (byte) 0x11, (byte) 0x10, (byte) 0x10,
(byte) 0x10, (byte) 0x03 };
Assert.assertEquals(response[2], parser.calculateChecksum(response));
for (int i = 0; i < newResponse.length; i++) {
Assert.assertEquals(resultingBytes[i], newResponse[i]);
}
}
@Test
// request OA
public void testParseSettingsCirculationPump() throws StiebelHeatPumpException {
List<Request> result = Requests.searchIn(configuration, new Matcher<Request>() {
@Override
public boolean matches(Request r) {
return r.getName() == "SettingsCirculationPump";
}
});
byte[] response = new byte[] { (byte) 0x01, (byte) 0x00, (byte) 0xeb, (byte) 0x0a, (byte) 0x01, (byte) 0x01,
(byte) 0x20, (byte) 0x00, (byte) 0xba, (byte) 0x00, (byte) 0xc8, (byte) 0x00, (byte) 0x3c, (byte) 0x10,
(byte) 0x03 };
response = parser.fixDuplicatedBytes(response);
Assert.assertEquals(response[3], result.get(0).getRequestByte());
Assert.assertEquals(response[2], parser.calculateChecksum(response));
Map<String, String> data = parser.parseRecords(response, result.get(0));
Assert.assertEquals("1", data.get("P54minStartupCycles"));
Assert.assertEquals("288", data.get("P55maxStartupCycles"));
Assert.assertEquals("18.6", data.get("P56OutsideTemperatureMinHeatingCycles"));
Assert.assertEquals("20.0", data.get("P57OutsideTemperatureMaxHeatingCycles"));
Assert.assertEquals("60", data.get("P58SuppressTemperatureCaptureDuringPumpStart"));
}
@Test
// request OB
public void testParseSettingsHeatingProgram() throws StiebelHeatPumpException {
List<Request> result = Requests.searchIn(configuration, new Matcher<Request>() {
@Override
public boolean matches(Request r) {
return r.getName() == "SettingsHeatingProgram";
}
});
byte[] response = new byte[] { (byte) 0x01, (byte) 0x00, (byte) 0x39, (byte) 0x0b, (byte) 0x08, (byte) 0x98,
(byte) 0x02, (byte) 0x58, (byte) 0x7f, (byte) 0x00, (byte) 0x03, (byte) 0xe8, (byte) 0x06, (byte) 0xa4,
(byte) 0x1f, (byte) 0x00, (byte) 0x10, (byte) 0x03 };
response = parser.fixDuplicatedBytes(response);
Assert.assertEquals(response[3], result.get(0).getRequestByte());
Assert.assertEquals(response[2], parser.calculateChecksum(response));
Map<String, String> data = parser.parseRecords(response, result.get(0));
Assert.assertEquals("2200", data.get("HP1StartTime"));
Assert.assertEquals("600", data.get("HP1StopTime"));
Assert.assertEquals("1", data.get("HP1Monday"));
Assert.assertEquals("1", data.get("HP1Tuesday"));
Assert.assertEquals("1", data.get("HP1Wednesday"));
Assert.assertEquals("1", data.get("HP1Thusday"));
Assert.assertEquals("1", data.get("HP1Friday"));
Assert.assertEquals("1", data.get("HP1Saturday"));
Assert.assertEquals("1", data.get("HP1Sunday"));
Assert.assertEquals("0", data.get("HP1Enabled"));
Assert.assertEquals("1000", data.get("HP2StartTime"));
Assert.assertEquals("1700", data.get("HP2StopTime"));
Assert.assertEquals("1", data.get("HP2Monday"));
Assert.assertEquals("1", data.get("HP2Tuesday"));
Assert.assertEquals("1", data.get("HP2Wednesday"));
Assert.assertEquals("1", data.get("HP2Thusday"));
Assert.assertEquals("1", data.get("HP2Friday"));
Assert.assertEquals("0", data.get("HP2Saturday"));
Assert.assertEquals("0", data.get("HP2Sunday"));
Assert.assertEquals("0", data.get("HP2Enabled"));
}
@Test
// request OC
public void testParseSettingsDomesticWaterProgram() throws StiebelHeatPumpException {
List<Request> result = Requests.searchIn(configuration, new Matcher<Request>() {
@Override
public boolean matches(Request r) {
return r.getName() == "SettingsDomesticHotWaterProgram";
}
});
byte[] response = new byte[] { (byte) 0x01, (byte) 0x00, (byte) 0x1d, (byte) 0x0c, (byte) 0x08, (byte) 0x98,
(byte) 0x01, (byte) 0xf4, (byte) 0x7b, (byte) 0x00, (byte) 0x10, (byte) 0x03 };
response = parser.fixDuplicatedBytes(response);
Assert.assertEquals(response[3], result.get(0).getRequestByte());
Assert.assertEquals(response[2], parser.calculateChecksum(response));
Map<String, String> data = parser.parseRecords(response, result.get(0));
Assert.assertEquals("2200", data.get("BP1StartTime"));
Assert.assertEquals("500", data.get("BP1StopTime"));
Assert.assertEquals("1", data.get("BP1Monday"));
Assert.assertEquals("1", data.get("BP1Tuesday"));
Assert.assertEquals("0", data.get("BP1Wednesday"));
Assert.assertEquals("1", data.get("BP1Thusday"));
Assert.assertEquals("1", data.get("BP1Friday"));
Assert.assertEquals("1", data.get("BP1Saturday"));
Assert.assertEquals("1", data.get("BP1Sunday"));
Assert.assertEquals("0", data.get("BP1Enabled"));
}
@Test
// request OD
public void testParseSettingsVentilationProgram() throws StiebelHeatPumpException {
List<Request> result = Requests.searchIn(configuration, new Matcher<Request>() {
@Override
public boolean matches(Request r) {
return r.getName() == "SettingsVentilationProgram";
}
});
byte[] response = new byte[] { (byte) 0x01, (byte) 0x00, (byte) 0x33, (byte) 0x0d, (byte) 0x08, (byte) 0x98,
(byte) 0x02, (byte) 0x58, (byte) 0x7b, (byte) 0x00, (byte) 0x03, (byte) 0xe8, (byte) 0x06, (byte) 0xa4,
(byte) 0x1b, (byte) 0x00, (byte) 0x10, (byte) 0x03 };
response = parser.fixDuplicatedBytes(response);
Assert.assertEquals(response[3], result.get(0).getRequestByte());
Assert.assertEquals(response[2], parser.calculateChecksum(response));
Map<String, String> data = parser.parseRecords(response, result.get(0));
Assert.assertEquals("2200", data.get("LP1StartTime"));
Assert.assertEquals("600", data.get("LP1StopTime"));
Assert.assertEquals("1", data.get("LP1Monday"));
Assert.assertEquals("1", data.get("LP1Tuesday"));
Assert.assertEquals("0", data.get("LP1Wednesday"));
Assert.assertEquals("1", data.get("LP1Thusday"));
Assert.assertEquals("1", data.get("LP1Friday"));
Assert.assertEquals("1", data.get("LP1Saturday"));
Assert.assertEquals("1", data.get("LP1Sunday"));
Assert.assertEquals("0", data.get("LP1Enabled"));
Assert.assertEquals("1000", data.get("LP2StartTime"));
Assert.assertEquals("1700", data.get("LP2StopTime"));
Assert.assertEquals("1", data.get("LP2Monday"));
Assert.assertEquals("1", data.get("LP2Tuesday"));
Assert.assertEquals("0", data.get("LP2Wednesday"));
Assert.assertEquals("1", data.get("LP2Thusday"));
Assert.assertEquals("1", data.get("LP2Friday"));
Assert.assertEquals("0", data.get("LP2Saturday"));
Assert.assertEquals("0", data.get("LP2Sunday"));
Assert.assertEquals("0", data.get("LP2Enabled"));
}
@Test
// request OD
public void testParseSettingsAbsenceProgram() throws StiebelHeatPumpException {
List<Request> result = Requests.searchIn(configuration, new Matcher<Request>() {
@Override
public boolean matches(Request r) {
return r.getName() == "SettingsAbsenceProgram";
}
});
byte[] response = new byte[] { (byte) 0x01, (byte) 0x00, (byte) 0x10, (byte) 0x10, (byte) 0x0f, (byte) 0x00,
(byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x10, (byte) 0x03 };
response = parser.fixDuplicatedBytes(response);
Assert.assertEquals(response[3], result.get(0).getRequestByte());
Assert.assertEquals(response[2], parser.calculateChecksum(response));
Map<String, String> data = parser.parseRecords(response, result.get(0));
Assert.assertEquals("0.0", data.get("AP0DurationUntilAbsenceStart"));
Assert.assertEquals("0.0", data.get("AP0AbsenceDuration"));
Assert.assertEquals("0", data.get("AP0EnableAbsenceProgram"));
}
@Test
// request 0E
public void testParseSettingsRestartAndMixerTime() throws StiebelHeatPumpException {
List<Request> result = Requests.searchIn(configuration, new Matcher<Request>() {
@Override
public boolean matches(Request r) {
return r.getName() == "SettingsRestartAndMixerTime";
}
});
byte[] response = new byte[] { (byte) 0x01, (byte) 0x00, (byte) 0x09, (byte) 0x0e, (byte) 0x00, (byte) 0x78,
(byte) 0x00, (byte) 0x64, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x1e, (byte) 0x10,
(byte) 0x03 };
response = parser.fixDuplicatedBytes(response);
Assert.assertEquals(response[3], result.get(0).getRequestByte());
Assert.assertEquals(response[2], parser.calculateChecksum(response));
Map<String, String> data = parser.parseRecords(response, result.get(0));
Assert.assertEquals("120", data.get("P59RestartBeforSetbackEnd"));
Assert.assertEquals("10.0", data.get("MixerProportionalRange"));
Assert.assertEquals("0.0", data.get("DerivativeMixerTime"));
Assert.assertEquals("30", data.get("MixerTimeInterval"));
}
@Test
// write new value for short byte value use case
public void testWriteTime() throws StiebelHeatPumpException {
List<Request> result = Requests.searchIn(configuration, new Matcher<Request>() {
@Override
public boolean matches(Request r) {
return r.getName() == "Time";
}
});
byte[] response = new byte[] { (byte) 0x01, (byte) 0x00, (byte) 0x79, (byte) 0xfc, (byte) 0x00, (byte) 0x02,
(byte) 0x0a, (byte) 0x21, (byte) 0x24, (byte) 0x0e, (byte) 0x00, (byte) 0x03, (byte) 0x1a, (byte) 0x10,
(byte) 0x03 };
response = parser.fixDuplicatedBytes(response);
Assert.assertEquals(response[3], result.get(0).getRequestByte());
Assert.assertEquals(response[2], parser.calculateChecksum(response));
Map<String, String> data = parser.parseRecords(response, result.get(0));
Assert.assertEquals("2", data.get("WeekDay"));
Assert.assertEquals("10", data.get("Hours"));
Assert.assertEquals("33", data.get("Minutes"));
Assert.assertEquals("36", data.get("Seconds"));
Assert.assertEquals("14", data.get("Year"));
Assert.assertEquals("3", data.get("Month"));
Assert.assertEquals("26", data.get("Day"));
byte[] resultingBytes = new byte[] { (byte) 0x01, (byte) 0x80, (byte) 0xf1, (byte) 0xfc, (byte) 0x00,
(byte) 0x02, (byte) 0x0a, (byte) 0x22, (byte) 0x1b, (byte) 0x0e, (byte) 0x00, (byte) 0x03, (byte) 0x1a,
(byte) 0x10, (byte) 0x03 };
Request request = result.get(0);
RecordDefinition recordDefinition = null;
for (RecordDefinition record : request.getRecordDefinitions()) {
if (record.getName() == "Minutes") {
recordDefinition = record;
break;
}
}
byte[] newResponse = parser.composeRecord("34", response, recordDefinition);
for (RecordDefinition record : request.getRecordDefinitions()) {
if (record.getName() == "Seconds") {
recordDefinition = record;
break;
}
}
Throwable e = null;
try {
newResponse = parser.composeRecord("90", newResponse, recordDefinition);
} catch (Throwable ex) {
e = ex;
}
Assert.assertTrue(e instanceof StiebelHeatPumpException);
newResponse = parser.composeRecord("27", newResponse, recordDefinition);
// update the checksum
newResponse[2] = parser.calculateChecksum(newResponse);
for (int i = 0; i < newResponse.length; i++) {
Assert.assertEquals(resultingBytes[i], newResponse[i]);
}
}
@Test
@Ignore
// write new value for bitPosition use case
public void testwriteSettingsDomesticWaterProgram() throws StiebelHeatPumpException {
List<Request> result = Requests.searchIn(configuration, new Matcher<Request>() {
@Override
public boolean matches(Request r) {
return r.getName().equals("SettingsDomesticHotWaterProgram");
}
});
byte[] response = new byte[] { (byte) 0x01, (byte) 0x00, (byte) 0x1d, (byte) 0x0c, (byte) 0x08, (byte) 0x98,
(byte) 0x01, (byte) 0xf4, (byte) 0x7b, (byte) 0x00, (byte) 0x10, (byte) 0x03 };
response = parser.fixDuplicatedBytes(response);
Assert.assertEquals(response[3], result.get(0).getRequestByte());
Assert.assertEquals(response[2], parser.calculateChecksum(response));
Map<String, String> data = parser.parseRecords(response, result.get(0));
Assert.assertEquals("2200", data.get("BP1StartTime"));
Assert.assertEquals("500", data.get("BP1StopTime"));
Assert.assertEquals("1", data.get("BP1Monday"));
Assert.assertEquals("1", data.get("BP1Tuesday"));
Assert.assertEquals("0", data.get("BP1Wednesday"));
Assert.assertEquals("1", data.get("BP1Thusday"));
Assert.assertEquals("1", data.get("BP1Friday"));
Assert.assertEquals("1", data.get("BP1Saturday"));
Assert.assertEquals("1", data.get("BP1Sunday"));
Assert.assertEquals("0", data.get("BP1Enabled"));
Request request = result.get(0);
RecordDefinition recordDefinition = null;
for (RecordDefinition record : request.getRecordDefinitions()) {
if (record.getName().equals("BP1Wednesday")) {
recordDefinition = record;
break;
}
}
byte[] newResponse = parser.composeRecord("1", response, recordDefinition);
// update the checksum
newResponse[2] = parser.calculateChecksum(newResponse);
data = parser.parseRecords(newResponse, request);
Assert.assertEquals("1", data.get("BP1Wednesday"));
Assert.assertEquals("2200", data.get("BP1StartTime"));
Assert.assertEquals("500", data.get("BP1StopTime"));
Assert.assertEquals("1", data.get("BP1Monday"));
Assert.assertEquals("1", data.get("BP1Tuesday"));
Assert.assertEquals("1", data.get("BP1Thusday"));
Assert.assertEquals("1", data.get("BP1Friday"));
Assert.assertEquals("1", data.get("BP1Saturday"));
Assert.assertEquals("1", data.get("BP1Sunday"));
Assert.assertEquals("0", data.get("BP1Enabled"));
}
@Test
// write new value for P04DHWTemperatureStandardMode use case
public void testwriteP04DHWTemperatureStandardMode() throws StiebelHeatPumpException {
List<Request> result = Requests.searchIn(configuration, new Matcher<Request>() {
@Override
public boolean matches(Request r) {
return r.getName().equals("SettingsNominalValues");
}
});
byte[] response = new byte[] { (byte) 0x01, (byte) 0x00, (byte) 0xf0, (byte) 0x17, (byte) 0x00, (byte) 0xa2,
(byte) 0x00, (byte) 0xa5, (byte) 0x00, (byte) 0x64, (byte) 0x01, (byte) 0xc2, (byte) 0x01, (byte) 0xe0,
(byte) 0x00, (byte) 0x64, (byte) 0x01, (byte) 0x01, (byte) 0x00, (byte) 0x01, (byte) 0x5e, (byte) 0x01,
(byte) 0xc2, (byte) 0x01, (byte) 0x10, (byte) 0x03 };
response = parser.fixDuplicatedBytes(response);
Assert.assertEquals(response[3], result.get(0).getRequestByte());
Assert.assertEquals(response[2], parser.calculateChecksum(response));
Map<String, String> data = parser.parseRecords(response, result.get(0));
Assert.assertEquals("45.0", data.get("P04DHWTemperatureStandardMode"));
Request request = result.get(0);
RecordDefinition recordDefinition = null;
for (RecordDefinition record : request.getRecordDefinitions()) {
if (record.getName().equals("P04DHWTemperatureStandardMode")) {
recordDefinition = record;
break;
}
}
byte[] newResponse = parser.composeRecord("45.5", response, recordDefinition);
// update the checksum
newResponse[2] = parser.calculateChecksum(newResponse);
data = parser.parseRecords(newResponse, request);
Assert.assertEquals("45.5", data.get("P04DHWTemperatureStandardMode"));
}
// utility protocol tests
@Test
public void testParseFindAndReplace() throws StiebelHeatPumpException {
byte[] response = new byte[] { (byte) 0x01, (byte) 0x00, (byte) 0xac, (byte) 0x06, (byte) 0x28, (byte) 0x1e,
(byte) 0x1e, (byte) 0x14, (byte) 0x0a, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x02, (byte) 0x00,
(byte) 0x64, (byte) 0x03, (byte) 0x02, (byte) 0xee, (byte) 0x00, (byte) 0xc8, (byte) 0x00, (byte) 0x0a,
(byte) 0x00, (byte) 0x01, (byte) 0xff, (byte) 0xce, (byte) 0x10, (byte) 0x10, (byte) 0x1a, (byte) 0x10,
(byte) 0x03 };
int originalLength = response.length;
response = parser.findReplace(response, new byte[] { (byte) 0x10, (byte) 0x10 }, new byte[] { (byte) 0x10 });
response = parser.findReplace(response, new byte[] { (byte) 0x2b, (byte) 0x18 }, new byte[] { (byte) 0x2b });
Assert.assertEquals(1, originalLength - response.length);
}
@Test
public void testDataAvailable() {
try {
Assert.assertTrue(parser.dataAvailable(new byte[] { 0x10, 0x02 }));
} catch (Exception e) {
Assert.fail("unexpected exception");
}
try {
parser.dataAvailable(new byte[] {});
Assert.fail("expected exception");
} catch (Exception e) {
}
}
@Test
public void testHeader() {
try {
Assert.assertFalse(parser.headerCheck(
new byte[] { (byte) 0x01, (byte) 0x01, (byte) 0xfe, (byte) 0xfc, (byte) 0x10, (byte) 0x03 }));
Assert.assertTrue(parser.headerCheck(new byte[] { (byte) 0x01, (byte) 0x00, (byte) 0xcc, (byte) 0xfd,
(byte) 0x00, (byte) 0xce, (byte) 0x10, (byte) 0x03 }));
Assert.assertFalse(parser.headerCheck(
new byte[] { (byte) 0x01, (byte) 0x03, (byte) 0x80, (byte) 0x7c, (byte) 0x10, (byte) 0x03 }));
} catch (Exception e) {
Assert.fail("unexpected exception");
}
}
@Test
public void testDataSet() {
try {
Assert.assertFalse(parser.setDataCheck(
new byte[] { (byte) 0x01, (byte) 0x80, (byte) 0xfe, (byte) 0xfc, (byte) 0x10, (byte) 0x03 }));
Assert.assertTrue(parser.setDataCheck(
new byte[] { (byte) 0x01, (byte) 0x80, (byte) 0x7d, (byte) 0xfc, (byte) 0x10, (byte) 0x03 }));
} catch (Exception e) {
Assert.fail("unexpected exception");
}
}
@Test
public void testParseByteToHex() throws StiebelHeatPumpException {
byte[] response = new byte[] { (byte) 0x01, (byte) 0x00, (byte) 0xb5, (byte) 0xfd, (byte) 0x01, (byte) 0xb6,
(byte) 0xff, (byte) 0x10, (byte) 0x03 };
String hex = DataParser.bytesToHex(response);
Assert.assertEquals("(00)01 00 B5 FD (04)01 B6 FF 10 (08)03 ", hex);
}
}