// Hub properties
public static final String PROPERTY_FIRMWARE_NAME = "firmwareName";
public static final String PROPERTY_RADIO_FIRMWARE_VERSION = "radioFirmwareVersion";
+ public static final String PROPERTY_HUB_NAME = "hubName";
// Shade properties
public static final String PROPERTY_SHADE_TYPE = "type";
import org.eclipse.jetty.http.HttpMethod;
import org.eclipse.jetty.http.HttpStatus;
import org.openhab.binding.hdpowerview.internal.api.Color;
+import org.openhab.binding.hdpowerview.internal.api.HubFirmware;
import org.openhab.binding.hdpowerview.internal.api.ShadePosition;
import org.openhab.binding.hdpowerview.internal.api.SurveyData;
+import org.openhab.binding.hdpowerview.internal.api.UserData;
import org.openhab.binding.hdpowerview.internal.api.requests.RepeaterBlinking;
import org.openhab.binding.hdpowerview.internal.api.requests.RepeaterColor;
import org.openhab.binding.hdpowerview.internal.api.requests.ShadeCalibrate;
import org.openhab.binding.hdpowerview.internal.api.requests.ShadeMove;
import org.openhab.binding.hdpowerview.internal.api.requests.ShadeStop;
import org.openhab.binding.hdpowerview.internal.api.responses.FirmwareVersion;
-import org.openhab.binding.hdpowerview.internal.api.responses.FirmwareVersions;
import org.openhab.binding.hdpowerview.internal.api.responses.Repeater;
import org.openhab.binding.hdpowerview.internal.api.responses.RepeaterData;
import org.openhab.binding.hdpowerview.internal.api.responses.Repeaters;
import org.openhab.binding.hdpowerview.internal.api.responses.Shades;
import org.openhab.binding.hdpowerview.internal.api.responses.Shades.ShadeData;
import org.openhab.binding.hdpowerview.internal.api.responses.Survey;
+import org.openhab.binding.hdpowerview.internal.api.responses.UserDataResponse;
import org.openhab.binding.hdpowerview.internal.exceptions.HubInvalidResponseException;
import org.openhab.binding.hdpowerview.internal.exceptions.HubMaintenanceException;
import org.openhab.binding.hdpowerview.internal.exceptions.HubProcessingException;
private final String sceneCollections;
private final String scheduledEvents;
private final String repeaters;
+ private final String userData;
private final Gson gson = new Gson();
private final HttpClient httpClient;
public HDPowerViewWebTargets(HttpClient httpClient, String ipAddress) {
base = "http://" + ipAddress + "/api/";
shades = base + "shades/";
- firmwareVersion = base + "fwversion/";
+ firmwareVersion = base + "fwversion";
sceneActivate = base + "scenes";
scenes = base + "scenes/";
sceneCollections = base + "scenecollections/";
scheduledEvents = base + "scheduledevents";
-
repeaters = base + "repeaters/";
+ userData = base + "userdata";
this.httpClient = httpClient;
}
* @throws HubProcessingException if there is any processing error
* @throws HubMaintenanceException if the hub is down for maintenance
*/
- public FirmwareVersions getFirmwareVersions()
+ public HubFirmware getFirmwareVersions()
throws HubInvalidResponseException, HubProcessingException, HubMaintenanceException {
String json = invoke(HttpMethod.GET, firmwareVersion, null, null);
try {
if (firmwareVersion == null) {
throw new HubInvalidResponseException("Missing firmware response");
}
- FirmwareVersions firmwareVersions = firmwareVersion.firmware;
+ HubFirmware firmwareVersions = firmwareVersion.firmware;
if (firmwareVersions == null) {
throw new HubInvalidResponseException("Missing 'firmware' element");
}
}
}
+ /**
+ * Fetches a JSON package with user data information for the hub.
+ *
+ * @return {@link UserData} class instance
+ * @throws HubInvalidResponseException if response is invalid
+ * @throws HubProcessingException if there is any processing error
+ * @throws HubMaintenanceException if the hub is down for maintenance
+ */
+ public UserData getUserData() throws HubInvalidResponseException, HubProcessingException, HubMaintenanceException {
+ String json = invoke(HttpMethod.GET, userData, null, null);
+ try {
+ UserDataResponse userDataResponse = gson.fromJson(json, UserDataResponse.class);
+ if (userDataResponse == null) {
+ throw new HubInvalidResponseException("Missing userData response");
+ }
+ UserData userData = userDataResponse.userData;
+ if (userData == null) {
+ throw new HubInvalidResponseException("Missing 'userData' element");
+ }
+ return userData;
+ } catch (JsonParseException e) {
+ throw new HubInvalidResponseException("Error parsing userData response", e);
+ }
+ }
+
/**
* Fetches a JSON package that describes all shades in the hub, and wraps it in
* a Shades class instance
--- /dev/null
+/**
+ * Copyright (c) 2010-2022 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.hdpowerview.internal.api;
+
+import org.eclipse.jdt.annotation.NonNullByDefault;
+import org.eclipse.jdt.annotation.Nullable;
+
+/**
+ * Firmware information for an HD PowerView hub
+ *
+ * @author Jacob Laursen - Initial contribution
+ */
+@NonNullByDefault
+public class HubFirmware {
+ @Nullable
+ public Firmware mainProcessor;
+ @Nullable
+ public Firmware radio;
+}
--- /dev/null
+/**
+ * Copyright (c) 2010-2022 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.hdpowerview.internal.api;
+
+import org.eclipse.jdt.annotation.NonNullByDefault;
+import org.eclipse.jdt.annotation.Nullable;
+
+/**
+ * Times as part of {@link UserData} for an HD PowerView hub
+ *
+ * @author Jacob Laursen - Initial contribution
+ */
+@NonNullByDefault
+public class Times {
+ public @Nullable String timezone;
+ public int localSunriseTimeInMinutes;
+ public int localSunsetTimeInMinutes;
+ public int currentOffset;
+ public double longitude;
+ public double latitude;
+}
--- /dev/null
+/**
+ * Copyright (c) 2010-2022 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.hdpowerview.internal.api;
+
+import java.util.Base64;
+
+import org.eclipse.jdt.annotation.NonNullByDefault;
+import org.eclipse.jdt.annotation.Nullable;
+
+import com.google.gson.annotations.SerializedName;
+
+/**
+ * User data for an HD PowerView hub
+ *
+ * @author Jacob Laursen - Initial contribution
+ */
+@NonNullByDefault
+public class UserData {
+ public @Nullable String hubName;
+ public boolean localTimeDataSet;
+ public boolean enableScheduledEvents;
+ public boolean editingEnabled;
+ public boolean setupCompleted;
+ public @Nullable String gateway;
+ public @Nullable String dns;
+ public boolean staticIp;
+ @SerializedName("_id")
+ public @Nullable String id;
+ public @Nullable Color color;
+ public boolean autoBackup;
+ public @Nullable String ip;
+ public @Nullable String macAddress;
+ public @Nullable String mask;
+ public boolean wireless;
+ public @Nullable HubFirmware firmware;
+ public @Nullable String serialNumber;
+ public @Nullable String rfIDInt;
+ public @Nullable String rfID;
+ public int rfStatus;
+ public @Nullable Times times;
+ public @Nullable String brand;
+ public boolean rcUp;
+ public boolean remoteConnectEnabled;
+
+ public String getHubName() {
+ return hubName != null ? new String(Base64.getDecoder().decode(hubName)) : "";
+ }
+}
import org.eclipse.jdt.annotation.NonNullByDefault;
import org.eclipse.jdt.annotation.Nullable;
+import org.openhab.binding.hdpowerview.internal.api.HubFirmware;
/**
* Firmware information for an HD PowerView hub
@NonNullByDefault
public class FirmwareVersion {
@Nullable
- public FirmwareVersions firmware;
+ public HubFirmware firmware;
}
+++ /dev/null
-/**
- * Copyright (c) 2010-2022 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.hdpowerview.internal.api.responses;
-
-import org.eclipse.jdt.annotation.NonNullByDefault;
-import org.eclipse.jdt.annotation.Nullable;
-import org.openhab.binding.hdpowerview.internal.api.Firmware;
-
-/**
- * Firmware information for an HD PowerView hub
- *
- * @author Jacob Laursen - Initial contribution
- */
-@NonNullByDefault
-public class FirmwareVersions {
- @Nullable
- public Firmware mainProcessor;
- @Nullable
- public Firmware radio;
-}
--- /dev/null
+/**
+ * Copyright (c) 2010-2022 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.hdpowerview.internal.api.responses;
+
+import org.eclipse.jdt.annotation.NonNullByDefault;
+import org.eclipse.jdt.annotation.Nullable;
+import org.openhab.binding.hdpowerview.internal.api.UserData;
+
+/**
+ * Response with {@link UserData} for an HD PowerView hub
+ *
+ * @author Jacob Laursen - Initial contribution
+ */
+@NonNullByDefault
+public class UserDataResponse {
+ public @Nullable UserData userData;
+}
import org.openhab.binding.hdpowerview.internal.HDPowerViewTranslationProvider;
import org.openhab.binding.hdpowerview.internal.HDPowerViewWebTargets;
import org.openhab.binding.hdpowerview.internal.api.Firmware;
-import org.openhab.binding.hdpowerview.internal.api.responses.FirmwareVersions;
+import org.openhab.binding.hdpowerview.internal.api.HubFirmware;
+import org.openhab.binding.hdpowerview.internal.api.UserData;
import org.openhab.binding.hdpowerview.internal.api.responses.SceneCollections;
import org.openhab.binding.hdpowerview.internal.api.responses.SceneCollections.SceneCollection;
import org.openhab.binding.hdpowerview.internal.api.responses.Scenes;
private List<Scene> sceneCache = new CopyOnWriteArrayList<>();
private List<SceneCollection> sceneCollectionCache = new CopyOnWriteArrayList<>();
private List<ScheduledEvent> scheduledEventCache = new CopyOnWriteArrayList<>();
- private Instant firmwareVersionsUpdated = Instant.MIN;
+ private Instant UserDataUpdated = Instant.MIN;
private Boolean deprecatedChannelsCreated = false;
private final ChannelTypeUID sceneChannelTypeUID = new ChannelTypeUID(HDPowerViewBindingConstants.BINDING_ID,
}
} catch (HubMaintenanceException e) {
// exceptions are logged in HDPowerViewWebTargets
- firmwareVersionsUpdated = Instant.MIN;
+ UserDataUpdated = Instant.MIN;
} catch (NumberFormatException | HubException e) {
logger.debug("Unexpected error {}", e.getMessage());
}
hardRefreshPositionInterval = config.hardRefresh;
hardRefreshBatteryLevelInterval = config.hardRefreshBatteryLevel;
initializeChannels();
- firmwareVersionsUpdated = Instant.MIN;
+ UserDataUpdated = Instant.MIN;
updateStatus(ThingStatus.UNKNOWN);
schedulePoll();
private synchronized void poll() {
try {
- updateFirmwareProperties();
+ updateUserDataProperties();
} catch (HubException e) {
logger.warn("Failed to update firmware properties: {}", e.getMessage());
}
}
} catch (HubMaintenanceException e) {
// exceptions are logged in HDPowerViewWebTargets
- firmwareVersionsUpdated = Instant.MIN;
+ UserDataUpdated = Instant.MIN;
} catch (HubException e) {
logger.warn("Error connecting to bridge: {}", e.getMessage());
updateStatus(ThingStatus.OFFLINE, ThingStatusDetail.COMMUNICATION_ERROR, e.getMessage());
- firmwareVersionsUpdated = Instant.MIN;
+ UserDataUpdated = Instant.MIN;
}
}
- private void updateFirmwareProperties()
+ private void updateUserDataProperties()
throws HubInvalidResponseException, HubProcessingException, HubMaintenanceException {
- if (firmwareVersionsUpdated.isAfter(Instant.now().minus(firmwareVersionValidityPeriod))) {
+ if (UserDataUpdated.isAfter(Instant.now().minus(firmwareVersionValidityPeriod))) {
return;
}
- FirmwareVersions firmwareVersions = webTargets.getFirmwareVersions();
+
+ UserData userData = webTargets.getUserData();
+ Map<String, String> properties = editProperties();
+ HubFirmware firmwareVersions = userData.firmware;
+ if (firmwareVersions != null) {
+ updateFirmwareProperties(properties, firmwareVersions);
+ }
+ String serialNumber = userData.serialNumber;
+ if (serialNumber != null) {
+ properties.put(Thing.PROPERTY_SERIAL_NUMBER, serialNumber);
+ }
+ String macAddress = userData.macAddress;
+ if (macAddress != null) {
+ properties.put(Thing.PROPERTY_MAC_ADDRESS, macAddress);
+ }
+ String hubName = userData.getHubName();
+ if (!hubName.isEmpty()) {
+ properties.put(HDPowerViewBindingConstants.PROPERTY_HUB_NAME, hubName);
+ }
+ updateProperties(properties);
+ UserDataUpdated = Instant.now();
+ }
+
+ private void updateFirmwareProperties(Map<String, String> properties, HubFirmware firmwareVersions) {
Firmware mainProcessor = firmwareVersions.mainProcessor;
if (mainProcessor == null) {
logger.warn("Main processor firmware version missing in response.");
return;
}
logger.debug("Main processor firmware version received: {}, {}", mainProcessor.name, mainProcessor.toString());
- Map<String, String> properties = editProperties();
String mainProcessorName = mainProcessor.name;
if (mainProcessorName != null) {
properties.put(HDPowerViewBindingConstants.PROPERTY_FIRMWARE_NAME, mainProcessorName);
logger.debug("Radio firmware version received: {}", radio.toString());
properties.put(HDPowerViewBindingConstants.PROPERTY_RADIO_FIRMWARE_VERSION, radio.toString());
}
- updateProperties(properties);
- firmwareVersionsUpdated = Instant.now();
}
private void pollShades() throws HubInvalidResponseException, HubProcessingException, HubMaintenanceException {