diff --git a/.gitignore b/.gitignore
index 44256908110c3..ab07ccf1bd95f 100644
--- a/.gitignore
+++ b/.gitignore
@@ -24,3 +24,4 @@ features/**/src/main/feature
.vscode
.factorypath
pom.xml.versionsBackup
+bundles/org.openhab.binding.amplipi/.openapi-generator
diff --git a/CODEOWNERS b/CODEOWNERS
index 300354bcf8e56..884d35675c67c 100644
--- a/CODEOWNERS
+++ b/CODEOWNERS
@@ -20,6 +20,7 @@
/bundles/org.openhab.binding.amazondashbutton/ @OLibutzki
/bundles/org.openhab.binding.amazonechocontrol/ @mgeramb
/bundles/org.openhab.binding.ambientweather/ @mhilbush
+/bundles/org.openhab.binding.amplipi/ @kaikreuzer
/bundles/org.openhab.binding.androiddebugbridge/ @GiviMAD
/bundles/org.openhab.binding.astro/ @gerrieg
/bundles/org.openhab.binding.atlona/ @tmrobert8
diff --git a/bom/openhab-addons/pom.xml b/bom/openhab-addons/pom.xml
index 4c2c4ac9928c3..0d5b98e0924c6 100644
--- a/bom/openhab-addons/pom.xml
+++ b/bom/openhab-addons/pom.xml
@@ -91,6 +91,11 @@
org.openhab.binding.ambientweather${project.version}
+
+ org.openhab.addons.bundles
+ org.openhab.binding.amplipi
+ ${project.version}
+ org.openhab.addons.bundlesorg.openhab.binding.androiddebugbridge
diff --git a/bundles/org.openhab.binding.amplipi/NOTICE b/bundles/org.openhab.binding.amplipi/NOTICE
new file mode 100644
index 0000000000000..38d625e349232
--- /dev/null
+++ b/bundles/org.openhab.binding.amplipi/NOTICE
@@ -0,0 +1,13 @@
+This content is produced and maintained by the openHAB project.
+
+* Project home: https://www.openhab.org
+
+== Declared Project Licenses
+
+This program and the accompanying materials are made available under the terms
+of the Eclipse Public License 2.0 which is available at
+https://www.eclipse.org/legal/epl-2.0/.
+
+== Source Code
+
+https://github.com/openhab/openhab-addons
diff --git a/bundles/org.openhab.binding.amplipi/README.md b/bundles/org.openhab.binding.amplipi/README.md
new file mode 100644
index 0000000000000..b8d90886cb048
--- /dev/null
+++ b/bundles/org.openhab.binding.amplipi/README.md
@@ -0,0 +1,56 @@
+# AmpliPi Binding
+
+_Give some details about what this binding is meant for - a protocol, system, specific device._
+
+_If possible, provide some resources like pictures, a video, etc. to give an impression of what can be done with this binding. You can place such resources into a `doc` folder next to this README.md._
+
+## Supported Things
+
+_Please describe the different supported things / devices within this section._
+_Which different types are supported, which models were tested etc.?_
+_Note that it is planned to generate some part of this based on the XML files within ```src/main/resources/OH-INF/thing``` of your binding._
+
+## Discovery
+
+_Describe the available auto-discovery features here. Mention for what it works and what needs to be kept in mind when using it._
+
+## Binding Configuration
+
+_If your binding requires or supports general configuration settings, please create a folder ```cfg``` and place the configuration file ```.cfg``` inside it. In this section, you should link to this file and provide some information about the options. The file could e.g. look like:_
+
+```
+# Configuration for the AmpliPi Binding
+#
+# Default secret key for the pairing of the AmpliPi Thing.
+# It has to be between 10-40 (alphanumeric) characters.
+# This may be changed by the user for security reasons.
+secret=openHABSecret
+```
+
+_Note that it is planned to generate some part of this based on the information that is available within ```src/main/resources/OH-INF/binding``` of your binding._
+
+_If your binding does not offer any generic configurations, you can remove this section completely._
+
+## Thing Configuration
+
+_Describe what is needed to manually configure a thing, either through the UI or via a thing-file. This should be mainly about its mandatory and optional configuration parameters. A short example entry for a thing file can help!_
+
+_Note that it is planned to generate some part of this based on the XML files within ```src/main/resources/OH-INF/thing``` of your binding._
+
+## Channels
+
+_Here you should provide information about available channel types, what their meaning is and how they can be used._
+
+_Note that it is planned to generate some part of this based on the XML files within ```src/main/resources/OH-INF/thing``` of your binding._
+
+| channel | type | description |
+|----------|--------|------------------------------|
+| control | Switch | This is the control channel |
+
+## Full Example
+
+_Provide a full usage example based on textual configuration files (*.things, *.items, *.sitemap)._
+
+## Any custom content here!
+
+_Feel free to add additional sections for whatever you think should also be mentioned about your binding!_
diff --git a/bundles/org.openhab.binding.amplipi/amplipi-api.yml b/bundles/org.openhab.binding.amplipi/amplipi-api.yml
new file mode 100644
index 0000000000000..fe1731dfac0ba
--- /dev/null
+++ b/bundles/org.openhab.binding.amplipi/amplipi-api.yml
@@ -0,0 +1,4439 @@
+openapi: 3.0.2
+info:
+ title: AmpliPi
+ description: | # The links in the description below are tested to work with redoc and may not be portable
+ This is the AmpliPi home audio system's control server.
+
+ # Configuration
+
+ This web interface allows you to control and configure your AmpliPi device.
+ At the moment the API is the only way to configure the AmpliPi.
+
+ ## Try it out!
+
+ __Using this web interface to test API commands:__
+
+ 1. Go to an API request
+ 1. Pick one of the examples
+ 2. Edit it
+ 3. Press try button, it will send an API command/request to the AmpliPi
+
+ __Try using the get status:__
+
+ 1. Go to [Status -> Get Status](#get-/api/)
+ 2. Click the Try button, you will see a response below with the full status/config of the AmpliPi controller
+
+ __Try creating a new group:__
+
+ 1. Go to [Group -> Create Group](#post-/api/group)
+ 2. Click Example
+ 3. Edit the zones and group name
+ 4. Click the try button, you will see a response with the newly created group
+
+ __Here are some other things that you might want to change:__
+
+ - [Stream -> Create new stream](#post-/api/stream)
+ - [Zone -> Update Zone](#patch-/api/zones/-zid-) (to change the zone name)
+ - [Preset -> Create preset](#post-/api/preset) (Have a look at the model to see what can be added here)
+
+ # More Info
+
+ Check out all of the different things you can do with this API:
+
+ - [Status](#tag--status)
+ - [Source](#tag--source)
+ - [Zone](#tag--zone)
+ - [Group](#tag--group)
+ - [Stream](#tag--stream)
+ - [Preset](#tag--preset)
+
+ # OpenAPI
+
+ This API is documented using the OpenAPI specification
+
+ version: '1.0'
+ contact:
+ email: info@micro-nova.com
+ name: Micronova
+ url: http://micro-nova.com
+ license:
+ name: GPL
+ url: /license
+servers:
+- url: ''
+ description: AmpliPi Controller
+paths:
+ /api:
+ get:
+ tags:
+ - status
+ summary: Get Status
+ description: 'Get the system status and configuration '
+ operationId: get_status_api_get
+ responses:
+ '200':
+ description: Successful Response
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/Status'
+ examples:
+ Status of Jason's AmpliPi:
+ value:
+ groups:
+ - id: 0
+ mute: false
+ name: Whole House
+ source_id: null
+ vol_delta: -44
+ zones:
+ - 0
+ - 1
+ - 2
+ - 3
+ - 5
+ - 6
+ - 7
+ - 8
+ - 9
+ - 10
+ - 11
+ - id: 1
+ mute: true
+ name: KitchLivDining
+ source_id: 0
+ vol_delta: -49
+ zones:
+ - 3
+ - 9
+ - 10
+ - 11
+ presets:
+ - id: 10000
+ name: Mute All
+ state:
+ zones:
+ - id: 0
+ mute: true
+ - id: 1
+ mute: true
+ - id: 2
+ mute: true
+ - id: 3
+ mute: true
+ - id: 4
+ mute: true
+ - id: 5
+ mute: true
+ sources:
+ - id: 0
+ input: stream=90890
+ name: J1
+ - id: 1
+ input: stream=44590
+ name: J2
+ - id: 2
+ input: local
+ name: Marc
+ - id: 3
+ input: local
+ name: Source 4
+ streams:
+ - id: 90890
+ info:
+ album: Far (Deluxe Version)
+ artist: Regina Spektor
+ img_url: http://mediaserver-cont-dc6-1-v4v6.pandora.com/images/public/int/2/1/5/4/093624974512_500W_500H.jpg
+ station: Regina Spektor Radio
+ track: Eet
+ name: Regina Spektor Radio
+ password: ''
+ station: '4473713754798410236'
+ status: playing
+ type: pandora
+ user: example1@micro-nova.com
+ - id: 90891
+ info:
+ details: No info available
+ name: Matt and Kim Radio
+ password: ''
+ station: '4610303469018478727'
+ status: disconnected
+ type: pandora
+ user: example2@micro-nova.com
+ - id: 90892
+ info:
+ details: No info available
+ name: Pink Radio
+ password: ''
+ station: '4326539910057675260'
+ status: disconnected
+ type: pandora
+ user: example3@micro-nova.com
+ - id: 44590
+ info:
+ details: No info available
+ name: Jason's iPhone
+ status: connected
+ type: shairport
+ - id: 4894
+ info:
+ details: No info available
+ name: Rnay
+ status: disconnected
+ type: shairport
+ info:
+ version: 0.0.1
+ zones:
+ - disabled: false
+ id: 0
+ mute: false
+ name: Local
+ source_id: 1
+ vol: -35
+ - disabled: false
+ id: 1
+ mute: false
+ name: Office
+ source_id: 0
+ vol: -41
+ - disabled: false
+ id: 2
+ mute: true
+ name: Laundry Room
+ source_id: 0
+ vol: -48
+ - disabled: false
+ id: 3
+ mute: true
+ name: Dining Room
+ source_id: 0
+ vol: -44
+ - disabled: true
+ id: 4
+ mute: true
+ name: BROKEN
+ source_id: 0
+ vol: -50
+ - disabled: false
+ id: 5
+ mute: true
+ name: Guest Bedroom
+ source_id: 0
+ vol: -48
+ - disabled: false
+ id: 6
+ mute: true
+ name: Main Bedroom
+ source_id: 0
+ vol: -40
+ - disabled: false
+ id: 7
+ mute: true
+ name: Main Bathroom
+ source_id: 0
+ vol: -44
+ - disabled: false
+ id: 8
+ mute: true
+ name: Master Bathroom
+ source_id: 0
+ vol: -41
+ - disabled: false
+ id: 9
+ mute: true
+ name: Kitchen High
+ source_id: 0
+ vol: -53
+ - disabled: false
+ id: 10
+ mute: true
+ name: kitchen Low
+ source_id: 0
+ vol: -52
+ - disabled: false
+ id: 11
+ mute: true
+ name: Living Room
+ source_id: 0
+ vol: -46
+ /api/:
+ get:
+ tags:
+ - status
+ summary: Get Status
+ description: 'Get the system status and configuration '
+ operationId: get_status_api__get
+ responses:
+ '200':
+ description: Successful Response
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/Status'
+ examples:
+ Status of Jason's AmpliPi:
+ value:
+ groups:
+ - id: 0
+ mute: false
+ name: Whole House
+ source_id: null
+ vol_delta: -44
+ zones:
+ - 0
+ - 1
+ - 2
+ - 3
+ - 5
+ - 6
+ - 7
+ - 8
+ - 9
+ - 10
+ - 11
+ - id: 1
+ mute: true
+ name: KitchLivDining
+ source_id: 0
+ vol_delta: -49
+ zones:
+ - 3
+ - 9
+ - 10
+ - 11
+ presets:
+ - id: 10000
+ name: Mute All
+ state:
+ zones:
+ - id: 0
+ mute: true
+ - id: 1
+ mute: true
+ - id: 2
+ mute: true
+ - id: 3
+ mute: true
+ - id: 4
+ mute: true
+ - id: 5
+ mute: true
+ sources:
+ - id: 0
+ input: stream=90890
+ name: J1
+ - id: 1
+ input: stream=44590
+ name: J2
+ - id: 2
+ input: local
+ name: Marc
+ - id: 3
+ input: local
+ name: Source 4
+ streams:
+ - id: 90890
+ info:
+ album: Far (Deluxe Version)
+ artist: Regina Spektor
+ img_url: http://mediaserver-cont-dc6-1-v4v6.pandora.com/images/public/int/2/1/5/4/093624974512_500W_500H.jpg
+ station: Regina Spektor Radio
+ track: Eet
+ name: Regina Spektor Radio
+ password: ''
+ station: '4473713754798410236'
+ status: playing
+ type: pandora
+ user: example1@micro-nova.com
+ - id: 90891
+ info:
+ details: No info available
+ name: Matt and Kim Radio
+ password: ''
+ station: '4610303469018478727'
+ status: disconnected
+ type: pandora
+ user: example2@micro-nova.com
+ - id: 90892
+ info:
+ details: No info available
+ name: Pink Radio
+ password: ''
+ station: '4326539910057675260'
+ status: disconnected
+ type: pandora
+ user: example3@micro-nova.com
+ - id: 44590
+ info:
+ details: No info available
+ name: Jason's iPhone
+ status: connected
+ type: shairport
+ - id: 4894
+ info:
+ details: No info available
+ name: Rnay
+ status: disconnected
+ type: shairport
+ info:
+ version: 0.0.1
+ zones:
+ - disabled: false
+ id: 0
+ mute: false
+ name: Local
+ source_id: 1
+ vol: -35
+ - disabled: false
+ id: 1
+ mute: false
+ name: Office
+ source_id: 0
+ vol: -41
+ - disabled: false
+ id: 2
+ mute: true
+ name: Laundry Room
+ source_id: 0
+ vol: -48
+ - disabled: false
+ id: 3
+ mute: true
+ name: Dining Room
+ source_id: 0
+ vol: -44
+ - disabled: true
+ id: 4
+ mute: true
+ name: BROKEN
+ source_id: 0
+ vol: -50
+ - disabled: false
+ id: 5
+ mute: true
+ name: Guest Bedroom
+ source_id: 0
+ vol: -48
+ - disabled: false
+ id: 6
+ mute: true
+ name: Main Bedroom
+ source_id: 0
+ vol: -40
+ - disabled: false
+ id: 7
+ mute: true
+ name: Main Bathroom
+ source_id: 0
+ vol: -44
+ - disabled: false
+ id: 8
+ mute: true
+ name: Master Bathroom
+ source_id: 0
+ vol: -41
+ - disabled: false
+ id: 9
+ mute: true
+ name: Kitchen High
+ source_id: 0
+ vol: -53
+ - disabled: false
+ id: 10
+ mute: true
+ name: kitchen Low
+ source_id: 0
+ vol: -52
+ - disabled: false
+ id: 11
+ mute: true
+ name: Living Room
+ source_id: 0
+ vol: -46
+ /api/sources:
+ get:
+ tags:
+ - source
+ summary: Get Sources
+ description: 'Get all sources '
+ operationId: get_sources_api_sources_get
+ responses:
+ '200':
+ description: Successful Response
+ content:
+ application/json:
+ schema:
+ title: Response Get Sources Api Sources Get
+ type: object
+ additionalProperties:
+ type: array
+ items:
+ $ref: '#/components/schemas/Source'
+ /api/sources/{sid}:
+ get:
+ tags:
+ - source
+ summary: Get Source
+ description: 'Get Source with id=**sid** '
+ operationId: get_source_api_sources__sid__get
+ parameters:
+ - description: Source ID
+ required: true
+ schema:
+ title: Sid
+ maximum: 3.0
+ minimum: 0.0
+ type: integer
+ description: Source ID
+ name: sid
+ in: path
+ examples:
+ '1':
+ value: 0
+ summary: '1'
+ '2':
+ value: 1
+ summary: '2'
+ '3':
+ value: 2
+ summary: '3'
+ '4':
+ value: 3
+ summary: '4'
+ responses:
+ '200':
+ description: Successful Response
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/Source'
+ examples:
+ stream connected:
+ value:
+ id: 1
+ name: '1'
+ input: stream=1009
+ nothing connected:
+ value:
+ id: 2
+ name: '2'
+ input: ''
+ rca connected:
+ value:
+ id: 3
+ name: '3'
+ input: local
+ '422':
+ description: Validation Error
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/HTTPValidationError'
+ patch:
+ tags:
+ - source
+ summary: Set Source
+ description: 'Update a source''s configuration (source=**sid**) '
+ operationId: set_source_api_sources__sid__patch
+ parameters:
+ - description: Source ID
+ required: true
+ schema:
+ title: Sid
+ maximum: 3.0
+ minimum: 0.0
+ type: integer
+ description: Source ID
+ name: sid
+ in: path
+ examples:
+ '1':
+ value: 0
+ summary: '1'
+ '2':
+ value: 1
+ summary: '2'
+ '3':
+ value: 2
+ summary: '3'
+ '4':
+ value: 3
+ summary: '4'
+ requestBody:
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/SourceUpdate'
+ examples:
+ Update Input to RCA input:
+ value:
+ input: local
+ Update name:
+ value:
+ name: J2
+ Update Input to Matt and Kim Radio:
+ value:
+ input: stream=10001
+ responses:
+ '200':
+ description: Successful Response
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/Status'
+ examples:
+ Status of Jason's AmpliPi:
+ value:
+ groups:
+ - id: 0
+ mute: false
+ name: Whole House
+ source_id: null
+ vol_delta: -44
+ zones:
+ - 0
+ - 1
+ - 2
+ - 3
+ - 5
+ - 6
+ - 7
+ - 8
+ - 9
+ - 10
+ - 11
+ - id: 1
+ mute: true
+ name: KitchLivDining
+ source_id: 0
+ vol_delta: -49
+ zones:
+ - 3
+ - 9
+ - 10
+ - 11
+ presets:
+ - id: 10000
+ name: Mute All
+ state:
+ zones:
+ - id: 0
+ mute: true
+ - id: 1
+ mute: true
+ - id: 2
+ mute: true
+ - id: 3
+ mute: true
+ - id: 4
+ mute: true
+ - id: 5
+ mute: true
+ sources:
+ - id: 0
+ input: stream=90890
+ name: J1
+ - id: 1
+ input: stream=44590
+ name: J2
+ - id: 2
+ input: local
+ name: Marc
+ - id: 3
+ input: local
+ name: Source 4
+ streams:
+ - id: 90890
+ info:
+ album: Far (Deluxe Version)
+ artist: Regina Spektor
+ img_url: http://mediaserver-cont-dc6-1-v4v6.pandora.com/images/public/int/2/1/5/4/093624974512_500W_500H.jpg
+ station: Regina Spektor Radio
+ track: Eet
+ name: Regina Spektor Radio
+ password: ''
+ station: '4473713754798410236'
+ status: playing
+ type: pandora
+ user: example1@micro-nova.com
+ - id: 90891
+ info:
+ details: No info available
+ name: Matt and Kim Radio
+ password: ''
+ station: '4610303469018478727'
+ status: disconnected
+ type: pandora
+ user: example2@micro-nova.com
+ - id: 90892
+ info:
+ details: No info available
+ name: Pink Radio
+ password: ''
+ station: '4326539910057675260'
+ status: disconnected
+ type: pandora
+ user: example3@micro-nova.com
+ - id: 44590
+ info:
+ details: No info available
+ name: Jason's iPhone
+ status: connected
+ type: shairport
+ - id: 4894
+ info:
+ details: No info available
+ name: Rnay
+ status: disconnected
+ type: shairport
+ info:
+ version: 0.0.1
+ zones:
+ - disabled: false
+ id: 0
+ mute: false
+ name: Local
+ source_id: 1
+ vol: -35
+ - disabled: false
+ id: 1
+ mute: false
+ name: Office
+ source_id: 0
+ vol: -41
+ - disabled: false
+ id: 2
+ mute: true
+ name: Laundry Room
+ source_id: 0
+ vol: -48
+ - disabled: false
+ id: 3
+ mute: true
+ name: Dining Room
+ source_id: 0
+ vol: -44
+ - disabled: true
+ id: 4
+ mute: true
+ name: BROKEN
+ source_id: 0
+ vol: -50
+ - disabled: false
+ id: 5
+ mute: true
+ name: Guest Bedroom
+ source_id: 0
+ vol: -48
+ - disabled: false
+ id: 6
+ mute: true
+ name: Main Bedroom
+ source_id: 0
+ vol: -40
+ - disabled: false
+ id: 7
+ mute: true
+ name: Main Bathroom
+ source_id: 0
+ vol: -44
+ - disabled: false
+ id: 8
+ mute: true
+ name: Master Bathroom
+ source_id: 0
+ vol: -41
+ - disabled: false
+ id: 9
+ mute: true
+ name: Kitchen High
+ source_id: 0
+ vol: -53
+ - disabled: false
+ id: 10
+ mute: true
+ name: kitchen Low
+ source_id: 0
+ vol: -52
+ - disabled: false
+ id: 11
+ mute: true
+ name: Living Room
+ source_id: 0
+ vol: -46
+ '422':
+ description: Validation Error
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/HTTPValidationError'
+ /api/zones:
+ get:
+ tags:
+ - zone
+ summary: Get Zones
+ description: 'Get all zones '
+ operationId: get_zones_api_zones_get
+ responses:
+ '200':
+ description: Successful Response
+ content:
+ application/json:
+ schema:
+ title: Response Get Zones Api Zones Get
+ type: object
+ additionalProperties:
+ type: array
+ items:
+ $ref: '#/components/schemas/Zone'
+ /api/zones/{zid}:
+ get:
+ tags:
+ - zone
+ summary: Get Zone
+ description: 'Get Zone with id=**zid** '
+ operationId: get_zone_api_zones__zid__get
+ parameters:
+ - description: Zone ID
+ required: true
+ schema:
+ title: Zid
+ maximum: 35.0
+ minimum: 0.0
+ type: integer
+ description: Zone ID
+ name: zid
+ in: path
+ examples:
+ Local:
+ value: 0
+ summary: Local
+ Office:
+ value: 1
+ summary: Office
+ Laundry Room:
+ value: 2
+ summary: Laundry Room
+ Dining Room:
+ value: 3
+ summary: Dining Room
+ BROKEN:
+ value: 4
+ summary: BROKEN
+ Guest Bedroom:
+ value: 5
+ summary: Guest Bedroom
+ responses:
+ '200':
+ description: Successful Response
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/Zone'
+ examples:
+ Living Room:
+ value:
+ name: Living Room
+ source_id: 1
+ mute: false
+ vol: -25
+ disabled: false
+ Dining Room:
+ value:
+ name: Dining Room
+ source_id: 2
+ mute: true
+ vol: -65
+ disabled: false
+ '422':
+ description: Validation Error
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/HTTPValidationError'
+ patch:
+ tags:
+ - zone
+ summary: Set Zone
+ description: 'Update a zone''s configuration (zone=**zid**) '
+ operationId: set_zone_api_zones__zid__patch
+ parameters:
+ - description: Zone ID
+ required: true
+ schema:
+ title: Zid
+ maximum: 35.0
+ minimum: 0.0
+ type: integer
+ description: Zone ID
+ name: zid
+ in: path
+ examples:
+ Local:
+ value: 0
+ summary: Local
+ Office:
+ value: 1
+ summary: Office
+ Laundry Room:
+ value: 2
+ summary: Laundry Room
+ Dining Room:
+ value: 3
+ summary: Dining Room
+ BROKEN:
+ value: 4
+ summary: BROKEN
+ Guest Bedroom:
+ value: 5
+ summary: Guest Bedroom
+ requestBody:
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/ZoneUpdate'
+ examples:
+ Change Name:
+ value:
+ name: Bedroom
+ Change audio source:
+ value:
+ source-id: 3
+ Increase Volume:
+ value:
+ vol: -45
+ Mute:
+ value:
+ mute: true
+ responses:
+ '200':
+ description: Successful Response
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/Status'
+ examples:
+ Status of Jason's AmpliPi:
+ value:
+ groups:
+ - id: 0
+ mute: false
+ name: Whole House
+ source_id: null
+ vol_delta: -44
+ zones:
+ - 0
+ - 1
+ - 2
+ - 3
+ - 5
+ - 6
+ - 7
+ - 8
+ - 9
+ - 10
+ - 11
+ - id: 1
+ mute: true
+ name: KitchLivDining
+ source_id: 0
+ vol_delta: -49
+ zones:
+ - 3
+ - 9
+ - 10
+ - 11
+ presets:
+ - id: 10000
+ name: Mute All
+ state:
+ zones:
+ - id: 0
+ mute: true
+ - id: 1
+ mute: true
+ - id: 2
+ mute: true
+ - id: 3
+ mute: true
+ - id: 4
+ mute: true
+ - id: 5
+ mute: true
+ sources:
+ - id: 0
+ input: stream=90890
+ name: J1
+ - id: 1
+ input: stream=44590
+ name: J2
+ - id: 2
+ input: local
+ name: Marc
+ - id: 3
+ input: local
+ name: Source 4
+ streams:
+ - id: 90890
+ info:
+ album: Far (Deluxe Version)
+ artist: Regina Spektor
+ img_url: http://mediaserver-cont-dc6-1-v4v6.pandora.com/images/public/int/2/1/5/4/093624974512_500W_500H.jpg
+ station: Regina Spektor Radio
+ track: Eet
+ name: Regina Spektor Radio
+ password: ''
+ station: '4473713754798410236'
+ status: playing
+ type: pandora
+ user: example1@micro-nova.com
+ - id: 90891
+ info:
+ details: No info available
+ name: Matt and Kim Radio
+ password: ''
+ station: '4610303469018478727'
+ status: disconnected
+ type: pandora
+ user: example2@micro-nova.com
+ - id: 90892
+ info:
+ details: No info available
+ name: Pink Radio
+ password: ''
+ station: '4326539910057675260'
+ status: disconnected
+ type: pandora
+ user: example3@micro-nova.com
+ - id: 44590
+ info:
+ details: No info available
+ name: Jason's iPhone
+ status: connected
+ type: shairport
+ - id: 4894
+ info:
+ details: No info available
+ name: Rnay
+ status: disconnected
+ type: shairport
+ info:
+ version: 0.0.1
+ zones:
+ - disabled: false
+ id: 0
+ mute: false
+ name: Local
+ source_id: 1
+ vol: -35
+ - disabled: false
+ id: 1
+ mute: false
+ name: Office
+ source_id: 0
+ vol: -41
+ - disabled: false
+ id: 2
+ mute: true
+ name: Laundry Room
+ source_id: 0
+ vol: -48
+ - disabled: false
+ id: 3
+ mute: true
+ name: Dining Room
+ source_id: 0
+ vol: -44
+ - disabled: true
+ id: 4
+ mute: true
+ name: BROKEN
+ source_id: 0
+ vol: -50
+ - disabled: false
+ id: 5
+ mute: true
+ name: Guest Bedroom
+ source_id: 0
+ vol: -48
+ - disabled: false
+ id: 6
+ mute: true
+ name: Main Bedroom
+ source_id: 0
+ vol: -40
+ - disabled: false
+ id: 7
+ mute: true
+ name: Main Bathroom
+ source_id: 0
+ vol: -44
+ - disabled: false
+ id: 8
+ mute: true
+ name: Master Bathroom
+ source_id: 0
+ vol: -41
+ - disabled: false
+ id: 9
+ mute: true
+ name: Kitchen High
+ source_id: 0
+ vol: -53
+ - disabled: false
+ id: 10
+ mute: true
+ name: kitchen Low
+ source_id: 0
+ vol: -52
+ - disabled: false
+ id: 11
+ mute: true
+ name: Living Room
+ source_id: 0
+ vol: -46
+ '422':
+ description: Validation Error
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/HTTPValidationError'
+ /api/group:
+ post:
+ tags:
+ - group
+ summary: Create Group
+ description: 'Create a new grouping of zones '
+ operationId: create_group_api_group_post
+ requestBody:
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/Group'
+ examples:
+ Upstairs Group:
+ value:
+ name: Upstairs
+ zones:
+ - 1
+ - 2
+ - 3
+ - 4
+ - 5
+ Downstairs Group:
+ value:
+ name: Downstairs
+ zones:
+ - 6
+ - 7
+ - 8
+ - 9
+ required: true
+ responses:
+ '200':
+ description: Successful Response
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/Group'
+ examples:
+ Upstairs Group:
+ value:
+ id: 101
+ name: Upstairs
+ zones:
+ - 1
+ - 2
+ - 3
+ - 4
+ - 5
+ vol_delta: -65
+ Downstairs Group:
+ value:
+ id: 102
+ name: Downstairs
+ zones:
+ - 6
+ - 7
+ - 8
+ - 9
+ vol_delta: -30
+ '422':
+ description: Validation Error
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/HTTPValidationError'
+ /api/groups:
+ get:
+ tags:
+ - group
+ summary: Get Groups
+ description: 'Get all groups '
+ operationId: get_groups_api_groups_get
+ responses:
+ '200':
+ description: Successful Response
+ content:
+ application/json:
+ schema:
+ title: Response Get Groups Api Groups Get
+ type: object
+ additionalProperties:
+ type: array
+ items:
+ $ref: '#/components/schemas/Group'
+ /api/groups/{gid}:
+ get:
+ tags:
+ - group
+ summary: Get Group
+ description: 'Get Group with id=**gid** '
+ operationId: get_group_api_groups__gid__get
+ parameters:
+ - description: Stream ID
+ required: true
+ schema:
+ title: Gid
+ minimum: 0.0
+ type: integer
+ description: Stream ID
+ name: gid
+ in: path
+ examples:
+ Whole House:
+ value: 0
+ summary: Whole House
+ responses:
+ '200':
+ description: Successful Response
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/Group'
+ examples:
+ Upstairs Group:
+ value:
+ id: 101
+ name: Upstairs
+ zones:
+ - 1
+ - 2
+ - 3
+ - 4
+ - 5
+ vol_delta: -65
+ Downstairs Group:
+ value:
+ id: 102
+ name: Downstairs
+ zones:
+ - 6
+ - 7
+ - 8
+ - 9
+ vol_delta: -30
+ '422':
+ description: Validation Error
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/HTTPValidationError'
+ delete:
+ tags:
+ - group
+ summary: Delete Group
+ description: 'Delete a group (group=**gid**) '
+ operationId: delete_group_api_groups__gid__delete
+ parameters:
+ - description: Stream ID
+ required: true
+ schema:
+ title: Gid
+ minimum: 0.0
+ type: integer
+ description: Stream ID
+ name: gid
+ in: path
+ examples:
+ Whole House:
+ value: 0
+ summary: Whole House
+ responses:
+ '200':
+ description: Successful Response
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/Status'
+ examples:
+ Status of Jason's AmpliPi:
+ value:
+ groups:
+ - id: 0
+ mute: false
+ name: Whole House
+ source_id: null
+ vol_delta: -44
+ zones:
+ - 0
+ - 1
+ - 2
+ - 3
+ - 5
+ - 6
+ - 7
+ - 8
+ - 9
+ - 10
+ - 11
+ - id: 1
+ mute: true
+ name: KitchLivDining
+ source_id: 0
+ vol_delta: -49
+ zones:
+ - 3
+ - 9
+ - 10
+ - 11
+ presets:
+ - id: 10000
+ name: Mute All
+ state:
+ zones:
+ - id: 0
+ mute: true
+ - id: 1
+ mute: true
+ - id: 2
+ mute: true
+ - id: 3
+ mute: true
+ - id: 4
+ mute: true
+ - id: 5
+ mute: true
+ sources:
+ - id: 0
+ input: stream=90890
+ name: J1
+ - id: 1
+ input: stream=44590
+ name: J2
+ - id: 2
+ input: local
+ name: Marc
+ - id: 3
+ input: local
+ name: Source 4
+ streams:
+ - id: 90890
+ info:
+ album: Far (Deluxe Version)
+ artist: Regina Spektor
+ img_url: http://mediaserver-cont-dc6-1-v4v6.pandora.com/images/public/int/2/1/5/4/093624974512_500W_500H.jpg
+ station: Regina Spektor Radio
+ track: Eet
+ name: Regina Spektor Radio
+ password: ''
+ station: '4473713754798410236'
+ status: playing
+ type: pandora
+ user: example1@micro-nova.com
+ - id: 90891
+ info:
+ details: No info available
+ name: Matt and Kim Radio
+ password: ''
+ station: '4610303469018478727'
+ status: disconnected
+ type: pandora
+ user: example2@micro-nova.com
+ - id: 90892
+ info:
+ details: No info available
+ name: Pink Radio
+ password: ''
+ station: '4326539910057675260'
+ status: disconnected
+ type: pandora
+ user: example3@micro-nova.com
+ - id: 44590
+ info:
+ details: No info available
+ name: Jason's iPhone
+ status: connected
+ type: shairport
+ - id: 4894
+ info:
+ details: No info available
+ name: Rnay
+ status: disconnected
+ type: shairport
+ info:
+ version: 0.0.1
+ zones:
+ - disabled: false
+ id: 0
+ mute: false
+ name: Local
+ source_id: 1
+ vol: -35
+ - disabled: false
+ id: 1
+ mute: false
+ name: Office
+ source_id: 0
+ vol: -41
+ - disabled: false
+ id: 2
+ mute: true
+ name: Laundry Room
+ source_id: 0
+ vol: -48
+ - disabled: false
+ id: 3
+ mute: true
+ name: Dining Room
+ source_id: 0
+ vol: -44
+ - disabled: true
+ id: 4
+ mute: true
+ name: BROKEN
+ source_id: 0
+ vol: -50
+ - disabled: false
+ id: 5
+ mute: true
+ name: Guest Bedroom
+ source_id: 0
+ vol: -48
+ - disabled: false
+ id: 6
+ mute: true
+ name: Main Bedroom
+ source_id: 0
+ vol: -40
+ - disabled: false
+ id: 7
+ mute: true
+ name: Main Bathroom
+ source_id: 0
+ vol: -44
+ - disabled: false
+ id: 8
+ mute: true
+ name: Master Bathroom
+ source_id: 0
+ vol: -41
+ - disabled: false
+ id: 9
+ mute: true
+ name: Kitchen High
+ source_id: 0
+ vol: -53
+ - disabled: false
+ id: 10
+ mute: true
+ name: kitchen Low
+ source_id: 0
+ vol: -52
+ - disabled: false
+ id: 11
+ mute: true
+ name: Living Room
+ source_id: 0
+ vol: -46
+ '422':
+ description: Validation Error
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/HTTPValidationError'
+ patch:
+ tags:
+ - group
+ summary: Set Group
+ description: 'Update a groups''s configuration (group=**gid**) '
+ operationId: set_group_api_groups__gid__patch
+ parameters:
+ - description: Stream ID
+ required: true
+ schema:
+ title: Gid
+ minimum: 0.0
+ type: integer
+ description: Stream ID
+ name: gid
+ in: path
+ examples:
+ Whole House:
+ value: 0
+ summary: Whole House
+ requestBody:
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/GroupUpdate'
+ examples:
+ Change Name:
+ value:
+ name: Upstairs
+ Change audio source:
+ value:
+ source-id: 3
+ Increase Volume:
+ value:
+ vol_delta: -45
+ Mute:
+ value:
+ mute: true
+ responses:
+ '200':
+ description: Successful Response
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/Status'
+ examples:
+ Status of Jason's AmpliPi:
+ value:
+ groups:
+ - id: 0
+ mute: false
+ name: Whole House
+ source_id: null
+ vol_delta: -44
+ zones:
+ - 0
+ - 1
+ - 2
+ - 3
+ - 5
+ - 6
+ - 7
+ - 8
+ - 9
+ - 10
+ - 11
+ - id: 1
+ mute: true
+ name: KitchLivDining
+ source_id: 0
+ vol_delta: -49
+ zones:
+ - 3
+ - 9
+ - 10
+ - 11
+ presets:
+ - id: 10000
+ name: Mute All
+ state:
+ zones:
+ - id: 0
+ mute: true
+ - id: 1
+ mute: true
+ - id: 2
+ mute: true
+ - id: 3
+ mute: true
+ - id: 4
+ mute: true
+ - id: 5
+ mute: true
+ sources:
+ - id: 0
+ input: stream=90890
+ name: J1
+ - id: 1
+ input: stream=44590
+ name: J2
+ - id: 2
+ input: local
+ name: Marc
+ - id: 3
+ input: local
+ name: Source 4
+ streams:
+ - id: 90890
+ info:
+ album: Far (Deluxe Version)
+ artist: Regina Spektor
+ img_url: http://mediaserver-cont-dc6-1-v4v6.pandora.com/images/public/int/2/1/5/4/093624974512_500W_500H.jpg
+ station: Regina Spektor Radio
+ track: Eet
+ name: Regina Spektor Radio
+ password: ''
+ station: '4473713754798410236'
+ status: playing
+ type: pandora
+ user: example1@micro-nova.com
+ - id: 90891
+ info:
+ details: No info available
+ name: Matt and Kim Radio
+ password: ''
+ station: '4610303469018478727'
+ status: disconnected
+ type: pandora
+ user: example2@micro-nova.com
+ - id: 90892
+ info:
+ details: No info available
+ name: Pink Radio
+ password: ''
+ station: '4326539910057675260'
+ status: disconnected
+ type: pandora
+ user: example3@micro-nova.com
+ - id: 44590
+ info:
+ details: No info available
+ name: Jason's iPhone
+ status: connected
+ type: shairport
+ - id: 4894
+ info:
+ details: No info available
+ name: Rnay
+ status: disconnected
+ type: shairport
+ info:
+ version: 0.0.1
+ zones:
+ - disabled: false
+ id: 0
+ mute: false
+ name: Local
+ source_id: 1
+ vol: -35
+ - disabled: false
+ id: 1
+ mute: false
+ name: Office
+ source_id: 0
+ vol: -41
+ - disabled: false
+ id: 2
+ mute: true
+ name: Laundry Room
+ source_id: 0
+ vol: -48
+ - disabled: false
+ id: 3
+ mute: true
+ name: Dining Room
+ source_id: 0
+ vol: -44
+ - disabled: true
+ id: 4
+ mute: true
+ name: BROKEN
+ source_id: 0
+ vol: -50
+ - disabled: false
+ id: 5
+ mute: true
+ name: Guest Bedroom
+ source_id: 0
+ vol: -48
+ - disabled: false
+ id: 6
+ mute: true
+ name: Main Bedroom
+ source_id: 0
+ vol: -40
+ - disabled: false
+ id: 7
+ mute: true
+ name: Main Bathroom
+ source_id: 0
+ vol: -44
+ - disabled: false
+ id: 8
+ mute: true
+ name: Master Bathroom
+ source_id: 0
+ vol: -41
+ - disabled: false
+ id: 9
+ mute: true
+ name: Kitchen High
+ source_id: 0
+ vol: -53
+ - disabled: false
+ id: 10
+ mute: true
+ name: kitchen Low
+ source_id: 0
+ vol: -52
+ - disabled: false
+ id: 11
+ mute: true
+ name: Living Room
+ source_id: 0
+ vol: -46
+ '422':
+ description: Validation Error
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/HTTPValidationError'
+ /api/stream:
+ post:
+ tags:
+ - stream
+ summary: Create Stream
+ description: 'Create a new audio stream '
+ operationId: create_stream_api_stream_post
+ requestBody:
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/Stream'
+ examples:
+ Add Beatles Internet Radio Station:
+ value:
+ logo: http://www.beatlesradio.com/content/images/thumbs/0000587.gif
+ name: Beatles Radio
+ type: internetradio
+ url: http://www.beatlesradio.com:8000/stream/1/
+ Add Classical KING Internet Radio Station:
+ value:
+ logo: https://i.iheart.com/v3/re/assets/images/7bcfd87a-de3e-47d0-b896-be0ed38c9d74.png
+ name: Classical KING FM 98.1
+ type: internetradio
+ url: http://classicalking.streamguys1.com/king-fm-aac-iheart
+ Add Generic DLNA:
+ value:
+ name: Replace this text with a name you like!
+ type: dlna
+ Add Groove Salad Internet Radio Station:
+ value:
+ logo: https://somafm.com/img3/groovesalad-200.jpg
+ name: Groove Salad
+ type: internetradio
+ url: http://ice2.somafm.com/groovesalad-16-aac
+ Add KEXP Internet Radio Station:
+ value:
+ logo: https://i.iheart.com/v3/re/new_assets/cc4e0a17-5233-4e4b-9b6b-7799904f78ea
+ name: KEXP 90.3
+ type: internetradio
+ url: http://live-aacplus-64.kexp.org/kexp64.aac
+ Add Matt and Kim Pandora Station:
+ value:
+ name: Matt and Kim Radio
+ password: s79sDDkjf
+ station: '4473713754798410236'
+ type: pandora
+ user: test@micro-nova.com
+ Add MicroNova Spotify:
+ value:
+ name: MicroNova Spotify
+ type: spotify
+ Add Micronova Airplay:
+ value:
+ name: Micronova AP
+ type: shairport
+ required: true
+ responses:
+ '200':
+ description: Successful Response
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/Stream'
+ examples:
+ Regina Spektor Radio (playing):
+ value:
+ id: 90890
+ name: Regina Spektor Radio
+ password: ''
+ station: '4473713754798410236'
+ status: playing
+ type: pandora
+ user: example1@micro-nova.com
+ info:
+ album: Far (Deluxe Version)
+ artist: Regina Spektor
+ img_url: http://mediaserver-cont-dc6-1-v4v6.pandora.com/images/public/int/2/1/5/4/093624974512_500W_500H.jpg
+ station: Regina Spektor Radio
+ track: Eet
+ Matt and Kim Radio (disconnected):
+ value:
+ id: 90891
+ info:
+ details: No info available
+ name: Matt and Kim Radio
+ password: ''
+ station: '4610303469018478727'
+ status: disconnected
+ type: pandora
+ user: example2@micro-nova.com
+ Shairport (connected):
+ value:
+ id: 44590
+ info:
+ details: No info available
+ name: Jason's iPhone
+ status: connected
+ type: shairport
+ Shairport (disconnected):
+ value:
+ id: 4894
+ info:
+ details: No info available
+ name: Rnay
+ status: disconnected
+ type: shairport
+ '422':
+ description: Validation Error
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/HTTPValidationError'
+ /api/streams:
+ get:
+ tags:
+ - stream
+ summary: Get Streams
+ description: 'Get all streams '
+ operationId: get_streams_api_streams_get
+ responses:
+ '200':
+ description: Successful Response
+ content:
+ application/json:
+ schema:
+ title: Response Get Streams Api Streams Get
+ type: object
+ additionalProperties:
+ type: array
+ items:
+ $ref: '#/components/schemas/Stream'
+ /api/streams/{sid}:
+ get:
+ tags:
+ - stream
+ summary: Get Stream
+ description: 'Get Stream with id=**sid** '
+ operationId: get_stream_api_streams__sid__get
+ parameters:
+ - description: Stream ID
+ required: true
+ schema:
+ title: Sid
+ minimum: 0.0
+ type: integer
+ description: Stream ID
+ name: sid
+ in: path
+ examples:
+ Regina Spektor Radio:
+ value: 90890
+ summary: Regina Spektor Radio
+ Matt and Kim Radio:
+ value: 90891
+ summary: Matt and Kim Radio
+ Pink Radio:
+ value: 90892
+ summary: Pink Radio
+ Jason's iPhone:
+ value: 44590
+ summary: Jason's iPhone
+ Marc's iPhone:
+ value: 4893
+ summary: Marc's iPhone
+ Rnay:
+ value: 4894
+ summary: Rnay
+ Jeremy's Spotify:
+ value: 4895
+ summary: Jeremy's Spotify
+ Lincoln's Spotify:
+ value: 4896
+ summary: Lincoln's Spotify
+ Indie Pop Rocks:
+ value: 90893
+ summary: Indie Pop Rocks
+ Groove Salad:
+ value: 90894
+ summary: Groove Salad
+ SP_TEST:
+ value: 90895
+ summary: SP_TEST
+ Trial_DLNA:
+ value: 90896
+ summary: Trial_DLNA
+ T2:
+ value: 90897
+ summary: T2
+ T3:
+ value: 90898
+ summary: T3
+ T2.5:
+ value: 90899
+ summary: T2.5
+ Jeremy's DLNA:
+ value: 90900
+ summary: Jeremy's DLNA
+ responses:
+ '200':
+ description: Successful Response
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/Stream'
+ examples:
+ Regina Spektor Radio (playing):
+ value:
+ id: 90890
+ name: Regina Spektor Radio
+ password: ''
+ station: '4473713754798410236'
+ status: playing
+ type: pandora
+ user: example1@micro-nova.com
+ info:
+ album: Far (Deluxe Version)
+ artist: Regina Spektor
+ img_url: http://mediaserver-cont-dc6-1-v4v6.pandora.com/images/public/int/2/1/5/4/093624974512_500W_500H.jpg
+ station: Regina Spektor Radio
+ track: Eet
+ Matt and Kim Radio (disconnected):
+ value:
+ id: 90891
+ info:
+ details: No info available
+ name: Matt and Kim Radio
+ password: ''
+ station: '4610303469018478727'
+ status: disconnected
+ type: pandora
+ user: example2@micro-nova.com
+ Shairport (connected):
+ value:
+ id: 44590
+ info:
+ details: No info available
+ name: Jason's iPhone
+ status: connected
+ type: shairport
+ Shairport (disconnected):
+ value:
+ id: 4894
+ info:
+ details: No info available
+ name: Rnay
+ status: disconnected
+ type: shairport
+ '422':
+ description: Validation Error
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/HTTPValidationError'
+ delete:
+ tags:
+ - stream
+ summary: Delete Stream
+ description: 'Delete a stream '
+ operationId: delete_stream_api_streams__sid__delete
+ parameters:
+ - description: Stream ID
+ required: true
+ schema:
+ title: Sid
+ minimum: 0.0
+ type: integer
+ description: Stream ID
+ name: sid
+ in: path
+ examples:
+ Regina Spektor Radio:
+ value: 90890
+ summary: Regina Spektor Radio
+ Matt and Kim Radio:
+ value: 90891
+ summary: Matt and Kim Radio
+ Pink Radio:
+ value: 90892
+ summary: Pink Radio
+ Jason's iPhone:
+ value: 44590
+ summary: Jason's iPhone
+ Marc's iPhone:
+ value: 4893
+ summary: Marc's iPhone
+ Rnay:
+ value: 4894
+ summary: Rnay
+ Jeremy's Spotify:
+ value: 4895
+ summary: Jeremy's Spotify
+ Lincoln's Spotify:
+ value: 4896
+ summary: Lincoln's Spotify
+ Indie Pop Rocks:
+ value: 90893
+ summary: Indie Pop Rocks
+ Groove Salad:
+ value: 90894
+ summary: Groove Salad
+ SP_TEST:
+ value: 90895
+ summary: SP_TEST
+ Trial_DLNA:
+ value: 90896
+ summary: Trial_DLNA
+ T2:
+ value: 90897
+ summary: T2
+ T3:
+ value: 90898
+ summary: T3
+ T2.5:
+ value: 90899
+ summary: T2.5
+ Jeremy's DLNA:
+ value: 90900
+ summary: Jeremy's DLNA
+ responses:
+ '200':
+ description: Successful Response
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/Status'
+ examples:
+ Status of Jason's AmpliPi:
+ value:
+ groups:
+ - id: 0
+ mute: false
+ name: Whole House
+ source_id: null
+ vol_delta: -44
+ zones:
+ - 0
+ - 1
+ - 2
+ - 3
+ - 5
+ - 6
+ - 7
+ - 8
+ - 9
+ - 10
+ - 11
+ - id: 1
+ mute: true
+ name: KitchLivDining
+ source_id: 0
+ vol_delta: -49
+ zones:
+ - 3
+ - 9
+ - 10
+ - 11
+ presets:
+ - id: 10000
+ name: Mute All
+ state:
+ zones:
+ - id: 0
+ mute: true
+ - id: 1
+ mute: true
+ - id: 2
+ mute: true
+ - id: 3
+ mute: true
+ - id: 4
+ mute: true
+ - id: 5
+ mute: true
+ sources:
+ - id: 0
+ input: stream=90890
+ name: J1
+ - id: 1
+ input: stream=44590
+ name: J2
+ - id: 2
+ input: local
+ name: Marc
+ - id: 3
+ input: local
+ name: Source 4
+ streams:
+ - id: 90890
+ info:
+ album: Far (Deluxe Version)
+ artist: Regina Spektor
+ img_url: http://mediaserver-cont-dc6-1-v4v6.pandora.com/images/public/int/2/1/5/4/093624974512_500W_500H.jpg
+ station: Regina Spektor Radio
+ track: Eet
+ name: Regina Spektor Radio
+ password: ''
+ station: '4473713754798410236'
+ status: playing
+ type: pandora
+ user: example1@micro-nova.com
+ - id: 90891
+ info:
+ details: No info available
+ name: Matt and Kim Radio
+ password: ''
+ station: '4610303469018478727'
+ status: disconnected
+ type: pandora
+ user: example2@micro-nova.com
+ - id: 90892
+ info:
+ details: No info available
+ name: Pink Radio
+ password: ''
+ station: '4326539910057675260'
+ status: disconnected
+ type: pandora
+ user: example3@micro-nova.com
+ - id: 44590
+ info:
+ details: No info available
+ name: Jason's iPhone
+ status: connected
+ type: shairport
+ - id: 4894
+ info:
+ details: No info available
+ name: Rnay
+ status: disconnected
+ type: shairport
+ info:
+ version: 0.0.1
+ zones:
+ - disabled: false
+ id: 0
+ mute: false
+ name: Local
+ source_id: 1
+ vol: -35
+ - disabled: false
+ id: 1
+ mute: false
+ name: Office
+ source_id: 0
+ vol: -41
+ - disabled: false
+ id: 2
+ mute: true
+ name: Laundry Room
+ source_id: 0
+ vol: -48
+ - disabled: false
+ id: 3
+ mute: true
+ name: Dining Room
+ source_id: 0
+ vol: -44
+ - disabled: true
+ id: 4
+ mute: true
+ name: BROKEN
+ source_id: 0
+ vol: -50
+ - disabled: false
+ id: 5
+ mute: true
+ name: Guest Bedroom
+ source_id: 0
+ vol: -48
+ - disabled: false
+ id: 6
+ mute: true
+ name: Main Bedroom
+ source_id: 0
+ vol: -40
+ - disabled: false
+ id: 7
+ mute: true
+ name: Main Bathroom
+ source_id: 0
+ vol: -44
+ - disabled: false
+ id: 8
+ mute: true
+ name: Master Bathroom
+ source_id: 0
+ vol: -41
+ - disabled: false
+ id: 9
+ mute: true
+ name: Kitchen High
+ source_id: 0
+ vol: -53
+ - disabled: false
+ id: 10
+ mute: true
+ name: kitchen Low
+ source_id: 0
+ vol: -52
+ - disabled: false
+ id: 11
+ mute: true
+ name: Living Room
+ source_id: 0
+ vol: -46
+ '422':
+ description: Validation Error
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/HTTPValidationError'
+ patch:
+ tags:
+ - stream
+ summary: Set Stream
+ description: 'Update a stream''s configuration (stream=**sid**) '
+ operationId: set_stream_api_streams__sid__patch
+ parameters:
+ - description: Stream ID
+ required: true
+ schema:
+ title: Sid
+ minimum: 0.0
+ type: integer
+ description: Stream ID
+ name: sid
+ in: path
+ examples:
+ Regina Spektor Radio:
+ value: 90890
+ summary: Regina Spektor Radio
+ Matt and Kim Radio:
+ value: 90891
+ summary: Matt and Kim Radio
+ Pink Radio:
+ value: 90892
+ summary: Pink Radio
+ Jason's iPhone:
+ value: 44590
+ summary: Jason's iPhone
+ Marc's iPhone:
+ value: 4893
+ summary: Marc's iPhone
+ Rnay:
+ value: 4894
+ summary: Rnay
+ Jeremy's Spotify:
+ value: 4895
+ summary: Jeremy's Spotify
+ Lincoln's Spotify:
+ value: 4896
+ summary: Lincoln's Spotify
+ Indie Pop Rocks:
+ value: 90893
+ summary: Indie Pop Rocks
+ Groove Salad:
+ value: 90894
+ summary: Groove Salad
+ SP_TEST:
+ value: 90895
+ summary: SP_TEST
+ Trial_DLNA:
+ value: 90896
+ summary: Trial_DLNA
+ T2:
+ value: 90897
+ summary: T2
+ T3:
+ value: 90898
+ summary: T3
+ T2.5:
+ value: 90899
+ summary: T2.5
+ Jeremy's DLNA:
+ value: 90900
+ summary: Jeremy's DLNA
+ requestBody:
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/StreamUpdate'
+ examples:
+ Change account info:
+ value:
+ password: sd9sk3k30
+ user: test@micro-nova.com
+ Change name:
+ value:
+ name: Matt and Kim Radio
+ Change pandora radio station:
+ value:
+ station: 0982034049300
+ Upgrade groove salad stream quality:
+ value:
+ url: http://ice2.somafm.com/groovesalad-64-aac
+ responses:
+ '200':
+ description: Successful Response
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/Status'
+ examples:
+ Status of Jason's AmpliPi:
+ value:
+ groups:
+ - id: 0
+ mute: false
+ name: Whole House
+ source_id: null
+ vol_delta: -44
+ zones:
+ - 0
+ - 1
+ - 2
+ - 3
+ - 5
+ - 6
+ - 7
+ - 8
+ - 9
+ - 10
+ - 11
+ - id: 1
+ mute: true
+ name: KitchLivDining
+ source_id: 0
+ vol_delta: -49
+ zones:
+ - 3
+ - 9
+ - 10
+ - 11
+ presets:
+ - id: 10000
+ name: Mute All
+ state:
+ zones:
+ - id: 0
+ mute: true
+ - id: 1
+ mute: true
+ - id: 2
+ mute: true
+ - id: 3
+ mute: true
+ - id: 4
+ mute: true
+ - id: 5
+ mute: true
+ sources:
+ - id: 0
+ input: stream=90890
+ name: J1
+ - id: 1
+ input: stream=44590
+ name: J2
+ - id: 2
+ input: local
+ name: Marc
+ - id: 3
+ input: local
+ name: Source 4
+ streams:
+ - id: 90890
+ info:
+ album: Far (Deluxe Version)
+ artist: Regina Spektor
+ img_url: http://mediaserver-cont-dc6-1-v4v6.pandora.com/images/public/int/2/1/5/4/093624974512_500W_500H.jpg
+ station: Regina Spektor Radio
+ track: Eet
+ name: Regina Spektor Radio
+ password: ''
+ station: '4473713754798410236'
+ status: playing
+ type: pandora
+ user: example1@micro-nova.com
+ - id: 90891
+ info:
+ details: No info available
+ name: Matt and Kim Radio
+ password: ''
+ station: '4610303469018478727'
+ status: disconnected
+ type: pandora
+ user: example2@micro-nova.com
+ - id: 90892
+ info:
+ details: No info available
+ name: Pink Radio
+ password: ''
+ station: '4326539910057675260'
+ status: disconnected
+ type: pandora
+ user: example3@micro-nova.com
+ - id: 44590
+ info:
+ details: No info available
+ name: Jason's iPhone
+ status: connected
+ type: shairport
+ - id: 4894
+ info:
+ details: No info available
+ name: Rnay
+ status: disconnected
+ type: shairport
+ info:
+ version: 0.0.1
+ zones:
+ - disabled: false
+ id: 0
+ mute: false
+ name: Local
+ source_id: 1
+ vol: -35
+ - disabled: false
+ id: 1
+ mute: false
+ name: Office
+ source_id: 0
+ vol: -41
+ - disabled: false
+ id: 2
+ mute: true
+ name: Laundry Room
+ source_id: 0
+ vol: -48
+ - disabled: false
+ id: 3
+ mute: true
+ name: Dining Room
+ source_id: 0
+ vol: -44
+ - disabled: true
+ id: 4
+ mute: true
+ name: BROKEN
+ source_id: 0
+ vol: -50
+ - disabled: false
+ id: 5
+ mute: true
+ name: Guest Bedroom
+ source_id: 0
+ vol: -48
+ - disabled: false
+ id: 6
+ mute: true
+ name: Main Bedroom
+ source_id: 0
+ vol: -40
+ - disabled: false
+ id: 7
+ mute: true
+ name: Main Bathroom
+ source_id: 0
+ vol: -44
+ - disabled: false
+ id: 8
+ mute: true
+ name: Master Bathroom
+ source_id: 0
+ vol: -41
+ - disabled: false
+ id: 9
+ mute: true
+ name: Kitchen High
+ source_id: 0
+ vol: -53
+ - disabled: false
+ id: 10
+ mute: true
+ name: kitchen Low
+ source_id: 0
+ vol: -52
+ - disabled: false
+ id: 11
+ mute: true
+ name: Living Room
+ source_id: 0
+ vol: -46
+ '422':
+ description: Validation Error
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/HTTPValidationError'
+ /api/streams/{sid}/station={station}:
+ post:
+ tags:
+ - stream
+ summary: Change Station
+ description: 'Change station on a pandora stream (stream=**sid**) '
+ operationId: change_station_api_streams__sid__station__station__post
+ parameters:
+ - description: Stream ID
+ required: true
+ schema:
+ title: Sid
+ minimum: 0.0
+ type: integer
+ description: Stream ID
+ name: sid
+ in: path
+ - description: Number found on the end of a pandora url while playing the station,
+ ie 4610303469018478727 in https://www.pandora.com/station/play/4610303469018478727
+ required: true
+ schema:
+ title: Pandora Station ID
+ minimum: 0.0
+ type: integer
+ description: Number found on the end of a pandora url while playing the
+ station, ie 4610303469018478727 in https://www.pandora.com/station/play/4610303469018478727
+ name: station
+ in: path
+ examples:
+ Regina Spektor Radio:
+ value: 90890
+ summary: Regina Spektor Radio
+ Matt and Kim Radio:
+ value: 90891
+ summary: Matt and Kim Radio
+ Pink Radio:
+ value: 90892
+ summary: Pink Radio
+ Jason's iPhone:
+ value: 44590
+ summary: Jason's iPhone
+ Marc's iPhone:
+ value: 4893
+ summary: Marc's iPhone
+ Rnay:
+ value: 4894
+ summary: Rnay
+ Jeremy's Spotify:
+ value: 4895
+ summary: Jeremy's Spotify
+ Lincoln's Spotify:
+ value: 4896
+ summary: Lincoln's Spotify
+ Indie Pop Rocks:
+ value: 90893
+ summary: Indie Pop Rocks
+ Groove Salad:
+ value: 90894
+ summary: Groove Salad
+ SP_TEST:
+ value: 90895
+ summary: SP_TEST
+ Trial_DLNA:
+ value: 90896
+ summary: Trial_DLNA
+ T2:
+ value: 90897
+ summary: T2
+ T3:
+ value: 90898
+ summary: T3
+ T2.5:
+ value: 90899
+ summary: T2.5
+ Jeremy's DLNA:
+ value: 90900
+ summary: Jeremy's DLNA
+ responses:
+ '200':
+ description: Successful Response
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/Status'
+ examples:
+ Status of Jason's AmpliPi:
+ value:
+ groups:
+ - id: 0
+ mute: false
+ name: Whole House
+ source_id: null
+ vol_delta: -44
+ zones:
+ - 0
+ - 1
+ - 2
+ - 3
+ - 5
+ - 6
+ - 7
+ - 8
+ - 9
+ - 10
+ - 11
+ - id: 1
+ mute: true
+ name: KitchLivDining
+ source_id: 0
+ vol_delta: -49
+ zones:
+ - 3
+ - 9
+ - 10
+ - 11
+ presets:
+ - id: 10000
+ name: Mute All
+ state:
+ zones:
+ - id: 0
+ mute: true
+ - id: 1
+ mute: true
+ - id: 2
+ mute: true
+ - id: 3
+ mute: true
+ - id: 4
+ mute: true
+ - id: 5
+ mute: true
+ sources:
+ - id: 0
+ input: stream=90890
+ name: J1
+ - id: 1
+ input: stream=44590
+ name: J2
+ - id: 2
+ input: local
+ name: Marc
+ - id: 3
+ input: local
+ name: Source 4
+ streams:
+ - id: 90890
+ info:
+ album: Far (Deluxe Version)
+ artist: Regina Spektor
+ img_url: http://mediaserver-cont-dc6-1-v4v6.pandora.com/images/public/int/2/1/5/4/093624974512_500W_500H.jpg
+ station: Regina Spektor Radio
+ track: Eet
+ name: Regina Spektor Radio
+ password: ''
+ station: '4473713754798410236'
+ status: playing
+ type: pandora
+ user: example1@micro-nova.com
+ - id: 90891
+ info:
+ details: No info available
+ name: Matt and Kim Radio
+ password: ''
+ station: '4610303469018478727'
+ status: disconnected
+ type: pandora
+ user: example2@micro-nova.com
+ - id: 90892
+ info:
+ details: No info available
+ name: Pink Radio
+ password: ''
+ station: '4326539910057675260'
+ status: disconnected
+ type: pandora
+ user: example3@micro-nova.com
+ - id: 44590
+ info:
+ details: No info available
+ name: Jason's iPhone
+ status: connected
+ type: shairport
+ - id: 4894
+ info:
+ details: No info available
+ name: Rnay
+ status: disconnected
+ type: shairport
+ info:
+ version: 0.0.1
+ zones:
+ - disabled: false
+ id: 0
+ mute: false
+ name: Local
+ source_id: 1
+ vol: -35
+ - disabled: false
+ id: 1
+ mute: false
+ name: Office
+ source_id: 0
+ vol: -41
+ - disabled: false
+ id: 2
+ mute: true
+ name: Laundry Room
+ source_id: 0
+ vol: -48
+ - disabled: false
+ id: 3
+ mute: true
+ name: Dining Room
+ source_id: 0
+ vol: -44
+ - disabled: true
+ id: 4
+ mute: true
+ name: BROKEN
+ source_id: 0
+ vol: -50
+ - disabled: false
+ id: 5
+ mute: true
+ name: Guest Bedroom
+ source_id: 0
+ vol: -48
+ - disabled: false
+ id: 6
+ mute: true
+ name: Main Bedroom
+ source_id: 0
+ vol: -40
+ - disabled: false
+ id: 7
+ mute: true
+ name: Main Bathroom
+ source_id: 0
+ vol: -44
+ - disabled: false
+ id: 8
+ mute: true
+ name: Master Bathroom
+ source_id: 0
+ vol: -41
+ - disabled: false
+ id: 9
+ mute: true
+ name: Kitchen High
+ source_id: 0
+ vol: -53
+ - disabled: false
+ id: 10
+ mute: true
+ name: kitchen Low
+ source_id: 0
+ vol: -52
+ - disabled: false
+ id: 11
+ mute: true
+ name: Living Room
+ source_id: 0
+ vol: -46
+ '422':
+ description: Validation Error
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/HTTPValidationError'
+ /api/streams/{sid}/{cmd}:
+ post:
+ tags:
+ - stream
+ summary: Exec Command
+ description: "Execute a comamnds on a stream (stream=**sid**).\n\n Command\
+ \ options:\n * Play Stream: **play**\n * Pause Stream: **pause**\n * Skip\
+ \ to next song: **next**\n * Stop Stream: **stop**\n * Like/Love Current\
+ \ Song: **love**\n * Ban Current Song (pandora only): **ban**\n * Shelve\
+ \ Current Song (pandora only): **shelve**\n\nCurrently only available with\
+ \ Pandora streams"
+ operationId: exec_command_api_streams__sid___cmd__post
+ parameters:
+ - description: Stream ID
+ required: true
+ schema:
+ title: Sid
+ minimum: 0.0
+ type: integer
+ description: Stream ID
+ name: sid
+ in: path
+ - required: true
+ schema:
+ $ref: '#/components/schemas/StreamCommand'
+ name: cmd
+ in: path
+ examples:
+ Regina Spektor Radio:
+ value: 90890
+ summary: Regina Spektor Radio
+ Matt and Kim Radio:
+ value: 90891
+ summary: Matt and Kim Radio
+ Pink Radio:
+ value: 90892
+ summary: Pink Radio
+ Jason's iPhone:
+ value: 44590
+ summary: Jason's iPhone
+ Marc's iPhone:
+ value: 4893
+ summary: Marc's iPhone
+ Rnay:
+ value: 4894
+ summary: Rnay
+ Jeremy's Spotify:
+ value: 4895
+ summary: Jeremy's Spotify
+ Lincoln's Spotify:
+ value: 4896
+ summary: Lincoln's Spotify
+ Indie Pop Rocks:
+ value: 90893
+ summary: Indie Pop Rocks
+ Groove Salad:
+ value: 90894
+ summary: Groove Salad
+ SP_TEST:
+ value: 90895
+ summary: SP_TEST
+ Trial_DLNA:
+ value: 90896
+ summary: Trial_DLNA
+ T2:
+ value: 90897
+ summary: T2
+ T3:
+ value: 90898
+ summary: T3
+ T2.5:
+ value: 90899
+ summary: T2.5
+ Jeremy's DLNA:
+ value: 90900
+ summary: Jeremy's DLNA
+ responses:
+ '200':
+ description: Successful Response
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/Status'
+ examples:
+ Status of Jason's AmpliPi:
+ value:
+ groups:
+ - id: 0
+ mute: false
+ name: Whole House
+ source_id: null
+ vol_delta: -44
+ zones:
+ - 0
+ - 1
+ - 2
+ - 3
+ - 5
+ - 6
+ - 7
+ - 8
+ - 9
+ - 10
+ - 11
+ - id: 1
+ mute: true
+ name: KitchLivDining
+ source_id: 0
+ vol_delta: -49
+ zones:
+ - 3
+ - 9
+ - 10
+ - 11
+ presets:
+ - id: 10000
+ name: Mute All
+ state:
+ zones:
+ - id: 0
+ mute: true
+ - id: 1
+ mute: true
+ - id: 2
+ mute: true
+ - id: 3
+ mute: true
+ - id: 4
+ mute: true
+ - id: 5
+ mute: true
+ sources:
+ - id: 0
+ input: stream=90890
+ name: J1
+ - id: 1
+ input: stream=44590
+ name: J2
+ - id: 2
+ input: local
+ name: Marc
+ - id: 3
+ input: local
+ name: Source 4
+ streams:
+ - id: 90890
+ info:
+ album: Far (Deluxe Version)
+ artist: Regina Spektor
+ img_url: http://mediaserver-cont-dc6-1-v4v6.pandora.com/images/public/int/2/1/5/4/093624974512_500W_500H.jpg
+ station: Regina Spektor Radio
+ track: Eet
+ name: Regina Spektor Radio
+ password: ''
+ station: '4473713754798410236'
+ status: playing
+ type: pandora
+ user: example1@micro-nova.com
+ - id: 90891
+ info:
+ details: No info available
+ name: Matt and Kim Radio
+ password: ''
+ station: '4610303469018478727'
+ status: disconnected
+ type: pandora
+ user: example2@micro-nova.com
+ - id: 90892
+ info:
+ details: No info available
+ name: Pink Radio
+ password: ''
+ station: '4326539910057675260'
+ status: disconnected
+ type: pandora
+ user: example3@micro-nova.com
+ - id: 44590
+ info:
+ details: No info available
+ name: Jason's iPhone
+ status: connected
+ type: shairport
+ - id: 4894
+ info:
+ details: No info available
+ name: Rnay
+ status: disconnected
+ type: shairport
+ info:
+ version: 0.0.1
+ zones:
+ - disabled: false
+ id: 0
+ mute: false
+ name: Local
+ source_id: 1
+ vol: -35
+ - disabled: false
+ id: 1
+ mute: false
+ name: Office
+ source_id: 0
+ vol: -41
+ - disabled: false
+ id: 2
+ mute: true
+ name: Laundry Room
+ source_id: 0
+ vol: -48
+ - disabled: false
+ id: 3
+ mute: true
+ name: Dining Room
+ source_id: 0
+ vol: -44
+ - disabled: true
+ id: 4
+ mute: true
+ name: BROKEN
+ source_id: 0
+ vol: -50
+ - disabled: false
+ id: 5
+ mute: true
+ name: Guest Bedroom
+ source_id: 0
+ vol: -48
+ - disabled: false
+ id: 6
+ mute: true
+ name: Main Bedroom
+ source_id: 0
+ vol: -40
+ - disabled: false
+ id: 7
+ mute: true
+ name: Main Bathroom
+ source_id: 0
+ vol: -44
+ - disabled: false
+ id: 8
+ mute: true
+ name: Master Bathroom
+ source_id: 0
+ vol: -41
+ - disabled: false
+ id: 9
+ mute: true
+ name: Kitchen High
+ source_id: 0
+ vol: -53
+ - disabled: false
+ id: 10
+ mute: true
+ name: kitchen Low
+ source_id: 0
+ vol: -52
+ - disabled: false
+ id: 11
+ mute: true
+ name: Living Room
+ source_id: 0
+ vol: -46
+ '422':
+ description: Validation Error
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/HTTPValidationError'
+ /api/preset:
+ post:
+ tags:
+ - preset
+ summary: Create Preset
+ description: 'Create a new preset configuration '
+ operationId: create_preset_api_preset_post
+ requestBody:
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/Preset'
+ examples:
+ Add Mute All:
+ value:
+ name: Mute All
+ state:
+ zones:
+ - id: 0
+ mute: true
+ - id: 1
+ mute: true
+ - id: 2
+ mute: true
+ - id: 3
+ mute: true
+ - id: 4
+ mute: true
+ - id: 5
+ mute: true
+ required: true
+ responses:
+ '200':
+ description: Successful Response
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/Preset'
+ examples:
+ Mute All:
+ value:
+ id: 10000
+ name: Mute All
+ state:
+ zones:
+ - id: 0
+ mute: true
+ - id: 1
+ mute: true
+ - id: 2
+ mute: true
+ - id: 3
+ mute: true
+ - id: 4
+ mute: true
+ - id: 5
+ mute: true
+ '422':
+ description: Validation Error
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/HTTPValidationError'
+ /api/presets:
+ get:
+ tags:
+ - preset
+ summary: Get Presets
+ description: 'Get all presets '
+ operationId: get_presets_api_presets_get
+ responses:
+ '200':
+ description: Successful Response
+ content:
+ application/json:
+ schema:
+ title: Response Get Presets Api Presets Get
+ type: object
+ additionalProperties:
+ type: array
+ items:
+ $ref: '#/components/schemas/Preset'
+ /api/presets/{pid}:
+ get:
+ tags:
+ - preset
+ summary: Get Preset
+ description: 'Get Preset with id=**pid** '
+ operationId: get_preset_api_presets__pid__get
+ parameters:
+ - description: Preset ID
+ required: true
+ schema:
+ title: Pid
+ minimum: 0.0
+ type: integer
+ description: Preset ID
+ name: pid
+ in: path
+ examples:
+ Mute All:
+ value: 10000
+ summary: Mute All
+ Restore last config:
+ value: 9999
+ summary: Restore last config
+ responses:
+ '200':
+ description: Successful Response
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/Preset'
+ examples:
+ Mute All:
+ value:
+ id: 10000
+ name: Mute All
+ state:
+ zones:
+ - id: 0
+ mute: true
+ - id: 1
+ mute: true
+ - id: 2
+ mute: true
+ - id: 3
+ mute: true
+ - id: 4
+ mute: true
+ - id: 5
+ mute: true
+ '422':
+ description: Validation Error
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/HTTPValidationError'
+ delete:
+ tags:
+ - preset
+ summary: Delete Preset
+ description: 'Delete a preset '
+ operationId: delete_preset_api_presets__pid__delete
+ parameters:
+ - description: Preset ID
+ required: true
+ schema:
+ title: Pid
+ minimum: 0.0
+ type: integer
+ description: Preset ID
+ name: pid
+ in: path
+ examples:
+ Mute All:
+ value: 10000
+ summary: Mute All
+ Restore last config:
+ value: 9999
+ summary: Restore last config
+ responses:
+ '200':
+ description: Successful Response
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/Status'
+ examples:
+ Status of Jason's AmpliPi:
+ value:
+ groups:
+ - id: 0
+ mute: false
+ name: Whole House
+ source_id: null
+ vol_delta: -44
+ zones:
+ - 0
+ - 1
+ - 2
+ - 3
+ - 5
+ - 6
+ - 7
+ - 8
+ - 9
+ - 10
+ - 11
+ - id: 1
+ mute: true
+ name: KitchLivDining
+ source_id: 0
+ vol_delta: -49
+ zones:
+ - 3
+ - 9
+ - 10
+ - 11
+ presets:
+ - id: 10000
+ name: Mute All
+ state:
+ zones:
+ - id: 0
+ mute: true
+ - id: 1
+ mute: true
+ - id: 2
+ mute: true
+ - id: 3
+ mute: true
+ - id: 4
+ mute: true
+ - id: 5
+ mute: true
+ sources:
+ - id: 0
+ input: stream=90890
+ name: J1
+ - id: 1
+ input: stream=44590
+ name: J2
+ - id: 2
+ input: local
+ name: Marc
+ - id: 3
+ input: local
+ name: Source 4
+ streams:
+ - id: 90890
+ info:
+ album: Far (Deluxe Version)
+ artist: Regina Spektor
+ img_url: http://mediaserver-cont-dc6-1-v4v6.pandora.com/images/public/int/2/1/5/4/093624974512_500W_500H.jpg
+ station: Regina Spektor Radio
+ track: Eet
+ name: Regina Spektor Radio
+ password: ''
+ station: '4473713754798410236'
+ status: playing
+ type: pandora
+ user: example1@micro-nova.com
+ - id: 90891
+ info:
+ details: No info available
+ name: Matt and Kim Radio
+ password: ''
+ station: '4610303469018478727'
+ status: disconnected
+ type: pandora
+ user: example2@micro-nova.com
+ - id: 90892
+ info:
+ details: No info available
+ name: Pink Radio
+ password: ''
+ station: '4326539910057675260'
+ status: disconnected
+ type: pandora
+ user: example3@micro-nova.com
+ - id: 44590
+ info:
+ details: No info available
+ name: Jason's iPhone
+ status: connected
+ type: shairport
+ - id: 4894
+ info:
+ details: No info available
+ name: Rnay
+ status: disconnected
+ type: shairport
+ info:
+ version: 0.0.1
+ zones:
+ - disabled: false
+ id: 0
+ mute: false
+ name: Local
+ source_id: 1
+ vol: -35
+ - disabled: false
+ id: 1
+ mute: false
+ name: Office
+ source_id: 0
+ vol: -41
+ - disabled: false
+ id: 2
+ mute: true
+ name: Laundry Room
+ source_id: 0
+ vol: -48
+ - disabled: false
+ id: 3
+ mute: true
+ name: Dining Room
+ source_id: 0
+ vol: -44
+ - disabled: true
+ id: 4
+ mute: true
+ name: BROKEN
+ source_id: 0
+ vol: -50
+ - disabled: false
+ id: 5
+ mute: true
+ name: Guest Bedroom
+ source_id: 0
+ vol: -48
+ - disabled: false
+ id: 6
+ mute: true
+ name: Main Bedroom
+ source_id: 0
+ vol: -40
+ - disabled: false
+ id: 7
+ mute: true
+ name: Main Bathroom
+ source_id: 0
+ vol: -44
+ - disabled: false
+ id: 8
+ mute: true
+ name: Master Bathroom
+ source_id: 0
+ vol: -41
+ - disabled: false
+ id: 9
+ mute: true
+ name: Kitchen High
+ source_id: 0
+ vol: -53
+ - disabled: false
+ id: 10
+ mute: true
+ name: kitchen Low
+ source_id: 0
+ vol: -52
+ - disabled: false
+ id: 11
+ mute: true
+ name: Living Room
+ source_id: 0
+ vol: -46
+ '422':
+ description: Validation Error
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/HTTPValidationError'
+ patch:
+ tags:
+ - preset
+ summary: Set Preset
+ description: 'Update a preset''s configuration (preset=**pid**) '
+ operationId: set_preset_api_presets__pid__patch
+ parameters:
+ - description: Preset ID
+ required: true
+ schema:
+ title: Pid
+ minimum: 0.0
+ type: integer
+ description: Preset ID
+ name: pid
+ in: path
+ examples:
+ Mute All:
+ value: 10000
+ summary: Mute All
+ Restore last config:
+ value: 9999
+ summary: Restore last config
+ requestBody:
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/PresetUpdate'
+ examples:
+ Only mute some:
+ value:
+ name: Mute Some
+ state:
+ zones:
+ - id: 0
+ mute: true
+ - id: 1
+ mute: true
+ - id: 2
+ mute: true
+ - id: 5
+ mute: true
+ responses:
+ '200':
+ description: Successful Response
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/Status'
+ examples:
+ Status of Jason's AmpliPi:
+ value:
+ groups:
+ - id: 0
+ mute: false
+ name: Whole House
+ source_id: null
+ vol_delta: -44
+ zones:
+ - 0
+ - 1
+ - 2
+ - 3
+ - 5
+ - 6
+ - 7
+ - 8
+ - 9
+ - 10
+ - 11
+ - id: 1
+ mute: true
+ name: KitchLivDining
+ source_id: 0
+ vol_delta: -49
+ zones:
+ - 3
+ - 9
+ - 10
+ - 11
+ presets:
+ - id: 10000
+ name: Mute All
+ state:
+ zones:
+ - id: 0
+ mute: true
+ - id: 1
+ mute: true
+ - id: 2
+ mute: true
+ - id: 3
+ mute: true
+ - id: 4
+ mute: true
+ - id: 5
+ mute: true
+ sources:
+ - id: 0
+ input: stream=90890
+ name: J1
+ - id: 1
+ input: stream=44590
+ name: J2
+ - id: 2
+ input: local
+ name: Marc
+ - id: 3
+ input: local
+ name: Source 4
+ streams:
+ - id: 90890
+ info:
+ album: Far (Deluxe Version)
+ artist: Regina Spektor
+ img_url: http://mediaserver-cont-dc6-1-v4v6.pandora.com/images/public/int/2/1/5/4/093624974512_500W_500H.jpg
+ station: Regina Spektor Radio
+ track: Eet
+ name: Regina Spektor Radio
+ password: ''
+ station: '4473713754798410236'
+ status: playing
+ type: pandora
+ user: example1@micro-nova.com
+ - id: 90891
+ info:
+ details: No info available
+ name: Matt and Kim Radio
+ password: ''
+ station: '4610303469018478727'
+ status: disconnected
+ type: pandora
+ user: example2@micro-nova.com
+ - id: 90892
+ info:
+ details: No info available
+ name: Pink Radio
+ password: ''
+ station: '4326539910057675260'
+ status: disconnected
+ type: pandora
+ user: example3@micro-nova.com
+ - id: 44590
+ info:
+ details: No info available
+ name: Jason's iPhone
+ status: connected
+ type: shairport
+ - id: 4894
+ info:
+ details: No info available
+ name: Rnay
+ status: disconnected
+ type: shairport
+ info:
+ version: 0.0.1
+ zones:
+ - disabled: false
+ id: 0
+ mute: false
+ name: Local
+ source_id: 1
+ vol: -35
+ - disabled: false
+ id: 1
+ mute: false
+ name: Office
+ source_id: 0
+ vol: -41
+ - disabled: false
+ id: 2
+ mute: true
+ name: Laundry Room
+ source_id: 0
+ vol: -48
+ - disabled: false
+ id: 3
+ mute: true
+ name: Dining Room
+ source_id: 0
+ vol: -44
+ - disabled: true
+ id: 4
+ mute: true
+ name: BROKEN
+ source_id: 0
+ vol: -50
+ - disabled: false
+ id: 5
+ mute: true
+ name: Guest Bedroom
+ source_id: 0
+ vol: -48
+ - disabled: false
+ id: 6
+ mute: true
+ name: Main Bedroom
+ source_id: 0
+ vol: -40
+ - disabled: false
+ id: 7
+ mute: true
+ name: Main Bathroom
+ source_id: 0
+ vol: -44
+ - disabled: false
+ id: 8
+ mute: true
+ name: Master Bathroom
+ source_id: 0
+ vol: -41
+ - disabled: false
+ id: 9
+ mute: true
+ name: Kitchen High
+ source_id: 0
+ vol: -53
+ - disabled: false
+ id: 10
+ mute: true
+ name: kitchen Low
+ source_id: 0
+ vol: -52
+ - disabled: false
+ id: 11
+ mute: true
+ name: Living Room
+ source_id: 0
+ vol: -46
+ '422':
+ description: Validation Error
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/HTTPValidationError'
+ /api/presets/{pid}/load:
+ post:
+ tags:
+ - preset
+ summary: Load Preset
+ description: 'Load a preset configuration '
+ operationId: load_preset_api_presets__pid__load_post
+ parameters:
+ - description: Preset ID
+ required: true
+ schema:
+ title: Pid
+ minimum: 0.0
+ type: integer
+ description: Preset ID
+ name: pid
+ in: path
+ examples:
+ Mute All:
+ value: 10000
+ summary: Mute All
+ Restore last config:
+ value: 9999
+ summary: Restore last config
+ responses:
+ '200':
+ description: Successful Response
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/Status'
+ examples:
+ Status of Jason's AmpliPi:
+ value:
+ groups:
+ - id: 0
+ mute: false
+ name: Whole House
+ source_id: null
+ vol_delta: -44
+ zones:
+ - 0
+ - 1
+ - 2
+ - 3
+ - 5
+ - 6
+ - 7
+ - 8
+ - 9
+ - 10
+ - 11
+ - id: 1
+ mute: true
+ name: KitchLivDining
+ source_id: 0
+ vol_delta: -49
+ zones:
+ - 3
+ - 9
+ - 10
+ - 11
+ presets:
+ - id: 10000
+ name: Mute All
+ state:
+ zones:
+ - id: 0
+ mute: true
+ - id: 1
+ mute: true
+ - id: 2
+ mute: true
+ - id: 3
+ mute: true
+ - id: 4
+ mute: true
+ - id: 5
+ mute: true
+ sources:
+ - id: 0
+ input: stream=90890
+ name: J1
+ - id: 1
+ input: stream=44590
+ name: J2
+ - id: 2
+ input: local
+ name: Marc
+ - id: 3
+ input: local
+ name: Source 4
+ streams:
+ - id: 90890
+ info:
+ album: Far (Deluxe Version)
+ artist: Regina Spektor
+ img_url: http://mediaserver-cont-dc6-1-v4v6.pandora.com/images/public/int/2/1/5/4/093624974512_500W_500H.jpg
+ station: Regina Spektor Radio
+ track: Eet
+ name: Regina Spektor Radio
+ password: ''
+ station: '4473713754798410236'
+ status: playing
+ type: pandora
+ user: example1@micro-nova.com
+ - id: 90891
+ info:
+ details: No info available
+ name: Matt and Kim Radio
+ password: ''
+ station: '4610303469018478727'
+ status: disconnected
+ type: pandora
+ user: example2@micro-nova.com
+ - id: 90892
+ info:
+ details: No info available
+ name: Pink Radio
+ password: ''
+ station: '4326539910057675260'
+ status: disconnected
+ type: pandora
+ user: example3@micro-nova.com
+ - id: 44590
+ info:
+ details: No info available
+ name: Jason's iPhone
+ status: connected
+ type: shairport
+ - id: 4894
+ info:
+ details: No info available
+ name: Rnay
+ status: disconnected
+ type: shairport
+ info:
+ version: 0.0.1
+ zones:
+ - disabled: false
+ id: 0
+ mute: false
+ name: Local
+ source_id: 1
+ vol: -35
+ - disabled: false
+ id: 1
+ mute: false
+ name: Office
+ source_id: 0
+ vol: -41
+ - disabled: false
+ id: 2
+ mute: true
+ name: Laundry Room
+ source_id: 0
+ vol: -48
+ - disabled: false
+ id: 3
+ mute: true
+ name: Dining Room
+ source_id: 0
+ vol: -44
+ - disabled: true
+ id: 4
+ mute: true
+ name: BROKEN
+ source_id: 0
+ vol: -50
+ - disabled: false
+ id: 5
+ mute: true
+ name: Guest Bedroom
+ source_id: 0
+ vol: -48
+ - disabled: false
+ id: 6
+ mute: true
+ name: Main Bedroom
+ source_id: 0
+ vol: -40
+ - disabled: false
+ id: 7
+ mute: true
+ name: Main Bathroom
+ source_id: 0
+ vol: -44
+ - disabled: false
+ id: 8
+ mute: true
+ name: Master Bathroom
+ source_id: 0
+ vol: -41
+ - disabled: false
+ id: 9
+ mute: true
+ name: Kitchen High
+ source_id: 0
+ vol: -53
+ - disabled: false
+ id: 10
+ mute: true
+ name: kitchen Low
+ source_id: 0
+ vol: -52
+ - disabled: false
+ id: 11
+ mute: true
+ name: Living Room
+ source_id: 0
+ vol: -46
+ '422':
+ description: Validation Error
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/HTTPValidationError'
+components:
+ schemas:
+ Command:
+ title: Command
+ required:
+ - stream_id
+ - cmd
+ type: object
+ properties:
+ stream_id:
+ title: Stream Id
+ type: integer
+ description: Stream to execute the command on
+ cmd:
+ title: Cmd
+ type: string
+ description: Command to execute
+ description: 'A command to execute on a stream '
+ Group:
+ title: Group
+ required:
+ - name
+ - zones
+ type: object
+ properties:
+ id:
+ title: Id
+ type: integer
+ description: Unique identifier
+ name:
+ title: Name
+ type: string
+ description: Friendly name
+ source_id:
+ title: Source Id
+ maximum: 3.0
+ minimum: 0.0
+ type: integer
+ description: id of the connected source
+ default: 0
+ zones:
+ title: Zones
+ uniqueItems: true
+ type: array
+ items:
+ type: integer
+ description: Set of zones belonging to a group
+ mute:
+ title: Mute
+ type: boolean
+ description: Set to true if output is all zones muted
+ default: true
+ vol_delta:
+ title: Vol Delta
+ maximum: 0.0
+ minimum: -79.0
+ type: integer
+ description: Average utput volume in dB
+ default: -79
+ description: 'A group of zones that can share the same audio input and be controlled
+ as a group ie. Updstairs.
+
+
+ Volume, mute, and source_id fields are aggregates of the member zones.'
+ GroupUpdate:
+ title: GroupUpdate
+ type: object
+ properties:
+ name:
+ title: Name
+ type: string
+ description: Friendly name
+ source_id:
+ title: Source Id
+ maximum: 3.0
+ minimum: 0.0
+ type: integer
+ description: id of the connected source
+ default: 0
+ zones:
+ title: Zones
+ type: array
+ items:
+ type: integer
+ description: Set of zones belonging to a group
+ mute:
+ title: Mute
+ type: boolean
+ description: Set to true if output is all zones muted
+ default: true
+ vol_delta:
+ title: Vol Delta
+ maximum: 0.0
+ minimum: -79.0
+ type: integer
+ description: Average utput volume in dB
+ default: -79
+ description: 'Reconfiguration of a Group '
+ GroupUpdate2:
+ title: GroupUpdate2
+ required:
+ - id
+ type: object
+ properties:
+ name:
+ title: Name
+ type: string
+ description: Friendly name
+ source_id:
+ title: Source Id
+ maximum: 3.0
+ minimum: 0.0
+ type: integer
+ description: id of the connected source
+ default: 0
+ zones:
+ title: Zones
+ type: array
+ items:
+ type: integer
+ description: Set of zones belonging to a group
+ mute:
+ title: Mute
+ type: boolean
+ description: Set to true if output is all zones muted
+ default: true
+ vol_delta:
+ title: Vol Delta
+ maximum: 0.0
+ minimum: -79.0
+ type: integer
+ description: Average utput volume in dB
+ default: -79
+ id:
+ title: Id
+ type: integer
+ description: 'Reconfiguration of a specific Group '
+ HTTPValidationError:
+ title: HTTPValidationError
+ type: object
+ properties:
+ detail:
+ title: Detail
+ type: array
+ items:
+ $ref: '#/components/schemas/ValidationError'
+ Info:
+ title: Info
+ type: object
+ properties:
+ config_file:
+ title: Config File
+ type: string
+ default: Uknown
+ version:
+ title: Version
+ type: string
+ default: Unknown
+ mock_ctrl:
+ title: Mock Ctrl
+ type: boolean
+ default: false
+ mock_streams:
+ title: Mock Streams
+ type: boolean
+ default: false
+ description: 'Information about the settings used by the controller '
+ Preset:
+ title: Preset
+ required:
+ - name
+ - state
+ type: object
+ properties:
+ id:
+ title: Id
+ type: integer
+ description: Unique identifier
+ name:
+ title: Name
+ type: string
+ description: Friendly name
+ state:
+ $ref: '#/components/schemas/PresetState'
+ commands:
+ title: Commands
+ type: array
+ items:
+ $ref: '#/components/schemas/Command'
+ default: []
+ last_used:
+ title: Last Used
+ type: integer
+ description: 'A partial controller configuration the can be loaded on demand.
+
+ In addition to most of the configuration found in Status, this can contain
+ commands as well that configure the state of different streaming services.'
+ PresetState:
+ title: PresetState
+ type: object
+ properties:
+ sources:
+ title: Sources
+ type: array
+ items:
+ $ref: '#/components/schemas/SourceUpdate2'
+ zones:
+ title: Zones
+ type: array
+ items:
+ $ref: '#/components/schemas/ZoneUpdate2'
+ groups:
+ title: Groups
+ type: array
+ items:
+ $ref: '#/components/schemas/GroupUpdate2'
+ description: 'A set of partial configuration changes to make to sources, zones,
+ and groups '
+ PresetUpdate:
+ title: PresetUpdate
+ type: object
+ properties:
+ name:
+ title: Name
+ type: string
+ description: Friendly name
+ state:
+ $ref: '#/components/schemas/PresetState'
+ commands:
+ title: Commands
+ type: array
+ items:
+ $ref: '#/components/schemas/Command'
+ description: 'Changes to a current preset
+
+
+ The contents of state and commands will be completely replaced if populated.
+
+ Merging old and new updates seems too complicated and error prone.'
+ Source:
+ title: Source
+ required:
+ - name
+ type: object
+ properties:
+ id:
+ title: Id
+ type: integer
+ description: Unique identifier
+ name:
+ title: Name
+ type: string
+ description: Friendly name
+ input:
+ title: Input
+ type: string
+ description: "Connected audio source\n\n * Digital Stream ('stream=SID')\
+ \ where SID is the ID of the connected stream\n * Analog RCA Input ('local')\
+ \ connects to the RCA inputs associated\n * Nothing ('') behind the scenes\
+ \ this is muxed to a digital output\n "
+ default: ''
+ description: 'An audio source '
+ SourceUpdate:
+ title: SourceUpdate
+ type: object
+ properties:
+ name:
+ title: Name
+ type: string
+ description: Friendly name
+ input:
+ title: Input
+ type: string
+ description: 'Partial reconfiguration of an audio Source '
+ SourceUpdate2:
+ title: SourceUpdate2
+ required:
+ - id
+ type: object
+ properties:
+ name:
+ title: Name
+ type: string
+ description: Friendly name
+ input:
+ title: Input
+ type: string
+ id:
+ title: Id
+ maximum: 4.0
+ minimum: 0.0
+ type: integer
+ description: 'Partial reconfiguration of a specific audio Source '
+ Status:
+ title: Status
+ type: object
+ properties:
+ sources:
+ title: Sources
+ type: array
+ items:
+ $ref: '#/components/schemas/Source'
+ default:
+ - id: 0
+ name: '0'
+ input: ''
+ - id: 1
+ name: '1'
+ input: ''
+ - id: 2
+ name: '2'
+ input: ''
+ - id: 3
+ name: '3'
+ input: ''
+ zones:
+ title: Zones
+ type: array
+ items:
+ $ref: '#/components/schemas/Zone'
+ default:
+ - id: 0
+ name: Zone 0
+ source_id: 0
+ mute: true
+ vol: -79
+ disabled: false
+ - id: 1
+ name: Zone 1
+ source_id: 0
+ mute: true
+ vol: -79
+ disabled: false
+ - id: 2
+ name: Zone 2
+ source_id: 0
+ mute: true
+ vol: -79
+ disabled: false
+ - id: 3
+ name: Zone 3
+ source_id: 0
+ mute: true
+ vol: -79
+ disabled: false
+ - id: 4
+ name: Zone 4
+ source_id: 0
+ mute: true
+ vol: -79
+ disabled: false
+ - id: 5
+ name: Zone 5
+ source_id: 0
+ mute: true
+ vol: -79
+ disabled: false
+ groups:
+ title: Groups
+ type: array
+ items:
+ $ref: '#/components/schemas/Group'
+ default: []
+ streams:
+ title: Streams
+ type: array
+ items:
+ $ref: '#/components/schemas/Stream'
+ default: []
+ presets:
+ title: Presets
+ type: array
+ items:
+ $ref: '#/components/schemas/Preset'
+ default: []
+ info:
+ $ref: '#/components/schemas/Info'
+ description: 'Full Controller Configuration and Status '
+ Stream:
+ title: Stream
+ required:
+ - name
+ - type
+ type: object
+ properties:
+ id:
+ title: Id
+ type: integer
+ description: Unique identifier
+ name:
+ title: Name
+ type: string
+ description: Friendly name
+ type:
+ title: Type
+ type: string
+ description: "stream type\n\n * pandora\n * shairport\n * dlna\n * internetradio\n\
+ \ * spotify\n "
+ user:
+ title: User
+ type: string
+ description: User login
+ password:
+ title: Password
+ type: string
+ description: Password
+ station:
+ title: Station
+ type: string
+ description: Radio station identifier
+ url:
+ title: Url
+ type: string
+ description: Stream url, used for internetradio
+ logo:
+ title: Logo
+ type: string
+ description: Icon/Logo url, used for internetradio
+ info:
+ title: Info
+ type: object
+ description: Additional info about the current audio playing from the stream
+ (generated during playback
+ status:
+ title: Status
+ type: string
+ description: State of the stream
+ description: 'Digital stream such as Pandora, Airplay or Spotify '
+ StreamCommand:
+ title: StreamCommand
+ enum:
+ - play
+ - pause
+ - next
+ - stop
+ - like
+ - ban
+ - shelve
+ type: string
+ description: An enumeration.
+ StreamUpdate:
+ title: StreamUpdate
+ type: object
+ properties:
+ name:
+ title: Name
+ type: string
+ description: Friendly name
+ user:
+ title: User
+ type: string
+ password:
+ title: Password
+ type: string
+ station:
+ title: Station
+ type: string
+ url:
+ title: Url
+ type: string
+ logo:
+ title: Logo
+ type: string
+ description: 'Reconfiguration of a Stream '
+ ValidationError:
+ title: ValidationError
+ required:
+ - loc
+ - msg
+ - type
+ type: object
+ properties:
+ loc:
+ title: Location
+ type: array
+ items:
+ type: string
+ msg:
+ title: Message
+ type: string
+ type:
+ title: Error Type
+ type: string
+ Zone:
+ title: Zone
+ required:
+ - name
+ type: object
+ properties:
+ id:
+ title: Id
+ type: integer
+ description: Unique identifier
+ name:
+ title: Name
+ type: string
+ description: Friendly name
+ source_id:
+ title: Source Id
+ maximum: 3.0
+ minimum: 0.0
+ type: integer
+ description: id of the connected source
+ default: 0
+ mute:
+ title: Mute
+ type: boolean
+ description: Set to true if output is muted
+ default: true
+ vol:
+ title: Vol
+ maximum: 0.0
+ minimum: -79.0
+ type: integer
+ description: Output volume in dB
+ default: -79
+ disabled:
+ title: Disabled
+ type: boolean
+ description: Set to true if not connected to a speaker
+ default: false
+ description: 'Audio output to a stereo pair of speakers, typically belonging
+ to a room '
+ ZoneUpdate:
+ title: ZoneUpdate
+ type: object
+ properties:
+ name:
+ title: Name
+ type: string
+ description: Friendly name
+ source_id:
+ title: Source Id
+ maximum: 3.0
+ minimum: 0.0
+ type: integer
+ description: id of the connected source
+ default: 0
+ mute:
+ title: Mute
+ type: boolean
+ description: Set to true if output is muted
+ default: true
+ vol:
+ title: Vol
+ maximum: 0.0
+ minimum: -79.0
+ type: integer
+ description: Output volume in dB
+ default: -79
+ disabled:
+ title: Disabled
+ type: boolean
+ description: Set to true if not connected to a speaker
+ default: false
+ description: 'Reconfiguration of a Zone '
+ ZoneUpdate2:
+ title: ZoneUpdate2
+ required:
+ - id
+ type: object
+ properties:
+ name:
+ title: Name
+ type: string
+ description: Friendly name
+ source_id:
+ title: Source Id
+ maximum: 3.0
+ minimum: 0.0
+ type: integer
+ description: id of the connected source
+ default: 0
+ mute:
+ title: Mute
+ type: boolean
+ description: Set to true if output is muted
+ default: true
+ vol:
+ title: Vol
+ maximum: 0.0
+ minimum: -79.0
+ type: integer
+ description: Output volume in dB
+ default: -79
+ disabled:
+ title: Disabled
+ type: boolean
+ description: Set to true if not connected to a speaker
+ default: false
+ id:
+ title: Id
+ maximum: 35.0
+ minimum: 0.0
+ type: integer
+ description: 'Reconfiguration of a specific Zone '
+tags:
+- name: status
+ description: The status and configuration of the entire system, including source,
+ zones, groups, and streams.
+- name: source
+ description: Audio source. Can accept sudio input from a local (RCA) connection
+ or any stream. Sources can be connected to one or multiple zones, or connected
+ to nothing at all.
+- name: zone
+ description: Stereo output to a set of speakers, typically a room. Individually
+ controllable with its own volume control. Can be connected to one of the 4 audio
+ sources.
+- name: group
+ description: Group of zones. Grouping allows a set of zones to be controlled together.
+ A zone can belong to multiple groups, allowing for different levels of abstraction,
+ ie. Guest Bedroom can belong to both the 'Upstairs' and 'Whole House' groups.,
+- name: stream
+ description: Digital stream that can be connected to a source, ie. Pandora, Airplay,
+ Spotify, Internet Radio, DLNA.
+- name: preset
+ description: A partial system configuration. Used to load specific configurations,
+ such as "Home Theater" mode where the living room speakers are connected to the
+ TV's audio output.
diff --git a/bundles/org.openhab.binding.amplipi/pom.xml b/bundles/org.openhab.binding.amplipi/pom.xml
new file mode 100644
index 0000000000000..aa58f76f186e9
--- /dev/null
+++ b/bundles/org.openhab.binding.amplipi/pom.xml
@@ -0,0 +1,79 @@
+
+
+
+ 4.0.0
+
+
+ org.openhab.addons.bundles
+ org.openhab.addons.reactor.bundles
+ 3.2.0-SNAPSHOT
+
+
+ org.openhab.binding.amplipi
+
+ openHAB Add-ons :: Bundles :: AmpliPi Binding
+
+
+ 3.4.3
+
+
+
+
+
+ org.codehaus.mojo
+ build-helper-maven-plugin
+
+
+ add-source
+ generate-sources
+
+ add-source
+
+
+
+
+
+
+
+
+
+
+ org.openapitools
+ openapi-generator-maven-plugin
+ 5.1.0
+
+
+
+ generate
+
+
+ ${project.basedir}/amplipi-api.yml
+ jaxrs-cxf-client
+
+ org.openhab.binding.amplipi.internal.api
+ org.openhab.binding.amplipi.internal.model
+ true
+ false
+ false
+ false
+ false
+ true
+
+
+
+
+
+
+
+
+
+
+ org.apache.cxf
+ cxf-rt-rs-client
+ ${cxf-version}
+ compile
+
+
+
+
diff --git a/bundles/org.openhab.binding.amplipi/src/gen/java/org/openhab/binding/amplipi/internal/api/GroupApi.java b/bundles/org.openhab.binding.amplipi/src/gen/java/org/openhab/binding/amplipi/internal/api/GroupApi.java
new file mode 100644
index 0000000000000..de723abe00c39
--- /dev/null
+++ b/bundles/org.openhab.binding.amplipi/src/gen/java/org/openhab/binding/amplipi/internal/api/GroupApi.java
@@ -0,0 +1,113 @@
+/**
+ * Copyright (c) 2010-2021 Contributors to the openHAB project
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ */
+package org.openhab.binding.amplipi.internal.api;
+
+import java.util.List;
+import java.util.Map;
+
+import javax.ws.rs.Consumes;
+import javax.ws.rs.DELETE;
+import javax.ws.rs.GET;
+import javax.ws.rs.PATCH;
+import javax.ws.rs.POST;
+import javax.ws.rs.Path;
+import javax.ws.rs.PathParam;
+import javax.ws.rs.Produces;
+
+import org.openhab.binding.amplipi.internal.model.Group;
+import org.openhab.binding.amplipi.internal.model.GroupUpdate;
+import org.openhab.binding.amplipi.internal.model.Status;
+
+import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.tags.Tag;
+
+/**
+ * AmpliPi
+ *
+ *
+ * This is the AmpliPi home audio system's control server. # Configuration This web interface allows you to control and
+ * configure your AmpliPi device. At the moment the API is the only way to configure the AmpliPi. ## Try it out! __Using
+ * this web interface to test API commands:__ 1. Go to an API request 1. Pick one of the examples 2. Edit it 3. Press
+ * try button, it will send an API command/request to the AmpliPi __Try using the get status:__ 1. Go to [Status -> Get
+ * Status](#get-/api/) 2. Click the Try button, you will see a response below with the full status/config of the AmpliPi
+ * controller __Try creating a new group:__ 1. Go to [Group -> Create Group](#post-/api/group) 2. Click Example 3. Edit
+ * the zones and group name 4. Click the try button, you will see a response with the newly created group __Here are
+ * some other things that you might want to change:__ - [Stream -> Create new stream](#post-/api/stream) - [Zone ->
+ * Update Zone](#patch-/api/zones/-zid-) (to change the zone name) - [Preset -> Create preset](#post-/api/preset) (Have
+ * a look at the model to see what can be added here) # More Info Check out all of the different things you can do with
+ * this API: - [Status](#tag--status) - [Source](#tag--source) - [Zone](#tag--zone) - [Group](#tag--group) -
+ * [Stream](#tag--stream) - [Preset](#tag--preset) # OpenAPI This API is documented using the OpenAPI specification
+ *
+ */
+@Path("/api")
+@Tag(name = "/")
+public interface GroupApi {
+
+ /**
+ * Create Group
+ *
+ * Create a new grouping of zones
+ *
+ */
+ @POST
+ @Path("/group")
+ @Consumes({ "application/json" })
+ @Produces({ "application/json" })
+ @Operation(tags = {})
+ public Group createGroupApiGroupPost(Group group);
+
+ /**
+ * Delete Group
+ *
+ * Delete a group (group=**gid**)
+ *
+ */
+ @DELETE
+ @Path("/groups/{gid}")
+ @Produces({ "application/json" })
+ public Status deleteGroupApiGroupsGidDelete(@PathParam("gid") Integer gid);
+
+ /**
+ * Get Group
+ *
+ * Get Group with id=**gid**
+ *
+ */
+ @GET
+ @Path("/groups/{gid}")
+ @Produces({ "application/json" })
+ public Group getGroupApiGroupsGidGet(@PathParam("gid") Integer gid);
+
+ /**
+ * Get Groups
+ *
+ * Get all groups
+ *
+ */
+ @GET
+ @Path("/groups")
+ @Produces({ "application/json" })
+ public Map> getGroupsApiGroupsGet();
+
+ /**
+ * Set Group
+ *
+ * Update a groups's configuration (group=**gid**)
+ *
+ */
+ @PATCH
+ @Path("/groups/{gid}")
+ @Consumes({ "application/json" })
+ @Produces({ "application/json" })
+ public Status setGroupApiGroupsGidPatch(@PathParam("gid") Integer gid, GroupUpdate groupUpdate);
+}
diff --git a/bundles/org.openhab.binding.amplipi/src/gen/java/org/openhab/binding/amplipi/internal/api/PresetApi.java b/bundles/org.openhab.binding.amplipi/src/gen/java/org/openhab/binding/amplipi/internal/api/PresetApi.java
new file mode 100644
index 0000000000000..a0ecb367f9b99
--- /dev/null
+++ b/bundles/org.openhab.binding.amplipi/src/gen/java/org/openhab/binding/amplipi/internal/api/PresetApi.java
@@ -0,0 +1,120 @@
+/**
+ * Copyright (c) 2010-2021 Contributors to the openHAB project
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ */
+package org.openhab.binding.amplipi.internal.api;
+
+import java.util.List;
+import java.util.Map;
+
+import javax.ws.rs.Consumes;
+import javax.ws.rs.DELETE;
+import javax.ws.rs.GET;
+import javax.ws.rs.POST;
+import javax.ws.rs.Path;
+import javax.ws.rs.PathParam;
+import javax.ws.rs.Produces;
+
+import org.openhab.binding.amplipi.internal.model.Preset;
+import org.openhab.binding.amplipi.internal.model.PresetUpdate;
+import org.openhab.binding.amplipi.internal.model.Status;
+
+import io.swagger.v3.oas.annotations.tags.Tag;
+
+/**
+ * AmpliPi
+ *
+ *
+ * This is the AmpliPi home audio system's control server. # Configuration This web interface allows you to control and
+ * configure your AmpliPi device. At the moment the API is the only way to configure the AmpliPi. ## Try it out! __Using
+ * this web interface to test API commands:__ 1. Go to an API request 1. Pick one of the examples 2. Edit it 3. Press
+ * try button, it will send an API command/request to the AmpliPi __Try using the get status:__ 1. Go to [Status -> Get
+ * Status](#get-/api/) 2. Click the Try button, you will see a response below with the full status/config of the AmpliPi
+ * controller __Try creating a new group:__ 1. Go to [Group -> Create Group](#post-/api/group) 2. Click Example 3. Edit
+ * the zones and group name 4. Click the try button, you will see a response with the newly created group __Here are
+ * some other things that you might want to change:__ - [Stream -> Create new stream](#post-/api/stream) - [Zone ->
+ * Update Zone](#patch-/api/zones/-zid-) (to change the zone name) - [Preset -> Create preset](#post-/api/preset) (Have
+ * a look at the model to see what can be added here) # More Info Check out all of the different things you can do with
+ * this API: - [Status](#tag--status) - [Source](#tag--source) - [Zone](#tag--zone) - [Group](#tag--group) -
+ * [Stream](#tag--stream) - [Preset](#tag--preset) # OpenAPI This API is documented using the OpenAPI specification
+ *
+ */
+@Path("/api")
+@Tag(name = "/")
+public interface PresetApi {
+
+ /**
+ * Create Preset
+ *
+ * Create a new preset configuration
+ *
+ */
+ @POST
+ @Path("/preset")
+ @Consumes({ "application/json" })
+ @Produces({ "application/json" })
+ public Preset createPresetApiPresetPost(Preset preset);
+
+ /**
+ * Delete Preset
+ *
+ * Delete a preset
+ *
+ */
+ @DELETE
+ @Path("/presets/{pid}")
+ @Produces({ "application/json" })
+ public Status deletePresetApiPresetsPidDelete(@PathParam("pid") Integer pid);
+
+ /**
+ * Get Preset
+ *
+ * Get Preset with id=**pid**
+ *
+ */
+ @GET
+ @Path("/presets/{pid}")
+ @Produces({ "application/json" })
+ public Preset getPresetApiPresetsPidGet(@PathParam("pid") Integer pid);
+
+ /**
+ * Get Presets
+ *
+ * Get all presets
+ *
+ */
+ @GET
+ @Path("/presets")
+ @Produces({ "application/json" })
+ public Map> getPresetsApiPresetsGet();
+
+ /**
+ * Load Preset
+ *
+ * Load a preset configuration
+ *
+ */
+ @POST
+ @Path("/presets/{pid}/load")
+ @Produces({ "application/json" })
+ public Status loadPresetApiPresetsPidLoadPost(@PathParam("pid") Integer pid);
+
+ /**
+ * Set Preset
+ *
+ * Update a preset's configuration (preset=**pid**)
+ *
+ */
+ @Path("/presets/{pid}")
+ @Consumes({ "application/json" })
+ @Produces({ "application/json" })
+ public Status setPresetApiPresetsPidPatch(@PathParam("pid") Integer pid, PresetUpdate presetUpdate);
+}
diff --git a/bundles/org.openhab.binding.amplipi/src/gen/java/org/openhab/binding/amplipi/internal/api/SourceApi.java b/bundles/org.openhab.binding.amplipi/src/gen/java/org/openhab/binding/amplipi/internal/api/SourceApi.java
new file mode 100644
index 0000000000000..0f6c23549ccf7
--- /dev/null
+++ b/bundles/org.openhab.binding.amplipi/src/gen/java/org/openhab/binding/amplipi/internal/api/SourceApi.java
@@ -0,0 +1,84 @@
+/**
+ * Copyright (c) 2010-2021 Contributors to the openHAB project
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ */
+package org.openhab.binding.amplipi.internal.api;
+
+import java.util.List;
+import java.util.Map;
+
+import javax.ws.rs.Consumes;
+import javax.ws.rs.GET;
+import javax.ws.rs.Path;
+import javax.ws.rs.PathParam;
+import javax.ws.rs.Produces;
+
+import org.openhab.binding.amplipi.internal.model.Source;
+import org.openhab.binding.amplipi.internal.model.SourceUpdate;
+import org.openhab.binding.amplipi.internal.model.Status;
+
+import io.swagger.v3.oas.annotations.tags.Tag;
+
+/**
+ * AmpliPi
+ *
+ *
+ * This is the AmpliPi home audio system's control server. # Configuration This web interface allows you to control and
+ * configure your AmpliPi device. At the moment the API is the only way to configure the AmpliPi. ## Try it out! __Using
+ * this web interface to test API commands:__ 1. Go to an API request 1. Pick one of the examples 2. Edit it 3. Press
+ * try button, it will send an API command/request to the AmpliPi __Try using the get status:__ 1. Go to [Status -> Get
+ * Status](#get-/api/) 2. Click the Try button, you will see a response below with the full status/config of the AmpliPi
+ * controller __Try creating a new group:__ 1. Go to [Group -> Create Group](#post-/api/group) 2. Click Example 3. Edit
+ * the zones and group name 4. Click the try button, you will see a response with the newly created group __Here are
+ * some other things that you might want to change:__ - [Stream -> Create new stream](#post-/api/stream) - [Zone ->
+ * Update Zone](#patch-/api/zones/-zid-) (to change the zone name) - [Preset -> Create preset](#post-/api/preset) (Have
+ * a look at the model to see what can be added here) # More Info Check out all of the different things you can do with
+ * this API: - [Status](#tag--status) - [Source](#tag--source) - [Zone](#tag--zone) - [Group](#tag--group) -
+ * [Stream](#tag--stream) - [Preset](#tag--preset) # OpenAPI This API is documented using the OpenAPI specification
+ *
+ */
+@Path("/api/sources")
+@Tag(name = "/")
+public interface SourceApi {
+
+ /**
+ * Get Source
+ *
+ * Get Source with id=**sid**
+ *
+ */
+ @GET
+ @Path("/{sid}")
+ @Produces({ "application/json" })
+ public Source getSourceApiSourcesSidGet(@PathParam("sid") Integer sid);
+
+ /**
+ * Get Sources
+ *
+ * Get all sources
+ *
+ */
+ @GET
+
+ @Produces({ "application/json" })
+ public Map> getSourcesApiSourcesGet();
+
+ /**
+ * Set Source
+ *
+ * Update a source's configuration (source=**sid**)
+ *
+ */
+ @Path("/{sid}")
+ @Consumes({ "application/json" })
+ @Produces({ "application/json" })
+ public Status setSourceApiSourcesSidPatch(@PathParam("sid") Integer sid, SourceUpdate sourceUpdate);
+}
diff --git a/bundles/org.openhab.binding.amplipi/src/gen/java/org/openhab/binding/amplipi/internal/api/StatusApi.java b/bundles/org.openhab.binding.amplipi/src/gen/java/org/openhab/binding/amplipi/internal/api/StatusApi.java
new file mode 100644
index 0000000000000..3d0e5e693d66c
--- /dev/null
+++ b/bundles/org.openhab.binding.amplipi/src/gen/java/org/openhab/binding/amplipi/internal/api/StatusApi.java
@@ -0,0 +1,66 @@
+/**
+ * Copyright (c) 2010-2021 Contributors to the openHAB project
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ */
+package org.openhab.binding.amplipi.internal.api;
+
+import javax.ws.rs.GET;
+import javax.ws.rs.Path;
+import javax.ws.rs.Produces;
+
+import org.openhab.binding.amplipi.internal.model.Status;
+
+import io.swagger.v3.oas.annotations.tags.Tag;
+
+/**
+ * AmpliPi
+ *
+ *
+ * This is the AmpliPi home audio system's control server. # Configuration This web interface allows you to control and
+ * configure your AmpliPi device. At the moment the API is the only way to configure the AmpliPi. ## Try it out! __Using
+ * this web interface to test API commands:__ 1. Go to an API request 1. Pick one of the examples 2. Edit it 3. Press
+ * try button, it will send an API command/request to the AmpliPi __Try using the get status:__ 1. Go to [Status -> Get
+ * Status](#get-/api/) 2. Click the Try button, you will see a response below with the full status/config of the AmpliPi
+ * controller __Try creating a new group:__ 1. Go to [Group -> Create Group](#post-/api/group) 2. Click Example 3. Edit
+ * the zones and group name 4. Click the try button, you will see a response with the newly created group __Here are
+ * some other things that you might want to change:__ - [Stream -> Create new stream](#post-/api/stream) - [Zone ->
+ * Update Zone](#patch-/api/zones/-zid-) (to change the zone name) - [Preset -> Create preset](#post-/api/preset) (Have
+ * a look at the model to see what can be added here) # More Info Check out all of the different things you can do with
+ * this API: - [Status](#tag--status) - [Source](#tag--source) - [Zone](#tag--zone) - [Group](#tag--group) -
+ * [Stream](#tag--stream) - [Preset](#tag--preset) # OpenAPI This API is documented using the OpenAPI specification
+ *
+ */
+@Path("/api")
+@Tag(name = "")
+public interface StatusApi {
+
+ /**
+ * Get Status
+ *
+ * Get the system status and configuration
+ *
+ */
+ @GET
+
+ @Produces({ "application/json" })
+ public Status getStatusApiGet();
+
+ /**
+ * Get Status
+ *
+ * Get the system status and configuration
+ *
+ */
+ @GET
+
+ @Produces({ "application/json" })
+ public Status getStatusApiGet_1();
+}
diff --git a/bundles/org.openhab.binding.amplipi/src/gen/java/org/openhab/binding/amplipi/internal/api/StreamApi.java b/bundles/org.openhab.binding.amplipi/src/gen/java/org/openhab/binding/amplipi/internal/api/StreamApi.java
new file mode 100644
index 0000000000000..ef91ac624d1a7
--- /dev/null
+++ b/bundles/org.openhab.binding.amplipi/src/gen/java/org/openhab/binding/amplipi/internal/api/StreamApi.java
@@ -0,0 +1,136 @@
+/**
+ * Copyright (c) 2010-2021 Contributors to the openHAB project
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ */
+package org.openhab.binding.amplipi.internal.api;
+
+import java.util.List;
+import java.util.Map;
+
+import javax.ws.rs.Consumes;
+import javax.ws.rs.DELETE;
+import javax.ws.rs.GET;
+import javax.ws.rs.POST;
+import javax.ws.rs.Path;
+import javax.ws.rs.PathParam;
+import javax.ws.rs.Produces;
+
+import org.openhab.binding.amplipi.internal.model.Status;
+import org.openhab.binding.amplipi.internal.model.Stream;
+import org.openhab.binding.amplipi.internal.model.StreamCommand;
+import org.openhab.binding.amplipi.internal.model.StreamUpdate;
+
+import io.swagger.v3.oas.annotations.tags.Tag;
+
+/**
+ * AmpliPi
+ *
+ *
+ * This is the AmpliPi home audio system's control server. # Configuration This web interface allows you to control and
+ * configure your AmpliPi device. At the moment the API is the only way to configure the AmpliPi. ## Try it out! __Using
+ * this web interface to test API commands:__ 1. Go to an API request 1. Pick one of the examples 2. Edit it 3. Press
+ * try button, it will send an API command/request to the AmpliPi __Try using the get status:__ 1. Go to [Status -> Get
+ * Status](#get-/api/) 2. Click the Try button, you will see a response below with the full status/config of the AmpliPi
+ * controller __Try creating a new group:__ 1. Go to [Group -> Create Group](#post-/api/group) 2. Click Example 3. Edit
+ * the zones and group name 4. Click the try button, you will see a response with the newly created group __Here are
+ * some other things that you might want to change:__ - [Stream -> Create new stream](#post-/api/stream) - [Zone ->
+ * Update Zone](#patch-/api/zones/-zid-) (to change the zone name) - [Preset -> Create preset](#post-/api/preset) (Have
+ * a look at the model to see what can be added here) # More Info Check out all of the different things you can do with
+ * this API: - [Status](#tag--status) - [Source](#tag--source) - [Zone](#tag--zone) - [Group](#tag--group) -
+ * [Stream](#tag--stream) - [Preset](#tag--preset) # OpenAPI This API is documented using the OpenAPI specification
+ *
+ */
+@Path("/api")
+@Tag(name = "/", description = "")
+public interface StreamApi {
+
+ /**
+ * Change Station
+ *
+ * Change station on a pandora stream (stream=**sid**)
+ *
+ */
+ @POST
+ @Path("/streams/{sid}/station={station}")
+ @Produces({ "application/json" })
+ public Status changeStationApiStreamsSidStationStationPost(@PathParam("sid") Integer sid,
+ @PathParam("station") Integer station);
+
+ /**
+ * Create Stream
+ *
+ * Create a new audio stream
+ *
+ */
+ @POST
+ @Path("/stream")
+ @Consumes({ "application/json" })
+ @Produces({ "application/json" })
+ public Stream createStreamApiStreamPost(Stream stream);
+
+ /**
+ * Delete Stream
+ *
+ * Delete a stream
+ *
+ */
+ @DELETE
+ @Path("/streams/{sid}")
+ @Produces({ "application/json" })
+ public Status deleteStreamApiStreamsSidDelete(@PathParam("sid") Integer sid);
+
+ /**
+ * Exec Command
+ *
+ * Execute a comamnds on a stream (stream=**sid**). Command options: * Play Stream: **play** * Pause Stream:
+ * **pause** * Skip to next song: **next** * Stop Stream: **stop** * Like/Love Current Song: **love** * Ban Current
+ * Song (pandora only): **ban** * Shelve Current Song (pandora only): **shelve** Currently only available with
+ * Pandora streams
+ *
+ */
+ @POST
+ @Path("/streams/{sid}/{cmd}")
+ @Produces({ "application/json" })
+ public Status execCommandApiStreamsSidCmdPost(@PathParam("sid") Integer sid, @PathParam("cmd") StreamCommand cmd);
+
+ /**
+ * Get Stream
+ *
+ * Get Stream with id=**sid**
+ *
+ */
+ @GET
+ @Path("/streams/{sid}")
+ @Produces({ "application/json" })
+ public Stream getStreamApiStreamsSidGet(@PathParam("sid") Integer sid);
+
+ /**
+ * Get Streams
+ *
+ * Get all streams
+ *
+ */
+ @GET
+ @Path("/streams")
+ @Produces({ "application/json" })
+ public Map> getStreamsApiStreamsGet();
+
+ /**
+ * Set Stream
+ *
+ * Update a stream's configuration (stream=**sid**)
+ *
+ */
+ @Path("/streams/{sid}")
+ @Consumes({ "application/json" })
+ @Produces({ "application/json" })
+ public Status setStreamApiStreamsSidPatch(@PathParam("sid") Integer sid, StreamUpdate streamUpdate);
+}
diff --git a/bundles/org.openhab.binding.amplipi/src/gen/java/org/openhab/binding/amplipi/internal/api/ZoneApi.java b/bundles/org.openhab.binding.amplipi/src/gen/java/org/openhab/binding/amplipi/internal/api/ZoneApi.java
new file mode 100644
index 0000000000000..0591eaed90624
--- /dev/null
+++ b/bundles/org.openhab.binding.amplipi/src/gen/java/org/openhab/binding/amplipi/internal/api/ZoneApi.java
@@ -0,0 +1,84 @@
+/**
+ * Copyright (c) 2010-2021 Contributors to the openHAB project
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ */
+package org.openhab.binding.amplipi.internal.api;
+
+import java.util.List;
+import java.util.Map;
+
+import javax.ws.rs.Consumes;
+import javax.ws.rs.GET;
+import javax.ws.rs.Path;
+import javax.ws.rs.PathParam;
+import javax.ws.rs.Produces;
+
+import org.openhab.binding.amplipi.internal.model.Status;
+import org.openhab.binding.amplipi.internal.model.Zone;
+import org.openhab.binding.amplipi.internal.model.ZoneUpdate;
+
+import io.swagger.v3.oas.annotations.tags.Tag;
+
+/**
+ * AmpliPi
+ *
+ *
+ * This is the AmpliPi home audio system's control server. # Configuration This web interface allows you to control and
+ * configure your AmpliPi device. At the moment the API is the only way to configure the AmpliPi. ## Try it out! __Using
+ * this web interface to test API commands:__ 1. Go to an API request 1. Pick one of the examples 2. Edit it 3. Press
+ * try button, it will send an API command/request to the AmpliPi __Try using the get status:__ 1. Go to [Status -> Get
+ * Status](#get-/api/) 2. Click the Try button, you will see a response below with the full status/config of the AmpliPi
+ * controller __Try creating a new group:__ 1. Go to [Group -> Create Group](#post-/api/group) 2. Click Example 3. Edit
+ * the zones and group name 4. Click the try button, you will see a response with the newly created group __Here are
+ * some other things that you might want to change:__ - [Stream -> Create new stream](#post-/api/stream) - [Zone ->
+ * Update Zone](#patch-/api/zones/-zid-) (to change the zone name) - [Preset -> Create preset](#post-/api/preset) (Have
+ * a look at the model to see what can be added here) # More Info Check out all of the different things you can do with
+ * this API: - [Status](#tag--status) - [Source](#tag--source) - [Zone](#tag--zone) - [Group](#tag--group) -
+ * [Stream](#tag--stream) - [Preset](#tag--preset) # OpenAPI This API is documented using the OpenAPI specification
+ *
+ */
+@Path("/api/zones")
+@Tag(name = "/", description = "")
+public interface ZoneApi {
+
+ /**
+ * Get Zone
+ *
+ * Get Zone with id=**zid**
+ *
+ */
+ @GET
+ @Path("/{zid}")
+ @Produces({ "application/json" })
+ public Zone getZoneApiZonesZidGet(@PathParam("zid") Integer zid);
+
+ /**
+ * Get Zones
+ *
+ * Get all zones
+ *
+ */
+ @GET
+
+ @Produces({ "application/json" })
+ public Map> getZonesApiZonesGet();
+
+ /**
+ * Set Zone
+ *
+ * Update a zone's configuration (zone=**zid**)
+ *
+ */
+ @Path("/{zid}")
+ @Consumes({ "application/json" })
+ @Produces({ "application/json" })
+ public Status setZoneApiZonesZidPatch(@PathParam("zid") Integer zid, ZoneUpdate zoneUpdate);
+}
diff --git a/bundles/org.openhab.binding.amplipi/src/gen/java/org/openhab/binding/amplipi/internal/model/Command.java b/bundles/org.openhab.binding.amplipi/src/gen/java/org/openhab/binding/amplipi/internal/model/Command.java
new file mode 100644
index 0000000000000..9c7d7c0474c76
--- /dev/null
+++ b/bundles/org.openhab.binding.amplipi/src/gen/java/org/openhab/binding/amplipi/internal/model/Command.java
@@ -0,0 +1,96 @@
+/**
+ * Copyright (c) 2010-2021 Contributors to the openHAB project
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ */
+package org.openhab.binding.amplipi.internal.model;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+
+/**
+ * A command to execute on a stream
+ **/
+@Schema(description = "A command to execute on a stream ")
+public class Command {
+
+ @Schema(required = true)
+ /**
+ * Stream to execute the command on
+ **/
+ private Integer streamId;
+
+ @Schema(required = true)
+ /**
+ * Command to execute
+ **/
+ private String cmd;
+
+ /**
+ * Stream to execute the command on
+ *
+ * @return streamId
+ **/
+ @JsonProperty("stream_id")
+ public Integer getStreamId() {
+ return streamId;
+ }
+
+ public void setStreamId(Integer streamId) {
+ this.streamId = streamId;
+ }
+
+ public Command streamId(Integer streamId) {
+ this.streamId = streamId;
+ return this;
+ }
+
+ /**
+ * Command to execute
+ *
+ * @return cmd
+ **/
+ @JsonProperty("cmd")
+ public String getCmd() {
+ return cmd;
+ }
+
+ public void setCmd(String cmd) {
+ this.cmd = cmd;
+ }
+
+ public Command cmd(String cmd) {
+ this.cmd = cmd;
+ return this;
+ }
+
+ @Override
+ public String toString() {
+ StringBuilder sb = new StringBuilder();
+ sb.append("class Command {\n");
+
+ sb.append(" streamId: ").append(toIndentedString(streamId)).append("\n");
+ sb.append(" cmd: ").append(toIndentedString(cmd)).append("\n");
+ sb.append("}");
+ return sb.toString();
+ }
+
+ /**
+ * Convert the given object to string with each line indented by 4 spaces
+ * (except the first line).
+ */
+ private static String toIndentedString(Object o) {
+ if (o == null) {
+ return "null";
+ }
+ return o.toString().replace("\n", "\n ");
+ }
+}
diff --git a/bundles/org.openhab.binding.amplipi/src/gen/java/org/openhab/binding/amplipi/internal/model/Group.java b/bundles/org.openhab.binding.amplipi/src/gen/java/org/openhab/binding/amplipi/internal/model/Group.java
new file mode 100644
index 0000000000000..b257d7fc4a060
--- /dev/null
+++ b/bundles/org.openhab.binding.amplipi/src/gen/java/org/openhab/binding/amplipi/internal/model/Group.java
@@ -0,0 +1,213 @@
+/**
+ * Copyright (c) 2010-2021 Contributors to the openHAB project
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ */
+package org.openhab.binding.amplipi.internal.model;
+
+import java.util.LinkedHashSet;
+import java.util.Set;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+
+/**
+ * A group of zones that can share the same audio input and be controlled as a group ie. Updstairs. Volume, mute, and
+ * source_id fields are aggregates of the member zones.
+ **/
+@Schema(description = "A group of zones that can share the same audio input and be controlled as a group ie. Updstairs. Volume, mute, and source_id fields are aggregates of the member zones.")
+public class Group {
+
+ @Schema
+ /**
+ * Unique identifier
+ **/
+ private Integer id;
+
+ @Schema(required = true)
+ /**
+ * Friendly name
+ **/
+ private String name;
+
+ @Schema
+ /**
+ * id of the connected source
+ **/
+ private Integer sourceId = 0;
+
+ @Schema(required = true)
+ /**
+ * Set of zones belonging to a group
+ **/
+ private Set zones = new LinkedHashSet();
+
+ @Schema
+ /**
+ * Set to true if output is all zones muted
+ **/
+ private Boolean mute = true;
+
+ @Schema
+ /**
+ * Average utput volume in dB
+ **/
+ private Integer volDelta = -79;
+
+ /**
+ * Unique identifier
+ *
+ * @return id
+ **/
+ @JsonProperty("id")
+ public Integer getId() {
+ return id;
+ }
+
+ public void setId(Integer id) {
+ this.id = id;
+ }
+
+ public Group id(Integer id) {
+ this.id = id;
+ return this;
+ }
+
+ /**
+ * Friendly name
+ *
+ * @return name
+ **/
+ @JsonProperty("name")
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ public Group name(String name) {
+ this.name = name;
+ return this;
+ }
+
+ /**
+ * id of the connected source
+ * minimum: 0
+ * maximum: 3
+ *
+ * @return sourceId
+ **/
+ @JsonProperty("source_id")
+ public Integer getSourceId() {
+ return sourceId;
+ }
+
+ public void setSourceId(Integer sourceId) {
+ this.sourceId = sourceId;
+ }
+
+ public Group sourceId(Integer sourceId) {
+ this.sourceId = sourceId;
+ return this;
+ }
+
+ /**
+ * Set of zones belonging to a group
+ *
+ * @return zones
+ **/
+ @JsonProperty("zones")
+ public Set getZones() {
+ return zones;
+ }
+
+ public void setZones(Set zones) {
+ this.zones = zones;
+ }
+
+ public Group zones(Set zones) {
+ this.zones = zones;
+ return this;
+ }
+
+ public Group addZonesItem(Integer zonesItem) {
+ this.zones.add(zonesItem);
+ return this;
+ }
+
+ /**
+ * Set to true if output is all zones muted
+ *
+ * @return mute
+ **/
+ @JsonProperty("mute")
+ public Boolean getMute() {
+ return mute;
+ }
+
+ public void setMute(Boolean mute) {
+ this.mute = mute;
+ }
+
+ public Group mute(Boolean mute) {
+ this.mute = mute;
+ return this;
+ }
+
+ /**
+ * Average utput volume in dB
+ * minimum: -79
+ * maximum: 0
+ *
+ * @return volDelta
+ **/
+ @JsonProperty("vol_delta")
+ public Integer getVolDelta() {
+ return volDelta;
+ }
+
+ public void setVolDelta(Integer volDelta) {
+ this.volDelta = volDelta;
+ }
+
+ public Group volDelta(Integer volDelta) {
+ this.volDelta = volDelta;
+ return this;
+ }
+
+ @Override
+ public String toString() {
+ StringBuilder sb = new StringBuilder();
+ sb.append("class Group {\n");
+
+ sb.append(" id: ").append(toIndentedString(id)).append("\n");
+ sb.append(" name: ").append(toIndentedString(name)).append("\n");
+ sb.append(" sourceId: ").append(toIndentedString(sourceId)).append("\n");
+ sb.append(" zones: ").append(toIndentedString(zones)).append("\n");
+ sb.append(" mute: ").append(toIndentedString(mute)).append("\n");
+ sb.append(" volDelta: ").append(toIndentedString(volDelta)).append("\n");
+ sb.append("}");
+ return sb.toString();
+ }
+
+ /**
+ * Convert the given object to string with each line indented by 4 spaces
+ * (except the first line).
+ */
+ private static String toIndentedString(Object o) {
+ if (o == null) {
+ return "null";
+ }
+ return o.toString().replace("\n", "\n ");
+ }
+}
diff --git a/bundles/org.openhab.binding.amplipi/src/gen/java/org/openhab/binding/amplipi/internal/model/GroupUpdate.java b/bundles/org.openhab.binding.amplipi/src/gen/java/org/openhab/binding/amplipi/internal/model/GroupUpdate.java
new file mode 100644
index 0000000000000..d93dcb3d133ff
--- /dev/null
+++ b/bundles/org.openhab.binding.amplipi/src/gen/java/org/openhab/binding/amplipi/internal/model/GroupUpdate.java
@@ -0,0 +1,185 @@
+/**
+ * Copyright (c) 2010-2021 Contributors to the openHAB project
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ */
+package org.openhab.binding.amplipi.internal.model;
+
+import java.util.List;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+
+/**
+ * Reconfiguration of a Group
+ **/
+@Schema(description = "Reconfiguration of a Group ")
+public class GroupUpdate {
+
+ @Schema
+ /**
+ * Friendly name
+ **/
+ private String name;
+
+ @Schema
+ /**
+ * id of the connected source
+ **/
+ private Integer sourceId = 0;
+
+ @Schema
+ /**
+ * Set of zones belonging to a group
+ **/
+ private List zones = null;
+
+ @Schema
+ /**
+ * Set to true if output is all zones muted
+ **/
+ private Boolean mute = true;
+
+ @Schema
+ /**
+ * Average utput volume in dB
+ **/
+ private Integer volDelta = -79;
+
+ /**
+ * Friendly name
+ *
+ * @return name
+ **/
+ @JsonProperty("name")
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ public GroupUpdate name(String name) {
+ this.name = name;
+ return this;
+ }
+
+ /**
+ * id of the connected source
+ * minimum: 0
+ * maximum: 3
+ *
+ * @return sourceId
+ **/
+ @JsonProperty("source_id")
+ public Integer getSourceId() {
+ return sourceId;
+ }
+
+ public void setSourceId(Integer sourceId) {
+ this.sourceId = sourceId;
+ }
+
+ public GroupUpdate sourceId(Integer sourceId) {
+ this.sourceId = sourceId;
+ return this;
+ }
+
+ /**
+ * Set of zones belonging to a group
+ *
+ * @return zones
+ **/
+ @JsonProperty("zones")
+ public List getZones() {
+ return zones;
+ }
+
+ public void setZones(List zones) {
+ this.zones = zones;
+ }
+
+ public GroupUpdate zones(List zones) {
+ this.zones = zones;
+ return this;
+ }
+
+ public GroupUpdate addZonesItem(Integer zonesItem) {
+ this.zones.add(zonesItem);
+ return this;
+ }
+
+ /**
+ * Set to true if output is all zones muted
+ *
+ * @return mute
+ **/
+ @JsonProperty("mute")
+ public Boolean getMute() {
+ return mute;
+ }
+
+ public void setMute(Boolean mute) {
+ this.mute = mute;
+ }
+
+ public GroupUpdate mute(Boolean mute) {
+ this.mute = mute;
+ return this;
+ }
+
+ /**
+ * Average utput volume in dB
+ * minimum: -79
+ * maximum: 0
+ *
+ * @return volDelta
+ **/
+ @JsonProperty("vol_delta")
+ public Integer getVolDelta() {
+ return volDelta;
+ }
+
+ public void setVolDelta(Integer volDelta) {
+ this.volDelta = volDelta;
+ }
+
+ public GroupUpdate volDelta(Integer volDelta) {
+ this.volDelta = volDelta;
+ return this;
+ }
+
+ @Override
+ public String toString() {
+ StringBuilder sb = new StringBuilder();
+ sb.append("class GroupUpdate {\n");
+
+ sb.append(" name: ").append(toIndentedString(name)).append("\n");
+ sb.append(" sourceId: ").append(toIndentedString(sourceId)).append("\n");
+ sb.append(" zones: ").append(toIndentedString(zones)).append("\n");
+ sb.append(" mute: ").append(toIndentedString(mute)).append("\n");
+ sb.append(" volDelta: ").append(toIndentedString(volDelta)).append("\n");
+ sb.append("}");
+ return sb.toString();
+ }
+
+ /**
+ * Convert the given object to string with each line indented by 4 spaces
+ * (except the first line).
+ */
+ private static String toIndentedString(Object o) {
+ if (o == null) {
+ return "null";
+ }
+ return o.toString().replace("\n", "\n ");
+ }
+}
diff --git a/bundles/org.openhab.binding.amplipi/src/gen/java/org/openhab/binding/amplipi/internal/model/GroupUpdate2.java b/bundles/org.openhab.binding.amplipi/src/gen/java/org/openhab/binding/amplipi/internal/model/GroupUpdate2.java
new file mode 100644
index 0000000000000..f37449f421c1c
--- /dev/null
+++ b/bundles/org.openhab.binding.amplipi/src/gen/java/org/openhab/binding/amplipi/internal/model/GroupUpdate2.java
@@ -0,0 +1,208 @@
+/**
+ * Copyright (c) 2010-2021 Contributors to the openHAB project
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ */
+package org.openhab.binding.amplipi.internal.model;
+
+import java.util.List;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+
+/**
+ * Reconfiguration of a specific Group
+ **/
+@Schema(description = "Reconfiguration of a specific Group ")
+public class GroupUpdate2 {
+
+ @Schema
+ /**
+ * Friendly name
+ **/
+ private String name;
+
+ @Schema
+ /**
+ * id of the connected source
+ **/
+ private Integer sourceId = 0;
+
+ @Schema
+ /**
+ * Set of zones belonging to a group
+ **/
+ private List zones = null;
+
+ @Schema
+ /**
+ * Set to true if output is all zones muted
+ **/
+ private Boolean mute = true;
+
+ @Schema
+ /**
+ * Average utput volume in dB
+ **/
+ private Integer volDelta = -79;
+
+ @Schema(required = true)
+ private Integer id;
+
+ /**
+ * Friendly name
+ *
+ * @return name
+ **/
+ @JsonProperty("name")
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ public GroupUpdate2 name(String name) {
+ this.name = name;
+ return this;
+ }
+
+ /**
+ * id of the connected source
+ * minimum: 0
+ * maximum: 3
+ *
+ * @return sourceId
+ **/
+ @JsonProperty("source_id")
+ public Integer getSourceId() {
+ return sourceId;
+ }
+
+ public void setSourceId(Integer sourceId) {
+ this.sourceId = sourceId;
+ }
+
+ public GroupUpdate2 sourceId(Integer sourceId) {
+ this.sourceId = sourceId;
+ return this;
+ }
+
+ /**
+ * Set of zones belonging to a group
+ *
+ * @return zones
+ **/
+ @JsonProperty("zones")
+ public List getZones() {
+ return zones;
+ }
+
+ public void setZones(List zones) {
+ this.zones = zones;
+ }
+
+ public GroupUpdate2 zones(List zones) {
+ this.zones = zones;
+ return this;
+ }
+
+ public GroupUpdate2 addZonesItem(Integer zonesItem) {
+ this.zones.add(zonesItem);
+ return this;
+ }
+
+ /**
+ * Set to true if output is all zones muted
+ *
+ * @return mute
+ **/
+ @JsonProperty("mute")
+ public Boolean getMute() {
+ return mute;
+ }
+
+ public void setMute(Boolean mute) {
+ this.mute = mute;
+ }
+
+ public GroupUpdate2 mute(Boolean mute) {
+ this.mute = mute;
+ return this;
+ }
+
+ /**
+ * Average utput volume in dB
+ * minimum: -79
+ * maximum: 0
+ *
+ * @return volDelta
+ **/
+ @JsonProperty("vol_delta")
+ public Integer getVolDelta() {
+ return volDelta;
+ }
+
+ public void setVolDelta(Integer volDelta) {
+ this.volDelta = volDelta;
+ }
+
+ public GroupUpdate2 volDelta(Integer volDelta) {
+ this.volDelta = volDelta;
+ return this;
+ }
+
+ /**
+ * Get id
+ *
+ * @return id
+ **/
+ @JsonProperty("id")
+ public Integer getId() {
+ return id;
+ }
+
+ public void setId(Integer id) {
+ this.id = id;
+ }
+
+ public GroupUpdate2 id(Integer id) {
+ this.id = id;
+ return this;
+ }
+
+ @Override
+ public String toString() {
+ StringBuilder sb = new StringBuilder();
+ sb.append("class GroupUpdate2 {\n");
+
+ sb.append(" name: ").append(toIndentedString(name)).append("\n");
+ sb.append(" sourceId: ").append(toIndentedString(sourceId)).append("\n");
+ sb.append(" zones: ").append(toIndentedString(zones)).append("\n");
+ sb.append(" mute: ").append(toIndentedString(mute)).append("\n");
+ sb.append(" volDelta: ").append(toIndentedString(volDelta)).append("\n");
+ sb.append(" id: ").append(toIndentedString(id)).append("\n");
+ sb.append("}");
+ return sb.toString();
+ }
+
+ /**
+ * Convert the given object to string with each line indented by 4 spaces
+ * (except the first line).
+ */
+ private static String toIndentedString(Object o) {
+ if (o == null) {
+ return "null";
+ }
+ return o.toString().replace("\n", "\n ");
+ }
+}
diff --git a/bundles/org.openhab.binding.amplipi/src/gen/java/org/openhab/binding/amplipi/internal/model/HTTPValidationError.java b/bundles/org.openhab.binding.amplipi/src/gen/java/org/openhab/binding/amplipi/internal/model/HTTPValidationError.java
new file mode 100644
index 0000000000000..cb8672b239f05
--- /dev/null
+++ b/bundles/org.openhab.binding.amplipi/src/gen/java/org/openhab/binding/amplipi/internal/model/HTTPValidationError.java
@@ -0,0 +1,70 @@
+/**
+ * Copyright (c) 2010-2021 Contributors to the openHAB project
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ */
+package org.openhab.binding.amplipi.internal.model;
+
+import java.util.List;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+
+public class HTTPValidationError {
+
+ @Schema
+ private List detail = null;
+
+ /**
+ * Get detail
+ *
+ * @return detail
+ **/
+ @JsonProperty("detail")
+ public List getDetail() {
+ return detail;
+ }
+
+ public void setDetail(List detail) {
+ this.detail = detail;
+ }
+
+ public HTTPValidationError detail(List detail) {
+ this.detail = detail;
+ return this;
+ }
+
+ public HTTPValidationError addDetailItem(ValidationError detailItem) {
+ this.detail.add(detailItem);
+ return this;
+ }
+
+ @Override
+ public String toString() {
+ StringBuilder sb = new StringBuilder();
+ sb.append("class HTTPValidationError {\n");
+
+ sb.append(" detail: ").append(toIndentedString(detail)).append("\n");
+ sb.append("}");
+ return sb.toString();
+ }
+
+ /**
+ * Convert the given object to string with each line indented by 4 spaces
+ * (except the first line).
+ */
+ private static String toIndentedString(Object o) {
+ if (o == null) {
+ return "null";
+ }
+ return o.toString().replace("\n", "\n ");
+ }
+}
diff --git a/bundles/org.openhab.binding.amplipi/src/gen/java/org/openhab/binding/amplipi/internal/model/Info.java b/bundles/org.openhab.binding.amplipi/src/gen/java/org/openhab/binding/amplipi/internal/model/Info.java
new file mode 100644
index 0000000000000..46bceaf93b8dd
--- /dev/null
+++ b/bundles/org.openhab.binding.amplipi/src/gen/java/org/openhab/binding/amplipi/internal/model/Info.java
@@ -0,0 +1,133 @@
+/**
+ * Copyright (c) 2010-2021 Contributors to the openHAB project
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ */
+package org.openhab.binding.amplipi.internal.model;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+
+/**
+ * Information about the settings used by the controller
+ **/
+@Schema(description="Information about the settings used by the controller ")
+public class Info {
+
+ @Schema
+ private String configFile = "Uknown";
+
+ @Schema
+ private String version = "Unknown";
+
+ @Schema
+ private Boolean mockCtrl = false;
+
+ @Schema
+ private Boolean mockStreams = false;
+ /**
+ * Get configFile
+ * @return configFile
+ **/
+ @JsonProperty("config_file")
+ public String getConfigFile() {
+ return configFile;
+ }
+
+ public void setConfigFile(String configFile) {
+ this.configFile = configFile;
+ }
+
+ public Info configFile(String configFile) {
+ this.configFile = configFile;
+ return this;
+ }
+
+ /**
+ * Get version
+ * @return version
+ **/
+ @JsonProperty("version")
+ public String getVersion() {
+ return version;
+ }
+
+ public void setVersion(String version) {
+ this.version = version;
+ }
+
+ public Info version(String version) {
+ this.version = version;
+ return this;
+ }
+
+ /**
+ * Get mockCtrl
+ * @return mockCtrl
+ **/
+ @JsonProperty("mock_ctrl")
+ public Boolean getMockCtrl() {
+ return mockCtrl;
+ }
+
+ public void setMockCtrl(Boolean mockCtrl) {
+ this.mockCtrl = mockCtrl;
+ }
+
+ public Info mockCtrl(Boolean mockCtrl) {
+ this.mockCtrl = mockCtrl;
+ return this;
+ }
+
+ /**
+ * Get mockStreams
+ * @return mockStreams
+ **/
+ @JsonProperty("mock_streams")
+ public Boolean getMockStreams() {
+ return mockStreams;
+ }
+
+ public void setMockStreams(Boolean mockStreams) {
+ this.mockStreams = mockStreams;
+ }
+
+ public Info mockStreams(Boolean mockStreams) {
+ this.mockStreams = mockStreams;
+ return this;
+ }
+
+
+ @Override
+ public String toString() {
+ StringBuilder sb = new StringBuilder();
+ sb.append("class Info {\n");
+
+ sb.append(" configFile: ").append(toIndentedString(configFile)).append("\n");
+ sb.append(" version: ").append(toIndentedString(version)).append("\n");
+ sb.append(" mockCtrl: ").append(toIndentedString(mockCtrl)).append("\n");
+ sb.append(" mockStreams: ").append(toIndentedString(mockStreams)).append("\n");
+ sb.append("}");
+ return sb.toString();
+ }
+
+ /**
+ * Convert the given object to string with each line indented by 4 spaces
+ * (except the first line).
+ */
+ private static String toIndentedString(Object o) {
+ if (o == null) {
+ return "null";
+ }
+ return o.toString().replace("\n", "\n ");
+ }
+}
+
diff --git a/bundles/org.openhab.binding.amplipi/src/gen/java/org/openhab/binding/amplipi/internal/model/Preset.java b/bundles/org.openhab.binding.amplipi/src/gen/java/org/openhab/binding/amplipi/internal/model/Preset.java
new file mode 100644
index 0000000000000..eaa5ac736d29f
--- /dev/null
+++ b/bundles/org.openhab.binding.amplipi/src/gen/java/org/openhab/binding/amplipi/internal/model/Preset.java
@@ -0,0 +1,173 @@
+/**
+ * Copyright (c) 2010-2021 Contributors to the openHAB project
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ */
+package org.openhab.binding.amplipi.internal.model;
+
+import java.util.List;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+
+/**
+ * A partial controller configuration the can be loaded on demand. In addition to most of the configuration found in
+ * Status, this can contain commands as well that configure the state of different streaming services.
+ **/
+@Schema(description = "A partial controller configuration the can be loaded on demand. In addition to most of the configuration found in Status, this can contain commands as well that configure the state of different streaming services.")
+public class Preset {
+
+ @Schema
+ /**
+ * Unique identifier
+ **/
+ private Integer id;
+
+ @Schema(required = true)
+ /**
+ * Friendly name
+ **/
+ private String name;
+
+ @Schema(required = true)
+ private PresetState state;
+
+ @Schema
+ private List commands = null;
+
+ @Schema
+ private Integer lastUsed;
+
+ /**
+ * Unique identifier
+ *
+ * @return id
+ **/
+ @JsonProperty("id")
+ public Integer getId() {
+ return id;
+ }
+
+ public void setId(Integer id) {
+ this.id = id;
+ }
+
+ public Preset id(Integer id) {
+ this.id = id;
+ return this;
+ }
+
+ /**
+ * Friendly name
+ *
+ * @return name
+ **/
+ @JsonProperty("name")
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ public Preset name(String name) {
+ this.name = name;
+ return this;
+ }
+
+ /**
+ * Get state
+ *
+ * @return state
+ **/
+ @JsonProperty("state")
+ public PresetState getState() {
+ return state;
+ }
+
+ public void setState(PresetState state) {
+ this.state = state;
+ }
+
+ public Preset state(PresetState state) {
+ this.state = state;
+ return this;
+ }
+
+ /**
+ * Get commands
+ *
+ * @return commands
+ **/
+ @JsonProperty("commands")
+ public List getCommands() {
+ return commands;
+ }
+
+ public void setCommands(List commands) {
+ this.commands = commands;
+ }
+
+ public Preset commands(List commands) {
+ this.commands = commands;
+ return this;
+ }
+
+ public Preset addCommandsItem(Command commandsItem) {
+ this.commands.add(commandsItem);
+ return this;
+ }
+
+ /**
+ * Get lastUsed
+ *
+ * @return lastUsed
+ **/
+ @JsonProperty("last_used")
+ public Integer getLastUsed() {
+ return lastUsed;
+ }
+
+ public void setLastUsed(Integer lastUsed) {
+ this.lastUsed = lastUsed;
+ }
+
+ public Preset lastUsed(Integer lastUsed) {
+ this.lastUsed = lastUsed;
+ return this;
+ }
+
+ @Override
+ public String toString() {
+ StringBuilder sb = new StringBuilder();
+ sb.append("class Preset {\n");
+
+ sb.append(" id: ").append(toIndentedString(id)).append("\n");
+ sb.append(" name: ").append(toIndentedString(name)).append("\n");
+ sb.append(" state: ").append(toIndentedString(state)).append("\n");
+ sb.append(" commands: ").append(toIndentedString(commands)).append("\n");
+ sb.append(" lastUsed: ").append(toIndentedString(lastUsed)).append("\n");
+ sb.append("}");
+ return sb.toString();
+ }
+
+ /**
+ * Convert the given object to string with each line indented by 4 spaces
+ * (except the first line).
+ */
+ private static String toIndentedString(Object o) {
+ if (o == null) {
+ return "null";
+ }
+ return o.toString().replace("\n", "\n ");
+ }
+}
diff --git a/bundles/org.openhab.binding.amplipi/src/gen/java/org/openhab/binding/amplipi/internal/model/PresetState.java b/bundles/org.openhab.binding.amplipi/src/gen/java/org/openhab/binding/amplipi/internal/model/PresetState.java
new file mode 100644
index 0000000000000..207c31868e0e3
--- /dev/null
+++ b/bundles/org.openhab.binding.amplipi/src/gen/java/org/openhab/binding/amplipi/internal/model/PresetState.java
@@ -0,0 +1,128 @@
+/**
+ * Copyright (c) 2010-2021 Contributors to the openHAB project
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ */
+package org.openhab.binding.amplipi.internal.model;
+
+import java.util.List;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+
+/**
+ * A set of partial configuration changes to make to sources, zones, and groups
+ **/
+@Schema(description="A set of partial configuration changes to make to sources, zones, and groups ")
+public class PresetState {
+
+ @Schema
+ private List sources = null;
+
+ @Schema
+ private List zones = null;
+
+ @Schema
+ private List groups = null;
+ /**
+ * Get sources
+ * @return sources
+ **/
+ @JsonProperty("sources")
+ public List getSources() {
+ return sources;
+ }
+
+ public void setSources(List sources) {
+ this.sources = sources;
+ }
+
+ public PresetState sources(List sources) {
+ this.sources = sources;
+ return this;
+ }
+
+ public PresetState addSourcesItem(SourceUpdate2 sourcesItem) {
+ this.sources.add(sourcesItem);
+ return this;
+ }
+
+ /**
+ * Get zones
+ * @return zones
+ **/
+ @JsonProperty("zones")
+ public List getZones() {
+ return zones;
+ }
+
+ public void setZones(List zones) {
+ this.zones = zones;
+ }
+
+ public PresetState zones(List zones) {
+ this.zones = zones;
+ return this;
+ }
+
+ public PresetState addZonesItem(ZoneUpdate2 zonesItem) {
+ this.zones.add(zonesItem);
+ return this;
+ }
+
+ /**
+ * Get groups
+ * @return groups
+ **/
+ @JsonProperty("groups")
+ public List getGroups() {
+ return groups;
+ }
+
+ public void setGroups(List groups) {
+ this.groups = groups;
+ }
+
+ public PresetState groups(List groups) {
+ this.groups = groups;
+ return this;
+ }
+
+ public PresetState addGroupsItem(GroupUpdate2 groupsItem) {
+ this.groups.add(groupsItem);
+ return this;
+ }
+
+
+ @Override
+ public String toString() {
+ StringBuilder sb = new StringBuilder();
+ sb.append("class PresetState {\n");
+
+ sb.append(" sources: ").append(toIndentedString(sources)).append("\n");
+ sb.append(" zones: ").append(toIndentedString(zones)).append("\n");
+ sb.append(" groups: ").append(toIndentedString(groups)).append("\n");
+ sb.append("}");
+ return sb.toString();
+ }
+
+ /**
+ * Convert the given object to string with each line indented by 4 spaces
+ * (except the first line).
+ */
+ private static String toIndentedString(Object o) {
+ if (o == null) {
+ return "null";
+ }
+ return o.toString().replace("\n", "\n ");
+ }
+}
+
diff --git a/bundles/org.openhab.binding.amplipi/src/gen/java/org/openhab/binding/amplipi/internal/model/PresetUpdate.java b/bundles/org.openhab.binding.amplipi/src/gen/java/org/openhab/binding/amplipi/internal/model/PresetUpdate.java
new file mode 100644
index 0000000000000..2cb7ceec6f0cc
--- /dev/null
+++ b/bundles/org.openhab.binding.amplipi/src/gen/java/org/openhab/binding/amplipi/internal/model/PresetUpdate.java
@@ -0,0 +1,124 @@
+/**
+ * Copyright (c) 2010-2021 Contributors to the openHAB project
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ */
+package org.openhab.binding.amplipi.internal.model;
+
+import java.util.List;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+
+/**
+ * Changes to a current preset The contents of state and commands will be completely replaced if populated. Merging old
+ * and new updates seems too complicated and error prone.
+ **/
+@Schema(description = "Changes to a current preset The contents of state and commands will be completely replaced if populated. Merging old and new updates seems too complicated and error prone.")
+public class PresetUpdate {
+
+ @Schema
+ /**
+ * Friendly name
+ **/
+ private String name;
+
+ @Schema
+ private PresetState state;
+
+ @Schema
+ private List commands = null;
+
+ /**
+ * Friendly name
+ *
+ * @return name
+ **/
+ @JsonProperty("name")
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ public PresetUpdate name(String name) {
+ this.name = name;
+ return this;
+ }
+
+ /**
+ * Get state
+ *
+ * @return state
+ **/
+ @JsonProperty("state")
+ public PresetState getState() {
+ return state;
+ }
+
+ public void setState(PresetState state) {
+ this.state = state;
+ }
+
+ public PresetUpdate state(PresetState state) {
+ this.state = state;
+ return this;
+ }
+
+ /**
+ * Get commands
+ *
+ * @return commands
+ **/
+ @JsonProperty("commands")
+ public List getCommands() {
+ return commands;
+ }
+
+ public void setCommands(List commands) {
+ this.commands = commands;
+ }
+
+ public PresetUpdate commands(List commands) {
+ this.commands = commands;
+ return this;
+ }
+
+ public PresetUpdate addCommandsItem(Command commandsItem) {
+ this.commands.add(commandsItem);
+ return this;
+ }
+
+ @Override
+ public String toString() {
+ StringBuilder sb = new StringBuilder();
+ sb.append("class PresetUpdate {\n");
+
+ sb.append(" name: ").append(toIndentedString(name)).append("\n");
+ sb.append(" state: ").append(toIndentedString(state)).append("\n");
+ sb.append(" commands: ").append(toIndentedString(commands)).append("\n");
+ sb.append("}");
+ return sb.toString();
+ }
+
+ /**
+ * Convert the given object to string with each line indented by 4 spaces
+ * (except the first line).
+ */
+ private static String toIndentedString(Object o) {
+ if (o == null) {
+ return "null";
+ }
+ return o.toString().replace("\n", "\n ");
+ }
+}
diff --git a/bundles/org.openhab.binding.amplipi/src/gen/java/org/openhab/binding/amplipi/internal/model/Source.java b/bundles/org.openhab.binding.amplipi/src/gen/java/org/openhab/binding/amplipi/internal/model/Source.java
new file mode 100644
index 0000000000000..b858275dc64a3
--- /dev/null
+++ b/bundles/org.openhab.binding.amplipi/src/gen/java/org/openhab/binding/amplipi/internal/model/Source.java
@@ -0,0 +1,126 @@
+/**
+ * Copyright (c) 2010-2021 Contributors to the openHAB project
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ */
+package org.openhab.binding.amplipi.internal.model;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+
+/**
+ * An audio source
+ **/
+@Schema(description = "An audio source ")
+public class Source {
+
+ @Schema
+ /**
+ * Unique identifier
+ **/
+ private Integer id;
+
+ @Schema(required = true)
+ /**
+ * Friendly name
+ **/
+ private String name;
+
+ @Schema
+ /**
+ * Connected audio source * Digital Stream ('stream=SID') where SID is the ID of the connected stream * Analog RCA
+ * Input ('local') connects to the RCA inputs associated * Nothing ('') behind the scenes this is muxed to a digital
+ * output
+ **/
+ private String input = "";
+
+ /**
+ * Unique identifier
+ *
+ * @return id
+ **/
+ @JsonProperty("id")
+ public Integer getId() {
+ return id;
+ }
+
+ public void setId(Integer id) {
+ this.id = id;
+ }
+
+ public Source id(Integer id) {
+ this.id = id;
+ return this;
+ }
+
+ /**
+ * Friendly name
+ *
+ * @return name
+ **/
+ @JsonProperty("name")
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ public Source name(String name) {
+ this.name = name;
+ return this;
+ }
+
+ /**
+ * Connected audio source * Digital Stream ('stream=SID') where SID is the ID of the connected stream *
+ * Analog RCA Input ('local') connects to the RCA inputs associated * Nothing ('') behind the scenes
+ * this is muxed to a digital output
+ *
+ * @return input
+ **/
+ @JsonProperty("input")
+ public String getInput() {
+ return input;
+ }
+
+ public void setInput(String input) {
+ this.input = input;
+ }
+
+ public Source input(String input) {
+ this.input = input;
+ return this;
+ }
+
+ @Override
+ public String toString() {
+ StringBuilder sb = new StringBuilder();
+ sb.append("class Source {\n");
+
+ sb.append(" id: ").append(toIndentedString(id)).append("\n");
+ sb.append(" name: ").append(toIndentedString(name)).append("\n");
+ sb.append(" input: ").append(toIndentedString(input)).append("\n");
+ sb.append("}");
+ return sb.toString();
+ }
+
+ /**
+ * Convert the given object to string with each line indented by 4 spaces
+ * (except the first line).
+ */
+ private static String toIndentedString(Object o) {
+ if (o == null) {
+ return "null";
+ }
+ return o.toString().replace("\n", "\n ");
+ }
+}
diff --git a/bundles/org.openhab.binding.amplipi/src/gen/java/org/openhab/binding/amplipi/internal/model/SourceUpdate.java b/bundles/org.openhab.binding.amplipi/src/gen/java/org/openhab/binding/amplipi/internal/model/SourceUpdate.java
new file mode 100644
index 0000000000000..8c4546cd8b15d
--- /dev/null
+++ b/bundles/org.openhab.binding.amplipi/src/gen/java/org/openhab/binding/amplipi/internal/model/SourceUpdate.java
@@ -0,0 +1,93 @@
+/**
+ * Copyright (c) 2010-2021 Contributors to the openHAB project
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ */
+package org.openhab.binding.amplipi.internal.model;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+
+/**
+ * Partial reconfiguration of an audio Source
+ **/
+@Schema(description = "Partial reconfiguration of an audio Source ")
+public class SourceUpdate {
+
+ @Schema
+ /**
+ * Friendly name
+ **/
+ private String name;
+
+ @Schema
+ private String input;
+
+ /**
+ * Friendly name
+ *
+ * @return name
+ **/
+ @JsonProperty("name")
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ public SourceUpdate name(String name) {
+ this.name = name;
+ return this;
+ }
+
+ /**
+ * Get input
+ *
+ * @return input
+ **/
+ @JsonProperty("input")
+ public String getInput() {
+ return input;
+ }
+
+ public void setInput(String input) {
+ this.input = input;
+ }
+
+ public SourceUpdate input(String input) {
+ this.input = input;
+ return this;
+ }
+
+ @Override
+ public String toString() {
+ StringBuilder sb = new StringBuilder();
+ sb.append("class SourceUpdate {\n");
+
+ sb.append(" name: ").append(toIndentedString(name)).append("\n");
+ sb.append(" input: ").append(toIndentedString(input)).append("\n");
+ sb.append("}");
+ return sb.toString();
+ }
+
+ /**
+ * Convert the given object to string with each line indented by 4 spaces
+ * (except the first line).
+ */
+ private static String toIndentedString(Object o) {
+ if (o == null) {
+ return "null";
+ }
+ return o.toString().replace("\n", "\n ");
+ }
+}
diff --git a/bundles/org.openhab.binding.amplipi/src/gen/java/org/openhab/binding/amplipi/internal/model/SourceUpdate2.java b/bundles/org.openhab.binding.amplipi/src/gen/java/org/openhab/binding/amplipi/internal/model/SourceUpdate2.java
new file mode 100644
index 0000000000000..8490f485c6360
--- /dev/null
+++ b/bundles/org.openhab.binding.amplipi/src/gen/java/org/openhab/binding/amplipi/internal/model/SourceUpdate2.java
@@ -0,0 +1,118 @@
+/**
+ * Copyright (c) 2010-2021 Contributors to the openHAB project
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ */
+package org.openhab.binding.amplipi.internal.model;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+
+/**
+ * Partial reconfiguration of a specific audio Source
+ **/
+@Schema(description = "Partial reconfiguration of a specific audio Source ")
+public class SourceUpdate2 {
+
+ @Schema
+ /**
+ * Friendly name
+ **/
+ private String name;
+
+ @Schema
+ private String input;
+
+ @Schema(required = true)
+ private Integer id;
+
+ /**
+ * Friendly name
+ *
+ * @return name
+ **/
+ @JsonProperty("name")
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ public SourceUpdate2 name(String name) {
+ this.name = name;
+ return this;
+ }
+
+ /**
+ * Get input
+ *
+ * @return input
+ **/
+ @JsonProperty("input")
+ public String getInput() {
+ return input;
+ }
+
+ public void setInput(String input) {
+ this.input = input;
+ }
+
+ public SourceUpdate2 input(String input) {
+ this.input = input;
+ return this;
+ }
+
+ /**
+ * Get id
+ * minimum: 0
+ * maximum: 4
+ *
+ * @return id
+ **/
+ @JsonProperty("id")
+ public Integer getId() {
+ return id;
+ }
+
+ public void setId(Integer id) {
+ this.id = id;
+ }
+
+ public SourceUpdate2 id(Integer id) {
+ this.id = id;
+ return this;
+ }
+
+ @Override
+ public String toString() {
+ StringBuilder sb = new StringBuilder();
+ sb.append("class SourceUpdate2 {\n");
+
+ sb.append(" name: ").append(toIndentedString(name)).append("\n");
+ sb.append(" input: ").append(toIndentedString(input)).append("\n");
+ sb.append(" id: ").append(toIndentedString(id)).append("\n");
+ sb.append("}");
+ return sb.toString();
+ }
+
+ /**
+ * Convert the given object to string with each line indented by 4 spaces
+ * (except the first line).
+ */
+ private static String toIndentedString(Object o) {
+ if (o == null) {
+ return "null";
+ }
+ return o.toString().replace("\n", "\n ");
+ }
+}
diff --git a/bundles/org.openhab.binding.amplipi/src/gen/java/org/openhab/binding/amplipi/internal/model/Status.java b/bundles/org.openhab.binding.amplipi/src/gen/java/org/openhab/binding/amplipi/internal/model/Status.java
new file mode 100644
index 0000000000000..d9fee72922112
--- /dev/null
+++ b/bundles/org.openhab.binding.amplipi/src/gen/java/org/openhab/binding/amplipi/internal/model/Status.java
@@ -0,0 +1,204 @@
+/**
+ * Copyright (c) 2010-2021 Contributors to the openHAB project
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ */
+package org.openhab.binding.amplipi.internal.model;
+
+import java.util.List;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+
+/**
+ * Full Controller Configuration and Status
+ **/
+@Schema(description="Full Controller Configuration and Status ")
+public class Status {
+
+ @Schema
+ private List