Skip to content

Commit

Permalink
Simplify getWemoURL usages in handlers (openhab#12397)
Browse files Browse the repository at this point in the history
Signed-off-by: Jacob Laursen <jacob-github@vindvejr.dk>
Signed-off-by: Andras Uhrin <andras.uhrin@gmail.com>
  • Loading branch information
jlaur authored and andrasU committed Nov 12, 2022
1 parent 3f484e7 commit 002a125
Show file tree
Hide file tree
Showing 9 changed files with 61 additions and 192 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -125,19 +125,6 @@ public static String unescapeXml(final String xml) {
return unescapedOutput.toString();
}

public static @Nullable String getWemoURL(String host, String actionService) {
int portCheckStart = 49151;
int portCheckStop = 49157;
String port = null;
for (int i = portCheckStart; i < portCheckStop; i++) {
if (serviceAvailableFunction.apply(host, i)) {
port = String.valueOf(i);
break;
}
}
return port == null ? null : "http://" + host + ":" + port + "/upnp/control/" + actionService + "1";
}

private static boolean servicePing(String host, int port) {
try {
HttpUtil.executeUrl("GET", "http://" + host + ":" + port, 250);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,11 +22,14 @@
import org.eclipse.jdt.annotation.NonNullByDefault;
import org.eclipse.jdt.annotation.Nullable;
import org.openhab.binding.wemo.internal.WemoBindingConstants;
import org.openhab.binding.wemo.internal.WemoUtil;
import org.openhab.binding.wemo.internal.http.WemoHttpCall;
import org.openhab.core.io.transport.upnp.UpnpIOParticipant;
import org.openhab.core.io.transport.upnp.UpnpIOService;
import org.openhab.core.thing.ChannelUID;
import org.openhab.core.thing.Thing;
import org.openhab.core.thing.ThingStatus;
import org.openhab.core.thing.ThingStatusDetail;
import org.openhab.core.thing.binding.BaseThingHandler;
import org.openhab.core.types.Command;
import org.slf4j.Logger;
Expand All @@ -48,8 +51,8 @@ public abstract class WemoBaseThingHandler extends BaseThingHandler implements U

protected @Nullable UpnpIOService service;
protected WemoHttpCall wemoHttpCaller;
protected String host = "";

private @Nullable String host;
private Map<String, Instant> subscriptions = new ConcurrentHashMap<String, Instant>();
private @Nullable ScheduledFuture<?> subscriptionRenewalJob;

Expand All @@ -65,6 +68,7 @@ public void initialize() {
if (service != null) {
logger.debug("Registering UPnP participant for {}", getThing().getUID());
service.registerParticipant(this);
initializeHost();
}
}

Expand Down Expand Up @@ -223,18 +227,50 @@ private void removeSubscriptions() {
subscriptions.clear();
}

protected String getHost() {
String localHost = host;
if (!localHost.isEmpty()) {
return localHost;
public @Nullable String getWemoURL(String actionService) {
String host = getHost();
if (host == null) {
updateStatus(ThingStatus.OFFLINE, ThingStatusDetail.COMMUNICATION_ERROR,
"@text/config-status.error.missing-ip");
return null;
}
UpnpIOService localService = service;
if (localService != null) {
URL descriptorURL = localService.getDescriptorURL(this);
int portCheckStart = 49151;
int portCheckStop = 49157;
String port = null;
for (int i = portCheckStart; i < portCheckStop; i++) {
if (WemoUtil.serviceAvailableFunction.apply(host, i)) {
port = String.valueOf(i);
break;
}
}
if (port == null) {
updateStatus(ThingStatus.OFFLINE, ThingStatusDetail.COMMUNICATION_ERROR,
"@text/config-status.error.missing-url");
return null;
}
return "http://" + host + ":" + port + "/upnp/control/" + actionService + "1";
}

private @Nullable String getHost() {
if (host != null) {
return host;
}
initializeHost();
return host;
}

private void initializeHost() {
host = getHostFromService();
}

private @Nullable String getHostFromService() {
UpnpIOService service = this.service;
if (service != null) {
URL descriptorURL = service.getDescriptorURL(this);
if (descriptorURL != null) {
return descriptorURL.getHost();
}
}
return "";
return null;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -83,7 +83,6 @@ public void initialize() {
if (configuration.get(UDN) != null) {
logger.debug("Initializing WemoCoffeeHandler for UDN '{}'", configuration.get(UDN));
addSubscription(DEVICEEVENT);
host = getHost();
pollingJob = scheduler.scheduleWithFixedDelay(this::poll, 0, DEFAULT_REFRESH_INTERVAL_SECONDS,
TimeUnit.SECONDS);
updateStatus(ThingStatus.ONLINE);
Expand Down Expand Up @@ -113,7 +112,6 @@ private void poll() {
try {
logger.debug("Polling job");

host = getHost();
// Check if the Wemo device is set in the UPnP service registry
// If not, set the thing state to ONLINE/CONFIG-PENDING and wait for the next poll
if (!isUpnpDeviceRegistered()) {
Expand All @@ -131,20 +129,10 @@ private void poll() {

@Override
public void handleCommand(ChannelUID channelUID, Command command) {
String localHost = getHost();
if (localHost.isEmpty()) {
logger.warn("Failed to send command '{}' for device '{}': IP address missing", command,
getThing().getUID());
updateStatus(ThingStatus.OFFLINE, ThingStatusDetail.COMMUNICATION_ERROR,
"@text/config-status.error.missing-ip");
return;
}
String wemoURL = getWemoURL(localHost, BASICACTION);
String wemoURL = getWemoURL(BASICACTION);
if (wemoURL == null) {
logger.debug("Failed to send command '{}' for device '{}': URL cannot be created", command,
getThing().getUID());
updateStatus(ThingStatus.OFFLINE, ThingStatusDetail.COMMUNICATION_ERROR,
"@text/config-status.error.missing-url");
return;
}
if (command instanceof RefreshType) {
Expand Down Expand Up @@ -198,19 +186,10 @@ public void onValueReceived(@Nullable String variable, @Nullable String value, @
* The {@link updateWemoState} polls the actual state of a WeMo CoffeeMaker.
*/
protected void updateWemoState() {
String localHost = getHost();
if (localHost.isEmpty()) {
logger.warn("Failed to get actual state for device '{}': IP address missing", getThing().getUID());
updateStatus(ThingStatus.OFFLINE, ThingStatusDetail.COMMUNICATION_ERROR,
"@text/config-status.error.missing-ip");
return;
}
String actionService = DEVICEACTION;
String wemoURL = getWemoURL(host, actionService);
String wemoURL = getWemoURL(actionService);
if (wemoURL == null) {
logger.debug("Failed to get actual state for device '{}': URL cannot be created", getThing().getUID());
updateStatus(ThingStatus.OFFLINE, ThingStatusDetail.COMMUNICATION_ERROR,
"@text/config-status.error.missing-url");
return;
}
try {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -74,7 +74,6 @@ public void initialize() {
if (configuration.get(UDN) != null) {
logger.debug("Initializing WemoCrockpotHandler for UDN '{}'", configuration.get(UDN));
addSubscription(BASICEVENT);
host = getHost();
pollingJob = scheduler.scheduleWithFixedDelay(this::poll, 0, DEFAULT_REFRESH_INTERVAL_SECONDS,
TimeUnit.SECONDS);
updateStatus(ThingStatus.ONLINE);
Expand Down Expand Up @@ -103,7 +102,6 @@ private void poll() {
}
try {
logger.debug("Polling job");
host = getHost();
// Check if the Wemo device is set in the UPnP service registry
// If not, set the thing state to ONLINE/CONFIG-PENDING and wait for the next poll
if (!isUpnpDeviceRegistered()) {
Expand All @@ -121,20 +119,10 @@ private void poll() {

@Override
public void handleCommand(ChannelUID channelUID, Command command) {
String localHost = getHost();
if (localHost.isEmpty()) {
logger.warn("Failed to send command '{}' for device '{}': IP address missing", command,
getThing().getUID());
updateStatus(ThingStatus.OFFLINE, ThingStatusDetail.COMMUNICATION_ERROR,
"@text/config-status.error.missing-ip");
return;
}
String wemoURL = getWemoURL(localHost, BASICACTION);
String wemoURL = getWemoURL(BASICACTION);
if (wemoURL == null) {
logger.debug("Failed to send command '{}' for device '{}': URL cannot be created", command,
getThing().getUID());
updateStatus(ThingStatus.OFFLINE, ThingStatusDetail.COMMUNICATION_ERROR,
"@text/config-status.error.missing-url");
return;
}
String mode = "0";
Expand Down Expand Up @@ -192,19 +180,10 @@ public void onValueReceived(@Nullable String variable, @Nullable String value, @
*
*/
protected void updateWemoState() {
String localHost = getHost();
if (localHost.isEmpty()) {
logger.warn("Failed to get actual state for device '{}': IP address missing", getThing().getUID());
updateStatus(ThingStatus.OFFLINE, ThingStatusDetail.COMMUNICATION_ERROR,
"@text/config-status.error.missing-ip");
return;
}
String actionService = BASICEVENT;
String wemoURL = getWemoURL(localHost, actionService);
String wemoURL = getWemoURL(actionService);
if (wemoURL == null) {
logger.warn("Failed to get actual state for device '{}': URL cannot be created", getThing().getUID());
updateStatus(ThingStatus.OFFLINE, ThingStatusDetail.COMMUNICATION_ERROR,
"@text/config-status.error.missing-url");
return;
}
try {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -87,7 +87,6 @@ public void initialize() {
if (configuration.get(UDN) != null) {
logger.debug("Initializing WemoDimmerHandler for UDN '{}'", configuration.get(UDN));
addSubscription(BASICEVENT);
host = getHost();
pollingJob = scheduler.scheduleWithFixedDelay(this::poll, 0, DEFAULT_REFRESH_INTERVAL_SECONDS,
TimeUnit.SECONDS);
updateStatus(ThingStatus.ONLINE);
Expand Down Expand Up @@ -117,7 +116,6 @@ private void poll() {
}
try {
logger.debug("Polling job");
host = getHost();
// Check if the Wemo device is set in the UPnP service registry
// If not, set the thing state to ONLINE/CONFIG-PENDING and wait for the next poll
if (!isUpnpDeviceRegistered()) {
Expand Down Expand Up @@ -418,18 +416,9 @@ public void onValueReceived(@Nullable String variable, @Nullable String value, @
*
*/
protected void updateWemoState() {
String localHost = getHost();
if (localHost.isEmpty()) {
logger.warn("Failed to get actual state for device '{}': IP address missing", getThing().getUID());
updateStatus(ThingStatus.OFFLINE, ThingStatusDetail.COMMUNICATION_ERROR,
"@text/config-status.error.missing-ip");
return;
}
String wemoURL = getWemoURL(localHost, BASICACTION);
String wemoURL = getWemoURL(BASICACTION);
if (wemoURL == null) {
logger.debug("Failed to get actual state for device '{}': URL cannot be created", getThing().getUID());
updateStatus(ThingStatus.OFFLINE, ThingStatusDetail.COMMUNICATION_ERROR,
"@text/config-status.error.missing-url");
return;
}
String action = "GetBinaryState";
Expand Down Expand Up @@ -496,18 +485,9 @@ protected void updateWemoState() {
}

public void setBinaryState(String action, String argument, String value) {
String localHost = getHost();
if (localHost.isEmpty()) {
logger.warn("Failed to set binary state for device '{}': IP address missing", getThing().getUID());
updateStatus(ThingStatus.OFFLINE, ThingStatusDetail.COMMUNICATION_ERROR,
"@text/config-status.error.missing-ip");
return;
}
String wemoURL = getWemoURL(localHost, BASICACTION);
String wemoURL = getWemoURL(BASICACTION);
if (wemoURL == null) {
logger.debug("Failed to set binary state for device '{}': URL cannot be created", getThing().getUID());
updateStatus(ThingStatus.OFFLINE, ThingStatusDetail.COMMUNICATION_ERROR,
"@text/config-status.error.missing-url");
return;
}
try {
Expand All @@ -527,18 +507,9 @@ public void setBinaryState(String action, String argument, String value) {
}

public void setTimerStart(String action, String argument, String value) {
String localHost = getHost();
if (localHost.isEmpty()) {
logger.warn("Failed to set timerStart for device '{}': IP address missing", getThing().getUID());
updateStatus(ThingStatus.OFFLINE, ThingStatusDetail.COMMUNICATION_ERROR,
"@text/config-status.error.missing-ip");
return;
}
String wemoURL = getWemoURL(localHost, BASICACTION);
String wemoURL = getWemoURL(BASICACTION);
if (wemoURL == null) {
logger.warn("Failed to set timerStart for device '{}': URL cannot be created", getThing().getUID());
updateStatus(ThingStatus.OFFLINE, ThingStatusDetail.COMMUNICATION_ERROR,
"@text/config-status.error.missing-url");
return;
}
try {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,7 @@
* @author Stefan Bußweiler - Added new thing status handling
* @author Erdoan Hadzhiyusein - Adapted the class to work with the new DateTimeType
* @author Mihir Patil - Added standby switch
* @author Jacob Laursen - Refactoring
*/
@NonNullByDefault
public abstract class WemoHandler extends WemoBaseThingHandler {
Expand Down Expand Up @@ -69,7 +70,6 @@ public void initialize() {
if (THING_TYPE_INSIGHT.equals(thing.getThingTypeUID())) {
addSubscription(INSIGHTEVENT);
}
host = getHost();
pollingJob = scheduler.scheduleWithFixedDelay(this::poll, 0, DEFAULT_REFRESH_INTERVAL_SECONDS,
TimeUnit.SECONDS);
updateStatus(ThingStatus.ONLINE);
Expand Down Expand Up @@ -99,7 +99,6 @@ private void poll() {
}
try {
logger.debug("Polling job");
host = getHost();
// Check if the Wemo device is set in the UPnP service registry
// If not, set the thing state to ONLINE/CONFIG-PENDING and wait for the next poll
if (!isUpnpDeviceRegistered()) {
Expand All @@ -117,20 +116,10 @@ private void poll() {

@Override
public void handleCommand(ChannelUID channelUID, Command command) {
String localHost = getHost();
if (localHost.isEmpty()) {
logger.warn("Failed to send command '{}' for device '{}': IP address missing", command,
getThing().getUID());
updateStatus(ThingStatus.OFFLINE, ThingStatusDetail.COMMUNICATION_ERROR,
"@text/config-status.error.missing-ip");
return;
}
String wemoURL = getWemoURL(localHost, BASICACTION);
String wemoURL = getWemoURL(BASICACTION);
if (wemoURL == null) {
logger.debug("Failed to send command '{}' for device '{}': URL cannot be created", command,
getThing().getUID());
updateStatus(ThingStatus.OFFLINE, ThingStatusDetail.COMMUNICATION_ERROR,
"@text/config-status.error.missing-url");
return;
}
if (command instanceof RefreshType) {
Expand Down Expand Up @@ -163,13 +152,6 @@ public void handleCommand(ChannelUID channelUID, Command command) {
*/
protected void updateWemoState() {
String actionService = BASICACTION;
String localhost = getHost();
if (localhost.isEmpty()) {
logger.warn("Failed to get actual state for device '{}': IP address missing", getThing().getUID());
updateStatus(ThingStatus.OFFLINE, ThingStatusDetail.COMMUNICATION_ERROR,
"@text/config-status.error.missing-ip");
return;
}
String action = "GetBinaryState";
String variable = "BinaryState";
String value = null;
Expand All @@ -178,11 +160,9 @@ protected void updateWemoState() {
variable = "InsightParams";
actionService = INSIGHTACTION;
}
String wemoURL = getWemoURL(localhost, actionService);
String wemoURL = getWemoURL(actionService);
if (wemoURL == null) {
logger.debug("Failed to get actual state for device '{}': URL cannot be created", getThing().getUID());
updateStatus(ThingStatus.OFFLINE, ThingStatusDetail.COMMUNICATION_ERROR,
"@text/config-status.error.missing-url");
return;
}
String soapHeader = "\"urn:Belkin:service:" + actionService + ":1#" + action + "\"";
Expand Down
Loading

0 comments on commit 002a125

Please sign in to comment.