Add support for 4 zone model (#16043)

Signed-off-by: Michael Lobstein <michael.lobstein@gmail.com>
This commit is contained in:
mlobstein 2023-12-13 05:27:46 -06:00 committed by GitHub
parent 992f65d8e2
commit 872013a700
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
7 changed files with 328 additions and 8 deletions

View File

@ -3,6 +3,7 @@
This binding can be used to control the following types of whole house multi-zone amplifier systems:
- Monoprice MPR-SG6Z (10761), Monoprice Passive Matrix (39261), Dayton Audio DAX66 or compatible clones
- Monoprice 44519 4 zone / 6 source variant of the 10761 **(untested)**
- Monoprice 31028 or OSD Audio PAM1270 **(untested)**
- Dayton Audio DAX88 **(untested)**
- Xantech MRC88, MX88, MRAUDIO8X8 or CM8X8 **(untested)**
@ -21,9 +22,11 @@ Or you can connect it for example to a Raspberry Pi and use [ser2net Linux tool]
## Supported Things
Monoprice 10761 & 39261 or Dayton Audio DAX66 amplifiers use the `amplifier` thing id. Up to 18 zones with 3 linked amps and 6 source inputs are supported.
Note: Compatible clones (including 4 zone versions) from McLELLAND, Factor, Soundavo, etc. should work as well.
Note: Compatible clones from McLELLAND, Factor, Soundavo, etc. should work as well.
***The following three thing types were implemented via available documentation only and have not been tested. Please open an issue for any bugs found when using these thing types.***
***The following thing types were implemented via available documentation only and have not been tested. Please open an issue for any bugs found when using these thing types.***
Monoprice 44519 4 zone variants use the `monoprice4` thing id. Up to 12 zones with 3 linked amps and 6 source inputs are supported.
Monoprice 31028 or OSD Audio PAM1270 70 volt amplifiers use the `monoprice70` thing id. 6 zones per amp (not linkable) and 2 source inputs are supported.
@ -63,7 +66,7 @@ The thing has the following configuration parameters (number of sources and zone
Some notes:
- On the 10761/DAX66 amp, activating the 'Page All Zones' feature can only be done through the +12v trigger input on the back of the amplifier.
- On the 10761/44519/DAX66 amp, activating the 'Page All Zones' feature can only be done through the +12v trigger input on the back of the amplifier.
- On Linux, you may get an error stating the serial port cannot be opened when the MonopriceAudio binding tries to load.
- You can get around this by adding the `openhab` user to the `dialout` group like this: `usermod -a -G dialout openhab`.
@ -121,6 +124,9 @@ monopriceaudio:amplifier:myamp "Monoprice WHA" [ serialPort="COM5", pollingInter
// Monoprice 10761, 39261 / DAX66 (serial over IP connection)
monopriceaudio:amplifier:myamp "Monoprice WHA" [ host="192.168.0.10", port=8080, pollingInterval=15, numZones=6, inputLabel1="Chromecast", inputLabel2="Radio", inputLabel3="CD Player", inputLabel4="Bluetooth Audio", inputLabel5="HTPC", inputLabel6="Phono" ]
// Monoprice 44519
monopriceaudio:monoprice4:myamp "Monoprice WHA" [ serialPort="COM5", pollingInterval=15, numZones=4, inputLabel1="Chromecast", inputLabel2="Radio", inputLabel3="CD Player", inputLabel4="Bluetooth Audio", inputLabel5="HTPC", inputLabel6="Phono" ]
// Monoprice 31028 or OSD Audio PAM1270
monopriceaudio:monoprice70:myamp "Monoprice WHA" [ serialPort="COM5", pollingInterval=30, numZones=6, inputLabel1="Source 0 - Bus", inputLabel2="Source 1 - Line" ]
@ -136,7 +142,7 @@ monopriceaudio:xantech:myamp "Xantech WHA" [ serialPort="COM5", pollingInterval=
monoprice.items:
```java
// substitute 'amplifier' for the appropriate thing id if using 31028, DAX88 or Xantech amplifier
// substitute 'amplifier' for the appropriate thing id if using 44519, 31028, DAX88 or Xantech amplifier
Switch all_allpower "All Zones Power" { channel="monopriceaudio:amplifier:myamp:all#allpower" }
Number all_source "Source Input [%s]" { channel="monopriceaudio:amplifier:myamp:all#allsource" }

View File

@ -30,6 +30,7 @@ public class MonopriceAudioBindingConstants {
// List of all Thing Type UIDs
// to avoid breaking existing installations, the 10761/DAX66 will still be known as 'amplifier'
public static final ThingTypeUID THING_TYPE_MP = new ThingTypeUID(BINDING_ID, "amplifier");
public static final ThingTypeUID THING_TYPE_MP4 = new ThingTypeUID(BINDING_ID, "monoprice4");
public static final ThingTypeUID THING_TYPE_MP70 = new ThingTypeUID(BINDING_ID, "monoprice70");
public static final ThingTypeUID THING_TYPE_DAX88 = new ThingTypeUID(BINDING_ID, "dax88");
public static final ThingTypeUID THING_TYPE_XT = new ThingTypeUID(BINDING_ID, "xantech");

View File

@ -43,8 +43,8 @@ import org.slf4j.LoggerFactory;
@Component(configurationPid = "binding.monopriceaudio", service = ThingHandlerFactory.class)
public class MonopriceAudioHandlerFactory extends BaseThingHandlerFactory {
private static final Set<ThingTypeUID> SUPPORTED_THING_TYPES_UIDS = Set.of(THING_TYPE_MP, THING_TYPE_MP70,
THING_TYPE_DAX88, THING_TYPE_XT);
private static final Set<ThingTypeUID> SUPPORTED_THING_TYPES_UIDS = Set.of(THING_TYPE_MP, THING_TYPE_MP4,
THING_TYPE_MP70, THING_TYPE_DAX88, THING_TYPE_XT);
private final SerialPortManager serialPortManager;
@ -73,6 +73,11 @@ public class MonopriceAudioHandlerFactory extends BaseThingHandlerFactory {
serialPortManager);
}
if (THING_TYPE_MP4.equals(thingTypeUID)) {
return new MonopriceAudioHandler(thing, AmplifierModel.MONOPRICE4, stateDescriptionProvider,
serialPortManager);
}
if (THING_TYPE_MP70.equals(thingTypeUID)) {
return new MonopriceAudioHandler(thing, AmplifierModel.MONOPRICE70, stateDescriptionProvider,
serialPortManager);

View File

@ -47,6 +47,21 @@ public enum AmplifierModel {
new StateOption("5", config.inputLabel5), new StateOption("6", config.inputLabel6));
}
},
// Monoprice 44519 4 zone variant
MONOPRICE4("<", "\r", "?", "", "#>", "PR", "CH", "VO", "MU", "TR", "BS", "BL", "DT", 38, -7, 7, 7, -10, 10, 10, 12,
6, true, List.of("11", "12", "13", "14", "21", "22", "23", "24", "31", "32", "33", "34")) {
@Override
public MonopriceAudioZoneDTO getZoneData(String newZoneData) {
return getMonopriceZoneData(newZoneData);
}
@Override
public List<StateOption> getSourceLabels(MonopriceAudioThingConfiguration config) {
return List.of(new StateOption("1", config.inputLabel1), new StateOption("2", config.inputLabel2),
new StateOption("3", config.inputLabel3), new StateOption("4", config.inputLabel4),
new StateOption("5", config.inputLabel5), new StateOption("6", config.inputLabel6));
}
},
// Dayton Audio DAX88
DAX88("<", "\r", "?", "", ">", "PR", "CH", "VO", "MU", "TR", "BS", "BL", "DT", 38, -12, 12, 12, -10, 10, 10, 8, 8,
true, List.of("01", "02", "03", "04", "05", "06", "07", "08")) {

View File

@ -441,6 +441,7 @@ public class MonopriceAudioHandler extends BaseThingHandler implements Monoprice
@Override
public void onNewMessageEvent(MonopriceAudioMessageEvent evt) {
updateStatus(ThingStatus.ONLINE);
String key = evt.getKey();
switch (key) {
@ -510,8 +511,6 @@ public class MonopriceAudioHandler extends BaseThingHandler implements Monoprice
if (error != null) {
closeConnection();
updateStatus(ThingStatus.OFFLINE, ThingStatusDetail.COMMUNICATION_ERROR, error);
} else {
updateStatus(ThingStatus.ONLINE);
}
}
}

View File

@ -65,6 +65,34 @@ thing-type.monopriceaudio.dax88.group.zone7.label = Zone 7
thing-type.monopriceaudio.dax88.group.zone7.description = The Controls for Zone 7
thing-type.monopriceaudio.dax88.group.zone8.label = Zone 8
thing-type.monopriceaudio.dax88.group.zone8.description = The Controls for Zone 8
thing-type.monopriceaudio.monoprice4.label = Monoprice 44519 4 Zone Amplifier
thing-type.monopriceaudio.monoprice4.description = A Multi-zone Whole House Amplifier System
thing-type.monopriceaudio.monoprice4.group.all.label = All Zones
thing-type.monopriceaudio.monoprice4.group.all.description = Control All Zones Simultaneously
thing-type.monopriceaudio.monoprice4.group.zone1.label = Zone 1
thing-type.monopriceaudio.monoprice4.group.zone1.description = The Controls for Zone 1
thing-type.monopriceaudio.monoprice4.group.zone10.label = Zone 10
thing-type.monopriceaudio.monoprice4.group.zone10.description = The Controls for Zone 10
thing-type.monopriceaudio.monoprice4.group.zone11.label = Zone 11
thing-type.monopriceaudio.monoprice4.group.zone11.description = The Controls for Zone 11
thing-type.monopriceaudio.monoprice4.group.zone12.label = Zone 12
thing-type.monopriceaudio.monoprice4.group.zone12.description = The Controls for Zone 12
thing-type.monopriceaudio.monoprice4.group.zone2.label = Zone 2
thing-type.monopriceaudio.monoprice4.group.zone2.description = The Controls for Zone 2
thing-type.monopriceaudio.monoprice4.group.zone3.label = Zone 3
thing-type.monopriceaudio.monoprice4.group.zone3.description = The Controls for Zone 3
thing-type.monopriceaudio.monoprice4.group.zone4.label = Zone 4
thing-type.monopriceaudio.monoprice4.group.zone4.description = The Controls for Zone 4
thing-type.monopriceaudio.monoprice4.group.zone5.label = Zone 5
thing-type.monopriceaudio.monoprice4.group.zone5.description = The Controls for Zone 5
thing-type.monopriceaudio.monoprice4.group.zone6.label = Zone 6
thing-type.monopriceaudio.monoprice4.group.zone6.description = The Controls for Zone 6
thing-type.monopriceaudio.monoprice4.group.zone7.label = Zone 7
thing-type.monopriceaudio.monoprice4.group.zone7.description = The Controls for Zone 7
thing-type.monopriceaudio.monoprice4.group.zone8.label = Zone 8
thing-type.monopriceaudio.monoprice4.group.zone8.description = The Controls for Zone 8
thing-type.monopriceaudio.monoprice4.group.zone9.label = Zone 9
thing-type.monopriceaudio.monoprice4.group.zone9.description = The Controls for Zone 9
thing-type.monopriceaudio.monoprice70.label = Monoprice 31028 70V Amplifier
thing-type.monopriceaudio.monoprice70.description = A Multi-zone Whole House Amplifier System
thing-type.monopriceaudio.monoprice70.group.all.label = All Zones
@ -180,6 +208,34 @@ thing-type.config.monopriceaudio.dax88.port.label = Port
thing-type.config.monopriceaudio.dax88.port.description = Communication Port for Serial over IP connection to the Dayton Amplifier
thing-type.config.monopriceaudio.dax88.serialPort.label = Serial Port
thing-type.config.monopriceaudio.dax88.serialPort.description = Serial Port to Use for Connecting to the Dayton Amplifier
thing-type.config.monopriceaudio.monoprice4.disableKeypadPolling.label = Disable Keypad Polling
thing-type.config.monopriceaudio.monoprice4.disableKeypadPolling.description = If physical keypads are not used, this option will disable polling the amplifier for zone updates
thing-type.config.monopriceaudio.monoprice4.host.label = Address
thing-type.config.monopriceaudio.monoprice4.host.description = Host Name or IP Address of the Monoprice Amplifier or Serial over IP device
thing-type.config.monopriceaudio.monoprice4.ignoreZones.label = Ignore Zones
thing-type.config.monopriceaudio.monoprice4.ignoreZones.description = (Optional) A Comma Seperated List of Zone Numbers That Will Ignore the 'All Zone' (Except All Off) Commands (ie: 1,6,10)
thing-type.config.monopriceaudio.monoprice4.initialAllVolume.label = Initial All Volume
thing-type.config.monopriceaudio.monoprice4.initialAllVolume.description = When 'All' Zones Are Activated, the Volume Will Reset to This Value (1-30; default 10) to Prevent Excessive Blaring of Sound ;)
thing-type.config.monopriceaudio.monoprice4.inputLabel1.label = Source 1 Input Label
thing-type.config.monopriceaudio.monoprice4.inputLabel1.description = Friendly Name for the Input Source to Be Displayed in the UI (ie: Chromecast, Radio, CD, etc.)
thing-type.config.monopriceaudio.monoprice4.inputLabel2.label = Source 2 Input Label
thing-type.config.monopriceaudio.monoprice4.inputLabel2.description = Friendly Name for the Input Source to Be Displayed in the UI (ie: Chromecast, Radio, CD, etc.)
thing-type.config.monopriceaudio.monoprice4.inputLabel3.label = Source 3 Input Label
thing-type.config.monopriceaudio.monoprice4.inputLabel3.description = Friendly Name for the Input Source to Be Displayed in the UI (ie: Chromecast, Radio, CD, etc.)
thing-type.config.monopriceaudio.monoprice4.inputLabel4.label = Source 4 Input Label
thing-type.config.monopriceaudio.monoprice4.inputLabel4.description = Friendly Name for the Input Source to Be Displayed in the UI (ie: Chromecast, Radio, CD, etc.)
thing-type.config.monopriceaudio.monoprice4.inputLabel5.label = Source 5 Input Label
thing-type.config.monopriceaudio.monoprice4.inputLabel5.description = Friendly Name for the Input Source to Be Displayed in the UI (ie: Chromecast, Radio, CD, etc.)
thing-type.config.monopriceaudio.monoprice4.inputLabel6.label = Source 6 Input Label
thing-type.config.monopriceaudio.monoprice4.inputLabel6.description = Friendly Name for the Input Source to Be Displayed in the UI (ie: Chromecast, Radio, CD, etc.)
thing-type.config.monopriceaudio.monoprice4.numZones.label = Number of Zones
thing-type.config.monopriceaudio.monoprice4.numZones.description = Number of Zones on the Amplifier to Utilize in the Binding (Up to 12 Zones With 3 Amplifiers Connected Together)
thing-type.config.monopriceaudio.monoprice4.pollingInterval.label = Polling Interval
thing-type.config.monopriceaudio.monoprice4.pollingInterval.description = Configures How Often to Poll the Amplifier to Check for Zone Updates (5-60; Default 15)
thing-type.config.monopriceaudio.monoprice4.port.label = Port
thing-type.config.monopriceaudio.monoprice4.port.description = Communication Port for Serial over IP connection to the Monoprice Amplifier (8080 for amps with built-in Serial over IP)
thing-type.config.monopriceaudio.monoprice4.serialPort.label = Serial Port
thing-type.config.monopriceaudio.monoprice4.serialPort.description = Serial Port to Use for Connecting to the Monoprice Amplifier
thing-type.config.monopriceaudio.monoprice70.host.label = Address
thing-type.config.monopriceaudio.monoprice70.host.description = Host Name or IP Address of the Machine Connected to the Monoprice Amplifier (Serial over IP)
thing-type.config.monopriceaudio.monoprice70.ignoreZones.label = Ignore Zones

View File

@ -0,0 +1,238 @@
<?xml version="1.0" encoding="UTF-8"?>
<thing:thing-descriptions bindingId="monopriceaudio"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:thing="https://openhab.org/schemas/thing-description/v1.0.0"
xsi:schemaLocation="https://openhab.org/schemas/thing-description/v1.0.0 https://openhab.org/schemas/thing-description-1.0.0.xsd">
<!-- Monoprice 44519 4 zone/6 source variant -->
<thing-type id="monoprice4">
<label>Monoprice 44519 4 Zone Amplifier</label>
<description>
A Multi-zone Whole House Amplifier System
</description>
<channel-groups>
<channel-group id="all" typeId="all">
<label>All Zones</label>
<description>Control All Zones Simultaneously</description>
</channel-group>
<channel-group id="zone1" typeId="zone">
<label>Zone 1</label>
<description>The Controls for Zone 1</description>
</channel-group>
<channel-group id="zone2" typeId="zone">
<label>Zone 2</label>
<description>The Controls for Zone 2</description>
</channel-group>
<channel-group id="zone3" typeId="zone">
<label>Zone 3</label>
<description>The Controls for Zone 3</description>
</channel-group>
<channel-group id="zone4" typeId="zone">
<label>Zone 4</label>
<description>The Controls for Zone 4</description>
</channel-group>
<channel-group id="zone5" typeId="zone">
<label>Zone 5</label>
<description>The Controls for Zone 5</description>
</channel-group>
<channel-group id="zone6" typeId="zone">
<label>Zone 6</label>
<description>The Controls for Zone 6</description>
</channel-group>
<channel-group id="zone7" typeId="zone">
<label>Zone 7</label>
<description>The Controls for Zone 7</description>
</channel-group>
<channel-group id="zone8" typeId="zone">
<label>Zone 8</label>
<description>The Controls for Zone 8</description>
</channel-group>
<channel-group id="zone9" typeId="zone">
<label>Zone 9</label>
<description>The Controls for Zone 9</description>
</channel-group>
<channel-group id="zone10" typeId="zone">
<label>Zone 10</label>
<description>The Controls for Zone 10</description>
</channel-group>
<channel-group id="zone11" typeId="zone">
<label>Zone 11</label>
<description>The Controls for Zone 11</description>
</channel-group>
<channel-group id="zone12" typeId="zone">
<label>Zone 12</label>
<description>The Controls for Zone 12</description>
</channel-group>
</channel-groups>
<config-description>
<parameter name="serialPort" type="text" required="false">
<context>serial-port</context>
<limitToOptions>false</limitToOptions>
<label>Serial Port</label>
<description>Serial Port to Use for Connecting to the Monoprice Amplifier</description>
</parameter>
<parameter name="host" type="text" required="false">
<context>network-address</context>
<label>Address</label>
<description>Host Name or IP Address of the Monoprice Amplifier or Serial over IP device</description>
</parameter>
<parameter name="port" type="integer" min="1" max="65535" required="false">
<label>Port</label>
<description>Communication Port for Serial over IP connection to the Monoprice Amplifier (8080 for amps with
built-in Serial over IP)</description>
</parameter>
<parameter name="numZones" type="integer" min="1" max="12" required="true">
<label>Number of Zones</label>
<description>Number of Zones on the Amplifier to Utilize in the Binding (Up to 12 Zones With 3 Amplifiers Connected
Together)</description>
<default>4</default>
</parameter>
<parameter name="pollingInterval" type="integer" min="5" max="60" unit="s" required="false">
<label>Polling Interval</label>
<description>Configures How Often to Poll the Amplifier to Check for Zone Updates (5-60; Default 15)</description>
<default>15</default>
</parameter>
<parameter name="ignoreZones" type="text" required="false">
<label>Ignore Zones</label>
<description>(Optional) A Comma Seperated List of Zone Numbers That Will Ignore the 'All Zone' (Except All Off)
Commands (ie: 1,6,10)</description>
</parameter>
<parameter name="initialAllVolume" type="integer" min="1" max="30" required="false">
<label>Initial All Volume</label>
<description>When 'All' Zones Are Activated, the Volume Will Reset to This Value (1-30; default 10) to Prevent
Excessive Blaring of Sound ;)</description>
<default>10</default>
</parameter>
<parameter name="inputLabel1" type="text" required="false">
<label>Source 1 Input Label</label>
<description>Friendly Name for the Input Source to Be Displayed in the UI (ie: Chromecast, Radio, CD, etc.)</description>
<default>Source 1</default>
</parameter>
<parameter name="inputLabel2" type="text" required="false">
<label>Source 2 Input Label</label>
<description>Friendly Name for the Input Source to Be Displayed in the UI (ie: Chromecast, Radio, CD, etc.)</description>
<default>Source 2</default>
</parameter>
<parameter name="inputLabel3" type="text" required="false">
<label>Source 3 Input Label</label>
<description>Friendly Name for the Input Source to Be Displayed in the UI (ie: Chromecast, Radio, CD, etc.)</description>
<default>Source 3</default>
</parameter>
<parameter name="inputLabel4" type="text" required="false">
<label>Source 4 Input Label</label>
<description>Friendly Name for the Input Source to Be Displayed in the UI (ie: Chromecast, Radio, CD, etc.)</description>
<default>Source 4</default>
</parameter>
<parameter name="inputLabel5" type="text" required="false">
<label>Source 5 Input Label</label>
<description>Friendly Name for the Input Source to Be Displayed in the UI (ie: Chromecast, Radio, CD, etc.)</description>
<default>Source 5</default>
</parameter>
<parameter name="inputLabel6" type="text" required="false">
<label>Source 6 Input Label</label>
<description>Friendly Name for the Input Source to Be Displayed in the UI (ie: Chromecast, Radio, CD, etc.)</description>
<default>Source 6</default>
</parameter>
<parameter name="disableKeypadPolling" type="boolean" required="false">
<label>Disable Keypad Polling</label>
<description>If physical keypads are not used, this option will disable polling the amplifier for zone updates</description>
<default>false</default>
</parameter>
</config-description>
</thing-type>
<channel-group-type id="all">
<label>All Zones</label>
<description>Control All Zones Simultaneously</description>
<channels>
<channel id="allpower" typeId="allpower"/>
<channel id="allsource" typeId="source"/>
<channel id="allvolume" typeId="system.volume"/>
<channel id="allmute" typeId="system.mute"/>
</channels>
</channel-group-type>
<channel-group-type id="zone">
<label>Zone Controls</label>
<description>The Controls for the Zone</description>
<channels>
<channel id="power" typeId="system.power"/>
<channel id="source" typeId="source"/>
<channel id="volume" typeId="system.volume"/>
<channel id="mute" typeId="system.mute"/>
<channel id="treble" typeId="treble"/>
<channel id="bass" typeId="bass"/>
<channel id="balance" typeId="balance"/>
<channel id="dnd" typeId="dnd"/>
<channel id="page" typeId="page"/>
<channel id="keypad" typeId="keypad"/>
</channels>
</channel-group-type>
<channel-type id="allpower">
<item-type>Switch</item-type>
<label>All On</label>
<description>Turn All Zones On or Off</description>
</channel-type>
<channel-type id="source">
<item-type>Number</item-type>
<label>Source Input</label>
<description>Select the Source Input</description>
<state min="1" max="6"/>
</channel-type>
<channel-type id="treble">
<item-type>Number</item-type>
<label>Treble Adjustment</label>
<description>Adjust the Treble</description>
<state min="-7" max="7" step="1" pattern="%d"/>
</channel-type>
<channel-type id="bass">
<item-type>Number</item-type>
<label>Bass Adjustment</label>
<description>Adjust the Bass</description>
<state min="-7" max="7" step="1" pattern="%d"/>
</channel-type>
<channel-type id="balance">
<item-type>Number</item-type>
<label>Balance Adjustment</label>
<description>Adjust the Balance</description>
<state min="-10" max="10" step="1" pattern="%d"/>
</channel-type>
<channel-type id="dnd">
<item-type>Switch</item-type>
<label>Do Not Disturb</label>
<description>Controls if the Zone Should Ignore an Incoming Audio Page</description>
</channel-type>
<channel-type id="page">
<item-type>Contact</item-type>
<label>Page Active</label>
<description>Indicates if the Page Mode is Active for This Zone</description>
<state readOnly="true">
<options>
<option value="CLOSED">Inactive</option>
<option value="OPEN">Active</option>
</options>
</state>
</channel-type>
<channel-type id="keypad">
<item-type>Contact</item-type>
<label>Keypad Connected</label>
<description>Indicates if a Physical Keypad is Attached to This Zone</description>
<state readOnly="true">
<options>
<option value="CLOSED">Disconnected</option>
<option value="OPEN">Connected</option>
</options>
</state>
</channel-type>
</thing:thing-descriptions>