Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[squeezebox] Add sleep channel #10196

Merged
merged 1 commit into from
Feb 25, 2021
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions bundles/org.openhab.binding.squeezebox/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -119,6 +119,7 @@ All devices support some of the following channels:
| numberPlaylistTracks | Number | Number of playlist tracks |
| playFavorite | String | ID of Favorite to play (channel's state options contains available favorites) |
| rate | Switch | "Like" or "unlike" the currently playing song (if supported by the streaming service) |
| sleep | Number | Power off the player in the specified number of minutes. Sending 0 cancels the timer |
## Example .Items File
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -68,4 +68,5 @@ public class SqueezeBoxBindingConstants {
public static final String CHANNEL_MODEL = "model";
public static final String CHANNEL_FAVORITES_PLAY = "playFavorite";
public static final String CHANNEL_RATE = "rate";
public static final String CHANNEL_SLEEP = "sleep";
}
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@

import java.net.URI;
import java.net.URISyntaxException;
import java.time.Duration;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
Expand Down Expand Up @@ -308,6 +309,16 @@ public void handleCommand(ChannelUID channelUID, Command command) {
squeezeBoxServerHandler.rate(mac, unlikeCommand);
}
break;
case CHANNEL_SLEEP:
if (command instanceof DecimalType) {
Duration sleepDuration = Duration.ofMinutes(((DecimalType) command).longValue());
if (sleepDuration.isNegative() || sleepDuration.compareTo(Duration.ofDays(1)) > 0) {
logger.debug("Sleep timer of {} minutes must be >= 0 and <= 1 day", sleepDuration.toMinutes());
return;
}
squeezeBoxServerHandler.sleep(mac, sleepDuration);
}
break;
default:
break;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -301,6 +301,10 @@ public void rate(String mac, String rateCommand) {
}
}

public void sleep(String mac, Duration sleepDuration) {
sendCommand(mac + " sleep " + String.valueOf(sleepDuration.toSeconds()));
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I am wondering, since the API supports seconds, if it would make sense to also support seconds instead of minutes.

For sure the normal use case would be a timer that you use for listening to a web radio until you fall asleep and there it is fine to enter some minutes. However, one could also think of using this in rules to play some seconds of an alarm sound and automatically turn off the player afterwards.

Do you think it would make sense to use seconds instead of minutes or would you say that my use-case is too artificial?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

No, it's a good question. I debated whether to use minutes or seconds. So, I bailed out on making the decision and I asked the user who requested the feature. 😉 He suggested minutes.

https://community.openhab.org/t/feature-request-squeezebox-binding-add-sleep-channel/117278/9

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I guess the other option would've been to use the Number:Time QuantityType. But since the binding doesn't use QuantityTypes anywhere else (at least I don't think it does), I decided against it.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I assume you saw my selection of 1 day as the upper limit, which was a completely arbitrary selection on my part.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yes I saw the 1 day for the upper limit and thought that should be sufficient.

Well if the community thinks minutes is sufficient, then leave it like that. I just thought we can offer whats possible and not restrict it arbitrarily.

}

/**
* Send a generic command to a given player
*
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -84,6 +84,7 @@
<channel id="numberPlaylistTracks" typeId="numberPlaylistTracks"/>
<channel id="playFavorite" typeId="playFavorite"/>
<channel id="rate" typeId="rate"/>
<channel id="sleep" typeId="sleep"/>
</channels>

<properties>
Expand Down Expand Up @@ -304,4 +305,10 @@
<label>Like or Unlike Song</label>
<description>Likes or unlikes the current song (if the service supports it)</description>
</channel-type>
<channel-type id="sleep">
<item-type>Number</item-type>
<label>Sleep</label>
<description>Power off player in specified number of minutes</description>
<state pattern="%d"></state>
</channel-type>
</thing:thing-descriptions>