Publish ALLOFF event for use in source rules (#14248)

Signed-off-by: Michael Lobstein <michael.lobstein@gmail.com>
pull/14253/head
mlobstein 2023-01-21 04:16:36 -06:00 committed by GitHub
parent e0adc8da02
commit b898bac832
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 57 additions and 32 deletions

View File

@ -160,8 +160,8 @@ String nuvo_s1_display_line2 "Line 2: [%s]" { channel="nuvo:amplifier:myamp:sour
String nuvo_s1_display_line3 "Line 3: [%s]" { channel="nuvo:amplifier:myamp:source1#display_line3" } String nuvo_s1_display_line3 "Line 3: [%s]" { channel="nuvo:amplifier:myamp:source1#display_line3" }
String nuvo_s1_display_line4 "Line 4: [%s]" { channel="nuvo:amplifier:myamp:source1#display_line4" } String nuvo_s1_display_line4 "Line 4: [%s]" { channel="nuvo:amplifier:myamp:source1#display_line4" }
String nuvo_s1_play_mode "Play Mode: [%s]" { channel="nuvo:amplifier:myamp:source1#play_mode" } String nuvo_s1_play_mode "Play Mode: [%s]" { channel="nuvo:amplifier:myamp:source1#play_mode" }
Number:Time nuvo_s1_track_length "Track Length: [%s s]" { channel="nuvo:amplifier:myamp:source1#track_length" } Number:Time nuvo_s1_track_length "Track Length: [%d %unit%]" { channel="nuvo:amplifier:myamp:source1#track_length" }
Number:Time nuvo_s1_track_position "Track Position: [%s s]" { channel="nuvo:amplifier:myamp:source1#track_position" } Number:Time nuvo_s1_track_position "Track Position: [%d %unit%]" { channel="nuvo:amplifier:myamp:source1#track_position" }
String nuvo_s1_button_press "Button: [%s]" { channel="nuvo:amplifier:myamp:source1#button_press" } String nuvo_s1_button_press "Button: [%s]" { channel="nuvo:amplifier:myamp:source1#button_press" }
// String nuvo_s1_art_url "URL: [%s]" { channel="nuvo:amplifier:myamp:source1#art_url" } // String nuvo_s1_art_url "URL: [%s]" { channel="nuvo:amplifier:myamp:source1#art_url" }
// Image nuvo_s1_album_art { channel="nuvo:amplifier:myamp:source1#album_art" } // Image nuvo_s1_album_art { channel="nuvo:amplifier:myamp:source1#album_art" }
@ -171,8 +171,8 @@ String nuvo_s2_display_line2 "Line 2: [%s]" { channel="nuvo:amplifier:myamp:sour
String nuvo_s2_display_line3 "Line 3: [%s]" { channel="nuvo:amplifier:myamp:source2#display_line3" } String nuvo_s2_display_line3 "Line 3: [%s]" { channel="nuvo:amplifier:myamp:source2#display_line3" }
String nuvo_s2_display_line4 "Line 4: [%s]" { channel="nuvo:amplifier:myamp:source2#display_line4" } String nuvo_s2_display_line4 "Line 4: [%s]" { channel="nuvo:amplifier:myamp:source2#display_line4" }
String nuvo_s2_play_mode "Play Mode: [%s]" { channel="nuvo:amplifier:myamp:source2#play_mode" } String nuvo_s2_play_mode "Play Mode: [%s]" { channel="nuvo:amplifier:myamp:source2#play_mode" }
Number:Time nuvo_s2_track_length "Track Length: [%s s]" { channel="nuvo:amplifier:myamp:source2#track_length" } Number:Time nuvo_s2_track_length "Track Length: [%d %unit%]" { channel="nuvo:amplifier:myamp:source2#track_length" }
Number:Time nuvo_s2_track_position "Track Position: [%s s]" { channel="nuvo:amplifier:myamp:source2#track_position" } Number:Time nuvo_s2_track_position "Track Position: [%d %unit%]" { channel="nuvo:amplifier:myamp:source2#track_position" }
String nuvo_s2_button_press "Button: [%s]" { channel="nuvo:amplifier:myamp:source2#button_press" } String nuvo_s2_button_press "Button: [%s]" { channel="nuvo:amplifier:myamp:source2#button_press" }
// String nuvo_s2_art_url "URL: [%s]" { channel="nuvo:amplifier:myamp:source2#art_url" } // String nuvo_s2_art_url "URL: [%s]" { channel="nuvo:amplifier:myamp:source2#art_url" }
// Image nuvo_s2_album_art { channel="nuvo:amplifier:myamp:source2#album_art" } // Image nuvo_s2_album_art { channel="nuvo:amplifier:myamp:source2#album_art" }
@ -182,8 +182,8 @@ String nuvo_s3_display_line2 "Line 2: [%s]" { channel="nuvo:amplifier:myamp:sour
String nuvo_s3_display_line3 "Line 3: [%s]" { channel="nuvo:amplifier:myamp:source3#display_line3" } String nuvo_s3_display_line3 "Line 3: [%s]" { channel="nuvo:amplifier:myamp:source3#display_line3" }
String nuvo_s3_display_line4 "Line 4: [%s]" { channel="nuvo:amplifier:myamp:source3#display_line4" } String nuvo_s3_display_line4 "Line 4: [%s]" { channel="nuvo:amplifier:myamp:source3#display_line4" }
String nuvo_s3_play_mode "Play Mode: [%s]" { channel="nuvo:amplifier:myamp:source3#play_mode" } String nuvo_s3_play_mode "Play Mode: [%s]" { channel="nuvo:amplifier:myamp:source3#play_mode" }
Number:Time nuvo_s3_track_length "Track Length: [%s s]" { channel="nuvo:amplifier:myamp:source3#track_length" } Number:Time nuvo_s3_track_length "Track Length: [%d %unit%]" { channel="nuvo:amplifier:myamp:source3#track_length" }
Number:Time nuvo_s3_track_position "Track Position: [%s s]" { channel="nuvo:amplifier:myamp:source3#track_position" } Number:Time nuvo_s3_track_position "Track Position: [%d %unit%]" { channel="nuvo:amplifier:myamp:source3#track_position" }
String nuvo_s3_button_press "Button: [%s]" { channel="nuvo:amplifier:myamp:source3#button_press" } String nuvo_s3_button_press "Button: [%s]" { channel="nuvo:amplifier:myamp:source3#button_press" }
// String nuvo_s3_art_url "URL: [%s]" { channel="nuvo:amplifier:myamp:source3#art_url" } // String nuvo_s3_art_url "URL: [%s]" { channel="nuvo:amplifier:myamp:source3#art_url" }
// Image nuvo_s3_album_art { channel="nuvo:amplifier:myamp:source3#album_art" } // Image nuvo_s3_album_art { channel="nuvo:amplifier:myamp:source3#album_art" }
@ -193,8 +193,8 @@ String nuvo_s4_display_line2 "Line 2: [%s]" { channel="nuvo:amplifier:myamp:sour
String nuvo_s4_display_line3 "Line 3: [%s]" { channel="nuvo:amplifier:myamp:source4#display_line3" } String nuvo_s4_display_line3 "Line 3: [%s]" { channel="nuvo:amplifier:myamp:source4#display_line3" }
String nuvo_s4_display_line4 "Line 4: [%s]" { channel="nuvo:amplifier:myamp:source4#display_line4" } String nuvo_s4_display_line4 "Line 4: [%s]" { channel="nuvo:amplifier:myamp:source4#display_line4" }
String nuvo_s4_play_mode "Play Mode: [%s]" { channel="nuvo:amplifier:myamp:source4#play_mode" } String nuvo_s4_play_mode "Play Mode: [%s]" { channel="nuvo:amplifier:myamp:source4#play_mode" }
Number:Time nuvo_s4_track_length "Track Length: [%s s]" { channel="nuvo:amplifier:myamp:source4#track_length" } Number:Time nuvo_s4_track_length "Track Length: [%d %unit%]" { channel="nuvo:amplifier:myamp:source4#track_length" }
Number:Time nuvo_s4_track_position "Track Position: [%s s]" { channel="nuvo:amplifier:myamp:source4#track_position" } Number:Time nuvo_s4_track_position "Track Position: [%d %unit%]" { channel="nuvo:amplifier:myamp:source4#track_position" }
String nuvo_s4_button_press "Button: [%s]" { channel="nuvo:amplifier:myamp:source4#button_press" } String nuvo_s4_button_press "Button: [%s]" { channel="nuvo:amplifier:myamp:source4#button_press" }
// String nuvo_s4_art_url "URL: [%s]" { channel="nuvo:amplifier:myamp:source4#art_url" } // String nuvo_s4_art_url "URL: [%s]" { channel="nuvo:amplifier:myamp:source4#art_url" }
// Image nuvo_s4_album_art { channel="nuvo:amplifier:myamp:source4#album_art" } // Image nuvo_s4_album_art { channel="nuvo:amplifier:myamp:source4#album_art" }
@ -204,8 +204,8 @@ String nuvo_s5_display_line2 "Line 2: [%s]" { channel="nuvo:amplifier:myamp:sour
String nuvo_s5_display_line3 "Line 3: [%s]" { channel="nuvo:amplifier:myamp:source5#display_line3" } String nuvo_s5_display_line3 "Line 3: [%s]" { channel="nuvo:amplifier:myamp:source5#display_line3" }
String nuvo_s5_display_line4 "Line 4: [%s]" { channel="nuvo:amplifier:myamp:source5#display_line4" } String nuvo_s5_display_line4 "Line 4: [%s]" { channel="nuvo:amplifier:myamp:source5#display_line4" }
String nuvo_s5_play_mode "Play Mode: [%s]" { channel="nuvo:amplifier:myamp:source5#play_mode" } String nuvo_s5_play_mode "Play Mode: [%s]" { channel="nuvo:amplifier:myamp:source5#play_mode" }
Number:Time nuvo_s5_track_length "Track Length: [%s s]" { channel="nuvo:amplifier:myamp:source5#track_length" } Number:Time nuvo_s5_track_length "Track Length: [%d %unit%]" { channel="nuvo:amplifier:myamp:source5#track_length" }
Number:Time nuvo_s5_track_position "Track Position: [%s s]" { channel="nuvo:amplifier:myamp:source5#track_position" } Number:Time nuvo_s5_track_position "Track Position: [%d %unit%]" { channel="nuvo:amplifier:myamp:source5#track_position" }
String nuvo_s5_button_press "Button: [%s]" { channel="nuvo:amplifier:myamp:source5#button_press" } String nuvo_s5_button_press "Button: [%s]" { channel="nuvo:amplifier:myamp:source5#button_press" }
// String nuvo_s5_art_url "URL: [%s]" { channel="nuvo:amplifier:myamp:source5#art_url" } // String nuvo_s5_art_url "URL: [%s]" { channel="nuvo:amplifier:myamp:source5#art_url" }
// Image nuvo_s5_album_art { channel="nuvo:amplifier:myamp:source5#album_art" } // Image nuvo_s5_album_art { channel="nuvo:amplifier:myamp:source5#album_art" }
@ -215,8 +215,8 @@ String nuvo_s6_display_line2 "Line 2: [%s]" { channel="nuvo:amplifier:myamp:sour
String nuvo_s6_display_line3 "Line 3: [%s]" { channel="nuvo:amplifier:myamp:source6#display_line3" } String nuvo_s6_display_line3 "Line 3: [%s]" { channel="nuvo:amplifier:myamp:source6#display_line3" }
String nuvo_s6_display_line4 "Line 4: [%s]" { channel="nuvo:amplifier:myamp:source6#display_line4" } String nuvo_s6_display_line4 "Line 4: [%s]" { channel="nuvo:amplifier:myamp:source6#display_line4" }
String nuvo_s6_play_mode "Play Mode: [%s]" { channel="nuvo:amplifier:myamp:source6#play_mode" } String nuvo_s6_play_mode "Play Mode: [%s]" { channel="nuvo:amplifier:myamp:source6#play_mode" }
Number:Time nuvo_s6_track_length "Track Length: [%s s]" { channel="nuvo:amplifier:myamp:source6#track_length" } Number:Time nuvo_s6_track_length "Track Length: [%d %unit%]" { channel="nuvo:amplifier:myamp:source6#track_length" }
Number:Time nuvo_s6_track_position "Track Position: [%s s]" { channel="nuvo:amplifier:myamp:source6#track_position" } Number:Time nuvo_s6_track_position "Track Position: [%d %unit%]" { channel="nuvo:amplifier:myamp:source6#track_position" }
String nuvo_s6_button_press "Button: [%s]" { channel="nuvo:amplifier:myamp:source6#button_press" } String nuvo_s6_button_press "Button: [%s]" { channel="nuvo:amplifier:myamp:source6#button_press" }
// String nuvo_s6_art_url "URL: [%s]" { channel="nuvo:amplifier:myamp:source6#art_url" } // String nuvo_s6_art_url "URL: [%s]" { channel="nuvo:amplifier:myamp:source6#art_url" }
// Image nuvo_s6_album_art { channel="nuvo:amplifier:myamp:source6#album_art" } // Image nuvo_s6_album_art { channel="nuvo:amplifier:myamp:source6#album_art" }
@ -234,7 +234,7 @@ sitemap nuvo label="Audio Control" {
} }
Frame label="Zone 1" { Frame label="Zone 1" {
Switch item=nuvo_z1_power visibility=[nuvo_z1_lock!="1"] Switch item=nuvo_z1_power visibility=[nuvo_z1_lock!="OPEN"] // OPEN = Zone Locked //
Selection item=nuvo_z1_source visibility=[nuvo_z1_power==ON] icon="player" Selection item=nuvo_z1_source visibility=[nuvo_z1_power==ON] icon="player"
// Volume can be a Setpoint also // Volume can be a Setpoint also
Slider item=nuvo_z1_volume minValue=0 maxValue=100 step=1 visibility=[nuvo_z1_power==ON] icon="soundvolume" Slider item=nuvo_z1_volume minValue=0 maxValue=100 step=1 visibility=[nuvo_z1_power==ON] icon="soundvolume"
@ -304,7 +304,7 @@ sitemap nuvo label="Audio Control" {
Switch item=nuvo_z1_dnd Switch item=nuvo_z1_dnd
Switch item=nuvo_z1_party Switch item=nuvo_z1_party
} }
Text item=nuvo_z1_lock label="Zone Locked: [%s]" icon="lock" visibility=[nuvo_z1_lock=="1"] Text item=nuvo_z1_lock label="Zone Locked: [%s]" icon="lock" visibility=[nuvo_z1_lock=="OPEN"]
// Image item=nuvo_s1_album_art visibility=[nuvo_z1_source=="1"] // Image item=nuvo_s1_album_art visibility=[nuvo_z1_source=="1"]
// Image item=nuvo_s2_album_art visibility=[nuvo_z1_source=="2"] // Image item=nuvo_s2_album_art visibility=[nuvo_z1_source=="2"]
@ -585,6 +585,10 @@ then
sendCommand(music_Music_Repeat, ON) sendCommand(music_Music_Repeat, ON)
} }
} }
// ALLOFF is sent by the amplifier 5 minutes after all zones are switched off
case "ALLOFF": {
sendCommand(music_Music_Control, PAUSE)
}
// Handle menu item selections // Handle menu item selections
case "Top menu 1|menu1 a": { case "Top menu 1|menu1 a": {
logInfo("nuvo src 6", "'Top menu 1, menu 1 a' was selected") logInfo("nuvo src 6", "'Top menu 1, menu 1 a' was selected")

View File

@ -84,6 +84,7 @@ public class NuvoBindingConstants {
// misc // misc
public static final String ON = "ON"; public static final String ON = "ON";
public static final String OFF = "OFF"; public static final String OFF = "OFF";
public static final String ALLOFF = "ALLOFF";
public static final String TWO = "2"; public static final String TWO = "2";
public static final String ONE = "1"; public static final String ONE = "1";
public static final String ZERO = "0"; public static final String ZERO = "0";

View File

@ -157,7 +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, Set<NuvoEnum>> nuvoGroupMap = new HashMap<String, Set<NuvoEnum>>();
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[]>();
@ -234,10 +234,10 @@ 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("1", new HashSet<NuvoEnum>());
nuvoGroupMap.put("2", new HashSet<String>()); nuvoGroupMap.put("2", new HashSet<NuvoEnum>());
nuvoGroupMap.put("3", new HashSet<String>()); nuvoGroupMap.put("3", new HashSet<NuvoEnum>());
nuvoGroupMap.put("4", new HashSet<String>()); nuvoGroupMap.put("4", new HashSet<NuvoEnum>());
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);
@ -427,6 +427,9 @@ public class NuvoHandler extends BaseThingHandler implements NuvoMessageEventLis
if (value >= 1 && value <= MAX_SRC) { if (value >= 1 && value <= MAX_SRC) {
logger.debug("Got source command {} zone {}", value, target); logger.debug("Got source command {} zone {}", value, target);
connector.sendCommand(target, NuvoCommand.SOURCE, String.valueOf(value)); connector.sendCommand(target, NuvoCommand.SOURCE, String.valueOf(value));
// update the other group member's selected source
updateSrcForZoneGroup(target, String.valueOf(value));
} }
} }
break; break;
@ -685,6 +688,13 @@ public class NuvoHandler extends BaseThingHandler implements NuvoMessageEventLis
activeZones.forEach(zoneNum -> { activeZones.forEach(zoneNum -> {
updateChannelState(NuvoEnum.valueOf(ZONE + zoneNum), CHANNEL_TYPE_POWER, OFF); updateChannelState(NuvoEnum.valueOf(ZONE + zoneNum), CHANNEL_TYPE_POWER, OFF);
}); });
// Publish the ALLOFF event to all button channels for awareness in source rules
updateChannelState(NuvoEnum.SYSTEM, CHANNEL_TYPE_BUTTONPRESS, ZERO + COMMA + ALLOFF);
NuvoEnum.VALID_SOURCES.forEach(source -> {
updateChannelState(NuvoEnum.valueOf(source), CHANNEL_TYPE_BUTTONPRESS, ALLOFF);
});
break; break;
case TYPE_ALLMUTE: case TYPE_ALLMUTE:
updateChannelState(NuvoEnum.SYSTEM, CHANNEL_TYPE_ALLMUTE, ONE.equals(updateData) ? ON : OFF); updateChannelState(NuvoEnum.SYSTEM, CHANNEL_TYPE_ALLMUTE, ONE.equals(updateData) ? ON : OFF);
@ -742,17 +752,8 @@ 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 // update the other group member's selected source
nuvoGroupMap.forEach((groupId, groupZones) -> { updateSrcForZoneGroup(targetZone, matcher.group(1));
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);
@ -885,9 +886,9 @@ public class NuvoHandler extends BaseThingHandler implements NuvoMessageEventLis
if (matcher.find()) { if (matcher.find()) {
// TODO: utilize other info such as zone name, available sources bitmask, etc. // 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 this zone is a member of a group (1-4), add the zone's enum to the appropriate group map
if (!ZERO.equals(matcher.group(3))) { if (!ZERO.equals(matcher.group(3))) {
nuvoGroupMap.get(matcher.group(3)).add(zoneId); nuvoGroupMap.get(matcher.group(3)).add(NuvoEnum.valueOf(ZONE + zoneId));
} }
} else { } else {
logger.debug("no match on message: {}", updateData); logger.debug("no match on message: {}", updateData);
@ -1379,6 +1380,25 @@ public class NuvoHandler extends BaseThingHandler implements NuvoMessageEventLis
updateState(channel, state); updateState(channel, state);
} }
/**
* For grouped zones, update the source channel for all group members
*
* @param zoneEnum the zone where the source was changed
* @param srcId the new source number that was selected
*/
private void updateSrcForZoneGroup(NuvoEnum zoneEnum, String srcId) {
// 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(zoneEnum)) {
groupZones.forEach(z -> {
if (!zoneEnum.equals(z)) {
updateChannelState(z, CHANNEL_TYPE_SOURCE, srcId);
}
});
}
});
}
/** /**
* Handle a button press from a UI Player item * Handle a button press from a UI Player item
* *