import java.net.URLDecoder;
import java.net.URLEncoder;
import java.nio.charset.StandardCharsets;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
+import java.util.*;
import java.util.stream.Collectors;
import javax.net.ssl.HttpsURLConnection;
private void renderCapabilities(Connection connection, Device device, StringBuilder html) {
html.append("<h2>Capabilities</h2>");
html.append("<table><tr><th align='left'>Name</th></tr>");
- String[] capabilities = device.capabilities;
- if (capabilities != null) {
- for (String capability : capabilities) {
- html.append("<tr><td>");
- html.append(StringEscapeUtils.escapeHtml(capability));
- html.append("</td></tr>");
- }
- }
+ device.getCapabilities().forEach(capability -> html.append("<tr><td>")
+ .append(StringEscapeUtils.escapeHtml(capability)).append("</td></tr>"));
html.append("</table>");
}
private void renderMusicProviderIdChannel(Connection connection, StringBuilder html) {
- html.append("<h2>" + StringEscapeUtils.escapeHtml("Channel " + CHANNEL_MUSIC_PROVIDER_ID) + "</h2>");
+ html.append("<h2>").append(StringEscapeUtils.escapeHtml("Channel " + CHANNEL_MUSIC_PROVIDER_ID))
+ .append("</h2>");
html.append("<table><tr><th align='left'>Name</th><th align='left'>Value</th></tr>");
List<JsonMusicProvider> musicProviders = connection.getMusicProviders();
for (JsonMusicProvider musicProvider : musicProviders) {
}
private void renderPlayAlarmSoundChannel(Connection connection, Device device, StringBuilder html) {
- html.append("<h2>" + StringEscapeUtils.escapeHtml("Channel " + CHANNEL_PLAY_ALARM_SOUND) + "</h2>");
- JsonNotificationSound[] notificationSounds = null;
+ html.append("<h2>").append(StringEscapeUtils.escapeHtml("Channel " + CHANNEL_PLAY_ALARM_SOUND)).append("</h2>");
+ List<JsonNotificationSound> notificationSounds = List.of();
String errorMessage = "No notifications sounds found";
try {
notificationSounds = connection.getNotificationSounds(device);
| InterruptedException e) {
errorMessage = e.getLocalizedMessage();
}
- if (notificationSounds != null) {
+ if (!notificationSounds.isEmpty()) {
html.append("<table><tr><th align='left'>Name</th><th align='left'>Value</th></tr>");
for (JsonNotificationSound notificationSound : notificationSounds) {
if (notificationSound.folder == null && notificationSound.providerId != null
}
private void renderAmazonMusicPlaylistIdChannel(Connection connection, Device device, StringBuilder html) {
- html.append("<h2>" + StringEscapeUtils.escapeHtml("Channel " + CHANNEL_AMAZON_MUSIC_PLAY_LIST_ID) + "</h2>");
+ html.append("<h2>").append(StringEscapeUtils.escapeHtml("Channel " + CHANNEL_AMAZON_MUSIC_PLAY_LIST_ID))
+ .append("</h2>");
JsonPlaylists playLists = null;
String errorMessage = "No playlists found";
}
private void renderBluetoothMacChannel(Connection connection, Device device, StringBuilder html) {
- html.append("<h2>" + StringEscapeUtils.escapeHtml("Channel " + CHANNEL_BLUETOOTH_MAC) + "</h2>");
+ html.append("<h2>").append(StringEscapeUtils.escapeHtml("Channel " + CHANNEL_BLUETOOTH_MAC)).append("</h2>");
JsonBluetoothStates bluetoothStates = connection.getBluetoothConnectionStates();
if (bluetoothStates == null) {
return;
String stateDeviceSerialNumber = state.deviceSerialNumber;
if ((stateDeviceSerialNumber == null && device.serialNumber == null)
|| (stateDeviceSerialNumber != null && stateDeviceSerialNumber.equals(device.serialNumber))) {
- PairedDevice[] pairedDeviceList = state.pairedDeviceList;
- if (pairedDeviceList != null && pairedDeviceList.length > 0) {
+ List<PairedDevice> pairedDeviceList = state.getPairedDeviceList();
+ if (pairedDeviceList.size() > 0) {
html.append("<table><tr><th align='left'>Name</th><th align='left'>Value</th></tr>");
for (PairedDevice pairedDevice : pairedDeviceList) {
html.append("<tr><td>");
import static org.openhab.binding.amazonechocontrol.internal.AmazonEchoControlBindingConstants.*;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.List;
-import java.util.Locale;
-import java.util.Map;
+import java.util.*;
import org.eclipse.jdt.annotation.NonNullByDefault;
import org.eclipse.jdt.annotation.Nullable;
if (bluetoothState == null) {
return null;
}
- PairedDevice[] pairedDeviceList = bluetoothState.pairedDeviceList;
- if (pairedDeviceList == null) {
+ List<PairedDevice> pairedDeviceList = bluetoothState.getPairedDeviceList();
+ if (pairedDeviceList.isEmpty()) {
return null;
}
-
List<StateOption> options = new ArrayList<>();
options.add(new StateOption("", ""));
for (PairedDevice device : pairedDeviceList) {
- if (device == null) {
- continue;
- }
final String value = device.address;
if (value != null && device.friendlyName != null) {
options.add(new StateOption(value, device.friendlyName));
return null;
}
- JsonNotificationSound[] notificationSounds = handler.findAlarmSounds();
- if (notificationSounds == null) {
+ List<JsonNotificationSound> notificationSounds = handler.findAlarmSounds();
+ if (notificationSounds.isEmpty()) {
return null;
}
options.add(new StateOption("", ""));
for (JsonNotificationSound notificationSound : notificationSounds) {
- if (notificationSound != null && notificationSound.folder == null
- && notificationSound.providerId != null && notificationSound.id != null
- && notificationSound.displayName != null) {
+ if (notificationSound.folder == null && notificationSound.providerId != null
+ && notificationSound.id != null && notificationSound.displayName != null) {
String providerSoundId = notificationSound.providerId + ":" + notificationSound.id;
options.add(new StateOption(providerSoundId, notificationSound.displayName));
}
options.add(new StateOption("", ""));
for (Device device : devices) {
final String value = device.serialNumber;
- if (value != null && device.capabilities != null
- && Arrays.asList(device.capabilities).contains("FLASH_BRIEFING")) {
+ if (value != null && device.getCapabilities().contains("FLASH_BRIEFING")) {
options.add(new StateOption(value, device.accountName));
}
}
return null;
}
List<JsonMusicProvider> musicProviders = handler.findMusicProviders();
- if (musicProviders == null) {
+ if (musicProviders.isEmpty()) {
return null;
}
import org.openhab.binding.amazonechocontrol.internal.jsons.JsonAscendingAlarm.AscendingAlarmModel;
import org.openhab.binding.amazonechocontrol.internal.jsons.JsonAutomation;
import org.openhab.binding.amazonechocontrol.internal.jsons.JsonAutomation.Payload;
-import org.openhab.binding.amazonechocontrol.internal.jsons.JsonAutomation.Trigger;
import org.openhab.binding.amazonechocontrol.internal.jsons.JsonBluetoothStates;
import org.openhab.binding.amazonechocontrol.internal.jsons.JsonBootstrapResult;
import org.openhab.binding.amazonechocontrol.internal.jsons.JsonBootstrapResult.Authentication;
try {
String bootstrapResultJson = convertStream(connection);
JsonBootstrapResult result = parseJson(bootstrapResultJson, JsonBootstrapResult.class);
- if (result != null) {
- Authentication authentication = result.authentication;
- if (authentication != null && authentication.authenticated) {
- this.customerName = authentication.customerName;
- if (this.accountCustomerId == null) {
- this.accountCustomerId = authentication.customerId;
- }
- return authentication;
+ Authentication authentication = result.authentication;
+ if (authentication != null && authentication.authenticated) {
+ this.customerName = authentication.customerName;
+ if (this.accountCustomerId == null) {
+ this.accountCustomerId = authentication.customerId;
}
+ return authentication;
}
} catch (JsonSyntaxException | IllegalStateException e) {
logger.info("No valid json received", e);
webSiteCookies.add(new JsonWebSiteCookie(cookie.getName(), cookie.getValue()));
}
- JsonWebSiteCookie[] webSiteCookiesArray = new JsonWebSiteCookie[webSiteCookies.size()];
- webSiteCookiesArray = webSiteCookies.toArray(webSiteCookiesArray);
-
JsonRegisterAppRequest registerAppRequest = new JsonRegisterAppRequest(serial, accessToken, frc,
- webSiteCookiesArray);
+ webSiteCookies);
String registerAppRequestJson = gson.toJson(registerAppRequest);
HashMap<String, String> registerHeaders = new HashMap<>();
registerAppRequestJson, true, registerHeaders);
JsonRegisterAppResponse registerAppResponse = parseJson(registerAppResultJson, JsonRegisterAppResponse.class);
- if (registerAppResponse == null) {
- throw new ConnectionException("Error: No response received from register application");
- }
Response response = registerAppResponse.response;
if (response == null) {
throw new ConnectionException("Error: No response received from register application");
String usersMeResponseJson = makeRequestAndReturnString("GET",
"https://alexa.amazon.com/api/users/me?platform=ios&version=2.2.223830.0", null, false, null);
JsonUsersMeResponse usersMeResponse = parseJson(usersMeResponseJson, JsonUsersMeResponse.class);
- if (usersMeResponse == null) {
- throw new IllegalArgumentException("Received no response on me-request");
- }
URI uri = new URI(usersMeResponse.marketPlaceDomainName);
String host = uri.getHost();
}
}
+ @SuppressWarnings("null") // current value in compute can be null
private void replaceTimer(TimerType type, @Nullable ScheduledFuture<?> newTimer) {
timers.compute(type, (timerType, oldTimer) -> {
if (oldTimer != null) {
}
// parser
- private <T> @Nullable T parseJson(String json, Class<T> type) throws JsonSyntaxException, IllegalStateException {
+ private <T> T parseJson(String json, Class<T> type) throws JsonSyntaxException, IllegalStateException {
try {
- return gson.fromJson(json, type);
+ // gson.fromJson is always non-null if json is non-null
+ return Objects.requireNonNull(gson.fromJson(json, type));
} catch (JsonParseException | IllegalStateException e) {
logger.warn("Parsing json failed: {}", json, e);
throw e;
}
// commands and states
- public WakeWord[] getWakeWords() {
+ public List<WakeWord> getWakeWords() {
String json;
try {
json = makeRequestAndReturnString(alexaServer + "/api/wake-word?cached=true");
JsonWakeWords wakeWords = parseJson(json, JsonWakeWords.class);
- if (wakeWords != null) {
- WakeWord[] result = wakeWords.wakeWords;
- if (result != null) {
- return result;
- }
- }
+ return Objects.requireNonNullElse(wakeWords.wakeWords, List.of());
} catch (IOException | URISyntaxException | InterruptedException e) {
logger.info("getting wakewords failed", e);
}
- return new WakeWord[0];
+ return List.of();
}
public List<SmartHomeBaseDevice> getSmarthomeDeviceList()
logger.debug("getSmartHomeDevices result: {}", json);
JsonNetworkDetails networkDetails = parseJson(json, JsonNetworkDetails.class);
- if (networkDetails == null) {
- throw new IllegalArgumentException("received no response on network detail request");
- }
Object jsonObject = gson.fromJson(networkDetails.networkDetail, Object.class);
List<SmartHomeBaseDevice> result = new ArrayList<>();
searchSmartHomeDevicesRecursive(jsonObject, result);
// device node found, create type element and add it to the results
JsonElement element = gson.toJsonTree(jsonNode);
SmartHomeDevice shd = parseJson(element.toString(), SmartHomeDevice.class);
- if (shd != null) {
- devices.add(shd);
- }
+ devices.add(shd);
} else if (map.containsKey("applianceGroupName")) {
JsonElement element = gson.toJsonTree(jsonNode);
SmartHomeGroup shg = parseJson(element.toString(), SmartHomeGroup.class);
- if (shg != null) {
- devices.add(shg);
- }
+ devices.add(shg);
} else {
map.values().forEach(value -> searchSmartHomeDevicesRecursive(value, devices));
}
String applianceId = device.findId();
if (applianceId != null) {
JsonObject stateRequest;
- if (device instanceof SmartHomeDevice && !((SmartHomeDevice) device).mergedApplianceIds.isEmpty()) {
- for (String idToMerge : ((SmartHomeDevice) device).mergedApplianceIds) {
+ if (device instanceof SmartHomeDevice && ((SmartHomeDevice) device).mergedApplianceIds != null) {
+ List<String> mergedApplianceIds = Objects
+ .requireNonNullElse(((SmartHomeDevice) device).mergedApplianceIds, List.of());
+ for (String idToMerge : mergedApplianceIds) {
mergedApplianceMap.put(idToMerge, applianceId);
stateRequest = new JsonObject();
stateRequest.addProperty("entityId", idToMerge);
return mediaState;
}
- public Activity[] getActivities(int number, @Nullable Long startTime) {
- String json;
+ public List<Activity> getActivities(int number, @Nullable Long startTime) {
try {
- json = makeRequestAndReturnString(alexaServer + "/api/activities?startTime="
+ String json = makeRequestAndReturnString(alexaServer + "/api/activities?startTime="
+ (startTime != null ? startTime : "") + "&size=" + number + "&offset=1");
JsonActivities activities = parseJson(json, JsonActivities.class);
- if (activities != null) {
- Activity[] activiesArray = activities.activities;
- if (activiesArray != null) {
- return activiesArray;
- }
- }
+ return Objects.requireNonNullElse(activities.activities, List.of());
} catch (IOException | URISyntaxException | InterruptedException e) {
logger.info("getting activities failed", e);
}
- return new Activity[0];
+ return List.of();
}
public @Nullable JsonBluetoothStates getBluetoothConnectionStates() {
String resultBody = makeRequestAndReturnString("PUT", url, requestBody, true, null);
logger.trace("Request '{}' resulted in '{}", requestBody, resultBody);
JsonObject result = parseJson(resultBody, JsonObject.class);
- if (result != null) {
- JsonElement errors = result.get("errors");
- if (errors != null && errors.isJsonArray()) {
- JsonArray errorList = errors.getAsJsonArray();
- if (errorList.size() > 0) {
- logger.warn("Smart home device command failed. The request '{}' resulted in error(s): {}",
- requestBody, StreamSupport.stream(errorList.spliterator(), false)
- .map(JsonElement::toString).collect(Collectors.joining(" / ")));
- }
+ JsonElement errors = result.get("errors");
+ if (errors != null && errors.isJsonArray()) {
+ JsonArray errorList = errors.getAsJsonArray();
+ if (errorList.size() > 0) {
+ logger.warn("Smart home device command failed. The request '{}' resulted in error(s): {}",
+ requestBody, StreamSupport.stream(errorList.spliterator(), false).map(JsonElement::toString)
+ .collect(Collectors.joining(" / ")));
}
}
+
} catch (URISyntaxException e) {
logger.warn("URL '{}' has invalid format for request '{}': {}", url, requestBody, e.getMessage());
}
makeRequest("PUT", url, command, true, true, null, 0);
}
- public DeviceNotificationState[] getDeviceNotificationStates() {
- String json;
+ public List<DeviceNotificationState> getDeviceNotificationStates() {
try {
- json = makeRequestAndReturnString(alexaServer + "/api/device-notification-state");
+ String json = makeRequestAndReturnString(alexaServer + "/api/device-notification-state");
JsonDeviceNotificationState result = parseJson(json, JsonDeviceNotificationState.class);
- if (result != null) {
- DeviceNotificationState[] deviceNotificationStates = result.deviceNotificationStates;
- if (deviceNotificationStates != null) {
- return deviceNotificationStates;
- }
- }
+ return Objects.requireNonNullElse(result.deviceNotificationStates, List.of());
+
} catch (IOException | URISyntaxException | InterruptedException e) {
logger.info("Error getting device notification states", e);
}
- return new DeviceNotificationState[0];
+ return List.of();
}
- public AscendingAlarmModel[] getAscendingAlarm() {
+ public List<AscendingAlarmModel> getAscendingAlarm() {
String json;
try {
json = makeRequestAndReturnString(alexaServer + "/api/ascending-alarm");
JsonAscendingAlarm result = parseJson(json, JsonAscendingAlarm.class);
- if (result != null) {
- AscendingAlarmModel[] ascendingAlarmModelList = result.ascendingAlarmModelList;
- if (ascendingAlarmModelList != null) {
- return ascendingAlarmModelList;
- }
- }
+ return Objects.requireNonNullElse(result.ascendingAlarmModelList, List.of());
} catch (IOException | URISyntaxException | InterruptedException e) {
logger.info("Error getting device notification states", e);
}
- return new AscendingAlarmModel[0];
+ return List.of();
}
public void bluetooth(Device device, @Nullable String address)
logger.debug("added {} device {}", queueObject.hashCode(), serialNumbers);
}
+ @SuppressWarnings("null") // peek can return null
private void handleExecuteSequenceNode() {
Lock lock = Objects.requireNonNull(locks.computeIfAbsent(TimerType.DEVICES, k -> new ReentrantLock()));
if (lock.tryLock()) {
}
for (JsonAutomation routine : routines) {
if (routine != null) {
- Trigger[] triggers = routine.triggers;
- if (triggers != null && routine.sequence != null) {
+ if (routine.sequence != null) {
+ List<JsonAutomation.Trigger> triggers = Objects.requireNonNullElse(routine.triggers, List.of());
for (JsonAutomation.Trigger trigger : triggers) {
- if (trigger == null) {
- continue;
- }
Payload payload = trigger.payload;
if (payload == null) {
continue;
return result;
}
- public JsonFeed[] getEnabledFlashBriefings() throws IOException, URISyntaxException, InterruptedException {
+ public List<JsonFeed> getEnabledFlashBriefings() throws IOException, URISyntaxException, InterruptedException {
String json = makeRequestAndReturnString(alexaServer + "/api/content-skills/enabled-feeds");
JsonEnabledFeeds result = parseJson(json, JsonEnabledFeeds.class);
- if (result == null) {
- return new JsonFeed[0];
- }
- JsonFeed[] enabledFeeds = result.enabledFeeds;
- if (enabledFeeds != null) {
- return enabledFeeds;
- }
- return new JsonFeed[0];
+ return Objects.requireNonNullElse(result.enabledFeeds, List.of());
}
- public void setEnabledFlashBriefings(JsonFeed[] enabledFlashBriefing)
+ public void setEnabledFlashBriefings(List<JsonFeed> enabledFlashBriefing)
throws IOException, URISyntaxException, InterruptedException {
JsonEnabledFeeds enabled = new JsonEnabledFeeds();
enabled.enabledFeeds = enabledFlashBriefing;
makeRequest("POST", alexaServer + "/api/content-skills/enabled-feeds", json, true, true, null, 0);
}
- public JsonNotificationSound[] getNotificationSounds(Device device)
+ public List<JsonNotificationSound> getNotificationSounds(Device device)
throws IOException, URISyntaxException, InterruptedException {
String json = makeRequestAndReturnString(
alexaServer + "/api/notification/sounds?deviceSerialNumber=" + device.serialNumber + "&deviceType="
+ device.deviceType + "&softwareVersion=" + device.softwareVersion);
JsonNotificationSounds result = parseJson(json, JsonNotificationSounds.class);
- if (result == null) {
- return new JsonNotificationSound[0];
- }
- JsonNotificationSound[] notificationSounds = result.notificationSounds;
- if (notificationSounds != null) {
- return notificationSounds;
- }
- return new JsonNotificationSound[0];
+ return Objects.requireNonNullElse(result.notificationSounds, List.of());
}
- public JsonNotificationResponse[] notifications() throws IOException, URISyntaxException, InterruptedException {
+ public List<JsonNotificationResponse> notifications() throws IOException, URISyntaxException, InterruptedException {
String response = makeRequestAndReturnString(alexaServer + "/api/notifications");
JsonNotificationsResponse result = parseJson(response, JsonNotificationsResponse.class);
- if (result == null) {
- return new JsonNotificationResponse[0];
- }
- JsonNotificationResponse[] notifications = result.notifications;
- if (notifications == null) {
- return new JsonNotificationResponse[0];
- }
- return notifications;
+ return Objects.requireNonNullElse(result.notifications, List.of());
}
public @Nullable JsonNotificationResponse notification(Device device, String type, @Nullable String label,
String response = makeRequestAndReturnString("GET",
alexaServer + "/api/behaviors/entities?skillId=amzn1.ask.1p.music", null, true, headers);
if (!response.isEmpty()) {
- JsonMusicProvider[] result = parseJson(response, JsonMusicProvider[].class);
- return Arrays.asList(result);
+ JsonMusicProvider[] musicProviders = parseJson(response, JsonMusicProvider[].class);
+ return Arrays.asList(musicProviders);
}
} catch (IOException | URISyntaxException | InterruptedException e) {
logger.warn("getMusicProviders fails: {}", e.getMessage());
if (!validateResultJson.isEmpty()) {
JsonPlayValidationResult validationResult = parseJson(validateResultJson, JsonPlayValidationResult.class);
- if (validationResult != null) {
- JsonPlaySearchPhraseOperationPayload validatedOperationPayload = validationResult.operationPayload;
- if (validatedOperationPayload != null) {
- payload.sanitizedSearchPhrase = validatedOperationPayload.sanitizedSearchPhrase;
- payload.searchPhrase = validatedOperationPayload.searchPhrase;
- }
+ JsonPlaySearchPhraseOperationPayload validatedOperationPayload = validationResult.operationPayload;
+ if (validatedOperationPayload != null) {
+ payload.sanitizedSearchPhrase = validatedOperationPayload.sanitizedSearchPhrase;
+ payload.searchPhrase = validatedOperationPayload.searchPhrase;
}
}
IWebSocketCommandHandler webSocketCommandHandler) throws IOException {
this.webSocketCommandHandler = webSocketCommandHandler;
amazonEchoControlWebSocket = new AmazonEchoControlWebSocket();
-
- SslContextFactory sslContextFactory = new SslContextFactory();
- webSocketClient = new WebSocketClient(sslContextFactory);
+ webSocketClient = new WebSocketClient(new SslContextFactory.Client());
try {
String host;
if (amazonSite.equalsIgnoreCase("amazon.com")) {
import java.util.Set;
import java.util.concurrent.ScheduledFuture;
import java.util.concurrent.TimeUnit;
-import java.util.stream.Stream;
import org.eclipse.jdt.annotation.NonNullByDefault;
import org.eclipse.jdt.annotation.Nullable;
import org.openhab.binding.amazonechocontrol.internal.Connection;
import org.openhab.binding.amazonechocontrol.internal.handler.AccountHandler;
import org.openhab.binding.amazonechocontrol.internal.handler.SmartHomeDeviceHandler;
-import org.openhab.binding.amazonechocontrol.internal.jsons.JsonSmartHomeCapabilities;
import org.openhab.binding.amazonechocontrol.internal.jsons.JsonSmartHomeDeviceAlias;
import org.openhab.binding.amazonechocontrol.internal.jsons.JsonSmartHomeDevices.DriverIdentity;
import org.openhab.binding.amazonechocontrol.internal.jsons.JsonSmartHomeDevices.SmartHomeDevice;
continue;
}
- JsonSmartHomeCapabilities.SmartHomeCapability[] capabilities = shd.capabilities;
- if (capabilities == null || Stream.of(capabilities).noneMatch(capability -> capability != null
- && Constants.SUPPORTED_INTERFACES.contains(capability.interfaceName))) {
+ if (shd.getCapabilities().stream()
+ .noneMatch(capability -> Constants.SUPPORTED_INTERFACES.contains(capability.interfaceName))) {
// No supported interface found
continue;
}
thingUID = new ThingUID(THING_TYPE_SMART_HOME_DEVICE, bridgeThingUID, entityId.replace(".", "-"));
- JsonSmartHomeDeviceAlias[] aliases = shd.aliases;
+ List<JsonSmartHomeDeviceAlias> aliases = shd.aliases;
if ("Amazon".equals(shd.manufacturerName) && driverIdentity != null
&& "SonarCloudService".equals(driverIdentity.identifier)) {
deviceName = "Alexa Guard on " + shd.friendlyName;
} else if ("Amazon".equals(shd.manufacturerName) && driverIdentity != null
&& "OnGuardSmartHomeBridgeService".equals(driverIdentity.identifier)) {
deviceName = "Alexa Guard";
- } else if (aliases != null && aliases.length > 0 && aliases[0] != null
- && aliases[0].friendlyName != null) {
- deviceName = aliases[0].friendlyName;
+ } else if (aliases != null && !aliases.isEmpty() && aliases.get(0).friendlyName != null) {
+ deviceName = aliases.get(0).friendlyName;
} else {
deviceName = shd.friendlyName;
}
import java.net.URLEncoder;
import java.net.UnknownHostException;
import java.time.ZonedDateTime;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Map;
-import java.util.Objects;
-import java.util.Set;
+import java.util.*;
import java.util.concurrent.CopyOnWriteArraySet;
import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.ScheduledFuture;
import org.openhab.binding.amazonechocontrol.internal.channelhandler.ChannelHandler;
import org.openhab.binding.amazonechocontrol.internal.channelhandler.ChannelHandlerSendMessage;
import org.openhab.binding.amazonechocontrol.internal.channelhandler.IAmazonThingHandler;
-import org.openhab.binding.amazonechocontrol.internal.jsons.JsonActivities.Activity.SourceDeviceId;
import org.openhab.binding.amazonechocontrol.internal.jsons.JsonAscendingAlarm.AscendingAlarmModel;
import org.openhab.binding.amazonechocontrol.internal.jsons.JsonBluetoothStates;
import org.openhab.binding.amazonechocontrol.internal.jsons.JsonBluetoothStates.BluetoothState;
if (!currentConnection.getIsLoggedIn()) {
return;
}
- JsonNotificationResponse[] notifications;
+
ZonedDateTime timeStamp = ZonedDateTime.now();
try {
- notifications = currentConnection.notifications();
+ List<JsonNotificationResponse> notifications = currentConnection.notifications();
+ ZonedDateTime timeStampNow = ZonedDateTime.now();
+ echoHandlers.forEach(echoHandler -> echoHandler.updateNotifications(timeStamp, timeStampNow, pushPayload,
+ notifications));
} catch (IOException | URISyntaxException | InterruptedException e) {
logger.debug("refreshNotifications failed", e);
return;
}
- ZonedDateTime timeStampNow = ZonedDateTime.now();
-
- echoHandlers.forEach(
- echoHandler -> echoHandler.updateNotifications(timeStamp, timeStampNow, pushPayload, notifications));
}
private void refreshData() {
updateSmartHomeDeviceList(false);
updateFlashBriefingHandlers();
- DeviceNotificationState[] deviceNotificationStates = null;
- AscendingAlarmModel[] ascendingAlarmModels = null;
+ List<DeviceNotificationState> deviceNotificationStates = List.of();
+ List<AscendingAlarmModel> ascendingAlarmModels = List.of();
JsonBluetoothStates states = null;
List<JsonMusicProvider> musicProviders = null;
if (currentConnection.getIsLoggedIn()) {
for (EchoHandler child : echoHandlers) {
Device device = findDeviceJson(child.findSerialNumber());
- JsonNotificationSound[] notificationSounds = null;
+ List<JsonNotificationSound> notificationSounds = List.of();
JsonPlaylists playlists = null;
if (device != null && currentConnection.getIsLoggedIn()) {
// update notification sounds
if (device != null) {
final String serialNumber = device.serialNumber;
if (serialNumber != null) {
- if (ascendingAlarmModels != null) {
- ascendingAlarmModel = Arrays.stream(ascendingAlarmModels).filter(Objects::nonNull)
- .filter(current -> serialNumber.equals(current.deviceSerialNumber)).findFirst()
- .orElse(null);
- }
- if (deviceNotificationStates != null) {
- deviceNotificationState = Arrays.stream(deviceNotificationStates)
- .filter(Objects::nonNull)
- .filter(current -> serialNumber.equals(current.deviceSerialNumber)).findFirst()
- .orElse(null);
- }
+ ascendingAlarmModel = ascendingAlarmModels.stream()
+ .filter(current -> serialNumber.equals(current.deviceSerialNumber)).findFirst()
+ .orElse(null);
+ deviceNotificationState = deviceNotificationStates.stream()
+ .filter(current -> serialNumber.equals(current.deviceSerialNumber)).findFirst()
+ .orElse(null);
}
}
child.updateState(this, device, state, deviceNotificationState, ascendingAlarmModel, playlists,
.collect(Collectors.toMap(d -> Objects.requireNonNull(d.serialNumber), d -> d));
}
- WakeWord[] wakeWords = currentConnection.getWakeWords();
+ List<WakeWord> wakeWords = currentConnection.getWakeWords();
// update handlers
for (EchoHandler echoHandler : echoHandlers) {
String serialNumber = echoHandler.findSerialNumber();
- String deviceWakeWord = null;
- for (WakeWord wakeWord : wakeWords) {
- if (wakeWord != null) {
- if (serialNumber.equals(wakeWord.deviceSerialNumber)) {
- deviceWakeWord = wakeWord.wakeWord;
- break;
- }
- }
- }
+ String deviceWakeWord = wakeWords.stream()
+ .filter(wakeWord -> serialNumber.equals(wakeWord.deviceSerialNumber)).findFirst()
+ .map(wakeWord -> wakeWord.wakeWord).orElse(null);
echoHandler.setDeviceAndUpdateThingState(this, findDeviceJson(serialNumber), deviceWakeWord);
}
JsonFeed[] feeds = gson.fromJson(flashBriefingJson, JsonFeed[].class);
if (currentConnection != null && feeds != null) {
try {
- currentConnection.setEnabledFlashBriefings(feeds);
+ currentConnection.setEnabledFlashBriefings(Arrays.asList(feeds));
} catch (IOException | URISyntaxException | InterruptedException e) {
logger.warn("Set flashbriefing profile failed", e);
}
private void updateFlashBriefingProfiles(Connection currentConnection) {
try {
- JsonFeed[] feeds = currentConnection.getEnabledFlashBriefings();
// Make a copy and remove changeable parts
- JsonFeed[] forSerializer = new JsonFeed[feeds.length];
- for (int i = 0; i < feeds.length; i++) {
- JsonFeed source = feeds[i];
- JsonFeed copy = new JsonFeed();
- copy.feedId = source.feedId;
- copy.skillId = source.skillId;
- // Do not copy imageUrl here, because it will change
- forSerializer[i] = copy;
- }
+ JsonFeed[] forSerializer = currentConnection.getEnabledFlashBriefings().stream()
+ .map(source -> new JsonFeed(source.feedId, source.skillId)).toArray(JsonFeed[]::new);
this.currentFlashBriefingJson = gson.toJson(forSerializer);
} catch (HttpException | JsonSyntaxException | IOException | URISyntaxException | ConnectionException
| InterruptedException e) {
}
String search = key.registeredUserId + "#" + key.entryId;
- Arrays.stream(connection.getActivities(10, pushActivity.timestamp))
- .filter(activity -> activity != null && search.equals(activity.id)).findFirst()
- .ifPresent(currentActivity -> {
- SourceDeviceId[] sourceDeviceIds = currentActivity.sourceDeviceIds;
- if (sourceDeviceIds != null) {
- Arrays.stream(sourceDeviceIds).filter(Objects::nonNull)
- .map(sourceDeviceId -> findEchoHandlerBySerialNumber(sourceDeviceId.serialNumber))
- .filter(Objects::nonNull).forEach(echoHandler -> Objects.requireNonNull(echoHandler)
- .handlePushActivity(currentActivity));
- }
- });
+ connection.getActivities(10, pushActivity.timestamp).stream().filter(activity -> search.equals(activity.id))
+ .findFirst()
+ .ifPresent(currentActivity -> currentActivity.getSourceDeviceIds().stream()
+ .map(sourceDeviceId -> findEchoHandlerBySerialNumber(sourceDeviceId.serialNumber))
+ .filter(Objects::nonNull).forEach(echoHandler -> Objects.requireNonNull(echoHandler)
+ .handlePushActivity(currentActivity)));
}
void refreshAfterCommand() {
import java.util.*;
import java.util.concurrent.ScheduledFuture;
import java.util.concurrent.TimeUnit;
-import java.util.stream.Collectors;
-import java.util.stream.Stream;
import org.eclipse.jdt.annotation.NonNullByDefault;
import org.eclipse.jdt.annotation.Nullable;
private @Nullable Integer notificationVolumeLevel;
private @Nullable Boolean ascendingAlarm;
private @Nullable JsonPlaylists playLists;
- private @Nullable JsonNotificationSound @Nullable [] alarmSounds;
- private @Nullable List<JsonMusicProvider> musicProviders;
+ private List<JsonNotificationSound> alarmSounds = List.of();
+ private List<JsonMusicProvider> musicProviders = List.of();
private List<ChannelHandler> channelHandlers = new ArrayList<>();
private @Nullable JsonNotificationResponse currentNotification;
return false;
}
this.device = device;
- String[] capabilities = device.capabilities;
- if (capabilities != null) {
- this.capabilities = Stream.of(capabilities).filter(Objects::nonNull).collect(Collectors.toSet());
- }
+ this.capabilities = device.getCapabilities();
if (!device.online) {
updateStatus(ThingStatus.OFFLINE);
return false;
return this.playLists;
}
- public @Nullable JsonNotificationSound @Nullable [] findAlarmSounds() {
+ public List<JsonNotificationSound> findAlarmSounds() {
return this.alarmSounds;
}
- public @Nullable List<JsonMusicProvider> findMusicProviders() {
+ public List<JsonMusicProvider> findMusicProviders() {
return this.musicProviders;
}
String bluetoothId = lastKnownBluetoothMAC;
BluetoothState state = bluetoothState;
if (state != null && (bluetoothId == null || bluetoothId.isEmpty())) {
- PairedDevice[] pairedDeviceList = state.pairedDeviceList;
- if (pairedDeviceList != null) {
- for (PairedDevice paired : pairedDeviceList) {
- if (paired == null) {
- continue;
- }
- String pairedAddress = paired.address;
- if (pairedAddress != null && !pairedAddress.isEmpty()) {
- lastKnownBluetoothMAC = pairedAddress;
- break;
- }
+ for (PairedDevice paired : state.getPairedDeviceList()) {
+ String pairedAddress = paired.address;
+ if (pairedAddress != null && !pairedAddress.isEmpty()) {
+ lastKnownBluetoothMAC = pairedAddress;
+ break;
}
}
}
public void updateState(AccountHandler accountHandler, @Nullable Device device,
@Nullable BluetoothState bluetoothState, @Nullable DeviceNotificationState deviceNotificationState,
@Nullable AscendingAlarmModel ascendingAlarmModel, @Nullable JsonPlaylists playlists,
- @Nullable JsonNotificationSound @Nullable [] alarmSounds,
- @Nullable List<JsonMusicProvider> musicProviders) {
+ @Nullable List<JsonNotificationSound> alarmSounds, @Nullable List<JsonMusicProvider> musicProviders) {
try {
this.logger.debug("Handle updateState {}", this.getThing().getUID());
boolean bluetoothIsConnected = false;
if (bluetoothState != null) {
this.bluetoothState = bluetoothState;
- PairedDevice[] pairedDeviceList = bluetoothState.pairedDeviceList;
- if (pairedDeviceList != null) {
- for (PairedDevice paired : pairedDeviceList) {
- if (paired == null) {
- continue;
- }
- String pairedAddress = paired.address;
- if (paired.connected && pairedAddress != null) {
- bluetoothIsConnected = true;
- bluetoothMAC = pairedAddress;
- bluetoothDeviceName = paired.friendlyName;
- if (bluetoothDeviceName == null || bluetoothDeviceName.isEmpty()) {
- bluetoothDeviceName = pairedAddress;
- }
- break;
+ for (PairedDevice paired : bluetoothState.getPairedDeviceList()) {
+ String pairedAddress = paired.address;
+ if (paired.connected && pairedAddress != null) {
+ bluetoothIsConnected = true;
+ bluetoothMAC = pairedAddress;
+ bluetoothDeviceName = paired.friendlyName;
+ if (bluetoothDeviceName == null || bluetoothDeviceName.isEmpty()) {
+ bluetoothDeviceName = pairedAddress;
}
+ break;
}
}
+
}
if (!bluetoothMAC.isEmpty()) {
lastKnownBluetoothMAC = bluetoothMAC;
}
}
if (mediaState != null) {
- QueueEntry[] queueEntries = mediaState.queue;
- if (queueEntries != null && queueEntries.length > 0) {
- QueueEntry entry = queueEntries[0];
- if (entry != null) {
- if (isRadio) {
- if ((imageUrl == null || imageUrl.isEmpty()) && entry.imageURL != null) {
- imageUrl = entry.imageURL;
- }
- if ((subTitle1 == null || subTitle1.isEmpty()) && entry.radioStationSlogan != null) {
- subTitle1 = entry.radioStationSlogan;
- }
- if ((subTitle2 == null || subTitle2.isEmpty()) && entry.radioStationLocation != null) {
- subTitle2 = entry.radioStationLocation;
- }
+ List<QueueEntry> queueEntries = Objects.requireNonNullElse(mediaState.queue, List.of());
+ if (!queueEntries.isEmpty()) {
+ QueueEntry entry = queueEntries.get(0);
+ if (isRadio) {
+ if ((imageUrl == null || imageUrl.isEmpty()) && entry.imageURL != null) {
+ imageUrl = entry.imageURL;
+ }
+ if ((subTitle1 == null || subTitle1.isEmpty()) && entry.radioStationSlogan != null) {
+ subTitle1 = entry.radioStationSlogan;
+ }
+ if ((subTitle2 == null || subTitle2.isEmpty()) && entry.radioStationLocation != null) {
+ subTitle2 = entry.radioStationLocation;
}
}
+
}
}
}
public void updateNotifications(ZonedDateTime currentTime, ZonedDateTime now,
- @Nullable JsonCommandPayloadPushNotificationChange pushPayload, JsonNotificationResponse[] notifications) {
+ @Nullable JsonCommandPayloadPushNotificationChange pushPayload,
+ List<JsonNotificationResponse> notifications) {
Device device = this.device;
if (device == null) {
return;
import static org.openhab.binding.amazonechocontrol.internal.smarthome.Constants.SUPPORTED_INTERFACES;
import java.util.*;
-import java.util.function.Supplier;
+import java.util.function.Function;
import org.eclipse.jdt.annotation.NonNullByDefault;
import org.eclipse.jdt.annotation.Nullable;
if (handler != null) {
unusedHandlers.remove(interfaceName);
} else {
- Supplier<HandlerBase> creator = Constants.HANDLER_FACTORY.get(interfaceName);
+ Function<SmartHomeDeviceHandler, HandlerBase> creator = Constants.HANDLER_FACTORY.get(interfaceName);
if (creator != null) {
- handler = creator.get();
+ handler = creator.apply(this);
handlers.put(interfaceName, handler);
}
}
if (handler != null) {
- Collection<ChannelInfo> required = handler.initialize(this,
- capabilities.getOrDefault(interfaceName, Collections.emptyList()));
+ Collection<ChannelInfo> required = handler
+ .initialize(capabilities.getOrDefault(interfaceName, List.of()));
for (ChannelInfo channelInfo : required) {
unusedChannels.remove(channelInfo.channelId);
if (addChannelToDevice(thingBuilder, channelInfo.channelId, channelInfo.itemType,
if (entityId == null) {
continue;
}
- SmartHomeCapability[] capabilities = shd.capabilities;
- if (capabilities == null) {
- logger.debug("capabilities is null in {}", thing.getUID());
- return;
- }
accountHandler.forceDelayedSmartHomeStateUpdate(getId()); // block updates
- if (handlerBase.handleCommand(connection, shd, entityId, capabilities, channelUID.getId(),
+ if (handlerBase.handleCommand(connection, shd, entityId, shd.getCapabilities(), channelUID.getId(),
command)) {
accountHandler.forceDelayedSmartHomeStateUpdate(getId()); // force update again to restart
// update timer
SmartHomeBaseDevice device) {
if (device instanceof SmartHomeDevice) {
SmartHomeDevice shd = (SmartHomeDevice) device;
- SmartHomeCapability[] capabilities = shd.capabilities;
- if (capabilities == null) {
- return;
- }
- for (SmartHomeCapability capability : capabilities) {
+ for (SmartHomeCapability capability : shd.getCapabilities()) {
String interfaceName = capability.interfaceName;
if (interfaceName != null) {
Objects.requireNonNull(result.computeIfAbsent(interfaceName, name -> new ArrayList<>()))
Set<SmartHomeDevice> result = new HashSet<>();
if (baseDevice instanceof SmartHomeDevice) {
SmartHomeDevice shd = (SmartHomeDevice) baseDevice;
- SmartHomeCapability[] capabilities = shd.capabilities;
- if (capabilities != null) {
- if (Arrays.stream(capabilities).map(capability -> capability.interfaceName)
- .anyMatch(SUPPORTED_INTERFACES::contains)) {
- result.add(shd);
- }
+ if (shd.getCapabilities().stream().map(capability -> capability.interfaceName)
+ .anyMatch(SUPPORTED_INTERFACES::contains)) {
+ result.add(shd);
+
}
} else {
SmartHomeGroup shg = (SmartHomeGroup) baseDevice;
if (tags != null) {
JsonSmartHomeGroupIdentity.SmartHomeGroupIdentity tagNameToValueSetMap = tags.tagNameToValueSetMap;
JsonSmartHomeGroupIdentifiers.SmartHomeGroupIdentifier applianceGroupIdentifier = shg.applianceGroupIdentifier;
- if (tagNameToValueSetMap != null && tagNameToValueSetMap.groupIdentity != null
- && applianceGroupIdentifier != null && applianceGroupIdentifier.value != null
- && Arrays.asList(tagNameToValueSetMap.groupIdentity)
- .contains(applianceGroupIdentifier.value)) {
- SmartHomeCapability[] capabilities = shd.capabilities;
- if (capabilities != null) {
- if (Arrays.stream(capabilities).map(capability -> capability.interfaceName)
+ if (tagNameToValueSetMap != null) {
+ List<String> groupIdentity = Objects.requireNonNullElse(tagNameToValueSetMap.groupIdentity,
+ List.of());
+ if (applianceGroupIdentifier != null && applianceGroupIdentifier.value != null
+ && groupIdentity.contains(applianceGroupIdentifier.value)) {
+ if (shd.getCapabilities().stream().map(capability -> capability.interfaceName)
.anyMatch(SUPPORTED_INTERFACES::contains)) {
result.add(shd);
}
*/
package org.openhab.binding.amazonechocontrol.internal.jsons;
+import java.util.List;
+import java.util.Objects;
+
import org.eclipse.jdt.annotation.NonNullByDefault;
import org.eclipse.jdt.annotation.Nullable;
@NonNullByDefault
public class JsonActivities {
- public @Nullable Activity @Nullable [] activities;
+ public @Nullable List<Activity> activities;
public static class Activity {
public @Nullable String activityStatus;
public @Nullable String providerInfoDescription;
public @Nullable String registeredCustomerId;
public @Nullable Object sourceActiveUsers;
- public @Nullable SourceDeviceId @Nullable [] sourceDeviceIds;
+ public @Nullable List<SourceDeviceId> sourceDeviceIds;
public @Nullable String utteranceId;
public @Nullable Long version;
+ public List<SourceDeviceId> getSourceDeviceIds() {
+ return Objects.requireNonNullElse(sourceDeviceIds, List.of());
+ }
+
public static class SourceDeviceId {
public @Nullable String deviceAccountId;
public @Nullable String deviceType;
}
public static class Description {
-
public @Nullable String summary;
public @Nullable String firstUtteranceId;
public @Nullable String firstStreamId;
*/
package org.openhab.binding.amazonechocontrol.internal.jsons;
+import java.util.List;
+
import org.eclipse.jdt.annotation.NonNullByDefault;
import org.eclipse.jdt.annotation.Nullable;
@NonNullByDefault
public class JsonAscendingAlarm {
- public @Nullable AscendingAlarmModel @Nullable [] ascendingAlarmModelList;
+ public @Nullable List<AscendingAlarmModel> ascendingAlarmModelList;
public static class AscendingAlarmModel {
public @Nullable Boolean ascendingAlarmEnabled;
*/
package org.openhab.binding.amazonechocontrol.internal.jsons;
+import java.util.List;
import java.util.TreeMap;
import org.eclipse.jdt.annotation.NonNullByDefault;
public class JsonAutomation {
public @Nullable String automationId;
public @Nullable String name;
- public @Nullable Trigger @Nullable [] triggers;
+ public @Nullable List<Trigger> triggers;
public @Nullable TreeMap<String, Object> sequence;
public @Nullable String status;
public long creationTimeEpochMillis;
*/
package org.openhab.binding.amazonechocontrol.internal.jsons;
+import java.util.List;
import java.util.Objects;
import org.eclipse.jdt.annotation.NonNullByDefault;
public boolean connected;
public @Nullable String deviceClass;
public @Nullable String friendlyName;
- public @Nullable String @Nullable [] profiles;
+ public @Nullable List<String> profiles;
}
public static class BluetoothState {
public @Nullable String friendlyName;
public boolean gadgetPaired;
public boolean online;
- public @Nullable PairedDevice @Nullable [] pairedDeviceList;
+ public @Nullable List<PairedDevice> pairedDeviceList;
+
+ public List<PairedDevice> getPairedDeviceList() {
+ return Objects.requireNonNullElse(pairedDeviceList, List.of());
+ }
}
}
*/
package org.openhab.binding.amazonechocontrol.internal.jsons;
+import java.util.List;
+
import org.eclipse.jdt.annotation.NonNullByDefault;
import org.eclipse.jdt.annotation.Nullable;
@NonNullByDefault
public class JsonDeviceNotificationState {
- public @Nullable DeviceNotificationState @Nullable [] deviceNotificationStates;
+ public @Nullable List<DeviceNotificationState> deviceNotificationStates;
public static class DeviceNotificationState {
public @Nullable String deviceSerialNumber;
*/
package org.openhab.binding.amazonechocontrol.internal.jsons;
-import java.util.Arrays;
import java.util.List;
+import java.util.Objects;
+import java.util.Set;
import org.eclipse.jdt.annotation.NonNullByDefault;
import org.eclipse.jdt.annotation.Nullable;
public @Nullable String deviceType;
public @Nullable String softwareVersion;
public boolean online;
- public @Nullable String @Nullable [] capabilities;
+ public @Nullable Set<String> capabilities;
+
+ public Set<String> getCapabilities() {
+ return Objects.requireNonNullElse(capabilities, Set.of());
+ }
@Override
public String toString() {
+ ", deviceOwnerCustomerId='" + deviceOwnerCustomerId + '\'' + ", deviceAccountId='"
+ deviceAccountId + '\'' + ", deviceFamily='" + deviceFamily + '\'' + ", deviceType='" + deviceType
+ '\'' + ", softwareVersion='" + softwareVersion + '\'' + ", online=" + online + ", capabilities="
- + Arrays.toString(capabilities) + '}';
+ + capabilities + '}';
}
}
*/
package org.openhab.binding.amazonechocontrol.internal.jsons;
+import java.util.List;
+
import org.eclipse.jdt.annotation.NonNullByDefault;
import org.eclipse.jdt.annotation.Nullable;
*/
@NonNullByDefault
public class JsonEnabledFeeds {
- public @Nullable JsonFeed @Nullable [] enabledFeeds;
+ public @Nullable List<JsonFeed> enabledFeeds;
}
import org.eclipse.jdt.annotation.Nullable;
/**
- * The {@link JsonActivity} encapsulate the GSON data of the get equalizer command
+ * The {@link JsonEqualizer} encapsulate the GSON data of the get equalizer command
*
* @author Michael Geramb - Initial contribution
*/
public @Nullable String name;
public @Nullable String skillId;
public @Nullable String imageUrl;
+
+ public JsonFeed(@Nullable Object feedId, @Nullable String skillId) {
+ this.feedId = feedId;
+ this.skillId = skillId;
+ }
}
*/
package org.openhab.binding.amazonechocontrol.internal.jsons;
+import java.util.List;
+
import org.eclipse.jdt.annotation.NonNullByDefault;
import org.eclipse.jdt.annotation.Nullable;
public @Nullable String programId;
public int progressSeconds;
public @Nullable String providerId;
- public @Nullable QueueEntry @Nullable [] queue;
+ public @Nullable List<QueueEntry> queue;
public @Nullable String queueId;
public @Nullable Integer queueSize;
public @Nullable String radioStationId;
public int volume;
public static class QueueEntry {
-
public @Nullable String album;
public @Nullable String albumAsin;
public @Nullable String artist;
@NonNullByDefault
public class JsonMusicProvider {
public @Nullable String displayName;
- public @Nullable List<Object> @Nullable [] supportedTriggers;
+ public List<Object> @Nullable [] supportedTriggers;
public @Nullable String icon;
public @Nullable List<String> supportedProperties;
public @Nullable String id;
*/
package org.openhab.binding.amazonechocontrol.internal.jsons;
+import java.util.List;
+
import org.eclipse.jdt.annotation.NonNullByDefault;
import org.eclipse.jdt.annotation.Nullable;
*/
@NonNullByDefault
public class JsonNotificationSounds {
- public @Nullable JsonNotificationSound @Nullable [] notificationSounds;
+ public @Nullable List<JsonNotificationSound> notificationSounds;
}
*/
package org.openhab.binding.amazonechocontrol.internal.jsons;
+import java.util.List;
+
import org.eclipse.jdt.annotation.NonNullByDefault;
import org.eclipse.jdt.annotation.Nullable;
*/
@NonNullByDefault
public class JsonNotificationsResponse {
- public JsonNotificationResponse @Nullable [] notifications;
+ public @Nullable List<JsonNotificationResponse> notifications;
}
*/
package org.openhab.binding.amazonechocontrol.internal.jsons;
+import java.util.List;
+
import org.eclipse.jdt.annotation.NonNullByDefault;
import org.eclipse.jdt.annotation.Nullable;
public class JsonRegisterAppRequest {
public JsonRegisterAppRequest(String serial, @Nullable String accessToken, String frc,
- JsonWebSiteCookie[] webSiteCookies) {
+ List<JsonWebSiteCookie> webSiteCookies) {
registrationData.deviceSerial = serial;
authData.accessToken = accessToken;
userContextMap.frc = frc;
public static class Cookies {
@SerializedName("website_cookies")
- public @Nullable JsonWebSiteCookie @Nullable [] webSiteCookies;
+ public List<JsonWebSiteCookie> webSiteCookies = List.of();
public @Nullable String domain = ".amazon.com";
}
*/
package org.openhab.binding.amazonechocontrol.internal.jsons;
+import java.util.List;
+
import org.eclipse.jdt.annotation.NonNullByDefault;
import org.eclipse.jdt.annotation.Nullable;
}
public static class Properties {
- public @Nullable Property @Nullable [] supported;
+ public @Nullable List<Property> supported;
}
public static class Property {
public @Nullable String name;
}
- public @Nullable SmartHomeCapability @Nullable [] capabilites;
+ public @Nullable List<SmartHomeCapability> capabilites;
}
*/
package org.openhab.binding.amazonechocontrol.internal.jsons;
-import java.util.Arrays;
import java.util.List;
+import java.util.Objects;
import org.eclipse.jdt.annotation.NonNullByDefault;
import org.eclipse.jdt.annotation.Nullable;
public class JsonSmartHomeDevices {
public static class SmartHomeDevice implements SmartHomeBaseDevice {
public @Nullable Integer updateIntervalInSeconds;
-
- @Override
- public @Nullable String findId() {
- return applianceId;
- }
-
- @Override
- public boolean isGroup() {
- return false;
- }
-
public @Nullable String applianceId;
public @Nullable String manufacturerName;
public @Nullable String friendlyDescription;
public @Nullable String reachability;
public @Nullable String entityId;
public @Nullable SmartHomeDeviceNetworkState applianceNetworkState;
- public @Nullable SmartHomeCapability @Nullable [] capabilities;
+ public @Nullable List<SmartHomeCapability> capabilities;
public @Nullable JsonSmartHomeTag tags;
- public @Nullable String @Nullable [] applianceTypes;
- public @Nullable JsonSmartHomeDeviceAlias @Nullable [] aliases;
- public @Nullable SmartHomeDevice @Nullable [] groupDevices;
+ public @Nullable List<String> applianceTypes;
+ public @Nullable List<JsonSmartHomeDeviceAlias> aliases;
+ public @Nullable List<SmartHomeDevice> groupDevices;
public @Nullable String connectedVia;
public @Nullable DriverIdentity driverIdentity;
- public List<String> mergedApplianceIds = List.of();
+ public @Nullable List<String> mergedApplianceIds;
+ public @Nullable List<SmartHomeDevice> smarthomeDevices;
+
+ public List<SmartHomeCapability> getCapabilities() {
+ return Objects.requireNonNullElse(capabilities, List.of());
+ }
+
+ @Override
+ public @Nullable String findId() {
+ return applianceId;
+ }
+
+ @Override
+ public boolean isGroup() {
+ return false;
+ }
@Override
public String toString() {
+ applianceId + '\'' + ", manufacturerName='" + manufacturerName + '\'' + ", friendlyDescription='"
+ friendlyDescription + '\'' + ", modelName='" + modelName + '\'' + ", friendlyName='"
+ friendlyName + '\'' + ", reachability='" + reachability + '\'' + ", entityId='" + entityId + '\''
- + ", applianceNetworkState=" + applianceNetworkState + ", capabilities="
- + Arrays.toString(capabilities) + ", tags=" + tags + ", applianceTypes="
- + Arrays.toString(applianceTypes) + ", aliases=" + Arrays.toString(aliases) + ", groupDevices="
- + Arrays.toString(groupDevices) + ", connectedVia='" + connectedVia + '\'' + ", driverIdentity="
- + driverIdentity + ", mergedApplianceIds=" + mergedApplianceIds + '}';
+ + ", applianceNetworkState=" + applianceNetworkState + ", capabilities=" + capabilities + ", tags="
+ + tags + ", applianceTypes=" + applianceTypes + ", aliases=" + aliases + ", groupDevices="
+ + groupDevices + ", connectedVia='" + connectedVia + '\'' + ", driverIdentity=" + driverIdentity
+ + ", mergedApplianceIds=" + mergedApplianceIds + ", smarthomeDevices=" + smarthomeDevices + '}';
}
}
return "DriverIdentity{" + "namespace='" + namespace + '\'' + ", identifier='" + identifier + '\'' + '}';
}
}
-
- public @Nullable SmartHomeDevice @Nullable [] smarthomeDevices;
}
*/
package org.openhab.binding.amazonechocontrol.internal.jsons;
+import java.util.List;
+
import org.eclipse.jdt.annotation.NonNullByDefault;
import org.eclipse.jdt.annotation.Nullable;
@NonNullByDefault
public class JsonSmartHomeGroupIdentity {
public static class SmartHomeGroupIdentity {
- public @Nullable String @Nullable [] groupIdentity;
+ public @Nullable List<String> groupIdentity;
}
- public @Nullable SmartHomeGroupIdentity @Nullable [] groupIdentity;
+ public @Nullable List<SmartHomeGroupIdentity> groupIdentity;
}
*/
package org.openhab.binding.amazonechocontrol.internal.jsons;
+import java.util.List;
+
import org.eclipse.jdt.annotation.NonNullByDefault;
import org.eclipse.jdt.annotation.Nullable;
import org.openhab.binding.amazonechocontrol.internal.jsons.JsonSmartHomeGroupIdentifiers.SmartHomeGroupIdentifier;
}
}
- public @Nullable SmartHomeGroup @Nullable [] groups;
+ public @Nullable List<SmartHomeGroup> groups;
}
*/
package org.openhab.binding.amazonechocontrol.internal.jsons;
+import java.util.List;
+
import org.eclipse.jdt.annotation.NonNullByDefault;
import org.eclipse.jdt.annotation.Nullable;
public @Nullable String effectiveMarketPlaceId;
public @Nullable String email;
public @Nullable Boolean eulaAcceptance;
- public @Nullable String @Nullable [] features;
+ public @Nullable List<String> features;
public @Nullable String fullName;
public @Nullable Boolean hasActiveDopplers;
public @Nullable String id;
*/
package org.openhab.binding.amazonechocontrol.internal.jsons;
+import java.util.List;
+
import org.eclipse.jdt.annotation.NonNullByDefault;
import org.eclipse.jdt.annotation.Nullable;
*/
@NonNullByDefault
public class JsonWakeWords {
- public @Nullable WakeWord @Nullable [] wakeWords;
+ public @Nullable List<WakeWord> wakeWords;
public static class WakeWord {
public @Nullable Boolean active;
*/
package org.openhab.binding.amazonechocontrol.internal.smarthome;
-import java.util.HashMap;
import java.util.Map;
import java.util.Set;
-import java.util.function.Supplier;
+import java.util.function.Function;
import org.eclipse.jdt.annotation.NonNullByDefault;
import org.openhab.binding.amazonechocontrol.internal.AmazonEchoControlBindingConstants;
+import org.openhab.binding.amazonechocontrol.internal.handler.SmartHomeDeviceHandler;
import org.openhab.core.thing.type.ChannelTypeUID;
/**
*/
@NonNullByDefault
public class Constants {
- public static final Map<String, Supplier<HandlerBase>> HANDLER_FACTORY = new HashMap<>();
-
- static {
- HANDLER_FACTORY.put(HandlerPowerController.INTERFACE, HandlerPowerController::new);
- HANDLER_FACTORY.put(HandlerBrightnessController.INTERFACE, HandlerBrightnessController::new);
- HANDLER_FACTORY.put(HandlerColorController.INTERFACE, HandlerColorController::new);
- HANDLER_FACTORY.put(HandlerColorTemperatureController.INTERFACE, HandlerColorTemperatureController::new);
- HANDLER_FACTORY.put(HandlerSecurityPanelController.INTERFACE, HandlerSecurityPanelController::new);
- HANDLER_FACTORY.put(HandlerAcousticEventSensor.INTERFACE, HandlerAcousticEventSensor::new);
- HANDLER_FACTORY.put(HandlerTemperatureSensor.INTERFACE, HandlerTemperatureSensor::new);
- HANDLER_FACTORY.put(HandlerThermostatController.INTERFACE, HandlerThermostatController::new);
- HANDLER_FACTORY.put(HandlerPercentageController.INTERFACE, HandlerPercentageController::new);
- HANDLER_FACTORY.put(HandlerPowerLevelController.INTERFACE, HandlerPowerLevelController::new);
- }
+ public static final Map<String, Function<SmartHomeDeviceHandler, HandlerBase>> HANDLER_FACTORY = Map.of(
+ HandlerPowerController.INTERFACE, HandlerPowerController::new, HandlerBrightnessController.INTERFACE,
+ HandlerBrightnessController::new, HandlerColorController.INTERFACE, HandlerColorController::new,
+ HandlerColorTemperatureController.INTERFACE, HandlerColorTemperatureController::new,
+ HandlerSecurityPanelController.INTERFACE, HandlerSecurityPanelController::new,
+ HandlerAcousticEventSensor.INTERFACE, HandlerAcousticEventSensor::new, HandlerTemperatureSensor.INTERFACE,
+ HandlerTemperatureSensor::new, HandlerThermostatController.INTERFACE, HandlerThermostatController::new,
+ HandlerPercentageController.INTERFACE, HandlerPercentageController::new,
+ HandlerPowerLevelController.INTERFACE, HandlerPowerLevelController::new);
public static final Set<String> SUPPORTED_INTERFACES = HANDLER_FACTORY.keySet();
import org.eclipse.jdt.annotation.Nullable;
import org.openhab.binding.amazonechocontrol.internal.AmazonEchoControlBindingConstants;
import org.openhab.binding.amazonechocontrol.internal.Connection;
+import org.openhab.binding.amazonechocontrol.internal.handler.SmartHomeDeviceHandler;
import org.openhab.binding.amazonechocontrol.internal.jsons.JsonSmartHomeCapabilities.SmartHomeCapability;
import org.openhab.binding.amazonechocontrol.internal.jsons.JsonSmartHomeDevices.SmartHomeDevice;
import org.openhab.core.library.types.OpenClosedType;
"smokeAlarmDetectionState" /* propertyName */ , "smokeAlarmDetectionState" /* ChannelId */,
CHANNEL_TYPE_SMOKE_ALARM_DETECTION_STATE /* Channel Type */ , ITEM_TYPE_CONTACT /* Item Type */);
+ public HandlerAcousticEventSensor(SmartHomeDeviceHandler smartHomeDeviceHandler) {
+ super(smartHomeDeviceHandler);
+ }
+
private ChannelInfo[] getAlarmChannels() {
return new ChannelInfo[] { GLASS_BREAK_DETECTION_STATE, SMOKE_ALARM_DETECTION_STATE };
}
@Override
public boolean handleCommand(Connection connection, SmartHomeDevice shd, String entityId,
- SmartHomeCapability[] capabilties, String channelId, Command command) throws IOException {
+ List<SmartHomeCapability> capabilities, String channelId, Command command) throws IOException {
return false;
}
package org.openhab.binding.amazonechocontrol.internal.smarthome;
import java.io.IOException;
-import java.util.Collection;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Locale;
-import java.util.Map;
+import java.util.*;
import org.eclipse.jdt.annotation.NonNullByDefault;
import org.eclipse.jdt.annotation.Nullable;
import org.openhab.binding.amazonechocontrol.internal.Connection;
import org.openhab.binding.amazonechocontrol.internal.handler.SmartHomeDeviceHandler;
+import org.openhab.binding.amazonechocontrol.internal.jsons.JsonSmartHomeCapabilities;
import org.openhab.binding.amazonechocontrol.internal.jsons.JsonSmartHomeCapabilities.Properties;
import org.openhab.binding.amazonechocontrol.internal.jsons.JsonSmartHomeCapabilities.Property;
import org.openhab.binding.amazonechocontrol.internal.jsons.JsonSmartHomeCapabilities.SmartHomeCapability;
*/
@NonNullByDefault
public abstract class HandlerBase {
- protected @Nullable SmartHomeDeviceHandler smartHomeDeviceHandler;
+ protected SmartHomeDeviceHandler smartHomeDeviceHandler;
protected Map<String, ChannelInfo> channels = new HashMap<>();
+ public HandlerBase(SmartHomeDeviceHandler smartHomeDeviceHandler) {
+ this.smartHomeDeviceHandler = smartHomeDeviceHandler;
+ }
+
protected abstract ChannelInfo @Nullable [] findChannelInfos(SmartHomeCapability capability, String property);
public abstract void updateChannels(String interfaceName, List<JsonObject> stateList, UpdateChannelResult result);
public abstract boolean handleCommand(Connection connection, SmartHomeDevice shd, String entityId,
- SmartHomeCapability[] capabilties, String channelId, Command command)
+ List<SmartHomeCapability> capabilities, String channelId, Command command)
throws IOException, InterruptedException;
public abstract @Nullable StateDescription findStateDescription(String channelId,
public abstract String[] getSupportedInterface();
- SmartHomeDeviceHandler getSmartHomeDeviceHandler() throws IllegalStateException {
- SmartHomeDeviceHandler smartHomeDeviceHandler = this.smartHomeDeviceHandler;
- if (smartHomeDeviceHandler == null) {
- throw new IllegalStateException("Handler not initialized");
- }
+ SmartHomeDeviceHandler getSmartHomeDeviceHandler() {
return smartHomeDeviceHandler;
}
- public Collection<ChannelInfo> initialize(SmartHomeDeviceHandler smartHomeDeviceHandler,
- List<SmartHomeCapability> capabilities) {
- this.smartHomeDeviceHandler = smartHomeDeviceHandler;
+ public Collection<ChannelInfo> initialize(List<SmartHomeCapability> capabilities) {
Map<String, ChannelInfo> channels = new HashMap<>();
for (SmartHomeCapability capability : capabilities) {
Properties properties = capability.properties;
if (properties != null) {
- Property @Nullable [] supported = properties.supported;
- if (supported != null) {
- for (Property property : supported) {
- if (property != null) {
- String name = property.name;
- if (name != null) {
- ChannelInfo[] channelInfos = findChannelInfos(capability, name);
- if (channelInfos != null) {
- for (ChannelInfo channelInfo : channelInfos) {
- if (channelInfo != null) {
- channels.put(channelInfo.channelId, channelInfo);
- }
- }
+ List<JsonSmartHomeCapabilities.Property> supported = Objects.requireNonNullElse(properties.supported,
+ List.of());
+ for (Property property : supported) {
+ String name = property.name;
+ if (name != null) {
+ ChannelInfo[] channelInfos = findChannelInfos(capability, name);
+ if (channelInfos != null) {
+ for (ChannelInfo channelInfo : channelInfos) {
+ if (channelInfo != null) {
+ channels.put(channelInfo.channelId, channelInfo);
}
}
}
}
+
}
}
}
return channels.values();
}
- protected boolean containsCapabilityProperty(SmartHomeCapability[] capabilties, String propertyName) {
- for (SmartHomeCapability capability : capabilties) {
+ protected boolean containsCapabilityProperty(List<SmartHomeCapability> capabilities, String propertyName) {
+ for (SmartHomeCapability capability : capabilities) {
Properties properties = capability.properties;
if (properties != null) {
- Property @Nullable [] supportedProperties = properties.supported;
- if (supportedProperties != null) {
- for (Property property : supportedProperties) {
- if (property != null) {
- if (propertyName != null && propertyName.equals(property.name)) {
- return true;
- }
- }
- }
+ List<JsonSmartHomeCapabilities.Property> supported = Objects.requireNonNullElse(properties.supported,
+ List.of());
+ if (supported.stream().anyMatch(p -> propertyName.equals(p.name))) {
+ return true;
}
}
}
import org.eclipse.jdt.annotation.Nullable;
import org.openhab.binding.amazonechocontrol.internal.AmazonEchoControlBindingConstants;
import org.openhab.binding.amazonechocontrol.internal.Connection;
+import org.openhab.binding.amazonechocontrol.internal.handler.SmartHomeDeviceHandler;
import org.openhab.binding.amazonechocontrol.internal.jsons.JsonSmartHomeCapabilities.SmartHomeCapability;
import org.openhab.binding.amazonechocontrol.internal.jsons.JsonSmartHomeDevices.SmartHomeDevice;
import org.openhab.core.library.types.IncreaseDecreaseType;
private @Nullable Integer lastBrightness;
+ public HandlerBrightnessController(SmartHomeDeviceHandler smartHomeDeviceHandler) {
+ super(smartHomeDeviceHandler);
+ }
+
@Override
public String[] getSupportedInterface() {
return new String[] { INTERFACE };
@Override
public boolean handleCommand(Connection connection, SmartHomeDevice shd, String entityId,
- SmartHomeCapability[] capabilties, String channelId, Command command)
+ List<SmartHomeCapability> capabilities, String channelId, Command command)
throws IOException, InterruptedException {
if (channelId.equals(BRIGHTNESS.channelId)) {
- if (containsCapabilityProperty(capabilties, BRIGHTNESS.propertyName)) {
+ if (containsCapabilityProperty(capabilities, BRIGHTNESS.propertyName)) {
if (command.equals(IncreaseDecreaseType.INCREASE)) {
Integer lastBrightness = this.lastBrightness;
if (lastBrightness != null) {
import org.eclipse.jdt.annotation.Nullable;
import org.openhab.binding.amazonechocontrol.internal.AmazonEchoControlBindingConstants;
import org.openhab.binding.amazonechocontrol.internal.Connection;
+import org.openhab.binding.amazonechocontrol.internal.handler.SmartHomeDeviceHandler;
import org.openhab.binding.amazonechocontrol.internal.jsons.JsonSmartHomeCapabilities.SmartHomeCapability;
import org.openhab.binding.amazonechocontrol.internal.jsons.JsonSmartHomeDevices.SmartHomeDevice;
import org.openhab.core.library.types.DecimalType;
private @Nullable HSBType lastColor;
private @Nullable String lastColorName;
+ public HandlerColorController(SmartHomeDeviceHandler smartHomeDeviceHandler) {
+ super(smartHomeDeviceHandler);
+ }
+
@Override
public String[] getSupportedInterface() {
return new String[] { INTERFACE, INTERFACE_COLOR_PROPERTIES };
@Override
public boolean handleCommand(Connection connection, SmartHomeDevice shd, String entityId,
- SmartHomeCapability[] capabilties, String channelId, Command command)
+ List<SmartHomeCapability> capabilities, String channelId, Command command)
throws IOException, InterruptedException {
if (channelId.equals(COLOR.channelId)) {
- if (containsCapabilityProperty(capabilties, COLOR.propertyName)) {
+ if (containsCapabilityProperty(capabilities, COLOR.propertyName)) {
if (command instanceof HSBType) {
HSBType color = ((HSBType) command);
JsonObject colorObject = new JsonObject();
}
}
if (channelId.equals(COLOR_PROPERTIES.channelId)) {
- if (containsCapabilityProperty(capabilties, COLOR.propertyName)) {
+ if (containsCapabilityProperty(capabilities, COLOR.propertyName)) {
if (command instanceof StringType) {
String colorName = command.toFullString();
if (!colorName.isEmpty()) {
import org.eclipse.jdt.annotation.Nullable;
import org.openhab.binding.amazonechocontrol.internal.AmazonEchoControlBindingConstants;
import org.openhab.binding.amazonechocontrol.internal.Connection;
+import org.openhab.binding.amazonechocontrol.internal.handler.SmartHomeDeviceHandler;
import org.openhab.binding.amazonechocontrol.internal.jsons.JsonSmartHomeCapabilities.SmartHomeCapability;
import org.openhab.binding.amazonechocontrol.internal.jsons.JsonSmartHomeDevices.SmartHomeDevice;
import org.openhab.core.library.types.DecimalType;
private @Nullable Integer lastColorTemperature;
private @Nullable String lastColorName;
+ public HandlerColorTemperatureController(SmartHomeDeviceHandler smartHomeDeviceHandler) {
+ super(smartHomeDeviceHandler);
+ }
+
@Override
public String[] getSupportedInterface() {
return new String[] { INTERFACE, INTERFACE_COLOR_PROPERTIES };
@Override
public boolean handleCommand(Connection connection, SmartHomeDevice shd, String entityId,
- SmartHomeCapability[] capabilties, String channelId, Command command)
+ List<SmartHomeCapability> capabilities, String channelId, Command command)
throws IOException, InterruptedException {
if (channelId.equals(COLOR_TEMPERATURE_IN_KELVIN.channelId)) {
// WRITING TO THIS CHANNEL DOES CURRENTLY NOT WORK, BUT WE LEAVE THE CODE FOR FUTURE USE!
- if (containsCapabilityProperty(capabilties, COLOR_TEMPERATURE_IN_KELVIN.propertyName)) {
+ if (containsCapabilityProperty(capabilities, COLOR_TEMPERATURE_IN_KELVIN.propertyName)) {
if (command instanceof DecimalType) {
int intValue = ((DecimalType) command).intValue();
if (intValue < 1000) {
}
}
if (channelId.equals(COLOR_TEMPERATURE_NAME.channelId)) {
- if (containsCapabilityProperty(capabilties, COLOR_TEMPERATURE_IN_KELVIN.propertyName)) {
+ if (containsCapabilityProperty(capabilities, COLOR_TEMPERATURE_IN_KELVIN.propertyName)) {
if (command instanceof StringType) {
String colorTemperatureName = command.toFullString();
if (!colorTemperatureName.isEmpty()) {
import org.eclipse.jdt.annotation.Nullable;
import org.openhab.binding.amazonechocontrol.internal.AmazonEchoControlBindingConstants;
import org.openhab.binding.amazonechocontrol.internal.Connection;
+import org.openhab.binding.amazonechocontrol.internal.handler.SmartHomeDeviceHandler;
import org.openhab.binding.amazonechocontrol.internal.jsons.JsonSmartHomeCapabilities.SmartHomeCapability;
import org.openhab.binding.amazonechocontrol.internal.jsons.JsonSmartHomeDevices.SmartHomeDevice;
import org.openhab.core.library.types.IncreaseDecreaseType;
private @Nullable Integer lastPercentage;
+ public HandlerPercentageController(SmartHomeDeviceHandler smartHomeDeviceHandler) {
+ super(smartHomeDeviceHandler);
+ }
+
@Override
public String[] getSupportedInterface() {
return new String[] { INTERFACE };
@Override
public boolean handleCommand(Connection connection, SmartHomeDevice shd, String entityId,
- SmartHomeCapability[] capabilties, String channelId, Command command)
+ List<SmartHomeCapability> capabilities, String channelId, Command command)
throws IOException, InterruptedException {
if (channelId.equals(PERCENTAGE.channelId)) {
- if (containsCapabilityProperty(capabilties, PERCENTAGE.propertyName)) {
+ if (containsCapabilityProperty(capabilities, PERCENTAGE.propertyName)) {
if (command.equals(IncreaseDecreaseType.INCREASE)) {
Integer lastPercentage = this.lastPercentage;
if (lastPercentage != null) {
import org.eclipse.jdt.annotation.Nullable;
import org.openhab.binding.amazonechocontrol.internal.AmazonEchoControlBindingConstants;
import org.openhab.binding.amazonechocontrol.internal.Connection;
+import org.openhab.binding.amazonechocontrol.internal.handler.SmartHomeDeviceHandler;
import org.openhab.binding.amazonechocontrol.internal.jsons.JsonSmartHomeCapabilities.SmartHomeCapability;
import org.openhab.binding.amazonechocontrol.internal.jsons.JsonSmartHomeDevices.SmartHomeDevice;
import org.openhab.core.library.types.OnOffType;
"powerState" /* ChannelId */, CHANNEL_TYPE_POWER_STATE /* Channel Type */ ,
ITEM_TYPE_SWITCH /* Item Type */);
+ public HandlerPowerController(SmartHomeDeviceHandler smartHomeDeviceHandler) {
+ super(smartHomeDeviceHandler);
+ }
+
@Override
public String[] getSupportedInterface() {
return new String[] { INTERFACE };
if (POWER_STATE.propertyName.equals(state.get("name").getAsString())) {
String value = state.get("value").getAsString();
// For groups take true if all true
- if ("ON".equals(value)) {
- powerStateValue = true;
- } else {
- powerStateValue = false;
- }
-
+ powerStateValue = "ON".equals(value);
}
}
logger.trace("{} final state {}", this.smartHomeDeviceHandler.getId(), powerStateValue);
@Override
public boolean handleCommand(Connection connection, SmartHomeDevice shd, String entityId,
- SmartHomeCapability[] capabilities, String channelId, Command command)
+ List<SmartHomeCapability> capabilities, String channelId, Command command)
throws IOException, InterruptedException {
if (channelId.equals(POWER_STATE.channelId)) {
if (containsCapabilityProperty(capabilities, POWER_STATE.propertyName)) {
import org.eclipse.jdt.annotation.Nullable;
import org.openhab.binding.amazonechocontrol.internal.AmazonEchoControlBindingConstants;
import org.openhab.binding.amazonechocontrol.internal.Connection;
+import org.openhab.binding.amazonechocontrol.internal.handler.SmartHomeDeviceHandler;
import org.openhab.binding.amazonechocontrol.internal.jsons.JsonSmartHomeCapabilities.SmartHomeCapability;
import org.openhab.binding.amazonechocontrol.internal.jsons.JsonSmartHomeDevices.SmartHomeDevice;
import org.openhab.core.library.types.IncreaseDecreaseType;
private @Nullable Integer lastPowerLevel;
+ public HandlerPowerLevelController(SmartHomeDeviceHandler smartHomeDeviceHandler) {
+ super(smartHomeDeviceHandler);
+ }
+
@Override
public String[] getSupportedInterface() {
return new String[] { INTERFACE };
@Override
public boolean handleCommand(Connection connection, SmartHomeDevice shd, String entityId,
- SmartHomeCapability[] capabilties, String channelId, Command command)
+ List<SmartHomeCapability> capabilities, String channelId, Command command)
throws IOException, InterruptedException {
if (channelId.equals(POWER_LEVEL.channelId)) {
- if (containsCapabilityProperty(capabilties, POWER_LEVEL.propertyName)) {
+ if (containsCapabilityProperty(capabilities, POWER_LEVEL.propertyName)) {
if (command.equals(IncreaseDecreaseType.INCREASE)) {
Integer lastPowerLevel = this.lastPowerLevel;
if (lastPowerLevel != null) {
import org.eclipse.jdt.annotation.Nullable;
import org.openhab.binding.amazonechocontrol.internal.AmazonEchoControlBindingConstants;
import org.openhab.binding.amazonechocontrol.internal.Connection;
+import org.openhab.binding.amazonechocontrol.internal.handler.SmartHomeDeviceHandler;
import org.openhab.binding.amazonechocontrol.internal.jsons.JsonSmartHomeCapabilities.SmartHomeCapability;
import org.openhab.binding.amazonechocontrol.internal.jsons.JsonSmartHomeDevices.SmartHomeDevice;
import org.openhab.core.library.types.OpenClosedType;
"waterAlarm" /* ChannelId */, CHANNEL_TYPE_WATER_ALARM /* Channel Type */ ,
ITEM_TYPE_CONTACT /* Item Type */);
+ public HandlerSecurityPanelController(SmartHomeDeviceHandler smartHomeDeviceHandler) {
+ super(smartHomeDeviceHandler);
+ }
+
private ChannelInfo[] getAlarmChannels() {
return new ChannelInfo[] { BURGLARY_ALARM, CARBON_MONOXIDE_ALARM, FIRE_ALARM, WATER_ALARM };
}
@Override
public boolean handleCommand(Connection connection, SmartHomeDevice shd, String entityId,
- SmartHomeCapability[] capabilities, String channelId, Command command)
+ List<SmartHomeCapability> capabilities, String channelId, Command command)
throws IOException, InterruptedException {
if (channelId.equals(ARM_STATE.channelId)) {
if (containsCapabilityProperty(capabilities, ARM_STATE.propertyName)) {
import org.eclipse.jdt.annotation.NonNullByDefault;
import org.eclipse.jdt.annotation.Nullable;
import org.openhab.binding.amazonechocontrol.internal.Connection;
+import org.openhab.binding.amazonechocontrol.internal.handler.SmartHomeDeviceHandler;
import org.openhab.binding.amazonechocontrol.internal.jsons.JsonSmartHomeCapabilities.SmartHomeCapability;
import org.openhab.binding.amazonechocontrol.internal.jsons.JsonSmartHomeDevices.SmartHomeDevice;
import org.openhab.core.library.types.QuantityType;
"temperature" /* ChannelId */, CHANNEL_TYPE_TEMPERATURE /* Channel Type */ ,
ITEM_TYPE_NUMBER_TEMPERATURE /* Item Type */);
+ public HandlerTemperatureSensor(SmartHomeDeviceHandler smartHomeDeviceHandler) {
+ super(smartHomeDeviceHandler);
+ }
+
@Override
public String[] getSupportedInterface() {
return new String[] { INTERFACE };
@Override
public boolean handleCommand(Connection connection, SmartHomeDevice shd, String entityId,
- SmartHomeCapability[] capabilties, String channelId, Command command) throws IOException {
+ List<SmartHomeCapability> capabilities, String channelId, Command command) throws IOException {
return false;
}
import org.eclipse.jdt.annotation.NonNullByDefault;
import org.eclipse.jdt.annotation.Nullable;
import org.openhab.binding.amazonechocontrol.internal.Connection;
+import org.openhab.binding.amazonechocontrol.internal.handler.SmartHomeDeviceHandler;
import org.openhab.binding.amazonechocontrol.internal.jsons.JsonSmartHomeCapabilities.SmartHomeCapability;
import org.openhab.binding.amazonechocontrol.internal.jsons.JsonSmartHomeDevices.SmartHomeDevice;
import org.openhab.core.library.types.QuantityType;
"targetSetpoint" /* ChannelId */, CHANNEL_TYPE_TEMPERATURE /* Channel Type */ ,
ITEM_TYPE_NUMBER_TEMPERATURE /* Item Type */);
+ public HandlerThermostatController(SmartHomeDeviceHandler smartHomeDeviceHandler) {
+ super(smartHomeDeviceHandler);
+ }
+
@Override
public String[] getSupportedInterface() {
return new String[] { INTERFACE };
@Override
public boolean handleCommand(Connection connection, SmartHomeDevice shd, String entityId,
- SmartHomeCapability[] capabilties, String channelId, Command command)
+ List<SmartHomeCapability> capabilities, String channelId, Command command)
throws IOException, InterruptedException {
if (channelId.equals(TARGET_SETPOINT.channelId)) {
- if (containsCapabilityProperty(capabilties, TARGET_SETPOINT.propertyName)) {
+ if (containsCapabilityProperty(capabilities, TARGET_SETPOINT.propertyName)) {
if (command instanceof QuantityType) {
connection.smartHomeCommand(entityId, "setTargetTemperature", "targetTemperature", command);
return true;
import java.util.Set;
import org.eclipse.jdt.annotation.NonNullByDefault;
-import org.openhab.binding.amazonechocontrol.internal.jsons.JsonSmartHomeCapabilities.SmartHomeCapability;
import org.openhab.binding.amazonechocontrol.internal.jsons.JsonSmartHomeDevices.DriverIdentity;
import org.openhab.binding.amazonechocontrol.internal.jsons.JsonSmartHomeDevices.SmartHomeDevice;
import org.slf4j.Logger;
if (updateIntervalInSeconds != null) {
return updateIntervalInSeconds;
}
- SmartHomeCapability[] capabilities = shd.capabilities;
- if (capabilities != null) {
- for (SmartHomeCapability capability : capabilities) {
- if (capability != null && HandlerAcousticEventSensor.INTERFACE.equals(capability.interfaceName)) {
- updateIntervalInSeconds = UPDATE_INTERVAL_ACOUSTIC_EVENTS_IN_SECONDS;
- break;
- }
- }
+ if (shd.getCapabilities().stream()
+ .anyMatch(capability -> HandlerAcousticEventSensor.INTERFACE.equals(capability.interfaceName))) {
+ updateIntervalInSeconds = UPDATE_INTERVAL_ACOUSTIC_EVENTS_IN_SECONDS;
}
+
if (updateIntervalInSeconds == null) {
String manufacturerName = shd.manufacturerName;
if (manufacturerName != null && ("openHAB".equalsIgnoreCase(manufacturerName)