]> git.basschouten.com Git - openhab-addons.git/commitdiff
Add support for 4 zone model (#16043)
authormlobstein <michael.lobstein@gmail.com>
Wed, 13 Dec 2023 11:27:46 +0000 (05:27 -0600)
committerGitHub <noreply@github.com>
Wed, 13 Dec 2023 11:27:46 +0000 (12:27 +0100)
Signed-off-by: Michael Lobstein <michael.lobstein@gmail.com>
bundles/org.openhab.binding.monopriceaudio/README.md
bundles/org.openhab.binding.monopriceaudio/src/main/java/org/openhab/binding/monopriceaudio/internal/MonopriceAudioBindingConstants.java
bundles/org.openhab.binding.monopriceaudio/src/main/java/org/openhab/binding/monopriceaudio/internal/MonopriceAudioHandlerFactory.java
bundles/org.openhab.binding.monopriceaudio/src/main/java/org/openhab/binding/monopriceaudio/internal/communication/AmplifierModel.java
bundles/org.openhab.binding.monopriceaudio/src/main/java/org/openhab/binding/monopriceaudio/internal/handler/MonopriceAudioHandler.java
bundles/org.openhab.binding.monopriceaudio/src/main/resources/OH-INF/i18n/monopriceaudio.properties
bundles/org.openhab.binding.monopriceaudio/src/main/resources/OH-INF/thing/monoprice4.xml [new file with mode: 0644]

index f6a866fde77645e6580e59509acde9b0e9bec7e9..5c60d9909530ae6f9a4e8a9e53c001b2b43d6c94 100644 (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" }
index 2f08c00de325a14ce69501d6a1ffaef7168f9ba4..acdbb484a232cfd3088a942692d4f84fa8a08c31 100644 (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");
index b8e91bd8bec63660624256426ab24d1e4e8944b7..5cdad1175c983c722b9f01bcdef5c17d571db127 100644 (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);
index 6fc2dc6c8b839aa85e4358543ed096d262478163..fa3151e468c4ec30744a9aa6b29c3df89c005383 100644 (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")) {
index ab270297db4c37c0bbfd7c38f8e5ce2a22d9ed8c..b8e6782e79ca09d2077b143409fafc3d42dc1994 100644 (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);
                     }
                 }
             }
index 5920f7336776d2d04aa53b872b0881379b216692..263da56589e5a8ba2e8e04d0401707de30ad8f07 100644 (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
diff --git a/bundles/org.openhab.binding.monopriceaudio/src/main/resources/OH-INF/thing/monoprice4.xml b/bundles/org.openhab.binding.monopriceaudio/src/main/resources/OH-INF/thing/monoprice4.xml
new file mode 100644 (file)
index 0000000..65734b5
--- /dev/null
@@ -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>