| sourceN#track_position (where N= 1-6)| Number:Time | The running time elapsed of the current playing track (ReadOnly) See rules example for updating |
| sourceN#button_press (where N= 1-6) | String | Indicates the last button pressed on the keypad for a non NuvoNet source or openHAB NuvoNet source (ReadOnly) |
| sourceN#art_url (where N= 1-6) | String | MPS4 Only! The URL of the Album Art JPG for this source that is displayed on a CTP-36. See *very advanced* rules (SendOnly) |
+| sourceN#album_art (where N= 1-6) | Image | The Album Art loaded from the art_url channel for display in a UI widget (ReadOnly) |
## Full Example
Number:Time nuvo_s1_track_position "Track Position: [%s s]" { channel="nuvo:amplifier:myamp:source1#track_position" }
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" }
+// Image nuvo_s1_album_art { channel="nuvo:amplifier:myamp:source1#album_art" }
String nuvo_s2_display_line1 "Line 1: [%s]" { channel="nuvo:amplifier:myamp:source2#display_line1" }
String nuvo_s2_display_line2 "Line 2: [%s]" { channel="nuvo:amplifier:myamp:source2#display_line2" }
Number:Time nuvo_s2_track_position "Track Position: [%s s]" { channel="nuvo:amplifier:myamp:source2#track_position" }
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" }
+// Image nuvo_s2_album_art { channel="nuvo:amplifier:myamp:source2#album_art" }
String nuvo_s3_display_line1 "Line 1: [%s]" { channel="nuvo:amplifier:myamp:source3#display_line1" }
String nuvo_s3_display_line2 "Line 2: [%s]" { channel="nuvo:amplifier:myamp:source3#display_line2" }
Number:Time nuvo_s3_track_position "Track Position: [%s s]" { channel="nuvo:amplifier:myamp:source3#track_position" }
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" }
+// Image nuvo_s3_album_art { channel="nuvo:amplifier:myamp:source3#album_art" }
String nuvo_s4_display_line1 "Line 1: [%s]" { channel="nuvo:amplifier:myamp:source4#display_line1" }
String nuvo_s4_display_line2 "Line 2: [%s]" { channel="nuvo:amplifier:myamp:source4#display_line2" }
Number:Time nuvo_s4_track_position "Track Position: [%s s]" { channel="nuvo:amplifier:myamp:source4#track_position" }
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" }
+// Image nuvo_s4_album_art { channel="nuvo:amplifier:myamp:source4#album_art" }
String nuvo_s5_display_line1 "Line 1: [%s]" { channel="nuvo:amplifier:myamp:source5#display_line1" }
String nuvo_s5_display_line2 "Line 2: [%s]" { channel="nuvo:amplifier:myamp:source5#display_line2" }
Number:Time nuvo_s5_track_position "Track Position: [%s s]" { channel="nuvo:amplifier:myamp:source5#track_position" }
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" }
+// Image nuvo_s5_album_art { channel="nuvo:amplifier:myamp:source5#album_art" }
String nuvo_s6_display_line1 "Line 1: [%s]" { channel="nuvo:amplifier:myamp:source6#display_line1" }
String nuvo_s6_display_line2 "Line 2: [%s]" { channel="nuvo:amplifier:myamp:source6#display_line2" }
Number:Time nuvo_s6_track_position "Track Position: [%s s]" { channel="nuvo:amplifier:myamp:source6#track_position" }
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" }
+// Image nuvo_s6_album_art { channel="nuvo:amplifier:myamp:source6#album_art" }
```
Switch item=nuvo_z1_party
}
Text item=nuvo_z1_lock label="Zone Locked: [%s]" icon="lock" visibility=[nuvo_z1_lock=="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_s3_album_art visibility=[nuvo_z1_source=="3"]
+ // Image item=nuvo_s4_album_art visibility=[nuvo_z1_source=="4"]
+ // Image item=nuvo_s5_album_art visibility=[nuvo_z1_source=="5"]
+ // Image item=nuvo_s6_album_art visibility=[nuvo_z1_source=="6"]
}
-
+
// repeat for zones 2-20 (substitute z1)
}
public static final String CHANNEL_TRACK_POSITION = "track_position";
public static final String CHANNEL_BUTTON_PRESS = "button_press";
public static final String CHANNEL_ART_URL = "art_url";
+ public static final String CHANNEL_ALBUM_ART = "album_art";
// Message types
public static final String TYPE_VERSION = "version";
import org.openhab.core.library.types.PercentType;
import org.openhab.core.library.types.PlayPauseType;
import org.openhab.core.library.types.QuantityType;
+import org.openhab.core.library.types.RawType;
import org.openhab.core.library.types.StringType;
import org.openhab.core.library.unit.Units;
import org.openhab.core.thing.Channel;
if (httpStatus == OK_200) {
albumArtMap.put(target.getId(),
NuvoImageResizer.resizeImage(contentResponse.getContent(), 80, 80));
+
+ updateChannelState(target, CHANNEL_ALBUM_ART, BLANK,
+ contentResponse.getContent());
} else {
albumArtMap.put(target.getId(), NO_ART);
albumArtIds.put(target.getId(), 0);
+ updateChannelState(target, CHANNEL_ALBUM_ART, UNDEF);
return;
}
} catch (InterruptedException | TimeoutException | ExecutionException e) {
albumArtMap.put(target.getId(), NO_ART);
albumArtIds.put(target.getId(), 0);
+ updateChannelState(target, CHANNEL_ALBUM_ART, UNDEF);
return;
}
albumArtIds.put(target.getId(), Math.abs(url.hashCode()));
} else {
albumArtMap.put(target.getId(), NO_ART);
albumArtIds.put(target.getId(), 0);
+ updateChannelState(target, CHANNEL_ALBUM_ART, UNDEF);
}
}
}
}
/**
- * Update the state of a channel
+ * Update the state of a channel (original method signature)
*
* @param target the channel group
* @param channelType the channel group item
* @param value the value to be updated
*/
private void updateChannelState(NuvoEnum target, String channelType, String value) {
+ updateChannelState(target, channelType, value, NO_ART);
+ }
+
+ /**
+ * Update the state of a channel (overloaded method to handle album_art channel)
+ *
+ * @param target the channel group
+ * @param channelType the channel group item
+ * @param value the value to be updated
+ * @param bytes the byte[] to load into the Image channel
+ */
+ private void updateChannelState(NuvoEnum target, String channelType, String value, byte[] bytes) {
String channel = target.name().toLowerCase() + CHANNEL_DELIMIT + channelType;
if (!isLinked(channel)) {
case CHANNEL_TRACK_POSITION:
state = new QuantityType<Time>(Integer.parseInt(value) / 10, NuvoHandler.API_SECOND_UNIT);
break;
+ case CHANNEL_ALBUM_ART:
+ state = new RawType(bytes, RawType.DEFAULT_MIME_TYPE);
+ break;
default:
break;
}
# channel types
+channel-type.nuvo.album_art.label = Album Art
+channel-type.nuvo.album_art.description = The Album Art loaded from the art_url channel for display in a UI widget
channel-type.nuvo.alloff.label = All Off
channel-type.nuvo.alloff.description = Turn All Zones Off
channel-type.nuvo.art_url.label = Album Art URL
<channel id="track_position" typeId="track_position"/>
<channel id="button_press" typeId="button_press"/>
<channel id="art_url" typeId="art_url"/>
+ <channel id="album_art" typeId="album_art"/>
</channels>
</channel-group-type>
<description>The URL of the Album Art JPG for this source that is displayed on a CTP-36</description>
</channel-type>
+ <channel-type id="album_art">
+ <item-type>Image</item-type>
+ <label>Album Art</label>
+ <description>The Album Art loaded from the art_url channel for display in a UI widget</description>
+ <state readOnly="true"/>
+ </channel-type>
+
</thing:thing-descriptions>