[nuvo] Auto update source channel for grouped zones (#14012)
* Auto update source channel for grouped zones Signed-off-by: Michael Lobstein <michael.lobstein@gmail.com>
This commit is contained in:
parent
e39e69144b
commit
4a982957c3
|
@ -5,8 +5,8 @@ Up to 20 keypad zones can be controlled when zone expansion modules are used (if
|
||||||
|
|
||||||
The binding supports three different kinds of connections:
|
The binding supports three different kinds of connections:
|
||||||
|
|
||||||
- serial connection,
|
- serial port connection
|
||||||
- serial over IP connection,
|
- serial over IP connection
|
||||||
- direct IP connection via a Nuvo MPS4 music server
|
- direct IP connection via a Nuvo MPS4 music server
|
||||||
|
|
||||||
For users without a serial connector on the server side, you can use a USB to serial adapter.
|
For users without a serial connector on the server side, you can use a USB to serial adapter.
|
||||||
|
@ -27,11 +27,6 @@ It has the `amplifier` id.
|
||||||
Discovery is not supported.
|
Discovery is not supported.
|
||||||
You have to add all things manually.
|
You have to add all things manually.
|
||||||
|
|
||||||
## Binding Configuration
|
|
||||||
|
|
||||||
There are no overall binding configuration settings that need to be set.
|
|
||||||
All settings are through thing configuration parameters.
|
|
||||||
|
|
||||||
## Thing Configuration
|
## Thing Configuration
|
||||||
|
|
||||||
The thing has the following configuration parameters:
|
The thing has the following configuration parameters:
|
||||||
|
|
|
@ -29,6 +29,7 @@ public enum NuvoCommand {
|
||||||
PAGE_OFF("PAGE0"),
|
PAGE_OFF("PAGE0"),
|
||||||
CFGTIME("CFGTIME"),
|
CFGTIME("CFGTIME"),
|
||||||
STATUS("STATUS"),
|
STATUS("STATUS"),
|
||||||
|
STATUS_QUERY("STATUS?"),
|
||||||
EQ_QUERY("EQ?"),
|
EQ_QUERY("EQ?"),
|
||||||
DISPINFO("DISPINFO"),
|
DISPINFO("DISPINFO"),
|
||||||
DISPLINE("DISPLINE"),
|
DISPLINE("DISPLINE"),
|
||||||
|
|
|
@ -134,7 +134,9 @@ public class NuvoHandler extends BaseThingHandler implements NuvoMessageEventLis
|
||||||
private static final Pattern DISP_PATTERN = Pattern.compile("^DISPLINE(\\d{1}),\"(.*)\"$");
|
private static final Pattern DISP_PATTERN = Pattern.compile("^DISPLINE(\\d{1}),\"(.*)\"$");
|
||||||
private static final Pattern DISP_INFO_PATTERN = Pattern
|
private static final Pattern DISP_INFO_PATTERN = Pattern
|
||||||
.compile("^DISPINFO,DUR(\\d{1,6}),POS(\\d{1,6}),STATUS(\\d{1,2})$");
|
.compile("^DISPINFO,DUR(\\d{1,6}),POS(\\d{1,6}),STATUS(\\d{1,2})$");
|
||||||
private static final Pattern ZONE_CFG_PATTERN = Pattern.compile("^BASS(.*),TREB(.*),BAL(.*),LOUDCMP([0-1])$");
|
private static final Pattern ZONE_CFG_EQ_PATTERN = Pattern.compile("^BASS(.*),TREB(.*),BAL(.*),LOUDCMP([0-1])$");
|
||||||
|
private static final Pattern ZONE_CFG_PATTERN = Pattern.compile(
|
||||||
|
"^ENABLE1,NAME\"(.*)\",SLAVETO(.*),GROUP([0-4]),SOURCES(.*),XSRC(.*),IR(.*),DND(.*),LOCKED(.*),SLAVEEQ(.*)$");
|
||||||
|
|
||||||
private final Logger logger = LoggerFactory.getLogger(NuvoHandler.class);
|
private final Logger logger = LoggerFactory.getLogger(NuvoHandler.class);
|
||||||
private final NuvoStateDescriptionOptionProvider stateDescriptionProvider;
|
private final NuvoStateDescriptionOptionProvider stateDescriptionProvider;
|
||||||
|
@ -155,6 +157,7 @@ public class NuvoHandler extends BaseThingHandler implements NuvoMessageEventLis
|
||||||
|
|
||||||
private boolean isAnyOhNuvoNet = false;
|
private boolean isAnyOhNuvoNet = false;
|
||||||
private NuvoMenu nuvoMenus = new NuvoMenu();
|
private NuvoMenu nuvoMenus = new NuvoMenu();
|
||||||
|
private HashMap<String, Set<String>> nuvoGroupMap = new HashMap<String, Set<String>>();
|
||||||
private HashMap<String, Integer> nuvoNetSrcMap = new HashMap<String, Integer>();
|
private HashMap<String, Integer> nuvoNetSrcMap = new HashMap<String, Integer>();
|
||||||
private HashMap<String, String> favPrefixMap = new HashMap<String, String>();
|
private HashMap<String, String> favPrefixMap = new HashMap<String, String>();
|
||||||
private HashMap<String, String[]> favoriteMap = new HashMap<String, String[]>();
|
private HashMap<String, String[]> favoriteMap = new HashMap<String, String[]>();
|
||||||
|
@ -231,6 +234,11 @@ public class NuvoHandler extends BaseThingHandler implements NuvoMessageEventLis
|
||||||
nuvoNetSrcMap.put("5", config.nuvoNetSrc5);
|
nuvoNetSrcMap.put("5", config.nuvoNetSrc5);
|
||||||
nuvoNetSrcMap.put("6", config.nuvoNetSrc6);
|
nuvoNetSrcMap.put("6", config.nuvoNetSrc6);
|
||||||
|
|
||||||
|
nuvoGroupMap.put("1", new HashSet<String>());
|
||||||
|
nuvoGroupMap.put("2", new HashSet<String>());
|
||||||
|
nuvoGroupMap.put("3", new HashSet<String>());
|
||||||
|
nuvoGroupMap.put("4", new HashSet<String>());
|
||||||
|
|
||||||
if (this.isMps4) {
|
if (this.isMps4) {
|
||||||
logger.debug("Port set to {} configuring binding for MPS4 compatability", MPS4_PORT);
|
logger.debug("Port set to {} configuring binding for MPS4 compatability", MPS4_PORT);
|
||||||
|
|
||||||
|
@ -734,6 +742,18 @@ public class NuvoHandler extends BaseThingHandler implements NuvoMessageEventLis
|
||||||
updateChannelState(targetZone, CHANNEL_TYPE_POWER, ON);
|
updateChannelState(targetZone, CHANNEL_TYPE_POWER, ON);
|
||||||
updateChannelState(targetZone, CHANNEL_TYPE_SOURCE, matcher.group(1));
|
updateChannelState(targetZone, CHANNEL_TYPE_SOURCE, matcher.group(1));
|
||||||
|
|
||||||
|
// check if this zone is in a group, if so update the other group member's selected source
|
||||||
|
nuvoGroupMap.forEach((groupId, groupZones) -> {
|
||||||
|
if (groupZones.contains(zoneId)) {
|
||||||
|
groupZones.forEach(z -> {
|
||||||
|
if (!zoneId.equals(z)) {
|
||||||
|
updateChannelState(NuvoEnum.valueOf(ZONE + z), CHANNEL_TYPE_SOURCE,
|
||||||
|
matcher.group(1));
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
if (MUTE.equals(matcher.group(2))) {
|
if (MUTE.equals(matcher.group(2))) {
|
||||||
updateChannelState(targetZone, CHANNEL_TYPE_MUTE, ON);
|
updateChannelState(targetZone, CHANNEL_TYPE_MUTE, ON);
|
||||||
} else {
|
} else {
|
||||||
|
@ -851,7 +871,7 @@ public class NuvoHandler extends BaseThingHandler implements NuvoMessageEventLis
|
||||||
case TYPE_ZONE_CONFIG:
|
case TYPE_ZONE_CONFIG:
|
||||||
logger.debug("Zone Configuration: Zone: {} - Value: {}", zoneId, updateData);
|
logger.debug("Zone Configuration: Zone: {} - Value: {}", zoneId, updateData);
|
||||||
// example: BASS1,TREB-2,BALR2,LOUDCMP1
|
// example: BASS1,TREB-2,BALR2,LOUDCMP1
|
||||||
Matcher matcher = ZONE_CFG_PATTERN.matcher(updateData);
|
Matcher matcher = ZONE_CFG_EQ_PATTERN.matcher(updateData);
|
||||||
if (matcher.find()) {
|
if (matcher.find()) {
|
||||||
updateChannelState(NuvoEnum.valueOf(ZONE + zoneId), CHANNEL_TYPE_BASS, matcher.group(1));
|
updateChannelState(NuvoEnum.valueOf(ZONE + zoneId), CHANNEL_TYPE_BASS, matcher.group(1));
|
||||||
updateChannelState(NuvoEnum.valueOf(ZONE + zoneId), CHANNEL_TYPE_TREBLE, matcher.group(2));
|
updateChannelState(NuvoEnum.valueOf(ZONE + zoneId), CHANNEL_TYPE_TREBLE, matcher.group(2));
|
||||||
|
@ -859,9 +879,20 @@ public class NuvoHandler extends BaseThingHandler implements NuvoMessageEventLis
|
||||||
NuvoStatusCodes.getBalanceFromStr(matcher.group(3)));
|
NuvoStatusCodes.getBalanceFromStr(matcher.group(3)));
|
||||||
updateChannelState(NuvoEnum.valueOf(ZONE + zoneId), CHANNEL_TYPE_LOUDNESS,
|
updateChannelState(NuvoEnum.valueOf(ZONE + zoneId), CHANNEL_TYPE_LOUDNESS,
|
||||||
ONE.equals(matcher.group(4)) ? ON : OFF);
|
ONE.equals(matcher.group(4)) ? ON : OFF);
|
||||||
|
} else {
|
||||||
|
matcher = ZONE_CFG_PATTERN.matcher(updateData);
|
||||||
|
// example: ENABLE1,NAME"Great Room",SLAVETO0,GROUP1,SOURCES63,XSRC0,IR1,DND0,LOCKED0,SLAVEEQ0
|
||||||
|
if (matcher.find()) {
|
||||||
|
// TODO: utilize other info such as zone name, available sources bitmask, etc.
|
||||||
|
|
||||||
|
// if this zone is a member of a group (1-4), add the zone's id to the appropriate group map
|
||||||
|
if (!ZERO.equals(matcher.group(3))) {
|
||||||
|
nuvoGroupMap.get(matcher.group(3)).add(zoneId);
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
logger.debug("no match on message: {}", updateData);
|
logger.debug("no match on message: {}", updateData);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
case TYPE_NN_ALBUM_ART_REQ:
|
case TYPE_NN_ALBUM_ART_REQ:
|
||||||
// ignore this update unless openHAB is handling this source
|
// ignore this update unless openHAB is handling this source
|
||||||
|
@ -1145,6 +1176,8 @@ public class NuvoHandler extends BaseThingHandler implements NuvoMessageEventLis
|
||||||
try {
|
try {
|
||||||
connector.sendQuery(NuvoEnum.valueOf(ZONE + zoneNum), NuvoCommand.STATUS);
|
connector.sendQuery(NuvoEnum.valueOf(ZONE + zoneNum), NuvoCommand.STATUS);
|
||||||
Thread.sleep(SLEEP_BETWEEN_CMD_MS);
|
Thread.sleep(SLEEP_BETWEEN_CMD_MS);
|
||||||
|
connector.sendCfgCommand(NuvoEnum.valueOf(ZONE + zoneNum), NuvoCommand.STATUS_QUERY, BLANK);
|
||||||
|
Thread.sleep(SLEEP_BETWEEN_CMD_MS);
|
||||||
connector.sendCfgCommand(NuvoEnum.valueOf(ZONE + zoneNum), NuvoCommand.EQ_QUERY, BLANK);
|
connector.sendCfgCommand(NuvoEnum.valueOf(ZONE + zoneNum), NuvoCommand.EQ_QUERY, BLANK);
|
||||||
Thread.sleep(SLEEP_BETWEEN_CMD_MS);
|
Thread.sleep(SLEEP_BETWEEN_CMD_MS);
|
||||||
} catch (NuvoException | InterruptedException e) {
|
} catch (NuvoException | InterruptedException e) {
|
||||||
|
|
Loading…
Reference in New Issue