mirror of
https://github.com/danieldemus/openhab-addons
synced 2026-07-29 12:34:21 +02:00
[daikin] Implement code improvements (#20957)
* Implement code improvements Signed-off-by: Paul Smedley <paul@smedley.id.au>
This commit is contained in:
+1
-1
@@ -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,
|
||||
|
||||
-2
@@ -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();
|
||||
}
|
||||
|
||||
+1
-2
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
+3
@@ -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);
|
||||
|
||||
+3
-7
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
+9
-10
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
+4
-4
@@ -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
-16
@@ -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;
|
||||
}
|
||||
|
||||
+7
-9
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
+10
-10
@@ -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;
|
||||
|
||||
+2
-3
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
+13
-14
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
+3
-9
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
+9
-10
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
+6
-7
@@ -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) {
|
||||
|
||||
+2
-3
@@ -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);
|
||||
|
||||
|
||||
+2
-3
@@ -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);
|
||||
|
||||
|
||||
+4
-2
@@ -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;
|
||||
|
||||
+81
-72
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
+2
-3
@@ -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);
|
||||
}
|
||||
|
||||
|
||||
+39
-36
@@ -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;
|
||||
|
||||
+3
-2
@@ -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));
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user