[amazonechocontrol] refactor arrays to modern types (#9476)

* refactor arrays to modern types
* address review comments

Signed-off-by: Jan N. Klug <jan.n.klug@rub.de>
This commit is contained in:
J-N-K 2021-01-13 23:31:26 +01:00 committed by GitHub
parent 04d87f33db
commit e651aa6d03
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
41 changed files with 374 additions and 452 deletions

View File

@ -20,9 +20,7 @@ import java.net.URISyntaxException;
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;
@ -499,19 +497,14 @@ public class AccountServlet extends HttpServlet {
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) {
@ -532,8 +525,8 @@ public class AccountServlet extends HttpServlet {
}
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);
@ -541,7 +534,7 @@ public class AccountServlet extends HttpServlet {
| 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
@ -562,7 +555,8 @@ public class AccountServlet extends HttpServlet {
}
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";
@ -600,7 +594,7 @@ public class AccountServlet extends HttpServlet {
}
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;
@ -616,8 +610,8 @@ public class AccountServlet extends HttpServlet {
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>");

View File

@ -14,11 +14,7 @@ package org.openhab.binding.amazonechocontrol.internal;
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;
@ -106,17 +102,13 @@ public class AmazonEchoDynamicStateDescriptionProvider implements DynamicStateDe
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));
@ -160,8 +152,8 @@ public class AmazonEchoDynamicStateDescriptionProvider implements DynamicStateDe
return null;
}
JsonNotificationSound[] notificationSounds = handler.findAlarmSounds();
if (notificationSounds == null) {
List<JsonNotificationSound> notificationSounds = handler.findAlarmSounds();
if (notificationSounds.isEmpty()) {
return null;
}
@ -169,9 +161,8 @@ public class AmazonEchoDynamicStateDescriptionProvider implements DynamicStateDe
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));
}
@ -197,8 +188,7 @@ public class AmazonEchoDynamicStateDescriptionProvider implements DynamicStateDe
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));
}
}
@ -210,7 +200,7 @@ public class AmazonEchoDynamicStateDescriptionProvider implements DynamicStateDe
return null;
}
List<JsonMusicProvider> musicProviders = handler.findMusicProviders();
if (musicProviders == null) {
if (musicProviders.isEmpty()) {
return null;
}

View File

@ -53,7 +53,6 @@ import org.openhab.binding.amazonechocontrol.internal.jsons.JsonAscendingAlarm;
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;
@ -483,15 +482,13 @@ public class Connection {
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);
@ -726,11 +723,8 @@ public class Connection {
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<>();
@ -740,9 +734,6 @@ public class Connection {
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");
@ -770,9 +761,6 @@ public class Connection {
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();
@ -928,6 +916,7 @@ public class Connection {
}
}
@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) {
@ -967,9 +956,10 @@ public class Connection {
}
// 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;
@ -977,21 +967,16 @@ public class Connection {
}
// 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()
@ -1001,9 +986,6 @@ public class Connection {
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);
@ -1023,15 +1005,11 @@ public class Connection {
// 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));
}
@ -1062,8 +1040,10 @@ public class Connection {
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);
@ -1125,22 +1105,16 @@ public class Connection {
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() {
@ -1211,17 +1185,16 @@ public class Connection {
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());
}
@ -1245,38 +1218,28 @@ public class Connection {
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)
@ -1630,6 +1593,7 @@ public class Connection {
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()) {
@ -1853,12 +1817,9 @@ public class Connection {
}
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;
@ -1921,20 +1882,13 @@ public class Connection {
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;
@ -1942,33 +1896,19 @@ public class Connection {
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,
@ -2019,8 +1959,8 @@ public class Connection {
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());
@ -2050,12 +1990,10 @@ public class Connection {
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;
}
}

View File

@ -73,9 +73,7 @@ public class WebSocketConnection {
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")) {

View File

@ -22,14 +22,12 @@ import java.util.Map;
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;
@ -171,25 +169,23 @@ public class SmartHomeDevicesDiscovery extends AbstractDiscoveryService {
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;
}

View File

@ -17,15 +17,7 @@ import java.net.URISyntaxException;
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;
@ -44,7 +36,6 @@ import org.openhab.binding.amazonechocontrol.internal.WebSocketConnection;
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;
@ -473,18 +464,17 @@ public class AccountHandler extends BaseBridgeHandler implements IWebSocketComma
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() {
@ -509,8 +499,8 @@ public class AccountHandler extends BaseBridgeHandler implements IWebSocketComma
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()) {
@ -536,7 +526,7 @@ public class AccountHandler extends BaseBridgeHandler implements IWebSocketComma
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
@ -562,17 +552,12 @@ public class AccountHandler extends BaseBridgeHandler implements IWebSocketComma
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,
@ -631,19 +616,13 @@ public class AccountHandler extends BaseBridgeHandler implements IWebSocketComma
.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);
}
@ -658,7 +637,7 @@ public class AccountHandler extends BaseBridgeHandler implements IWebSocketComma
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);
}
@ -707,17 +686,9 @@ public class AccountHandler extends BaseBridgeHandler implements IWebSocketComma
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) {
@ -796,17 +767,12 @@ public class AccountHandler extends BaseBridgeHandler implements IWebSocketComma
}
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() {

View File

@ -24,8 +24,6 @@ import java.time.temporal.ChronoUnit;
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;
@ -122,8 +120,8 @@ public class EchoHandler extends BaseThingHandler implements IEchoThingHandler {
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;
@ -163,10 +161,7 @@ public class EchoHandler extends BaseThingHandler implements IEchoThingHandler {
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;
@ -204,11 +199,11 @@ public class EchoHandler extends BaseThingHandler implements IEchoThingHandler {
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;
}
@ -444,17 +439,11 @@ public class EchoHandler extends BaseThingHandler implements IEchoThingHandler {
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;
}
}
}
@ -806,8 +795,7 @@ public class EchoHandler extends BaseThingHandler implements IEchoThingHandler {
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());
@ -974,24 +962,19 @@ public class EchoHandler extends BaseThingHandler implements IEchoThingHandler {
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;
@ -1036,22 +1019,21 @@ public class EchoHandler extends BaseThingHandler implements IEchoThingHandler {
}
}
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;
}
}
}
}
@ -1287,7 +1269,8 @@ public class EchoHandler extends BaseThingHandler implements IEchoThingHandler {
}
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;

View File

@ -16,7 +16,7 @@ import static org.openhab.binding.amazonechocontrol.internal.AmazonEchoControlBi
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;
@ -93,15 +93,15 @@ public class SmartHomeDeviceHandler extends BaseThingHandler {
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,
@ -289,13 +289,8 @@ public class SmartHomeDeviceHandler extends BaseThingHandler {
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
@ -312,11 +307,7 @@ public class SmartHomeDeviceHandler extends BaseThingHandler {
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<>()))
@ -340,12 +331,10 @@ public class SmartHomeDeviceHandler extends BaseThingHandler {
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;
@ -356,13 +345,12 @@ public class SmartHomeDeviceHandler extends BaseThingHandler {
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);
}

View File

@ -12,6 +12,9 @@
*/
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;
@ -26,7 +29,7 @@ import com.google.gson.JsonSyntaxException;
@NonNullByDefault
public class JsonActivities {
public @Nullable Activity @Nullable [] activities;
public @Nullable List<Activity> activities;
public static class Activity {
public @Nullable String activityStatus;
@ -40,10 +43,14 @@ public class JsonActivities {
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;
@ -51,7 +58,6 @@ public class JsonActivities {
}
public static class Description {
public @Nullable String summary;
public @Nullable String firstUtteranceId;
public @Nullable String firstStreamId;

View File

@ -12,6 +12,8 @@
*/
package org.openhab.binding.amazonechocontrol.internal.jsons;
import java.util.List;
import org.eclipse.jdt.annotation.NonNullByDefault;
import org.eclipse.jdt.annotation.Nullable;
@ -23,7 +25,7 @@ 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;

View File

@ -12,6 +12,7 @@
*/
package org.openhab.binding.amazonechocontrol.internal.jsons;
import java.util.List;
import java.util.TreeMap;
import org.eclipse.jdt.annotation.NonNullByDefault;
@ -26,7 +27,7 @@ import org.eclipse.jdt.annotation.Nullable;
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;

View File

@ -12,6 +12,7 @@
*/
package org.openhab.binding.amazonechocontrol.internal.jsons;
import java.util.List;
import java.util.Objects;
import org.eclipse.jdt.annotation.NonNullByDefault;
@ -50,7 +51,7 @@ public class JsonBluetoothStates {
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 {
@ -59,6 +60,10 @@ public class JsonBluetoothStates {
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());
}
}
}

View File

@ -12,6 +12,8 @@
*/
package org.openhab.binding.amazonechocontrol.internal.jsons;
import java.util.List;
import org.eclipse.jdt.annotation.NonNullByDefault;
import org.eclipse.jdt.annotation.Nullable;
@ -23,7 +25,7 @@ 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;

View File

@ -12,8 +12,9 @@
*/
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;
@ -35,7 +36,11 @@ public class JsonDevices {
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() {
@ -43,7 +48,7 @@ public class JsonDevices {
+ ", deviceOwnerCustomerId='" + deviceOwnerCustomerId + '\'' + ", deviceAccountId='"
+ deviceAccountId + '\'' + ", deviceFamily='" + deviceFamily + '\'' + ", deviceType='" + deviceType
+ '\'' + ", softwareVersion='" + softwareVersion + '\'' + ", online=" + online + ", capabilities="
+ Arrays.toString(capabilities) + '}';
+ capabilities + '}';
}
}

View File

@ -12,6 +12,8 @@
*/
package org.openhab.binding.amazonechocontrol.internal.jsons;
import java.util.List;
import org.eclipse.jdt.annotation.NonNullByDefault;
import org.eclipse.jdt.annotation.Nullable;
@ -22,5 +24,5 @@ import org.eclipse.jdt.annotation.Nullable;
*/
@NonNullByDefault
public class JsonEnabledFeeds {
public @Nullable JsonFeed @Nullable [] enabledFeeds;
public @Nullable List<JsonFeed> enabledFeeds;
}

View File

@ -16,7 +16,7 @@ import org.eclipse.jdt.annotation.NonNullByDefault;
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
*/

View File

@ -26,4 +26,9 @@ public class JsonFeed {
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;
}
}

View File

@ -12,6 +12,8 @@
*/
package org.openhab.binding.amazonechocontrol.internal.jsons;
import java.util.List;
import org.eclipse.jdt.annotation.NonNullByDefault;
import org.eclipse.jdt.annotation.Nullable;
@ -36,7 +38,7 @@ public class JsonMediaState {
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;
@ -48,7 +50,6 @@ public class JsonMediaState {
public int volume;
public static class QueueEntry {
public @Nullable String album;
public @Nullable String albumAsin;
public @Nullable String artist;

View File

@ -25,7 +25,7 @@ import org.eclipse.jdt.annotation.Nullable;
@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;

View File

@ -12,6 +12,8 @@
*/
package org.openhab.binding.amazonechocontrol.internal.jsons;
import java.util.List;
import org.eclipse.jdt.annotation.NonNullByDefault;
import org.eclipse.jdt.annotation.Nullable;
@ -22,5 +24,5 @@ import org.eclipse.jdt.annotation.Nullable;
*/
@NonNullByDefault
public class JsonNotificationSounds {
public @Nullable JsonNotificationSound @Nullable [] notificationSounds;
public @Nullable List<JsonNotificationSound> notificationSounds;
}

View File

@ -12,6 +12,8 @@
*/
package org.openhab.binding.amazonechocontrol.internal.jsons;
import java.util.List;
import org.eclipse.jdt.annotation.NonNullByDefault;
import org.eclipse.jdt.annotation.Nullable;
@ -22,5 +24,5 @@ import org.eclipse.jdt.annotation.Nullable;
*/
@NonNullByDefault
public class JsonNotificationsResponse {
public JsonNotificationResponse @Nullable [] notifications;
public @Nullable List<JsonNotificationResponse> notifications;
}

View File

@ -12,6 +12,8 @@
*/
package org.openhab.binding.amazonechocontrol.internal.jsons;
import java.util.List;
import org.eclipse.jdt.annotation.NonNullByDefault;
import org.eclipse.jdt.annotation.Nullable;
@ -26,7 +28,7 @@ import com.google.gson.annotations.SerializedName;
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;
@ -48,7 +50,7 @@ public class JsonRegisterAppRequest {
public static class Cookies {
@SerializedName("website_cookies")
public @Nullable JsonWebSiteCookie @Nullable [] webSiteCookies;
public List<JsonWebSiteCookie> webSiteCookies = List.of();
public @Nullable String domain = ".amazon.com";
}

View File

@ -12,6 +12,8 @@
*/
package org.openhab.binding.amazonechocontrol.internal.jsons;
import java.util.List;
import org.eclipse.jdt.annotation.NonNullByDefault;
import org.eclipse.jdt.annotation.Nullable;
@ -30,12 +32,12 @@ public class JsonSmartHomeCapabilities {
}
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;
}

View File

@ -12,8 +12,8 @@
*/
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;
@ -28,6 +28,27 @@ import org.openhab.binding.amazonechocontrol.internal.jsons.JsonSmartHomeTags.Js
public class JsonSmartHomeDevices {
public static class SmartHomeDevice implements SmartHomeBaseDevice {
public @Nullable Integer updateIntervalInSeconds;
public @Nullable String applianceId;
public @Nullable String manufacturerName;
public @Nullable String friendlyDescription;
public @Nullable String modelName;
public @Nullable String friendlyName;
public @Nullable String reachability;
public @Nullable String entityId;
public @Nullable SmartHomeDeviceNetworkState applianceNetworkState;
public @Nullable List<SmartHomeCapability> capabilities;
public @Nullable JsonSmartHomeTag tags;
public @Nullable List<String> applianceTypes;
public @Nullable List<JsonSmartHomeDeviceAlias> aliases;
public @Nullable List<SmartHomeDevice> groupDevices;
public @Nullable String connectedVia;
public @Nullable DriverIdentity driverIdentity;
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() {
@ -39,34 +60,16 @@ public class JsonSmartHomeDevices {
return false;
}
public @Nullable String applianceId;
public @Nullable String manufacturerName;
public @Nullable String friendlyDescription;
public @Nullable String modelName;
public @Nullable String friendlyName;
public @Nullable String reachability;
public @Nullable String entityId;
public @Nullable SmartHomeDeviceNetworkState applianceNetworkState;
public @Nullable SmartHomeCapability @Nullable [] capabilities;
public @Nullable JsonSmartHomeTag tags;
public @Nullable String @Nullable [] applianceTypes;
public @Nullable JsonSmartHomeDeviceAlias @Nullable [] aliases;
public @Nullable SmartHomeDevice @Nullable [] groupDevices;
public @Nullable String connectedVia;
public @Nullable DriverIdentity driverIdentity;
public List<String> mergedApplianceIds = List.of();
@Override
public String toString() {
return "SmartHomeDevice{" + "updateIntervalInSeconds=" + updateIntervalInSeconds + ", applianceId='"
+ 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 + '}';
}
}
@ -79,6 +82,4 @@ public class JsonSmartHomeDevices {
return "DriverIdentity{" + "namespace='" + namespace + '\'' + ", identifier='" + identifier + '\'' + '}';
}
}
public @Nullable SmartHomeDevice @Nullable [] smarthomeDevices;
}

View File

@ -12,6 +12,8 @@
*/
package org.openhab.binding.amazonechocontrol.internal.jsons;
import java.util.List;
import org.eclipse.jdt.annotation.NonNullByDefault;
import org.eclipse.jdt.annotation.Nullable;
@ -23,8 +25,8 @@ 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;
}

View File

@ -12,6 +12,8 @@
*/
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;
@ -54,5 +56,5 @@ public class JsonSmartHomeGroups {
}
}
public @Nullable SmartHomeGroup @Nullable [] groups;
public @Nullable List<SmartHomeGroup> groups;
}

View File

@ -12,6 +12,8 @@
*/
package org.openhab.binding.amazonechocontrol.internal.jsons;
import java.util.List;
import org.eclipse.jdt.annotation.NonNullByDefault;
import org.eclipse.jdt.annotation.Nullable;
@ -26,7 +28,7 @@ public class JsonUsersMeResponse {
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;

View File

@ -12,6 +12,8 @@
*/
package org.openhab.binding.amazonechocontrol.internal.jsons;
import java.util.List;
import org.eclipse.jdt.annotation.NonNullByDefault;
import org.eclipse.jdt.annotation.Nullable;
@ -22,7 +24,7 @@ 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;

View File

@ -12,13 +12,13 @@
*/
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;
/**
@ -26,20 +26,15 @@ 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();

View File

@ -22,6 +22,7 @@ import org.eclipse.jdt.annotation.NonNullByDefault;
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;
@ -57,6 +58,10 @@ public class HandlerAcousticEventSensor extends HandlerBase {
"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 };
}
@ -101,7 +106,7 @@ public class HandlerAcousticEventSensor extends HandlerBase {
@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;
}

View File

@ -13,16 +13,13 @@
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;
@ -39,15 +36,19 @@ import com.google.gson.JsonObject;
*/
@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,
@ -59,38 +60,30 @@ public abstract class HandlerBase {
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);
}
}
}
}
}
}
}
@ -98,19 +91,14 @@ public abstract class HandlerBase {
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;
}
}
}

View File

@ -22,6 +22,7 @@ import org.eclipse.jdt.annotation.NonNullByDefault;
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;
@ -56,6 +57,10 @@ public class HandlerBrightnessController extends HandlerBase {
private @Nullable Integer lastBrightness;
public HandlerBrightnessController(SmartHomeDeviceHandler smartHomeDeviceHandler) {
super(smartHomeDeviceHandler);
}
@Override
public String[] getSupportedInterface() {
return new String[] { INTERFACE };
@ -91,10 +96,10 @@ public class HandlerBrightnessController extends HandlerBase {
@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) {

View File

@ -23,6 +23,7 @@ import org.eclipse.jdt.annotation.NonNullByDefault;
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;
@ -65,6 +66,10 @@ public class HandlerColorController extends HandlerBase {
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 };
@ -123,10 +128,10 @@ public class HandlerColorController extends HandlerBase {
@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();
@ -138,7 +143,7 @@ public class HandlerColorController extends HandlerBase {
}
}
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()) {

View File

@ -23,6 +23,7 @@ import org.eclipse.jdt.annotation.NonNullByDefault;
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;
@ -65,6 +66,10 @@ public class HandlerColorTemperatureController extends HandlerBase {
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 };
@ -120,11 +125,11 @@ public class HandlerColorTemperatureController extends HandlerBase {
@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) {
@ -139,7 +144,7 @@ public class HandlerColorTemperatureController extends HandlerBase {
}
}
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()) {

View File

@ -22,6 +22,7 @@ import org.eclipse.jdt.annotation.NonNullByDefault;
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;
@ -56,6 +57,10 @@ public class HandlerPercentageController extends HandlerBase {
private @Nullable Integer lastPercentage;
public HandlerPercentageController(SmartHomeDeviceHandler smartHomeDeviceHandler) {
super(smartHomeDeviceHandler);
}
@Override
public String[] getSupportedInterface() {
return new String[] { INTERFACE };
@ -91,10 +96,10 @@ public class HandlerPercentageController extends HandlerBase {
@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) {

View File

@ -22,6 +22,7 @@ import org.eclipse.jdt.annotation.NonNullByDefault;
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;
@ -56,6 +57,10 @@ public class HandlerPowerController extends HandlerBase {
"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 };
@ -77,12 +82,7 @@ public class HandlerPowerController extends HandlerBase {
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);
@ -91,7 +91,7 @@ public class HandlerPowerController extends HandlerBase {
@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)) {

View File

@ -22,6 +22,7 @@ import org.eclipse.jdt.annotation.NonNullByDefault;
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;
@ -56,6 +57,10 @@ public class HandlerPowerLevelController extends HandlerBase {
private @Nullable Integer lastPowerLevel;
public HandlerPowerLevelController(SmartHomeDeviceHandler smartHomeDeviceHandler) {
super(smartHomeDeviceHandler);
}
@Override
public String[] getSupportedInterface() {
return new String[] { INTERFACE };
@ -92,10 +97,10 @@ public class HandlerPowerLevelController extends HandlerBase {
@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) {

View File

@ -23,6 +23,7 @@ import org.eclipse.jdt.annotation.NonNullByDefault;
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;
@ -81,6 +82,10 @@ public class HandlerSecurityPanelController extends HandlerBase {
"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 };
}
@ -146,7 +151,7 @@ public class HandlerSecurityPanelController extends HandlerBase {
@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)) {

View File

@ -23,6 +23,7 @@ import javax.measure.quantity.Temperature;
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;
@ -49,6 +50,10 @@ public class HandlerTemperatureSensor extends HandlerBase {
"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 };
@ -85,7 +90,7 @@ public class HandlerTemperatureSensor extends HandlerBase {
@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;
}

View File

@ -23,6 +23,7 @@ import javax.measure.quantity.Temperature;
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;
@ -48,6 +49,10 @@ public class HandlerThermostatController extends HandlerBase {
"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 };
@ -84,10 +89,10 @@ public class HandlerThermostatController extends HandlerBase {
@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;

View File

@ -20,7 +20,6 @@ import java.util.Map;
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;
@ -64,15 +63,11 @@ public class SmartHomeDeviceStateGroupUpdateCalculator {
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)