Skip to content

Commit a08d14e

Browse files
Add additional endpoints for Home Theater to set Home Theater Options (night mode, speech enhancement)
It's also possible to get 'grouping latency' from the Sonos API, so it's included in the object here
1 parent 89f1f2e commit a08d14e

3 files changed

Lines changed: 121 additions & 0 deletions

File tree

Lines changed: 88 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,88 @@
1+
package engineer.nightowl.sonos.api.domain;
2+
3+
import org.apache.commons.lang3.builder.EqualsBuilder;
4+
import org.apache.commons.lang3.builder.HashCodeBuilder;
5+
6+
public class SonosHomeTheaterOptions
7+
{
8+
private Boolean nightMode;
9+
private Boolean enhanceDialog;
10+
private Integer groupingLatency;
11+
12+
public SonosHomeTheaterOptions()
13+
{
14+
}
15+
16+
public SonosHomeTheaterOptions(Boolean nightMode, Boolean enhanceDialog, Integer groupingLatency)
17+
{
18+
this.nightMode = nightMode;
19+
this.enhanceDialog = enhanceDialog;
20+
this.groupingLatency = groupingLatency;
21+
}
22+
23+
public Boolean getNightMode()
24+
{
25+
return nightMode;
26+
}
27+
28+
public void setNightMode(Boolean nightMode)
29+
{
30+
this.nightMode = nightMode;
31+
}
32+
33+
public Boolean getEnhanceDialog()
34+
{
35+
return enhanceDialog;
36+
}
37+
38+
public void setEnhanceDialog(Boolean enhanceDialog)
39+
{
40+
this.enhanceDialog = enhanceDialog;
41+
}
42+
43+
public Integer getGroupingLatency()
44+
{
45+
return groupingLatency;
46+
}
47+
48+
public void setGroupingLatency(Integer groupingLatency)
49+
{
50+
this.groupingLatency = groupingLatency;
51+
}
52+
53+
@Override
54+
public String toString()
55+
{
56+
return "SonosHomeTheaterOptions{" +
57+
"nightMode=" + nightMode +
58+
", enhanceDialog=" + enhanceDialog +
59+
", groupingLatency=" + groupingLatency +
60+
'}';
61+
}
62+
63+
@Override
64+
public boolean equals(Object o)
65+
{
66+
if (this == o) return true;
67+
68+
if (o == null || getClass() != o.getClass()) return false;
69+
70+
SonosHomeTheaterOptions that = (SonosHomeTheaterOptions) o;
71+
72+
return new EqualsBuilder()
73+
.append(nightMode, that.nightMode)
74+
.append(enhanceDialog, that.enhanceDialog)
75+
.append(groupingLatency, that.groupingLatency)
76+
.isEquals();
77+
}
78+
79+
@Override
80+
public int hashCode()
81+
{
82+
return new HashCodeBuilder(17, 37)
83+
.append(nightMode)
84+
.append(enhanceDialog)
85+
.append(groupingLatency)
86+
.toHashCode();
87+
}
88+
}

src/main/java/engineer/nightowl/sonos/api/enums/SonosType.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ public enum SonosType
1616
globalError(SonosApiError.class),
1717
groups(SonosGroups.class),
1818
groupVolume(SonosGroupVolume.class),
19+
homeTheaterOptions(SonosHomeTheaterOptions.class),
1920
households(SonosHouseholdList.class),
2021
MusicServiceAccount(SonosMusicServiceAccount.class),
2122
playbackError(SonosPlaybackError.class),

src/main/java/engineer/nightowl/sonos/api/resource/HomeTheaterResource.java

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package engineer.nightowl.sonos.api.resource;
22

33
import engineer.nightowl.sonos.api.SonosApiClient;
4+
import engineer.nightowl.sonos.api.domain.SonosHomeTheaterOptions;
45
import engineer.nightowl.sonos.api.domain.SonosSuccess;
56
import engineer.nightowl.sonos.api.enums.SonosTvPowerState;
67
import engineer.nightowl.sonos.api.exception.SonosApiClientException;
@@ -60,4 +61,35 @@ public SonosSuccess setTvPowerState(final String clientToken, final String playe
6061

6162
return postToApi(SonosSuccess.class, clientToken, String.format("/v1/players/%s/homeTheater/tvPowerState", playerId), payload);
6263
}
64+
65+
/**
66+
* Get home theater options for a specified player
67+
*
68+
* @see <a href="https://developer.sonos.com/reference/control-api/hometheater/getoptions/">Sonos docs</a>
69+
* @param clientToken for the user
70+
* @param playerId to get the options for
71+
* @return the home theater options for the specified player
72+
* @throws engineer.nightowl.sonos.api.exception.SonosApiClientException if an error occurs during the call
73+
* @throws engineer.nightowl.sonos.api.exception.SonosApiError if the API returns an error
74+
*/
75+
public SonosHomeTheaterOptions getOptions(final String clientToken, final String playerId) throws SonosApiClientException, SonosApiError
76+
{
77+
return getFromApi(SonosHomeTheaterOptions.class, clientToken, String.format("/v1/players/%s/homeTheater/options", playerId));
78+
}
79+
80+
/**
81+
* Set home theater options for a specifier player
82+
*
83+
* @see <a href="https://developer.sonos.com/reference/control-api/hometheater/setoptions/">Sonos docs</a>
84+
* @param clientToken for the user
85+
* @param playerId to set the options for
86+
* @param homeTheaterOptions configured {@link engineer.nightowl.sonos.api.domain.SonosHomeTheaterOptions}
87+
* @return the configured options if successful
88+
* @throws engineer.nightowl.sonos.api.exception.SonosApiClientException if an error occurs during the call
89+
* @throws engineer.nightowl.sonos.api.exception.SonosApiError if there is an error from the API
90+
*/
91+
public SonosHomeTheaterOptions setOptions(final String clientToken, final String playerId, final SonosHomeTheaterOptions homeTheaterOptions) throws SonosApiClientException, SonosApiError
92+
{
93+
return postToApi(SonosHomeTheaterOptions.class, clientToken, String.format("/v1/players/%s/homeTheater/options", playerId), homeTheaterOptions);
94+
}
6395
}

0 commit comments

Comments
 (0)