Add console extension for showing IDs (#13615)

Fixes #13614

Signed-off-by: Jacob Laursen <jacob-github@vindvejr.dk>
This commit is contained in:
Jacob Laursen 2022-10-28 19:11:24 +02:00 committed by GitHub
parent a84d170192
commit af4657f3db
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 114 additions and 2 deletions

View File

@ -53,8 +53,8 @@ If in the future, you add additional shades, repeaters, scenes, scene groups or
### Thing Configuration for PowerView Shades and Accessories ### Thing Configuration for PowerView Shades and Accessories
PowerView shades and repeaters should preferably be configured via the automatic discovery process. PowerView shades and repeaters should preferably be configured via the automatic discovery process.
It is quite difficult to configure manually as the `id` of the shade or repeater is not exposed in the However, for manual configuration of shades and repeaters, the console command `openhab:hdpowerview showIds` can be used to identify the IDs of all connected equipment.
PowerView app. However, the configuration parameters are described below. This can be used for the `id` parameters described below.
#### Thing Configuration for PowerView Shades #### Thing Configuration for PowerView Shades
@ -103,6 +103,7 @@ All of these channels appear in the binding, but only those which have a physica
| repeaterRssi | Number:Power | Received Signal Strength Indicator for Repeater | | repeaterRssi | Number:Power | Received Signal Strength Indicator for Repeater |
Notes: Notes:
- The channels `position`, `secondary` and `vane` exist if the shade physically supports such channels. - The channels `position`, `secondary` and `vane` exist if the shade physically supports such channels.
- The shade's Power Option is set via the PowerView app with possible values 'Battery Wand', 'Rechargeable Battery Wand' or 'Hardwired Power Supply'. - The shade's Power Option is set via the PowerView app with possible values 'Battery Wand', 'Rechargeable Battery Wand' or 'Hardwired Power Supply'.
The channels `lowBattery` and `batteryLevel` exist if you have _not_ selected 'Hardwired Power Supply' in the app. The channels `lowBattery` and `batteryLevel` exist if you have _not_ selected 'Hardwired Power Supply' in the app.

View File

@ -0,0 +1,111 @@
/**
* 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.console;
import java.util.Arrays;
import java.util.List;
import org.eclipse.jdt.annotation.NonNullByDefault;
import org.eclipse.jdt.annotation.Nullable;
import org.openhab.binding.hdpowerview.internal.HDPowerViewBindingConstants;
import org.openhab.binding.hdpowerview.internal.HDPowerViewWebTargets;
import org.openhab.binding.hdpowerview.internal.api.responses.RepeaterData;
import org.openhab.binding.hdpowerview.internal.api.responses.Shades.ShadeData;
import org.openhab.binding.hdpowerview.internal.exceptions.HubException;
import org.openhab.binding.hdpowerview.internal.handler.HDPowerViewHubHandler;
import org.openhab.core.io.console.Console;
import org.openhab.core.io.console.ConsoleCommandCompleter;
import org.openhab.core.io.console.StringsCompleter;
import org.openhab.core.io.console.extensions.AbstractConsoleCommandExtension;
import org.openhab.core.io.console.extensions.ConsoleCommandExtension;
import org.openhab.core.thing.Thing;
import org.openhab.core.thing.ThingRegistry;
import org.openhab.core.thing.binding.ThingHandler;
import org.osgi.service.component.annotations.Activate;
import org.osgi.service.component.annotations.Component;
import org.osgi.service.component.annotations.Reference;
/**
* The {@link HDPowerViewCommandExtension} is responsible for handling console commands
*
* @author Jacob Laursen - Initial contribution
*/
@NonNullByDefault
@Component(service = ConsoleCommandExtension.class)
public class HDPowerViewCommandExtension extends AbstractConsoleCommandExtension implements ConsoleCommandCompleter {
private static final String SHOW_IDS = "showIds";
private static final StringsCompleter SUBCMD_COMPLETER = new StringsCompleter(List.of(SHOW_IDS), false);
private final ThingRegistry thingRegistry;
@Activate
public HDPowerViewCommandExtension(final @Reference ThingRegistry thingRegistry) {
super(HDPowerViewBindingConstants.BINDING_ID, "Interact with the Hunter Douglas PowerView binding.");
this.thingRegistry = thingRegistry;
}
@Override
public void execute(String[] args, Console console) {
if (args.length != 1 || !SHOW_IDS.equals(args[0])) {
printUsage(console);
return;
}
for (Thing thing : thingRegistry.getAll()) {
ThingHandler thingHandler = thing.getHandler();
if (thingHandler instanceof HDPowerViewHubHandler) {
console.println("API bridge: " + thing.getLabel());
HDPowerViewWebTargets webTargets = ((HDPowerViewHubHandler) thingHandler).getWebTargets();
try {
List<ShadeData> shades = webTargets.getShades().shadeData;
if (shades != null) {
console.println(" - Shades:");
for (ShadeData shade : shades) {
console.println(" - ID: " + shade.id + " (" + shade.getName() + ")");
}
}
List<RepeaterData> repeaters = webTargets.getRepeaters().repeaterData;
if (repeaters != null) {
console.println(" - Repeaters:");
for (RepeaterData repeater : repeaters) {
console.println(" - ID: " + repeater.id + " (" + repeater.getName() + ")");
}
}
} catch (HubException e) {
console.println("Error retrieving ID's: " + e.getMessage());
}
}
}
}
@Override
public List<String> getUsages() {
return Arrays.asList(buildCommandUsage(SHOW_IDS, "list all shades and repeaters"));
}
@Override
public @Nullable ConsoleCommandCompleter getCompleter() {
return this;
}
@Override
public boolean complete(String[] args, int cursorArgumentIndex, int cursorPosition, List<String> candidates) {
if (cursorArgumentIndex <= 0) {
return SUBCMD_COMPLETER.complete(args, cursorArgumentIndex, cursorPosition, candidates);
}
return false;
}
}