[daikin] Implement code improvements (#20957)

* Implement code improvements

Signed-off-by: Paul Smedley <paul@smedley.id.au>
This commit is contained in:
Paul Smedley
2026-06-15 20:49:03 +02:00
committed by GitHub
parent 115cb9473e
commit 8b605fc8e1
22 changed files with 220 additions and 225 deletions
@@ -39,7 +39,7 @@ import org.osgi.service.component.annotations.Reference;
public class DaikinHandlerFactory extends BaseThingHandlerFactory {
private final DaikinDynamicStateDescriptionProvider stateDescriptionProvider;
private final @Nullable HttpClient httpClient;
private final HttpClient httpClient;
@Activate
public DaikinHandlerFactory(@Reference DaikinDynamicStateDescriptionProvider stateDescriptionProvider,
@@ -13,7 +13,6 @@
package org.openhab.binding.daikin.internal;
import org.eclipse.jdt.annotation.NonNullByDefault;
import org.eclipse.jdt.annotation.Nullable;
import org.eclipse.jetty.client.HttpClient;
/**
@@ -30,6 +29,5 @@ public interface DaikinHttpClientFactory {
*
* @return the shared Jetty http client
*/
@Nullable
HttpClient getHttpClient();
}
@@ -13,7 +13,6 @@
package org.openhab.binding.daikin.internal;
import org.eclipse.jdt.annotation.NonNullByDefault;
import org.eclipse.jdt.annotation.Nullable;
import org.eclipse.jetty.client.HttpClient;
import org.eclipse.jetty.util.ssl.SslContextFactory;
import org.openhab.core.io.net.http.HttpClientFactory;
@@ -67,7 +66,7 @@ public class DaikinHttpClientFactoryImpl implements DaikinHttpClientFactory {
}
@Override
public @Nullable HttpClient getHttpClient() {
public HttpClient getHttpClient() {
return httpClient;
}
}
@@ -265,6 +265,9 @@ public class DaikinWebTargets {
private String executeUrl(String url, @Nullable Map<String, String> params)
throws InterruptedException, TimeoutException, ExecutionException, DaikinCommunicationException {
if (httpClient == null) {
throw new DaikinCommunicationException("HttpClient is not initialized.");
}
Request request = httpClient.newRequest(url).method(HttpMethod.GET).timeout(TIMEOUT_MS, TimeUnit.MILLISECONDS);
if (uuid != null) {
request.header("X-Daikin-uuid", uuid);
@@ -12,7 +12,6 @@
*/
package org.openhab.binding.daikin.internal.api;
import java.util.HashMap;
import java.util.Map;
import org.eclipse.jdt.annotation.NonNullByDefault;
@@ -27,8 +26,6 @@ import org.slf4j.LoggerFactory;
*/
@NonNullByDefault
public class BasicInfo {
private static final Logger LOGGER = LoggerFactory.getLogger(BasicInfo.class);
public String mac = "";
public String ret = "";
public String ssid = "";
@@ -37,7 +34,8 @@ public class BasicInfo {
}
public static BasicInfo parse(String response) {
LOGGER.trace("Parsing string: \"{}\"", response);
Logger logger = LoggerFactory.getLogger(BasicInfo.class);
logger.trace("Parsing string: \"{}\"", response);
Map<String, String> responseMap = InfoParser.parse(response);
@@ -49,8 +47,6 @@ public class BasicInfo {
}
public Map<String, String> getParamString() {
Map<String, String> params = new HashMap<>();
params.put("ssid", ssid);
return params;
return Map.of("ssid", ssid);
}
}
@@ -18,6 +18,7 @@ import java.util.Objects;
import java.util.Optional;
import org.eclipse.jdt.annotation.NonNullByDefault;
import org.eclipse.jdt.annotation.Nullable;
import org.openhab.binding.daikin.internal.api.Enums.AdvancedMode;
import org.openhab.binding.daikin.internal.api.Enums.FanMovement;
import org.openhab.binding.daikin.internal.api.Enums.FanSpeed;
@@ -35,19 +36,17 @@ import org.slf4j.LoggerFactory;
*/
@NonNullByDefault
public class ControlInfo {
private static final Logger LOGGER = LoggerFactory.getLogger(ControlInfo.class);
public String ret = "";
public boolean power = false;
// Store the accepted auto mode for later use.
public int autoModeValue = Mode.AUTO.getValue();
public Mode mode = Mode.AUTO;
// Degrees in Celsius.
public Optional<Double> temp = Optional.empty();
public @Nullable Double temp;
public FanSpeed fanSpeed = FanSpeed.AUTO;
public FanMovement fanMovement = FanMovement.STOPPED;
// Not supported by all units. Sets the target humidity for dehumidifying.
public Optional<Integer> targetHumidity = Optional.empty();
public @Nullable Integer targetHumidity;
public AdvancedMode advancedMode = AdvancedMode.UNKNOWN;
public boolean separatedDirectionParams = false;
@@ -55,7 +54,8 @@ public class ControlInfo {
}
public static ControlInfo parse(String response) {
LOGGER.trace("Parsing string: \"{}\"", response);
Logger logger = LoggerFactory.getLogger(ControlInfo.class);
logger.trace("Parsing string: \"{}\"", response);
Map<String, String> responseMap = InfoParser.parse(response);
@@ -69,7 +69,7 @@ public class ControlInfo {
info.autoModeValue = info.mode.getValue();
info.mode = Mode.AUTO;
}
info.temp = Optional.ofNullable(responseMap.get("stemp")).flatMap(value -> InfoParser.parseDouble(value));
info.temp = Optional.ofNullable(responseMap.get("stemp")).flatMap(InfoParser::parseDouble).orElse(null);
info.fanSpeed = Objects.requireNonNull(Optional.ofNullable(responseMap.get("f_rate"))
.map(value -> FanSpeed.fromValue(value)).orElse(FanSpeed.AUTO));
// determine if device has combined direction (f_dir) or separated directions (f_dir_ud/f_dir_lr)
@@ -88,7 +88,7 @@ public class ControlInfo {
}
}
info.targetHumidity = Optional.ofNullable(responseMap.get("shum")).flatMap(value -> InfoParser.parseInt(value));
info.targetHumidity = Optional.ofNullable(responseMap.get("shum")).flatMap(InfoParser::parseInt).orElse(null);
info.advancedMode = Objects.requireNonNull(Optional.ofNullable(responseMap.get("adv"))
.map(value -> AdvancedMode.fromValue(value)).orElse(AdvancedMode.UNKNOWN));
@@ -110,9 +110,8 @@ public class ControlInfo {
} else {
params.put("f_dir", Integer.toString(fanMovement.getValue()));
}
params.put("stemp", temp.orElse(20.0).toString());
params.put("shum", Objects.requireNonNull(targetHumidity.map(value -> value.toString()).orElse("")));
params.put("stemp", temp != null ? temp.toString() : "20.0");
params.put("shum", targetHumidity != null ? targetHumidity.toString() : "");
return params;
}
@@ -13,6 +13,7 @@
package org.openhab.binding.daikin.internal.api;
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@@ -38,8 +39,6 @@ import com.google.gson.reflect.TypeToken;
*/
@NonNullByDefault
public class DemandControl {
private static final Logger LOGGER = LoggerFactory.getLogger(DemandControl.class);
private static final List<String> DAYS = List.of("monday", "tuesday", "wednesday", "thursday", "friday", "saturday",
"sunday");
// create a map of "monday" -> "mo", "tuesday" -> "tu", etc.
@@ -75,7 +74,7 @@ public class DemandControl {
}
public int getScheduledMaxPower() {
return getScheduledMaxPower(LocalDateTime.now());
return getScheduledMaxPower(LocalDateTime.now(ZoneId.systemDefault()));
}
// Returns the current max_power setting based on the schedule
@@ -120,7 +119,8 @@ public class DemandControl {
}
public static DemandControl parse(String response) {
LOGGER.trace("Parsing string: \"{}\"", response);
Logger logger = LoggerFactory.getLogger(DemandControl.class);
logger.trace("Parsing string: \"{}\"", response);
Map<String, String> responseMap = InfoParser.parse(response);
@@ -16,6 +16,7 @@ import java.util.Map;
import java.util.Optional;
import org.eclipse.jdt.annotation.NonNullByDefault;
import org.eclipse.jdt.annotation.Nullable;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -27,20 +28,19 @@ import org.slf4j.LoggerFactory;
*/
@NonNullByDefault
public class EnergyInfoDayAndWeek {
public Optional<Double> energyHeatingToday = Optional.empty();
public Optional<Double> energyHeatingThisWeek = Optional.empty();
public Optional<Double> energyHeatingLastWeek = Optional.empty();
public Optional<Double> energyCoolingToday = Optional.empty();
public Optional<Double> energyCoolingThisWeek = Optional.empty();
public Optional<Double> energyCoolingLastWeek = Optional.empty();
private static final Logger LOGGER = LoggerFactory.getLogger(EnergyInfoDayAndWeek.class);
public @Nullable Double energyHeatingToday;
public @Nullable Double energyHeatingThisWeek;
public @Nullable Double energyHeatingLastWeek;
public @Nullable Double energyCoolingToday;
public @Nullable Double energyCoolingThisWeek;
public @Nullable Double energyCoolingLastWeek;
private EnergyInfoDayAndWeek() {
}
public static EnergyInfoDayAndWeek parse(String response) {
LOGGER.trace("Parsing string: \"{}\"", response);
Logger logger = LoggerFactory.getLogger(EnergyInfoDayAndWeek.class);
logger.trace("Parsing string: \"{}\"", response);
// /aircon/get_week_power_ex
// ret=OK,s_dayw=0,week_heat=1/1/1/1/1/5/2/1/1/1/1/2/1/1,week_cool=0/0/0/0/0/0/0/0/0/0/0/0/0/0
@@ -57,7 +57,7 @@ public class EnergyInfoDayAndWeek {
// get the heating info
String[] heatingValues = responseMap.get("week_heat").split("/");
info.energyHeatingToday = Optional.of(Double.parseDouble(heatingValues[0]) / 10);
info.energyHeatingToday = Double.parseDouble(heatingValues[0]) / 10;
double thisWeekEnergy = 0;
for (int i = 0; i < thisWeekLastDayIndex; i += 1) {
thisWeekEnergy += Integer.parseInt(heatingValues[i]);
@@ -66,12 +66,12 @@ public class EnergyInfoDayAndWeek {
for (int i = thisWeekLastDayIndex; i < thisWeekLastDayIndex + 7; i += 1) {
previousWeekEnergy += Integer.parseInt(heatingValues[i]);
}
info.energyHeatingThisWeek = Optional.of(thisWeekEnergy / 10);
info.energyHeatingLastWeek = Optional.of(previousWeekEnergy / 10);
info.energyHeatingThisWeek = thisWeekEnergy / 10;
info.energyHeatingLastWeek = previousWeekEnergy / 10;
// get the cooling info
String[] coolingValues = responseMap.get("week_cool").split("/");
info.energyCoolingToday = Optional.of(Double.parseDouble(coolingValues[0]) / 10);
info.energyCoolingToday = Double.parseDouble(coolingValues[0]) / 10;
thisWeekEnergy = 0;
for (int i = 0; i < thisWeekLastDayIndex; i += 1) {
thisWeekEnergy += Integer.parseInt(coolingValues[i]);
@@ -80,11 +80,11 @@ public class EnergyInfoDayAndWeek {
for (int i = thisWeekLastDayIndex; i < thisWeekLastDayIndex + 7; i += 1) {
previousWeekEnergy += Integer.parseInt(coolingValues[i]);
}
info.energyCoolingThisWeek = Optional.of(thisWeekEnergy / 10);
info.energyCoolingLastWeek = Optional.of(previousWeekEnergy / 10);
info.energyCoolingThisWeek = thisWeekEnergy / 10;
info.energyCoolingLastWeek = previousWeekEnergy / 10;
}
} else {
LOGGER.debug("EnergyInfoDayAndWeek::parse() did not receive 'ret=OK' from adapter");
logger.debug("EnergyInfoDayAndWeek::parse() did not receive 'ret=OK' from adapter");
}
return info;
}
@@ -16,6 +16,7 @@ import java.util.Map;
import java.util.Optional;
import org.eclipse.jdt.annotation.NonNullByDefault;
import org.eclipse.jdt.annotation.Nullable;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -27,27 +28,24 @@ import org.slf4j.LoggerFactory;
*/
@NonNullByDefault
public class EnergyInfoYear {
private static final Logger LOGGER = LoggerFactory.getLogger(EnergyInfoYear.class);
public Optional<Integer[]> energyHeatingThisYear = Optional.empty();
public Optional<Integer[]> energyCoolingThisYear = Optional.empty();
public Integer @Nullable [] energyHeatingThisYear;
public Integer @Nullable [] energyCoolingThisYear;
private EnergyInfoYear() {
}
public static EnergyInfoYear parse(String response) {
LOGGER.trace("Parsing string: \"{}\"", response);
Logger logger = LoggerFactory.getLogger(EnergyInfoYear.class);
logger.trace("Parsing string: \"{}\"", response);
Map<String, String> responseMap = InfoParser.parse(response);
EnergyInfoYear info = new EnergyInfoYear();
info.energyHeatingThisYear = Optional.ofNullable(responseMap.get("curr_year_heat"))
.flatMap(value -> InfoParser.parseArrayOfInt(value, 12));
.flatMap(value -> InfoParser.parseArrayOfInt(value, 12)).orElse(null);
info.energyCoolingThisYear = Optional.ofNullable(responseMap.get("curr_year_cool"))
.flatMap(value -> InfoParser.parseArrayOfInt(value, 12));
.flatMap(value -> InfoParser.parseArrayOfInt(value, 12)).orElse(null);
return info;
}
}
@@ -35,7 +35,6 @@ public class Enums {
HEAT(4),
FAN(6);
private static final Logger LOGGER = LoggerFactory.getLogger(Mode.class);
private final int value;
Mode(int value) {
@@ -47,12 +46,13 @@ public class Enums {
}
public static Mode fromValue(int value) {
Logger logger = LoggerFactory.getLogger(Mode.class);
for (Mode m : Mode.values()) {
if (m.getValue() == value) {
return m;
}
}
LOGGER.debug("Unexpected Mode value of \"{}\"", value);
logger.debug("Unexpected Mode value of \"{}\"", value);
// Default to auto
return AUTO;
@@ -68,7 +68,6 @@ public class Enums {
LEVEL_4("6"),
LEVEL_5("7");
private static final Logger LOGGER = LoggerFactory.getLogger(FanSpeed.class);
private final String value;
FanSpeed(String value) {
@@ -80,12 +79,13 @@ public class Enums {
}
public static FanSpeed fromValue(String value) {
Logger logger = LoggerFactory.getLogger(FanSpeed.class);
for (FanSpeed m : FanSpeed.values()) {
if (m.getValue().equals(value)) {
return m;
}
}
LOGGER.debug("Unexpected FanSpeed value of \"{}\"", value);
logger.debug("Unexpected FanSpeed value of \"{}\"", value);
// Default to auto
return AUTO;
@@ -99,7 +99,6 @@ public class Enums {
HORIZONTAL(2),
VERTICAL_AND_HORIZONTAL(3);
private static final Logger LOGGER = LoggerFactory.getLogger(FanMovement.class);
private final int value;
FanMovement(int value) {
@@ -111,12 +110,13 @@ public class Enums {
}
public static FanMovement fromValue(int value) {
Logger logger = LoggerFactory.getLogger(FanMovement.class);
for (FanMovement m : FanMovement.values()) {
if (m.getValue() == value) {
return m;
}
}
LOGGER.debug("Unexpected FanMovement value of \"{}\"", value);
logger.debug("Unexpected FanMovement value of \"{}\"", value);
// Default to stopped
return STOPPED;
@@ -149,7 +149,6 @@ public class Enums {
OFF(""),
UNKNOWN("??");
private static final Logger LOGGER = LoggerFactory.getLogger(AdvancedMode.class);
private final String value;
AdvancedMode(String value) {
@@ -169,12 +168,13 @@ public class Enums {
}
public static AdvancedMode fromValue(String value) {
Logger logger = LoggerFactory.getLogger(AdvancedMode.class);
for (AdvancedMode m : AdvancedMode.values()) {
if (m.getValue().equals(value)) {
return m;
}
}
LOGGER.debug("Unexpected AdvancedMode value of \"{}\"", value);
logger.debug("Unexpected AdvancedMode value of \"{}\"", value);
// Default to UNKNOWN
return UNKNOWN;
@@ -216,7 +216,6 @@ public class Enums {
AUTO("2");
private final String value;
private static final Logger LOGGER = LoggerFactory.getLogger(DemandControlMode.class);
DemandControlMode(String value) {
this.value = value;
@@ -236,12 +235,13 @@ public class Enums {
}
public static DemandControlMode fromValue(String value) {
Logger logger = LoggerFactory.getLogger(DemandControlMode.class);
for (DemandControlMode m : DemandControlMode.values()) {
if (m.getValue().equals(value)) {
return m;
}
}
LOGGER.debug("Unexpected DemandControlMode value of \"{}\"", value);
logger.debug("Unexpected DemandControlMode value of \"{}\"", value);
// Default to off
return OFF;
@@ -33,8 +33,6 @@ import org.slf4j.LoggerFactory;
*/
@NonNullByDefault
public class InfoParser {
private static final Logger LOGGER = LoggerFactory.getLogger(InfoParser.class);
private InfoParser() {
}
@@ -89,10 +87,11 @@ public class InfoParser {
}
public static String urldecode(String value) {
Logger logger = LoggerFactory.getLogger(InfoParser.class);
try {
return URLDecoder.decode(value, StandardCharsets.UTF_8.toString());
} catch (UnsupportedEncodingException e) {
LOGGER.warn("Unsupported encoding error in '{}'", value, e);
logger.warn("Unsupported encoding error in '{}'", value, e);
return value;
}
}
@@ -16,6 +16,7 @@ import java.util.Map;
import java.util.Optional;
import org.eclipse.jdt.annotation.NonNullByDefault;
import org.eclipse.jdt.annotation.Nullable;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -27,30 +28,28 @@ import org.slf4j.LoggerFactory;
*/
@NonNullByDefault
public class SensorInfo {
private static final Logger LOGGER = LoggerFactory.getLogger(SensorInfo.class);
public Optional<Double> indoortemp = Optional.empty();
public Optional<Double> indoorhumidity = Optional.empty();
public Optional<Double> outdoortemp = Optional.empty();
public Optional<Double> compressorfrequency = Optional.empty();
public @Nullable Double indoortemp;
public @Nullable Double indoorhumidity;
public @Nullable Double outdoortemp;
public @Nullable Double compressorfrequency;
private SensorInfo() {
}
public static SensorInfo parse(String response) {
LOGGER.trace("Parsing string: \"{}\"", response);
Logger logger = LoggerFactory.getLogger(SensorInfo.class);
logger.trace("Parsing string: \"{}\"", response);
Map<String, String> responseMap = InfoParser.parse(response);
SensorInfo info = new SensorInfo();
info.indoortemp = Optional.ofNullable(responseMap.get("htemp")).flatMap(value -> InfoParser.parseDouble(value));
info.indoorhumidity = Optional.ofNullable(responseMap.get("hhum"))
.flatMap(value -> InfoParser.parseDouble(value));
info.outdoortemp = Optional.ofNullable(responseMap.get("otemp"))
.flatMap(value -> InfoParser.parseDouble(value));
info.compressorfrequency = Optional.ofNullable(responseMap.get("cmpfreq"))
.flatMap(value -> InfoParser.parseDouble(value));
info.indoortemp = Optional.ofNullable(responseMap.get("htemp")).flatMap(InfoParser::parseDouble).orElse(null);
info.indoorhumidity = Optional.ofNullable(responseMap.get("hhum")).flatMap(InfoParser::parseDouble)
.orElse(null);
info.outdoortemp = Optional.ofNullable(responseMap.get("otemp")).flatMap(InfoParser::parseDouble).orElse(null);
info.compressorfrequency = Optional.ofNullable(responseMap.get("cmpfreq")).flatMap(InfoParser::parseDouble)
.orElse(null);
return info;
}
}
@@ -12,7 +12,6 @@
*/
package org.openhab.binding.daikin.internal.api.airbase;
import java.util.HashMap;
import java.util.Map;
import org.eclipse.jdt.annotation.NonNullByDefault;
@@ -28,8 +27,6 @@ import org.slf4j.LoggerFactory;
*/
@NonNullByDefault
public class AirbaseBasicInfo {
private static final Logger LOGGER = LoggerFactory.getLogger(AirbaseBasicInfo.class);
public String mac = "";
public String ret = "";
public String ssid = "";
@@ -38,7 +35,8 @@ public class AirbaseBasicInfo {
}
public static AirbaseBasicInfo parse(String response) {
LOGGER.trace("Parsing string: \"{}\"", response);
Logger logger = LoggerFactory.getLogger(AirbaseBasicInfo.class);
logger.trace("Parsing string: \"{}\"", response);
Map<String, String> responseMap = InfoParser.parse(response);
@@ -50,10 +48,6 @@ public class AirbaseBasicInfo {
}
public Map<String, String> getParamString() {
Map<String, String> params = new HashMap<>();
if (!"".equals(ssid)) {
params.put("ssid", ssid);
}
return params;
return ssid.isEmpty() ? Map.of() : Map.of("ssid", ssid);
}
}
@@ -18,6 +18,7 @@ import java.util.Objects;
import java.util.Optional;
import org.eclipse.jdt.annotation.NonNullByDefault;
import org.eclipse.jdt.annotation.Nullable;
import org.openhab.binding.daikin.internal.api.InfoParser;
import org.openhab.binding.daikin.internal.api.airbase.AirbaseEnums.AirbaseFanMovement;
import org.openhab.binding.daikin.internal.api.airbase.AirbaseEnums.AirbaseFanSpeed;
@@ -34,23 +35,22 @@ import org.slf4j.LoggerFactory;
*/
@NonNullByDefault
public class AirbaseControlInfo {
private static final Logger LOGGER = LoggerFactory.getLogger(AirbaseControlInfo.class);
public String ret = "";
public boolean power = false;
public AirbaseMode mode = AirbaseMode.AUTO;
/** Degrees in Celsius. */
public Optional<Double> temp = Optional.empty();
public @Nullable Double temp;
public AirbaseFanSpeed fanSpeed = AirbaseFanSpeed.LEVEL_1;
public AirbaseFanMovement fanMovement = AirbaseFanMovement.STOPPED;
/* Not supported by all units. Sets the target humidity for dehumidifying. */
public Optional<Integer> targetHumidity = Optional.empty();
public @Nullable Integer targetHumidity;
private AirbaseControlInfo() {
}
public static AirbaseControlInfo parse(String response) {
LOGGER.trace("Parsing string: \"{}\"", response);
Logger logger = LoggerFactory.getLogger(AirbaseControlInfo.class);
logger.trace("Parsing string: \"{}\"", response);
Map<String, String> responseMap = InfoParser.parse(response);
@@ -60,7 +60,7 @@ public class AirbaseControlInfo {
info.mode = Objects.requireNonNull(
Optional.ofNullable(responseMap.get("mode")).flatMap(value -> InfoParser.parseInt(value))
.map(value -> AirbaseMode.fromValue(value)).orElse(AirbaseMode.AUTO));
info.temp = Optional.ofNullable(responseMap.get("stemp")).flatMap(value -> InfoParser.parseDouble(value));
info.temp = Optional.ofNullable(responseMap.get("stemp")).flatMap(InfoParser::parseDouble).orElse(null);
int fRate = Optional.ofNullable(responseMap.get("f_rate")).flatMap(value -> InfoParser.parseInt(value))
.orElse(1);
boolean fAuto = "1".equals(responseMap.getOrDefault("f_auto", "0"));
@@ -69,7 +69,7 @@ public class AirbaseControlInfo {
info.fanMovement = Objects.requireNonNull(
Optional.ofNullable(responseMap.get("f_dir")).flatMap(value -> InfoParser.parseInt(value))
.map(value -> AirbaseFanMovement.fromValue(value)).orElse(AirbaseFanMovement.STOPPED));
info.targetHumidity = Optional.ofNullable(responseMap.get("shum")).flatMap(value -> InfoParser.parseInt(value));
info.targetHumidity = Optional.ofNullable(responseMap.get("shum")).flatMap(InfoParser::parseInt).orElse(null);
return info;
}
@@ -81,9 +81,8 @@ public class AirbaseControlInfo {
params.put("f_auto", fanSpeed.getAuto() ? "1" : "0");
params.put("f_airside", fanSpeed.getAirside() ? "1" : "0");
params.put("f_dir", Integer.toString(fanMovement.getValue()));
params.put("stemp", temp.orElse(20.0).toString());
params.put("shum", Objects.requireNonNull(targetHumidity.map(value -> value.toString()).orElse("")));
params.put("stemp", temp != null ? temp.toString() : "20.0");
params.put("shum", targetHumidity != null ? targetHumidity.toString() : "");
return params;
}
}
@@ -32,7 +32,6 @@ public class AirbaseEnums {
DRY(7, "Dehumidifier"),
AUTO(3, "Auto");
private static final Logger LOGGER = LoggerFactory.getLogger(AirbaseMode.class);
private final int value;
private final String label;
@@ -50,12 +49,13 @@ public class AirbaseEnums {
}
public static AirbaseMode fromValue(int value) {
Logger logger = LoggerFactory.getLogger(AirbaseMode.class);
for (AirbaseMode m : AirbaseMode.values()) {
if (m.getValue() == value) {
return m;
}
}
LOGGER.debug("Unexpected Mode value of \"{}\"", value);
logger.debug("Unexpected Mode value of \"{}\"", value);
return AUTO;
}
}
@@ -75,7 +75,6 @@ public class AirbaseEnums {
AUTO_LEVEL_5(5, true, false),
AIRSIDE(1, false, true);
private static final Logger LOGGER = LoggerFactory.getLogger(AirbaseFanSpeed.class);
private final int level;
private final boolean auto;
private final boolean airside;
@@ -114,6 +113,7 @@ public class AirbaseEnums {
public static AirbaseFanSpeed fromValue(int rate, boolean auto, boolean airside) { // convert from f_rate,
// f_auto, f_airside
Logger logger = LoggerFactory.getLogger(AirbaseFanSpeed.class);
if (airside) {
return AIRSIDE;
}
@@ -125,7 +125,7 @@ public class AirbaseEnums {
return m;
}
}
LOGGER.debug("Unexpected FanSpeed value from rate={}, auto={}, airside={}", rate, auto ? 1 : 0,
logger.debug("Unexpected FanSpeed value from rate={}, auto={}, airside={}", rate, auto ? 1 : 0,
airside ? 1 : 0);
return LEVEL_1;
}
@@ -138,7 +138,6 @@ public class AirbaseEnums {
HORIZONTAL(2),
VERTICAL_AND_HORIZONTAL(3);
private static final Logger LOGGER = LoggerFactory.getLogger(AirbaseFanMovement.class);
private final int value;
AirbaseFanMovement(int value) {
@@ -150,12 +149,13 @@ public class AirbaseEnums {
}
public static AirbaseFanMovement fromValue(int value) {
Logger logger = LoggerFactory.getLogger(AirbaseFanMovement.class);
for (AirbaseFanMovement m : AirbaseFanMovement.values()) {
if (m.getValue() == value) {
return m;
}
}
LOGGER.debug("Unexpected FanMovement value of \"{}\"", value);
logger.debug("Unexpected FanMovement value of \"{}\"", value);
return STOPPED;
}
}
@@ -176,7 +176,6 @@ public class AirbaseEnums {
DRY("en_dry"),
FRATE_AUTO("en_frate_auto");
private static final Logger LOGGER = LoggerFactory.getLogger(AirbaseFeature.class);
private final String value;
AirbaseFeature(String value) {
@@ -30,8 +30,6 @@ import org.slf4j.LoggerFactory;
*/
@NonNullByDefault
public class AirbaseModelInfo {
private static final Logger LOGGER = LoggerFactory.getLogger(AirbaseModelInfo.class);
public String ret = "";
public int zonespresent;
public int commonzone;
@@ -43,7 +41,8 @@ public class AirbaseModelInfo {
}
public static AirbaseModelInfo parse(String response) {
LOGGER.trace("Parsing string: \"{}\"", response);
Logger logger = LoggerFactory.getLogger(AirbaseModelInfo.class);
logger.trace("Parsing string: \"{}\"", response);
Map<String, String> responseMap = InfoParser.parse(response);
@@ -31,8 +31,6 @@ import org.slf4j.LoggerFactory;
*/
@NonNullByDefault
public class AirbaseZoneInfo {
private static final Logger LOGGER = LoggerFactory.getLogger(AirbaseZoneInfo.class);
public String zonenames = "";
public boolean[] zone = new boolean[8];
@@ -40,7 +38,8 @@ public class AirbaseZoneInfo {
}
public static AirbaseZoneInfo parse(String response) {
LOGGER.trace("Parsing string: \"{}\"", response);
Logger logger = LoggerFactory.getLogger(AirbaseZoneInfo.class);
logger.trace("Parsing string: \"{}\"", response);
Map<String, String> responseMap = InfoParser.parse(response);
@@ -110,7 +110,9 @@ public class DaikinACUnitDiscoveryService extends AbstractDiscoveryService {
socket.send(packet);
// receivePacketAndDiscover will return false if no packet is received after 1 second
while (receivePacketAndDiscover(socket)) {
boolean keepReading = true;
while (keepReading) {
keepReading = receivePacketAndDiscover(socket);
}
} catch (Exception e) {
// Nothing to do here - the host couldn't be found, likely because it doesn't exist
@@ -136,7 +138,7 @@ public class DaikinACUnitDiscoveryService extends AbstractDiscoveryService {
String thingId = parsedData.getOrDefault("ssid", host.replace(".", "_"));
String mac = parsedData.getOrDefault("mac", "");
String uuid = mac.isEmpty() ? UUID.randomUUID().toString()
: UUID.nameUUIDFromBytes(mac.getBytes()).toString();
: UUID.nameUUIDFromBytes(mac.getBytes(StandardCharsets.UTF_8)).toString();
DaikinWebTargets webTargets = new DaikinWebTargets(httpClient, host, secure, null);
boolean found = false;
@@ -13,8 +13,6 @@
package org.openhab.binding.daikin.internal.handler;
import java.math.BigDecimal;
import java.util.Objects;
import java.util.Optional;
import java.util.stream.IntStream;
import org.eclipse.jdt.annotation.NonNullByDefault;
@@ -34,7 +32,6 @@ import org.openhab.binding.daikin.internal.api.Enums.HomekitMode;
import org.openhab.binding.daikin.internal.api.Enums.Mode;
import org.openhab.binding.daikin.internal.api.Enums.SpecialMode;
import org.openhab.binding.daikin.internal.api.SensorInfo;
import org.openhab.core.library.types.DecimalType;
import org.openhab.core.library.types.OnOffType;
import org.openhab.core.library.types.PercentType;
import org.openhab.core.library.types.QuantityType;
@@ -43,7 +40,6 @@ import org.openhab.core.library.unit.Units;
import org.openhab.core.thing.ChannelUID;
import org.openhab.core.thing.Thing;
import org.openhab.core.types.Command;
import org.openhab.core.types.State;
import org.openhab.core.types.UnDefType;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -63,13 +59,13 @@ import com.google.gson.JsonSyntaxException;
public class DaikinAcUnitHandler extends DaikinBaseHandler {
private final Logger logger = LoggerFactory.getLogger(DaikinAcUnitHandler.class);
private Optional<Integer> autoModeValue = Optional.empty();
private @Nullable Integer autoModeValue;
private boolean pollDemandControl = true;
private Optional<String> savedDemandControlSchedule = Optional.empty();
private Optional<Integer> savedDemandControlMaxPower = Optional.empty();
private @Nullable String savedDemandControlSchedule;
private @Nullable Integer savedDemandControlMaxPower;
public DaikinAcUnitHandler(Thing thing, DaikinDynamicStateDescriptionProvider stateDescriptionProvider,
@Nullable HttpClient httpClient) {
HttpClient httpClient) {
super(thing, stateDescriptionProvider, httpClient);
}
@@ -112,16 +108,16 @@ public class DaikinAcUnitHandler extends DaikinBaseHandler {
updateTemperatureChannel(DaikinBindingConstants.CHANNEL_OUTDOOR_TEMP, sensorInfo.outdoortemp);
if (sensorInfo.indoorhumidity.isPresent()) {
updateState(DaikinBindingConstants.CHANNEL_HUMIDITY,
new QuantityType<>(sensorInfo.indoorhumidity.get(), Units.PERCENT));
Double indoorHumidity = sensorInfo.indoorhumidity;
if (indoorHumidity != null) {
updateState(DaikinBindingConstants.CHANNEL_HUMIDITY, new QuantityType<>(indoorHumidity, Units.PERCENT));
} else {
updateState(DaikinBindingConstants.CHANNEL_HUMIDITY, UnDefType.UNDEF);
}
if (sensorInfo.compressorfrequency.isPresent()) {
updateState(DaikinBindingConstants.CHANNEL_CMP_FREQ,
new QuantityType<>(sensorInfo.compressorfrequency.get(), Units.PERCENT));
Double compressorFreq = sensorInfo.compressorfrequency;
if (compressorFreq != null) {
updateState(DaikinBindingConstants.CHANNEL_CMP_FREQ, new QuantityType<>(compressorFreq, Units.PERCENT));
} else {
updateState(DaikinBindingConstants.CHANNEL_CMP_FREQ, UnDefType.UNDEF);
}
@@ -129,11 +125,11 @@ public class DaikinAcUnitHandler extends DaikinBaseHandler {
try {
EnergyInfoYear energyInfoYear = webTargets.getEnergyInfoYear();
if (energyInfoYear.energyHeatingThisYear.isPresent()) {
if (energyInfoYear.energyHeatingThisYear != null) {
updateEnergyYearChannel(DaikinBindingConstants.CHANNEL_ENERGY_HEATING_CURRENTYEAR,
energyInfoYear.energyHeatingThisYear);
}
if (energyInfoYear.energyCoolingThisYear.isPresent()) {
if (energyInfoYear.energyCoolingThisYear != null) {
updateEnergyYearChannel(DaikinBindingConstants.CHANNEL_ENERGY_COOLING_CURRENTYEAR,
energyInfoYear.energyCoolingThisYear);
}
@@ -169,10 +165,10 @@ public class DaikinAcUnitHandler extends DaikinBaseHandler {
int maxPower = demandInfo.maxPower;
if (demandInfo.mode == DemandControlMode.SCHEDULED) {
savedDemandControlSchedule = Optional.of(schedule);
savedDemandControlSchedule = schedule;
maxPower = demandInfo.getScheduledMaxPower();
} else if (demandInfo.mode == DemandControlMode.MANUAL) {
savedDemandControlMaxPower = Optional.of(demandInfo.maxPower);
savedDemandControlMaxPower = demandInfo.maxPower;
}
updateState(DaikinBindingConstants.CHANNEL_AC_DEMAND_MODE, new StringType(demandInfo.mode.name()));
@@ -189,59 +185,65 @@ public class DaikinAcUnitHandler extends DaikinBaseHandler {
@Override
protected boolean handleCommandInternal(ChannelUID channelUID, Command command)
throws DaikinCommunicationException {
switch (channelUID.getId()) {
case DaikinBindingConstants.CHANNEL_AC_FAN_DIR:
return switch (channelUID.getId()) {
case DaikinBindingConstants.CHANNEL_AC_FAN_DIR -> {
if (command instanceof StringType stringCommand) {
if (changeFanDir(stringCommand.toString())) {
updateState(channelUID, stringCommand);
}
return true;
yield true;
}
break;
case DaikinBindingConstants.CHANNEL_AC_SPECIALMODE:
yield false;
}
case DaikinBindingConstants.CHANNEL_AC_SPECIALMODE -> {
if (command instanceof StringType stringCommand) {
if (changeSpecialMode(stringCommand.toString())) {
updateState(channelUID, stringCommand);
}
return true;
yield true;
}
break;
case DaikinBindingConstants.CHANNEL_AC_STREAMER:
yield false;
}
case DaikinBindingConstants.CHANNEL_AC_STREAMER -> {
if (command instanceof OnOffType onOffCommand) {
if (changeStreamer(onOffCommand.equals(OnOffType.ON))) {
if (changeStreamer(onOffCommand == OnOffType.ON)) {
updateState(channelUID, onOffCommand);
}
return true;
yield true;
}
break;
case DaikinBindingConstants.CHANNEL_AC_DEMAND_MODE:
yield false;
}
case DaikinBindingConstants.CHANNEL_AC_DEMAND_MODE -> {
if (command instanceof StringType stringCommand) {
changeDemandMode(stringCommand.toString());
return true;
yield true;
}
break;
case DaikinBindingConstants.CHANNEL_AC_DEMAND_MAX_POWER:
yield false;
}
case DaikinBindingConstants.CHANNEL_AC_DEMAND_MAX_POWER -> {
if (command instanceof PercentType percentCommand) {
if (changeDemandMaxPower(percentCommand.intValue())) {
updateState(DaikinBindingConstants.CHANNEL_AC_DEMAND_MODE,
new StringType(DemandControlMode.MANUAL.name()));
updateState(channelUID, percentCommand);
}
return true;
yield true;
}
break;
case DaikinBindingConstants.CHANNEL_AC_DEMAND_SCHEDULE:
yield false;
}
case DaikinBindingConstants.CHANNEL_AC_DEMAND_SCHEDULE -> {
if (command instanceof StringType stringCommand) {
if (changeDemandSchedule(stringCommand.toString())) {
updateState(DaikinBindingConstants.CHANNEL_AC_DEMAND_MODE,
new StringType(DemandControlMode.SCHEDULED.name()));
updateState(channelUID, stringCommand);
}
return true;
yield true;
}
break;
}
return false;
yield false;
}
default -> false;
};
}
@Override
@@ -254,7 +256,7 @@ public class DaikinAcUnitHandler extends DaikinBaseHandler {
@Override
protected boolean changeSetPoint(double newTemperature) throws DaikinCommunicationException {
ControlInfo info = webTargets.getControlInfo();
info.temp = Optional.of(newTemperature);
info.temp = newTemperature; // Removed Optional.of()
return webTargets.setControlInfo(info);
}
@@ -269,23 +271,22 @@ public class DaikinAcUnitHandler extends DaikinBaseHandler {
}
ControlInfo info = webTargets.getControlInfo();
info.mode = newMode;
if (autoModeValue.isPresent()) {
info.autoModeValue = autoModeValue.get();
if (autoModeValue != null) {
info.autoModeValue = autoModeValue;
}
boolean accepted = webTargets.setControlInfo(info);
// If mode=0 is not accepted try AUTO1 (mode=1)
if (!accepted && newMode == Mode.AUTO && autoModeValue.isEmpty()) {
if (!accepted && newMode == Mode.AUTO && autoModeValue == null) {
info.autoModeValue = Mode.AUTO1.getValue();
accepted = webTargets.setControlInfo(info);
if (accepted) {
autoModeValue = Optional.of(info.autoModeValue);
autoModeValue = info.autoModeValue;
logger.debug("AUTO uses mode={}", info.autoModeValue);
} else {
logger.warn("AUTO mode not accepted with mode=0 or mode=1");
}
}
return accepted;
}
@@ -342,29 +343,35 @@ public class DaikinAcUnitHandler extends DaikinBaseHandler {
DemandControl demandInfo = webTargets.getDemandControl();
boolean scheduleChanged = false;
boolean maxPowerChanged = false;
// 1. Assign fields to local variables to satisfy JDT compiler's null analysis
String scheduleToRestore = savedDemandControlSchedule;
Integer maxPowerToRestore = savedDemandControlMaxPower;
if (demandInfo.mode != newMode) {
if (newMode == DemandControlMode.SCHEDULED && savedDemandControlSchedule.isPresent()) {
if (newMode == DemandControlMode.SCHEDULED && scheduleToRestore != null) {
// restore previously saved schedule
demandInfo.setSchedule(savedDemandControlSchedule.get());
demandInfo.setSchedule(scheduleToRestore);
scheduleChanged = true;
}
if (newMode == DemandControlMode.MANUAL && savedDemandControlMaxPower.isPresent()) {
if (newMode == DemandControlMode.MANUAL && maxPowerToRestore != null) {
// restore previously saved maxPower
demandInfo.maxPower = savedDemandControlMaxPower.get();
demandInfo.maxPower = maxPowerToRestore;
maxPowerChanged = true;
}
}
demandInfo.mode = newMode;
if (webTargets.setDemandControl(demandInfo)) {
updateState(DaikinBindingConstants.CHANNEL_AC_DEMAND_MODE, new StringType(newMode.name()));
if (scheduleChanged) {
updateState(DaikinBindingConstants.CHANNEL_AC_DEMAND_SCHEDULE,
new StringType(savedDemandControlSchedule.get()));
// 2. Use the local variables for the StringType and PercentType constructors
if (scheduleChanged && scheduleToRestore != null) {
updateState(DaikinBindingConstants.CHANNEL_AC_DEMAND_SCHEDULE, new StringType(scheduleToRestore));
}
if (maxPowerChanged) {
updateState(DaikinBindingConstants.CHANNEL_AC_DEMAND_MAX_POWER,
new PercentType(savedDemandControlMaxPower.get()));
if (maxPowerChanged && maxPowerToRestore != null) {
updateState(DaikinBindingConstants.CHANNEL_AC_DEMAND_MAX_POWER, new PercentType(maxPowerToRestore));
}
}
}
@@ -373,7 +380,7 @@ public class DaikinAcUnitHandler extends DaikinBaseHandler {
DemandControl demandInfo = webTargets.getDemandControl();
demandInfo.mode = DemandControlMode.MANUAL;
demandInfo.maxPower = maxPower;
savedDemandControlMaxPower = Optional.of(maxPower);
savedDemandControlMaxPower = maxPower;
return webTargets.setDemandControl(demandInfo);
}
@@ -386,7 +393,7 @@ public class DaikinAcUnitHandler extends DaikinBaseHandler {
return false;
}
demandInfo.mode = DemandControlMode.SCHEDULED;
savedDemandControlSchedule = Optional.of(demandInfo.getSchedule());
savedDemandControlSchedule = demandInfo.getSchedule();
return webTargets.setDemandControl(demandInfo);
}
@@ -396,14 +403,17 @@ public class DaikinAcUnitHandler extends DaikinBaseHandler {
* @param channel
* @param maybePower
*/
protected void updateEnergyYearChannel(String channel, Optional<Integer[]> maybePower) {
IntStream.range(1, 13).forEach(i -> updateState(
String.format(DaikinBindingConstants.CHANNEL_ENERGY_STRING_FORMAT, channel, i),
Objects.requireNonNull(maybePower.<State> map(
t -> new QuantityType<>(BigDecimal.valueOf(t[i - 1].longValue(), 1), Units.KILOWATT_HOUR))
.orElse(UnDefType.UNDEF)))
);
protected void updateEnergyYearChannel(String channel, Integer @Nullable [] maybePower) {
if (maybePower != null) {
IntStream.range(1, 13).forEach(i -> updateState(
String.format(DaikinBindingConstants.CHANNEL_ENERGY_STRING_FORMAT, channel, i),
new QuantityType<>(BigDecimal.valueOf(maybePower[i - 1].longValue(), 1), Units.KILOWATT_HOUR)));
} else {
IntStream.range(1, 13)
.forEach(i -> updateState(
String.format(DaikinBindingConstants.CHANNEL_ENERGY_STRING_FORMAT, channel, i),
UnDefType.UNDEF));
}
}
/**
@@ -411,12 +421,11 @@ public class DaikinAcUnitHandler extends DaikinBaseHandler {
* @param channel
* @param maybePower
*/
protected void updateEnergyDayAndWeekChannel(String channel, Optional<Double> maybePower) {
if (maybePower.isPresent()) {
updateState(channel,
Objects.requireNonNull(
maybePower.<State> map(t -> new QuantityType<>(new DecimalType(t), Units.KILOWATT_HOUR))
.orElse(UnDefType.UNDEF)));
protected void updateEnergyDayAndWeekChannel(String channel, @Nullable Double maybePower) {
if (maybePower != null) {
updateState(channel, new QuantityType<>(maybePower, Units.KILOWATT_HOUR));
} else {
updateState(channel, UnDefType.UNDEF);
}
}
@@ -15,7 +15,6 @@ package org.openhab.binding.daikin.internal.handler;
import java.util.ArrayList;
import java.util.EnumSet;
import java.util.List;
import java.util.Optional;
import java.util.stream.IntStream;
import org.eclipse.jdt.annotation.NonNullByDefault;
@@ -55,7 +54,7 @@ public class DaikinAirbaseUnitHandler extends DaikinBaseHandler {
private @Nullable AirbaseModelInfo airbaseModelInfo;
public DaikinAirbaseUnitHandler(Thing thing, DaikinDynamicStateDescriptionProvider stateDescriptionProvider,
@Nullable HttpClient httpClient) {
HttpClient httpClient) {
super(thing, stateDescriptionProvider, httpClient);
}
@@ -121,7 +120,7 @@ public class DaikinAirbaseUnitHandler extends DaikinBaseHandler {
@Override
protected boolean changeSetPoint(double newTemperature) throws DaikinCommunicationException {
AirbaseControlInfo info = webTargets.getAirbaseControlInfo();
info.temp = Optional.of(newTemperature);
info.temp = newTemperature; // Removed Optional.of()
return webTargets.setAirbaseControlInfo(info);
}
@@ -12,8 +12,7 @@
*/
package org.openhab.binding.daikin.internal.handler;
import java.util.Objects;
import java.util.Optional;
import java.util.Locale;
import java.util.concurrent.ScheduledFuture;
import java.util.concurrent.TimeUnit;
@@ -57,7 +56,7 @@ import org.slf4j.LoggerFactory;
public abstract class DaikinBaseHandler extends BaseThingHandler {
private final Logger logger = LoggerFactory.getLogger(DaikinBaseHandler.class);
private final @Nullable HttpClient httpClient;
private final HttpClient httpClient;
private long refreshInterval;
@@ -85,7 +84,7 @@ public abstract class DaikinBaseHandler extends BaseThingHandler {
protected abstract void registerUuid(@Nullable String key);
public DaikinBaseHandler(Thing thing, DaikinDynamicStateDescriptionProvider stateDescriptionProvider,
@Nullable HttpClient httpClient) {
HttpClient httpClient) {
super(thing);
this.stateDescriptionProvider = stateDescriptionProvider;
this.httpClient = httpClient;
@@ -102,60 +101,60 @@ public abstract class DaikinBaseHandler extends BaseThingHandler {
return;
}
switch (channelUID.getId()) {
case DaikinBindingConstants.CHANNEL_AC_POWER:
case DaikinBindingConstants.CHANNEL_AC_POWER -> {
if (command instanceof OnOffType onOffCommand) {
if (changePower(onOffCommand.equals(OnOffType.ON))) {
if (changePower(onOffCommand == OnOffType.ON)) {
updateState(channelUID, onOffCommand);
}
return;
}
break;
case DaikinBindingConstants.CHANNEL_AC_TEMP:
double newTemperature;
State newState = UnDefType.UNDEF;
}
case DaikinBindingConstants.CHANNEL_AC_TEMP -> {
if (command instanceof DecimalType decimalCommand) {
newTemperature = decimalCommand.doubleValue();
newState = decimalCommand;
} else if (command instanceof QuantityType) {
QuantityType<Temperature> quantityCommand = (QuantityType<Temperature>) command;
newTemperature = quantityCommand.toUnit(SIUnits.CELSIUS).doubleValue();
newState = quantityCommand;
} else {
break; // Exit switch statement but proceed to log about unsupported command type
double newTemperature = Math.round(decimalCommand.doubleValue() * 2) / 2.0;
if (changeSetPoint(newTemperature)) {
updateState(channelUID, decimalCommand);
}
return;
} else if (command instanceof QuantityType<?> quantityCommand) {
double newTemperature = Math.round(
((QuantityType<Temperature>) quantityCommand).toUnit(SIUnits.CELSIUS).doubleValue() * 2)
/ 2.0;
if (changeSetPoint(newTemperature)) {
updateState(channelUID, (State) quantityCommand);
}
return;
}
// Only half degree increments are allowed, all others are silently rejected by the A/C units
newTemperature = Math.round(newTemperature * 2) / 2.0;
if (changeSetPoint(newTemperature)) {
updateState(channelUID, newState);
}
return; // return here and don't log about wrong type below
case DaikinBindingConstants.CHANNEL_AIRBASE_AC_FAN_SPEED:
case DaikinBindingConstants.CHANNEL_AC_FAN_SPEED:
// If neither, the block ends and drops to the wrong-type logger
}
case DaikinBindingConstants.CHANNEL_AIRBASE_AC_FAN_SPEED,
DaikinBindingConstants.CHANNEL_AC_FAN_SPEED -> {
if (command instanceof StringType stringCommand) {
if (changeFanSpeed(stringCommand.toString())) {
updateState(channelUID, stringCommand);
}
return;
}
break;
case DaikinBindingConstants.CHANNEL_AC_HOMEKITMODE:
}
case DaikinBindingConstants.CHANNEL_AC_HOMEKITMODE -> {
if (command instanceof StringType stringCommand) {
if (changeHomekitMode(stringCommand.toString())) {
updateState(DaikinBindingConstants.CHANNEL_AC_HOMEKITMODE, stringCommand);
}
return;
}
break;
case DaikinBindingConstants.CHANNEL_AC_MODE:
}
case DaikinBindingConstants.CHANNEL_AC_MODE -> {
if (command instanceof StringType stringCommand) {
if (changeMode(stringCommand.toString())) {
updateState(channelUID, stringCommand);
}
return;
}
break;
}
}
// If execution reaches this point, the command type did not match the expected type inside the switch
logger.debug("Received command ({}) of wrong type for thing '{}' on channel {}", command,
thing.getUID().getAsString(), channelUID.getId());
} catch (DaikinCommunicationException e) {
@@ -167,6 +166,7 @@ public abstract class DaikinBaseHandler extends BaseThingHandler {
public void initialize() {
logger.debug("Initializing Daikin AC Unit");
config = getConfigAs(DaikinConfiguration.class);
if (config.host == null) {
updateStatus(ThingStatus.OFFLINE, ThingStatusDetail.CONFIGURATION_ERROR, "Host address must be set");
} else {
@@ -228,14 +228,17 @@ public abstract class DaikinBaseHandler extends BaseThingHandler {
}
}
protected void updateTemperatureChannel(String channel, Optional<Double> maybeTemperature) {
updateState(channel, Objects.requireNonNull(
maybeTemperature.<State> map(t -> new QuantityType<>(t, SIUnits.CELSIUS)).orElse(UnDefType.UNDEF)));
protected void updateTemperatureChannel(String channel, @Nullable Double maybeTemperature) {
if (maybeTemperature != null) {
updateState(channel, new QuantityType<>(maybeTemperature, SIUnits.CELSIUS));
} else {
updateState(channel, UnDefType.UNDEF);
}
}
private boolean changeHomekitMode(String homekitmode) throws DaikinCommunicationException {
try {
HomekitMode mode = HomekitMode.valueOf(homekitmode.toUpperCase());
HomekitMode mode = HomekitMode.valueOf(homekitmode.toUpperCase(Locale.ROOT));
boolean power = mode != HomekitMode.OFF;
if (!changePower(power)) {
return false;
@@ -20,6 +20,7 @@ import static org.junit.jupiter.api.Assertions.assertEquals;
import java.time.DayOfWeek;
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.util.List;
import java.util.Map;
import java.util.stream.Stream;
@@ -380,8 +381,8 @@ public class DemandControlTest {
public void scheduledMaxPowerTest(String input, DayOfWeek dow, String time, int expectedMaxPower) {
DemandControl info = DemandControl.parse(input);
LocalDateTime dateTime = LocalDateTime.now().with(java.time.temporal.TemporalAdjusters.next(dow))
.with(java.time.LocalTime.parse(time));
LocalDateTime dateTime = LocalDateTime.now(ZoneId.systemDefault())
.with(java.time.temporal.TemporalAdjusters.next(dow)).with(java.time.LocalTime.parse(time));
assertEquals(expectedMaxPower, info.getScheduledMaxPower(dateTime));
}