mirror of
https://github.com/openhab/openhab-addons.git
synced 2025-01-26 15:21:41 +01:00
[nuvo] Add Image channel for album art (#13498)
* Add Image channel for Album Art Signed-off-by: Michael Lobstein <michael.lobstein@gmail.com>
This commit is contained in:
parent
507e714dd0
commit
f431bfc013
@ -113,6 +113,7 @@ The following channels are available:
|
|||||||
| 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#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#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#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
|
## Full Example
|
||||||
|
|
||||||
@ -166,6 +167,7 @@ Number:Time nuvo_s1_track_length "Track Length: [%s s]" { channel="nuvo:amplifie
|
|||||||
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: [%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_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" }
|
||||||
|
|
||||||
String nuvo_s2_display_line1 "Line 1: [%s]" { channel="nuvo:amplifier:myamp:source2#display_line1" }
|
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" }
|
String nuvo_s2_display_line2 "Line 2: [%s]" { channel="nuvo:amplifier:myamp:source2#display_line2" }
|
||||||
@ -176,6 +178,7 @@ Number:Time nuvo_s2_track_length "Track Length: [%s s]" { channel="nuvo:amplifie
|
|||||||
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: [%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_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" }
|
||||||
|
|
||||||
String nuvo_s3_display_line1 "Line 1: [%s]" { channel="nuvo:amplifier:myamp:source3#display_line1" }
|
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" }
|
String nuvo_s3_display_line2 "Line 2: [%s]" { channel="nuvo:amplifier:myamp:source3#display_line2" }
|
||||||
@ -186,6 +189,7 @@ Number:Time nuvo_s3_track_length "Track Length: [%s s]" { channel="nuvo:amplifie
|
|||||||
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: [%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_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" }
|
||||||
|
|
||||||
String nuvo_s4_display_line1 "Line 1: [%s]" { channel="nuvo:amplifier:myamp:source4#display_line1" }
|
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" }
|
String nuvo_s4_display_line2 "Line 2: [%s]" { channel="nuvo:amplifier:myamp:source4#display_line2" }
|
||||||
@ -196,6 +200,7 @@ Number:Time nuvo_s4_track_length "Track Length: [%s s]" { channel="nuvo:amplifie
|
|||||||
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: [%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_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" }
|
||||||
|
|
||||||
String nuvo_s5_display_line1 "Line 1: [%s]" { channel="nuvo:amplifier:myamp:source5#display_line1" }
|
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" }
|
String nuvo_s5_display_line2 "Line 2: [%s]" { channel="nuvo:amplifier:myamp:source5#display_line2" }
|
||||||
@ -206,6 +211,7 @@ Number:Time nuvo_s5_track_length "Track Length: [%s s]" { channel="nuvo:amplifie
|
|||||||
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: [%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_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" }
|
||||||
|
|
||||||
String nuvo_s6_display_line1 "Line 1: [%s]" { channel="nuvo:amplifier:myamp:source6#display_line1" }
|
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" }
|
String nuvo_s6_display_line2 "Line 2: [%s]" { channel="nuvo:amplifier:myamp:source6#display_line2" }
|
||||||
@ -216,6 +222,7 @@ Number:Time nuvo_s6_track_length "Track Length: [%s s]" { channel="nuvo:amplifie
|
|||||||
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: [%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_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" }
|
||||||
|
|
||||||
```
|
```
|
||||||
|
|
||||||
@ -301,8 +308,15 @@ sitemap nuvo label="Audio Control" {
|
|||||||
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=="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)
|
// repeat for zones 2-20 (substitute z1)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -62,6 +62,7 @@ public class NuvoBindingConstants {
|
|||||||
public static final String CHANNEL_TRACK_POSITION = "track_position";
|
public static final String CHANNEL_TRACK_POSITION = "track_position";
|
||||||
public static final String CHANNEL_BUTTON_PRESS = "button_press";
|
public static final String CHANNEL_BUTTON_PRESS = "button_press";
|
||||||
public static final String CHANNEL_ART_URL = "art_url";
|
public static final String CHANNEL_ART_URL = "art_url";
|
||||||
|
public static final String CHANNEL_ALBUM_ART = "album_art";
|
||||||
|
|
||||||
// Message types
|
// Message types
|
||||||
public static final String TYPE_VERSION = "version";
|
public static final String TYPE_VERSION = "version";
|
||||||
|
@ -75,6 +75,7 @@ import org.openhab.core.library.types.OpenClosedType;
|
|||||||
import org.openhab.core.library.types.PercentType;
|
import org.openhab.core.library.types.PercentType;
|
||||||
import org.openhab.core.library.types.PlayPauseType;
|
import org.openhab.core.library.types.PlayPauseType;
|
||||||
import org.openhab.core.library.types.QuantityType;
|
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.types.StringType;
|
||||||
import org.openhab.core.library.unit.Units;
|
import org.openhab.core.library.unit.Units;
|
||||||
import org.openhab.core.thing.Channel;
|
import org.openhab.core.thing.Channel;
|
||||||
@ -566,14 +567,19 @@ public class NuvoHandler extends BaseThingHandler implements NuvoMessageEventLis
|
|||||||
if (httpStatus == OK_200) {
|
if (httpStatus == OK_200) {
|
||||||
albumArtMap.put(target.getId(),
|
albumArtMap.put(target.getId(),
|
||||||
NuvoImageResizer.resizeImage(contentResponse.getContent(), 80, 80));
|
NuvoImageResizer.resizeImage(contentResponse.getContent(), 80, 80));
|
||||||
|
|
||||||
|
updateChannelState(target, CHANNEL_ALBUM_ART, BLANK,
|
||||||
|
contentResponse.getContent());
|
||||||
} else {
|
} else {
|
||||||
albumArtMap.put(target.getId(), NO_ART);
|
albumArtMap.put(target.getId(), NO_ART);
|
||||||
albumArtIds.put(target.getId(), 0);
|
albumArtIds.put(target.getId(), 0);
|
||||||
|
updateChannelState(target, CHANNEL_ALBUM_ART, UNDEF);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
} catch (InterruptedException | TimeoutException | ExecutionException e) {
|
} catch (InterruptedException | TimeoutException | ExecutionException e) {
|
||||||
albumArtMap.put(target.getId(), NO_ART);
|
albumArtMap.put(target.getId(), NO_ART);
|
||||||
albumArtIds.put(target.getId(), 0);
|
albumArtIds.put(target.getId(), 0);
|
||||||
|
updateChannelState(target, CHANNEL_ALBUM_ART, UNDEF);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
albumArtIds.put(target.getId(), Math.abs(url.hashCode()));
|
albumArtIds.put(target.getId(), Math.abs(url.hashCode()));
|
||||||
@ -586,6 +592,7 @@ public class NuvoHandler extends BaseThingHandler implements NuvoMessageEventLis
|
|||||||
} else {
|
} else {
|
||||||
albumArtMap.put(target.getId(), NO_ART);
|
albumArtMap.put(target.getId(), NO_ART);
|
||||||
albumArtIds.put(target.getId(), 0);
|
albumArtIds.put(target.getId(), 0);
|
||||||
|
updateChannelState(target, CHANNEL_ALBUM_ART, UNDEF);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -1229,13 +1236,25 @@ public class NuvoHandler extends BaseThingHandler implements NuvoMessageEventLis
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Update the state of a channel
|
* Update the state of a channel (original method signature)
|
||||||
*
|
*
|
||||||
* @param target the channel group
|
* @param target the channel group
|
||||||
* @param channelType the channel group item
|
* @param channelType the channel group item
|
||||||
* @param value the value to be updated
|
* @param value the value to be updated
|
||||||
*/
|
*/
|
||||||
private void updateChannelState(NuvoEnum target, String channelType, String value) {
|
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;
|
String channel = target.name().toLowerCase() + CHANNEL_DELIMIT + channelType;
|
||||||
|
|
||||||
if (!isLinked(channel)) {
|
if (!isLinked(channel)) {
|
||||||
@ -1288,6 +1307,9 @@ public class NuvoHandler extends BaseThingHandler implements NuvoMessageEventLis
|
|||||||
case CHANNEL_TRACK_POSITION:
|
case CHANNEL_TRACK_POSITION:
|
||||||
state = new QuantityType<Time>(Integer.parseInt(value) / 10, NuvoHandler.API_SECOND_UNIT);
|
state = new QuantityType<Time>(Integer.parseInt(value) / 10, NuvoHandler.API_SECOND_UNIT);
|
||||||
break;
|
break;
|
||||||
|
case CHANNEL_ALBUM_ART:
|
||||||
|
state = new RawType(bytes, RawType.DEFAULT_MIME_TYPE);
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -154,6 +154,8 @@ channel-group-type.nuvo.zone.description = The Controls for the Zone
|
|||||||
|
|
||||||
# channel types
|
# 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.label = All Off
|
||||||
channel-type.nuvo.alloff.description = Turn All Zones Off
|
channel-type.nuvo.alloff.description = Turn All Zones Off
|
||||||
channel-type.nuvo.art_url.label = Album Art URL
|
channel-type.nuvo.art_url.label = Album Art URL
|
||||||
|
@ -378,6 +378,7 @@
|
|||||||
<channel id="track_position" typeId="track_position"/>
|
<channel id="track_position" typeId="track_position"/>
|
||||||
<channel id="button_press" typeId="button_press"/>
|
<channel id="button_press" typeId="button_press"/>
|
||||||
<channel id="art_url" typeId="art_url"/>
|
<channel id="art_url" typeId="art_url"/>
|
||||||
|
<channel id="album_art" typeId="album_art"/>
|
||||||
</channels>
|
</channels>
|
||||||
</channel-group-type>
|
</channel-group-type>
|
||||||
|
|
||||||
@ -527,4 +528,11 @@
|
|||||||
<description>The URL of the Album Art JPG for this source that is displayed on a CTP-36</description>
|
<description>The URL of the Album Art JPG for this source that is displayed on a CTP-36</description>
|
||||||
</channel-type>
|
</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>
|
</thing:thing-descriptions>
|
||||||
|
Loading…
Reference in New Issue
Block a user