@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
  // 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"));
  }
Пример #3
0
  /**
   * verifies response on availability of data
   *
   * @param response of heat pump
   * @param request request defined for heat pump response
   * @return Map of Strings with name and values
   */
  public Map<String, String> parseRecords(final byte[] response, Request request)
      throws StiebelHeatPumpException {

    Map<String, String> map = new HashMap<String, String>();

    logger.debug("Parse bytes: {}", DataParser.bytesToHex(response));

    if (response.length < 2) {
      logger.error(
          "response does not have a valid length of bytes: {}", DataParser.bytesToHex(response));
      return map;
    }

    // parse response and fill map
    for (RecordDefinition recordDefinition : request.getRecordDefinitions()) {
      try {
        String value = parseRecord(response, recordDefinition);
        logger.debug(
            "Parsed value {} -> {} with pos: {} , len: {}",
            recordDefinition.getName(),
            value,
            recordDefinition.getPosition(),
            recordDefinition.getLength());
        map.put(recordDefinition.getName(), value);
      } catch (StiebelHeatPumpException e) {
        continue;
      }
    }
    return map;
  }
  @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
  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
  @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 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"));
  }
Пример #9
0
  /**
   * parses a single record
   *
   * @param response of heat pump
   * @param RecordDefinition that shall be used for parsing the heat pump response
   * @return string value of the parse response
   * @throws StiebelHeatPumpException
   */
  public String parseRecord(byte[] response, RecordDefinition recordDefinition)
      throws StiebelHeatPumpException {
    try {
      if (response.length < 2) {
        logger.error(
            "response does not have a valid length of bytes: {}", DataParser.bytesToHex(response));
        throw new StiebelHeatPumpException();
      }
      ByteBuffer buffer = ByteBuffer.wrap(response);
      short number = 0;
      byte[] bytes = null;

      switch (recordDefinition.getLength()) {
        case 1:
          bytes = new byte[1];
          System.arraycopy(response, recordDefinition.getPosition(), bytes, 0, 1);
          number = Byte.valueOf(buffer.get(recordDefinition.getPosition()));
          break;
        case 2:
          bytes = new byte[2];
          System.arraycopy(response, recordDefinition.getPosition(), bytes, 0, 2);
          number = buffer.getShort(recordDefinition.getPosition());
          break;
      }

      if (recordDefinition.getBitPosition() > 0) {

        int returnValue = getBit(bytes, recordDefinition.getBitPosition());
        return String.valueOf(returnValue);
      }

      if (recordDefinition.getScale() != 1.0) {
        double myDoubleNumber = number * recordDefinition.getScale();
        myDoubleNumber = Math.round(myDoubleNumber * 100.0) / 100.0;
        String returnString = String.format("%s", myDoubleNumber);
        return returnString;
      }

      return String.valueOf(number);
    } catch (Exception e) {
      logger.error(
          "response {} could not be parsed for record definition {} ",
          DataParser.bytesToHex(response),
          recordDefinition.getName());
      throw new StiebelHeatPumpException();
    }
  }
 @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
  // 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 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"));
  }
 // 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
  // 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 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 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
  // 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 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
  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);
  }
  @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
  @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 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
  // 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 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 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 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
  // 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"));
  }