mirror of
https://github.com/openhab/openhab-addons.git
synced 2025-01-25 14:55:55 +01:00
[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:
parent
04d87f33db
commit
e651aa6d03
@ -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>");
|
||||
|
@ -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;
|
||||
}
|
||||
|
||||
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -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")) {
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -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() {
|
||||
|
@ -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;
|
||||
|
@ -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);
|
||||
}
|
||||
|
@ -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;
|
||||
|
@ -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;
|
||||
|
@ -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;
|
||||
|
@ -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());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -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;
|
||||
|
@ -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 + '}';
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -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
|
||||
*/
|
||||
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
@ -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;
|
||||
|
@ -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;
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -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";
|
||||
}
|
||||
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -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;
|
||||
|
@ -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;
|
||||
|
@ -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();
|
||||
|
||||
|
@ -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;
|
||||
}
|
||||
|
||||
|
@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -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) {
|
||||
|
@ -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()) {
|
||||
|
@ -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()) {
|
||||
|
@ -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) {
|
||||
|
@ -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)) {
|
||||
|
@ -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) {
|
||||
|
@ -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)) {
|
||||
|
@ -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;
|
||||
}
|
||||
|
||||
|
@ -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;
|
||||
|
@ -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)
|
||||
|
Loading…
Reference in New Issue
Block a user