From 73796fb917048631235f2b0e07fbe5aabab3ccba Mon Sep 17 00:00:00 2001 From: Michael Geramb Date: Thu, 18 Jul 2019 14:42:23 +0200 Subject: [PATCH] [amazonechocontrol] Fix for Announcment Channel Signed-off-by: Michael Geramb (github: mgeramb) --- .../internal/Connection.java | 36 +++++++++++++++++++ .../internal/jsons/JsonNetworkDetails.java | 26 ++++++++++++++ 2 files changed, 62 insertions(+) create mode 100644 bundles/org.openhab.binding.amazonechocontrol/src/main/java/org/openhab/binding/amazonechocontrol/internal/jsons/JsonNetworkDetails.java diff --git a/bundles/org.openhab.binding.amazonechocontrol/src/main/java/org/openhab/binding/amazonechocontrol/internal/Connection.java b/bundles/org.openhab.binding.amazonechocontrol/src/main/java/org/openhab/binding/amazonechocontrol/internal/Connection.java index 56532486d8a9a..60e4faeeb41b8 100755 --- a/bundles/org.openhab.binding.amazonechocontrol/src/main/java/org/openhab/binding/amazonechocontrol/internal/Connection.java +++ b/bundles/org.openhab.binding.amazonechocontrol/src/main/java/org/openhab/binding/amazonechocontrol/internal/Connection.java @@ -86,6 +86,7 @@ import org.openhab.binding.amazonechocontrol.internal.jsons.JsonFeed; import org.openhab.binding.amazonechocontrol.internal.jsons.JsonMediaState; import org.openhab.binding.amazonechocontrol.internal.jsons.JsonMusicProvider; +import org.openhab.binding.amazonechocontrol.internal.jsons.JsonNetworkDetails; import org.openhab.binding.amazonechocontrol.internal.jsons.JsonNotificationRequest; import org.openhab.binding.amazonechocontrol.internal.jsons.JsonNotificationResponse; import org.openhab.binding.amazonechocontrol.internal.jsons.JsonNotificationSound; @@ -925,7 +926,42 @@ public WakeWord[] getWakeWords() { return new WakeWord[0]; } + private List getSmarthomeDeviceListX() throws IOException, URISyntaxException { + try { + String json = makeRequestAndReturnString(alexaServer + "/api/phoenix"); + logger.debug("getSmartHomeDevices result: {}", json); + + JsonNetworkDetails networkDetails = parseJson(json, JsonNetworkDetails.class); + Object jsonObject = gson.fromJson(networkDetails.networkDetail, Object.class); + List result = new ArrayList<>(); + searchSmartHomeDevicesRecursive(jsonObject, result); + return result; + } catch (Exception e) { + logger.warn("getSmartHomeDevices fails: {}", e.getMessage()); + throw e; + } + } + + private void searchSmartHomeDevicesRecursive(@Nullable Object jsonNode, List result) { + if (jsonNode instanceof Map) { + @SuppressWarnings("rawtypes") + Map map = (Map) jsonNode; + if (map.containsKey("entityId") && map.containsKey("friendlyName") && map.containsKey("actions")) { + // device node found, create type element and add it to the results + JsonElement element = gson.toJsonTree(jsonNode); + result.add(element.toString()); + } else { + for (Object key : map.keySet()) { + Object value = map.get(key); + searchSmartHomeDevicesRecursive(value, result); + } + } + } + } + public List getSmarthomeDeviceList() throws IOException, URISyntaxException { + List test = getSmarthomeDeviceListX(); + JsonObject json = new JsonParser().parse(getSmarthomeDeviceListJson()).getAsJsonObject(); JsonObject smartHomeDevices = json.get("networkDetail").getAsJsonObject().get("locationDetails") .getAsJsonObject().get("locationDetails").getAsJsonObject().get("Default_Location").getAsJsonObject() diff --git a/bundles/org.openhab.binding.amazonechocontrol/src/main/java/org/openhab/binding/amazonechocontrol/internal/jsons/JsonNetworkDetails.java b/bundles/org.openhab.binding.amazonechocontrol/src/main/java/org/openhab/binding/amazonechocontrol/internal/jsons/JsonNetworkDetails.java new file mode 100644 index 0000000000000..8c3f0ce5f0c76 --- /dev/null +++ b/bundles/org.openhab.binding.amazonechocontrol/src/main/java/org/openhab/binding/amazonechocontrol/internal/jsons/JsonNetworkDetails.java @@ -0,0 +1,26 @@ +/** + * Copyright (c) 2010-2019 Contributors to the openHAB project + * + * See the NOTICE file(s) distributed with this work for additional + * information. + * + * This program and the accompanying materials are made available under the + * terms of the Eclipse Public License 2.0 which is available at + * http://www.eclipse.org/legal/epl-2.0 + * + * SPDX-License-Identifier: EPL-2.0 + */ +package org.openhab.binding.amazonechocontrol.internal.jsons; + +import org.eclipse.jdt.annotation.NonNullByDefault; +import org.eclipse.jdt.annotation.Nullable; + +/** + * The {@link JsonNetworkDetails} encapsulate the GSON data of a network query + * + * @author Michael Geramb - Initial contribution + */ +@NonNullByDefault +public class JsonNetworkDetails { + public @Nullable String networkDetail; +}