private NAThermProgram getExitingTestProgram(NAThermStateBody thermState) {
   if (thermState.getThermProgramBackup() != null) {
     for (NAThermProgram thermProgram : thermState.getThermProgramBackup()) {
       if (thermProgram.getName().equals(TEST_PROGRAM_NAME)) {
         return thermProgram;
       }
     }
   }
   return null;
 }
  @Test
  public void testSetpoint() {
    assumeNotNull(relayId);
    assumeNotNull(thermostatId);
    Float setpointTemp = Float.valueOf(20);

    NAThermStateBody thermState = api.getthermstate(relayId, thermostatId).getBody();
    NASetpoint setpoint = thermState.getSetpointOrder();
    if (setpoint == null) {
      setpoint = thermState.getSetpoint();
    }

    // If already in manual mode, ensure that the temp will be changed
    if (setpoint.getSetpointMode() == "manual") {
      setpointTemp = setpoint.getSetpointTemp() + Float.valueOf(0.5f);
    }

    // Send order
    api.setthermpoint(
        relayId,
        thermostatId,
        "manual",
        (int) (System.currentTimeMillis() / 1000 + 30),
        setpointTemp);

    // Verify order
    thermState = api.getthermstate(relayId, thermostatId).getBody();
    if (thermState.getSetpointOrder() != null) {
      assertEquals(thermState.getSetpointOrder().getSetpointTemp(), setpointTemp);
    } else {
      assertEquals(thermState.getSetpoint().getSetpointTemp(), setpointTemp);
    }

    // Rollback previous mode
    api.setthermpoint(
        relayId,
        thermostatId,
        setpoint.getSetpointMode(),
        setpoint.getSetpointEndtime(),
        setpoint.getSetpointTemp());
  }
  @Test
  public void testSchedule() {
    assumeNotNull(relayId);
    assumeNotNull(thermostatId);
    NAThermStateBody thermState = api.getthermstate(relayId, thermostatId).getBody();

    if (thermState.getThermProgram().getName().equals(TEST_PROGRAM_NAME)
        || (thermState.getThermProgramOrder() != null
            && thermState.getThermProgramOrder().getName().equals(TEST_PROGRAM_NAME))) {
      throw new RuntimeException(
          "The test program should not be the one in use at the beginning of the test !");
    }

    // Get program
    NAThermProgram program = thermState.getThermProgramOrder();
    if (program == null) {
      program = thermState.getThermProgram();
    }
    String previousProgramId = program.getProgramId();

    // Do we need to create a test program ?
    // Note : if you want to test the program creation, you need to delete the test program manually
    // on Netatmo'site since it cannot be done by API.
    NAThermProgram testProgram = getExitingTestProgram(thermState);
    if (testProgram == null) {
      testProgram = program;
      testProgram.setProgramId(null);
      testProgram.setName(TEST_PROGRAM_NAME);
      NANewScheduleResponse newscheduleResponse =
          api.createnewschedule(relayId, thermostatId, testProgram);
      assertEquals(newscheduleResponse.getStatus(), "ok");
      testProgram.setProgramId(newscheduleResponse.getBody().getScheduleId());
    }

    // Switch to test schedule
    NAOkResponse naOkResponse =
        api.switchschedule(relayId, thermostatId, testProgram.getProgramId());
    assertEquals(naOkResponse.getStatus(), "ok");

    // Modify schedule
    Float nightTempBefore = null;
    for (NAZone zone : testProgram.getZones()) {
      if (zone.getType() == 1) {
        nightTempBefore = zone.getTemp();
        zone.setTemp(nightTempBefore + Float.valueOf(0.5f));
        break;
      }
    }

    if (nightTempBefore == null) {
      throw new RuntimeException(
          "The current program doesn't have a night zone. This is unexpected by this test !");
    }
    naOkResponse = api.syncschedule(relayId, thermostatId, testProgram);
    assertEquals(naOkResponse.getStatus(), "ok");

    // Verify the change of temperature
    thermState = api.getthermstate(relayId, thermostatId).getBody();
    testProgram = thermState.getThermProgramOrder();
    if (testProgram == null) {
      testProgram = thermState.getThermProgram();
    }

    for (NAZone zone : testProgram.getZones()) {
      if (zone.getType() == 1) {
        assertEquals(nightTempBefore + Float.valueOf(0.5f), zone.getTemp(), 0.0001);
        zone.setTemp(nightTempBefore);
        break;
      }
    }

    // Rollback changes
    api.syncschedule(relayId, thermostatId, testProgram);
    api.switchschedule(relayId, thermostatId, previousProgramId);
  }