diff --git a/LICENSE b/LICENSE
new file mode 100644
--- /dev/null
+++ b/LICENSE
@@ -0,0 +1,367 @@
+Mozilla Public License Version 2.0
+==================================
+
+1. Definitions
+--------------
+
+1.1. "Contributor"
+    means each individual or legal entity that creates, contributes to
+    the creation of, or owns Covered Software.
+
+1.2. "Contributor Version"
+    means the combination of the Contributions of others (if any) used
+    by a Contributor and that particular Contributor's Contribution.
+
+1.3. "Contribution"
+    means Covered Software of a particular Contributor.
+
+1.4. "Covered Software"
+    means Source Code Form to which the initial Contributor has attached
+    the notice in Exhibit A, the Executable Form of such Source Code
+    Form, and Modifications of such Source Code Form, in each case
+    including portions thereof.
+
+1.5. "Incompatible With Secondary Licenses"
+    means
+
+    (a) that the initial Contributor has attached the notice described
+        in Exhibit B to the Covered Software; or
+
+    (b) that the Covered Software was made available under the terms of
+        version 1.1 or earlier of the License, but not also under the
+        terms of a Secondary License.
+
+1.6. "Executable Form"
+    means any form of the work other than Source Code Form.
+
+1.7. "Larger Work"
+    means a work that combines Covered Software with other material, in
+    a separate file or files, that is not Covered Software.
+
+1.8. "License"
+    means this document.
+
+1.9. "Licensable"
+    means having the right to grant, to the maximum extent possible,
+    whether at the time of the initial grant or subsequently, any and
+    all of the rights conveyed by this License.
+
+1.10. "Modifications"
+    means any of the following:
+
+    (a) any file in Source Code Form that results from an addition to,
+        deletion from, or modification of the contents of Covered
+        Software; or
+
+    (b) any new file in Source Code Form that contains any Covered
+        Software.
+
+1.11. "Patent Claims" of a Contributor
+    means any patent claim(s), including without limitation, method,
+    process, and apparatus claims, in any patent Licensable by such
+    Contributor that would be infringed, but for the grant of the
+    License, by the making, using, selling, offering for sale, having
+    made, import, or transfer of either its Contributions or its
+    Contributor Version.
+
+1.12. "Secondary License"
+    means either the GNU General Public License, Version 2.0, the GNU
+    Lesser General Public License, Version 2.1, the GNU Affero General
+    Public License, Version 3.0, or any later versions of those
+    licenses.
+
+1.13. "Source Code Form"
+    means the form of the work preferred for making modifications.
+
+1.14. "You" (or "Your")
+    means an individual or a legal entity exercising rights under this
+    License. For legal entities, "You" includes any entity that
+    controls, is controlled by, or is under common control with You. For
+    purposes of this definition, "control" means (a) the power, direct
+    or indirect, to cause the direction or management of such entity,
+    whether by contract or otherwise, or (b) ownership of more than
+    fifty percent (50%) of the outstanding shares or beneficial
+    ownership of such entity.
+
+2. License Grants and Conditions
+--------------------------------
+
+2.1. Grants
+
+Each Contributor hereby grants You a world-wide, royalty-free,
+non-exclusive license:
+
+(a) under intellectual property rights (other than patent or trademark)
+    Licensable by such Contributor to use, reproduce, make available,
+    modify, display, perform, distribute, and otherwise exploit its
+    Contributions, either on an unmodified basis, with Modifications, or
+    as part of a Larger Work; and
+
+(b) under Patent Claims of such Contributor to make, use, sell, offer
+    for sale, have made, import, and otherwise transfer either its
+    Contributions or its Contributor Version.
+
+2.2. Effective Date
+
+The licenses granted in Section 2.1 with respect to any Contribution
+become effective for each Contribution on the date the Contributor first
+distributes such Contribution.
+
+2.3. Limitations on Grant Scope
+
+The licenses granted in this Section 2 are the only rights granted under
+this License. No additional rights or licenses will be implied from the
+distribution or licensing of Covered Software under this License.
+Notwithstanding Section 2.1(b) above, no patent license is granted by a
+Contributor:
+
+(a) for any code that a Contributor has removed from Covered Software;
+    or
+
+(b) for infringements caused by: (i) Your and any other third party's
+    modifications of Covered Software, or (ii) the combination of its
+    Contributions with other software (except as part of its Contributor
+    Version); or
+
+(c) under Patent Claims infringed by Covered Software in the absence of
+    its Contributions.
+
+This License does not grant any rights in the trademarks, service marks,
+or logos of any Contributor (except as may be necessary to comply with
+the notice requirements in Section 3.4).
+
+2.4. Subsequent Licenses
+
+No Contributor makes additional grants as a result of Your choice to
+distribute the Covered Software under a subsequent version of this
+License (see Section 10.2) or under the terms of a Secondary License (if
+permitted under the terms of Section 3.3).
+
+2.5. Representation
+
+Each Contributor represents that the Contributor believes its
+Contributions are its original creation(s) or it has sufficient rights
+to grant the rights to its Contributions conveyed by this License.
+
+2.6. Fair Use
+
+This License is not intended to limit any rights You have under
+applicable copyright doctrines of fair use, fair dealing, or other
+equivalents.
+
+2.7. Conditions
+
+Sections 3.1, 3.2, 3.3, and 3.4 are conditions of the licenses granted
+in Section 2.1.
+
+3. Responsibilities
+-------------------
+
+3.1. Distribution of Source Form
+
+All distribution of Covered Software in Source Code Form, including any
+Modifications that You create or to which You contribute, must be under
+the terms of this License. You must inform recipients that the Source
+Code Form of the Covered Software is governed by the terms of this
+License, and how they can obtain a copy of this License. You may not
+attempt to alter or restrict the recipients' rights in the Source Code
+Form.
+
+3.2. Distribution of Executable Form
+
+If You distribute Covered Software in Executable Form then:
+
+(a) such Covered Software must also be made available in Source Code
+    Form, as described in Section 3.1, and You must inform recipients of
+    the Executable Form how they can obtain a copy of such Source Code
+    Form by reasonable means in a timely manner, at a charge no more
+    than the cost of distribution to the recipient; and
+
+(b) You may distribute such Executable Form under the terms of this
+    License, or sublicense it under different terms, provided that the
+    license for the Executable Form does not attempt to limit or alter
+    the recipients' rights in the Source Code Form under this License.
+
+3.3. Distribution of a Larger Work
+
+You may create and distribute a Larger Work under terms of Your choice,
+provided that You also comply with the requirements of this License for
+the Covered Software. If the Larger Work is a combination of Covered
+Software with a work governed by one or more Secondary Licenses, and the
+Covered Software is not Incompatible With Secondary Licenses, this
+License permits You to additionally distribute such Covered Software
+under the terms of such Secondary License(s), so that the recipient of
+the Larger Work may, at their option, further distribute the Covered
+Software under the terms of either this License or such Secondary
+License(s).
+
+3.4. Notices
+
+You may not remove or alter the substance of any license notices
+(including copyright notices, patent notices, disclaimers of warranty,
+or limitations of liability) contained within the Source Code Form of
+the Covered Software, except that You may alter any license notices to
+the extent required to remedy known factual inaccuracies.
+
+3.5. Application of Additional Terms
+
+You may choose to offer, and to charge a fee for, warranty, support,
+indemnity or liability obligations to one or more recipients of Covered
+Software. However, You may do so only on Your own behalf, and not on
+behalf of any Contributor. You must make it absolutely clear that any
+such warranty, support, indemnity, or liability obligation is offered by
+You alone, and You hereby agree to indemnify every Contributor for any
+liability incurred by such Contributor as a result of warranty, support,
+indemnity or liability terms You offer. You may include additional
+disclaimers of warranty and limitations of liability specific to any
+jurisdiction.
+
+4. Inability to Comply Due to Statute or Regulation
+---------------------------------------------------
+
+If it is impossible for You to comply with any of the terms of this
+License with respect to some or all of the Covered Software due to
+statute, judicial order, or regulation then You must: (a) comply with
+the terms of this License to the maximum extent possible; and (b)
+describe the limitations and the code they affect. Such description must
+be placed in a text file included with all distributions of the Covered
+Software under this License. Except to the extent prohibited by statute
+or regulation, such description must be sufficiently detailed for a
+recipient of ordinary skill to be able to understand it.
+
+5. Termination
+--------------
+
+5.1. The rights granted under this License will terminate automatically
+if You fail to comply with any of its terms. However, if You become
+compliant, then the rights granted under this License from a particular
+Contributor are reinstated (a) provisionally, unless and until such
+Contributor explicitly and finally terminates Your grants, and (b) on an
+ongoing basis, if such Contributor fails to notify You of the
+non-compliance by some reasonable means prior to 60 days after You have
+come back into compliance. Moreover, Your grants from a particular
+Contributor are reinstated on an ongoing basis if such Contributor
+notifies You of the non-compliance by some reasonable means, this is the
+first time You have received notice of non-compliance with this License
+from such Contributor, and You become compliant prior to 30 days after
+Your receipt of the notice.
+
+5.2. If You initiate litigation against any entity by asserting a patent
+infringement claim (excluding declaratory judgment actions,
+counter-claims, and cross-claims) alleging that a Contributor Version
+directly or indirectly infringes any patent, then the rights granted to
+You by any and all Contributors for the Covered Software under Section
+2.1 of this License shall terminate.
+
+5.3. In the event of termination under Sections 5.1 or 5.2 above, all
+end user license agreements (excluding distributors and resellers) which
+have been validly granted by You or Your distributors under this License
+prior to termination shall survive termination.
+
+************************************************************************
+*                                                                      *
+*  6. Disclaimer of Warranty                                           *
+*  -------------------------                                           *
+*                                                                      *
+*  Covered Software is provided under this License on an "as is"       *
+*  basis, without warranty of any kind, either expressed, implied, or  *
+*  statutory, including, without limitation, warranties that the       *
+*  Covered Software is free of defects, merchantable, fit for a        *
+*  particular purpose or non-infringing. The entire risk as to the     *
+*  quality and performance of the Covered Software is with You.        *
+*  Should any Covered Software prove defective in any respect, You     *
+*  (not any Contributor) assume the cost of any necessary servicing,   *
+*  repair, or correction. This disclaimer of warranty constitutes an   *
+*  essential part of this License. No use of any Covered Software is   *
+*  authorized under this License except under this disclaimer.         *
+*                                                                      *
+************************************************************************
+
+************************************************************************
+*                                                                      *
+*  7. Limitation of Liability                                          *
+*  --------------------------                                          *
+*                                                                      *
+*  Under no circumstances and under no legal theory, whether tort      *
+*  (including negligence), contract, or otherwise, shall any           *
+*  Contributor, or anyone who distributes Covered Software as          *
+*  permitted above, be liable to You for any direct, indirect,         *
+*  special, incidental, or consequential damages of any character      *
+*  including, without limitation, damages for lost profits, loss of    *
+*  goodwill, work stoppage, computer failure or malfunction, or any    *
+*  and all other commercial damages or losses, even if such party      *
+*  shall have been informed of the possibility of such damages. This   *
+*  limitation of liability shall not apply to liability for death or   *
+*  personal injury resulting from such party's negligence to the       *
+*  extent applicable law prohibits such limitation. Some               *
+*  jurisdictions do not allow the exclusion or limitation of           *
+*  incidental or consequential damages, so this exclusion and          *
+*  limitation may not apply to You.                                    *
+*                                                                      *
+************************************************************************
+
+8. Litigation
+-------------
+
+Any litigation relating to this License may be brought only in the
+courts of a jurisdiction where the defendant maintains its principal
+place of business and such litigation shall be governed by laws of that
+jurisdiction, without reference to its conflict-of-law provisions.
+Nothing in this Section shall prevent a party's ability to bring
+cross-claims or counter-claims.
+
+9. Miscellaneous
+----------------
+
+This License represents the complete agreement concerning the subject
+matter hereof. If any provision of this License is held to be
+unenforceable, such provision shall be reformed only to the extent
+necessary to make it enforceable. Any law or regulation which provides
+that the language of a contract shall be construed against the drafter
+shall not be used to construe this License against a Contributor.
+
+10. Versions of the License
+---------------------------
+
+10.1. New Versions
+
+Mozilla Foundation is the license steward. Except as provided in Section
+10.3, no one other than the license steward has the right to modify or
+publish new versions of this License. Each version will be given a
+distinguishing version number.
+
+10.2. Effect of New Versions
+
+You may distribute the Covered Software under the terms of the version
+of the License under which You originally received the Covered Software,
+or under the terms of any subsequent version published by the license
+steward.
+
+10.3. Modified Versions
+
+If you create software not governed by this License, and you want to
+create a new license for such software, you may create and use a
+modified version of this License if you rename the license and remove
+any references to the name of the license steward (except to note that
+such modified license differs from this License).
+
+10.4. Distributing Source Code Form that is Incompatible With Secondary
+Licenses
+
+If You choose to distribute Source Code Form that is Incompatible With
+Secondary Licenses under the terms of this version of the License, the
+notice described in Exhibit B of this License must be attached.
+
+Exhibit A - Source Code Form License Notice
+-------------------------------------------
+
+  This Source Code Form is subject to the terms of the Mozilla Public
+  License, v. 2.0. If a copy of the MPL was not distributed with this
+  file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+If it is not possible or desirable to put the notice in a particular
+file, then You may include the notice in a location (such as a LICENSE
+file in a relevant directory) where a recipient would be likely to look
+for such a notice.
+
+You may add additional accurate notices of copyright ownership.
diff --git a/README.md b/README.md
new file mode 100644
--- /dev/null
+++ b/README.md
@@ -0,0 +1,44 @@
+# Amazon IoT SiteWise SDK
+
+* [Version](#version)
+* [Description](#description)
+* [Contribute](#contribute)
+* [Licence](#licence)
+
+
+## Version
+ 
+`2.0` - Derived from API version @2019-12-02@ of the AWS service descriptions, licensed under Apache 2.0.
+
+## Description
+
+Documentation is available via [Hackage](http://hackage.haskell.org/package/amazonka-iotsitewise)
+and the [AWS API Reference](https://aws.amazon.com/documentation/).
+
+The types from this library are intended to be used with [amazonka](http://hackage.haskell.org/package/amazonka),
+which provides mechanisms for specifying AuthN/AuthZ information, sending requests,
+and receiving responses.
+
+Lenses are used for constructing and manipulating types,
+due to the depth of nesting of AWS types and transparency regarding
+de/serialisation into more palatable Haskell values.
+The provided lenses should be compatible with any of the major lens libraries
+[lens](http://hackage.haskell.org/package/lens) or [lens-family-core](http://hackage.haskell.org/package/lens-family-core).
+
+See [Amazonka.IoTSiteWise](http://hackage.haskell.org/package/amazonka-iotsitewise/docs/Amazonka-IoTSiteWise.html)
+or [the AWS documentation](https://aws.amazon.com/documentation/) to get started.
+
+
+## Contribute
+
+For any problems, comments, or feedback please create an issue [here on GitHub](https://github.com/brendanhay/amazonka/issues).
+
+> _Note:_ this library is an auto-generated Haskell package. Please see `amazonka-gen` for more information.
+
+
+## Licence
+
+`amazonka-iotsitewise` is released under the [Mozilla Public License Version 2.0](http://www.mozilla.org/MPL/).
+
+Parts of the code are derived from AWS service descriptions, licensed under Apache 2.0.
+Source files subject to this contain an additional licensing clause in their header.
diff --git a/amazonka-iotsitewise.cabal b/amazonka-iotsitewise.cabal
new file mode 100644
--- /dev/null
+++ b/amazonka-iotsitewise.cabal
@@ -0,0 +1,293 @@
+cabal-version:      2.2
+name:               amazonka-iotsitewise
+version:            2.0
+synopsis:           Amazon IoT SiteWise SDK.
+homepage:           https://github.com/brendanhay/amazonka
+bug-reports:        https://github.com/brendanhay/amazonka/issues
+license:            MPL-2.0
+license-file:       LICENSE
+author:             Brendan Hay
+maintainer:
+  Brendan Hay <brendan.g.hay+amazonka@gmail.com>, Jack Kelly <jack@jackkelly.name>
+
+copyright:          Copyright (c) 2013-2023 Brendan Hay
+category:           AWS
+build-type:         Simple
+extra-source-files:
+  fixture/*.proto
+  fixture/*.yaml
+  README.md
+  src/.gitkeep
+
+description:
+  Derived from API version @2019-12-02@ of the AWS service descriptions, licensed under Apache 2.0.
+  .
+  The types from this library are intended to be used with <http://hackage.haskell.org/package/amazonka amazonka>,
+  which provides mechanisms for specifying AuthN/AuthZ information, sending requests, and receiving responses.
+  .
+  It is recommended to use generic lenses or optics from packages such as <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify optional fields and deconstruct responses.
+  .
+  Generated lenses can be found in "Amazonka.IoTSiteWise.Lens" and are
+  suitable for use with a lens package such as <http://hackage.haskell.org/package/lens lens> or <http://hackage.haskell.org/package/lens-family-core lens-family-core>.
+  .
+  See "Amazonka.IoTSiteWise" and the <https://aws.amazon.com/documentation/ AWS documentation> to get started.
+
+source-repository head
+  type:     git
+  location: git://github.com/brendanhay/amazonka.git
+  subdir:   amazonka-iotsitewise
+
+library
+  default-language: Haskell2010
+  hs-source-dirs:   src gen
+  ghc-options:
+    -Wall -fwarn-incomplete-uni-patterns
+    -fwarn-incomplete-record-updates -funbox-strict-fields
+
+  exposed-modules:
+    Amazonka.IoTSiteWise
+    Amazonka.IoTSiteWise.AssociateAssets
+    Amazonka.IoTSiteWise.AssociateTimeSeriesToAssetProperty
+    Amazonka.IoTSiteWise.BatchAssociateProjectAssets
+    Amazonka.IoTSiteWise.BatchDisassociateProjectAssets
+    Amazonka.IoTSiteWise.BatchGetAssetPropertyAggregates
+    Amazonka.IoTSiteWise.BatchGetAssetPropertyValue
+    Amazonka.IoTSiteWise.BatchGetAssetPropertyValueHistory
+    Amazonka.IoTSiteWise.BatchPutAssetPropertyValue
+    Amazonka.IoTSiteWise.CreateAccessPolicy
+    Amazonka.IoTSiteWise.CreateAsset
+    Amazonka.IoTSiteWise.CreateAssetModel
+    Amazonka.IoTSiteWise.CreateBulkImportJob
+    Amazonka.IoTSiteWise.CreateDashboard
+    Amazonka.IoTSiteWise.CreateGateway
+    Amazonka.IoTSiteWise.CreatePortal
+    Amazonka.IoTSiteWise.CreateProject
+    Amazonka.IoTSiteWise.DeleteAccessPolicy
+    Amazonka.IoTSiteWise.DeleteAsset
+    Amazonka.IoTSiteWise.DeleteAssetModel
+    Amazonka.IoTSiteWise.DeleteDashboard
+    Amazonka.IoTSiteWise.DeleteGateway
+    Amazonka.IoTSiteWise.DeletePortal
+    Amazonka.IoTSiteWise.DeleteProject
+    Amazonka.IoTSiteWise.DeleteTimeSeries
+    Amazonka.IoTSiteWise.DescribeAccessPolicy
+    Amazonka.IoTSiteWise.DescribeAsset
+    Amazonka.IoTSiteWise.DescribeAssetModel
+    Amazonka.IoTSiteWise.DescribeAssetProperty
+    Amazonka.IoTSiteWise.DescribeBulkImportJob
+    Amazonka.IoTSiteWise.DescribeDashboard
+    Amazonka.IoTSiteWise.DescribeDefaultEncryptionConfiguration
+    Amazonka.IoTSiteWise.DescribeGateway
+    Amazonka.IoTSiteWise.DescribeGatewayCapabilityConfiguration
+    Amazonka.IoTSiteWise.DescribeLoggingOptions
+    Amazonka.IoTSiteWise.DescribePortal
+    Amazonka.IoTSiteWise.DescribeProject
+    Amazonka.IoTSiteWise.DescribeStorageConfiguration
+    Amazonka.IoTSiteWise.DescribeTimeSeries
+    Amazonka.IoTSiteWise.DisassociateAssets
+    Amazonka.IoTSiteWise.DisassociateTimeSeriesFromAssetProperty
+    Amazonka.IoTSiteWise.GetAssetPropertyAggregates
+    Amazonka.IoTSiteWise.GetAssetPropertyValue
+    Amazonka.IoTSiteWise.GetAssetPropertyValueHistory
+    Amazonka.IoTSiteWise.GetInterpolatedAssetPropertyValues
+    Amazonka.IoTSiteWise.Lens
+    Amazonka.IoTSiteWise.ListAccessPolicies
+    Amazonka.IoTSiteWise.ListAssetModelProperties
+    Amazonka.IoTSiteWise.ListAssetModels
+    Amazonka.IoTSiteWise.ListAssetProperties
+    Amazonka.IoTSiteWise.ListAssetRelationships
+    Amazonka.IoTSiteWise.ListAssets
+    Amazonka.IoTSiteWise.ListAssociatedAssets
+    Amazonka.IoTSiteWise.ListBulkImportJobs
+    Amazonka.IoTSiteWise.ListDashboards
+    Amazonka.IoTSiteWise.ListGateways
+    Amazonka.IoTSiteWise.ListPortals
+    Amazonka.IoTSiteWise.ListProjectAssets
+    Amazonka.IoTSiteWise.ListProjects
+    Amazonka.IoTSiteWise.ListTagsForResource
+    Amazonka.IoTSiteWise.ListTimeSeries
+    Amazonka.IoTSiteWise.PutDefaultEncryptionConfiguration
+    Amazonka.IoTSiteWise.PutLoggingOptions
+    Amazonka.IoTSiteWise.PutStorageConfiguration
+    Amazonka.IoTSiteWise.TagResource
+    Amazonka.IoTSiteWise.Types
+    Amazonka.IoTSiteWise.Types.AccessPolicySummary
+    Amazonka.IoTSiteWise.Types.AggregatedValue
+    Amazonka.IoTSiteWise.Types.Aggregates
+    Amazonka.IoTSiteWise.Types.AggregateType
+    Amazonka.IoTSiteWise.Types.Alarms
+    Amazonka.IoTSiteWise.Types.AssetCompositeModel
+    Amazonka.IoTSiteWise.Types.AssetErrorCode
+    Amazonka.IoTSiteWise.Types.AssetErrorDetails
+    Amazonka.IoTSiteWise.Types.AssetHierarchy
+    Amazonka.IoTSiteWise.Types.AssetHierarchyInfo
+    Amazonka.IoTSiteWise.Types.AssetModelCompositeModel
+    Amazonka.IoTSiteWise.Types.AssetModelCompositeModelDefinition
+    Amazonka.IoTSiteWise.Types.AssetModelHierarchy
+    Amazonka.IoTSiteWise.Types.AssetModelHierarchyDefinition
+    Amazonka.IoTSiteWise.Types.AssetModelProperty
+    Amazonka.IoTSiteWise.Types.AssetModelPropertyDefinition
+    Amazonka.IoTSiteWise.Types.AssetModelPropertySummary
+    Amazonka.IoTSiteWise.Types.AssetModelState
+    Amazonka.IoTSiteWise.Types.AssetModelStatus
+    Amazonka.IoTSiteWise.Types.AssetModelSummary
+    Amazonka.IoTSiteWise.Types.AssetProperty
+    Amazonka.IoTSiteWise.Types.AssetPropertySummary
+    Amazonka.IoTSiteWise.Types.AssetPropertyValue
+    Amazonka.IoTSiteWise.Types.AssetRelationshipSummary
+    Amazonka.IoTSiteWise.Types.AssetRelationshipType
+    Amazonka.IoTSiteWise.Types.AssetState
+    Amazonka.IoTSiteWise.Types.AssetStatus
+    Amazonka.IoTSiteWise.Types.AssetSummary
+    Amazonka.IoTSiteWise.Types.AssociatedAssetsSummary
+    Amazonka.IoTSiteWise.Types.Attribute
+    Amazonka.IoTSiteWise.Types.AuthMode
+    Amazonka.IoTSiteWise.Types.BatchEntryCompletionStatus
+    Amazonka.IoTSiteWise.Types.BatchGetAssetPropertyAggregatesEntry
+    Amazonka.IoTSiteWise.Types.BatchGetAssetPropertyAggregatesErrorCode
+    Amazonka.IoTSiteWise.Types.BatchGetAssetPropertyAggregatesErrorEntry
+    Amazonka.IoTSiteWise.Types.BatchGetAssetPropertyAggregatesErrorInfo
+    Amazonka.IoTSiteWise.Types.BatchGetAssetPropertyAggregatesSkippedEntry
+    Amazonka.IoTSiteWise.Types.BatchGetAssetPropertyAggregatesSuccessEntry
+    Amazonka.IoTSiteWise.Types.BatchGetAssetPropertyValueEntry
+    Amazonka.IoTSiteWise.Types.BatchGetAssetPropertyValueErrorCode
+    Amazonka.IoTSiteWise.Types.BatchGetAssetPropertyValueErrorEntry
+    Amazonka.IoTSiteWise.Types.BatchGetAssetPropertyValueErrorInfo
+    Amazonka.IoTSiteWise.Types.BatchGetAssetPropertyValueHistoryEntry
+    Amazonka.IoTSiteWise.Types.BatchGetAssetPropertyValueHistoryErrorCode
+    Amazonka.IoTSiteWise.Types.BatchGetAssetPropertyValueHistoryErrorEntry
+    Amazonka.IoTSiteWise.Types.BatchGetAssetPropertyValueHistoryErrorInfo
+    Amazonka.IoTSiteWise.Types.BatchGetAssetPropertyValueHistorySkippedEntry
+    Amazonka.IoTSiteWise.Types.BatchGetAssetPropertyValueHistorySuccessEntry
+    Amazonka.IoTSiteWise.Types.BatchGetAssetPropertyValueSkippedEntry
+    Amazonka.IoTSiteWise.Types.BatchGetAssetPropertyValueSuccessEntry
+    Amazonka.IoTSiteWise.Types.BatchPutAssetPropertyError
+    Amazonka.IoTSiteWise.Types.BatchPutAssetPropertyErrorEntry
+    Amazonka.IoTSiteWise.Types.BatchPutAssetPropertyValueErrorCode
+    Amazonka.IoTSiteWise.Types.CapabilitySyncStatus
+    Amazonka.IoTSiteWise.Types.ColumnName
+    Amazonka.IoTSiteWise.Types.CompositeModelProperty
+    Amazonka.IoTSiteWise.Types.ComputeLocation
+    Amazonka.IoTSiteWise.Types.ConfigurationErrorDetails
+    Amazonka.IoTSiteWise.Types.ConfigurationState
+    Amazonka.IoTSiteWise.Types.ConfigurationStatus
+    Amazonka.IoTSiteWise.Types.Csv
+    Amazonka.IoTSiteWise.Types.CustomerManagedS3Storage
+    Amazonka.IoTSiteWise.Types.DashboardSummary
+    Amazonka.IoTSiteWise.Types.DetailedError
+    Amazonka.IoTSiteWise.Types.DetailedErrorCode
+    Amazonka.IoTSiteWise.Types.DisassociatedDataStorageState
+    Amazonka.IoTSiteWise.Types.EncryptionType
+    Amazonka.IoTSiteWise.Types.ErrorCode
+    Amazonka.IoTSiteWise.Types.ErrorDetails
+    Amazonka.IoTSiteWise.Types.ErrorReportLocation
+    Amazonka.IoTSiteWise.Types.ExpressionVariable
+    Amazonka.IoTSiteWise.Types.File
+    Amazonka.IoTSiteWise.Types.FileFormat
+    Amazonka.IoTSiteWise.Types.ForwardingConfig
+    Amazonka.IoTSiteWise.Types.ForwardingConfigState
+    Amazonka.IoTSiteWise.Types.GatewayCapabilitySummary
+    Amazonka.IoTSiteWise.Types.GatewayPlatform
+    Amazonka.IoTSiteWise.Types.GatewaySummary
+    Amazonka.IoTSiteWise.Types.Greengrass
+    Amazonka.IoTSiteWise.Types.GreengrassV2
+    Amazonka.IoTSiteWise.Types.GroupIdentity
+    Amazonka.IoTSiteWise.Types.IAMRoleIdentity
+    Amazonka.IoTSiteWise.Types.IAMUserIdentity
+    Amazonka.IoTSiteWise.Types.Identity
+    Amazonka.IoTSiteWise.Types.IdentityType
+    Amazonka.IoTSiteWise.Types.Image
+    Amazonka.IoTSiteWise.Types.ImageFile
+    Amazonka.IoTSiteWise.Types.ImageFileType
+    Amazonka.IoTSiteWise.Types.ImageLocation
+    Amazonka.IoTSiteWise.Types.InterpolatedAssetPropertyValue
+    Amazonka.IoTSiteWise.Types.JobConfiguration
+    Amazonka.IoTSiteWise.Types.JobStatus
+    Amazonka.IoTSiteWise.Types.JobSummary
+    Amazonka.IoTSiteWise.Types.ListAssetModelPropertiesFilter
+    Amazonka.IoTSiteWise.Types.ListAssetPropertiesFilter
+    Amazonka.IoTSiteWise.Types.ListAssetsFilter
+    Amazonka.IoTSiteWise.Types.ListBulkImportJobsFilter
+    Amazonka.IoTSiteWise.Types.ListTimeSeriesType
+    Amazonka.IoTSiteWise.Types.LoggingLevel
+    Amazonka.IoTSiteWise.Types.LoggingOptions
+    Amazonka.IoTSiteWise.Types.Measurement
+    Amazonka.IoTSiteWise.Types.MeasurementProcessingConfig
+    Amazonka.IoTSiteWise.Types.Metric
+    Amazonka.IoTSiteWise.Types.MetricProcessingConfig
+    Amazonka.IoTSiteWise.Types.MetricWindow
+    Amazonka.IoTSiteWise.Types.MonitorErrorCode
+    Amazonka.IoTSiteWise.Types.MonitorErrorDetails
+    Amazonka.IoTSiteWise.Types.MultiLayerStorage
+    Amazonka.IoTSiteWise.Types.Permission
+    Amazonka.IoTSiteWise.Types.PortalResource
+    Amazonka.IoTSiteWise.Types.PortalState
+    Amazonka.IoTSiteWise.Types.PortalStatus
+    Amazonka.IoTSiteWise.Types.PortalSummary
+    Amazonka.IoTSiteWise.Types.ProjectResource
+    Amazonka.IoTSiteWise.Types.ProjectSummary
+    Amazonka.IoTSiteWise.Types.Property
+    Amazonka.IoTSiteWise.Types.PropertyDataType
+    Amazonka.IoTSiteWise.Types.PropertyNotification
+    Amazonka.IoTSiteWise.Types.PropertyNotificationState
+    Amazonka.IoTSiteWise.Types.PropertyType
+    Amazonka.IoTSiteWise.Types.PutAssetPropertyValueEntry
+    Amazonka.IoTSiteWise.Types.Quality
+    Amazonka.IoTSiteWise.Types.Resource
+    Amazonka.IoTSiteWise.Types.ResourceType
+    Amazonka.IoTSiteWise.Types.RetentionPeriod
+    Amazonka.IoTSiteWise.Types.StorageType
+    Amazonka.IoTSiteWise.Types.TimeInNanos
+    Amazonka.IoTSiteWise.Types.TimeOrdering
+    Amazonka.IoTSiteWise.Types.TimeSeriesSummary
+    Amazonka.IoTSiteWise.Types.Transform
+    Amazonka.IoTSiteWise.Types.TransformProcessingConfig
+    Amazonka.IoTSiteWise.Types.TraversalDirection
+    Amazonka.IoTSiteWise.Types.TraversalType
+    Amazonka.IoTSiteWise.Types.TumblingWindow
+    Amazonka.IoTSiteWise.Types.UserIdentity
+    Amazonka.IoTSiteWise.Types.VariableValue
+    Amazonka.IoTSiteWise.Types.Variant
+    Amazonka.IoTSiteWise.UntagResource
+    Amazonka.IoTSiteWise.UpdateAccessPolicy
+    Amazonka.IoTSiteWise.UpdateAsset
+    Amazonka.IoTSiteWise.UpdateAssetModel
+    Amazonka.IoTSiteWise.UpdateAssetProperty
+    Amazonka.IoTSiteWise.UpdateDashboard
+    Amazonka.IoTSiteWise.UpdateGateway
+    Amazonka.IoTSiteWise.UpdateGatewayCapabilityConfiguration
+    Amazonka.IoTSiteWise.UpdatePortal
+    Amazonka.IoTSiteWise.UpdateProject
+    Amazonka.IoTSiteWise.Waiters
+
+  build-depends:
+    , amazonka-core  >=2.0  && <2.1
+    , base           >=4.12 && <5
+
+test-suite amazonka-iotsitewise-test
+  type:             exitcode-stdio-1.0
+  default-language: Haskell2010
+  hs-source-dirs:   test
+  main-is:          Main.hs
+  ghc-options:      -Wall -threaded
+
+  -- This section is encoded by the template and any modules added by
+  -- hand outside these namespaces will not correctly be added to the
+  -- distribution package.
+  other-modules:
+    Test.Amazonka.Gen.IoTSiteWise
+    Test.Amazonka.IoTSiteWise
+    Test.Amazonka.IoTSiteWise.Internal
+
+  build-depends:
+    , amazonka-core         >=2.0 && <2.1
+    , amazonka-iotsitewise
+    , amazonka-test         >=2.0 && <2.1
+    , base
+    , bytestring
+    , case-insensitive
+    , tasty
+    , tasty-hunit
+    , text
+    , time
+    , unordered-containers
diff --git a/fixture/AssociateAssets.yaml b/fixture/AssociateAssets.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/AssociateAssets.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/iotsitewise/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  iotsitewise.us-east-1.amazonaws.com
+  Content-Type:          application/x-www-form-urlencoded; charset=utf-8
+  X-Amz-Content-SHA256:  abcdef
+  X-Amz-Date:            20091028T223200Z
+body:
+  ''
diff --git a/fixture/AssociateAssetsResponse.proto b/fixture/AssociateAssetsResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/AssociateAssetsResponse.proto
diff --git a/fixture/AssociateTimeSeriesToAssetProperty.yaml b/fixture/AssociateTimeSeriesToAssetProperty.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/AssociateTimeSeriesToAssetProperty.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/iotsitewise/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  iotsitewise.us-east-1.amazonaws.com
+  Content-Type:          application/x-www-form-urlencoded; charset=utf-8
+  X-Amz-Content-SHA256:  abcdef
+  X-Amz-Date:            20091028T223200Z
+body:
+  ''
diff --git a/fixture/AssociateTimeSeriesToAssetPropertyResponse.proto b/fixture/AssociateTimeSeriesToAssetPropertyResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/AssociateTimeSeriesToAssetPropertyResponse.proto
diff --git a/fixture/BatchAssociateProjectAssets.yaml b/fixture/BatchAssociateProjectAssets.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/BatchAssociateProjectAssets.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/iotsitewise/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  iotsitewise.us-east-1.amazonaws.com
+  Content-Type:          application/x-www-form-urlencoded; charset=utf-8
+  X-Amz-Content-SHA256:  abcdef
+  X-Amz-Date:            20091028T223200Z
+body:
+  ''
diff --git a/fixture/BatchAssociateProjectAssetsResponse.proto b/fixture/BatchAssociateProjectAssetsResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/BatchAssociateProjectAssetsResponse.proto
diff --git a/fixture/BatchDisassociateProjectAssets.yaml b/fixture/BatchDisassociateProjectAssets.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/BatchDisassociateProjectAssets.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/iotsitewise/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  iotsitewise.us-east-1.amazonaws.com
+  Content-Type:          application/x-www-form-urlencoded; charset=utf-8
+  X-Amz-Content-SHA256:  abcdef
+  X-Amz-Date:            20091028T223200Z
+body:
+  ''
diff --git a/fixture/BatchDisassociateProjectAssetsResponse.proto b/fixture/BatchDisassociateProjectAssetsResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/BatchDisassociateProjectAssetsResponse.proto
diff --git a/fixture/BatchGetAssetPropertyAggregates.yaml b/fixture/BatchGetAssetPropertyAggregates.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/BatchGetAssetPropertyAggregates.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/iotsitewise/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  iotsitewise.us-east-1.amazonaws.com
+  Content-Type:          application/x-www-form-urlencoded; charset=utf-8
+  X-Amz-Content-SHA256:  abcdef
+  X-Amz-Date:            20091028T223200Z
+body:
+  ''
diff --git a/fixture/BatchGetAssetPropertyAggregatesResponse.proto b/fixture/BatchGetAssetPropertyAggregatesResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/BatchGetAssetPropertyAggregatesResponse.proto
diff --git a/fixture/BatchGetAssetPropertyValue.yaml b/fixture/BatchGetAssetPropertyValue.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/BatchGetAssetPropertyValue.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/iotsitewise/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  iotsitewise.us-east-1.amazonaws.com
+  Content-Type:          application/x-www-form-urlencoded; charset=utf-8
+  X-Amz-Content-SHA256:  abcdef
+  X-Amz-Date:            20091028T223200Z
+body:
+  ''
diff --git a/fixture/BatchGetAssetPropertyValueHistory.yaml b/fixture/BatchGetAssetPropertyValueHistory.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/BatchGetAssetPropertyValueHistory.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/iotsitewise/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  iotsitewise.us-east-1.amazonaws.com
+  Content-Type:          application/x-www-form-urlencoded; charset=utf-8
+  X-Amz-Content-SHA256:  abcdef
+  X-Amz-Date:            20091028T223200Z
+body:
+  ''
diff --git a/fixture/BatchGetAssetPropertyValueHistoryResponse.proto b/fixture/BatchGetAssetPropertyValueHistoryResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/BatchGetAssetPropertyValueHistoryResponse.proto
diff --git a/fixture/BatchGetAssetPropertyValueResponse.proto b/fixture/BatchGetAssetPropertyValueResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/BatchGetAssetPropertyValueResponse.proto
diff --git a/fixture/BatchPutAssetPropertyValue.yaml b/fixture/BatchPutAssetPropertyValue.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/BatchPutAssetPropertyValue.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/iotsitewise/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  iotsitewise.us-east-1.amazonaws.com
+  Content-Type:          application/x-www-form-urlencoded; charset=utf-8
+  X-Amz-Content-SHA256:  abcdef
+  X-Amz-Date:            20091028T223200Z
+body:
+  ''
diff --git a/fixture/BatchPutAssetPropertyValueResponse.proto b/fixture/BatchPutAssetPropertyValueResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/BatchPutAssetPropertyValueResponse.proto
diff --git a/fixture/CreateAccessPolicy.yaml b/fixture/CreateAccessPolicy.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/CreateAccessPolicy.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/iotsitewise/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  iotsitewise.us-east-1.amazonaws.com
+  Content-Type:          application/x-www-form-urlencoded; charset=utf-8
+  X-Amz-Content-SHA256:  abcdef
+  X-Amz-Date:            20091028T223200Z
+body:
+  ''
diff --git a/fixture/CreateAccessPolicyResponse.proto b/fixture/CreateAccessPolicyResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/CreateAccessPolicyResponse.proto
diff --git a/fixture/CreateAsset.yaml b/fixture/CreateAsset.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/CreateAsset.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/iotsitewise/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  iotsitewise.us-east-1.amazonaws.com
+  Content-Type:          application/x-www-form-urlencoded; charset=utf-8
+  X-Amz-Content-SHA256:  abcdef
+  X-Amz-Date:            20091028T223200Z
+body:
+  ''
diff --git a/fixture/CreateAssetModel.yaml b/fixture/CreateAssetModel.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/CreateAssetModel.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/iotsitewise/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  iotsitewise.us-east-1.amazonaws.com
+  Content-Type:          application/x-www-form-urlencoded; charset=utf-8
+  X-Amz-Content-SHA256:  abcdef
+  X-Amz-Date:            20091028T223200Z
+body:
+  ''
diff --git a/fixture/CreateAssetModelResponse.proto b/fixture/CreateAssetModelResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/CreateAssetModelResponse.proto
diff --git a/fixture/CreateAssetResponse.proto b/fixture/CreateAssetResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/CreateAssetResponse.proto
diff --git a/fixture/CreateBulkImportJob.yaml b/fixture/CreateBulkImportJob.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/CreateBulkImportJob.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/iotsitewise/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  iotsitewise.us-east-1.amazonaws.com
+  Content-Type:          application/x-www-form-urlencoded; charset=utf-8
+  X-Amz-Content-SHA256:  abcdef
+  X-Amz-Date:            20091028T223200Z
+body:
+  ''
diff --git a/fixture/CreateBulkImportJobResponse.proto b/fixture/CreateBulkImportJobResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/CreateBulkImportJobResponse.proto
diff --git a/fixture/CreateDashboard.yaml b/fixture/CreateDashboard.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/CreateDashboard.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/iotsitewise/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  iotsitewise.us-east-1.amazonaws.com
+  Content-Type:          application/x-www-form-urlencoded; charset=utf-8
+  X-Amz-Content-SHA256:  abcdef
+  X-Amz-Date:            20091028T223200Z
+body:
+  ''
diff --git a/fixture/CreateDashboardResponse.proto b/fixture/CreateDashboardResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/CreateDashboardResponse.proto
diff --git a/fixture/CreateGateway.yaml b/fixture/CreateGateway.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/CreateGateway.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/iotsitewise/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  iotsitewise.us-east-1.amazonaws.com
+  Content-Type:          application/x-www-form-urlencoded; charset=utf-8
+  X-Amz-Content-SHA256:  abcdef
+  X-Amz-Date:            20091028T223200Z
+body:
+  ''
diff --git a/fixture/CreateGatewayResponse.proto b/fixture/CreateGatewayResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/CreateGatewayResponse.proto
diff --git a/fixture/CreatePortal.yaml b/fixture/CreatePortal.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/CreatePortal.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/iotsitewise/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  iotsitewise.us-east-1.amazonaws.com
+  Content-Type:          application/x-www-form-urlencoded; charset=utf-8
+  X-Amz-Content-SHA256:  abcdef
+  X-Amz-Date:            20091028T223200Z
+body:
+  ''
diff --git a/fixture/CreatePortalResponse.proto b/fixture/CreatePortalResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/CreatePortalResponse.proto
diff --git a/fixture/CreateProject.yaml b/fixture/CreateProject.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/CreateProject.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/iotsitewise/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  iotsitewise.us-east-1.amazonaws.com
+  Content-Type:          application/x-www-form-urlencoded; charset=utf-8
+  X-Amz-Content-SHA256:  abcdef
+  X-Amz-Date:            20091028T223200Z
+body:
+  ''
diff --git a/fixture/CreateProjectResponse.proto b/fixture/CreateProjectResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/CreateProjectResponse.proto
diff --git a/fixture/DeleteAccessPolicy.yaml b/fixture/DeleteAccessPolicy.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/DeleteAccessPolicy.yaml
@@ -0,0 +1,10 @@
+---
+method: DELETE
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/iotsitewise/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  iotsitewise.us-east-1.amazonaws.com
+  Content-Type:          application/x-www-form-urlencoded; charset=utf-8
+  X-Amz-Content-SHA256:  abcdef
+  X-Amz-Date:            20091028T223200Z
+body:
+  ''
diff --git a/fixture/DeleteAccessPolicyResponse.proto b/fixture/DeleteAccessPolicyResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/DeleteAccessPolicyResponse.proto
diff --git a/fixture/DeleteAsset.yaml b/fixture/DeleteAsset.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/DeleteAsset.yaml
@@ -0,0 +1,10 @@
+---
+method: DELETE
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/iotsitewise/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  iotsitewise.us-east-1.amazonaws.com
+  Content-Type:          application/x-www-form-urlencoded; charset=utf-8
+  X-Amz-Content-SHA256:  abcdef
+  X-Amz-Date:            20091028T223200Z
+body:
+  ''
diff --git a/fixture/DeleteAssetModel.yaml b/fixture/DeleteAssetModel.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/DeleteAssetModel.yaml
@@ -0,0 +1,10 @@
+---
+method: DELETE
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/iotsitewise/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  iotsitewise.us-east-1.amazonaws.com
+  Content-Type:          application/x-www-form-urlencoded; charset=utf-8
+  X-Amz-Content-SHA256:  abcdef
+  X-Amz-Date:            20091028T223200Z
+body:
+  ''
diff --git a/fixture/DeleteAssetModelResponse.proto b/fixture/DeleteAssetModelResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/DeleteAssetModelResponse.proto
diff --git a/fixture/DeleteAssetResponse.proto b/fixture/DeleteAssetResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/DeleteAssetResponse.proto
diff --git a/fixture/DeleteDashboard.yaml b/fixture/DeleteDashboard.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/DeleteDashboard.yaml
@@ -0,0 +1,10 @@
+---
+method: DELETE
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/iotsitewise/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  iotsitewise.us-east-1.amazonaws.com
+  Content-Type:          application/x-www-form-urlencoded; charset=utf-8
+  X-Amz-Content-SHA256:  abcdef
+  X-Amz-Date:            20091028T223200Z
+body:
+  ''
diff --git a/fixture/DeleteDashboardResponse.proto b/fixture/DeleteDashboardResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/DeleteDashboardResponse.proto
diff --git a/fixture/DeleteGateway.yaml b/fixture/DeleteGateway.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/DeleteGateway.yaml
@@ -0,0 +1,10 @@
+---
+method: DELETE
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/iotsitewise/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  iotsitewise.us-east-1.amazonaws.com
+  Content-Type:          application/x-www-form-urlencoded; charset=utf-8
+  X-Amz-Content-SHA256:  abcdef
+  X-Amz-Date:            20091028T223200Z
+body:
+  ''
diff --git a/fixture/DeleteGatewayResponse.proto b/fixture/DeleteGatewayResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/DeleteGatewayResponse.proto
diff --git a/fixture/DeletePortal.yaml b/fixture/DeletePortal.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/DeletePortal.yaml
@@ -0,0 +1,10 @@
+---
+method: DELETE
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/iotsitewise/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  iotsitewise.us-east-1.amazonaws.com
+  Content-Type:          application/x-www-form-urlencoded; charset=utf-8
+  X-Amz-Content-SHA256:  abcdef
+  X-Amz-Date:            20091028T223200Z
+body:
+  ''
diff --git a/fixture/DeletePortalResponse.proto b/fixture/DeletePortalResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/DeletePortalResponse.proto
diff --git a/fixture/DeleteProject.yaml b/fixture/DeleteProject.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/DeleteProject.yaml
@@ -0,0 +1,10 @@
+---
+method: DELETE
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/iotsitewise/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  iotsitewise.us-east-1.amazonaws.com
+  Content-Type:          application/x-www-form-urlencoded; charset=utf-8
+  X-Amz-Content-SHA256:  abcdef
+  X-Amz-Date:            20091028T223200Z
+body:
+  ''
diff --git a/fixture/DeleteProjectResponse.proto b/fixture/DeleteProjectResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/DeleteProjectResponse.proto
diff --git a/fixture/DeleteTimeSeries.yaml b/fixture/DeleteTimeSeries.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/DeleteTimeSeries.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/iotsitewise/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  iotsitewise.us-east-1.amazonaws.com
+  Content-Type:          application/x-www-form-urlencoded; charset=utf-8
+  X-Amz-Content-SHA256:  abcdef
+  X-Amz-Date:            20091028T223200Z
+body:
+  ''
diff --git a/fixture/DeleteTimeSeriesResponse.proto b/fixture/DeleteTimeSeriesResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/DeleteTimeSeriesResponse.proto
diff --git a/fixture/DescribeAccessPolicy.yaml b/fixture/DescribeAccessPolicy.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/DescribeAccessPolicy.yaml
@@ -0,0 +1,10 @@
+---
+method: GET
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/iotsitewise/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  iotsitewise.us-east-1.amazonaws.com
+  Content-Type:          application/x-www-form-urlencoded; charset=utf-8
+  X-Amz-Content-SHA256:  abcdef
+  X-Amz-Date:            20091028T223200Z
+body:
+  ''
diff --git a/fixture/DescribeAccessPolicyResponse.proto b/fixture/DescribeAccessPolicyResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/DescribeAccessPolicyResponse.proto
diff --git a/fixture/DescribeAsset.yaml b/fixture/DescribeAsset.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/DescribeAsset.yaml
@@ -0,0 +1,10 @@
+---
+method: GET
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/iotsitewise/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  iotsitewise.us-east-1.amazonaws.com
+  Content-Type:          application/x-www-form-urlencoded; charset=utf-8
+  X-Amz-Content-SHA256:  abcdef
+  X-Amz-Date:            20091028T223200Z
+body:
+  ''
diff --git a/fixture/DescribeAssetModel.yaml b/fixture/DescribeAssetModel.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/DescribeAssetModel.yaml
@@ -0,0 +1,10 @@
+---
+method: GET
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/iotsitewise/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  iotsitewise.us-east-1.amazonaws.com
+  Content-Type:          application/x-www-form-urlencoded; charset=utf-8
+  X-Amz-Content-SHA256:  abcdef
+  X-Amz-Date:            20091028T223200Z
+body:
+  ''
diff --git a/fixture/DescribeAssetModelResponse.proto b/fixture/DescribeAssetModelResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/DescribeAssetModelResponse.proto
diff --git a/fixture/DescribeAssetProperty.yaml b/fixture/DescribeAssetProperty.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/DescribeAssetProperty.yaml
@@ -0,0 +1,10 @@
+---
+method: GET
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/iotsitewise/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  iotsitewise.us-east-1.amazonaws.com
+  Content-Type:          application/x-www-form-urlencoded; charset=utf-8
+  X-Amz-Content-SHA256:  abcdef
+  X-Amz-Date:            20091028T223200Z
+body:
+  ''
diff --git a/fixture/DescribeAssetPropertyResponse.proto b/fixture/DescribeAssetPropertyResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/DescribeAssetPropertyResponse.proto
diff --git a/fixture/DescribeAssetResponse.proto b/fixture/DescribeAssetResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/DescribeAssetResponse.proto
diff --git a/fixture/DescribeBulkImportJob.yaml b/fixture/DescribeBulkImportJob.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/DescribeBulkImportJob.yaml
@@ -0,0 +1,10 @@
+---
+method: GET
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/iotsitewise/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  iotsitewise.us-east-1.amazonaws.com
+  Content-Type:          application/x-www-form-urlencoded; charset=utf-8
+  X-Amz-Content-SHA256:  abcdef
+  X-Amz-Date:            20091028T223200Z
+body:
+  ''
diff --git a/fixture/DescribeBulkImportJobResponse.proto b/fixture/DescribeBulkImportJobResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/DescribeBulkImportJobResponse.proto
diff --git a/fixture/DescribeDashboard.yaml b/fixture/DescribeDashboard.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/DescribeDashboard.yaml
@@ -0,0 +1,10 @@
+---
+method: GET
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/iotsitewise/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  iotsitewise.us-east-1.amazonaws.com
+  Content-Type:          application/x-www-form-urlencoded; charset=utf-8
+  X-Amz-Content-SHA256:  abcdef
+  X-Amz-Date:            20091028T223200Z
+body:
+  ''
diff --git a/fixture/DescribeDashboardResponse.proto b/fixture/DescribeDashboardResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/DescribeDashboardResponse.proto
diff --git a/fixture/DescribeDefaultEncryptionConfiguration.yaml b/fixture/DescribeDefaultEncryptionConfiguration.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/DescribeDefaultEncryptionConfiguration.yaml
@@ -0,0 +1,10 @@
+---
+method: GET
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/iotsitewise/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  iotsitewise.us-east-1.amazonaws.com
+  Content-Type:          application/x-www-form-urlencoded; charset=utf-8
+  X-Amz-Content-SHA256:  abcdef
+  X-Amz-Date:            20091028T223200Z
+body:
+  ''
diff --git a/fixture/DescribeDefaultEncryptionConfigurationResponse.proto b/fixture/DescribeDefaultEncryptionConfigurationResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/DescribeDefaultEncryptionConfigurationResponse.proto
diff --git a/fixture/DescribeGateway.yaml b/fixture/DescribeGateway.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/DescribeGateway.yaml
@@ -0,0 +1,10 @@
+---
+method: GET
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/iotsitewise/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  iotsitewise.us-east-1.amazonaws.com
+  Content-Type:          application/x-www-form-urlencoded; charset=utf-8
+  X-Amz-Content-SHA256:  abcdef
+  X-Amz-Date:            20091028T223200Z
+body:
+  ''
diff --git a/fixture/DescribeGatewayCapabilityConfiguration.yaml b/fixture/DescribeGatewayCapabilityConfiguration.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/DescribeGatewayCapabilityConfiguration.yaml
@@ -0,0 +1,10 @@
+---
+method: GET
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/iotsitewise/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  iotsitewise.us-east-1.amazonaws.com
+  Content-Type:          application/x-www-form-urlencoded; charset=utf-8
+  X-Amz-Content-SHA256:  abcdef
+  X-Amz-Date:            20091028T223200Z
+body:
+  ''
diff --git a/fixture/DescribeGatewayCapabilityConfigurationResponse.proto b/fixture/DescribeGatewayCapabilityConfigurationResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/DescribeGatewayCapabilityConfigurationResponse.proto
diff --git a/fixture/DescribeGatewayResponse.proto b/fixture/DescribeGatewayResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/DescribeGatewayResponse.proto
diff --git a/fixture/DescribeLoggingOptions.yaml b/fixture/DescribeLoggingOptions.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/DescribeLoggingOptions.yaml
@@ -0,0 +1,10 @@
+---
+method: GET
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/iotsitewise/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  iotsitewise.us-east-1.amazonaws.com
+  Content-Type:          application/x-www-form-urlencoded; charset=utf-8
+  X-Amz-Content-SHA256:  abcdef
+  X-Amz-Date:            20091028T223200Z
+body:
+  ''
diff --git a/fixture/DescribeLoggingOptionsResponse.proto b/fixture/DescribeLoggingOptionsResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/DescribeLoggingOptionsResponse.proto
diff --git a/fixture/DescribePortal.yaml b/fixture/DescribePortal.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/DescribePortal.yaml
@@ -0,0 +1,10 @@
+---
+method: GET
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/iotsitewise/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  iotsitewise.us-east-1.amazonaws.com
+  Content-Type:          application/x-www-form-urlencoded; charset=utf-8
+  X-Amz-Content-SHA256:  abcdef
+  X-Amz-Date:            20091028T223200Z
+body:
+  ''
diff --git a/fixture/DescribePortalResponse.proto b/fixture/DescribePortalResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/DescribePortalResponse.proto
diff --git a/fixture/DescribeProject.yaml b/fixture/DescribeProject.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/DescribeProject.yaml
@@ -0,0 +1,10 @@
+---
+method: GET
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/iotsitewise/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  iotsitewise.us-east-1.amazonaws.com
+  Content-Type:          application/x-www-form-urlencoded; charset=utf-8
+  X-Amz-Content-SHA256:  abcdef
+  X-Amz-Date:            20091028T223200Z
+body:
+  ''
diff --git a/fixture/DescribeProjectResponse.proto b/fixture/DescribeProjectResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/DescribeProjectResponse.proto
diff --git a/fixture/DescribeStorageConfiguration.yaml b/fixture/DescribeStorageConfiguration.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/DescribeStorageConfiguration.yaml
@@ -0,0 +1,10 @@
+---
+method: GET
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/iotsitewise/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  iotsitewise.us-east-1.amazonaws.com
+  Content-Type:          application/x-www-form-urlencoded; charset=utf-8
+  X-Amz-Content-SHA256:  abcdef
+  X-Amz-Date:            20091028T223200Z
+body:
+  ''
diff --git a/fixture/DescribeStorageConfigurationResponse.proto b/fixture/DescribeStorageConfigurationResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/DescribeStorageConfigurationResponse.proto
diff --git a/fixture/DescribeTimeSeries.yaml b/fixture/DescribeTimeSeries.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/DescribeTimeSeries.yaml
@@ -0,0 +1,10 @@
+---
+method: GET
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/iotsitewise/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  iotsitewise.us-east-1.amazonaws.com
+  Content-Type:          application/x-www-form-urlencoded; charset=utf-8
+  X-Amz-Content-SHA256:  abcdef
+  X-Amz-Date:            20091028T223200Z
+body:
+  ''
diff --git a/fixture/DescribeTimeSeriesResponse.proto b/fixture/DescribeTimeSeriesResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/DescribeTimeSeriesResponse.proto
diff --git a/fixture/DisassociateAssets.yaml b/fixture/DisassociateAssets.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/DisassociateAssets.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/iotsitewise/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  iotsitewise.us-east-1.amazonaws.com
+  Content-Type:          application/x-www-form-urlencoded; charset=utf-8
+  X-Amz-Content-SHA256:  abcdef
+  X-Amz-Date:            20091028T223200Z
+body:
+  ''
diff --git a/fixture/DisassociateAssetsResponse.proto b/fixture/DisassociateAssetsResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/DisassociateAssetsResponse.proto
diff --git a/fixture/DisassociateTimeSeriesFromAssetProperty.yaml b/fixture/DisassociateTimeSeriesFromAssetProperty.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/DisassociateTimeSeriesFromAssetProperty.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/iotsitewise/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  iotsitewise.us-east-1.amazonaws.com
+  Content-Type:          application/x-www-form-urlencoded; charset=utf-8
+  X-Amz-Content-SHA256:  abcdef
+  X-Amz-Date:            20091028T223200Z
+body:
+  ''
diff --git a/fixture/DisassociateTimeSeriesFromAssetPropertyResponse.proto b/fixture/DisassociateTimeSeriesFromAssetPropertyResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/DisassociateTimeSeriesFromAssetPropertyResponse.proto
diff --git a/fixture/GetAssetPropertyAggregates.yaml b/fixture/GetAssetPropertyAggregates.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/GetAssetPropertyAggregates.yaml
@@ -0,0 +1,10 @@
+---
+method: GET
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/iotsitewise/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  iotsitewise.us-east-1.amazonaws.com
+  Content-Type:          application/x-www-form-urlencoded; charset=utf-8
+  X-Amz-Content-SHA256:  abcdef
+  X-Amz-Date:            20091028T223200Z
+body:
+  ''
diff --git a/fixture/GetAssetPropertyAggregatesResponse.proto b/fixture/GetAssetPropertyAggregatesResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/GetAssetPropertyAggregatesResponse.proto
diff --git a/fixture/GetAssetPropertyValue.yaml b/fixture/GetAssetPropertyValue.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/GetAssetPropertyValue.yaml
@@ -0,0 +1,10 @@
+---
+method: GET
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/iotsitewise/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  iotsitewise.us-east-1.amazonaws.com
+  Content-Type:          application/x-www-form-urlencoded; charset=utf-8
+  X-Amz-Content-SHA256:  abcdef
+  X-Amz-Date:            20091028T223200Z
+body:
+  ''
diff --git a/fixture/GetAssetPropertyValueHistory.yaml b/fixture/GetAssetPropertyValueHistory.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/GetAssetPropertyValueHistory.yaml
@@ -0,0 +1,10 @@
+---
+method: GET
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/iotsitewise/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  iotsitewise.us-east-1.amazonaws.com
+  Content-Type:          application/x-www-form-urlencoded; charset=utf-8
+  X-Amz-Content-SHA256:  abcdef
+  X-Amz-Date:            20091028T223200Z
+body:
+  ''
diff --git a/fixture/GetAssetPropertyValueHistoryResponse.proto b/fixture/GetAssetPropertyValueHistoryResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/GetAssetPropertyValueHistoryResponse.proto
diff --git a/fixture/GetAssetPropertyValueResponse.proto b/fixture/GetAssetPropertyValueResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/GetAssetPropertyValueResponse.proto
diff --git a/fixture/GetInterpolatedAssetPropertyValues.yaml b/fixture/GetInterpolatedAssetPropertyValues.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/GetInterpolatedAssetPropertyValues.yaml
@@ -0,0 +1,10 @@
+---
+method: GET
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/iotsitewise/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  iotsitewise.us-east-1.amazonaws.com
+  Content-Type:          application/x-www-form-urlencoded; charset=utf-8
+  X-Amz-Content-SHA256:  abcdef
+  X-Amz-Date:            20091028T223200Z
+body:
+  ''
diff --git a/fixture/GetInterpolatedAssetPropertyValuesResponse.proto b/fixture/GetInterpolatedAssetPropertyValuesResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/GetInterpolatedAssetPropertyValuesResponse.proto
diff --git a/fixture/ListAccessPolicies.yaml b/fixture/ListAccessPolicies.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/ListAccessPolicies.yaml
@@ -0,0 +1,10 @@
+---
+method: GET
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/iotsitewise/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  iotsitewise.us-east-1.amazonaws.com
+  Content-Type:          application/x-www-form-urlencoded; charset=utf-8
+  X-Amz-Content-SHA256:  abcdef
+  X-Amz-Date:            20091028T223200Z
+body:
+  ''
diff --git a/fixture/ListAccessPoliciesResponse.proto b/fixture/ListAccessPoliciesResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/ListAccessPoliciesResponse.proto
diff --git a/fixture/ListAssetModelProperties.yaml b/fixture/ListAssetModelProperties.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/ListAssetModelProperties.yaml
@@ -0,0 +1,10 @@
+---
+method: GET
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/iotsitewise/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  iotsitewise.us-east-1.amazonaws.com
+  Content-Type:          application/x-www-form-urlencoded; charset=utf-8
+  X-Amz-Content-SHA256:  abcdef
+  X-Amz-Date:            20091028T223200Z
+body:
+  ''
diff --git a/fixture/ListAssetModelPropertiesResponse.proto b/fixture/ListAssetModelPropertiesResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/ListAssetModelPropertiesResponse.proto
diff --git a/fixture/ListAssetModels.yaml b/fixture/ListAssetModels.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/ListAssetModels.yaml
@@ -0,0 +1,10 @@
+---
+method: GET
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/iotsitewise/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  iotsitewise.us-east-1.amazonaws.com
+  Content-Type:          application/x-www-form-urlencoded; charset=utf-8
+  X-Amz-Content-SHA256:  abcdef
+  X-Amz-Date:            20091028T223200Z
+body:
+  ''
diff --git a/fixture/ListAssetModelsResponse.proto b/fixture/ListAssetModelsResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/ListAssetModelsResponse.proto
diff --git a/fixture/ListAssetProperties.yaml b/fixture/ListAssetProperties.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/ListAssetProperties.yaml
@@ -0,0 +1,10 @@
+---
+method: GET
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/iotsitewise/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  iotsitewise.us-east-1.amazonaws.com
+  Content-Type:          application/x-www-form-urlencoded; charset=utf-8
+  X-Amz-Content-SHA256:  abcdef
+  X-Amz-Date:            20091028T223200Z
+body:
+  ''
diff --git a/fixture/ListAssetPropertiesResponse.proto b/fixture/ListAssetPropertiesResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/ListAssetPropertiesResponse.proto
diff --git a/fixture/ListAssetRelationships.yaml b/fixture/ListAssetRelationships.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/ListAssetRelationships.yaml
@@ -0,0 +1,10 @@
+---
+method: GET
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/iotsitewise/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  iotsitewise.us-east-1.amazonaws.com
+  Content-Type:          application/x-www-form-urlencoded; charset=utf-8
+  X-Amz-Content-SHA256:  abcdef
+  X-Amz-Date:            20091028T223200Z
+body:
+  ''
diff --git a/fixture/ListAssetRelationshipsResponse.proto b/fixture/ListAssetRelationshipsResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/ListAssetRelationshipsResponse.proto
diff --git a/fixture/ListAssets.yaml b/fixture/ListAssets.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/ListAssets.yaml
@@ -0,0 +1,10 @@
+---
+method: GET
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/iotsitewise/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  iotsitewise.us-east-1.amazonaws.com
+  Content-Type:          application/x-www-form-urlencoded; charset=utf-8
+  X-Amz-Content-SHA256:  abcdef
+  X-Amz-Date:            20091028T223200Z
+body:
+  ''
diff --git a/fixture/ListAssetsResponse.proto b/fixture/ListAssetsResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/ListAssetsResponse.proto
diff --git a/fixture/ListAssociatedAssets.yaml b/fixture/ListAssociatedAssets.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/ListAssociatedAssets.yaml
@@ -0,0 +1,10 @@
+---
+method: GET
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/iotsitewise/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  iotsitewise.us-east-1.amazonaws.com
+  Content-Type:          application/x-www-form-urlencoded; charset=utf-8
+  X-Amz-Content-SHA256:  abcdef
+  X-Amz-Date:            20091028T223200Z
+body:
+  ''
diff --git a/fixture/ListAssociatedAssetsResponse.proto b/fixture/ListAssociatedAssetsResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/ListAssociatedAssetsResponse.proto
diff --git a/fixture/ListBulkImportJobs.yaml b/fixture/ListBulkImportJobs.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/ListBulkImportJobs.yaml
@@ -0,0 +1,10 @@
+---
+method: GET
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/iotsitewise/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  iotsitewise.us-east-1.amazonaws.com
+  Content-Type:          application/x-www-form-urlencoded; charset=utf-8
+  X-Amz-Content-SHA256:  abcdef
+  X-Amz-Date:            20091028T223200Z
+body:
+  ''
diff --git a/fixture/ListBulkImportJobsResponse.proto b/fixture/ListBulkImportJobsResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/ListBulkImportJobsResponse.proto
diff --git a/fixture/ListDashboards.yaml b/fixture/ListDashboards.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/ListDashboards.yaml
@@ -0,0 +1,10 @@
+---
+method: GET
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/iotsitewise/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  iotsitewise.us-east-1.amazonaws.com
+  Content-Type:          application/x-www-form-urlencoded; charset=utf-8
+  X-Amz-Content-SHA256:  abcdef
+  X-Amz-Date:            20091028T223200Z
+body:
+  ''
diff --git a/fixture/ListDashboardsResponse.proto b/fixture/ListDashboardsResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/ListDashboardsResponse.proto
diff --git a/fixture/ListGateways.yaml b/fixture/ListGateways.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/ListGateways.yaml
@@ -0,0 +1,10 @@
+---
+method: GET
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/iotsitewise/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  iotsitewise.us-east-1.amazonaws.com
+  Content-Type:          application/x-www-form-urlencoded; charset=utf-8
+  X-Amz-Content-SHA256:  abcdef
+  X-Amz-Date:            20091028T223200Z
+body:
+  ''
diff --git a/fixture/ListGatewaysResponse.proto b/fixture/ListGatewaysResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/ListGatewaysResponse.proto
diff --git a/fixture/ListPortals.yaml b/fixture/ListPortals.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/ListPortals.yaml
@@ -0,0 +1,10 @@
+---
+method: GET
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/iotsitewise/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  iotsitewise.us-east-1.amazonaws.com
+  Content-Type:          application/x-www-form-urlencoded; charset=utf-8
+  X-Amz-Content-SHA256:  abcdef
+  X-Amz-Date:            20091028T223200Z
+body:
+  ''
diff --git a/fixture/ListPortalsResponse.proto b/fixture/ListPortalsResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/ListPortalsResponse.proto
diff --git a/fixture/ListProjectAssets.yaml b/fixture/ListProjectAssets.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/ListProjectAssets.yaml
@@ -0,0 +1,10 @@
+---
+method: GET
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/iotsitewise/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  iotsitewise.us-east-1.amazonaws.com
+  Content-Type:          application/x-www-form-urlencoded; charset=utf-8
+  X-Amz-Content-SHA256:  abcdef
+  X-Amz-Date:            20091028T223200Z
+body:
+  ''
diff --git a/fixture/ListProjectAssetsResponse.proto b/fixture/ListProjectAssetsResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/ListProjectAssetsResponse.proto
diff --git a/fixture/ListProjects.yaml b/fixture/ListProjects.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/ListProjects.yaml
@@ -0,0 +1,10 @@
+---
+method: GET
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/iotsitewise/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  iotsitewise.us-east-1.amazonaws.com
+  Content-Type:          application/x-www-form-urlencoded; charset=utf-8
+  X-Amz-Content-SHA256:  abcdef
+  X-Amz-Date:            20091028T223200Z
+body:
+  ''
diff --git a/fixture/ListProjectsResponse.proto b/fixture/ListProjectsResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/ListProjectsResponse.proto
diff --git a/fixture/ListTagsForResource.yaml b/fixture/ListTagsForResource.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/ListTagsForResource.yaml
@@ -0,0 +1,10 @@
+---
+method: GET
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/iotsitewise/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  iotsitewise.us-east-1.amazonaws.com
+  Content-Type:          application/x-www-form-urlencoded; charset=utf-8
+  X-Amz-Content-SHA256:  abcdef
+  X-Amz-Date:            20091028T223200Z
+body:
+  ''
diff --git a/fixture/ListTagsForResourceResponse.proto b/fixture/ListTagsForResourceResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/ListTagsForResourceResponse.proto
diff --git a/fixture/ListTimeSeries.yaml b/fixture/ListTimeSeries.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/ListTimeSeries.yaml
@@ -0,0 +1,10 @@
+---
+method: GET
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/iotsitewise/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  iotsitewise.us-east-1.amazonaws.com
+  Content-Type:          application/x-www-form-urlencoded; charset=utf-8
+  X-Amz-Content-SHA256:  abcdef
+  X-Amz-Date:            20091028T223200Z
+body:
+  ''
diff --git a/fixture/ListTimeSeriesResponse.proto b/fixture/ListTimeSeriesResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/ListTimeSeriesResponse.proto
diff --git a/fixture/PutDefaultEncryptionConfiguration.yaml b/fixture/PutDefaultEncryptionConfiguration.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/PutDefaultEncryptionConfiguration.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/iotsitewise/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  iotsitewise.us-east-1.amazonaws.com
+  Content-Type:          application/x-www-form-urlencoded; charset=utf-8
+  X-Amz-Content-SHA256:  abcdef
+  X-Amz-Date:            20091028T223200Z
+body:
+  ''
diff --git a/fixture/PutDefaultEncryptionConfigurationResponse.proto b/fixture/PutDefaultEncryptionConfigurationResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/PutDefaultEncryptionConfigurationResponse.proto
diff --git a/fixture/PutLoggingOptions.yaml b/fixture/PutLoggingOptions.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/PutLoggingOptions.yaml
@@ -0,0 +1,10 @@
+---
+method: PUT
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/iotsitewise/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  iotsitewise.us-east-1.amazonaws.com
+  Content-Type:          application/x-www-form-urlencoded; charset=utf-8
+  X-Amz-Content-SHA256:  abcdef
+  X-Amz-Date:            20091028T223200Z
+body:
+  ''
diff --git a/fixture/PutLoggingOptionsResponse.proto b/fixture/PutLoggingOptionsResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/PutLoggingOptionsResponse.proto
diff --git a/fixture/PutStorageConfiguration.yaml b/fixture/PutStorageConfiguration.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/PutStorageConfiguration.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/iotsitewise/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  iotsitewise.us-east-1.amazonaws.com
+  Content-Type:          application/x-www-form-urlencoded; charset=utf-8
+  X-Amz-Content-SHA256:  abcdef
+  X-Amz-Date:            20091028T223200Z
+body:
+  ''
diff --git a/fixture/PutStorageConfigurationResponse.proto b/fixture/PutStorageConfigurationResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/PutStorageConfigurationResponse.proto
diff --git a/fixture/TagResource.yaml b/fixture/TagResource.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/TagResource.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/iotsitewise/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  iotsitewise.us-east-1.amazonaws.com
+  Content-Type:          application/x-www-form-urlencoded; charset=utf-8
+  X-Amz-Content-SHA256:  abcdef
+  X-Amz-Date:            20091028T223200Z
+body:
+  ''
diff --git a/fixture/TagResourceResponse.proto b/fixture/TagResourceResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/TagResourceResponse.proto
diff --git a/fixture/UntagResource.yaml b/fixture/UntagResource.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/UntagResource.yaml
@@ -0,0 +1,10 @@
+---
+method: DELETE
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/iotsitewise/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  iotsitewise.us-east-1.amazonaws.com
+  Content-Type:          application/x-www-form-urlencoded; charset=utf-8
+  X-Amz-Content-SHA256:  abcdef
+  X-Amz-Date:            20091028T223200Z
+body:
+  ''
diff --git a/fixture/UntagResourceResponse.proto b/fixture/UntagResourceResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/UntagResourceResponse.proto
diff --git a/fixture/UpdateAccessPolicy.yaml b/fixture/UpdateAccessPolicy.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/UpdateAccessPolicy.yaml
@@ -0,0 +1,10 @@
+---
+method: PUT
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/iotsitewise/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  iotsitewise.us-east-1.amazonaws.com
+  Content-Type:          application/x-www-form-urlencoded; charset=utf-8
+  X-Amz-Content-SHA256:  abcdef
+  X-Amz-Date:            20091028T223200Z
+body:
+  ''
diff --git a/fixture/UpdateAccessPolicyResponse.proto b/fixture/UpdateAccessPolicyResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/UpdateAccessPolicyResponse.proto
diff --git a/fixture/UpdateAsset.yaml b/fixture/UpdateAsset.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/UpdateAsset.yaml
@@ -0,0 +1,10 @@
+---
+method: PUT
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/iotsitewise/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  iotsitewise.us-east-1.amazonaws.com
+  Content-Type:          application/x-www-form-urlencoded; charset=utf-8
+  X-Amz-Content-SHA256:  abcdef
+  X-Amz-Date:            20091028T223200Z
+body:
+  ''
diff --git a/fixture/UpdateAssetModel.yaml b/fixture/UpdateAssetModel.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/UpdateAssetModel.yaml
@@ -0,0 +1,10 @@
+---
+method: PUT
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/iotsitewise/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  iotsitewise.us-east-1.amazonaws.com
+  Content-Type:          application/x-www-form-urlencoded; charset=utf-8
+  X-Amz-Content-SHA256:  abcdef
+  X-Amz-Date:            20091028T223200Z
+body:
+  ''
diff --git a/fixture/UpdateAssetModelResponse.proto b/fixture/UpdateAssetModelResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/UpdateAssetModelResponse.proto
diff --git a/fixture/UpdateAssetProperty.yaml b/fixture/UpdateAssetProperty.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/UpdateAssetProperty.yaml
@@ -0,0 +1,10 @@
+---
+method: PUT
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/iotsitewise/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  iotsitewise.us-east-1.amazonaws.com
+  Content-Type:          application/x-www-form-urlencoded; charset=utf-8
+  X-Amz-Content-SHA256:  abcdef
+  X-Amz-Date:            20091028T223200Z
+body:
+  ''
diff --git a/fixture/UpdateAssetPropertyResponse.proto b/fixture/UpdateAssetPropertyResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/UpdateAssetPropertyResponse.proto
diff --git a/fixture/UpdateAssetResponse.proto b/fixture/UpdateAssetResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/UpdateAssetResponse.proto
diff --git a/fixture/UpdateDashboard.yaml b/fixture/UpdateDashboard.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/UpdateDashboard.yaml
@@ -0,0 +1,10 @@
+---
+method: PUT
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/iotsitewise/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  iotsitewise.us-east-1.amazonaws.com
+  Content-Type:          application/x-www-form-urlencoded; charset=utf-8
+  X-Amz-Content-SHA256:  abcdef
+  X-Amz-Date:            20091028T223200Z
+body:
+  ''
diff --git a/fixture/UpdateDashboardResponse.proto b/fixture/UpdateDashboardResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/UpdateDashboardResponse.proto
diff --git a/fixture/UpdateGateway.yaml b/fixture/UpdateGateway.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/UpdateGateway.yaml
@@ -0,0 +1,10 @@
+---
+method: PUT
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/iotsitewise/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  iotsitewise.us-east-1.amazonaws.com
+  Content-Type:          application/x-www-form-urlencoded; charset=utf-8
+  X-Amz-Content-SHA256:  abcdef
+  X-Amz-Date:            20091028T223200Z
+body:
+  ''
diff --git a/fixture/UpdateGatewayCapabilityConfiguration.yaml b/fixture/UpdateGatewayCapabilityConfiguration.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/UpdateGatewayCapabilityConfiguration.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/iotsitewise/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  iotsitewise.us-east-1.amazonaws.com
+  Content-Type:          application/x-www-form-urlencoded; charset=utf-8
+  X-Amz-Content-SHA256:  abcdef
+  X-Amz-Date:            20091028T223200Z
+body:
+  ''
diff --git a/fixture/UpdateGatewayCapabilityConfigurationResponse.proto b/fixture/UpdateGatewayCapabilityConfigurationResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/UpdateGatewayCapabilityConfigurationResponse.proto
diff --git a/fixture/UpdateGatewayResponse.proto b/fixture/UpdateGatewayResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/UpdateGatewayResponse.proto
diff --git a/fixture/UpdatePortal.yaml b/fixture/UpdatePortal.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/UpdatePortal.yaml
@@ -0,0 +1,10 @@
+---
+method: PUT
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/iotsitewise/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  iotsitewise.us-east-1.amazonaws.com
+  Content-Type:          application/x-www-form-urlencoded; charset=utf-8
+  X-Amz-Content-SHA256:  abcdef
+  X-Amz-Date:            20091028T223200Z
+body:
+  ''
diff --git a/fixture/UpdatePortalResponse.proto b/fixture/UpdatePortalResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/UpdatePortalResponse.proto
diff --git a/fixture/UpdateProject.yaml b/fixture/UpdateProject.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/UpdateProject.yaml
@@ -0,0 +1,10 @@
+---
+method: PUT
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/iotsitewise/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  iotsitewise.us-east-1.amazonaws.com
+  Content-Type:          application/x-www-form-urlencoded; charset=utf-8
+  X-Amz-Content-SHA256:  abcdef
+  X-Amz-Date:            20091028T223200Z
+body:
+  ''
diff --git a/fixture/UpdateProjectResponse.proto b/fixture/UpdateProjectResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/UpdateProjectResponse.proto
diff --git a/gen/Amazonka/IoTSiteWise.hs b/gen/Amazonka/IoTSiteWise.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/IoTSiteWise.hs
@@ -0,0 +1,1136 @@
+{-# OPTIONS_GHC -fno-warn-duplicate-exports #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+
+-- |
+-- Module      : Amazonka.IoTSiteWise
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Derived from API version @2019-12-02@ of the AWS service descriptions, licensed under Apache 2.0.
+--
+-- Welcome to the IoT SiteWise API Reference. IoT SiteWise is an Amazon Web
+-- Services service that connects
+-- <https://en.wikipedia.org/wiki/Internet_of_things#Industrial_applications Industrial Internet of Things (IIoT)>
+-- devices to the power of the Amazon Web Services Cloud. For more
+-- information, see the
+-- <https://docs.aws.amazon.com/iot-sitewise/latest/userguide/ IoT SiteWise User Guide>.
+-- For information about IoT SiteWise quotas, see
+-- <https://docs.aws.amazon.com/iot-sitewise/latest/userguide/quotas.html Quotas>
+-- in the /IoT SiteWise User Guide/.
+module Amazonka.IoTSiteWise
+  ( -- * Service Configuration
+    defaultService,
+
+    -- * Errors
+    -- $errors
+
+    -- ** ConflictingOperationException
+    _ConflictingOperationException,
+
+    -- ** InternalFailureException
+    _InternalFailureException,
+
+    -- ** InvalidRequestException
+    _InvalidRequestException,
+
+    -- ** LimitExceededException
+    _LimitExceededException,
+
+    -- ** ResourceAlreadyExistsException
+    _ResourceAlreadyExistsException,
+
+    -- ** ResourceNotFoundException
+    _ResourceNotFoundException,
+
+    -- ** ServiceUnavailableException
+    _ServiceUnavailableException,
+
+    -- ** ThrottlingException
+    _ThrottlingException,
+
+    -- ** TooManyTagsException
+    _TooManyTagsException,
+
+    -- ** UnauthorizedException
+    _UnauthorizedException,
+
+    -- * Waiters
+    -- $waiters
+
+    -- ** AssetActive
+    newAssetActive,
+
+    -- ** AssetModelActive
+    newAssetModelActive,
+
+    -- ** AssetModelNotExists
+    newAssetModelNotExists,
+
+    -- ** AssetNotExists
+    newAssetNotExists,
+
+    -- ** PortalActive
+    newPortalActive,
+
+    -- ** PortalNotExists
+    newPortalNotExists,
+
+    -- * Operations
+    -- $operations
+
+    -- ** AssociateAssets
+    AssociateAssets (AssociateAssets'),
+    newAssociateAssets,
+    AssociateAssetsResponse (AssociateAssetsResponse'),
+    newAssociateAssetsResponse,
+
+    -- ** AssociateTimeSeriesToAssetProperty
+    AssociateTimeSeriesToAssetProperty (AssociateTimeSeriesToAssetProperty'),
+    newAssociateTimeSeriesToAssetProperty,
+    AssociateTimeSeriesToAssetPropertyResponse (AssociateTimeSeriesToAssetPropertyResponse'),
+    newAssociateTimeSeriesToAssetPropertyResponse,
+
+    -- ** BatchAssociateProjectAssets
+    BatchAssociateProjectAssets (BatchAssociateProjectAssets'),
+    newBatchAssociateProjectAssets,
+    BatchAssociateProjectAssetsResponse (BatchAssociateProjectAssetsResponse'),
+    newBatchAssociateProjectAssetsResponse,
+
+    -- ** BatchDisassociateProjectAssets
+    BatchDisassociateProjectAssets (BatchDisassociateProjectAssets'),
+    newBatchDisassociateProjectAssets,
+    BatchDisassociateProjectAssetsResponse (BatchDisassociateProjectAssetsResponse'),
+    newBatchDisassociateProjectAssetsResponse,
+
+    -- ** BatchGetAssetPropertyAggregates
+    BatchGetAssetPropertyAggregates (BatchGetAssetPropertyAggregates'),
+    newBatchGetAssetPropertyAggregates,
+    BatchGetAssetPropertyAggregatesResponse (BatchGetAssetPropertyAggregatesResponse'),
+    newBatchGetAssetPropertyAggregatesResponse,
+
+    -- ** BatchGetAssetPropertyValue
+    BatchGetAssetPropertyValue (BatchGetAssetPropertyValue'),
+    newBatchGetAssetPropertyValue,
+    BatchGetAssetPropertyValueResponse (BatchGetAssetPropertyValueResponse'),
+    newBatchGetAssetPropertyValueResponse,
+
+    -- ** BatchGetAssetPropertyValueHistory
+    BatchGetAssetPropertyValueHistory (BatchGetAssetPropertyValueHistory'),
+    newBatchGetAssetPropertyValueHistory,
+    BatchGetAssetPropertyValueHistoryResponse (BatchGetAssetPropertyValueHistoryResponse'),
+    newBatchGetAssetPropertyValueHistoryResponse,
+
+    -- ** BatchPutAssetPropertyValue
+    BatchPutAssetPropertyValue (BatchPutAssetPropertyValue'),
+    newBatchPutAssetPropertyValue,
+    BatchPutAssetPropertyValueResponse (BatchPutAssetPropertyValueResponse'),
+    newBatchPutAssetPropertyValueResponse,
+
+    -- ** CreateAccessPolicy
+    CreateAccessPolicy (CreateAccessPolicy'),
+    newCreateAccessPolicy,
+    CreateAccessPolicyResponse (CreateAccessPolicyResponse'),
+    newCreateAccessPolicyResponse,
+
+    -- ** CreateAsset
+    CreateAsset (CreateAsset'),
+    newCreateAsset,
+    CreateAssetResponse (CreateAssetResponse'),
+    newCreateAssetResponse,
+
+    -- ** CreateAssetModel
+    CreateAssetModel (CreateAssetModel'),
+    newCreateAssetModel,
+    CreateAssetModelResponse (CreateAssetModelResponse'),
+    newCreateAssetModelResponse,
+
+    -- ** CreateBulkImportJob
+    CreateBulkImportJob (CreateBulkImportJob'),
+    newCreateBulkImportJob,
+    CreateBulkImportJobResponse (CreateBulkImportJobResponse'),
+    newCreateBulkImportJobResponse,
+
+    -- ** CreateDashboard
+    CreateDashboard (CreateDashboard'),
+    newCreateDashboard,
+    CreateDashboardResponse (CreateDashboardResponse'),
+    newCreateDashboardResponse,
+
+    -- ** CreateGateway
+    CreateGateway (CreateGateway'),
+    newCreateGateway,
+    CreateGatewayResponse (CreateGatewayResponse'),
+    newCreateGatewayResponse,
+
+    -- ** CreatePortal
+    CreatePortal (CreatePortal'),
+    newCreatePortal,
+    CreatePortalResponse (CreatePortalResponse'),
+    newCreatePortalResponse,
+
+    -- ** CreateProject
+    CreateProject (CreateProject'),
+    newCreateProject,
+    CreateProjectResponse (CreateProjectResponse'),
+    newCreateProjectResponse,
+
+    -- ** DeleteAccessPolicy
+    DeleteAccessPolicy (DeleteAccessPolicy'),
+    newDeleteAccessPolicy,
+    DeleteAccessPolicyResponse (DeleteAccessPolicyResponse'),
+    newDeleteAccessPolicyResponse,
+
+    -- ** DeleteAsset
+    DeleteAsset (DeleteAsset'),
+    newDeleteAsset,
+    DeleteAssetResponse (DeleteAssetResponse'),
+    newDeleteAssetResponse,
+
+    -- ** DeleteAssetModel
+    DeleteAssetModel (DeleteAssetModel'),
+    newDeleteAssetModel,
+    DeleteAssetModelResponse (DeleteAssetModelResponse'),
+    newDeleteAssetModelResponse,
+
+    -- ** DeleteDashboard
+    DeleteDashboard (DeleteDashboard'),
+    newDeleteDashboard,
+    DeleteDashboardResponse (DeleteDashboardResponse'),
+    newDeleteDashboardResponse,
+
+    -- ** DeleteGateway
+    DeleteGateway (DeleteGateway'),
+    newDeleteGateway,
+    DeleteGatewayResponse (DeleteGatewayResponse'),
+    newDeleteGatewayResponse,
+
+    -- ** DeletePortal
+    DeletePortal (DeletePortal'),
+    newDeletePortal,
+    DeletePortalResponse (DeletePortalResponse'),
+    newDeletePortalResponse,
+
+    -- ** DeleteProject
+    DeleteProject (DeleteProject'),
+    newDeleteProject,
+    DeleteProjectResponse (DeleteProjectResponse'),
+    newDeleteProjectResponse,
+
+    -- ** DeleteTimeSeries
+    DeleteTimeSeries (DeleteTimeSeries'),
+    newDeleteTimeSeries,
+    DeleteTimeSeriesResponse (DeleteTimeSeriesResponse'),
+    newDeleteTimeSeriesResponse,
+
+    -- ** DescribeAccessPolicy
+    DescribeAccessPolicy (DescribeAccessPolicy'),
+    newDescribeAccessPolicy,
+    DescribeAccessPolicyResponse (DescribeAccessPolicyResponse'),
+    newDescribeAccessPolicyResponse,
+
+    -- ** DescribeAsset
+    DescribeAsset (DescribeAsset'),
+    newDescribeAsset,
+    DescribeAssetResponse (DescribeAssetResponse'),
+    newDescribeAssetResponse,
+
+    -- ** DescribeAssetModel
+    DescribeAssetModel (DescribeAssetModel'),
+    newDescribeAssetModel,
+    DescribeAssetModelResponse (DescribeAssetModelResponse'),
+    newDescribeAssetModelResponse,
+
+    -- ** DescribeAssetProperty
+    DescribeAssetProperty (DescribeAssetProperty'),
+    newDescribeAssetProperty,
+    DescribeAssetPropertyResponse (DescribeAssetPropertyResponse'),
+    newDescribeAssetPropertyResponse,
+
+    -- ** DescribeBulkImportJob
+    DescribeBulkImportJob (DescribeBulkImportJob'),
+    newDescribeBulkImportJob,
+    DescribeBulkImportJobResponse (DescribeBulkImportJobResponse'),
+    newDescribeBulkImportJobResponse,
+
+    -- ** DescribeDashboard
+    DescribeDashboard (DescribeDashboard'),
+    newDescribeDashboard,
+    DescribeDashboardResponse (DescribeDashboardResponse'),
+    newDescribeDashboardResponse,
+
+    -- ** DescribeDefaultEncryptionConfiguration
+    DescribeDefaultEncryptionConfiguration (DescribeDefaultEncryptionConfiguration'),
+    newDescribeDefaultEncryptionConfiguration,
+    DescribeDefaultEncryptionConfigurationResponse (DescribeDefaultEncryptionConfigurationResponse'),
+    newDescribeDefaultEncryptionConfigurationResponse,
+
+    -- ** DescribeGateway
+    DescribeGateway (DescribeGateway'),
+    newDescribeGateway,
+    DescribeGatewayResponse (DescribeGatewayResponse'),
+    newDescribeGatewayResponse,
+
+    -- ** DescribeGatewayCapabilityConfiguration
+    DescribeGatewayCapabilityConfiguration (DescribeGatewayCapabilityConfiguration'),
+    newDescribeGatewayCapabilityConfiguration,
+    DescribeGatewayCapabilityConfigurationResponse (DescribeGatewayCapabilityConfigurationResponse'),
+    newDescribeGatewayCapabilityConfigurationResponse,
+
+    -- ** DescribeLoggingOptions
+    DescribeLoggingOptions (DescribeLoggingOptions'),
+    newDescribeLoggingOptions,
+    DescribeLoggingOptionsResponse (DescribeLoggingOptionsResponse'),
+    newDescribeLoggingOptionsResponse,
+
+    -- ** DescribePortal
+    DescribePortal (DescribePortal'),
+    newDescribePortal,
+    DescribePortalResponse (DescribePortalResponse'),
+    newDescribePortalResponse,
+
+    -- ** DescribeProject
+    DescribeProject (DescribeProject'),
+    newDescribeProject,
+    DescribeProjectResponse (DescribeProjectResponse'),
+    newDescribeProjectResponse,
+
+    -- ** DescribeStorageConfiguration
+    DescribeStorageConfiguration (DescribeStorageConfiguration'),
+    newDescribeStorageConfiguration,
+    DescribeStorageConfigurationResponse (DescribeStorageConfigurationResponse'),
+    newDescribeStorageConfigurationResponse,
+
+    -- ** DescribeTimeSeries
+    DescribeTimeSeries (DescribeTimeSeries'),
+    newDescribeTimeSeries,
+    DescribeTimeSeriesResponse (DescribeTimeSeriesResponse'),
+    newDescribeTimeSeriesResponse,
+
+    -- ** DisassociateAssets
+    DisassociateAssets (DisassociateAssets'),
+    newDisassociateAssets,
+    DisassociateAssetsResponse (DisassociateAssetsResponse'),
+    newDisassociateAssetsResponse,
+
+    -- ** DisassociateTimeSeriesFromAssetProperty
+    DisassociateTimeSeriesFromAssetProperty (DisassociateTimeSeriesFromAssetProperty'),
+    newDisassociateTimeSeriesFromAssetProperty,
+    DisassociateTimeSeriesFromAssetPropertyResponse (DisassociateTimeSeriesFromAssetPropertyResponse'),
+    newDisassociateTimeSeriesFromAssetPropertyResponse,
+
+    -- ** GetAssetPropertyAggregates (Paginated)
+    GetAssetPropertyAggregates (GetAssetPropertyAggregates'),
+    newGetAssetPropertyAggregates,
+    GetAssetPropertyAggregatesResponse (GetAssetPropertyAggregatesResponse'),
+    newGetAssetPropertyAggregatesResponse,
+
+    -- ** GetAssetPropertyValue
+    GetAssetPropertyValue (GetAssetPropertyValue'),
+    newGetAssetPropertyValue,
+    GetAssetPropertyValueResponse (GetAssetPropertyValueResponse'),
+    newGetAssetPropertyValueResponse,
+
+    -- ** GetAssetPropertyValueHistory (Paginated)
+    GetAssetPropertyValueHistory (GetAssetPropertyValueHistory'),
+    newGetAssetPropertyValueHistory,
+    GetAssetPropertyValueHistoryResponse (GetAssetPropertyValueHistoryResponse'),
+    newGetAssetPropertyValueHistoryResponse,
+
+    -- ** GetInterpolatedAssetPropertyValues (Paginated)
+    GetInterpolatedAssetPropertyValues (GetInterpolatedAssetPropertyValues'),
+    newGetInterpolatedAssetPropertyValues,
+    GetInterpolatedAssetPropertyValuesResponse (GetInterpolatedAssetPropertyValuesResponse'),
+    newGetInterpolatedAssetPropertyValuesResponse,
+
+    -- ** ListAccessPolicies (Paginated)
+    ListAccessPolicies (ListAccessPolicies'),
+    newListAccessPolicies,
+    ListAccessPoliciesResponse (ListAccessPoliciesResponse'),
+    newListAccessPoliciesResponse,
+
+    -- ** ListAssetModelProperties (Paginated)
+    ListAssetModelProperties (ListAssetModelProperties'),
+    newListAssetModelProperties,
+    ListAssetModelPropertiesResponse (ListAssetModelPropertiesResponse'),
+    newListAssetModelPropertiesResponse,
+
+    -- ** ListAssetModels (Paginated)
+    ListAssetModels (ListAssetModels'),
+    newListAssetModels,
+    ListAssetModelsResponse (ListAssetModelsResponse'),
+    newListAssetModelsResponse,
+
+    -- ** ListAssetProperties (Paginated)
+    ListAssetProperties (ListAssetProperties'),
+    newListAssetProperties,
+    ListAssetPropertiesResponse (ListAssetPropertiesResponse'),
+    newListAssetPropertiesResponse,
+
+    -- ** ListAssetRelationships (Paginated)
+    ListAssetRelationships (ListAssetRelationships'),
+    newListAssetRelationships,
+    ListAssetRelationshipsResponse (ListAssetRelationshipsResponse'),
+    newListAssetRelationshipsResponse,
+
+    -- ** ListAssets (Paginated)
+    ListAssets (ListAssets'),
+    newListAssets,
+    ListAssetsResponse (ListAssetsResponse'),
+    newListAssetsResponse,
+
+    -- ** ListAssociatedAssets (Paginated)
+    ListAssociatedAssets (ListAssociatedAssets'),
+    newListAssociatedAssets,
+    ListAssociatedAssetsResponse (ListAssociatedAssetsResponse'),
+    newListAssociatedAssetsResponse,
+
+    -- ** ListBulkImportJobs (Paginated)
+    ListBulkImportJobs (ListBulkImportJobs'),
+    newListBulkImportJobs,
+    ListBulkImportJobsResponse (ListBulkImportJobsResponse'),
+    newListBulkImportJobsResponse,
+
+    -- ** ListDashboards (Paginated)
+    ListDashboards (ListDashboards'),
+    newListDashboards,
+    ListDashboardsResponse (ListDashboardsResponse'),
+    newListDashboardsResponse,
+
+    -- ** ListGateways (Paginated)
+    ListGateways (ListGateways'),
+    newListGateways,
+    ListGatewaysResponse (ListGatewaysResponse'),
+    newListGatewaysResponse,
+
+    -- ** ListPortals (Paginated)
+    ListPortals (ListPortals'),
+    newListPortals,
+    ListPortalsResponse (ListPortalsResponse'),
+    newListPortalsResponse,
+
+    -- ** ListProjectAssets (Paginated)
+    ListProjectAssets (ListProjectAssets'),
+    newListProjectAssets,
+    ListProjectAssetsResponse (ListProjectAssetsResponse'),
+    newListProjectAssetsResponse,
+
+    -- ** ListProjects (Paginated)
+    ListProjects (ListProjects'),
+    newListProjects,
+    ListProjectsResponse (ListProjectsResponse'),
+    newListProjectsResponse,
+
+    -- ** ListTagsForResource
+    ListTagsForResource (ListTagsForResource'),
+    newListTagsForResource,
+    ListTagsForResourceResponse (ListTagsForResourceResponse'),
+    newListTagsForResourceResponse,
+
+    -- ** ListTimeSeries (Paginated)
+    ListTimeSeries (ListTimeSeries'),
+    newListTimeSeries,
+    ListTimeSeriesResponse (ListTimeSeriesResponse'),
+    newListTimeSeriesResponse,
+
+    -- ** PutDefaultEncryptionConfiguration
+    PutDefaultEncryptionConfiguration (PutDefaultEncryptionConfiguration'),
+    newPutDefaultEncryptionConfiguration,
+    PutDefaultEncryptionConfigurationResponse (PutDefaultEncryptionConfigurationResponse'),
+    newPutDefaultEncryptionConfigurationResponse,
+
+    -- ** PutLoggingOptions
+    PutLoggingOptions (PutLoggingOptions'),
+    newPutLoggingOptions,
+    PutLoggingOptionsResponse (PutLoggingOptionsResponse'),
+    newPutLoggingOptionsResponse,
+
+    -- ** PutStorageConfiguration
+    PutStorageConfiguration (PutStorageConfiguration'),
+    newPutStorageConfiguration,
+    PutStorageConfigurationResponse (PutStorageConfigurationResponse'),
+    newPutStorageConfigurationResponse,
+
+    -- ** TagResource
+    TagResource (TagResource'),
+    newTagResource,
+    TagResourceResponse (TagResourceResponse'),
+    newTagResourceResponse,
+
+    -- ** UntagResource
+    UntagResource (UntagResource'),
+    newUntagResource,
+    UntagResourceResponse (UntagResourceResponse'),
+    newUntagResourceResponse,
+
+    -- ** UpdateAccessPolicy
+    UpdateAccessPolicy (UpdateAccessPolicy'),
+    newUpdateAccessPolicy,
+    UpdateAccessPolicyResponse (UpdateAccessPolicyResponse'),
+    newUpdateAccessPolicyResponse,
+
+    -- ** UpdateAsset
+    UpdateAsset (UpdateAsset'),
+    newUpdateAsset,
+    UpdateAssetResponse (UpdateAssetResponse'),
+    newUpdateAssetResponse,
+
+    -- ** UpdateAssetModel
+    UpdateAssetModel (UpdateAssetModel'),
+    newUpdateAssetModel,
+    UpdateAssetModelResponse (UpdateAssetModelResponse'),
+    newUpdateAssetModelResponse,
+
+    -- ** UpdateAssetProperty
+    UpdateAssetProperty (UpdateAssetProperty'),
+    newUpdateAssetProperty,
+    UpdateAssetPropertyResponse (UpdateAssetPropertyResponse'),
+    newUpdateAssetPropertyResponse,
+
+    -- ** UpdateDashboard
+    UpdateDashboard (UpdateDashboard'),
+    newUpdateDashboard,
+    UpdateDashboardResponse (UpdateDashboardResponse'),
+    newUpdateDashboardResponse,
+
+    -- ** UpdateGateway
+    UpdateGateway (UpdateGateway'),
+    newUpdateGateway,
+    UpdateGatewayResponse (UpdateGatewayResponse'),
+    newUpdateGatewayResponse,
+
+    -- ** UpdateGatewayCapabilityConfiguration
+    UpdateGatewayCapabilityConfiguration (UpdateGatewayCapabilityConfiguration'),
+    newUpdateGatewayCapabilityConfiguration,
+    UpdateGatewayCapabilityConfigurationResponse (UpdateGatewayCapabilityConfigurationResponse'),
+    newUpdateGatewayCapabilityConfigurationResponse,
+
+    -- ** UpdatePortal
+    UpdatePortal (UpdatePortal'),
+    newUpdatePortal,
+    UpdatePortalResponse (UpdatePortalResponse'),
+    newUpdatePortalResponse,
+
+    -- ** UpdateProject
+    UpdateProject (UpdateProject'),
+    newUpdateProject,
+    UpdateProjectResponse (UpdateProjectResponse'),
+    newUpdateProjectResponse,
+
+    -- * Types
+
+    -- ** AggregateType
+    AggregateType (..),
+
+    -- ** AssetErrorCode
+    AssetErrorCode (..),
+
+    -- ** AssetModelState
+    AssetModelState (..),
+
+    -- ** AssetRelationshipType
+    AssetRelationshipType (..),
+
+    -- ** AssetState
+    AssetState (..),
+
+    -- ** AuthMode
+    AuthMode (..),
+
+    -- ** BatchEntryCompletionStatus
+    BatchEntryCompletionStatus (..),
+
+    -- ** BatchGetAssetPropertyAggregatesErrorCode
+    BatchGetAssetPropertyAggregatesErrorCode (..),
+
+    -- ** BatchGetAssetPropertyValueErrorCode
+    BatchGetAssetPropertyValueErrorCode (..),
+
+    -- ** BatchGetAssetPropertyValueHistoryErrorCode
+    BatchGetAssetPropertyValueHistoryErrorCode (..),
+
+    -- ** BatchPutAssetPropertyValueErrorCode
+    BatchPutAssetPropertyValueErrorCode (..),
+
+    -- ** CapabilitySyncStatus
+    CapabilitySyncStatus (..),
+
+    -- ** ColumnName
+    ColumnName (..),
+
+    -- ** ComputeLocation
+    ComputeLocation (..),
+
+    -- ** ConfigurationState
+    ConfigurationState (..),
+
+    -- ** DetailedErrorCode
+    DetailedErrorCode (..),
+
+    -- ** DisassociatedDataStorageState
+    DisassociatedDataStorageState (..),
+
+    -- ** EncryptionType
+    EncryptionType (..),
+
+    -- ** ErrorCode
+    ErrorCode (..),
+
+    -- ** ForwardingConfigState
+    ForwardingConfigState (..),
+
+    -- ** IdentityType
+    IdentityType (..),
+
+    -- ** ImageFileType
+    ImageFileType (..),
+
+    -- ** JobStatus
+    JobStatus (..),
+
+    -- ** ListAssetModelPropertiesFilter
+    ListAssetModelPropertiesFilter (..),
+
+    -- ** ListAssetPropertiesFilter
+    ListAssetPropertiesFilter (..),
+
+    -- ** ListAssetsFilter
+    ListAssetsFilter (..),
+
+    -- ** ListBulkImportJobsFilter
+    ListBulkImportJobsFilter (..),
+
+    -- ** ListTimeSeriesType
+    ListTimeSeriesType (..),
+
+    -- ** LoggingLevel
+    LoggingLevel (..),
+
+    -- ** MonitorErrorCode
+    MonitorErrorCode (..),
+
+    -- ** Permission
+    Permission (..),
+
+    -- ** PortalState
+    PortalState (..),
+
+    -- ** PropertyDataType
+    PropertyDataType (..),
+
+    -- ** PropertyNotificationState
+    PropertyNotificationState (..),
+
+    -- ** Quality
+    Quality (..),
+
+    -- ** ResourceType
+    ResourceType (..),
+
+    -- ** StorageType
+    StorageType (..),
+
+    -- ** TimeOrdering
+    TimeOrdering (..),
+
+    -- ** TraversalDirection
+    TraversalDirection (..),
+
+    -- ** TraversalType
+    TraversalType (..),
+
+    -- ** AccessPolicySummary
+    AccessPolicySummary (AccessPolicySummary'),
+    newAccessPolicySummary,
+
+    -- ** AggregatedValue
+    AggregatedValue (AggregatedValue'),
+    newAggregatedValue,
+
+    -- ** Aggregates
+    Aggregates (Aggregates'),
+    newAggregates,
+
+    -- ** Alarms
+    Alarms (Alarms'),
+    newAlarms,
+
+    -- ** AssetCompositeModel
+    AssetCompositeModel (AssetCompositeModel'),
+    newAssetCompositeModel,
+
+    -- ** AssetErrorDetails
+    AssetErrorDetails (AssetErrorDetails'),
+    newAssetErrorDetails,
+
+    -- ** AssetHierarchy
+    AssetHierarchy (AssetHierarchy'),
+    newAssetHierarchy,
+
+    -- ** AssetHierarchyInfo
+    AssetHierarchyInfo (AssetHierarchyInfo'),
+    newAssetHierarchyInfo,
+
+    -- ** AssetModelCompositeModel
+    AssetModelCompositeModel (AssetModelCompositeModel'),
+    newAssetModelCompositeModel,
+
+    -- ** AssetModelCompositeModelDefinition
+    AssetModelCompositeModelDefinition (AssetModelCompositeModelDefinition'),
+    newAssetModelCompositeModelDefinition,
+
+    -- ** AssetModelHierarchy
+    AssetModelHierarchy (AssetModelHierarchy'),
+    newAssetModelHierarchy,
+
+    -- ** AssetModelHierarchyDefinition
+    AssetModelHierarchyDefinition (AssetModelHierarchyDefinition'),
+    newAssetModelHierarchyDefinition,
+
+    -- ** AssetModelProperty
+    AssetModelProperty (AssetModelProperty'),
+    newAssetModelProperty,
+
+    -- ** AssetModelPropertyDefinition
+    AssetModelPropertyDefinition (AssetModelPropertyDefinition'),
+    newAssetModelPropertyDefinition,
+
+    -- ** AssetModelPropertySummary
+    AssetModelPropertySummary (AssetModelPropertySummary'),
+    newAssetModelPropertySummary,
+
+    -- ** AssetModelStatus
+    AssetModelStatus (AssetModelStatus'),
+    newAssetModelStatus,
+
+    -- ** AssetModelSummary
+    AssetModelSummary (AssetModelSummary'),
+    newAssetModelSummary,
+
+    -- ** AssetProperty
+    AssetProperty (AssetProperty'),
+    newAssetProperty,
+
+    -- ** AssetPropertySummary
+    AssetPropertySummary (AssetPropertySummary'),
+    newAssetPropertySummary,
+
+    -- ** AssetPropertyValue
+    AssetPropertyValue (AssetPropertyValue'),
+    newAssetPropertyValue,
+
+    -- ** AssetRelationshipSummary
+    AssetRelationshipSummary (AssetRelationshipSummary'),
+    newAssetRelationshipSummary,
+
+    -- ** AssetStatus
+    AssetStatus (AssetStatus'),
+    newAssetStatus,
+
+    -- ** AssetSummary
+    AssetSummary (AssetSummary'),
+    newAssetSummary,
+
+    -- ** AssociatedAssetsSummary
+    AssociatedAssetsSummary (AssociatedAssetsSummary'),
+    newAssociatedAssetsSummary,
+
+    -- ** Attribute
+    Attribute (Attribute'),
+    newAttribute,
+
+    -- ** BatchGetAssetPropertyAggregatesEntry
+    BatchGetAssetPropertyAggregatesEntry (BatchGetAssetPropertyAggregatesEntry'),
+    newBatchGetAssetPropertyAggregatesEntry,
+
+    -- ** BatchGetAssetPropertyAggregatesErrorEntry
+    BatchGetAssetPropertyAggregatesErrorEntry (BatchGetAssetPropertyAggregatesErrorEntry'),
+    newBatchGetAssetPropertyAggregatesErrorEntry,
+
+    -- ** BatchGetAssetPropertyAggregatesErrorInfo
+    BatchGetAssetPropertyAggregatesErrorInfo (BatchGetAssetPropertyAggregatesErrorInfo'),
+    newBatchGetAssetPropertyAggregatesErrorInfo,
+
+    -- ** BatchGetAssetPropertyAggregatesSkippedEntry
+    BatchGetAssetPropertyAggregatesSkippedEntry (BatchGetAssetPropertyAggregatesSkippedEntry'),
+    newBatchGetAssetPropertyAggregatesSkippedEntry,
+
+    -- ** BatchGetAssetPropertyAggregatesSuccessEntry
+    BatchGetAssetPropertyAggregatesSuccessEntry (BatchGetAssetPropertyAggregatesSuccessEntry'),
+    newBatchGetAssetPropertyAggregatesSuccessEntry,
+
+    -- ** BatchGetAssetPropertyValueEntry
+    BatchGetAssetPropertyValueEntry (BatchGetAssetPropertyValueEntry'),
+    newBatchGetAssetPropertyValueEntry,
+
+    -- ** BatchGetAssetPropertyValueErrorEntry
+    BatchGetAssetPropertyValueErrorEntry (BatchGetAssetPropertyValueErrorEntry'),
+    newBatchGetAssetPropertyValueErrorEntry,
+
+    -- ** BatchGetAssetPropertyValueErrorInfo
+    BatchGetAssetPropertyValueErrorInfo (BatchGetAssetPropertyValueErrorInfo'),
+    newBatchGetAssetPropertyValueErrorInfo,
+
+    -- ** BatchGetAssetPropertyValueHistoryEntry
+    BatchGetAssetPropertyValueHistoryEntry (BatchGetAssetPropertyValueHistoryEntry'),
+    newBatchGetAssetPropertyValueHistoryEntry,
+
+    -- ** BatchGetAssetPropertyValueHistoryErrorEntry
+    BatchGetAssetPropertyValueHistoryErrorEntry (BatchGetAssetPropertyValueHistoryErrorEntry'),
+    newBatchGetAssetPropertyValueHistoryErrorEntry,
+
+    -- ** BatchGetAssetPropertyValueHistoryErrorInfo
+    BatchGetAssetPropertyValueHistoryErrorInfo (BatchGetAssetPropertyValueHistoryErrorInfo'),
+    newBatchGetAssetPropertyValueHistoryErrorInfo,
+
+    -- ** BatchGetAssetPropertyValueHistorySkippedEntry
+    BatchGetAssetPropertyValueHistorySkippedEntry (BatchGetAssetPropertyValueHistorySkippedEntry'),
+    newBatchGetAssetPropertyValueHistorySkippedEntry,
+
+    -- ** BatchGetAssetPropertyValueHistorySuccessEntry
+    BatchGetAssetPropertyValueHistorySuccessEntry (BatchGetAssetPropertyValueHistorySuccessEntry'),
+    newBatchGetAssetPropertyValueHistorySuccessEntry,
+
+    -- ** BatchGetAssetPropertyValueSkippedEntry
+    BatchGetAssetPropertyValueSkippedEntry (BatchGetAssetPropertyValueSkippedEntry'),
+    newBatchGetAssetPropertyValueSkippedEntry,
+
+    -- ** BatchGetAssetPropertyValueSuccessEntry
+    BatchGetAssetPropertyValueSuccessEntry (BatchGetAssetPropertyValueSuccessEntry'),
+    newBatchGetAssetPropertyValueSuccessEntry,
+
+    -- ** BatchPutAssetPropertyError
+    BatchPutAssetPropertyError (BatchPutAssetPropertyError'),
+    newBatchPutAssetPropertyError,
+
+    -- ** BatchPutAssetPropertyErrorEntry
+    BatchPutAssetPropertyErrorEntry (BatchPutAssetPropertyErrorEntry'),
+    newBatchPutAssetPropertyErrorEntry,
+
+    -- ** CompositeModelProperty
+    CompositeModelProperty (CompositeModelProperty'),
+    newCompositeModelProperty,
+
+    -- ** ConfigurationErrorDetails
+    ConfigurationErrorDetails (ConfigurationErrorDetails'),
+    newConfigurationErrorDetails,
+
+    -- ** ConfigurationStatus
+    ConfigurationStatus (ConfigurationStatus'),
+    newConfigurationStatus,
+
+    -- ** Csv
+    Csv (Csv'),
+    newCsv,
+
+    -- ** CustomerManagedS3Storage
+    CustomerManagedS3Storage (CustomerManagedS3Storage'),
+    newCustomerManagedS3Storage,
+
+    -- ** DashboardSummary
+    DashboardSummary (DashboardSummary'),
+    newDashboardSummary,
+
+    -- ** DetailedError
+    DetailedError (DetailedError'),
+    newDetailedError,
+
+    -- ** ErrorDetails
+    ErrorDetails (ErrorDetails'),
+    newErrorDetails,
+
+    -- ** ErrorReportLocation
+    ErrorReportLocation (ErrorReportLocation'),
+    newErrorReportLocation,
+
+    -- ** ExpressionVariable
+    ExpressionVariable (ExpressionVariable'),
+    newExpressionVariable,
+
+    -- ** File
+    File (File'),
+    newFile,
+
+    -- ** FileFormat
+    FileFormat (FileFormat'),
+    newFileFormat,
+
+    -- ** ForwardingConfig
+    ForwardingConfig (ForwardingConfig'),
+    newForwardingConfig,
+
+    -- ** GatewayCapabilitySummary
+    GatewayCapabilitySummary (GatewayCapabilitySummary'),
+    newGatewayCapabilitySummary,
+
+    -- ** GatewayPlatform
+    GatewayPlatform (GatewayPlatform'),
+    newGatewayPlatform,
+
+    -- ** GatewaySummary
+    GatewaySummary (GatewaySummary'),
+    newGatewaySummary,
+
+    -- ** Greengrass
+    Greengrass (Greengrass'),
+    newGreengrass,
+
+    -- ** GreengrassV2
+    GreengrassV2 (GreengrassV2'),
+    newGreengrassV2,
+
+    -- ** GroupIdentity
+    GroupIdentity (GroupIdentity'),
+    newGroupIdentity,
+
+    -- ** IAMRoleIdentity
+    IAMRoleIdentity (IAMRoleIdentity'),
+    newIAMRoleIdentity,
+
+    -- ** IAMUserIdentity
+    IAMUserIdentity (IAMUserIdentity'),
+    newIAMUserIdentity,
+
+    -- ** Identity
+    Identity (Identity'),
+    newIdentity,
+
+    -- ** Image
+    Image (Image'),
+    newImage,
+
+    -- ** ImageFile
+    ImageFile (ImageFile'),
+    newImageFile,
+
+    -- ** ImageLocation
+    ImageLocation (ImageLocation'),
+    newImageLocation,
+
+    -- ** InterpolatedAssetPropertyValue
+    InterpolatedAssetPropertyValue (InterpolatedAssetPropertyValue'),
+    newInterpolatedAssetPropertyValue,
+
+    -- ** JobConfiguration
+    JobConfiguration (JobConfiguration'),
+    newJobConfiguration,
+
+    -- ** JobSummary
+    JobSummary (JobSummary'),
+    newJobSummary,
+
+    -- ** LoggingOptions
+    LoggingOptions (LoggingOptions'),
+    newLoggingOptions,
+
+    -- ** Measurement
+    Measurement (Measurement'),
+    newMeasurement,
+
+    -- ** MeasurementProcessingConfig
+    MeasurementProcessingConfig (MeasurementProcessingConfig'),
+    newMeasurementProcessingConfig,
+
+    -- ** Metric
+    Metric (Metric'),
+    newMetric,
+
+    -- ** MetricProcessingConfig
+    MetricProcessingConfig (MetricProcessingConfig'),
+    newMetricProcessingConfig,
+
+    -- ** MetricWindow
+    MetricWindow (MetricWindow'),
+    newMetricWindow,
+
+    -- ** MonitorErrorDetails
+    MonitorErrorDetails (MonitorErrorDetails'),
+    newMonitorErrorDetails,
+
+    -- ** MultiLayerStorage
+    MultiLayerStorage (MultiLayerStorage'),
+    newMultiLayerStorage,
+
+    -- ** PortalResource
+    PortalResource (PortalResource'),
+    newPortalResource,
+
+    -- ** PortalStatus
+    PortalStatus (PortalStatus'),
+    newPortalStatus,
+
+    -- ** PortalSummary
+    PortalSummary (PortalSummary'),
+    newPortalSummary,
+
+    -- ** ProjectResource
+    ProjectResource (ProjectResource'),
+    newProjectResource,
+
+    -- ** ProjectSummary
+    ProjectSummary (ProjectSummary'),
+    newProjectSummary,
+
+    -- ** Property
+    Property (Property'),
+    newProperty,
+
+    -- ** PropertyNotification
+    PropertyNotification (PropertyNotification'),
+    newPropertyNotification,
+
+    -- ** PropertyType
+    PropertyType (PropertyType'),
+    newPropertyType,
+
+    -- ** PutAssetPropertyValueEntry
+    PutAssetPropertyValueEntry (PutAssetPropertyValueEntry'),
+    newPutAssetPropertyValueEntry,
+
+    -- ** Resource
+    Resource (Resource'),
+    newResource,
+
+    -- ** RetentionPeriod
+    RetentionPeriod (RetentionPeriod'),
+    newRetentionPeriod,
+
+    -- ** TimeInNanos
+    TimeInNanos (TimeInNanos'),
+    newTimeInNanos,
+
+    -- ** TimeSeriesSummary
+    TimeSeriesSummary (TimeSeriesSummary'),
+    newTimeSeriesSummary,
+
+    -- ** Transform
+    Transform (Transform'),
+    newTransform,
+
+    -- ** TransformProcessingConfig
+    TransformProcessingConfig (TransformProcessingConfig'),
+    newTransformProcessingConfig,
+
+    -- ** TumblingWindow
+    TumblingWindow (TumblingWindow'),
+    newTumblingWindow,
+
+    -- ** UserIdentity
+    UserIdentity (UserIdentity'),
+    newUserIdentity,
+
+    -- ** VariableValue
+    VariableValue (VariableValue'),
+    newVariableValue,
+
+    -- ** Variant
+    Variant (Variant'),
+    newVariant,
+  )
+where
+
+import Amazonka.IoTSiteWise.AssociateAssets
+import Amazonka.IoTSiteWise.AssociateTimeSeriesToAssetProperty
+import Amazonka.IoTSiteWise.BatchAssociateProjectAssets
+import Amazonka.IoTSiteWise.BatchDisassociateProjectAssets
+import Amazonka.IoTSiteWise.BatchGetAssetPropertyAggregates
+import Amazonka.IoTSiteWise.BatchGetAssetPropertyValue
+import Amazonka.IoTSiteWise.BatchGetAssetPropertyValueHistory
+import Amazonka.IoTSiteWise.BatchPutAssetPropertyValue
+import Amazonka.IoTSiteWise.CreateAccessPolicy
+import Amazonka.IoTSiteWise.CreateAsset
+import Amazonka.IoTSiteWise.CreateAssetModel
+import Amazonka.IoTSiteWise.CreateBulkImportJob
+import Amazonka.IoTSiteWise.CreateDashboard
+import Amazonka.IoTSiteWise.CreateGateway
+import Amazonka.IoTSiteWise.CreatePortal
+import Amazonka.IoTSiteWise.CreateProject
+import Amazonka.IoTSiteWise.DeleteAccessPolicy
+import Amazonka.IoTSiteWise.DeleteAsset
+import Amazonka.IoTSiteWise.DeleteAssetModel
+import Amazonka.IoTSiteWise.DeleteDashboard
+import Amazonka.IoTSiteWise.DeleteGateway
+import Amazonka.IoTSiteWise.DeletePortal
+import Amazonka.IoTSiteWise.DeleteProject
+import Amazonka.IoTSiteWise.DeleteTimeSeries
+import Amazonka.IoTSiteWise.DescribeAccessPolicy
+import Amazonka.IoTSiteWise.DescribeAsset
+import Amazonka.IoTSiteWise.DescribeAssetModel
+import Amazonka.IoTSiteWise.DescribeAssetProperty
+import Amazonka.IoTSiteWise.DescribeBulkImportJob
+import Amazonka.IoTSiteWise.DescribeDashboard
+import Amazonka.IoTSiteWise.DescribeDefaultEncryptionConfiguration
+import Amazonka.IoTSiteWise.DescribeGateway
+import Amazonka.IoTSiteWise.DescribeGatewayCapabilityConfiguration
+import Amazonka.IoTSiteWise.DescribeLoggingOptions
+import Amazonka.IoTSiteWise.DescribePortal
+import Amazonka.IoTSiteWise.DescribeProject
+import Amazonka.IoTSiteWise.DescribeStorageConfiguration
+import Amazonka.IoTSiteWise.DescribeTimeSeries
+import Amazonka.IoTSiteWise.DisassociateAssets
+import Amazonka.IoTSiteWise.DisassociateTimeSeriesFromAssetProperty
+import Amazonka.IoTSiteWise.GetAssetPropertyAggregates
+import Amazonka.IoTSiteWise.GetAssetPropertyValue
+import Amazonka.IoTSiteWise.GetAssetPropertyValueHistory
+import Amazonka.IoTSiteWise.GetInterpolatedAssetPropertyValues
+import Amazonka.IoTSiteWise.Lens
+import Amazonka.IoTSiteWise.ListAccessPolicies
+import Amazonka.IoTSiteWise.ListAssetModelProperties
+import Amazonka.IoTSiteWise.ListAssetModels
+import Amazonka.IoTSiteWise.ListAssetProperties
+import Amazonka.IoTSiteWise.ListAssetRelationships
+import Amazonka.IoTSiteWise.ListAssets
+import Amazonka.IoTSiteWise.ListAssociatedAssets
+import Amazonka.IoTSiteWise.ListBulkImportJobs
+import Amazonka.IoTSiteWise.ListDashboards
+import Amazonka.IoTSiteWise.ListGateways
+import Amazonka.IoTSiteWise.ListPortals
+import Amazonka.IoTSiteWise.ListProjectAssets
+import Amazonka.IoTSiteWise.ListProjects
+import Amazonka.IoTSiteWise.ListTagsForResource
+import Amazonka.IoTSiteWise.ListTimeSeries
+import Amazonka.IoTSiteWise.PutDefaultEncryptionConfiguration
+import Amazonka.IoTSiteWise.PutLoggingOptions
+import Amazonka.IoTSiteWise.PutStorageConfiguration
+import Amazonka.IoTSiteWise.TagResource
+import Amazonka.IoTSiteWise.Types
+import Amazonka.IoTSiteWise.UntagResource
+import Amazonka.IoTSiteWise.UpdateAccessPolicy
+import Amazonka.IoTSiteWise.UpdateAsset
+import Amazonka.IoTSiteWise.UpdateAssetModel
+import Amazonka.IoTSiteWise.UpdateAssetProperty
+import Amazonka.IoTSiteWise.UpdateDashboard
+import Amazonka.IoTSiteWise.UpdateGateway
+import Amazonka.IoTSiteWise.UpdateGatewayCapabilityConfiguration
+import Amazonka.IoTSiteWise.UpdatePortal
+import Amazonka.IoTSiteWise.UpdateProject
+import Amazonka.IoTSiteWise.Waiters
+
+-- $errors
+-- Error matchers are designed for use with the functions provided by
+-- <http://hackage.haskell.org/package/lens/docs/Control-Exception-Lens.html Control.Exception.Lens>.
+-- This allows catching (and rethrowing) service specific errors returned
+-- by 'IoTSiteWise'.
+
+-- $operations
+-- Some AWS operations return results that are incomplete and require subsequent
+-- requests in order to obtain the entire result set. The process of sending
+-- subsequent requests to continue where a previous request left off is called
+-- pagination. For example, the 'ListObjects' operation of Amazon S3 returns up to
+-- 1000 objects at a time, and you must send subsequent requests with the
+-- appropriate Marker in order to retrieve the next page of results.
+--
+-- Operations that have an 'AWSPager' instance can transparently perform subsequent
+-- requests, correctly setting Markers and other request facets to iterate through
+-- the entire result set of a truncated API operation. Operations which support
+-- this have an additional note in the documentation.
+--
+-- Many operations have the ability to filter results on the server side. See the
+-- individual operation parameters for details.
+
+-- $waiters
+-- Waiters poll by repeatedly sending a request until some remote success condition
+-- configured by the 'Wait' specification is fulfilled. The 'Wait' specification
+-- determines how many attempts should be made, in addition to delay and retry strategies.
diff --git a/gen/Amazonka/IoTSiteWise/AssociateAssets.hs b/gen/Amazonka/IoTSiteWise/AssociateAssets.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/IoTSiteWise/AssociateAssets.hs
@@ -0,0 +1,201 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.IoTSiteWise.AssociateAssets
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Associates a child asset with the given parent asset through a hierarchy
+-- defined in the parent asset\'s model. For more information, see
+-- <https://docs.aws.amazon.com/iot-sitewise/latest/userguide/add-associated-assets.html Associating assets>
+-- in the /IoT SiteWise User Guide/.
+module Amazonka.IoTSiteWise.AssociateAssets
+  ( -- * Creating a Request
+    AssociateAssets (..),
+    newAssociateAssets,
+
+    -- * Request Lenses
+    associateAssets_clientToken,
+    associateAssets_assetId,
+    associateAssets_hierarchyId,
+    associateAssets_childAssetId,
+
+    -- * Destructuring the Response
+    AssociateAssetsResponse (..),
+    newAssociateAssetsResponse,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.IoTSiteWise.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newAssociateAssets' smart constructor.
+data AssociateAssets = AssociateAssets'
+  { -- | A unique case-sensitive identifier that you can provide to ensure the
+    -- idempotency of the request. Don\'t reuse this client token if a new
+    -- idempotent request is required.
+    clientToken :: Prelude.Maybe Prelude.Text,
+    -- | The ID of the parent asset.
+    assetId :: Prelude.Text,
+    -- | The ID of a hierarchy in the parent asset\'s model. Hierarchies allow
+    -- different groupings of assets to be formed that all come from the same
+    -- asset model. For more information, see
+    -- <https://docs.aws.amazon.com/iot-sitewise/latest/userguide/asset-hierarchies.html Asset hierarchies>
+    -- in the /IoT SiteWise User Guide/.
+    hierarchyId :: Prelude.Text,
+    -- | The ID of the child asset to be associated.
+    childAssetId :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'AssociateAssets' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'clientToken', 'associateAssets_clientToken' - A unique case-sensitive identifier that you can provide to ensure the
+-- idempotency of the request. Don\'t reuse this client token if a new
+-- idempotent request is required.
+--
+-- 'assetId', 'associateAssets_assetId' - The ID of the parent asset.
+--
+-- 'hierarchyId', 'associateAssets_hierarchyId' - The ID of a hierarchy in the parent asset\'s model. Hierarchies allow
+-- different groupings of assets to be formed that all come from the same
+-- asset model. For more information, see
+-- <https://docs.aws.amazon.com/iot-sitewise/latest/userguide/asset-hierarchies.html Asset hierarchies>
+-- in the /IoT SiteWise User Guide/.
+--
+-- 'childAssetId', 'associateAssets_childAssetId' - The ID of the child asset to be associated.
+newAssociateAssets ::
+  -- | 'assetId'
+  Prelude.Text ->
+  -- | 'hierarchyId'
+  Prelude.Text ->
+  -- | 'childAssetId'
+  Prelude.Text ->
+  AssociateAssets
+newAssociateAssets
+  pAssetId_
+  pHierarchyId_
+  pChildAssetId_ =
+    AssociateAssets'
+      { clientToken = Prelude.Nothing,
+        assetId = pAssetId_,
+        hierarchyId = pHierarchyId_,
+        childAssetId = pChildAssetId_
+      }
+
+-- | A unique case-sensitive identifier that you can provide to ensure the
+-- idempotency of the request. Don\'t reuse this client token if a new
+-- idempotent request is required.
+associateAssets_clientToken :: Lens.Lens' AssociateAssets (Prelude.Maybe Prelude.Text)
+associateAssets_clientToken = Lens.lens (\AssociateAssets' {clientToken} -> clientToken) (\s@AssociateAssets' {} a -> s {clientToken = a} :: AssociateAssets)
+
+-- | The ID of the parent asset.
+associateAssets_assetId :: Lens.Lens' AssociateAssets Prelude.Text
+associateAssets_assetId = Lens.lens (\AssociateAssets' {assetId} -> assetId) (\s@AssociateAssets' {} a -> s {assetId = a} :: AssociateAssets)
+
+-- | The ID of a hierarchy in the parent asset\'s model. Hierarchies allow
+-- different groupings of assets to be formed that all come from the same
+-- asset model. For more information, see
+-- <https://docs.aws.amazon.com/iot-sitewise/latest/userguide/asset-hierarchies.html Asset hierarchies>
+-- in the /IoT SiteWise User Guide/.
+associateAssets_hierarchyId :: Lens.Lens' AssociateAssets Prelude.Text
+associateAssets_hierarchyId = Lens.lens (\AssociateAssets' {hierarchyId} -> hierarchyId) (\s@AssociateAssets' {} a -> s {hierarchyId = a} :: AssociateAssets)
+
+-- | The ID of the child asset to be associated.
+associateAssets_childAssetId :: Lens.Lens' AssociateAssets Prelude.Text
+associateAssets_childAssetId = Lens.lens (\AssociateAssets' {childAssetId} -> childAssetId) (\s@AssociateAssets' {} a -> s {childAssetId = a} :: AssociateAssets)
+
+instance Core.AWSRequest AssociateAssets where
+  type
+    AWSResponse AssociateAssets =
+      AssociateAssetsResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveNull AssociateAssetsResponse'
+
+instance Prelude.Hashable AssociateAssets where
+  hashWithSalt _salt AssociateAssets' {..} =
+    _salt
+      `Prelude.hashWithSalt` clientToken
+      `Prelude.hashWithSalt` assetId
+      `Prelude.hashWithSalt` hierarchyId
+      `Prelude.hashWithSalt` childAssetId
+
+instance Prelude.NFData AssociateAssets where
+  rnf AssociateAssets' {..} =
+    Prelude.rnf clientToken
+      `Prelude.seq` Prelude.rnf assetId
+      `Prelude.seq` Prelude.rnf hierarchyId
+      `Prelude.seq` Prelude.rnf childAssetId
+
+instance Data.ToHeaders AssociateAssets where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON AssociateAssets where
+  toJSON AssociateAssets' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("clientToken" Data..=) Prelude.<$> clientToken,
+            Prelude.Just ("hierarchyId" Data..= hierarchyId),
+            Prelude.Just ("childAssetId" Data..= childAssetId)
+          ]
+      )
+
+instance Data.ToPath AssociateAssets where
+  toPath AssociateAssets' {..} =
+    Prelude.mconcat
+      ["/assets/", Data.toBS assetId, "/associate"]
+
+instance Data.ToQuery AssociateAssets where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newAssociateAssetsResponse' smart constructor.
+data AssociateAssetsResponse = AssociateAssetsResponse'
+  {
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'AssociateAssetsResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+newAssociateAssetsResponse ::
+  AssociateAssetsResponse
+newAssociateAssetsResponse = AssociateAssetsResponse'
+
+instance Prelude.NFData AssociateAssetsResponse where
+  rnf _ = ()
diff --git a/gen/Amazonka/IoTSiteWise/AssociateTimeSeriesToAssetProperty.hs b/gen/Amazonka/IoTSiteWise/AssociateTimeSeriesToAssetProperty.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/IoTSiteWise/AssociateTimeSeriesToAssetProperty.hs
@@ -0,0 +1,215 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.IoTSiteWise.AssociateTimeSeriesToAssetProperty
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Associates a time series (data stream) with an asset property.
+module Amazonka.IoTSiteWise.AssociateTimeSeriesToAssetProperty
+  ( -- * Creating a Request
+    AssociateTimeSeriesToAssetProperty (..),
+    newAssociateTimeSeriesToAssetProperty,
+
+    -- * Request Lenses
+    associateTimeSeriesToAssetProperty_clientToken,
+    associateTimeSeriesToAssetProperty_alias,
+    associateTimeSeriesToAssetProperty_assetId,
+    associateTimeSeriesToAssetProperty_propertyId,
+
+    -- * Destructuring the Response
+    AssociateTimeSeriesToAssetPropertyResponse (..),
+    newAssociateTimeSeriesToAssetPropertyResponse,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.IoTSiteWise.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newAssociateTimeSeriesToAssetProperty' smart constructor.
+data AssociateTimeSeriesToAssetProperty = AssociateTimeSeriesToAssetProperty'
+  { -- | A unique case-sensitive identifier that you can provide to ensure the
+    -- idempotency of the request. Don\'t reuse this client token if a new
+    -- idempotent request is required.
+    clientToken :: Prelude.Maybe Prelude.Text,
+    -- | The alias that identifies the time series.
+    alias :: Prelude.Text,
+    -- | The ID of the asset in which the asset property was created.
+    assetId :: Prelude.Text,
+    -- | The ID of the asset property.
+    propertyId :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'AssociateTimeSeriesToAssetProperty' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'clientToken', 'associateTimeSeriesToAssetProperty_clientToken' - A unique case-sensitive identifier that you can provide to ensure the
+-- idempotency of the request. Don\'t reuse this client token if a new
+-- idempotent request is required.
+--
+-- 'alias', 'associateTimeSeriesToAssetProperty_alias' - The alias that identifies the time series.
+--
+-- 'assetId', 'associateTimeSeriesToAssetProperty_assetId' - The ID of the asset in which the asset property was created.
+--
+-- 'propertyId', 'associateTimeSeriesToAssetProperty_propertyId' - The ID of the asset property.
+newAssociateTimeSeriesToAssetProperty ::
+  -- | 'alias'
+  Prelude.Text ->
+  -- | 'assetId'
+  Prelude.Text ->
+  -- | 'propertyId'
+  Prelude.Text ->
+  AssociateTimeSeriesToAssetProperty
+newAssociateTimeSeriesToAssetProperty
+  pAlias_
+  pAssetId_
+  pPropertyId_ =
+    AssociateTimeSeriesToAssetProperty'
+      { clientToken =
+          Prelude.Nothing,
+        alias = pAlias_,
+        assetId = pAssetId_,
+        propertyId = pPropertyId_
+      }
+
+-- | A unique case-sensitive identifier that you can provide to ensure the
+-- idempotency of the request. Don\'t reuse this client token if a new
+-- idempotent request is required.
+associateTimeSeriesToAssetProperty_clientToken :: Lens.Lens' AssociateTimeSeriesToAssetProperty (Prelude.Maybe Prelude.Text)
+associateTimeSeriesToAssetProperty_clientToken = Lens.lens (\AssociateTimeSeriesToAssetProperty' {clientToken} -> clientToken) (\s@AssociateTimeSeriesToAssetProperty' {} a -> s {clientToken = a} :: AssociateTimeSeriesToAssetProperty)
+
+-- | The alias that identifies the time series.
+associateTimeSeriesToAssetProperty_alias :: Lens.Lens' AssociateTimeSeriesToAssetProperty Prelude.Text
+associateTimeSeriesToAssetProperty_alias = Lens.lens (\AssociateTimeSeriesToAssetProperty' {alias} -> alias) (\s@AssociateTimeSeriesToAssetProperty' {} a -> s {alias = a} :: AssociateTimeSeriesToAssetProperty)
+
+-- | The ID of the asset in which the asset property was created.
+associateTimeSeriesToAssetProperty_assetId :: Lens.Lens' AssociateTimeSeriesToAssetProperty Prelude.Text
+associateTimeSeriesToAssetProperty_assetId = Lens.lens (\AssociateTimeSeriesToAssetProperty' {assetId} -> assetId) (\s@AssociateTimeSeriesToAssetProperty' {} a -> s {assetId = a} :: AssociateTimeSeriesToAssetProperty)
+
+-- | The ID of the asset property.
+associateTimeSeriesToAssetProperty_propertyId :: Lens.Lens' AssociateTimeSeriesToAssetProperty Prelude.Text
+associateTimeSeriesToAssetProperty_propertyId = Lens.lens (\AssociateTimeSeriesToAssetProperty' {propertyId} -> propertyId) (\s@AssociateTimeSeriesToAssetProperty' {} a -> s {propertyId = a} :: AssociateTimeSeriesToAssetProperty)
+
+instance
+  Core.AWSRequest
+    AssociateTimeSeriesToAssetProperty
+  where
+  type
+    AWSResponse AssociateTimeSeriesToAssetProperty =
+      AssociateTimeSeriesToAssetPropertyResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveNull
+      AssociateTimeSeriesToAssetPropertyResponse'
+
+instance
+  Prelude.Hashable
+    AssociateTimeSeriesToAssetProperty
+  where
+  hashWithSalt
+    _salt
+    AssociateTimeSeriesToAssetProperty' {..} =
+      _salt
+        `Prelude.hashWithSalt` clientToken
+        `Prelude.hashWithSalt` alias
+        `Prelude.hashWithSalt` assetId
+        `Prelude.hashWithSalt` propertyId
+
+instance
+  Prelude.NFData
+    AssociateTimeSeriesToAssetProperty
+  where
+  rnf AssociateTimeSeriesToAssetProperty' {..} =
+    Prelude.rnf clientToken
+      `Prelude.seq` Prelude.rnf alias
+      `Prelude.seq` Prelude.rnf assetId
+      `Prelude.seq` Prelude.rnf propertyId
+
+instance
+  Data.ToHeaders
+    AssociateTimeSeriesToAssetProperty
+  where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance
+  Data.ToJSON
+    AssociateTimeSeriesToAssetProperty
+  where
+  toJSON AssociateTimeSeriesToAssetProperty' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [("clientToken" Data..=) Prelude.<$> clientToken]
+      )
+
+instance
+  Data.ToPath
+    AssociateTimeSeriesToAssetProperty
+  where
+  toPath = Prelude.const "/timeseries/associate/"
+
+instance
+  Data.ToQuery
+    AssociateTimeSeriesToAssetProperty
+  where
+  toQuery AssociateTimeSeriesToAssetProperty' {..} =
+    Prelude.mconcat
+      [ "alias" Data.=: alias,
+        "assetId" Data.=: assetId,
+        "propertyId" Data.=: propertyId
+      ]
+
+-- | /See:/ 'newAssociateTimeSeriesToAssetPropertyResponse' smart constructor.
+data AssociateTimeSeriesToAssetPropertyResponse = AssociateTimeSeriesToAssetPropertyResponse'
+  {
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'AssociateTimeSeriesToAssetPropertyResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+newAssociateTimeSeriesToAssetPropertyResponse ::
+  AssociateTimeSeriesToAssetPropertyResponse
+newAssociateTimeSeriesToAssetPropertyResponse =
+  AssociateTimeSeriesToAssetPropertyResponse'
+
+instance
+  Prelude.NFData
+    AssociateTimeSeriesToAssetPropertyResponse
+  where
+  rnf _ = ()
diff --git a/gen/Amazonka/IoTSiteWise/BatchAssociateProjectAssets.hs b/gen/Amazonka/IoTSiteWise/BatchAssociateProjectAssets.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/IoTSiteWise/BatchAssociateProjectAssets.hs
@@ -0,0 +1,212 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.IoTSiteWise.BatchAssociateProjectAssets
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Associates a group (batch) of assets with an IoT SiteWise Monitor
+-- project.
+module Amazonka.IoTSiteWise.BatchAssociateProjectAssets
+  ( -- * Creating a Request
+    BatchAssociateProjectAssets (..),
+    newBatchAssociateProjectAssets,
+
+    -- * Request Lenses
+    batchAssociateProjectAssets_clientToken,
+    batchAssociateProjectAssets_projectId,
+    batchAssociateProjectAssets_assetIds,
+
+    -- * Destructuring the Response
+    BatchAssociateProjectAssetsResponse (..),
+    newBatchAssociateProjectAssetsResponse,
+
+    -- * Response Lenses
+    batchAssociateProjectAssetsResponse_errors,
+    batchAssociateProjectAssetsResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.IoTSiteWise.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newBatchAssociateProjectAssets' smart constructor.
+data BatchAssociateProjectAssets = BatchAssociateProjectAssets'
+  { -- | A unique case-sensitive identifier that you can provide to ensure the
+    -- idempotency of the request. Don\'t reuse this client token if a new
+    -- idempotent request is required.
+    clientToken :: Prelude.Maybe Prelude.Text,
+    -- | The ID of the project to which to associate the assets.
+    projectId :: Prelude.Text,
+    -- | The IDs of the assets to be associated to the project.
+    assetIds :: Prelude.NonEmpty Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'BatchAssociateProjectAssets' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'clientToken', 'batchAssociateProjectAssets_clientToken' - A unique case-sensitive identifier that you can provide to ensure the
+-- idempotency of the request. Don\'t reuse this client token if a new
+-- idempotent request is required.
+--
+-- 'projectId', 'batchAssociateProjectAssets_projectId' - The ID of the project to which to associate the assets.
+--
+-- 'assetIds', 'batchAssociateProjectAssets_assetIds' - The IDs of the assets to be associated to the project.
+newBatchAssociateProjectAssets ::
+  -- | 'projectId'
+  Prelude.Text ->
+  -- | 'assetIds'
+  Prelude.NonEmpty Prelude.Text ->
+  BatchAssociateProjectAssets
+newBatchAssociateProjectAssets pProjectId_ pAssetIds_ =
+  BatchAssociateProjectAssets'
+    { clientToken =
+        Prelude.Nothing,
+      projectId = pProjectId_,
+      assetIds = Lens.coerced Lens.# pAssetIds_
+    }
+
+-- | A unique case-sensitive identifier that you can provide to ensure the
+-- idempotency of the request. Don\'t reuse this client token if a new
+-- idempotent request is required.
+batchAssociateProjectAssets_clientToken :: Lens.Lens' BatchAssociateProjectAssets (Prelude.Maybe Prelude.Text)
+batchAssociateProjectAssets_clientToken = Lens.lens (\BatchAssociateProjectAssets' {clientToken} -> clientToken) (\s@BatchAssociateProjectAssets' {} a -> s {clientToken = a} :: BatchAssociateProjectAssets)
+
+-- | The ID of the project to which to associate the assets.
+batchAssociateProjectAssets_projectId :: Lens.Lens' BatchAssociateProjectAssets Prelude.Text
+batchAssociateProjectAssets_projectId = Lens.lens (\BatchAssociateProjectAssets' {projectId} -> projectId) (\s@BatchAssociateProjectAssets' {} a -> s {projectId = a} :: BatchAssociateProjectAssets)
+
+-- | The IDs of the assets to be associated to the project.
+batchAssociateProjectAssets_assetIds :: Lens.Lens' BatchAssociateProjectAssets (Prelude.NonEmpty Prelude.Text)
+batchAssociateProjectAssets_assetIds = Lens.lens (\BatchAssociateProjectAssets' {assetIds} -> assetIds) (\s@BatchAssociateProjectAssets' {} a -> s {assetIds = a} :: BatchAssociateProjectAssets) Prelude.. Lens.coerced
+
+instance Core.AWSRequest BatchAssociateProjectAssets where
+  type
+    AWSResponse BatchAssociateProjectAssets =
+      BatchAssociateProjectAssetsResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          BatchAssociateProjectAssetsResponse'
+            Prelude.<$> (x Data..?> "errors" Core..!@ Prelude.mempty)
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable BatchAssociateProjectAssets where
+  hashWithSalt _salt BatchAssociateProjectAssets' {..} =
+    _salt
+      `Prelude.hashWithSalt` clientToken
+      `Prelude.hashWithSalt` projectId
+      `Prelude.hashWithSalt` assetIds
+
+instance Prelude.NFData BatchAssociateProjectAssets where
+  rnf BatchAssociateProjectAssets' {..} =
+    Prelude.rnf clientToken
+      `Prelude.seq` Prelude.rnf projectId
+      `Prelude.seq` Prelude.rnf assetIds
+
+instance Data.ToHeaders BatchAssociateProjectAssets where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON BatchAssociateProjectAssets where
+  toJSON BatchAssociateProjectAssets' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("clientToken" Data..=) Prelude.<$> clientToken,
+            Prelude.Just ("assetIds" Data..= assetIds)
+          ]
+      )
+
+instance Data.ToPath BatchAssociateProjectAssets where
+  toPath BatchAssociateProjectAssets' {..} =
+    Prelude.mconcat
+      [ "/projects/",
+        Data.toBS projectId,
+        "/assets/associate"
+      ]
+
+instance Data.ToQuery BatchAssociateProjectAssets where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newBatchAssociateProjectAssetsResponse' smart constructor.
+data BatchAssociateProjectAssetsResponse = BatchAssociateProjectAssetsResponse'
+  { -- | A list of associated error information, if any.
+    errors :: Prelude.Maybe [AssetErrorDetails],
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'BatchAssociateProjectAssetsResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'errors', 'batchAssociateProjectAssetsResponse_errors' - A list of associated error information, if any.
+--
+-- 'httpStatus', 'batchAssociateProjectAssetsResponse_httpStatus' - The response's http status code.
+newBatchAssociateProjectAssetsResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  BatchAssociateProjectAssetsResponse
+newBatchAssociateProjectAssetsResponse pHttpStatus_ =
+  BatchAssociateProjectAssetsResponse'
+    { errors =
+        Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | A list of associated error information, if any.
+batchAssociateProjectAssetsResponse_errors :: Lens.Lens' BatchAssociateProjectAssetsResponse (Prelude.Maybe [AssetErrorDetails])
+batchAssociateProjectAssetsResponse_errors = Lens.lens (\BatchAssociateProjectAssetsResponse' {errors} -> errors) (\s@BatchAssociateProjectAssetsResponse' {} a -> s {errors = a} :: BatchAssociateProjectAssetsResponse) Prelude.. Lens.mapping Lens.coerced
+
+-- | The response's http status code.
+batchAssociateProjectAssetsResponse_httpStatus :: Lens.Lens' BatchAssociateProjectAssetsResponse Prelude.Int
+batchAssociateProjectAssetsResponse_httpStatus = Lens.lens (\BatchAssociateProjectAssetsResponse' {httpStatus} -> httpStatus) (\s@BatchAssociateProjectAssetsResponse' {} a -> s {httpStatus = a} :: BatchAssociateProjectAssetsResponse)
+
+instance
+  Prelude.NFData
+    BatchAssociateProjectAssetsResponse
+  where
+  rnf BatchAssociateProjectAssetsResponse' {..} =
+    Prelude.rnf errors
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/IoTSiteWise/BatchDisassociateProjectAssets.hs b/gen/Amazonka/IoTSiteWise/BatchDisassociateProjectAssets.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/IoTSiteWise/BatchDisassociateProjectAssets.hs
@@ -0,0 +1,229 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.IoTSiteWise.BatchDisassociateProjectAssets
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Disassociates a group (batch) of assets from an IoT SiteWise Monitor
+-- project.
+module Amazonka.IoTSiteWise.BatchDisassociateProjectAssets
+  ( -- * Creating a Request
+    BatchDisassociateProjectAssets (..),
+    newBatchDisassociateProjectAssets,
+
+    -- * Request Lenses
+    batchDisassociateProjectAssets_clientToken,
+    batchDisassociateProjectAssets_projectId,
+    batchDisassociateProjectAssets_assetIds,
+
+    -- * Destructuring the Response
+    BatchDisassociateProjectAssetsResponse (..),
+    newBatchDisassociateProjectAssetsResponse,
+
+    -- * Response Lenses
+    batchDisassociateProjectAssetsResponse_errors,
+    batchDisassociateProjectAssetsResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.IoTSiteWise.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newBatchDisassociateProjectAssets' smart constructor.
+data BatchDisassociateProjectAssets = BatchDisassociateProjectAssets'
+  { -- | A unique case-sensitive identifier that you can provide to ensure the
+    -- idempotency of the request. Don\'t reuse this client token if a new
+    -- idempotent request is required.
+    clientToken :: Prelude.Maybe Prelude.Text,
+    -- | The ID of the project from which to disassociate the assets.
+    projectId :: Prelude.Text,
+    -- | The IDs of the assets to be disassociated from the project.
+    assetIds :: Prelude.NonEmpty Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'BatchDisassociateProjectAssets' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'clientToken', 'batchDisassociateProjectAssets_clientToken' - A unique case-sensitive identifier that you can provide to ensure the
+-- idempotency of the request. Don\'t reuse this client token if a new
+-- idempotent request is required.
+--
+-- 'projectId', 'batchDisassociateProjectAssets_projectId' - The ID of the project from which to disassociate the assets.
+--
+-- 'assetIds', 'batchDisassociateProjectAssets_assetIds' - The IDs of the assets to be disassociated from the project.
+newBatchDisassociateProjectAssets ::
+  -- | 'projectId'
+  Prelude.Text ->
+  -- | 'assetIds'
+  Prelude.NonEmpty Prelude.Text ->
+  BatchDisassociateProjectAssets
+newBatchDisassociateProjectAssets
+  pProjectId_
+  pAssetIds_ =
+    BatchDisassociateProjectAssets'
+      { clientToken =
+          Prelude.Nothing,
+        projectId = pProjectId_,
+        assetIds = Lens.coerced Lens.# pAssetIds_
+      }
+
+-- | A unique case-sensitive identifier that you can provide to ensure the
+-- idempotency of the request. Don\'t reuse this client token if a new
+-- idempotent request is required.
+batchDisassociateProjectAssets_clientToken :: Lens.Lens' BatchDisassociateProjectAssets (Prelude.Maybe Prelude.Text)
+batchDisassociateProjectAssets_clientToken = Lens.lens (\BatchDisassociateProjectAssets' {clientToken} -> clientToken) (\s@BatchDisassociateProjectAssets' {} a -> s {clientToken = a} :: BatchDisassociateProjectAssets)
+
+-- | The ID of the project from which to disassociate the assets.
+batchDisassociateProjectAssets_projectId :: Lens.Lens' BatchDisassociateProjectAssets Prelude.Text
+batchDisassociateProjectAssets_projectId = Lens.lens (\BatchDisassociateProjectAssets' {projectId} -> projectId) (\s@BatchDisassociateProjectAssets' {} a -> s {projectId = a} :: BatchDisassociateProjectAssets)
+
+-- | The IDs of the assets to be disassociated from the project.
+batchDisassociateProjectAssets_assetIds :: Lens.Lens' BatchDisassociateProjectAssets (Prelude.NonEmpty Prelude.Text)
+batchDisassociateProjectAssets_assetIds = Lens.lens (\BatchDisassociateProjectAssets' {assetIds} -> assetIds) (\s@BatchDisassociateProjectAssets' {} a -> s {assetIds = a} :: BatchDisassociateProjectAssets) Prelude.. Lens.coerced
+
+instance
+  Core.AWSRequest
+    BatchDisassociateProjectAssets
+  where
+  type
+    AWSResponse BatchDisassociateProjectAssets =
+      BatchDisassociateProjectAssetsResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          BatchDisassociateProjectAssetsResponse'
+            Prelude.<$> (x Data..?> "errors" Core..!@ Prelude.mempty)
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance
+  Prelude.Hashable
+    BatchDisassociateProjectAssets
+  where
+  hashWithSalt
+    _salt
+    BatchDisassociateProjectAssets' {..} =
+      _salt
+        `Prelude.hashWithSalt` clientToken
+        `Prelude.hashWithSalt` projectId
+        `Prelude.hashWithSalt` assetIds
+
+instance
+  Prelude.NFData
+    BatchDisassociateProjectAssets
+  where
+  rnf BatchDisassociateProjectAssets' {..} =
+    Prelude.rnf clientToken
+      `Prelude.seq` Prelude.rnf projectId
+      `Prelude.seq` Prelude.rnf assetIds
+
+instance
+  Data.ToHeaders
+    BatchDisassociateProjectAssets
+  where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON BatchDisassociateProjectAssets where
+  toJSON BatchDisassociateProjectAssets' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("clientToken" Data..=) Prelude.<$> clientToken,
+            Prelude.Just ("assetIds" Data..= assetIds)
+          ]
+      )
+
+instance Data.ToPath BatchDisassociateProjectAssets where
+  toPath BatchDisassociateProjectAssets' {..} =
+    Prelude.mconcat
+      [ "/projects/",
+        Data.toBS projectId,
+        "/assets/disassociate"
+      ]
+
+instance Data.ToQuery BatchDisassociateProjectAssets where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newBatchDisassociateProjectAssetsResponse' smart constructor.
+data BatchDisassociateProjectAssetsResponse = BatchDisassociateProjectAssetsResponse'
+  { -- | A list of associated error information, if any.
+    errors :: Prelude.Maybe [AssetErrorDetails],
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'BatchDisassociateProjectAssetsResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'errors', 'batchDisassociateProjectAssetsResponse_errors' - A list of associated error information, if any.
+--
+-- 'httpStatus', 'batchDisassociateProjectAssetsResponse_httpStatus' - The response's http status code.
+newBatchDisassociateProjectAssetsResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  BatchDisassociateProjectAssetsResponse
+newBatchDisassociateProjectAssetsResponse
+  pHttpStatus_ =
+    BatchDisassociateProjectAssetsResponse'
+      { errors =
+          Prelude.Nothing,
+        httpStatus = pHttpStatus_
+      }
+
+-- | A list of associated error information, if any.
+batchDisassociateProjectAssetsResponse_errors :: Lens.Lens' BatchDisassociateProjectAssetsResponse (Prelude.Maybe [AssetErrorDetails])
+batchDisassociateProjectAssetsResponse_errors = Lens.lens (\BatchDisassociateProjectAssetsResponse' {errors} -> errors) (\s@BatchDisassociateProjectAssetsResponse' {} a -> s {errors = a} :: BatchDisassociateProjectAssetsResponse) Prelude.. Lens.mapping Lens.coerced
+
+-- | The response's http status code.
+batchDisassociateProjectAssetsResponse_httpStatus :: Lens.Lens' BatchDisassociateProjectAssetsResponse Prelude.Int
+batchDisassociateProjectAssetsResponse_httpStatus = Lens.lens (\BatchDisassociateProjectAssetsResponse' {httpStatus} -> httpStatus) (\s@BatchDisassociateProjectAssetsResponse' {} a -> s {httpStatus = a} :: BatchDisassociateProjectAssetsResponse)
+
+instance
+  Prelude.NFData
+    BatchDisassociateProjectAssetsResponse
+  where
+  rnf BatchDisassociateProjectAssetsResponse' {..} =
+    Prelude.rnf errors
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/IoTSiteWise/BatchGetAssetPropertyAggregates.hs b/gen/Amazonka/IoTSiteWise/BatchGetAssetPropertyAggregates.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/IoTSiteWise/BatchGetAssetPropertyAggregates.hs
@@ -0,0 +1,296 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.IoTSiteWise.BatchGetAssetPropertyAggregates
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Gets aggregated values (for example, average, minimum, and maximum) for
+-- one or more asset properties. For more information, see
+-- <https://docs.aws.amazon.com/iot-sitewise/latest/userguide/query-industrial-data.html#aggregates Querying aggregates>
+-- in the /IoT SiteWise User Guide/.
+module Amazonka.IoTSiteWise.BatchGetAssetPropertyAggregates
+  ( -- * Creating a Request
+    BatchGetAssetPropertyAggregates (..),
+    newBatchGetAssetPropertyAggregates,
+
+    -- * Request Lenses
+    batchGetAssetPropertyAggregates_maxResults,
+    batchGetAssetPropertyAggregates_nextToken,
+    batchGetAssetPropertyAggregates_entries,
+
+    -- * Destructuring the Response
+    BatchGetAssetPropertyAggregatesResponse (..),
+    newBatchGetAssetPropertyAggregatesResponse,
+
+    -- * Response Lenses
+    batchGetAssetPropertyAggregatesResponse_nextToken,
+    batchGetAssetPropertyAggregatesResponse_httpStatus,
+    batchGetAssetPropertyAggregatesResponse_errorEntries,
+    batchGetAssetPropertyAggregatesResponse_successEntries,
+    batchGetAssetPropertyAggregatesResponse_skippedEntries,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.IoTSiteWise.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newBatchGetAssetPropertyAggregates' smart constructor.
+data BatchGetAssetPropertyAggregates = BatchGetAssetPropertyAggregates'
+  { -- | The maximum number of results to return for each paginated request. A
+    -- result set is returned in the two cases, whichever occurs first.
+    --
+    -- -   The size of the result set is less than 1 MB.
+    --
+    -- -   The number of data points in the result set is less than the value
+    --     of @maxResults@. The maximum value of @maxResults@ is 4000.
+    maxResults :: Prelude.Maybe Prelude.Natural,
+    -- | The token to be used for the next set of paginated results.
+    nextToken :: Prelude.Maybe Prelude.Text,
+    -- | The list of asset property aggregate entries for the batch get request.
+    -- You can specify up to 16 entries per request.
+    entries :: [BatchGetAssetPropertyAggregatesEntry]
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'BatchGetAssetPropertyAggregates' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'maxResults', 'batchGetAssetPropertyAggregates_maxResults' - The maximum number of results to return for each paginated request. A
+-- result set is returned in the two cases, whichever occurs first.
+--
+-- -   The size of the result set is less than 1 MB.
+--
+-- -   The number of data points in the result set is less than the value
+--     of @maxResults@. The maximum value of @maxResults@ is 4000.
+--
+-- 'nextToken', 'batchGetAssetPropertyAggregates_nextToken' - The token to be used for the next set of paginated results.
+--
+-- 'entries', 'batchGetAssetPropertyAggregates_entries' - The list of asset property aggregate entries for the batch get request.
+-- You can specify up to 16 entries per request.
+newBatchGetAssetPropertyAggregates ::
+  BatchGetAssetPropertyAggregates
+newBatchGetAssetPropertyAggregates =
+  BatchGetAssetPropertyAggregates'
+    { maxResults =
+        Prelude.Nothing,
+      nextToken = Prelude.Nothing,
+      entries = Prelude.mempty
+    }
+
+-- | The maximum number of results to return for each paginated request. A
+-- result set is returned in the two cases, whichever occurs first.
+--
+-- -   The size of the result set is less than 1 MB.
+--
+-- -   The number of data points in the result set is less than the value
+--     of @maxResults@. The maximum value of @maxResults@ is 4000.
+batchGetAssetPropertyAggregates_maxResults :: Lens.Lens' BatchGetAssetPropertyAggregates (Prelude.Maybe Prelude.Natural)
+batchGetAssetPropertyAggregates_maxResults = Lens.lens (\BatchGetAssetPropertyAggregates' {maxResults} -> maxResults) (\s@BatchGetAssetPropertyAggregates' {} a -> s {maxResults = a} :: BatchGetAssetPropertyAggregates)
+
+-- | The token to be used for the next set of paginated results.
+batchGetAssetPropertyAggregates_nextToken :: Lens.Lens' BatchGetAssetPropertyAggregates (Prelude.Maybe Prelude.Text)
+batchGetAssetPropertyAggregates_nextToken = Lens.lens (\BatchGetAssetPropertyAggregates' {nextToken} -> nextToken) (\s@BatchGetAssetPropertyAggregates' {} a -> s {nextToken = a} :: BatchGetAssetPropertyAggregates)
+
+-- | The list of asset property aggregate entries for the batch get request.
+-- You can specify up to 16 entries per request.
+batchGetAssetPropertyAggregates_entries :: Lens.Lens' BatchGetAssetPropertyAggregates [BatchGetAssetPropertyAggregatesEntry]
+batchGetAssetPropertyAggregates_entries = Lens.lens (\BatchGetAssetPropertyAggregates' {entries} -> entries) (\s@BatchGetAssetPropertyAggregates' {} a -> s {entries = a} :: BatchGetAssetPropertyAggregates) Prelude.. Lens.coerced
+
+instance
+  Core.AWSRequest
+    BatchGetAssetPropertyAggregates
+  where
+  type
+    AWSResponse BatchGetAssetPropertyAggregates =
+      BatchGetAssetPropertyAggregatesResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          BatchGetAssetPropertyAggregatesResponse'
+            Prelude.<$> (x Data..?> "nextToken")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+            Prelude.<*> (x Data..?> "errorEntries" Core..!@ Prelude.mempty)
+            Prelude.<*> (x Data..?> "successEntries" Core..!@ Prelude.mempty)
+            Prelude.<*> ( x
+                            Data..?> "skippedEntries"
+                            Core..!@ Prelude.mempty
+                        )
+      )
+
+instance
+  Prelude.Hashable
+    BatchGetAssetPropertyAggregates
+  where
+  hashWithSalt
+    _salt
+    BatchGetAssetPropertyAggregates' {..} =
+      _salt
+        `Prelude.hashWithSalt` maxResults
+        `Prelude.hashWithSalt` nextToken
+        `Prelude.hashWithSalt` entries
+
+instance
+  Prelude.NFData
+    BatchGetAssetPropertyAggregates
+  where
+  rnf BatchGetAssetPropertyAggregates' {..} =
+    Prelude.rnf maxResults
+      `Prelude.seq` Prelude.rnf nextToken
+      `Prelude.seq` Prelude.rnf entries
+
+instance
+  Data.ToHeaders
+    BatchGetAssetPropertyAggregates
+  where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON BatchGetAssetPropertyAggregates where
+  toJSON BatchGetAssetPropertyAggregates' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("maxResults" Data..=) Prelude.<$> maxResults,
+            ("nextToken" Data..=) Prelude.<$> nextToken,
+            Prelude.Just ("entries" Data..= entries)
+          ]
+      )
+
+instance Data.ToPath BatchGetAssetPropertyAggregates where
+  toPath = Prelude.const "/properties/batch/aggregates"
+
+instance Data.ToQuery BatchGetAssetPropertyAggregates where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newBatchGetAssetPropertyAggregatesResponse' smart constructor.
+data BatchGetAssetPropertyAggregatesResponse = BatchGetAssetPropertyAggregatesResponse'
+  { -- | The token for the next set of results, or null if there are no
+    -- additional results.
+    nextToken :: Prelude.Maybe Prelude.Text,
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int,
+    -- | A list of the errors (if any) associated with the batch request. Each
+    -- error entry contains the @entryId@ of the entry that failed.
+    errorEntries :: [BatchGetAssetPropertyAggregatesErrorEntry],
+    -- | A list of entries that were processed successfully by this batch
+    -- request. Each success entry contains the @entryId@ of the entry that
+    -- succeeded and the latest query result.
+    successEntries :: [BatchGetAssetPropertyAggregatesSuccessEntry],
+    -- | A list of entries that were not processed by this batch request. because
+    -- these entries had been completely processed by previous paginated
+    -- requests. Each skipped entry contains the @entryId@ of the entry that
+    -- skipped.
+    skippedEntries :: [BatchGetAssetPropertyAggregatesSkippedEntry]
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'BatchGetAssetPropertyAggregatesResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'nextToken', 'batchGetAssetPropertyAggregatesResponse_nextToken' - The token for the next set of results, or null if there are no
+-- additional results.
+--
+-- 'httpStatus', 'batchGetAssetPropertyAggregatesResponse_httpStatus' - The response's http status code.
+--
+-- 'errorEntries', 'batchGetAssetPropertyAggregatesResponse_errorEntries' - A list of the errors (if any) associated with the batch request. Each
+-- error entry contains the @entryId@ of the entry that failed.
+--
+-- 'successEntries', 'batchGetAssetPropertyAggregatesResponse_successEntries' - A list of entries that were processed successfully by this batch
+-- request. Each success entry contains the @entryId@ of the entry that
+-- succeeded and the latest query result.
+--
+-- 'skippedEntries', 'batchGetAssetPropertyAggregatesResponse_skippedEntries' - A list of entries that were not processed by this batch request. because
+-- these entries had been completely processed by previous paginated
+-- requests. Each skipped entry contains the @entryId@ of the entry that
+-- skipped.
+newBatchGetAssetPropertyAggregatesResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  BatchGetAssetPropertyAggregatesResponse
+newBatchGetAssetPropertyAggregatesResponse
+  pHttpStatus_ =
+    BatchGetAssetPropertyAggregatesResponse'
+      { nextToken =
+          Prelude.Nothing,
+        httpStatus = pHttpStatus_,
+        errorEntries = Prelude.mempty,
+        successEntries = Prelude.mempty,
+        skippedEntries = Prelude.mempty
+      }
+
+-- | The token for the next set of results, or null if there are no
+-- additional results.
+batchGetAssetPropertyAggregatesResponse_nextToken :: Lens.Lens' BatchGetAssetPropertyAggregatesResponse (Prelude.Maybe Prelude.Text)
+batchGetAssetPropertyAggregatesResponse_nextToken = Lens.lens (\BatchGetAssetPropertyAggregatesResponse' {nextToken} -> nextToken) (\s@BatchGetAssetPropertyAggregatesResponse' {} a -> s {nextToken = a} :: BatchGetAssetPropertyAggregatesResponse)
+
+-- | The response's http status code.
+batchGetAssetPropertyAggregatesResponse_httpStatus :: Lens.Lens' BatchGetAssetPropertyAggregatesResponse Prelude.Int
+batchGetAssetPropertyAggregatesResponse_httpStatus = Lens.lens (\BatchGetAssetPropertyAggregatesResponse' {httpStatus} -> httpStatus) (\s@BatchGetAssetPropertyAggregatesResponse' {} a -> s {httpStatus = a} :: BatchGetAssetPropertyAggregatesResponse)
+
+-- | A list of the errors (if any) associated with the batch request. Each
+-- error entry contains the @entryId@ of the entry that failed.
+batchGetAssetPropertyAggregatesResponse_errorEntries :: Lens.Lens' BatchGetAssetPropertyAggregatesResponse [BatchGetAssetPropertyAggregatesErrorEntry]
+batchGetAssetPropertyAggregatesResponse_errorEntries = Lens.lens (\BatchGetAssetPropertyAggregatesResponse' {errorEntries} -> errorEntries) (\s@BatchGetAssetPropertyAggregatesResponse' {} a -> s {errorEntries = a} :: BatchGetAssetPropertyAggregatesResponse) Prelude.. Lens.coerced
+
+-- | A list of entries that were processed successfully by this batch
+-- request. Each success entry contains the @entryId@ of the entry that
+-- succeeded and the latest query result.
+batchGetAssetPropertyAggregatesResponse_successEntries :: Lens.Lens' BatchGetAssetPropertyAggregatesResponse [BatchGetAssetPropertyAggregatesSuccessEntry]
+batchGetAssetPropertyAggregatesResponse_successEntries = Lens.lens (\BatchGetAssetPropertyAggregatesResponse' {successEntries} -> successEntries) (\s@BatchGetAssetPropertyAggregatesResponse' {} a -> s {successEntries = a} :: BatchGetAssetPropertyAggregatesResponse) Prelude.. Lens.coerced
+
+-- | A list of entries that were not processed by this batch request. because
+-- these entries had been completely processed by previous paginated
+-- requests. Each skipped entry contains the @entryId@ of the entry that
+-- skipped.
+batchGetAssetPropertyAggregatesResponse_skippedEntries :: Lens.Lens' BatchGetAssetPropertyAggregatesResponse [BatchGetAssetPropertyAggregatesSkippedEntry]
+batchGetAssetPropertyAggregatesResponse_skippedEntries = Lens.lens (\BatchGetAssetPropertyAggregatesResponse' {skippedEntries} -> skippedEntries) (\s@BatchGetAssetPropertyAggregatesResponse' {} a -> s {skippedEntries = a} :: BatchGetAssetPropertyAggregatesResponse) Prelude.. Lens.coerced
+
+instance
+  Prelude.NFData
+    BatchGetAssetPropertyAggregatesResponse
+  where
+  rnf BatchGetAssetPropertyAggregatesResponse' {..} =
+    Prelude.rnf nextToken
+      `Prelude.seq` Prelude.rnf httpStatus
+      `Prelude.seq` Prelude.rnf errorEntries
+      `Prelude.seq` Prelude.rnf successEntries
+      `Prelude.seq` Prelude.rnf skippedEntries
diff --git a/gen/Amazonka/IoTSiteWise/BatchGetAssetPropertyValue.hs b/gen/Amazonka/IoTSiteWise/BatchGetAssetPropertyValue.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/IoTSiteWise/BatchGetAssetPropertyValue.hs
@@ -0,0 +1,250 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.IoTSiteWise.BatchGetAssetPropertyValue
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Gets the current value for one or more asset properties. For more
+-- information, see
+-- <https://docs.aws.amazon.com/iot-sitewise/latest/userguide/query-industrial-data.html#current-values Querying current values>
+-- in the /IoT SiteWise User Guide/.
+module Amazonka.IoTSiteWise.BatchGetAssetPropertyValue
+  ( -- * Creating a Request
+    BatchGetAssetPropertyValue (..),
+    newBatchGetAssetPropertyValue,
+
+    -- * Request Lenses
+    batchGetAssetPropertyValue_nextToken,
+    batchGetAssetPropertyValue_entries,
+
+    -- * Destructuring the Response
+    BatchGetAssetPropertyValueResponse (..),
+    newBatchGetAssetPropertyValueResponse,
+
+    -- * Response Lenses
+    batchGetAssetPropertyValueResponse_nextToken,
+    batchGetAssetPropertyValueResponse_httpStatus,
+    batchGetAssetPropertyValueResponse_errorEntries,
+    batchGetAssetPropertyValueResponse_successEntries,
+    batchGetAssetPropertyValueResponse_skippedEntries,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.IoTSiteWise.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newBatchGetAssetPropertyValue' smart constructor.
+data BatchGetAssetPropertyValue = BatchGetAssetPropertyValue'
+  { -- | The token to be used for the next set of paginated results.
+    nextToken :: Prelude.Maybe Prelude.Text,
+    -- | The list of asset property value entries for the batch get request. You
+    -- can specify up to 16 entries per request.
+    entries :: [BatchGetAssetPropertyValueEntry]
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'BatchGetAssetPropertyValue' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'nextToken', 'batchGetAssetPropertyValue_nextToken' - The token to be used for the next set of paginated results.
+--
+-- 'entries', 'batchGetAssetPropertyValue_entries' - The list of asset property value entries for the batch get request. You
+-- can specify up to 16 entries per request.
+newBatchGetAssetPropertyValue ::
+  BatchGetAssetPropertyValue
+newBatchGetAssetPropertyValue =
+  BatchGetAssetPropertyValue'
+    { nextToken =
+        Prelude.Nothing,
+      entries = Prelude.mempty
+    }
+
+-- | The token to be used for the next set of paginated results.
+batchGetAssetPropertyValue_nextToken :: Lens.Lens' BatchGetAssetPropertyValue (Prelude.Maybe Prelude.Text)
+batchGetAssetPropertyValue_nextToken = Lens.lens (\BatchGetAssetPropertyValue' {nextToken} -> nextToken) (\s@BatchGetAssetPropertyValue' {} a -> s {nextToken = a} :: BatchGetAssetPropertyValue)
+
+-- | The list of asset property value entries for the batch get request. You
+-- can specify up to 16 entries per request.
+batchGetAssetPropertyValue_entries :: Lens.Lens' BatchGetAssetPropertyValue [BatchGetAssetPropertyValueEntry]
+batchGetAssetPropertyValue_entries = Lens.lens (\BatchGetAssetPropertyValue' {entries} -> entries) (\s@BatchGetAssetPropertyValue' {} a -> s {entries = a} :: BatchGetAssetPropertyValue) Prelude.. Lens.coerced
+
+instance Core.AWSRequest BatchGetAssetPropertyValue where
+  type
+    AWSResponse BatchGetAssetPropertyValue =
+      BatchGetAssetPropertyValueResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          BatchGetAssetPropertyValueResponse'
+            Prelude.<$> (x Data..?> "nextToken")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+            Prelude.<*> (x Data..?> "errorEntries" Core..!@ Prelude.mempty)
+            Prelude.<*> (x Data..?> "successEntries" Core..!@ Prelude.mempty)
+            Prelude.<*> ( x
+                            Data..?> "skippedEntries"
+                            Core..!@ Prelude.mempty
+                        )
+      )
+
+instance Prelude.Hashable BatchGetAssetPropertyValue where
+  hashWithSalt _salt BatchGetAssetPropertyValue' {..} =
+    _salt
+      `Prelude.hashWithSalt` nextToken
+      `Prelude.hashWithSalt` entries
+
+instance Prelude.NFData BatchGetAssetPropertyValue where
+  rnf BatchGetAssetPropertyValue' {..} =
+    Prelude.rnf nextToken
+      `Prelude.seq` Prelude.rnf entries
+
+instance Data.ToHeaders BatchGetAssetPropertyValue where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON BatchGetAssetPropertyValue where
+  toJSON BatchGetAssetPropertyValue' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("nextToken" Data..=) Prelude.<$> nextToken,
+            Prelude.Just ("entries" Data..= entries)
+          ]
+      )
+
+instance Data.ToPath BatchGetAssetPropertyValue where
+  toPath = Prelude.const "/properties/batch/latest"
+
+instance Data.ToQuery BatchGetAssetPropertyValue where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newBatchGetAssetPropertyValueResponse' smart constructor.
+data BatchGetAssetPropertyValueResponse = BatchGetAssetPropertyValueResponse'
+  { -- | The token for the next set of results, or null if there are no
+    -- additional results.
+    nextToken :: Prelude.Maybe Prelude.Text,
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int,
+    -- | A list of the errors (if any) associated with the batch request. Each
+    -- error entry contains the @entryId@ of the entry that failed.
+    errorEntries :: [BatchGetAssetPropertyValueErrorEntry],
+    -- | A list of entries that were processed successfully by this batch
+    -- request. Each success entry contains the @entryId@ of the entry that
+    -- succeeded and the latest query result.
+    successEntries :: [BatchGetAssetPropertyValueSuccessEntry],
+    -- | A list of entries that were not processed by this batch request. because
+    -- these entries had been completely processed by previous paginated
+    -- requests. Each skipped entry contains the @entryId@ of the entry that
+    -- skipped.
+    skippedEntries :: [BatchGetAssetPropertyValueSkippedEntry]
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'BatchGetAssetPropertyValueResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'nextToken', 'batchGetAssetPropertyValueResponse_nextToken' - The token for the next set of results, or null if there are no
+-- additional results.
+--
+-- 'httpStatus', 'batchGetAssetPropertyValueResponse_httpStatus' - The response's http status code.
+--
+-- 'errorEntries', 'batchGetAssetPropertyValueResponse_errorEntries' - A list of the errors (if any) associated with the batch request. Each
+-- error entry contains the @entryId@ of the entry that failed.
+--
+-- 'successEntries', 'batchGetAssetPropertyValueResponse_successEntries' - A list of entries that were processed successfully by this batch
+-- request. Each success entry contains the @entryId@ of the entry that
+-- succeeded and the latest query result.
+--
+-- 'skippedEntries', 'batchGetAssetPropertyValueResponse_skippedEntries' - A list of entries that were not processed by this batch request. because
+-- these entries had been completely processed by previous paginated
+-- requests. Each skipped entry contains the @entryId@ of the entry that
+-- skipped.
+newBatchGetAssetPropertyValueResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  BatchGetAssetPropertyValueResponse
+newBatchGetAssetPropertyValueResponse pHttpStatus_ =
+  BatchGetAssetPropertyValueResponse'
+    { nextToken =
+        Prelude.Nothing,
+      httpStatus = pHttpStatus_,
+      errorEntries = Prelude.mempty,
+      successEntries = Prelude.mempty,
+      skippedEntries = Prelude.mempty
+    }
+
+-- | The token for the next set of results, or null if there are no
+-- additional results.
+batchGetAssetPropertyValueResponse_nextToken :: Lens.Lens' BatchGetAssetPropertyValueResponse (Prelude.Maybe Prelude.Text)
+batchGetAssetPropertyValueResponse_nextToken = Lens.lens (\BatchGetAssetPropertyValueResponse' {nextToken} -> nextToken) (\s@BatchGetAssetPropertyValueResponse' {} a -> s {nextToken = a} :: BatchGetAssetPropertyValueResponse)
+
+-- | The response's http status code.
+batchGetAssetPropertyValueResponse_httpStatus :: Lens.Lens' BatchGetAssetPropertyValueResponse Prelude.Int
+batchGetAssetPropertyValueResponse_httpStatus = Lens.lens (\BatchGetAssetPropertyValueResponse' {httpStatus} -> httpStatus) (\s@BatchGetAssetPropertyValueResponse' {} a -> s {httpStatus = a} :: BatchGetAssetPropertyValueResponse)
+
+-- | A list of the errors (if any) associated with the batch request. Each
+-- error entry contains the @entryId@ of the entry that failed.
+batchGetAssetPropertyValueResponse_errorEntries :: Lens.Lens' BatchGetAssetPropertyValueResponse [BatchGetAssetPropertyValueErrorEntry]
+batchGetAssetPropertyValueResponse_errorEntries = Lens.lens (\BatchGetAssetPropertyValueResponse' {errorEntries} -> errorEntries) (\s@BatchGetAssetPropertyValueResponse' {} a -> s {errorEntries = a} :: BatchGetAssetPropertyValueResponse) Prelude.. Lens.coerced
+
+-- | A list of entries that were processed successfully by this batch
+-- request. Each success entry contains the @entryId@ of the entry that
+-- succeeded and the latest query result.
+batchGetAssetPropertyValueResponse_successEntries :: Lens.Lens' BatchGetAssetPropertyValueResponse [BatchGetAssetPropertyValueSuccessEntry]
+batchGetAssetPropertyValueResponse_successEntries = Lens.lens (\BatchGetAssetPropertyValueResponse' {successEntries} -> successEntries) (\s@BatchGetAssetPropertyValueResponse' {} a -> s {successEntries = a} :: BatchGetAssetPropertyValueResponse) Prelude.. Lens.coerced
+
+-- | A list of entries that were not processed by this batch request. because
+-- these entries had been completely processed by previous paginated
+-- requests. Each skipped entry contains the @entryId@ of the entry that
+-- skipped.
+batchGetAssetPropertyValueResponse_skippedEntries :: Lens.Lens' BatchGetAssetPropertyValueResponse [BatchGetAssetPropertyValueSkippedEntry]
+batchGetAssetPropertyValueResponse_skippedEntries = Lens.lens (\BatchGetAssetPropertyValueResponse' {skippedEntries} -> skippedEntries) (\s@BatchGetAssetPropertyValueResponse' {} a -> s {skippedEntries = a} :: BatchGetAssetPropertyValueResponse) Prelude.. Lens.coerced
+
+instance
+  Prelude.NFData
+    BatchGetAssetPropertyValueResponse
+  where
+  rnf BatchGetAssetPropertyValueResponse' {..} =
+    Prelude.rnf nextToken
+      `Prelude.seq` Prelude.rnf httpStatus
+      `Prelude.seq` Prelude.rnf errorEntries
+      `Prelude.seq` Prelude.rnf successEntries
+      `Prelude.seq` Prelude.rnf skippedEntries
diff --git a/gen/Amazonka/IoTSiteWise/BatchGetAssetPropertyValueHistory.hs b/gen/Amazonka/IoTSiteWise/BatchGetAssetPropertyValueHistory.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/IoTSiteWise/BatchGetAssetPropertyValueHistory.hs
@@ -0,0 +1,305 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.IoTSiteWise.BatchGetAssetPropertyValueHistory
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Gets the historical values for one or more asset properties. For more
+-- information, see
+-- <https://docs.aws.amazon.com/iot-sitewise/latest/userguide/query-industrial-data.html#historical-values Querying historical values>
+-- in the /IoT SiteWise User Guide/.
+module Amazonka.IoTSiteWise.BatchGetAssetPropertyValueHistory
+  ( -- * Creating a Request
+    BatchGetAssetPropertyValueHistory (..),
+    newBatchGetAssetPropertyValueHistory,
+
+    -- * Request Lenses
+    batchGetAssetPropertyValueHistory_maxResults,
+    batchGetAssetPropertyValueHistory_nextToken,
+    batchGetAssetPropertyValueHistory_entries,
+
+    -- * Destructuring the Response
+    BatchGetAssetPropertyValueHistoryResponse (..),
+    newBatchGetAssetPropertyValueHistoryResponse,
+
+    -- * Response Lenses
+    batchGetAssetPropertyValueHistoryResponse_nextToken,
+    batchGetAssetPropertyValueHistoryResponse_httpStatus,
+    batchGetAssetPropertyValueHistoryResponse_errorEntries,
+    batchGetAssetPropertyValueHistoryResponse_successEntries,
+    batchGetAssetPropertyValueHistoryResponse_skippedEntries,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.IoTSiteWise.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newBatchGetAssetPropertyValueHistory' smart constructor.
+data BatchGetAssetPropertyValueHistory = BatchGetAssetPropertyValueHistory'
+  { -- | The maximum number of results to return for each paginated request. A
+    -- result set is returned in the two cases, whichever occurs first.
+    --
+    -- -   The size of the result set is less than 1 MB.
+    --
+    -- -   The number of data points in the result set is less than the value
+    --     of @maxResults@. The maximum value of @maxResults@ is 4000.
+    maxResults :: Prelude.Maybe Prelude.Natural,
+    -- | The token to be used for the next set of paginated results.
+    nextToken :: Prelude.Maybe Prelude.Text,
+    -- | The list of asset property historical value entries for the batch get
+    -- request. You can specify up to 16 entries per request.
+    entries :: [BatchGetAssetPropertyValueHistoryEntry]
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'BatchGetAssetPropertyValueHistory' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'maxResults', 'batchGetAssetPropertyValueHistory_maxResults' - The maximum number of results to return for each paginated request. A
+-- result set is returned in the two cases, whichever occurs first.
+--
+-- -   The size of the result set is less than 1 MB.
+--
+-- -   The number of data points in the result set is less than the value
+--     of @maxResults@. The maximum value of @maxResults@ is 4000.
+--
+-- 'nextToken', 'batchGetAssetPropertyValueHistory_nextToken' - The token to be used for the next set of paginated results.
+--
+-- 'entries', 'batchGetAssetPropertyValueHistory_entries' - The list of asset property historical value entries for the batch get
+-- request. You can specify up to 16 entries per request.
+newBatchGetAssetPropertyValueHistory ::
+  BatchGetAssetPropertyValueHistory
+newBatchGetAssetPropertyValueHistory =
+  BatchGetAssetPropertyValueHistory'
+    { maxResults =
+        Prelude.Nothing,
+      nextToken = Prelude.Nothing,
+      entries = Prelude.mempty
+    }
+
+-- | The maximum number of results to return for each paginated request. A
+-- result set is returned in the two cases, whichever occurs first.
+--
+-- -   The size of the result set is less than 1 MB.
+--
+-- -   The number of data points in the result set is less than the value
+--     of @maxResults@. The maximum value of @maxResults@ is 4000.
+batchGetAssetPropertyValueHistory_maxResults :: Lens.Lens' BatchGetAssetPropertyValueHistory (Prelude.Maybe Prelude.Natural)
+batchGetAssetPropertyValueHistory_maxResults = Lens.lens (\BatchGetAssetPropertyValueHistory' {maxResults} -> maxResults) (\s@BatchGetAssetPropertyValueHistory' {} a -> s {maxResults = a} :: BatchGetAssetPropertyValueHistory)
+
+-- | The token to be used for the next set of paginated results.
+batchGetAssetPropertyValueHistory_nextToken :: Lens.Lens' BatchGetAssetPropertyValueHistory (Prelude.Maybe Prelude.Text)
+batchGetAssetPropertyValueHistory_nextToken = Lens.lens (\BatchGetAssetPropertyValueHistory' {nextToken} -> nextToken) (\s@BatchGetAssetPropertyValueHistory' {} a -> s {nextToken = a} :: BatchGetAssetPropertyValueHistory)
+
+-- | The list of asset property historical value entries for the batch get
+-- request. You can specify up to 16 entries per request.
+batchGetAssetPropertyValueHistory_entries :: Lens.Lens' BatchGetAssetPropertyValueHistory [BatchGetAssetPropertyValueHistoryEntry]
+batchGetAssetPropertyValueHistory_entries = Lens.lens (\BatchGetAssetPropertyValueHistory' {entries} -> entries) (\s@BatchGetAssetPropertyValueHistory' {} a -> s {entries = a} :: BatchGetAssetPropertyValueHistory) Prelude.. Lens.coerced
+
+instance
+  Core.AWSRequest
+    BatchGetAssetPropertyValueHistory
+  where
+  type
+    AWSResponse BatchGetAssetPropertyValueHistory =
+      BatchGetAssetPropertyValueHistoryResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          BatchGetAssetPropertyValueHistoryResponse'
+            Prelude.<$> (x Data..?> "nextToken")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+            Prelude.<*> (x Data..?> "errorEntries" Core..!@ Prelude.mempty)
+            Prelude.<*> (x Data..?> "successEntries" Core..!@ Prelude.mempty)
+            Prelude.<*> ( x
+                            Data..?> "skippedEntries"
+                            Core..!@ Prelude.mempty
+                        )
+      )
+
+instance
+  Prelude.Hashable
+    BatchGetAssetPropertyValueHistory
+  where
+  hashWithSalt
+    _salt
+    BatchGetAssetPropertyValueHistory' {..} =
+      _salt
+        `Prelude.hashWithSalt` maxResults
+        `Prelude.hashWithSalt` nextToken
+        `Prelude.hashWithSalt` entries
+
+instance
+  Prelude.NFData
+    BatchGetAssetPropertyValueHistory
+  where
+  rnf BatchGetAssetPropertyValueHistory' {..} =
+    Prelude.rnf maxResults
+      `Prelude.seq` Prelude.rnf nextToken
+      `Prelude.seq` Prelude.rnf entries
+
+instance
+  Data.ToHeaders
+    BatchGetAssetPropertyValueHistory
+  where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance
+  Data.ToJSON
+    BatchGetAssetPropertyValueHistory
+  where
+  toJSON BatchGetAssetPropertyValueHistory' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("maxResults" Data..=) Prelude.<$> maxResults,
+            ("nextToken" Data..=) Prelude.<$> nextToken,
+            Prelude.Just ("entries" Data..= entries)
+          ]
+      )
+
+instance
+  Data.ToPath
+    BatchGetAssetPropertyValueHistory
+  where
+  toPath = Prelude.const "/properties/batch/history"
+
+instance
+  Data.ToQuery
+    BatchGetAssetPropertyValueHistory
+  where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newBatchGetAssetPropertyValueHistoryResponse' smart constructor.
+data BatchGetAssetPropertyValueHistoryResponse = BatchGetAssetPropertyValueHistoryResponse'
+  { -- | The token for the next set of results, or null if there are no
+    -- additional results.
+    nextToken :: Prelude.Maybe Prelude.Text,
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int,
+    -- | A list of the errors (if any) associated with the batch request. Each
+    -- error entry contains the @entryId@ of the entry that failed.
+    errorEntries :: [BatchGetAssetPropertyValueHistoryErrorEntry],
+    -- | A list of entries that were processed successfully by this batch
+    -- request. Each success entry contains the @entryId@ of the entry that
+    -- succeeded and the latest query result.
+    successEntries :: [BatchGetAssetPropertyValueHistorySuccessEntry],
+    -- | A list of entries that were not processed by this batch request. because
+    -- these entries had been completely processed by previous paginated
+    -- requests. Each skipped entry contains the @entryId@ of the entry that
+    -- skipped.
+    skippedEntries :: [BatchGetAssetPropertyValueHistorySkippedEntry]
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'BatchGetAssetPropertyValueHistoryResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'nextToken', 'batchGetAssetPropertyValueHistoryResponse_nextToken' - The token for the next set of results, or null if there are no
+-- additional results.
+--
+-- 'httpStatus', 'batchGetAssetPropertyValueHistoryResponse_httpStatus' - The response's http status code.
+--
+-- 'errorEntries', 'batchGetAssetPropertyValueHistoryResponse_errorEntries' - A list of the errors (if any) associated with the batch request. Each
+-- error entry contains the @entryId@ of the entry that failed.
+--
+-- 'successEntries', 'batchGetAssetPropertyValueHistoryResponse_successEntries' - A list of entries that were processed successfully by this batch
+-- request. Each success entry contains the @entryId@ of the entry that
+-- succeeded and the latest query result.
+--
+-- 'skippedEntries', 'batchGetAssetPropertyValueHistoryResponse_skippedEntries' - A list of entries that were not processed by this batch request. because
+-- these entries had been completely processed by previous paginated
+-- requests. Each skipped entry contains the @entryId@ of the entry that
+-- skipped.
+newBatchGetAssetPropertyValueHistoryResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  BatchGetAssetPropertyValueHistoryResponse
+newBatchGetAssetPropertyValueHistoryResponse
+  pHttpStatus_ =
+    BatchGetAssetPropertyValueHistoryResponse'
+      { nextToken =
+          Prelude.Nothing,
+        httpStatus = pHttpStatus_,
+        errorEntries = Prelude.mempty,
+        successEntries = Prelude.mempty,
+        skippedEntries = Prelude.mempty
+      }
+
+-- | The token for the next set of results, or null if there are no
+-- additional results.
+batchGetAssetPropertyValueHistoryResponse_nextToken :: Lens.Lens' BatchGetAssetPropertyValueHistoryResponse (Prelude.Maybe Prelude.Text)
+batchGetAssetPropertyValueHistoryResponse_nextToken = Lens.lens (\BatchGetAssetPropertyValueHistoryResponse' {nextToken} -> nextToken) (\s@BatchGetAssetPropertyValueHistoryResponse' {} a -> s {nextToken = a} :: BatchGetAssetPropertyValueHistoryResponse)
+
+-- | The response's http status code.
+batchGetAssetPropertyValueHistoryResponse_httpStatus :: Lens.Lens' BatchGetAssetPropertyValueHistoryResponse Prelude.Int
+batchGetAssetPropertyValueHistoryResponse_httpStatus = Lens.lens (\BatchGetAssetPropertyValueHistoryResponse' {httpStatus} -> httpStatus) (\s@BatchGetAssetPropertyValueHistoryResponse' {} a -> s {httpStatus = a} :: BatchGetAssetPropertyValueHistoryResponse)
+
+-- | A list of the errors (if any) associated with the batch request. Each
+-- error entry contains the @entryId@ of the entry that failed.
+batchGetAssetPropertyValueHistoryResponse_errorEntries :: Lens.Lens' BatchGetAssetPropertyValueHistoryResponse [BatchGetAssetPropertyValueHistoryErrorEntry]
+batchGetAssetPropertyValueHistoryResponse_errorEntries = Lens.lens (\BatchGetAssetPropertyValueHistoryResponse' {errorEntries} -> errorEntries) (\s@BatchGetAssetPropertyValueHistoryResponse' {} a -> s {errorEntries = a} :: BatchGetAssetPropertyValueHistoryResponse) Prelude.. Lens.coerced
+
+-- | A list of entries that were processed successfully by this batch
+-- request. Each success entry contains the @entryId@ of the entry that
+-- succeeded and the latest query result.
+batchGetAssetPropertyValueHistoryResponse_successEntries :: Lens.Lens' BatchGetAssetPropertyValueHistoryResponse [BatchGetAssetPropertyValueHistorySuccessEntry]
+batchGetAssetPropertyValueHistoryResponse_successEntries = Lens.lens (\BatchGetAssetPropertyValueHistoryResponse' {successEntries} -> successEntries) (\s@BatchGetAssetPropertyValueHistoryResponse' {} a -> s {successEntries = a} :: BatchGetAssetPropertyValueHistoryResponse) Prelude.. Lens.coerced
+
+-- | A list of entries that were not processed by this batch request. because
+-- these entries had been completely processed by previous paginated
+-- requests. Each skipped entry contains the @entryId@ of the entry that
+-- skipped.
+batchGetAssetPropertyValueHistoryResponse_skippedEntries :: Lens.Lens' BatchGetAssetPropertyValueHistoryResponse [BatchGetAssetPropertyValueHistorySkippedEntry]
+batchGetAssetPropertyValueHistoryResponse_skippedEntries = Lens.lens (\BatchGetAssetPropertyValueHistoryResponse' {skippedEntries} -> skippedEntries) (\s@BatchGetAssetPropertyValueHistoryResponse' {} a -> s {skippedEntries = a} :: BatchGetAssetPropertyValueHistoryResponse) Prelude.. Lens.coerced
+
+instance
+  Prelude.NFData
+    BatchGetAssetPropertyValueHistoryResponse
+  where
+  rnf BatchGetAssetPropertyValueHistoryResponse' {..} =
+    Prelude.rnf nextToken
+      `Prelude.seq` Prelude.rnf httpStatus
+      `Prelude.seq` Prelude.rnf errorEntries
+      `Prelude.seq` Prelude.rnf successEntries
+      `Prelude.seq` Prelude.rnf skippedEntries
diff --git a/gen/Amazonka/IoTSiteWise/BatchPutAssetPropertyValue.hs b/gen/Amazonka/IoTSiteWise/BatchPutAssetPropertyValue.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/IoTSiteWise/BatchPutAssetPropertyValue.hs
@@ -0,0 +1,203 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.IoTSiteWise.BatchPutAssetPropertyValue
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Sends a list of asset property values to IoT SiteWise. Each value is a
+-- timestamp-quality-value (TQV) data point. For more information, see
+-- <https://docs.aws.amazon.com/iot-sitewise/latest/userguide/ingest-api.html Ingesting data using the API>
+-- in the /IoT SiteWise User Guide/.
+--
+-- To identify an asset property, you must specify one of the following:
+--
+-- -   The @assetId@ and @propertyId@ of an asset property.
+--
+-- -   A @propertyAlias@, which is a data stream alias (for example,
+--     @\/company\/windfarm\/3\/turbine\/7\/temperature@). To define an
+--     asset property\'s alias, see
+--     <https://docs.aws.amazon.com/iot-sitewise/latest/APIReference/API_UpdateAssetProperty.html UpdateAssetProperty>.
+--
+-- With respect to Unix epoch time, IoT SiteWise accepts only TQVs that
+-- have a timestamp of no more than 7 days in the past and no more than 10
+-- minutes in the future. IoT SiteWise rejects timestamps outside of the
+-- inclusive range of [-7 days, +10 minutes] and returns a
+-- @TimestampOutOfRangeException@ error.
+--
+-- For each asset property, IoT SiteWise overwrites TQVs with duplicate
+-- timestamps unless the newer TQV has a different quality. For example, if
+-- you store a TQV @{T1, GOOD, V1}@, then storing @{T1, GOOD, V2}@ replaces
+-- the existing TQV.
+--
+-- IoT SiteWise authorizes access to each @BatchPutAssetPropertyValue@
+-- entry individually. For more information, see
+-- <https://docs.aws.amazon.com/iot-sitewise/latest/userguide/security_iam_service-with-iam.html#security_iam_service-with-iam-id-based-policies-batchputassetpropertyvalue-action BatchPutAssetPropertyValue authorization>
+-- in the /IoT SiteWise User Guide/.
+module Amazonka.IoTSiteWise.BatchPutAssetPropertyValue
+  ( -- * Creating a Request
+    BatchPutAssetPropertyValue (..),
+    newBatchPutAssetPropertyValue,
+
+    -- * Request Lenses
+    batchPutAssetPropertyValue_entries,
+
+    -- * Destructuring the Response
+    BatchPutAssetPropertyValueResponse (..),
+    newBatchPutAssetPropertyValueResponse,
+
+    -- * Response Lenses
+    batchPutAssetPropertyValueResponse_httpStatus,
+    batchPutAssetPropertyValueResponse_errorEntries,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.IoTSiteWise.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newBatchPutAssetPropertyValue' smart constructor.
+data BatchPutAssetPropertyValue = BatchPutAssetPropertyValue'
+  { -- | The list of asset property value entries for the batch put request. You
+    -- can specify up to 10 entries per request.
+    entries :: [PutAssetPropertyValueEntry]
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'BatchPutAssetPropertyValue' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'entries', 'batchPutAssetPropertyValue_entries' - The list of asset property value entries for the batch put request. You
+-- can specify up to 10 entries per request.
+newBatchPutAssetPropertyValue ::
+  BatchPutAssetPropertyValue
+newBatchPutAssetPropertyValue =
+  BatchPutAssetPropertyValue'
+    { entries =
+        Prelude.mempty
+    }
+
+-- | The list of asset property value entries for the batch put request. You
+-- can specify up to 10 entries per request.
+batchPutAssetPropertyValue_entries :: Lens.Lens' BatchPutAssetPropertyValue [PutAssetPropertyValueEntry]
+batchPutAssetPropertyValue_entries = Lens.lens (\BatchPutAssetPropertyValue' {entries} -> entries) (\s@BatchPutAssetPropertyValue' {} a -> s {entries = a} :: BatchPutAssetPropertyValue) Prelude.. Lens.coerced
+
+instance Core.AWSRequest BatchPutAssetPropertyValue where
+  type
+    AWSResponse BatchPutAssetPropertyValue =
+      BatchPutAssetPropertyValueResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          BatchPutAssetPropertyValueResponse'
+            Prelude.<$> (Prelude.pure (Prelude.fromEnum s))
+            Prelude.<*> (x Data..?> "errorEntries" Core..!@ Prelude.mempty)
+      )
+
+instance Prelude.Hashable BatchPutAssetPropertyValue where
+  hashWithSalt _salt BatchPutAssetPropertyValue' {..} =
+    _salt `Prelude.hashWithSalt` entries
+
+instance Prelude.NFData BatchPutAssetPropertyValue where
+  rnf BatchPutAssetPropertyValue' {..} =
+    Prelude.rnf entries
+
+instance Data.ToHeaders BatchPutAssetPropertyValue where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON BatchPutAssetPropertyValue where
+  toJSON BatchPutAssetPropertyValue' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [Prelude.Just ("entries" Data..= entries)]
+      )
+
+instance Data.ToPath BatchPutAssetPropertyValue where
+  toPath = Prelude.const "/properties"
+
+instance Data.ToQuery BatchPutAssetPropertyValue where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newBatchPutAssetPropertyValueResponse' smart constructor.
+data BatchPutAssetPropertyValueResponse = BatchPutAssetPropertyValueResponse'
+  { -- | The response's http status code.
+    httpStatus :: Prelude.Int,
+    -- | A list of the errors (if any) associated with the batch put request.
+    -- Each error entry contains the @entryId@ of the entry that failed.
+    errorEntries :: [BatchPutAssetPropertyErrorEntry]
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'BatchPutAssetPropertyValueResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'httpStatus', 'batchPutAssetPropertyValueResponse_httpStatus' - The response's http status code.
+--
+-- 'errorEntries', 'batchPutAssetPropertyValueResponse_errorEntries' - A list of the errors (if any) associated with the batch put request.
+-- Each error entry contains the @entryId@ of the entry that failed.
+newBatchPutAssetPropertyValueResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  BatchPutAssetPropertyValueResponse
+newBatchPutAssetPropertyValueResponse pHttpStatus_ =
+  BatchPutAssetPropertyValueResponse'
+    { httpStatus =
+        pHttpStatus_,
+      errorEntries = Prelude.mempty
+    }
+
+-- | The response's http status code.
+batchPutAssetPropertyValueResponse_httpStatus :: Lens.Lens' BatchPutAssetPropertyValueResponse Prelude.Int
+batchPutAssetPropertyValueResponse_httpStatus = Lens.lens (\BatchPutAssetPropertyValueResponse' {httpStatus} -> httpStatus) (\s@BatchPutAssetPropertyValueResponse' {} a -> s {httpStatus = a} :: BatchPutAssetPropertyValueResponse)
+
+-- | A list of the errors (if any) associated with the batch put request.
+-- Each error entry contains the @entryId@ of the entry that failed.
+batchPutAssetPropertyValueResponse_errorEntries :: Lens.Lens' BatchPutAssetPropertyValueResponse [BatchPutAssetPropertyErrorEntry]
+batchPutAssetPropertyValueResponse_errorEntries = Lens.lens (\BatchPutAssetPropertyValueResponse' {errorEntries} -> errorEntries) (\s@BatchPutAssetPropertyValueResponse' {} a -> s {errorEntries = a} :: BatchPutAssetPropertyValueResponse) Prelude.. Lens.coerced
+
+instance
+  Prelude.NFData
+    BatchPutAssetPropertyValueResponse
+  where
+  rnf BatchPutAssetPropertyValueResponse' {..} =
+    Prelude.rnf httpStatus
+      `Prelude.seq` Prelude.rnf errorEntries
diff --git a/gen/Amazonka/IoTSiteWise/CreateAccessPolicy.hs b/gen/Amazonka/IoTSiteWise/CreateAccessPolicy.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/IoTSiteWise/CreateAccessPolicy.hs
@@ -0,0 +1,294 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.IoTSiteWise.CreateAccessPolicy
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Creates an access policy that grants the specified identity (IAM
+-- Identity Center user, IAM Identity Center group, or IAM user) access to
+-- the specified IoT SiteWise Monitor portal or project resource.
+module Amazonka.IoTSiteWise.CreateAccessPolicy
+  ( -- * Creating a Request
+    CreateAccessPolicy (..),
+    newCreateAccessPolicy,
+
+    -- * Request Lenses
+    createAccessPolicy_clientToken,
+    createAccessPolicy_tags,
+    createAccessPolicy_accessPolicyIdentity,
+    createAccessPolicy_accessPolicyResource,
+    createAccessPolicy_accessPolicyPermission,
+
+    -- * Destructuring the Response
+    CreateAccessPolicyResponse (..),
+    newCreateAccessPolicyResponse,
+
+    -- * Response Lenses
+    createAccessPolicyResponse_httpStatus,
+    createAccessPolicyResponse_accessPolicyId,
+    createAccessPolicyResponse_accessPolicyArn,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.IoTSiteWise.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newCreateAccessPolicy' smart constructor.
+data CreateAccessPolicy = CreateAccessPolicy'
+  { -- | A unique case-sensitive identifier that you can provide to ensure the
+    -- idempotency of the request. Don\'t reuse this client token if a new
+    -- idempotent request is required.
+    clientToken :: Prelude.Maybe Prelude.Text,
+    -- | A list of key-value pairs that contain metadata for the access policy.
+    -- For more information, see
+    -- <https://docs.aws.amazon.com/iot-sitewise/latest/userguide/tag-resources.html Tagging your IoT SiteWise resources>
+    -- in the /IoT SiteWise User Guide/.
+    tags :: Prelude.Maybe (Prelude.HashMap Prelude.Text Prelude.Text),
+    -- | The identity for this access policy. Choose an IAM Identity Center user,
+    -- an IAM Identity Center group, or an IAM user.
+    accessPolicyIdentity :: Identity,
+    -- | The IoT SiteWise Monitor resource for this access policy. Choose either
+    -- a portal or a project.
+    accessPolicyResource :: Resource,
+    -- | The permission level for this access policy. Note that a project
+    -- @ADMINISTRATOR@ is also known as a project owner.
+    accessPolicyPermission :: Permission
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'CreateAccessPolicy' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'clientToken', 'createAccessPolicy_clientToken' - A unique case-sensitive identifier that you can provide to ensure the
+-- idempotency of the request. Don\'t reuse this client token if a new
+-- idempotent request is required.
+--
+-- 'tags', 'createAccessPolicy_tags' - A list of key-value pairs that contain metadata for the access policy.
+-- For more information, see
+-- <https://docs.aws.amazon.com/iot-sitewise/latest/userguide/tag-resources.html Tagging your IoT SiteWise resources>
+-- in the /IoT SiteWise User Guide/.
+--
+-- 'accessPolicyIdentity', 'createAccessPolicy_accessPolicyIdentity' - The identity for this access policy. Choose an IAM Identity Center user,
+-- an IAM Identity Center group, or an IAM user.
+--
+-- 'accessPolicyResource', 'createAccessPolicy_accessPolicyResource' - The IoT SiteWise Monitor resource for this access policy. Choose either
+-- a portal or a project.
+--
+-- 'accessPolicyPermission', 'createAccessPolicy_accessPolicyPermission' - The permission level for this access policy. Note that a project
+-- @ADMINISTRATOR@ is also known as a project owner.
+newCreateAccessPolicy ::
+  -- | 'accessPolicyIdentity'
+  Identity ->
+  -- | 'accessPolicyResource'
+  Resource ->
+  -- | 'accessPolicyPermission'
+  Permission ->
+  CreateAccessPolicy
+newCreateAccessPolicy
+  pAccessPolicyIdentity_
+  pAccessPolicyResource_
+  pAccessPolicyPermission_ =
+    CreateAccessPolicy'
+      { clientToken = Prelude.Nothing,
+        tags = Prelude.Nothing,
+        accessPolicyIdentity = pAccessPolicyIdentity_,
+        accessPolicyResource = pAccessPolicyResource_,
+        accessPolicyPermission = pAccessPolicyPermission_
+      }
+
+-- | A unique case-sensitive identifier that you can provide to ensure the
+-- idempotency of the request. Don\'t reuse this client token if a new
+-- idempotent request is required.
+createAccessPolicy_clientToken :: Lens.Lens' CreateAccessPolicy (Prelude.Maybe Prelude.Text)
+createAccessPolicy_clientToken = Lens.lens (\CreateAccessPolicy' {clientToken} -> clientToken) (\s@CreateAccessPolicy' {} a -> s {clientToken = a} :: CreateAccessPolicy)
+
+-- | A list of key-value pairs that contain metadata for the access policy.
+-- For more information, see
+-- <https://docs.aws.amazon.com/iot-sitewise/latest/userguide/tag-resources.html Tagging your IoT SiteWise resources>
+-- in the /IoT SiteWise User Guide/.
+createAccessPolicy_tags :: Lens.Lens' CreateAccessPolicy (Prelude.Maybe (Prelude.HashMap Prelude.Text Prelude.Text))
+createAccessPolicy_tags = Lens.lens (\CreateAccessPolicy' {tags} -> tags) (\s@CreateAccessPolicy' {} a -> s {tags = a} :: CreateAccessPolicy) Prelude.. Lens.mapping Lens.coerced
+
+-- | The identity for this access policy. Choose an IAM Identity Center user,
+-- an IAM Identity Center group, or an IAM user.
+createAccessPolicy_accessPolicyIdentity :: Lens.Lens' CreateAccessPolicy Identity
+createAccessPolicy_accessPolicyIdentity = Lens.lens (\CreateAccessPolicy' {accessPolicyIdentity} -> accessPolicyIdentity) (\s@CreateAccessPolicy' {} a -> s {accessPolicyIdentity = a} :: CreateAccessPolicy)
+
+-- | The IoT SiteWise Monitor resource for this access policy. Choose either
+-- a portal or a project.
+createAccessPolicy_accessPolicyResource :: Lens.Lens' CreateAccessPolicy Resource
+createAccessPolicy_accessPolicyResource = Lens.lens (\CreateAccessPolicy' {accessPolicyResource} -> accessPolicyResource) (\s@CreateAccessPolicy' {} a -> s {accessPolicyResource = a} :: CreateAccessPolicy)
+
+-- | The permission level for this access policy. Note that a project
+-- @ADMINISTRATOR@ is also known as a project owner.
+createAccessPolicy_accessPolicyPermission :: Lens.Lens' CreateAccessPolicy Permission
+createAccessPolicy_accessPolicyPermission = Lens.lens (\CreateAccessPolicy' {accessPolicyPermission} -> accessPolicyPermission) (\s@CreateAccessPolicy' {} a -> s {accessPolicyPermission = a} :: CreateAccessPolicy)
+
+instance Core.AWSRequest CreateAccessPolicy where
+  type
+    AWSResponse CreateAccessPolicy =
+      CreateAccessPolicyResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          CreateAccessPolicyResponse'
+            Prelude.<$> (Prelude.pure (Prelude.fromEnum s))
+            Prelude.<*> (x Data..:> "accessPolicyId")
+            Prelude.<*> (x Data..:> "accessPolicyArn")
+      )
+
+instance Prelude.Hashable CreateAccessPolicy where
+  hashWithSalt _salt CreateAccessPolicy' {..} =
+    _salt
+      `Prelude.hashWithSalt` clientToken
+      `Prelude.hashWithSalt` tags
+      `Prelude.hashWithSalt` accessPolicyIdentity
+      `Prelude.hashWithSalt` accessPolicyResource
+      `Prelude.hashWithSalt` accessPolicyPermission
+
+instance Prelude.NFData CreateAccessPolicy where
+  rnf CreateAccessPolicy' {..} =
+    Prelude.rnf clientToken
+      `Prelude.seq` Prelude.rnf tags
+      `Prelude.seq` Prelude.rnf accessPolicyIdentity
+      `Prelude.seq` Prelude.rnf accessPolicyResource
+      `Prelude.seq` Prelude.rnf accessPolicyPermission
+
+instance Data.ToHeaders CreateAccessPolicy where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON CreateAccessPolicy where
+  toJSON CreateAccessPolicy' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("clientToken" Data..=) Prelude.<$> clientToken,
+            ("tags" Data..=) Prelude.<$> tags,
+            Prelude.Just
+              ( "accessPolicyIdentity"
+                  Data..= accessPolicyIdentity
+              ),
+            Prelude.Just
+              ( "accessPolicyResource"
+                  Data..= accessPolicyResource
+              ),
+            Prelude.Just
+              ( "accessPolicyPermission"
+                  Data..= accessPolicyPermission
+              )
+          ]
+      )
+
+instance Data.ToPath CreateAccessPolicy where
+  toPath = Prelude.const "/access-policies"
+
+instance Data.ToQuery CreateAccessPolicy where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newCreateAccessPolicyResponse' smart constructor.
+data CreateAccessPolicyResponse = CreateAccessPolicyResponse'
+  { -- | The response's http status code.
+    httpStatus :: Prelude.Int,
+    -- | The ID of the access policy.
+    accessPolicyId :: Prelude.Text,
+    -- | The
+    -- <https://docs.aws.amazon.com/general/latest/gr/aws-arns-and-namespaces.html ARN>
+    -- of the access policy, which has the following format.
+    --
+    -- @arn:${Partition}:iotsitewise:${Region}:${Account}:access-policy\/${AccessPolicyId}@
+    accessPolicyArn :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'CreateAccessPolicyResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'httpStatus', 'createAccessPolicyResponse_httpStatus' - The response's http status code.
+--
+-- 'accessPolicyId', 'createAccessPolicyResponse_accessPolicyId' - The ID of the access policy.
+--
+-- 'accessPolicyArn', 'createAccessPolicyResponse_accessPolicyArn' - The
+-- <https://docs.aws.amazon.com/general/latest/gr/aws-arns-and-namespaces.html ARN>
+-- of the access policy, which has the following format.
+--
+-- @arn:${Partition}:iotsitewise:${Region}:${Account}:access-policy\/${AccessPolicyId}@
+newCreateAccessPolicyResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  -- | 'accessPolicyId'
+  Prelude.Text ->
+  -- | 'accessPolicyArn'
+  Prelude.Text ->
+  CreateAccessPolicyResponse
+newCreateAccessPolicyResponse
+  pHttpStatus_
+  pAccessPolicyId_
+  pAccessPolicyArn_ =
+    CreateAccessPolicyResponse'
+      { httpStatus =
+          pHttpStatus_,
+        accessPolicyId = pAccessPolicyId_,
+        accessPolicyArn = pAccessPolicyArn_
+      }
+
+-- | The response's http status code.
+createAccessPolicyResponse_httpStatus :: Lens.Lens' CreateAccessPolicyResponse Prelude.Int
+createAccessPolicyResponse_httpStatus = Lens.lens (\CreateAccessPolicyResponse' {httpStatus} -> httpStatus) (\s@CreateAccessPolicyResponse' {} a -> s {httpStatus = a} :: CreateAccessPolicyResponse)
+
+-- | The ID of the access policy.
+createAccessPolicyResponse_accessPolicyId :: Lens.Lens' CreateAccessPolicyResponse Prelude.Text
+createAccessPolicyResponse_accessPolicyId = Lens.lens (\CreateAccessPolicyResponse' {accessPolicyId} -> accessPolicyId) (\s@CreateAccessPolicyResponse' {} a -> s {accessPolicyId = a} :: CreateAccessPolicyResponse)
+
+-- | The
+-- <https://docs.aws.amazon.com/general/latest/gr/aws-arns-and-namespaces.html ARN>
+-- of the access policy, which has the following format.
+--
+-- @arn:${Partition}:iotsitewise:${Region}:${Account}:access-policy\/${AccessPolicyId}@
+createAccessPolicyResponse_accessPolicyArn :: Lens.Lens' CreateAccessPolicyResponse Prelude.Text
+createAccessPolicyResponse_accessPolicyArn = Lens.lens (\CreateAccessPolicyResponse' {accessPolicyArn} -> accessPolicyArn) (\s@CreateAccessPolicyResponse' {} a -> s {accessPolicyArn = a} :: CreateAccessPolicyResponse)
+
+instance Prelude.NFData CreateAccessPolicyResponse where
+  rnf CreateAccessPolicyResponse' {..} =
+    Prelude.rnf httpStatus
+      `Prelude.seq` Prelude.rnf accessPolicyId
+      `Prelude.seq` Prelude.rnf accessPolicyArn
diff --git a/gen/Amazonka/IoTSiteWise/CreateAsset.hs b/gen/Amazonka/IoTSiteWise/CreateAsset.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/IoTSiteWise/CreateAsset.hs
@@ -0,0 +1,290 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.IoTSiteWise.CreateAsset
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Creates an asset from an existing asset model. For more information, see
+-- <https://docs.aws.amazon.com/iot-sitewise/latest/userguide/create-assets.html Creating assets>
+-- in the /IoT SiteWise User Guide/.
+module Amazonka.IoTSiteWise.CreateAsset
+  ( -- * Creating a Request
+    CreateAsset (..),
+    newCreateAsset,
+
+    -- * Request Lenses
+    createAsset_assetDescription,
+    createAsset_clientToken,
+    createAsset_tags,
+    createAsset_assetName,
+    createAsset_assetModelId,
+
+    -- * Destructuring the Response
+    CreateAssetResponse (..),
+    newCreateAssetResponse,
+
+    -- * Response Lenses
+    createAssetResponse_httpStatus,
+    createAssetResponse_assetId,
+    createAssetResponse_assetArn,
+    createAssetResponse_assetStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.IoTSiteWise.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newCreateAsset' smart constructor.
+data CreateAsset = CreateAsset'
+  { -- | A description for the asset.
+    assetDescription :: Prelude.Maybe Prelude.Text,
+    -- | A unique case-sensitive identifier that you can provide to ensure the
+    -- idempotency of the request. Don\'t reuse this client token if a new
+    -- idempotent request is required.
+    clientToken :: Prelude.Maybe Prelude.Text,
+    -- | A list of key-value pairs that contain metadata for the asset. For more
+    -- information, see
+    -- <https://docs.aws.amazon.com/iot-sitewise/latest/userguide/tag-resources.html Tagging your IoT SiteWise resources>
+    -- in the /IoT SiteWise User Guide/.
+    tags :: Prelude.Maybe (Prelude.HashMap Prelude.Text Prelude.Text),
+    -- | A friendly name for the asset.
+    assetName :: Prelude.Text,
+    -- | The ID of the asset model from which to create the asset.
+    assetModelId :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'CreateAsset' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'assetDescription', 'createAsset_assetDescription' - A description for the asset.
+--
+-- 'clientToken', 'createAsset_clientToken' - A unique case-sensitive identifier that you can provide to ensure the
+-- idempotency of the request. Don\'t reuse this client token if a new
+-- idempotent request is required.
+--
+-- 'tags', 'createAsset_tags' - A list of key-value pairs that contain metadata for the asset. For more
+-- information, see
+-- <https://docs.aws.amazon.com/iot-sitewise/latest/userguide/tag-resources.html Tagging your IoT SiteWise resources>
+-- in the /IoT SiteWise User Guide/.
+--
+-- 'assetName', 'createAsset_assetName' - A friendly name for the asset.
+--
+-- 'assetModelId', 'createAsset_assetModelId' - The ID of the asset model from which to create the asset.
+newCreateAsset ::
+  -- | 'assetName'
+  Prelude.Text ->
+  -- | 'assetModelId'
+  Prelude.Text ->
+  CreateAsset
+newCreateAsset pAssetName_ pAssetModelId_ =
+  CreateAsset'
+    { assetDescription = Prelude.Nothing,
+      clientToken = Prelude.Nothing,
+      tags = Prelude.Nothing,
+      assetName = pAssetName_,
+      assetModelId = pAssetModelId_
+    }
+
+-- | A description for the asset.
+createAsset_assetDescription :: Lens.Lens' CreateAsset (Prelude.Maybe Prelude.Text)
+createAsset_assetDescription = Lens.lens (\CreateAsset' {assetDescription} -> assetDescription) (\s@CreateAsset' {} a -> s {assetDescription = a} :: CreateAsset)
+
+-- | A unique case-sensitive identifier that you can provide to ensure the
+-- idempotency of the request. Don\'t reuse this client token if a new
+-- idempotent request is required.
+createAsset_clientToken :: Lens.Lens' CreateAsset (Prelude.Maybe Prelude.Text)
+createAsset_clientToken = Lens.lens (\CreateAsset' {clientToken} -> clientToken) (\s@CreateAsset' {} a -> s {clientToken = a} :: CreateAsset)
+
+-- | A list of key-value pairs that contain metadata for the asset. For more
+-- information, see
+-- <https://docs.aws.amazon.com/iot-sitewise/latest/userguide/tag-resources.html Tagging your IoT SiteWise resources>
+-- in the /IoT SiteWise User Guide/.
+createAsset_tags :: Lens.Lens' CreateAsset (Prelude.Maybe (Prelude.HashMap Prelude.Text Prelude.Text))
+createAsset_tags = Lens.lens (\CreateAsset' {tags} -> tags) (\s@CreateAsset' {} a -> s {tags = a} :: CreateAsset) Prelude.. Lens.mapping Lens.coerced
+
+-- | A friendly name for the asset.
+createAsset_assetName :: Lens.Lens' CreateAsset Prelude.Text
+createAsset_assetName = Lens.lens (\CreateAsset' {assetName} -> assetName) (\s@CreateAsset' {} a -> s {assetName = a} :: CreateAsset)
+
+-- | The ID of the asset model from which to create the asset.
+createAsset_assetModelId :: Lens.Lens' CreateAsset Prelude.Text
+createAsset_assetModelId = Lens.lens (\CreateAsset' {assetModelId} -> assetModelId) (\s@CreateAsset' {} a -> s {assetModelId = a} :: CreateAsset)
+
+instance Core.AWSRequest CreateAsset where
+  type AWSResponse CreateAsset = CreateAssetResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          CreateAssetResponse'
+            Prelude.<$> (Prelude.pure (Prelude.fromEnum s))
+            Prelude.<*> (x Data..:> "assetId")
+            Prelude.<*> (x Data..:> "assetArn")
+            Prelude.<*> (x Data..:> "assetStatus")
+      )
+
+instance Prelude.Hashable CreateAsset where
+  hashWithSalt _salt CreateAsset' {..} =
+    _salt
+      `Prelude.hashWithSalt` assetDescription
+      `Prelude.hashWithSalt` clientToken
+      `Prelude.hashWithSalt` tags
+      `Prelude.hashWithSalt` assetName
+      `Prelude.hashWithSalt` assetModelId
+
+instance Prelude.NFData CreateAsset where
+  rnf CreateAsset' {..} =
+    Prelude.rnf assetDescription
+      `Prelude.seq` Prelude.rnf clientToken
+      `Prelude.seq` Prelude.rnf tags
+      `Prelude.seq` Prelude.rnf assetName
+      `Prelude.seq` Prelude.rnf assetModelId
+
+instance Data.ToHeaders CreateAsset where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON CreateAsset where
+  toJSON CreateAsset' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("assetDescription" Data..=)
+              Prelude.<$> assetDescription,
+            ("clientToken" Data..=) Prelude.<$> clientToken,
+            ("tags" Data..=) Prelude.<$> tags,
+            Prelude.Just ("assetName" Data..= assetName),
+            Prelude.Just ("assetModelId" Data..= assetModelId)
+          ]
+      )
+
+instance Data.ToPath CreateAsset where
+  toPath = Prelude.const "/assets"
+
+instance Data.ToQuery CreateAsset where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newCreateAssetResponse' smart constructor.
+data CreateAssetResponse = CreateAssetResponse'
+  { -- | The response's http status code.
+    httpStatus :: Prelude.Int,
+    -- | The ID of the asset. This ID uniquely identifies the asset within IoT
+    -- SiteWise and can be used with other IoT SiteWise APIs.
+    assetId :: Prelude.Text,
+    -- | The
+    -- <https://docs.aws.amazon.com/general/latest/gr/aws-arns-and-namespaces.html ARN>
+    -- of the asset, which has the following format.
+    --
+    -- @arn:${Partition}:iotsitewise:${Region}:${Account}:asset\/${AssetId}@
+    assetArn :: Prelude.Text,
+    -- | The status of the asset, which contains a state (@CREATING@ after
+    -- successfully calling this operation) and any error message.
+    assetStatus :: AssetStatus
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'CreateAssetResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'httpStatus', 'createAssetResponse_httpStatus' - The response's http status code.
+--
+-- 'assetId', 'createAssetResponse_assetId' - The ID of the asset. This ID uniquely identifies the asset within IoT
+-- SiteWise and can be used with other IoT SiteWise APIs.
+--
+-- 'assetArn', 'createAssetResponse_assetArn' - The
+-- <https://docs.aws.amazon.com/general/latest/gr/aws-arns-and-namespaces.html ARN>
+-- of the asset, which has the following format.
+--
+-- @arn:${Partition}:iotsitewise:${Region}:${Account}:asset\/${AssetId}@
+--
+-- 'assetStatus', 'createAssetResponse_assetStatus' - The status of the asset, which contains a state (@CREATING@ after
+-- successfully calling this operation) and any error message.
+newCreateAssetResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  -- | 'assetId'
+  Prelude.Text ->
+  -- | 'assetArn'
+  Prelude.Text ->
+  -- | 'assetStatus'
+  AssetStatus ->
+  CreateAssetResponse
+newCreateAssetResponse
+  pHttpStatus_
+  pAssetId_
+  pAssetArn_
+  pAssetStatus_ =
+    CreateAssetResponse'
+      { httpStatus = pHttpStatus_,
+        assetId = pAssetId_,
+        assetArn = pAssetArn_,
+        assetStatus = pAssetStatus_
+      }
+
+-- | The response's http status code.
+createAssetResponse_httpStatus :: Lens.Lens' CreateAssetResponse Prelude.Int
+createAssetResponse_httpStatus = Lens.lens (\CreateAssetResponse' {httpStatus} -> httpStatus) (\s@CreateAssetResponse' {} a -> s {httpStatus = a} :: CreateAssetResponse)
+
+-- | The ID of the asset. This ID uniquely identifies the asset within IoT
+-- SiteWise and can be used with other IoT SiteWise APIs.
+createAssetResponse_assetId :: Lens.Lens' CreateAssetResponse Prelude.Text
+createAssetResponse_assetId = Lens.lens (\CreateAssetResponse' {assetId} -> assetId) (\s@CreateAssetResponse' {} a -> s {assetId = a} :: CreateAssetResponse)
+
+-- | The
+-- <https://docs.aws.amazon.com/general/latest/gr/aws-arns-and-namespaces.html ARN>
+-- of the asset, which has the following format.
+--
+-- @arn:${Partition}:iotsitewise:${Region}:${Account}:asset\/${AssetId}@
+createAssetResponse_assetArn :: Lens.Lens' CreateAssetResponse Prelude.Text
+createAssetResponse_assetArn = Lens.lens (\CreateAssetResponse' {assetArn} -> assetArn) (\s@CreateAssetResponse' {} a -> s {assetArn = a} :: CreateAssetResponse)
+
+-- | The status of the asset, which contains a state (@CREATING@ after
+-- successfully calling this operation) and any error message.
+createAssetResponse_assetStatus :: Lens.Lens' CreateAssetResponse AssetStatus
+createAssetResponse_assetStatus = Lens.lens (\CreateAssetResponse' {assetStatus} -> assetStatus) (\s@CreateAssetResponse' {} a -> s {assetStatus = a} :: CreateAssetResponse)
+
+instance Prelude.NFData CreateAssetResponse where
+  rnf CreateAssetResponse' {..} =
+    Prelude.rnf httpStatus
+      `Prelude.seq` Prelude.rnf assetId
+      `Prelude.seq` Prelude.rnf assetArn
+      `Prelude.seq` Prelude.rnf assetStatus
diff --git a/gen/Amazonka/IoTSiteWise/CreateAssetModel.hs b/gen/Amazonka/IoTSiteWise/CreateAssetModel.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/IoTSiteWise/CreateAssetModel.hs
@@ -0,0 +1,386 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.IoTSiteWise.CreateAssetModel
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Creates an asset model from specified property and hierarchy
+-- definitions. You create assets from asset models. With asset models, you
+-- can easily create assets of the same type that have standardized
+-- definitions. Each asset created from a model inherits the asset model\'s
+-- property and hierarchy definitions. For more information, see
+-- <https://docs.aws.amazon.com/iot-sitewise/latest/userguide/define-models.html Defining asset models>
+-- in the /IoT SiteWise User Guide/.
+module Amazonka.IoTSiteWise.CreateAssetModel
+  ( -- * Creating a Request
+    CreateAssetModel (..),
+    newCreateAssetModel,
+
+    -- * Request Lenses
+    createAssetModel_assetModelCompositeModels,
+    createAssetModel_assetModelDescription,
+    createAssetModel_assetModelHierarchies,
+    createAssetModel_assetModelProperties,
+    createAssetModel_clientToken,
+    createAssetModel_tags,
+    createAssetModel_assetModelName,
+
+    -- * Destructuring the Response
+    CreateAssetModelResponse (..),
+    newCreateAssetModelResponse,
+
+    -- * Response Lenses
+    createAssetModelResponse_httpStatus,
+    createAssetModelResponse_assetModelId,
+    createAssetModelResponse_assetModelArn,
+    createAssetModelResponse_assetModelStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.IoTSiteWise.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newCreateAssetModel' smart constructor.
+data CreateAssetModel = CreateAssetModel'
+  { -- | The composite asset models that are part of this asset model. Composite
+    -- asset models are asset models that contain specific properties. Each
+    -- composite model has a type that defines the properties that the
+    -- composite model supports. Use composite asset models to define alarms on
+    -- this asset model.
+    assetModelCompositeModels :: Prelude.Maybe [AssetModelCompositeModelDefinition],
+    -- | A description for the asset model.
+    assetModelDescription :: Prelude.Maybe Prelude.Text,
+    -- | The hierarchy definitions of the asset model. Each hierarchy specifies
+    -- an asset model whose assets can be children of any other assets created
+    -- from this asset model. For more information, see
+    -- <https://docs.aws.amazon.com/iot-sitewise/latest/userguide/asset-hierarchies.html Asset hierarchies>
+    -- in the /IoT SiteWise User Guide/.
+    --
+    -- You can specify up to 10 hierarchies per asset model. For more
+    -- information, see
+    -- <https://docs.aws.amazon.com/iot-sitewise/latest/userguide/quotas.html Quotas>
+    -- in the /IoT SiteWise User Guide/.
+    assetModelHierarchies :: Prelude.Maybe [AssetModelHierarchyDefinition],
+    -- | The property definitions of the asset model. For more information, see
+    -- <https://docs.aws.amazon.com/iot-sitewise/latest/userguide/asset-properties.html Asset properties>
+    -- in the /IoT SiteWise User Guide/.
+    --
+    -- You can specify up to 200 properties per asset model. For more
+    -- information, see
+    -- <https://docs.aws.amazon.com/iot-sitewise/latest/userguide/quotas.html Quotas>
+    -- in the /IoT SiteWise User Guide/.
+    assetModelProperties :: Prelude.Maybe [AssetModelPropertyDefinition],
+    -- | A unique case-sensitive identifier that you can provide to ensure the
+    -- idempotency of the request. Don\'t reuse this client token if a new
+    -- idempotent request is required.
+    clientToken :: Prelude.Maybe Prelude.Text,
+    -- | A list of key-value pairs that contain metadata for the asset model. For
+    -- more information, see
+    -- <https://docs.aws.amazon.com/iot-sitewise/latest/userguide/tag-resources.html Tagging your IoT SiteWise resources>
+    -- in the /IoT SiteWise User Guide/.
+    tags :: Prelude.Maybe (Prelude.HashMap Prelude.Text Prelude.Text),
+    -- | A unique, friendly name for the asset model.
+    assetModelName :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'CreateAssetModel' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'assetModelCompositeModels', 'createAssetModel_assetModelCompositeModels' - The composite asset models that are part of this asset model. Composite
+-- asset models are asset models that contain specific properties. Each
+-- composite model has a type that defines the properties that the
+-- composite model supports. Use composite asset models to define alarms on
+-- this asset model.
+--
+-- 'assetModelDescription', 'createAssetModel_assetModelDescription' - A description for the asset model.
+--
+-- 'assetModelHierarchies', 'createAssetModel_assetModelHierarchies' - The hierarchy definitions of the asset model. Each hierarchy specifies
+-- an asset model whose assets can be children of any other assets created
+-- from this asset model. For more information, see
+-- <https://docs.aws.amazon.com/iot-sitewise/latest/userguide/asset-hierarchies.html Asset hierarchies>
+-- in the /IoT SiteWise User Guide/.
+--
+-- You can specify up to 10 hierarchies per asset model. For more
+-- information, see
+-- <https://docs.aws.amazon.com/iot-sitewise/latest/userguide/quotas.html Quotas>
+-- in the /IoT SiteWise User Guide/.
+--
+-- 'assetModelProperties', 'createAssetModel_assetModelProperties' - The property definitions of the asset model. For more information, see
+-- <https://docs.aws.amazon.com/iot-sitewise/latest/userguide/asset-properties.html Asset properties>
+-- in the /IoT SiteWise User Guide/.
+--
+-- You can specify up to 200 properties per asset model. For more
+-- information, see
+-- <https://docs.aws.amazon.com/iot-sitewise/latest/userguide/quotas.html Quotas>
+-- in the /IoT SiteWise User Guide/.
+--
+-- 'clientToken', 'createAssetModel_clientToken' - A unique case-sensitive identifier that you can provide to ensure the
+-- idempotency of the request. Don\'t reuse this client token if a new
+-- idempotent request is required.
+--
+-- 'tags', 'createAssetModel_tags' - A list of key-value pairs that contain metadata for the asset model. For
+-- more information, see
+-- <https://docs.aws.amazon.com/iot-sitewise/latest/userguide/tag-resources.html Tagging your IoT SiteWise resources>
+-- in the /IoT SiteWise User Guide/.
+--
+-- 'assetModelName', 'createAssetModel_assetModelName' - A unique, friendly name for the asset model.
+newCreateAssetModel ::
+  -- | 'assetModelName'
+  Prelude.Text ->
+  CreateAssetModel
+newCreateAssetModel pAssetModelName_ =
+  CreateAssetModel'
+    { assetModelCompositeModels =
+        Prelude.Nothing,
+      assetModelDescription = Prelude.Nothing,
+      assetModelHierarchies = Prelude.Nothing,
+      assetModelProperties = Prelude.Nothing,
+      clientToken = Prelude.Nothing,
+      tags = Prelude.Nothing,
+      assetModelName = pAssetModelName_
+    }
+
+-- | The composite asset models that are part of this asset model. Composite
+-- asset models are asset models that contain specific properties. Each
+-- composite model has a type that defines the properties that the
+-- composite model supports. Use composite asset models to define alarms on
+-- this asset model.
+createAssetModel_assetModelCompositeModels :: Lens.Lens' CreateAssetModel (Prelude.Maybe [AssetModelCompositeModelDefinition])
+createAssetModel_assetModelCompositeModels = Lens.lens (\CreateAssetModel' {assetModelCompositeModels} -> assetModelCompositeModels) (\s@CreateAssetModel' {} a -> s {assetModelCompositeModels = a} :: CreateAssetModel) Prelude.. Lens.mapping Lens.coerced
+
+-- | A description for the asset model.
+createAssetModel_assetModelDescription :: Lens.Lens' CreateAssetModel (Prelude.Maybe Prelude.Text)
+createAssetModel_assetModelDescription = Lens.lens (\CreateAssetModel' {assetModelDescription} -> assetModelDescription) (\s@CreateAssetModel' {} a -> s {assetModelDescription = a} :: CreateAssetModel)
+
+-- | The hierarchy definitions of the asset model. Each hierarchy specifies
+-- an asset model whose assets can be children of any other assets created
+-- from this asset model. For more information, see
+-- <https://docs.aws.amazon.com/iot-sitewise/latest/userguide/asset-hierarchies.html Asset hierarchies>
+-- in the /IoT SiteWise User Guide/.
+--
+-- You can specify up to 10 hierarchies per asset model. For more
+-- information, see
+-- <https://docs.aws.amazon.com/iot-sitewise/latest/userguide/quotas.html Quotas>
+-- in the /IoT SiteWise User Guide/.
+createAssetModel_assetModelHierarchies :: Lens.Lens' CreateAssetModel (Prelude.Maybe [AssetModelHierarchyDefinition])
+createAssetModel_assetModelHierarchies = Lens.lens (\CreateAssetModel' {assetModelHierarchies} -> assetModelHierarchies) (\s@CreateAssetModel' {} a -> s {assetModelHierarchies = a} :: CreateAssetModel) Prelude.. Lens.mapping Lens.coerced
+
+-- | The property definitions of the asset model. For more information, see
+-- <https://docs.aws.amazon.com/iot-sitewise/latest/userguide/asset-properties.html Asset properties>
+-- in the /IoT SiteWise User Guide/.
+--
+-- You can specify up to 200 properties per asset model. For more
+-- information, see
+-- <https://docs.aws.amazon.com/iot-sitewise/latest/userguide/quotas.html Quotas>
+-- in the /IoT SiteWise User Guide/.
+createAssetModel_assetModelProperties :: Lens.Lens' CreateAssetModel (Prelude.Maybe [AssetModelPropertyDefinition])
+createAssetModel_assetModelProperties = Lens.lens (\CreateAssetModel' {assetModelProperties} -> assetModelProperties) (\s@CreateAssetModel' {} a -> s {assetModelProperties = a} :: CreateAssetModel) Prelude.. Lens.mapping Lens.coerced
+
+-- | A unique case-sensitive identifier that you can provide to ensure the
+-- idempotency of the request. Don\'t reuse this client token if a new
+-- idempotent request is required.
+createAssetModel_clientToken :: Lens.Lens' CreateAssetModel (Prelude.Maybe Prelude.Text)
+createAssetModel_clientToken = Lens.lens (\CreateAssetModel' {clientToken} -> clientToken) (\s@CreateAssetModel' {} a -> s {clientToken = a} :: CreateAssetModel)
+
+-- | A list of key-value pairs that contain metadata for the asset model. For
+-- more information, see
+-- <https://docs.aws.amazon.com/iot-sitewise/latest/userguide/tag-resources.html Tagging your IoT SiteWise resources>
+-- in the /IoT SiteWise User Guide/.
+createAssetModel_tags :: Lens.Lens' CreateAssetModel (Prelude.Maybe (Prelude.HashMap Prelude.Text Prelude.Text))
+createAssetModel_tags = Lens.lens (\CreateAssetModel' {tags} -> tags) (\s@CreateAssetModel' {} a -> s {tags = a} :: CreateAssetModel) Prelude.. Lens.mapping Lens.coerced
+
+-- | A unique, friendly name for the asset model.
+createAssetModel_assetModelName :: Lens.Lens' CreateAssetModel Prelude.Text
+createAssetModel_assetModelName = Lens.lens (\CreateAssetModel' {assetModelName} -> assetModelName) (\s@CreateAssetModel' {} a -> s {assetModelName = a} :: CreateAssetModel)
+
+instance Core.AWSRequest CreateAssetModel where
+  type
+    AWSResponse CreateAssetModel =
+      CreateAssetModelResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          CreateAssetModelResponse'
+            Prelude.<$> (Prelude.pure (Prelude.fromEnum s))
+            Prelude.<*> (x Data..:> "assetModelId")
+            Prelude.<*> (x Data..:> "assetModelArn")
+            Prelude.<*> (x Data..:> "assetModelStatus")
+      )
+
+instance Prelude.Hashable CreateAssetModel where
+  hashWithSalt _salt CreateAssetModel' {..} =
+    _salt
+      `Prelude.hashWithSalt` assetModelCompositeModels
+      `Prelude.hashWithSalt` assetModelDescription
+      `Prelude.hashWithSalt` assetModelHierarchies
+      `Prelude.hashWithSalt` assetModelProperties
+      `Prelude.hashWithSalt` clientToken
+      `Prelude.hashWithSalt` tags
+      `Prelude.hashWithSalt` assetModelName
+
+instance Prelude.NFData CreateAssetModel where
+  rnf CreateAssetModel' {..} =
+    Prelude.rnf assetModelCompositeModels
+      `Prelude.seq` Prelude.rnf assetModelDescription
+      `Prelude.seq` Prelude.rnf assetModelHierarchies
+      `Prelude.seq` Prelude.rnf assetModelProperties
+      `Prelude.seq` Prelude.rnf clientToken
+      `Prelude.seq` Prelude.rnf tags
+      `Prelude.seq` Prelude.rnf assetModelName
+
+instance Data.ToHeaders CreateAssetModel where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON CreateAssetModel where
+  toJSON CreateAssetModel' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("assetModelCompositeModels" Data..=)
+              Prelude.<$> assetModelCompositeModels,
+            ("assetModelDescription" Data..=)
+              Prelude.<$> assetModelDescription,
+            ("assetModelHierarchies" Data..=)
+              Prelude.<$> assetModelHierarchies,
+            ("assetModelProperties" Data..=)
+              Prelude.<$> assetModelProperties,
+            ("clientToken" Data..=) Prelude.<$> clientToken,
+            ("tags" Data..=) Prelude.<$> tags,
+            Prelude.Just
+              ("assetModelName" Data..= assetModelName)
+          ]
+      )
+
+instance Data.ToPath CreateAssetModel where
+  toPath = Prelude.const "/asset-models"
+
+instance Data.ToQuery CreateAssetModel where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newCreateAssetModelResponse' smart constructor.
+data CreateAssetModelResponse = CreateAssetModelResponse'
+  { -- | The response's http status code.
+    httpStatus :: Prelude.Int,
+    -- | The ID of the asset model. You can use this ID when you call other IoT
+    -- SiteWise APIs.
+    assetModelId :: Prelude.Text,
+    -- | The
+    -- <https://docs.aws.amazon.com/general/latest/gr/aws-arns-and-namespaces.html ARN>
+    -- of the asset model, which has the following format.
+    --
+    -- @arn:${Partition}:iotsitewise:${Region}:${Account}:asset-model\/${AssetModelId}@
+    assetModelArn :: Prelude.Text,
+    -- | The status of the asset model, which contains a state (@CREATING@ after
+    -- successfully calling this operation) and any error message.
+    assetModelStatus :: AssetModelStatus
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'CreateAssetModelResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'httpStatus', 'createAssetModelResponse_httpStatus' - The response's http status code.
+--
+-- 'assetModelId', 'createAssetModelResponse_assetModelId' - The ID of the asset model. You can use this ID when you call other IoT
+-- SiteWise APIs.
+--
+-- 'assetModelArn', 'createAssetModelResponse_assetModelArn' - The
+-- <https://docs.aws.amazon.com/general/latest/gr/aws-arns-and-namespaces.html ARN>
+-- of the asset model, which has the following format.
+--
+-- @arn:${Partition}:iotsitewise:${Region}:${Account}:asset-model\/${AssetModelId}@
+--
+-- 'assetModelStatus', 'createAssetModelResponse_assetModelStatus' - The status of the asset model, which contains a state (@CREATING@ after
+-- successfully calling this operation) and any error message.
+newCreateAssetModelResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  -- | 'assetModelId'
+  Prelude.Text ->
+  -- | 'assetModelArn'
+  Prelude.Text ->
+  -- | 'assetModelStatus'
+  AssetModelStatus ->
+  CreateAssetModelResponse
+newCreateAssetModelResponse
+  pHttpStatus_
+  pAssetModelId_
+  pAssetModelArn_
+  pAssetModelStatus_ =
+    CreateAssetModelResponse'
+      { httpStatus =
+          pHttpStatus_,
+        assetModelId = pAssetModelId_,
+        assetModelArn = pAssetModelArn_,
+        assetModelStatus = pAssetModelStatus_
+      }
+
+-- | The response's http status code.
+createAssetModelResponse_httpStatus :: Lens.Lens' CreateAssetModelResponse Prelude.Int
+createAssetModelResponse_httpStatus = Lens.lens (\CreateAssetModelResponse' {httpStatus} -> httpStatus) (\s@CreateAssetModelResponse' {} a -> s {httpStatus = a} :: CreateAssetModelResponse)
+
+-- | The ID of the asset model. You can use this ID when you call other IoT
+-- SiteWise APIs.
+createAssetModelResponse_assetModelId :: Lens.Lens' CreateAssetModelResponse Prelude.Text
+createAssetModelResponse_assetModelId = Lens.lens (\CreateAssetModelResponse' {assetModelId} -> assetModelId) (\s@CreateAssetModelResponse' {} a -> s {assetModelId = a} :: CreateAssetModelResponse)
+
+-- | The
+-- <https://docs.aws.amazon.com/general/latest/gr/aws-arns-and-namespaces.html ARN>
+-- of the asset model, which has the following format.
+--
+-- @arn:${Partition}:iotsitewise:${Region}:${Account}:asset-model\/${AssetModelId}@
+createAssetModelResponse_assetModelArn :: Lens.Lens' CreateAssetModelResponse Prelude.Text
+createAssetModelResponse_assetModelArn = Lens.lens (\CreateAssetModelResponse' {assetModelArn} -> assetModelArn) (\s@CreateAssetModelResponse' {} a -> s {assetModelArn = a} :: CreateAssetModelResponse)
+
+-- | The status of the asset model, which contains a state (@CREATING@ after
+-- successfully calling this operation) and any error message.
+createAssetModelResponse_assetModelStatus :: Lens.Lens' CreateAssetModelResponse AssetModelStatus
+createAssetModelResponse_assetModelStatus = Lens.lens (\CreateAssetModelResponse' {assetModelStatus} -> assetModelStatus) (\s@CreateAssetModelResponse' {} a -> s {assetModelStatus = a} :: CreateAssetModelResponse)
+
+instance Prelude.NFData CreateAssetModelResponse where
+  rnf CreateAssetModelResponse' {..} =
+    Prelude.rnf httpStatus
+      `Prelude.seq` Prelude.rnf assetModelId
+      `Prelude.seq` Prelude.rnf assetModelArn
+      `Prelude.seq` Prelude.rnf assetModelStatus
diff --git a/gen/Amazonka/IoTSiteWise/CreateBulkImportJob.hs b/gen/Amazonka/IoTSiteWise/CreateBulkImportJob.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/IoTSiteWise/CreateBulkImportJob.hs
@@ -0,0 +1,347 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.IoTSiteWise.CreateBulkImportJob
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Defines a job to ingest data to IoT SiteWise from Amazon S3. For more
+-- information, see
+-- <https://docs.aws.amazon.com/iot-sitewise/latest/userguide/CreateBulkImportJob.html Create a bulk import job (CLI)>
+-- in the /Amazon Simple Storage Service User Guide/.
+--
+-- You must enable IoT SiteWise to export data to Amazon S3 before you
+-- create a bulk import job. For more information about how to configure
+-- storage settings, see
+-- <https://docs.aws.amazon.com/iot-sitewise/latest/APIReference/API_PutStorageConfiguration.html PutStorageConfiguration>.
+module Amazonka.IoTSiteWise.CreateBulkImportJob
+  ( -- * Creating a Request
+    CreateBulkImportJob (..),
+    newCreateBulkImportJob,
+
+    -- * Request Lenses
+    createBulkImportJob_jobName,
+    createBulkImportJob_jobRoleArn,
+    createBulkImportJob_files,
+    createBulkImportJob_errorReportLocation,
+    createBulkImportJob_jobConfiguration,
+
+    -- * Destructuring the Response
+    CreateBulkImportJobResponse (..),
+    newCreateBulkImportJobResponse,
+
+    -- * Response Lenses
+    createBulkImportJobResponse_httpStatus,
+    createBulkImportJobResponse_jobId,
+    createBulkImportJobResponse_jobName,
+    createBulkImportJobResponse_jobStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.IoTSiteWise.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newCreateBulkImportJob' smart constructor.
+data CreateBulkImportJob = CreateBulkImportJob'
+  { -- | The unique name that helps identify the job request.
+    jobName :: Prelude.Text,
+    -- | The
+    -- <https://docs.aws.amazon.com/general/latest/gr/aws-arns-and-namespaces.html ARN>
+    -- of the IAM role that allows IoT SiteWise to read Amazon S3 data.
+    jobRoleArn :: Prelude.Text,
+    -- | The files in the specified Amazon S3 bucket that contain your data.
+    files :: [File],
+    -- | The Amazon S3 destination where errors associated with the job creation
+    -- request are saved.
+    errorReportLocation :: ErrorReportLocation,
+    -- | Contains the configuration information of a job, such as the file format
+    -- used to save data in Amazon S3.
+    jobConfiguration :: JobConfiguration
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'CreateBulkImportJob' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'jobName', 'createBulkImportJob_jobName' - The unique name that helps identify the job request.
+--
+-- 'jobRoleArn', 'createBulkImportJob_jobRoleArn' - The
+-- <https://docs.aws.amazon.com/general/latest/gr/aws-arns-and-namespaces.html ARN>
+-- of the IAM role that allows IoT SiteWise to read Amazon S3 data.
+--
+-- 'files', 'createBulkImportJob_files' - The files in the specified Amazon S3 bucket that contain your data.
+--
+-- 'errorReportLocation', 'createBulkImportJob_errorReportLocation' - The Amazon S3 destination where errors associated with the job creation
+-- request are saved.
+--
+-- 'jobConfiguration', 'createBulkImportJob_jobConfiguration' - Contains the configuration information of a job, such as the file format
+-- used to save data in Amazon S3.
+newCreateBulkImportJob ::
+  -- | 'jobName'
+  Prelude.Text ->
+  -- | 'jobRoleArn'
+  Prelude.Text ->
+  -- | 'errorReportLocation'
+  ErrorReportLocation ->
+  -- | 'jobConfiguration'
+  JobConfiguration ->
+  CreateBulkImportJob
+newCreateBulkImportJob
+  pJobName_
+  pJobRoleArn_
+  pErrorReportLocation_
+  pJobConfiguration_ =
+    CreateBulkImportJob'
+      { jobName = pJobName_,
+        jobRoleArn = pJobRoleArn_,
+        files = Prelude.mempty,
+        errorReportLocation = pErrorReportLocation_,
+        jobConfiguration = pJobConfiguration_
+      }
+
+-- | The unique name that helps identify the job request.
+createBulkImportJob_jobName :: Lens.Lens' CreateBulkImportJob Prelude.Text
+createBulkImportJob_jobName = Lens.lens (\CreateBulkImportJob' {jobName} -> jobName) (\s@CreateBulkImportJob' {} a -> s {jobName = a} :: CreateBulkImportJob)
+
+-- | The
+-- <https://docs.aws.amazon.com/general/latest/gr/aws-arns-and-namespaces.html ARN>
+-- of the IAM role that allows IoT SiteWise to read Amazon S3 data.
+createBulkImportJob_jobRoleArn :: Lens.Lens' CreateBulkImportJob Prelude.Text
+createBulkImportJob_jobRoleArn = Lens.lens (\CreateBulkImportJob' {jobRoleArn} -> jobRoleArn) (\s@CreateBulkImportJob' {} a -> s {jobRoleArn = a} :: CreateBulkImportJob)
+
+-- | The files in the specified Amazon S3 bucket that contain your data.
+createBulkImportJob_files :: Lens.Lens' CreateBulkImportJob [File]
+createBulkImportJob_files = Lens.lens (\CreateBulkImportJob' {files} -> files) (\s@CreateBulkImportJob' {} a -> s {files = a} :: CreateBulkImportJob) Prelude.. Lens.coerced
+
+-- | The Amazon S3 destination where errors associated with the job creation
+-- request are saved.
+createBulkImportJob_errorReportLocation :: Lens.Lens' CreateBulkImportJob ErrorReportLocation
+createBulkImportJob_errorReportLocation = Lens.lens (\CreateBulkImportJob' {errorReportLocation} -> errorReportLocation) (\s@CreateBulkImportJob' {} a -> s {errorReportLocation = a} :: CreateBulkImportJob)
+
+-- | Contains the configuration information of a job, such as the file format
+-- used to save data in Amazon S3.
+createBulkImportJob_jobConfiguration :: Lens.Lens' CreateBulkImportJob JobConfiguration
+createBulkImportJob_jobConfiguration = Lens.lens (\CreateBulkImportJob' {jobConfiguration} -> jobConfiguration) (\s@CreateBulkImportJob' {} a -> s {jobConfiguration = a} :: CreateBulkImportJob)
+
+instance Core.AWSRequest CreateBulkImportJob where
+  type
+    AWSResponse CreateBulkImportJob =
+      CreateBulkImportJobResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          CreateBulkImportJobResponse'
+            Prelude.<$> (Prelude.pure (Prelude.fromEnum s))
+            Prelude.<*> (x Data..:> "jobId")
+            Prelude.<*> (x Data..:> "jobName")
+            Prelude.<*> (x Data..:> "jobStatus")
+      )
+
+instance Prelude.Hashable CreateBulkImportJob where
+  hashWithSalt _salt CreateBulkImportJob' {..} =
+    _salt
+      `Prelude.hashWithSalt` jobName
+      `Prelude.hashWithSalt` jobRoleArn
+      `Prelude.hashWithSalt` files
+      `Prelude.hashWithSalt` errorReportLocation
+      `Prelude.hashWithSalt` jobConfiguration
+
+instance Prelude.NFData CreateBulkImportJob where
+  rnf CreateBulkImportJob' {..} =
+    Prelude.rnf jobName
+      `Prelude.seq` Prelude.rnf jobRoleArn
+      `Prelude.seq` Prelude.rnf files
+      `Prelude.seq` Prelude.rnf errorReportLocation
+      `Prelude.seq` Prelude.rnf jobConfiguration
+
+instance Data.ToHeaders CreateBulkImportJob where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON CreateBulkImportJob where
+  toJSON CreateBulkImportJob' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ Prelude.Just ("jobName" Data..= jobName),
+            Prelude.Just ("jobRoleArn" Data..= jobRoleArn),
+            Prelude.Just ("files" Data..= files),
+            Prelude.Just
+              ("errorReportLocation" Data..= errorReportLocation),
+            Prelude.Just
+              ("jobConfiguration" Data..= jobConfiguration)
+          ]
+      )
+
+instance Data.ToPath CreateBulkImportJob where
+  toPath = Prelude.const "/jobs"
+
+instance Data.ToQuery CreateBulkImportJob where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newCreateBulkImportJobResponse' smart constructor.
+data CreateBulkImportJobResponse = CreateBulkImportJobResponse'
+  { -- | The response's http status code.
+    httpStatus :: Prelude.Int,
+    -- | The ID of the job.
+    jobId :: Prelude.Text,
+    -- | The unique name that helps identify the job request.
+    jobName :: Prelude.Text,
+    -- | The status of the bulk import job can be one of following values.
+    --
+    -- -   @PENDING@ – IoT SiteWise is waiting for the current bulk import job
+    --     to finish.
+    --
+    -- -   @CANCELLED@ – The bulk import job has been canceled.
+    --
+    -- -   @RUNNING@ – IoT SiteWise is processing your request to import your
+    --     data from Amazon S3.
+    --
+    -- -   @COMPLETED@ – IoT SiteWise successfully completed your request to
+    --     import data from Amazon S3.
+    --
+    -- -   @FAILED@ – IoT SiteWise couldn\'t process your request to import
+    --     data from Amazon S3. You can use logs saved in the specified error
+    --     report location in Amazon S3 to troubleshoot issues.
+    --
+    -- -   @COMPLETED_WITH_FAILURES@ – IoT SiteWise completed your request to
+    --     import data from Amazon S3 with errors. You can use logs saved in
+    --     the specified error report location in Amazon S3 to troubleshoot
+    --     issues.
+    jobStatus :: JobStatus
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'CreateBulkImportJobResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'httpStatus', 'createBulkImportJobResponse_httpStatus' - The response's http status code.
+--
+-- 'jobId', 'createBulkImportJobResponse_jobId' - The ID of the job.
+--
+-- 'jobName', 'createBulkImportJobResponse_jobName' - The unique name that helps identify the job request.
+--
+-- 'jobStatus', 'createBulkImportJobResponse_jobStatus' - The status of the bulk import job can be one of following values.
+--
+-- -   @PENDING@ – IoT SiteWise is waiting for the current bulk import job
+--     to finish.
+--
+-- -   @CANCELLED@ – The bulk import job has been canceled.
+--
+-- -   @RUNNING@ – IoT SiteWise is processing your request to import your
+--     data from Amazon S3.
+--
+-- -   @COMPLETED@ – IoT SiteWise successfully completed your request to
+--     import data from Amazon S3.
+--
+-- -   @FAILED@ – IoT SiteWise couldn\'t process your request to import
+--     data from Amazon S3. You can use logs saved in the specified error
+--     report location in Amazon S3 to troubleshoot issues.
+--
+-- -   @COMPLETED_WITH_FAILURES@ – IoT SiteWise completed your request to
+--     import data from Amazon S3 with errors. You can use logs saved in
+--     the specified error report location in Amazon S3 to troubleshoot
+--     issues.
+newCreateBulkImportJobResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  -- | 'jobId'
+  Prelude.Text ->
+  -- | 'jobName'
+  Prelude.Text ->
+  -- | 'jobStatus'
+  JobStatus ->
+  CreateBulkImportJobResponse
+newCreateBulkImportJobResponse
+  pHttpStatus_
+  pJobId_
+  pJobName_
+  pJobStatus_ =
+    CreateBulkImportJobResponse'
+      { httpStatus =
+          pHttpStatus_,
+        jobId = pJobId_,
+        jobName = pJobName_,
+        jobStatus = pJobStatus_
+      }
+
+-- | The response's http status code.
+createBulkImportJobResponse_httpStatus :: Lens.Lens' CreateBulkImportJobResponse Prelude.Int
+createBulkImportJobResponse_httpStatus = Lens.lens (\CreateBulkImportJobResponse' {httpStatus} -> httpStatus) (\s@CreateBulkImportJobResponse' {} a -> s {httpStatus = a} :: CreateBulkImportJobResponse)
+
+-- | The ID of the job.
+createBulkImportJobResponse_jobId :: Lens.Lens' CreateBulkImportJobResponse Prelude.Text
+createBulkImportJobResponse_jobId = Lens.lens (\CreateBulkImportJobResponse' {jobId} -> jobId) (\s@CreateBulkImportJobResponse' {} a -> s {jobId = a} :: CreateBulkImportJobResponse)
+
+-- | The unique name that helps identify the job request.
+createBulkImportJobResponse_jobName :: Lens.Lens' CreateBulkImportJobResponse Prelude.Text
+createBulkImportJobResponse_jobName = Lens.lens (\CreateBulkImportJobResponse' {jobName} -> jobName) (\s@CreateBulkImportJobResponse' {} a -> s {jobName = a} :: CreateBulkImportJobResponse)
+
+-- | The status of the bulk import job can be one of following values.
+--
+-- -   @PENDING@ – IoT SiteWise is waiting for the current bulk import job
+--     to finish.
+--
+-- -   @CANCELLED@ – The bulk import job has been canceled.
+--
+-- -   @RUNNING@ – IoT SiteWise is processing your request to import your
+--     data from Amazon S3.
+--
+-- -   @COMPLETED@ – IoT SiteWise successfully completed your request to
+--     import data from Amazon S3.
+--
+-- -   @FAILED@ – IoT SiteWise couldn\'t process your request to import
+--     data from Amazon S3. You can use logs saved in the specified error
+--     report location in Amazon S3 to troubleshoot issues.
+--
+-- -   @COMPLETED_WITH_FAILURES@ – IoT SiteWise completed your request to
+--     import data from Amazon S3 with errors. You can use logs saved in
+--     the specified error report location in Amazon S3 to troubleshoot
+--     issues.
+createBulkImportJobResponse_jobStatus :: Lens.Lens' CreateBulkImportJobResponse JobStatus
+createBulkImportJobResponse_jobStatus = Lens.lens (\CreateBulkImportJobResponse' {jobStatus} -> jobStatus) (\s@CreateBulkImportJobResponse' {} a -> s {jobStatus = a} :: CreateBulkImportJobResponse)
+
+instance Prelude.NFData CreateBulkImportJobResponse where
+  rnf CreateBulkImportJobResponse' {..} =
+    Prelude.rnf httpStatus
+      `Prelude.seq` Prelude.rnf jobId
+      `Prelude.seq` Prelude.rnf jobName
+      `Prelude.seq` Prelude.rnf jobStatus
diff --git a/gen/Amazonka/IoTSiteWise/CreateDashboard.hs b/gen/Amazonka/IoTSiteWise/CreateDashboard.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/IoTSiteWise/CreateDashboard.hs
@@ -0,0 +1,297 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.IoTSiteWise.CreateDashboard
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Creates a dashboard in an IoT SiteWise Monitor project.
+module Amazonka.IoTSiteWise.CreateDashboard
+  ( -- * Creating a Request
+    CreateDashboard (..),
+    newCreateDashboard,
+
+    -- * Request Lenses
+    createDashboard_clientToken,
+    createDashboard_dashboardDescription,
+    createDashboard_tags,
+    createDashboard_projectId,
+    createDashboard_dashboardName,
+    createDashboard_dashboardDefinition,
+
+    -- * Destructuring the Response
+    CreateDashboardResponse (..),
+    newCreateDashboardResponse,
+
+    -- * Response Lenses
+    createDashboardResponse_httpStatus,
+    createDashboardResponse_dashboardId,
+    createDashboardResponse_dashboardArn,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.IoTSiteWise.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newCreateDashboard' smart constructor.
+data CreateDashboard = CreateDashboard'
+  { -- | A unique case-sensitive identifier that you can provide to ensure the
+    -- idempotency of the request. Don\'t reuse this client token if a new
+    -- idempotent request is required.
+    clientToken :: Prelude.Maybe Prelude.Text,
+    -- | A description for the dashboard.
+    dashboardDescription :: Prelude.Maybe Prelude.Text,
+    -- | A list of key-value pairs that contain metadata for the dashboard. For
+    -- more information, see
+    -- <https://docs.aws.amazon.com/iot-sitewise/latest/userguide/tag-resources.html Tagging your IoT SiteWise resources>
+    -- in the /IoT SiteWise User Guide/.
+    tags :: Prelude.Maybe (Prelude.HashMap Prelude.Text Prelude.Text),
+    -- | The ID of the project in which to create the dashboard.
+    projectId :: Prelude.Text,
+    -- | A friendly name for the dashboard.
+    dashboardName :: Prelude.Text,
+    -- | The dashboard definition specified in a JSON literal. For detailed
+    -- information, see
+    -- <https://docs.aws.amazon.com/iot-sitewise/latest/userguide/create-dashboards-using-aws-cli.html Creating dashboards (CLI)>
+    -- in the /IoT SiteWise User Guide/.
+    dashboardDefinition :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'CreateDashboard' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'clientToken', 'createDashboard_clientToken' - A unique case-sensitive identifier that you can provide to ensure the
+-- idempotency of the request. Don\'t reuse this client token if a new
+-- idempotent request is required.
+--
+-- 'dashboardDescription', 'createDashboard_dashboardDescription' - A description for the dashboard.
+--
+-- 'tags', 'createDashboard_tags' - A list of key-value pairs that contain metadata for the dashboard. For
+-- more information, see
+-- <https://docs.aws.amazon.com/iot-sitewise/latest/userguide/tag-resources.html Tagging your IoT SiteWise resources>
+-- in the /IoT SiteWise User Guide/.
+--
+-- 'projectId', 'createDashboard_projectId' - The ID of the project in which to create the dashboard.
+--
+-- 'dashboardName', 'createDashboard_dashboardName' - A friendly name for the dashboard.
+--
+-- 'dashboardDefinition', 'createDashboard_dashboardDefinition' - The dashboard definition specified in a JSON literal. For detailed
+-- information, see
+-- <https://docs.aws.amazon.com/iot-sitewise/latest/userguide/create-dashboards-using-aws-cli.html Creating dashboards (CLI)>
+-- in the /IoT SiteWise User Guide/.
+newCreateDashboard ::
+  -- | 'projectId'
+  Prelude.Text ->
+  -- | 'dashboardName'
+  Prelude.Text ->
+  -- | 'dashboardDefinition'
+  Prelude.Text ->
+  CreateDashboard
+newCreateDashboard
+  pProjectId_
+  pDashboardName_
+  pDashboardDefinition_ =
+    CreateDashboard'
+      { clientToken = Prelude.Nothing,
+        dashboardDescription = Prelude.Nothing,
+        tags = Prelude.Nothing,
+        projectId = pProjectId_,
+        dashboardName = pDashboardName_,
+        dashboardDefinition = pDashboardDefinition_
+      }
+
+-- | A unique case-sensitive identifier that you can provide to ensure the
+-- idempotency of the request. Don\'t reuse this client token if a new
+-- idempotent request is required.
+createDashboard_clientToken :: Lens.Lens' CreateDashboard (Prelude.Maybe Prelude.Text)
+createDashboard_clientToken = Lens.lens (\CreateDashboard' {clientToken} -> clientToken) (\s@CreateDashboard' {} a -> s {clientToken = a} :: CreateDashboard)
+
+-- | A description for the dashboard.
+createDashboard_dashboardDescription :: Lens.Lens' CreateDashboard (Prelude.Maybe Prelude.Text)
+createDashboard_dashboardDescription = Lens.lens (\CreateDashboard' {dashboardDescription} -> dashboardDescription) (\s@CreateDashboard' {} a -> s {dashboardDescription = a} :: CreateDashboard)
+
+-- | A list of key-value pairs that contain metadata for the dashboard. For
+-- more information, see
+-- <https://docs.aws.amazon.com/iot-sitewise/latest/userguide/tag-resources.html Tagging your IoT SiteWise resources>
+-- in the /IoT SiteWise User Guide/.
+createDashboard_tags :: Lens.Lens' CreateDashboard (Prelude.Maybe (Prelude.HashMap Prelude.Text Prelude.Text))
+createDashboard_tags = Lens.lens (\CreateDashboard' {tags} -> tags) (\s@CreateDashboard' {} a -> s {tags = a} :: CreateDashboard) Prelude.. Lens.mapping Lens.coerced
+
+-- | The ID of the project in which to create the dashboard.
+createDashboard_projectId :: Lens.Lens' CreateDashboard Prelude.Text
+createDashboard_projectId = Lens.lens (\CreateDashboard' {projectId} -> projectId) (\s@CreateDashboard' {} a -> s {projectId = a} :: CreateDashboard)
+
+-- | A friendly name for the dashboard.
+createDashboard_dashboardName :: Lens.Lens' CreateDashboard Prelude.Text
+createDashboard_dashboardName = Lens.lens (\CreateDashboard' {dashboardName} -> dashboardName) (\s@CreateDashboard' {} a -> s {dashboardName = a} :: CreateDashboard)
+
+-- | The dashboard definition specified in a JSON literal. For detailed
+-- information, see
+-- <https://docs.aws.amazon.com/iot-sitewise/latest/userguide/create-dashboards-using-aws-cli.html Creating dashboards (CLI)>
+-- in the /IoT SiteWise User Guide/.
+createDashboard_dashboardDefinition :: Lens.Lens' CreateDashboard Prelude.Text
+createDashboard_dashboardDefinition = Lens.lens (\CreateDashboard' {dashboardDefinition} -> dashboardDefinition) (\s@CreateDashboard' {} a -> s {dashboardDefinition = a} :: CreateDashboard)
+
+instance Core.AWSRequest CreateDashboard where
+  type
+    AWSResponse CreateDashboard =
+      CreateDashboardResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          CreateDashboardResponse'
+            Prelude.<$> (Prelude.pure (Prelude.fromEnum s))
+            Prelude.<*> (x Data..:> "dashboardId")
+            Prelude.<*> (x Data..:> "dashboardArn")
+      )
+
+instance Prelude.Hashable CreateDashboard where
+  hashWithSalt _salt CreateDashboard' {..} =
+    _salt
+      `Prelude.hashWithSalt` clientToken
+      `Prelude.hashWithSalt` dashboardDescription
+      `Prelude.hashWithSalt` tags
+      `Prelude.hashWithSalt` projectId
+      `Prelude.hashWithSalt` dashboardName
+      `Prelude.hashWithSalt` dashboardDefinition
+
+instance Prelude.NFData CreateDashboard where
+  rnf CreateDashboard' {..} =
+    Prelude.rnf clientToken
+      `Prelude.seq` Prelude.rnf dashboardDescription
+      `Prelude.seq` Prelude.rnf tags
+      `Prelude.seq` Prelude.rnf projectId
+      `Prelude.seq` Prelude.rnf dashboardName
+      `Prelude.seq` Prelude.rnf dashboardDefinition
+
+instance Data.ToHeaders CreateDashboard where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON CreateDashboard where
+  toJSON CreateDashboard' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("clientToken" Data..=) Prelude.<$> clientToken,
+            ("dashboardDescription" Data..=)
+              Prelude.<$> dashboardDescription,
+            ("tags" Data..=) Prelude.<$> tags,
+            Prelude.Just ("projectId" Data..= projectId),
+            Prelude.Just ("dashboardName" Data..= dashboardName),
+            Prelude.Just
+              ("dashboardDefinition" Data..= dashboardDefinition)
+          ]
+      )
+
+instance Data.ToPath CreateDashboard where
+  toPath = Prelude.const "/dashboards"
+
+instance Data.ToQuery CreateDashboard where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newCreateDashboardResponse' smart constructor.
+data CreateDashboardResponse = CreateDashboardResponse'
+  { -- | The response's http status code.
+    httpStatus :: Prelude.Int,
+    -- | The ID of the dashboard.
+    dashboardId :: Prelude.Text,
+    -- | The
+    -- <https://docs.aws.amazon.com/general/latest/gr/aws-arns-and-namespaces.html ARN>
+    -- of the dashboard, which has the following format.
+    --
+    -- @arn:${Partition}:iotsitewise:${Region}:${Account}:dashboard\/${DashboardId}@
+    dashboardArn :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'CreateDashboardResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'httpStatus', 'createDashboardResponse_httpStatus' - The response's http status code.
+--
+-- 'dashboardId', 'createDashboardResponse_dashboardId' - The ID of the dashboard.
+--
+-- 'dashboardArn', 'createDashboardResponse_dashboardArn' - The
+-- <https://docs.aws.amazon.com/general/latest/gr/aws-arns-and-namespaces.html ARN>
+-- of the dashboard, which has the following format.
+--
+-- @arn:${Partition}:iotsitewise:${Region}:${Account}:dashboard\/${DashboardId}@
+newCreateDashboardResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  -- | 'dashboardId'
+  Prelude.Text ->
+  -- | 'dashboardArn'
+  Prelude.Text ->
+  CreateDashboardResponse
+newCreateDashboardResponse
+  pHttpStatus_
+  pDashboardId_
+  pDashboardArn_ =
+    CreateDashboardResponse'
+      { httpStatus = pHttpStatus_,
+        dashboardId = pDashboardId_,
+        dashboardArn = pDashboardArn_
+      }
+
+-- | The response's http status code.
+createDashboardResponse_httpStatus :: Lens.Lens' CreateDashboardResponse Prelude.Int
+createDashboardResponse_httpStatus = Lens.lens (\CreateDashboardResponse' {httpStatus} -> httpStatus) (\s@CreateDashboardResponse' {} a -> s {httpStatus = a} :: CreateDashboardResponse)
+
+-- | The ID of the dashboard.
+createDashboardResponse_dashboardId :: Lens.Lens' CreateDashboardResponse Prelude.Text
+createDashboardResponse_dashboardId = Lens.lens (\CreateDashboardResponse' {dashboardId} -> dashboardId) (\s@CreateDashboardResponse' {} a -> s {dashboardId = a} :: CreateDashboardResponse)
+
+-- | The
+-- <https://docs.aws.amazon.com/general/latest/gr/aws-arns-and-namespaces.html ARN>
+-- of the dashboard, which has the following format.
+--
+-- @arn:${Partition}:iotsitewise:${Region}:${Account}:dashboard\/${DashboardId}@
+createDashboardResponse_dashboardArn :: Lens.Lens' CreateDashboardResponse Prelude.Text
+createDashboardResponse_dashboardArn = Lens.lens (\CreateDashboardResponse' {dashboardArn} -> dashboardArn) (\s@CreateDashboardResponse' {} a -> s {dashboardArn = a} :: CreateDashboardResponse)
+
+instance Prelude.NFData CreateDashboardResponse where
+  rnf CreateDashboardResponse' {..} =
+    Prelude.rnf httpStatus
+      `Prelude.seq` Prelude.rnf dashboardId
+      `Prelude.seq` Prelude.rnf dashboardArn
diff --git a/gen/Amazonka/IoTSiteWise/CreateGateway.hs b/gen/Amazonka/IoTSiteWise/CreateGateway.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/IoTSiteWise/CreateGateway.hs
@@ -0,0 +1,244 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.IoTSiteWise.CreateGateway
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Creates a gateway, which is a virtual or edge device that delivers
+-- industrial data streams from local servers to IoT SiteWise. For more
+-- information, see
+-- <https://docs.aws.amazon.com/iot-sitewise/latest/userguide/gateway-connector.html Ingesting data using a gateway>
+-- in the /IoT SiteWise User Guide/.
+module Amazonka.IoTSiteWise.CreateGateway
+  ( -- * Creating a Request
+    CreateGateway (..),
+    newCreateGateway,
+
+    -- * Request Lenses
+    createGateway_tags,
+    createGateway_gatewayName,
+    createGateway_gatewayPlatform,
+
+    -- * Destructuring the Response
+    CreateGatewayResponse (..),
+    newCreateGatewayResponse,
+
+    -- * Response Lenses
+    createGatewayResponse_httpStatus,
+    createGatewayResponse_gatewayId,
+    createGatewayResponse_gatewayArn,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.IoTSiteWise.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newCreateGateway' smart constructor.
+data CreateGateway = CreateGateway'
+  { -- | A list of key-value pairs that contain metadata for the gateway. For
+    -- more information, see
+    -- <https://docs.aws.amazon.com/iot-sitewise/latest/userguide/tag-resources.html Tagging your IoT SiteWise resources>
+    -- in the /IoT SiteWise User Guide/.
+    tags :: Prelude.Maybe (Prelude.HashMap Prelude.Text Prelude.Text),
+    -- | A unique, friendly name for the gateway.
+    gatewayName :: Prelude.Text,
+    -- | The gateway\'s platform. You can only specify one platform in a gateway.
+    gatewayPlatform :: GatewayPlatform
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'CreateGateway' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'tags', 'createGateway_tags' - A list of key-value pairs that contain metadata for the gateway. For
+-- more information, see
+-- <https://docs.aws.amazon.com/iot-sitewise/latest/userguide/tag-resources.html Tagging your IoT SiteWise resources>
+-- in the /IoT SiteWise User Guide/.
+--
+-- 'gatewayName', 'createGateway_gatewayName' - A unique, friendly name for the gateway.
+--
+-- 'gatewayPlatform', 'createGateway_gatewayPlatform' - The gateway\'s platform. You can only specify one platform in a gateway.
+newCreateGateway ::
+  -- | 'gatewayName'
+  Prelude.Text ->
+  -- | 'gatewayPlatform'
+  GatewayPlatform ->
+  CreateGateway
+newCreateGateway pGatewayName_ pGatewayPlatform_ =
+  CreateGateway'
+    { tags = Prelude.Nothing,
+      gatewayName = pGatewayName_,
+      gatewayPlatform = pGatewayPlatform_
+    }
+
+-- | A list of key-value pairs that contain metadata for the gateway. For
+-- more information, see
+-- <https://docs.aws.amazon.com/iot-sitewise/latest/userguide/tag-resources.html Tagging your IoT SiteWise resources>
+-- in the /IoT SiteWise User Guide/.
+createGateway_tags :: Lens.Lens' CreateGateway (Prelude.Maybe (Prelude.HashMap Prelude.Text Prelude.Text))
+createGateway_tags = Lens.lens (\CreateGateway' {tags} -> tags) (\s@CreateGateway' {} a -> s {tags = a} :: CreateGateway) Prelude.. Lens.mapping Lens.coerced
+
+-- | A unique, friendly name for the gateway.
+createGateway_gatewayName :: Lens.Lens' CreateGateway Prelude.Text
+createGateway_gatewayName = Lens.lens (\CreateGateway' {gatewayName} -> gatewayName) (\s@CreateGateway' {} a -> s {gatewayName = a} :: CreateGateway)
+
+-- | The gateway\'s platform. You can only specify one platform in a gateway.
+createGateway_gatewayPlatform :: Lens.Lens' CreateGateway GatewayPlatform
+createGateway_gatewayPlatform = Lens.lens (\CreateGateway' {gatewayPlatform} -> gatewayPlatform) (\s@CreateGateway' {} a -> s {gatewayPlatform = a} :: CreateGateway)
+
+instance Core.AWSRequest CreateGateway where
+  type
+    AWSResponse CreateGateway =
+      CreateGatewayResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          CreateGatewayResponse'
+            Prelude.<$> (Prelude.pure (Prelude.fromEnum s))
+            Prelude.<*> (x Data..:> "gatewayId")
+            Prelude.<*> (x Data..:> "gatewayArn")
+      )
+
+instance Prelude.Hashable CreateGateway where
+  hashWithSalt _salt CreateGateway' {..} =
+    _salt
+      `Prelude.hashWithSalt` tags
+      `Prelude.hashWithSalt` gatewayName
+      `Prelude.hashWithSalt` gatewayPlatform
+
+instance Prelude.NFData CreateGateway where
+  rnf CreateGateway' {..} =
+    Prelude.rnf tags
+      `Prelude.seq` Prelude.rnf gatewayName
+      `Prelude.seq` Prelude.rnf gatewayPlatform
+
+instance Data.ToHeaders CreateGateway where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON CreateGateway where
+  toJSON CreateGateway' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("tags" Data..=) Prelude.<$> tags,
+            Prelude.Just ("gatewayName" Data..= gatewayName),
+            Prelude.Just
+              ("gatewayPlatform" Data..= gatewayPlatform)
+          ]
+      )
+
+instance Data.ToPath CreateGateway where
+  toPath = Prelude.const "/20200301/gateways"
+
+instance Data.ToQuery CreateGateway where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newCreateGatewayResponse' smart constructor.
+data CreateGatewayResponse = CreateGatewayResponse'
+  { -- | The response's http status code.
+    httpStatus :: Prelude.Int,
+    -- | The ID of the gateway device. You can use this ID when you call other
+    -- IoT SiteWise APIs.
+    gatewayId :: Prelude.Text,
+    -- | The
+    -- <https://docs.aws.amazon.com/general/latest/gr/aws-arns-and-namespaces.html ARN>
+    -- of the gateway, which has the following format.
+    --
+    -- @arn:${Partition}:iotsitewise:${Region}:${Account}:gateway\/${GatewayId}@
+    gatewayArn :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'CreateGatewayResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'httpStatus', 'createGatewayResponse_httpStatus' - The response's http status code.
+--
+-- 'gatewayId', 'createGatewayResponse_gatewayId' - The ID of the gateway device. You can use this ID when you call other
+-- IoT SiteWise APIs.
+--
+-- 'gatewayArn', 'createGatewayResponse_gatewayArn' - The
+-- <https://docs.aws.amazon.com/general/latest/gr/aws-arns-and-namespaces.html ARN>
+-- of the gateway, which has the following format.
+--
+-- @arn:${Partition}:iotsitewise:${Region}:${Account}:gateway\/${GatewayId}@
+newCreateGatewayResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  -- | 'gatewayId'
+  Prelude.Text ->
+  -- | 'gatewayArn'
+  Prelude.Text ->
+  CreateGatewayResponse
+newCreateGatewayResponse
+  pHttpStatus_
+  pGatewayId_
+  pGatewayArn_ =
+    CreateGatewayResponse'
+      { httpStatus = pHttpStatus_,
+        gatewayId = pGatewayId_,
+        gatewayArn = pGatewayArn_
+      }
+
+-- | The response's http status code.
+createGatewayResponse_httpStatus :: Lens.Lens' CreateGatewayResponse Prelude.Int
+createGatewayResponse_httpStatus = Lens.lens (\CreateGatewayResponse' {httpStatus} -> httpStatus) (\s@CreateGatewayResponse' {} a -> s {httpStatus = a} :: CreateGatewayResponse)
+
+-- | The ID of the gateway device. You can use this ID when you call other
+-- IoT SiteWise APIs.
+createGatewayResponse_gatewayId :: Lens.Lens' CreateGatewayResponse Prelude.Text
+createGatewayResponse_gatewayId = Lens.lens (\CreateGatewayResponse' {gatewayId} -> gatewayId) (\s@CreateGatewayResponse' {} a -> s {gatewayId = a} :: CreateGatewayResponse)
+
+-- | The
+-- <https://docs.aws.amazon.com/general/latest/gr/aws-arns-and-namespaces.html ARN>
+-- of the gateway, which has the following format.
+--
+-- @arn:${Partition}:iotsitewise:${Region}:${Account}:gateway\/${GatewayId}@
+createGatewayResponse_gatewayArn :: Lens.Lens' CreateGatewayResponse Prelude.Text
+createGatewayResponse_gatewayArn = Lens.lens (\CreateGatewayResponse' {gatewayArn} -> gatewayArn) (\s@CreateGatewayResponse' {} a -> s {gatewayArn = a} :: CreateGatewayResponse)
+
+instance Prelude.NFData CreateGatewayResponse where
+  rnf CreateGatewayResponse' {..} =
+    Prelude.rnf httpStatus
+      `Prelude.seq` Prelude.rnf gatewayId
+      `Prelude.seq` Prelude.rnf gatewayArn
diff --git a/gen/Amazonka/IoTSiteWise/CreatePortal.hs b/gen/Amazonka/IoTSiteWise/CreatePortal.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/IoTSiteWise/CreatePortal.hs
@@ -0,0 +1,504 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.IoTSiteWise.CreatePortal
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Creates a portal, which can contain projects and dashboards. IoT
+-- SiteWise Monitor uses IAM Identity Center or IAM to authenticate portal
+-- users and manage user permissions.
+--
+-- Before you can sign in to a new portal, you must add at least one
+-- identity to that portal. For more information, see
+-- <https://docs.aws.amazon.com/iot-sitewise/latest/userguide/administer-portals.html#portal-change-admins Adding or removing portal administrators>
+-- in the /IoT SiteWise User Guide/.
+module Amazonka.IoTSiteWise.CreatePortal
+  ( -- * Creating a Request
+    CreatePortal (..),
+    newCreatePortal,
+
+    -- * Request Lenses
+    createPortal_alarms,
+    createPortal_clientToken,
+    createPortal_notificationSenderEmail,
+    createPortal_portalAuthMode,
+    createPortal_portalDescription,
+    createPortal_portalLogoImageFile,
+    createPortal_tags,
+    createPortal_portalName,
+    createPortal_portalContactEmail,
+    createPortal_roleArn,
+
+    -- * Destructuring the Response
+    CreatePortalResponse (..),
+    newCreatePortalResponse,
+
+    -- * Response Lenses
+    createPortalResponse_httpStatus,
+    createPortalResponse_portalId,
+    createPortalResponse_portalArn,
+    createPortalResponse_portalStartUrl,
+    createPortalResponse_portalStatus,
+    createPortalResponse_ssoApplicationId,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.IoTSiteWise.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newCreatePortal' smart constructor.
+data CreatePortal = CreatePortal'
+  { -- | Contains the configuration information of an alarm created in an IoT
+    -- SiteWise Monitor portal. You can use the alarm to monitor an asset
+    -- property and get notified when the asset property value is outside a
+    -- specified range. For more information, see
+    -- <https://docs.aws.amazon.com/iot-sitewise/latest/appguide/monitor-alarms.html Monitoring with alarms>
+    -- in the /IoT SiteWise Application Guide/.
+    alarms :: Prelude.Maybe Alarms,
+    -- | A unique case-sensitive identifier that you can provide to ensure the
+    -- idempotency of the request. Don\'t reuse this client token if a new
+    -- idempotent request is required.
+    clientToken :: Prelude.Maybe Prelude.Text,
+    -- | The email address that sends alarm notifications.
+    --
+    -- If you use the
+    -- <https://docs.aws.amazon.com/iotevents/latest/developerguide/lambda-support.html IoT Events managed Lambda function>
+    -- to manage your emails, you must
+    -- <https://docs.aws.amazon.com/ses/latest/DeveloperGuide/verify-email-addresses.html verify the sender email address in Amazon SES>.
+    notificationSenderEmail :: Prelude.Maybe Prelude.Text,
+    -- | The service to use to authenticate users to the portal. Choose from the
+    -- following options:
+    --
+    -- -   @SSO@ – The portal uses IAM Identity Center (successor to Single
+    --     Sign-On) to authenticate users and manage user permissions. Before
+    --     you can create a portal that uses IAM Identity Center, you must
+    --     enable IAM Identity Center. For more information, see
+    --     <https://docs.aws.amazon.com/iot-sitewise/latest/userguide/monitor-get-started.html#mon-gs-sso Enabling IAM Identity Center>
+    --     in the /IoT SiteWise User Guide/. This option is only available in
+    --     Amazon Web Services Regions other than the China Regions.
+    --
+    -- -   @IAM@ – The portal uses Identity and Access Management to
+    --     authenticate users and manage user permissions.
+    --
+    -- You can\'t change this value after you create a portal.
+    --
+    -- Default: @SSO@
+    portalAuthMode :: Prelude.Maybe AuthMode,
+    -- | A description for the portal.
+    portalDescription :: Prelude.Maybe Prelude.Text,
+    -- | A logo image to display in the portal. Upload a square, high-resolution
+    -- image. The image is displayed on a dark background.
+    portalLogoImageFile :: Prelude.Maybe ImageFile,
+    -- | A list of key-value pairs that contain metadata for the portal. For more
+    -- information, see
+    -- <https://docs.aws.amazon.com/iot-sitewise/latest/userguide/tag-resources.html Tagging your IoT SiteWise resources>
+    -- in the /IoT SiteWise User Guide/.
+    tags :: Prelude.Maybe (Prelude.HashMap Prelude.Text Prelude.Text),
+    -- | A friendly name for the portal.
+    portalName :: Prelude.Text,
+    -- | The Amazon Web Services administrator\'s contact email address.
+    portalContactEmail :: Prelude.Text,
+    -- | The
+    -- <https://docs.aws.amazon.com/general/latest/gr/aws-arns-and-namespaces.html ARN>
+    -- of a service role that allows the portal\'s users to access your IoT
+    -- SiteWise resources on your behalf. For more information, see
+    -- <https://docs.aws.amazon.com/iot-sitewise/latest/userguide/monitor-service-role.html Using service roles for IoT SiteWise Monitor>
+    -- in the /IoT SiteWise User Guide/.
+    roleArn :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'CreatePortal' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'alarms', 'createPortal_alarms' - Contains the configuration information of an alarm created in an IoT
+-- SiteWise Monitor portal. You can use the alarm to monitor an asset
+-- property and get notified when the asset property value is outside a
+-- specified range. For more information, see
+-- <https://docs.aws.amazon.com/iot-sitewise/latest/appguide/monitor-alarms.html Monitoring with alarms>
+-- in the /IoT SiteWise Application Guide/.
+--
+-- 'clientToken', 'createPortal_clientToken' - A unique case-sensitive identifier that you can provide to ensure the
+-- idempotency of the request. Don\'t reuse this client token if a new
+-- idempotent request is required.
+--
+-- 'notificationSenderEmail', 'createPortal_notificationSenderEmail' - The email address that sends alarm notifications.
+--
+-- If you use the
+-- <https://docs.aws.amazon.com/iotevents/latest/developerguide/lambda-support.html IoT Events managed Lambda function>
+-- to manage your emails, you must
+-- <https://docs.aws.amazon.com/ses/latest/DeveloperGuide/verify-email-addresses.html verify the sender email address in Amazon SES>.
+--
+-- 'portalAuthMode', 'createPortal_portalAuthMode' - The service to use to authenticate users to the portal. Choose from the
+-- following options:
+--
+-- -   @SSO@ – The portal uses IAM Identity Center (successor to Single
+--     Sign-On) to authenticate users and manage user permissions. Before
+--     you can create a portal that uses IAM Identity Center, you must
+--     enable IAM Identity Center. For more information, see
+--     <https://docs.aws.amazon.com/iot-sitewise/latest/userguide/monitor-get-started.html#mon-gs-sso Enabling IAM Identity Center>
+--     in the /IoT SiteWise User Guide/. This option is only available in
+--     Amazon Web Services Regions other than the China Regions.
+--
+-- -   @IAM@ – The portal uses Identity and Access Management to
+--     authenticate users and manage user permissions.
+--
+-- You can\'t change this value after you create a portal.
+--
+-- Default: @SSO@
+--
+-- 'portalDescription', 'createPortal_portalDescription' - A description for the portal.
+--
+-- 'portalLogoImageFile', 'createPortal_portalLogoImageFile' - A logo image to display in the portal. Upload a square, high-resolution
+-- image. The image is displayed on a dark background.
+--
+-- 'tags', 'createPortal_tags' - A list of key-value pairs that contain metadata for the portal. For more
+-- information, see
+-- <https://docs.aws.amazon.com/iot-sitewise/latest/userguide/tag-resources.html Tagging your IoT SiteWise resources>
+-- in the /IoT SiteWise User Guide/.
+--
+-- 'portalName', 'createPortal_portalName' - A friendly name for the portal.
+--
+-- 'portalContactEmail', 'createPortal_portalContactEmail' - The Amazon Web Services administrator\'s contact email address.
+--
+-- 'roleArn', 'createPortal_roleArn' - The
+-- <https://docs.aws.amazon.com/general/latest/gr/aws-arns-and-namespaces.html ARN>
+-- of a service role that allows the portal\'s users to access your IoT
+-- SiteWise resources on your behalf. For more information, see
+-- <https://docs.aws.amazon.com/iot-sitewise/latest/userguide/monitor-service-role.html Using service roles for IoT SiteWise Monitor>
+-- in the /IoT SiteWise User Guide/.
+newCreatePortal ::
+  -- | 'portalName'
+  Prelude.Text ->
+  -- | 'portalContactEmail'
+  Prelude.Text ->
+  -- | 'roleArn'
+  Prelude.Text ->
+  CreatePortal
+newCreatePortal
+  pPortalName_
+  pPortalContactEmail_
+  pRoleArn_ =
+    CreatePortal'
+      { alarms = Prelude.Nothing,
+        clientToken = Prelude.Nothing,
+        notificationSenderEmail = Prelude.Nothing,
+        portalAuthMode = Prelude.Nothing,
+        portalDescription = Prelude.Nothing,
+        portalLogoImageFile = Prelude.Nothing,
+        tags = Prelude.Nothing,
+        portalName = pPortalName_,
+        portalContactEmail = pPortalContactEmail_,
+        roleArn = pRoleArn_
+      }
+
+-- | Contains the configuration information of an alarm created in an IoT
+-- SiteWise Monitor portal. You can use the alarm to monitor an asset
+-- property and get notified when the asset property value is outside a
+-- specified range. For more information, see
+-- <https://docs.aws.amazon.com/iot-sitewise/latest/appguide/monitor-alarms.html Monitoring with alarms>
+-- in the /IoT SiteWise Application Guide/.
+createPortal_alarms :: Lens.Lens' CreatePortal (Prelude.Maybe Alarms)
+createPortal_alarms = Lens.lens (\CreatePortal' {alarms} -> alarms) (\s@CreatePortal' {} a -> s {alarms = a} :: CreatePortal)
+
+-- | A unique case-sensitive identifier that you can provide to ensure the
+-- idempotency of the request. Don\'t reuse this client token if a new
+-- idempotent request is required.
+createPortal_clientToken :: Lens.Lens' CreatePortal (Prelude.Maybe Prelude.Text)
+createPortal_clientToken = Lens.lens (\CreatePortal' {clientToken} -> clientToken) (\s@CreatePortal' {} a -> s {clientToken = a} :: CreatePortal)
+
+-- | The email address that sends alarm notifications.
+--
+-- If you use the
+-- <https://docs.aws.amazon.com/iotevents/latest/developerguide/lambda-support.html IoT Events managed Lambda function>
+-- to manage your emails, you must
+-- <https://docs.aws.amazon.com/ses/latest/DeveloperGuide/verify-email-addresses.html verify the sender email address in Amazon SES>.
+createPortal_notificationSenderEmail :: Lens.Lens' CreatePortal (Prelude.Maybe Prelude.Text)
+createPortal_notificationSenderEmail = Lens.lens (\CreatePortal' {notificationSenderEmail} -> notificationSenderEmail) (\s@CreatePortal' {} a -> s {notificationSenderEmail = a} :: CreatePortal)
+
+-- | The service to use to authenticate users to the portal. Choose from the
+-- following options:
+--
+-- -   @SSO@ – The portal uses IAM Identity Center (successor to Single
+--     Sign-On) to authenticate users and manage user permissions. Before
+--     you can create a portal that uses IAM Identity Center, you must
+--     enable IAM Identity Center. For more information, see
+--     <https://docs.aws.amazon.com/iot-sitewise/latest/userguide/monitor-get-started.html#mon-gs-sso Enabling IAM Identity Center>
+--     in the /IoT SiteWise User Guide/. This option is only available in
+--     Amazon Web Services Regions other than the China Regions.
+--
+-- -   @IAM@ – The portal uses Identity and Access Management to
+--     authenticate users and manage user permissions.
+--
+-- You can\'t change this value after you create a portal.
+--
+-- Default: @SSO@
+createPortal_portalAuthMode :: Lens.Lens' CreatePortal (Prelude.Maybe AuthMode)
+createPortal_portalAuthMode = Lens.lens (\CreatePortal' {portalAuthMode} -> portalAuthMode) (\s@CreatePortal' {} a -> s {portalAuthMode = a} :: CreatePortal)
+
+-- | A description for the portal.
+createPortal_portalDescription :: Lens.Lens' CreatePortal (Prelude.Maybe Prelude.Text)
+createPortal_portalDescription = Lens.lens (\CreatePortal' {portalDescription} -> portalDescription) (\s@CreatePortal' {} a -> s {portalDescription = a} :: CreatePortal)
+
+-- | A logo image to display in the portal. Upload a square, high-resolution
+-- image. The image is displayed on a dark background.
+createPortal_portalLogoImageFile :: Lens.Lens' CreatePortal (Prelude.Maybe ImageFile)
+createPortal_portalLogoImageFile = Lens.lens (\CreatePortal' {portalLogoImageFile} -> portalLogoImageFile) (\s@CreatePortal' {} a -> s {portalLogoImageFile = a} :: CreatePortal)
+
+-- | A list of key-value pairs that contain metadata for the portal. For more
+-- information, see
+-- <https://docs.aws.amazon.com/iot-sitewise/latest/userguide/tag-resources.html Tagging your IoT SiteWise resources>
+-- in the /IoT SiteWise User Guide/.
+createPortal_tags :: Lens.Lens' CreatePortal (Prelude.Maybe (Prelude.HashMap Prelude.Text Prelude.Text))
+createPortal_tags = Lens.lens (\CreatePortal' {tags} -> tags) (\s@CreatePortal' {} a -> s {tags = a} :: CreatePortal) Prelude.. Lens.mapping Lens.coerced
+
+-- | A friendly name for the portal.
+createPortal_portalName :: Lens.Lens' CreatePortal Prelude.Text
+createPortal_portalName = Lens.lens (\CreatePortal' {portalName} -> portalName) (\s@CreatePortal' {} a -> s {portalName = a} :: CreatePortal)
+
+-- | The Amazon Web Services administrator\'s contact email address.
+createPortal_portalContactEmail :: Lens.Lens' CreatePortal Prelude.Text
+createPortal_portalContactEmail = Lens.lens (\CreatePortal' {portalContactEmail} -> portalContactEmail) (\s@CreatePortal' {} a -> s {portalContactEmail = a} :: CreatePortal)
+
+-- | The
+-- <https://docs.aws.amazon.com/general/latest/gr/aws-arns-and-namespaces.html ARN>
+-- of a service role that allows the portal\'s users to access your IoT
+-- SiteWise resources on your behalf. For more information, see
+-- <https://docs.aws.amazon.com/iot-sitewise/latest/userguide/monitor-service-role.html Using service roles for IoT SiteWise Monitor>
+-- in the /IoT SiteWise User Guide/.
+createPortal_roleArn :: Lens.Lens' CreatePortal Prelude.Text
+createPortal_roleArn = Lens.lens (\CreatePortal' {roleArn} -> roleArn) (\s@CreatePortal' {} a -> s {roleArn = a} :: CreatePortal)
+
+instance Core.AWSRequest CreatePortal where
+  type AWSResponse CreatePortal = CreatePortalResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          CreatePortalResponse'
+            Prelude.<$> (Prelude.pure (Prelude.fromEnum s))
+            Prelude.<*> (x Data..:> "portalId")
+            Prelude.<*> (x Data..:> "portalArn")
+            Prelude.<*> (x Data..:> "portalStartUrl")
+            Prelude.<*> (x Data..:> "portalStatus")
+            Prelude.<*> (x Data..:> "ssoApplicationId")
+      )
+
+instance Prelude.Hashable CreatePortal where
+  hashWithSalt _salt CreatePortal' {..} =
+    _salt
+      `Prelude.hashWithSalt` alarms
+      `Prelude.hashWithSalt` clientToken
+      `Prelude.hashWithSalt` notificationSenderEmail
+      `Prelude.hashWithSalt` portalAuthMode
+      `Prelude.hashWithSalt` portalDescription
+      `Prelude.hashWithSalt` portalLogoImageFile
+      `Prelude.hashWithSalt` tags
+      `Prelude.hashWithSalt` portalName
+      `Prelude.hashWithSalt` portalContactEmail
+      `Prelude.hashWithSalt` roleArn
+
+instance Prelude.NFData CreatePortal where
+  rnf CreatePortal' {..} =
+    Prelude.rnf alarms
+      `Prelude.seq` Prelude.rnf clientToken
+      `Prelude.seq` Prelude.rnf notificationSenderEmail
+      `Prelude.seq` Prelude.rnf portalAuthMode
+      `Prelude.seq` Prelude.rnf portalDescription
+      `Prelude.seq` Prelude.rnf portalLogoImageFile
+      `Prelude.seq` Prelude.rnf tags
+      `Prelude.seq` Prelude.rnf portalName
+      `Prelude.seq` Prelude.rnf portalContactEmail
+      `Prelude.seq` Prelude.rnf roleArn
+
+instance Data.ToHeaders CreatePortal where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON CreatePortal where
+  toJSON CreatePortal' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("alarms" Data..=) Prelude.<$> alarms,
+            ("clientToken" Data..=) Prelude.<$> clientToken,
+            ("notificationSenderEmail" Data..=)
+              Prelude.<$> notificationSenderEmail,
+            ("portalAuthMode" Data..=)
+              Prelude.<$> portalAuthMode,
+            ("portalDescription" Data..=)
+              Prelude.<$> portalDescription,
+            ("portalLogoImageFile" Data..=)
+              Prelude.<$> portalLogoImageFile,
+            ("tags" Data..=) Prelude.<$> tags,
+            Prelude.Just ("portalName" Data..= portalName),
+            Prelude.Just
+              ("portalContactEmail" Data..= portalContactEmail),
+            Prelude.Just ("roleArn" Data..= roleArn)
+          ]
+      )
+
+instance Data.ToPath CreatePortal where
+  toPath = Prelude.const "/portals"
+
+instance Data.ToQuery CreatePortal where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newCreatePortalResponse' smart constructor.
+data CreatePortalResponse = CreatePortalResponse'
+  { -- | The response's http status code.
+    httpStatus :: Prelude.Int,
+    -- | The ID of the created portal.
+    portalId :: Prelude.Text,
+    -- | The
+    -- <https://docs.aws.amazon.com/general/latest/gr/aws-arns-and-namespaces.html ARN>
+    -- of the portal, which has the following format.
+    --
+    -- @arn:${Partition}:iotsitewise:${Region}:${Account}:portal\/${PortalId}@
+    portalArn :: Prelude.Text,
+    -- | The URL for the IoT SiteWise Monitor portal. You can use this URL to
+    -- access portals that use IAM Identity Center for authentication. For
+    -- portals that use IAM for authentication, you must use the IoT SiteWise
+    -- console to get a URL that you can use to access the portal.
+    portalStartUrl :: Prelude.Text,
+    -- | The status of the portal, which contains a state (@CREATING@ after
+    -- successfully calling this operation) and any error message.
+    portalStatus :: PortalStatus,
+    -- | The associated IAM Identity Center application ID, if the portal uses
+    -- IAM Identity Center.
+    ssoApplicationId :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'CreatePortalResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'httpStatus', 'createPortalResponse_httpStatus' - The response's http status code.
+--
+-- 'portalId', 'createPortalResponse_portalId' - The ID of the created portal.
+--
+-- 'portalArn', 'createPortalResponse_portalArn' - The
+-- <https://docs.aws.amazon.com/general/latest/gr/aws-arns-and-namespaces.html ARN>
+-- of the portal, which has the following format.
+--
+-- @arn:${Partition}:iotsitewise:${Region}:${Account}:portal\/${PortalId}@
+--
+-- 'portalStartUrl', 'createPortalResponse_portalStartUrl' - The URL for the IoT SiteWise Monitor portal. You can use this URL to
+-- access portals that use IAM Identity Center for authentication. For
+-- portals that use IAM for authentication, you must use the IoT SiteWise
+-- console to get a URL that you can use to access the portal.
+--
+-- 'portalStatus', 'createPortalResponse_portalStatus' - The status of the portal, which contains a state (@CREATING@ after
+-- successfully calling this operation) and any error message.
+--
+-- 'ssoApplicationId', 'createPortalResponse_ssoApplicationId' - The associated IAM Identity Center application ID, if the portal uses
+-- IAM Identity Center.
+newCreatePortalResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  -- | 'portalId'
+  Prelude.Text ->
+  -- | 'portalArn'
+  Prelude.Text ->
+  -- | 'portalStartUrl'
+  Prelude.Text ->
+  -- | 'portalStatus'
+  PortalStatus ->
+  -- | 'ssoApplicationId'
+  Prelude.Text ->
+  CreatePortalResponse
+newCreatePortalResponse
+  pHttpStatus_
+  pPortalId_
+  pPortalArn_
+  pPortalStartUrl_
+  pPortalStatus_
+  pSsoApplicationId_ =
+    CreatePortalResponse'
+      { httpStatus = pHttpStatus_,
+        portalId = pPortalId_,
+        portalArn = pPortalArn_,
+        portalStartUrl = pPortalStartUrl_,
+        portalStatus = pPortalStatus_,
+        ssoApplicationId = pSsoApplicationId_
+      }
+
+-- | The response's http status code.
+createPortalResponse_httpStatus :: Lens.Lens' CreatePortalResponse Prelude.Int
+createPortalResponse_httpStatus = Lens.lens (\CreatePortalResponse' {httpStatus} -> httpStatus) (\s@CreatePortalResponse' {} a -> s {httpStatus = a} :: CreatePortalResponse)
+
+-- | The ID of the created portal.
+createPortalResponse_portalId :: Lens.Lens' CreatePortalResponse Prelude.Text
+createPortalResponse_portalId = Lens.lens (\CreatePortalResponse' {portalId} -> portalId) (\s@CreatePortalResponse' {} a -> s {portalId = a} :: CreatePortalResponse)
+
+-- | The
+-- <https://docs.aws.amazon.com/general/latest/gr/aws-arns-and-namespaces.html ARN>
+-- of the portal, which has the following format.
+--
+-- @arn:${Partition}:iotsitewise:${Region}:${Account}:portal\/${PortalId}@
+createPortalResponse_portalArn :: Lens.Lens' CreatePortalResponse Prelude.Text
+createPortalResponse_portalArn = Lens.lens (\CreatePortalResponse' {portalArn} -> portalArn) (\s@CreatePortalResponse' {} a -> s {portalArn = a} :: CreatePortalResponse)
+
+-- | The URL for the IoT SiteWise Monitor portal. You can use this URL to
+-- access portals that use IAM Identity Center for authentication. For
+-- portals that use IAM for authentication, you must use the IoT SiteWise
+-- console to get a URL that you can use to access the portal.
+createPortalResponse_portalStartUrl :: Lens.Lens' CreatePortalResponse Prelude.Text
+createPortalResponse_portalStartUrl = Lens.lens (\CreatePortalResponse' {portalStartUrl} -> portalStartUrl) (\s@CreatePortalResponse' {} a -> s {portalStartUrl = a} :: CreatePortalResponse)
+
+-- | The status of the portal, which contains a state (@CREATING@ after
+-- successfully calling this operation) and any error message.
+createPortalResponse_portalStatus :: Lens.Lens' CreatePortalResponse PortalStatus
+createPortalResponse_portalStatus = Lens.lens (\CreatePortalResponse' {portalStatus} -> portalStatus) (\s@CreatePortalResponse' {} a -> s {portalStatus = a} :: CreatePortalResponse)
+
+-- | The associated IAM Identity Center application ID, if the portal uses
+-- IAM Identity Center.
+createPortalResponse_ssoApplicationId :: Lens.Lens' CreatePortalResponse Prelude.Text
+createPortalResponse_ssoApplicationId = Lens.lens (\CreatePortalResponse' {ssoApplicationId} -> ssoApplicationId) (\s@CreatePortalResponse' {} a -> s {ssoApplicationId = a} :: CreatePortalResponse)
+
+instance Prelude.NFData CreatePortalResponse where
+  rnf CreatePortalResponse' {..} =
+    Prelude.rnf httpStatus
+      `Prelude.seq` Prelude.rnf portalId
+      `Prelude.seq` Prelude.rnf portalArn
+      `Prelude.seq` Prelude.rnf portalStartUrl
+      `Prelude.seq` Prelude.rnf portalStatus
+      `Prelude.seq` Prelude.rnf ssoApplicationId
diff --git a/gen/Amazonka/IoTSiteWise/CreateProject.hs b/gen/Amazonka/IoTSiteWise/CreateProject.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/IoTSiteWise/CreateProject.hs
@@ -0,0 +1,272 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.IoTSiteWise.CreateProject
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Creates a project in the specified portal.
+--
+-- Make sure that the project name and description don\'t contain
+-- confidential information.
+module Amazonka.IoTSiteWise.CreateProject
+  ( -- * Creating a Request
+    CreateProject (..),
+    newCreateProject,
+
+    -- * Request Lenses
+    createProject_clientToken,
+    createProject_projectDescription,
+    createProject_tags,
+    createProject_portalId,
+    createProject_projectName,
+
+    -- * Destructuring the Response
+    CreateProjectResponse (..),
+    newCreateProjectResponse,
+
+    -- * Response Lenses
+    createProjectResponse_httpStatus,
+    createProjectResponse_projectId,
+    createProjectResponse_projectArn,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.IoTSiteWise.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newCreateProject' smart constructor.
+data CreateProject = CreateProject'
+  { -- | A unique case-sensitive identifier that you can provide to ensure the
+    -- idempotency of the request. Don\'t reuse this client token if a new
+    -- idempotent request is required.
+    clientToken :: Prelude.Maybe Prelude.Text,
+    -- | A description for the project.
+    projectDescription :: Prelude.Maybe Prelude.Text,
+    -- | A list of key-value pairs that contain metadata for the project. For
+    -- more information, see
+    -- <https://docs.aws.amazon.com/iot-sitewise/latest/userguide/tag-resources.html Tagging your IoT SiteWise resources>
+    -- in the /IoT SiteWise User Guide/.
+    tags :: Prelude.Maybe (Prelude.HashMap Prelude.Text Prelude.Text),
+    -- | The ID of the portal in which to create the project.
+    portalId :: Prelude.Text,
+    -- | A friendly name for the project.
+    projectName :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'CreateProject' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'clientToken', 'createProject_clientToken' - A unique case-sensitive identifier that you can provide to ensure the
+-- idempotency of the request. Don\'t reuse this client token if a new
+-- idempotent request is required.
+--
+-- 'projectDescription', 'createProject_projectDescription' - A description for the project.
+--
+-- 'tags', 'createProject_tags' - A list of key-value pairs that contain metadata for the project. For
+-- more information, see
+-- <https://docs.aws.amazon.com/iot-sitewise/latest/userguide/tag-resources.html Tagging your IoT SiteWise resources>
+-- in the /IoT SiteWise User Guide/.
+--
+-- 'portalId', 'createProject_portalId' - The ID of the portal in which to create the project.
+--
+-- 'projectName', 'createProject_projectName' - A friendly name for the project.
+newCreateProject ::
+  -- | 'portalId'
+  Prelude.Text ->
+  -- | 'projectName'
+  Prelude.Text ->
+  CreateProject
+newCreateProject pPortalId_ pProjectName_ =
+  CreateProject'
+    { clientToken = Prelude.Nothing,
+      projectDescription = Prelude.Nothing,
+      tags = Prelude.Nothing,
+      portalId = pPortalId_,
+      projectName = pProjectName_
+    }
+
+-- | A unique case-sensitive identifier that you can provide to ensure the
+-- idempotency of the request. Don\'t reuse this client token if a new
+-- idempotent request is required.
+createProject_clientToken :: Lens.Lens' CreateProject (Prelude.Maybe Prelude.Text)
+createProject_clientToken = Lens.lens (\CreateProject' {clientToken} -> clientToken) (\s@CreateProject' {} a -> s {clientToken = a} :: CreateProject)
+
+-- | A description for the project.
+createProject_projectDescription :: Lens.Lens' CreateProject (Prelude.Maybe Prelude.Text)
+createProject_projectDescription = Lens.lens (\CreateProject' {projectDescription} -> projectDescription) (\s@CreateProject' {} a -> s {projectDescription = a} :: CreateProject)
+
+-- | A list of key-value pairs that contain metadata for the project. For
+-- more information, see
+-- <https://docs.aws.amazon.com/iot-sitewise/latest/userguide/tag-resources.html Tagging your IoT SiteWise resources>
+-- in the /IoT SiteWise User Guide/.
+createProject_tags :: Lens.Lens' CreateProject (Prelude.Maybe (Prelude.HashMap Prelude.Text Prelude.Text))
+createProject_tags = Lens.lens (\CreateProject' {tags} -> tags) (\s@CreateProject' {} a -> s {tags = a} :: CreateProject) Prelude.. Lens.mapping Lens.coerced
+
+-- | The ID of the portal in which to create the project.
+createProject_portalId :: Lens.Lens' CreateProject Prelude.Text
+createProject_portalId = Lens.lens (\CreateProject' {portalId} -> portalId) (\s@CreateProject' {} a -> s {portalId = a} :: CreateProject)
+
+-- | A friendly name for the project.
+createProject_projectName :: Lens.Lens' CreateProject Prelude.Text
+createProject_projectName = Lens.lens (\CreateProject' {projectName} -> projectName) (\s@CreateProject' {} a -> s {projectName = a} :: CreateProject)
+
+instance Core.AWSRequest CreateProject where
+  type
+    AWSResponse CreateProject =
+      CreateProjectResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          CreateProjectResponse'
+            Prelude.<$> (Prelude.pure (Prelude.fromEnum s))
+            Prelude.<*> (x Data..:> "projectId")
+            Prelude.<*> (x Data..:> "projectArn")
+      )
+
+instance Prelude.Hashable CreateProject where
+  hashWithSalt _salt CreateProject' {..} =
+    _salt
+      `Prelude.hashWithSalt` clientToken
+      `Prelude.hashWithSalt` projectDescription
+      `Prelude.hashWithSalt` tags
+      `Prelude.hashWithSalt` portalId
+      `Prelude.hashWithSalt` projectName
+
+instance Prelude.NFData CreateProject where
+  rnf CreateProject' {..} =
+    Prelude.rnf clientToken
+      `Prelude.seq` Prelude.rnf projectDescription
+      `Prelude.seq` Prelude.rnf tags
+      `Prelude.seq` Prelude.rnf portalId
+      `Prelude.seq` Prelude.rnf projectName
+
+instance Data.ToHeaders CreateProject where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON CreateProject where
+  toJSON CreateProject' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("clientToken" Data..=) Prelude.<$> clientToken,
+            ("projectDescription" Data..=)
+              Prelude.<$> projectDescription,
+            ("tags" Data..=) Prelude.<$> tags,
+            Prelude.Just ("portalId" Data..= portalId),
+            Prelude.Just ("projectName" Data..= projectName)
+          ]
+      )
+
+instance Data.ToPath CreateProject where
+  toPath = Prelude.const "/projects"
+
+instance Data.ToQuery CreateProject where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newCreateProjectResponse' smart constructor.
+data CreateProjectResponse = CreateProjectResponse'
+  { -- | The response's http status code.
+    httpStatus :: Prelude.Int,
+    -- | The ID of the project.
+    projectId :: Prelude.Text,
+    -- | The
+    -- <https://docs.aws.amazon.com/general/latest/gr/aws-arns-and-namespaces.html ARN>
+    -- of the project, which has the following format.
+    --
+    -- @arn:${Partition}:iotsitewise:${Region}:${Account}:project\/${ProjectId}@
+    projectArn :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'CreateProjectResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'httpStatus', 'createProjectResponse_httpStatus' - The response's http status code.
+--
+-- 'projectId', 'createProjectResponse_projectId' - The ID of the project.
+--
+-- 'projectArn', 'createProjectResponse_projectArn' - The
+-- <https://docs.aws.amazon.com/general/latest/gr/aws-arns-and-namespaces.html ARN>
+-- of the project, which has the following format.
+--
+-- @arn:${Partition}:iotsitewise:${Region}:${Account}:project\/${ProjectId}@
+newCreateProjectResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  -- | 'projectId'
+  Prelude.Text ->
+  -- | 'projectArn'
+  Prelude.Text ->
+  CreateProjectResponse
+newCreateProjectResponse
+  pHttpStatus_
+  pProjectId_
+  pProjectArn_ =
+    CreateProjectResponse'
+      { httpStatus = pHttpStatus_,
+        projectId = pProjectId_,
+        projectArn = pProjectArn_
+      }
+
+-- | The response's http status code.
+createProjectResponse_httpStatus :: Lens.Lens' CreateProjectResponse Prelude.Int
+createProjectResponse_httpStatus = Lens.lens (\CreateProjectResponse' {httpStatus} -> httpStatus) (\s@CreateProjectResponse' {} a -> s {httpStatus = a} :: CreateProjectResponse)
+
+-- | The ID of the project.
+createProjectResponse_projectId :: Lens.Lens' CreateProjectResponse Prelude.Text
+createProjectResponse_projectId = Lens.lens (\CreateProjectResponse' {projectId} -> projectId) (\s@CreateProjectResponse' {} a -> s {projectId = a} :: CreateProjectResponse)
+
+-- | The
+-- <https://docs.aws.amazon.com/general/latest/gr/aws-arns-and-namespaces.html ARN>
+-- of the project, which has the following format.
+--
+-- @arn:${Partition}:iotsitewise:${Region}:${Account}:project\/${ProjectId}@
+createProjectResponse_projectArn :: Lens.Lens' CreateProjectResponse Prelude.Text
+createProjectResponse_projectArn = Lens.lens (\CreateProjectResponse' {projectArn} -> projectArn) (\s@CreateProjectResponse' {} a -> s {projectArn = a} :: CreateProjectResponse)
+
+instance Prelude.NFData CreateProjectResponse where
+  rnf CreateProjectResponse' {..} =
+    Prelude.rnf httpStatus
+      `Prelude.seq` Prelude.rnf projectId
+      `Prelude.seq` Prelude.rnf projectArn
diff --git a/gen/Amazonka/IoTSiteWise/DeleteAccessPolicy.hs b/gen/Amazonka/IoTSiteWise/DeleteAccessPolicy.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/IoTSiteWise/DeleteAccessPolicy.hs
@@ -0,0 +1,172 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.IoTSiteWise.DeleteAccessPolicy
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Deletes an access policy that grants the specified identity access to
+-- the specified IoT SiteWise Monitor resource. You can use this operation
+-- to revoke access to an IoT SiteWise Monitor resource.
+module Amazonka.IoTSiteWise.DeleteAccessPolicy
+  ( -- * Creating a Request
+    DeleteAccessPolicy (..),
+    newDeleteAccessPolicy,
+
+    -- * Request Lenses
+    deleteAccessPolicy_clientToken,
+    deleteAccessPolicy_accessPolicyId,
+
+    -- * Destructuring the Response
+    DeleteAccessPolicyResponse (..),
+    newDeleteAccessPolicyResponse,
+
+    -- * Response Lenses
+    deleteAccessPolicyResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.IoTSiteWise.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newDeleteAccessPolicy' smart constructor.
+data DeleteAccessPolicy = DeleteAccessPolicy'
+  { -- | A unique case-sensitive identifier that you can provide to ensure the
+    -- idempotency of the request. Don\'t reuse this client token if a new
+    -- idempotent request is required.
+    clientToken :: Prelude.Maybe Prelude.Text,
+    -- | The ID of the access policy to be deleted.
+    accessPolicyId :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DeleteAccessPolicy' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'clientToken', 'deleteAccessPolicy_clientToken' - A unique case-sensitive identifier that you can provide to ensure the
+-- idempotency of the request. Don\'t reuse this client token if a new
+-- idempotent request is required.
+--
+-- 'accessPolicyId', 'deleteAccessPolicy_accessPolicyId' - The ID of the access policy to be deleted.
+newDeleteAccessPolicy ::
+  -- | 'accessPolicyId'
+  Prelude.Text ->
+  DeleteAccessPolicy
+newDeleteAccessPolicy pAccessPolicyId_ =
+  DeleteAccessPolicy'
+    { clientToken = Prelude.Nothing,
+      accessPolicyId = pAccessPolicyId_
+    }
+
+-- | A unique case-sensitive identifier that you can provide to ensure the
+-- idempotency of the request. Don\'t reuse this client token if a new
+-- idempotent request is required.
+deleteAccessPolicy_clientToken :: Lens.Lens' DeleteAccessPolicy (Prelude.Maybe Prelude.Text)
+deleteAccessPolicy_clientToken = Lens.lens (\DeleteAccessPolicy' {clientToken} -> clientToken) (\s@DeleteAccessPolicy' {} a -> s {clientToken = a} :: DeleteAccessPolicy)
+
+-- | The ID of the access policy to be deleted.
+deleteAccessPolicy_accessPolicyId :: Lens.Lens' DeleteAccessPolicy Prelude.Text
+deleteAccessPolicy_accessPolicyId = Lens.lens (\DeleteAccessPolicy' {accessPolicyId} -> accessPolicyId) (\s@DeleteAccessPolicy' {} a -> s {accessPolicyId = a} :: DeleteAccessPolicy)
+
+instance Core.AWSRequest DeleteAccessPolicy where
+  type
+    AWSResponse DeleteAccessPolicy =
+      DeleteAccessPolicyResponse
+  request overrides =
+    Request.delete (overrides defaultService)
+  response =
+    Response.receiveEmpty
+      ( \s h x ->
+          DeleteAccessPolicyResponse'
+            Prelude.<$> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable DeleteAccessPolicy where
+  hashWithSalt _salt DeleteAccessPolicy' {..} =
+    _salt
+      `Prelude.hashWithSalt` clientToken
+      `Prelude.hashWithSalt` accessPolicyId
+
+instance Prelude.NFData DeleteAccessPolicy where
+  rnf DeleteAccessPolicy' {..} =
+    Prelude.rnf clientToken
+      `Prelude.seq` Prelude.rnf accessPolicyId
+
+instance Data.ToHeaders DeleteAccessPolicy where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToPath DeleteAccessPolicy where
+  toPath DeleteAccessPolicy' {..} =
+    Prelude.mconcat
+      ["/access-policies/", Data.toBS accessPolicyId]
+
+instance Data.ToQuery DeleteAccessPolicy where
+  toQuery DeleteAccessPolicy' {..} =
+    Prelude.mconcat ["clientToken" Data.=: clientToken]
+
+-- | /See:/ 'newDeleteAccessPolicyResponse' smart constructor.
+data DeleteAccessPolicyResponse = DeleteAccessPolicyResponse'
+  { -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DeleteAccessPolicyResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'httpStatus', 'deleteAccessPolicyResponse_httpStatus' - The response's http status code.
+newDeleteAccessPolicyResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  DeleteAccessPolicyResponse
+newDeleteAccessPolicyResponse pHttpStatus_ =
+  DeleteAccessPolicyResponse'
+    { httpStatus =
+        pHttpStatus_
+    }
+
+-- | The response's http status code.
+deleteAccessPolicyResponse_httpStatus :: Lens.Lens' DeleteAccessPolicyResponse Prelude.Int
+deleteAccessPolicyResponse_httpStatus = Lens.lens (\DeleteAccessPolicyResponse' {httpStatus} -> httpStatus) (\s@DeleteAccessPolicyResponse' {} a -> s {httpStatus = a} :: DeleteAccessPolicyResponse)
+
+instance Prelude.NFData DeleteAccessPolicyResponse where
+  rnf DeleteAccessPolicyResponse' {..} =
+    Prelude.rnf httpStatus
diff --git a/gen/Amazonka/IoTSiteWise/DeleteAsset.hs b/gen/Amazonka/IoTSiteWise/DeleteAsset.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/IoTSiteWise/DeleteAsset.hs
@@ -0,0 +1,190 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.IoTSiteWise.DeleteAsset
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Deletes an asset. This action can\'t be undone. For more information,
+-- see
+-- <https://docs.aws.amazon.com/iot-sitewise/latest/userguide/delete-assets-and-models.html Deleting assets and models>
+-- in the /IoT SiteWise User Guide/.
+--
+-- You can\'t delete an asset that\'s associated to another asset. For more
+-- information, see
+-- <https://docs.aws.amazon.com/iot-sitewise/latest/APIReference/API_DisassociateAssets.html DisassociateAssets>.
+module Amazonka.IoTSiteWise.DeleteAsset
+  ( -- * Creating a Request
+    DeleteAsset (..),
+    newDeleteAsset,
+
+    -- * Request Lenses
+    deleteAsset_clientToken,
+    deleteAsset_assetId,
+
+    -- * Destructuring the Response
+    DeleteAssetResponse (..),
+    newDeleteAssetResponse,
+
+    -- * Response Lenses
+    deleteAssetResponse_httpStatus,
+    deleteAssetResponse_assetStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.IoTSiteWise.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newDeleteAsset' smart constructor.
+data DeleteAsset = DeleteAsset'
+  { -- | A unique case-sensitive identifier that you can provide to ensure the
+    -- idempotency of the request. Don\'t reuse this client token if a new
+    -- idempotent request is required.
+    clientToken :: Prelude.Maybe Prelude.Text,
+    -- | The ID of the asset to delete.
+    assetId :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DeleteAsset' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'clientToken', 'deleteAsset_clientToken' - A unique case-sensitive identifier that you can provide to ensure the
+-- idempotency of the request. Don\'t reuse this client token if a new
+-- idempotent request is required.
+--
+-- 'assetId', 'deleteAsset_assetId' - The ID of the asset to delete.
+newDeleteAsset ::
+  -- | 'assetId'
+  Prelude.Text ->
+  DeleteAsset
+newDeleteAsset pAssetId_ =
+  DeleteAsset'
+    { clientToken = Prelude.Nothing,
+      assetId = pAssetId_
+    }
+
+-- | A unique case-sensitive identifier that you can provide to ensure the
+-- idempotency of the request. Don\'t reuse this client token if a new
+-- idempotent request is required.
+deleteAsset_clientToken :: Lens.Lens' DeleteAsset (Prelude.Maybe Prelude.Text)
+deleteAsset_clientToken = Lens.lens (\DeleteAsset' {clientToken} -> clientToken) (\s@DeleteAsset' {} a -> s {clientToken = a} :: DeleteAsset)
+
+-- | The ID of the asset to delete.
+deleteAsset_assetId :: Lens.Lens' DeleteAsset Prelude.Text
+deleteAsset_assetId = Lens.lens (\DeleteAsset' {assetId} -> assetId) (\s@DeleteAsset' {} a -> s {assetId = a} :: DeleteAsset)
+
+instance Core.AWSRequest DeleteAsset where
+  type AWSResponse DeleteAsset = DeleteAssetResponse
+  request overrides =
+    Request.delete (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          DeleteAssetResponse'
+            Prelude.<$> (Prelude.pure (Prelude.fromEnum s))
+            Prelude.<*> (x Data..:> "assetStatus")
+      )
+
+instance Prelude.Hashable DeleteAsset where
+  hashWithSalt _salt DeleteAsset' {..} =
+    _salt
+      `Prelude.hashWithSalt` clientToken
+      `Prelude.hashWithSalt` assetId
+
+instance Prelude.NFData DeleteAsset where
+  rnf DeleteAsset' {..} =
+    Prelude.rnf clientToken
+      `Prelude.seq` Prelude.rnf assetId
+
+instance Data.ToHeaders DeleteAsset where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToPath DeleteAsset where
+  toPath DeleteAsset' {..} =
+    Prelude.mconcat ["/assets/", Data.toBS assetId]
+
+instance Data.ToQuery DeleteAsset where
+  toQuery DeleteAsset' {..} =
+    Prelude.mconcat ["clientToken" Data.=: clientToken]
+
+-- | /See:/ 'newDeleteAssetResponse' smart constructor.
+data DeleteAssetResponse = DeleteAssetResponse'
+  { -- | The response's http status code.
+    httpStatus :: Prelude.Int,
+    -- | The status of the asset, which contains a state (@DELETING@ after
+    -- successfully calling this operation) and any error message.
+    assetStatus :: AssetStatus
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DeleteAssetResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'httpStatus', 'deleteAssetResponse_httpStatus' - The response's http status code.
+--
+-- 'assetStatus', 'deleteAssetResponse_assetStatus' - The status of the asset, which contains a state (@DELETING@ after
+-- successfully calling this operation) and any error message.
+newDeleteAssetResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  -- | 'assetStatus'
+  AssetStatus ->
+  DeleteAssetResponse
+newDeleteAssetResponse pHttpStatus_ pAssetStatus_ =
+  DeleteAssetResponse'
+    { httpStatus = pHttpStatus_,
+      assetStatus = pAssetStatus_
+    }
+
+-- | The response's http status code.
+deleteAssetResponse_httpStatus :: Lens.Lens' DeleteAssetResponse Prelude.Int
+deleteAssetResponse_httpStatus = Lens.lens (\DeleteAssetResponse' {httpStatus} -> httpStatus) (\s@DeleteAssetResponse' {} a -> s {httpStatus = a} :: DeleteAssetResponse)
+
+-- | The status of the asset, which contains a state (@DELETING@ after
+-- successfully calling this operation) and any error message.
+deleteAssetResponse_assetStatus :: Lens.Lens' DeleteAssetResponse AssetStatus
+deleteAssetResponse_assetStatus = Lens.lens (\DeleteAssetResponse' {assetStatus} -> assetStatus) (\s@DeleteAssetResponse' {} a -> s {assetStatus = a} :: DeleteAssetResponse)
+
+instance Prelude.NFData DeleteAssetResponse where
+  rnf DeleteAssetResponse' {..} =
+    Prelude.rnf httpStatus
+      `Prelude.seq` Prelude.rnf assetStatus
diff --git a/gen/Amazonka/IoTSiteWise/DeleteAssetModel.hs b/gen/Amazonka/IoTSiteWise/DeleteAssetModel.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/IoTSiteWise/DeleteAssetModel.hs
@@ -0,0 +1,195 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.IoTSiteWise.DeleteAssetModel
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Deletes an asset model. This action can\'t be undone. You must delete
+-- all assets created from an asset model before you can delete the model.
+-- Also, you can\'t delete an asset model if a parent asset model exists
+-- that contains a property formula expression that depends on the asset
+-- model that you want to delete. For more information, see
+-- <https://docs.aws.amazon.com/iot-sitewise/latest/userguide/delete-assets-and-models.html Deleting assets and models>
+-- in the /IoT SiteWise User Guide/.
+module Amazonka.IoTSiteWise.DeleteAssetModel
+  ( -- * Creating a Request
+    DeleteAssetModel (..),
+    newDeleteAssetModel,
+
+    -- * Request Lenses
+    deleteAssetModel_clientToken,
+    deleteAssetModel_assetModelId,
+
+    -- * Destructuring the Response
+    DeleteAssetModelResponse (..),
+    newDeleteAssetModelResponse,
+
+    -- * Response Lenses
+    deleteAssetModelResponse_httpStatus,
+    deleteAssetModelResponse_assetModelStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.IoTSiteWise.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newDeleteAssetModel' smart constructor.
+data DeleteAssetModel = DeleteAssetModel'
+  { -- | A unique case-sensitive identifier that you can provide to ensure the
+    -- idempotency of the request. Don\'t reuse this client token if a new
+    -- idempotent request is required.
+    clientToken :: Prelude.Maybe Prelude.Text,
+    -- | The ID of the asset model to delete.
+    assetModelId :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DeleteAssetModel' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'clientToken', 'deleteAssetModel_clientToken' - A unique case-sensitive identifier that you can provide to ensure the
+-- idempotency of the request. Don\'t reuse this client token if a new
+-- idempotent request is required.
+--
+-- 'assetModelId', 'deleteAssetModel_assetModelId' - The ID of the asset model to delete.
+newDeleteAssetModel ::
+  -- | 'assetModelId'
+  Prelude.Text ->
+  DeleteAssetModel
+newDeleteAssetModel pAssetModelId_ =
+  DeleteAssetModel'
+    { clientToken = Prelude.Nothing,
+      assetModelId = pAssetModelId_
+    }
+
+-- | A unique case-sensitive identifier that you can provide to ensure the
+-- idempotency of the request. Don\'t reuse this client token if a new
+-- idempotent request is required.
+deleteAssetModel_clientToken :: Lens.Lens' DeleteAssetModel (Prelude.Maybe Prelude.Text)
+deleteAssetModel_clientToken = Lens.lens (\DeleteAssetModel' {clientToken} -> clientToken) (\s@DeleteAssetModel' {} a -> s {clientToken = a} :: DeleteAssetModel)
+
+-- | The ID of the asset model to delete.
+deleteAssetModel_assetModelId :: Lens.Lens' DeleteAssetModel Prelude.Text
+deleteAssetModel_assetModelId = Lens.lens (\DeleteAssetModel' {assetModelId} -> assetModelId) (\s@DeleteAssetModel' {} a -> s {assetModelId = a} :: DeleteAssetModel)
+
+instance Core.AWSRequest DeleteAssetModel where
+  type
+    AWSResponse DeleteAssetModel =
+      DeleteAssetModelResponse
+  request overrides =
+    Request.delete (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          DeleteAssetModelResponse'
+            Prelude.<$> (Prelude.pure (Prelude.fromEnum s))
+            Prelude.<*> (x Data..:> "assetModelStatus")
+      )
+
+instance Prelude.Hashable DeleteAssetModel where
+  hashWithSalt _salt DeleteAssetModel' {..} =
+    _salt
+      `Prelude.hashWithSalt` clientToken
+      `Prelude.hashWithSalt` assetModelId
+
+instance Prelude.NFData DeleteAssetModel where
+  rnf DeleteAssetModel' {..} =
+    Prelude.rnf clientToken
+      `Prelude.seq` Prelude.rnf assetModelId
+
+instance Data.ToHeaders DeleteAssetModel where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToPath DeleteAssetModel where
+  toPath DeleteAssetModel' {..} =
+    Prelude.mconcat
+      ["/asset-models/", Data.toBS assetModelId]
+
+instance Data.ToQuery DeleteAssetModel where
+  toQuery DeleteAssetModel' {..} =
+    Prelude.mconcat ["clientToken" Data.=: clientToken]
+
+-- | /See:/ 'newDeleteAssetModelResponse' smart constructor.
+data DeleteAssetModelResponse = DeleteAssetModelResponse'
+  { -- | The response's http status code.
+    httpStatus :: Prelude.Int,
+    -- | The status of the asset model, which contains a state (@DELETING@ after
+    -- successfully calling this operation) and any error message.
+    assetModelStatus :: AssetModelStatus
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DeleteAssetModelResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'httpStatus', 'deleteAssetModelResponse_httpStatus' - The response's http status code.
+--
+-- 'assetModelStatus', 'deleteAssetModelResponse_assetModelStatus' - The status of the asset model, which contains a state (@DELETING@ after
+-- successfully calling this operation) and any error message.
+newDeleteAssetModelResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  -- | 'assetModelStatus'
+  AssetModelStatus ->
+  DeleteAssetModelResponse
+newDeleteAssetModelResponse
+  pHttpStatus_
+  pAssetModelStatus_ =
+    DeleteAssetModelResponse'
+      { httpStatus =
+          pHttpStatus_,
+        assetModelStatus = pAssetModelStatus_
+      }
+
+-- | The response's http status code.
+deleteAssetModelResponse_httpStatus :: Lens.Lens' DeleteAssetModelResponse Prelude.Int
+deleteAssetModelResponse_httpStatus = Lens.lens (\DeleteAssetModelResponse' {httpStatus} -> httpStatus) (\s@DeleteAssetModelResponse' {} a -> s {httpStatus = a} :: DeleteAssetModelResponse)
+
+-- | The status of the asset model, which contains a state (@DELETING@ after
+-- successfully calling this operation) and any error message.
+deleteAssetModelResponse_assetModelStatus :: Lens.Lens' DeleteAssetModelResponse AssetModelStatus
+deleteAssetModelResponse_assetModelStatus = Lens.lens (\DeleteAssetModelResponse' {assetModelStatus} -> assetModelStatus) (\s@DeleteAssetModelResponse' {} a -> s {assetModelStatus = a} :: DeleteAssetModelResponse)
+
+instance Prelude.NFData DeleteAssetModelResponse where
+  rnf DeleteAssetModelResponse' {..} =
+    Prelude.rnf httpStatus
+      `Prelude.seq` Prelude.rnf assetModelStatus
diff --git a/gen/Amazonka/IoTSiteWise/DeleteDashboard.hs b/gen/Amazonka/IoTSiteWise/DeleteDashboard.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/IoTSiteWise/DeleteDashboard.hs
@@ -0,0 +1,167 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.IoTSiteWise.DeleteDashboard
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Deletes a dashboard from IoT SiteWise Monitor.
+module Amazonka.IoTSiteWise.DeleteDashboard
+  ( -- * Creating a Request
+    DeleteDashboard (..),
+    newDeleteDashboard,
+
+    -- * Request Lenses
+    deleteDashboard_clientToken,
+    deleteDashboard_dashboardId,
+
+    -- * Destructuring the Response
+    DeleteDashboardResponse (..),
+    newDeleteDashboardResponse,
+
+    -- * Response Lenses
+    deleteDashboardResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.IoTSiteWise.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newDeleteDashboard' smart constructor.
+data DeleteDashboard = DeleteDashboard'
+  { -- | A unique case-sensitive identifier that you can provide to ensure the
+    -- idempotency of the request. Don\'t reuse this client token if a new
+    -- idempotent request is required.
+    clientToken :: Prelude.Maybe Prelude.Text,
+    -- | The ID of the dashboard to delete.
+    dashboardId :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DeleteDashboard' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'clientToken', 'deleteDashboard_clientToken' - A unique case-sensitive identifier that you can provide to ensure the
+-- idempotency of the request. Don\'t reuse this client token if a new
+-- idempotent request is required.
+--
+-- 'dashboardId', 'deleteDashboard_dashboardId' - The ID of the dashboard to delete.
+newDeleteDashboard ::
+  -- | 'dashboardId'
+  Prelude.Text ->
+  DeleteDashboard
+newDeleteDashboard pDashboardId_ =
+  DeleteDashboard'
+    { clientToken = Prelude.Nothing,
+      dashboardId = pDashboardId_
+    }
+
+-- | A unique case-sensitive identifier that you can provide to ensure the
+-- idempotency of the request. Don\'t reuse this client token if a new
+-- idempotent request is required.
+deleteDashboard_clientToken :: Lens.Lens' DeleteDashboard (Prelude.Maybe Prelude.Text)
+deleteDashboard_clientToken = Lens.lens (\DeleteDashboard' {clientToken} -> clientToken) (\s@DeleteDashboard' {} a -> s {clientToken = a} :: DeleteDashboard)
+
+-- | The ID of the dashboard to delete.
+deleteDashboard_dashboardId :: Lens.Lens' DeleteDashboard Prelude.Text
+deleteDashboard_dashboardId = Lens.lens (\DeleteDashboard' {dashboardId} -> dashboardId) (\s@DeleteDashboard' {} a -> s {dashboardId = a} :: DeleteDashboard)
+
+instance Core.AWSRequest DeleteDashboard where
+  type
+    AWSResponse DeleteDashboard =
+      DeleteDashboardResponse
+  request overrides =
+    Request.delete (overrides defaultService)
+  response =
+    Response.receiveEmpty
+      ( \s h x ->
+          DeleteDashboardResponse'
+            Prelude.<$> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable DeleteDashboard where
+  hashWithSalt _salt DeleteDashboard' {..} =
+    _salt
+      `Prelude.hashWithSalt` clientToken
+      `Prelude.hashWithSalt` dashboardId
+
+instance Prelude.NFData DeleteDashboard where
+  rnf DeleteDashboard' {..} =
+    Prelude.rnf clientToken
+      `Prelude.seq` Prelude.rnf dashboardId
+
+instance Data.ToHeaders DeleteDashboard where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToPath DeleteDashboard where
+  toPath DeleteDashboard' {..} =
+    Prelude.mconcat
+      ["/dashboards/", Data.toBS dashboardId]
+
+instance Data.ToQuery DeleteDashboard where
+  toQuery DeleteDashboard' {..} =
+    Prelude.mconcat ["clientToken" Data.=: clientToken]
+
+-- | /See:/ 'newDeleteDashboardResponse' smart constructor.
+data DeleteDashboardResponse = DeleteDashboardResponse'
+  { -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DeleteDashboardResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'httpStatus', 'deleteDashboardResponse_httpStatus' - The response's http status code.
+newDeleteDashboardResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  DeleteDashboardResponse
+newDeleteDashboardResponse pHttpStatus_ =
+  DeleteDashboardResponse' {httpStatus = pHttpStatus_}
+
+-- | The response's http status code.
+deleteDashboardResponse_httpStatus :: Lens.Lens' DeleteDashboardResponse Prelude.Int
+deleteDashboardResponse_httpStatus = Lens.lens (\DeleteDashboardResponse' {httpStatus} -> httpStatus) (\s@DeleteDashboardResponse' {} a -> s {httpStatus = a} :: DeleteDashboardResponse)
+
+instance Prelude.NFData DeleteDashboardResponse where
+  rnf DeleteDashboardResponse' {..} =
+    Prelude.rnf httpStatus
diff --git a/gen/Amazonka/IoTSiteWise/DeleteGateway.hs b/gen/Amazonka/IoTSiteWise/DeleteGateway.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/IoTSiteWise/DeleteGateway.hs
@@ -0,0 +1,124 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.IoTSiteWise.DeleteGateway
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Deletes a gateway from IoT SiteWise. When you delete a gateway, some of
+-- the gateway\'s files remain in your gateway\'s file system.
+module Amazonka.IoTSiteWise.DeleteGateway
+  ( -- * Creating a Request
+    DeleteGateway (..),
+    newDeleteGateway,
+
+    -- * Request Lenses
+    deleteGateway_gatewayId,
+
+    -- * Destructuring the Response
+    DeleteGatewayResponse (..),
+    newDeleteGatewayResponse,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.IoTSiteWise.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newDeleteGateway' smart constructor.
+data DeleteGateway = DeleteGateway'
+  { -- | The ID of the gateway to delete.
+    gatewayId :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DeleteGateway' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'gatewayId', 'deleteGateway_gatewayId' - The ID of the gateway to delete.
+newDeleteGateway ::
+  -- | 'gatewayId'
+  Prelude.Text ->
+  DeleteGateway
+newDeleteGateway pGatewayId_ =
+  DeleteGateway' {gatewayId = pGatewayId_}
+
+-- | The ID of the gateway to delete.
+deleteGateway_gatewayId :: Lens.Lens' DeleteGateway Prelude.Text
+deleteGateway_gatewayId = Lens.lens (\DeleteGateway' {gatewayId} -> gatewayId) (\s@DeleteGateway' {} a -> s {gatewayId = a} :: DeleteGateway)
+
+instance Core.AWSRequest DeleteGateway where
+  type
+    AWSResponse DeleteGateway =
+      DeleteGatewayResponse
+  request overrides =
+    Request.delete (overrides defaultService)
+  response =
+    Response.receiveNull DeleteGatewayResponse'
+
+instance Prelude.Hashable DeleteGateway where
+  hashWithSalt _salt DeleteGateway' {..} =
+    _salt `Prelude.hashWithSalt` gatewayId
+
+instance Prelude.NFData DeleteGateway where
+  rnf DeleteGateway' {..} = Prelude.rnf gatewayId
+
+instance Data.ToHeaders DeleteGateway where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToPath DeleteGateway where
+  toPath DeleteGateway' {..} =
+    Prelude.mconcat
+      ["/20200301/gateways/", Data.toBS gatewayId]
+
+instance Data.ToQuery DeleteGateway where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newDeleteGatewayResponse' smart constructor.
+data DeleteGatewayResponse = DeleteGatewayResponse'
+  {
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DeleteGatewayResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+newDeleteGatewayResponse ::
+  DeleteGatewayResponse
+newDeleteGatewayResponse = DeleteGatewayResponse'
+
+instance Prelude.NFData DeleteGatewayResponse where
+  rnf _ = ()
diff --git a/gen/Amazonka/IoTSiteWise/DeletePortal.hs b/gen/Amazonka/IoTSiteWise/DeletePortal.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/IoTSiteWise/DeletePortal.hs
@@ -0,0 +1,183 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.IoTSiteWise.DeletePortal
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Deletes a portal from IoT SiteWise Monitor.
+module Amazonka.IoTSiteWise.DeletePortal
+  ( -- * Creating a Request
+    DeletePortal (..),
+    newDeletePortal,
+
+    -- * Request Lenses
+    deletePortal_clientToken,
+    deletePortal_portalId,
+
+    -- * Destructuring the Response
+    DeletePortalResponse (..),
+    newDeletePortalResponse,
+
+    -- * Response Lenses
+    deletePortalResponse_httpStatus,
+    deletePortalResponse_portalStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.IoTSiteWise.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newDeletePortal' smart constructor.
+data DeletePortal = DeletePortal'
+  { -- | A unique case-sensitive identifier that you can provide to ensure the
+    -- idempotency of the request. Don\'t reuse this client token if a new
+    -- idempotent request is required.
+    clientToken :: Prelude.Maybe Prelude.Text,
+    -- | The ID of the portal to delete.
+    portalId :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DeletePortal' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'clientToken', 'deletePortal_clientToken' - A unique case-sensitive identifier that you can provide to ensure the
+-- idempotency of the request. Don\'t reuse this client token if a new
+-- idempotent request is required.
+--
+-- 'portalId', 'deletePortal_portalId' - The ID of the portal to delete.
+newDeletePortal ::
+  -- | 'portalId'
+  Prelude.Text ->
+  DeletePortal
+newDeletePortal pPortalId_ =
+  DeletePortal'
+    { clientToken = Prelude.Nothing,
+      portalId = pPortalId_
+    }
+
+-- | A unique case-sensitive identifier that you can provide to ensure the
+-- idempotency of the request. Don\'t reuse this client token if a new
+-- idempotent request is required.
+deletePortal_clientToken :: Lens.Lens' DeletePortal (Prelude.Maybe Prelude.Text)
+deletePortal_clientToken = Lens.lens (\DeletePortal' {clientToken} -> clientToken) (\s@DeletePortal' {} a -> s {clientToken = a} :: DeletePortal)
+
+-- | The ID of the portal to delete.
+deletePortal_portalId :: Lens.Lens' DeletePortal Prelude.Text
+deletePortal_portalId = Lens.lens (\DeletePortal' {portalId} -> portalId) (\s@DeletePortal' {} a -> s {portalId = a} :: DeletePortal)
+
+instance Core.AWSRequest DeletePortal where
+  type AWSResponse DeletePortal = DeletePortalResponse
+  request overrides =
+    Request.delete (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          DeletePortalResponse'
+            Prelude.<$> (Prelude.pure (Prelude.fromEnum s))
+            Prelude.<*> (x Data..:> "portalStatus")
+      )
+
+instance Prelude.Hashable DeletePortal where
+  hashWithSalt _salt DeletePortal' {..} =
+    _salt
+      `Prelude.hashWithSalt` clientToken
+      `Prelude.hashWithSalt` portalId
+
+instance Prelude.NFData DeletePortal where
+  rnf DeletePortal' {..} =
+    Prelude.rnf clientToken
+      `Prelude.seq` Prelude.rnf portalId
+
+instance Data.ToHeaders DeletePortal where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToPath DeletePortal where
+  toPath DeletePortal' {..} =
+    Prelude.mconcat ["/portals/", Data.toBS portalId]
+
+instance Data.ToQuery DeletePortal where
+  toQuery DeletePortal' {..} =
+    Prelude.mconcat ["clientToken" Data.=: clientToken]
+
+-- | /See:/ 'newDeletePortalResponse' smart constructor.
+data DeletePortalResponse = DeletePortalResponse'
+  { -- | The response's http status code.
+    httpStatus :: Prelude.Int,
+    -- | The status of the portal, which contains a state (@DELETING@ after
+    -- successfully calling this operation) and any error message.
+    portalStatus :: PortalStatus
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DeletePortalResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'httpStatus', 'deletePortalResponse_httpStatus' - The response's http status code.
+--
+-- 'portalStatus', 'deletePortalResponse_portalStatus' - The status of the portal, which contains a state (@DELETING@ after
+-- successfully calling this operation) and any error message.
+newDeletePortalResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  -- | 'portalStatus'
+  PortalStatus ->
+  DeletePortalResponse
+newDeletePortalResponse pHttpStatus_ pPortalStatus_ =
+  DeletePortalResponse'
+    { httpStatus = pHttpStatus_,
+      portalStatus = pPortalStatus_
+    }
+
+-- | The response's http status code.
+deletePortalResponse_httpStatus :: Lens.Lens' DeletePortalResponse Prelude.Int
+deletePortalResponse_httpStatus = Lens.lens (\DeletePortalResponse' {httpStatus} -> httpStatus) (\s@DeletePortalResponse' {} a -> s {httpStatus = a} :: DeletePortalResponse)
+
+-- | The status of the portal, which contains a state (@DELETING@ after
+-- successfully calling this operation) and any error message.
+deletePortalResponse_portalStatus :: Lens.Lens' DeletePortalResponse PortalStatus
+deletePortalResponse_portalStatus = Lens.lens (\DeletePortalResponse' {portalStatus} -> portalStatus) (\s@DeletePortalResponse' {} a -> s {portalStatus = a} :: DeletePortalResponse)
+
+instance Prelude.NFData DeletePortalResponse where
+  rnf DeletePortalResponse' {..} =
+    Prelude.rnf httpStatus
+      `Prelude.seq` Prelude.rnf portalStatus
diff --git a/gen/Amazonka/IoTSiteWise/DeleteProject.hs b/gen/Amazonka/IoTSiteWise/DeleteProject.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/IoTSiteWise/DeleteProject.hs
@@ -0,0 +1,166 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.IoTSiteWise.DeleteProject
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Deletes a project from IoT SiteWise Monitor.
+module Amazonka.IoTSiteWise.DeleteProject
+  ( -- * Creating a Request
+    DeleteProject (..),
+    newDeleteProject,
+
+    -- * Request Lenses
+    deleteProject_clientToken,
+    deleteProject_projectId,
+
+    -- * Destructuring the Response
+    DeleteProjectResponse (..),
+    newDeleteProjectResponse,
+
+    -- * Response Lenses
+    deleteProjectResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.IoTSiteWise.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newDeleteProject' smart constructor.
+data DeleteProject = DeleteProject'
+  { -- | A unique case-sensitive identifier that you can provide to ensure the
+    -- idempotency of the request. Don\'t reuse this client token if a new
+    -- idempotent request is required.
+    clientToken :: Prelude.Maybe Prelude.Text,
+    -- | The ID of the project.
+    projectId :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DeleteProject' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'clientToken', 'deleteProject_clientToken' - A unique case-sensitive identifier that you can provide to ensure the
+-- idempotency of the request. Don\'t reuse this client token if a new
+-- idempotent request is required.
+--
+-- 'projectId', 'deleteProject_projectId' - The ID of the project.
+newDeleteProject ::
+  -- | 'projectId'
+  Prelude.Text ->
+  DeleteProject
+newDeleteProject pProjectId_ =
+  DeleteProject'
+    { clientToken = Prelude.Nothing,
+      projectId = pProjectId_
+    }
+
+-- | A unique case-sensitive identifier that you can provide to ensure the
+-- idempotency of the request. Don\'t reuse this client token if a new
+-- idempotent request is required.
+deleteProject_clientToken :: Lens.Lens' DeleteProject (Prelude.Maybe Prelude.Text)
+deleteProject_clientToken = Lens.lens (\DeleteProject' {clientToken} -> clientToken) (\s@DeleteProject' {} a -> s {clientToken = a} :: DeleteProject)
+
+-- | The ID of the project.
+deleteProject_projectId :: Lens.Lens' DeleteProject Prelude.Text
+deleteProject_projectId = Lens.lens (\DeleteProject' {projectId} -> projectId) (\s@DeleteProject' {} a -> s {projectId = a} :: DeleteProject)
+
+instance Core.AWSRequest DeleteProject where
+  type
+    AWSResponse DeleteProject =
+      DeleteProjectResponse
+  request overrides =
+    Request.delete (overrides defaultService)
+  response =
+    Response.receiveEmpty
+      ( \s h x ->
+          DeleteProjectResponse'
+            Prelude.<$> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable DeleteProject where
+  hashWithSalt _salt DeleteProject' {..} =
+    _salt
+      `Prelude.hashWithSalt` clientToken
+      `Prelude.hashWithSalt` projectId
+
+instance Prelude.NFData DeleteProject where
+  rnf DeleteProject' {..} =
+    Prelude.rnf clientToken
+      `Prelude.seq` Prelude.rnf projectId
+
+instance Data.ToHeaders DeleteProject where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToPath DeleteProject where
+  toPath DeleteProject' {..} =
+    Prelude.mconcat ["/projects/", Data.toBS projectId]
+
+instance Data.ToQuery DeleteProject where
+  toQuery DeleteProject' {..} =
+    Prelude.mconcat ["clientToken" Data.=: clientToken]
+
+-- | /See:/ 'newDeleteProjectResponse' smart constructor.
+data DeleteProjectResponse = DeleteProjectResponse'
+  { -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DeleteProjectResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'httpStatus', 'deleteProjectResponse_httpStatus' - The response's http status code.
+newDeleteProjectResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  DeleteProjectResponse
+newDeleteProjectResponse pHttpStatus_ =
+  DeleteProjectResponse' {httpStatus = pHttpStatus_}
+
+-- | The response's http status code.
+deleteProjectResponse_httpStatus :: Lens.Lens' DeleteProjectResponse Prelude.Int
+deleteProjectResponse_httpStatus = Lens.lens (\DeleteProjectResponse' {httpStatus} -> httpStatus) (\s@DeleteProjectResponse' {} a -> s {httpStatus = a} :: DeleteProjectResponse)
+
+instance Prelude.NFData DeleteProjectResponse where
+  rnf DeleteProjectResponse' {..} =
+    Prelude.rnf httpStatus
diff --git a/gen/Amazonka/IoTSiteWise/DeleteTimeSeries.hs b/gen/Amazonka/IoTSiteWise/DeleteTimeSeries.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/IoTSiteWise/DeleteTimeSeries.hs
@@ -0,0 +1,193 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.IoTSiteWise.DeleteTimeSeries
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Deletes a time series (data stream). If you delete a time series that\'s
+-- associated with an asset property, the asset property still exists, but
+-- the time series will no longer be associated with this asset property.
+--
+-- To identify a time series, do one of the following:
+--
+-- -   If the time series isn\'t associated with an asset property, specify
+--     the @alias@ of the time series.
+--
+-- -   If the time series is associated with an asset property, specify one
+--     of the following:
+--
+--     -   The @alias@ of the time series.
+--
+--     -   The @assetId@ and @propertyId@ that identifies the asset
+--         property.
+module Amazonka.IoTSiteWise.DeleteTimeSeries
+  ( -- * Creating a Request
+    DeleteTimeSeries (..),
+    newDeleteTimeSeries,
+
+    -- * Request Lenses
+    deleteTimeSeries_alias,
+    deleteTimeSeries_assetId,
+    deleteTimeSeries_clientToken,
+    deleteTimeSeries_propertyId,
+
+    -- * Destructuring the Response
+    DeleteTimeSeriesResponse (..),
+    newDeleteTimeSeriesResponse,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.IoTSiteWise.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newDeleteTimeSeries' smart constructor.
+data DeleteTimeSeries = DeleteTimeSeries'
+  { -- | The alias that identifies the time series.
+    alias :: Prelude.Maybe Prelude.Text,
+    -- | The ID of the asset in which the asset property was created.
+    assetId :: Prelude.Maybe Prelude.Text,
+    -- | A unique case-sensitive identifier that you can provide to ensure the
+    -- idempotency of the request. Don\'t reuse this client token if a new
+    -- idempotent request is required.
+    clientToken :: Prelude.Maybe Prelude.Text,
+    -- | The ID of the asset property.
+    propertyId :: Prelude.Maybe Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DeleteTimeSeries' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'alias', 'deleteTimeSeries_alias' - The alias that identifies the time series.
+--
+-- 'assetId', 'deleteTimeSeries_assetId' - The ID of the asset in which the asset property was created.
+--
+-- 'clientToken', 'deleteTimeSeries_clientToken' - A unique case-sensitive identifier that you can provide to ensure the
+-- idempotency of the request. Don\'t reuse this client token if a new
+-- idempotent request is required.
+--
+-- 'propertyId', 'deleteTimeSeries_propertyId' - The ID of the asset property.
+newDeleteTimeSeries ::
+  DeleteTimeSeries
+newDeleteTimeSeries =
+  DeleteTimeSeries'
+    { alias = Prelude.Nothing,
+      assetId = Prelude.Nothing,
+      clientToken = Prelude.Nothing,
+      propertyId = Prelude.Nothing
+    }
+
+-- | The alias that identifies the time series.
+deleteTimeSeries_alias :: Lens.Lens' DeleteTimeSeries (Prelude.Maybe Prelude.Text)
+deleteTimeSeries_alias = Lens.lens (\DeleteTimeSeries' {alias} -> alias) (\s@DeleteTimeSeries' {} a -> s {alias = a} :: DeleteTimeSeries)
+
+-- | The ID of the asset in which the asset property was created.
+deleteTimeSeries_assetId :: Lens.Lens' DeleteTimeSeries (Prelude.Maybe Prelude.Text)
+deleteTimeSeries_assetId = Lens.lens (\DeleteTimeSeries' {assetId} -> assetId) (\s@DeleteTimeSeries' {} a -> s {assetId = a} :: DeleteTimeSeries)
+
+-- | A unique case-sensitive identifier that you can provide to ensure the
+-- idempotency of the request. Don\'t reuse this client token if a new
+-- idempotent request is required.
+deleteTimeSeries_clientToken :: Lens.Lens' DeleteTimeSeries (Prelude.Maybe Prelude.Text)
+deleteTimeSeries_clientToken = Lens.lens (\DeleteTimeSeries' {clientToken} -> clientToken) (\s@DeleteTimeSeries' {} a -> s {clientToken = a} :: DeleteTimeSeries)
+
+-- | The ID of the asset property.
+deleteTimeSeries_propertyId :: Lens.Lens' DeleteTimeSeries (Prelude.Maybe Prelude.Text)
+deleteTimeSeries_propertyId = Lens.lens (\DeleteTimeSeries' {propertyId} -> propertyId) (\s@DeleteTimeSeries' {} a -> s {propertyId = a} :: DeleteTimeSeries)
+
+instance Core.AWSRequest DeleteTimeSeries where
+  type
+    AWSResponse DeleteTimeSeries =
+      DeleteTimeSeriesResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveNull DeleteTimeSeriesResponse'
+
+instance Prelude.Hashable DeleteTimeSeries where
+  hashWithSalt _salt DeleteTimeSeries' {..} =
+    _salt
+      `Prelude.hashWithSalt` alias
+      `Prelude.hashWithSalt` assetId
+      `Prelude.hashWithSalt` clientToken
+      `Prelude.hashWithSalt` propertyId
+
+instance Prelude.NFData DeleteTimeSeries where
+  rnf DeleteTimeSeries' {..} =
+    Prelude.rnf alias
+      `Prelude.seq` Prelude.rnf assetId
+      `Prelude.seq` Prelude.rnf clientToken
+      `Prelude.seq` Prelude.rnf propertyId
+
+instance Data.ToHeaders DeleteTimeSeries where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON DeleteTimeSeries where
+  toJSON DeleteTimeSeries' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [("clientToken" Data..=) Prelude.<$> clientToken]
+      )
+
+instance Data.ToPath DeleteTimeSeries where
+  toPath = Prelude.const "/timeseries/delete/"
+
+instance Data.ToQuery DeleteTimeSeries where
+  toQuery DeleteTimeSeries' {..} =
+    Prelude.mconcat
+      [ "alias" Data.=: alias,
+        "assetId" Data.=: assetId,
+        "propertyId" Data.=: propertyId
+      ]
+
+-- | /See:/ 'newDeleteTimeSeriesResponse' smart constructor.
+data DeleteTimeSeriesResponse = DeleteTimeSeriesResponse'
+  {
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DeleteTimeSeriesResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+newDeleteTimeSeriesResponse ::
+  DeleteTimeSeriesResponse
+newDeleteTimeSeriesResponse =
+  DeleteTimeSeriesResponse'
+
+instance Prelude.NFData DeleteTimeSeriesResponse where
+  rnf _ = ()
diff --git a/gen/Amazonka/IoTSiteWise/DescribeAccessPolicy.hs b/gen/Amazonka/IoTSiteWise/DescribeAccessPolicy.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/IoTSiteWise/DescribeAccessPolicy.hs
@@ -0,0 +1,284 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.IoTSiteWise.DescribeAccessPolicy
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Describes an access policy, which specifies an identity\'s access to an
+-- IoT SiteWise Monitor portal or project.
+module Amazonka.IoTSiteWise.DescribeAccessPolicy
+  ( -- * Creating a Request
+    DescribeAccessPolicy (..),
+    newDescribeAccessPolicy,
+
+    -- * Request Lenses
+    describeAccessPolicy_accessPolicyId,
+
+    -- * Destructuring the Response
+    DescribeAccessPolicyResponse (..),
+    newDescribeAccessPolicyResponse,
+
+    -- * Response Lenses
+    describeAccessPolicyResponse_httpStatus,
+    describeAccessPolicyResponse_accessPolicyId,
+    describeAccessPolicyResponse_accessPolicyArn,
+    describeAccessPolicyResponse_accessPolicyIdentity,
+    describeAccessPolicyResponse_accessPolicyResource,
+    describeAccessPolicyResponse_accessPolicyPermission,
+    describeAccessPolicyResponse_accessPolicyCreationDate,
+    describeAccessPolicyResponse_accessPolicyLastUpdateDate,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.IoTSiteWise.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newDescribeAccessPolicy' smart constructor.
+data DescribeAccessPolicy = DescribeAccessPolicy'
+  { -- | The ID of the access policy.
+    accessPolicyId :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DescribeAccessPolicy' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'accessPolicyId', 'describeAccessPolicy_accessPolicyId' - The ID of the access policy.
+newDescribeAccessPolicy ::
+  -- | 'accessPolicyId'
+  Prelude.Text ->
+  DescribeAccessPolicy
+newDescribeAccessPolicy pAccessPolicyId_ =
+  DescribeAccessPolicy'
+    { accessPolicyId =
+        pAccessPolicyId_
+    }
+
+-- | The ID of the access policy.
+describeAccessPolicy_accessPolicyId :: Lens.Lens' DescribeAccessPolicy Prelude.Text
+describeAccessPolicy_accessPolicyId = Lens.lens (\DescribeAccessPolicy' {accessPolicyId} -> accessPolicyId) (\s@DescribeAccessPolicy' {} a -> s {accessPolicyId = a} :: DescribeAccessPolicy)
+
+instance Core.AWSRequest DescribeAccessPolicy where
+  type
+    AWSResponse DescribeAccessPolicy =
+      DescribeAccessPolicyResponse
+  request overrides =
+    Request.get (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          DescribeAccessPolicyResponse'
+            Prelude.<$> (Prelude.pure (Prelude.fromEnum s))
+            Prelude.<*> (x Data..:> "accessPolicyId")
+            Prelude.<*> (x Data..:> "accessPolicyArn")
+            Prelude.<*> (x Data..:> "accessPolicyIdentity")
+            Prelude.<*> (x Data..:> "accessPolicyResource")
+            Prelude.<*> (x Data..:> "accessPolicyPermission")
+            Prelude.<*> (x Data..:> "accessPolicyCreationDate")
+            Prelude.<*> (x Data..:> "accessPolicyLastUpdateDate")
+      )
+
+instance Prelude.Hashable DescribeAccessPolicy where
+  hashWithSalt _salt DescribeAccessPolicy' {..} =
+    _salt `Prelude.hashWithSalt` accessPolicyId
+
+instance Prelude.NFData DescribeAccessPolicy where
+  rnf DescribeAccessPolicy' {..} =
+    Prelude.rnf accessPolicyId
+
+instance Data.ToHeaders DescribeAccessPolicy where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToPath DescribeAccessPolicy where
+  toPath DescribeAccessPolicy' {..} =
+    Prelude.mconcat
+      ["/access-policies/", Data.toBS accessPolicyId]
+
+instance Data.ToQuery DescribeAccessPolicy where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newDescribeAccessPolicyResponse' smart constructor.
+data DescribeAccessPolicyResponse = DescribeAccessPolicyResponse'
+  { -- | The response's http status code.
+    httpStatus :: Prelude.Int,
+    -- | The ID of the access policy.
+    accessPolicyId :: Prelude.Text,
+    -- | The
+    -- <https://docs.aws.amazon.com/general/latest/gr/aws-arns-and-namespaces.html ARN>
+    -- of the access policy, which has the following format.
+    --
+    -- @arn:${Partition}:iotsitewise:${Region}:${Account}:access-policy\/${AccessPolicyId}@
+    accessPolicyArn :: Prelude.Text,
+    -- | The identity (IAM Identity Center user, IAM Identity Center group, or
+    -- IAM user) to which this access policy applies.
+    accessPolicyIdentity :: Identity,
+    -- | The IoT SiteWise Monitor resource (portal or project) to which this
+    -- access policy provides access.
+    accessPolicyResource :: Resource,
+    -- | The access policy permission. Note that a project @ADMINISTRATOR@ is
+    -- also known as a project owner.
+    accessPolicyPermission :: Permission,
+    -- | The date the access policy was created, in Unix epoch time.
+    accessPolicyCreationDate :: Data.POSIX,
+    -- | The date the access policy was last updated, in Unix epoch time.
+    accessPolicyLastUpdateDate :: Data.POSIX
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DescribeAccessPolicyResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'httpStatus', 'describeAccessPolicyResponse_httpStatus' - The response's http status code.
+--
+-- 'accessPolicyId', 'describeAccessPolicyResponse_accessPolicyId' - The ID of the access policy.
+--
+-- 'accessPolicyArn', 'describeAccessPolicyResponse_accessPolicyArn' - The
+-- <https://docs.aws.amazon.com/general/latest/gr/aws-arns-and-namespaces.html ARN>
+-- of the access policy, which has the following format.
+--
+-- @arn:${Partition}:iotsitewise:${Region}:${Account}:access-policy\/${AccessPolicyId}@
+--
+-- 'accessPolicyIdentity', 'describeAccessPolicyResponse_accessPolicyIdentity' - The identity (IAM Identity Center user, IAM Identity Center group, or
+-- IAM user) to which this access policy applies.
+--
+-- 'accessPolicyResource', 'describeAccessPolicyResponse_accessPolicyResource' - The IoT SiteWise Monitor resource (portal or project) to which this
+-- access policy provides access.
+--
+-- 'accessPolicyPermission', 'describeAccessPolicyResponse_accessPolicyPermission' - The access policy permission. Note that a project @ADMINISTRATOR@ is
+-- also known as a project owner.
+--
+-- 'accessPolicyCreationDate', 'describeAccessPolicyResponse_accessPolicyCreationDate' - The date the access policy was created, in Unix epoch time.
+--
+-- 'accessPolicyLastUpdateDate', 'describeAccessPolicyResponse_accessPolicyLastUpdateDate' - The date the access policy was last updated, in Unix epoch time.
+newDescribeAccessPolicyResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  -- | 'accessPolicyId'
+  Prelude.Text ->
+  -- | 'accessPolicyArn'
+  Prelude.Text ->
+  -- | 'accessPolicyIdentity'
+  Identity ->
+  -- | 'accessPolicyResource'
+  Resource ->
+  -- | 'accessPolicyPermission'
+  Permission ->
+  -- | 'accessPolicyCreationDate'
+  Prelude.UTCTime ->
+  -- | 'accessPolicyLastUpdateDate'
+  Prelude.UTCTime ->
+  DescribeAccessPolicyResponse
+newDescribeAccessPolicyResponse
+  pHttpStatus_
+  pAccessPolicyId_
+  pAccessPolicyArn_
+  pAccessPolicyIdentity_
+  pAccessPolicyResource_
+  pAccessPolicyPermission_
+  pAccessPolicyCreationDate_
+  pAccessPolicyLastUpdateDate_ =
+    DescribeAccessPolicyResponse'
+      { httpStatus =
+          pHttpStatus_,
+        accessPolicyId = pAccessPolicyId_,
+        accessPolicyArn = pAccessPolicyArn_,
+        accessPolicyIdentity = pAccessPolicyIdentity_,
+        accessPolicyResource = pAccessPolicyResource_,
+        accessPolicyPermission =
+          pAccessPolicyPermission_,
+        accessPolicyCreationDate =
+          Data._Time
+            Lens.# pAccessPolicyCreationDate_,
+        accessPolicyLastUpdateDate =
+          Data._Time
+            Lens.# pAccessPolicyLastUpdateDate_
+      }
+
+-- | The response's http status code.
+describeAccessPolicyResponse_httpStatus :: Lens.Lens' DescribeAccessPolicyResponse Prelude.Int
+describeAccessPolicyResponse_httpStatus = Lens.lens (\DescribeAccessPolicyResponse' {httpStatus} -> httpStatus) (\s@DescribeAccessPolicyResponse' {} a -> s {httpStatus = a} :: DescribeAccessPolicyResponse)
+
+-- | The ID of the access policy.
+describeAccessPolicyResponse_accessPolicyId :: Lens.Lens' DescribeAccessPolicyResponse Prelude.Text
+describeAccessPolicyResponse_accessPolicyId = Lens.lens (\DescribeAccessPolicyResponse' {accessPolicyId} -> accessPolicyId) (\s@DescribeAccessPolicyResponse' {} a -> s {accessPolicyId = a} :: DescribeAccessPolicyResponse)
+
+-- | The
+-- <https://docs.aws.amazon.com/general/latest/gr/aws-arns-and-namespaces.html ARN>
+-- of the access policy, which has the following format.
+--
+-- @arn:${Partition}:iotsitewise:${Region}:${Account}:access-policy\/${AccessPolicyId}@
+describeAccessPolicyResponse_accessPolicyArn :: Lens.Lens' DescribeAccessPolicyResponse Prelude.Text
+describeAccessPolicyResponse_accessPolicyArn = Lens.lens (\DescribeAccessPolicyResponse' {accessPolicyArn} -> accessPolicyArn) (\s@DescribeAccessPolicyResponse' {} a -> s {accessPolicyArn = a} :: DescribeAccessPolicyResponse)
+
+-- | The identity (IAM Identity Center user, IAM Identity Center group, or
+-- IAM user) to which this access policy applies.
+describeAccessPolicyResponse_accessPolicyIdentity :: Lens.Lens' DescribeAccessPolicyResponse Identity
+describeAccessPolicyResponse_accessPolicyIdentity = Lens.lens (\DescribeAccessPolicyResponse' {accessPolicyIdentity} -> accessPolicyIdentity) (\s@DescribeAccessPolicyResponse' {} a -> s {accessPolicyIdentity = a} :: DescribeAccessPolicyResponse)
+
+-- | The IoT SiteWise Monitor resource (portal or project) to which this
+-- access policy provides access.
+describeAccessPolicyResponse_accessPolicyResource :: Lens.Lens' DescribeAccessPolicyResponse Resource
+describeAccessPolicyResponse_accessPolicyResource = Lens.lens (\DescribeAccessPolicyResponse' {accessPolicyResource} -> accessPolicyResource) (\s@DescribeAccessPolicyResponse' {} a -> s {accessPolicyResource = a} :: DescribeAccessPolicyResponse)
+
+-- | The access policy permission. Note that a project @ADMINISTRATOR@ is
+-- also known as a project owner.
+describeAccessPolicyResponse_accessPolicyPermission :: Lens.Lens' DescribeAccessPolicyResponse Permission
+describeAccessPolicyResponse_accessPolicyPermission = Lens.lens (\DescribeAccessPolicyResponse' {accessPolicyPermission} -> accessPolicyPermission) (\s@DescribeAccessPolicyResponse' {} a -> s {accessPolicyPermission = a} :: DescribeAccessPolicyResponse)
+
+-- | The date the access policy was created, in Unix epoch time.
+describeAccessPolicyResponse_accessPolicyCreationDate :: Lens.Lens' DescribeAccessPolicyResponse Prelude.UTCTime
+describeAccessPolicyResponse_accessPolicyCreationDate = Lens.lens (\DescribeAccessPolicyResponse' {accessPolicyCreationDate} -> accessPolicyCreationDate) (\s@DescribeAccessPolicyResponse' {} a -> s {accessPolicyCreationDate = a} :: DescribeAccessPolicyResponse) Prelude.. Data._Time
+
+-- | The date the access policy was last updated, in Unix epoch time.
+describeAccessPolicyResponse_accessPolicyLastUpdateDate :: Lens.Lens' DescribeAccessPolicyResponse Prelude.UTCTime
+describeAccessPolicyResponse_accessPolicyLastUpdateDate = Lens.lens (\DescribeAccessPolicyResponse' {accessPolicyLastUpdateDate} -> accessPolicyLastUpdateDate) (\s@DescribeAccessPolicyResponse' {} a -> s {accessPolicyLastUpdateDate = a} :: DescribeAccessPolicyResponse) Prelude.. Data._Time
+
+instance Prelude.NFData DescribeAccessPolicyResponse where
+  rnf DescribeAccessPolicyResponse' {..} =
+    Prelude.rnf httpStatus
+      `Prelude.seq` Prelude.rnf accessPolicyId
+      `Prelude.seq` Prelude.rnf accessPolicyArn
+      `Prelude.seq` Prelude.rnf accessPolicyIdentity
+      `Prelude.seq` Prelude.rnf accessPolicyResource
+      `Prelude.seq` Prelude.rnf accessPolicyPermission
+      `Prelude.seq` Prelude.rnf accessPolicyCreationDate
+      `Prelude.seq` Prelude.rnf accessPolicyLastUpdateDate
diff --git a/gen/Amazonka/IoTSiteWise/DescribeAsset.hs b/gen/Amazonka/IoTSiteWise/DescribeAsset.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/IoTSiteWise/DescribeAsset.hs
@@ -0,0 +1,359 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.IoTSiteWise.DescribeAsset
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Retrieves information about an asset.
+module Amazonka.IoTSiteWise.DescribeAsset
+  ( -- * Creating a Request
+    DescribeAsset (..),
+    newDescribeAsset,
+
+    -- * Request Lenses
+    describeAsset_excludeProperties,
+    describeAsset_assetId,
+
+    -- * Destructuring the Response
+    DescribeAssetResponse (..),
+    newDescribeAssetResponse,
+
+    -- * Response Lenses
+    describeAssetResponse_assetCompositeModels,
+    describeAssetResponse_assetDescription,
+    describeAssetResponse_httpStatus,
+    describeAssetResponse_assetId,
+    describeAssetResponse_assetArn,
+    describeAssetResponse_assetName,
+    describeAssetResponse_assetModelId,
+    describeAssetResponse_assetProperties,
+    describeAssetResponse_assetHierarchies,
+    describeAssetResponse_assetCreationDate,
+    describeAssetResponse_assetLastUpdateDate,
+    describeAssetResponse_assetStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.IoTSiteWise.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newDescribeAsset' smart constructor.
+data DescribeAsset = DescribeAsset'
+  { -- | Whether or not to exclude asset properties from the response.
+    excludeProperties :: Prelude.Maybe Prelude.Bool,
+    -- | The ID of the asset.
+    assetId :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DescribeAsset' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'excludeProperties', 'describeAsset_excludeProperties' - Whether or not to exclude asset properties from the response.
+--
+-- 'assetId', 'describeAsset_assetId' - The ID of the asset.
+newDescribeAsset ::
+  -- | 'assetId'
+  Prelude.Text ->
+  DescribeAsset
+newDescribeAsset pAssetId_ =
+  DescribeAsset'
+    { excludeProperties = Prelude.Nothing,
+      assetId = pAssetId_
+    }
+
+-- | Whether or not to exclude asset properties from the response.
+describeAsset_excludeProperties :: Lens.Lens' DescribeAsset (Prelude.Maybe Prelude.Bool)
+describeAsset_excludeProperties = Lens.lens (\DescribeAsset' {excludeProperties} -> excludeProperties) (\s@DescribeAsset' {} a -> s {excludeProperties = a} :: DescribeAsset)
+
+-- | The ID of the asset.
+describeAsset_assetId :: Lens.Lens' DescribeAsset Prelude.Text
+describeAsset_assetId = Lens.lens (\DescribeAsset' {assetId} -> assetId) (\s@DescribeAsset' {} a -> s {assetId = a} :: DescribeAsset)
+
+instance Core.AWSRequest DescribeAsset where
+  type
+    AWSResponse DescribeAsset =
+      DescribeAssetResponse
+  request overrides =
+    Request.get (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          DescribeAssetResponse'
+            Prelude.<$> ( x
+                            Data..?> "assetCompositeModels"
+                            Core..!@ Prelude.mempty
+                        )
+            Prelude.<*> (x Data..?> "assetDescription")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+            Prelude.<*> (x Data..:> "assetId")
+            Prelude.<*> (x Data..:> "assetArn")
+            Prelude.<*> (x Data..:> "assetName")
+            Prelude.<*> (x Data..:> "assetModelId")
+            Prelude.<*> ( x
+                            Data..?> "assetProperties"
+                            Core..!@ Prelude.mempty
+                        )
+            Prelude.<*> ( x
+                            Data..?> "assetHierarchies"
+                            Core..!@ Prelude.mempty
+                        )
+            Prelude.<*> (x Data..:> "assetCreationDate")
+            Prelude.<*> (x Data..:> "assetLastUpdateDate")
+            Prelude.<*> (x Data..:> "assetStatus")
+      )
+
+instance Prelude.Hashable DescribeAsset where
+  hashWithSalt _salt DescribeAsset' {..} =
+    _salt
+      `Prelude.hashWithSalt` excludeProperties
+      `Prelude.hashWithSalt` assetId
+
+instance Prelude.NFData DescribeAsset where
+  rnf DescribeAsset' {..} =
+    Prelude.rnf excludeProperties
+      `Prelude.seq` Prelude.rnf assetId
+
+instance Data.ToHeaders DescribeAsset where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToPath DescribeAsset where
+  toPath DescribeAsset' {..} =
+    Prelude.mconcat ["/assets/", Data.toBS assetId]
+
+instance Data.ToQuery DescribeAsset where
+  toQuery DescribeAsset' {..} =
+    Prelude.mconcat
+      ["excludeProperties" Data.=: excludeProperties]
+
+-- | /See:/ 'newDescribeAssetResponse' smart constructor.
+data DescribeAssetResponse = DescribeAssetResponse'
+  { -- | The composite models for the asset.
+    assetCompositeModels :: Prelude.Maybe [AssetCompositeModel],
+    -- | A description for the asset.
+    assetDescription :: Prelude.Maybe Prelude.Text,
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int,
+    -- | The ID of the asset.
+    assetId :: Prelude.Text,
+    -- | The
+    -- <https://docs.aws.amazon.com/general/latest/gr/aws-arns-and-namespaces.html ARN>
+    -- of the asset, which has the following format.
+    --
+    -- @arn:${Partition}:iotsitewise:${Region}:${Account}:asset\/${AssetId}@
+    assetArn :: Prelude.Text,
+    -- | The name of the asset.
+    assetName :: Prelude.Text,
+    -- | The ID of the asset model that was used to create the asset.
+    assetModelId :: Prelude.Text,
+    -- | The list of asset properties for the asset.
+    --
+    -- This object doesn\'t include properties that you define in composite
+    -- models. You can find composite model properties in the
+    -- @assetCompositeModels@ object.
+    assetProperties :: [AssetProperty],
+    -- | A list of asset hierarchies that each contain a @hierarchyId@. A
+    -- hierarchy specifies allowed parent\/child asset relationships.
+    assetHierarchies :: [AssetHierarchy],
+    -- | The date the asset was created, in Unix epoch time.
+    assetCreationDate :: Data.POSIX,
+    -- | The date the asset was last updated, in Unix epoch time.
+    assetLastUpdateDate :: Data.POSIX,
+    -- | The current status of the asset, which contains a state and any error
+    -- message.
+    assetStatus :: AssetStatus
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DescribeAssetResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'assetCompositeModels', 'describeAssetResponse_assetCompositeModels' - The composite models for the asset.
+--
+-- 'assetDescription', 'describeAssetResponse_assetDescription' - A description for the asset.
+--
+-- 'httpStatus', 'describeAssetResponse_httpStatus' - The response's http status code.
+--
+-- 'assetId', 'describeAssetResponse_assetId' - The ID of the asset.
+--
+-- 'assetArn', 'describeAssetResponse_assetArn' - The
+-- <https://docs.aws.amazon.com/general/latest/gr/aws-arns-and-namespaces.html ARN>
+-- of the asset, which has the following format.
+--
+-- @arn:${Partition}:iotsitewise:${Region}:${Account}:asset\/${AssetId}@
+--
+-- 'assetName', 'describeAssetResponse_assetName' - The name of the asset.
+--
+-- 'assetModelId', 'describeAssetResponse_assetModelId' - The ID of the asset model that was used to create the asset.
+--
+-- 'assetProperties', 'describeAssetResponse_assetProperties' - The list of asset properties for the asset.
+--
+-- This object doesn\'t include properties that you define in composite
+-- models. You can find composite model properties in the
+-- @assetCompositeModels@ object.
+--
+-- 'assetHierarchies', 'describeAssetResponse_assetHierarchies' - A list of asset hierarchies that each contain a @hierarchyId@. A
+-- hierarchy specifies allowed parent\/child asset relationships.
+--
+-- 'assetCreationDate', 'describeAssetResponse_assetCreationDate' - The date the asset was created, in Unix epoch time.
+--
+-- 'assetLastUpdateDate', 'describeAssetResponse_assetLastUpdateDate' - The date the asset was last updated, in Unix epoch time.
+--
+-- 'assetStatus', 'describeAssetResponse_assetStatus' - The current status of the asset, which contains a state and any error
+-- message.
+newDescribeAssetResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  -- | 'assetId'
+  Prelude.Text ->
+  -- | 'assetArn'
+  Prelude.Text ->
+  -- | 'assetName'
+  Prelude.Text ->
+  -- | 'assetModelId'
+  Prelude.Text ->
+  -- | 'assetCreationDate'
+  Prelude.UTCTime ->
+  -- | 'assetLastUpdateDate'
+  Prelude.UTCTime ->
+  -- | 'assetStatus'
+  AssetStatus ->
+  DescribeAssetResponse
+newDescribeAssetResponse
+  pHttpStatus_
+  pAssetId_
+  pAssetArn_
+  pAssetName_
+  pAssetModelId_
+  pAssetCreationDate_
+  pAssetLastUpdateDate_
+  pAssetStatus_ =
+    DescribeAssetResponse'
+      { assetCompositeModels =
+          Prelude.Nothing,
+        assetDescription = Prelude.Nothing,
+        httpStatus = pHttpStatus_,
+        assetId = pAssetId_,
+        assetArn = pAssetArn_,
+        assetName = pAssetName_,
+        assetModelId = pAssetModelId_,
+        assetProperties = Prelude.mempty,
+        assetHierarchies = Prelude.mempty,
+        assetCreationDate =
+          Data._Time Lens.# pAssetCreationDate_,
+        assetLastUpdateDate =
+          Data._Time Lens.# pAssetLastUpdateDate_,
+        assetStatus = pAssetStatus_
+      }
+
+-- | The composite models for the asset.
+describeAssetResponse_assetCompositeModels :: Lens.Lens' DescribeAssetResponse (Prelude.Maybe [AssetCompositeModel])
+describeAssetResponse_assetCompositeModels = Lens.lens (\DescribeAssetResponse' {assetCompositeModels} -> assetCompositeModels) (\s@DescribeAssetResponse' {} a -> s {assetCompositeModels = a} :: DescribeAssetResponse) Prelude.. Lens.mapping Lens.coerced
+
+-- | A description for the asset.
+describeAssetResponse_assetDescription :: Lens.Lens' DescribeAssetResponse (Prelude.Maybe Prelude.Text)
+describeAssetResponse_assetDescription = Lens.lens (\DescribeAssetResponse' {assetDescription} -> assetDescription) (\s@DescribeAssetResponse' {} a -> s {assetDescription = a} :: DescribeAssetResponse)
+
+-- | The response's http status code.
+describeAssetResponse_httpStatus :: Lens.Lens' DescribeAssetResponse Prelude.Int
+describeAssetResponse_httpStatus = Lens.lens (\DescribeAssetResponse' {httpStatus} -> httpStatus) (\s@DescribeAssetResponse' {} a -> s {httpStatus = a} :: DescribeAssetResponse)
+
+-- | The ID of the asset.
+describeAssetResponse_assetId :: Lens.Lens' DescribeAssetResponse Prelude.Text
+describeAssetResponse_assetId = Lens.lens (\DescribeAssetResponse' {assetId} -> assetId) (\s@DescribeAssetResponse' {} a -> s {assetId = a} :: DescribeAssetResponse)
+
+-- | The
+-- <https://docs.aws.amazon.com/general/latest/gr/aws-arns-and-namespaces.html ARN>
+-- of the asset, which has the following format.
+--
+-- @arn:${Partition}:iotsitewise:${Region}:${Account}:asset\/${AssetId}@
+describeAssetResponse_assetArn :: Lens.Lens' DescribeAssetResponse Prelude.Text
+describeAssetResponse_assetArn = Lens.lens (\DescribeAssetResponse' {assetArn} -> assetArn) (\s@DescribeAssetResponse' {} a -> s {assetArn = a} :: DescribeAssetResponse)
+
+-- | The name of the asset.
+describeAssetResponse_assetName :: Lens.Lens' DescribeAssetResponse Prelude.Text
+describeAssetResponse_assetName = Lens.lens (\DescribeAssetResponse' {assetName} -> assetName) (\s@DescribeAssetResponse' {} a -> s {assetName = a} :: DescribeAssetResponse)
+
+-- | The ID of the asset model that was used to create the asset.
+describeAssetResponse_assetModelId :: Lens.Lens' DescribeAssetResponse Prelude.Text
+describeAssetResponse_assetModelId = Lens.lens (\DescribeAssetResponse' {assetModelId} -> assetModelId) (\s@DescribeAssetResponse' {} a -> s {assetModelId = a} :: DescribeAssetResponse)
+
+-- | The list of asset properties for the asset.
+--
+-- This object doesn\'t include properties that you define in composite
+-- models. You can find composite model properties in the
+-- @assetCompositeModels@ object.
+describeAssetResponse_assetProperties :: Lens.Lens' DescribeAssetResponse [AssetProperty]
+describeAssetResponse_assetProperties = Lens.lens (\DescribeAssetResponse' {assetProperties} -> assetProperties) (\s@DescribeAssetResponse' {} a -> s {assetProperties = a} :: DescribeAssetResponse) Prelude.. Lens.coerced
+
+-- | A list of asset hierarchies that each contain a @hierarchyId@. A
+-- hierarchy specifies allowed parent\/child asset relationships.
+describeAssetResponse_assetHierarchies :: Lens.Lens' DescribeAssetResponse [AssetHierarchy]
+describeAssetResponse_assetHierarchies = Lens.lens (\DescribeAssetResponse' {assetHierarchies} -> assetHierarchies) (\s@DescribeAssetResponse' {} a -> s {assetHierarchies = a} :: DescribeAssetResponse) Prelude.. Lens.coerced
+
+-- | The date the asset was created, in Unix epoch time.
+describeAssetResponse_assetCreationDate :: Lens.Lens' DescribeAssetResponse Prelude.UTCTime
+describeAssetResponse_assetCreationDate = Lens.lens (\DescribeAssetResponse' {assetCreationDate} -> assetCreationDate) (\s@DescribeAssetResponse' {} a -> s {assetCreationDate = a} :: DescribeAssetResponse) Prelude.. Data._Time
+
+-- | The date the asset was last updated, in Unix epoch time.
+describeAssetResponse_assetLastUpdateDate :: Lens.Lens' DescribeAssetResponse Prelude.UTCTime
+describeAssetResponse_assetLastUpdateDate = Lens.lens (\DescribeAssetResponse' {assetLastUpdateDate} -> assetLastUpdateDate) (\s@DescribeAssetResponse' {} a -> s {assetLastUpdateDate = a} :: DescribeAssetResponse) Prelude.. Data._Time
+
+-- | The current status of the asset, which contains a state and any error
+-- message.
+describeAssetResponse_assetStatus :: Lens.Lens' DescribeAssetResponse AssetStatus
+describeAssetResponse_assetStatus = Lens.lens (\DescribeAssetResponse' {assetStatus} -> assetStatus) (\s@DescribeAssetResponse' {} a -> s {assetStatus = a} :: DescribeAssetResponse)
+
+instance Prelude.NFData DescribeAssetResponse where
+  rnf DescribeAssetResponse' {..} =
+    Prelude.rnf assetCompositeModels
+      `Prelude.seq` Prelude.rnf assetDescription
+      `Prelude.seq` Prelude.rnf httpStatus
+      `Prelude.seq` Prelude.rnf assetId
+      `Prelude.seq` Prelude.rnf assetArn
+      `Prelude.seq` Prelude.rnf assetName
+      `Prelude.seq` Prelude.rnf assetModelId
+      `Prelude.seq` Prelude.rnf assetProperties
+      `Prelude.seq` Prelude.rnf assetHierarchies
+      `Prelude.seq` Prelude.rnf assetCreationDate
+      `Prelude.seq` Prelude.rnf assetLastUpdateDate
+      `Prelude.seq` Prelude.rnf assetStatus
diff --git a/gen/Amazonka/IoTSiteWise/DescribeAssetModel.hs b/gen/Amazonka/IoTSiteWise/DescribeAssetModel.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/IoTSiteWise/DescribeAssetModel.hs
@@ -0,0 +1,352 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.IoTSiteWise.DescribeAssetModel
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Retrieves information about an asset model.
+module Amazonka.IoTSiteWise.DescribeAssetModel
+  ( -- * Creating a Request
+    DescribeAssetModel (..),
+    newDescribeAssetModel,
+
+    -- * Request Lenses
+    describeAssetModel_excludeProperties,
+    describeAssetModel_assetModelId,
+
+    -- * Destructuring the Response
+    DescribeAssetModelResponse (..),
+    newDescribeAssetModelResponse,
+
+    -- * Response Lenses
+    describeAssetModelResponse_assetModelCompositeModels,
+    describeAssetModelResponse_httpStatus,
+    describeAssetModelResponse_assetModelId,
+    describeAssetModelResponse_assetModelArn,
+    describeAssetModelResponse_assetModelName,
+    describeAssetModelResponse_assetModelDescription,
+    describeAssetModelResponse_assetModelProperties,
+    describeAssetModelResponse_assetModelHierarchies,
+    describeAssetModelResponse_assetModelCreationDate,
+    describeAssetModelResponse_assetModelLastUpdateDate,
+    describeAssetModelResponse_assetModelStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.IoTSiteWise.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newDescribeAssetModel' smart constructor.
+data DescribeAssetModel = DescribeAssetModel'
+  { -- | Whether or not to exclude asset model properties from the response.
+    excludeProperties :: Prelude.Maybe Prelude.Bool,
+    -- | The ID of the asset model.
+    assetModelId :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DescribeAssetModel' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'excludeProperties', 'describeAssetModel_excludeProperties' - Whether or not to exclude asset model properties from the response.
+--
+-- 'assetModelId', 'describeAssetModel_assetModelId' - The ID of the asset model.
+newDescribeAssetModel ::
+  -- | 'assetModelId'
+  Prelude.Text ->
+  DescribeAssetModel
+newDescribeAssetModel pAssetModelId_ =
+  DescribeAssetModel'
+    { excludeProperties =
+        Prelude.Nothing,
+      assetModelId = pAssetModelId_
+    }
+
+-- | Whether or not to exclude asset model properties from the response.
+describeAssetModel_excludeProperties :: Lens.Lens' DescribeAssetModel (Prelude.Maybe Prelude.Bool)
+describeAssetModel_excludeProperties = Lens.lens (\DescribeAssetModel' {excludeProperties} -> excludeProperties) (\s@DescribeAssetModel' {} a -> s {excludeProperties = a} :: DescribeAssetModel)
+
+-- | The ID of the asset model.
+describeAssetModel_assetModelId :: Lens.Lens' DescribeAssetModel Prelude.Text
+describeAssetModel_assetModelId = Lens.lens (\DescribeAssetModel' {assetModelId} -> assetModelId) (\s@DescribeAssetModel' {} a -> s {assetModelId = a} :: DescribeAssetModel)
+
+instance Core.AWSRequest DescribeAssetModel where
+  type
+    AWSResponse DescribeAssetModel =
+      DescribeAssetModelResponse
+  request overrides =
+    Request.get (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          DescribeAssetModelResponse'
+            Prelude.<$> ( x
+                            Data..?> "assetModelCompositeModels"
+                            Core..!@ Prelude.mempty
+                        )
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+            Prelude.<*> (x Data..:> "assetModelId")
+            Prelude.<*> (x Data..:> "assetModelArn")
+            Prelude.<*> (x Data..:> "assetModelName")
+            Prelude.<*> (x Data..:> "assetModelDescription")
+            Prelude.<*> ( x
+                            Data..?> "assetModelProperties"
+                            Core..!@ Prelude.mempty
+                        )
+            Prelude.<*> ( x
+                            Data..?> "assetModelHierarchies"
+                            Core..!@ Prelude.mempty
+                        )
+            Prelude.<*> (x Data..:> "assetModelCreationDate")
+            Prelude.<*> (x Data..:> "assetModelLastUpdateDate")
+            Prelude.<*> (x Data..:> "assetModelStatus")
+      )
+
+instance Prelude.Hashable DescribeAssetModel where
+  hashWithSalt _salt DescribeAssetModel' {..} =
+    _salt
+      `Prelude.hashWithSalt` excludeProperties
+      `Prelude.hashWithSalt` assetModelId
+
+instance Prelude.NFData DescribeAssetModel where
+  rnf DescribeAssetModel' {..} =
+    Prelude.rnf excludeProperties
+      `Prelude.seq` Prelude.rnf assetModelId
+
+instance Data.ToHeaders DescribeAssetModel where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToPath DescribeAssetModel where
+  toPath DescribeAssetModel' {..} =
+    Prelude.mconcat
+      ["/asset-models/", Data.toBS assetModelId]
+
+instance Data.ToQuery DescribeAssetModel where
+  toQuery DescribeAssetModel' {..} =
+    Prelude.mconcat
+      ["excludeProperties" Data.=: excludeProperties]
+
+-- | /See:/ 'newDescribeAssetModelResponse' smart constructor.
+data DescribeAssetModelResponse = DescribeAssetModelResponse'
+  { -- | The list of composite asset models for the asset model.
+    assetModelCompositeModels :: Prelude.Maybe [AssetModelCompositeModel],
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int,
+    -- | The ID of the asset model.
+    assetModelId :: Prelude.Text,
+    -- | The
+    -- <https://docs.aws.amazon.com/general/latest/gr/aws-arns-and-namespaces.html ARN>
+    -- of the asset model, which has the following format.
+    --
+    -- @arn:${Partition}:iotsitewise:${Region}:${Account}:asset-model\/${AssetModelId}@
+    assetModelArn :: Prelude.Text,
+    -- | The name of the asset model.
+    assetModelName :: Prelude.Text,
+    -- | The asset model\'s description.
+    assetModelDescription :: Prelude.Text,
+    -- | The list of asset properties for the asset model.
+    --
+    -- This object doesn\'t include properties that you define in composite
+    -- models. You can find composite model properties in the
+    -- @assetModelCompositeModels@ object.
+    assetModelProperties :: [AssetModelProperty],
+    -- | A list of asset model hierarchies that each contain a
+    -- @childAssetModelId@ and a @hierarchyId@ (named @id@). A hierarchy
+    -- specifies allowed parent\/child asset relationships for an asset model.
+    assetModelHierarchies :: [AssetModelHierarchy],
+    -- | The date the asset model was created, in Unix epoch time.
+    assetModelCreationDate :: Data.POSIX,
+    -- | The date the asset model was last updated, in Unix epoch time.
+    assetModelLastUpdateDate :: Data.POSIX,
+    -- | The current status of the asset model, which contains a state and any
+    -- error message.
+    assetModelStatus :: AssetModelStatus
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DescribeAssetModelResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'assetModelCompositeModels', 'describeAssetModelResponse_assetModelCompositeModels' - The list of composite asset models for the asset model.
+--
+-- 'httpStatus', 'describeAssetModelResponse_httpStatus' - The response's http status code.
+--
+-- 'assetModelId', 'describeAssetModelResponse_assetModelId' - The ID of the asset model.
+--
+-- 'assetModelArn', 'describeAssetModelResponse_assetModelArn' - The
+-- <https://docs.aws.amazon.com/general/latest/gr/aws-arns-and-namespaces.html ARN>
+-- of the asset model, which has the following format.
+--
+-- @arn:${Partition}:iotsitewise:${Region}:${Account}:asset-model\/${AssetModelId}@
+--
+-- 'assetModelName', 'describeAssetModelResponse_assetModelName' - The name of the asset model.
+--
+-- 'assetModelDescription', 'describeAssetModelResponse_assetModelDescription' - The asset model\'s description.
+--
+-- 'assetModelProperties', 'describeAssetModelResponse_assetModelProperties' - The list of asset properties for the asset model.
+--
+-- This object doesn\'t include properties that you define in composite
+-- models. You can find composite model properties in the
+-- @assetModelCompositeModels@ object.
+--
+-- 'assetModelHierarchies', 'describeAssetModelResponse_assetModelHierarchies' - A list of asset model hierarchies that each contain a
+-- @childAssetModelId@ and a @hierarchyId@ (named @id@). A hierarchy
+-- specifies allowed parent\/child asset relationships for an asset model.
+--
+-- 'assetModelCreationDate', 'describeAssetModelResponse_assetModelCreationDate' - The date the asset model was created, in Unix epoch time.
+--
+-- 'assetModelLastUpdateDate', 'describeAssetModelResponse_assetModelLastUpdateDate' - The date the asset model was last updated, in Unix epoch time.
+--
+-- 'assetModelStatus', 'describeAssetModelResponse_assetModelStatus' - The current status of the asset model, which contains a state and any
+-- error message.
+newDescribeAssetModelResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  -- | 'assetModelId'
+  Prelude.Text ->
+  -- | 'assetModelArn'
+  Prelude.Text ->
+  -- | 'assetModelName'
+  Prelude.Text ->
+  -- | 'assetModelDescription'
+  Prelude.Text ->
+  -- | 'assetModelCreationDate'
+  Prelude.UTCTime ->
+  -- | 'assetModelLastUpdateDate'
+  Prelude.UTCTime ->
+  -- | 'assetModelStatus'
+  AssetModelStatus ->
+  DescribeAssetModelResponse
+newDescribeAssetModelResponse
+  pHttpStatus_
+  pAssetModelId_
+  pAssetModelArn_
+  pAssetModelName_
+  pAssetModelDescription_
+  pAssetModelCreationDate_
+  pAssetModelLastUpdateDate_
+  pAssetModelStatus_ =
+    DescribeAssetModelResponse'
+      { assetModelCompositeModels =
+          Prelude.Nothing,
+        httpStatus = pHttpStatus_,
+        assetModelId = pAssetModelId_,
+        assetModelArn = pAssetModelArn_,
+        assetModelName = pAssetModelName_,
+        assetModelDescription = pAssetModelDescription_,
+        assetModelProperties = Prelude.mempty,
+        assetModelHierarchies = Prelude.mempty,
+        assetModelCreationDate =
+          Data._Time Lens.# pAssetModelCreationDate_,
+        assetModelLastUpdateDate =
+          Data._Time Lens.# pAssetModelLastUpdateDate_,
+        assetModelStatus = pAssetModelStatus_
+      }
+
+-- | The list of composite asset models for the asset model.
+describeAssetModelResponse_assetModelCompositeModels :: Lens.Lens' DescribeAssetModelResponse (Prelude.Maybe [AssetModelCompositeModel])
+describeAssetModelResponse_assetModelCompositeModels = Lens.lens (\DescribeAssetModelResponse' {assetModelCompositeModels} -> assetModelCompositeModels) (\s@DescribeAssetModelResponse' {} a -> s {assetModelCompositeModels = a} :: DescribeAssetModelResponse) Prelude.. Lens.mapping Lens.coerced
+
+-- | The response's http status code.
+describeAssetModelResponse_httpStatus :: Lens.Lens' DescribeAssetModelResponse Prelude.Int
+describeAssetModelResponse_httpStatus = Lens.lens (\DescribeAssetModelResponse' {httpStatus} -> httpStatus) (\s@DescribeAssetModelResponse' {} a -> s {httpStatus = a} :: DescribeAssetModelResponse)
+
+-- | The ID of the asset model.
+describeAssetModelResponse_assetModelId :: Lens.Lens' DescribeAssetModelResponse Prelude.Text
+describeAssetModelResponse_assetModelId = Lens.lens (\DescribeAssetModelResponse' {assetModelId} -> assetModelId) (\s@DescribeAssetModelResponse' {} a -> s {assetModelId = a} :: DescribeAssetModelResponse)
+
+-- | The
+-- <https://docs.aws.amazon.com/general/latest/gr/aws-arns-and-namespaces.html ARN>
+-- of the asset model, which has the following format.
+--
+-- @arn:${Partition}:iotsitewise:${Region}:${Account}:asset-model\/${AssetModelId}@
+describeAssetModelResponse_assetModelArn :: Lens.Lens' DescribeAssetModelResponse Prelude.Text
+describeAssetModelResponse_assetModelArn = Lens.lens (\DescribeAssetModelResponse' {assetModelArn} -> assetModelArn) (\s@DescribeAssetModelResponse' {} a -> s {assetModelArn = a} :: DescribeAssetModelResponse)
+
+-- | The name of the asset model.
+describeAssetModelResponse_assetModelName :: Lens.Lens' DescribeAssetModelResponse Prelude.Text
+describeAssetModelResponse_assetModelName = Lens.lens (\DescribeAssetModelResponse' {assetModelName} -> assetModelName) (\s@DescribeAssetModelResponse' {} a -> s {assetModelName = a} :: DescribeAssetModelResponse)
+
+-- | The asset model\'s description.
+describeAssetModelResponse_assetModelDescription :: Lens.Lens' DescribeAssetModelResponse Prelude.Text
+describeAssetModelResponse_assetModelDescription = Lens.lens (\DescribeAssetModelResponse' {assetModelDescription} -> assetModelDescription) (\s@DescribeAssetModelResponse' {} a -> s {assetModelDescription = a} :: DescribeAssetModelResponse)
+
+-- | The list of asset properties for the asset model.
+--
+-- This object doesn\'t include properties that you define in composite
+-- models. You can find composite model properties in the
+-- @assetModelCompositeModels@ object.
+describeAssetModelResponse_assetModelProperties :: Lens.Lens' DescribeAssetModelResponse [AssetModelProperty]
+describeAssetModelResponse_assetModelProperties = Lens.lens (\DescribeAssetModelResponse' {assetModelProperties} -> assetModelProperties) (\s@DescribeAssetModelResponse' {} a -> s {assetModelProperties = a} :: DescribeAssetModelResponse) Prelude.. Lens.coerced
+
+-- | A list of asset model hierarchies that each contain a
+-- @childAssetModelId@ and a @hierarchyId@ (named @id@). A hierarchy
+-- specifies allowed parent\/child asset relationships for an asset model.
+describeAssetModelResponse_assetModelHierarchies :: Lens.Lens' DescribeAssetModelResponse [AssetModelHierarchy]
+describeAssetModelResponse_assetModelHierarchies = Lens.lens (\DescribeAssetModelResponse' {assetModelHierarchies} -> assetModelHierarchies) (\s@DescribeAssetModelResponse' {} a -> s {assetModelHierarchies = a} :: DescribeAssetModelResponse) Prelude.. Lens.coerced
+
+-- | The date the asset model was created, in Unix epoch time.
+describeAssetModelResponse_assetModelCreationDate :: Lens.Lens' DescribeAssetModelResponse Prelude.UTCTime
+describeAssetModelResponse_assetModelCreationDate = Lens.lens (\DescribeAssetModelResponse' {assetModelCreationDate} -> assetModelCreationDate) (\s@DescribeAssetModelResponse' {} a -> s {assetModelCreationDate = a} :: DescribeAssetModelResponse) Prelude.. Data._Time
+
+-- | The date the asset model was last updated, in Unix epoch time.
+describeAssetModelResponse_assetModelLastUpdateDate :: Lens.Lens' DescribeAssetModelResponse Prelude.UTCTime
+describeAssetModelResponse_assetModelLastUpdateDate = Lens.lens (\DescribeAssetModelResponse' {assetModelLastUpdateDate} -> assetModelLastUpdateDate) (\s@DescribeAssetModelResponse' {} a -> s {assetModelLastUpdateDate = a} :: DescribeAssetModelResponse) Prelude.. Data._Time
+
+-- | The current status of the asset model, which contains a state and any
+-- error message.
+describeAssetModelResponse_assetModelStatus :: Lens.Lens' DescribeAssetModelResponse AssetModelStatus
+describeAssetModelResponse_assetModelStatus = Lens.lens (\DescribeAssetModelResponse' {assetModelStatus} -> assetModelStatus) (\s@DescribeAssetModelResponse' {} a -> s {assetModelStatus = a} :: DescribeAssetModelResponse)
+
+instance Prelude.NFData DescribeAssetModelResponse where
+  rnf DescribeAssetModelResponse' {..} =
+    Prelude.rnf assetModelCompositeModels
+      `Prelude.seq` Prelude.rnf httpStatus
+      `Prelude.seq` Prelude.rnf assetModelId
+      `Prelude.seq` Prelude.rnf assetModelArn
+      `Prelude.seq` Prelude.rnf assetModelName
+      `Prelude.seq` Prelude.rnf assetModelDescription
+      `Prelude.seq` Prelude.rnf assetModelProperties
+      `Prelude.seq` Prelude.rnf assetModelHierarchies
+      `Prelude.seq` Prelude.rnf assetModelCreationDate
+      `Prelude.seq` Prelude.rnf assetModelLastUpdateDate
+      `Prelude.seq` Prelude.rnf assetModelStatus
diff --git a/gen/Amazonka/IoTSiteWise/DescribeAssetProperty.hs b/gen/Amazonka/IoTSiteWise/DescribeAssetProperty.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/IoTSiteWise/DescribeAssetProperty.hs
@@ -0,0 +1,263 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.IoTSiteWise.DescribeAssetProperty
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Retrieves information about an asset property.
+--
+-- When you call this operation for an attribute property, this response
+-- includes the default attribute value that you define in the asset model.
+-- If you update the default value in the model, this operation\'s response
+-- includes the new default value.
+--
+-- This operation doesn\'t return the value of the asset property. To get
+-- the value of an asset property, use
+-- <https://docs.aws.amazon.com/iot-sitewise/latest/APIReference/API_GetAssetPropertyValue.html GetAssetPropertyValue>.
+module Amazonka.IoTSiteWise.DescribeAssetProperty
+  ( -- * Creating a Request
+    DescribeAssetProperty (..),
+    newDescribeAssetProperty,
+
+    -- * Request Lenses
+    describeAssetProperty_assetId,
+    describeAssetProperty_propertyId,
+
+    -- * Destructuring the Response
+    DescribeAssetPropertyResponse (..),
+    newDescribeAssetPropertyResponse,
+
+    -- * Response Lenses
+    describeAssetPropertyResponse_assetProperty,
+    describeAssetPropertyResponse_compositeModel,
+    describeAssetPropertyResponse_httpStatus,
+    describeAssetPropertyResponse_assetId,
+    describeAssetPropertyResponse_assetName,
+    describeAssetPropertyResponse_assetModelId,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.IoTSiteWise.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newDescribeAssetProperty' smart constructor.
+data DescribeAssetProperty = DescribeAssetProperty'
+  { -- | The ID of the asset.
+    assetId :: Prelude.Text,
+    -- | The ID of the asset property.
+    propertyId :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DescribeAssetProperty' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'assetId', 'describeAssetProperty_assetId' - The ID of the asset.
+--
+-- 'propertyId', 'describeAssetProperty_propertyId' - The ID of the asset property.
+newDescribeAssetProperty ::
+  -- | 'assetId'
+  Prelude.Text ->
+  -- | 'propertyId'
+  Prelude.Text ->
+  DescribeAssetProperty
+newDescribeAssetProperty pAssetId_ pPropertyId_ =
+  DescribeAssetProperty'
+    { assetId = pAssetId_,
+      propertyId = pPropertyId_
+    }
+
+-- | The ID of the asset.
+describeAssetProperty_assetId :: Lens.Lens' DescribeAssetProperty Prelude.Text
+describeAssetProperty_assetId = Lens.lens (\DescribeAssetProperty' {assetId} -> assetId) (\s@DescribeAssetProperty' {} a -> s {assetId = a} :: DescribeAssetProperty)
+
+-- | The ID of the asset property.
+describeAssetProperty_propertyId :: Lens.Lens' DescribeAssetProperty Prelude.Text
+describeAssetProperty_propertyId = Lens.lens (\DescribeAssetProperty' {propertyId} -> propertyId) (\s@DescribeAssetProperty' {} a -> s {propertyId = a} :: DescribeAssetProperty)
+
+instance Core.AWSRequest DescribeAssetProperty where
+  type
+    AWSResponse DescribeAssetProperty =
+      DescribeAssetPropertyResponse
+  request overrides =
+    Request.get (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          DescribeAssetPropertyResponse'
+            Prelude.<$> (x Data..?> "assetProperty")
+            Prelude.<*> (x Data..?> "compositeModel")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+            Prelude.<*> (x Data..:> "assetId")
+            Prelude.<*> (x Data..:> "assetName")
+            Prelude.<*> (x Data..:> "assetModelId")
+      )
+
+instance Prelude.Hashable DescribeAssetProperty where
+  hashWithSalt _salt DescribeAssetProperty' {..} =
+    _salt
+      `Prelude.hashWithSalt` assetId
+      `Prelude.hashWithSalt` propertyId
+
+instance Prelude.NFData DescribeAssetProperty where
+  rnf DescribeAssetProperty' {..} =
+    Prelude.rnf assetId
+      `Prelude.seq` Prelude.rnf propertyId
+
+instance Data.ToHeaders DescribeAssetProperty where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToPath DescribeAssetProperty where
+  toPath DescribeAssetProperty' {..} =
+    Prelude.mconcat
+      [ "/assets/",
+        Data.toBS assetId,
+        "/properties/",
+        Data.toBS propertyId
+      ]
+
+instance Data.ToQuery DescribeAssetProperty where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newDescribeAssetPropertyResponse' smart constructor.
+data DescribeAssetPropertyResponse = DescribeAssetPropertyResponse'
+  { -- | The asset property\'s definition, alias, and notification state.
+    --
+    -- This response includes this object for normal asset properties. If you
+    -- describe an asset property in a composite model, this response includes
+    -- the asset property information in @compositeModel@.
+    assetProperty :: Prelude.Maybe Property,
+    -- | The composite asset model that declares this asset property, if this
+    -- asset property exists in a composite model.
+    compositeModel :: Prelude.Maybe CompositeModelProperty,
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int,
+    -- | The ID of the asset.
+    assetId :: Prelude.Text,
+    -- | The name of the asset.
+    assetName :: Prelude.Text,
+    -- | The ID of the asset model.
+    assetModelId :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DescribeAssetPropertyResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'assetProperty', 'describeAssetPropertyResponse_assetProperty' - The asset property\'s definition, alias, and notification state.
+--
+-- This response includes this object for normal asset properties. If you
+-- describe an asset property in a composite model, this response includes
+-- the asset property information in @compositeModel@.
+--
+-- 'compositeModel', 'describeAssetPropertyResponse_compositeModel' - The composite asset model that declares this asset property, if this
+-- asset property exists in a composite model.
+--
+-- 'httpStatus', 'describeAssetPropertyResponse_httpStatus' - The response's http status code.
+--
+-- 'assetId', 'describeAssetPropertyResponse_assetId' - The ID of the asset.
+--
+-- 'assetName', 'describeAssetPropertyResponse_assetName' - The name of the asset.
+--
+-- 'assetModelId', 'describeAssetPropertyResponse_assetModelId' - The ID of the asset model.
+newDescribeAssetPropertyResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  -- | 'assetId'
+  Prelude.Text ->
+  -- | 'assetName'
+  Prelude.Text ->
+  -- | 'assetModelId'
+  Prelude.Text ->
+  DescribeAssetPropertyResponse
+newDescribeAssetPropertyResponse
+  pHttpStatus_
+  pAssetId_
+  pAssetName_
+  pAssetModelId_ =
+    DescribeAssetPropertyResponse'
+      { assetProperty =
+          Prelude.Nothing,
+        compositeModel = Prelude.Nothing,
+        httpStatus = pHttpStatus_,
+        assetId = pAssetId_,
+        assetName = pAssetName_,
+        assetModelId = pAssetModelId_
+      }
+
+-- | The asset property\'s definition, alias, and notification state.
+--
+-- This response includes this object for normal asset properties. If you
+-- describe an asset property in a composite model, this response includes
+-- the asset property information in @compositeModel@.
+describeAssetPropertyResponse_assetProperty :: Lens.Lens' DescribeAssetPropertyResponse (Prelude.Maybe Property)
+describeAssetPropertyResponse_assetProperty = Lens.lens (\DescribeAssetPropertyResponse' {assetProperty} -> assetProperty) (\s@DescribeAssetPropertyResponse' {} a -> s {assetProperty = a} :: DescribeAssetPropertyResponse)
+
+-- | The composite asset model that declares this asset property, if this
+-- asset property exists in a composite model.
+describeAssetPropertyResponse_compositeModel :: Lens.Lens' DescribeAssetPropertyResponse (Prelude.Maybe CompositeModelProperty)
+describeAssetPropertyResponse_compositeModel = Lens.lens (\DescribeAssetPropertyResponse' {compositeModel} -> compositeModel) (\s@DescribeAssetPropertyResponse' {} a -> s {compositeModel = a} :: DescribeAssetPropertyResponse)
+
+-- | The response's http status code.
+describeAssetPropertyResponse_httpStatus :: Lens.Lens' DescribeAssetPropertyResponse Prelude.Int
+describeAssetPropertyResponse_httpStatus = Lens.lens (\DescribeAssetPropertyResponse' {httpStatus} -> httpStatus) (\s@DescribeAssetPropertyResponse' {} a -> s {httpStatus = a} :: DescribeAssetPropertyResponse)
+
+-- | The ID of the asset.
+describeAssetPropertyResponse_assetId :: Lens.Lens' DescribeAssetPropertyResponse Prelude.Text
+describeAssetPropertyResponse_assetId = Lens.lens (\DescribeAssetPropertyResponse' {assetId} -> assetId) (\s@DescribeAssetPropertyResponse' {} a -> s {assetId = a} :: DescribeAssetPropertyResponse)
+
+-- | The name of the asset.
+describeAssetPropertyResponse_assetName :: Lens.Lens' DescribeAssetPropertyResponse Prelude.Text
+describeAssetPropertyResponse_assetName = Lens.lens (\DescribeAssetPropertyResponse' {assetName} -> assetName) (\s@DescribeAssetPropertyResponse' {} a -> s {assetName = a} :: DescribeAssetPropertyResponse)
+
+-- | The ID of the asset model.
+describeAssetPropertyResponse_assetModelId :: Lens.Lens' DescribeAssetPropertyResponse Prelude.Text
+describeAssetPropertyResponse_assetModelId = Lens.lens (\DescribeAssetPropertyResponse' {assetModelId} -> assetModelId) (\s@DescribeAssetPropertyResponse' {} a -> s {assetModelId = a} :: DescribeAssetPropertyResponse)
+
+instance Prelude.NFData DescribeAssetPropertyResponse where
+  rnf DescribeAssetPropertyResponse' {..} =
+    Prelude.rnf assetProperty
+      `Prelude.seq` Prelude.rnf compositeModel
+      `Prelude.seq` Prelude.rnf httpStatus
+      `Prelude.seq` Prelude.rnf assetId
+      `Prelude.seq` Prelude.rnf assetName
+      `Prelude.seq` Prelude.rnf assetModelId
diff --git a/gen/Amazonka/IoTSiteWise/DescribeBulkImportJob.hs b/gen/Amazonka/IoTSiteWise/DescribeBulkImportJob.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/IoTSiteWise/DescribeBulkImportJob.hs
@@ -0,0 +1,356 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.IoTSiteWise.DescribeBulkImportJob
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Retrieves information about a bulk import job request. For more
+-- information, see
+-- <https://docs.aws.amazon.com/iot-sitewise/latest/userguide/DescribeBulkImportJob.html Describe a bulk import job (CLI)>
+-- in the /Amazon Simple Storage Service User Guide/.
+module Amazonka.IoTSiteWise.DescribeBulkImportJob
+  ( -- * Creating a Request
+    DescribeBulkImportJob (..),
+    newDescribeBulkImportJob,
+
+    -- * Request Lenses
+    describeBulkImportJob_jobId,
+
+    -- * Destructuring the Response
+    DescribeBulkImportJobResponse (..),
+    newDescribeBulkImportJobResponse,
+
+    -- * Response Lenses
+    describeBulkImportJobResponse_httpStatus,
+    describeBulkImportJobResponse_jobId,
+    describeBulkImportJobResponse_jobName,
+    describeBulkImportJobResponse_jobStatus,
+    describeBulkImportJobResponse_jobRoleArn,
+    describeBulkImportJobResponse_files,
+    describeBulkImportJobResponse_errorReportLocation,
+    describeBulkImportJobResponse_jobConfiguration,
+    describeBulkImportJobResponse_jobCreationDate,
+    describeBulkImportJobResponse_jobLastUpdateDate,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.IoTSiteWise.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newDescribeBulkImportJob' smart constructor.
+data DescribeBulkImportJob = DescribeBulkImportJob'
+  { -- | The ID of the job.
+    jobId :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DescribeBulkImportJob' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'jobId', 'describeBulkImportJob_jobId' - The ID of the job.
+newDescribeBulkImportJob ::
+  -- | 'jobId'
+  Prelude.Text ->
+  DescribeBulkImportJob
+newDescribeBulkImportJob pJobId_ =
+  DescribeBulkImportJob' {jobId = pJobId_}
+
+-- | The ID of the job.
+describeBulkImportJob_jobId :: Lens.Lens' DescribeBulkImportJob Prelude.Text
+describeBulkImportJob_jobId = Lens.lens (\DescribeBulkImportJob' {jobId} -> jobId) (\s@DescribeBulkImportJob' {} a -> s {jobId = a} :: DescribeBulkImportJob)
+
+instance Core.AWSRequest DescribeBulkImportJob where
+  type
+    AWSResponse DescribeBulkImportJob =
+      DescribeBulkImportJobResponse
+  request overrides =
+    Request.get (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          DescribeBulkImportJobResponse'
+            Prelude.<$> (Prelude.pure (Prelude.fromEnum s))
+            Prelude.<*> (x Data..:> "jobId")
+            Prelude.<*> (x Data..:> "jobName")
+            Prelude.<*> (x Data..:> "jobStatus")
+            Prelude.<*> (x Data..:> "jobRoleArn")
+            Prelude.<*> (x Data..?> "files" Core..!@ Prelude.mempty)
+            Prelude.<*> (x Data..:> "errorReportLocation")
+            Prelude.<*> (x Data..:> "jobConfiguration")
+            Prelude.<*> (x Data..:> "jobCreationDate")
+            Prelude.<*> (x Data..:> "jobLastUpdateDate")
+      )
+
+instance Prelude.Hashable DescribeBulkImportJob where
+  hashWithSalt _salt DescribeBulkImportJob' {..} =
+    _salt `Prelude.hashWithSalt` jobId
+
+instance Prelude.NFData DescribeBulkImportJob where
+  rnf DescribeBulkImportJob' {..} = Prelude.rnf jobId
+
+instance Data.ToHeaders DescribeBulkImportJob where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToPath DescribeBulkImportJob where
+  toPath DescribeBulkImportJob' {..} =
+    Prelude.mconcat ["/jobs/", Data.toBS jobId]
+
+instance Data.ToQuery DescribeBulkImportJob where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newDescribeBulkImportJobResponse' smart constructor.
+data DescribeBulkImportJobResponse = DescribeBulkImportJobResponse'
+  { -- | The response's http status code.
+    httpStatus :: Prelude.Int,
+    -- | The ID of the job.
+    jobId :: Prelude.Text,
+    -- | The unique name that helps identify the job request.
+    jobName :: Prelude.Text,
+    -- | The status of the bulk import job can be one of following values.
+    --
+    -- -   @PENDING@ – IoT SiteWise is waiting for the current bulk import job
+    --     to finish.
+    --
+    -- -   @CANCELLED@ – The bulk import job has been canceled.
+    --
+    -- -   @RUNNING@ – IoT SiteWise is processing your request to import your
+    --     data from Amazon S3.
+    --
+    -- -   @COMPLETED@ – IoT SiteWise successfully completed your request to
+    --     import data from Amazon S3.
+    --
+    -- -   @FAILED@ – IoT SiteWise couldn\'t process your request to import
+    --     data from Amazon S3. You can use logs saved in the specified error
+    --     report location in Amazon S3 to troubleshoot issues.
+    --
+    -- -   @COMPLETED_WITH_FAILURES@ – IoT SiteWise completed your request to
+    --     import data from Amazon S3 with errors. You can use logs saved in
+    --     the specified error report location in Amazon S3 to troubleshoot
+    --     issues.
+    jobStatus :: JobStatus,
+    -- | The
+    -- <https://docs.aws.amazon.com/general/latest/gr/aws-arns-and-namespaces.html ARN>
+    -- of the IAM role that allows IoT SiteWise to read Amazon S3 data.
+    jobRoleArn :: Prelude.Text,
+    -- | The files in the specified Amazon S3 bucket that contain your data.
+    files :: [File],
+    -- | The Amazon S3 destination where errors associated with the job creation
+    -- request are saved.
+    errorReportLocation :: ErrorReportLocation,
+    -- | Contains the configuration information of a job, such as the file format
+    -- used to save data in Amazon S3.
+    jobConfiguration :: JobConfiguration,
+    -- | The date the job was created, in Unix epoch TIME.
+    jobCreationDate :: Data.POSIX,
+    -- | The date the job was last updated, in Unix epoch time.
+    jobLastUpdateDate :: Data.POSIX
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DescribeBulkImportJobResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'httpStatus', 'describeBulkImportJobResponse_httpStatus' - The response's http status code.
+--
+-- 'jobId', 'describeBulkImportJobResponse_jobId' - The ID of the job.
+--
+-- 'jobName', 'describeBulkImportJobResponse_jobName' - The unique name that helps identify the job request.
+--
+-- 'jobStatus', 'describeBulkImportJobResponse_jobStatus' - The status of the bulk import job can be one of following values.
+--
+-- -   @PENDING@ – IoT SiteWise is waiting for the current bulk import job
+--     to finish.
+--
+-- -   @CANCELLED@ – The bulk import job has been canceled.
+--
+-- -   @RUNNING@ – IoT SiteWise is processing your request to import your
+--     data from Amazon S3.
+--
+-- -   @COMPLETED@ – IoT SiteWise successfully completed your request to
+--     import data from Amazon S3.
+--
+-- -   @FAILED@ – IoT SiteWise couldn\'t process your request to import
+--     data from Amazon S3. You can use logs saved in the specified error
+--     report location in Amazon S3 to troubleshoot issues.
+--
+-- -   @COMPLETED_WITH_FAILURES@ – IoT SiteWise completed your request to
+--     import data from Amazon S3 with errors. You can use logs saved in
+--     the specified error report location in Amazon S3 to troubleshoot
+--     issues.
+--
+-- 'jobRoleArn', 'describeBulkImportJobResponse_jobRoleArn' - The
+-- <https://docs.aws.amazon.com/general/latest/gr/aws-arns-and-namespaces.html ARN>
+-- of the IAM role that allows IoT SiteWise to read Amazon S3 data.
+--
+-- 'files', 'describeBulkImportJobResponse_files' - The files in the specified Amazon S3 bucket that contain your data.
+--
+-- 'errorReportLocation', 'describeBulkImportJobResponse_errorReportLocation' - The Amazon S3 destination where errors associated with the job creation
+-- request are saved.
+--
+-- 'jobConfiguration', 'describeBulkImportJobResponse_jobConfiguration' - Contains the configuration information of a job, such as the file format
+-- used to save data in Amazon S3.
+--
+-- 'jobCreationDate', 'describeBulkImportJobResponse_jobCreationDate' - The date the job was created, in Unix epoch TIME.
+--
+-- 'jobLastUpdateDate', 'describeBulkImportJobResponse_jobLastUpdateDate' - The date the job was last updated, in Unix epoch time.
+newDescribeBulkImportJobResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  -- | 'jobId'
+  Prelude.Text ->
+  -- | 'jobName'
+  Prelude.Text ->
+  -- | 'jobStatus'
+  JobStatus ->
+  -- | 'jobRoleArn'
+  Prelude.Text ->
+  -- | 'errorReportLocation'
+  ErrorReportLocation ->
+  -- | 'jobConfiguration'
+  JobConfiguration ->
+  -- | 'jobCreationDate'
+  Prelude.UTCTime ->
+  -- | 'jobLastUpdateDate'
+  Prelude.UTCTime ->
+  DescribeBulkImportJobResponse
+newDescribeBulkImportJobResponse
+  pHttpStatus_
+  pJobId_
+  pJobName_
+  pJobStatus_
+  pJobRoleArn_
+  pErrorReportLocation_
+  pJobConfiguration_
+  pJobCreationDate_
+  pJobLastUpdateDate_ =
+    DescribeBulkImportJobResponse'
+      { httpStatus =
+          pHttpStatus_,
+        jobId = pJobId_,
+        jobName = pJobName_,
+        jobStatus = pJobStatus_,
+        jobRoleArn = pJobRoleArn_,
+        files = Prelude.mempty,
+        errorReportLocation = pErrorReportLocation_,
+        jobConfiguration = pJobConfiguration_,
+        jobCreationDate =
+          Data._Time Lens.# pJobCreationDate_,
+        jobLastUpdateDate =
+          Data._Time Lens.# pJobLastUpdateDate_
+      }
+
+-- | The response's http status code.
+describeBulkImportJobResponse_httpStatus :: Lens.Lens' DescribeBulkImportJobResponse Prelude.Int
+describeBulkImportJobResponse_httpStatus = Lens.lens (\DescribeBulkImportJobResponse' {httpStatus} -> httpStatus) (\s@DescribeBulkImportJobResponse' {} a -> s {httpStatus = a} :: DescribeBulkImportJobResponse)
+
+-- | The ID of the job.
+describeBulkImportJobResponse_jobId :: Lens.Lens' DescribeBulkImportJobResponse Prelude.Text
+describeBulkImportJobResponse_jobId = Lens.lens (\DescribeBulkImportJobResponse' {jobId} -> jobId) (\s@DescribeBulkImportJobResponse' {} a -> s {jobId = a} :: DescribeBulkImportJobResponse)
+
+-- | The unique name that helps identify the job request.
+describeBulkImportJobResponse_jobName :: Lens.Lens' DescribeBulkImportJobResponse Prelude.Text
+describeBulkImportJobResponse_jobName = Lens.lens (\DescribeBulkImportJobResponse' {jobName} -> jobName) (\s@DescribeBulkImportJobResponse' {} a -> s {jobName = a} :: DescribeBulkImportJobResponse)
+
+-- | The status of the bulk import job can be one of following values.
+--
+-- -   @PENDING@ – IoT SiteWise is waiting for the current bulk import job
+--     to finish.
+--
+-- -   @CANCELLED@ – The bulk import job has been canceled.
+--
+-- -   @RUNNING@ – IoT SiteWise is processing your request to import your
+--     data from Amazon S3.
+--
+-- -   @COMPLETED@ – IoT SiteWise successfully completed your request to
+--     import data from Amazon S3.
+--
+-- -   @FAILED@ – IoT SiteWise couldn\'t process your request to import
+--     data from Amazon S3. You can use logs saved in the specified error
+--     report location in Amazon S3 to troubleshoot issues.
+--
+-- -   @COMPLETED_WITH_FAILURES@ – IoT SiteWise completed your request to
+--     import data from Amazon S3 with errors. You can use logs saved in
+--     the specified error report location in Amazon S3 to troubleshoot
+--     issues.
+describeBulkImportJobResponse_jobStatus :: Lens.Lens' DescribeBulkImportJobResponse JobStatus
+describeBulkImportJobResponse_jobStatus = Lens.lens (\DescribeBulkImportJobResponse' {jobStatus} -> jobStatus) (\s@DescribeBulkImportJobResponse' {} a -> s {jobStatus = a} :: DescribeBulkImportJobResponse)
+
+-- | The
+-- <https://docs.aws.amazon.com/general/latest/gr/aws-arns-and-namespaces.html ARN>
+-- of the IAM role that allows IoT SiteWise to read Amazon S3 data.
+describeBulkImportJobResponse_jobRoleArn :: Lens.Lens' DescribeBulkImportJobResponse Prelude.Text
+describeBulkImportJobResponse_jobRoleArn = Lens.lens (\DescribeBulkImportJobResponse' {jobRoleArn} -> jobRoleArn) (\s@DescribeBulkImportJobResponse' {} a -> s {jobRoleArn = a} :: DescribeBulkImportJobResponse)
+
+-- | The files in the specified Amazon S3 bucket that contain your data.
+describeBulkImportJobResponse_files :: Lens.Lens' DescribeBulkImportJobResponse [File]
+describeBulkImportJobResponse_files = Lens.lens (\DescribeBulkImportJobResponse' {files} -> files) (\s@DescribeBulkImportJobResponse' {} a -> s {files = a} :: DescribeBulkImportJobResponse) Prelude.. Lens.coerced
+
+-- | The Amazon S3 destination where errors associated with the job creation
+-- request are saved.
+describeBulkImportJobResponse_errorReportLocation :: Lens.Lens' DescribeBulkImportJobResponse ErrorReportLocation
+describeBulkImportJobResponse_errorReportLocation = Lens.lens (\DescribeBulkImportJobResponse' {errorReportLocation} -> errorReportLocation) (\s@DescribeBulkImportJobResponse' {} a -> s {errorReportLocation = a} :: DescribeBulkImportJobResponse)
+
+-- | Contains the configuration information of a job, such as the file format
+-- used to save data in Amazon S3.
+describeBulkImportJobResponse_jobConfiguration :: Lens.Lens' DescribeBulkImportJobResponse JobConfiguration
+describeBulkImportJobResponse_jobConfiguration = Lens.lens (\DescribeBulkImportJobResponse' {jobConfiguration} -> jobConfiguration) (\s@DescribeBulkImportJobResponse' {} a -> s {jobConfiguration = a} :: DescribeBulkImportJobResponse)
+
+-- | The date the job was created, in Unix epoch TIME.
+describeBulkImportJobResponse_jobCreationDate :: Lens.Lens' DescribeBulkImportJobResponse Prelude.UTCTime
+describeBulkImportJobResponse_jobCreationDate = Lens.lens (\DescribeBulkImportJobResponse' {jobCreationDate} -> jobCreationDate) (\s@DescribeBulkImportJobResponse' {} a -> s {jobCreationDate = a} :: DescribeBulkImportJobResponse) Prelude.. Data._Time
+
+-- | The date the job was last updated, in Unix epoch time.
+describeBulkImportJobResponse_jobLastUpdateDate :: Lens.Lens' DescribeBulkImportJobResponse Prelude.UTCTime
+describeBulkImportJobResponse_jobLastUpdateDate = Lens.lens (\DescribeBulkImportJobResponse' {jobLastUpdateDate} -> jobLastUpdateDate) (\s@DescribeBulkImportJobResponse' {} a -> s {jobLastUpdateDate = a} :: DescribeBulkImportJobResponse) Prelude.. Data._Time
+
+instance Prelude.NFData DescribeBulkImportJobResponse where
+  rnf DescribeBulkImportJobResponse' {..} =
+    Prelude.rnf httpStatus
+      `Prelude.seq` Prelude.rnf jobId
+      `Prelude.seq` Prelude.rnf jobName
+      `Prelude.seq` Prelude.rnf jobStatus
+      `Prelude.seq` Prelude.rnf jobRoleArn
+      `Prelude.seq` Prelude.rnf files
+      `Prelude.seq` Prelude.rnf errorReportLocation
+      `Prelude.seq` Prelude.rnf jobConfiguration
+      `Prelude.seq` Prelude.rnf jobCreationDate
+      `Prelude.seq` Prelude.rnf jobLastUpdateDate
diff --git a/gen/Amazonka/IoTSiteWise/DescribeDashboard.hs b/gen/Amazonka/IoTSiteWise/DescribeDashboard.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/IoTSiteWise/DescribeDashboard.hs
@@ -0,0 +1,285 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.IoTSiteWise.DescribeDashboard
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Retrieves information about a dashboard.
+module Amazonka.IoTSiteWise.DescribeDashboard
+  ( -- * Creating a Request
+    DescribeDashboard (..),
+    newDescribeDashboard,
+
+    -- * Request Lenses
+    describeDashboard_dashboardId,
+
+    -- * Destructuring the Response
+    DescribeDashboardResponse (..),
+    newDescribeDashboardResponse,
+
+    -- * Response Lenses
+    describeDashboardResponse_dashboardDescription,
+    describeDashboardResponse_httpStatus,
+    describeDashboardResponse_dashboardId,
+    describeDashboardResponse_dashboardArn,
+    describeDashboardResponse_dashboardName,
+    describeDashboardResponse_projectId,
+    describeDashboardResponse_dashboardDefinition,
+    describeDashboardResponse_dashboardCreationDate,
+    describeDashboardResponse_dashboardLastUpdateDate,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.IoTSiteWise.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newDescribeDashboard' smart constructor.
+data DescribeDashboard = DescribeDashboard'
+  { -- | The ID of the dashboard.
+    dashboardId :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DescribeDashboard' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'dashboardId', 'describeDashboard_dashboardId' - The ID of the dashboard.
+newDescribeDashboard ::
+  -- | 'dashboardId'
+  Prelude.Text ->
+  DescribeDashboard
+newDescribeDashboard pDashboardId_ =
+  DescribeDashboard' {dashboardId = pDashboardId_}
+
+-- | The ID of the dashboard.
+describeDashboard_dashboardId :: Lens.Lens' DescribeDashboard Prelude.Text
+describeDashboard_dashboardId = Lens.lens (\DescribeDashboard' {dashboardId} -> dashboardId) (\s@DescribeDashboard' {} a -> s {dashboardId = a} :: DescribeDashboard)
+
+instance Core.AWSRequest DescribeDashboard where
+  type
+    AWSResponse DescribeDashboard =
+      DescribeDashboardResponse
+  request overrides =
+    Request.get (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          DescribeDashboardResponse'
+            Prelude.<$> (x Data..?> "dashboardDescription")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+            Prelude.<*> (x Data..:> "dashboardId")
+            Prelude.<*> (x Data..:> "dashboardArn")
+            Prelude.<*> (x Data..:> "dashboardName")
+            Prelude.<*> (x Data..:> "projectId")
+            Prelude.<*> (x Data..:> "dashboardDefinition")
+            Prelude.<*> (x Data..:> "dashboardCreationDate")
+            Prelude.<*> (x Data..:> "dashboardLastUpdateDate")
+      )
+
+instance Prelude.Hashable DescribeDashboard where
+  hashWithSalt _salt DescribeDashboard' {..} =
+    _salt `Prelude.hashWithSalt` dashboardId
+
+instance Prelude.NFData DescribeDashboard where
+  rnf DescribeDashboard' {..} = Prelude.rnf dashboardId
+
+instance Data.ToHeaders DescribeDashboard where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToPath DescribeDashboard where
+  toPath DescribeDashboard' {..} =
+    Prelude.mconcat
+      ["/dashboards/", Data.toBS dashboardId]
+
+instance Data.ToQuery DescribeDashboard where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newDescribeDashboardResponse' smart constructor.
+data DescribeDashboardResponse = DescribeDashboardResponse'
+  { -- | The dashboard\'s description.
+    dashboardDescription :: Prelude.Maybe Prelude.Text,
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int,
+    -- | The ID of the dashboard.
+    dashboardId :: Prelude.Text,
+    -- | The
+    -- <https://docs.aws.amazon.com/general/latest/gr/aws-arns-and-namespaces.html ARN>
+    -- of the dashboard, which has the following format.
+    --
+    -- @arn:${Partition}:iotsitewise:${Region}:${Account}:dashboard\/${DashboardId}@
+    dashboardArn :: Prelude.Text,
+    -- | The name of the dashboard.
+    dashboardName :: Prelude.Text,
+    -- | The ID of the project that the dashboard is in.
+    projectId :: Prelude.Text,
+    -- | The dashboard\'s definition JSON literal. For detailed information, see
+    -- <https://docs.aws.amazon.com/iot-sitewise/latest/userguide/create-dashboards-using-aws-cli.html Creating dashboards (CLI)>
+    -- in the /IoT SiteWise User Guide/.
+    dashboardDefinition :: Prelude.Text,
+    -- | The date the dashboard was created, in Unix epoch time.
+    dashboardCreationDate :: Data.POSIX,
+    -- | The date the dashboard was last updated, in Unix epoch time.
+    dashboardLastUpdateDate :: Data.POSIX
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DescribeDashboardResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'dashboardDescription', 'describeDashboardResponse_dashboardDescription' - The dashboard\'s description.
+--
+-- 'httpStatus', 'describeDashboardResponse_httpStatus' - The response's http status code.
+--
+-- 'dashboardId', 'describeDashboardResponse_dashboardId' - The ID of the dashboard.
+--
+-- 'dashboardArn', 'describeDashboardResponse_dashboardArn' - The
+-- <https://docs.aws.amazon.com/general/latest/gr/aws-arns-and-namespaces.html ARN>
+-- of the dashboard, which has the following format.
+--
+-- @arn:${Partition}:iotsitewise:${Region}:${Account}:dashboard\/${DashboardId}@
+--
+-- 'dashboardName', 'describeDashboardResponse_dashboardName' - The name of the dashboard.
+--
+-- 'projectId', 'describeDashboardResponse_projectId' - The ID of the project that the dashboard is in.
+--
+-- 'dashboardDefinition', 'describeDashboardResponse_dashboardDefinition' - The dashboard\'s definition JSON literal. For detailed information, see
+-- <https://docs.aws.amazon.com/iot-sitewise/latest/userguide/create-dashboards-using-aws-cli.html Creating dashboards (CLI)>
+-- in the /IoT SiteWise User Guide/.
+--
+-- 'dashboardCreationDate', 'describeDashboardResponse_dashboardCreationDate' - The date the dashboard was created, in Unix epoch time.
+--
+-- 'dashboardLastUpdateDate', 'describeDashboardResponse_dashboardLastUpdateDate' - The date the dashboard was last updated, in Unix epoch time.
+newDescribeDashboardResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  -- | 'dashboardId'
+  Prelude.Text ->
+  -- | 'dashboardArn'
+  Prelude.Text ->
+  -- | 'dashboardName'
+  Prelude.Text ->
+  -- | 'projectId'
+  Prelude.Text ->
+  -- | 'dashboardDefinition'
+  Prelude.Text ->
+  -- | 'dashboardCreationDate'
+  Prelude.UTCTime ->
+  -- | 'dashboardLastUpdateDate'
+  Prelude.UTCTime ->
+  DescribeDashboardResponse
+newDescribeDashboardResponse
+  pHttpStatus_
+  pDashboardId_
+  pDashboardArn_
+  pDashboardName_
+  pProjectId_
+  pDashboardDefinition_
+  pDashboardCreationDate_
+  pDashboardLastUpdateDate_ =
+    DescribeDashboardResponse'
+      { dashboardDescription =
+          Prelude.Nothing,
+        httpStatus = pHttpStatus_,
+        dashboardId = pDashboardId_,
+        dashboardArn = pDashboardArn_,
+        dashboardName = pDashboardName_,
+        projectId = pProjectId_,
+        dashboardDefinition = pDashboardDefinition_,
+        dashboardCreationDate =
+          Data._Time Lens.# pDashboardCreationDate_,
+        dashboardLastUpdateDate =
+          Data._Time Lens.# pDashboardLastUpdateDate_
+      }
+
+-- | The dashboard\'s description.
+describeDashboardResponse_dashboardDescription :: Lens.Lens' DescribeDashboardResponse (Prelude.Maybe Prelude.Text)
+describeDashboardResponse_dashboardDescription = Lens.lens (\DescribeDashboardResponse' {dashboardDescription} -> dashboardDescription) (\s@DescribeDashboardResponse' {} a -> s {dashboardDescription = a} :: DescribeDashboardResponse)
+
+-- | The response's http status code.
+describeDashboardResponse_httpStatus :: Lens.Lens' DescribeDashboardResponse Prelude.Int
+describeDashboardResponse_httpStatus = Lens.lens (\DescribeDashboardResponse' {httpStatus} -> httpStatus) (\s@DescribeDashboardResponse' {} a -> s {httpStatus = a} :: DescribeDashboardResponse)
+
+-- | The ID of the dashboard.
+describeDashboardResponse_dashboardId :: Lens.Lens' DescribeDashboardResponse Prelude.Text
+describeDashboardResponse_dashboardId = Lens.lens (\DescribeDashboardResponse' {dashboardId} -> dashboardId) (\s@DescribeDashboardResponse' {} a -> s {dashboardId = a} :: DescribeDashboardResponse)
+
+-- | The
+-- <https://docs.aws.amazon.com/general/latest/gr/aws-arns-and-namespaces.html ARN>
+-- of the dashboard, which has the following format.
+--
+-- @arn:${Partition}:iotsitewise:${Region}:${Account}:dashboard\/${DashboardId}@
+describeDashboardResponse_dashboardArn :: Lens.Lens' DescribeDashboardResponse Prelude.Text
+describeDashboardResponse_dashboardArn = Lens.lens (\DescribeDashboardResponse' {dashboardArn} -> dashboardArn) (\s@DescribeDashboardResponse' {} a -> s {dashboardArn = a} :: DescribeDashboardResponse)
+
+-- | The name of the dashboard.
+describeDashboardResponse_dashboardName :: Lens.Lens' DescribeDashboardResponse Prelude.Text
+describeDashboardResponse_dashboardName = Lens.lens (\DescribeDashboardResponse' {dashboardName} -> dashboardName) (\s@DescribeDashboardResponse' {} a -> s {dashboardName = a} :: DescribeDashboardResponse)
+
+-- | The ID of the project that the dashboard is in.
+describeDashboardResponse_projectId :: Lens.Lens' DescribeDashboardResponse Prelude.Text
+describeDashboardResponse_projectId = Lens.lens (\DescribeDashboardResponse' {projectId} -> projectId) (\s@DescribeDashboardResponse' {} a -> s {projectId = a} :: DescribeDashboardResponse)
+
+-- | The dashboard\'s definition JSON literal. For detailed information, see
+-- <https://docs.aws.amazon.com/iot-sitewise/latest/userguide/create-dashboards-using-aws-cli.html Creating dashboards (CLI)>
+-- in the /IoT SiteWise User Guide/.
+describeDashboardResponse_dashboardDefinition :: Lens.Lens' DescribeDashboardResponse Prelude.Text
+describeDashboardResponse_dashboardDefinition = Lens.lens (\DescribeDashboardResponse' {dashboardDefinition} -> dashboardDefinition) (\s@DescribeDashboardResponse' {} a -> s {dashboardDefinition = a} :: DescribeDashboardResponse)
+
+-- | The date the dashboard was created, in Unix epoch time.
+describeDashboardResponse_dashboardCreationDate :: Lens.Lens' DescribeDashboardResponse Prelude.UTCTime
+describeDashboardResponse_dashboardCreationDate = Lens.lens (\DescribeDashboardResponse' {dashboardCreationDate} -> dashboardCreationDate) (\s@DescribeDashboardResponse' {} a -> s {dashboardCreationDate = a} :: DescribeDashboardResponse) Prelude.. Data._Time
+
+-- | The date the dashboard was last updated, in Unix epoch time.
+describeDashboardResponse_dashboardLastUpdateDate :: Lens.Lens' DescribeDashboardResponse Prelude.UTCTime
+describeDashboardResponse_dashboardLastUpdateDate = Lens.lens (\DescribeDashboardResponse' {dashboardLastUpdateDate} -> dashboardLastUpdateDate) (\s@DescribeDashboardResponse' {} a -> s {dashboardLastUpdateDate = a} :: DescribeDashboardResponse) Prelude.. Data._Time
+
+instance Prelude.NFData DescribeDashboardResponse where
+  rnf DescribeDashboardResponse' {..} =
+    Prelude.rnf dashboardDescription
+      `Prelude.seq` Prelude.rnf httpStatus
+      `Prelude.seq` Prelude.rnf dashboardId
+      `Prelude.seq` Prelude.rnf dashboardArn
+      `Prelude.seq` Prelude.rnf dashboardName
+      `Prelude.seq` Prelude.rnf projectId
+      `Prelude.seq` Prelude.rnf dashboardDefinition
+      `Prelude.seq` Prelude.rnf dashboardCreationDate
+      `Prelude.seq` Prelude.rnf dashboardLastUpdateDate
diff --git a/gen/Amazonka/IoTSiteWise/DescribeDefaultEncryptionConfiguration.hs b/gen/Amazonka/IoTSiteWise/DescribeDefaultEncryptionConfiguration.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/IoTSiteWise/DescribeDefaultEncryptionConfiguration.hs
@@ -0,0 +1,212 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.IoTSiteWise.DescribeDefaultEncryptionConfiguration
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Retrieves information about the default encryption configuration for the
+-- Amazon Web Services account in the default or specified Region. For more
+-- information, see
+-- <https://docs.aws.amazon.com/iot-sitewise/latest/userguide/key-management.html Key management>
+-- in the /IoT SiteWise User Guide/.
+module Amazonka.IoTSiteWise.DescribeDefaultEncryptionConfiguration
+  ( -- * Creating a Request
+    DescribeDefaultEncryptionConfiguration (..),
+    newDescribeDefaultEncryptionConfiguration,
+
+    -- * Destructuring the Response
+    DescribeDefaultEncryptionConfigurationResponse (..),
+    newDescribeDefaultEncryptionConfigurationResponse,
+
+    -- * Response Lenses
+    describeDefaultEncryptionConfigurationResponse_kmsKeyArn,
+    describeDefaultEncryptionConfigurationResponse_httpStatus,
+    describeDefaultEncryptionConfigurationResponse_encryptionType,
+    describeDefaultEncryptionConfigurationResponse_configurationStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.IoTSiteWise.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newDescribeDefaultEncryptionConfiguration' smart constructor.
+data DescribeDefaultEncryptionConfiguration = DescribeDefaultEncryptionConfiguration'
+  {
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DescribeDefaultEncryptionConfiguration' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+newDescribeDefaultEncryptionConfiguration ::
+  DescribeDefaultEncryptionConfiguration
+newDescribeDefaultEncryptionConfiguration =
+  DescribeDefaultEncryptionConfiguration'
+
+instance
+  Core.AWSRequest
+    DescribeDefaultEncryptionConfiguration
+  where
+  type
+    AWSResponse
+      DescribeDefaultEncryptionConfiguration =
+      DescribeDefaultEncryptionConfigurationResponse
+  request overrides =
+    Request.get (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          DescribeDefaultEncryptionConfigurationResponse'
+            Prelude.<$> (x Data..?> "kmsKeyArn")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+            Prelude.<*> (x Data..:> "encryptionType")
+            Prelude.<*> (x Data..:> "configurationStatus")
+      )
+
+instance
+  Prelude.Hashable
+    DescribeDefaultEncryptionConfiguration
+  where
+  hashWithSalt _salt _ =
+    _salt `Prelude.hashWithSalt` ()
+
+instance
+  Prelude.NFData
+    DescribeDefaultEncryptionConfiguration
+  where
+  rnf _ = ()
+
+instance
+  Data.ToHeaders
+    DescribeDefaultEncryptionConfiguration
+  where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance
+  Data.ToPath
+    DescribeDefaultEncryptionConfiguration
+  where
+  toPath =
+    Prelude.const "/configuration/account/encryption"
+
+instance
+  Data.ToQuery
+    DescribeDefaultEncryptionConfiguration
+  where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newDescribeDefaultEncryptionConfigurationResponse' smart constructor.
+data DescribeDefaultEncryptionConfigurationResponse = DescribeDefaultEncryptionConfigurationResponse'
+  { -- | The key ARN of the customer managed key used for KMS encryption if you
+    -- use @KMS_BASED_ENCRYPTION@.
+    kmsKeyArn :: Prelude.Maybe Prelude.Text,
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int,
+    -- | The type of encryption used for the encryption configuration.
+    encryptionType :: EncryptionType,
+    -- | The status of the account configuration. This contains the
+    -- @ConfigurationState@. If there\'s an error, it also contains the
+    -- @ErrorDetails@.
+    configurationStatus :: ConfigurationStatus
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DescribeDefaultEncryptionConfigurationResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'kmsKeyArn', 'describeDefaultEncryptionConfigurationResponse_kmsKeyArn' - The key ARN of the customer managed key used for KMS encryption if you
+-- use @KMS_BASED_ENCRYPTION@.
+--
+-- 'httpStatus', 'describeDefaultEncryptionConfigurationResponse_httpStatus' - The response's http status code.
+--
+-- 'encryptionType', 'describeDefaultEncryptionConfigurationResponse_encryptionType' - The type of encryption used for the encryption configuration.
+--
+-- 'configurationStatus', 'describeDefaultEncryptionConfigurationResponse_configurationStatus' - The status of the account configuration. This contains the
+-- @ConfigurationState@. If there\'s an error, it also contains the
+-- @ErrorDetails@.
+newDescribeDefaultEncryptionConfigurationResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  -- | 'encryptionType'
+  EncryptionType ->
+  -- | 'configurationStatus'
+  ConfigurationStatus ->
+  DescribeDefaultEncryptionConfigurationResponse
+newDescribeDefaultEncryptionConfigurationResponse
+  pHttpStatus_
+  pEncryptionType_
+  pConfigurationStatus_ =
+    DescribeDefaultEncryptionConfigurationResponse'
+      { kmsKeyArn =
+          Prelude.Nothing,
+        httpStatus = pHttpStatus_,
+        encryptionType =
+          pEncryptionType_,
+        configurationStatus =
+          pConfigurationStatus_
+      }
+
+-- | The key ARN of the customer managed key used for KMS encryption if you
+-- use @KMS_BASED_ENCRYPTION@.
+describeDefaultEncryptionConfigurationResponse_kmsKeyArn :: Lens.Lens' DescribeDefaultEncryptionConfigurationResponse (Prelude.Maybe Prelude.Text)
+describeDefaultEncryptionConfigurationResponse_kmsKeyArn = Lens.lens (\DescribeDefaultEncryptionConfigurationResponse' {kmsKeyArn} -> kmsKeyArn) (\s@DescribeDefaultEncryptionConfigurationResponse' {} a -> s {kmsKeyArn = a} :: DescribeDefaultEncryptionConfigurationResponse)
+
+-- | The response's http status code.
+describeDefaultEncryptionConfigurationResponse_httpStatus :: Lens.Lens' DescribeDefaultEncryptionConfigurationResponse Prelude.Int
+describeDefaultEncryptionConfigurationResponse_httpStatus = Lens.lens (\DescribeDefaultEncryptionConfigurationResponse' {httpStatus} -> httpStatus) (\s@DescribeDefaultEncryptionConfigurationResponse' {} a -> s {httpStatus = a} :: DescribeDefaultEncryptionConfigurationResponse)
+
+-- | The type of encryption used for the encryption configuration.
+describeDefaultEncryptionConfigurationResponse_encryptionType :: Lens.Lens' DescribeDefaultEncryptionConfigurationResponse EncryptionType
+describeDefaultEncryptionConfigurationResponse_encryptionType = Lens.lens (\DescribeDefaultEncryptionConfigurationResponse' {encryptionType} -> encryptionType) (\s@DescribeDefaultEncryptionConfigurationResponse' {} a -> s {encryptionType = a} :: DescribeDefaultEncryptionConfigurationResponse)
+
+-- | The status of the account configuration. This contains the
+-- @ConfigurationState@. If there\'s an error, it also contains the
+-- @ErrorDetails@.
+describeDefaultEncryptionConfigurationResponse_configurationStatus :: Lens.Lens' DescribeDefaultEncryptionConfigurationResponse ConfigurationStatus
+describeDefaultEncryptionConfigurationResponse_configurationStatus = Lens.lens (\DescribeDefaultEncryptionConfigurationResponse' {configurationStatus} -> configurationStatus) (\s@DescribeDefaultEncryptionConfigurationResponse' {} a -> s {configurationStatus = a} :: DescribeDefaultEncryptionConfigurationResponse)
+
+instance
+  Prelude.NFData
+    DescribeDefaultEncryptionConfigurationResponse
+  where
+  rnf
+    DescribeDefaultEncryptionConfigurationResponse' {..} =
+      Prelude.rnf kmsKeyArn
+        `Prelude.seq` Prelude.rnf httpStatus
+        `Prelude.seq` Prelude.rnf encryptionType
+        `Prelude.seq` Prelude.rnf configurationStatus
diff --git a/gen/Amazonka/IoTSiteWise/DescribeGateway.hs b/gen/Amazonka/IoTSiteWise/DescribeGateway.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/IoTSiteWise/DescribeGateway.hs
@@ -0,0 +1,272 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.IoTSiteWise.DescribeGateway
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Retrieves information about a gateway.
+module Amazonka.IoTSiteWise.DescribeGateway
+  ( -- * Creating a Request
+    DescribeGateway (..),
+    newDescribeGateway,
+
+    -- * Request Lenses
+    describeGateway_gatewayId,
+
+    -- * Destructuring the Response
+    DescribeGatewayResponse (..),
+    newDescribeGatewayResponse,
+
+    -- * Response Lenses
+    describeGatewayResponse_gatewayPlatform,
+    describeGatewayResponse_httpStatus,
+    describeGatewayResponse_gatewayId,
+    describeGatewayResponse_gatewayName,
+    describeGatewayResponse_gatewayArn,
+    describeGatewayResponse_gatewayCapabilitySummaries,
+    describeGatewayResponse_creationDate,
+    describeGatewayResponse_lastUpdateDate,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.IoTSiteWise.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newDescribeGateway' smart constructor.
+data DescribeGateway = DescribeGateway'
+  { -- | The ID of the gateway device.
+    gatewayId :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DescribeGateway' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'gatewayId', 'describeGateway_gatewayId' - The ID of the gateway device.
+newDescribeGateway ::
+  -- | 'gatewayId'
+  Prelude.Text ->
+  DescribeGateway
+newDescribeGateway pGatewayId_ =
+  DescribeGateway' {gatewayId = pGatewayId_}
+
+-- | The ID of the gateway device.
+describeGateway_gatewayId :: Lens.Lens' DescribeGateway Prelude.Text
+describeGateway_gatewayId = Lens.lens (\DescribeGateway' {gatewayId} -> gatewayId) (\s@DescribeGateway' {} a -> s {gatewayId = a} :: DescribeGateway)
+
+instance Core.AWSRequest DescribeGateway where
+  type
+    AWSResponse DescribeGateway =
+      DescribeGatewayResponse
+  request overrides =
+    Request.get (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          DescribeGatewayResponse'
+            Prelude.<$> (x Data..?> "gatewayPlatform")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+            Prelude.<*> (x Data..:> "gatewayId")
+            Prelude.<*> (x Data..:> "gatewayName")
+            Prelude.<*> (x Data..:> "gatewayArn")
+            Prelude.<*> ( x
+                            Data..?> "gatewayCapabilitySummaries"
+                            Core..!@ Prelude.mempty
+                        )
+            Prelude.<*> (x Data..:> "creationDate")
+            Prelude.<*> (x Data..:> "lastUpdateDate")
+      )
+
+instance Prelude.Hashable DescribeGateway where
+  hashWithSalt _salt DescribeGateway' {..} =
+    _salt `Prelude.hashWithSalt` gatewayId
+
+instance Prelude.NFData DescribeGateway where
+  rnf DescribeGateway' {..} = Prelude.rnf gatewayId
+
+instance Data.ToHeaders DescribeGateway where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToPath DescribeGateway where
+  toPath DescribeGateway' {..} =
+    Prelude.mconcat
+      ["/20200301/gateways/", Data.toBS gatewayId]
+
+instance Data.ToQuery DescribeGateway where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newDescribeGatewayResponse' smart constructor.
+data DescribeGatewayResponse = DescribeGatewayResponse'
+  { -- | The gateway\'s platform.
+    gatewayPlatform :: Prelude.Maybe GatewayPlatform,
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int,
+    -- | The ID of the gateway device.
+    gatewayId :: Prelude.Text,
+    -- | The name of the gateway.
+    gatewayName :: Prelude.Text,
+    -- | The
+    -- <https://docs.aws.amazon.com/general/latest/gr/aws-arns-and-namespaces.html ARN>
+    -- of the gateway, which has the following format.
+    --
+    -- @arn:${Partition}:iotsitewise:${Region}:${Account}:gateway\/${GatewayId}@
+    gatewayArn :: Prelude.Text,
+    -- | A list of gateway capability summaries that each contain a namespace and
+    -- status. Each gateway capability defines data sources for the gateway. To
+    -- retrieve a capability configuration\'s definition, use
+    -- <https://docs.aws.amazon.com/iot-sitewise/latest/APIReference/API_DescribeGatewayCapabilityConfiguration.html DescribeGatewayCapabilityConfiguration>.
+    gatewayCapabilitySummaries :: [GatewayCapabilitySummary],
+    -- | The date the gateway was created, in Unix epoch time.
+    creationDate :: Data.POSIX,
+    -- | The date the gateway was last updated, in Unix epoch time.
+    lastUpdateDate :: Data.POSIX
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DescribeGatewayResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'gatewayPlatform', 'describeGatewayResponse_gatewayPlatform' - The gateway\'s platform.
+--
+-- 'httpStatus', 'describeGatewayResponse_httpStatus' - The response's http status code.
+--
+-- 'gatewayId', 'describeGatewayResponse_gatewayId' - The ID of the gateway device.
+--
+-- 'gatewayName', 'describeGatewayResponse_gatewayName' - The name of the gateway.
+--
+-- 'gatewayArn', 'describeGatewayResponse_gatewayArn' - The
+-- <https://docs.aws.amazon.com/general/latest/gr/aws-arns-and-namespaces.html ARN>
+-- of the gateway, which has the following format.
+--
+-- @arn:${Partition}:iotsitewise:${Region}:${Account}:gateway\/${GatewayId}@
+--
+-- 'gatewayCapabilitySummaries', 'describeGatewayResponse_gatewayCapabilitySummaries' - A list of gateway capability summaries that each contain a namespace and
+-- status. Each gateway capability defines data sources for the gateway. To
+-- retrieve a capability configuration\'s definition, use
+-- <https://docs.aws.amazon.com/iot-sitewise/latest/APIReference/API_DescribeGatewayCapabilityConfiguration.html DescribeGatewayCapabilityConfiguration>.
+--
+-- 'creationDate', 'describeGatewayResponse_creationDate' - The date the gateway was created, in Unix epoch time.
+--
+-- 'lastUpdateDate', 'describeGatewayResponse_lastUpdateDate' - The date the gateway was last updated, in Unix epoch time.
+newDescribeGatewayResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  -- | 'gatewayId'
+  Prelude.Text ->
+  -- | 'gatewayName'
+  Prelude.Text ->
+  -- | 'gatewayArn'
+  Prelude.Text ->
+  -- | 'creationDate'
+  Prelude.UTCTime ->
+  -- | 'lastUpdateDate'
+  Prelude.UTCTime ->
+  DescribeGatewayResponse
+newDescribeGatewayResponse
+  pHttpStatus_
+  pGatewayId_
+  pGatewayName_
+  pGatewayArn_
+  pCreationDate_
+  pLastUpdateDate_ =
+    DescribeGatewayResponse'
+      { gatewayPlatform =
+          Prelude.Nothing,
+        httpStatus = pHttpStatus_,
+        gatewayId = pGatewayId_,
+        gatewayName = pGatewayName_,
+        gatewayArn = pGatewayArn_,
+        gatewayCapabilitySummaries = Prelude.mempty,
+        creationDate = Data._Time Lens.# pCreationDate_,
+        lastUpdateDate =
+          Data._Time Lens.# pLastUpdateDate_
+      }
+
+-- | The gateway\'s platform.
+describeGatewayResponse_gatewayPlatform :: Lens.Lens' DescribeGatewayResponse (Prelude.Maybe GatewayPlatform)
+describeGatewayResponse_gatewayPlatform = Lens.lens (\DescribeGatewayResponse' {gatewayPlatform} -> gatewayPlatform) (\s@DescribeGatewayResponse' {} a -> s {gatewayPlatform = a} :: DescribeGatewayResponse)
+
+-- | The response's http status code.
+describeGatewayResponse_httpStatus :: Lens.Lens' DescribeGatewayResponse Prelude.Int
+describeGatewayResponse_httpStatus = Lens.lens (\DescribeGatewayResponse' {httpStatus} -> httpStatus) (\s@DescribeGatewayResponse' {} a -> s {httpStatus = a} :: DescribeGatewayResponse)
+
+-- | The ID of the gateway device.
+describeGatewayResponse_gatewayId :: Lens.Lens' DescribeGatewayResponse Prelude.Text
+describeGatewayResponse_gatewayId = Lens.lens (\DescribeGatewayResponse' {gatewayId} -> gatewayId) (\s@DescribeGatewayResponse' {} a -> s {gatewayId = a} :: DescribeGatewayResponse)
+
+-- | The name of the gateway.
+describeGatewayResponse_gatewayName :: Lens.Lens' DescribeGatewayResponse Prelude.Text
+describeGatewayResponse_gatewayName = Lens.lens (\DescribeGatewayResponse' {gatewayName} -> gatewayName) (\s@DescribeGatewayResponse' {} a -> s {gatewayName = a} :: DescribeGatewayResponse)
+
+-- | The
+-- <https://docs.aws.amazon.com/general/latest/gr/aws-arns-and-namespaces.html ARN>
+-- of the gateway, which has the following format.
+--
+-- @arn:${Partition}:iotsitewise:${Region}:${Account}:gateway\/${GatewayId}@
+describeGatewayResponse_gatewayArn :: Lens.Lens' DescribeGatewayResponse Prelude.Text
+describeGatewayResponse_gatewayArn = Lens.lens (\DescribeGatewayResponse' {gatewayArn} -> gatewayArn) (\s@DescribeGatewayResponse' {} a -> s {gatewayArn = a} :: DescribeGatewayResponse)
+
+-- | A list of gateway capability summaries that each contain a namespace and
+-- status. Each gateway capability defines data sources for the gateway. To
+-- retrieve a capability configuration\'s definition, use
+-- <https://docs.aws.amazon.com/iot-sitewise/latest/APIReference/API_DescribeGatewayCapabilityConfiguration.html DescribeGatewayCapabilityConfiguration>.
+describeGatewayResponse_gatewayCapabilitySummaries :: Lens.Lens' DescribeGatewayResponse [GatewayCapabilitySummary]
+describeGatewayResponse_gatewayCapabilitySummaries = Lens.lens (\DescribeGatewayResponse' {gatewayCapabilitySummaries} -> gatewayCapabilitySummaries) (\s@DescribeGatewayResponse' {} a -> s {gatewayCapabilitySummaries = a} :: DescribeGatewayResponse) Prelude.. Lens.coerced
+
+-- | The date the gateway was created, in Unix epoch time.
+describeGatewayResponse_creationDate :: Lens.Lens' DescribeGatewayResponse Prelude.UTCTime
+describeGatewayResponse_creationDate = Lens.lens (\DescribeGatewayResponse' {creationDate} -> creationDate) (\s@DescribeGatewayResponse' {} a -> s {creationDate = a} :: DescribeGatewayResponse) Prelude.. Data._Time
+
+-- | The date the gateway was last updated, in Unix epoch time.
+describeGatewayResponse_lastUpdateDate :: Lens.Lens' DescribeGatewayResponse Prelude.UTCTime
+describeGatewayResponse_lastUpdateDate = Lens.lens (\DescribeGatewayResponse' {lastUpdateDate} -> lastUpdateDate) (\s@DescribeGatewayResponse' {} a -> s {lastUpdateDate = a} :: DescribeGatewayResponse) Prelude.. Data._Time
+
+instance Prelude.NFData DescribeGatewayResponse where
+  rnf DescribeGatewayResponse' {..} =
+    Prelude.rnf gatewayPlatform
+      `Prelude.seq` Prelude.rnf httpStatus
+      `Prelude.seq` Prelude.rnf gatewayId
+      `Prelude.seq` Prelude.rnf gatewayName
+      `Prelude.seq` Prelude.rnf gatewayArn
+      `Prelude.seq` Prelude.rnf gatewayCapabilitySummaries
+      `Prelude.seq` Prelude.rnf creationDate
+      `Prelude.seq` Prelude.rnf lastUpdateDate
diff --git a/gen/Amazonka/IoTSiteWise/DescribeGatewayCapabilityConfiguration.hs b/gen/Amazonka/IoTSiteWise/DescribeGatewayCapabilityConfiguration.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/IoTSiteWise/DescribeGatewayCapabilityConfiguration.hs
@@ -0,0 +1,313 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.IoTSiteWise.DescribeGatewayCapabilityConfiguration
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Retrieves information about a gateway capability configuration. Each
+-- gateway capability defines data sources for a gateway. A capability
+-- configuration can contain multiple data source configurations. If you
+-- define OPC-UA sources for a gateway in the IoT SiteWise console, all of
+-- your OPC-UA sources are stored in one capability configuration. To list
+-- all capability configurations for a gateway, use
+-- <https://docs.aws.amazon.com/iot-sitewise/latest/APIReference/API_DescribeGateway.html DescribeGateway>.
+module Amazonka.IoTSiteWise.DescribeGatewayCapabilityConfiguration
+  ( -- * Creating a Request
+    DescribeGatewayCapabilityConfiguration (..),
+    newDescribeGatewayCapabilityConfiguration,
+
+    -- * Request Lenses
+    describeGatewayCapabilityConfiguration_gatewayId,
+    describeGatewayCapabilityConfiguration_capabilityNamespace,
+
+    -- * Destructuring the Response
+    DescribeGatewayCapabilityConfigurationResponse (..),
+    newDescribeGatewayCapabilityConfigurationResponse,
+
+    -- * Response Lenses
+    describeGatewayCapabilityConfigurationResponse_httpStatus,
+    describeGatewayCapabilityConfigurationResponse_gatewayId,
+    describeGatewayCapabilityConfigurationResponse_capabilityNamespace,
+    describeGatewayCapabilityConfigurationResponse_capabilityConfiguration,
+    describeGatewayCapabilityConfigurationResponse_capabilitySyncStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.IoTSiteWise.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newDescribeGatewayCapabilityConfiguration' smart constructor.
+data DescribeGatewayCapabilityConfiguration = DescribeGatewayCapabilityConfiguration'
+  { -- | The ID of the gateway that defines the capability configuration.
+    gatewayId :: Prelude.Text,
+    -- | The namespace of the capability configuration. For example, if you
+    -- configure OPC-UA sources from the IoT SiteWise console, your OPC-UA
+    -- capability configuration has the namespace
+    -- @iotsitewise:opcuacollector:version@, where @version@ is a number such
+    -- as @1@.
+    capabilityNamespace :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DescribeGatewayCapabilityConfiguration' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'gatewayId', 'describeGatewayCapabilityConfiguration_gatewayId' - The ID of the gateway that defines the capability configuration.
+--
+-- 'capabilityNamespace', 'describeGatewayCapabilityConfiguration_capabilityNamespace' - The namespace of the capability configuration. For example, if you
+-- configure OPC-UA sources from the IoT SiteWise console, your OPC-UA
+-- capability configuration has the namespace
+-- @iotsitewise:opcuacollector:version@, where @version@ is a number such
+-- as @1@.
+newDescribeGatewayCapabilityConfiguration ::
+  -- | 'gatewayId'
+  Prelude.Text ->
+  -- | 'capabilityNamespace'
+  Prelude.Text ->
+  DescribeGatewayCapabilityConfiguration
+newDescribeGatewayCapabilityConfiguration
+  pGatewayId_
+  pCapabilityNamespace_ =
+    DescribeGatewayCapabilityConfiguration'
+      { gatewayId =
+          pGatewayId_,
+        capabilityNamespace =
+          pCapabilityNamespace_
+      }
+
+-- | The ID of the gateway that defines the capability configuration.
+describeGatewayCapabilityConfiguration_gatewayId :: Lens.Lens' DescribeGatewayCapabilityConfiguration Prelude.Text
+describeGatewayCapabilityConfiguration_gatewayId = Lens.lens (\DescribeGatewayCapabilityConfiguration' {gatewayId} -> gatewayId) (\s@DescribeGatewayCapabilityConfiguration' {} a -> s {gatewayId = a} :: DescribeGatewayCapabilityConfiguration)
+
+-- | The namespace of the capability configuration. For example, if you
+-- configure OPC-UA sources from the IoT SiteWise console, your OPC-UA
+-- capability configuration has the namespace
+-- @iotsitewise:opcuacollector:version@, where @version@ is a number such
+-- as @1@.
+describeGatewayCapabilityConfiguration_capabilityNamespace :: Lens.Lens' DescribeGatewayCapabilityConfiguration Prelude.Text
+describeGatewayCapabilityConfiguration_capabilityNamespace = Lens.lens (\DescribeGatewayCapabilityConfiguration' {capabilityNamespace} -> capabilityNamespace) (\s@DescribeGatewayCapabilityConfiguration' {} a -> s {capabilityNamespace = a} :: DescribeGatewayCapabilityConfiguration)
+
+instance
+  Core.AWSRequest
+    DescribeGatewayCapabilityConfiguration
+  where
+  type
+    AWSResponse
+      DescribeGatewayCapabilityConfiguration =
+      DescribeGatewayCapabilityConfigurationResponse
+  request overrides =
+    Request.get (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          DescribeGatewayCapabilityConfigurationResponse'
+            Prelude.<$> (Prelude.pure (Prelude.fromEnum s))
+            Prelude.<*> (x Data..:> "gatewayId")
+            Prelude.<*> (x Data..:> "capabilityNamespace")
+            Prelude.<*> (x Data..:> "capabilityConfiguration")
+            Prelude.<*> (x Data..:> "capabilitySyncStatus")
+      )
+
+instance
+  Prelude.Hashable
+    DescribeGatewayCapabilityConfiguration
+  where
+  hashWithSalt
+    _salt
+    DescribeGatewayCapabilityConfiguration' {..} =
+      _salt
+        `Prelude.hashWithSalt` gatewayId
+        `Prelude.hashWithSalt` capabilityNamespace
+
+instance
+  Prelude.NFData
+    DescribeGatewayCapabilityConfiguration
+  where
+  rnf DescribeGatewayCapabilityConfiguration' {..} =
+    Prelude.rnf gatewayId
+      `Prelude.seq` Prelude.rnf capabilityNamespace
+
+instance
+  Data.ToHeaders
+    DescribeGatewayCapabilityConfiguration
+  where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance
+  Data.ToPath
+    DescribeGatewayCapabilityConfiguration
+  where
+  toPath DescribeGatewayCapabilityConfiguration' {..} =
+    Prelude.mconcat
+      [ "/20200301/gateways/",
+        Data.toBS gatewayId,
+        "/capability/",
+        Data.toBS capabilityNamespace
+      ]
+
+instance
+  Data.ToQuery
+    DescribeGatewayCapabilityConfiguration
+  where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newDescribeGatewayCapabilityConfigurationResponse' smart constructor.
+data DescribeGatewayCapabilityConfigurationResponse = DescribeGatewayCapabilityConfigurationResponse'
+  { -- | The response's http status code.
+    httpStatus :: Prelude.Int,
+    -- | The ID of the gateway that defines the capability configuration.
+    gatewayId :: Prelude.Text,
+    -- | The namespace of the gateway capability.
+    capabilityNamespace :: Prelude.Text,
+    -- | The JSON document that defines the gateway capability\'s configuration.
+    -- For more information, see
+    -- <https://docs.aws.amazon.com/iot-sitewise/latest/userguide/configure-sources.html#configure-source-cli Configuring data sources (CLI)>
+    -- in the /IoT SiteWise User Guide/.
+    capabilityConfiguration :: Prelude.Text,
+    -- | The synchronization status of the capability configuration. The sync
+    -- status can be one of the following:
+    --
+    -- -   @IN_SYNC@ – The gateway is running the capability configuration.
+    --
+    -- -   @OUT_OF_SYNC@ – The gateway hasn\'t received the capability
+    --     configuration.
+    --
+    -- -   @SYNC_FAILED@ – The gateway rejected the capability configuration.
+    capabilitySyncStatus :: CapabilitySyncStatus
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DescribeGatewayCapabilityConfigurationResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'httpStatus', 'describeGatewayCapabilityConfigurationResponse_httpStatus' - The response's http status code.
+--
+-- 'gatewayId', 'describeGatewayCapabilityConfigurationResponse_gatewayId' - The ID of the gateway that defines the capability configuration.
+--
+-- 'capabilityNamespace', 'describeGatewayCapabilityConfigurationResponse_capabilityNamespace' - The namespace of the gateway capability.
+--
+-- 'capabilityConfiguration', 'describeGatewayCapabilityConfigurationResponse_capabilityConfiguration' - The JSON document that defines the gateway capability\'s configuration.
+-- For more information, see
+-- <https://docs.aws.amazon.com/iot-sitewise/latest/userguide/configure-sources.html#configure-source-cli Configuring data sources (CLI)>
+-- in the /IoT SiteWise User Guide/.
+--
+-- 'capabilitySyncStatus', 'describeGatewayCapabilityConfigurationResponse_capabilitySyncStatus' - The synchronization status of the capability configuration. The sync
+-- status can be one of the following:
+--
+-- -   @IN_SYNC@ – The gateway is running the capability configuration.
+--
+-- -   @OUT_OF_SYNC@ – The gateway hasn\'t received the capability
+--     configuration.
+--
+-- -   @SYNC_FAILED@ – The gateway rejected the capability configuration.
+newDescribeGatewayCapabilityConfigurationResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  -- | 'gatewayId'
+  Prelude.Text ->
+  -- | 'capabilityNamespace'
+  Prelude.Text ->
+  -- | 'capabilityConfiguration'
+  Prelude.Text ->
+  -- | 'capabilitySyncStatus'
+  CapabilitySyncStatus ->
+  DescribeGatewayCapabilityConfigurationResponse
+newDescribeGatewayCapabilityConfigurationResponse
+  pHttpStatus_
+  pGatewayId_
+  pCapabilityNamespace_
+  pCapabilityConfiguration_
+  pCapabilitySyncStatus_ =
+    DescribeGatewayCapabilityConfigurationResponse'
+      { httpStatus =
+          pHttpStatus_,
+        gatewayId = pGatewayId_,
+        capabilityNamespace =
+          pCapabilityNamespace_,
+        capabilityConfiguration =
+          pCapabilityConfiguration_,
+        capabilitySyncStatus =
+          pCapabilitySyncStatus_
+      }
+
+-- | The response's http status code.
+describeGatewayCapabilityConfigurationResponse_httpStatus :: Lens.Lens' DescribeGatewayCapabilityConfigurationResponse Prelude.Int
+describeGatewayCapabilityConfigurationResponse_httpStatus = Lens.lens (\DescribeGatewayCapabilityConfigurationResponse' {httpStatus} -> httpStatus) (\s@DescribeGatewayCapabilityConfigurationResponse' {} a -> s {httpStatus = a} :: DescribeGatewayCapabilityConfigurationResponse)
+
+-- | The ID of the gateway that defines the capability configuration.
+describeGatewayCapabilityConfigurationResponse_gatewayId :: Lens.Lens' DescribeGatewayCapabilityConfigurationResponse Prelude.Text
+describeGatewayCapabilityConfigurationResponse_gatewayId = Lens.lens (\DescribeGatewayCapabilityConfigurationResponse' {gatewayId} -> gatewayId) (\s@DescribeGatewayCapabilityConfigurationResponse' {} a -> s {gatewayId = a} :: DescribeGatewayCapabilityConfigurationResponse)
+
+-- | The namespace of the gateway capability.
+describeGatewayCapabilityConfigurationResponse_capabilityNamespace :: Lens.Lens' DescribeGatewayCapabilityConfigurationResponse Prelude.Text
+describeGatewayCapabilityConfigurationResponse_capabilityNamespace = Lens.lens (\DescribeGatewayCapabilityConfigurationResponse' {capabilityNamespace} -> capabilityNamespace) (\s@DescribeGatewayCapabilityConfigurationResponse' {} a -> s {capabilityNamespace = a} :: DescribeGatewayCapabilityConfigurationResponse)
+
+-- | The JSON document that defines the gateway capability\'s configuration.
+-- For more information, see
+-- <https://docs.aws.amazon.com/iot-sitewise/latest/userguide/configure-sources.html#configure-source-cli Configuring data sources (CLI)>
+-- in the /IoT SiteWise User Guide/.
+describeGatewayCapabilityConfigurationResponse_capabilityConfiguration :: Lens.Lens' DescribeGatewayCapabilityConfigurationResponse Prelude.Text
+describeGatewayCapabilityConfigurationResponse_capabilityConfiguration = Lens.lens (\DescribeGatewayCapabilityConfigurationResponse' {capabilityConfiguration} -> capabilityConfiguration) (\s@DescribeGatewayCapabilityConfigurationResponse' {} a -> s {capabilityConfiguration = a} :: DescribeGatewayCapabilityConfigurationResponse)
+
+-- | The synchronization status of the capability configuration. The sync
+-- status can be one of the following:
+--
+-- -   @IN_SYNC@ – The gateway is running the capability configuration.
+--
+-- -   @OUT_OF_SYNC@ – The gateway hasn\'t received the capability
+--     configuration.
+--
+-- -   @SYNC_FAILED@ – The gateway rejected the capability configuration.
+describeGatewayCapabilityConfigurationResponse_capabilitySyncStatus :: Lens.Lens' DescribeGatewayCapabilityConfigurationResponse CapabilitySyncStatus
+describeGatewayCapabilityConfigurationResponse_capabilitySyncStatus = Lens.lens (\DescribeGatewayCapabilityConfigurationResponse' {capabilitySyncStatus} -> capabilitySyncStatus) (\s@DescribeGatewayCapabilityConfigurationResponse' {} a -> s {capabilitySyncStatus = a} :: DescribeGatewayCapabilityConfigurationResponse)
+
+instance
+  Prelude.NFData
+    DescribeGatewayCapabilityConfigurationResponse
+  where
+  rnf
+    DescribeGatewayCapabilityConfigurationResponse' {..} =
+      Prelude.rnf httpStatus
+        `Prelude.seq` Prelude.rnf gatewayId
+        `Prelude.seq` Prelude.rnf capabilityNamespace
+        `Prelude.seq` Prelude.rnf capabilityConfiguration
+        `Prelude.seq` Prelude.rnf capabilitySyncStatus
diff --git a/gen/Amazonka/IoTSiteWise/DescribeLoggingOptions.hs b/gen/Amazonka/IoTSiteWise/DescribeLoggingOptions.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/IoTSiteWise/DescribeLoggingOptions.hs
@@ -0,0 +1,148 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.IoTSiteWise.DescribeLoggingOptions
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Retrieves the current IoT SiteWise logging options.
+module Amazonka.IoTSiteWise.DescribeLoggingOptions
+  ( -- * Creating a Request
+    DescribeLoggingOptions (..),
+    newDescribeLoggingOptions,
+
+    -- * Destructuring the Response
+    DescribeLoggingOptionsResponse (..),
+    newDescribeLoggingOptionsResponse,
+
+    -- * Response Lenses
+    describeLoggingOptionsResponse_httpStatus,
+    describeLoggingOptionsResponse_loggingOptions,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.IoTSiteWise.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newDescribeLoggingOptions' smart constructor.
+data DescribeLoggingOptions = DescribeLoggingOptions'
+  {
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DescribeLoggingOptions' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+newDescribeLoggingOptions ::
+  DescribeLoggingOptions
+newDescribeLoggingOptions = DescribeLoggingOptions'
+
+instance Core.AWSRequest DescribeLoggingOptions where
+  type
+    AWSResponse DescribeLoggingOptions =
+      DescribeLoggingOptionsResponse
+  request overrides =
+    Request.get (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          DescribeLoggingOptionsResponse'
+            Prelude.<$> (Prelude.pure (Prelude.fromEnum s))
+            Prelude.<*> (x Data..:> "loggingOptions")
+      )
+
+instance Prelude.Hashable DescribeLoggingOptions where
+  hashWithSalt _salt _ =
+    _salt `Prelude.hashWithSalt` ()
+
+instance Prelude.NFData DescribeLoggingOptions where
+  rnf _ = ()
+
+instance Data.ToHeaders DescribeLoggingOptions where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToPath DescribeLoggingOptions where
+  toPath = Prelude.const "/logging"
+
+instance Data.ToQuery DescribeLoggingOptions where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newDescribeLoggingOptionsResponse' smart constructor.
+data DescribeLoggingOptionsResponse = DescribeLoggingOptionsResponse'
+  { -- | The response's http status code.
+    httpStatus :: Prelude.Int,
+    -- | The current logging options.
+    loggingOptions :: LoggingOptions
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DescribeLoggingOptionsResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'httpStatus', 'describeLoggingOptionsResponse_httpStatus' - The response's http status code.
+--
+-- 'loggingOptions', 'describeLoggingOptionsResponse_loggingOptions' - The current logging options.
+newDescribeLoggingOptionsResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  -- | 'loggingOptions'
+  LoggingOptions ->
+  DescribeLoggingOptionsResponse
+newDescribeLoggingOptionsResponse
+  pHttpStatus_
+  pLoggingOptions_ =
+    DescribeLoggingOptionsResponse'
+      { httpStatus =
+          pHttpStatus_,
+        loggingOptions = pLoggingOptions_
+      }
+
+-- | The response's http status code.
+describeLoggingOptionsResponse_httpStatus :: Lens.Lens' DescribeLoggingOptionsResponse Prelude.Int
+describeLoggingOptionsResponse_httpStatus = Lens.lens (\DescribeLoggingOptionsResponse' {httpStatus} -> httpStatus) (\s@DescribeLoggingOptionsResponse' {} a -> s {httpStatus = a} :: DescribeLoggingOptionsResponse)
+
+-- | The current logging options.
+describeLoggingOptionsResponse_loggingOptions :: Lens.Lens' DescribeLoggingOptionsResponse LoggingOptions
+describeLoggingOptionsResponse_loggingOptions = Lens.lens (\DescribeLoggingOptionsResponse' {loggingOptions} -> loggingOptions) (\s@DescribeLoggingOptionsResponse' {} a -> s {loggingOptions = a} :: DescribeLoggingOptionsResponse)
+
+instance
+  Prelude.NFData
+    DescribeLoggingOptionsResponse
+  where
+  rnf DescribeLoggingOptionsResponse' {..} =
+    Prelude.rnf httpStatus
+      `Prelude.seq` Prelude.rnf loggingOptions
diff --git a/gen/Amazonka/IoTSiteWise/DescribePortal.hs b/gen/Amazonka/IoTSiteWise/DescribePortal.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/IoTSiteWise/DescribePortal.hs
@@ -0,0 +1,403 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.IoTSiteWise.DescribePortal
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Retrieves information about a portal.
+module Amazonka.IoTSiteWise.DescribePortal
+  ( -- * Creating a Request
+    DescribePortal (..),
+    newDescribePortal,
+
+    -- * Request Lenses
+    describePortal_portalId,
+
+    -- * Destructuring the Response
+    DescribePortalResponse (..),
+    newDescribePortalResponse,
+
+    -- * Response Lenses
+    describePortalResponse_alarms,
+    describePortalResponse_notificationSenderEmail,
+    describePortalResponse_portalAuthMode,
+    describePortalResponse_portalDescription,
+    describePortalResponse_portalLogoImageLocation,
+    describePortalResponse_roleArn,
+    describePortalResponse_httpStatus,
+    describePortalResponse_portalId,
+    describePortalResponse_portalArn,
+    describePortalResponse_portalName,
+    describePortalResponse_portalClientId,
+    describePortalResponse_portalStartUrl,
+    describePortalResponse_portalContactEmail,
+    describePortalResponse_portalStatus,
+    describePortalResponse_portalCreationDate,
+    describePortalResponse_portalLastUpdateDate,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.IoTSiteWise.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newDescribePortal' smart constructor.
+data DescribePortal = DescribePortal'
+  { -- | The ID of the portal.
+    portalId :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DescribePortal' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'portalId', 'describePortal_portalId' - The ID of the portal.
+newDescribePortal ::
+  -- | 'portalId'
+  Prelude.Text ->
+  DescribePortal
+newDescribePortal pPortalId_ =
+  DescribePortal' {portalId = pPortalId_}
+
+-- | The ID of the portal.
+describePortal_portalId :: Lens.Lens' DescribePortal Prelude.Text
+describePortal_portalId = Lens.lens (\DescribePortal' {portalId} -> portalId) (\s@DescribePortal' {} a -> s {portalId = a} :: DescribePortal)
+
+instance Core.AWSRequest DescribePortal where
+  type
+    AWSResponse DescribePortal =
+      DescribePortalResponse
+  request overrides =
+    Request.get (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          DescribePortalResponse'
+            Prelude.<$> (x Data..?> "alarms")
+            Prelude.<*> (x Data..?> "notificationSenderEmail")
+            Prelude.<*> (x Data..?> "portalAuthMode")
+            Prelude.<*> (x Data..?> "portalDescription")
+            Prelude.<*> (x Data..?> "portalLogoImageLocation")
+            Prelude.<*> (x Data..?> "roleArn")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+            Prelude.<*> (x Data..:> "portalId")
+            Prelude.<*> (x Data..:> "portalArn")
+            Prelude.<*> (x Data..:> "portalName")
+            Prelude.<*> (x Data..:> "portalClientId")
+            Prelude.<*> (x Data..:> "portalStartUrl")
+            Prelude.<*> (x Data..:> "portalContactEmail")
+            Prelude.<*> (x Data..:> "portalStatus")
+            Prelude.<*> (x Data..:> "portalCreationDate")
+            Prelude.<*> (x Data..:> "portalLastUpdateDate")
+      )
+
+instance Prelude.Hashable DescribePortal where
+  hashWithSalt _salt DescribePortal' {..} =
+    _salt `Prelude.hashWithSalt` portalId
+
+instance Prelude.NFData DescribePortal where
+  rnf DescribePortal' {..} = Prelude.rnf portalId
+
+instance Data.ToHeaders DescribePortal where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToPath DescribePortal where
+  toPath DescribePortal' {..} =
+    Prelude.mconcat ["/portals/", Data.toBS portalId]
+
+instance Data.ToQuery DescribePortal where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newDescribePortalResponse' smart constructor.
+data DescribePortalResponse = DescribePortalResponse'
+  { -- | Contains the configuration information of an alarm created in an IoT
+    -- SiteWise Monitor portal.
+    alarms :: Prelude.Maybe Alarms,
+    -- | The email address that sends alarm notifications.
+    notificationSenderEmail :: Prelude.Maybe Prelude.Text,
+    -- | The service to use to authenticate users to the portal.
+    portalAuthMode :: Prelude.Maybe AuthMode,
+    -- | The portal\'s description.
+    portalDescription :: Prelude.Maybe Prelude.Text,
+    -- | The portal\'s logo image, which is available at a URL.
+    portalLogoImageLocation :: Prelude.Maybe ImageLocation,
+    -- | The
+    -- <https://docs.aws.amazon.com/general/latest/gr/aws-arns-and-namespaces.html ARN>
+    -- of the service role that allows the portal\'s users to access your IoT
+    -- SiteWise resources on your behalf. For more information, see
+    -- <https://docs.aws.amazon.com/iot-sitewise/latest/userguide/monitor-service-role.html Using service roles for IoT SiteWise Monitor>
+    -- in the /IoT SiteWise User Guide/.
+    roleArn :: Prelude.Maybe Prelude.Text,
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int,
+    -- | The ID of the portal.
+    portalId :: Prelude.Text,
+    -- | The
+    -- <https://docs.aws.amazon.com/general/latest/gr/aws-arns-and-namespaces.html ARN>
+    -- of the portal, which has the following format.
+    --
+    -- @arn:${Partition}:iotsitewise:${Region}:${Account}:portal\/${PortalId}@
+    portalArn :: Prelude.Text,
+    -- | The name of the portal.
+    portalName :: Prelude.Text,
+    -- | The IAM Identity Center application generated client ID (used with IAM
+    -- Identity Center APIs). IoT SiteWise includes @portalClientId@ for only
+    -- portals that use IAM Identity Center to authenticate users.
+    portalClientId :: Prelude.Text,
+    -- | The URL for the IoT SiteWise Monitor portal. You can use this URL to
+    -- access portals that use IAM Identity Center for authentication. For
+    -- portals that use IAM for authentication, you must use the IoT SiteWise
+    -- console to get a URL that you can use to access the portal.
+    portalStartUrl :: Prelude.Text,
+    -- | The Amazon Web Services administrator\'s contact email address.
+    portalContactEmail :: Prelude.Text,
+    -- | The current status of the portal, which contains a state and any error
+    -- message.
+    portalStatus :: PortalStatus,
+    -- | The date the portal was created, in Unix epoch time.
+    portalCreationDate :: Data.POSIX,
+    -- | The date the portal was last updated, in Unix epoch time.
+    portalLastUpdateDate :: Data.POSIX
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DescribePortalResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'alarms', 'describePortalResponse_alarms' - Contains the configuration information of an alarm created in an IoT
+-- SiteWise Monitor portal.
+--
+-- 'notificationSenderEmail', 'describePortalResponse_notificationSenderEmail' - The email address that sends alarm notifications.
+--
+-- 'portalAuthMode', 'describePortalResponse_portalAuthMode' - The service to use to authenticate users to the portal.
+--
+-- 'portalDescription', 'describePortalResponse_portalDescription' - The portal\'s description.
+--
+-- 'portalLogoImageLocation', 'describePortalResponse_portalLogoImageLocation' - The portal\'s logo image, which is available at a URL.
+--
+-- 'roleArn', 'describePortalResponse_roleArn' - The
+-- <https://docs.aws.amazon.com/general/latest/gr/aws-arns-and-namespaces.html ARN>
+-- of the service role that allows the portal\'s users to access your IoT
+-- SiteWise resources on your behalf. For more information, see
+-- <https://docs.aws.amazon.com/iot-sitewise/latest/userguide/monitor-service-role.html Using service roles for IoT SiteWise Monitor>
+-- in the /IoT SiteWise User Guide/.
+--
+-- 'httpStatus', 'describePortalResponse_httpStatus' - The response's http status code.
+--
+-- 'portalId', 'describePortalResponse_portalId' - The ID of the portal.
+--
+-- 'portalArn', 'describePortalResponse_portalArn' - The
+-- <https://docs.aws.amazon.com/general/latest/gr/aws-arns-and-namespaces.html ARN>
+-- of the portal, which has the following format.
+--
+-- @arn:${Partition}:iotsitewise:${Region}:${Account}:portal\/${PortalId}@
+--
+-- 'portalName', 'describePortalResponse_portalName' - The name of the portal.
+--
+-- 'portalClientId', 'describePortalResponse_portalClientId' - The IAM Identity Center application generated client ID (used with IAM
+-- Identity Center APIs). IoT SiteWise includes @portalClientId@ for only
+-- portals that use IAM Identity Center to authenticate users.
+--
+-- 'portalStartUrl', 'describePortalResponse_portalStartUrl' - The URL for the IoT SiteWise Monitor portal. You can use this URL to
+-- access portals that use IAM Identity Center for authentication. For
+-- portals that use IAM for authentication, you must use the IoT SiteWise
+-- console to get a URL that you can use to access the portal.
+--
+-- 'portalContactEmail', 'describePortalResponse_portalContactEmail' - The Amazon Web Services administrator\'s contact email address.
+--
+-- 'portalStatus', 'describePortalResponse_portalStatus' - The current status of the portal, which contains a state and any error
+-- message.
+--
+-- 'portalCreationDate', 'describePortalResponse_portalCreationDate' - The date the portal was created, in Unix epoch time.
+--
+-- 'portalLastUpdateDate', 'describePortalResponse_portalLastUpdateDate' - The date the portal was last updated, in Unix epoch time.
+newDescribePortalResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  -- | 'portalId'
+  Prelude.Text ->
+  -- | 'portalArn'
+  Prelude.Text ->
+  -- | 'portalName'
+  Prelude.Text ->
+  -- | 'portalClientId'
+  Prelude.Text ->
+  -- | 'portalStartUrl'
+  Prelude.Text ->
+  -- | 'portalContactEmail'
+  Prelude.Text ->
+  -- | 'portalStatus'
+  PortalStatus ->
+  -- | 'portalCreationDate'
+  Prelude.UTCTime ->
+  -- | 'portalLastUpdateDate'
+  Prelude.UTCTime ->
+  DescribePortalResponse
+newDescribePortalResponse
+  pHttpStatus_
+  pPortalId_
+  pPortalArn_
+  pPortalName_
+  pPortalClientId_
+  pPortalStartUrl_
+  pPortalContactEmail_
+  pPortalStatus_
+  pPortalCreationDate_
+  pPortalLastUpdateDate_ =
+    DescribePortalResponse'
+      { alarms = Prelude.Nothing,
+        notificationSenderEmail = Prelude.Nothing,
+        portalAuthMode = Prelude.Nothing,
+        portalDescription = Prelude.Nothing,
+        portalLogoImageLocation = Prelude.Nothing,
+        roleArn = Prelude.Nothing,
+        httpStatus = pHttpStatus_,
+        portalId = pPortalId_,
+        portalArn = pPortalArn_,
+        portalName = pPortalName_,
+        portalClientId = pPortalClientId_,
+        portalStartUrl = pPortalStartUrl_,
+        portalContactEmail = pPortalContactEmail_,
+        portalStatus = pPortalStatus_,
+        portalCreationDate =
+          Data._Time Lens.# pPortalCreationDate_,
+        portalLastUpdateDate =
+          Data._Time Lens.# pPortalLastUpdateDate_
+      }
+
+-- | Contains the configuration information of an alarm created in an IoT
+-- SiteWise Monitor portal.
+describePortalResponse_alarms :: Lens.Lens' DescribePortalResponse (Prelude.Maybe Alarms)
+describePortalResponse_alarms = Lens.lens (\DescribePortalResponse' {alarms} -> alarms) (\s@DescribePortalResponse' {} a -> s {alarms = a} :: DescribePortalResponse)
+
+-- | The email address that sends alarm notifications.
+describePortalResponse_notificationSenderEmail :: Lens.Lens' DescribePortalResponse (Prelude.Maybe Prelude.Text)
+describePortalResponse_notificationSenderEmail = Lens.lens (\DescribePortalResponse' {notificationSenderEmail} -> notificationSenderEmail) (\s@DescribePortalResponse' {} a -> s {notificationSenderEmail = a} :: DescribePortalResponse)
+
+-- | The service to use to authenticate users to the portal.
+describePortalResponse_portalAuthMode :: Lens.Lens' DescribePortalResponse (Prelude.Maybe AuthMode)
+describePortalResponse_portalAuthMode = Lens.lens (\DescribePortalResponse' {portalAuthMode} -> portalAuthMode) (\s@DescribePortalResponse' {} a -> s {portalAuthMode = a} :: DescribePortalResponse)
+
+-- | The portal\'s description.
+describePortalResponse_portalDescription :: Lens.Lens' DescribePortalResponse (Prelude.Maybe Prelude.Text)
+describePortalResponse_portalDescription = Lens.lens (\DescribePortalResponse' {portalDescription} -> portalDescription) (\s@DescribePortalResponse' {} a -> s {portalDescription = a} :: DescribePortalResponse)
+
+-- | The portal\'s logo image, which is available at a URL.
+describePortalResponse_portalLogoImageLocation :: Lens.Lens' DescribePortalResponse (Prelude.Maybe ImageLocation)
+describePortalResponse_portalLogoImageLocation = Lens.lens (\DescribePortalResponse' {portalLogoImageLocation} -> portalLogoImageLocation) (\s@DescribePortalResponse' {} a -> s {portalLogoImageLocation = a} :: DescribePortalResponse)
+
+-- | The
+-- <https://docs.aws.amazon.com/general/latest/gr/aws-arns-and-namespaces.html ARN>
+-- of the service role that allows the portal\'s users to access your IoT
+-- SiteWise resources on your behalf. For more information, see
+-- <https://docs.aws.amazon.com/iot-sitewise/latest/userguide/monitor-service-role.html Using service roles for IoT SiteWise Monitor>
+-- in the /IoT SiteWise User Guide/.
+describePortalResponse_roleArn :: Lens.Lens' DescribePortalResponse (Prelude.Maybe Prelude.Text)
+describePortalResponse_roleArn = Lens.lens (\DescribePortalResponse' {roleArn} -> roleArn) (\s@DescribePortalResponse' {} a -> s {roleArn = a} :: DescribePortalResponse)
+
+-- | The response's http status code.
+describePortalResponse_httpStatus :: Lens.Lens' DescribePortalResponse Prelude.Int
+describePortalResponse_httpStatus = Lens.lens (\DescribePortalResponse' {httpStatus} -> httpStatus) (\s@DescribePortalResponse' {} a -> s {httpStatus = a} :: DescribePortalResponse)
+
+-- | The ID of the portal.
+describePortalResponse_portalId :: Lens.Lens' DescribePortalResponse Prelude.Text
+describePortalResponse_portalId = Lens.lens (\DescribePortalResponse' {portalId} -> portalId) (\s@DescribePortalResponse' {} a -> s {portalId = a} :: DescribePortalResponse)
+
+-- | The
+-- <https://docs.aws.amazon.com/general/latest/gr/aws-arns-and-namespaces.html ARN>
+-- of the portal, which has the following format.
+--
+-- @arn:${Partition}:iotsitewise:${Region}:${Account}:portal\/${PortalId}@
+describePortalResponse_portalArn :: Lens.Lens' DescribePortalResponse Prelude.Text
+describePortalResponse_portalArn = Lens.lens (\DescribePortalResponse' {portalArn} -> portalArn) (\s@DescribePortalResponse' {} a -> s {portalArn = a} :: DescribePortalResponse)
+
+-- | The name of the portal.
+describePortalResponse_portalName :: Lens.Lens' DescribePortalResponse Prelude.Text
+describePortalResponse_portalName = Lens.lens (\DescribePortalResponse' {portalName} -> portalName) (\s@DescribePortalResponse' {} a -> s {portalName = a} :: DescribePortalResponse)
+
+-- | The IAM Identity Center application generated client ID (used with IAM
+-- Identity Center APIs). IoT SiteWise includes @portalClientId@ for only
+-- portals that use IAM Identity Center to authenticate users.
+describePortalResponse_portalClientId :: Lens.Lens' DescribePortalResponse Prelude.Text
+describePortalResponse_portalClientId = Lens.lens (\DescribePortalResponse' {portalClientId} -> portalClientId) (\s@DescribePortalResponse' {} a -> s {portalClientId = a} :: DescribePortalResponse)
+
+-- | The URL for the IoT SiteWise Monitor portal. You can use this URL to
+-- access portals that use IAM Identity Center for authentication. For
+-- portals that use IAM for authentication, you must use the IoT SiteWise
+-- console to get a URL that you can use to access the portal.
+describePortalResponse_portalStartUrl :: Lens.Lens' DescribePortalResponse Prelude.Text
+describePortalResponse_portalStartUrl = Lens.lens (\DescribePortalResponse' {portalStartUrl} -> portalStartUrl) (\s@DescribePortalResponse' {} a -> s {portalStartUrl = a} :: DescribePortalResponse)
+
+-- | The Amazon Web Services administrator\'s contact email address.
+describePortalResponse_portalContactEmail :: Lens.Lens' DescribePortalResponse Prelude.Text
+describePortalResponse_portalContactEmail = Lens.lens (\DescribePortalResponse' {portalContactEmail} -> portalContactEmail) (\s@DescribePortalResponse' {} a -> s {portalContactEmail = a} :: DescribePortalResponse)
+
+-- | The current status of the portal, which contains a state and any error
+-- message.
+describePortalResponse_portalStatus :: Lens.Lens' DescribePortalResponse PortalStatus
+describePortalResponse_portalStatus = Lens.lens (\DescribePortalResponse' {portalStatus} -> portalStatus) (\s@DescribePortalResponse' {} a -> s {portalStatus = a} :: DescribePortalResponse)
+
+-- | The date the portal was created, in Unix epoch time.
+describePortalResponse_portalCreationDate :: Lens.Lens' DescribePortalResponse Prelude.UTCTime
+describePortalResponse_portalCreationDate = Lens.lens (\DescribePortalResponse' {portalCreationDate} -> portalCreationDate) (\s@DescribePortalResponse' {} a -> s {portalCreationDate = a} :: DescribePortalResponse) Prelude.. Data._Time
+
+-- | The date the portal was last updated, in Unix epoch time.
+describePortalResponse_portalLastUpdateDate :: Lens.Lens' DescribePortalResponse Prelude.UTCTime
+describePortalResponse_portalLastUpdateDate = Lens.lens (\DescribePortalResponse' {portalLastUpdateDate} -> portalLastUpdateDate) (\s@DescribePortalResponse' {} a -> s {portalLastUpdateDate = a} :: DescribePortalResponse) Prelude.. Data._Time
+
+instance Prelude.NFData DescribePortalResponse where
+  rnf DescribePortalResponse' {..} =
+    Prelude.rnf alarms
+      `Prelude.seq` Prelude.rnf notificationSenderEmail
+      `Prelude.seq` Prelude.rnf portalAuthMode
+      `Prelude.seq` Prelude.rnf portalDescription
+      `Prelude.seq` Prelude.rnf portalLogoImageLocation
+      `Prelude.seq` Prelude.rnf roleArn
+      `Prelude.seq` Prelude.rnf httpStatus
+      `Prelude.seq` Prelude.rnf portalId
+      `Prelude.seq` Prelude.rnf portalArn
+      `Prelude.seq` Prelude.rnf portalName
+      `Prelude.seq` Prelude.rnf portalClientId
+      `Prelude.seq` Prelude.rnf portalStartUrl
+      `Prelude.seq` Prelude.rnf portalContactEmail
+      `Prelude.seq` Prelude.rnf portalStatus
+      `Prelude.seq` Prelude.rnf portalCreationDate
+      `Prelude.seq` Prelude.rnf portalLastUpdateDate
diff --git a/gen/Amazonka/IoTSiteWise/DescribeProject.hs b/gen/Amazonka/IoTSiteWise/DescribeProject.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/IoTSiteWise/DescribeProject.hs
@@ -0,0 +1,263 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.IoTSiteWise.DescribeProject
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Retrieves information about a project.
+module Amazonka.IoTSiteWise.DescribeProject
+  ( -- * Creating a Request
+    DescribeProject (..),
+    newDescribeProject,
+
+    -- * Request Lenses
+    describeProject_projectId,
+
+    -- * Destructuring the Response
+    DescribeProjectResponse (..),
+    newDescribeProjectResponse,
+
+    -- * Response Lenses
+    describeProjectResponse_projectDescription,
+    describeProjectResponse_httpStatus,
+    describeProjectResponse_projectId,
+    describeProjectResponse_projectArn,
+    describeProjectResponse_projectName,
+    describeProjectResponse_portalId,
+    describeProjectResponse_projectCreationDate,
+    describeProjectResponse_projectLastUpdateDate,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.IoTSiteWise.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newDescribeProject' smart constructor.
+data DescribeProject = DescribeProject'
+  { -- | The ID of the project.
+    projectId :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DescribeProject' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'projectId', 'describeProject_projectId' - The ID of the project.
+newDescribeProject ::
+  -- | 'projectId'
+  Prelude.Text ->
+  DescribeProject
+newDescribeProject pProjectId_ =
+  DescribeProject' {projectId = pProjectId_}
+
+-- | The ID of the project.
+describeProject_projectId :: Lens.Lens' DescribeProject Prelude.Text
+describeProject_projectId = Lens.lens (\DescribeProject' {projectId} -> projectId) (\s@DescribeProject' {} a -> s {projectId = a} :: DescribeProject)
+
+instance Core.AWSRequest DescribeProject where
+  type
+    AWSResponse DescribeProject =
+      DescribeProjectResponse
+  request overrides =
+    Request.get (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          DescribeProjectResponse'
+            Prelude.<$> (x Data..?> "projectDescription")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+            Prelude.<*> (x Data..:> "projectId")
+            Prelude.<*> (x Data..:> "projectArn")
+            Prelude.<*> (x Data..:> "projectName")
+            Prelude.<*> (x Data..:> "portalId")
+            Prelude.<*> (x Data..:> "projectCreationDate")
+            Prelude.<*> (x Data..:> "projectLastUpdateDate")
+      )
+
+instance Prelude.Hashable DescribeProject where
+  hashWithSalt _salt DescribeProject' {..} =
+    _salt `Prelude.hashWithSalt` projectId
+
+instance Prelude.NFData DescribeProject where
+  rnf DescribeProject' {..} = Prelude.rnf projectId
+
+instance Data.ToHeaders DescribeProject where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToPath DescribeProject where
+  toPath DescribeProject' {..} =
+    Prelude.mconcat ["/projects/", Data.toBS projectId]
+
+instance Data.ToQuery DescribeProject where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newDescribeProjectResponse' smart constructor.
+data DescribeProjectResponse = DescribeProjectResponse'
+  { -- | The project\'s description.
+    projectDescription :: Prelude.Maybe Prelude.Text,
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int,
+    -- | The ID of the project.
+    projectId :: Prelude.Text,
+    -- | The
+    -- <https://docs.aws.amazon.com/general/latest/gr/aws-arns-and-namespaces.html ARN>
+    -- of the project, which has the following format.
+    --
+    -- @arn:${Partition}:iotsitewise:${Region}:${Account}:project\/${ProjectId}@
+    projectArn :: Prelude.Text,
+    -- | The name of the project.
+    projectName :: Prelude.Text,
+    -- | The ID of the portal that the project is in.
+    portalId :: Prelude.Text,
+    -- | The date the project was created, in Unix epoch time.
+    projectCreationDate :: Data.POSIX,
+    -- | The date the project was last updated, in Unix epoch time.
+    projectLastUpdateDate :: Data.POSIX
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DescribeProjectResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'projectDescription', 'describeProjectResponse_projectDescription' - The project\'s description.
+--
+-- 'httpStatus', 'describeProjectResponse_httpStatus' - The response's http status code.
+--
+-- 'projectId', 'describeProjectResponse_projectId' - The ID of the project.
+--
+-- 'projectArn', 'describeProjectResponse_projectArn' - The
+-- <https://docs.aws.amazon.com/general/latest/gr/aws-arns-and-namespaces.html ARN>
+-- of the project, which has the following format.
+--
+-- @arn:${Partition}:iotsitewise:${Region}:${Account}:project\/${ProjectId}@
+--
+-- 'projectName', 'describeProjectResponse_projectName' - The name of the project.
+--
+-- 'portalId', 'describeProjectResponse_portalId' - The ID of the portal that the project is in.
+--
+-- 'projectCreationDate', 'describeProjectResponse_projectCreationDate' - The date the project was created, in Unix epoch time.
+--
+-- 'projectLastUpdateDate', 'describeProjectResponse_projectLastUpdateDate' - The date the project was last updated, in Unix epoch time.
+newDescribeProjectResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  -- | 'projectId'
+  Prelude.Text ->
+  -- | 'projectArn'
+  Prelude.Text ->
+  -- | 'projectName'
+  Prelude.Text ->
+  -- | 'portalId'
+  Prelude.Text ->
+  -- | 'projectCreationDate'
+  Prelude.UTCTime ->
+  -- | 'projectLastUpdateDate'
+  Prelude.UTCTime ->
+  DescribeProjectResponse
+newDescribeProjectResponse
+  pHttpStatus_
+  pProjectId_
+  pProjectArn_
+  pProjectName_
+  pPortalId_
+  pProjectCreationDate_
+  pProjectLastUpdateDate_ =
+    DescribeProjectResponse'
+      { projectDescription =
+          Prelude.Nothing,
+        httpStatus = pHttpStatus_,
+        projectId = pProjectId_,
+        projectArn = pProjectArn_,
+        projectName = pProjectName_,
+        portalId = pPortalId_,
+        projectCreationDate =
+          Data._Time Lens.# pProjectCreationDate_,
+        projectLastUpdateDate =
+          Data._Time Lens.# pProjectLastUpdateDate_
+      }
+
+-- | The project\'s description.
+describeProjectResponse_projectDescription :: Lens.Lens' DescribeProjectResponse (Prelude.Maybe Prelude.Text)
+describeProjectResponse_projectDescription = Lens.lens (\DescribeProjectResponse' {projectDescription} -> projectDescription) (\s@DescribeProjectResponse' {} a -> s {projectDescription = a} :: DescribeProjectResponse)
+
+-- | The response's http status code.
+describeProjectResponse_httpStatus :: Lens.Lens' DescribeProjectResponse Prelude.Int
+describeProjectResponse_httpStatus = Lens.lens (\DescribeProjectResponse' {httpStatus} -> httpStatus) (\s@DescribeProjectResponse' {} a -> s {httpStatus = a} :: DescribeProjectResponse)
+
+-- | The ID of the project.
+describeProjectResponse_projectId :: Lens.Lens' DescribeProjectResponse Prelude.Text
+describeProjectResponse_projectId = Lens.lens (\DescribeProjectResponse' {projectId} -> projectId) (\s@DescribeProjectResponse' {} a -> s {projectId = a} :: DescribeProjectResponse)
+
+-- | The
+-- <https://docs.aws.amazon.com/general/latest/gr/aws-arns-and-namespaces.html ARN>
+-- of the project, which has the following format.
+--
+-- @arn:${Partition}:iotsitewise:${Region}:${Account}:project\/${ProjectId}@
+describeProjectResponse_projectArn :: Lens.Lens' DescribeProjectResponse Prelude.Text
+describeProjectResponse_projectArn = Lens.lens (\DescribeProjectResponse' {projectArn} -> projectArn) (\s@DescribeProjectResponse' {} a -> s {projectArn = a} :: DescribeProjectResponse)
+
+-- | The name of the project.
+describeProjectResponse_projectName :: Lens.Lens' DescribeProjectResponse Prelude.Text
+describeProjectResponse_projectName = Lens.lens (\DescribeProjectResponse' {projectName} -> projectName) (\s@DescribeProjectResponse' {} a -> s {projectName = a} :: DescribeProjectResponse)
+
+-- | The ID of the portal that the project is in.
+describeProjectResponse_portalId :: Lens.Lens' DescribeProjectResponse Prelude.Text
+describeProjectResponse_portalId = Lens.lens (\DescribeProjectResponse' {portalId} -> portalId) (\s@DescribeProjectResponse' {} a -> s {portalId = a} :: DescribeProjectResponse)
+
+-- | The date the project was created, in Unix epoch time.
+describeProjectResponse_projectCreationDate :: Lens.Lens' DescribeProjectResponse Prelude.UTCTime
+describeProjectResponse_projectCreationDate = Lens.lens (\DescribeProjectResponse' {projectCreationDate} -> projectCreationDate) (\s@DescribeProjectResponse' {} a -> s {projectCreationDate = a} :: DescribeProjectResponse) Prelude.. Data._Time
+
+-- | The date the project was last updated, in Unix epoch time.
+describeProjectResponse_projectLastUpdateDate :: Lens.Lens' DescribeProjectResponse Prelude.UTCTime
+describeProjectResponse_projectLastUpdateDate = Lens.lens (\DescribeProjectResponse' {projectLastUpdateDate} -> projectLastUpdateDate) (\s@DescribeProjectResponse' {} a -> s {projectLastUpdateDate = a} :: DescribeProjectResponse) Prelude.. Data._Time
+
+instance Prelude.NFData DescribeProjectResponse where
+  rnf DescribeProjectResponse' {..} =
+    Prelude.rnf projectDescription
+      `Prelude.seq` Prelude.rnf httpStatus
+      `Prelude.seq` Prelude.rnf projectId
+      `Prelude.seq` Prelude.rnf projectArn
+      `Prelude.seq` Prelude.rnf projectName
+      `Prelude.seq` Prelude.rnf portalId
+      `Prelude.seq` Prelude.rnf projectCreationDate
+      `Prelude.seq` Prelude.rnf projectLastUpdateDate
diff --git a/gen/Amazonka/IoTSiteWise/DescribeStorageConfiguration.hs b/gen/Amazonka/IoTSiteWise/DescribeStorageConfiguration.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/IoTSiteWise/DescribeStorageConfiguration.hs
@@ -0,0 +1,288 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.IoTSiteWise.DescribeStorageConfiguration
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Retrieves information about the storage configuration for IoT SiteWise.
+module Amazonka.IoTSiteWise.DescribeStorageConfiguration
+  ( -- * Creating a Request
+    DescribeStorageConfiguration (..),
+    newDescribeStorageConfiguration,
+
+    -- * Destructuring the Response
+    DescribeStorageConfigurationResponse (..),
+    newDescribeStorageConfigurationResponse,
+
+    -- * Response Lenses
+    describeStorageConfigurationResponse_disassociatedDataStorage,
+    describeStorageConfigurationResponse_lastUpdateDate,
+    describeStorageConfigurationResponse_multiLayerStorage,
+    describeStorageConfigurationResponse_retentionPeriod,
+    describeStorageConfigurationResponse_httpStatus,
+    describeStorageConfigurationResponse_storageType,
+    describeStorageConfigurationResponse_configurationStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.IoTSiteWise.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newDescribeStorageConfiguration' smart constructor.
+data DescribeStorageConfiguration = DescribeStorageConfiguration'
+  {
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DescribeStorageConfiguration' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+newDescribeStorageConfiguration ::
+  DescribeStorageConfiguration
+newDescribeStorageConfiguration =
+  DescribeStorageConfiguration'
+
+instance Core.AWSRequest DescribeStorageConfiguration where
+  type
+    AWSResponse DescribeStorageConfiguration =
+      DescribeStorageConfigurationResponse
+  request overrides =
+    Request.get (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          DescribeStorageConfigurationResponse'
+            Prelude.<$> (x Data..?> "disassociatedDataStorage")
+            Prelude.<*> (x Data..?> "lastUpdateDate")
+            Prelude.<*> (x Data..?> "multiLayerStorage")
+            Prelude.<*> (x Data..?> "retentionPeriod")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+            Prelude.<*> (x Data..:> "storageType")
+            Prelude.<*> (x Data..:> "configurationStatus")
+      )
+
+instance
+  Prelude.Hashable
+    DescribeStorageConfiguration
+  where
+  hashWithSalt _salt _ =
+    _salt `Prelude.hashWithSalt` ()
+
+instance Prelude.NFData DescribeStorageConfiguration where
+  rnf _ = ()
+
+instance Data.ToHeaders DescribeStorageConfiguration where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToPath DescribeStorageConfiguration where
+  toPath =
+    Prelude.const "/configuration/account/storage"
+
+instance Data.ToQuery DescribeStorageConfiguration where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newDescribeStorageConfigurationResponse' smart constructor.
+data DescribeStorageConfigurationResponse = DescribeStorageConfigurationResponse'
+  { -- | Contains the storage configuration for time series (data streams) that
+    -- aren\'t associated with asset properties. The @disassociatedDataStorage@
+    -- can be one of the following values:
+    --
+    -- -   @ENABLED@ – IoT SiteWise accepts time series that aren\'t associated
+    --     with asset properties.
+    --
+    --     After the @disassociatedDataStorage@ is enabled, you can\'t disable
+    --     it.
+    --
+    -- -   @DISABLED@ – IoT SiteWise doesn\'t accept time series (data streams)
+    --     that aren\'t associated with asset properties.
+    --
+    -- For more information, see
+    -- <https://docs.aws.amazon.com/iot-sitewise/latest/userguide/data-streams.html Data streams>
+    -- in the /IoT SiteWise User Guide/.
+    disassociatedDataStorage :: Prelude.Maybe DisassociatedDataStorageState,
+    -- | The date the storage configuration was last updated, in Unix epoch time.
+    lastUpdateDate :: Prelude.Maybe Data.POSIX,
+    -- | Contains information about the storage destination.
+    multiLayerStorage :: Prelude.Maybe MultiLayerStorage,
+    -- | How many days your data is kept in the hot tier. By default, your data
+    -- is kept indefinitely in the hot tier.
+    retentionPeriod :: Prelude.Maybe RetentionPeriod,
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int,
+    -- | The storage tier that you specified for your data. The @storageType@
+    -- parameter can be one of the following values:
+    --
+    -- -   @SITEWISE_DEFAULT_STORAGE@ – IoT SiteWise saves your data into the
+    --     hot tier. The hot tier is a service-managed database.
+    --
+    -- -   @MULTI_LAYER_STORAGE@ – IoT SiteWise saves your data in both the
+    --     cold tier and the hot tier. The cold tier is a customer-managed
+    --     Amazon S3 bucket.
+    storageType :: StorageType,
+    configurationStatus :: ConfigurationStatus
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DescribeStorageConfigurationResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'disassociatedDataStorage', 'describeStorageConfigurationResponse_disassociatedDataStorage' - Contains the storage configuration for time series (data streams) that
+-- aren\'t associated with asset properties. The @disassociatedDataStorage@
+-- can be one of the following values:
+--
+-- -   @ENABLED@ – IoT SiteWise accepts time series that aren\'t associated
+--     with asset properties.
+--
+--     After the @disassociatedDataStorage@ is enabled, you can\'t disable
+--     it.
+--
+-- -   @DISABLED@ – IoT SiteWise doesn\'t accept time series (data streams)
+--     that aren\'t associated with asset properties.
+--
+-- For more information, see
+-- <https://docs.aws.amazon.com/iot-sitewise/latest/userguide/data-streams.html Data streams>
+-- in the /IoT SiteWise User Guide/.
+--
+-- 'lastUpdateDate', 'describeStorageConfigurationResponse_lastUpdateDate' - The date the storage configuration was last updated, in Unix epoch time.
+--
+-- 'multiLayerStorage', 'describeStorageConfigurationResponse_multiLayerStorage' - Contains information about the storage destination.
+--
+-- 'retentionPeriod', 'describeStorageConfigurationResponse_retentionPeriod' - How many days your data is kept in the hot tier. By default, your data
+-- is kept indefinitely in the hot tier.
+--
+-- 'httpStatus', 'describeStorageConfigurationResponse_httpStatus' - The response's http status code.
+--
+-- 'storageType', 'describeStorageConfigurationResponse_storageType' - The storage tier that you specified for your data. The @storageType@
+-- parameter can be one of the following values:
+--
+-- -   @SITEWISE_DEFAULT_STORAGE@ – IoT SiteWise saves your data into the
+--     hot tier. The hot tier is a service-managed database.
+--
+-- -   @MULTI_LAYER_STORAGE@ – IoT SiteWise saves your data in both the
+--     cold tier and the hot tier. The cold tier is a customer-managed
+--     Amazon S3 bucket.
+--
+-- 'configurationStatus', 'describeStorageConfigurationResponse_configurationStatus' - Undocumented member.
+newDescribeStorageConfigurationResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  -- | 'storageType'
+  StorageType ->
+  -- | 'configurationStatus'
+  ConfigurationStatus ->
+  DescribeStorageConfigurationResponse
+newDescribeStorageConfigurationResponse
+  pHttpStatus_
+  pStorageType_
+  pConfigurationStatus_ =
+    DescribeStorageConfigurationResponse'
+      { disassociatedDataStorage =
+          Prelude.Nothing,
+        lastUpdateDate = Prelude.Nothing,
+        multiLayerStorage = Prelude.Nothing,
+        retentionPeriod = Prelude.Nothing,
+        httpStatus = pHttpStatus_,
+        storageType = pStorageType_,
+        configurationStatus =
+          pConfigurationStatus_
+      }
+
+-- | Contains the storage configuration for time series (data streams) that
+-- aren\'t associated with asset properties. The @disassociatedDataStorage@
+-- can be one of the following values:
+--
+-- -   @ENABLED@ – IoT SiteWise accepts time series that aren\'t associated
+--     with asset properties.
+--
+--     After the @disassociatedDataStorage@ is enabled, you can\'t disable
+--     it.
+--
+-- -   @DISABLED@ – IoT SiteWise doesn\'t accept time series (data streams)
+--     that aren\'t associated with asset properties.
+--
+-- For more information, see
+-- <https://docs.aws.amazon.com/iot-sitewise/latest/userguide/data-streams.html Data streams>
+-- in the /IoT SiteWise User Guide/.
+describeStorageConfigurationResponse_disassociatedDataStorage :: Lens.Lens' DescribeStorageConfigurationResponse (Prelude.Maybe DisassociatedDataStorageState)
+describeStorageConfigurationResponse_disassociatedDataStorage = Lens.lens (\DescribeStorageConfigurationResponse' {disassociatedDataStorage} -> disassociatedDataStorage) (\s@DescribeStorageConfigurationResponse' {} a -> s {disassociatedDataStorage = a} :: DescribeStorageConfigurationResponse)
+
+-- | The date the storage configuration was last updated, in Unix epoch time.
+describeStorageConfigurationResponse_lastUpdateDate :: Lens.Lens' DescribeStorageConfigurationResponse (Prelude.Maybe Prelude.UTCTime)
+describeStorageConfigurationResponse_lastUpdateDate = Lens.lens (\DescribeStorageConfigurationResponse' {lastUpdateDate} -> lastUpdateDate) (\s@DescribeStorageConfigurationResponse' {} a -> s {lastUpdateDate = a} :: DescribeStorageConfigurationResponse) Prelude.. Lens.mapping Data._Time
+
+-- | Contains information about the storage destination.
+describeStorageConfigurationResponse_multiLayerStorage :: Lens.Lens' DescribeStorageConfigurationResponse (Prelude.Maybe MultiLayerStorage)
+describeStorageConfigurationResponse_multiLayerStorage = Lens.lens (\DescribeStorageConfigurationResponse' {multiLayerStorage} -> multiLayerStorage) (\s@DescribeStorageConfigurationResponse' {} a -> s {multiLayerStorage = a} :: DescribeStorageConfigurationResponse)
+
+-- | How many days your data is kept in the hot tier. By default, your data
+-- is kept indefinitely in the hot tier.
+describeStorageConfigurationResponse_retentionPeriod :: Lens.Lens' DescribeStorageConfigurationResponse (Prelude.Maybe RetentionPeriod)
+describeStorageConfigurationResponse_retentionPeriod = Lens.lens (\DescribeStorageConfigurationResponse' {retentionPeriod} -> retentionPeriod) (\s@DescribeStorageConfigurationResponse' {} a -> s {retentionPeriod = a} :: DescribeStorageConfigurationResponse)
+
+-- | The response's http status code.
+describeStorageConfigurationResponse_httpStatus :: Lens.Lens' DescribeStorageConfigurationResponse Prelude.Int
+describeStorageConfigurationResponse_httpStatus = Lens.lens (\DescribeStorageConfigurationResponse' {httpStatus} -> httpStatus) (\s@DescribeStorageConfigurationResponse' {} a -> s {httpStatus = a} :: DescribeStorageConfigurationResponse)
+
+-- | The storage tier that you specified for your data. The @storageType@
+-- parameter can be one of the following values:
+--
+-- -   @SITEWISE_DEFAULT_STORAGE@ – IoT SiteWise saves your data into the
+--     hot tier. The hot tier is a service-managed database.
+--
+-- -   @MULTI_LAYER_STORAGE@ – IoT SiteWise saves your data in both the
+--     cold tier and the hot tier. The cold tier is a customer-managed
+--     Amazon S3 bucket.
+describeStorageConfigurationResponse_storageType :: Lens.Lens' DescribeStorageConfigurationResponse StorageType
+describeStorageConfigurationResponse_storageType = Lens.lens (\DescribeStorageConfigurationResponse' {storageType} -> storageType) (\s@DescribeStorageConfigurationResponse' {} a -> s {storageType = a} :: DescribeStorageConfigurationResponse)
+
+-- | Undocumented member.
+describeStorageConfigurationResponse_configurationStatus :: Lens.Lens' DescribeStorageConfigurationResponse ConfigurationStatus
+describeStorageConfigurationResponse_configurationStatus = Lens.lens (\DescribeStorageConfigurationResponse' {configurationStatus} -> configurationStatus) (\s@DescribeStorageConfigurationResponse' {} a -> s {configurationStatus = a} :: DescribeStorageConfigurationResponse)
+
+instance
+  Prelude.NFData
+    DescribeStorageConfigurationResponse
+  where
+  rnf DescribeStorageConfigurationResponse' {..} =
+    Prelude.rnf disassociatedDataStorage
+      `Prelude.seq` Prelude.rnf lastUpdateDate
+      `Prelude.seq` Prelude.rnf multiLayerStorage
+      `Prelude.seq` Prelude.rnf retentionPeriod
+      `Prelude.seq` Prelude.rnf httpStatus
+      `Prelude.seq` Prelude.rnf storageType
+      `Prelude.seq` Prelude.rnf configurationStatus
diff --git a/gen/Amazonka/IoTSiteWise/DescribeTimeSeries.hs b/gen/Amazonka/IoTSiteWise/DescribeTimeSeries.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/IoTSiteWise/DescribeTimeSeries.hs
@@ -0,0 +1,327 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.IoTSiteWise.DescribeTimeSeries
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Retrieves information about a time series (data stream).
+--
+-- To identify a time series, do one of the following:
+--
+-- -   If the time series isn\'t associated with an asset property, specify
+--     the @alias@ of the time series.
+--
+-- -   If the time series is associated with an asset property, specify one
+--     of the following:
+--
+--     -   The @alias@ of the time series.
+--
+--     -   The @assetId@ and @propertyId@ that identifies the asset
+--         property.
+module Amazonka.IoTSiteWise.DescribeTimeSeries
+  ( -- * Creating a Request
+    DescribeTimeSeries (..),
+    newDescribeTimeSeries,
+
+    -- * Request Lenses
+    describeTimeSeries_alias,
+    describeTimeSeries_assetId,
+    describeTimeSeries_propertyId,
+
+    -- * Destructuring the Response
+    DescribeTimeSeriesResponse (..),
+    newDescribeTimeSeriesResponse,
+
+    -- * Response Lenses
+    describeTimeSeriesResponse_alias,
+    describeTimeSeriesResponse_assetId,
+    describeTimeSeriesResponse_dataTypeSpec,
+    describeTimeSeriesResponse_propertyId,
+    describeTimeSeriesResponse_httpStatus,
+    describeTimeSeriesResponse_timeSeriesId,
+    describeTimeSeriesResponse_dataType,
+    describeTimeSeriesResponse_timeSeriesCreationDate,
+    describeTimeSeriesResponse_timeSeriesLastUpdateDate,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.IoTSiteWise.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newDescribeTimeSeries' smart constructor.
+data DescribeTimeSeries = DescribeTimeSeries'
+  { -- | The alias that identifies the time series.
+    alias :: Prelude.Maybe Prelude.Text,
+    -- | The ID of the asset in which the asset property was created.
+    assetId :: Prelude.Maybe Prelude.Text,
+    -- | The ID of the asset property.
+    propertyId :: Prelude.Maybe Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DescribeTimeSeries' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'alias', 'describeTimeSeries_alias' - The alias that identifies the time series.
+--
+-- 'assetId', 'describeTimeSeries_assetId' - The ID of the asset in which the asset property was created.
+--
+-- 'propertyId', 'describeTimeSeries_propertyId' - The ID of the asset property.
+newDescribeTimeSeries ::
+  DescribeTimeSeries
+newDescribeTimeSeries =
+  DescribeTimeSeries'
+    { alias = Prelude.Nothing,
+      assetId = Prelude.Nothing,
+      propertyId = Prelude.Nothing
+    }
+
+-- | The alias that identifies the time series.
+describeTimeSeries_alias :: Lens.Lens' DescribeTimeSeries (Prelude.Maybe Prelude.Text)
+describeTimeSeries_alias = Lens.lens (\DescribeTimeSeries' {alias} -> alias) (\s@DescribeTimeSeries' {} a -> s {alias = a} :: DescribeTimeSeries)
+
+-- | The ID of the asset in which the asset property was created.
+describeTimeSeries_assetId :: Lens.Lens' DescribeTimeSeries (Prelude.Maybe Prelude.Text)
+describeTimeSeries_assetId = Lens.lens (\DescribeTimeSeries' {assetId} -> assetId) (\s@DescribeTimeSeries' {} a -> s {assetId = a} :: DescribeTimeSeries)
+
+-- | The ID of the asset property.
+describeTimeSeries_propertyId :: Lens.Lens' DescribeTimeSeries (Prelude.Maybe Prelude.Text)
+describeTimeSeries_propertyId = Lens.lens (\DescribeTimeSeries' {propertyId} -> propertyId) (\s@DescribeTimeSeries' {} a -> s {propertyId = a} :: DescribeTimeSeries)
+
+instance Core.AWSRequest DescribeTimeSeries where
+  type
+    AWSResponse DescribeTimeSeries =
+      DescribeTimeSeriesResponse
+  request overrides =
+    Request.get (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          DescribeTimeSeriesResponse'
+            Prelude.<$> (x Data..?> "alias")
+            Prelude.<*> (x Data..?> "assetId")
+            Prelude.<*> (x Data..?> "dataTypeSpec")
+            Prelude.<*> (x Data..?> "propertyId")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+            Prelude.<*> (x Data..:> "timeSeriesId")
+            Prelude.<*> (x Data..:> "dataType")
+            Prelude.<*> (x Data..:> "timeSeriesCreationDate")
+            Prelude.<*> (x Data..:> "timeSeriesLastUpdateDate")
+      )
+
+instance Prelude.Hashable DescribeTimeSeries where
+  hashWithSalt _salt DescribeTimeSeries' {..} =
+    _salt
+      `Prelude.hashWithSalt` alias
+      `Prelude.hashWithSalt` assetId
+      `Prelude.hashWithSalt` propertyId
+
+instance Prelude.NFData DescribeTimeSeries where
+  rnf DescribeTimeSeries' {..} =
+    Prelude.rnf alias
+      `Prelude.seq` Prelude.rnf assetId
+      `Prelude.seq` Prelude.rnf propertyId
+
+instance Data.ToHeaders DescribeTimeSeries where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToPath DescribeTimeSeries where
+  toPath = Prelude.const "/timeseries/describe/"
+
+instance Data.ToQuery DescribeTimeSeries where
+  toQuery DescribeTimeSeries' {..} =
+    Prelude.mconcat
+      [ "alias" Data.=: alias,
+        "assetId" Data.=: assetId,
+        "propertyId" Data.=: propertyId
+      ]
+
+-- | /See:/ 'newDescribeTimeSeriesResponse' smart constructor.
+data DescribeTimeSeriesResponse = DescribeTimeSeriesResponse'
+  { -- | The alias that identifies the time series.
+    alias :: Prelude.Maybe Prelude.Text,
+    -- | The ID of the asset in which the asset property was created.
+    assetId :: Prelude.Maybe Prelude.Text,
+    -- | The data type of the structure for this time series. This parameter is
+    -- required for time series that have the @STRUCT@ data type.
+    --
+    -- The options for this parameter depend on the type of the composite model
+    -- in which you created the asset property that is associated with your
+    -- time series. Use @AWS\/ALARM_STATE@ for alarm state in alarm composite
+    -- models.
+    dataTypeSpec :: Prelude.Maybe Prelude.Text,
+    -- | The ID of the asset property.
+    propertyId :: Prelude.Maybe Prelude.Text,
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int,
+    -- | The ID of the time series.
+    timeSeriesId :: Prelude.Text,
+    -- | The data type of the time series.
+    --
+    -- If you specify @STRUCT@, you must also specify @dataTypeSpec@ to
+    -- identify the type of the structure for this time series.
+    dataType :: PropertyDataType,
+    -- | The date that the time series was created, in Unix epoch time.
+    timeSeriesCreationDate :: Data.POSIX,
+    -- | The date that the time series was last updated, in Unix epoch time.
+    timeSeriesLastUpdateDate :: Data.POSIX
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DescribeTimeSeriesResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'alias', 'describeTimeSeriesResponse_alias' - The alias that identifies the time series.
+--
+-- 'assetId', 'describeTimeSeriesResponse_assetId' - The ID of the asset in which the asset property was created.
+--
+-- 'dataTypeSpec', 'describeTimeSeriesResponse_dataTypeSpec' - The data type of the structure for this time series. This parameter is
+-- required for time series that have the @STRUCT@ data type.
+--
+-- The options for this parameter depend on the type of the composite model
+-- in which you created the asset property that is associated with your
+-- time series. Use @AWS\/ALARM_STATE@ for alarm state in alarm composite
+-- models.
+--
+-- 'propertyId', 'describeTimeSeriesResponse_propertyId' - The ID of the asset property.
+--
+-- 'httpStatus', 'describeTimeSeriesResponse_httpStatus' - The response's http status code.
+--
+-- 'timeSeriesId', 'describeTimeSeriesResponse_timeSeriesId' - The ID of the time series.
+--
+-- 'dataType', 'describeTimeSeriesResponse_dataType' - The data type of the time series.
+--
+-- If you specify @STRUCT@, you must also specify @dataTypeSpec@ to
+-- identify the type of the structure for this time series.
+--
+-- 'timeSeriesCreationDate', 'describeTimeSeriesResponse_timeSeriesCreationDate' - The date that the time series was created, in Unix epoch time.
+--
+-- 'timeSeriesLastUpdateDate', 'describeTimeSeriesResponse_timeSeriesLastUpdateDate' - The date that the time series was last updated, in Unix epoch time.
+newDescribeTimeSeriesResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  -- | 'timeSeriesId'
+  Prelude.Text ->
+  -- | 'dataType'
+  PropertyDataType ->
+  -- | 'timeSeriesCreationDate'
+  Prelude.UTCTime ->
+  -- | 'timeSeriesLastUpdateDate'
+  Prelude.UTCTime ->
+  DescribeTimeSeriesResponse
+newDescribeTimeSeriesResponse
+  pHttpStatus_
+  pTimeSeriesId_
+  pDataType_
+  pTimeSeriesCreationDate_
+  pTimeSeriesLastUpdateDate_ =
+    DescribeTimeSeriesResponse'
+      { alias =
+          Prelude.Nothing,
+        assetId = Prelude.Nothing,
+        dataTypeSpec = Prelude.Nothing,
+        propertyId = Prelude.Nothing,
+        httpStatus = pHttpStatus_,
+        timeSeriesId = pTimeSeriesId_,
+        dataType = pDataType_,
+        timeSeriesCreationDate =
+          Data._Time Lens.# pTimeSeriesCreationDate_,
+        timeSeriesLastUpdateDate =
+          Data._Time Lens.# pTimeSeriesLastUpdateDate_
+      }
+
+-- | The alias that identifies the time series.
+describeTimeSeriesResponse_alias :: Lens.Lens' DescribeTimeSeriesResponse (Prelude.Maybe Prelude.Text)
+describeTimeSeriesResponse_alias = Lens.lens (\DescribeTimeSeriesResponse' {alias} -> alias) (\s@DescribeTimeSeriesResponse' {} a -> s {alias = a} :: DescribeTimeSeriesResponse)
+
+-- | The ID of the asset in which the asset property was created.
+describeTimeSeriesResponse_assetId :: Lens.Lens' DescribeTimeSeriesResponse (Prelude.Maybe Prelude.Text)
+describeTimeSeriesResponse_assetId = Lens.lens (\DescribeTimeSeriesResponse' {assetId} -> assetId) (\s@DescribeTimeSeriesResponse' {} a -> s {assetId = a} :: DescribeTimeSeriesResponse)
+
+-- | The data type of the structure for this time series. This parameter is
+-- required for time series that have the @STRUCT@ data type.
+--
+-- The options for this parameter depend on the type of the composite model
+-- in which you created the asset property that is associated with your
+-- time series. Use @AWS\/ALARM_STATE@ for alarm state in alarm composite
+-- models.
+describeTimeSeriesResponse_dataTypeSpec :: Lens.Lens' DescribeTimeSeriesResponse (Prelude.Maybe Prelude.Text)
+describeTimeSeriesResponse_dataTypeSpec = Lens.lens (\DescribeTimeSeriesResponse' {dataTypeSpec} -> dataTypeSpec) (\s@DescribeTimeSeriesResponse' {} a -> s {dataTypeSpec = a} :: DescribeTimeSeriesResponse)
+
+-- | The ID of the asset property.
+describeTimeSeriesResponse_propertyId :: Lens.Lens' DescribeTimeSeriesResponse (Prelude.Maybe Prelude.Text)
+describeTimeSeriesResponse_propertyId = Lens.lens (\DescribeTimeSeriesResponse' {propertyId} -> propertyId) (\s@DescribeTimeSeriesResponse' {} a -> s {propertyId = a} :: DescribeTimeSeriesResponse)
+
+-- | The response's http status code.
+describeTimeSeriesResponse_httpStatus :: Lens.Lens' DescribeTimeSeriesResponse Prelude.Int
+describeTimeSeriesResponse_httpStatus = Lens.lens (\DescribeTimeSeriesResponse' {httpStatus} -> httpStatus) (\s@DescribeTimeSeriesResponse' {} a -> s {httpStatus = a} :: DescribeTimeSeriesResponse)
+
+-- | The ID of the time series.
+describeTimeSeriesResponse_timeSeriesId :: Lens.Lens' DescribeTimeSeriesResponse Prelude.Text
+describeTimeSeriesResponse_timeSeriesId = Lens.lens (\DescribeTimeSeriesResponse' {timeSeriesId} -> timeSeriesId) (\s@DescribeTimeSeriesResponse' {} a -> s {timeSeriesId = a} :: DescribeTimeSeriesResponse)
+
+-- | The data type of the time series.
+--
+-- If you specify @STRUCT@, you must also specify @dataTypeSpec@ to
+-- identify the type of the structure for this time series.
+describeTimeSeriesResponse_dataType :: Lens.Lens' DescribeTimeSeriesResponse PropertyDataType
+describeTimeSeriesResponse_dataType = Lens.lens (\DescribeTimeSeriesResponse' {dataType} -> dataType) (\s@DescribeTimeSeriesResponse' {} a -> s {dataType = a} :: DescribeTimeSeriesResponse)
+
+-- | The date that the time series was created, in Unix epoch time.
+describeTimeSeriesResponse_timeSeriesCreationDate :: Lens.Lens' DescribeTimeSeriesResponse Prelude.UTCTime
+describeTimeSeriesResponse_timeSeriesCreationDate = Lens.lens (\DescribeTimeSeriesResponse' {timeSeriesCreationDate} -> timeSeriesCreationDate) (\s@DescribeTimeSeriesResponse' {} a -> s {timeSeriesCreationDate = a} :: DescribeTimeSeriesResponse) Prelude.. Data._Time
+
+-- | The date that the time series was last updated, in Unix epoch time.
+describeTimeSeriesResponse_timeSeriesLastUpdateDate :: Lens.Lens' DescribeTimeSeriesResponse Prelude.UTCTime
+describeTimeSeriesResponse_timeSeriesLastUpdateDate = Lens.lens (\DescribeTimeSeriesResponse' {timeSeriesLastUpdateDate} -> timeSeriesLastUpdateDate) (\s@DescribeTimeSeriesResponse' {} a -> s {timeSeriesLastUpdateDate = a} :: DescribeTimeSeriesResponse) Prelude.. Data._Time
+
+instance Prelude.NFData DescribeTimeSeriesResponse where
+  rnf DescribeTimeSeriesResponse' {..} =
+    Prelude.rnf alias
+      `Prelude.seq` Prelude.rnf assetId
+      `Prelude.seq` Prelude.rnf dataTypeSpec
+      `Prelude.seq` Prelude.rnf propertyId
+      `Prelude.seq` Prelude.rnf httpStatus
+      `Prelude.seq` Prelude.rnf timeSeriesId
+      `Prelude.seq` Prelude.rnf dataType
+      `Prelude.seq` Prelude.rnf timeSeriesCreationDate
+      `Prelude.seq` Prelude.rnf timeSeriesLastUpdateDate
diff --git a/gen/Amazonka/IoTSiteWise/DisassociateAssets.hs b/gen/Amazonka/IoTSiteWise/DisassociateAssets.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/IoTSiteWise/DisassociateAssets.hs
@@ -0,0 +1,203 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.IoTSiteWise.DisassociateAssets
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Disassociates a child asset from the given parent asset through a
+-- hierarchy defined in the parent asset\'s model.
+module Amazonka.IoTSiteWise.DisassociateAssets
+  ( -- * Creating a Request
+    DisassociateAssets (..),
+    newDisassociateAssets,
+
+    -- * Request Lenses
+    disassociateAssets_clientToken,
+    disassociateAssets_assetId,
+    disassociateAssets_hierarchyId,
+    disassociateAssets_childAssetId,
+
+    -- * Destructuring the Response
+    DisassociateAssetsResponse (..),
+    newDisassociateAssetsResponse,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.IoTSiteWise.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newDisassociateAssets' smart constructor.
+data DisassociateAssets = DisassociateAssets'
+  { -- | A unique case-sensitive identifier that you can provide to ensure the
+    -- idempotency of the request. Don\'t reuse this client token if a new
+    -- idempotent request is required.
+    clientToken :: Prelude.Maybe Prelude.Text,
+    -- | The ID of the parent asset from which to disassociate the child asset.
+    assetId :: Prelude.Text,
+    -- | The ID of a hierarchy in the parent asset\'s model. Hierarchies allow
+    -- different groupings of assets to be formed that all come from the same
+    -- asset model. You can use the hierarchy ID to identify the correct asset
+    -- to disassociate. For more information, see
+    -- <https://docs.aws.amazon.com/iot-sitewise/latest/userguide/asset-hierarchies.html Asset hierarchies>
+    -- in the /IoT SiteWise User Guide/.
+    hierarchyId :: Prelude.Text,
+    -- | The ID of the child asset to disassociate.
+    childAssetId :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DisassociateAssets' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'clientToken', 'disassociateAssets_clientToken' - A unique case-sensitive identifier that you can provide to ensure the
+-- idempotency of the request. Don\'t reuse this client token if a new
+-- idempotent request is required.
+--
+-- 'assetId', 'disassociateAssets_assetId' - The ID of the parent asset from which to disassociate the child asset.
+--
+-- 'hierarchyId', 'disassociateAssets_hierarchyId' - The ID of a hierarchy in the parent asset\'s model. Hierarchies allow
+-- different groupings of assets to be formed that all come from the same
+-- asset model. You can use the hierarchy ID to identify the correct asset
+-- to disassociate. For more information, see
+-- <https://docs.aws.amazon.com/iot-sitewise/latest/userguide/asset-hierarchies.html Asset hierarchies>
+-- in the /IoT SiteWise User Guide/.
+--
+-- 'childAssetId', 'disassociateAssets_childAssetId' - The ID of the child asset to disassociate.
+newDisassociateAssets ::
+  -- | 'assetId'
+  Prelude.Text ->
+  -- | 'hierarchyId'
+  Prelude.Text ->
+  -- | 'childAssetId'
+  Prelude.Text ->
+  DisassociateAssets
+newDisassociateAssets
+  pAssetId_
+  pHierarchyId_
+  pChildAssetId_ =
+    DisassociateAssets'
+      { clientToken = Prelude.Nothing,
+        assetId = pAssetId_,
+        hierarchyId = pHierarchyId_,
+        childAssetId = pChildAssetId_
+      }
+
+-- | A unique case-sensitive identifier that you can provide to ensure the
+-- idempotency of the request. Don\'t reuse this client token if a new
+-- idempotent request is required.
+disassociateAssets_clientToken :: Lens.Lens' DisassociateAssets (Prelude.Maybe Prelude.Text)
+disassociateAssets_clientToken = Lens.lens (\DisassociateAssets' {clientToken} -> clientToken) (\s@DisassociateAssets' {} a -> s {clientToken = a} :: DisassociateAssets)
+
+-- | The ID of the parent asset from which to disassociate the child asset.
+disassociateAssets_assetId :: Lens.Lens' DisassociateAssets Prelude.Text
+disassociateAssets_assetId = Lens.lens (\DisassociateAssets' {assetId} -> assetId) (\s@DisassociateAssets' {} a -> s {assetId = a} :: DisassociateAssets)
+
+-- | The ID of a hierarchy in the parent asset\'s model. Hierarchies allow
+-- different groupings of assets to be formed that all come from the same
+-- asset model. You can use the hierarchy ID to identify the correct asset
+-- to disassociate. For more information, see
+-- <https://docs.aws.amazon.com/iot-sitewise/latest/userguide/asset-hierarchies.html Asset hierarchies>
+-- in the /IoT SiteWise User Guide/.
+disassociateAssets_hierarchyId :: Lens.Lens' DisassociateAssets Prelude.Text
+disassociateAssets_hierarchyId = Lens.lens (\DisassociateAssets' {hierarchyId} -> hierarchyId) (\s@DisassociateAssets' {} a -> s {hierarchyId = a} :: DisassociateAssets)
+
+-- | The ID of the child asset to disassociate.
+disassociateAssets_childAssetId :: Lens.Lens' DisassociateAssets Prelude.Text
+disassociateAssets_childAssetId = Lens.lens (\DisassociateAssets' {childAssetId} -> childAssetId) (\s@DisassociateAssets' {} a -> s {childAssetId = a} :: DisassociateAssets)
+
+instance Core.AWSRequest DisassociateAssets where
+  type
+    AWSResponse DisassociateAssets =
+      DisassociateAssetsResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveNull DisassociateAssetsResponse'
+
+instance Prelude.Hashable DisassociateAssets where
+  hashWithSalt _salt DisassociateAssets' {..} =
+    _salt
+      `Prelude.hashWithSalt` clientToken
+      `Prelude.hashWithSalt` assetId
+      `Prelude.hashWithSalt` hierarchyId
+      `Prelude.hashWithSalt` childAssetId
+
+instance Prelude.NFData DisassociateAssets where
+  rnf DisassociateAssets' {..} =
+    Prelude.rnf clientToken
+      `Prelude.seq` Prelude.rnf assetId
+      `Prelude.seq` Prelude.rnf hierarchyId
+      `Prelude.seq` Prelude.rnf childAssetId
+
+instance Data.ToHeaders DisassociateAssets where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON DisassociateAssets where
+  toJSON DisassociateAssets' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("clientToken" Data..=) Prelude.<$> clientToken,
+            Prelude.Just ("hierarchyId" Data..= hierarchyId),
+            Prelude.Just ("childAssetId" Data..= childAssetId)
+          ]
+      )
+
+instance Data.ToPath DisassociateAssets where
+  toPath DisassociateAssets' {..} =
+    Prelude.mconcat
+      ["/assets/", Data.toBS assetId, "/disassociate"]
+
+instance Data.ToQuery DisassociateAssets where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newDisassociateAssetsResponse' smart constructor.
+data DisassociateAssetsResponse = DisassociateAssetsResponse'
+  {
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DisassociateAssetsResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+newDisassociateAssetsResponse ::
+  DisassociateAssetsResponse
+newDisassociateAssetsResponse =
+  DisassociateAssetsResponse'
+
+instance Prelude.NFData DisassociateAssetsResponse where
+  rnf _ = ()
diff --git a/gen/Amazonka/IoTSiteWise/DisassociateTimeSeriesFromAssetProperty.hs b/gen/Amazonka/IoTSiteWise/DisassociateTimeSeriesFromAssetProperty.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/IoTSiteWise/DisassociateTimeSeriesFromAssetProperty.hs
@@ -0,0 +1,216 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.IoTSiteWise.DisassociateTimeSeriesFromAssetProperty
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Disassociates a time series (data stream) from an asset property.
+module Amazonka.IoTSiteWise.DisassociateTimeSeriesFromAssetProperty
+  ( -- * Creating a Request
+    DisassociateTimeSeriesFromAssetProperty (..),
+    newDisassociateTimeSeriesFromAssetProperty,
+
+    -- * Request Lenses
+    disassociateTimeSeriesFromAssetProperty_clientToken,
+    disassociateTimeSeriesFromAssetProperty_alias,
+    disassociateTimeSeriesFromAssetProperty_assetId,
+    disassociateTimeSeriesFromAssetProperty_propertyId,
+
+    -- * Destructuring the Response
+    DisassociateTimeSeriesFromAssetPropertyResponse (..),
+    newDisassociateTimeSeriesFromAssetPropertyResponse,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.IoTSiteWise.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newDisassociateTimeSeriesFromAssetProperty' smart constructor.
+data DisassociateTimeSeriesFromAssetProperty = DisassociateTimeSeriesFromAssetProperty'
+  { -- | A unique case-sensitive identifier that you can provide to ensure the
+    -- idempotency of the request. Don\'t reuse this client token if a new
+    -- idempotent request is required.
+    clientToken :: Prelude.Maybe Prelude.Text,
+    -- | The alias that identifies the time series.
+    alias :: Prelude.Text,
+    -- | The ID of the asset in which the asset property was created.
+    assetId :: Prelude.Text,
+    -- | The ID of the asset property.
+    propertyId :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DisassociateTimeSeriesFromAssetProperty' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'clientToken', 'disassociateTimeSeriesFromAssetProperty_clientToken' - A unique case-sensitive identifier that you can provide to ensure the
+-- idempotency of the request. Don\'t reuse this client token if a new
+-- idempotent request is required.
+--
+-- 'alias', 'disassociateTimeSeriesFromAssetProperty_alias' - The alias that identifies the time series.
+--
+-- 'assetId', 'disassociateTimeSeriesFromAssetProperty_assetId' - The ID of the asset in which the asset property was created.
+--
+-- 'propertyId', 'disassociateTimeSeriesFromAssetProperty_propertyId' - The ID of the asset property.
+newDisassociateTimeSeriesFromAssetProperty ::
+  -- | 'alias'
+  Prelude.Text ->
+  -- | 'assetId'
+  Prelude.Text ->
+  -- | 'propertyId'
+  Prelude.Text ->
+  DisassociateTimeSeriesFromAssetProperty
+newDisassociateTimeSeriesFromAssetProperty
+  pAlias_
+  pAssetId_
+  pPropertyId_ =
+    DisassociateTimeSeriesFromAssetProperty'
+      { clientToken =
+          Prelude.Nothing,
+        alias = pAlias_,
+        assetId = pAssetId_,
+        propertyId = pPropertyId_
+      }
+
+-- | A unique case-sensitive identifier that you can provide to ensure the
+-- idempotency of the request. Don\'t reuse this client token if a new
+-- idempotent request is required.
+disassociateTimeSeriesFromAssetProperty_clientToken :: Lens.Lens' DisassociateTimeSeriesFromAssetProperty (Prelude.Maybe Prelude.Text)
+disassociateTimeSeriesFromAssetProperty_clientToken = Lens.lens (\DisassociateTimeSeriesFromAssetProperty' {clientToken} -> clientToken) (\s@DisassociateTimeSeriesFromAssetProperty' {} a -> s {clientToken = a} :: DisassociateTimeSeriesFromAssetProperty)
+
+-- | The alias that identifies the time series.
+disassociateTimeSeriesFromAssetProperty_alias :: Lens.Lens' DisassociateTimeSeriesFromAssetProperty Prelude.Text
+disassociateTimeSeriesFromAssetProperty_alias = Lens.lens (\DisassociateTimeSeriesFromAssetProperty' {alias} -> alias) (\s@DisassociateTimeSeriesFromAssetProperty' {} a -> s {alias = a} :: DisassociateTimeSeriesFromAssetProperty)
+
+-- | The ID of the asset in which the asset property was created.
+disassociateTimeSeriesFromAssetProperty_assetId :: Lens.Lens' DisassociateTimeSeriesFromAssetProperty Prelude.Text
+disassociateTimeSeriesFromAssetProperty_assetId = Lens.lens (\DisassociateTimeSeriesFromAssetProperty' {assetId} -> assetId) (\s@DisassociateTimeSeriesFromAssetProperty' {} a -> s {assetId = a} :: DisassociateTimeSeriesFromAssetProperty)
+
+-- | The ID of the asset property.
+disassociateTimeSeriesFromAssetProperty_propertyId :: Lens.Lens' DisassociateTimeSeriesFromAssetProperty Prelude.Text
+disassociateTimeSeriesFromAssetProperty_propertyId = Lens.lens (\DisassociateTimeSeriesFromAssetProperty' {propertyId} -> propertyId) (\s@DisassociateTimeSeriesFromAssetProperty' {} a -> s {propertyId = a} :: DisassociateTimeSeriesFromAssetProperty)
+
+instance
+  Core.AWSRequest
+    DisassociateTimeSeriesFromAssetProperty
+  where
+  type
+    AWSResponse
+      DisassociateTimeSeriesFromAssetProperty =
+      DisassociateTimeSeriesFromAssetPropertyResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveNull
+      DisassociateTimeSeriesFromAssetPropertyResponse'
+
+instance
+  Prelude.Hashable
+    DisassociateTimeSeriesFromAssetProperty
+  where
+  hashWithSalt
+    _salt
+    DisassociateTimeSeriesFromAssetProperty' {..} =
+      _salt
+        `Prelude.hashWithSalt` clientToken
+        `Prelude.hashWithSalt` alias
+        `Prelude.hashWithSalt` assetId
+        `Prelude.hashWithSalt` propertyId
+
+instance
+  Prelude.NFData
+    DisassociateTimeSeriesFromAssetProperty
+  where
+  rnf DisassociateTimeSeriesFromAssetProperty' {..} =
+    Prelude.rnf clientToken
+      `Prelude.seq` Prelude.rnf alias
+      `Prelude.seq` Prelude.rnf assetId
+      `Prelude.seq` Prelude.rnf propertyId
+
+instance
+  Data.ToHeaders
+    DisassociateTimeSeriesFromAssetProperty
+  where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance
+  Data.ToJSON
+    DisassociateTimeSeriesFromAssetProperty
+  where
+  toJSON DisassociateTimeSeriesFromAssetProperty' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [("clientToken" Data..=) Prelude.<$> clientToken]
+      )
+
+instance
+  Data.ToPath
+    DisassociateTimeSeriesFromAssetProperty
+  where
+  toPath = Prelude.const "/timeseries/disassociate/"
+
+instance
+  Data.ToQuery
+    DisassociateTimeSeriesFromAssetProperty
+  where
+  toQuery DisassociateTimeSeriesFromAssetProperty' {..} =
+    Prelude.mconcat
+      [ "alias" Data.=: alias,
+        "assetId" Data.=: assetId,
+        "propertyId" Data.=: propertyId
+      ]
+
+-- | /See:/ 'newDisassociateTimeSeriesFromAssetPropertyResponse' smart constructor.
+data DisassociateTimeSeriesFromAssetPropertyResponse = DisassociateTimeSeriesFromAssetPropertyResponse'
+  {
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DisassociateTimeSeriesFromAssetPropertyResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+newDisassociateTimeSeriesFromAssetPropertyResponse ::
+  DisassociateTimeSeriesFromAssetPropertyResponse
+newDisassociateTimeSeriesFromAssetPropertyResponse =
+  DisassociateTimeSeriesFromAssetPropertyResponse'
+
+instance
+  Prelude.NFData
+    DisassociateTimeSeriesFromAssetPropertyResponse
+  where
+  rnf _ = ()
diff --git a/gen/Amazonka/IoTSiteWise/GetAssetPropertyAggregates.hs b/gen/Amazonka/IoTSiteWise/GetAssetPropertyAggregates.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/IoTSiteWise/GetAssetPropertyAggregates.hs
@@ -0,0 +1,397 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.IoTSiteWise.GetAssetPropertyAggregates
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Gets aggregated values for an asset property. For more information, see
+-- <https://docs.aws.amazon.com/iot-sitewise/latest/userguide/query-industrial-data.html#aggregates Querying aggregates>
+-- in the /IoT SiteWise User Guide/.
+--
+-- To identify an asset property, you must specify one of the following:
+--
+-- -   The @assetId@ and @propertyId@ of an asset property.
+--
+-- -   A @propertyAlias@, which is a data stream alias (for example,
+--     @\/company\/windfarm\/3\/turbine\/7\/temperature@). To define an
+--     asset property\'s alias, see
+--     <https://docs.aws.amazon.com/iot-sitewise/latest/APIReference/API_UpdateAssetProperty.html UpdateAssetProperty>.
+--
+-- This operation returns paginated results.
+module Amazonka.IoTSiteWise.GetAssetPropertyAggregates
+  ( -- * Creating a Request
+    GetAssetPropertyAggregates (..),
+    newGetAssetPropertyAggregates,
+
+    -- * Request Lenses
+    getAssetPropertyAggregates_assetId,
+    getAssetPropertyAggregates_maxResults,
+    getAssetPropertyAggregates_nextToken,
+    getAssetPropertyAggregates_propertyAlias,
+    getAssetPropertyAggregates_propertyId,
+    getAssetPropertyAggregates_qualities,
+    getAssetPropertyAggregates_timeOrdering,
+    getAssetPropertyAggregates_aggregateTypes,
+    getAssetPropertyAggregates_resolution,
+    getAssetPropertyAggregates_startDate,
+    getAssetPropertyAggregates_endDate,
+
+    -- * Destructuring the Response
+    GetAssetPropertyAggregatesResponse (..),
+    newGetAssetPropertyAggregatesResponse,
+
+    -- * Response Lenses
+    getAssetPropertyAggregatesResponse_nextToken,
+    getAssetPropertyAggregatesResponse_httpStatus,
+    getAssetPropertyAggregatesResponse_aggregatedValues,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.IoTSiteWise.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newGetAssetPropertyAggregates' smart constructor.
+data GetAssetPropertyAggregates = GetAssetPropertyAggregates'
+  { -- | The ID of the asset.
+    assetId :: Prelude.Maybe Prelude.Text,
+    -- | The maximum number of results to return for each paginated request.
+    --
+    -- Default: 100
+    maxResults :: Prelude.Maybe Prelude.Natural,
+    -- | The token to be used for the next set of paginated results.
+    nextToken :: Prelude.Maybe Prelude.Text,
+    -- | The alias that identifies the property, such as an OPC-UA server data
+    -- stream path (for example,
+    -- @\/company\/windfarm\/3\/turbine\/7\/temperature@). For more
+    -- information, see
+    -- <https://docs.aws.amazon.com/iot-sitewise/latest/userguide/connect-data-streams.html Mapping industrial data streams to asset properties>
+    -- in the /IoT SiteWise User Guide/.
+    propertyAlias :: Prelude.Maybe Prelude.Text,
+    -- | The ID of the asset property.
+    propertyId :: Prelude.Maybe Prelude.Text,
+    -- | The quality by which to filter asset data.
+    qualities :: Prelude.Maybe (Prelude.NonEmpty Quality),
+    -- | The chronological sorting order of the requested information.
+    --
+    -- Default: @ASCENDING@
+    timeOrdering :: Prelude.Maybe TimeOrdering,
+    -- | The data aggregating function.
+    aggregateTypes :: Prelude.NonEmpty AggregateType,
+    -- | The time interval over which to aggregate data.
+    resolution :: Prelude.Text,
+    -- | The exclusive start of the range from which to query historical data,
+    -- expressed in seconds in Unix epoch time.
+    startDate :: Data.POSIX,
+    -- | The inclusive end of the range from which to query historical data,
+    -- expressed in seconds in Unix epoch time.
+    endDate :: Data.POSIX
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'GetAssetPropertyAggregates' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'assetId', 'getAssetPropertyAggregates_assetId' - The ID of the asset.
+--
+-- 'maxResults', 'getAssetPropertyAggregates_maxResults' - The maximum number of results to return for each paginated request.
+--
+-- Default: 100
+--
+-- 'nextToken', 'getAssetPropertyAggregates_nextToken' - The token to be used for the next set of paginated results.
+--
+-- 'propertyAlias', 'getAssetPropertyAggregates_propertyAlias' - The alias that identifies the property, such as an OPC-UA server data
+-- stream path (for example,
+-- @\/company\/windfarm\/3\/turbine\/7\/temperature@). For more
+-- information, see
+-- <https://docs.aws.amazon.com/iot-sitewise/latest/userguide/connect-data-streams.html Mapping industrial data streams to asset properties>
+-- in the /IoT SiteWise User Guide/.
+--
+-- 'propertyId', 'getAssetPropertyAggregates_propertyId' - The ID of the asset property.
+--
+-- 'qualities', 'getAssetPropertyAggregates_qualities' - The quality by which to filter asset data.
+--
+-- 'timeOrdering', 'getAssetPropertyAggregates_timeOrdering' - The chronological sorting order of the requested information.
+--
+-- Default: @ASCENDING@
+--
+-- 'aggregateTypes', 'getAssetPropertyAggregates_aggregateTypes' - The data aggregating function.
+--
+-- 'resolution', 'getAssetPropertyAggregates_resolution' - The time interval over which to aggregate data.
+--
+-- 'startDate', 'getAssetPropertyAggregates_startDate' - The exclusive start of the range from which to query historical data,
+-- expressed in seconds in Unix epoch time.
+--
+-- 'endDate', 'getAssetPropertyAggregates_endDate' - The inclusive end of the range from which to query historical data,
+-- expressed in seconds in Unix epoch time.
+newGetAssetPropertyAggregates ::
+  -- | 'aggregateTypes'
+  Prelude.NonEmpty AggregateType ->
+  -- | 'resolution'
+  Prelude.Text ->
+  -- | 'startDate'
+  Prelude.UTCTime ->
+  -- | 'endDate'
+  Prelude.UTCTime ->
+  GetAssetPropertyAggregates
+newGetAssetPropertyAggregates
+  pAggregateTypes_
+  pResolution_
+  pStartDate_
+  pEndDate_ =
+    GetAssetPropertyAggregates'
+      { assetId =
+          Prelude.Nothing,
+        maxResults = Prelude.Nothing,
+        nextToken = Prelude.Nothing,
+        propertyAlias = Prelude.Nothing,
+        propertyId = Prelude.Nothing,
+        qualities = Prelude.Nothing,
+        timeOrdering = Prelude.Nothing,
+        aggregateTypes =
+          Lens.coerced Lens.# pAggregateTypes_,
+        resolution = pResolution_,
+        startDate = Data._Time Lens.# pStartDate_,
+        endDate = Data._Time Lens.# pEndDate_
+      }
+
+-- | The ID of the asset.
+getAssetPropertyAggregates_assetId :: Lens.Lens' GetAssetPropertyAggregates (Prelude.Maybe Prelude.Text)
+getAssetPropertyAggregates_assetId = Lens.lens (\GetAssetPropertyAggregates' {assetId} -> assetId) (\s@GetAssetPropertyAggregates' {} a -> s {assetId = a} :: GetAssetPropertyAggregates)
+
+-- | The maximum number of results to return for each paginated request.
+--
+-- Default: 100
+getAssetPropertyAggregates_maxResults :: Lens.Lens' GetAssetPropertyAggregates (Prelude.Maybe Prelude.Natural)
+getAssetPropertyAggregates_maxResults = Lens.lens (\GetAssetPropertyAggregates' {maxResults} -> maxResults) (\s@GetAssetPropertyAggregates' {} a -> s {maxResults = a} :: GetAssetPropertyAggregates)
+
+-- | The token to be used for the next set of paginated results.
+getAssetPropertyAggregates_nextToken :: Lens.Lens' GetAssetPropertyAggregates (Prelude.Maybe Prelude.Text)
+getAssetPropertyAggregates_nextToken = Lens.lens (\GetAssetPropertyAggregates' {nextToken} -> nextToken) (\s@GetAssetPropertyAggregates' {} a -> s {nextToken = a} :: GetAssetPropertyAggregates)
+
+-- | The alias that identifies the property, such as an OPC-UA server data
+-- stream path (for example,
+-- @\/company\/windfarm\/3\/turbine\/7\/temperature@). For more
+-- information, see
+-- <https://docs.aws.amazon.com/iot-sitewise/latest/userguide/connect-data-streams.html Mapping industrial data streams to asset properties>
+-- in the /IoT SiteWise User Guide/.
+getAssetPropertyAggregates_propertyAlias :: Lens.Lens' GetAssetPropertyAggregates (Prelude.Maybe Prelude.Text)
+getAssetPropertyAggregates_propertyAlias = Lens.lens (\GetAssetPropertyAggregates' {propertyAlias} -> propertyAlias) (\s@GetAssetPropertyAggregates' {} a -> s {propertyAlias = a} :: GetAssetPropertyAggregates)
+
+-- | The ID of the asset property.
+getAssetPropertyAggregates_propertyId :: Lens.Lens' GetAssetPropertyAggregates (Prelude.Maybe Prelude.Text)
+getAssetPropertyAggregates_propertyId = Lens.lens (\GetAssetPropertyAggregates' {propertyId} -> propertyId) (\s@GetAssetPropertyAggregates' {} a -> s {propertyId = a} :: GetAssetPropertyAggregates)
+
+-- | The quality by which to filter asset data.
+getAssetPropertyAggregates_qualities :: Lens.Lens' GetAssetPropertyAggregates (Prelude.Maybe (Prelude.NonEmpty Quality))
+getAssetPropertyAggregates_qualities = Lens.lens (\GetAssetPropertyAggregates' {qualities} -> qualities) (\s@GetAssetPropertyAggregates' {} a -> s {qualities = a} :: GetAssetPropertyAggregates) Prelude.. Lens.mapping Lens.coerced
+
+-- | The chronological sorting order of the requested information.
+--
+-- Default: @ASCENDING@
+getAssetPropertyAggregates_timeOrdering :: Lens.Lens' GetAssetPropertyAggregates (Prelude.Maybe TimeOrdering)
+getAssetPropertyAggregates_timeOrdering = Lens.lens (\GetAssetPropertyAggregates' {timeOrdering} -> timeOrdering) (\s@GetAssetPropertyAggregates' {} a -> s {timeOrdering = a} :: GetAssetPropertyAggregates)
+
+-- | The data aggregating function.
+getAssetPropertyAggregates_aggregateTypes :: Lens.Lens' GetAssetPropertyAggregates (Prelude.NonEmpty AggregateType)
+getAssetPropertyAggregates_aggregateTypes = Lens.lens (\GetAssetPropertyAggregates' {aggregateTypes} -> aggregateTypes) (\s@GetAssetPropertyAggregates' {} a -> s {aggregateTypes = a} :: GetAssetPropertyAggregates) Prelude.. Lens.coerced
+
+-- | The time interval over which to aggregate data.
+getAssetPropertyAggregates_resolution :: Lens.Lens' GetAssetPropertyAggregates Prelude.Text
+getAssetPropertyAggregates_resolution = Lens.lens (\GetAssetPropertyAggregates' {resolution} -> resolution) (\s@GetAssetPropertyAggregates' {} a -> s {resolution = a} :: GetAssetPropertyAggregates)
+
+-- | The exclusive start of the range from which to query historical data,
+-- expressed in seconds in Unix epoch time.
+getAssetPropertyAggregates_startDate :: Lens.Lens' GetAssetPropertyAggregates Prelude.UTCTime
+getAssetPropertyAggregates_startDate = Lens.lens (\GetAssetPropertyAggregates' {startDate} -> startDate) (\s@GetAssetPropertyAggregates' {} a -> s {startDate = a} :: GetAssetPropertyAggregates) Prelude.. Data._Time
+
+-- | The inclusive end of the range from which to query historical data,
+-- expressed in seconds in Unix epoch time.
+getAssetPropertyAggregates_endDate :: Lens.Lens' GetAssetPropertyAggregates Prelude.UTCTime
+getAssetPropertyAggregates_endDate = Lens.lens (\GetAssetPropertyAggregates' {endDate} -> endDate) (\s@GetAssetPropertyAggregates' {} a -> s {endDate = a} :: GetAssetPropertyAggregates) Prelude.. Data._Time
+
+instance Core.AWSPager GetAssetPropertyAggregates where
+  page rq rs
+    | Core.stop
+        ( rs
+            Lens.^? getAssetPropertyAggregatesResponse_nextToken
+            Prelude.. Lens._Just
+        ) =
+        Prelude.Nothing
+    | Core.stop
+        ( rs
+            Lens.^. getAssetPropertyAggregatesResponse_aggregatedValues
+        ) =
+        Prelude.Nothing
+    | Prelude.otherwise =
+        Prelude.Just
+          Prelude.$ rq
+          Prelude.& getAssetPropertyAggregates_nextToken
+          Lens..~ rs
+          Lens.^? getAssetPropertyAggregatesResponse_nextToken
+          Prelude.. Lens._Just
+
+instance Core.AWSRequest GetAssetPropertyAggregates where
+  type
+    AWSResponse GetAssetPropertyAggregates =
+      GetAssetPropertyAggregatesResponse
+  request overrides =
+    Request.get (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          GetAssetPropertyAggregatesResponse'
+            Prelude.<$> (x Data..?> "nextToken")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+            Prelude.<*> ( x
+                            Data..?> "aggregatedValues"
+                            Core..!@ Prelude.mempty
+                        )
+      )
+
+instance Prelude.Hashable GetAssetPropertyAggregates where
+  hashWithSalt _salt GetAssetPropertyAggregates' {..} =
+    _salt
+      `Prelude.hashWithSalt` assetId
+      `Prelude.hashWithSalt` maxResults
+      `Prelude.hashWithSalt` nextToken
+      `Prelude.hashWithSalt` propertyAlias
+      `Prelude.hashWithSalt` propertyId
+      `Prelude.hashWithSalt` qualities
+      `Prelude.hashWithSalt` timeOrdering
+      `Prelude.hashWithSalt` aggregateTypes
+      `Prelude.hashWithSalt` resolution
+      `Prelude.hashWithSalt` startDate
+      `Prelude.hashWithSalt` endDate
+
+instance Prelude.NFData GetAssetPropertyAggregates where
+  rnf GetAssetPropertyAggregates' {..} =
+    Prelude.rnf assetId
+      `Prelude.seq` Prelude.rnf maxResults
+      `Prelude.seq` Prelude.rnf nextToken
+      `Prelude.seq` Prelude.rnf propertyAlias
+      `Prelude.seq` Prelude.rnf propertyId
+      `Prelude.seq` Prelude.rnf qualities
+      `Prelude.seq` Prelude.rnf timeOrdering
+      `Prelude.seq` Prelude.rnf aggregateTypes
+      `Prelude.seq` Prelude.rnf resolution
+      `Prelude.seq` Prelude.rnf startDate
+      `Prelude.seq` Prelude.rnf endDate
+
+instance Data.ToHeaders GetAssetPropertyAggregates where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToPath GetAssetPropertyAggregates where
+  toPath = Prelude.const "/properties/aggregates"
+
+instance Data.ToQuery GetAssetPropertyAggregates where
+  toQuery GetAssetPropertyAggregates' {..} =
+    Prelude.mconcat
+      [ "assetId" Data.=: assetId,
+        "maxResults" Data.=: maxResults,
+        "nextToken" Data.=: nextToken,
+        "propertyAlias" Data.=: propertyAlias,
+        "propertyId" Data.=: propertyId,
+        "qualities"
+          Data.=: Data.toQuery
+            (Data.toQueryList "member" Prelude.<$> qualities),
+        "timeOrdering" Data.=: timeOrdering,
+        "aggregateTypes"
+          Data.=: Data.toQueryList "member" aggregateTypes,
+        "resolution" Data.=: resolution,
+        "startDate" Data.=: startDate,
+        "endDate" Data.=: endDate
+      ]
+
+-- | /See:/ 'newGetAssetPropertyAggregatesResponse' smart constructor.
+data GetAssetPropertyAggregatesResponse = GetAssetPropertyAggregatesResponse'
+  { -- | The token for the next set of results, or null if there are no
+    -- additional results.
+    nextToken :: Prelude.Maybe Prelude.Text,
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int,
+    -- | The requested aggregated values.
+    aggregatedValues :: [AggregatedValue]
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'GetAssetPropertyAggregatesResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'nextToken', 'getAssetPropertyAggregatesResponse_nextToken' - The token for the next set of results, or null if there are no
+-- additional results.
+--
+-- 'httpStatus', 'getAssetPropertyAggregatesResponse_httpStatus' - The response's http status code.
+--
+-- 'aggregatedValues', 'getAssetPropertyAggregatesResponse_aggregatedValues' - The requested aggregated values.
+newGetAssetPropertyAggregatesResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  GetAssetPropertyAggregatesResponse
+newGetAssetPropertyAggregatesResponse pHttpStatus_ =
+  GetAssetPropertyAggregatesResponse'
+    { nextToken =
+        Prelude.Nothing,
+      httpStatus = pHttpStatus_,
+      aggregatedValues = Prelude.mempty
+    }
+
+-- | The token for the next set of results, or null if there are no
+-- additional results.
+getAssetPropertyAggregatesResponse_nextToken :: Lens.Lens' GetAssetPropertyAggregatesResponse (Prelude.Maybe Prelude.Text)
+getAssetPropertyAggregatesResponse_nextToken = Lens.lens (\GetAssetPropertyAggregatesResponse' {nextToken} -> nextToken) (\s@GetAssetPropertyAggregatesResponse' {} a -> s {nextToken = a} :: GetAssetPropertyAggregatesResponse)
+
+-- | The response's http status code.
+getAssetPropertyAggregatesResponse_httpStatus :: Lens.Lens' GetAssetPropertyAggregatesResponse Prelude.Int
+getAssetPropertyAggregatesResponse_httpStatus = Lens.lens (\GetAssetPropertyAggregatesResponse' {httpStatus} -> httpStatus) (\s@GetAssetPropertyAggregatesResponse' {} a -> s {httpStatus = a} :: GetAssetPropertyAggregatesResponse)
+
+-- | The requested aggregated values.
+getAssetPropertyAggregatesResponse_aggregatedValues :: Lens.Lens' GetAssetPropertyAggregatesResponse [AggregatedValue]
+getAssetPropertyAggregatesResponse_aggregatedValues = Lens.lens (\GetAssetPropertyAggregatesResponse' {aggregatedValues} -> aggregatedValues) (\s@GetAssetPropertyAggregatesResponse' {} a -> s {aggregatedValues = a} :: GetAssetPropertyAggregatesResponse) Prelude.. Lens.coerced
+
+instance
+  Prelude.NFData
+    GetAssetPropertyAggregatesResponse
+  where
+  rnf GetAssetPropertyAggregatesResponse' {..} =
+    Prelude.rnf nextToken
+      `Prelude.seq` Prelude.rnf httpStatus
+      `Prelude.seq` Prelude.rnf aggregatedValues
diff --git a/gen/Amazonka/IoTSiteWise/GetAssetPropertyValue.hs b/gen/Amazonka/IoTSiteWise/GetAssetPropertyValue.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/IoTSiteWise/GetAssetPropertyValue.hs
@@ -0,0 +1,214 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.IoTSiteWise.GetAssetPropertyValue
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Gets an asset property\'s current value. For more information, see
+-- <https://docs.aws.amazon.com/iot-sitewise/latest/userguide/query-industrial-data.html#current-values Querying current values>
+-- in the /IoT SiteWise User Guide/.
+--
+-- To identify an asset property, you must specify one of the following:
+--
+-- -   The @assetId@ and @propertyId@ of an asset property.
+--
+-- -   A @propertyAlias@, which is a data stream alias (for example,
+--     @\/company\/windfarm\/3\/turbine\/7\/temperature@). To define an
+--     asset property\'s alias, see
+--     <https://docs.aws.amazon.com/iot-sitewise/latest/APIReference/API_UpdateAssetProperty.html UpdateAssetProperty>.
+module Amazonka.IoTSiteWise.GetAssetPropertyValue
+  ( -- * Creating a Request
+    GetAssetPropertyValue (..),
+    newGetAssetPropertyValue,
+
+    -- * Request Lenses
+    getAssetPropertyValue_assetId,
+    getAssetPropertyValue_propertyAlias,
+    getAssetPropertyValue_propertyId,
+
+    -- * Destructuring the Response
+    GetAssetPropertyValueResponse (..),
+    newGetAssetPropertyValueResponse,
+
+    -- * Response Lenses
+    getAssetPropertyValueResponse_propertyValue,
+    getAssetPropertyValueResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.IoTSiteWise.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newGetAssetPropertyValue' smart constructor.
+data GetAssetPropertyValue = GetAssetPropertyValue'
+  { -- | The ID of the asset.
+    assetId :: Prelude.Maybe Prelude.Text,
+    -- | The alias that identifies the property, such as an OPC-UA server data
+    -- stream path (for example,
+    -- @\/company\/windfarm\/3\/turbine\/7\/temperature@). For more
+    -- information, see
+    -- <https://docs.aws.amazon.com/iot-sitewise/latest/userguide/connect-data-streams.html Mapping industrial data streams to asset properties>
+    -- in the /IoT SiteWise User Guide/.
+    propertyAlias :: Prelude.Maybe Prelude.Text,
+    -- | The ID of the asset property.
+    propertyId :: Prelude.Maybe Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'GetAssetPropertyValue' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'assetId', 'getAssetPropertyValue_assetId' - The ID of the asset.
+--
+-- 'propertyAlias', 'getAssetPropertyValue_propertyAlias' - The alias that identifies the property, such as an OPC-UA server data
+-- stream path (for example,
+-- @\/company\/windfarm\/3\/turbine\/7\/temperature@). For more
+-- information, see
+-- <https://docs.aws.amazon.com/iot-sitewise/latest/userguide/connect-data-streams.html Mapping industrial data streams to asset properties>
+-- in the /IoT SiteWise User Guide/.
+--
+-- 'propertyId', 'getAssetPropertyValue_propertyId' - The ID of the asset property.
+newGetAssetPropertyValue ::
+  GetAssetPropertyValue
+newGetAssetPropertyValue =
+  GetAssetPropertyValue'
+    { assetId = Prelude.Nothing,
+      propertyAlias = Prelude.Nothing,
+      propertyId = Prelude.Nothing
+    }
+
+-- | The ID of the asset.
+getAssetPropertyValue_assetId :: Lens.Lens' GetAssetPropertyValue (Prelude.Maybe Prelude.Text)
+getAssetPropertyValue_assetId = Lens.lens (\GetAssetPropertyValue' {assetId} -> assetId) (\s@GetAssetPropertyValue' {} a -> s {assetId = a} :: GetAssetPropertyValue)
+
+-- | The alias that identifies the property, such as an OPC-UA server data
+-- stream path (for example,
+-- @\/company\/windfarm\/3\/turbine\/7\/temperature@). For more
+-- information, see
+-- <https://docs.aws.amazon.com/iot-sitewise/latest/userguide/connect-data-streams.html Mapping industrial data streams to asset properties>
+-- in the /IoT SiteWise User Guide/.
+getAssetPropertyValue_propertyAlias :: Lens.Lens' GetAssetPropertyValue (Prelude.Maybe Prelude.Text)
+getAssetPropertyValue_propertyAlias = Lens.lens (\GetAssetPropertyValue' {propertyAlias} -> propertyAlias) (\s@GetAssetPropertyValue' {} a -> s {propertyAlias = a} :: GetAssetPropertyValue)
+
+-- | The ID of the asset property.
+getAssetPropertyValue_propertyId :: Lens.Lens' GetAssetPropertyValue (Prelude.Maybe Prelude.Text)
+getAssetPropertyValue_propertyId = Lens.lens (\GetAssetPropertyValue' {propertyId} -> propertyId) (\s@GetAssetPropertyValue' {} a -> s {propertyId = a} :: GetAssetPropertyValue)
+
+instance Core.AWSRequest GetAssetPropertyValue where
+  type
+    AWSResponse GetAssetPropertyValue =
+      GetAssetPropertyValueResponse
+  request overrides =
+    Request.get (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          GetAssetPropertyValueResponse'
+            Prelude.<$> (x Data..?> "propertyValue")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable GetAssetPropertyValue where
+  hashWithSalt _salt GetAssetPropertyValue' {..} =
+    _salt
+      `Prelude.hashWithSalt` assetId
+      `Prelude.hashWithSalt` propertyAlias
+      `Prelude.hashWithSalt` propertyId
+
+instance Prelude.NFData GetAssetPropertyValue where
+  rnf GetAssetPropertyValue' {..} =
+    Prelude.rnf assetId
+      `Prelude.seq` Prelude.rnf propertyAlias
+      `Prelude.seq` Prelude.rnf propertyId
+
+instance Data.ToHeaders GetAssetPropertyValue where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToPath GetAssetPropertyValue where
+  toPath = Prelude.const "/properties/latest"
+
+instance Data.ToQuery GetAssetPropertyValue where
+  toQuery GetAssetPropertyValue' {..} =
+    Prelude.mconcat
+      [ "assetId" Data.=: assetId,
+        "propertyAlias" Data.=: propertyAlias,
+        "propertyId" Data.=: propertyId
+      ]
+
+-- | /See:/ 'newGetAssetPropertyValueResponse' smart constructor.
+data GetAssetPropertyValueResponse = GetAssetPropertyValueResponse'
+  { -- | The current asset property value.
+    propertyValue :: Prelude.Maybe AssetPropertyValue,
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'GetAssetPropertyValueResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'propertyValue', 'getAssetPropertyValueResponse_propertyValue' - The current asset property value.
+--
+-- 'httpStatus', 'getAssetPropertyValueResponse_httpStatus' - The response's http status code.
+newGetAssetPropertyValueResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  GetAssetPropertyValueResponse
+newGetAssetPropertyValueResponse pHttpStatus_ =
+  GetAssetPropertyValueResponse'
+    { propertyValue =
+        Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | The current asset property value.
+getAssetPropertyValueResponse_propertyValue :: Lens.Lens' GetAssetPropertyValueResponse (Prelude.Maybe AssetPropertyValue)
+getAssetPropertyValueResponse_propertyValue = Lens.lens (\GetAssetPropertyValueResponse' {propertyValue} -> propertyValue) (\s@GetAssetPropertyValueResponse' {} a -> s {propertyValue = a} :: GetAssetPropertyValueResponse)
+
+-- | The response's http status code.
+getAssetPropertyValueResponse_httpStatus :: Lens.Lens' GetAssetPropertyValueResponse Prelude.Int
+getAssetPropertyValueResponse_httpStatus = Lens.lens (\GetAssetPropertyValueResponse' {httpStatus} -> httpStatus) (\s@GetAssetPropertyValueResponse' {} a -> s {httpStatus = a} :: GetAssetPropertyValueResponse)
+
+instance Prelude.NFData GetAssetPropertyValueResponse where
+  rnf GetAssetPropertyValueResponse' {..} =
+    Prelude.rnf propertyValue
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/IoTSiteWise/GetAssetPropertyValueHistory.hs b/gen/Amazonka/IoTSiteWise/GetAssetPropertyValueHistory.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/IoTSiteWise/GetAssetPropertyValueHistory.hs
@@ -0,0 +1,362 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.IoTSiteWise.GetAssetPropertyValueHistory
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Gets the history of an asset property\'s values. For more information,
+-- see
+-- <https://docs.aws.amazon.com/iot-sitewise/latest/userguide/query-industrial-data.html#historical-values Querying historical values>
+-- in the /IoT SiteWise User Guide/.
+--
+-- To identify an asset property, you must specify one of the following:
+--
+-- -   The @assetId@ and @propertyId@ of an asset property.
+--
+-- -   A @propertyAlias@, which is a data stream alias (for example,
+--     @\/company\/windfarm\/3\/turbine\/7\/temperature@). To define an
+--     asset property\'s alias, see
+--     <https://docs.aws.amazon.com/iot-sitewise/latest/APIReference/API_UpdateAssetProperty.html UpdateAssetProperty>.
+--
+-- This operation returns paginated results.
+module Amazonka.IoTSiteWise.GetAssetPropertyValueHistory
+  ( -- * Creating a Request
+    GetAssetPropertyValueHistory (..),
+    newGetAssetPropertyValueHistory,
+
+    -- * Request Lenses
+    getAssetPropertyValueHistory_assetId,
+    getAssetPropertyValueHistory_endDate,
+    getAssetPropertyValueHistory_maxResults,
+    getAssetPropertyValueHistory_nextToken,
+    getAssetPropertyValueHistory_propertyAlias,
+    getAssetPropertyValueHistory_propertyId,
+    getAssetPropertyValueHistory_qualities,
+    getAssetPropertyValueHistory_startDate,
+    getAssetPropertyValueHistory_timeOrdering,
+
+    -- * Destructuring the Response
+    GetAssetPropertyValueHistoryResponse (..),
+    newGetAssetPropertyValueHistoryResponse,
+
+    -- * Response Lenses
+    getAssetPropertyValueHistoryResponse_nextToken,
+    getAssetPropertyValueHistoryResponse_httpStatus,
+    getAssetPropertyValueHistoryResponse_assetPropertyValueHistory,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.IoTSiteWise.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newGetAssetPropertyValueHistory' smart constructor.
+data GetAssetPropertyValueHistory = GetAssetPropertyValueHistory'
+  { -- | The ID of the asset.
+    assetId :: Prelude.Maybe Prelude.Text,
+    -- | The inclusive end of the range from which to query historical data,
+    -- expressed in seconds in Unix epoch time.
+    endDate :: Prelude.Maybe Data.POSIX,
+    -- | The maximum number of results to return for each paginated request.
+    --
+    -- Default: 100
+    maxResults :: Prelude.Maybe Prelude.Natural,
+    -- | The token to be used for the next set of paginated results.
+    nextToken :: Prelude.Maybe Prelude.Text,
+    -- | The alias that identifies the property, such as an OPC-UA server data
+    -- stream path (for example,
+    -- @\/company\/windfarm\/3\/turbine\/7\/temperature@). For more
+    -- information, see
+    -- <https://docs.aws.amazon.com/iot-sitewise/latest/userguide/connect-data-streams.html Mapping industrial data streams to asset properties>
+    -- in the /IoT SiteWise User Guide/.
+    propertyAlias :: Prelude.Maybe Prelude.Text,
+    -- | The ID of the asset property.
+    propertyId :: Prelude.Maybe Prelude.Text,
+    -- | The quality by which to filter asset data.
+    qualities :: Prelude.Maybe (Prelude.NonEmpty Quality),
+    -- | The exclusive start of the range from which to query historical data,
+    -- expressed in seconds in Unix epoch time.
+    startDate :: Prelude.Maybe Data.POSIX,
+    -- | The chronological sorting order of the requested information.
+    --
+    -- Default: @ASCENDING@
+    timeOrdering :: Prelude.Maybe TimeOrdering
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'GetAssetPropertyValueHistory' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'assetId', 'getAssetPropertyValueHistory_assetId' - The ID of the asset.
+--
+-- 'endDate', 'getAssetPropertyValueHistory_endDate' - The inclusive end of the range from which to query historical data,
+-- expressed in seconds in Unix epoch time.
+--
+-- 'maxResults', 'getAssetPropertyValueHistory_maxResults' - The maximum number of results to return for each paginated request.
+--
+-- Default: 100
+--
+-- 'nextToken', 'getAssetPropertyValueHistory_nextToken' - The token to be used for the next set of paginated results.
+--
+-- 'propertyAlias', 'getAssetPropertyValueHistory_propertyAlias' - The alias that identifies the property, such as an OPC-UA server data
+-- stream path (for example,
+-- @\/company\/windfarm\/3\/turbine\/7\/temperature@). For more
+-- information, see
+-- <https://docs.aws.amazon.com/iot-sitewise/latest/userguide/connect-data-streams.html Mapping industrial data streams to asset properties>
+-- in the /IoT SiteWise User Guide/.
+--
+-- 'propertyId', 'getAssetPropertyValueHistory_propertyId' - The ID of the asset property.
+--
+-- 'qualities', 'getAssetPropertyValueHistory_qualities' - The quality by which to filter asset data.
+--
+-- 'startDate', 'getAssetPropertyValueHistory_startDate' - The exclusive start of the range from which to query historical data,
+-- expressed in seconds in Unix epoch time.
+--
+-- 'timeOrdering', 'getAssetPropertyValueHistory_timeOrdering' - The chronological sorting order of the requested information.
+--
+-- Default: @ASCENDING@
+newGetAssetPropertyValueHistory ::
+  GetAssetPropertyValueHistory
+newGetAssetPropertyValueHistory =
+  GetAssetPropertyValueHistory'
+    { assetId =
+        Prelude.Nothing,
+      endDate = Prelude.Nothing,
+      maxResults = Prelude.Nothing,
+      nextToken = Prelude.Nothing,
+      propertyAlias = Prelude.Nothing,
+      propertyId = Prelude.Nothing,
+      qualities = Prelude.Nothing,
+      startDate = Prelude.Nothing,
+      timeOrdering = Prelude.Nothing
+    }
+
+-- | The ID of the asset.
+getAssetPropertyValueHistory_assetId :: Lens.Lens' GetAssetPropertyValueHistory (Prelude.Maybe Prelude.Text)
+getAssetPropertyValueHistory_assetId = Lens.lens (\GetAssetPropertyValueHistory' {assetId} -> assetId) (\s@GetAssetPropertyValueHistory' {} a -> s {assetId = a} :: GetAssetPropertyValueHistory)
+
+-- | The inclusive end of the range from which to query historical data,
+-- expressed in seconds in Unix epoch time.
+getAssetPropertyValueHistory_endDate :: Lens.Lens' GetAssetPropertyValueHistory (Prelude.Maybe Prelude.UTCTime)
+getAssetPropertyValueHistory_endDate = Lens.lens (\GetAssetPropertyValueHistory' {endDate} -> endDate) (\s@GetAssetPropertyValueHistory' {} a -> s {endDate = a} :: GetAssetPropertyValueHistory) Prelude.. Lens.mapping Data._Time
+
+-- | The maximum number of results to return for each paginated request.
+--
+-- Default: 100
+getAssetPropertyValueHistory_maxResults :: Lens.Lens' GetAssetPropertyValueHistory (Prelude.Maybe Prelude.Natural)
+getAssetPropertyValueHistory_maxResults = Lens.lens (\GetAssetPropertyValueHistory' {maxResults} -> maxResults) (\s@GetAssetPropertyValueHistory' {} a -> s {maxResults = a} :: GetAssetPropertyValueHistory)
+
+-- | The token to be used for the next set of paginated results.
+getAssetPropertyValueHistory_nextToken :: Lens.Lens' GetAssetPropertyValueHistory (Prelude.Maybe Prelude.Text)
+getAssetPropertyValueHistory_nextToken = Lens.lens (\GetAssetPropertyValueHistory' {nextToken} -> nextToken) (\s@GetAssetPropertyValueHistory' {} a -> s {nextToken = a} :: GetAssetPropertyValueHistory)
+
+-- | The alias that identifies the property, such as an OPC-UA server data
+-- stream path (for example,
+-- @\/company\/windfarm\/3\/turbine\/7\/temperature@). For more
+-- information, see
+-- <https://docs.aws.amazon.com/iot-sitewise/latest/userguide/connect-data-streams.html Mapping industrial data streams to asset properties>
+-- in the /IoT SiteWise User Guide/.
+getAssetPropertyValueHistory_propertyAlias :: Lens.Lens' GetAssetPropertyValueHistory (Prelude.Maybe Prelude.Text)
+getAssetPropertyValueHistory_propertyAlias = Lens.lens (\GetAssetPropertyValueHistory' {propertyAlias} -> propertyAlias) (\s@GetAssetPropertyValueHistory' {} a -> s {propertyAlias = a} :: GetAssetPropertyValueHistory)
+
+-- | The ID of the asset property.
+getAssetPropertyValueHistory_propertyId :: Lens.Lens' GetAssetPropertyValueHistory (Prelude.Maybe Prelude.Text)
+getAssetPropertyValueHistory_propertyId = Lens.lens (\GetAssetPropertyValueHistory' {propertyId} -> propertyId) (\s@GetAssetPropertyValueHistory' {} a -> s {propertyId = a} :: GetAssetPropertyValueHistory)
+
+-- | The quality by which to filter asset data.
+getAssetPropertyValueHistory_qualities :: Lens.Lens' GetAssetPropertyValueHistory (Prelude.Maybe (Prelude.NonEmpty Quality))
+getAssetPropertyValueHistory_qualities = Lens.lens (\GetAssetPropertyValueHistory' {qualities} -> qualities) (\s@GetAssetPropertyValueHistory' {} a -> s {qualities = a} :: GetAssetPropertyValueHistory) Prelude.. Lens.mapping Lens.coerced
+
+-- | The exclusive start of the range from which to query historical data,
+-- expressed in seconds in Unix epoch time.
+getAssetPropertyValueHistory_startDate :: Lens.Lens' GetAssetPropertyValueHistory (Prelude.Maybe Prelude.UTCTime)
+getAssetPropertyValueHistory_startDate = Lens.lens (\GetAssetPropertyValueHistory' {startDate} -> startDate) (\s@GetAssetPropertyValueHistory' {} a -> s {startDate = a} :: GetAssetPropertyValueHistory) Prelude.. Lens.mapping Data._Time
+
+-- | The chronological sorting order of the requested information.
+--
+-- Default: @ASCENDING@
+getAssetPropertyValueHistory_timeOrdering :: Lens.Lens' GetAssetPropertyValueHistory (Prelude.Maybe TimeOrdering)
+getAssetPropertyValueHistory_timeOrdering = Lens.lens (\GetAssetPropertyValueHistory' {timeOrdering} -> timeOrdering) (\s@GetAssetPropertyValueHistory' {} a -> s {timeOrdering = a} :: GetAssetPropertyValueHistory)
+
+instance Core.AWSPager GetAssetPropertyValueHistory where
+  page rq rs
+    | Core.stop
+        ( rs
+            Lens.^? getAssetPropertyValueHistoryResponse_nextToken
+            Prelude.. Lens._Just
+        ) =
+        Prelude.Nothing
+    | Core.stop
+        ( rs
+            Lens.^. getAssetPropertyValueHistoryResponse_assetPropertyValueHistory
+        ) =
+        Prelude.Nothing
+    | Prelude.otherwise =
+        Prelude.Just
+          Prelude.$ rq
+          Prelude.& getAssetPropertyValueHistory_nextToken
+          Lens..~ rs
+          Lens.^? getAssetPropertyValueHistoryResponse_nextToken
+          Prelude.. Lens._Just
+
+instance Core.AWSRequest GetAssetPropertyValueHistory where
+  type
+    AWSResponse GetAssetPropertyValueHistory =
+      GetAssetPropertyValueHistoryResponse
+  request overrides =
+    Request.get (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          GetAssetPropertyValueHistoryResponse'
+            Prelude.<$> (x Data..?> "nextToken")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+            Prelude.<*> ( x
+                            Data..?> "assetPropertyValueHistory"
+                            Core..!@ Prelude.mempty
+                        )
+      )
+
+instance
+  Prelude.Hashable
+    GetAssetPropertyValueHistory
+  where
+  hashWithSalt _salt GetAssetPropertyValueHistory' {..} =
+    _salt
+      `Prelude.hashWithSalt` assetId
+      `Prelude.hashWithSalt` endDate
+      `Prelude.hashWithSalt` maxResults
+      `Prelude.hashWithSalt` nextToken
+      `Prelude.hashWithSalt` propertyAlias
+      `Prelude.hashWithSalt` propertyId
+      `Prelude.hashWithSalt` qualities
+      `Prelude.hashWithSalt` startDate
+      `Prelude.hashWithSalt` timeOrdering
+
+instance Prelude.NFData GetAssetPropertyValueHistory where
+  rnf GetAssetPropertyValueHistory' {..} =
+    Prelude.rnf assetId
+      `Prelude.seq` Prelude.rnf endDate
+      `Prelude.seq` Prelude.rnf maxResults
+      `Prelude.seq` Prelude.rnf nextToken
+      `Prelude.seq` Prelude.rnf propertyAlias
+      `Prelude.seq` Prelude.rnf propertyId
+      `Prelude.seq` Prelude.rnf qualities
+      `Prelude.seq` Prelude.rnf startDate
+      `Prelude.seq` Prelude.rnf timeOrdering
+
+instance Data.ToHeaders GetAssetPropertyValueHistory where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToPath GetAssetPropertyValueHistory where
+  toPath = Prelude.const "/properties/history"
+
+instance Data.ToQuery GetAssetPropertyValueHistory where
+  toQuery GetAssetPropertyValueHistory' {..} =
+    Prelude.mconcat
+      [ "assetId" Data.=: assetId,
+        "endDate" Data.=: endDate,
+        "maxResults" Data.=: maxResults,
+        "nextToken" Data.=: nextToken,
+        "propertyAlias" Data.=: propertyAlias,
+        "propertyId" Data.=: propertyId,
+        "qualities"
+          Data.=: Data.toQuery
+            (Data.toQueryList "member" Prelude.<$> qualities),
+        "startDate" Data.=: startDate,
+        "timeOrdering" Data.=: timeOrdering
+      ]
+
+-- | /See:/ 'newGetAssetPropertyValueHistoryResponse' smart constructor.
+data GetAssetPropertyValueHistoryResponse = GetAssetPropertyValueHistoryResponse'
+  { -- | The token for the next set of results, or null if there are no
+    -- additional results.
+    nextToken :: Prelude.Maybe Prelude.Text,
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int,
+    -- | The asset property\'s value history.
+    assetPropertyValueHistory :: [AssetPropertyValue]
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'GetAssetPropertyValueHistoryResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'nextToken', 'getAssetPropertyValueHistoryResponse_nextToken' - The token for the next set of results, or null if there are no
+-- additional results.
+--
+-- 'httpStatus', 'getAssetPropertyValueHistoryResponse_httpStatus' - The response's http status code.
+--
+-- 'assetPropertyValueHistory', 'getAssetPropertyValueHistoryResponse_assetPropertyValueHistory' - The asset property\'s value history.
+newGetAssetPropertyValueHistoryResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  GetAssetPropertyValueHistoryResponse
+newGetAssetPropertyValueHistoryResponse pHttpStatus_ =
+  GetAssetPropertyValueHistoryResponse'
+    { nextToken =
+        Prelude.Nothing,
+      httpStatus = pHttpStatus_,
+      assetPropertyValueHistory =
+        Prelude.mempty
+    }
+
+-- | The token for the next set of results, or null if there are no
+-- additional results.
+getAssetPropertyValueHistoryResponse_nextToken :: Lens.Lens' GetAssetPropertyValueHistoryResponse (Prelude.Maybe Prelude.Text)
+getAssetPropertyValueHistoryResponse_nextToken = Lens.lens (\GetAssetPropertyValueHistoryResponse' {nextToken} -> nextToken) (\s@GetAssetPropertyValueHistoryResponse' {} a -> s {nextToken = a} :: GetAssetPropertyValueHistoryResponse)
+
+-- | The response's http status code.
+getAssetPropertyValueHistoryResponse_httpStatus :: Lens.Lens' GetAssetPropertyValueHistoryResponse Prelude.Int
+getAssetPropertyValueHistoryResponse_httpStatus = Lens.lens (\GetAssetPropertyValueHistoryResponse' {httpStatus} -> httpStatus) (\s@GetAssetPropertyValueHistoryResponse' {} a -> s {httpStatus = a} :: GetAssetPropertyValueHistoryResponse)
+
+-- | The asset property\'s value history.
+getAssetPropertyValueHistoryResponse_assetPropertyValueHistory :: Lens.Lens' GetAssetPropertyValueHistoryResponse [AssetPropertyValue]
+getAssetPropertyValueHistoryResponse_assetPropertyValueHistory = Lens.lens (\GetAssetPropertyValueHistoryResponse' {assetPropertyValueHistory} -> assetPropertyValueHistory) (\s@GetAssetPropertyValueHistoryResponse' {} a -> s {assetPropertyValueHistory = a} :: GetAssetPropertyValueHistoryResponse) Prelude.. Lens.coerced
+
+instance
+  Prelude.NFData
+    GetAssetPropertyValueHistoryResponse
+  where
+  rnf GetAssetPropertyValueHistoryResponse' {..} =
+    Prelude.rnf nextToken
+      `Prelude.seq` Prelude.rnf httpStatus
+      `Prelude.seq` Prelude.rnf assetPropertyValueHistory
diff --git a/gen/Amazonka/IoTSiteWise/GetInterpolatedAssetPropertyValues.hs b/gen/Amazonka/IoTSiteWise/GetInterpolatedAssetPropertyValues.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/IoTSiteWise/GetInterpolatedAssetPropertyValues.hs
@@ -0,0 +1,598 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.IoTSiteWise.GetInterpolatedAssetPropertyValues
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Get interpolated values for an asset property for a specified time
+-- interval, during a period of time. If your time series is missing data
+-- points during the specified time interval, you can use interpolation to
+-- estimate the missing data.
+--
+-- For example, you can use this operation to return the interpolated
+-- temperature values for a wind turbine every 24 hours over a duration of
+-- 7 days.
+--
+-- To identify an asset property, you must specify one of the following:
+--
+-- -   The @assetId@ and @propertyId@ of an asset property.
+--
+-- -   A @propertyAlias@, which is a data stream alias (for example,
+--     @\/company\/windfarm\/3\/turbine\/7\/temperature@). To define an
+--     asset property\'s alias, see
+--     <https://docs.aws.amazon.com/iot-sitewise/latest/APIReference/API_UpdateAssetProperty.html UpdateAssetProperty>.
+--
+-- This operation returns paginated results.
+module Amazonka.IoTSiteWise.GetInterpolatedAssetPropertyValues
+  ( -- * Creating a Request
+    GetInterpolatedAssetPropertyValues (..),
+    newGetInterpolatedAssetPropertyValues,
+
+    -- * Request Lenses
+    getInterpolatedAssetPropertyValues_assetId,
+    getInterpolatedAssetPropertyValues_endTimeOffsetInNanos,
+    getInterpolatedAssetPropertyValues_intervalWindowInSeconds,
+    getInterpolatedAssetPropertyValues_maxResults,
+    getInterpolatedAssetPropertyValues_nextToken,
+    getInterpolatedAssetPropertyValues_propertyAlias,
+    getInterpolatedAssetPropertyValues_propertyId,
+    getInterpolatedAssetPropertyValues_startTimeOffsetInNanos,
+    getInterpolatedAssetPropertyValues_startTimeInSeconds,
+    getInterpolatedAssetPropertyValues_endTimeInSeconds,
+    getInterpolatedAssetPropertyValues_quality,
+    getInterpolatedAssetPropertyValues_intervalInSeconds,
+    getInterpolatedAssetPropertyValues_type,
+
+    -- * Destructuring the Response
+    GetInterpolatedAssetPropertyValuesResponse (..),
+    newGetInterpolatedAssetPropertyValuesResponse,
+
+    -- * Response Lenses
+    getInterpolatedAssetPropertyValuesResponse_nextToken,
+    getInterpolatedAssetPropertyValuesResponse_httpStatus,
+    getInterpolatedAssetPropertyValuesResponse_interpolatedAssetPropertyValues,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.IoTSiteWise.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newGetInterpolatedAssetPropertyValues' smart constructor.
+data GetInterpolatedAssetPropertyValues = GetInterpolatedAssetPropertyValues'
+  { -- | The ID of the asset.
+    assetId :: Prelude.Maybe Prelude.Text,
+    -- | The nanosecond offset converted from @endTimeInSeconds@.
+    endTimeOffsetInNanos :: Prelude.Maybe Prelude.Natural,
+    -- | The query interval for the window, in seconds. IoT SiteWise computes
+    -- each interpolated value by using data points from the timestamp of each
+    -- interval, minus the window to the timestamp of each interval plus the
+    -- window. If not specified, the window ranges between the start time minus
+    -- the interval and the end time plus the interval.
+    --
+    -- -   If you specify a value for the @intervalWindowInSeconds@ parameter,
+    --     the value for the @type@ parameter must be @LINEAR_INTERPOLATION@.
+    --
+    -- -   If a data point isn\'t found during the specified query window, IoT
+    --     SiteWise won\'t return an interpolated value for the interval. This
+    --     indicates that there\'s a gap in the ingested data points.
+    --
+    -- For example, you can get the interpolated temperature values for a wind
+    -- turbine every 24 hours over a duration of 7 days. If the interpolation
+    -- starts on July 1, 2021, at 9 AM with a window of 2 hours, IoT SiteWise
+    -- uses the data points from 7 AM (9 AM minus 2 hours) to 11 AM (9 AM plus
+    -- 2 hours) on July 2, 2021 to compute the first interpolated value. Next,
+    -- IoT SiteWise uses the data points from 7 AM (9 AM minus 2 hours) to 11
+    -- AM (9 AM plus 2 hours) on July 3, 2021 to compute the second
+    -- interpolated value, and so on.
+    intervalWindowInSeconds :: Prelude.Maybe Prelude.Natural,
+    -- | The maximum number of results to return for each paginated request. If
+    -- not specified, the default value is 10.
+    maxResults :: Prelude.Maybe Prelude.Natural,
+    -- | The token to be used for the next set of paginated results.
+    nextToken :: Prelude.Maybe Prelude.Text,
+    -- | The alias that identifies the property, such as an OPC-UA server data
+    -- stream path (for example,
+    -- @\/company\/windfarm\/3\/turbine\/7\/temperature@). For more
+    -- information, see
+    -- <https://docs.aws.amazon.com/iot-sitewise/latest/userguide/connect-data-streams.html Mapping industrial data streams to asset properties>
+    -- in the /IoT SiteWise User Guide/.
+    propertyAlias :: Prelude.Maybe Prelude.Text,
+    -- | The ID of the asset property.
+    propertyId :: Prelude.Maybe Prelude.Text,
+    -- | The nanosecond offset converted from @startTimeInSeconds@.
+    startTimeOffsetInNanos :: Prelude.Maybe Prelude.Natural,
+    -- | The exclusive start of the range from which to interpolate data,
+    -- expressed in seconds in Unix epoch time.
+    startTimeInSeconds :: Prelude.Natural,
+    -- | The inclusive end of the range from which to interpolate data, expressed
+    -- in seconds in Unix epoch time.
+    endTimeInSeconds :: Prelude.Natural,
+    -- | The quality of the asset property value. You can use this parameter as a
+    -- filter to choose only the asset property values that have a specific
+    -- quality.
+    quality :: Quality,
+    -- | The time interval in seconds over which to interpolate data. Each
+    -- interval starts when the previous one ends.
+    intervalInSeconds :: Prelude.Natural,
+    -- | The interpolation type.
+    --
+    -- Valid values: @LINEAR_INTERPOLATION | LOCF_INTERPOLATION@
+    --
+    -- -   @LINEAR_INTERPOLATION@ – Estimates missing data using
+    --     <https://en.wikipedia.org/wiki/Linear_interpolation linear interpolation>.
+    --
+    --     For example, you can use this operation to return the interpolated
+    --     temperature values for a wind turbine every 24 hours over a duration
+    --     of 7 days. If the interpolation starts July 1, 2021, at 9 AM, IoT
+    --     SiteWise returns the first interpolated value on July 2, 2021, at 9
+    --     AM, the second interpolated value on July 3, 2021, at 9 AM, and so
+    --     on.
+    --
+    -- -   @LOCF_INTERPOLATION@ – Estimates missing data using last observation
+    --     carried forward interpolation
+    --
+    --     If no data point is found for an interval, IoT SiteWise returns the
+    --     last observed data point for the previous interval and carries
+    --     forward this interpolated value until a new data point is found.
+    --
+    --     For example, you can get the state of an on-off valve every 24 hours
+    --     over a duration of 7 days. If the interpolation starts July 1, 2021,
+    --     at 9 AM, IoT SiteWise returns the last observed data point between
+    --     July 1, 2021, at 9 AM and July 2, 2021, at 9 AM as the first
+    --     interpolated value. If a data point isn\'t found after 9 AM on July
+    --     2, 2021, IoT SiteWise uses the same interpolated value for the rest
+    --     of the days.
+    type' :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'GetInterpolatedAssetPropertyValues' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'assetId', 'getInterpolatedAssetPropertyValues_assetId' - The ID of the asset.
+--
+-- 'endTimeOffsetInNanos', 'getInterpolatedAssetPropertyValues_endTimeOffsetInNanos' - The nanosecond offset converted from @endTimeInSeconds@.
+--
+-- 'intervalWindowInSeconds', 'getInterpolatedAssetPropertyValues_intervalWindowInSeconds' - The query interval for the window, in seconds. IoT SiteWise computes
+-- each interpolated value by using data points from the timestamp of each
+-- interval, minus the window to the timestamp of each interval plus the
+-- window. If not specified, the window ranges between the start time minus
+-- the interval and the end time plus the interval.
+--
+-- -   If you specify a value for the @intervalWindowInSeconds@ parameter,
+--     the value for the @type@ parameter must be @LINEAR_INTERPOLATION@.
+--
+-- -   If a data point isn\'t found during the specified query window, IoT
+--     SiteWise won\'t return an interpolated value for the interval. This
+--     indicates that there\'s a gap in the ingested data points.
+--
+-- For example, you can get the interpolated temperature values for a wind
+-- turbine every 24 hours over a duration of 7 days. If the interpolation
+-- starts on July 1, 2021, at 9 AM with a window of 2 hours, IoT SiteWise
+-- uses the data points from 7 AM (9 AM minus 2 hours) to 11 AM (9 AM plus
+-- 2 hours) on July 2, 2021 to compute the first interpolated value. Next,
+-- IoT SiteWise uses the data points from 7 AM (9 AM minus 2 hours) to 11
+-- AM (9 AM plus 2 hours) on July 3, 2021 to compute the second
+-- interpolated value, and so on.
+--
+-- 'maxResults', 'getInterpolatedAssetPropertyValues_maxResults' - The maximum number of results to return for each paginated request. If
+-- not specified, the default value is 10.
+--
+-- 'nextToken', 'getInterpolatedAssetPropertyValues_nextToken' - The token to be used for the next set of paginated results.
+--
+-- 'propertyAlias', 'getInterpolatedAssetPropertyValues_propertyAlias' - The alias that identifies the property, such as an OPC-UA server data
+-- stream path (for example,
+-- @\/company\/windfarm\/3\/turbine\/7\/temperature@). For more
+-- information, see
+-- <https://docs.aws.amazon.com/iot-sitewise/latest/userguide/connect-data-streams.html Mapping industrial data streams to asset properties>
+-- in the /IoT SiteWise User Guide/.
+--
+-- 'propertyId', 'getInterpolatedAssetPropertyValues_propertyId' - The ID of the asset property.
+--
+-- 'startTimeOffsetInNanos', 'getInterpolatedAssetPropertyValues_startTimeOffsetInNanos' - The nanosecond offset converted from @startTimeInSeconds@.
+--
+-- 'startTimeInSeconds', 'getInterpolatedAssetPropertyValues_startTimeInSeconds' - The exclusive start of the range from which to interpolate data,
+-- expressed in seconds in Unix epoch time.
+--
+-- 'endTimeInSeconds', 'getInterpolatedAssetPropertyValues_endTimeInSeconds' - The inclusive end of the range from which to interpolate data, expressed
+-- in seconds in Unix epoch time.
+--
+-- 'quality', 'getInterpolatedAssetPropertyValues_quality' - The quality of the asset property value. You can use this parameter as a
+-- filter to choose only the asset property values that have a specific
+-- quality.
+--
+-- 'intervalInSeconds', 'getInterpolatedAssetPropertyValues_intervalInSeconds' - The time interval in seconds over which to interpolate data. Each
+-- interval starts when the previous one ends.
+--
+-- 'type'', 'getInterpolatedAssetPropertyValues_type' - The interpolation type.
+--
+-- Valid values: @LINEAR_INTERPOLATION | LOCF_INTERPOLATION@
+--
+-- -   @LINEAR_INTERPOLATION@ – Estimates missing data using
+--     <https://en.wikipedia.org/wiki/Linear_interpolation linear interpolation>.
+--
+--     For example, you can use this operation to return the interpolated
+--     temperature values for a wind turbine every 24 hours over a duration
+--     of 7 days. If the interpolation starts July 1, 2021, at 9 AM, IoT
+--     SiteWise returns the first interpolated value on July 2, 2021, at 9
+--     AM, the second interpolated value on July 3, 2021, at 9 AM, and so
+--     on.
+--
+-- -   @LOCF_INTERPOLATION@ – Estimates missing data using last observation
+--     carried forward interpolation
+--
+--     If no data point is found for an interval, IoT SiteWise returns the
+--     last observed data point for the previous interval and carries
+--     forward this interpolated value until a new data point is found.
+--
+--     For example, you can get the state of an on-off valve every 24 hours
+--     over a duration of 7 days. If the interpolation starts July 1, 2021,
+--     at 9 AM, IoT SiteWise returns the last observed data point between
+--     July 1, 2021, at 9 AM and July 2, 2021, at 9 AM as the first
+--     interpolated value. If a data point isn\'t found after 9 AM on July
+--     2, 2021, IoT SiteWise uses the same interpolated value for the rest
+--     of the days.
+newGetInterpolatedAssetPropertyValues ::
+  -- | 'startTimeInSeconds'
+  Prelude.Natural ->
+  -- | 'endTimeInSeconds'
+  Prelude.Natural ->
+  -- | 'quality'
+  Quality ->
+  -- | 'intervalInSeconds'
+  Prelude.Natural ->
+  -- | 'type''
+  Prelude.Text ->
+  GetInterpolatedAssetPropertyValues
+newGetInterpolatedAssetPropertyValues
+  pStartTimeInSeconds_
+  pEndTimeInSeconds_
+  pQuality_
+  pIntervalInSeconds_
+  pType_ =
+    GetInterpolatedAssetPropertyValues'
+      { assetId =
+          Prelude.Nothing,
+        endTimeOffsetInNanos = Prelude.Nothing,
+        intervalWindowInSeconds =
+          Prelude.Nothing,
+        maxResults = Prelude.Nothing,
+        nextToken = Prelude.Nothing,
+        propertyAlias = Prelude.Nothing,
+        propertyId = Prelude.Nothing,
+        startTimeOffsetInNanos =
+          Prelude.Nothing,
+        startTimeInSeconds =
+          pStartTimeInSeconds_,
+        endTimeInSeconds = pEndTimeInSeconds_,
+        quality = pQuality_,
+        intervalInSeconds = pIntervalInSeconds_,
+        type' = pType_
+      }
+
+-- | The ID of the asset.
+getInterpolatedAssetPropertyValues_assetId :: Lens.Lens' GetInterpolatedAssetPropertyValues (Prelude.Maybe Prelude.Text)
+getInterpolatedAssetPropertyValues_assetId = Lens.lens (\GetInterpolatedAssetPropertyValues' {assetId} -> assetId) (\s@GetInterpolatedAssetPropertyValues' {} a -> s {assetId = a} :: GetInterpolatedAssetPropertyValues)
+
+-- | The nanosecond offset converted from @endTimeInSeconds@.
+getInterpolatedAssetPropertyValues_endTimeOffsetInNanos :: Lens.Lens' GetInterpolatedAssetPropertyValues (Prelude.Maybe Prelude.Natural)
+getInterpolatedAssetPropertyValues_endTimeOffsetInNanos = Lens.lens (\GetInterpolatedAssetPropertyValues' {endTimeOffsetInNanos} -> endTimeOffsetInNanos) (\s@GetInterpolatedAssetPropertyValues' {} a -> s {endTimeOffsetInNanos = a} :: GetInterpolatedAssetPropertyValues)
+
+-- | The query interval for the window, in seconds. IoT SiteWise computes
+-- each interpolated value by using data points from the timestamp of each
+-- interval, minus the window to the timestamp of each interval plus the
+-- window. If not specified, the window ranges between the start time minus
+-- the interval and the end time plus the interval.
+--
+-- -   If you specify a value for the @intervalWindowInSeconds@ parameter,
+--     the value for the @type@ parameter must be @LINEAR_INTERPOLATION@.
+--
+-- -   If a data point isn\'t found during the specified query window, IoT
+--     SiteWise won\'t return an interpolated value for the interval. This
+--     indicates that there\'s a gap in the ingested data points.
+--
+-- For example, you can get the interpolated temperature values for a wind
+-- turbine every 24 hours over a duration of 7 days. If the interpolation
+-- starts on July 1, 2021, at 9 AM with a window of 2 hours, IoT SiteWise
+-- uses the data points from 7 AM (9 AM minus 2 hours) to 11 AM (9 AM plus
+-- 2 hours) on July 2, 2021 to compute the first interpolated value. Next,
+-- IoT SiteWise uses the data points from 7 AM (9 AM minus 2 hours) to 11
+-- AM (9 AM plus 2 hours) on July 3, 2021 to compute the second
+-- interpolated value, and so on.
+getInterpolatedAssetPropertyValues_intervalWindowInSeconds :: Lens.Lens' GetInterpolatedAssetPropertyValues (Prelude.Maybe Prelude.Natural)
+getInterpolatedAssetPropertyValues_intervalWindowInSeconds = Lens.lens (\GetInterpolatedAssetPropertyValues' {intervalWindowInSeconds} -> intervalWindowInSeconds) (\s@GetInterpolatedAssetPropertyValues' {} a -> s {intervalWindowInSeconds = a} :: GetInterpolatedAssetPropertyValues)
+
+-- | The maximum number of results to return for each paginated request. If
+-- not specified, the default value is 10.
+getInterpolatedAssetPropertyValues_maxResults :: Lens.Lens' GetInterpolatedAssetPropertyValues (Prelude.Maybe Prelude.Natural)
+getInterpolatedAssetPropertyValues_maxResults = Lens.lens (\GetInterpolatedAssetPropertyValues' {maxResults} -> maxResults) (\s@GetInterpolatedAssetPropertyValues' {} a -> s {maxResults = a} :: GetInterpolatedAssetPropertyValues)
+
+-- | The token to be used for the next set of paginated results.
+getInterpolatedAssetPropertyValues_nextToken :: Lens.Lens' GetInterpolatedAssetPropertyValues (Prelude.Maybe Prelude.Text)
+getInterpolatedAssetPropertyValues_nextToken = Lens.lens (\GetInterpolatedAssetPropertyValues' {nextToken} -> nextToken) (\s@GetInterpolatedAssetPropertyValues' {} a -> s {nextToken = a} :: GetInterpolatedAssetPropertyValues)
+
+-- | The alias that identifies the property, such as an OPC-UA server data
+-- stream path (for example,
+-- @\/company\/windfarm\/3\/turbine\/7\/temperature@). For more
+-- information, see
+-- <https://docs.aws.amazon.com/iot-sitewise/latest/userguide/connect-data-streams.html Mapping industrial data streams to asset properties>
+-- in the /IoT SiteWise User Guide/.
+getInterpolatedAssetPropertyValues_propertyAlias :: Lens.Lens' GetInterpolatedAssetPropertyValues (Prelude.Maybe Prelude.Text)
+getInterpolatedAssetPropertyValues_propertyAlias = Lens.lens (\GetInterpolatedAssetPropertyValues' {propertyAlias} -> propertyAlias) (\s@GetInterpolatedAssetPropertyValues' {} a -> s {propertyAlias = a} :: GetInterpolatedAssetPropertyValues)
+
+-- | The ID of the asset property.
+getInterpolatedAssetPropertyValues_propertyId :: Lens.Lens' GetInterpolatedAssetPropertyValues (Prelude.Maybe Prelude.Text)
+getInterpolatedAssetPropertyValues_propertyId = Lens.lens (\GetInterpolatedAssetPropertyValues' {propertyId} -> propertyId) (\s@GetInterpolatedAssetPropertyValues' {} a -> s {propertyId = a} :: GetInterpolatedAssetPropertyValues)
+
+-- | The nanosecond offset converted from @startTimeInSeconds@.
+getInterpolatedAssetPropertyValues_startTimeOffsetInNanos :: Lens.Lens' GetInterpolatedAssetPropertyValues (Prelude.Maybe Prelude.Natural)
+getInterpolatedAssetPropertyValues_startTimeOffsetInNanos = Lens.lens (\GetInterpolatedAssetPropertyValues' {startTimeOffsetInNanos} -> startTimeOffsetInNanos) (\s@GetInterpolatedAssetPropertyValues' {} a -> s {startTimeOffsetInNanos = a} :: GetInterpolatedAssetPropertyValues)
+
+-- | The exclusive start of the range from which to interpolate data,
+-- expressed in seconds in Unix epoch time.
+getInterpolatedAssetPropertyValues_startTimeInSeconds :: Lens.Lens' GetInterpolatedAssetPropertyValues Prelude.Natural
+getInterpolatedAssetPropertyValues_startTimeInSeconds = Lens.lens (\GetInterpolatedAssetPropertyValues' {startTimeInSeconds} -> startTimeInSeconds) (\s@GetInterpolatedAssetPropertyValues' {} a -> s {startTimeInSeconds = a} :: GetInterpolatedAssetPropertyValues)
+
+-- | The inclusive end of the range from which to interpolate data, expressed
+-- in seconds in Unix epoch time.
+getInterpolatedAssetPropertyValues_endTimeInSeconds :: Lens.Lens' GetInterpolatedAssetPropertyValues Prelude.Natural
+getInterpolatedAssetPropertyValues_endTimeInSeconds = Lens.lens (\GetInterpolatedAssetPropertyValues' {endTimeInSeconds} -> endTimeInSeconds) (\s@GetInterpolatedAssetPropertyValues' {} a -> s {endTimeInSeconds = a} :: GetInterpolatedAssetPropertyValues)
+
+-- | The quality of the asset property value. You can use this parameter as a
+-- filter to choose only the asset property values that have a specific
+-- quality.
+getInterpolatedAssetPropertyValues_quality :: Lens.Lens' GetInterpolatedAssetPropertyValues Quality
+getInterpolatedAssetPropertyValues_quality = Lens.lens (\GetInterpolatedAssetPropertyValues' {quality} -> quality) (\s@GetInterpolatedAssetPropertyValues' {} a -> s {quality = a} :: GetInterpolatedAssetPropertyValues)
+
+-- | The time interval in seconds over which to interpolate data. Each
+-- interval starts when the previous one ends.
+getInterpolatedAssetPropertyValues_intervalInSeconds :: Lens.Lens' GetInterpolatedAssetPropertyValues Prelude.Natural
+getInterpolatedAssetPropertyValues_intervalInSeconds = Lens.lens (\GetInterpolatedAssetPropertyValues' {intervalInSeconds} -> intervalInSeconds) (\s@GetInterpolatedAssetPropertyValues' {} a -> s {intervalInSeconds = a} :: GetInterpolatedAssetPropertyValues)
+
+-- | The interpolation type.
+--
+-- Valid values: @LINEAR_INTERPOLATION | LOCF_INTERPOLATION@
+--
+-- -   @LINEAR_INTERPOLATION@ – Estimates missing data using
+--     <https://en.wikipedia.org/wiki/Linear_interpolation linear interpolation>.
+--
+--     For example, you can use this operation to return the interpolated
+--     temperature values for a wind turbine every 24 hours over a duration
+--     of 7 days. If the interpolation starts July 1, 2021, at 9 AM, IoT
+--     SiteWise returns the first interpolated value on July 2, 2021, at 9
+--     AM, the second interpolated value on July 3, 2021, at 9 AM, and so
+--     on.
+--
+-- -   @LOCF_INTERPOLATION@ – Estimates missing data using last observation
+--     carried forward interpolation
+--
+--     If no data point is found for an interval, IoT SiteWise returns the
+--     last observed data point for the previous interval and carries
+--     forward this interpolated value until a new data point is found.
+--
+--     For example, you can get the state of an on-off valve every 24 hours
+--     over a duration of 7 days. If the interpolation starts July 1, 2021,
+--     at 9 AM, IoT SiteWise returns the last observed data point between
+--     July 1, 2021, at 9 AM and July 2, 2021, at 9 AM as the first
+--     interpolated value. If a data point isn\'t found after 9 AM on July
+--     2, 2021, IoT SiteWise uses the same interpolated value for the rest
+--     of the days.
+getInterpolatedAssetPropertyValues_type :: Lens.Lens' GetInterpolatedAssetPropertyValues Prelude.Text
+getInterpolatedAssetPropertyValues_type = Lens.lens (\GetInterpolatedAssetPropertyValues' {type'} -> type') (\s@GetInterpolatedAssetPropertyValues' {} a -> s {type' = a} :: GetInterpolatedAssetPropertyValues)
+
+instance
+  Core.AWSPager
+    GetInterpolatedAssetPropertyValues
+  where
+  page rq rs
+    | Core.stop
+        ( rs
+            Lens.^? getInterpolatedAssetPropertyValuesResponse_nextToken
+            Prelude.. Lens._Just
+        ) =
+        Prelude.Nothing
+    | Core.stop
+        ( rs
+            Lens.^. getInterpolatedAssetPropertyValuesResponse_interpolatedAssetPropertyValues
+        ) =
+        Prelude.Nothing
+    | Prelude.otherwise =
+        Prelude.Just
+          Prelude.$ rq
+          Prelude.& getInterpolatedAssetPropertyValues_nextToken
+          Lens..~ rs
+          Lens.^? getInterpolatedAssetPropertyValuesResponse_nextToken
+          Prelude.. Lens._Just
+
+instance
+  Core.AWSRequest
+    GetInterpolatedAssetPropertyValues
+  where
+  type
+    AWSResponse GetInterpolatedAssetPropertyValues =
+      GetInterpolatedAssetPropertyValuesResponse
+  request overrides =
+    Request.get (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          GetInterpolatedAssetPropertyValuesResponse'
+            Prelude.<$> (x Data..?> "nextToken")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+            Prelude.<*> ( x
+                            Data..?> "interpolatedAssetPropertyValues"
+                            Core..!@ Prelude.mempty
+                        )
+      )
+
+instance
+  Prelude.Hashable
+    GetInterpolatedAssetPropertyValues
+  where
+  hashWithSalt
+    _salt
+    GetInterpolatedAssetPropertyValues' {..} =
+      _salt
+        `Prelude.hashWithSalt` assetId
+        `Prelude.hashWithSalt` endTimeOffsetInNanos
+        `Prelude.hashWithSalt` intervalWindowInSeconds
+        `Prelude.hashWithSalt` maxResults
+        `Prelude.hashWithSalt` nextToken
+        `Prelude.hashWithSalt` propertyAlias
+        `Prelude.hashWithSalt` propertyId
+        `Prelude.hashWithSalt` startTimeOffsetInNanos
+        `Prelude.hashWithSalt` startTimeInSeconds
+        `Prelude.hashWithSalt` endTimeInSeconds
+        `Prelude.hashWithSalt` quality
+        `Prelude.hashWithSalt` intervalInSeconds
+        `Prelude.hashWithSalt` type'
+
+instance
+  Prelude.NFData
+    GetInterpolatedAssetPropertyValues
+  where
+  rnf GetInterpolatedAssetPropertyValues' {..} =
+    Prelude.rnf assetId
+      `Prelude.seq` Prelude.rnf endTimeOffsetInNanos
+      `Prelude.seq` Prelude.rnf intervalWindowInSeconds
+      `Prelude.seq` Prelude.rnf maxResults
+      `Prelude.seq` Prelude.rnf nextToken
+      `Prelude.seq` Prelude.rnf propertyAlias
+      `Prelude.seq` Prelude.rnf propertyId
+      `Prelude.seq` Prelude.rnf startTimeOffsetInNanos
+      `Prelude.seq` Prelude.rnf startTimeInSeconds
+      `Prelude.seq` Prelude.rnf endTimeInSeconds
+      `Prelude.seq` Prelude.rnf quality
+      `Prelude.seq` Prelude.rnf intervalInSeconds
+      `Prelude.seq` Prelude.rnf type'
+
+instance
+  Data.ToHeaders
+    GetInterpolatedAssetPropertyValues
+  where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance
+  Data.ToPath
+    GetInterpolatedAssetPropertyValues
+  where
+  toPath = Prelude.const "/properties/interpolated"
+
+instance
+  Data.ToQuery
+    GetInterpolatedAssetPropertyValues
+  where
+  toQuery GetInterpolatedAssetPropertyValues' {..} =
+    Prelude.mconcat
+      [ "assetId" Data.=: assetId,
+        "endTimeOffsetInNanos" Data.=: endTimeOffsetInNanos,
+        "intervalWindowInSeconds"
+          Data.=: intervalWindowInSeconds,
+        "maxResults" Data.=: maxResults,
+        "nextToken" Data.=: nextToken,
+        "propertyAlias" Data.=: propertyAlias,
+        "propertyId" Data.=: propertyId,
+        "startTimeOffsetInNanos"
+          Data.=: startTimeOffsetInNanos,
+        "startTimeInSeconds" Data.=: startTimeInSeconds,
+        "endTimeInSeconds" Data.=: endTimeInSeconds,
+        "quality" Data.=: quality,
+        "intervalInSeconds" Data.=: intervalInSeconds,
+        "type" Data.=: type'
+      ]
+
+-- | /See:/ 'newGetInterpolatedAssetPropertyValuesResponse' smart constructor.
+data GetInterpolatedAssetPropertyValuesResponse = GetInterpolatedAssetPropertyValuesResponse'
+  { -- | The token for the next set of results, or null if there are no
+    -- additional results.
+    nextToken :: Prelude.Maybe Prelude.Text,
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int,
+    -- | The requested interpolated values.
+    interpolatedAssetPropertyValues :: [InterpolatedAssetPropertyValue]
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'GetInterpolatedAssetPropertyValuesResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'nextToken', 'getInterpolatedAssetPropertyValuesResponse_nextToken' - The token for the next set of results, or null if there are no
+-- additional results.
+--
+-- 'httpStatus', 'getInterpolatedAssetPropertyValuesResponse_httpStatus' - The response's http status code.
+--
+-- 'interpolatedAssetPropertyValues', 'getInterpolatedAssetPropertyValuesResponse_interpolatedAssetPropertyValues' - The requested interpolated values.
+newGetInterpolatedAssetPropertyValuesResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  GetInterpolatedAssetPropertyValuesResponse
+newGetInterpolatedAssetPropertyValuesResponse
+  pHttpStatus_ =
+    GetInterpolatedAssetPropertyValuesResponse'
+      { nextToken =
+          Prelude.Nothing,
+        httpStatus = pHttpStatus_,
+        interpolatedAssetPropertyValues =
+          Prelude.mempty
+      }
+
+-- | The token for the next set of results, or null if there are no
+-- additional results.
+getInterpolatedAssetPropertyValuesResponse_nextToken :: Lens.Lens' GetInterpolatedAssetPropertyValuesResponse (Prelude.Maybe Prelude.Text)
+getInterpolatedAssetPropertyValuesResponse_nextToken = Lens.lens (\GetInterpolatedAssetPropertyValuesResponse' {nextToken} -> nextToken) (\s@GetInterpolatedAssetPropertyValuesResponse' {} a -> s {nextToken = a} :: GetInterpolatedAssetPropertyValuesResponse)
+
+-- | The response's http status code.
+getInterpolatedAssetPropertyValuesResponse_httpStatus :: Lens.Lens' GetInterpolatedAssetPropertyValuesResponse Prelude.Int
+getInterpolatedAssetPropertyValuesResponse_httpStatus = Lens.lens (\GetInterpolatedAssetPropertyValuesResponse' {httpStatus} -> httpStatus) (\s@GetInterpolatedAssetPropertyValuesResponse' {} a -> s {httpStatus = a} :: GetInterpolatedAssetPropertyValuesResponse)
+
+-- | The requested interpolated values.
+getInterpolatedAssetPropertyValuesResponse_interpolatedAssetPropertyValues :: Lens.Lens' GetInterpolatedAssetPropertyValuesResponse [InterpolatedAssetPropertyValue]
+getInterpolatedAssetPropertyValuesResponse_interpolatedAssetPropertyValues = Lens.lens (\GetInterpolatedAssetPropertyValuesResponse' {interpolatedAssetPropertyValues} -> interpolatedAssetPropertyValues) (\s@GetInterpolatedAssetPropertyValuesResponse' {} a -> s {interpolatedAssetPropertyValues = a} :: GetInterpolatedAssetPropertyValuesResponse) Prelude.. Lens.coerced
+
+instance
+  Prelude.NFData
+    GetInterpolatedAssetPropertyValuesResponse
+  where
+  rnf GetInterpolatedAssetPropertyValuesResponse' {..} =
+    Prelude.rnf nextToken
+      `Prelude.seq` Prelude.rnf httpStatus
+      `Prelude.seq` Prelude.rnf interpolatedAssetPropertyValues
diff --git a/gen/Amazonka/IoTSiteWise/Lens.hs b/gen/Amazonka/IoTSiteWise/Lens.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/IoTSiteWise/Lens.hs
@@ -0,0 +1,1341 @@
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-duplicate-exports #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.IoTSiteWise.Lens
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.IoTSiteWise.Lens
+  ( -- * Operations
+
+    -- ** AssociateAssets
+    associateAssets_clientToken,
+    associateAssets_assetId,
+    associateAssets_hierarchyId,
+    associateAssets_childAssetId,
+
+    -- ** AssociateTimeSeriesToAssetProperty
+    associateTimeSeriesToAssetProperty_clientToken,
+    associateTimeSeriesToAssetProperty_alias,
+    associateTimeSeriesToAssetProperty_assetId,
+    associateTimeSeriesToAssetProperty_propertyId,
+
+    -- ** BatchAssociateProjectAssets
+    batchAssociateProjectAssets_clientToken,
+    batchAssociateProjectAssets_projectId,
+    batchAssociateProjectAssets_assetIds,
+    batchAssociateProjectAssetsResponse_errors,
+    batchAssociateProjectAssetsResponse_httpStatus,
+
+    -- ** BatchDisassociateProjectAssets
+    batchDisassociateProjectAssets_clientToken,
+    batchDisassociateProjectAssets_projectId,
+    batchDisassociateProjectAssets_assetIds,
+    batchDisassociateProjectAssetsResponse_errors,
+    batchDisassociateProjectAssetsResponse_httpStatus,
+
+    -- ** BatchGetAssetPropertyAggregates
+    batchGetAssetPropertyAggregates_maxResults,
+    batchGetAssetPropertyAggregates_nextToken,
+    batchGetAssetPropertyAggregates_entries,
+    batchGetAssetPropertyAggregatesResponse_nextToken,
+    batchGetAssetPropertyAggregatesResponse_httpStatus,
+    batchGetAssetPropertyAggregatesResponse_errorEntries,
+    batchGetAssetPropertyAggregatesResponse_successEntries,
+    batchGetAssetPropertyAggregatesResponse_skippedEntries,
+
+    -- ** BatchGetAssetPropertyValue
+    batchGetAssetPropertyValue_nextToken,
+    batchGetAssetPropertyValue_entries,
+    batchGetAssetPropertyValueResponse_nextToken,
+    batchGetAssetPropertyValueResponse_httpStatus,
+    batchGetAssetPropertyValueResponse_errorEntries,
+    batchGetAssetPropertyValueResponse_successEntries,
+    batchGetAssetPropertyValueResponse_skippedEntries,
+
+    -- ** BatchGetAssetPropertyValueHistory
+    batchGetAssetPropertyValueHistory_maxResults,
+    batchGetAssetPropertyValueHistory_nextToken,
+    batchGetAssetPropertyValueHistory_entries,
+    batchGetAssetPropertyValueHistoryResponse_nextToken,
+    batchGetAssetPropertyValueHistoryResponse_httpStatus,
+    batchGetAssetPropertyValueHistoryResponse_errorEntries,
+    batchGetAssetPropertyValueHistoryResponse_successEntries,
+    batchGetAssetPropertyValueHistoryResponse_skippedEntries,
+
+    -- ** BatchPutAssetPropertyValue
+    batchPutAssetPropertyValue_entries,
+    batchPutAssetPropertyValueResponse_httpStatus,
+    batchPutAssetPropertyValueResponse_errorEntries,
+
+    -- ** CreateAccessPolicy
+    createAccessPolicy_clientToken,
+    createAccessPolicy_tags,
+    createAccessPolicy_accessPolicyIdentity,
+    createAccessPolicy_accessPolicyResource,
+    createAccessPolicy_accessPolicyPermission,
+    createAccessPolicyResponse_httpStatus,
+    createAccessPolicyResponse_accessPolicyId,
+    createAccessPolicyResponse_accessPolicyArn,
+
+    -- ** CreateAsset
+    createAsset_assetDescription,
+    createAsset_clientToken,
+    createAsset_tags,
+    createAsset_assetName,
+    createAsset_assetModelId,
+    createAssetResponse_httpStatus,
+    createAssetResponse_assetId,
+    createAssetResponse_assetArn,
+    createAssetResponse_assetStatus,
+
+    -- ** CreateAssetModel
+    createAssetModel_assetModelCompositeModels,
+    createAssetModel_assetModelDescription,
+    createAssetModel_assetModelHierarchies,
+    createAssetModel_assetModelProperties,
+    createAssetModel_clientToken,
+    createAssetModel_tags,
+    createAssetModel_assetModelName,
+    createAssetModelResponse_httpStatus,
+    createAssetModelResponse_assetModelId,
+    createAssetModelResponse_assetModelArn,
+    createAssetModelResponse_assetModelStatus,
+
+    -- ** CreateBulkImportJob
+    createBulkImportJob_jobName,
+    createBulkImportJob_jobRoleArn,
+    createBulkImportJob_files,
+    createBulkImportJob_errorReportLocation,
+    createBulkImportJob_jobConfiguration,
+    createBulkImportJobResponse_httpStatus,
+    createBulkImportJobResponse_jobId,
+    createBulkImportJobResponse_jobName,
+    createBulkImportJobResponse_jobStatus,
+
+    -- ** CreateDashboard
+    createDashboard_clientToken,
+    createDashboard_dashboardDescription,
+    createDashboard_tags,
+    createDashboard_projectId,
+    createDashboard_dashboardName,
+    createDashboard_dashboardDefinition,
+    createDashboardResponse_httpStatus,
+    createDashboardResponse_dashboardId,
+    createDashboardResponse_dashboardArn,
+
+    -- ** CreateGateway
+    createGateway_tags,
+    createGateway_gatewayName,
+    createGateway_gatewayPlatform,
+    createGatewayResponse_httpStatus,
+    createGatewayResponse_gatewayId,
+    createGatewayResponse_gatewayArn,
+
+    -- ** CreatePortal
+    createPortal_alarms,
+    createPortal_clientToken,
+    createPortal_notificationSenderEmail,
+    createPortal_portalAuthMode,
+    createPortal_portalDescription,
+    createPortal_portalLogoImageFile,
+    createPortal_tags,
+    createPortal_portalName,
+    createPortal_portalContactEmail,
+    createPortal_roleArn,
+    createPortalResponse_httpStatus,
+    createPortalResponse_portalId,
+    createPortalResponse_portalArn,
+    createPortalResponse_portalStartUrl,
+    createPortalResponse_portalStatus,
+    createPortalResponse_ssoApplicationId,
+
+    -- ** CreateProject
+    createProject_clientToken,
+    createProject_projectDescription,
+    createProject_tags,
+    createProject_portalId,
+    createProject_projectName,
+    createProjectResponse_httpStatus,
+    createProjectResponse_projectId,
+    createProjectResponse_projectArn,
+
+    -- ** DeleteAccessPolicy
+    deleteAccessPolicy_clientToken,
+    deleteAccessPolicy_accessPolicyId,
+    deleteAccessPolicyResponse_httpStatus,
+
+    -- ** DeleteAsset
+    deleteAsset_clientToken,
+    deleteAsset_assetId,
+    deleteAssetResponse_httpStatus,
+    deleteAssetResponse_assetStatus,
+
+    -- ** DeleteAssetModel
+    deleteAssetModel_clientToken,
+    deleteAssetModel_assetModelId,
+    deleteAssetModelResponse_httpStatus,
+    deleteAssetModelResponse_assetModelStatus,
+
+    -- ** DeleteDashboard
+    deleteDashboard_clientToken,
+    deleteDashboard_dashboardId,
+    deleteDashboardResponse_httpStatus,
+
+    -- ** DeleteGateway
+    deleteGateway_gatewayId,
+
+    -- ** DeletePortal
+    deletePortal_clientToken,
+    deletePortal_portalId,
+    deletePortalResponse_httpStatus,
+    deletePortalResponse_portalStatus,
+
+    -- ** DeleteProject
+    deleteProject_clientToken,
+    deleteProject_projectId,
+    deleteProjectResponse_httpStatus,
+
+    -- ** DeleteTimeSeries
+    deleteTimeSeries_alias,
+    deleteTimeSeries_assetId,
+    deleteTimeSeries_clientToken,
+    deleteTimeSeries_propertyId,
+
+    -- ** DescribeAccessPolicy
+    describeAccessPolicy_accessPolicyId,
+    describeAccessPolicyResponse_httpStatus,
+    describeAccessPolicyResponse_accessPolicyId,
+    describeAccessPolicyResponse_accessPolicyArn,
+    describeAccessPolicyResponse_accessPolicyIdentity,
+    describeAccessPolicyResponse_accessPolicyResource,
+    describeAccessPolicyResponse_accessPolicyPermission,
+    describeAccessPolicyResponse_accessPolicyCreationDate,
+    describeAccessPolicyResponse_accessPolicyLastUpdateDate,
+
+    -- ** DescribeAsset
+    describeAsset_excludeProperties,
+    describeAsset_assetId,
+    describeAssetResponse_assetCompositeModels,
+    describeAssetResponse_assetDescription,
+    describeAssetResponse_httpStatus,
+    describeAssetResponse_assetId,
+    describeAssetResponse_assetArn,
+    describeAssetResponse_assetName,
+    describeAssetResponse_assetModelId,
+    describeAssetResponse_assetProperties,
+    describeAssetResponse_assetHierarchies,
+    describeAssetResponse_assetCreationDate,
+    describeAssetResponse_assetLastUpdateDate,
+    describeAssetResponse_assetStatus,
+
+    -- ** DescribeAssetModel
+    describeAssetModel_excludeProperties,
+    describeAssetModel_assetModelId,
+    describeAssetModelResponse_assetModelCompositeModels,
+    describeAssetModelResponse_httpStatus,
+    describeAssetModelResponse_assetModelId,
+    describeAssetModelResponse_assetModelArn,
+    describeAssetModelResponse_assetModelName,
+    describeAssetModelResponse_assetModelDescription,
+    describeAssetModelResponse_assetModelProperties,
+    describeAssetModelResponse_assetModelHierarchies,
+    describeAssetModelResponse_assetModelCreationDate,
+    describeAssetModelResponse_assetModelLastUpdateDate,
+    describeAssetModelResponse_assetModelStatus,
+
+    -- ** DescribeAssetProperty
+    describeAssetProperty_assetId,
+    describeAssetProperty_propertyId,
+    describeAssetPropertyResponse_assetProperty,
+    describeAssetPropertyResponse_compositeModel,
+    describeAssetPropertyResponse_httpStatus,
+    describeAssetPropertyResponse_assetId,
+    describeAssetPropertyResponse_assetName,
+    describeAssetPropertyResponse_assetModelId,
+
+    -- ** DescribeBulkImportJob
+    describeBulkImportJob_jobId,
+    describeBulkImportJobResponse_httpStatus,
+    describeBulkImportJobResponse_jobId,
+    describeBulkImportJobResponse_jobName,
+    describeBulkImportJobResponse_jobStatus,
+    describeBulkImportJobResponse_jobRoleArn,
+    describeBulkImportJobResponse_files,
+    describeBulkImportJobResponse_errorReportLocation,
+    describeBulkImportJobResponse_jobConfiguration,
+    describeBulkImportJobResponse_jobCreationDate,
+    describeBulkImportJobResponse_jobLastUpdateDate,
+
+    -- ** DescribeDashboard
+    describeDashboard_dashboardId,
+    describeDashboardResponse_dashboardDescription,
+    describeDashboardResponse_httpStatus,
+    describeDashboardResponse_dashboardId,
+    describeDashboardResponse_dashboardArn,
+    describeDashboardResponse_dashboardName,
+    describeDashboardResponse_projectId,
+    describeDashboardResponse_dashboardDefinition,
+    describeDashboardResponse_dashboardCreationDate,
+    describeDashboardResponse_dashboardLastUpdateDate,
+
+    -- ** DescribeDefaultEncryptionConfiguration
+    describeDefaultEncryptionConfigurationResponse_kmsKeyArn,
+    describeDefaultEncryptionConfigurationResponse_httpStatus,
+    describeDefaultEncryptionConfigurationResponse_encryptionType,
+    describeDefaultEncryptionConfigurationResponse_configurationStatus,
+
+    -- ** DescribeGateway
+    describeGateway_gatewayId,
+    describeGatewayResponse_gatewayPlatform,
+    describeGatewayResponse_httpStatus,
+    describeGatewayResponse_gatewayId,
+    describeGatewayResponse_gatewayName,
+    describeGatewayResponse_gatewayArn,
+    describeGatewayResponse_gatewayCapabilitySummaries,
+    describeGatewayResponse_creationDate,
+    describeGatewayResponse_lastUpdateDate,
+
+    -- ** DescribeGatewayCapabilityConfiguration
+    describeGatewayCapabilityConfiguration_gatewayId,
+    describeGatewayCapabilityConfiguration_capabilityNamespace,
+    describeGatewayCapabilityConfigurationResponse_httpStatus,
+    describeGatewayCapabilityConfigurationResponse_gatewayId,
+    describeGatewayCapabilityConfigurationResponse_capabilityNamespace,
+    describeGatewayCapabilityConfigurationResponse_capabilityConfiguration,
+    describeGatewayCapabilityConfigurationResponse_capabilitySyncStatus,
+
+    -- ** DescribeLoggingOptions
+    describeLoggingOptionsResponse_httpStatus,
+    describeLoggingOptionsResponse_loggingOptions,
+
+    -- ** DescribePortal
+    describePortal_portalId,
+    describePortalResponse_alarms,
+    describePortalResponse_notificationSenderEmail,
+    describePortalResponse_portalAuthMode,
+    describePortalResponse_portalDescription,
+    describePortalResponse_portalLogoImageLocation,
+    describePortalResponse_roleArn,
+    describePortalResponse_httpStatus,
+    describePortalResponse_portalId,
+    describePortalResponse_portalArn,
+    describePortalResponse_portalName,
+    describePortalResponse_portalClientId,
+    describePortalResponse_portalStartUrl,
+    describePortalResponse_portalContactEmail,
+    describePortalResponse_portalStatus,
+    describePortalResponse_portalCreationDate,
+    describePortalResponse_portalLastUpdateDate,
+
+    -- ** DescribeProject
+    describeProject_projectId,
+    describeProjectResponse_projectDescription,
+    describeProjectResponse_httpStatus,
+    describeProjectResponse_projectId,
+    describeProjectResponse_projectArn,
+    describeProjectResponse_projectName,
+    describeProjectResponse_portalId,
+    describeProjectResponse_projectCreationDate,
+    describeProjectResponse_projectLastUpdateDate,
+
+    -- ** DescribeStorageConfiguration
+    describeStorageConfigurationResponse_disassociatedDataStorage,
+    describeStorageConfigurationResponse_lastUpdateDate,
+    describeStorageConfigurationResponse_multiLayerStorage,
+    describeStorageConfigurationResponse_retentionPeriod,
+    describeStorageConfigurationResponse_httpStatus,
+    describeStorageConfigurationResponse_storageType,
+    describeStorageConfigurationResponse_configurationStatus,
+
+    -- ** DescribeTimeSeries
+    describeTimeSeries_alias,
+    describeTimeSeries_assetId,
+    describeTimeSeries_propertyId,
+    describeTimeSeriesResponse_alias,
+    describeTimeSeriesResponse_assetId,
+    describeTimeSeriesResponse_dataTypeSpec,
+    describeTimeSeriesResponse_propertyId,
+    describeTimeSeriesResponse_httpStatus,
+    describeTimeSeriesResponse_timeSeriesId,
+    describeTimeSeriesResponse_dataType,
+    describeTimeSeriesResponse_timeSeriesCreationDate,
+    describeTimeSeriesResponse_timeSeriesLastUpdateDate,
+
+    -- ** DisassociateAssets
+    disassociateAssets_clientToken,
+    disassociateAssets_assetId,
+    disassociateAssets_hierarchyId,
+    disassociateAssets_childAssetId,
+
+    -- ** DisassociateTimeSeriesFromAssetProperty
+    disassociateTimeSeriesFromAssetProperty_clientToken,
+    disassociateTimeSeriesFromAssetProperty_alias,
+    disassociateTimeSeriesFromAssetProperty_assetId,
+    disassociateTimeSeriesFromAssetProperty_propertyId,
+
+    -- ** GetAssetPropertyAggregates
+    getAssetPropertyAggregates_assetId,
+    getAssetPropertyAggregates_maxResults,
+    getAssetPropertyAggregates_nextToken,
+    getAssetPropertyAggregates_propertyAlias,
+    getAssetPropertyAggregates_propertyId,
+    getAssetPropertyAggregates_qualities,
+    getAssetPropertyAggregates_timeOrdering,
+    getAssetPropertyAggregates_aggregateTypes,
+    getAssetPropertyAggregates_resolution,
+    getAssetPropertyAggregates_startDate,
+    getAssetPropertyAggregates_endDate,
+    getAssetPropertyAggregatesResponse_nextToken,
+    getAssetPropertyAggregatesResponse_httpStatus,
+    getAssetPropertyAggregatesResponse_aggregatedValues,
+
+    -- ** GetAssetPropertyValue
+    getAssetPropertyValue_assetId,
+    getAssetPropertyValue_propertyAlias,
+    getAssetPropertyValue_propertyId,
+    getAssetPropertyValueResponse_propertyValue,
+    getAssetPropertyValueResponse_httpStatus,
+
+    -- ** GetAssetPropertyValueHistory
+    getAssetPropertyValueHistory_assetId,
+    getAssetPropertyValueHistory_endDate,
+    getAssetPropertyValueHistory_maxResults,
+    getAssetPropertyValueHistory_nextToken,
+    getAssetPropertyValueHistory_propertyAlias,
+    getAssetPropertyValueHistory_propertyId,
+    getAssetPropertyValueHistory_qualities,
+    getAssetPropertyValueHistory_startDate,
+    getAssetPropertyValueHistory_timeOrdering,
+    getAssetPropertyValueHistoryResponse_nextToken,
+    getAssetPropertyValueHistoryResponse_httpStatus,
+    getAssetPropertyValueHistoryResponse_assetPropertyValueHistory,
+
+    -- ** GetInterpolatedAssetPropertyValues
+    getInterpolatedAssetPropertyValues_assetId,
+    getInterpolatedAssetPropertyValues_endTimeOffsetInNanos,
+    getInterpolatedAssetPropertyValues_intervalWindowInSeconds,
+    getInterpolatedAssetPropertyValues_maxResults,
+    getInterpolatedAssetPropertyValues_nextToken,
+    getInterpolatedAssetPropertyValues_propertyAlias,
+    getInterpolatedAssetPropertyValues_propertyId,
+    getInterpolatedAssetPropertyValues_startTimeOffsetInNanos,
+    getInterpolatedAssetPropertyValues_startTimeInSeconds,
+    getInterpolatedAssetPropertyValues_endTimeInSeconds,
+    getInterpolatedAssetPropertyValues_quality,
+    getInterpolatedAssetPropertyValues_intervalInSeconds,
+    getInterpolatedAssetPropertyValues_type,
+    getInterpolatedAssetPropertyValuesResponse_nextToken,
+    getInterpolatedAssetPropertyValuesResponse_httpStatus,
+    getInterpolatedAssetPropertyValuesResponse_interpolatedAssetPropertyValues,
+
+    -- ** ListAccessPolicies
+    listAccessPolicies_iamArn,
+    listAccessPolicies_identityId,
+    listAccessPolicies_identityType,
+    listAccessPolicies_maxResults,
+    listAccessPolicies_nextToken,
+    listAccessPolicies_resourceId,
+    listAccessPolicies_resourceType,
+    listAccessPoliciesResponse_nextToken,
+    listAccessPoliciesResponse_httpStatus,
+    listAccessPoliciesResponse_accessPolicySummaries,
+
+    -- ** ListAssetModelProperties
+    listAssetModelProperties_filter,
+    listAssetModelProperties_maxResults,
+    listAssetModelProperties_nextToken,
+    listAssetModelProperties_assetModelId,
+    listAssetModelPropertiesResponse_nextToken,
+    listAssetModelPropertiesResponse_httpStatus,
+    listAssetModelPropertiesResponse_assetModelPropertySummaries,
+
+    -- ** ListAssetModels
+    listAssetModels_maxResults,
+    listAssetModels_nextToken,
+    listAssetModelsResponse_nextToken,
+    listAssetModelsResponse_httpStatus,
+    listAssetModelsResponse_assetModelSummaries,
+
+    -- ** ListAssetProperties
+    listAssetProperties_filter,
+    listAssetProperties_maxResults,
+    listAssetProperties_nextToken,
+    listAssetProperties_assetId,
+    listAssetPropertiesResponse_nextToken,
+    listAssetPropertiesResponse_httpStatus,
+    listAssetPropertiesResponse_assetPropertySummaries,
+
+    -- ** ListAssetRelationships
+    listAssetRelationships_maxResults,
+    listAssetRelationships_nextToken,
+    listAssetRelationships_assetId,
+    listAssetRelationships_traversalType,
+    listAssetRelationshipsResponse_nextToken,
+    listAssetRelationshipsResponse_httpStatus,
+    listAssetRelationshipsResponse_assetRelationshipSummaries,
+
+    -- ** ListAssets
+    listAssets_assetModelId,
+    listAssets_filter,
+    listAssets_maxResults,
+    listAssets_nextToken,
+    listAssetsResponse_nextToken,
+    listAssetsResponse_httpStatus,
+    listAssetsResponse_assetSummaries,
+
+    -- ** ListAssociatedAssets
+    listAssociatedAssets_hierarchyId,
+    listAssociatedAssets_maxResults,
+    listAssociatedAssets_nextToken,
+    listAssociatedAssets_traversalDirection,
+    listAssociatedAssets_assetId,
+    listAssociatedAssetsResponse_nextToken,
+    listAssociatedAssetsResponse_httpStatus,
+    listAssociatedAssetsResponse_assetSummaries,
+
+    -- ** ListBulkImportJobs
+    listBulkImportJobs_filter,
+    listBulkImportJobs_maxResults,
+    listBulkImportJobs_nextToken,
+    listBulkImportJobsResponse_nextToken,
+    listBulkImportJobsResponse_httpStatus,
+    listBulkImportJobsResponse_jobSummaries,
+
+    -- ** ListDashboards
+    listDashboards_maxResults,
+    listDashboards_nextToken,
+    listDashboards_projectId,
+    listDashboardsResponse_nextToken,
+    listDashboardsResponse_httpStatus,
+    listDashboardsResponse_dashboardSummaries,
+
+    -- ** ListGateways
+    listGateways_maxResults,
+    listGateways_nextToken,
+    listGatewaysResponse_nextToken,
+    listGatewaysResponse_httpStatus,
+    listGatewaysResponse_gatewaySummaries,
+
+    -- ** ListPortals
+    listPortals_maxResults,
+    listPortals_nextToken,
+    listPortalsResponse_nextToken,
+    listPortalsResponse_portalSummaries,
+    listPortalsResponse_httpStatus,
+
+    -- ** ListProjectAssets
+    listProjectAssets_maxResults,
+    listProjectAssets_nextToken,
+    listProjectAssets_projectId,
+    listProjectAssetsResponse_nextToken,
+    listProjectAssetsResponse_httpStatus,
+    listProjectAssetsResponse_assetIds,
+
+    -- ** ListProjects
+    listProjects_maxResults,
+    listProjects_nextToken,
+    listProjects_portalId,
+    listProjectsResponse_nextToken,
+    listProjectsResponse_httpStatus,
+    listProjectsResponse_projectSummaries,
+
+    -- ** ListTagsForResource
+    listTagsForResource_resourceArn,
+    listTagsForResourceResponse_tags,
+    listTagsForResourceResponse_httpStatus,
+
+    -- ** ListTimeSeries
+    listTimeSeries_aliasPrefix,
+    listTimeSeries_assetId,
+    listTimeSeries_maxResults,
+    listTimeSeries_nextToken,
+    listTimeSeries_timeSeriesType,
+    listTimeSeriesResponse_nextToken,
+    listTimeSeriesResponse_httpStatus,
+    listTimeSeriesResponse_timeSeriesSummaries,
+
+    -- ** PutDefaultEncryptionConfiguration
+    putDefaultEncryptionConfiguration_kmsKeyId,
+    putDefaultEncryptionConfiguration_encryptionType,
+    putDefaultEncryptionConfigurationResponse_kmsKeyArn,
+    putDefaultEncryptionConfigurationResponse_httpStatus,
+    putDefaultEncryptionConfigurationResponse_encryptionType,
+    putDefaultEncryptionConfigurationResponse_configurationStatus,
+
+    -- ** PutLoggingOptions
+    putLoggingOptions_loggingOptions,
+    putLoggingOptionsResponse_httpStatus,
+
+    -- ** PutStorageConfiguration
+    putStorageConfiguration_disassociatedDataStorage,
+    putStorageConfiguration_multiLayerStorage,
+    putStorageConfiguration_retentionPeriod,
+    putStorageConfiguration_storageType,
+    putStorageConfigurationResponse_disassociatedDataStorage,
+    putStorageConfigurationResponse_multiLayerStorage,
+    putStorageConfigurationResponse_retentionPeriod,
+    putStorageConfigurationResponse_httpStatus,
+    putStorageConfigurationResponse_storageType,
+    putStorageConfigurationResponse_configurationStatus,
+
+    -- ** TagResource
+    tagResource_resourceArn,
+    tagResource_tags,
+    tagResourceResponse_httpStatus,
+
+    -- ** UntagResource
+    untagResource_resourceArn,
+    untagResource_tagKeys,
+    untagResourceResponse_httpStatus,
+
+    -- ** UpdateAccessPolicy
+    updateAccessPolicy_clientToken,
+    updateAccessPolicy_accessPolicyId,
+    updateAccessPolicy_accessPolicyIdentity,
+    updateAccessPolicy_accessPolicyResource,
+    updateAccessPolicy_accessPolicyPermission,
+    updateAccessPolicyResponse_httpStatus,
+
+    -- ** UpdateAsset
+    updateAsset_assetDescription,
+    updateAsset_clientToken,
+    updateAsset_assetId,
+    updateAsset_assetName,
+    updateAssetResponse_httpStatus,
+    updateAssetResponse_assetStatus,
+
+    -- ** UpdateAssetModel
+    updateAssetModel_assetModelCompositeModels,
+    updateAssetModel_assetModelDescription,
+    updateAssetModel_assetModelHierarchies,
+    updateAssetModel_assetModelProperties,
+    updateAssetModel_clientToken,
+    updateAssetModel_assetModelId,
+    updateAssetModel_assetModelName,
+    updateAssetModelResponse_httpStatus,
+    updateAssetModelResponse_assetModelStatus,
+
+    -- ** UpdateAssetProperty
+    updateAssetProperty_clientToken,
+    updateAssetProperty_propertyAlias,
+    updateAssetProperty_propertyNotificationState,
+    updateAssetProperty_propertyUnit,
+    updateAssetProperty_assetId,
+    updateAssetProperty_propertyId,
+
+    -- ** UpdateDashboard
+    updateDashboard_clientToken,
+    updateDashboard_dashboardDescription,
+    updateDashboard_dashboardId,
+    updateDashboard_dashboardName,
+    updateDashboard_dashboardDefinition,
+    updateDashboardResponse_httpStatus,
+
+    -- ** UpdateGateway
+    updateGateway_gatewayId,
+    updateGateway_gatewayName,
+
+    -- ** UpdateGatewayCapabilityConfiguration
+    updateGatewayCapabilityConfiguration_gatewayId,
+    updateGatewayCapabilityConfiguration_capabilityNamespace,
+    updateGatewayCapabilityConfiguration_capabilityConfiguration,
+    updateGatewayCapabilityConfigurationResponse_httpStatus,
+    updateGatewayCapabilityConfigurationResponse_capabilityNamespace,
+    updateGatewayCapabilityConfigurationResponse_capabilitySyncStatus,
+
+    -- ** UpdatePortal
+    updatePortal_alarms,
+    updatePortal_clientToken,
+    updatePortal_notificationSenderEmail,
+    updatePortal_portalDescription,
+    updatePortal_portalLogoImage,
+    updatePortal_portalId,
+    updatePortal_portalName,
+    updatePortal_portalContactEmail,
+    updatePortal_roleArn,
+    updatePortalResponse_httpStatus,
+    updatePortalResponse_portalStatus,
+
+    -- ** UpdateProject
+    updateProject_clientToken,
+    updateProject_projectDescription,
+    updateProject_projectId,
+    updateProject_projectName,
+    updateProjectResponse_httpStatus,
+
+    -- * Types
+
+    -- ** AccessPolicySummary
+    accessPolicySummary_creationDate,
+    accessPolicySummary_lastUpdateDate,
+    accessPolicySummary_id,
+    accessPolicySummary_identity,
+    accessPolicySummary_resource,
+    accessPolicySummary_permission,
+
+    -- ** AggregatedValue
+    aggregatedValue_quality,
+    aggregatedValue_timestamp,
+    aggregatedValue_value,
+
+    -- ** Aggregates
+    aggregates_average,
+    aggregates_count,
+    aggregates_maximum,
+    aggregates_minimum,
+    aggregates_standardDeviation,
+    aggregates_sum,
+
+    -- ** Alarms
+    alarms_notificationLambdaArn,
+    alarms_alarmRoleArn,
+
+    -- ** AssetCompositeModel
+    assetCompositeModel_description,
+    assetCompositeModel_id,
+    assetCompositeModel_name,
+    assetCompositeModel_type,
+    assetCompositeModel_properties,
+
+    -- ** AssetErrorDetails
+    assetErrorDetails_assetId,
+    assetErrorDetails_code,
+    assetErrorDetails_message,
+
+    -- ** AssetHierarchy
+    assetHierarchy_id,
+    assetHierarchy_name,
+
+    -- ** AssetHierarchyInfo
+    assetHierarchyInfo_childAssetId,
+    assetHierarchyInfo_parentAssetId,
+
+    -- ** AssetModelCompositeModel
+    assetModelCompositeModel_description,
+    assetModelCompositeModel_id,
+    assetModelCompositeModel_properties,
+    assetModelCompositeModel_name,
+    assetModelCompositeModel_type,
+
+    -- ** AssetModelCompositeModelDefinition
+    assetModelCompositeModelDefinition_description,
+    assetModelCompositeModelDefinition_properties,
+    assetModelCompositeModelDefinition_name,
+    assetModelCompositeModelDefinition_type,
+
+    -- ** AssetModelHierarchy
+    assetModelHierarchy_id,
+    assetModelHierarchy_name,
+    assetModelHierarchy_childAssetModelId,
+
+    -- ** AssetModelHierarchyDefinition
+    assetModelHierarchyDefinition_name,
+    assetModelHierarchyDefinition_childAssetModelId,
+
+    -- ** AssetModelProperty
+    assetModelProperty_dataTypeSpec,
+    assetModelProperty_id,
+    assetModelProperty_unit,
+    assetModelProperty_name,
+    assetModelProperty_dataType,
+    assetModelProperty_type,
+
+    -- ** AssetModelPropertyDefinition
+    assetModelPropertyDefinition_dataTypeSpec,
+    assetModelPropertyDefinition_unit,
+    assetModelPropertyDefinition_name,
+    assetModelPropertyDefinition_dataType,
+    assetModelPropertyDefinition_type,
+
+    -- ** AssetModelPropertySummary
+    assetModelPropertySummary_assetModelCompositeModelId,
+    assetModelPropertySummary_dataTypeSpec,
+    assetModelPropertySummary_id,
+    assetModelPropertySummary_unit,
+    assetModelPropertySummary_name,
+    assetModelPropertySummary_dataType,
+    assetModelPropertySummary_type,
+
+    -- ** AssetModelStatus
+    assetModelStatus_error,
+    assetModelStatus_state,
+
+    -- ** AssetModelSummary
+    assetModelSummary_id,
+    assetModelSummary_arn,
+    assetModelSummary_name,
+    assetModelSummary_description,
+    assetModelSummary_creationDate,
+    assetModelSummary_lastUpdateDate,
+    assetModelSummary_status,
+
+    -- ** AssetProperty
+    assetProperty_alias,
+    assetProperty_dataTypeSpec,
+    assetProperty_notification,
+    assetProperty_unit,
+    assetProperty_id,
+    assetProperty_name,
+    assetProperty_dataType,
+
+    -- ** AssetPropertySummary
+    assetPropertySummary_alias,
+    assetPropertySummary_assetCompositeModelId,
+    assetPropertySummary_id,
+    assetPropertySummary_notification,
+    assetPropertySummary_unit,
+
+    -- ** AssetPropertyValue
+    assetPropertyValue_quality,
+    assetPropertyValue_value,
+    assetPropertyValue_timestamp,
+
+    -- ** AssetRelationshipSummary
+    assetRelationshipSummary_hierarchyInfo,
+    assetRelationshipSummary_relationshipType,
+
+    -- ** AssetStatus
+    assetStatus_error,
+    assetStatus_state,
+
+    -- ** AssetSummary
+    assetSummary_description,
+    assetSummary_id,
+    assetSummary_arn,
+    assetSummary_name,
+    assetSummary_assetModelId,
+    assetSummary_creationDate,
+    assetSummary_lastUpdateDate,
+    assetSummary_status,
+    assetSummary_hierarchies,
+
+    -- ** AssociatedAssetsSummary
+    associatedAssetsSummary_description,
+    associatedAssetsSummary_id,
+    associatedAssetsSummary_arn,
+    associatedAssetsSummary_name,
+    associatedAssetsSummary_assetModelId,
+    associatedAssetsSummary_creationDate,
+    associatedAssetsSummary_lastUpdateDate,
+    associatedAssetsSummary_status,
+    associatedAssetsSummary_hierarchies,
+
+    -- ** Attribute
+    attribute_defaultValue,
+
+    -- ** BatchGetAssetPropertyAggregatesEntry
+    batchGetAssetPropertyAggregatesEntry_assetId,
+    batchGetAssetPropertyAggregatesEntry_propertyAlias,
+    batchGetAssetPropertyAggregatesEntry_propertyId,
+    batchGetAssetPropertyAggregatesEntry_qualities,
+    batchGetAssetPropertyAggregatesEntry_timeOrdering,
+    batchGetAssetPropertyAggregatesEntry_entryId,
+    batchGetAssetPropertyAggregatesEntry_aggregateTypes,
+    batchGetAssetPropertyAggregatesEntry_resolution,
+    batchGetAssetPropertyAggregatesEntry_startDate,
+    batchGetAssetPropertyAggregatesEntry_endDate,
+
+    -- ** BatchGetAssetPropertyAggregatesErrorEntry
+    batchGetAssetPropertyAggregatesErrorEntry_errorCode,
+    batchGetAssetPropertyAggregatesErrorEntry_errorMessage,
+    batchGetAssetPropertyAggregatesErrorEntry_entryId,
+
+    -- ** BatchGetAssetPropertyAggregatesErrorInfo
+    batchGetAssetPropertyAggregatesErrorInfo_errorCode,
+    batchGetAssetPropertyAggregatesErrorInfo_errorTimestamp,
+
+    -- ** BatchGetAssetPropertyAggregatesSkippedEntry
+    batchGetAssetPropertyAggregatesSkippedEntry_errorInfo,
+    batchGetAssetPropertyAggregatesSkippedEntry_entryId,
+    batchGetAssetPropertyAggregatesSkippedEntry_completionStatus,
+
+    -- ** BatchGetAssetPropertyAggregatesSuccessEntry
+    batchGetAssetPropertyAggregatesSuccessEntry_entryId,
+    batchGetAssetPropertyAggregatesSuccessEntry_aggregatedValues,
+
+    -- ** BatchGetAssetPropertyValueEntry
+    batchGetAssetPropertyValueEntry_assetId,
+    batchGetAssetPropertyValueEntry_propertyAlias,
+    batchGetAssetPropertyValueEntry_propertyId,
+    batchGetAssetPropertyValueEntry_entryId,
+
+    -- ** BatchGetAssetPropertyValueErrorEntry
+    batchGetAssetPropertyValueErrorEntry_errorCode,
+    batchGetAssetPropertyValueErrorEntry_errorMessage,
+    batchGetAssetPropertyValueErrorEntry_entryId,
+
+    -- ** BatchGetAssetPropertyValueErrorInfo
+    batchGetAssetPropertyValueErrorInfo_errorCode,
+    batchGetAssetPropertyValueErrorInfo_errorTimestamp,
+
+    -- ** BatchGetAssetPropertyValueHistoryEntry
+    batchGetAssetPropertyValueHistoryEntry_assetId,
+    batchGetAssetPropertyValueHistoryEntry_endDate,
+    batchGetAssetPropertyValueHistoryEntry_propertyAlias,
+    batchGetAssetPropertyValueHistoryEntry_propertyId,
+    batchGetAssetPropertyValueHistoryEntry_qualities,
+    batchGetAssetPropertyValueHistoryEntry_startDate,
+    batchGetAssetPropertyValueHistoryEntry_timeOrdering,
+    batchGetAssetPropertyValueHistoryEntry_entryId,
+
+    -- ** BatchGetAssetPropertyValueHistoryErrorEntry
+    batchGetAssetPropertyValueHistoryErrorEntry_errorCode,
+    batchGetAssetPropertyValueHistoryErrorEntry_errorMessage,
+    batchGetAssetPropertyValueHistoryErrorEntry_entryId,
+
+    -- ** BatchGetAssetPropertyValueHistoryErrorInfo
+    batchGetAssetPropertyValueHistoryErrorInfo_errorCode,
+    batchGetAssetPropertyValueHistoryErrorInfo_errorTimestamp,
+
+    -- ** BatchGetAssetPropertyValueHistorySkippedEntry
+    batchGetAssetPropertyValueHistorySkippedEntry_errorInfo,
+    batchGetAssetPropertyValueHistorySkippedEntry_entryId,
+    batchGetAssetPropertyValueHistorySkippedEntry_completionStatus,
+
+    -- ** BatchGetAssetPropertyValueHistorySuccessEntry
+    batchGetAssetPropertyValueHistorySuccessEntry_entryId,
+    batchGetAssetPropertyValueHistorySuccessEntry_assetPropertyValueHistory,
+
+    -- ** BatchGetAssetPropertyValueSkippedEntry
+    batchGetAssetPropertyValueSkippedEntry_errorInfo,
+    batchGetAssetPropertyValueSkippedEntry_entryId,
+    batchGetAssetPropertyValueSkippedEntry_completionStatus,
+
+    -- ** BatchGetAssetPropertyValueSuccessEntry
+    batchGetAssetPropertyValueSuccessEntry_assetPropertyValue,
+    batchGetAssetPropertyValueSuccessEntry_entryId,
+
+    -- ** BatchPutAssetPropertyError
+    batchPutAssetPropertyError_errorCode,
+    batchPutAssetPropertyError_errorMessage,
+    batchPutAssetPropertyError_timestamps,
+
+    -- ** BatchPutAssetPropertyErrorEntry
+    batchPutAssetPropertyErrorEntry_entryId,
+    batchPutAssetPropertyErrorEntry_errors,
+
+    -- ** CompositeModelProperty
+    compositeModelProperty_id,
+    compositeModelProperty_name,
+    compositeModelProperty_type,
+    compositeModelProperty_assetProperty,
+
+    -- ** ConfigurationErrorDetails
+    configurationErrorDetails_code,
+    configurationErrorDetails_message,
+
+    -- ** ConfigurationStatus
+    configurationStatus_error,
+    configurationStatus_state,
+
+    -- ** Csv
+    csv_columnNames,
+
+    -- ** CustomerManagedS3Storage
+    customerManagedS3Storage_s3ResourceArn,
+    customerManagedS3Storage_roleArn,
+
+    -- ** DashboardSummary
+    dashboardSummary_creationDate,
+    dashboardSummary_description,
+    dashboardSummary_lastUpdateDate,
+    dashboardSummary_id,
+    dashboardSummary_name,
+
+    -- ** DetailedError
+    detailedError_code,
+    detailedError_message,
+
+    -- ** ErrorDetails
+    errorDetails_details,
+    errorDetails_code,
+    errorDetails_message,
+
+    -- ** ErrorReportLocation
+    errorReportLocation_bucket,
+    errorReportLocation_prefix,
+
+    -- ** ExpressionVariable
+    expressionVariable_name,
+    expressionVariable_value,
+
+    -- ** File
+    file_versionId,
+    file_bucket,
+    file_key,
+
+    -- ** FileFormat
+    fileFormat_csv,
+
+    -- ** ForwardingConfig
+    forwardingConfig_state,
+
+    -- ** GatewayCapabilitySummary
+    gatewayCapabilitySummary_capabilityNamespace,
+    gatewayCapabilitySummary_capabilitySyncStatus,
+
+    -- ** GatewayPlatform
+    gatewayPlatform_greengrass,
+    gatewayPlatform_greengrassV2,
+
+    -- ** GatewaySummary
+    gatewaySummary_gatewayCapabilitySummaries,
+    gatewaySummary_gatewayPlatform,
+    gatewaySummary_gatewayId,
+    gatewaySummary_gatewayName,
+    gatewaySummary_creationDate,
+    gatewaySummary_lastUpdateDate,
+
+    -- ** Greengrass
+    greengrass_groupArn,
+
+    -- ** GreengrassV2
+    greengrassV2_coreDeviceThingName,
+
+    -- ** GroupIdentity
+    groupIdentity_id,
+
+    -- ** IAMRoleIdentity
+    iAMRoleIdentity_arn,
+
+    -- ** IAMUserIdentity
+    iAMUserIdentity_arn,
+
+    -- ** Identity
+    identity_group,
+    identity_iamRole,
+    identity_iamUser,
+    identity_user,
+
+    -- ** Image
+    image_file,
+    image_id,
+
+    -- ** ImageFile
+    imageFile_data,
+    imageFile_type,
+
+    -- ** ImageLocation
+    imageLocation_id,
+    imageLocation_url,
+
+    -- ** InterpolatedAssetPropertyValue
+    interpolatedAssetPropertyValue_timestamp,
+    interpolatedAssetPropertyValue_value,
+
+    -- ** JobConfiguration
+    jobConfiguration_fileFormat,
+
+    -- ** JobSummary
+    jobSummary_id,
+    jobSummary_name,
+    jobSummary_status,
+
+    -- ** LoggingOptions
+    loggingOptions_level,
+
+    -- ** Measurement
+    measurement_processingConfig,
+
+    -- ** MeasurementProcessingConfig
+    measurementProcessingConfig_forwardingConfig,
+
+    -- ** Metric
+    metric_processingConfig,
+    metric_expression,
+    metric_variables,
+    metric_window,
+
+    -- ** MetricProcessingConfig
+    metricProcessingConfig_computeLocation,
+
+    -- ** MetricWindow
+    metricWindow_tumbling,
+
+    -- ** MonitorErrorDetails
+    monitorErrorDetails_code,
+    monitorErrorDetails_message,
+
+    -- ** MultiLayerStorage
+    multiLayerStorage_customerManagedS3Storage,
+
+    -- ** PortalResource
+    portalResource_id,
+
+    -- ** PortalStatus
+    portalStatus_error,
+    portalStatus_state,
+
+    -- ** PortalSummary
+    portalSummary_creationDate,
+    portalSummary_description,
+    portalSummary_lastUpdateDate,
+    portalSummary_roleArn,
+    portalSummary_id,
+    portalSummary_name,
+    portalSummary_startUrl,
+    portalSummary_status,
+
+    -- ** ProjectResource
+    projectResource_id,
+
+    -- ** ProjectSummary
+    projectSummary_creationDate,
+    projectSummary_description,
+    projectSummary_lastUpdateDate,
+    projectSummary_id,
+    projectSummary_name,
+
+    -- ** Property
+    property_alias,
+    property_notification,
+    property_type,
+    property_unit,
+    property_id,
+    property_name,
+    property_dataType,
+
+    -- ** PropertyNotification
+    propertyNotification_topic,
+    propertyNotification_state,
+
+    -- ** PropertyType
+    propertyType_attribute,
+    propertyType_measurement,
+    propertyType_metric,
+    propertyType_transform,
+
+    -- ** PutAssetPropertyValueEntry
+    putAssetPropertyValueEntry_assetId,
+    putAssetPropertyValueEntry_propertyAlias,
+    putAssetPropertyValueEntry_propertyId,
+    putAssetPropertyValueEntry_entryId,
+    putAssetPropertyValueEntry_propertyValues,
+
+    -- ** Resource
+    resource_portal,
+    resource_project,
+
+    -- ** RetentionPeriod
+    retentionPeriod_numberOfDays,
+    retentionPeriod_unlimited,
+
+    -- ** TimeInNanos
+    timeInNanos_offsetInNanos,
+    timeInNanos_timeInSeconds,
+
+    -- ** TimeSeriesSummary
+    timeSeriesSummary_alias,
+    timeSeriesSummary_assetId,
+    timeSeriesSummary_dataTypeSpec,
+    timeSeriesSummary_propertyId,
+    timeSeriesSummary_timeSeriesId,
+    timeSeriesSummary_dataType,
+    timeSeriesSummary_timeSeriesCreationDate,
+    timeSeriesSummary_timeSeriesLastUpdateDate,
+
+    -- ** Transform
+    transform_processingConfig,
+    transform_expression,
+    transform_variables,
+
+    -- ** TransformProcessingConfig
+    transformProcessingConfig_forwardingConfig,
+    transformProcessingConfig_computeLocation,
+
+    -- ** TumblingWindow
+    tumblingWindow_offset,
+    tumblingWindow_interval,
+
+    -- ** UserIdentity
+    userIdentity_id,
+
+    -- ** VariableValue
+    variableValue_hierarchyId,
+    variableValue_propertyId,
+
+    -- ** Variant
+    variant_booleanValue,
+    variant_doubleValue,
+    variant_integerValue,
+    variant_stringValue,
+  )
+where
+
+import Amazonka.IoTSiteWise.AssociateAssets
+import Amazonka.IoTSiteWise.AssociateTimeSeriesToAssetProperty
+import Amazonka.IoTSiteWise.BatchAssociateProjectAssets
+import Amazonka.IoTSiteWise.BatchDisassociateProjectAssets
+import Amazonka.IoTSiteWise.BatchGetAssetPropertyAggregates
+import Amazonka.IoTSiteWise.BatchGetAssetPropertyValue
+import Amazonka.IoTSiteWise.BatchGetAssetPropertyValueHistory
+import Amazonka.IoTSiteWise.BatchPutAssetPropertyValue
+import Amazonka.IoTSiteWise.CreateAccessPolicy
+import Amazonka.IoTSiteWise.CreateAsset
+import Amazonka.IoTSiteWise.CreateAssetModel
+import Amazonka.IoTSiteWise.CreateBulkImportJob
+import Amazonka.IoTSiteWise.CreateDashboard
+import Amazonka.IoTSiteWise.CreateGateway
+import Amazonka.IoTSiteWise.CreatePortal
+import Amazonka.IoTSiteWise.CreateProject
+import Amazonka.IoTSiteWise.DeleteAccessPolicy
+import Amazonka.IoTSiteWise.DeleteAsset
+import Amazonka.IoTSiteWise.DeleteAssetModel
+import Amazonka.IoTSiteWise.DeleteDashboard
+import Amazonka.IoTSiteWise.DeleteGateway
+import Amazonka.IoTSiteWise.DeletePortal
+import Amazonka.IoTSiteWise.DeleteProject
+import Amazonka.IoTSiteWise.DeleteTimeSeries
+import Amazonka.IoTSiteWise.DescribeAccessPolicy
+import Amazonka.IoTSiteWise.DescribeAsset
+import Amazonka.IoTSiteWise.DescribeAssetModel
+import Amazonka.IoTSiteWise.DescribeAssetProperty
+import Amazonka.IoTSiteWise.DescribeBulkImportJob
+import Amazonka.IoTSiteWise.DescribeDashboard
+import Amazonka.IoTSiteWise.DescribeDefaultEncryptionConfiguration
+import Amazonka.IoTSiteWise.DescribeGateway
+import Amazonka.IoTSiteWise.DescribeGatewayCapabilityConfiguration
+import Amazonka.IoTSiteWise.DescribeLoggingOptions
+import Amazonka.IoTSiteWise.DescribePortal
+import Amazonka.IoTSiteWise.DescribeProject
+import Amazonka.IoTSiteWise.DescribeStorageConfiguration
+import Amazonka.IoTSiteWise.DescribeTimeSeries
+import Amazonka.IoTSiteWise.DisassociateAssets
+import Amazonka.IoTSiteWise.DisassociateTimeSeriesFromAssetProperty
+import Amazonka.IoTSiteWise.GetAssetPropertyAggregates
+import Amazonka.IoTSiteWise.GetAssetPropertyValue
+import Amazonka.IoTSiteWise.GetAssetPropertyValueHistory
+import Amazonka.IoTSiteWise.GetInterpolatedAssetPropertyValues
+import Amazonka.IoTSiteWise.ListAccessPolicies
+import Amazonka.IoTSiteWise.ListAssetModelProperties
+import Amazonka.IoTSiteWise.ListAssetModels
+import Amazonka.IoTSiteWise.ListAssetProperties
+import Amazonka.IoTSiteWise.ListAssetRelationships
+import Amazonka.IoTSiteWise.ListAssets
+import Amazonka.IoTSiteWise.ListAssociatedAssets
+import Amazonka.IoTSiteWise.ListBulkImportJobs
+import Amazonka.IoTSiteWise.ListDashboards
+import Amazonka.IoTSiteWise.ListGateways
+import Amazonka.IoTSiteWise.ListPortals
+import Amazonka.IoTSiteWise.ListProjectAssets
+import Amazonka.IoTSiteWise.ListProjects
+import Amazonka.IoTSiteWise.ListTagsForResource
+import Amazonka.IoTSiteWise.ListTimeSeries
+import Amazonka.IoTSiteWise.PutDefaultEncryptionConfiguration
+import Amazonka.IoTSiteWise.PutLoggingOptions
+import Amazonka.IoTSiteWise.PutStorageConfiguration
+import Amazonka.IoTSiteWise.TagResource
+import Amazonka.IoTSiteWise.Types.AccessPolicySummary
+import Amazonka.IoTSiteWise.Types.AggregatedValue
+import Amazonka.IoTSiteWise.Types.Aggregates
+import Amazonka.IoTSiteWise.Types.Alarms
+import Amazonka.IoTSiteWise.Types.AssetCompositeModel
+import Amazonka.IoTSiteWise.Types.AssetErrorDetails
+import Amazonka.IoTSiteWise.Types.AssetHierarchy
+import Amazonka.IoTSiteWise.Types.AssetHierarchyInfo
+import Amazonka.IoTSiteWise.Types.AssetModelCompositeModel
+import Amazonka.IoTSiteWise.Types.AssetModelCompositeModelDefinition
+import Amazonka.IoTSiteWise.Types.AssetModelHierarchy
+import Amazonka.IoTSiteWise.Types.AssetModelHierarchyDefinition
+import Amazonka.IoTSiteWise.Types.AssetModelProperty
+import Amazonka.IoTSiteWise.Types.AssetModelPropertyDefinition
+import Amazonka.IoTSiteWise.Types.AssetModelPropertySummary
+import Amazonka.IoTSiteWise.Types.AssetModelStatus
+import Amazonka.IoTSiteWise.Types.AssetModelSummary
+import Amazonka.IoTSiteWise.Types.AssetProperty
+import Amazonka.IoTSiteWise.Types.AssetPropertySummary
+import Amazonka.IoTSiteWise.Types.AssetPropertyValue
+import Amazonka.IoTSiteWise.Types.AssetRelationshipSummary
+import Amazonka.IoTSiteWise.Types.AssetStatus
+import Amazonka.IoTSiteWise.Types.AssetSummary
+import Amazonka.IoTSiteWise.Types.AssociatedAssetsSummary
+import Amazonka.IoTSiteWise.Types.Attribute
+import Amazonka.IoTSiteWise.Types.BatchGetAssetPropertyAggregatesEntry
+import Amazonka.IoTSiteWise.Types.BatchGetAssetPropertyAggregatesErrorEntry
+import Amazonka.IoTSiteWise.Types.BatchGetAssetPropertyAggregatesErrorInfo
+import Amazonka.IoTSiteWise.Types.BatchGetAssetPropertyAggregatesSkippedEntry
+import Amazonka.IoTSiteWise.Types.BatchGetAssetPropertyAggregatesSuccessEntry
+import Amazonka.IoTSiteWise.Types.BatchGetAssetPropertyValueEntry
+import Amazonka.IoTSiteWise.Types.BatchGetAssetPropertyValueErrorEntry
+import Amazonka.IoTSiteWise.Types.BatchGetAssetPropertyValueErrorInfo
+import Amazonka.IoTSiteWise.Types.BatchGetAssetPropertyValueHistoryEntry
+import Amazonka.IoTSiteWise.Types.BatchGetAssetPropertyValueHistoryErrorEntry
+import Amazonka.IoTSiteWise.Types.BatchGetAssetPropertyValueHistoryErrorInfo
+import Amazonka.IoTSiteWise.Types.BatchGetAssetPropertyValueHistorySkippedEntry
+import Amazonka.IoTSiteWise.Types.BatchGetAssetPropertyValueHistorySuccessEntry
+import Amazonka.IoTSiteWise.Types.BatchGetAssetPropertyValueSkippedEntry
+import Amazonka.IoTSiteWise.Types.BatchGetAssetPropertyValueSuccessEntry
+import Amazonka.IoTSiteWise.Types.BatchPutAssetPropertyError
+import Amazonka.IoTSiteWise.Types.BatchPutAssetPropertyErrorEntry
+import Amazonka.IoTSiteWise.Types.CompositeModelProperty
+import Amazonka.IoTSiteWise.Types.ConfigurationErrorDetails
+import Amazonka.IoTSiteWise.Types.ConfigurationStatus
+import Amazonka.IoTSiteWise.Types.Csv
+import Amazonka.IoTSiteWise.Types.CustomerManagedS3Storage
+import Amazonka.IoTSiteWise.Types.DashboardSummary
+import Amazonka.IoTSiteWise.Types.DetailedError
+import Amazonka.IoTSiteWise.Types.ErrorDetails
+import Amazonka.IoTSiteWise.Types.ErrorReportLocation
+import Amazonka.IoTSiteWise.Types.ExpressionVariable
+import Amazonka.IoTSiteWise.Types.File
+import Amazonka.IoTSiteWise.Types.FileFormat
+import Amazonka.IoTSiteWise.Types.ForwardingConfig
+import Amazonka.IoTSiteWise.Types.GatewayCapabilitySummary
+import Amazonka.IoTSiteWise.Types.GatewayPlatform
+import Amazonka.IoTSiteWise.Types.GatewaySummary
+import Amazonka.IoTSiteWise.Types.Greengrass
+import Amazonka.IoTSiteWise.Types.GreengrassV2
+import Amazonka.IoTSiteWise.Types.GroupIdentity
+import Amazonka.IoTSiteWise.Types.IAMRoleIdentity
+import Amazonka.IoTSiteWise.Types.IAMUserIdentity
+import Amazonka.IoTSiteWise.Types.Identity
+import Amazonka.IoTSiteWise.Types.Image
+import Amazonka.IoTSiteWise.Types.ImageFile
+import Amazonka.IoTSiteWise.Types.ImageLocation
+import Amazonka.IoTSiteWise.Types.InterpolatedAssetPropertyValue
+import Amazonka.IoTSiteWise.Types.JobConfiguration
+import Amazonka.IoTSiteWise.Types.JobSummary
+import Amazonka.IoTSiteWise.Types.LoggingOptions
+import Amazonka.IoTSiteWise.Types.Measurement
+import Amazonka.IoTSiteWise.Types.MeasurementProcessingConfig
+import Amazonka.IoTSiteWise.Types.Metric
+import Amazonka.IoTSiteWise.Types.MetricProcessingConfig
+import Amazonka.IoTSiteWise.Types.MetricWindow
+import Amazonka.IoTSiteWise.Types.MonitorErrorDetails
+import Amazonka.IoTSiteWise.Types.MultiLayerStorage
+import Amazonka.IoTSiteWise.Types.PortalResource
+import Amazonka.IoTSiteWise.Types.PortalStatus
+import Amazonka.IoTSiteWise.Types.PortalSummary
+import Amazonka.IoTSiteWise.Types.ProjectResource
+import Amazonka.IoTSiteWise.Types.ProjectSummary
+import Amazonka.IoTSiteWise.Types.Property
+import Amazonka.IoTSiteWise.Types.PropertyNotification
+import Amazonka.IoTSiteWise.Types.PropertyType
+import Amazonka.IoTSiteWise.Types.PutAssetPropertyValueEntry
+import Amazonka.IoTSiteWise.Types.Resource
+import Amazonka.IoTSiteWise.Types.RetentionPeriod
+import Amazonka.IoTSiteWise.Types.TimeInNanos
+import Amazonka.IoTSiteWise.Types.TimeSeriesSummary
+import Amazonka.IoTSiteWise.Types.Transform
+import Amazonka.IoTSiteWise.Types.TransformProcessingConfig
+import Amazonka.IoTSiteWise.Types.TumblingWindow
+import Amazonka.IoTSiteWise.Types.UserIdentity
+import Amazonka.IoTSiteWise.Types.VariableValue
+import Amazonka.IoTSiteWise.Types.Variant
+import Amazonka.IoTSiteWise.UntagResource
+import Amazonka.IoTSiteWise.UpdateAccessPolicy
+import Amazonka.IoTSiteWise.UpdateAsset
+import Amazonka.IoTSiteWise.UpdateAssetModel
+import Amazonka.IoTSiteWise.UpdateAssetProperty
+import Amazonka.IoTSiteWise.UpdateDashboard
+import Amazonka.IoTSiteWise.UpdateGateway
+import Amazonka.IoTSiteWise.UpdateGatewayCapabilityConfiguration
+import Amazonka.IoTSiteWise.UpdatePortal
+import Amazonka.IoTSiteWise.UpdateProject
diff --git a/gen/Amazonka/IoTSiteWise/ListAccessPolicies.hs b/gen/Amazonka/IoTSiteWise/ListAccessPolicies.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/IoTSiteWise/ListAccessPolicies.hs
@@ -0,0 +1,313 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.IoTSiteWise.ListAccessPolicies
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Retrieves a paginated list of access policies for an identity (an IAM
+-- Identity Center user, an IAM Identity Center group, or an IAM user) or
+-- an IoT SiteWise Monitor resource (a portal or project).
+--
+-- This operation returns paginated results.
+module Amazonka.IoTSiteWise.ListAccessPolicies
+  ( -- * Creating a Request
+    ListAccessPolicies (..),
+    newListAccessPolicies,
+
+    -- * Request Lenses
+    listAccessPolicies_iamArn,
+    listAccessPolicies_identityId,
+    listAccessPolicies_identityType,
+    listAccessPolicies_maxResults,
+    listAccessPolicies_nextToken,
+    listAccessPolicies_resourceId,
+    listAccessPolicies_resourceType,
+
+    -- * Destructuring the Response
+    ListAccessPoliciesResponse (..),
+    newListAccessPoliciesResponse,
+
+    -- * Response Lenses
+    listAccessPoliciesResponse_nextToken,
+    listAccessPoliciesResponse_httpStatus,
+    listAccessPoliciesResponse_accessPolicySummaries,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.IoTSiteWise.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newListAccessPolicies' smart constructor.
+data ListAccessPolicies = ListAccessPolicies'
+  { -- | The ARN of the IAM user. For more information, see
+    -- <https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_identifiers.html IAM ARNs>
+    -- in the /IAM User Guide/. This parameter is required if you specify @IAM@
+    -- for @identityType@.
+    iamArn :: Prelude.Maybe Prelude.Text,
+    -- | The ID of the identity. This parameter is required if you specify @USER@
+    -- or @GROUP@ for @identityType@.
+    identityId :: Prelude.Maybe Prelude.Text,
+    -- | The type of identity (IAM Identity Center user, IAM Identity Center
+    -- group, or IAM user). This parameter is required if you specify
+    -- @identityId@.
+    identityType :: Prelude.Maybe IdentityType,
+    -- | The maximum number of results to return for each paginated request.
+    --
+    -- Default: 50
+    maxResults :: Prelude.Maybe Prelude.Natural,
+    -- | The token to be used for the next set of paginated results.
+    nextToken :: Prelude.Maybe Prelude.Text,
+    -- | The ID of the resource. This parameter is required if you specify
+    -- @resourceType@.
+    resourceId :: Prelude.Maybe Prelude.Text,
+    -- | The type of resource (portal or project). This parameter is required if
+    -- you specify @resourceId@.
+    resourceType :: Prelude.Maybe ResourceType
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ListAccessPolicies' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'iamArn', 'listAccessPolicies_iamArn' - The ARN of the IAM user. For more information, see
+-- <https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_identifiers.html IAM ARNs>
+-- in the /IAM User Guide/. This parameter is required if you specify @IAM@
+-- for @identityType@.
+--
+-- 'identityId', 'listAccessPolicies_identityId' - The ID of the identity. This parameter is required if you specify @USER@
+-- or @GROUP@ for @identityType@.
+--
+-- 'identityType', 'listAccessPolicies_identityType' - The type of identity (IAM Identity Center user, IAM Identity Center
+-- group, or IAM user). This parameter is required if you specify
+-- @identityId@.
+--
+-- 'maxResults', 'listAccessPolicies_maxResults' - The maximum number of results to return for each paginated request.
+--
+-- Default: 50
+--
+-- 'nextToken', 'listAccessPolicies_nextToken' - The token to be used for the next set of paginated results.
+--
+-- 'resourceId', 'listAccessPolicies_resourceId' - The ID of the resource. This parameter is required if you specify
+-- @resourceType@.
+--
+-- 'resourceType', 'listAccessPolicies_resourceType' - The type of resource (portal or project). This parameter is required if
+-- you specify @resourceId@.
+newListAccessPolicies ::
+  ListAccessPolicies
+newListAccessPolicies =
+  ListAccessPolicies'
+    { iamArn = Prelude.Nothing,
+      identityId = Prelude.Nothing,
+      identityType = Prelude.Nothing,
+      maxResults = Prelude.Nothing,
+      nextToken = Prelude.Nothing,
+      resourceId = Prelude.Nothing,
+      resourceType = Prelude.Nothing
+    }
+
+-- | The ARN of the IAM user. For more information, see
+-- <https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_identifiers.html IAM ARNs>
+-- in the /IAM User Guide/. This parameter is required if you specify @IAM@
+-- for @identityType@.
+listAccessPolicies_iamArn :: Lens.Lens' ListAccessPolicies (Prelude.Maybe Prelude.Text)
+listAccessPolicies_iamArn = Lens.lens (\ListAccessPolicies' {iamArn} -> iamArn) (\s@ListAccessPolicies' {} a -> s {iamArn = a} :: ListAccessPolicies)
+
+-- | The ID of the identity. This parameter is required if you specify @USER@
+-- or @GROUP@ for @identityType@.
+listAccessPolicies_identityId :: Lens.Lens' ListAccessPolicies (Prelude.Maybe Prelude.Text)
+listAccessPolicies_identityId = Lens.lens (\ListAccessPolicies' {identityId} -> identityId) (\s@ListAccessPolicies' {} a -> s {identityId = a} :: ListAccessPolicies)
+
+-- | The type of identity (IAM Identity Center user, IAM Identity Center
+-- group, or IAM user). This parameter is required if you specify
+-- @identityId@.
+listAccessPolicies_identityType :: Lens.Lens' ListAccessPolicies (Prelude.Maybe IdentityType)
+listAccessPolicies_identityType = Lens.lens (\ListAccessPolicies' {identityType} -> identityType) (\s@ListAccessPolicies' {} a -> s {identityType = a} :: ListAccessPolicies)
+
+-- | The maximum number of results to return for each paginated request.
+--
+-- Default: 50
+listAccessPolicies_maxResults :: Lens.Lens' ListAccessPolicies (Prelude.Maybe Prelude.Natural)
+listAccessPolicies_maxResults = Lens.lens (\ListAccessPolicies' {maxResults} -> maxResults) (\s@ListAccessPolicies' {} a -> s {maxResults = a} :: ListAccessPolicies)
+
+-- | The token to be used for the next set of paginated results.
+listAccessPolicies_nextToken :: Lens.Lens' ListAccessPolicies (Prelude.Maybe Prelude.Text)
+listAccessPolicies_nextToken = Lens.lens (\ListAccessPolicies' {nextToken} -> nextToken) (\s@ListAccessPolicies' {} a -> s {nextToken = a} :: ListAccessPolicies)
+
+-- | The ID of the resource. This parameter is required if you specify
+-- @resourceType@.
+listAccessPolicies_resourceId :: Lens.Lens' ListAccessPolicies (Prelude.Maybe Prelude.Text)
+listAccessPolicies_resourceId = Lens.lens (\ListAccessPolicies' {resourceId} -> resourceId) (\s@ListAccessPolicies' {} a -> s {resourceId = a} :: ListAccessPolicies)
+
+-- | The type of resource (portal or project). This parameter is required if
+-- you specify @resourceId@.
+listAccessPolicies_resourceType :: Lens.Lens' ListAccessPolicies (Prelude.Maybe ResourceType)
+listAccessPolicies_resourceType = Lens.lens (\ListAccessPolicies' {resourceType} -> resourceType) (\s@ListAccessPolicies' {} a -> s {resourceType = a} :: ListAccessPolicies)
+
+instance Core.AWSPager ListAccessPolicies where
+  page rq rs
+    | Core.stop
+        ( rs
+            Lens.^? listAccessPoliciesResponse_nextToken
+            Prelude.. Lens._Just
+        ) =
+        Prelude.Nothing
+    | Core.stop
+        ( rs
+            Lens.^. listAccessPoliciesResponse_accessPolicySummaries
+        ) =
+        Prelude.Nothing
+    | Prelude.otherwise =
+        Prelude.Just
+          Prelude.$ rq
+          Prelude.& listAccessPolicies_nextToken
+          Lens..~ rs
+          Lens.^? listAccessPoliciesResponse_nextToken
+          Prelude.. Lens._Just
+
+instance Core.AWSRequest ListAccessPolicies where
+  type
+    AWSResponse ListAccessPolicies =
+      ListAccessPoliciesResponse
+  request overrides =
+    Request.get (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          ListAccessPoliciesResponse'
+            Prelude.<$> (x Data..?> "nextToken")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+            Prelude.<*> ( x
+                            Data..?> "accessPolicySummaries"
+                            Core..!@ Prelude.mempty
+                        )
+      )
+
+instance Prelude.Hashable ListAccessPolicies where
+  hashWithSalt _salt ListAccessPolicies' {..} =
+    _salt
+      `Prelude.hashWithSalt` iamArn
+      `Prelude.hashWithSalt` identityId
+      `Prelude.hashWithSalt` identityType
+      `Prelude.hashWithSalt` maxResults
+      `Prelude.hashWithSalt` nextToken
+      `Prelude.hashWithSalt` resourceId
+      `Prelude.hashWithSalt` resourceType
+
+instance Prelude.NFData ListAccessPolicies where
+  rnf ListAccessPolicies' {..} =
+    Prelude.rnf iamArn
+      `Prelude.seq` Prelude.rnf identityId
+      `Prelude.seq` Prelude.rnf identityType
+      `Prelude.seq` Prelude.rnf maxResults
+      `Prelude.seq` Prelude.rnf nextToken
+      `Prelude.seq` Prelude.rnf resourceId
+      `Prelude.seq` Prelude.rnf resourceType
+
+instance Data.ToHeaders ListAccessPolicies where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToPath ListAccessPolicies where
+  toPath = Prelude.const "/access-policies"
+
+instance Data.ToQuery ListAccessPolicies where
+  toQuery ListAccessPolicies' {..} =
+    Prelude.mconcat
+      [ "iamArn" Data.=: iamArn,
+        "identityId" Data.=: identityId,
+        "identityType" Data.=: identityType,
+        "maxResults" Data.=: maxResults,
+        "nextToken" Data.=: nextToken,
+        "resourceId" Data.=: resourceId,
+        "resourceType" Data.=: resourceType
+      ]
+
+-- | /See:/ 'newListAccessPoliciesResponse' smart constructor.
+data ListAccessPoliciesResponse = ListAccessPoliciesResponse'
+  { -- | The token for the next set of results, or null if there are no
+    -- additional results.
+    nextToken :: Prelude.Maybe Prelude.Text,
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int,
+    -- | A list that summarizes each access policy.
+    accessPolicySummaries :: [AccessPolicySummary]
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ListAccessPoliciesResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'nextToken', 'listAccessPoliciesResponse_nextToken' - The token for the next set of results, or null if there are no
+-- additional results.
+--
+-- 'httpStatus', 'listAccessPoliciesResponse_httpStatus' - The response's http status code.
+--
+-- 'accessPolicySummaries', 'listAccessPoliciesResponse_accessPolicySummaries' - A list that summarizes each access policy.
+newListAccessPoliciesResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  ListAccessPoliciesResponse
+newListAccessPoliciesResponse pHttpStatus_ =
+  ListAccessPoliciesResponse'
+    { nextToken =
+        Prelude.Nothing,
+      httpStatus = pHttpStatus_,
+      accessPolicySummaries = Prelude.mempty
+    }
+
+-- | The token for the next set of results, or null if there are no
+-- additional results.
+listAccessPoliciesResponse_nextToken :: Lens.Lens' ListAccessPoliciesResponse (Prelude.Maybe Prelude.Text)
+listAccessPoliciesResponse_nextToken = Lens.lens (\ListAccessPoliciesResponse' {nextToken} -> nextToken) (\s@ListAccessPoliciesResponse' {} a -> s {nextToken = a} :: ListAccessPoliciesResponse)
+
+-- | The response's http status code.
+listAccessPoliciesResponse_httpStatus :: Lens.Lens' ListAccessPoliciesResponse Prelude.Int
+listAccessPoliciesResponse_httpStatus = Lens.lens (\ListAccessPoliciesResponse' {httpStatus} -> httpStatus) (\s@ListAccessPoliciesResponse' {} a -> s {httpStatus = a} :: ListAccessPoliciesResponse)
+
+-- | A list that summarizes each access policy.
+listAccessPoliciesResponse_accessPolicySummaries :: Lens.Lens' ListAccessPoliciesResponse [AccessPolicySummary]
+listAccessPoliciesResponse_accessPolicySummaries = Lens.lens (\ListAccessPoliciesResponse' {accessPolicySummaries} -> accessPolicySummaries) (\s@ListAccessPoliciesResponse' {} a -> s {accessPolicySummaries = a} :: ListAccessPoliciesResponse) Prelude.. Lens.coerced
+
+instance Prelude.NFData ListAccessPoliciesResponse where
+  rnf ListAccessPoliciesResponse' {..} =
+    Prelude.rnf nextToken
+      `Prelude.seq` Prelude.rnf httpStatus
+      `Prelude.seq` Prelude.rnf accessPolicySummaries
diff --git a/gen/Amazonka/IoTSiteWise/ListAssetModelProperties.hs b/gen/Amazonka/IoTSiteWise/ListAssetModelProperties.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/IoTSiteWise/ListAssetModelProperties.hs
@@ -0,0 +1,288 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.IoTSiteWise.ListAssetModelProperties
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Retrieves a paginated list of properties associated with an asset model.
+-- If you update properties associated with the model before you finish
+-- listing all the properties, you need to start all over again.
+--
+-- This operation returns paginated results.
+module Amazonka.IoTSiteWise.ListAssetModelProperties
+  ( -- * Creating a Request
+    ListAssetModelProperties (..),
+    newListAssetModelProperties,
+
+    -- * Request Lenses
+    listAssetModelProperties_filter,
+    listAssetModelProperties_maxResults,
+    listAssetModelProperties_nextToken,
+    listAssetModelProperties_assetModelId,
+
+    -- * Destructuring the Response
+    ListAssetModelPropertiesResponse (..),
+    newListAssetModelPropertiesResponse,
+
+    -- * Response Lenses
+    listAssetModelPropertiesResponse_nextToken,
+    listAssetModelPropertiesResponse_httpStatus,
+    listAssetModelPropertiesResponse_assetModelPropertySummaries,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.IoTSiteWise.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newListAssetModelProperties' smart constructor.
+data ListAssetModelProperties = ListAssetModelProperties'
+  { -- | Filters the requested list of asset model properties. You can choose one
+    -- of the following options:
+    --
+    -- -   @ALL@ – The list includes all asset model properties for a given
+    --     asset model ID.
+    --
+    -- -   @BASE@ – The list includes only base asset model properties for a
+    --     given asset model ID.
+    --
+    -- Default: @BASE@
+    filter' :: Prelude.Maybe ListAssetModelPropertiesFilter,
+    -- | The maximum number of results to return for each paginated request. If
+    -- not specified, the default value is 50.
+    maxResults :: Prelude.Maybe Prelude.Natural,
+    -- | The token to be used for the next set of paginated results.
+    nextToken :: Prelude.Maybe Prelude.Text,
+    -- | The ID of the asset model.
+    assetModelId :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ListAssetModelProperties' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'filter'', 'listAssetModelProperties_filter' - Filters the requested list of asset model properties. You can choose one
+-- of the following options:
+--
+-- -   @ALL@ – The list includes all asset model properties for a given
+--     asset model ID.
+--
+-- -   @BASE@ – The list includes only base asset model properties for a
+--     given asset model ID.
+--
+-- Default: @BASE@
+--
+-- 'maxResults', 'listAssetModelProperties_maxResults' - The maximum number of results to return for each paginated request. If
+-- not specified, the default value is 50.
+--
+-- 'nextToken', 'listAssetModelProperties_nextToken' - The token to be used for the next set of paginated results.
+--
+-- 'assetModelId', 'listAssetModelProperties_assetModelId' - The ID of the asset model.
+newListAssetModelProperties ::
+  -- | 'assetModelId'
+  Prelude.Text ->
+  ListAssetModelProperties
+newListAssetModelProperties pAssetModelId_ =
+  ListAssetModelProperties'
+    { filter' =
+        Prelude.Nothing,
+      maxResults = Prelude.Nothing,
+      nextToken = Prelude.Nothing,
+      assetModelId = pAssetModelId_
+    }
+
+-- | Filters the requested list of asset model properties. You can choose one
+-- of the following options:
+--
+-- -   @ALL@ – The list includes all asset model properties for a given
+--     asset model ID.
+--
+-- -   @BASE@ – The list includes only base asset model properties for a
+--     given asset model ID.
+--
+-- Default: @BASE@
+listAssetModelProperties_filter :: Lens.Lens' ListAssetModelProperties (Prelude.Maybe ListAssetModelPropertiesFilter)
+listAssetModelProperties_filter = Lens.lens (\ListAssetModelProperties' {filter'} -> filter') (\s@ListAssetModelProperties' {} a -> s {filter' = a} :: ListAssetModelProperties)
+
+-- | The maximum number of results to return for each paginated request. If
+-- not specified, the default value is 50.
+listAssetModelProperties_maxResults :: Lens.Lens' ListAssetModelProperties (Prelude.Maybe Prelude.Natural)
+listAssetModelProperties_maxResults = Lens.lens (\ListAssetModelProperties' {maxResults} -> maxResults) (\s@ListAssetModelProperties' {} a -> s {maxResults = a} :: ListAssetModelProperties)
+
+-- | The token to be used for the next set of paginated results.
+listAssetModelProperties_nextToken :: Lens.Lens' ListAssetModelProperties (Prelude.Maybe Prelude.Text)
+listAssetModelProperties_nextToken = Lens.lens (\ListAssetModelProperties' {nextToken} -> nextToken) (\s@ListAssetModelProperties' {} a -> s {nextToken = a} :: ListAssetModelProperties)
+
+-- | The ID of the asset model.
+listAssetModelProperties_assetModelId :: Lens.Lens' ListAssetModelProperties Prelude.Text
+listAssetModelProperties_assetModelId = Lens.lens (\ListAssetModelProperties' {assetModelId} -> assetModelId) (\s@ListAssetModelProperties' {} a -> s {assetModelId = a} :: ListAssetModelProperties)
+
+instance Core.AWSPager ListAssetModelProperties where
+  page rq rs
+    | Core.stop
+        ( rs
+            Lens.^? listAssetModelPropertiesResponse_nextToken
+            Prelude.. Lens._Just
+        ) =
+        Prelude.Nothing
+    | Core.stop
+        ( rs
+            Lens.^. listAssetModelPropertiesResponse_assetModelPropertySummaries
+        ) =
+        Prelude.Nothing
+    | Prelude.otherwise =
+        Prelude.Just
+          Prelude.$ rq
+          Prelude.& listAssetModelProperties_nextToken
+          Lens..~ rs
+          Lens.^? listAssetModelPropertiesResponse_nextToken
+          Prelude.. Lens._Just
+
+instance Core.AWSRequest ListAssetModelProperties where
+  type
+    AWSResponse ListAssetModelProperties =
+      ListAssetModelPropertiesResponse
+  request overrides =
+    Request.get (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          ListAssetModelPropertiesResponse'
+            Prelude.<$> (x Data..?> "nextToken")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+            Prelude.<*> ( x
+                            Data..?> "assetModelPropertySummaries"
+                            Core..!@ Prelude.mempty
+                        )
+      )
+
+instance Prelude.Hashable ListAssetModelProperties where
+  hashWithSalt _salt ListAssetModelProperties' {..} =
+    _salt
+      `Prelude.hashWithSalt` filter'
+      `Prelude.hashWithSalt` maxResults
+      `Prelude.hashWithSalt` nextToken
+      `Prelude.hashWithSalt` assetModelId
+
+instance Prelude.NFData ListAssetModelProperties where
+  rnf ListAssetModelProperties' {..} =
+    Prelude.rnf filter'
+      `Prelude.seq` Prelude.rnf maxResults
+      `Prelude.seq` Prelude.rnf nextToken
+      `Prelude.seq` Prelude.rnf assetModelId
+
+instance Data.ToHeaders ListAssetModelProperties where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToPath ListAssetModelProperties where
+  toPath ListAssetModelProperties' {..} =
+    Prelude.mconcat
+      [ "/asset-models/",
+        Data.toBS assetModelId,
+        "/properties"
+      ]
+
+instance Data.ToQuery ListAssetModelProperties where
+  toQuery ListAssetModelProperties' {..} =
+    Prelude.mconcat
+      [ "filter" Data.=: filter',
+        "maxResults" Data.=: maxResults,
+        "nextToken" Data.=: nextToken
+      ]
+
+-- | /See:/ 'newListAssetModelPropertiesResponse' smart constructor.
+data ListAssetModelPropertiesResponse = ListAssetModelPropertiesResponse'
+  { -- | The token for the next set of results, or null if there are no
+    -- additional results.
+    nextToken :: Prelude.Maybe Prelude.Text,
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int,
+    -- | A list that summarizes the properties associated with the specified
+    -- asset model.
+    assetModelPropertySummaries :: [AssetModelPropertySummary]
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ListAssetModelPropertiesResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'nextToken', 'listAssetModelPropertiesResponse_nextToken' - The token for the next set of results, or null if there are no
+-- additional results.
+--
+-- 'httpStatus', 'listAssetModelPropertiesResponse_httpStatus' - The response's http status code.
+--
+-- 'assetModelPropertySummaries', 'listAssetModelPropertiesResponse_assetModelPropertySummaries' - A list that summarizes the properties associated with the specified
+-- asset model.
+newListAssetModelPropertiesResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  ListAssetModelPropertiesResponse
+newListAssetModelPropertiesResponse pHttpStatus_ =
+  ListAssetModelPropertiesResponse'
+    { nextToken =
+        Prelude.Nothing,
+      httpStatus = pHttpStatus_,
+      assetModelPropertySummaries =
+        Prelude.mempty
+    }
+
+-- | The token for the next set of results, or null if there are no
+-- additional results.
+listAssetModelPropertiesResponse_nextToken :: Lens.Lens' ListAssetModelPropertiesResponse (Prelude.Maybe Prelude.Text)
+listAssetModelPropertiesResponse_nextToken = Lens.lens (\ListAssetModelPropertiesResponse' {nextToken} -> nextToken) (\s@ListAssetModelPropertiesResponse' {} a -> s {nextToken = a} :: ListAssetModelPropertiesResponse)
+
+-- | The response's http status code.
+listAssetModelPropertiesResponse_httpStatus :: Lens.Lens' ListAssetModelPropertiesResponse Prelude.Int
+listAssetModelPropertiesResponse_httpStatus = Lens.lens (\ListAssetModelPropertiesResponse' {httpStatus} -> httpStatus) (\s@ListAssetModelPropertiesResponse' {} a -> s {httpStatus = a} :: ListAssetModelPropertiesResponse)
+
+-- | A list that summarizes the properties associated with the specified
+-- asset model.
+listAssetModelPropertiesResponse_assetModelPropertySummaries :: Lens.Lens' ListAssetModelPropertiesResponse [AssetModelPropertySummary]
+listAssetModelPropertiesResponse_assetModelPropertySummaries = Lens.lens (\ListAssetModelPropertiesResponse' {assetModelPropertySummaries} -> assetModelPropertySummaries) (\s@ListAssetModelPropertiesResponse' {} a -> s {assetModelPropertySummaries = a} :: ListAssetModelPropertiesResponse) Prelude.. Lens.coerced
+
+instance
+  Prelude.NFData
+    ListAssetModelPropertiesResponse
+  where
+  rnf ListAssetModelPropertiesResponse' {..} =
+    Prelude.rnf nextToken
+      `Prelude.seq` Prelude.rnf httpStatus
+      `Prelude.seq` Prelude.rnf assetModelPropertySummaries
diff --git a/gen/Amazonka/IoTSiteWise/ListAssetModels.hs b/gen/Amazonka/IoTSiteWise/ListAssetModels.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/IoTSiteWise/ListAssetModels.hs
@@ -0,0 +1,222 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.IoTSiteWise.ListAssetModels
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Retrieves a paginated list of summaries of all asset models.
+--
+-- This operation returns paginated results.
+module Amazonka.IoTSiteWise.ListAssetModels
+  ( -- * Creating a Request
+    ListAssetModels (..),
+    newListAssetModels,
+
+    -- * Request Lenses
+    listAssetModels_maxResults,
+    listAssetModels_nextToken,
+
+    -- * Destructuring the Response
+    ListAssetModelsResponse (..),
+    newListAssetModelsResponse,
+
+    -- * Response Lenses
+    listAssetModelsResponse_nextToken,
+    listAssetModelsResponse_httpStatus,
+    listAssetModelsResponse_assetModelSummaries,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.IoTSiteWise.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newListAssetModels' smart constructor.
+data ListAssetModels = ListAssetModels'
+  { -- | The maximum number of results to return for each paginated request.
+    --
+    -- Default: 50
+    maxResults :: Prelude.Maybe Prelude.Natural,
+    -- | The token to be used for the next set of paginated results.
+    nextToken :: Prelude.Maybe Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ListAssetModels' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'maxResults', 'listAssetModels_maxResults' - The maximum number of results to return for each paginated request.
+--
+-- Default: 50
+--
+-- 'nextToken', 'listAssetModels_nextToken' - The token to be used for the next set of paginated results.
+newListAssetModels ::
+  ListAssetModels
+newListAssetModels =
+  ListAssetModels'
+    { maxResults = Prelude.Nothing,
+      nextToken = Prelude.Nothing
+    }
+
+-- | The maximum number of results to return for each paginated request.
+--
+-- Default: 50
+listAssetModels_maxResults :: Lens.Lens' ListAssetModels (Prelude.Maybe Prelude.Natural)
+listAssetModels_maxResults = Lens.lens (\ListAssetModels' {maxResults} -> maxResults) (\s@ListAssetModels' {} a -> s {maxResults = a} :: ListAssetModels)
+
+-- | The token to be used for the next set of paginated results.
+listAssetModels_nextToken :: Lens.Lens' ListAssetModels (Prelude.Maybe Prelude.Text)
+listAssetModels_nextToken = Lens.lens (\ListAssetModels' {nextToken} -> nextToken) (\s@ListAssetModels' {} a -> s {nextToken = a} :: ListAssetModels)
+
+instance Core.AWSPager ListAssetModels where
+  page rq rs
+    | Core.stop
+        ( rs
+            Lens.^? listAssetModelsResponse_nextToken
+            Prelude.. Lens._Just
+        ) =
+        Prelude.Nothing
+    | Core.stop
+        ( rs
+            Lens.^. listAssetModelsResponse_assetModelSummaries
+        ) =
+        Prelude.Nothing
+    | Prelude.otherwise =
+        Prelude.Just
+          Prelude.$ rq
+          Prelude.& listAssetModels_nextToken
+          Lens..~ rs
+          Lens.^? listAssetModelsResponse_nextToken
+          Prelude.. Lens._Just
+
+instance Core.AWSRequest ListAssetModels where
+  type
+    AWSResponse ListAssetModels =
+      ListAssetModelsResponse
+  request overrides =
+    Request.get (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          ListAssetModelsResponse'
+            Prelude.<$> (x Data..?> "nextToken")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+            Prelude.<*> ( x
+                            Data..?> "assetModelSummaries"
+                            Core..!@ Prelude.mempty
+                        )
+      )
+
+instance Prelude.Hashable ListAssetModels where
+  hashWithSalt _salt ListAssetModels' {..} =
+    _salt
+      `Prelude.hashWithSalt` maxResults
+      `Prelude.hashWithSalt` nextToken
+
+instance Prelude.NFData ListAssetModels where
+  rnf ListAssetModels' {..} =
+    Prelude.rnf maxResults
+      `Prelude.seq` Prelude.rnf nextToken
+
+instance Data.ToHeaders ListAssetModels where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToPath ListAssetModels where
+  toPath = Prelude.const "/asset-models"
+
+instance Data.ToQuery ListAssetModels where
+  toQuery ListAssetModels' {..} =
+    Prelude.mconcat
+      [ "maxResults" Data.=: maxResults,
+        "nextToken" Data.=: nextToken
+      ]
+
+-- | /See:/ 'newListAssetModelsResponse' smart constructor.
+data ListAssetModelsResponse = ListAssetModelsResponse'
+  { -- | The token for the next set of results, or null if there are no
+    -- additional results.
+    nextToken :: Prelude.Maybe Prelude.Text,
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int,
+    -- | A list that summarizes each asset model.
+    assetModelSummaries :: [AssetModelSummary]
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ListAssetModelsResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'nextToken', 'listAssetModelsResponse_nextToken' - The token for the next set of results, or null if there are no
+-- additional results.
+--
+-- 'httpStatus', 'listAssetModelsResponse_httpStatus' - The response's http status code.
+--
+-- 'assetModelSummaries', 'listAssetModelsResponse_assetModelSummaries' - A list that summarizes each asset model.
+newListAssetModelsResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  ListAssetModelsResponse
+newListAssetModelsResponse pHttpStatus_ =
+  ListAssetModelsResponse'
+    { nextToken =
+        Prelude.Nothing,
+      httpStatus = pHttpStatus_,
+      assetModelSummaries = Prelude.mempty
+    }
+
+-- | The token for the next set of results, or null if there are no
+-- additional results.
+listAssetModelsResponse_nextToken :: Lens.Lens' ListAssetModelsResponse (Prelude.Maybe Prelude.Text)
+listAssetModelsResponse_nextToken = Lens.lens (\ListAssetModelsResponse' {nextToken} -> nextToken) (\s@ListAssetModelsResponse' {} a -> s {nextToken = a} :: ListAssetModelsResponse)
+
+-- | The response's http status code.
+listAssetModelsResponse_httpStatus :: Lens.Lens' ListAssetModelsResponse Prelude.Int
+listAssetModelsResponse_httpStatus = Lens.lens (\ListAssetModelsResponse' {httpStatus} -> httpStatus) (\s@ListAssetModelsResponse' {} a -> s {httpStatus = a} :: ListAssetModelsResponse)
+
+-- | A list that summarizes each asset model.
+listAssetModelsResponse_assetModelSummaries :: Lens.Lens' ListAssetModelsResponse [AssetModelSummary]
+listAssetModelsResponse_assetModelSummaries = Lens.lens (\ListAssetModelsResponse' {assetModelSummaries} -> assetModelSummaries) (\s@ListAssetModelsResponse' {} a -> s {assetModelSummaries = a} :: ListAssetModelsResponse) Prelude.. Lens.coerced
+
+instance Prelude.NFData ListAssetModelsResponse where
+  rnf ListAssetModelsResponse' {..} =
+    Prelude.rnf nextToken
+      `Prelude.seq` Prelude.rnf httpStatus
+      `Prelude.seq` Prelude.rnf assetModelSummaries
diff --git a/gen/Amazonka/IoTSiteWise/ListAssetProperties.hs b/gen/Amazonka/IoTSiteWise/ListAssetProperties.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/IoTSiteWise/ListAssetProperties.hs
@@ -0,0 +1,280 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.IoTSiteWise.ListAssetProperties
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Retrieves a paginated list of properties associated with an asset. If
+-- you update properties associated with the model before you finish
+-- listing all the properties, you need to start all over again.
+--
+-- This operation returns paginated results.
+module Amazonka.IoTSiteWise.ListAssetProperties
+  ( -- * Creating a Request
+    ListAssetProperties (..),
+    newListAssetProperties,
+
+    -- * Request Lenses
+    listAssetProperties_filter,
+    listAssetProperties_maxResults,
+    listAssetProperties_nextToken,
+    listAssetProperties_assetId,
+
+    -- * Destructuring the Response
+    ListAssetPropertiesResponse (..),
+    newListAssetPropertiesResponse,
+
+    -- * Response Lenses
+    listAssetPropertiesResponse_nextToken,
+    listAssetPropertiesResponse_httpStatus,
+    listAssetPropertiesResponse_assetPropertySummaries,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.IoTSiteWise.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newListAssetProperties' smart constructor.
+data ListAssetProperties = ListAssetProperties'
+  { -- | Filters the requested list of asset properties. You can choose one of
+    -- the following options:
+    --
+    -- -   @ALL@ – The list includes all asset properties for a given asset
+    --     model ID.
+    --
+    -- -   @BASE@ – The list includes only base asset properties for a given
+    --     asset model ID.
+    --
+    -- Default: @BASE@
+    filter' :: Prelude.Maybe ListAssetPropertiesFilter,
+    -- | The maximum number of results to return for each paginated request. If
+    -- not specified, the default value is 50.
+    maxResults :: Prelude.Maybe Prelude.Natural,
+    -- | The token to be used for the next set of paginated results.
+    nextToken :: Prelude.Maybe Prelude.Text,
+    -- | The ID of the asset.
+    assetId :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ListAssetProperties' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'filter'', 'listAssetProperties_filter' - Filters the requested list of asset properties. You can choose one of
+-- the following options:
+--
+-- -   @ALL@ – The list includes all asset properties for a given asset
+--     model ID.
+--
+-- -   @BASE@ – The list includes only base asset properties for a given
+--     asset model ID.
+--
+-- Default: @BASE@
+--
+-- 'maxResults', 'listAssetProperties_maxResults' - The maximum number of results to return for each paginated request. If
+-- not specified, the default value is 50.
+--
+-- 'nextToken', 'listAssetProperties_nextToken' - The token to be used for the next set of paginated results.
+--
+-- 'assetId', 'listAssetProperties_assetId' - The ID of the asset.
+newListAssetProperties ::
+  -- | 'assetId'
+  Prelude.Text ->
+  ListAssetProperties
+newListAssetProperties pAssetId_ =
+  ListAssetProperties'
+    { filter' = Prelude.Nothing,
+      maxResults = Prelude.Nothing,
+      nextToken = Prelude.Nothing,
+      assetId = pAssetId_
+    }
+
+-- | Filters the requested list of asset properties. You can choose one of
+-- the following options:
+--
+-- -   @ALL@ – The list includes all asset properties for a given asset
+--     model ID.
+--
+-- -   @BASE@ – The list includes only base asset properties for a given
+--     asset model ID.
+--
+-- Default: @BASE@
+listAssetProperties_filter :: Lens.Lens' ListAssetProperties (Prelude.Maybe ListAssetPropertiesFilter)
+listAssetProperties_filter = Lens.lens (\ListAssetProperties' {filter'} -> filter') (\s@ListAssetProperties' {} a -> s {filter' = a} :: ListAssetProperties)
+
+-- | The maximum number of results to return for each paginated request. If
+-- not specified, the default value is 50.
+listAssetProperties_maxResults :: Lens.Lens' ListAssetProperties (Prelude.Maybe Prelude.Natural)
+listAssetProperties_maxResults = Lens.lens (\ListAssetProperties' {maxResults} -> maxResults) (\s@ListAssetProperties' {} a -> s {maxResults = a} :: ListAssetProperties)
+
+-- | The token to be used for the next set of paginated results.
+listAssetProperties_nextToken :: Lens.Lens' ListAssetProperties (Prelude.Maybe Prelude.Text)
+listAssetProperties_nextToken = Lens.lens (\ListAssetProperties' {nextToken} -> nextToken) (\s@ListAssetProperties' {} a -> s {nextToken = a} :: ListAssetProperties)
+
+-- | The ID of the asset.
+listAssetProperties_assetId :: Lens.Lens' ListAssetProperties Prelude.Text
+listAssetProperties_assetId = Lens.lens (\ListAssetProperties' {assetId} -> assetId) (\s@ListAssetProperties' {} a -> s {assetId = a} :: ListAssetProperties)
+
+instance Core.AWSPager ListAssetProperties where
+  page rq rs
+    | Core.stop
+        ( rs
+            Lens.^? listAssetPropertiesResponse_nextToken
+            Prelude.. Lens._Just
+        ) =
+        Prelude.Nothing
+    | Core.stop
+        ( rs
+            Lens.^. listAssetPropertiesResponse_assetPropertySummaries
+        ) =
+        Prelude.Nothing
+    | Prelude.otherwise =
+        Prelude.Just
+          Prelude.$ rq
+          Prelude.& listAssetProperties_nextToken
+          Lens..~ rs
+          Lens.^? listAssetPropertiesResponse_nextToken
+          Prelude.. Lens._Just
+
+instance Core.AWSRequest ListAssetProperties where
+  type
+    AWSResponse ListAssetProperties =
+      ListAssetPropertiesResponse
+  request overrides =
+    Request.get (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          ListAssetPropertiesResponse'
+            Prelude.<$> (x Data..?> "nextToken")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+            Prelude.<*> ( x
+                            Data..?> "assetPropertySummaries"
+                            Core..!@ Prelude.mempty
+                        )
+      )
+
+instance Prelude.Hashable ListAssetProperties where
+  hashWithSalt _salt ListAssetProperties' {..} =
+    _salt
+      `Prelude.hashWithSalt` filter'
+      `Prelude.hashWithSalt` maxResults
+      `Prelude.hashWithSalt` nextToken
+      `Prelude.hashWithSalt` assetId
+
+instance Prelude.NFData ListAssetProperties where
+  rnf ListAssetProperties' {..} =
+    Prelude.rnf filter'
+      `Prelude.seq` Prelude.rnf maxResults
+      `Prelude.seq` Prelude.rnf nextToken
+      `Prelude.seq` Prelude.rnf assetId
+
+instance Data.ToHeaders ListAssetProperties where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToPath ListAssetProperties where
+  toPath ListAssetProperties' {..} =
+    Prelude.mconcat
+      ["/assets/", Data.toBS assetId, "/properties"]
+
+instance Data.ToQuery ListAssetProperties where
+  toQuery ListAssetProperties' {..} =
+    Prelude.mconcat
+      [ "filter" Data.=: filter',
+        "maxResults" Data.=: maxResults,
+        "nextToken" Data.=: nextToken
+      ]
+
+-- | /See:/ 'newListAssetPropertiesResponse' smart constructor.
+data ListAssetPropertiesResponse = ListAssetPropertiesResponse'
+  { -- | The token for the next set of results, or null if there are no
+    -- additional results.
+    nextToken :: Prelude.Maybe Prelude.Text,
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int,
+    -- | A list that summarizes the properties associated with the specified
+    -- asset.
+    assetPropertySummaries :: [AssetPropertySummary]
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ListAssetPropertiesResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'nextToken', 'listAssetPropertiesResponse_nextToken' - The token for the next set of results, or null if there are no
+-- additional results.
+--
+-- 'httpStatus', 'listAssetPropertiesResponse_httpStatus' - The response's http status code.
+--
+-- 'assetPropertySummaries', 'listAssetPropertiesResponse_assetPropertySummaries' - A list that summarizes the properties associated with the specified
+-- asset.
+newListAssetPropertiesResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  ListAssetPropertiesResponse
+newListAssetPropertiesResponse pHttpStatus_ =
+  ListAssetPropertiesResponse'
+    { nextToken =
+        Prelude.Nothing,
+      httpStatus = pHttpStatus_,
+      assetPropertySummaries = Prelude.mempty
+    }
+
+-- | The token for the next set of results, or null if there are no
+-- additional results.
+listAssetPropertiesResponse_nextToken :: Lens.Lens' ListAssetPropertiesResponse (Prelude.Maybe Prelude.Text)
+listAssetPropertiesResponse_nextToken = Lens.lens (\ListAssetPropertiesResponse' {nextToken} -> nextToken) (\s@ListAssetPropertiesResponse' {} a -> s {nextToken = a} :: ListAssetPropertiesResponse)
+
+-- | The response's http status code.
+listAssetPropertiesResponse_httpStatus :: Lens.Lens' ListAssetPropertiesResponse Prelude.Int
+listAssetPropertiesResponse_httpStatus = Lens.lens (\ListAssetPropertiesResponse' {httpStatus} -> httpStatus) (\s@ListAssetPropertiesResponse' {} a -> s {httpStatus = a} :: ListAssetPropertiesResponse)
+
+-- | A list that summarizes the properties associated with the specified
+-- asset.
+listAssetPropertiesResponse_assetPropertySummaries :: Lens.Lens' ListAssetPropertiesResponse [AssetPropertySummary]
+listAssetPropertiesResponse_assetPropertySummaries = Lens.lens (\ListAssetPropertiesResponse' {assetPropertySummaries} -> assetPropertySummaries) (\s@ListAssetPropertiesResponse' {} a -> s {assetPropertySummaries = a} :: ListAssetPropertiesResponse) Prelude.. Lens.coerced
+
+instance Prelude.NFData ListAssetPropertiesResponse where
+  rnf ListAssetPropertiesResponse' {..} =
+    Prelude.rnf nextToken
+      `Prelude.seq` Prelude.rnf httpStatus
+      `Prelude.seq` Prelude.rnf assetPropertySummaries
diff --git a/gen/Amazonka/IoTSiteWise/ListAssetRelationships.hs b/gen/Amazonka/IoTSiteWise/ListAssetRelationships.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/IoTSiteWise/ListAssetRelationships.hs
@@ -0,0 +1,274 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.IoTSiteWise.ListAssetRelationships
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Retrieves a paginated list of asset relationships for an asset. You can
+-- use this operation to identify an asset\'s root asset and all associated
+-- assets between that asset and its root.
+--
+-- This operation returns paginated results.
+module Amazonka.IoTSiteWise.ListAssetRelationships
+  ( -- * Creating a Request
+    ListAssetRelationships (..),
+    newListAssetRelationships,
+
+    -- * Request Lenses
+    listAssetRelationships_maxResults,
+    listAssetRelationships_nextToken,
+    listAssetRelationships_assetId,
+    listAssetRelationships_traversalType,
+
+    -- * Destructuring the Response
+    ListAssetRelationshipsResponse (..),
+    newListAssetRelationshipsResponse,
+
+    -- * Response Lenses
+    listAssetRelationshipsResponse_nextToken,
+    listAssetRelationshipsResponse_httpStatus,
+    listAssetRelationshipsResponse_assetRelationshipSummaries,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.IoTSiteWise.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newListAssetRelationships' smart constructor.
+data ListAssetRelationships = ListAssetRelationships'
+  { -- | The maximum number of results to return for each paginated request.
+    maxResults :: Prelude.Maybe Prelude.Natural,
+    -- | The token to be used for the next set of paginated results.
+    nextToken :: Prelude.Maybe Prelude.Text,
+    -- | The ID of the asset.
+    assetId :: Prelude.Text,
+    -- | The type of traversal to use to identify asset relationships. Choose the
+    -- following option:
+    --
+    -- -   @PATH_TO_ROOT@ – Identify the asset\'s parent assets up to the root
+    --     asset. The asset that you specify in @assetId@ is the first result
+    --     in the list of @assetRelationshipSummaries@, and the root asset is
+    --     the last result.
+    traversalType :: TraversalType
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ListAssetRelationships' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'maxResults', 'listAssetRelationships_maxResults' - The maximum number of results to return for each paginated request.
+--
+-- 'nextToken', 'listAssetRelationships_nextToken' - The token to be used for the next set of paginated results.
+--
+-- 'assetId', 'listAssetRelationships_assetId' - The ID of the asset.
+--
+-- 'traversalType', 'listAssetRelationships_traversalType' - The type of traversal to use to identify asset relationships. Choose the
+-- following option:
+--
+-- -   @PATH_TO_ROOT@ – Identify the asset\'s parent assets up to the root
+--     asset. The asset that you specify in @assetId@ is the first result
+--     in the list of @assetRelationshipSummaries@, and the root asset is
+--     the last result.
+newListAssetRelationships ::
+  -- | 'assetId'
+  Prelude.Text ->
+  -- | 'traversalType'
+  TraversalType ->
+  ListAssetRelationships
+newListAssetRelationships pAssetId_ pTraversalType_ =
+  ListAssetRelationships'
+    { maxResults =
+        Prelude.Nothing,
+      nextToken = Prelude.Nothing,
+      assetId = pAssetId_,
+      traversalType = pTraversalType_
+    }
+
+-- | The maximum number of results to return for each paginated request.
+listAssetRelationships_maxResults :: Lens.Lens' ListAssetRelationships (Prelude.Maybe Prelude.Natural)
+listAssetRelationships_maxResults = Lens.lens (\ListAssetRelationships' {maxResults} -> maxResults) (\s@ListAssetRelationships' {} a -> s {maxResults = a} :: ListAssetRelationships)
+
+-- | The token to be used for the next set of paginated results.
+listAssetRelationships_nextToken :: Lens.Lens' ListAssetRelationships (Prelude.Maybe Prelude.Text)
+listAssetRelationships_nextToken = Lens.lens (\ListAssetRelationships' {nextToken} -> nextToken) (\s@ListAssetRelationships' {} a -> s {nextToken = a} :: ListAssetRelationships)
+
+-- | The ID of the asset.
+listAssetRelationships_assetId :: Lens.Lens' ListAssetRelationships Prelude.Text
+listAssetRelationships_assetId = Lens.lens (\ListAssetRelationships' {assetId} -> assetId) (\s@ListAssetRelationships' {} a -> s {assetId = a} :: ListAssetRelationships)
+
+-- | The type of traversal to use to identify asset relationships. Choose the
+-- following option:
+--
+-- -   @PATH_TO_ROOT@ – Identify the asset\'s parent assets up to the root
+--     asset. The asset that you specify in @assetId@ is the first result
+--     in the list of @assetRelationshipSummaries@, and the root asset is
+--     the last result.
+listAssetRelationships_traversalType :: Lens.Lens' ListAssetRelationships TraversalType
+listAssetRelationships_traversalType = Lens.lens (\ListAssetRelationships' {traversalType} -> traversalType) (\s@ListAssetRelationships' {} a -> s {traversalType = a} :: ListAssetRelationships)
+
+instance Core.AWSPager ListAssetRelationships where
+  page rq rs
+    | Core.stop
+        ( rs
+            Lens.^? listAssetRelationshipsResponse_nextToken
+            Prelude.. Lens._Just
+        ) =
+        Prelude.Nothing
+    | Core.stop
+        ( rs
+            Lens.^. listAssetRelationshipsResponse_assetRelationshipSummaries
+        ) =
+        Prelude.Nothing
+    | Prelude.otherwise =
+        Prelude.Just
+          Prelude.$ rq
+          Prelude.& listAssetRelationships_nextToken
+          Lens..~ rs
+          Lens.^? listAssetRelationshipsResponse_nextToken
+          Prelude.. Lens._Just
+
+instance Core.AWSRequest ListAssetRelationships where
+  type
+    AWSResponse ListAssetRelationships =
+      ListAssetRelationshipsResponse
+  request overrides =
+    Request.get (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          ListAssetRelationshipsResponse'
+            Prelude.<$> (x Data..?> "nextToken")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+            Prelude.<*> ( x
+                            Data..?> "assetRelationshipSummaries"
+                            Core..!@ Prelude.mempty
+                        )
+      )
+
+instance Prelude.Hashable ListAssetRelationships where
+  hashWithSalt _salt ListAssetRelationships' {..} =
+    _salt
+      `Prelude.hashWithSalt` maxResults
+      `Prelude.hashWithSalt` nextToken
+      `Prelude.hashWithSalt` assetId
+      `Prelude.hashWithSalt` traversalType
+
+instance Prelude.NFData ListAssetRelationships where
+  rnf ListAssetRelationships' {..} =
+    Prelude.rnf maxResults
+      `Prelude.seq` Prelude.rnf nextToken
+      `Prelude.seq` Prelude.rnf assetId
+      `Prelude.seq` Prelude.rnf traversalType
+
+instance Data.ToHeaders ListAssetRelationships where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToPath ListAssetRelationships where
+  toPath ListAssetRelationships' {..} =
+    Prelude.mconcat
+      [ "/assets/",
+        Data.toBS assetId,
+        "/assetRelationships"
+      ]
+
+instance Data.ToQuery ListAssetRelationships where
+  toQuery ListAssetRelationships' {..} =
+    Prelude.mconcat
+      [ "maxResults" Data.=: maxResults,
+        "nextToken" Data.=: nextToken,
+        "traversalType" Data.=: traversalType
+      ]
+
+-- | /See:/ 'newListAssetRelationshipsResponse' smart constructor.
+data ListAssetRelationshipsResponse = ListAssetRelationshipsResponse'
+  { -- | The token for the next set of results, or null if there are no
+    -- additional results.
+    nextToken :: Prelude.Maybe Prelude.Text,
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int,
+    -- | A list that summarizes each asset relationship.
+    assetRelationshipSummaries :: [AssetRelationshipSummary]
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ListAssetRelationshipsResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'nextToken', 'listAssetRelationshipsResponse_nextToken' - The token for the next set of results, or null if there are no
+-- additional results.
+--
+-- 'httpStatus', 'listAssetRelationshipsResponse_httpStatus' - The response's http status code.
+--
+-- 'assetRelationshipSummaries', 'listAssetRelationshipsResponse_assetRelationshipSummaries' - A list that summarizes each asset relationship.
+newListAssetRelationshipsResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  ListAssetRelationshipsResponse
+newListAssetRelationshipsResponse pHttpStatus_ =
+  ListAssetRelationshipsResponse'
+    { nextToken =
+        Prelude.Nothing,
+      httpStatus = pHttpStatus_,
+      assetRelationshipSummaries = Prelude.mempty
+    }
+
+-- | The token for the next set of results, or null if there are no
+-- additional results.
+listAssetRelationshipsResponse_nextToken :: Lens.Lens' ListAssetRelationshipsResponse (Prelude.Maybe Prelude.Text)
+listAssetRelationshipsResponse_nextToken = Lens.lens (\ListAssetRelationshipsResponse' {nextToken} -> nextToken) (\s@ListAssetRelationshipsResponse' {} a -> s {nextToken = a} :: ListAssetRelationshipsResponse)
+
+-- | The response's http status code.
+listAssetRelationshipsResponse_httpStatus :: Lens.Lens' ListAssetRelationshipsResponse Prelude.Int
+listAssetRelationshipsResponse_httpStatus = Lens.lens (\ListAssetRelationshipsResponse' {httpStatus} -> httpStatus) (\s@ListAssetRelationshipsResponse' {} a -> s {httpStatus = a} :: ListAssetRelationshipsResponse)
+
+-- | A list that summarizes each asset relationship.
+listAssetRelationshipsResponse_assetRelationshipSummaries :: Lens.Lens' ListAssetRelationshipsResponse [AssetRelationshipSummary]
+listAssetRelationshipsResponse_assetRelationshipSummaries = Lens.lens (\ListAssetRelationshipsResponse' {assetRelationshipSummaries} -> assetRelationshipSummaries) (\s@ListAssetRelationshipsResponse' {} a -> s {assetRelationshipSummaries = a} :: ListAssetRelationshipsResponse) Prelude.. Lens.coerced
+
+instance
+  Prelude.NFData
+    ListAssetRelationshipsResponse
+  where
+  rnf ListAssetRelationshipsResponse' {..} =
+    Prelude.rnf nextToken
+      `Prelude.seq` Prelude.rnf httpStatus
+      `Prelude.seq` Prelude.rnf assetRelationshipSummaries
diff --git a/gen/Amazonka/IoTSiteWise/ListAssets.hs b/gen/Amazonka/IoTSiteWise/ListAssets.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/IoTSiteWise/ListAssets.hs
@@ -0,0 +1,285 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.IoTSiteWise.ListAssets
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Retrieves a paginated list of asset summaries.
+--
+-- You can use this operation to do the following:
+--
+-- -   List assets based on a specific asset model.
+--
+-- -   List top-level assets.
+--
+-- You can\'t use this operation to list all assets. To retrieve summaries
+-- for all of your assets, use
+-- <https://docs.aws.amazon.com/iot-sitewise/latest/APIReference/API_ListAssetModels.html ListAssetModels>
+-- to get all of your asset model IDs. Then, use ListAssets to get all
+-- assets for each asset model.
+--
+-- This operation returns paginated results.
+module Amazonka.IoTSiteWise.ListAssets
+  ( -- * Creating a Request
+    ListAssets (..),
+    newListAssets,
+
+    -- * Request Lenses
+    listAssets_assetModelId,
+    listAssets_filter,
+    listAssets_maxResults,
+    listAssets_nextToken,
+
+    -- * Destructuring the Response
+    ListAssetsResponse (..),
+    newListAssetsResponse,
+
+    -- * Response Lenses
+    listAssetsResponse_nextToken,
+    listAssetsResponse_httpStatus,
+    listAssetsResponse_assetSummaries,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.IoTSiteWise.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newListAssets' smart constructor.
+data ListAssets = ListAssets'
+  { -- | The ID of the asset model by which to filter the list of assets. This
+    -- parameter is required if you choose @ALL@ for @filter@.
+    assetModelId :: Prelude.Maybe Prelude.Text,
+    -- | The filter for the requested list of assets. Choose one of the following
+    -- options:
+    --
+    -- -   @ALL@ – The list includes all assets for a given asset model ID. The
+    --     @assetModelId@ parameter is required if you filter by @ALL@.
+    --
+    -- -   @TOP_LEVEL@ – The list includes only top-level assets in the asset
+    --     hierarchy tree.
+    --
+    -- Default: @ALL@
+    filter' :: Prelude.Maybe ListAssetsFilter,
+    -- | The maximum number of results to return for each paginated request.
+    --
+    -- Default: 50
+    maxResults :: Prelude.Maybe Prelude.Natural,
+    -- | The token to be used for the next set of paginated results.
+    nextToken :: Prelude.Maybe Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ListAssets' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'assetModelId', 'listAssets_assetModelId' - The ID of the asset model by which to filter the list of assets. This
+-- parameter is required if you choose @ALL@ for @filter@.
+--
+-- 'filter'', 'listAssets_filter' - The filter for the requested list of assets. Choose one of the following
+-- options:
+--
+-- -   @ALL@ – The list includes all assets for a given asset model ID. The
+--     @assetModelId@ parameter is required if you filter by @ALL@.
+--
+-- -   @TOP_LEVEL@ – The list includes only top-level assets in the asset
+--     hierarchy tree.
+--
+-- Default: @ALL@
+--
+-- 'maxResults', 'listAssets_maxResults' - The maximum number of results to return for each paginated request.
+--
+-- Default: 50
+--
+-- 'nextToken', 'listAssets_nextToken' - The token to be used for the next set of paginated results.
+newListAssets ::
+  ListAssets
+newListAssets =
+  ListAssets'
+    { assetModelId = Prelude.Nothing,
+      filter' = Prelude.Nothing,
+      maxResults = Prelude.Nothing,
+      nextToken = Prelude.Nothing
+    }
+
+-- | The ID of the asset model by which to filter the list of assets. This
+-- parameter is required if you choose @ALL@ for @filter@.
+listAssets_assetModelId :: Lens.Lens' ListAssets (Prelude.Maybe Prelude.Text)
+listAssets_assetModelId = Lens.lens (\ListAssets' {assetModelId} -> assetModelId) (\s@ListAssets' {} a -> s {assetModelId = a} :: ListAssets)
+
+-- | The filter for the requested list of assets. Choose one of the following
+-- options:
+--
+-- -   @ALL@ – The list includes all assets for a given asset model ID. The
+--     @assetModelId@ parameter is required if you filter by @ALL@.
+--
+-- -   @TOP_LEVEL@ – The list includes only top-level assets in the asset
+--     hierarchy tree.
+--
+-- Default: @ALL@
+listAssets_filter :: Lens.Lens' ListAssets (Prelude.Maybe ListAssetsFilter)
+listAssets_filter = Lens.lens (\ListAssets' {filter'} -> filter') (\s@ListAssets' {} a -> s {filter' = a} :: ListAssets)
+
+-- | The maximum number of results to return for each paginated request.
+--
+-- Default: 50
+listAssets_maxResults :: Lens.Lens' ListAssets (Prelude.Maybe Prelude.Natural)
+listAssets_maxResults = Lens.lens (\ListAssets' {maxResults} -> maxResults) (\s@ListAssets' {} a -> s {maxResults = a} :: ListAssets)
+
+-- | The token to be used for the next set of paginated results.
+listAssets_nextToken :: Lens.Lens' ListAssets (Prelude.Maybe Prelude.Text)
+listAssets_nextToken = Lens.lens (\ListAssets' {nextToken} -> nextToken) (\s@ListAssets' {} a -> s {nextToken = a} :: ListAssets)
+
+instance Core.AWSPager ListAssets where
+  page rq rs
+    | Core.stop
+        ( rs
+            Lens.^? listAssetsResponse_nextToken
+            Prelude.. Lens._Just
+        ) =
+        Prelude.Nothing
+    | Core.stop
+        (rs Lens.^. listAssetsResponse_assetSummaries) =
+        Prelude.Nothing
+    | Prelude.otherwise =
+        Prelude.Just
+          Prelude.$ rq
+          Prelude.& listAssets_nextToken
+          Lens..~ rs
+          Lens.^? listAssetsResponse_nextToken
+          Prelude.. Lens._Just
+
+instance Core.AWSRequest ListAssets where
+  type AWSResponse ListAssets = ListAssetsResponse
+  request overrides =
+    Request.get (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          ListAssetsResponse'
+            Prelude.<$> (x Data..?> "nextToken")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+            Prelude.<*> ( x
+                            Data..?> "assetSummaries"
+                            Core..!@ Prelude.mempty
+                        )
+      )
+
+instance Prelude.Hashable ListAssets where
+  hashWithSalt _salt ListAssets' {..} =
+    _salt
+      `Prelude.hashWithSalt` assetModelId
+      `Prelude.hashWithSalt` filter'
+      `Prelude.hashWithSalt` maxResults
+      `Prelude.hashWithSalt` nextToken
+
+instance Prelude.NFData ListAssets where
+  rnf ListAssets' {..} =
+    Prelude.rnf assetModelId
+      `Prelude.seq` Prelude.rnf filter'
+      `Prelude.seq` Prelude.rnf maxResults
+      `Prelude.seq` Prelude.rnf nextToken
+
+instance Data.ToHeaders ListAssets where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToPath ListAssets where
+  toPath = Prelude.const "/assets"
+
+instance Data.ToQuery ListAssets where
+  toQuery ListAssets' {..} =
+    Prelude.mconcat
+      [ "assetModelId" Data.=: assetModelId,
+        "filter" Data.=: filter',
+        "maxResults" Data.=: maxResults,
+        "nextToken" Data.=: nextToken
+      ]
+
+-- | /See:/ 'newListAssetsResponse' smart constructor.
+data ListAssetsResponse = ListAssetsResponse'
+  { -- | The token for the next set of results, or null if there are no
+    -- additional results.
+    nextToken :: Prelude.Maybe Prelude.Text,
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int,
+    -- | A list that summarizes each asset.
+    assetSummaries :: [AssetSummary]
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ListAssetsResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'nextToken', 'listAssetsResponse_nextToken' - The token for the next set of results, or null if there are no
+-- additional results.
+--
+-- 'httpStatus', 'listAssetsResponse_httpStatus' - The response's http status code.
+--
+-- 'assetSummaries', 'listAssetsResponse_assetSummaries' - A list that summarizes each asset.
+newListAssetsResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  ListAssetsResponse
+newListAssetsResponse pHttpStatus_ =
+  ListAssetsResponse'
+    { nextToken = Prelude.Nothing,
+      httpStatus = pHttpStatus_,
+      assetSummaries = Prelude.mempty
+    }
+
+-- | The token for the next set of results, or null if there are no
+-- additional results.
+listAssetsResponse_nextToken :: Lens.Lens' ListAssetsResponse (Prelude.Maybe Prelude.Text)
+listAssetsResponse_nextToken = Lens.lens (\ListAssetsResponse' {nextToken} -> nextToken) (\s@ListAssetsResponse' {} a -> s {nextToken = a} :: ListAssetsResponse)
+
+-- | The response's http status code.
+listAssetsResponse_httpStatus :: Lens.Lens' ListAssetsResponse Prelude.Int
+listAssetsResponse_httpStatus = Lens.lens (\ListAssetsResponse' {httpStatus} -> httpStatus) (\s@ListAssetsResponse' {} a -> s {httpStatus = a} :: ListAssetsResponse)
+
+-- | A list that summarizes each asset.
+listAssetsResponse_assetSummaries :: Lens.Lens' ListAssetsResponse [AssetSummary]
+listAssetsResponse_assetSummaries = Lens.lens (\ListAssetsResponse' {assetSummaries} -> assetSummaries) (\s@ListAssetsResponse' {} a -> s {assetSummaries = a} :: ListAssetsResponse) Prelude.. Lens.coerced
+
+instance Prelude.NFData ListAssetsResponse where
+  rnf ListAssetsResponse' {..} =
+    Prelude.rnf nextToken
+      `Prelude.seq` Prelude.rnf httpStatus
+      `Prelude.seq` Prelude.rnf assetSummaries
diff --git a/gen/Amazonka/IoTSiteWise/ListAssociatedAssets.hs b/gen/Amazonka/IoTSiteWise/ListAssociatedAssets.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/IoTSiteWise/ListAssociatedAssets.hs
@@ -0,0 +1,329 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.IoTSiteWise.ListAssociatedAssets
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Retrieves a paginated list of associated assets.
+--
+-- You can use this operation to do the following:
+--
+-- -   List child assets associated to a parent asset by a hierarchy that
+--     you specify.
+--
+-- -   List an asset\'s parent asset.
+--
+-- This operation returns paginated results.
+module Amazonka.IoTSiteWise.ListAssociatedAssets
+  ( -- * Creating a Request
+    ListAssociatedAssets (..),
+    newListAssociatedAssets,
+
+    -- * Request Lenses
+    listAssociatedAssets_hierarchyId,
+    listAssociatedAssets_maxResults,
+    listAssociatedAssets_nextToken,
+    listAssociatedAssets_traversalDirection,
+    listAssociatedAssets_assetId,
+
+    -- * Destructuring the Response
+    ListAssociatedAssetsResponse (..),
+    newListAssociatedAssetsResponse,
+
+    -- * Response Lenses
+    listAssociatedAssetsResponse_nextToken,
+    listAssociatedAssetsResponse_httpStatus,
+    listAssociatedAssetsResponse_assetSummaries,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.IoTSiteWise.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newListAssociatedAssets' smart constructor.
+data ListAssociatedAssets = ListAssociatedAssets'
+  { -- | The ID of the hierarchy by which child assets are associated to the
+    -- asset. To find a hierarchy ID, use the
+    -- <https://docs.aws.amazon.com/iot-sitewise/latest/APIReference/API_DescribeAsset.html DescribeAsset>
+    -- or
+    -- <https://docs.aws.amazon.com/iot-sitewise/latest/APIReference/API_DescribeAssetModel.html DescribeAssetModel>
+    -- operations. This parameter is required if you choose @CHILD@ for
+    -- @traversalDirection@.
+    --
+    -- For more information, see
+    -- <https://docs.aws.amazon.com/iot-sitewise/latest/userguide/asset-hierarchies.html Asset hierarchies>
+    -- in the /IoT SiteWise User Guide/.
+    hierarchyId :: Prelude.Maybe Prelude.Text,
+    -- | The maximum number of results to return for each paginated request.
+    --
+    -- Default: 50
+    maxResults :: Prelude.Maybe Prelude.Natural,
+    -- | The token to be used for the next set of paginated results.
+    nextToken :: Prelude.Maybe Prelude.Text,
+    -- | The direction to list associated assets. Choose one of the following
+    -- options:
+    --
+    -- -   @CHILD@ – The list includes all child assets associated to the
+    --     asset. The @hierarchyId@ parameter is required if you choose
+    --     @CHILD@.
+    --
+    -- -   @PARENT@ – The list includes the asset\'s parent asset.
+    --
+    -- Default: @CHILD@
+    traversalDirection :: Prelude.Maybe TraversalDirection,
+    -- | The ID of the asset to query.
+    assetId :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ListAssociatedAssets' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'hierarchyId', 'listAssociatedAssets_hierarchyId' - The ID of the hierarchy by which child assets are associated to the
+-- asset. To find a hierarchy ID, use the
+-- <https://docs.aws.amazon.com/iot-sitewise/latest/APIReference/API_DescribeAsset.html DescribeAsset>
+-- or
+-- <https://docs.aws.amazon.com/iot-sitewise/latest/APIReference/API_DescribeAssetModel.html DescribeAssetModel>
+-- operations. This parameter is required if you choose @CHILD@ for
+-- @traversalDirection@.
+--
+-- For more information, see
+-- <https://docs.aws.amazon.com/iot-sitewise/latest/userguide/asset-hierarchies.html Asset hierarchies>
+-- in the /IoT SiteWise User Guide/.
+--
+-- 'maxResults', 'listAssociatedAssets_maxResults' - The maximum number of results to return for each paginated request.
+--
+-- Default: 50
+--
+-- 'nextToken', 'listAssociatedAssets_nextToken' - The token to be used for the next set of paginated results.
+--
+-- 'traversalDirection', 'listAssociatedAssets_traversalDirection' - The direction to list associated assets. Choose one of the following
+-- options:
+--
+-- -   @CHILD@ – The list includes all child assets associated to the
+--     asset. The @hierarchyId@ parameter is required if you choose
+--     @CHILD@.
+--
+-- -   @PARENT@ – The list includes the asset\'s parent asset.
+--
+-- Default: @CHILD@
+--
+-- 'assetId', 'listAssociatedAssets_assetId' - The ID of the asset to query.
+newListAssociatedAssets ::
+  -- | 'assetId'
+  Prelude.Text ->
+  ListAssociatedAssets
+newListAssociatedAssets pAssetId_ =
+  ListAssociatedAssets'
+    { hierarchyId =
+        Prelude.Nothing,
+      maxResults = Prelude.Nothing,
+      nextToken = Prelude.Nothing,
+      traversalDirection = Prelude.Nothing,
+      assetId = pAssetId_
+    }
+
+-- | The ID of the hierarchy by which child assets are associated to the
+-- asset. To find a hierarchy ID, use the
+-- <https://docs.aws.amazon.com/iot-sitewise/latest/APIReference/API_DescribeAsset.html DescribeAsset>
+-- or
+-- <https://docs.aws.amazon.com/iot-sitewise/latest/APIReference/API_DescribeAssetModel.html DescribeAssetModel>
+-- operations. This parameter is required if you choose @CHILD@ for
+-- @traversalDirection@.
+--
+-- For more information, see
+-- <https://docs.aws.amazon.com/iot-sitewise/latest/userguide/asset-hierarchies.html Asset hierarchies>
+-- in the /IoT SiteWise User Guide/.
+listAssociatedAssets_hierarchyId :: Lens.Lens' ListAssociatedAssets (Prelude.Maybe Prelude.Text)
+listAssociatedAssets_hierarchyId = Lens.lens (\ListAssociatedAssets' {hierarchyId} -> hierarchyId) (\s@ListAssociatedAssets' {} a -> s {hierarchyId = a} :: ListAssociatedAssets)
+
+-- | The maximum number of results to return for each paginated request.
+--
+-- Default: 50
+listAssociatedAssets_maxResults :: Lens.Lens' ListAssociatedAssets (Prelude.Maybe Prelude.Natural)
+listAssociatedAssets_maxResults = Lens.lens (\ListAssociatedAssets' {maxResults} -> maxResults) (\s@ListAssociatedAssets' {} a -> s {maxResults = a} :: ListAssociatedAssets)
+
+-- | The token to be used for the next set of paginated results.
+listAssociatedAssets_nextToken :: Lens.Lens' ListAssociatedAssets (Prelude.Maybe Prelude.Text)
+listAssociatedAssets_nextToken = Lens.lens (\ListAssociatedAssets' {nextToken} -> nextToken) (\s@ListAssociatedAssets' {} a -> s {nextToken = a} :: ListAssociatedAssets)
+
+-- | The direction to list associated assets. Choose one of the following
+-- options:
+--
+-- -   @CHILD@ – The list includes all child assets associated to the
+--     asset. The @hierarchyId@ parameter is required if you choose
+--     @CHILD@.
+--
+-- -   @PARENT@ – The list includes the asset\'s parent asset.
+--
+-- Default: @CHILD@
+listAssociatedAssets_traversalDirection :: Lens.Lens' ListAssociatedAssets (Prelude.Maybe TraversalDirection)
+listAssociatedAssets_traversalDirection = Lens.lens (\ListAssociatedAssets' {traversalDirection} -> traversalDirection) (\s@ListAssociatedAssets' {} a -> s {traversalDirection = a} :: ListAssociatedAssets)
+
+-- | The ID of the asset to query.
+listAssociatedAssets_assetId :: Lens.Lens' ListAssociatedAssets Prelude.Text
+listAssociatedAssets_assetId = Lens.lens (\ListAssociatedAssets' {assetId} -> assetId) (\s@ListAssociatedAssets' {} a -> s {assetId = a} :: ListAssociatedAssets)
+
+instance Core.AWSPager ListAssociatedAssets where
+  page rq rs
+    | Core.stop
+        ( rs
+            Lens.^? listAssociatedAssetsResponse_nextToken
+            Prelude.. Lens._Just
+        ) =
+        Prelude.Nothing
+    | Core.stop
+        ( rs
+            Lens.^. listAssociatedAssetsResponse_assetSummaries
+        ) =
+        Prelude.Nothing
+    | Prelude.otherwise =
+        Prelude.Just
+          Prelude.$ rq
+          Prelude.& listAssociatedAssets_nextToken
+          Lens..~ rs
+          Lens.^? listAssociatedAssetsResponse_nextToken
+          Prelude.. Lens._Just
+
+instance Core.AWSRequest ListAssociatedAssets where
+  type
+    AWSResponse ListAssociatedAssets =
+      ListAssociatedAssetsResponse
+  request overrides =
+    Request.get (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          ListAssociatedAssetsResponse'
+            Prelude.<$> (x Data..?> "nextToken")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+            Prelude.<*> ( x
+                            Data..?> "assetSummaries"
+                            Core..!@ Prelude.mempty
+                        )
+      )
+
+instance Prelude.Hashable ListAssociatedAssets where
+  hashWithSalt _salt ListAssociatedAssets' {..} =
+    _salt
+      `Prelude.hashWithSalt` hierarchyId
+      `Prelude.hashWithSalt` maxResults
+      `Prelude.hashWithSalt` nextToken
+      `Prelude.hashWithSalt` traversalDirection
+      `Prelude.hashWithSalt` assetId
+
+instance Prelude.NFData ListAssociatedAssets where
+  rnf ListAssociatedAssets' {..} =
+    Prelude.rnf hierarchyId
+      `Prelude.seq` Prelude.rnf maxResults
+      `Prelude.seq` Prelude.rnf nextToken
+      `Prelude.seq` Prelude.rnf traversalDirection
+      `Prelude.seq` Prelude.rnf assetId
+
+instance Data.ToHeaders ListAssociatedAssets where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToPath ListAssociatedAssets where
+  toPath ListAssociatedAssets' {..} =
+    Prelude.mconcat
+      ["/assets/", Data.toBS assetId, "/hierarchies"]
+
+instance Data.ToQuery ListAssociatedAssets where
+  toQuery ListAssociatedAssets' {..} =
+    Prelude.mconcat
+      [ "hierarchyId" Data.=: hierarchyId,
+        "maxResults" Data.=: maxResults,
+        "nextToken" Data.=: nextToken,
+        "traversalDirection" Data.=: traversalDirection
+      ]
+
+-- | /See:/ 'newListAssociatedAssetsResponse' smart constructor.
+data ListAssociatedAssetsResponse = ListAssociatedAssetsResponse'
+  { -- | The token for the next set of results, or null if there are no
+    -- additional results.
+    nextToken :: Prelude.Maybe Prelude.Text,
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int,
+    -- | A list that summarizes the associated assets.
+    assetSummaries :: [AssociatedAssetsSummary]
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ListAssociatedAssetsResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'nextToken', 'listAssociatedAssetsResponse_nextToken' - The token for the next set of results, or null if there are no
+-- additional results.
+--
+-- 'httpStatus', 'listAssociatedAssetsResponse_httpStatus' - The response's http status code.
+--
+-- 'assetSummaries', 'listAssociatedAssetsResponse_assetSummaries' - A list that summarizes the associated assets.
+newListAssociatedAssetsResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  ListAssociatedAssetsResponse
+newListAssociatedAssetsResponse pHttpStatus_ =
+  ListAssociatedAssetsResponse'
+    { nextToken =
+        Prelude.Nothing,
+      httpStatus = pHttpStatus_,
+      assetSummaries = Prelude.mempty
+    }
+
+-- | The token for the next set of results, or null if there are no
+-- additional results.
+listAssociatedAssetsResponse_nextToken :: Lens.Lens' ListAssociatedAssetsResponse (Prelude.Maybe Prelude.Text)
+listAssociatedAssetsResponse_nextToken = Lens.lens (\ListAssociatedAssetsResponse' {nextToken} -> nextToken) (\s@ListAssociatedAssetsResponse' {} a -> s {nextToken = a} :: ListAssociatedAssetsResponse)
+
+-- | The response's http status code.
+listAssociatedAssetsResponse_httpStatus :: Lens.Lens' ListAssociatedAssetsResponse Prelude.Int
+listAssociatedAssetsResponse_httpStatus = Lens.lens (\ListAssociatedAssetsResponse' {httpStatus} -> httpStatus) (\s@ListAssociatedAssetsResponse' {} a -> s {httpStatus = a} :: ListAssociatedAssetsResponse)
+
+-- | A list that summarizes the associated assets.
+listAssociatedAssetsResponse_assetSummaries :: Lens.Lens' ListAssociatedAssetsResponse [AssociatedAssetsSummary]
+listAssociatedAssetsResponse_assetSummaries = Lens.lens (\ListAssociatedAssetsResponse' {assetSummaries} -> assetSummaries) (\s@ListAssociatedAssetsResponse' {} a -> s {assetSummaries = a} :: ListAssociatedAssetsResponse) Prelude.. Lens.coerced
+
+instance Prelude.NFData ListAssociatedAssetsResponse where
+  rnf ListAssociatedAssetsResponse' {..} =
+    Prelude.rnf nextToken
+      `Prelude.seq` Prelude.rnf httpStatus
+      `Prelude.seq` Prelude.rnf assetSummaries
diff --git a/gen/Amazonka/IoTSiteWise/ListBulkImportJobs.hs b/gen/Amazonka/IoTSiteWise/ListBulkImportJobs.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/IoTSiteWise/ListBulkImportJobs.hs
@@ -0,0 +1,230 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.IoTSiteWise.ListBulkImportJobs
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Retrieves a paginated list of bulk import job requests. For more
+-- information, see
+-- <https://docs.aws.amazon.com/iot-sitewise/latest/userguide/ListBulkImportJobs.html List bulk import jobs (CLI)>
+-- in the /IoT SiteWise User Guide/.
+--
+-- This operation returns paginated results.
+module Amazonka.IoTSiteWise.ListBulkImportJobs
+  ( -- * Creating a Request
+    ListBulkImportJobs (..),
+    newListBulkImportJobs,
+
+    -- * Request Lenses
+    listBulkImportJobs_filter,
+    listBulkImportJobs_maxResults,
+    listBulkImportJobs_nextToken,
+
+    -- * Destructuring the Response
+    ListBulkImportJobsResponse (..),
+    newListBulkImportJobsResponse,
+
+    -- * Response Lenses
+    listBulkImportJobsResponse_nextToken,
+    listBulkImportJobsResponse_httpStatus,
+    listBulkImportJobsResponse_jobSummaries,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.IoTSiteWise.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newListBulkImportJobs' smart constructor.
+data ListBulkImportJobs = ListBulkImportJobs'
+  { -- | You can use a filter to select the bulk import jobs that you want to
+    -- retrieve.
+    filter' :: Prelude.Maybe ListBulkImportJobsFilter,
+    -- | The maximum number of results to return for each paginated request.
+    maxResults :: Prelude.Maybe Prelude.Natural,
+    -- | The token to be used for the next set of paginated results.
+    nextToken :: Prelude.Maybe Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ListBulkImportJobs' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'filter'', 'listBulkImportJobs_filter' - You can use a filter to select the bulk import jobs that you want to
+-- retrieve.
+--
+-- 'maxResults', 'listBulkImportJobs_maxResults' - The maximum number of results to return for each paginated request.
+--
+-- 'nextToken', 'listBulkImportJobs_nextToken' - The token to be used for the next set of paginated results.
+newListBulkImportJobs ::
+  ListBulkImportJobs
+newListBulkImportJobs =
+  ListBulkImportJobs'
+    { filter' = Prelude.Nothing,
+      maxResults = Prelude.Nothing,
+      nextToken = Prelude.Nothing
+    }
+
+-- | You can use a filter to select the bulk import jobs that you want to
+-- retrieve.
+listBulkImportJobs_filter :: Lens.Lens' ListBulkImportJobs (Prelude.Maybe ListBulkImportJobsFilter)
+listBulkImportJobs_filter = Lens.lens (\ListBulkImportJobs' {filter'} -> filter') (\s@ListBulkImportJobs' {} a -> s {filter' = a} :: ListBulkImportJobs)
+
+-- | The maximum number of results to return for each paginated request.
+listBulkImportJobs_maxResults :: Lens.Lens' ListBulkImportJobs (Prelude.Maybe Prelude.Natural)
+listBulkImportJobs_maxResults = Lens.lens (\ListBulkImportJobs' {maxResults} -> maxResults) (\s@ListBulkImportJobs' {} a -> s {maxResults = a} :: ListBulkImportJobs)
+
+-- | The token to be used for the next set of paginated results.
+listBulkImportJobs_nextToken :: Lens.Lens' ListBulkImportJobs (Prelude.Maybe Prelude.Text)
+listBulkImportJobs_nextToken = Lens.lens (\ListBulkImportJobs' {nextToken} -> nextToken) (\s@ListBulkImportJobs' {} a -> s {nextToken = a} :: ListBulkImportJobs)
+
+instance Core.AWSPager ListBulkImportJobs where
+  page rq rs
+    | Core.stop
+        ( rs
+            Lens.^? listBulkImportJobsResponse_nextToken
+            Prelude.. Lens._Just
+        ) =
+        Prelude.Nothing
+    | Core.stop
+        (rs Lens.^. listBulkImportJobsResponse_jobSummaries) =
+        Prelude.Nothing
+    | Prelude.otherwise =
+        Prelude.Just
+          Prelude.$ rq
+          Prelude.& listBulkImportJobs_nextToken
+          Lens..~ rs
+          Lens.^? listBulkImportJobsResponse_nextToken
+          Prelude.. Lens._Just
+
+instance Core.AWSRequest ListBulkImportJobs where
+  type
+    AWSResponse ListBulkImportJobs =
+      ListBulkImportJobsResponse
+  request overrides =
+    Request.get (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          ListBulkImportJobsResponse'
+            Prelude.<$> (x Data..?> "nextToken")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+            Prelude.<*> (x Data..?> "jobSummaries" Core..!@ Prelude.mempty)
+      )
+
+instance Prelude.Hashable ListBulkImportJobs where
+  hashWithSalt _salt ListBulkImportJobs' {..} =
+    _salt
+      `Prelude.hashWithSalt` filter'
+      `Prelude.hashWithSalt` maxResults
+      `Prelude.hashWithSalt` nextToken
+
+instance Prelude.NFData ListBulkImportJobs where
+  rnf ListBulkImportJobs' {..} =
+    Prelude.rnf filter'
+      `Prelude.seq` Prelude.rnf maxResults
+      `Prelude.seq` Prelude.rnf nextToken
+
+instance Data.ToHeaders ListBulkImportJobs where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToPath ListBulkImportJobs where
+  toPath = Prelude.const "/jobs"
+
+instance Data.ToQuery ListBulkImportJobs where
+  toQuery ListBulkImportJobs' {..} =
+    Prelude.mconcat
+      [ "filter" Data.=: filter',
+        "maxResults" Data.=: maxResults,
+        "nextToken" Data.=: nextToken
+      ]
+
+-- | /See:/ 'newListBulkImportJobsResponse' smart constructor.
+data ListBulkImportJobsResponse = ListBulkImportJobsResponse'
+  { -- | The token for the next set of results, or null if there are no
+    -- additional results.
+    nextToken :: Prelude.Maybe Prelude.Text,
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int,
+    -- | One or more job summaries to list.
+    jobSummaries :: [JobSummary]
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ListBulkImportJobsResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'nextToken', 'listBulkImportJobsResponse_nextToken' - The token for the next set of results, or null if there are no
+-- additional results.
+--
+-- 'httpStatus', 'listBulkImportJobsResponse_httpStatus' - The response's http status code.
+--
+-- 'jobSummaries', 'listBulkImportJobsResponse_jobSummaries' - One or more job summaries to list.
+newListBulkImportJobsResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  ListBulkImportJobsResponse
+newListBulkImportJobsResponse pHttpStatus_ =
+  ListBulkImportJobsResponse'
+    { nextToken =
+        Prelude.Nothing,
+      httpStatus = pHttpStatus_,
+      jobSummaries = Prelude.mempty
+    }
+
+-- | The token for the next set of results, or null if there are no
+-- additional results.
+listBulkImportJobsResponse_nextToken :: Lens.Lens' ListBulkImportJobsResponse (Prelude.Maybe Prelude.Text)
+listBulkImportJobsResponse_nextToken = Lens.lens (\ListBulkImportJobsResponse' {nextToken} -> nextToken) (\s@ListBulkImportJobsResponse' {} a -> s {nextToken = a} :: ListBulkImportJobsResponse)
+
+-- | The response's http status code.
+listBulkImportJobsResponse_httpStatus :: Lens.Lens' ListBulkImportJobsResponse Prelude.Int
+listBulkImportJobsResponse_httpStatus = Lens.lens (\ListBulkImportJobsResponse' {httpStatus} -> httpStatus) (\s@ListBulkImportJobsResponse' {} a -> s {httpStatus = a} :: ListBulkImportJobsResponse)
+
+-- | One or more job summaries to list.
+listBulkImportJobsResponse_jobSummaries :: Lens.Lens' ListBulkImportJobsResponse [JobSummary]
+listBulkImportJobsResponse_jobSummaries = Lens.lens (\ListBulkImportJobsResponse' {jobSummaries} -> jobSummaries) (\s@ListBulkImportJobsResponse' {} a -> s {jobSummaries = a} :: ListBulkImportJobsResponse) Prelude.. Lens.coerced
+
+instance Prelude.NFData ListBulkImportJobsResponse where
+  rnf ListBulkImportJobsResponse' {..} =
+    Prelude.rnf nextToken
+      `Prelude.seq` Prelude.rnf httpStatus
+      `Prelude.seq` Prelude.rnf jobSummaries
diff --git a/gen/Amazonka/IoTSiteWise/ListDashboards.hs b/gen/Amazonka/IoTSiteWise/ListDashboards.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/IoTSiteWise/ListDashboards.hs
@@ -0,0 +1,238 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.IoTSiteWise.ListDashboards
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Retrieves a paginated list of dashboards for an IoT SiteWise Monitor
+-- project.
+--
+-- This operation returns paginated results.
+module Amazonka.IoTSiteWise.ListDashboards
+  ( -- * Creating a Request
+    ListDashboards (..),
+    newListDashboards,
+
+    -- * Request Lenses
+    listDashboards_maxResults,
+    listDashboards_nextToken,
+    listDashboards_projectId,
+
+    -- * Destructuring the Response
+    ListDashboardsResponse (..),
+    newListDashboardsResponse,
+
+    -- * Response Lenses
+    listDashboardsResponse_nextToken,
+    listDashboardsResponse_httpStatus,
+    listDashboardsResponse_dashboardSummaries,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.IoTSiteWise.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newListDashboards' smart constructor.
+data ListDashboards = ListDashboards'
+  { -- | The maximum number of results to return for each paginated request.
+    --
+    -- Default: 50
+    maxResults :: Prelude.Maybe Prelude.Natural,
+    -- | The token to be used for the next set of paginated results.
+    nextToken :: Prelude.Maybe Prelude.Text,
+    -- | The ID of the project.
+    projectId :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ListDashboards' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'maxResults', 'listDashboards_maxResults' - The maximum number of results to return for each paginated request.
+--
+-- Default: 50
+--
+-- 'nextToken', 'listDashboards_nextToken' - The token to be used for the next set of paginated results.
+--
+-- 'projectId', 'listDashboards_projectId' - The ID of the project.
+newListDashboards ::
+  -- | 'projectId'
+  Prelude.Text ->
+  ListDashboards
+newListDashboards pProjectId_ =
+  ListDashboards'
+    { maxResults = Prelude.Nothing,
+      nextToken = Prelude.Nothing,
+      projectId = pProjectId_
+    }
+
+-- | The maximum number of results to return for each paginated request.
+--
+-- Default: 50
+listDashboards_maxResults :: Lens.Lens' ListDashboards (Prelude.Maybe Prelude.Natural)
+listDashboards_maxResults = Lens.lens (\ListDashboards' {maxResults} -> maxResults) (\s@ListDashboards' {} a -> s {maxResults = a} :: ListDashboards)
+
+-- | The token to be used for the next set of paginated results.
+listDashboards_nextToken :: Lens.Lens' ListDashboards (Prelude.Maybe Prelude.Text)
+listDashboards_nextToken = Lens.lens (\ListDashboards' {nextToken} -> nextToken) (\s@ListDashboards' {} a -> s {nextToken = a} :: ListDashboards)
+
+-- | The ID of the project.
+listDashboards_projectId :: Lens.Lens' ListDashboards Prelude.Text
+listDashboards_projectId = Lens.lens (\ListDashboards' {projectId} -> projectId) (\s@ListDashboards' {} a -> s {projectId = a} :: ListDashboards)
+
+instance Core.AWSPager ListDashboards where
+  page rq rs
+    | Core.stop
+        ( rs
+            Lens.^? listDashboardsResponse_nextToken
+            Prelude.. Lens._Just
+        ) =
+        Prelude.Nothing
+    | Core.stop
+        ( rs
+            Lens.^. listDashboardsResponse_dashboardSummaries
+        ) =
+        Prelude.Nothing
+    | Prelude.otherwise =
+        Prelude.Just
+          Prelude.$ rq
+          Prelude.& listDashboards_nextToken
+          Lens..~ rs
+          Lens.^? listDashboardsResponse_nextToken
+          Prelude.. Lens._Just
+
+instance Core.AWSRequest ListDashboards where
+  type
+    AWSResponse ListDashboards =
+      ListDashboardsResponse
+  request overrides =
+    Request.get (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          ListDashboardsResponse'
+            Prelude.<$> (x Data..?> "nextToken")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+            Prelude.<*> ( x
+                            Data..?> "dashboardSummaries"
+                            Core..!@ Prelude.mempty
+                        )
+      )
+
+instance Prelude.Hashable ListDashboards where
+  hashWithSalt _salt ListDashboards' {..} =
+    _salt
+      `Prelude.hashWithSalt` maxResults
+      `Prelude.hashWithSalt` nextToken
+      `Prelude.hashWithSalt` projectId
+
+instance Prelude.NFData ListDashboards where
+  rnf ListDashboards' {..} =
+    Prelude.rnf maxResults
+      `Prelude.seq` Prelude.rnf nextToken
+      `Prelude.seq` Prelude.rnf projectId
+
+instance Data.ToHeaders ListDashboards where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToPath ListDashboards where
+  toPath = Prelude.const "/dashboards"
+
+instance Data.ToQuery ListDashboards where
+  toQuery ListDashboards' {..} =
+    Prelude.mconcat
+      [ "maxResults" Data.=: maxResults,
+        "nextToken" Data.=: nextToken,
+        "projectId" Data.=: projectId
+      ]
+
+-- | /See:/ 'newListDashboardsResponse' smart constructor.
+data ListDashboardsResponse = ListDashboardsResponse'
+  { -- | The token for the next set of results, or null if there are no
+    -- additional results.
+    nextToken :: Prelude.Maybe Prelude.Text,
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int,
+    -- | A list that summarizes each dashboard in the project.
+    dashboardSummaries :: [DashboardSummary]
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ListDashboardsResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'nextToken', 'listDashboardsResponse_nextToken' - The token for the next set of results, or null if there are no
+-- additional results.
+--
+-- 'httpStatus', 'listDashboardsResponse_httpStatus' - The response's http status code.
+--
+-- 'dashboardSummaries', 'listDashboardsResponse_dashboardSummaries' - A list that summarizes each dashboard in the project.
+newListDashboardsResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  ListDashboardsResponse
+newListDashboardsResponse pHttpStatus_ =
+  ListDashboardsResponse'
+    { nextToken =
+        Prelude.Nothing,
+      httpStatus = pHttpStatus_,
+      dashboardSummaries = Prelude.mempty
+    }
+
+-- | The token for the next set of results, or null if there are no
+-- additional results.
+listDashboardsResponse_nextToken :: Lens.Lens' ListDashboardsResponse (Prelude.Maybe Prelude.Text)
+listDashboardsResponse_nextToken = Lens.lens (\ListDashboardsResponse' {nextToken} -> nextToken) (\s@ListDashboardsResponse' {} a -> s {nextToken = a} :: ListDashboardsResponse)
+
+-- | The response's http status code.
+listDashboardsResponse_httpStatus :: Lens.Lens' ListDashboardsResponse Prelude.Int
+listDashboardsResponse_httpStatus = Lens.lens (\ListDashboardsResponse' {httpStatus} -> httpStatus) (\s@ListDashboardsResponse' {} a -> s {httpStatus = a} :: ListDashboardsResponse)
+
+-- | A list that summarizes each dashboard in the project.
+listDashboardsResponse_dashboardSummaries :: Lens.Lens' ListDashboardsResponse [DashboardSummary]
+listDashboardsResponse_dashboardSummaries = Lens.lens (\ListDashboardsResponse' {dashboardSummaries} -> dashboardSummaries) (\s@ListDashboardsResponse' {} a -> s {dashboardSummaries = a} :: ListDashboardsResponse) Prelude.. Lens.coerced
+
+instance Prelude.NFData ListDashboardsResponse where
+  rnf ListDashboardsResponse' {..} =
+    Prelude.rnf nextToken
+      `Prelude.seq` Prelude.rnf httpStatus
+      `Prelude.seq` Prelude.rnf dashboardSummaries
diff --git a/gen/Amazonka/IoTSiteWise/ListGateways.hs b/gen/Amazonka/IoTSiteWise/ListGateways.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/IoTSiteWise/ListGateways.hs
@@ -0,0 +1,217 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.IoTSiteWise.ListGateways
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Retrieves a paginated list of gateways.
+--
+-- This operation returns paginated results.
+module Amazonka.IoTSiteWise.ListGateways
+  ( -- * Creating a Request
+    ListGateways (..),
+    newListGateways,
+
+    -- * Request Lenses
+    listGateways_maxResults,
+    listGateways_nextToken,
+
+    -- * Destructuring the Response
+    ListGatewaysResponse (..),
+    newListGatewaysResponse,
+
+    -- * Response Lenses
+    listGatewaysResponse_nextToken,
+    listGatewaysResponse_httpStatus,
+    listGatewaysResponse_gatewaySummaries,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.IoTSiteWise.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newListGateways' smart constructor.
+data ListGateways = ListGateways'
+  { -- | The maximum number of results to return for each paginated request.
+    --
+    -- Default: 50
+    maxResults :: Prelude.Maybe Prelude.Natural,
+    -- | The token to be used for the next set of paginated results.
+    nextToken :: Prelude.Maybe Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ListGateways' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'maxResults', 'listGateways_maxResults' - The maximum number of results to return for each paginated request.
+--
+-- Default: 50
+--
+-- 'nextToken', 'listGateways_nextToken' - The token to be used for the next set of paginated results.
+newListGateways ::
+  ListGateways
+newListGateways =
+  ListGateways'
+    { maxResults = Prelude.Nothing,
+      nextToken = Prelude.Nothing
+    }
+
+-- | The maximum number of results to return for each paginated request.
+--
+-- Default: 50
+listGateways_maxResults :: Lens.Lens' ListGateways (Prelude.Maybe Prelude.Natural)
+listGateways_maxResults = Lens.lens (\ListGateways' {maxResults} -> maxResults) (\s@ListGateways' {} a -> s {maxResults = a} :: ListGateways)
+
+-- | The token to be used for the next set of paginated results.
+listGateways_nextToken :: Lens.Lens' ListGateways (Prelude.Maybe Prelude.Text)
+listGateways_nextToken = Lens.lens (\ListGateways' {nextToken} -> nextToken) (\s@ListGateways' {} a -> s {nextToken = a} :: ListGateways)
+
+instance Core.AWSPager ListGateways where
+  page rq rs
+    | Core.stop
+        ( rs
+            Lens.^? listGatewaysResponse_nextToken
+            Prelude.. Lens._Just
+        ) =
+        Prelude.Nothing
+    | Core.stop
+        (rs Lens.^. listGatewaysResponse_gatewaySummaries) =
+        Prelude.Nothing
+    | Prelude.otherwise =
+        Prelude.Just
+          Prelude.$ rq
+          Prelude.& listGateways_nextToken
+          Lens..~ rs
+          Lens.^? listGatewaysResponse_nextToken
+          Prelude.. Lens._Just
+
+instance Core.AWSRequest ListGateways where
+  type AWSResponse ListGateways = ListGatewaysResponse
+  request overrides =
+    Request.get (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          ListGatewaysResponse'
+            Prelude.<$> (x Data..?> "nextToken")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+            Prelude.<*> ( x
+                            Data..?> "gatewaySummaries"
+                            Core..!@ Prelude.mempty
+                        )
+      )
+
+instance Prelude.Hashable ListGateways where
+  hashWithSalt _salt ListGateways' {..} =
+    _salt
+      `Prelude.hashWithSalt` maxResults
+      `Prelude.hashWithSalt` nextToken
+
+instance Prelude.NFData ListGateways where
+  rnf ListGateways' {..} =
+    Prelude.rnf maxResults
+      `Prelude.seq` Prelude.rnf nextToken
+
+instance Data.ToHeaders ListGateways where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToPath ListGateways where
+  toPath = Prelude.const "/20200301/gateways"
+
+instance Data.ToQuery ListGateways where
+  toQuery ListGateways' {..} =
+    Prelude.mconcat
+      [ "maxResults" Data.=: maxResults,
+        "nextToken" Data.=: nextToken
+      ]
+
+-- | /See:/ 'newListGatewaysResponse' smart constructor.
+data ListGatewaysResponse = ListGatewaysResponse'
+  { -- | The token for the next set of results, or null if there are no
+    -- additional results.
+    nextToken :: Prelude.Maybe Prelude.Text,
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int,
+    -- | A list that summarizes each gateway.
+    gatewaySummaries :: [GatewaySummary]
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ListGatewaysResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'nextToken', 'listGatewaysResponse_nextToken' - The token for the next set of results, or null if there are no
+-- additional results.
+--
+-- 'httpStatus', 'listGatewaysResponse_httpStatus' - The response's http status code.
+--
+-- 'gatewaySummaries', 'listGatewaysResponse_gatewaySummaries' - A list that summarizes each gateway.
+newListGatewaysResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  ListGatewaysResponse
+newListGatewaysResponse pHttpStatus_ =
+  ListGatewaysResponse'
+    { nextToken = Prelude.Nothing,
+      httpStatus = pHttpStatus_,
+      gatewaySummaries = Prelude.mempty
+    }
+
+-- | The token for the next set of results, or null if there are no
+-- additional results.
+listGatewaysResponse_nextToken :: Lens.Lens' ListGatewaysResponse (Prelude.Maybe Prelude.Text)
+listGatewaysResponse_nextToken = Lens.lens (\ListGatewaysResponse' {nextToken} -> nextToken) (\s@ListGatewaysResponse' {} a -> s {nextToken = a} :: ListGatewaysResponse)
+
+-- | The response's http status code.
+listGatewaysResponse_httpStatus :: Lens.Lens' ListGatewaysResponse Prelude.Int
+listGatewaysResponse_httpStatus = Lens.lens (\ListGatewaysResponse' {httpStatus} -> httpStatus) (\s@ListGatewaysResponse' {} a -> s {httpStatus = a} :: ListGatewaysResponse)
+
+-- | A list that summarizes each gateway.
+listGatewaysResponse_gatewaySummaries :: Lens.Lens' ListGatewaysResponse [GatewaySummary]
+listGatewaysResponse_gatewaySummaries = Lens.lens (\ListGatewaysResponse' {gatewaySummaries} -> gatewaySummaries) (\s@ListGatewaysResponse' {} a -> s {gatewaySummaries = a} :: ListGatewaysResponse) Prelude.. Lens.coerced
+
+instance Prelude.NFData ListGatewaysResponse where
+  rnf ListGatewaysResponse' {..} =
+    Prelude.rnf nextToken
+      `Prelude.seq` Prelude.rnf httpStatus
+      `Prelude.seq` Prelude.rnf gatewaySummaries
diff --git a/gen/Amazonka/IoTSiteWise/ListPortals.hs b/gen/Amazonka/IoTSiteWise/ListPortals.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/IoTSiteWise/ListPortals.hs
@@ -0,0 +1,220 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.IoTSiteWise.ListPortals
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Retrieves a paginated list of IoT SiteWise Monitor portals.
+--
+-- This operation returns paginated results.
+module Amazonka.IoTSiteWise.ListPortals
+  ( -- * Creating a Request
+    ListPortals (..),
+    newListPortals,
+
+    -- * Request Lenses
+    listPortals_maxResults,
+    listPortals_nextToken,
+
+    -- * Destructuring the Response
+    ListPortalsResponse (..),
+    newListPortalsResponse,
+
+    -- * Response Lenses
+    listPortalsResponse_nextToken,
+    listPortalsResponse_portalSummaries,
+    listPortalsResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.IoTSiteWise.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newListPortals' smart constructor.
+data ListPortals = ListPortals'
+  { -- | The maximum number of results to return for each paginated request.
+    --
+    -- Default: 50
+    maxResults :: Prelude.Maybe Prelude.Natural,
+    -- | The token to be used for the next set of paginated results.
+    nextToken :: Prelude.Maybe Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ListPortals' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'maxResults', 'listPortals_maxResults' - The maximum number of results to return for each paginated request.
+--
+-- Default: 50
+--
+-- 'nextToken', 'listPortals_nextToken' - The token to be used for the next set of paginated results.
+newListPortals ::
+  ListPortals
+newListPortals =
+  ListPortals'
+    { maxResults = Prelude.Nothing,
+      nextToken = Prelude.Nothing
+    }
+
+-- | The maximum number of results to return for each paginated request.
+--
+-- Default: 50
+listPortals_maxResults :: Lens.Lens' ListPortals (Prelude.Maybe Prelude.Natural)
+listPortals_maxResults = Lens.lens (\ListPortals' {maxResults} -> maxResults) (\s@ListPortals' {} a -> s {maxResults = a} :: ListPortals)
+
+-- | The token to be used for the next set of paginated results.
+listPortals_nextToken :: Lens.Lens' ListPortals (Prelude.Maybe Prelude.Text)
+listPortals_nextToken = Lens.lens (\ListPortals' {nextToken} -> nextToken) (\s@ListPortals' {} a -> s {nextToken = a} :: ListPortals)
+
+instance Core.AWSPager ListPortals where
+  page rq rs
+    | Core.stop
+        ( rs
+            Lens.^? listPortalsResponse_nextToken
+            Prelude.. Lens._Just
+        ) =
+        Prelude.Nothing
+    | Core.stop
+        ( rs
+            Lens.^? listPortalsResponse_portalSummaries
+            Prelude.. Lens._Just
+        ) =
+        Prelude.Nothing
+    | Prelude.otherwise =
+        Prelude.Just
+          Prelude.$ rq
+          Prelude.& listPortals_nextToken
+          Lens..~ rs
+          Lens.^? listPortalsResponse_nextToken
+          Prelude.. Lens._Just
+
+instance Core.AWSRequest ListPortals where
+  type AWSResponse ListPortals = ListPortalsResponse
+  request overrides =
+    Request.get (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          ListPortalsResponse'
+            Prelude.<$> (x Data..?> "nextToken")
+            Prelude.<*> ( x
+                            Data..?> "portalSummaries"
+                            Core..!@ Prelude.mempty
+                        )
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable ListPortals where
+  hashWithSalt _salt ListPortals' {..} =
+    _salt
+      `Prelude.hashWithSalt` maxResults
+      `Prelude.hashWithSalt` nextToken
+
+instance Prelude.NFData ListPortals where
+  rnf ListPortals' {..} =
+    Prelude.rnf maxResults
+      `Prelude.seq` Prelude.rnf nextToken
+
+instance Data.ToHeaders ListPortals where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToPath ListPortals where
+  toPath = Prelude.const "/portals"
+
+instance Data.ToQuery ListPortals where
+  toQuery ListPortals' {..} =
+    Prelude.mconcat
+      [ "maxResults" Data.=: maxResults,
+        "nextToken" Data.=: nextToken
+      ]
+
+-- | /See:/ 'newListPortalsResponse' smart constructor.
+data ListPortalsResponse = ListPortalsResponse'
+  { -- | The token for the next set of results, or null if there are no
+    -- additional results.
+    nextToken :: Prelude.Maybe Prelude.Text,
+    -- | A list that summarizes each portal.
+    portalSummaries :: Prelude.Maybe [PortalSummary],
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ListPortalsResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'nextToken', 'listPortalsResponse_nextToken' - The token for the next set of results, or null if there are no
+-- additional results.
+--
+-- 'portalSummaries', 'listPortalsResponse_portalSummaries' - A list that summarizes each portal.
+--
+-- 'httpStatus', 'listPortalsResponse_httpStatus' - The response's http status code.
+newListPortalsResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  ListPortalsResponse
+newListPortalsResponse pHttpStatus_ =
+  ListPortalsResponse'
+    { nextToken = Prelude.Nothing,
+      portalSummaries = Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | The token for the next set of results, or null if there are no
+-- additional results.
+listPortalsResponse_nextToken :: Lens.Lens' ListPortalsResponse (Prelude.Maybe Prelude.Text)
+listPortalsResponse_nextToken = Lens.lens (\ListPortalsResponse' {nextToken} -> nextToken) (\s@ListPortalsResponse' {} a -> s {nextToken = a} :: ListPortalsResponse)
+
+-- | A list that summarizes each portal.
+listPortalsResponse_portalSummaries :: Lens.Lens' ListPortalsResponse (Prelude.Maybe [PortalSummary])
+listPortalsResponse_portalSummaries = Lens.lens (\ListPortalsResponse' {portalSummaries} -> portalSummaries) (\s@ListPortalsResponse' {} a -> s {portalSummaries = a} :: ListPortalsResponse) Prelude.. Lens.mapping Lens.coerced
+
+-- | The response's http status code.
+listPortalsResponse_httpStatus :: Lens.Lens' ListPortalsResponse Prelude.Int
+listPortalsResponse_httpStatus = Lens.lens (\ListPortalsResponse' {httpStatus} -> httpStatus) (\s@ListPortalsResponse' {} a -> s {httpStatus = a} :: ListPortalsResponse)
+
+instance Prelude.NFData ListPortalsResponse where
+  rnf ListPortalsResponse' {..} =
+    Prelude.rnf nextToken
+      `Prelude.seq` Prelude.rnf portalSummaries
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/IoTSiteWise/ListProjectAssets.hs b/gen/Amazonka/IoTSiteWise/ListProjectAssets.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/IoTSiteWise/ListProjectAssets.hs
@@ -0,0 +1,234 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.IoTSiteWise.ListProjectAssets
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Retrieves a paginated list of assets associated with an IoT SiteWise
+-- Monitor project.
+--
+-- This operation returns paginated results.
+module Amazonka.IoTSiteWise.ListProjectAssets
+  ( -- * Creating a Request
+    ListProjectAssets (..),
+    newListProjectAssets,
+
+    -- * Request Lenses
+    listProjectAssets_maxResults,
+    listProjectAssets_nextToken,
+    listProjectAssets_projectId,
+
+    -- * Destructuring the Response
+    ListProjectAssetsResponse (..),
+    newListProjectAssetsResponse,
+
+    -- * Response Lenses
+    listProjectAssetsResponse_nextToken,
+    listProjectAssetsResponse_httpStatus,
+    listProjectAssetsResponse_assetIds,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.IoTSiteWise.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newListProjectAssets' smart constructor.
+data ListProjectAssets = ListProjectAssets'
+  { -- | The maximum number of results to return for each paginated request.
+    --
+    -- Default: 50
+    maxResults :: Prelude.Maybe Prelude.Natural,
+    -- | The token to be used for the next set of paginated results.
+    nextToken :: Prelude.Maybe Prelude.Text,
+    -- | The ID of the project.
+    projectId :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ListProjectAssets' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'maxResults', 'listProjectAssets_maxResults' - The maximum number of results to return for each paginated request.
+--
+-- Default: 50
+--
+-- 'nextToken', 'listProjectAssets_nextToken' - The token to be used for the next set of paginated results.
+--
+-- 'projectId', 'listProjectAssets_projectId' - The ID of the project.
+newListProjectAssets ::
+  -- | 'projectId'
+  Prelude.Text ->
+  ListProjectAssets
+newListProjectAssets pProjectId_ =
+  ListProjectAssets'
+    { maxResults = Prelude.Nothing,
+      nextToken = Prelude.Nothing,
+      projectId = pProjectId_
+    }
+
+-- | The maximum number of results to return for each paginated request.
+--
+-- Default: 50
+listProjectAssets_maxResults :: Lens.Lens' ListProjectAssets (Prelude.Maybe Prelude.Natural)
+listProjectAssets_maxResults = Lens.lens (\ListProjectAssets' {maxResults} -> maxResults) (\s@ListProjectAssets' {} a -> s {maxResults = a} :: ListProjectAssets)
+
+-- | The token to be used for the next set of paginated results.
+listProjectAssets_nextToken :: Lens.Lens' ListProjectAssets (Prelude.Maybe Prelude.Text)
+listProjectAssets_nextToken = Lens.lens (\ListProjectAssets' {nextToken} -> nextToken) (\s@ListProjectAssets' {} a -> s {nextToken = a} :: ListProjectAssets)
+
+-- | The ID of the project.
+listProjectAssets_projectId :: Lens.Lens' ListProjectAssets Prelude.Text
+listProjectAssets_projectId = Lens.lens (\ListProjectAssets' {projectId} -> projectId) (\s@ListProjectAssets' {} a -> s {projectId = a} :: ListProjectAssets)
+
+instance Core.AWSPager ListProjectAssets where
+  page rq rs
+    | Core.stop
+        ( rs
+            Lens.^? listProjectAssetsResponse_nextToken
+            Prelude.. Lens._Just
+        ) =
+        Prelude.Nothing
+    | Core.stop
+        (rs Lens.^. listProjectAssetsResponse_assetIds) =
+        Prelude.Nothing
+    | Prelude.otherwise =
+        Prelude.Just
+          Prelude.$ rq
+          Prelude.& listProjectAssets_nextToken
+          Lens..~ rs
+          Lens.^? listProjectAssetsResponse_nextToken
+          Prelude.. Lens._Just
+
+instance Core.AWSRequest ListProjectAssets where
+  type
+    AWSResponse ListProjectAssets =
+      ListProjectAssetsResponse
+  request overrides =
+    Request.get (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          ListProjectAssetsResponse'
+            Prelude.<$> (x Data..?> "nextToken")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+            Prelude.<*> (x Data..?> "assetIds" Core..!@ Prelude.mempty)
+      )
+
+instance Prelude.Hashable ListProjectAssets where
+  hashWithSalt _salt ListProjectAssets' {..} =
+    _salt
+      `Prelude.hashWithSalt` maxResults
+      `Prelude.hashWithSalt` nextToken
+      `Prelude.hashWithSalt` projectId
+
+instance Prelude.NFData ListProjectAssets where
+  rnf ListProjectAssets' {..} =
+    Prelude.rnf maxResults
+      `Prelude.seq` Prelude.rnf nextToken
+      `Prelude.seq` Prelude.rnf projectId
+
+instance Data.ToHeaders ListProjectAssets where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToPath ListProjectAssets where
+  toPath ListProjectAssets' {..} =
+    Prelude.mconcat
+      ["/projects/", Data.toBS projectId, "/assets"]
+
+instance Data.ToQuery ListProjectAssets where
+  toQuery ListProjectAssets' {..} =
+    Prelude.mconcat
+      [ "maxResults" Data.=: maxResults,
+        "nextToken" Data.=: nextToken
+      ]
+
+-- | /See:/ 'newListProjectAssetsResponse' smart constructor.
+data ListProjectAssetsResponse = ListProjectAssetsResponse'
+  { -- | The token for the next set of results, or null if there are no
+    -- additional results.
+    nextToken :: Prelude.Maybe Prelude.Text,
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int,
+    -- | A list that contains the IDs of each asset associated with the project.
+    assetIds :: [Prelude.Text]
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ListProjectAssetsResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'nextToken', 'listProjectAssetsResponse_nextToken' - The token for the next set of results, or null if there are no
+-- additional results.
+--
+-- 'httpStatus', 'listProjectAssetsResponse_httpStatus' - The response's http status code.
+--
+-- 'assetIds', 'listProjectAssetsResponse_assetIds' - A list that contains the IDs of each asset associated with the project.
+newListProjectAssetsResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  ListProjectAssetsResponse
+newListProjectAssetsResponse pHttpStatus_ =
+  ListProjectAssetsResponse'
+    { nextToken =
+        Prelude.Nothing,
+      httpStatus = pHttpStatus_,
+      assetIds = Prelude.mempty
+    }
+
+-- | The token for the next set of results, or null if there are no
+-- additional results.
+listProjectAssetsResponse_nextToken :: Lens.Lens' ListProjectAssetsResponse (Prelude.Maybe Prelude.Text)
+listProjectAssetsResponse_nextToken = Lens.lens (\ListProjectAssetsResponse' {nextToken} -> nextToken) (\s@ListProjectAssetsResponse' {} a -> s {nextToken = a} :: ListProjectAssetsResponse)
+
+-- | The response's http status code.
+listProjectAssetsResponse_httpStatus :: Lens.Lens' ListProjectAssetsResponse Prelude.Int
+listProjectAssetsResponse_httpStatus = Lens.lens (\ListProjectAssetsResponse' {httpStatus} -> httpStatus) (\s@ListProjectAssetsResponse' {} a -> s {httpStatus = a} :: ListProjectAssetsResponse)
+
+-- | A list that contains the IDs of each asset associated with the project.
+listProjectAssetsResponse_assetIds :: Lens.Lens' ListProjectAssetsResponse [Prelude.Text]
+listProjectAssetsResponse_assetIds = Lens.lens (\ListProjectAssetsResponse' {assetIds} -> assetIds) (\s@ListProjectAssetsResponse' {} a -> s {assetIds = a} :: ListProjectAssetsResponse) Prelude.. Lens.coerced
+
+instance Prelude.NFData ListProjectAssetsResponse where
+  rnf ListProjectAssetsResponse' {..} =
+    Prelude.rnf nextToken
+      `Prelude.seq` Prelude.rnf httpStatus
+      `Prelude.seq` Prelude.rnf assetIds
diff --git a/gen/Amazonka/IoTSiteWise/ListProjects.hs b/gen/Amazonka/IoTSiteWise/ListProjects.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/IoTSiteWise/ListProjects.hs
@@ -0,0 +1,233 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.IoTSiteWise.ListProjects
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Retrieves a paginated list of projects for an IoT SiteWise Monitor
+-- portal.
+--
+-- This operation returns paginated results.
+module Amazonka.IoTSiteWise.ListProjects
+  ( -- * Creating a Request
+    ListProjects (..),
+    newListProjects,
+
+    -- * Request Lenses
+    listProjects_maxResults,
+    listProjects_nextToken,
+    listProjects_portalId,
+
+    -- * Destructuring the Response
+    ListProjectsResponse (..),
+    newListProjectsResponse,
+
+    -- * Response Lenses
+    listProjectsResponse_nextToken,
+    listProjectsResponse_httpStatus,
+    listProjectsResponse_projectSummaries,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.IoTSiteWise.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newListProjects' smart constructor.
+data ListProjects = ListProjects'
+  { -- | The maximum number of results to return for each paginated request.
+    --
+    -- Default: 50
+    maxResults :: Prelude.Maybe Prelude.Natural,
+    -- | The token to be used for the next set of paginated results.
+    nextToken :: Prelude.Maybe Prelude.Text,
+    -- | The ID of the portal.
+    portalId :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ListProjects' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'maxResults', 'listProjects_maxResults' - The maximum number of results to return for each paginated request.
+--
+-- Default: 50
+--
+-- 'nextToken', 'listProjects_nextToken' - The token to be used for the next set of paginated results.
+--
+-- 'portalId', 'listProjects_portalId' - The ID of the portal.
+newListProjects ::
+  -- | 'portalId'
+  Prelude.Text ->
+  ListProjects
+newListProjects pPortalId_ =
+  ListProjects'
+    { maxResults = Prelude.Nothing,
+      nextToken = Prelude.Nothing,
+      portalId = pPortalId_
+    }
+
+-- | The maximum number of results to return for each paginated request.
+--
+-- Default: 50
+listProjects_maxResults :: Lens.Lens' ListProjects (Prelude.Maybe Prelude.Natural)
+listProjects_maxResults = Lens.lens (\ListProjects' {maxResults} -> maxResults) (\s@ListProjects' {} a -> s {maxResults = a} :: ListProjects)
+
+-- | The token to be used for the next set of paginated results.
+listProjects_nextToken :: Lens.Lens' ListProjects (Prelude.Maybe Prelude.Text)
+listProjects_nextToken = Lens.lens (\ListProjects' {nextToken} -> nextToken) (\s@ListProjects' {} a -> s {nextToken = a} :: ListProjects)
+
+-- | The ID of the portal.
+listProjects_portalId :: Lens.Lens' ListProjects Prelude.Text
+listProjects_portalId = Lens.lens (\ListProjects' {portalId} -> portalId) (\s@ListProjects' {} a -> s {portalId = a} :: ListProjects)
+
+instance Core.AWSPager ListProjects where
+  page rq rs
+    | Core.stop
+        ( rs
+            Lens.^? listProjectsResponse_nextToken
+            Prelude.. Lens._Just
+        ) =
+        Prelude.Nothing
+    | Core.stop
+        (rs Lens.^. listProjectsResponse_projectSummaries) =
+        Prelude.Nothing
+    | Prelude.otherwise =
+        Prelude.Just
+          Prelude.$ rq
+          Prelude.& listProjects_nextToken
+          Lens..~ rs
+          Lens.^? listProjectsResponse_nextToken
+          Prelude.. Lens._Just
+
+instance Core.AWSRequest ListProjects where
+  type AWSResponse ListProjects = ListProjectsResponse
+  request overrides =
+    Request.get (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          ListProjectsResponse'
+            Prelude.<$> (x Data..?> "nextToken")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+            Prelude.<*> ( x
+                            Data..?> "projectSummaries"
+                            Core..!@ Prelude.mempty
+                        )
+      )
+
+instance Prelude.Hashable ListProjects where
+  hashWithSalt _salt ListProjects' {..} =
+    _salt
+      `Prelude.hashWithSalt` maxResults
+      `Prelude.hashWithSalt` nextToken
+      `Prelude.hashWithSalt` portalId
+
+instance Prelude.NFData ListProjects where
+  rnf ListProjects' {..} =
+    Prelude.rnf maxResults
+      `Prelude.seq` Prelude.rnf nextToken
+      `Prelude.seq` Prelude.rnf portalId
+
+instance Data.ToHeaders ListProjects where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToPath ListProjects where
+  toPath = Prelude.const "/projects"
+
+instance Data.ToQuery ListProjects where
+  toQuery ListProjects' {..} =
+    Prelude.mconcat
+      [ "maxResults" Data.=: maxResults,
+        "nextToken" Data.=: nextToken,
+        "portalId" Data.=: portalId
+      ]
+
+-- | /See:/ 'newListProjectsResponse' smart constructor.
+data ListProjectsResponse = ListProjectsResponse'
+  { -- | The token for the next set of results, or null if there are no
+    -- additional results.
+    nextToken :: Prelude.Maybe Prelude.Text,
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int,
+    -- | A list that summarizes each project in the portal.
+    projectSummaries :: [ProjectSummary]
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ListProjectsResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'nextToken', 'listProjectsResponse_nextToken' - The token for the next set of results, or null if there are no
+-- additional results.
+--
+-- 'httpStatus', 'listProjectsResponse_httpStatus' - The response's http status code.
+--
+-- 'projectSummaries', 'listProjectsResponse_projectSummaries' - A list that summarizes each project in the portal.
+newListProjectsResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  ListProjectsResponse
+newListProjectsResponse pHttpStatus_ =
+  ListProjectsResponse'
+    { nextToken = Prelude.Nothing,
+      httpStatus = pHttpStatus_,
+      projectSummaries = Prelude.mempty
+    }
+
+-- | The token for the next set of results, or null if there are no
+-- additional results.
+listProjectsResponse_nextToken :: Lens.Lens' ListProjectsResponse (Prelude.Maybe Prelude.Text)
+listProjectsResponse_nextToken = Lens.lens (\ListProjectsResponse' {nextToken} -> nextToken) (\s@ListProjectsResponse' {} a -> s {nextToken = a} :: ListProjectsResponse)
+
+-- | The response's http status code.
+listProjectsResponse_httpStatus :: Lens.Lens' ListProjectsResponse Prelude.Int
+listProjectsResponse_httpStatus = Lens.lens (\ListProjectsResponse' {httpStatus} -> httpStatus) (\s@ListProjectsResponse' {} a -> s {httpStatus = a} :: ListProjectsResponse)
+
+-- | A list that summarizes each project in the portal.
+listProjectsResponse_projectSummaries :: Lens.Lens' ListProjectsResponse [ProjectSummary]
+listProjectsResponse_projectSummaries = Lens.lens (\ListProjectsResponse' {projectSummaries} -> projectSummaries) (\s@ListProjectsResponse' {} a -> s {projectSummaries = a} :: ListProjectsResponse) Prelude.. Lens.coerced
+
+instance Prelude.NFData ListProjectsResponse where
+  rnf ListProjectsResponse' {..} =
+    Prelude.rnf nextToken
+      `Prelude.seq` Prelude.rnf httpStatus
+      `Prelude.seq` Prelude.rnf projectSummaries
diff --git a/gen/Amazonka/IoTSiteWise/ListTagsForResource.hs b/gen/Amazonka/IoTSiteWise/ListTagsForResource.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/IoTSiteWise/ListTagsForResource.hs
@@ -0,0 +1,174 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.IoTSiteWise.ListTagsForResource
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Retrieves the list of tags for an IoT SiteWise resource.
+module Amazonka.IoTSiteWise.ListTagsForResource
+  ( -- * Creating a Request
+    ListTagsForResource (..),
+    newListTagsForResource,
+
+    -- * Request Lenses
+    listTagsForResource_resourceArn,
+
+    -- * Destructuring the Response
+    ListTagsForResourceResponse (..),
+    newListTagsForResourceResponse,
+
+    -- * Response Lenses
+    listTagsForResourceResponse_tags,
+    listTagsForResourceResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.IoTSiteWise.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newListTagsForResource' smart constructor.
+data ListTagsForResource = ListTagsForResource'
+  { -- | The
+    -- <https://docs.aws.amazon.com/general/latest/gr/aws-arns-and-namespaces.html ARN>
+    -- of the resource.
+    resourceArn :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ListTagsForResource' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'resourceArn', 'listTagsForResource_resourceArn' - The
+-- <https://docs.aws.amazon.com/general/latest/gr/aws-arns-and-namespaces.html ARN>
+-- of the resource.
+newListTagsForResource ::
+  -- | 'resourceArn'
+  Prelude.Text ->
+  ListTagsForResource
+newListTagsForResource pResourceArn_ =
+  ListTagsForResource' {resourceArn = pResourceArn_}
+
+-- | The
+-- <https://docs.aws.amazon.com/general/latest/gr/aws-arns-and-namespaces.html ARN>
+-- of the resource.
+listTagsForResource_resourceArn :: Lens.Lens' ListTagsForResource Prelude.Text
+listTagsForResource_resourceArn = Lens.lens (\ListTagsForResource' {resourceArn} -> resourceArn) (\s@ListTagsForResource' {} a -> s {resourceArn = a} :: ListTagsForResource)
+
+instance Core.AWSRequest ListTagsForResource where
+  type
+    AWSResponse ListTagsForResource =
+      ListTagsForResourceResponse
+  request overrides =
+    Request.get (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          ListTagsForResourceResponse'
+            Prelude.<$> (x Data..?> "tags" Core..!@ Prelude.mempty)
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable ListTagsForResource where
+  hashWithSalt _salt ListTagsForResource' {..} =
+    _salt `Prelude.hashWithSalt` resourceArn
+
+instance Prelude.NFData ListTagsForResource where
+  rnf ListTagsForResource' {..} =
+    Prelude.rnf resourceArn
+
+instance Data.ToHeaders ListTagsForResource where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToPath ListTagsForResource where
+  toPath = Prelude.const "/tags"
+
+instance Data.ToQuery ListTagsForResource where
+  toQuery ListTagsForResource' {..} =
+    Prelude.mconcat ["resourceArn" Data.=: resourceArn]
+
+-- | /See:/ 'newListTagsForResourceResponse' smart constructor.
+data ListTagsForResourceResponse = ListTagsForResourceResponse'
+  { -- | The list of key-value pairs that contain metadata for the resource. For
+    -- more information, see
+    -- <https://docs.aws.amazon.com/iot-sitewise/latest/userguide/tag-resources.html Tagging your IoT SiteWise resources>
+    -- in the /IoT SiteWise User Guide/.
+    tags :: Prelude.Maybe (Prelude.HashMap Prelude.Text Prelude.Text),
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ListTagsForResourceResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'tags', 'listTagsForResourceResponse_tags' - The list of key-value pairs that contain metadata for the resource. For
+-- more information, see
+-- <https://docs.aws.amazon.com/iot-sitewise/latest/userguide/tag-resources.html Tagging your IoT SiteWise resources>
+-- in the /IoT SiteWise User Guide/.
+--
+-- 'httpStatus', 'listTagsForResourceResponse_httpStatus' - The response's http status code.
+newListTagsForResourceResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  ListTagsForResourceResponse
+newListTagsForResourceResponse pHttpStatus_ =
+  ListTagsForResourceResponse'
+    { tags =
+        Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | The list of key-value pairs that contain metadata for the resource. For
+-- more information, see
+-- <https://docs.aws.amazon.com/iot-sitewise/latest/userguide/tag-resources.html Tagging your IoT SiteWise resources>
+-- in the /IoT SiteWise User Guide/.
+listTagsForResourceResponse_tags :: Lens.Lens' ListTagsForResourceResponse (Prelude.Maybe (Prelude.HashMap Prelude.Text Prelude.Text))
+listTagsForResourceResponse_tags = Lens.lens (\ListTagsForResourceResponse' {tags} -> tags) (\s@ListTagsForResourceResponse' {} a -> s {tags = a} :: ListTagsForResourceResponse) Prelude.. Lens.mapping Lens.coerced
+
+-- | The response's http status code.
+listTagsForResourceResponse_httpStatus :: Lens.Lens' ListTagsForResourceResponse Prelude.Int
+listTagsForResourceResponse_httpStatus = Lens.lens (\ListTagsForResourceResponse' {httpStatus} -> httpStatus) (\s@ListTagsForResourceResponse' {} a -> s {httpStatus = a} :: ListTagsForResourceResponse)
+
+instance Prelude.NFData ListTagsForResourceResponse where
+  rnf ListTagsForResourceResponse' {..} =
+    Prelude.rnf tags
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/IoTSiteWise/ListTimeSeries.hs b/gen/Amazonka/IoTSiteWise/ListTimeSeries.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/IoTSiteWise/ListTimeSeries.hs
@@ -0,0 +1,273 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.IoTSiteWise.ListTimeSeries
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Retrieves a paginated list of time series (data streams).
+--
+-- This operation returns paginated results.
+module Amazonka.IoTSiteWise.ListTimeSeries
+  ( -- * Creating a Request
+    ListTimeSeries (..),
+    newListTimeSeries,
+
+    -- * Request Lenses
+    listTimeSeries_aliasPrefix,
+    listTimeSeries_assetId,
+    listTimeSeries_maxResults,
+    listTimeSeries_nextToken,
+    listTimeSeries_timeSeriesType,
+
+    -- * Destructuring the Response
+    ListTimeSeriesResponse (..),
+    newListTimeSeriesResponse,
+
+    -- * Response Lenses
+    listTimeSeriesResponse_nextToken,
+    listTimeSeriesResponse_httpStatus,
+    listTimeSeriesResponse_timeSeriesSummaries,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.IoTSiteWise.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newListTimeSeries' smart constructor.
+data ListTimeSeries = ListTimeSeries'
+  { -- | The alias prefix of the time series.
+    aliasPrefix :: Prelude.Maybe Prelude.Text,
+    -- | The ID of the asset in which the asset property was created.
+    assetId :: Prelude.Maybe Prelude.Text,
+    -- | The maximum number of results to return for each paginated request.
+    maxResults :: Prelude.Maybe Prelude.Natural,
+    -- | The token to be used for the next set of paginated results.
+    nextToken :: Prelude.Maybe Prelude.Text,
+    -- | The type of the time series. The time series type can be one of the
+    -- following values:
+    --
+    -- -   @ASSOCIATED@ – The time series is associated with an asset property.
+    --
+    -- -   @DISASSOCIATED@ – The time series isn\'t associated with any asset
+    --     property.
+    timeSeriesType :: Prelude.Maybe ListTimeSeriesType
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ListTimeSeries' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'aliasPrefix', 'listTimeSeries_aliasPrefix' - The alias prefix of the time series.
+--
+-- 'assetId', 'listTimeSeries_assetId' - The ID of the asset in which the asset property was created.
+--
+-- 'maxResults', 'listTimeSeries_maxResults' - The maximum number of results to return for each paginated request.
+--
+-- 'nextToken', 'listTimeSeries_nextToken' - The token to be used for the next set of paginated results.
+--
+-- 'timeSeriesType', 'listTimeSeries_timeSeriesType' - The type of the time series. The time series type can be one of the
+-- following values:
+--
+-- -   @ASSOCIATED@ – The time series is associated with an asset property.
+--
+-- -   @DISASSOCIATED@ – The time series isn\'t associated with any asset
+--     property.
+newListTimeSeries ::
+  ListTimeSeries
+newListTimeSeries =
+  ListTimeSeries'
+    { aliasPrefix = Prelude.Nothing,
+      assetId = Prelude.Nothing,
+      maxResults = Prelude.Nothing,
+      nextToken = Prelude.Nothing,
+      timeSeriesType = Prelude.Nothing
+    }
+
+-- | The alias prefix of the time series.
+listTimeSeries_aliasPrefix :: Lens.Lens' ListTimeSeries (Prelude.Maybe Prelude.Text)
+listTimeSeries_aliasPrefix = Lens.lens (\ListTimeSeries' {aliasPrefix} -> aliasPrefix) (\s@ListTimeSeries' {} a -> s {aliasPrefix = a} :: ListTimeSeries)
+
+-- | The ID of the asset in which the asset property was created.
+listTimeSeries_assetId :: Lens.Lens' ListTimeSeries (Prelude.Maybe Prelude.Text)
+listTimeSeries_assetId = Lens.lens (\ListTimeSeries' {assetId} -> assetId) (\s@ListTimeSeries' {} a -> s {assetId = a} :: ListTimeSeries)
+
+-- | The maximum number of results to return for each paginated request.
+listTimeSeries_maxResults :: Lens.Lens' ListTimeSeries (Prelude.Maybe Prelude.Natural)
+listTimeSeries_maxResults = Lens.lens (\ListTimeSeries' {maxResults} -> maxResults) (\s@ListTimeSeries' {} a -> s {maxResults = a} :: ListTimeSeries)
+
+-- | The token to be used for the next set of paginated results.
+listTimeSeries_nextToken :: Lens.Lens' ListTimeSeries (Prelude.Maybe Prelude.Text)
+listTimeSeries_nextToken = Lens.lens (\ListTimeSeries' {nextToken} -> nextToken) (\s@ListTimeSeries' {} a -> s {nextToken = a} :: ListTimeSeries)
+
+-- | The type of the time series. The time series type can be one of the
+-- following values:
+--
+-- -   @ASSOCIATED@ – The time series is associated with an asset property.
+--
+-- -   @DISASSOCIATED@ – The time series isn\'t associated with any asset
+--     property.
+listTimeSeries_timeSeriesType :: Lens.Lens' ListTimeSeries (Prelude.Maybe ListTimeSeriesType)
+listTimeSeries_timeSeriesType = Lens.lens (\ListTimeSeries' {timeSeriesType} -> timeSeriesType) (\s@ListTimeSeries' {} a -> s {timeSeriesType = a} :: ListTimeSeries)
+
+instance Core.AWSPager ListTimeSeries where
+  page rq rs
+    | Core.stop
+        ( rs
+            Lens.^? listTimeSeriesResponse_nextToken
+            Prelude.. Lens._Just
+        ) =
+        Prelude.Nothing
+    | Core.stop
+        ( rs
+            Lens.^. listTimeSeriesResponse_timeSeriesSummaries
+        ) =
+        Prelude.Nothing
+    | Prelude.otherwise =
+        Prelude.Just
+          Prelude.$ rq
+          Prelude.& listTimeSeries_nextToken
+          Lens..~ rs
+          Lens.^? listTimeSeriesResponse_nextToken
+          Prelude.. Lens._Just
+
+instance Core.AWSRequest ListTimeSeries where
+  type
+    AWSResponse ListTimeSeries =
+      ListTimeSeriesResponse
+  request overrides =
+    Request.get (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          ListTimeSeriesResponse'
+            Prelude.<$> (x Data..?> "nextToken")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+            Prelude.<*> ( x
+                            Data..?> "TimeSeriesSummaries"
+                            Core..!@ Prelude.mempty
+                        )
+      )
+
+instance Prelude.Hashable ListTimeSeries where
+  hashWithSalt _salt ListTimeSeries' {..} =
+    _salt
+      `Prelude.hashWithSalt` aliasPrefix
+      `Prelude.hashWithSalt` assetId
+      `Prelude.hashWithSalt` maxResults
+      `Prelude.hashWithSalt` nextToken
+      `Prelude.hashWithSalt` timeSeriesType
+
+instance Prelude.NFData ListTimeSeries where
+  rnf ListTimeSeries' {..} =
+    Prelude.rnf aliasPrefix
+      `Prelude.seq` Prelude.rnf assetId
+      `Prelude.seq` Prelude.rnf maxResults
+      `Prelude.seq` Prelude.rnf nextToken
+      `Prelude.seq` Prelude.rnf timeSeriesType
+
+instance Data.ToHeaders ListTimeSeries where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToPath ListTimeSeries where
+  toPath = Prelude.const "/timeseries/"
+
+instance Data.ToQuery ListTimeSeries where
+  toQuery ListTimeSeries' {..} =
+    Prelude.mconcat
+      [ "aliasPrefix" Data.=: aliasPrefix,
+        "assetId" Data.=: assetId,
+        "maxResults" Data.=: maxResults,
+        "nextToken" Data.=: nextToken,
+        "timeSeriesType" Data.=: timeSeriesType
+      ]
+
+-- | /See:/ 'newListTimeSeriesResponse' smart constructor.
+data ListTimeSeriesResponse = ListTimeSeriesResponse'
+  { -- | The token for the next set of results, or null if there are no
+    -- additional results.
+    nextToken :: Prelude.Maybe Prelude.Text,
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int,
+    -- | One or more time series summaries to list.
+    timeSeriesSummaries :: [TimeSeriesSummary]
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ListTimeSeriesResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'nextToken', 'listTimeSeriesResponse_nextToken' - The token for the next set of results, or null if there are no
+-- additional results.
+--
+-- 'httpStatus', 'listTimeSeriesResponse_httpStatus' - The response's http status code.
+--
+-- 'timeSeriesSummaries', 'listTimeSeriesResponse_timeSeriesSummaries' - One or more time series summaries to list.
+newListTimeSeriesResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  ListTimeSeriesResponse
+newListTimeSeriesResponse pHttpStatus_ =
+  ListTimeSeriesResponse'
+    { nextToken =
+        Prelude.Nothing,
+      httpStatus = pHttpStatus_,
+      timeSeriesSummaries = Prelude.mempty
+    }
+
+-- | The token for the next set of results, or null if there are no
+-- additional results.
+listTimeSeriesResponse_nextToken :: Lens.Lens' ListTimeSeriesResponse (Prelude.Maybe Prelude.Text)
+listTimeSeriesResponse_nextToken = Lens.lens (\ListTimeSeriesResponse' {nextToken} -> nextToken) (\s@ListTimeSeriesResponse' {} a -> s {nextToken = a} :: ListTimeSeriesResponse)
+
+-- | The response's http status code.
+listTimeSeriesResponse_httpStatus :: Lens.Lens' ListTimeSeriesResponse Prelude.Int
+listTimeSeriesResponse_httpStatus = Lens.lens (\ListTimeSeriesResponse' {httpStatus} -> httpStatus) (\s@ListTimeSeriesResponse' {} a -> s {httpStatus = a} :: ListTimeSeriesResponse)
+
+-- | One or more time series summaries to list.
+listTimeSeriesResponse_timeSeriesSummaries :: Lens.Lens' ListTimeSeriesResponse [TimeSeriesSummary]
+listTimeSeriesResponse_timeSeriesSummaries = Lens.lens (\ListTimeSeriesResponse' {timeSeriesSummaries} -> timeSeriesSummaries) (\s@ListTimeSeriesResponse' {} a -> s {timeSeriesSummaries = a} :: ListTimeSeriesResponse) Prelude.. Lens.coerced
+
+instance Prelude.NFData ListTimeSeriesResponse where
+  rnf ListTimeSeriesResponse' {..} =
+    Prelude.rnf nextToken
+      `Prelude.seq` Prelude.rnf httpStatus
+      `Prelude.seq` Prelude.rnf timeSeriesSummaries
diff --git a/gen/Amazonka/IoTSiteWise/PutDefaultEncryptionConfiguration.hs b/gen/Amazonka/IoTSiteWise/PutDefaultEncryptionConfiguration.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/IoTSiteWise/PutDefaultEncryptionConfiguration.hs
@@ -0,0 +1,259 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.IoTSiteWise.PutDefaultEncryptionConfiguration
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Sets the default encryption configuration for the Amazon Web Services
+-- account. For more information, see
+-- <https://docs.aws.amazon.com/iot-sitewise/latest/userguide/key-management.html Key management>
+-- in the /IoT SiteWise User Guide/.
+module Amazonka.IoTSiteWise.PutDefaultEncryptionConfiguration
+  ( -- * Creating a Request
+    PutDefaultEncryptionConfiguration (..),
+    newPutDefaultEncryptionConfiguration,
+
+    -- * Request Lenses
+    putDefaultEncryptionConfiguration_kmsKeyId,
+    putDefaultEncryptionConfiguration_encryptionType,
+
+    -- * Destructuring the Response
+    PutDefaultEncryptionConfigurationResponse (..),
+    newPutDefaultEncryptionConfigurationResponse,
+
+    -- * Response Lenses
+    putDefaultEncryptionConfigurationResponse_kmsKeyArn,
+    putDefaultEncryptionConfigurationResponse_httpStatus,
+    putDefaultEncryptionConfigurationResponse_encryptionType,
+    putDefaultEncryptionConfigurationResponse_configurationStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.IoTSiteWise.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newPutDefaultEncryptionConfiguration' smart constructor.
+data PutDefaultEncryptionConfiguration = PutDefaultEncryptionConfiguration'
+  { -- | The Key ID of the customer managed key used for KMS encryption. This is
+    -- required if you use @KMS_BASED_ENCRYPTION@.
+    kmsKeyId :: Prelude.Maybe Prelude.Text,
+    -- | The type of encryption used for the encryption configuration.
+    encryptionType :: EncryptionType
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'PutDefaultEncryptionConfiguration' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'kmsKeyId', 'putDefaultEncryptionConfiguration_kmsKeyId' - The Key ID of the customer managed key used for KMS encryption. This is
+-- required if you use @KMS_BASED_ENCRYPTION@.
+--
+-- 'encryptionType', 'putDefaultEncryptionConfiguration_encryptionType' - The type of encryption used for the encryption configuration.
+newPutDefaultEncryptionConfiguration ::
+  -- | 'encryptionType'
+  EncryptionType ->
+  PutDefaultEncryptionConfiguration
+newPutDefaultEncryptionConfiguration pEncryptionType_ =
+  PutDefaultEncryptionConfiguration'
+    { kmsKeyId =
+        Prelude.Nothing,
+      encryptionType = pEncryptionType_
+    }
+
+-- | The Key ID of the customer managed key used for KMS encryption. This is
+-- required if you use @KMS_BASED_ENCRYPTION@.
+putDefaultEncryptionConfiguration_kmsKeyId :: Lens.Lens' PutDefaultEncryptionConfiguration (Prelude.Maybe Prelude.Text)
+putDefaultEncryptionConfiguration_kmsKeyId = Lens.lens (\PutDefaultEncryptionConfiguration' {kmsKeyId} -> kmsKeyId) (\s@PutDefaultEncryptionConfiguration' {} a -> s {kmsKeyId = a} :: PutDefaultEncryptionConfiguration)
+
+-- | The type of encryption used for the encryption configuration.
+putDefaultEncryptionConfiguration_encryptionType :: Lens.Lens' PutDefaultEncryptionConfiguration EncryptionType
+putDefaultEncryptionConfiguration_encryptionType = Lens.lens (\PutDefaultEncryptionConfiguration' {encryptionType} -> encryptionType) (\s@PutDefaultEncryptionConfiguration' {} a -> s {encryptionType = a} :: PutDefaultEncryptionConfiguration)
+
+instance
+  Core.AWSRequest
+    PutDefaultEncryptionConfiguration
+  where
+  type
+    AWSResponse PutDefaultEncryptionConfiguration =
+      PutDefaultEncryptionConfigurationResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          PutDefaultEncryptionConfigurationResponse'
+            Prelude.<$> (x Data..?> "kmsKeyArn")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+            Prelude.<*> (x Data..:> "encryptionType")
+            Prelude.<*> (x Data..:> "configurationStatus")
+      )
+
+instance
+  Prelude.Hashable
+    PutDefaultEncryptionConfiguration
+  where
+  hashWithSalt
+    _salt
+    PutDefaultEncryptionConfiguration' {..} =
+      _salt
+        `Prelude.hashWithSalt` kmsKeyId
+        `Prelude.hashWithSalt` encryptionType
+
+instance
+  Prelude.NFData
+    PutDefaultEncryptionConfiguration
+  where
+  rnf PutDefaultEncryptionConfiguration' {..} =
+    Prelude.rnf kmsKeyId
+      `Prelude.seq` Prelude.rnf encryptionType
+
+instance
+  Data.ToHeaders
+    PutDefaultEncryptionConfiguration
+  where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance
+  Data.ToJSON
+    PutDefaultEncryptionConfiguration
+  where
+  toJSON PutDefaultEncryptionConfiguration' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("kmsKeyId" Data..=) Prelude.<$> kmsKeyId,
+            Prelude.Just
+              ("encryptionType" Data..= encryptionType)
+          ]
+      )
+
+instance
+  Data.ToPath
+    PutDefaultEncryptionConfiguration
+  where
+  toPath =
+    Prelude.const "/configuration/account/encryption"
+
+instance
+  Data.ToQuery
+    PutDefaultEncryptionConfiguration
+  where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newPutDefaultEncryptionConfigurationResponse' smart constructor.
+data PutDefaultEncryptionConfigurationResponse = PutDefaultEncryptionConfigurationResponse'
+  { -- | The Key ARN of the KMS key used for KMS encryption if you use
+    -- @KMS_BASED_ENCRYPTION@.
+    kmsKeyArn :: Prelude.Maybe Prelude.Text,
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int,
+    -- | The type of encryption used for the encryption configuration.
+    encryptionType :: EncryptionType,
+    -- | The status of the account configuration. This contains the
+    -- @ConfigurationState@. If there is an error, it also contains the
+    -- @ErrorDetails@.
+    configurationStatus :: ConfigurationStatus
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'PutDefaultEncryptionConfigurationResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'kmsKeyArn', 'putDefaultEncryptionConfigurationResponse_kmsKeyArn' - The Key ARN of the KMS key used for KMS encryption if you use
+-- @KMS_BASED_ENCRYPTION@.
+--
+-- 'httpStatus', 'putDefaultEncryptionConfigurationResponse_httpStatus' - The response's http status code.
+--
+-- 'encryptionType', 'putDefaultEncryptionConfigurationResponse_encryptionType' - The type of encryption used for the encryption configuration.
+--
+-- 'configurationStatus', 'putDefaultEncryptionConfigurationResponse_configurationStatus' - The status of the account configuration. This contains the
+-- @ConfigurationState@. If there is an error, it also contains the
+-- @ErrorDetails@.
+newPutDefaultEncryptionConfigurationResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  -- | 'encryptionType'
+  EncryptionType ->
+  -- | 'configurationStatus'
+  ConfigurationStatus ->
+  PutDefaultEncryptionConfigurationResponse
+newPutDefaultEncryptionConfigurationResponse
+  pHttpStatus_
+  pEncryptionType_
+  pConfigurationStatus_ =
+    PutDefaultEncryptionConfigurationResponse'
+      { kmsKeyArn =
+          Prelude.Nothing,
+        httpStatus = pHttpStatus_,
+        encryptionType =
+          pEncryptionType_,
+        configurationStatus =
+          pConfigurationStatus_
+      }
+
+-- | The Key ARN of the KMS key used for KMS encryption if you use
+-- @KMS_BASED_ENCRYPTION@.
+putDefaultEncryptionConfigurationResponse_kmsKeyArn :: Lens.Lens' PutDefaultEncryptionConfigurationResponse (Prelude.Maybe Prelude.Text)
+putDefaultEncryptionConfigurationResponse_kmsKeyArn = Lens.lens (\PutDefaultEncryptionConfigurationResponse' {kmsKeyArn} -> kmsKeyArn) (\s@PutDefaultEncryptionConfigurationResponse' {} a -> s {kmsKeyArn = a} :: PutDefaultEncryptionConfigurationResponse)
+
+-- | The response's http status code.
+putDefaultEncryptionConfigurationResponse_httpStatus :: Lens.Lens' PutDefaultEncryptionConfigurationResponse Prelude.Int
+putDefaultEncryptionConfigurationResponse_httpStatus = Lens.lens (\PutDefaultEncryptionConfigurationResponse' {httpStatus} -> httpStatus) (\s@PutDefaultEncryptionConfigurationResponse' {} a -> s {httpStatus = a} :: PutDefaultEncryptionConfigurationResponse)
+
+-- | The type of encryption used for the encryption configuration.
+putDefaultEncryptionConfigurationResponse_encryptionType :: Lens.Lens' PutDefaultEncryptionConfigurationResponse EncryptionType
+putDefaultEncryptionConfigurationResponse_encryptionType = Lens.lens (\PutDefaultEncryptionConfigurationResponse' {encryptionType} -> encryptionType) (\s@PutDefaultEncryptionConfigurationResponse' {} a -> s {encryptionType = a} :: PutDefaultEncryptionConfigurationResponse)
+
+-- | The status of the account configuration. This contains the
+-- @ConfigurationState@. If there is an error, it also contains the
+-- @ErrorDetails@.
+putDefaultEncryptionConfigurationResponse_configurationStatus :: Lens.Lens' PutDefaultEncryptionConfigurationResponse ConfigurationStatus
+putDefaultEncryptionConfigurationResponse_configurationStatus = Lens.lens (\PutDefaultEncryptionConfigurationResponse' {configurationStatus} -> configurationStatus) (\s@PutDefaultEncryptionConfigurationResponse' {} a -> s {configurationStatus = a} :: PutDefaultEncryptionConfigurationResponse)
+
+instance
+  Prelude.NFData
+    PutDefaultEncryptionConfigurationResponse
+  where
+  rnf PutDefaultEncryptionConfigurationResponse' {..} =
+    Prelude.rnf kmsKeyArn
+      `Prelude.seq` Prelude.rnf httpStatus
+      `Prelude.seq` Prelude.rnf encryptionType
+      `Prelude.seq` Prelude.rnf configurationStatus
diff --git a/gen/Amazonka/IoTSiteWise/PutLoggingOptions.hs b/gen/Amazonka/IoTSiteWise/PutLoggingOptions.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/IoTSiteWise/PutLoggingOptions.hs
@@ -0,0 +1,158 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.IoTSiteWise.PutLoggingOptions
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Sets logging options for IoT SiteWise.
+module Amazonka.IoTSiteWise.PutLoggingOptions
+  ( -- * Creating a Request
+    PutLoggingOptions (..),
+    newPutLoggingOptions,
+
+    -- * Request Lenses
+    putLoggingOptions_loggingOptions,
+
+    -- * Destructuring the Response
+    PutLoggingOptionsResponse (..),
+    newPutLoggingOptionsResponse,
+
+    -- * Response Lenses
+    putLoggingOptionsResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.IoTSiteWise.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newPutLoggingOptions' smart constructor.
+data PutLoggingOptions = PutLoggingOptions'
+  { -- | The logging options to set.
+    loggingOptions :: LoggingOptions
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'PutLoggingOptions' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'loggingOptions', 'putLoggingOptions_loggingOptions' - The logging options to set.
+newPutLoggingOptions ::
+  -- | 'loggingOptions'
+  LoggingOptions ->
+  PutLoggingOptions
+newPutLoggingOptions pLoggingOptions_ =
+  PutLoggingOptions'
+    { loggingOptions =
+        pLoggingOptions_
+    }
+
+-- | The logging options to set.
+putLoggingOptions_loggingOptions :: Lens.Lens' PutLoggingOptions LoggingOptions
+putLoggingOptions_loggingOptions = Lens.lens (\PutLoggingOptions' {loggingOptions} -> loggingOptions) (\s@PutLoggingOptions' {} a -> s {loggingOptions = a} :: PutLoggingOptions)
+
+instance Core.AWSRequest PutLoggingOptions where
+  type
+    AWSResponse PutLoggingOptions =
+      PutLoggingOptionsResponse
+  request overrides =
+    Request.putJSON (overrides defaultService)
+  response =
+    Response.receiveEmpty
+      ( \s h x ->
+          PutLoggingOptionsResponse'
+            Prelude.<$> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable PutLoggingOptions where
+  hashWithSalt _salt PutLoggingOptions' {..} =
+    _salt `Prelude.hashWithSalt` loggingOptions
+
+instance Prelude.NFData PutLoggingOptions where
+  rnf PutLoggingOptions' {..} =
+    Prelude.rnf loggingOptions
+
+instance Data.ToHeaders PutLoggingOptions where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON PutLoggingOptions where
+  toJSON PutLoggingOptions' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ Prelude.Just
+              ("loggingOptions" Data..= loggingOptions)
+          ]
+      )
+
+instance Data.ToPath PutLoggingOptions where
+  toPath = Prelude.const "/logging"
+
+instance Data.ToQuery PutLoggingOptions where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newPutLoggingOptionsResponse' smart constructor.
+data PutLoggingOptionsResponse = PutLoggingOptionsResponse'
+  { -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'PutLoggingOptionsResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'httpStatus', 'putLoggingOptionsResponse_httpStatus' - The response's http status code.
+newPutLoggingOptionsResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  PutLoggingOptionsResponse
+newPutLoggingOptionsResponse pHttpStatus_ =
+  PutLoggingOptionsResponse'
+    { httpStatus =
+        pHttpStatus_
+    }
+
+-- | The response's http status code.
+putLoggingOptionsResponse_httpStatus :: Lens.Lens' PutLoggingOptionsResponse Prelude.Int
+putLoggingOptionsResponse_httpStatus = Lens.lens (\PutLoggingOptionsResponse' {httpStatus} -> httpStatus) (\s@PutLoggingOptionsResponse' {} a -> s {httpStatus = a} :: PutLoggingOptionsResponse)
+
+instance Prelude.NFData PutLoggingOptionsResponse where
+  rnf PutLoggingOptionsResponse' {..} =
+    Prelude.rnf httpStatus
diff --git a/gen/Amazonka/IoTSiteWise/PutStorageConfiguration.hs b/gen/Amazonka/IoTSiteWise/PutStorageConfiguration.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/IoTSiteWise/PutStorageConfiguration.hs
@@ -0,0 +1,410 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.IoTSiteWise.PutStorageConfiguration
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Configures storage settings for IoT SiteWise.
+module Amazonka.IoTSiteWise.PutStorageConfiguration
+  ( -- * Creating a Request
+    PutStorageConfiguration (..),
+    newPutStorageConfiguration,
+
+    -- * Request Lenses
+    putStorageConfiguration_disassociatedDataStorage,
+    putStorageConfiguration_multiLayerStorage,
+    putStorageConfiguration_retentionPeriod,
+    putStorageConfiguration_storageType,
+
+    -- * Destructuring the Response
+    PutStorageConfigurationResponse (..),
+    newPutStorageConfigurationResponse,
+
+    -- * Response Lenses
+    putStorageConfigurationResponse_disassociatedDataStorage,
+    putStorageConfigurationResponse_multiLayerStorage,
+    putStorageConfigurationResponse_retentionPeriod,
+    putStorageConfigurationResponse_httpStatus,
+    putStorageConfigurationResponse_storageType,
+    putStorageConfigurationResponse_configurationStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.IoTSiteWise.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newPutStorageConfiguration' smart constructor.
+data PutStorageConfiguration = PutStorageConfiguration'
+  { -- | Contains the storage configuration for time series (data streams) that
+    -- aren\'t associated with asset properties. The @disassociatedDataStorage@
+    -- can be one of the following values:
+    --
+    -- -   @ENABLED@ – IoT SiteWise accepts time series that aren\'t associated
+    --     with asset properties.
+    --
+    --     After the @disassociatedDataStorage@ is enabled, you can\'t disable
+    --     it.
+    --
+    -- -   @DISABLED@ – IoT SiteWise doesn\'t accept time series (data streams)
+    --     that aren\'t associated with asset properties.
+    --
+    -- For more information, see
+    -- <https://docs.aws.amazon.com/iot-sitewise/latest/userguide/data-streams.html Data streams>
+    -- in the /IoT SiteWise User Guide/.
+    disassociatedDataStorage :: Prelude.Maybe DisassociatedDataStorageState,
+    -- | Identifies a storage destination. If you specified @MULTI_LAYER_STORAGE@
+    -- for the storage type, you must specify a @MultiLayerStorage@ object.
+    multiLayerStorage :: Prelude.Maybe MultiLayerStorage,
+    retentionPeriod :: Prelude.Maybe RetentionPeriod,
+    -- | The storage tier that you specified for your data. The @storageType@
+    -- parameter can be one of the following values:
+    --
+    -- -   @SITEWISE_DEFAULT_STORAGE@ – IoT SiteWise saves your data into the
+    --     hot tier. The hot tier is a service-managed database.
+    --
+    -- -   @MULTI_LAYER_STORAGE@ – IoT SiteWise saves your data in both the
+    --     cold tier and the hot tier. The cold tier is a customer-managed
+    --     Amazon S3 bucket.
+    storageType :: StorageType
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'PutStorageConfiguration' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'disassociatedDataStorage', 'putStorageConfiguration_disassociatedDataStorage' - Contains the storage configuration for time series (data streams) that
+-- aren\'t associated with asset properties. The @disassociatedDataStorage@
+-- can be one of the following values:
+--
+-- -   @ENABLED@ – IoT SiteWise accepts time series that aren\'t associated
+--     with asset properties.
+--
+--     After the @disassociatedDataStorage@ is enabled, you can\'t disable
+--     it.
+--
+-- -   @DISABLED@ – IoT SiteWise doesn\'t accept time series (data streams)
+--     that aren\'t associated with asset properties.
+--
+-- For more information, see
+-- <https://docs.aws.amazon.com/iot-sitewise/latest/userguide/data-streams.html Data streams>
+-- in the /IoT SiteWise User Guide/.
+--
+-- 'multiLayerStorage', 'putStorageConfiguration_multiLayerStorage' - Identifies a storage destination. If you specified @MULTI_LAYER_STORAGE@
+-- for the storage type, you must specify a @MultiLayerStorage@ object.
+--
+-- 'retentionPeriod', 'putStorageConfiguration_retentionPeriod' - Undocumented member.
+--
+-- 'storageType', 'putStorageConfiguration_storageType' - The storage tier that you specified for your data. The @storageType@
+-- parameter can be one of the following values:
+--
+-- -   @SITEWISE_DEFAULT_STORAGE@ – IoT SiteWise saves your data into the
+--     hot tier. The hot tier is a service-managed database.
+--
+-- -   @MULTI_LAYER_STORAGE@ – IoT SiteWise saves your data in both the
+--     cold tier and the hot tier. The cold tier is a customer-managed
+--     Amazon S3 bucket.
+newPutStorageConfiguration ::
+  -- | 'storageType'
+  StorageType ->
+  PutStorageConfiguration
+newPutStorageConfiguration pStorageType_ =
+  PutStorageConfiguration'
+    { disassociatedDataStorage =
+        Prelude.Nothing,
+      multiLayerStorage = Prelude.Nothing,
+      retentionPeriod = Prelude.Nothing,
+      storageType = pStorageType_
+    }
+
+-- | Contains the storage configuration for time series (data streams) that
+-- aren\'t associated with asset properties. The @disassociatedDataStorage@
+-- can be one of the following values:
+--
+-- -   @ENABLED@ – IoT SiteWise accepts time series that aren\'t associated
+--     with asset properties.
+--
+--     After the @disassociatedDataStorage@ is enabled, you can\'t disable
+--     it.
+--
+-- -   @DISABLED@ – IoT SiteWise doesn\'t accept time series (data streams)
+--     that aren\'t associated with asset properties.
+--
+-- For more information, see
+-- <https://docs.aws.amazon.com/iot-sitewise/latest/userguide/data-streams.html Data streams>
+-- in the /IoT SiteWise User Guide/.
+putStorageConfiguration_disassociatedDataStorage :: Lens.Lens' PutStorageConfiguration (Prelude.Maybe DisassociatedDataStorageState)
+putStorageConfiguration_disassociatedDataStorage = Lens.lens (\PutStorageConfiguration' {disassociatedDataStorage} -> disassociatedDataStorage) (\s@PutStorageConfiguration' {} a -> s {disassociatedDataStorage = a} :: PutStorageConfiguration)
+
+-- | Identifies a storage destination. If you specified @MULTI_LAYER_STORAGE@
+-- for the storage type, you must specify a @MultiLayerStorage@ object.
+putStorageConfiguration_multiLayerStorage :: Lens.Lens' PutStorageConfiguration (Prelude.Maybe MultiLayerStorage)
+putStorageConfiguration_multiLayerStorage = Lens.lens (\PutStorageConfiguration' {multiLayerStorage} -> multiLayerStorage) (\s@PutStorageConfiguration' {} a -> s {multiLayerStorage = a} :: PutStorageConfiguration)
+
+-- | Undocumented member.
+putStorageConfiguration_retentionPeriod :: Lens.Lens' PutStorageConfiguration (Prelude.Maybe RetentionPeriod)
+putStorageConfiguration_retentionPeriod = Lens.lens (\PutStorageConfiguration' {retentionPeriod} -> retentionPeriod) (\s@PutStorageConfiguration' {} a -> s {retentionPeriod = a} :: PutStorageConfiguration)
+
+-- | The storage tier that you specified for your data. The @storageType@
+-- parameter can be one of the following values:
+--
+-- -   @SITEWISE_DEFAULT_STORAGE@ – IoT SiteWise saves your data into the
+--     hot tier. The hot tier is a service-managed database.
+--
+-- -   @MULTI_LAYER_STORAGE@ – IoT SiteWise saves your data in both the
+--     cold tier and the hot tier. The cold tier is a customer-managed
+--     Amazon S3 bucket.
+putStorageConfiguration_storageType :: Lens.Lens' PutStorageConfiguration StorageType
+putStorageConfiguration_storageType = Lens.lens (\PutStorageConfiguration' {storageType} -> storageType) (\s@PutStorageConfiguration' {} a -> s {storageType = a} :: PutStorageConfiguration)
+
+instance Core.AWSRequest PutStorageConfiguration where
+  type
+    AWSResponse PutStorageConfiguration =
+      PutStorageConfigurationResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          PutStorageConfigurationResponse'
+            Prelude.<$> (x Data..?> "disassociatedDataStorage")
+            Prelude.<*> (x Data..?> "multiLayerStorage")
+            Prelude.<*> (x Data..?> "retentionPeriod")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+            Prelude.<*> (x Data..:> "storageType")
+            Prelude.<*> (x Data..:> "configurationStatus")
+      )
+
+instance Prelude.Hashable PutStorageConfiguration where
+  hashWithSalt _salt PutStorageConfiguration' {..} =
+    _salt
+      `Prelude.hashWithSalt` disassociatedDataStorage
+      `Prelude.hashWithSalt` multiLayerStorage
+      `Prelude.hashWithSalt` retentionPeriod
+      `Prelude.hashWithSalt` storageType
+
+instance Prelude.NFData PutStorageConfiguration where
+  rnf PutStorageConfiguration' {..} =
+    Prelude.rnf disassociatedDataStorage
+      `Prelude.seq` Prelude.rnf multiLayerStorage
+      `Prelude.seq` Prelude.rnf retentionPeriod
+      `Prelude.seq` Prelude.rnf storageType
+
+instance Data.ToHeaders PutStorageConfiguration where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON PutStorageConfiguration where
+  toJSON PutStorageConfiguration' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("disassociatedDataStorage" Data..=)
+              Prelude.<$> disassociatedDataStorage,
+            ("multiLayerStorage" Data..=)
+              Prelude.<$> multiLayerStorage,
+            ("retentionPeriod" Data..=)
+              Prelude.<$> retentionPeriod,
+            Prelude.Just ("storageType" Data..= storageType)
+          ]
+      )
+
+instance Data.ToPath PutStorageConfiguration where
+  toPath =
+    Prelude.const "/configuration/account/storage"
+
+instance Data.ToQuery PutStorageConfiguration where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newPutStorageConfigurationResponse' smart constructor.
+data PutStorageConfigurationResponse = PutStorageConfigurationResponse'
+  { -- | Contains the storage configuration for time series (data streams) that
+    -- aren\'t associated with asset properties. The @disassociatedDataStorage@
+    -- can be one of the following values:
+    --
+    -- -   @ENABLED@ – IoT SiteWise accepts time series that aren\'t associated
+    --     with asset properties.
+    --
+    --     After the @disassociatedDataStorage@ is enabled, you can\'t disable
+    --     it.
+    --
+    -- -   @DISABLED@ – IoT SiteWise doesn\'t accept time series (data streams)
+    --     that aren\'t associated with asset properties.
+    --
+    -- For more information, see
+    -- <https://docs.aws.amazon.com/iot-sitewise/latest/userguide/data-streams.html Data streams>
+    -- in the /IoT SiteWise User Guide/.
+    disassociatedDataStorage :: Prelude.Maybe DisassociatedDataStorageState,
+    -- | Contains information about the storage destination.
+    multiLayerStorage :: Prelude.Maybe MultiLayerStorage,
+    retentionPeriod :: Prelude.Maybe RetentionPeriod,
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int,
+    -- | The storage tier that you specified for your data. The @storageType@
+    -- parameter can be one of the following values:
+    --
+    -- -   @SITEWISE_DEFAULT_STORAGE@ – IoT SiteWise saves your data into the
+    --     hot tier. The hot tier is a service-managed database.
+    --
+    -- -   @MULTI_LAYER_STORAGE@ – IoT SiteWise saves your data in both the
+    --     cold tier and the hot tier. The cold tier is a customer-managed
+    --     Amazon S3 bucket.
+    storageType :: StorageType,
+    configurationStatus :: ConfigurationStatus
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'PutStorageConfigurationResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'disassociatedDataStorage', 'putStorageConfigurationResponse_disassociatedDataStorage' - Contains the storage configuration for time series (data streams) that
+-- aren\'t associated with asset properties. The @disassociatedDataStorage@
+-- can be one of the following values:
+--
+-- -   @ENABLED@ – IoT SiteWise accepts time series that aren\'t associated
+--     with asset properties.
+--
+--     After the @disassociatedDataStorage@ is enabled, you can\'t disable
+--     it.
+--
+-- -   @DISABLED@ – IoT SiteWise doesn\'t accept time series (data streams)
+--     that aren\'t associated with asset properties.
+--
+-- For more information, see
+-- <https://docs.aws.amazon.com/iot-sitewise/latest/userguide/data-streams.html Data streams>
+-- in the /IoT SiteWise User Guide/.
+--
+-- 'multiLayerStorage', 'putStorageConfigurationResponse_multiLayerStorage' - Contains information about the storage destination.
+--
+-- 'retentionPeriod', 'putStorageConfigurationResponse_retentionPeriod' - Undocumented member.
+--
+-- 'httpStatus', 'putStorageConfigurationResponse_httpStatus' - The response's http status code.
+--
+-- 'storageType', 'putStorageConfigurationResponse_storageType' - The storage tier that you specified for your data. The @storageType@
+-- parameter can be one of the following values:
+--
+-- -   @SITEWISE_DEFAULT_STORAGE@ – IoT SiteWise saves your data into the
+--     hot tier. The hot tier is a service-managed database.
+--
+-- -   @MULTI_LAYER_STORAGE@ – IoT SiteWise saves your data in both the
+--     cold tier and the hot tier. The cold tier is a customer-managed
+--     Amazon S3 bucket.
+--
+-- 'configurationStatus', 'putStorageConfigurationResponse_configurationStatus' - Undocumented member.
+newPutStorageConfigurationResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  -- | 'storageType'
+  StorageType ->
+  -- | 'configurationStatus'
+  ConfigurationStatus ->
+  PutStorageConfigurationResponse
+newPutStorageConfigurationResponse
+  pHttpStatus_
+  pStorageType_
+  pConfigurationStatus_ =
+    PutStorageConfigurationResponse'
+      { disassociatedDataStorage =
+          Prelude.Nothing,
+        multiLayerStorage = Prelude.Nothing,
+        retentionPeriod = Prelude.Nothing,
+        httpStatus = pHttpStatus_,
+        storageType = pStorageType_,
+        configurationStatus =
+          pConfigurationStatus_
+      }
+
+-- | Contains the storage configuration for time series (data streams) that
+-- aren\'t associated with asset properties. The @disassociatedDataStorage@
+-- can be one of the following values:
+--
+-- -   @ENABLED@ – IoT SiteWise accepts time series that aren\'t associated
+--     with asset properties.
+--
+--     After the @disassociatedDataStorage@ is enabled, you can\'t disable
+--     it.
+--
+-- -   @DISABLED@ – IoT SiteWise doesn\'t accept time series (data streams)
+--     that aren\'t associated with asset properties.
+--
+-- For more information, see
+-- <https://docs.aws.amazon.com/iot-sitewise/latest/userguide/data-streams.html Data streams>
+-- in the /IoT SiteWise User Guide/.
+putStorageConfigurationResponse_disassociatedDataStorage :: Lens.Lens' PutStorageConfigurationResponse (Prelude.Maybe DisassociatedDataStorageState)
+putStorageConfigurationResponse_disassociatedDataStorage = Lens.lens (\PutStorageConfigurationResponse' {disassociatedDataStorage} -> disassociatedDataStorage) (\s@PutStorageConfigurationResponse' {} a -> s {disassociatedDataStorage = a} :: PutStorageConfigurationResponse)
+
+-- | Contains information about the storage destination.
+putStorageConfigurationResponse_multiLayerStorage :: Lens.Lens' PutStorageConfigurationResponse (Prelude.Maybe MultiLayerStorage)
+putStorageConfigurationResponse_multiLayerStorage = Lens.lens (\PutStorageConfigurationResponse' {multiLayerStorage} -> multiLayerStorage) (\s@PutStorageConfigurationResponse' {} a -> s {multiLayerStorage = a} :: PutStorageConfigurationResponse)
+
+-- | Undocumented member.
+putStorageConfigurationResponse_retentionPeriod :: Lens.Lens' PutStorageConfigurationResponse (Prelude.Maybe RetentionPeriod)
+putStorageConfigurationResponse_retentionPeriod = Lens.lens (\PutStorageConfigurationResponse' {retentionPeriod} -> retentionPeriod) (\s@PutStorageConfigurationResponse' {} a -> s {retentionPeriod = a} :: PutStorageConfigurationResponse)
+
+-- | The response's http status code.
+putStorageConfigurationResponse_httpStatus :: Lens.Lens' PutStorageConfigurationResponse Prelude.Int
+putStorageConfigurationResponse_httpStatus = Lens.lens (\PutStorageConfigurationResponse' {httpStatus} -> httpStatus) (\s@PutStorageConfigurationResponse' {} a -> s {httpStatus = a} :: PutStorageConfigurationResponse)
+
+-- | The storage tier that you specified for your data. The @storageType@
+-- parameter can be one of the following values:
+--
+-- -   @SITEWISE_DEFAULT_STORAGE@ – IoT SiteWise saves your data into the
+--     hot tier. The hot tier is a service-managed database.
+--
+-- -   @MULTI_LAYER_STORAGE@ – IoT SiteWise saves your data in both the
+--     cold tier and the hot tier. The cold tier is a customer-managed
+--     Amazon S3 bucket.
+putStorageConfigurationResponse_storageType :: Lens.Lens' PutStorageConfigurationResponse StorageType
+putStorageConfigurationResponse_storageType = Lens.lens (\PutStorageConfigurationResponse' {storageType} -> storageType) (\s@PutStorageConfigurationResponse' {} a -> s {storageType = a} :: PutStorageConfigurationResponse)
+
+-- | Undocumented member.
+putStorageConfigurationResponse_configurationStatus :: Lens.Lens' PutStorageConfigurationResponse ConfigurationStatus
+putStorageConfigurationResponse_configurationStatus = Lens.lens (\PutStorageConfigurationResponse' {configurationStatus} -> configurationStatus) (\s@PutStorageConfigurationResponse' {} a -> s {configurationStatus = a} :: PutStorageConfigurationResponse)
+
+instance
+  Prelude.NFData
+    PutStorageConfigurationResponse
+  where
+  rnf PutStorageConfigurationResponse' {..} =
+    Prelude.rnf disassociatedDataStorage
+      `Prelude.seq` Prelude.rnf multiLayerStorage
+      `Prelude.seq` Prelude.rnf retentionPeriod
+      `Prelude.seq` Prelude.rnf httpStatus
+      `Prelude.seq` Prelude.rnf storageType
+      `Prelude.seq` Prelude.rnf configurationStatus
diff --git a/gen/Amazonka/IoTSiteWise/TagResource.hs b/gen/Amazonka/IoTSiteWise/TagResource.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/IoTSiteWise/TagResource.hs
@@ -0,0 +1,179 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.IoTSiteWise.TagResource
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Adds tags to an IoT SiteWise resource. If a tag already exists for the
+-- resource, this operation updates the tag\'s value.
+module Amazonka.IoTSiteWise.TagResource
+  ( -- * Creating a Request
+    TagResource (..),
+    newTagResource,
+
+    -- * Request Lenses
+    tagResource_resourceArn,
+    tagResource_tags,
+
+    -- * Destructuring the Response
+    TagResourceResponse (..),
+    newTagResourceResponse,
+
+    -- * Response Lenses
+    tagResourceResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.IoTSiteWise.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newTagResource' smart constructor.
+data TagResource = TagResource'
+  { -- | The
+    -- <https://docs.aws.amazon.com/general/latest/gr/aws-arns-and-namespaces.html ARN>
+    -- of the resource to tag.
+    resourceArn :: Prelude.Text,
+    -- | A list of key-value pairs that contain metadata for the resource. For
+    -- more information, see
+    -- <https://docs.aws.amazon.com/iot-sitewise/latest/userguide/tag-resources.html Tagging your IoT SiteWise resources>
+    -- in the /IoT SiteWise User Guide/.
+    tags :: Prelude.HashMap Prelude.Text Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'TagResource' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'resourceArn', 'tagResource_resourceArn' - The
+-- <https://docs.aws.amazon.com/general/latest/gr/aws-arns-and-namespaces.html ARN>
+-- of the resource to tag.
+--
+-- 'tags', 'tagResource_tags' - A list of key-value pairs that contain metadata for the resource. For
+-- more information, see
+-- <https://docs.aws.amazon.com/iot-sitewise/latest/userguide/tag-resources.html Tagging your IoT SiteWise resources>
+-- in the /IoT SiteWise User Guide/.
+newTagResource ::
+  -- | 'resourceArn'
+  Prelude.Text ->
+  TagResource
+newTagResource pResourceArn_ =
+  TagResource'
+    { resourceArn = pResourceArn_,
+      tags = Prelude.mempty
+    }
+
+-- | The
+-- <https://docs.aws.amazon.com/general/latest/gr/aws-arns-and-namespaces.html ARN>
+-- of the resource to tag.
+tagResource_resourceArn :: Lens.Lens' TagResource Prelude.Text
+tagResource_resourceArn = Lens.lens (\TagResource' {resourceArn} -> resourceArn) (\s@TagResource' {} a -> s {resourceArn = a} :: TagResource)
+
+-- | A list of key-value pairs that contain metadata for the resource. For
+-- more information, see
+-- <https://docs.aws.amazon.com/iot-sitewise/latest/userguide/tag-resources.html Tagging your IoT SiteWise resources>
+-- in the /IoT SiteWise User Guide/.
+tagResource_tags :: Lens.Lens' TagResource (Prelude.HashMap Prelude.Text Prelude.Text)
+tagResource_tags = Lens.lens (\TagResource' {tags} -> tags) (\s@TagResource' {} a -> s {tags = a} :: TagResource) Prelude.. Lens.coerced
+
+instance Core.AWSRequest TagResource where
+  type AWSResponse TagResource = TagResourceResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveEmpty
+      ( \s h x ->
+          TagResourceResponse'
+            Prelude.<$> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable TagResource where
+  hashWithSalt _salt TagResource' {..} =
+    _salt
+      `Prelude.hashWithSalt` resourceArn
+      `Prelude.hashWithSalt` tags
+
+instance Prelude.NFData TagResource where
+  rnf TagResource' {..} =
+    Prelude.rnf resourceArn
+      `Prelude.seq` Prelude.rnf tags
+
+instance Data.ToHeaders TagResource where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON TagResource where
+  toJSON TagResource' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [Prelude.Just ("tags" Data..= tags)]
+      )
+
+instance Data.ToPath TagResource where
+  toPath = Prelude.const "/tags"
+
+instance Data.ToQuery TagResource where
+  toQuery TagResource' {..} =
+    Prelude.mconcat ["resourceArn" Data.=: resourceArn]
+
+-- | /See:/ 'newTagResourceResponse' smart constructor.
+data TagResourceResponse = TagResourceResponse'
+  { -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'TagResourceResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'httpStatus', 'tagResourceResponse_httpStatus' - The response's http status code.
+newTagResourceResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  TagResourceResponse
+newTagResourceResponse pHttpStatus_ =
+  TagResourceResponse' {httpStatus = pHttpStatus_}
+
+-- | The response's http status code.
+tagResourceResponse_httpStatus :: Lens.Lens' TagResourceResponse Prelude.Int
+tagResourceResponse_httpStatus = Lens.lens (\TagResourceResponse' {httpStatus} -> httpStatus) (\s@TagResourceResponse' {} a -> s {httpStatus = a} :: TagResourceResponse)
+
+instance Prelude.NFData TagResourceResponse where
+  rnf TagResourceResponse' {..} = Prelude.rnf httpStatus
diff --git a/gen/Amazonka/IoTSiteWise/Types.hs b/gen/Amazonka/IoTSiteWise/Types.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/IoTSiteWise/Types.hs
@@ -0,0 +1,1153 @@
+{-# LANGUAGE DisambiguateRecordFields #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.IoTSiteWise.Types
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.IoTSiteWise.Types
+  ( -- * Service Configuration
+    defaultService,
+
+    -- * Errors
+    _ConflictingOperationException,
+    _InternalFailureException,
+    _InvalidRequestException,
+    _LimitExceededException,
+    _ResourceAlreadyExistsException,
+    _ResourceNotFoundException,
+    _ServiceUnavailableException,
+    _ThrottlingException,
+    _TooManyTagsException,
+    _UnauthorizedException,
+
+    -- * AggregateType
+    AggregateType (..),
+
+    -- * AssetErrorCode
+    AssetErrorCode (..),
+
+    -- * AssetModelState
+    AssetModelState (..),
+
+    -- * AssetRelationshipType
+    AssetRelationshipType (..),
+
+    -- * AssetState
+    AssetState (..),
+
+    -- * AuthMode
+    AuthMode (..),
+
+    -- * BatchEntryCompletionStatus
+    BatchEntryCompletionStatus (..),
+
+    -- * BatchGetAssetPropertyAggregatesErrorCode
+    BatchGetAssetPropertyAggregatesErrorCode (..),
+
+    -- * BatchGetAssetPropertyValueErrorCode
+    BatchGetAssetPropertyValueErrorCode (..),
+
+    -- * BatchGetAssetPropertyValueHistoryErrorCode
+    BatchGetAssetPropertyValueHistoryErrorCode (..),
+
+    -- * BatchPutAssetPropertyValueErrorCode
+    BatchPutAssetPropertyValueErrorCode (..),
+
+    -- * CapabilitySyncStatus
+    CapabilitySyncStatus (..),
+
+    -- * ColumnName
+    ColumnName (..),
+
+    -- * ComputeLocation
+    ComputeLocation (..),
+
+    -- * ConfigurationState
+    ConfigurationState (..),
+
+    -- * DetailedErrorCode
+    DetailedErrorCode (..),
+
+    -- * DisassociatedDataStorageState
+    DisassociatedDataStorageState (..),
+
+    -- * EncryptionType
+    EncryptionType (..),
+
+    -- * ErrorCode
+    ErrorCode (..),
+
+    -- * ForwardingConfigState
+    ForwardingConfigState (..),
+
+    -- * IdentityType
+    IdentityType (..),
+
+    -- * ImageFileType
+    ImageFileType (..),
+
+    -- * JobStatus
+    JobStatus (..),
+
+    -- * ListAssetModelPropertiesFilter
+    ListAssetModelPropertiesFilter (..),
+
+    -- * ListAssetPropertiesFilter
+    ListAssetPropertiesFilter (..),
+
+    -- * ListAssetsFilter
+    ListAssetsFilter (..),
+
+    -- * ListBulkImportJobsFilter
+    ListBulkImportJobsFilter (..),
+
+    -- * ListTimeSeriesType
+    ListTimeSeriesType (..),
+
+    -- * LoggingLevel
+    LoggingLevel (..),
+
+    -- * MonitorErrorCode
+    MonitorErrorCode (..),
+
+    -- * Permission
+    Permission (..),
+
+    -- * PortalState
+    PortalState (..),
+
+    -- * PropertyDataType
+    PropertyDataType (..),
+
+    -- * PropertyNotificationState
+    PropertyNotificationState (..),
+
+    -- * Quality
+    Quality (..),
+
+    -- * ResourceType
+    ResourceType (..),
+
+    -- * StorageType
+    StorageType (..),
+
+    -- * TimeOrdering
+    TimeOrdering (..),
+
+    -- * TraversalDirection
+    TraversalDirection (..),
+
+    -- * TraversalType
+    TraversalType (..),
+
+    -- * AccessPolicySummary
+    AccessPolicySummary (..),
+    newAccessPolicySummary,
+    accessPolicySummary_creationDate,
+    accessPolicySummary_lastUpdateDate,
+    accessPolicySummary_id,
+    accessPolicySummary_identity,
+    accessPolicySummary_resource,
+    accessPolicySummary_permission,
+
+    -- * AggregatedValue
+    AggregatedValue (..),
+    newAggregatedValue,
+    aggregatedValue_quality,
+    aggregatedValue_timestamp,
+    aggregatedValue_value,
+
+    -- * Aggregates
+    Aggregates (..),
+    newAggregates,
+    aggregates_average,
+    aggregates_count,
+    aggregates_maximum,
+    aggregates_minimum,
+    aggregates_standardDeviation,
+    aggregates_sum,
+
+    -- * Alarms
+    Alarms (..),
+    newAlarms,
+    alarms_notificationLambdaArn,
+    alarms_alarmRoleArn,
+
+    -- * AssetCompositeModel
+    AssetCompositeModel (..),
+    newAssetCompositeModel,
+    assetCompositeModel_description,
+    assetCompositeModel_id,
+    assetCompositeModel_name,
+    assetCompositeModel_type,
+    assetCompositeModel_properties,
+
+    -- * AssetErrorDetails
+    AssetErrorDetails (..),
+    newAssetErrorDetails,
+    assetErrorDetails_assetId,
+    assetErrorDetails_code,
+    assetErrorDetails_message,
+
+    -- * AssetHierarchy
+    AssetHierarchy (..),
+    newAssetHierarchy,
+    assetHierarchy_id,
+    assetHierarchy_name,
+
+    -- * AssetHierarchyInfo
+    AssetHierarchyInfo (..),
+    newAssetHierarchyInfo,
+    assetHierarchyInfo_childAssetId,
+    assetHierarchyInfo_parentAssetId,
+
+    -- * AssetModelCompositeModel
+    AssetModelCompositeModel (..),
+    newAssetModelCompositeModel,
+    assetModelCompositeModel_description,
+    assetModelCompositeModel_id,
+    assetModelCompositeModel_properties,
+    assetModelCompositeModel_name,
+    assetModelCompositeModel_type,
+
+    -- * AssetModelCompositeModelDefinition
+    AssetModelCompositeModelDefinition (..),
+    newAssetModelCompositeModelDefinition,
+    assetModelCompositeModelDefinition_description,
+    assetModelCompositeModelDefinition_properties,
+    assetModelCompositeModelDefinition_name,
+    assetModelCompositeModelDefinition_type,
+
+    -- * AssetModelHierarchy
+    AssetModelHierarchy (..),
+    newAssetModelHierarchy,
+    assetModelHierarchy_id,
+    assetModelHierarchy_name,
+    assetModelHierarchy_childAssetModelId,
+
+    -- * AssetModelHierarchyDefinition
+    AssetModelHierarchyDefinition (..),
+    newAssetModelHierarchyDefinition,
+    assetModelHierarchyDefinition_name,
+    assetModelHierarchyDefinition_childAssetModelId,
+
+    -- * AssetModelProperty
+    AssetModelProperty (..),
+    newAssetModelProperty,
+    assetModelProperty_dataTypeSpec,
+    assetModelProperty_id,
+    assetModelProperty_unit,
+    assetModelProperty_name,
+    assetModelProperty_dataType,
+    assetModelProperty_type,
+
+    -- * AssetModelPropertyDefinition
+    AssetModelPropertyDefinition (..),
+    newAssetModelPropertyDefinition,
+    assetModelPropertyDefinition_dataTypeSpec,
+    assetModelPropertyDefinition_unit,
+    assetModelPropertyDefinition_name,
+    assetModelPropertyDefinition_dataType,
+    assetModelPropertyDefinition_type,
+
+    -- * AssetModelPropertySummary
+    AssetModelPropertySummary (..),
+    newAssetModelPropertySummary,
+    assetModelPropertySummary_assetModelCompositeModelId,
+    assetModelPropertySummary_dataTypeSpec,
+    assetModelPropertySummary_id,
+    assetModelPropertySummary_unit,
+    assetModelPropertySummary_name,
+    assetModelPropertySummary_dataType,
+    assetModelPropertySummary_type,
+
+    -- * AssetModelStatus
+    AssetModelStatus (..),
+    newAssetModelStatus,
+    assetModelStatus_error,
+    assetModelStatus_state,
+
+    -- * AssetModelSummary
+    AssetModelSummary (..),
+    newAssetModelSummary,
+    assetModelSummary_id,
+    assetModelSummary_arn,
+    assetModelSummary_name,
+    assetModelSummary_description,
+    assetModelSummary_creationDate,
+    assetModelSummary_lastUpdateDate,
+    assetModelSummary_status,
+
+    -- * AssetProperty
+    AssetProperty (..),
+    newAssetProperty,
+    assetProperty_alias,
+    assetProperty_dataTypeSpec,
+    assetProperty_notification,
+    assetProperty_unit,
+    assetProperty_id,
+    assetProperty_name,
+    assetProperty_dataType,
+
+    -- * AssetPropertySummary
+    AssetPropertySummary (..),
+    newAssetPropertySummary,
+    assetPropertySummary_alias,
+    assetPropertySummary_assetCompositeModelId,
+    assetPropertySummary_id,
+    assetPropertySummary_notification,
+    assetPropertySummary_unit,
+
+    -- * AssetPropertyValue
+    AssetPropertyValue (..),
+    newAssetPropertyValue,
+    assetPropertyValue_quality,
+    assetPropertyValue_value,
+    assetPropertyValue_timestamp,
+
+    -- * AssetRelationshipSummary
+    AssetRelationshipSummary (..),
+    newAssetRelationshipSummary,
+    assetRelationshipSummary_hierarchyInfo,
+    assetRelationshipSummary_relationshipType,
+
+    -- * AssetStatus
+    AssetStatus (..),
+    newAssetStatus,
+    assetStatus_error,
+    assetStatus_state,
+
+    -- * AssetSummary
+    AssetSummary (..),
+    newAssetSummary,
+    assetSummary_description,
+    assetSummary_id,
+    assetSummary_arn,
+    assetSummary_name,
+    assetSummary_assetModelId,
+    assetSummary_creationDate,
+    assetSummary_lastUpdateDate,
+    assetSummary_status,
+    assetSummary_hierarchies,
+
+    -- * AssociatedAssetsSummary
+    AssociatedAssetsSummary (..),
+    newAssociatedAssetsSummary,
+    associatedAssetsSummary_description,
+    associatedAssetsSummary_id,
+    associatedAssetsSummary_arn,
+    associatedAssetsSummary_name,
+    associatedAssetsSummary_assetModelId,
+    associatedAssetsSummary_creationDate,
+    associatedAssetsSummary_lastUpdateDate,
+    associatedAssetsSummary_status,
+    associatedAssetsSummary_hierarchies,
+
+    -- * Attribute
+    Attribute (..),
+    newAttribute,
+    attribute_defaultValue,
+
+    -- * BatchGetAssetPropertyAggregatesEntry
+    BatchGetAssetPropertyAggregatesEntry (..),
+    newBatchGetAssetPropertyAggregatesEntry,
+    batchGetAssetPropertyAggregatesEntry_assetId,
+    batchGetAssetPropertyAggregatesEntry_propertyAlias,
+    batchGetAssetPropertyAggregatesEntry_propertyId,
+    batchGetAssetPropertyAggregatesEntry_qualities,
+    batchGetAssetPropertyAggregatesEntry_timeOrdering,
+    batchGetAssetPropertyAggregatesEntry_entryId,
+    batchGetAssetPropertyAggregatesEntry_aggregateTypes,
+    batchGetAssetPropertyAggregatesEntry_resolution,
+    batchGetAssetPropertyAggregatesEntry_startDate,
+    batchGetAssetPropertyAggregatesEntry_endDate,
+
+    -- * BatchGetAssetPropertyAggregatesErrorEntry
+    BatchGetAssetPropertyAggregatesErrorEntry (..),
+    newBatchGetAssetPropertyAggregatesErrorEntry,
+    batchGetAssetPropertyAggregatesErrorEntry_errorCode,
+    batchGetAssetPropertyAggregatesErrorEntry_errorMessage,
+    batchGetAssetPropertyAggregatesErrorEntry_entryId,
+
+    -- * BatchGetAssetPropertyAggregatesErrorInfo
+    BatchGetAssetPropertyAggregatesErrorInfo (..),
+    newBatchGetAssetPropertyAggregatesErrorInfo,
+    batchGetAssetPropertyAggregatesErrorInfo_errorCode,
+    batchGetAssetPropertyAggregatesErrorInfo_errorTimestamp,
+
+    -- * BatchGetAssetPropertyAggregatesSkippedEntry
+    BatchGetAssetPropertyAggregatesSkippedEntry (..),
+    newBatchGetAssetPropertyAggregatesSkippedEntry,
+    batchGetAssetPropertyAggregatesSkippedEntry_errorInfo,
+    batchGetAssetPropertyAggregatesSkippedEntry_entryId,
+    batchGetAssetPropertyAggregatesSkippedEntry_completionStatus,
+
+    -- * BatchGetAssetPropertyAggregatesSuccessEntry
+    BatchGetAssetPropertyAggregatesSuccessEntry (..),
+    newBatchGetAssetPropertyAggregatesSuccessEntry,
+    batchGetAssetPropertyAggregatesSuccessEntry_entryId,
+    batchGetAssetPropertyAggregatesSuccessEntry_aggregatedValues,
+
+    -- * BatchGetAssetPropertyValueEntry
+    BatchGetAssetPropertyValueEntry (..),
+    newBatchGetAssetPropertyValueEntry,
+    batchGetAssetPropertyValueEntry_assetId,
+    batchGetAssetPropertyValueEntry_propertyAlias,
+    batchGetAssetPropertyValueEntry_propertyId,
+    batchGetAssetPropertyValueEntry_entryId,
+
+    -- * BatchGetAssetPropertyValueErrorEntry
+    BatchGetAssetPropertyValueErrorEntry (..),
+    newBatchGetAssetPropertyValueErrorEntry,
+    batchGetAssetPropertyValueErrorEntry_errorCode,
+    batchGetAssetPropertyValueErrorEntry_errorMessage,
+    batchGetAssetPropertyValueErrorEntry_entryId,
+
+    -- * BatchGetAssetPropertyValueErrorInfo
+    BatchGetAssetPropertyValueErrorInfo (..),
+    newBatchGetAssetPropertyValueErrorInfo,
+    batchGetAssetPropertyValueErrorInfo_errorCode,
+    batchGetAssetPropertyValueErrorInfo_errorTimestamp,
+
+    -- * BatchGetAssetPropertyValueHistoryEntry
+    BatchGetAssetPropertyValueHistoryEntry (..),
+    newBatchGetAssetPropertyValueHistoryEntry,
+    batchGetAssetPropertyValueHistoryEntry_assetId,
+    batchGetAssetPropertyValueHistoryEntry_endDate,
+    batchGetAssetPropertyValueHistoryEntry_propertyAlias,
+    batchGetAssetPropertyValueHistoryEntry_propertyId,
+    batchGetAssetPropertyValueHistoryEntry_qualities,
+    batchGetAssetPropertyValueHistoryEntry_startDate,
+    batchGetAssetPropertyValueHistoryEntry_timeOrdering,
+    batchGetAssetPropertyValueHistoryEntry_entryId,
+
+    -- * BatchGetAssetPropertyValueHistoryErrorEntry
+    BatchGetAssetPropertyValueHistoryErrorEntry (..),
+    newBatchGetAssetPropertyValueHistoryErrorEntry,
+    batchGetAssetPropertyValueHistoryErrorEntry_errorCode,
+    batchGetAssetPropertyValueHistoryErrorEntry_errorMessage,
+    batchGetAssetPropertyValueHistoryErrorEntry_entryId,
+
+    -- * BatchGetAssetPropertyValueHistoryErrorInfo
+    BatchGetAssetPropertyValueHistoryErrorInfo (..),
+    newBatchGetAssetPropertyValueHistoryErrorInfo,
+    batchGetAssetPropertyValueHistoryErrorInfo_errorCode,
+    batchGetAssetPropertyValueHistoryErrorInfo_errorTimestamp,
+
+    -- * BatchGetAssetPropertyValueHistorySkippedEntry
+    BatchGetAssetPropertyValueHistorySkippedEntry (..),
+    newBatchGetAssetPropertyValueHistorySkippedEntry,
+    batchGetAssetPropertyValueHistorySkippedEntry_errorInfo,
+    batchGetAssetPropertyValueHistorySkippedEntry_entryId,
+    batchGetAssetPropertyValueHistorySkippedEntry_completionStatus,
+
+    -- * BatchGetAssetPropertyValueHistorySuccessEntry
+    BatchGetAssetPropertyValueHistorySuccessEntry (..),
+    newBatchGetAssetPropertyValueHistorySuccessEntry,
+    batchGetAssetPropertyValueHistorySuccessEntry_entryId,
+    batchGetAssetPropertyValueHistorySuccessEntry_assetPropertyValueHistory,
+
+    -- * BatchGetAssetPropertyValueSkippedEntry
+    BatchGetAssetPropertyValueSkippedEntry (..),
+    newBatchGetAssetPropertyValueSkippedEntry,
+    batchGetAssetPropertyValueSkippedEntry_errorInfo,
+    batchGetAssetPropertyValueSkippedEntry_entryId,
+    batchGetAssetPropertyValueSkippedEntry_completionStatus,
+
+    -- * BatchGetAssetPropertyValueSuccessEntry
+    BatchGetAssetPropertyValueSuccessEntry (..),
+    newBatchGetAssetPropertyValueSuccessEntry,
+    batchGetAssetPropertyValueSuccessEntry_assetPropertyValue,
+    batchGetAssetPropertyValueSuccessEntry_entryId,
+
+    -- * BatchPutAssetPropertyError
+    BatchPutAssetPropertyError (..),
+    newBatchPutAssetPropertyError,
+    batchPutAssetPropertyError_errorCode,
+    batchPutAssetPropertyError_errorMessage,
+    batchPutAssetPropertyError_timestamps,
+
+    -- * BatchPutAssetPropertyErrorEntry
+    BatchPutAssetPropertyErrorEntry (..),
+    newBatchPutAssetPropertyErrorEntry,
+    batchPutAssetPropertyErrorEntry_entryId,
+    batchPutAssetPropertyErrorEntry_errors,
+
+    -- * CompositeModelProperty
+    CompositeModelProperty (..),
+    newCompositeModelProperty,
+    compositeModelProperty_id,
+    compositeModelProperty_name,
+    compositeModelProperty_type,
+    compositeModelProperty_assetProperty,
+
+    -- * ConfigurationErrorDetails
+    ConfigurationErrorDetails (..),
+    newConfigurationErrorDetails,
+    configurationErrorDetails_code,
+    configurationErrorDetails_message,
+
+    -- * ConfigurationStatus
+    ConfigurationStatus (..),
+    newConfigurationStatus,
+    configurationStatus_error,
+    configurationStatus_state,
+
+    -- * Csv
+    Csv (..),
+    newCsv,
+    csv_columnNames,
+
+    -- * CustomerManagedS3Storage
+    CustomerManagedS3Storage (..),
+    newCustomerManagedS3Storage,
+    customerManagedS3Storage_s3ResourceArn,
+    customerManagedS3Storage_roleArn,
+
+    -- * DashboardSummary
+    DashboardSummary (..),
+    newDashboardSummary,
+    dashboardSummary_creationDate,
+    dashboardSummary_description,
+    dashboardSummary_lastUpdateDate,
+    dashboardSummary_id,
+    dashboardSummary_name,
+
+    -- * DetailedError
+    DetailedError (..),
+    newDetailedError,
+    detailedError_code,
+    detailedError_message,
+
+    -- * ErrorDetails
+    ErrorDetails (..),
+    newErrorDetails,
+    errorDetails_details,
+    errorDetails_code,
+    errorDetails_message,
+
+    -- * ErrorReportLocation
+    ErrorReportLocation (..),
+    newErrorReportLocation,
+    errorReportLocation_bucket,
+    errorReportLocation_prefix,
+
+    -- * ExpressionVariable
+    ExpressionVariable (..),
+    newExpressionVariable,
+    expressionVariable_name,
+    expressionVariable_value,
+
+    -- * File
+    File (..),
+    newFile,
+    file_versionId,
+    file_bucket,
+    file_key,
+
+    -- * FileFormat
+    FileFormat (..),
+    newFileFormat,
+    fileFormat_csv,
+
+    -- * ForwardingConfig
+    ForwardingConfig (..),
+    newForwardingConfig,
+    forwardingConfig_state,
+
+    -- * GatewayCapabilitySummary
+    GatewayCapabilitySummary (..),
+    newGatewayCapabilitySummary,
+    gatewayCapabilitySummary_capabilityNamespace,
+    gatewayCapabilitySummary_capabilitySyncStatus,
+
+    -- * GatewayPlatform
+    GatewayPlatform (..),
+    newGatewayPlatform,
+    gatewayPlatform_greengrass,
+    gatewayPlatform_greengrassV2,
+
+    -- * GatewaySummary
+    GatewaySummary (..),
+    newGatewaySummary,
+    gatewaySummary_gatewayCapabilitySummaries,
+    gatewaySummary_gatewayPlatform,
+    gatewaySummary_gatewayId,
+    gatewaySummary_gatewayName,
+    gatewaySummary_creationDate,
+    gatewaySummary_lastUpdateDate,
+
+    -- * Greengrass
+    Greengrass (..),
+    newGreengrass,
+    greengrass_groupArn,
+
+    -- * GreengrassV2
+    GreengrassV2 (..),
+    newGreengrassV2,
+    greengrassV2_coreDeviceThingName,
+
+    -- * GroupIdentity
+    GroupIdentity (..),
+    newGroupIdentity,
+    groupIdentity_id,
+
+    -- * IAMRoleIdentity
+    IAMRoleIdentity (..),
+    newIAMRoleIdentity,
+    iAMRoleIdentity_arn,
+
+    -- * IAMUserIdentity
+    IAMUserIdentity (..),
+    newIAMUserIdentity,
+    iAMUserIdentity_arn,
+
+    -- * Identity
+    Identity (..),
+    newIdentity,
+    identity_group,
+    identity_iamRole,
+    identity_iamUser,
+    identity_user,
+
+    -- * Image
+    Image (..),
+    newImage,
+    image_file,
+    image_id,
+
+    -- * ImageFile
+    ImageFile (..),
+    newImageFile,
+    imageFile_data,
+    imageFile_type,
+
+    -- * ImageLocation
+    ImageLocation (..),
+    newImageLocation,
+    imageLocation_id,
+    imageLocation_url,
+
+    -- * InterpolatedAssetPropertyValue
+    InterpolatedAssetPropertyValue (..),
+    newInterpolatedAssetPropertyValue,
+    interpolatedAssetPropertyValue_timestamp,
+    interpolatedAssetPropertyValue_value,
+
+    -- * JobConfiguration
+    JobConfiguration (..),
+    newJobConfiguration,
+    jobConfiguration_fileFormat,
+
+    -- * JobSummary
+    JobSummary (..),
+    newJobSummary,
+    jobSummary_id,
+    jobSummary_name,
+    jobSummary_status,
+
+    -- * LoggingOptions
+    LoggingOptions (..),
+    newLoggingOptions,
+    loggingOptions_level,
+
+    -- * Measurement
+    Measurement (..),
+    newMeasurement,
+    measurement_processingConfig,
+
+    -- * MeasurementProcessingConfig
+    MeasurementProcessingConfig (..),
+    newMeasurementProcessingConfig,
+    measurementProcessingConfig_forwardingConfig,
+
+    -- * Metric
+    Metric (..),
+    newMetric,
+    metric_processingConfig,
+    metric_expression,
+    metric_variables,
+    metric_window,
+
+    -- * MetricProcessingConfig
+    MetricProcessingConfig (..),
+    newMetricProcessingConfig,
+    metricProcessingConfig_computeLocation,
+
+    -- * MetricWindow
+    MetricWindow (..),
+    newMetricWindow,
+    metricWindow_tumbling,
+
+    -- * MonitorErrorDetails
+    MonitorErrorDetails (..),
+    newMonitorErrorDetails,
+    monitorErrorDetails_code,
+    monitorErrorDetails_message,
+
+    -- * MultiLayerStorage
+    MultiLayerStorage (..),
+    newMultiLayerStorage,
+    multiLayerStorage_customerManagedS3Storage,
+
+    -- * PortalResource
+    PortalResource (..),
+    newPortalResource,
+    portalResource_id,
+
+    -- * PortalStatus
+    PortalStatus (..),
+    newPortalStatus,
+    portalStatus_error,
+    portalStatus_state,
+
+    -- * PortalSummary
+    PortalSummary (..),
+    newPortalSummary,
+    portalSummary_creationDate,
+    portalSummary_description,
+    portalSummary_lastUpdateDate,
+    portalSummary_roleArn,
+    portalSummary_id,
+    portalSummary_name,
+    portalSummary_startUrl,
+    portalSummary_status,
+
+    -- * ProjectResource
+    ProjectResource (..),
+    newProjectResource,
+    projectResource_id,
+
+    -- * ProjectSummary
+    ProjectSummary (..),
+    newProjectSummary,
+    projectSummary_creationDate,
+    projectSummary_description,
+    projectSummary_lastUpdateDate,
+    projectSummary_id,
+    projectSummary_name,
+
+    -- * Property
+    Property (..),
+    newProperty,
+    property_alias,
+    property_notification,
+    property_type,
+    property_unit,
+    property_id,
+    property_name,
+    property_dataType,
+
+    -- * PropertyNotification
+    PropertyNotification (..),
+    newPropertyNotification,
+    propertyNotification_topic,
+    propertyNotification_state,
+
+    -- * PropertyType
+    PropertyType (..),
+    newPropertyType,
+    propertyType_attribute,
+    propertyType_measurement,
+    propertyType_metric,
+    propertyType_transform,
+
+    -- * PutAssetPropertyValueEntry
+    PutAssetPropertyValueEntry (..),
+    newPutAssetPropertyValueEntry,
+    putAssetPropertyValueEntry_assetId,
+    putAssetPropertyValueEntry_propertyAlias,
+    putAssetPropertyValueEntry_propertyId,
+    putAssetPropertyValueEntry_entryId,
+    putAssetPropertyValueEntry_propertyValues,
+
+    -- * Resource
+    Resource (..),
+    newResource,
+    resource_portal,
+    resource_project,
+
+    -- * RetentionPeriod
+    RetentionPeriod (..),
+    newRetentionPeriod,
+    retentionPeriod_numberOfDays,
+    retentionPeriod_unlimited,
+
+    -- * TimeInNanos
+    TimeInNanos (..),
+    newTimeInNanos,
+    timeInNanos_offsetInNanos,
+    timeInNanos_timeInSeconds,
+
+    -- * TimeSeriesSummary
+    TimeSeriesSummary (..),
+    newTimeSeriesSummary,
+    timeSeriesSummary_alias,
+    timeSeriesSummary_assetId,
+    timeSeriesSummary_dataTypeSpec,
+    timeSeriesSummary_propertyId,
+    timeSeriesSummary_timeSeriesId,
+    timeSeriesSummary_dataType,
+    timeSeriesSummary_timeSeriesCreationDate,
+    timeSeriesSummary_timeSeriesLastUpdateDate,
+
+    -- * Transform
+    Transform (..),
+    newTransform,
+    transform_processingConfig,
+    transform_expression,
+    transform_variables,
+
+    -- * TransformProcessingConfig
+    TransformProcessingConfig (..),
+    newTransformProcessingConfig,
+    transformProcessingConfig_forwardingConfig,
+    transformProcessingConfig_computeLocation,
+
+    -- * TumblingWindow
+    TumblingWindow (..),
+    newTumblingWindow,
+    tumblingWindow_offset,
+    tumblingWindow_interval,
+
+    -- * UserIdentity
+    UserIdentity (..),
+    newUserIdentity,
+    userIdentity_id,
+
+    -- * VariableValue
+    VariableValue (..),
+    newVariableValue,
+    variableValue_hierarchyId,
+    variableValue_propertyId,
+
+    -- * Variant
+    Variant (..),
+    newVariant,
+    variant_booleanValue,
+    variant_doubleValue,
+    variant_integerValue,
+    variant_stringValue,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import Amazonka.IoTSiteWise.Types.AccessPolicySummary
+import Amazonka.IoTSiteWise.Types.AggregateType
+import Amazonka.IoTSiteWise.Types.AggregatedValue
+import Amazonka.IoTSiteWise.Types.Aggregates
+import Amazonka.IoTSiteWise.Types.Alarms
+import Amazonka.IoTSiteWise.Types.AssetCompositeModel
+import Amazonka.IoTSiteWise.Types.AssetErrorCode
+import Amazonka.IoTSiteWise.Types.AssetErrorDetails
+import Amazonka.IoTSiteWise.Types.AssetHierarchy
+import Amazonka.IoTSiteWise.Types.AssetHierarchyInfo
+import Amazonka.IoTSiteWise.Types.AssetModelCompositeModel
+import Amazonka.IoTSiteWise.Types.AssetModelCompositeModelDefinition
+import Amazonka.IoTSiteWise.Types.AssetModelHierarchy
+import Amazonka.IoTSiteWise.Types.AssetModelHierarchyDefinition
+import Amazonka.IoTSiteWise.Types.AssetModelProperty
+import Amazonka.IoTSiteWise.Types.AssetModelPropertyDefinition
+import Amazonka.IoTSiteWise.Types.AssetModelPropertySummary
+import Amazonka.IoTSiteWise.Types.AssetModelState
+import Amazonka.IoTSiteWise.Types.AssetModelStatus
+import Amazonka.IoTSiteWise.Types.AssetModelSummary
+import Amazonka.IoTSiteWise.Types.AssetProperty
+import Amazonka.IoTSiteWise.Types.AssetPropertySummary
+import Amazonka.IoTSiteWise.Types.AssetPropertyValue
+import Amazonka.IoTSiteWise.Types.AssetRelationshipSummary
+import Amazonka.IoTSiteWise.Types.AssetRelationshipType
+import Amazonka.IoTSiteWise.Types.AssetState
+import Amazonka.IoTSiteWise.Types.AssetStatus
+import Amazonka.IoTSiteWise.Types.AssetSummary
+import Amazonka.IoTSiteWise.Types.AssociatedAssetsSummary
+import Amazonka.IoTSiteWise.Types.Attribute
+import Amazonka.IoTSiteWise.Types.AuthMode
+import Amazonka.IoTSiteWise.Types.BatchEntryCompletionStatus
+import Amazonka.IoTSiteWise.Types.BatchGetAssetPropertyAggregatesEntry
+import Amazonka.IoTSiteWise.Types.BatchGetAssetPropertyAggregatesErrorCode
+import Amazonka.IoTSiteWise.Types.BatchGetAssetPropertyAggregatesErrorEntry
+import Amazonka.IoTSiteWise.Types.BatchGetAssetPropertyAggregatesErrorInfo
+import Amazonka.IoTSiteWise.Types.BatchGetAssetPropertyAggregatesSkippedEntry
+import Amazonka.IoTSiteWise.Types.BatchGetAssetPropertyAggregatesSuccessEntry
+import Amazonka.IoTSiteWise.Types.BatchGetAssetPropertyValueEntry
+import Amazonka.IoTSiteWise.Types.BatchGetAssetPropertyValueErrorCode
+import Amazonka.IoTSiteWise.Types.BatchGetAssetPropertyValueErrorEntry
+import Amazonka.IoTSiteWise.Types.BatchGetAssetPropertyValueErrorInfo
+import Amazonka.IoTSiteWise.Types.BatchGetAssetPropertyValueHistoryEntry
+import Amazonka.IoTSiteWise.Types.BatchGetAssetPropertyValueHistoryErrorCode
+import Amazonka.IoTSiteWise.Types.BatchGetAssetPropertyValueHistoryErrorEntry
+import Amazonka.IoTSiteWise.Types.BatchGetAssetPropertyValueHistoryErrorInfo
+import Amazonka.IoTSiteWise.Types.BatchGetAssetPropertyValueHistorySkippedEntry
+import Amazonka.IoTSiteWise.Types.BatchGetAssetPropertyValueHistorySuccessEntry
+import Amazonka.IoTSiteWise.Types.BatchGetAssetPropertyValueSkippedEntry
+import Amazonka.IoTSiteWise.Types.BatchGetAssetPropertyValueSuccessEntry
+import Amazonka.IoTSiteWise.Types.BatchPutAssetPropertyError
+import Amazonka.IoTSiteWise.Types.BatchPutAssetPropertyErrorEntry
+import Amazonka.IoTSiteWise.Types.BatchPutAssetPropertyValueErrorCode
+import Amazonka.IoTSiteWise.Types.CapabilitySyncStatus
+import Amazonka.IoTSiteWise.Types.ColumnName
+import Amazonka.IoTSiteWise.Types.CompositeModelProperty
+import Amazonka.IoTSiteWise.Types.ComputeLocation
+import Amazonka.IoTSiteWise.Types.ConfigurationErrorDetails
+import Amazonka.IoTSiteWise.Types.ConfigurationState
+import Amazonka.IoTSiteWise.Types.ConfigurationStatus
+import Amazonka.IoTSiteWise.Types.Csv
+import Amazonka.IoTSiteWise.Types.CustomerManagedS3Storage
+import Amazonka.IoTSiteWise.Types.DashboardSummary
+import Amazonka.IoTSiteWise.Types.DetailedError
+import Amazonka.IoTSiteWise.Types.DetailedErrorCode
+import Amazonka.IoTSiteWise.Types.DisassociatedDataStorageState
+import Amazonka.IoTSiteWise.Types.EncryptionType
+import Amazonka.IoTSiteWise.Types.ErrorCode
+import Amazonka.IoTSiteWise.Types.ErrorDetails
+import Amazonka.IoTSiteWise.Types.ErrorReportLocation
+import Amazonka.IoTSiteWise.Types.ExpressionVariable
+import Amazonka.IoTSiteWise.Types.File
+import Amazonka.IoTSiteWise.Types.FileFormat
+import Amazonka.IoTSiteWise.Types.ForwardingConfig
+import Amazonka.IoTSiteWise.Types.ForwardingConfigState
+import Amazonka.IoTSiteWise.Types.GatewayCapabilitySummary
+import Amazonka.IoTSiteWise.Types.GatewayPlatform
+import Amazonka.IoTSiteWise.Types.GatewaySummary
+import Amazonka.IoTSiteWise.Types.Greengrass
+import Amazonka.IoTSiteWise.Types.GreengrassV2
+import Amazonka.IoTSiteWise.Types.GroupIdentity
+import Amazonka.IoTSiteWise.Types.IAMRoleIdentity
+import Amazonka.IoTSiteWise.Types.IAMUserIdentity
+import Amazonka.IoTSiteWise.Types.Identity
+import Amazonka.IoTSiteWise.Types.IdentityType
+import Amazonka.IoTSiteWise.Types.Image
+import Amazonka.IoTSiteWise.Types.ImageFile
+import Amazonka.IoTSiteWise.Types.ImageFileType
+import Amazonka.IoTSiteWise.Types.ImageLocation
+import Amazonka.IoTSiteWise.Types.InterpolatedAssetPropertyValue
+import Amazonka.IoTSiteWise.Types.JobConfiguration
+import Amazonka.IoTSiteWise.Types.JobStatus
+import Amazonka.IoTSiteWise.Types.JobSummary
+import Amazonka.IoTSiteWise.Types.ListAssetModelPropertiesFilter
+import Amazonka.IoTSiteWise.Types.ListAssetPropertiesFilter
+import Amazonka.IoTSiteWise.Types.ListAssetsFilter
+import Amazonka.IoTSiteWise.Types.ListBulkImportJobsFilter
+import Amazonka.IoTSiteWise.Types.ListTimeSeriesType
+import Amazonka.IoTSiteWise.Types.LoggingLevel
+import Amazonka.IoTSiteWise.Types.LoggingOptions
+import Amazonka.IoTSiteWise.Types.Measurement
+import Amazonka.IoTSiteWise.Types.MeasurementProcessingConfig
+import Amazonka.IoTSiteWise.Types.Metric
+import Amazonka.IoTSiteWise.Types.MetricProcessingConfig
+import Amazonka.IoTSiteWise.Types.MetricWindow
+import Amazonka.IoTSiteWise.Types.MonitorErrorCode
+import Amazonka.IoTSiteWise.Types.MonitorErrorDetails
+import Amazonka.IoTSiteWise.Types.MultiLayerStorage
+import Amazonka.IoTSiteWise.Types.Permission
+import Amazonka.IoTSiteWise.Types.PortalResource
+import Amazonka.IoTSiteWise.Types.PortalState
+import Amazonka.IoTSiteWise.Types.PortalStatus
+import Amazonka.IoTSiteWise.Types.PortalSummary
+import Amazonka.IoTSiteWise.Types.ProjectResource
+import Amazonka.IoTSiteWise.Types.ProjectSummary
+import Amazonka.IoTSiteWise.Types.Property
+import Amazonka.IoTSiteWise.Types.PropertyDataType
+import Amazonka.IoTSiteWise.Types.PropertyNotification
+import Amazonka.IoTSiteWise.Types.PropertyNotificationState
+import Amazonka.IoTSiteWise.Types.PropertyType
+import Amazonka.IoTSiteWise.Types.PutAssetPropertyValueEntry
+import Amazonka.IoTSiteWise.Types.Quality
+import Amazonka.IoTSiteWise.Types.Resource
+import Amazonka.IoTSiteWise.Types.ResourceType
+import Amazonka.IoTSiteWise.Types.RetentionPeriod
+import Amazonka.IoTSiteWise.Types.StorageType
+import Amazonka.IoTSiteWise.Types.TimeInNanos
+import Amazonka.IoTSiteWise.Types.TimeOrdering
+import Amazonka.IoTSiteWise.Types.TimeSeriesSummary
+import Amazonka.IoTSiteWise.Types.Transform
+import Amazonka.IoTSiteWise.Types.TransformProcessingConfig
+import Amazonka.IoTSiteWise.Types.TraversalDirection
+import Amazonka.IoTSiteWise.Types.TraversalType
+import Amazonka.IoTSiteWise.Types.TumblingWindow
+import Amazonka.IoTSiteWise.Types.UserIdentity
+import Amazonka.IoTSiteWise.Types.VariableValue
+import Amazonka.IoTSiteWise.Types.Variant
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Sign.V4 as Sign
+
+-- | API version @2019-12-02@ of the Amazon IoT SiteWise SDK configuration.
+defaultService :: Core.Service
+defaultService =
+  Core.Service
+    { Core.abbrev = "IoTSiteWise",
+      Core.signer = Sign.v4,
+      Core.endpointPrefix = "iotsitewise",
+      Core.signingName = "iotsitewise",
+      Core.version = "2019-12-02",
+      Core.s3AddressingStyle = Core.S3AddressingStyleAuto,
+      Core.endpoint = Core.defaultEndpoint defaultService,
+      Core.timeout = Prelude.Just 70,
+      Core.check = Core.statusSuccess,
+      Core.error = Core.parseJSONError "IoTSiteWise",
+      Core.retry = retry
+    }
+  where
+    retry =
+      Core.Exponential
+        { Core.base = 5.0e-2,
+          Core.growth = 2,
+          Core.attempts = 5,
+          Core.check = check
+        }
+    check e
+      | Lens.has (Core.hasStatus 502) e =
+          Prelude.Just "bad_gateway"
+      | Lens.has (Core.hasStatus 504) e =
+          Prelude.Just "gateway_timeout"
+      | Lens.has (Core.hasStatus 500) e =
+          Prelude.Just "general_server_error"
+      | Lens.has (Core.hasStatus 509) e =
+          Prelude.Just "limit_exceeded"
+      | Lens.has
+          ( Core.hasCode "RequestThrottledException"
+              Prelude.. Core.hasStatus 400
+          )
+          e =
+          Prelude.Just "request_throttled_exception"
+      | Lens.has (Core.hasStatus 503) e =
+          Prelude.Just "service_unavailable"
+      | Lens.has
+          ( Core.hasCode "ThrottledException"
+              Prelude.. Core.hasStatus 400
+          )
+          e =
+          Prelude.Just "throttled_exception"
+      | Lens.has
+          ( Core.hasCode "Throttling"
+              Prelude.. Core.hasStatus 400
+          )
+          e =
+          Prelude.Just "throttling"
+      | Lens.has
+          ( Core.hasCode "ThrottlingException"
+              Prelude.. Core.hasStatus 400
+          )
+          e =
+          Prelude.Just "throttling_exception"
+      | Lens.has
+          ( Core.hasCode
+              "ProvisionedThroughputExceededException"
+              Prelude.. Core.hasStatus 400
+          )
+          e =
+          Prelude.Just "throughput_exceeded"
+      | Lens.has (Core.hasStatus 429) e =
+          Prelude.Just "too_many_requests"
+      | Prelude.otherwise = Prelude.Nothing
+
+-- | Your request has conflicting operations. This can occur if you\'re
+-- trying to perform more than one operation on the same resource at the
+-- same time.
+_ConflictingOperationException :: (Core.AsError a) => Lens.Fold a Core.ServiceError
+_ConflictingOperationException =
+  Core._MatchServiceError
+    defaultService
+    "ConflictingOperationException"
+    Prelude.. Core.hasStatus 409
+
+-- | IoT SiteWise can\'t process your request right now. Try again later.
+_InternalFailureException :: (Core.AsError a) => Lens.Fold a Core.ServiceError
+_InternalFailureException =
+  Core._MatchServiceError
+    defaultService
+    "InternalFailureException"
+    Prelude.. Core.hasStatus 500
+
+-- | The request isn\'t valid. This can occur if your request contains
+-- malformed JSON or unsupported characters. Check your request and try
+-- again.
+_InvalidRequestException :: (Core.AsError a) => Lens.Fold a Core.ServiceError
+_InvalidRequestException =
+  Core._MatchServiceError
+    defaultService
+    "InvalidRequestException"
+    Prelude.. Core.hasStatus 400
+
+-- | You\'ve reached the limit for a resource. For example, this can occur if
+-- you\'re trying to associate more than the allowed number of child assets
+-- or attempting to create more than the allowed number of properties for
+-- an asset model.
+--
+-- For more information, see
+-- <https://docs.aws.amazon.com/iot-sitewise/latest/userguide/quotas.html Quotas>
+-- in the /IoT SiteWise User Guide/.
+_LimitExceededException :: (Core.AsError a) => Lens.Fold a Core.ServiceError
+_LimitExceededException =
+  Core._MatchServiceError
+    defaultService
+    "LimitExceededException"
+    Prelude.. Core.hasStatus 410
+
+-- | The resource already exists.
+_ResourceAlreadyExistsException :: (Core.AsError a) => Lens.Fold a Core.ServiceError
+_ResourceAlreadyExistsException =
+  Core._MatchServiceError
+    defaultService
+    "ResourceAlreadyExistsException"
+    Prelude.. Core.hasStatus 409
+
+-- | The requested resource can\'t be found.
+_ResourceNotFoundException :: (Core.AsError a) => Lens.Fold a Core.ServiceError
+_ResourceNotFoundException =
+  Core._MatchServiceError
+    defaultService
+    "ResourceNotFoundException"
+    Prelude.. Core.hasStatus 404
+
+-- | The requested service is unavailable.
+_ServiceUnavailableException :: (Core.AsError a) => Lens.Fold a Core.ServiceError
+_ServiceUnavailableException =
+  Core._MatchServiceError
+    defaultService
+    "ServiceUnavailableException"
+    Prelude.. Core.hasStatus 503
+
+-- | Your request exceeded a rate limit. For example, you might have exceeded
+-- the number of IoT SiteWise assets that can be created per second, the
+-- allowed number of messages per second, and so on.
+--
+-- For more information, see
+-- <https://docs.aws.amazon.com/iot-sitewise/latest/userguide/quotas.html Quotas>
+-- in the /IoT SiteWise User Guide/.
+_ThrottlingException :: (Core.AsError a) => Lens.Fold a Core.ServiceError
+_ThrottlingException =
+  Core._MatchServiceError
+    defaultService
+    "ThrottlingException"
+    Prelude.. Core.hasStatus 429
+
+-- | You\'ve reached the limit for the number of tags allowed for a resource.
+-- For more information, see
+-- <https://docs.aws.amazon.com/general/latest/gr/aws_tagging.html#tag-conventions Tag naming limits and requirements>
+-- in the /Amazon Web Services General Reference/.
+_TooManyTagsException :: (Core.AsError a) => Lens.Fold a Core.ServiceError
+_TooManyTagsException =
+  Core._MatchServiceError
+    defaultService
+    "TooManyTagsException"
+    Prelude.. Core.hasStatus 400
+
+-- | You are not authorized.
+_UnauthorizedException :: (Core.AsError a) => Lens.Fold a Core.ServiceError
+_UnauthorizedException =
+  Core._MatchServiceError
+    defaultService
+    "UnauthorizedException"
+    Prelude.. Core.hasStatus 401
diff --git a/gen/Amazonka/IoTSiteWise/Types/AccessPolicySummary.hs b/gen/Amazonka/IoTSiteWise/Types/AccessPolicySummary.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/IoTSiteWise/Types/AccessPolicySummary.hs
@@ -0,0 +1,155 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.IoTSiteWise.Types.AccessPolicySummary
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.IoTSiteWise.Types.AccessPolicySummary where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.IoTSiteWise.Types.Identity
+import Amazonka.IoTSiteWise.Types.Permission
+import Amazonka.IoTSiteWise.Types.Resource
+import qualified Amazonka.Prelude as Prelude
+
+-- | Contains an access policy that defines an identity\'s access to an IoT
+-- SiteWise Monitor resource.
+--
+-- /See:/ 'newAccessPolicySummary' smart constructor.
+data AccessPolicySummary = AccessPolicySummary'
+  { -- | The date the access policy was created, in Unix epoch time.
+    creationDate :: Prelude.Maybe Data.POSIX,
+    -- | The date the access policy was last updated, in Unix epoch time.
+    lastUpdateDate :: Prelude.Maybe Data.POSIX,
+    -- | The ID of the access policy.
+    id :: Prelude.Text,
+    -- | The identity (an IAM Identity Center user, an IAM Identity Center group,
+    -- or an IAM user).
+    identity :: Identity,
+    -- | The IoT SiteWise Monitor resource (a portal or project).
+    resource :: Resource,
+    -- | The permissions for the access policy. Note that a project
+    -- @ADMINISTRATOR@ is also known as a project owner.
+    permission :: Permission
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'AccessPolicySummary' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'creationDate', 'accessPolicySummary_creationDate' - The date the access policy was created, in Unix epoch time.
+--
+-- 'lastUpdateDate', 'accessPolicySummary_lastUpdateDate' - The date the access policy was last updated, in Unix epoch time.
+--
+-- 'id', 'accessPolicySummary_id' - The ID of the access policy.
+--
+-- 'identity', 'accessPolicySummary_identity' - The identity (an IAM Identity Center user, an IAM Identity Center group,
+-- or an IAM user).
+--
+-- 'resource', 'accessPolicySummary_resource' - The IoT SiteWise Monitor resource (a portal or project).
+--
+-- 'permission', 'accessPolicySummary_permission' - The permissions for the access policy. Note that a project
+-- @ADMINISTRATOR@ is also known as a project owner.
+newAccessPolicySummary ::
+  -- | 'id'
+  Prelude.Text ->
+  -- | 'identity'
+  Identity ->
+  -- | 'resource'
+  Resource ->
+  -- | 'permission'
+  Permission ->
+  AccessPolicySummary
+newAccessPolicySummary
+  pId_
+  pIdentity_
+  pResource_
+  pPermission_ =
+    AccessPolicySummary'
+      { creationDate =
+          Prelude.Nothing,
+        lastUpdateDate = Prelude.Nothing,
+        id = pId_,
+        identity = pIdentity_,
+        resource = pResource_,
+        permission = pPermission_
+      }
+
+-- | The date the access policy was created, in Unix epoch time.
+accessPolicySummary_creationDate :: Lens.Lens' AccessPolicySummary (Prelude.Maybe Prelude.UTCTime)
+accessPolicySummary_creationDate = Lens.lens (\AccessPolicySummary' {creationDate} -> creationDate) (\s@AccessPolicySummary' {} a -> s {creationDate = a} :: AccessPolicySummary) Prelude.. Lens.mapping Data._Time
+
+-- | The date the access policy was last updated, in Unix epoch time.
+accessPolicySummary_lastUpdateDate :: Lens.Lens' AccessPolicySummary (Prelude.Maybe Prelude.UTCTime)
+accessPolicySummary_lastUpdateDate = Lens.lens (\AccessPolicySummary' {lastUpdateDate} -> lastUpdateDate) (\s@AccessPolicySummary' {} a -> s {lastUpdateDate = a} :: AccessPolicySummary) Prelude.. Lens.mapping Data._Time
+
+-- | The ID of the access policy.
+accessPolicySummary_id :: Lens.Lens' AccessPolicySummary Prelude.Text
+accessPolicySummary_id = Lens.lens (\AccessPolicySummary' {id} -> id) (\s@AccessPolicySummary' {} a -> s {id = a} :: AccessPolicySummary)
+
+-- | The identity (an IAM Identity Center user, an IAM Identity Center group,
+-- or an IAM user).
+accessPolicySummary_identity :: Lens.Lens' AccessPolicySummary Identity
+accessPolicySummary_identity = Lens.lens (\AccessPolicySummary' {identity} -> identity) (\s@AccessPolicySummary' {} a -> s {identity = a} :: AccessPolicySummary)
+
+-- | The IoT SiteWise Monitor resource (a portal or project).
+accessPolicySummary_resource :: Lens.Lens' AccessPolicySummary Resource
+accessPolicySummary_resource = Lens.lens (\AccessPolicySummary' {resource} -> resource) (\s@AccessPolicySummary' {} a -> s {resource = a} :: AccessPolicySummary)
+
+-- | The permissions for the access policy. Note that a project
+-- @ADMINISTRATOR@ is also known as a project owner.
+accessPolicySummary_permission :: Lens.Lens' AccessPolicySummary Permission
+accessPolicySummary_permission = Lens.lens (\AccessPolicySummary' {permission} -> permission) (\s@AccessPolicySummary' {} a -> s {permission = a} :: AccessPolicySummary)
+
+instance Data.FromJSON AccessPolicySummary where
+  parseJSON =
+    Data.withObject
+      "AccessPolicySummary"
+      ( \x ->
+          AccessPolicySummary'
+            Prelude.<$> (x Data..:? "creationDate")
+            Prelude.<*> (x Data..:? "lastUpdateDate")
+            Prelude.<*> (x Data..: "id")
+            Prelude.<*> (x Data..: "identity")
+            Prelude.<*> (x Data..: "resource")
+            Prelude.<*> (x Data..: "permission")
+      )
+
+instance Prelude.Hashable AccessPolicySummary where
+  hashWithSalt _salt AccessPolicySummary' {..} =
+    _salt
+      `Prelude.hashWithSalt` creationDate
+      `Prelude.hashWithSalt` lastUpdateDate
+      `Prelude.hashWithSalt` id
+      `Prelude.hashWithSalt` identity
+      `Prelude.hashWithSalt` resource
+      `Prelude.hashWithSalt` permission
+
+instance Prelude.NFData AccessPolicySummary where
+  rnf AccessPolicySummary' {..} =
+    Prelude.rnf creationDate
+      `Prelude.seq` Prelude.rnf lastUpdateDate
+      `Prelude.seq` Prelude.rnf id
+      `Prelude.seq` Prelude.rnf identity
+      `Prelude.seq` Prelude.rnf resource
+      `Prelude.seq` Prelude.rnf permission
diff --git a/gen/Amazonka/IoTSiteWise/Types/AggregateType.hs b/gen/Amazonka/IoTSiteWise/Types/AggregateType.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/IoTSiteWise/Types/AggregateType.hs
@@ -0,0 +1,91 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DerivingStrategies #-}
+{-# LANGUAGE GeneralizedNewtypeDeriving #-}
+{-# LANGUAGE LambdaCase #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE PatternSynonyms #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.IoTSiteWise.Types.AggregateType
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.IoTSiteWise.Types.AggregateType
+  ( AggregateType
+      ( ..,
+        AggregateType_AVERAGE,
+        AggregateType_COUNT,
+        AggregateType_MAXIMUM,
+        AggregateType_MINIMUM,
+        AggregateType_STANDARD_DEVIATION,
+        AggregateType_SUM
+      ),
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+newtype AggregateType = AggregateType'
+  { fromAggregateType ::
+      Data.Text
+  }
+  deriving stock
+    ( Prelude.Show,
+      Prelude.Read,
+      Prelude.Eq,
+      Prelude.Ord,
+      Prelude.Generic
+    )
+  deriving newtype
+    ( Prelude.Hashable,
+      Prelude.NFData,
+      Data.FromText,
+      Data.ToText,
+      Data.ToByteString,
+      Data.ToLog,
+      Data.ToHeader,
+      Data.ToQuery,
+      Data.FromJSON,
+      Data.FromJSONKey,
+      Data.ToJSON,
+      Data.ToJSONKey,
+      Data.FromXML,
+      Data.ToXML
+    )
+
+pattern AggregateType_AVERAGE :: AggregateType
+pattern AggregateType_AVERAGE = AggregateType' "AVERAGE"
+
+pattern AggregateType_COUNT :: AggregateType
+pattern AggregateType_COUNT = AggregateType' "COUNT"
+
+pattern AggregateType_MAXIMUM :: AggregateType
+pattern AggregateType_MAXIMUM = AggregateType' "MAXIMUM"
+
+pattern AggregateType_MINIMUM :: AggregateType
+pattern AggregateType_MINIMUM = AggregateType' "MINIMUM"
+
+pattern AggregateType_STANDARD_DEVIATION :: AggregateType
+pattern AggregateType_STANDARD_DEVIATION = AggregateType' "STANDARD_DEVIATION"
+
+pattern AggregateType_SUM :: AggregateType
+pattern AggregateType_SUM = AggregateType' "SUM"
+
+{-# COMPLETE
+  AggregateType_AVERAGE,
+  AggregateType_COUNT,
+  AggregateType_MAXIMUM,
+  AggregateType_MINIMUM,
+  AggregateType_STANDARD_DEVIATION,
+  AggregateType_SUM,
+  AggregateType'
+  #-}
diff --git a/gen/Amazonka/IoTSiteWise/Types/AggregatedValue.hs b/gen/Amazonka/IoTSiteWise/Types/AggregatedValue.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/IoTSiteWise/Types/AggregatedValue.hs
@@ -0,0 +1,103 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.IoTSiteWise.Types.AggregatedValue
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.IoTSiteWise.Types.AggregatedValue where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.IoTSiteWise.Types.Aggregates
+import Amazonka.IoTSiteWise.Types.Quality
+import qualified Amazonka.Prelude as Prelude
+
+-- | Contains aggregated asset property values (for example, average,
+-- minimum, and maximum).
+--
+-- /See:/ 'newAggregatedValue' smart constructor.
+data AggregatedValue = AggregatedValue'
+  { -- | The quality of the aggregated data.
+    quality :: Prelude.Maybe Quality,
+    -- | The date the aggregating computations occurred, in Unix epoch time.
+    timestamp :: Data.POSIX,
+    -- | The value of the aggregates.
+    value :: Aggregates
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'AggregatedValue' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'quality', 'aggregatedValue_quality' - The quality of the aggregated data.
+--
+-- 'timestamp', 'aggregatedValue_timestamp' - The date the aggregating computations occurred, in Unix epoch time.
+--
+-- 'value', 'aggregatedValue_value' - The value of the aggregates.
+newAggregatedValue ::
+  -- | 'timestamp'
+  Prelude.UTCTime ->
+  -- | 'value'
+  Aggregates ->
+  AggregatedValue
+newAggregatedValue pTimestamp_ pValue_ =
+  AggregatedValue'
+    { quality = Prelude.Nothing,
+      timestamp = Data._Time Lens.# pTimestamp_,
+      value = pValue_
+    }
+
+-- | The quality of the aggregated data.
+aggregatedValue_quality :: Lens.Lens' AggregatedValue (Prelude.Maybe Quality)
+aggregatedValue_quality = Lens.lens (\AggregatedValue' {quality} -> quality) (\s@AggregatedValue' {} a -> s {quality = a} :: AggregatedValue)
+
+-- | The date the aggregating computations occurred, in Unix epoch time.
+aggregatedValue_timestamp :: Lens.Lens' AggregatedValue Prelude.UTCTime
+aggregatedValue_timestamp = Lens.lens (\AggregatedValue' {timestamp} -> timestamp) (\s@AggregatedValue' {} a -> s {timestamp = a} :: AggregatedValue) Prelude.. Data._Time
+
+-- | The value of the aggregates.
+aggregatedValue_value :: Lens.Lens' AggregatedValue Aggregates
+aggregatedValue_value = Lens.lens (\AggregatedValue' {value} -> value) (\s@AggregatedValue' {} a -> s {value = a} :: AggregatedValue)
+
+instance Data.FromJSON AggregatedValue where
+  parseJSON =
+    Data.withObject
+      "AggregatedValue"
+      ( \x ->
+          AggregatedValue'
+            Prelude.<$> (x Data..:? "quality")
+            Prelude.<*> (x Data..: "timestamp")
+            Prelude.<*> (x Data..: "value")
+      )
+
+instance Prelude.Hashable AggregatedValue where
+  hashWithSalt _salt AggregatedValue' {..} =
+    _salt
+      `Prelude.hashWithSalt` quality
+      `Prelude.hashWithSalt` timestamp
+      `Prelude.hashWithSalt` value
+
+instance Prelude.NFData AggregatedValue where
+  rnf AggregatedValue' {..} =
+    Prelude.rnf quality
+      `Prelude.seq` Prelude.rnf timestamp
+      `Prelude.seq` Prelude.rnf value
diff --git a/gen/Amazonka/IoTSiteWise/Types/Aggregates.hs b/gen/Amazonka/IoTSiteWise/Types/Aggregates.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/IoTSiteWise/Types/Aggregates.hs
@@ -0,0 +1,132 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.IoTSiteWise.Types.Aggregates
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.IoTSiteWise.Types.Aggregates where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+-- | Contains the (pre-calculated) aggregate values for an asset property.
+--
+-- /See:/ 'newAggregates' smart constructor.
+data Aggregates = Aggregates'
+  { -- | The average (mean) value of the time series over a time interval window.
+    average :: Prelude.Maybe Prelude.Double,
+    -- | The count of data points in the time series over a time interval window.
+    count :: Prelude.Maybe Prelude.Double,
+    -- | The maximum value of the time series over a time interval window.
+    maximum :: Prelude.Maybe Prelude.Double,
+    -- | The minimum value of the time series over a time interval window.
+    minimum :: Prelude.Maybe Prelude.Double,
+    -- | The standard deviation of the time series over a time interval window.
+    standardDeviation :: Prelude.Maybe Prelude.Double,
+    -- | The sum of the time series over a time interval window.
+    sum :: Prelude.Maybe Prelude.Double
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'Aggregates' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'average', 'aggregates_average' - The average (mean) value of the time series over a time interval window.
+--
+-- 'count', 'aggregates_count' - The count of data points in the time series over a time interval window.
+--
+-- 'maximum', 'aggregates_maximum' - The maximum value of the time series over a time interval window.
+--
+-- 'minimum', 'aggregates_minimum' - The minimum value of the time series over a time interval window.
+--
+-- 'standardDeviation', 'aggregates_standardDeviation' - The standard deviation of the time series over a time interval window.
+--
+-- 'sum', 'aggregates_sum' - The sum of the time series over a time interval window.
+newAggregates ::
+  Aggregates
+newAggregates =
+  Aggregates'
+    { average = Prelude.Nothing,
+      count = Prelude.Nothing,
+      maximum = Prelude.Nothing,
+      minimum = Prelude.Nothing,
+      standardDeviation = Prelude.Nothing,
+      sum = Prelude.Nothing
+    }
+
+-- | The average (mean) value of the time series over a time interval window.
+aggregates_average :: Lens.Lens' Aggregates (Prelude.Maybe Prelude.Double)
+aggregates_average = Lens.lens (\Aggregates' {average} -> average) (\s@Aggregates' {} a -> s {average = a} :: Aggregates)
+
+-- | The count of data points in the time series over a time interval window.
+aggregates_count :: Lens.Lens' Aggregates (Prelude.Maybe Prelude.Double)
+aggregates_count = Lens.lens (\Aggregates' {count} -> count) (\s@Aggregates' {} a -> s {count = a} :: Aggregates)
+
+-- | The maximum value of the time series over a time interval window.
+aggregates_maximum :: Lens.Lens' Aggregates (Prelude.Maybe Prelude.Double)
+aggregates_maximum = Lens.lens (\Aggregates' {maximum} -> maximum) (\s@Aggregates' {} a -> s {maximum = a} :: Aggregates)
+
+-- | The minimum value of the time series over a time interval window.
+aggregates_minimum :: Lens.Lens' Aggregates (Prelude.Maybe Prelude.Double)
+aggregates_minimum = Lens.lens (\Aggregates' {minimum} -> minimum) (\s@Aggregates' {} a -> s {minimum = a} :: Aggregates)
+
+-- | The standard deviation of the time series over a time interval window.
+aggregates_standardDeviation :: Lens.Lens' Aggregates (Prelude.Maybe Prelude.Double)
+aggregates_standardDeviation = Lens.lens (\Aggregates' {standardDeviation} -> standardDeviation) (\s@Aggregates' {} a -> s {standardDeviation = a} :: Aggregates)
+
+-- | The sum of the time series over a time interval window.
+aggregates_sum :: Lens.Lens' Aggregates (Prelude.Maybe Prelude.Double)
+aggregates_sum = Lens.lens (\Aggregates' {sum} -> sum) (\s@Aggregates' {} a -> s {sum = a} :: Aggregates)
+
+instance Data.FromJSON Aggregates where
+  parseJSON =
+    Data.withObject
+      "Aggregates"
+      ( \x ->
+          Aggregates'
+            Prelude.<$> (x Data..:? "average")
+            Prelude.<*> (x Data..:? "count")
+            Prelude.<*> (x Data..:? "maximum")
+            Prelude.<*> (x Data..:? "minimum")
+            Prelude.<*> (x Data..:? "standardDeviation")
+            Prelude.<*> (x Data..:? "sum")
+      )
+
+instance Prelude.Hashable Aggregates where
+  hashWithSalt _salt Aggregates' {..} =
+    _salt
+      `Prelude.hashWithSalt` average
+      `Prelude.hashWithSalt` count
+      `Prelude.hashWithSalt` maximum
+      `Prelude.hashWithSalt` minimum
+      `Prelude.hashWithSalt` standardDeviation
+      `Prelude.hashWithSalt` sum
+
+instance Prelude.NFData Aggregates where
+  rnf Aggregates' {..} =
+    Prelude.rnf average
+      `Prelude.seq` Prelude.rnf count
+      `Prelude.seq` Prelude.rnf maximum
+      `Prelude.seq` Prelude.rnf minimum
+      `Prelude.seq` Prelude.rnf standardDeviation
+      `Prelude.seq` Prelude.rnf sum
diff --git a/gen/Amazonka/IoTSiteWise/Types/Alarms.hs b/gen/Amazonka/IoTSiteWise/Types/Alarms.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/IoTSiteWise/Types/Alarms.hs
@@ -0,0 +1,125 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.IoTSiteWise.Types.Alarms
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.IoTSiteWise.Types.Alarms where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+-- | Contains the configuration information of an alarm created in an IoT
+-- SiteWise Monitor portal. You can use the alarm to monitor an asset
+-- property and get notified when the asset property value is outside a
+-- specified range. For more information, see
+-- <https://docs.aws.amazon.com/iot-sitewise/latest/appguide/monitor-alarms.html Monitoring with alarms>
+-- in the /IoT SiteWise Application Guide/.
+--
+-- /See:/ 'newAlarms' smart constructor.
+data Alarms = Alarms'
+  { -- | The
+    -- <https://docs.aws.amazon.com/general/latest/gr/aws-arns-and-namespaces.html ARN>
+    -- of the Lambda function that manages alarm notifications. For more
+    -- information, see
+    -- <https://docs.aws.amazon.com/iotevents/latest/developerguide/lambda-support.html Managing alarm notifications>
+    -- in the /IoT Events Developer Guide/.
+    notificationLambdaArn :: Prelude.Maybe Prelude.Text,
+    -- | The
+    -- <https://docs.aws.amazon.com/general/latest/gr/aws-arns-and-namespaces.html ARN>
+    -- of the IAM role that allows the alarm to perform actions and access
+    -- Amazon Web Services resources and services, such as IoT Events.
+    alarmRoleArn :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'Alarms' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'notificationLambdaArn', 'alarms_notificationLambdaArn' - The
+-- <https://docs.aws.amazon.com/general/latest/gr/aws-arns-and-namespaces.html ARN>
+-- of the Lambda function that manages alarm notifications. For more
+-- information, see
+-- <https://docs.aws.amazon.com/iotevents/latest/developerguide/lambda-support.html Managing alarm notifications>
+-- in the /IoT Events Developer Guide/.
+--
+-- 'alarmRoleArn', 'alarms_alarmRoleArn' - The
+-- <https://docs.aws.amazon.com/general/latest/gr/aws-arns-and-namespaces.html ARN>
+-- of the IAM role that allows the alarm to perform actions and access
+-- Amazon Web Services resources and services, such as IoT Events.
+newAlarms ::
+  -- | 'alarmRoleArn'
+  Prelude.Text ->
+  Alarms
+newAlarms pAlarmRoleArn_ =
+  Alarms'
+    { notificationLambdaArn = Prelude.Nothing,
+      alarmRoleArn = pAlarmRoleArn_
+    }
+
+-- | The
+-- <https://docs.aws.amazon.com/general/latest/gr/aws-arns-and-namespaces.html ARN>
+-- of the Lambda function that manages alarm notifications. For more
+-- information, see
+-- <https://docs.aws.amazon.com/iotevents/latest/developerguide/lambda-support.html Managing alarm notifications>
+-- in the /IoT Events Developer Guide/.
+alarms_notificationLambdaArn :: Lens.Lens' Alarms (Prelude.Maybe Prelude.Text)
+alarms_notificationLambdaArn = Lens.lens (\Alarms' {notificationLambdaArn} -> notificationLambdaArn) (\s@Alarms' {} a -> s {notificationLambdaArn = a} :: Alarms)
+
+-- | The
+-- <https://docs.aws.amazon.com/general/latest/gr/aws-arns-and-namespaces.html ARN>
+-- of the IAM role that allows the alarm to perform actions and access
+-- Amazon Web Services resources and services, such as IoT Events.
+alarms_alarmRoleArn :: Lens.Lens' Alarms Prelude.Text
+alarms_alarmRoleArn = Lens.lens (\Alarms' {alarmRoleArn} -> alarmRoleArn) (\s@Alarms' {} a -> s {alarmRoleArn = a} :: Alarms)
+
+instance Data.FromJSON Alarms where
+  parseJSON =
+    Data.withObject
+      "Alarms"
+      ( \x ->
+          Alarms'
+            Prelude.<$> (x Data..:? "notificationLambdaArn")
+            Prelude.<*> (x Data..: "alarmRoleArn")
+      )
+
+instance Prelude.Hashable Alarms where
+  hashWithSalt _salt Alarms' {..} =
+    _salt
+      `Prelude.hashWithSalt` notificationLambdaArn
+      `Prelude.hashWithSalt` alarmRoleArn
+
+instance Prelude.NFData Alarms where
+  rnf Alarms' {..} =
+    Prelude.rnf notificationLambdaArn
+      `Prelude.seq` Prelude.rnf alarmRoleArn
+
+instance Data.ToJSON Alarms where
+  toJSON Alarms' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("notificationLambdaArn" Data..=)
+              Prelude.<$> notificationLambdaArn,
+            Prelude.Just ("alarmRoleArn" Data..= alarmRoleArn)
+          ]
+      )
diff --git a/gen/Amazonka/IoTSiteWise/Types/AssetCompositeModel.hs b/gen/Amazonka/IoTSiteWise/Types/AssetCompositeModel.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/IoTSiteWise/Types/AssetCompositeModel.hs
@@ -0,0 +1,129 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.IoTSiteWise.Types.AssetCompositeModel
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.IoTSiteWise.Types.AssetCompositeModel where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.IoTSiteWise.Types.AssetProperty
+import qualified Amazonka.Prelude as Prelude
+
+-- | Contains information about a composite model in an asset. This object
+-- contains the asset\'s properties that you define in the composite model.
+--
+-- /See:/ 'newAssetCompositeModel' smart constructor.
+data AssetCompositeModel = AssetCompositeModel'
+  { -- | The description of the composite model.
+    description :: Prelude.Maybe Prelude.Text,
+    -- | The ID of the asset composite model.
+    id :: Prelude.Maybe Prelude.Text,
+    -- | The name of the composite model.
+    name :: Prelude.Text,
+    -- | The type of the composite model. For alarm composite models, this type
+    -- is @AWS\/ALARM@.
+    type' :: Prelude.Text,
+    -- | The asset properties that this composite model defines.
+    properties :: [AssetProperty]
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'AssetCompositeModel' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'description', 'assetCompositeModel_description' - The description of the composite model.
+--
+-- 'id', 'assetCompositeModel_id' - The ID of the asset composite model.
+--
+-- 'name', 'assetCompositeModel_name' - The name of the composite model.
+--
+-- 'type'', 'assetCompositeModel_type' - The type of the composite model. For alarm composite models, this type
+-- is @AWS\/ALARM@.
+--
+-- 'properties', 'assetCompositeModel_properties' - The asset properties that this composite model defines.
+newAssetCompositeModel ::
+  -- | 'name'
+  Prelude.Text ->
+  -- | 'type''
+  Prelude.Text ->
+  AssetCompositeModel
+newAssetCompositeModel pName_ pType_ =
+  AssetCompositeModel'
+    { description = Prelude.Nothing,
+      id = Prelude.Nothing,
+      name = pName_,
+      type' = pType_,
+      properties = Prelude.mempty
+    }
+
+-- | The description of the composite model.
+assetCompositeModel_description :: Lens.Lens' AssetCompositeModel (Prelude.Maybe Prelude.Text)
+assetCompositeModel_description = Lens.lens (\AssetCompositeModel' {description} -> description) (\s@AssetCompositeModel' {} a -> s {description = a} :: AssetCompositeModel)
+
+-- | The ID of the asset composite model.
+assetCompositeModel_id :: Lens.Lens' AssetCompositeModel (Prelude.Maybe Prelude.Text)
+assetCompositeModel_id = Lens.lens (\AssetCompositeModel' {id} -> id) (\s@AssetCompositeModel' {} a -> s {id = a} :: AssetCompositeModel)
+
+-- | The name of the composite model.
+assetCompositeModel_name :: Lens.Lens' AssetCompositeModel Prelude.Text
+assetCompositeModel_name = Lens.lens (\AssetCompositeModel' {name} -> name) (\s@AssetCompositeModel' {} a -> s {name = a} :: AssetCompositeModel)
+
+-- | The type of the composite model. For alarm composite models, this type
+-- is @AWS\/ALARM@.
+assetCompositeModel_type :: Lens.Lens' AssetCompositeModel Prelude.Text
+assetCompositeModel_type = Lens.lens (\AssetCompositeModel' {type'} -> type') (\s@AssetCompositeModel' {} a -> s {type' = a} :: AssetCompositeModel)
+
+-- | The asset properties that this composite model defines.
+assetCompositeModel_properties :: Lens.Lens' AssetCompositeModel [AssetProperty]
+assetCompositeModel_properties = Lens.lens (\AssetCompositeModel' {properties} -> properties) (\s@AssetCompositeModel' {} a -> s {properties = a} :: AssetCompositeModel) Prelude.. Lens.coerced
+
+instance Data.FromJSON AssetCompositeModel where
+  parseJSON =
+    Data.withObject
+      "AssetCompositeModel"
+      ( \x ->
+          AssetCompositeModel'
+            Prelude.<$> (x Data..:? "description")
+            Prelude.<*> (x Data..:? "id")
+            Prelude.<*> (x Data..: "name")
+            Prelude.<*> (x Data..: "type")
+            Prelude.<*> (x Data..:? "properties" Data..!= Prelude.mempty)
+      )
+
+instance Prelude.Hashable AssetCompositeModel where
+  hashWithSalt _salt AssetCompositeModel' {..} =
+    _salt
+      `Prelude.hashWithSalt` description
+      `Prelude.hashWithSalt` id
+      `Prelude.hashWithSalt` name
+      `Prelude.hashWithSalt` type'
+      `Prelude.hashWithSalt` properties
+
+instance Prelude.NFData AssetCompositeModel where
+  rnf AssetCompositeModel' {..} =
+    Prelude.rnf description
+      `Prelude.seq` Prelude.rnf id
+      `Prelude.seq` Prelude.rnf name
+      `Prelude.seq` Prelude.rnf type'
+      `Prelude.seq` Prelude.rnf properties
diff --git a/gen/Amazonka/IoTSiteWise/Types/AssetErrorCode.hs b/gen/Amazonka/IoTSiteWise/Types/AssetErrorCode.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/IoTSiteWise/Types/AssetErrorCode.hs
@@ -0,0 +1,66 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DerivingStrategies #-}
+{-# LANGUAGE GeneralizedNewtypeDeriving #-}
+{-# LANGUAGE LambdaCase #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE PatternSynonyms #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.IoTSiteWise.Types.AssetErrorCode
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.IoTSiteWise.Types.AssetErrorCode
+  ( AssetErrorCode
+      ( ..,
+        AssetErrorCode_INTERNAL_FAILURE
+      ),
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+newtype AssetErrorCode = AssetErrorCode'
+  { fromAssetErrorCode ::
+      Data.Text
+  }
+  deriving stock
+    ( Prelude.Show,
+      Prelude.Read,
+      Prelude.Eq,
+      Prelude.Ord,
+      Prelude.Generic
+    )
+  deriving newtype
+    ( Prelude.Hashable,
+      Prelude.NFData,
+      Data.FromText,
+      Data.ToText,
+      Data.ToByteString,
+      Data.ToLog,
+      Data.ToHeader,
+      Data.ToQuery,
+      Data.FromJSON,
+      Data.FromJSONKey,
+      Data.ToJSON,
+      Data.ToJSONKey,
+      Data.FromXML,
+      Data.ToXML
+    )
+
+pattern AssetErrorCode_INTERNAL_FAILURE :: AssetErrorCode
+pattern AssetErrorCode_INTERNAL_FAILURE = AssetErrorCode' "INTERNAL_FAILURE"
+
+{-# COMPLETE
+  AssetErrorCode_INTERNAL_FAILURE,
+  AssetErrorCode'
+  #-}
diff --git a/gen/Amazonka/IoTSiteWise/Types/AssetErrorDetails.hs b/gen/Amazonka/IoTSiteWise/Types/AssetErrorDetails.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/IoTSiteWise/Types/AssetErrorDetails.hs
@@ -0,0 +1,103 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.IoTSiteWise.Types.AssetErrorDetails
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.IoTSiteWise.Types.AssetErrorDetails where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.IoTSiteWise.Types.AssetErrorCode
+import qualified Amazonka.Prelude as Prelude
+
+-- | Contains error details for the requested associate project asset action.
+--
+-- /See:/ 'newAssetErrorDetails' smart constructor.
+data AssetErrorDetails = AssetErrorDetails'
+  { -- | The ID of the asset.
+    assetId :: Prelude.Text,
+    -- | The error code.
+    code :: AssetErrorCode,
+    -- | The error message.
+    message :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'AssetErrorDetails' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'assetId', 'assetErrorDetails_assetId' - The ID of the asset.
+--
+-- 'code', 'assetErrorDetails_code' - The error code.
+--
+-- 'message', 'assetErrorDetails_message' - The error message.
+newAssetErrorDetails ::
+  -- | 'assetId'
+  Prelude.Text ->
+  -- | 'code'
+  AssetErrorCode ->
+  -- | 'message'
+  Prelude.Text ->
+  AssetErrorDetails
+newAssetErrorDetails pAssetId_ pCode_ pMessage_ =
+  AssetErrorDetails'
+    { assetId = pAssetId_,
+      code = pCode_,
+      message = pMessage_
+    }
+
+-- | The ID of the asset.
+assetErrorDetails_assetId :: Lens.Lens' AssetErrorDetails Prelude.Text
+assetErrorDetails_assetId = Lens.lens (\AssetErrorDetails' {assetId} -> assetId) (\s@AssetErrorDetails' {} a -> s {assetId = a} :: AssetErrorDetails)
+
+-- | The error code.
+assetErrorDetails_code :: Lens.Lens' AssetErrorDetails AssetErrorCode
+assetErrorDetails_code = Lens.lens (\AssetErrorDetails' {code} -> code) (\s@AssetErrorDetails' {} a -> s {code = a} :: AssetErrorDetails)
+
+-- | The error message.
+assetErrorDetails_message :: Lens.Lens' AssetErrorDetails Prelude.Text
+assetErrorDetails_message = Lens.lens (\AssetErrorDetails' {message} -> message) (\s@AssetErrorDetails' {} a -> s {message = a} :: AssetErrorDetails)
+
+instance Data.FromJSON AssetErrorDetails where
+  parseJSON =
+    Data.withObject
+      "AssetErrorDetails"
+      ( \x ->
+          AssetErrorDetails'
+            Prelude.<$> (x Data..: "assetId")
+            Prelude.<*> (x Data..: "code")
+            Prelude.<*> (x Data..: "message")
+      )
+
+instance Prelude.Hashable AssetErrorDetails where
+  hashWithSalt _salt AssetErrorDetails' {..} =
+    _salt
+      `Prelude.hashWithSalt` assetId
+      `Prelude.hashWithSalt` code
+      `Prelude.hashWithSalt` message
+
+instance Prelude.NFData AssetErrorDetails where
+  rnf AssetErrorDetails' {..} =
+    Prelude.rnf assetId
+      `Prelude.seq` Prelude.rnf code
+      `Prelude.seq` Prelude.rnf message
diff --git a/gen/Amazonka/IoTSiteWise/Types/AssetHierarchy.hs b/gen/Amazonka/IoTSiteWise/Types/AssetHierarchy.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/IoTSiteWise/Types/AssetHierarchy.hs
@@ -0,0 +1,97 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.IoTSiteWise.Types.AssetHierarchy
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.IoTSiteWise.Types.AssetHierarchy where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+-- | Describes an asset hierarchy that contains a hierarchy\'s name and ID.
+--
+-- /See:/ 'newAssetHierarchy' smart constructor.
+data AssetHierarchy = AssetHierarchy'
+  { -- | The ID of the hierarchy. This ID is a @hierarchyId@.
+    id :: Prelude.Maybe Prelude.Text,
+    -- | The hierarchy name provided in the
+    -- <https://docs.aws.amazon.com/iot-sitewise/latest/APIReference/API_CreateAssetModel.html CreateAssetModel>
+    -- or
+    -- <https://docs.aws.amazon.com/iot-sitewise/latest/APIReference/API_UpdateAssetModel.html UpdateAssetModel>
+    -- API operation.
+    name :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'AssetHierarchy' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'id', 'assetHierarchy_id' - The ID of the hierarchy. This ID is a @hierarchyId@.
+--
+-- 'name', 'assetHierarchy_name' - The hierarchy name provided in the
+-- <https://docs.aws.amazon.com/iot-sitewise/latest/APIReference/API_CreateAssetModel.html CreateAssetModel>
+-- or
+-- <https://docs.aws.amazon.com/iot-sitewise/latest/APIReference/API_UpdateAssetModel.html UpdateAssetModel>
+-- API operation.
+newAssetHierarchy ::
+  -- | 'name'
+  Prelude.Text ->
+  AssetHierarchy
+newAssetHierarchy pName_ =
+  AssetHierarchy'
+    { id = Prelude.Nothing,
+      name = pName_
+    }
+
+-- | The ID of the hierarchy. This ID is a @hierarchyId@.
+assetHierarchy_id :: Lens.Lens' AssetHierarchy (Prelude.Maybe Prelude.Text)
+assetHierarchy_id = Lens.lens (\AssetHierarchy' {id} -> id) (\s@AssetHierarchy' {} a -> s {id = a} :: AssetHierarchy)
+
+-- | The hierarchy name provided in the
+-- <https://docs.aws.amazon.com/iot-sitewise/latest/APIReference/API_CreateAssetModel.html CreateAssetModel>
+-- or
+-- <https://docs.aws.amazon.com/iot-sitewise/latest/APIReference/API_UpdateAssetModel.html UpdateAssetModel>
+-- API operation.
+assetHierarchy_name :: Lens.Lens' AssetHierarchy Prelude.Text
+assetHierarchy_name = Lens.lens (\AssetHierarchy' {name} -> name) (\s@AssetHierarchy' {} a -> s {name = a} :: AssetHierarchy)
+
+instance Data.FromJSON AssetHierarchy where
+  parseJSON =
+    Data.withObject
+      "AssetHierarchy"
+      ( \x ->
+          AssetHierarchy'
+            Prelude.<$> (x Data..:? "id")
+            Prelude.<*> (x Data..: "name")
+      )
+
+instance Prelude.Hashable AssetHierarchy where
+  hashWithSalt _salt AssetHierarchy' {..} =
+    _salt
+      `Prelude.hashWithSalt` id
+      `Prelude.hashWithSalt` name
+
+instance Prelude.NFData AssetHierarchy where
+  rnf AssetHierarchy' {..} =
+    Prelude.rnf id `Prelude.seq` Prelude.rnf name
diff --git a/gen/Amazonka/IoTSiteWise/Types/AssetHierarchyInfo.hs b/gen/Amazonka/IoTSiteWise/Types/AssetHierarchyInfo.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/IoTSiteWise/Types/AssetHierarchyInfo.hs
@@ -0,0 +1,85 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.IoTSiteWise.Types.AssetHierarchyInfo
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.IoTSiteWise.Types.AssetHierarchyInfo where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+-- | Contains information about a parent asset and a child asset that are
+-- related through an asset hierarchy.
+--
+-- /See:/ 'newAssetHierarchyInfo' smart constructor.
+data AssetHierarchyInfo = AssetHierarchyInfo'
+  { -- | The ID of the child asset in this asset relationship.
+    childAssetId :: Prelude.Maybe Prelude.Text,
+    -- | The ID of the parent asset in this asset relationship.
+    parentAssetId :: Prelude.Maybe Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'AssetHierarchyInfo' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'childAssetId', 'assetHierarchyInfo_childAssetId' - The ID of the child asset in this asset relationship.
+--
+-- 'parentAssetId', 'assetHierarchyInfo_parentAssetId' - The ID of the parent asset in this asset relationship.
+newAssetHierarchyInfo ::
+  AssetHierarchyInfo
+newAssetHierarchyInfo =
+  AssetHierarchyInfo'
+    { childAssetId = Prelude.Nothing,
+      parentAssetId = Prelude.Nothing
+    }
+
+-- | The ID of the child asset in this asset relationship.
+assetHierarchyInfo_childAssetId :: Lens.Lens' AssetHierarchyInfo (Prelude.Maybe Prelude.Text)
+assetHierarchyInfo_childAssetId = Lens.lens (\AssetHierarchyInfo' {childAssetId} -> childAssetId) (\s@AssetHierarchyInfo' {} a -> s {childAssetId = a} :: AssetHierarchyInfo)
+
+-- | The ID of the parent asset in this asset relationship.
+assetHierarchyInfo_parentAssetId :: Lens.Lens' AssetHierarchyInfo (Prelude.Maybe Prelude.Text)
+assetHierarchyInfo_parentAssetId = Lens.lens (\AssetHierarchyInfo' {parentAssetId} -> parentAssetId) (\s@AssetHierarchyInfo' {} a -> s {parentAssetId = a} :: AssetHierarchyInfo)
+
+instance Data.FromJSON AssetHierarchyInfo where
+  parseJSON =
+    Data.withObject
+      "AssetHierarchyInfo"
+      ( \x ->
+          AssetHierarchyInfo'
+            Prelude.<$> (x Data..:? "childAssetId")
+            Prelude.<*> (x Data..:? "parentAssetId")
+      )
+
+instance Prelude.Hashable AssetHierarchyInfo where
+  hashWithSalt _salt AssetHierarchyInfo' {..} =
+    _salt
+      `Prelude.hashWithSalt` childAssetId
+      `Prelude.hashWithSalt` parentAssetId
+
+instance Prelude.NFData AssetHierarchyInfo where
+  rnf AssetHierarchyInfo' {..} =
+    Prelude.rnf childAssetId
+      `Prelude.seq` Prelude.rnf parentAssetId
diff --git a/gen/Amazonka/IoTSiteWise/Types/AssetModelCompositeModel.hs b/gen/Amazonka/IoTSiteWise/Types/AssetModelCompositeModel.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/IoTSiteWise/Types/AssetModelCompositeModel.hs
@@ -0,0 +1,143 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.IoTSiteWise.Types.AssetModelCompositeModel
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.IoTSiteWise.Types.AssetModelCompositeModel where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.IoTSiteWise.Types.AssetModelProperty
+import qualified Amazonka.Prelude as Prelude
+
+-- | Contains information about a composite model in an asset model. This
+-- object contains the asset property definitions that you define in the
+-- composite model.
+--
+-- /See:/ 'newAssetModelCompositeModel' smart constructor.
+data AssetModelCompositeModel = AssetModelCompositeModel'
+  { -- | The description of the composite model.
+    description :: Prelude.Maybe Prelude.Text,
+    -- | The ID of the asset model composite model.
+    id :: Prelude.Maybe Prelude.Text,
+    -- | The asset property definitions for this composite model.
+    properties :: Prelude.Maybe [AssetModelProperty],
+    -- | The name of the composite model.
+    name :: Prelude.Text,
+    -- | The type of the composite model. For alarm composite models, this type
+    -- is @AWS\/ALARM@.
+    type' :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'AssetModelCompositeModel' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'description', 'assetModelCompositeModel_description' - The description of the composite model.
+--
+-- 'id', 'assetModelCompositeModel_id' - The ID of the asset model composite model.
+--
+-- 'properties', 'assetModelCompositeModel_properties' - The asset property definitions for this composite model.
+--
+-- 'name', 'assetModelCompositeModel_name' - The name of the composite model.
+--
+-- 'type'', 'assetModelCompositeModel_type' - The type of the composite model. For alarm composite models, this type
+-- is @AWS\/ALARM@.
+newAssetModelCompositeModel ::
+  -- | 'name'
+  Prelude.Text ->
+  -- | 'type''
+  Prelude.Text ->
+  AssetModelCompositeModel
+newAssetModelCompositeModel pName_ pType_ =
+  AssetModelCompositeModel'
+    { description =
+        Prelude.Nothing,
+      id = Prelude.Nothing,
+      properties = Prelude.Nothing,
+      name = pName_,
+      type' = pType_
+    }
+
+-- | The description of the composite model.
+assetModelCompositeModel_description :: Lens.Lens' AssetModelCompositeModel (Prelude.Maybe Prelude.Text)
+assetModelCompositeModel_description = Lens.lens (\AssetModelCompositeModel' {description} -> description) (\s@AssetModelCompositeModel' {} a -> s {description = a} :: AssetModelCompositeModel)
+
+-- | The ID of the asset model composite model.
+assetModelCompositeModel_id :: Lens.Lens' AssetModelCompositeModel (Prelude.Maybe Prelude.Text)
+assetModelCompositeModel_id = Lens.lens (\AssetModelCompositeModel' {id} -> id) (\s@AssetModelCompositeModel' {} a -> s {id = a} :: AssetModelCompositeModel)
+
+-- | The asset property definitions for this composite model.
+assetModelCompositeModel_properties :: Lens.Lens' AssetModelCompositeModel (Prelude.Maybe [AssetModelProperty])
+assetModelCompositeModel_properties = Lens.lens (\AssetModelCompositeModel' {properties} -> properties) (\s@AssetModelCompositeModel' {} a -> s {properties = a} :: AssetModelCompositeModel) Prelude.. Lens.mapping Lens.coerced
+
+-- | The name of the composite model.
+assetModelCompositeModel_name :: Lens.Lens' AssetModelCompositeModel Prelude.Text
+assetModelCompositeModel_name = Lens.lens (\AssetModelCompositeModel' {name} -> name) (\s@AssetModelCompositeModel' {} a -> s {name = a} :: AssetModelCompositeModel)
+
+-- | The type of the composite model. For alarm composite models, this type
+-- is @AWS\/ALARM@.
+assetModelCompositeModel_type :: Lens.Lens' AssetModelCompositeModel Prelude.Text
+assetModelCompositeModel_type = Lens.lens (\AssetModelCompositeModel' {type'} -> type') (\s@AssetModelCompositeModel' {} a -> s {type' = a} :: AssetModelCompositeModel)
+
+instance Data.FromJSON AssetModelCompositeModel where
+  parseJSON =
+    Data.withObject
+      "AssetModelCompositeModel"
+      ( \x ->
+          AssetModelCompositeModel'
+            Prelude.<$> (x Data..:? "description")
+            Prelude.<*> (x Data..:? "id")
+            Prelude.<*> (x Data..:? "properties" Data..!= Prelude.mempty)
+            Prelude.<*> (x Data..: "name")
+            Prelude.<*> (x Data..: "type")
+      )
+
+instance Prelude.Hashable AssetModelCompositeModel where
+  hashWithSalt _salt AssetModelCompositeModel' {..} =
+    _salt
+      `Prelude.hashWithSalt` description
+      `Prelude.hashWithSalt` id
+      `Prelude.hashWithSalt` properties
+      `Prelude.hashWithSalt` name
+      `Prelude.hashWithSalt` type'
+
+instance Prelude.NFData AssetModelCompositeModel where
+  rnf AssetModelCompositeModel' {..} =
+    Prelude.rnf description
+      `Prelude.seq` Prelude.rnf id
+      `Prelude.seq` Prelude.rnf properties
+      `Prelude.seq` Prelude.rnf name
+      `Prelude.seq` Prelude.rnf type'
+
+instance Data.ToJSON AssetModelCompositeModel where
+  toJSON AssetModelCompositeModel' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("description" Data..=) Prelude.<$> description,
+            ("id" Data..=) Prelude.<$> id,
+            ("properties" Data..=) Prelude.<$> properties,
+            Prelude.Just ("name" Data..= name),
+            Prelude.Just ("type" Data..= type')
+          ]
+      )
diff --git a/gen/Amazonka/IoTSiteWise/Types/AssetModelCompositeModelDefinition.hs b/gen/Amazonka/IoTSiteWise/Types/AssetModelCompositeModelDefinition.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/IoTSiteWise/Types/AssetModelCompositeModelDefinition.hs
@@ -0,0 +1,128 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.IoTSiteWise.Types.AssetModelCompositeModelDefinition
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.IoTSiteWise.Types.AssetModelCompositeModelDefinition where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.IoTSiteWise.Types.AssetModelPropertyDefinition
+import qualified Amazonka.Prelude as Prelude
+
+-- | Contains a composite model definition in an asset model. This composite
+-- model definition is applied to all assets created from the asset model.
+--
+-- /See:/ 'newAssetModelCompositeModelDefinition' smart constructor.
+data AssetModelCompositeModelDefinition = AssetModelCompositeModelDefinition'
+  { -- | The description of the composite model.
+    description :: Prelude.Maybe Prelude.Text,
+    -- | The asset property definitions for this composite model.
+    properties :: Prelude.Maybe [AssetModelPropertyDefinition],
+    -- | The name of the composite model.
+    name :: Prelude.Text,
+    -- | The type of the composite model. For alarm composite models, this type
+    -- is @AWS\/ALARM@.
+    type' :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'AssetModelCompositeModelDefinition' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'description', 'assetModelCompositeModelDefinition_description' - The description of the composite model.
+--
+-- 'properties', 'assetModelCompositeModelDefinition_properties' - The asset property definitions for this composite model.
+--
+-- 'name', 'assetModelCompositeModelDefinition_name' - The name of the composite model.
+--
+-- 'type'', 'assetModelCompositeModelDefinition_type' - The type of the composite model. For alarm composite models, this type
+-- is @AWS\/ALARM@.
+newAssetModelCompositeModelDefinition ::
+  -- | 'name'
+  Prelude.Text ->
+  -- | 'type''
+  Prelude.Text ->
+  AssetModelCompositeModelDefinition
+newAssetModelCompositeModelDefinition pName_ pType_ =
+  AssetModelCompositeModelDefinition'
+    { description =
+        Prelude.Nothing,
+      properties = Prelude.Nothing,
+      name = pName_,
+      type' = pType_
+    }
+
+-- | The description of the composite model.
+assetModelCompositeModelDefinition_description :: Lens.Lens' AssetModelCompositeModelDefinition (Prelude.Maybe Prelude.Text)
+assetModelCompositeModelDefinition_description = Lens.lens (\AssetModelCompositeModelDefinition' {description} -> description) (\s@AssetModelCompositeModelDefinition' {} a -> s {description = a} :: AssetModelCompositeModelDefinition)
+
+-- | The asset property definitions for this composite model.
+assetModelCompositeModelDefinition_properties :: Lens.Lens' AssetModelCompositeModelDefinition (Prelude.Maybe [AssetModelPropertyDefinition])
+assetModelCompositeModelDefinition_properties = Lens.lens (\AssetModelCompositeModelDefinition' {properties} -> properties) (\s@AssetModelCompositeModelDefinition' {} a -> s {properties = a} :: AssetModelCompositeModelDefinition) Prelude.. Lens.mapping Lens.coerced
+
+-- | The name of the composite model.
+assetModelCompositeModelDefinition_name :: Lens.Lens' AssetModelCompositeModelDefinition Prelude.Text
+assetModelCompositeModelDefinition_name = Lens.lens (\AssetModelCompositeModelDefinition' {name} -> name) (\s@AssetModelCompositeModelDefinition' {} a -> s {name = a} :: AssetModelCompositeModelDefinition)
+
+-- | The type of the composite model. For alarm composite models, this type
+-- is @AWS\/ALARM@.
+assetModelCompositeModelDefinition_type :: Lens.Lens' AssetModelCompositeModelDefinition Prelude.Text
+assetModelCompositeModelDefinition_type = Lens.lens (\AssetModelCompositeModelDefinition' {type'} -> type') (\s@AssetModelCompositeModelDefinition' {} a -> s {type' = a} :: AssetModelCompositeModelDefinition)
+
+instance
+  Prelude.Hashable
+    AssetModelCompositeModelDefinition
+  where
+  hashWithSalt
+    _salt
+    AssetModelCompositeModelDefinition' {..} =
+      _salt
+        `Prelude.hashWithSalt` description
+        `Prelude.hashWithSalt` properties
+        `Prelude.hashWithSalt` name
+        `Prelude.hashWithSalt` type'
+
+instance
+  Prelude.NFData
+    AssetModelCompositeModelDefinition
+  where
+  rnf AssetModelCompositeModelDefinition' {..} =
+    Prelude.rnf description
+      `Prelude.seq` Prelude.rnf properties
+      `Prelude.seq` Prelude.rnf name
+      `Prelude.seq` Prelude.rnf type'
+
+instance
+  Data.ToJSON
+    AssetModelCompositeModelDefinition
+  where
+  toJSON AssetModelCompositeModelDefinition' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("description" Data..=) Prelude.<$> description,
+            ("properties" Data..=) Prelude.<$> properties,
+            Prelude.Just ("name" Data..= name),
+            Prelude.Just ("type" Data..= type')
+          ]
+      )
diff --git a/gen/Amazonka/IoTSiteWise/Types/AssetModelHierarchy.hs b/gen/Amazonka/IoTSiteWise/Types/AssetModelHierarchy.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/IoTSiteWise/Types/AssetModelHierarchy.hs
@@ -0,0 +1,128 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.IoTSiteWise.Types.AssetModelHierarchy
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.IoTSiteWise.Types.AssetModelHierarchy where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+-- | Describes an asset hierarchy that contains a hierarchy\'s name, ID, and
+-- child asset model ID that specifies the type of asset that can be in
+-- this hierarchy.
+--
+-- /See:/ 'newAssetModelHierarchy' smart constructor.
+data AssetModelHierarchy = AssetModelHierarchy'
+  { -- | The ID of the asset model hierarchy. This ID is a @hierarchyId@.
+    id :: Prelude.Maybe Prelude.Text,
+    -- | The name of the asset model hierarchy that you specify by using the
+    -- <https://docs.aws.amazon.com/iot-sitewise/latest/APIReference/API_CreateAssetModel.html CreateAssetModel>
+    -- or
+    -- <https://docs.aws.amazon.com/iot-sitewise/latest/APIReference/API_UpdateAssetModel.html UpdateAssetModel>
+    -- API operation.
+    name :: Prelude.Text,
+    -- | The ID of the asset model. All assets in this hierarchy must be
+    -- instances of the @childAssetModelId@ asset model.
+    childAssetModelId :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'AssetModelHierarchy' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'id', 'assetModelHierarchy_id' - The ID of the asset model hierarchy. This ID is a @hierarchyId@.
+--
+-- 'name', 'assetModelHierarchy_name' - The name of the asset model hierarchy that you specify by using the
+-- <https://docs.aws.amazon.com/iot-sitewise/latest/APIReference/API_CreateAssetModel.html CreateAssetModel>
+-- or
+-- <https://docs.aws.amazon.com/iot-sitewise/latest/APIReference/API_UpdateAssetModel.html UpdateAssetModel>
+-- API operation.
+--
+-- 'childAssetModelId', 'assetModelHierarchy_childAssetModelId' - The ID of the asset model. All assets in this hierarchy must be
+-- instances of the @childAssetModelId@ asset model.
+newAssetModelHierarchy ::
+  -- | 'name'
+  Prelude.Text ->
+  -- | 'childAssetModelId'
+  Prelude.Text ->
+  AssetModelHierarchy
+newAssetModelHierarchy pName_ pChildAssetModelId_ =
+  AssetModelHierarchy'
+    { id = Prelude.Nothing,
+      name = pName_,
+      childAssetModelId = pChildAssetModelId_
+    }
+
+-- | The ID of the asset model hierarchy. This ID is a @hierarchyId@.
+assetModelHierarchy_id :: Lens.Lens' AssetModelHierarchy (Prelude.Maybe Prelude.Text)
+assetModelHierarchy_id = Lens.lens (\AssetModelHierarchy' {id} -> id) (\s@AssetModelHierarchy' {} a -> s {id = a} :: AssetModelHierarchy)
+
+-- | The name of the asset model hierarchy that you specify by using the
+-- <https://docs.aws.amazon.com/iot-sitewise/latest/APIReference/API_CreateAssetModel.html CreateAssetModel>
+-- or
+-- <https://docs.aws.amazon.com/iot-sitewise/latest/APIReference/API_UpdateAssetModel.html UpdateAssetModel>
+-- API operation.
+assetModelHierarchy_name :: Lens.Lens' AssetModelHierarchy Prelude.Text
+assetModelHierarchy_name = Lens.lens (\AssetModelHierarchy' {name} -> name) (\s@AssetModelHierarchy' {} a -> s {name = a} :: AssetModelHierarchy)
+
+-- | The ID of the asset model. All assets in this hierarchy must be
+-- instances of the @childAssetModelId@ asset model.
+assetModelHierarchy_childAssetModelId :: Lens.Lens' AssetModelHierarchy Prelude.Text
+assetModelHierarchy_childAssetModelId = Lens.lens (\AssetModelHierarchy' {childAssetModelId} -> childAssetModelId) (\s@AssetModelHierarchy' {} a -> s {childAssetModelId = a} :: AssetModelHierarchy)
+
+instance Data.FromJSON AssetModelHierarchy where
+  parseJSON =
+    Data.withObject
+      "AssetModelHierarchy"
+      ( \x ->
+          AssetModelHierarchy'
+            Prelude.<$> (x Data..:? "id")
+            Prelude.<*> (x Data..: "name")
+            Prelude.<*> (x Data..: "childAssetModelId")
+      )
+
+instance Prelude.Hashable AssetModelHierarchy where
+  hashWithSalt _salt AssetModelHierarchy' {..} =
+    _salt
+      `Prelude.hashWithSalt` id
+      `Prelude.hashWithSalt` name
+      `Prelude.hashWithSalt` childAssetModelId
+
+instance Prelude.NFData AssetModelHierarchy where
+  rnf AssetModelHierarchy' {..} =
+    Prelude.rnf id
+      `Prelude.seq` Prelude.rnf name
+      `Prelude.seq` Prelude.rnf childAssetModelId
+
+instance Data.ToJSON AssetModelHierarchy where
+  toJSON AssetModelHierarchy' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("id" Data..=) Prelude.<$> id,
+            Prelude.Just ("name" Data..= name),
+            Prelude.Just
+              ("childAssetModelId" Data..= childAssetModelId)
+          ]
+      )
diff --git a/gen/Amazonka/IoTSiteWise/Types/AssetModelHierarchyDefinition.hs b/gen/Amazonka/IoTSiteWise/Types/AssetModelHierarchyDefinition.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/IoTSiteWise/Types/AssetModelHierarchyDefinition.hs
@@ -0,0 +1,107 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.IoTSiteWise.Types.AssetModelHierarchyDefinition
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.IoTSiteWise.Types.AssetModelHierarchyDefinition where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+-- | Contains an asset model hierarchy used in asset model creation. An asset
+-- model hierarchy determines the kind (or type) of asset that can belong
+-- to a hierarchy.
+--
+-- /See:/ 'newAssetModelHierarchyDefinition' smart constructor.
+data AssetModelHierarchyDefinition = AssetModelHierarchyDefinition'
+  { -- | The name of the asset model hierarchy definition (as specified in the
+    -- <https://docs.aws.amazon.com/iot-sitewise/latest/APIReference/API_CreateAssetModel.html CreateAssetModel>
+    -- or
+    -- <https://docs.aws.amazon.com/iot-sitewise/latest/APIReference/API_UpdateAssetModel.html UpdateAssetModel>
+    -- API operation).
+    name :: Prelude.Text,
+    -- | The ID of an asset model for this hierarchy.
+    childAssetModelId :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'AssetModelHierarchyDefinition' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'name', 'assetModelHierarchyDefinition_name' - The name of the asset model hierarchy definition (as specified in the
+-- <https://docs.aws.amazon.com/iot-sitewise/latest/APIReference/API_CreateAssetModel.html CreateAssetModel>
+-- or
+-- <https://docs.aws.amazon.com/iot-sitewise/latest/APIReference/API_UpdateAssetModel.html UpdateAssetModel>
+-- API operation).
+--
+-- 'childAssetModelId', 'assetModelHierarchyDefinition_childAssetModelId' - The ID of an asset model for this hierarchy.
+newAssetModelHierarchyDefinition ::
+  -- | 'name'
+  Prelude.Text ->
+  -- | 'childAssetModelId'
+  Prelude.Text ->
+  AssetModelHierarchyDefinition
+newAssetModelHierarchyDefinition
+  pName_
+  pChildAssetModelId_ =
+    AssetModelHierarchyDefinition'
+      { name = pName_,
+        childAssetModelId = pChildAssetModelId_
+      }
+
+-- | The name of the asset model hierarchy definition (as specified in the
+-- <https://docs.aws.amazon.com/iot-sitewise/latest/APIReference/API_CreateAssetModel.html CreateAssetModel>
+-- or
+-- <https://docs.aws.amazon.com/iot-sitewise/latest/APIReference/API_UpdateAssetModel.html UpdateAssetModel>
+-- API operation).
+assetModelHierarchyDefinition_name :: Lens.Lens' AssetModelHierarchyDefinition Prelude.Text
+assetModelHierarchyDefinition_name = Lens.lens (\AssetModelHierarchyDefinition' {name} -> name) (\s@AssetModelHierarchyDefinition' {} a -> s {name = a} :: AssetModelHierarchyDefinition)
+
+-- | The ID of an asset model for this hierarchy.
+assetModelHierarchyDefinition_childAssetModelId :: Lens.Lens' AssetModelHierarchyDefinition Prelude.Text
+assetModelHierarchyDefinition_childAssetModelId = Lens.lens (\AssetModelHierarchyDefinition' {childAssetModelId} -> childAssetModelId) (\s@AssetModelHierarchyDefinition' {} a -> s {childAssetModelId = a} :: AssetModelHierarchyDefinition)
+
+instance
+  Prelude.Hashable
+    AssetModelHierarchyDefinition
+  where
+  hashWithSalt _salt AssetModelHierarchyDefinition' {..} =
+    _salt
+      `Prelude.hashWithSalt` name
+      `Prelude.hashWithSalt` childAssetModelId
+
+instance Prelude.NFData AssetModelHierarchyDefinition where
+  rnf AssetModelHierarchyDefinition' {..} =
+    Prelude.rnf name
+      `Prelude.seq` Prelude.rnf childAssetModelId
+
+instance Data.ToJSON AssetModelHierarchyDefinition where
+  toJSON AssetModelHierarchyDefinition' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ Prelude.Just ("name" Data..= name),
+            Prelude.Just
+              ("childAssetModelId" Data..= childAssetModelId)
+          ]
+      )
diff --git a/gen/Amazonka/IoTSiteWise/Types/AssetModelProperty.hs b/gen/Amazonka/IoTSiteWise/Types/AssetModelProperty.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/IoTSiteWise/Types/AssetModelProperty.hs
@@ -0,0 +1,156 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.IoTSiteWise.Types.AssetModelProperty
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.IoTSiteWise.Types.AssetModelProperty where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.IoTSiteWise.Types.PropertyDataType
+import Amazonka.IoTSiteWise.Types.PropertyType
+import qualified Amazonka.Prelude as Prelude
+
+-- | Contains information about an asset model property.
+--
+-- /See:/ 'newAssetModelProperty' smart constructor.
+data AssetModelProperty = AssetModelProperty'
+  { -- | The data type of the structure for this property. This parameter exists
+    -- on properties that have the @STRUCT@ data type.
+    dataTypeSpec :: Prelude.Maybe Prelude.Text,
+    -- | The ID of the asset model property.
+    id :: Prelude.Maybe Prelude.Text,
+    -- | The unit of the asset model property, such as @Newtons@ or @RPM@.
+    unit :: Prelude.Maybe Prelude.Text,
+    -- | The name of the asset model property.
+    name :: Prelude.Text,
+    -- | The data type of the asset model property.
+    dataType :: PropertyDataType,
+    -- | The property type (see @PropertyType@).
+    type' :: PropertyType
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'AssetModelProperty' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'dataTypeSpec', 'assetModelProperty_dataTypeSpec' - The data type of the structure for this property. This parameter exists
+-- on properties that have the @STRUCT@ data type.
+--
+-- 'id', 'assetModelProperty_id' - The ID of the asset model property.
+--
+-- 'unit', 'assetModelProperty_unit' - The unit of the asset model property, such as @Newtons@ or @RPM@.
+--
+-- 'name', 'assetModelProperty_name' - The name of the asset model property.
+--
+-- 'dataType', 'assetModelProperty_dataType' - The data type of the asset model property.
+--
+-- 'type'', 'assetModelProperty_type' - The property type (see @PropertyType@).
+newAssetModelProperty ::
+  -- | 'name'
+  Prelude.Text ->
+  -- | 'dataType'
+  PropertyDataType ->
+  -- | 'type''
+  PropertyType ->
+  AssetModelProperty
+newAssetModelProperty pName_ pDataType_ pType_ =
+  AssetModelProperty'
+    { dataTypeSpec = Prelude.Nothing,
+      id = Prelude.Nothing,
+      unit = Prelude.Nothing,
+      name = pName_,
+      dataType = pDataType_,
+      type' = pType_
+    }
+
+-- | The data type of the structure for this property. This parameter exists
+-- on properties that have the @STRUCT@ data type.
+assetModelProperty_dataTypeSpec :: Lens.Lens' AssetModelProperty (Prelude.Maybe Prelude.Text)
+assetModelProperty_dataTypeSpec = Lens.lens (\AssetModelProperty' {dataTypeSpec} -> dataTypeSpec) (\s@AssetModelProperty' {} a -> s {dataTypeSpec = a} :: AssetModelProperty)
+
+-- | The ID of the asset model property.
+assetModelProperty_id :: Lens.Lens' AssetModelProperty (Prelude.Maybe Prelude.Text)
+assetModelProperty_id = Lens.lens (\AssetModelProperty' {id} -> id) (\s@AssetModelProperty' {} a -> s {id = a} :: AssetModelProperty)
+
+-- | The unit of the asset model property, such as @Newtons@ or @RPM@.
+assetModelProperty_unit :: Lens.Lens' AssetModelProperty (Prelude.Maybe Prelude.Text)
+assetModelProperty_unit = Lens.lens (\AssetModelProperty' {unit} -> unit) (\s@AssetModelProperty' {} a -> s {unit = a} :: AssetModelProperty)
+
+-- | The name of the asset model property.
+assetModelProperty_name :: Lens.Lens' AssetModelProperty Prelude.Text
+assetModelProperty_name = Lens.lens (\AssetModelProperty' {name} -> name) (\s@AssetModelProperty' {} a -> s {name = a} :: AssetModelProperty)
+
+-- | The data type of the asset model property.
+assetModelProperty_dataType :: Lens.Lens' AssetModelProperty PropertyDataType
+assetModelProperty_dataType = Lens.lens (\AssetModelProperty' {dataType} -> dataType) (\s@AssetModelProperty' {} a -> s {dataType = a} :: AssetModelProperty)
+
+-- | The property type (see @PropertyType@).
+assetModelProperty_type :: Lens.Lens' AssetModelProperty PropertyType
+assetModelProperty_type = Lens.lens (\AssetModelProperty' {type'} -> type') (\s@AssetModelProperty' {} a -> s {type' = a} :: AssetModelProperty)
+
+instance Data.FromJSON AssetModelProperty where
+  parseJSON =
+    Data.withObject
+      "AssetModelProperty"
+      ( \x ->
+          AssetModelProperty'
+            Prelude.<$> (x Data..:? "dataTypeSpec")
+            Prelude.<*> (x Data..:? "id")
+            Prelude.<*> (x Data..:? "unit")
+            Prelude.<*> (x Data..: "name")
+            Prelude.<*> (x Data..: "dataType")
+            Prelude.<*> (x Data..: "type")
+      )
+
+instance Prelude.Hashable AssetModelProperty where
+  hashWithSalt _salt AssetModelProperty' {..} =
+    _salt
+      `Prelude.hashWithSalt` dataTypeSpec
+      `Prelude.hashWithSalt` id
+      `Prelude.hashWithSalt` unit
+      `Prelude.hashWithSalt` name
+      `Prelude.hashWithSalt` dataType
+      `Prelude.hashWithSalt` type'
+
+instance Prelude.NFData AssetModelProperty where
+  rnf AssetModelProperty' {..} =
+    Prelude.rnf dataTypeSpec
+      `Prelude.seq` Prelude.rnf id
+      `Prelude.seq` Prelude.rnf unit
+      `Prelude.seq` Prelude.rnf name
+      `Prelude.seq` Prelude.rnf dataType
+      `Prelude.seq` Prelude.rnf type'
+
+instance Data.ToJSON AssetModelProperty where
+  toJSON AssetModelProperty' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("dataTypeSpec" Data..=) Prelude.<$> dataTypeSpec,
+            ("id" Data..=) Prelude.<$> id,
+            ("unit" Data..=) Prelude.<$> unit,
+            Prelude.Just ("name" Data..= name),
+            Prelude.Just ("dataType" Data..= dataType),
+            Prelude.Just ("type" Data..= type')
+          ]
+      )
diff --git a/gen/Amazonka/IoTSiteWise/Types/AssetModelPropertyDefinition.hs b/gen/Amazonka/IoTSiteWise/Types/AssetModelPropertyDefinition.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/IoTSiteWise/Types/AssetModelPropertyDefinition.hs
@@ -0,0 +1,162 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.IoTSiteWise.Types.AssetModelPropertyDefinition
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.IoTSiteWise.Types.AssetModelPropertyDefinition where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.IoTSiteWise.Types.PropertyDataType
+import Amazonka.IoTSiteWise.Types.PropertyType
+import qualified Amazonka.Prelude as Prelude
+
+-- | Contains an asset model property definition. This property definition is
+-- applied to all assets created from the asset model.
+--
+-- /See:/ 'newAssetModelPropertyDefinition' smart constructor.
+data AssetModelPropertyDefinition = AssetModelPropertyDefinition'
+  { -- | The data type of the structure for this property. This parameter is
+    -- required on properties that have the @STRUCT@ data type.
+    --
+    -- The options for this parameter depend on the type of the composite model
+    -- in which you define this property. Use @AWS\/ALARM_STATE@ for alarm
+    -- state in alarm composite models.
+    dataTypeSpec :: Prelude.Maybe Prelude.Text,
+    -- | The unit of the property definition, such as @Newtons@ or @RPM@.
+    unit :: Prelude.Maybe Prelude.Text,
+    -- | The name of the property definition.
+    name :: Prelude.Text,
+    -- | The data type of the property definition.
+    --
+    -- If you specify @STRUCT@, you must also specify @dataTypeSpec@ to
+    -- identify the type of the structure for this property.
+    dataType :: PropertyDataType,
+    -- | The property definition type (see @PropertyType@). You can only specify
+    -- one type in a property definition.
+    type' :: PropertyType
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'AssetModelPropertyDefinition' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'dataTypeSpec', 'assetModelPropertyDefinition_dataTypeSpec' - The data type of the structure for this property. This parameter is
+-- required on properties that have the @STRUCT@ data type.
+--
+-- The options for this parameter depend on the type of the composite model
+-- in which you define this property. Use @AWS\/ALARM_STATE@ for alarm
+-- state in alarm composite models.
+--
+-- 'unit', 'assetModelPropertyDefinition_unit' - The unit of the property definition, such as @Newtons@ or @RPM@.
+--
+-- 'name', 'assetModelPropertyDefinition_name' - The name of the property definition.
+--
+-- 'dataType', 'assetModelPropertyDefinition_dataType' - The data type of the property definition.
+--
+-- If you specify @STRUCT@, you must also specify @dataTypeSpec@ to
+-- identify the type of the structure for this property.
+--
+-- 'type'', 'assetModelPropertyDefinition_type' - The property definition type (see @PropertyType@). You can only specify
+-- one type in a property definition.
+newAssetModelPropertyDefinition ::
+  -- | 'name'
+  Prelude.Text ->
+  -- | 'dataType'
+  PropertyDataType ->
+  -- | 'type''
+  PropertyType ->
+  AssetModelPropertyDefinition
+newAssetModelPropertyDefinition
+  pName_
+  pDataType_
+  pType_ =
+    AssetModelPropertyDefinition'
+      { dataTypeSpec =
+          Prelude.Nothing,
+        unit = Prelude.Nothing,
+        name = pName_,
+        dataType = pDataType_,
+        type' = pType_
+      }
+
+-- | The data type of the structure for this property. This parameter is
+-- required on properties that have the @STRUCT@ data type.
+--
+-- The options for this parameter depend on the type of the composite model
+-- in which you define this property. Use @AWS\/ALARM_STATE@ for alarm
+-- state in alarm composite models.
+assetModelPropertyDefinition_dataTypeSpec :: Lens.Lens' AssetModelPropertyDefinition (Prelude.Maybe Prelude.Text)
+assetModelPropertyDefinition_dataTypeSpec = Lens.lens (\AssetModelPropertyDefinition' {dataTypeSpec} -> dataTypeSpec) (\s@AssetModelPropertyDefinition' {} a -> s {dataTypeSpec = a} :: AssetModelPropertyDefinition)
+
+-- | The unit of the property definition, such as @Newtons@ or @RPM@.
+assetModelPropertyDefinition_unit :: Lens.Lens' AssetModelPropertyDefinition (Prelude.Maybe Prelude.Text)
+assetModelPropertyDefinition_unit = Lens.lens (\AssetModelPropertyDefinition' {unit} -> unit) (\s@AssetModelPropertyDefinition' {} a -> s {unit = a} :: AssetModelPropertyDefinition)
+
+-- | The name of the property definition.
+assetModelPropertyDefinition_name :: Lens.Lens' AssetModelPropertyDefinition Prelude.Text
+assetModelPropertyDefinition_name = Lens.lens (\AssetModelPropertyDefinition' {name} -> name) (\s@AssetModelPropertyDefinition' {} a -> s {name = a} :: AssetModelPropertyDefinition)
+
+-- | The data type of the property definition.
+--
+-- If you specify @STRUCT@, you must also specify @dataTypeSpec@ to
+-- identify the type of the structure for this property.
+assetModelPropertyDefinition_dataType :: Lens.Lens' AssetModelPropertyDefinition PropertyDataType
+assetModelPropertyDefinition_dataType = Lens.lens (\AssetModelPropertyDefinition' {dataType} -> dataType) (\s@AssetModelPropertyDefinition' {} a -> s {dataType = a} :: AssetModelPropertyDefinition)
+
+-- | The property definition type (see @PropertyType@). You can only specify
+-- one type in a property definition.
+assetModelPropertyDefinition_type :: Lens.Lens' AssetModelPropertyDefinition PropertyType
+assetModelPropertyDefinition_type = Lens.lens (\AssetModelPropertyDefinition' {type'} -> type') (\s@AssetModelPropertyDefinition' {} a -> s {type' = a} :: AssetModelPropertyDefinition)
+
+instance
+  Prelude.Hashable
+    AssetModelPropertyDefinition
+  where
+  hashWithSalt _salt AssetModelPropertyDefinition' {..} =
+    _salt
+      `Prelude.hashWithSalt` dataTypeSpec
+      `Prelude.hashWithSalt` unit
+      `Prelude.hashWithSalt` name
+      `Prelude.hashWithSalt` dataType
+      `Prelude.hashWithSalt` type'
+
+instance Prelude.NFData AssetModelPropertyDefinition where
+  rnf AssetModelPropertyDefinition' {..} =
+    Prelude.rnf dataTypeSpec
+      `Prelude.seq` Prelude.rnf unit
+      `Prelude.seq` Prelude.rnf name
+      `Prelude.seq` Prelude.rnf dataType
+      `Prelude.seq` Prelude.rnf type'
+
+instance Data.ToJSON AssetModelPropertyDefinition where
+  toJSON AssetModelPropertyDefinition' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("dataTypeSpec" Data..=) Prelude.<$> dataTypeSpec,
+            ("unit" Data..=) Prelude.<$> unit,
+            Prelude.Just ("name" Data..= name),
+            Prelude.Just ("dataType" Data..= dataType),
+            Prelude.Just ("type" Data..= type')
+          ]
+      )
diff --git a/gen/Amazonka/IoTSiteWise/Types/AssetModelPropertySummary.hs b/gen/Amazonka/IoTSiteWise/Types/AssetModelPropertySummary.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/IoTSiteWise/Types/AssetModelPropertySummary.hs
@@ -0,0 +1,155 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.IoTSiteWise.Types.AssetModelPropertySummary
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.IoTSiteWise.Types.AssetModelPropertySummary where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.IoTSiteWise.Types.PropertyDataType
+import Amazonka.IoTSiteWise.Types.PropertyType
+import qualified Amazonka.Prelude as Prelude
+
+-- | Contains a summary of a property associated with a model.
+--
+-- /See:/ 'newAssetModelPropertySummary' smart constructor.
+data AssetModelPropertySummary = AssetModelPropertySummary'
+  { -- | The ID of the composite model that contains the asset model property.
+    assetModelCompositeModelId :: Prelude.Maybe Prelude.Text,
+    -- | The data type of the structure for this property. This parameter exists
+    -- on properties that have the @STRUCT@ data type.
+    dataTypeSpec :: Prelude.Maybe Prelude.Text,
+    -- | The ID of the property.
+    id :: Prelude.Maybe Prelude.Text,
+    -- | The unit (such as @Newtons@ or @RPM@) of the property.
+    unit :: Prelude.Maybe Prelude.Text,
+    -- | The name of the property.
+    name :: Prelude.Text,
+    -- | The data type of the property.
+    dataType :: PropertyDataType,
+    type' :: PropertyType
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'AssetModelPropertySummary' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'assetModelCompositeModelId', 'assetModelPropertySummary_assetModelCompositeModelId' - The ID of the composite model that contains the asset model property.
+--
+-- 'dataTypeSpec', 'assetModelPropertySummary_dataTypeSpec' - The data type of the structure for this property. This parameter exists
+-- on properties that have the @STRUCT@ data type.
+--
+-- 'id', 'assetModelPropertySummary_id' - The ID of the property.
+--
+-- 'unit', 'assetModelPropertySummary_unit' - The unit (such as @Newtons@ or @RPM@) of the property.
+--
+-- 'name', 'assetModelPropertySummary_name' - The name of the property.
+--
+-- 'dataType', 'assetModelPropertySummary_dataType' - The data type of the property.
+--
+-- 'type'', 'assetModelPropertySummary_type' - Undocumented member.
+newAssetModelPropertySummary ::
+  -- | 'name'
+  Prelude.Text ->
+  -- | 'dataType'
+  PropertyDataType ->
+  -- | 'type''
+  PropertyType ->
+  AssetModelPropertySummary
+newAssetModelPropertySummary pName_ pDataType_ pType_ =
+  AssetModelPropertySummary'
+    { assetModelCompositeModelId =
+        Prelude.Nothing,
+      dataTypeSpec = Prelude.Nothing,
+      id = Prelude.Nothing,
+      unit = Prelude.Nothing,
+      name = pName_,
+      dataType = pDataType_,
+      type' = pType_
+    }
+
+-- | The ID of the composite model that contains the asset model property.
+assetModelPropertySummary_assetModelCompositeModelId :: Lens.Lens' AssetModelPropertySummary (Prelude.Maybe Prelude.Text)
+assetModelPropertySummary_assetModelCompositeModelId = Lens.lens (\AssetModelPropertySummary' {assetModelCompositeModelId} -> assetModelCompositeModelId) (\s@AssetModelPropertySummary' {} a -> s {assetModelCompositeModelId = a} :: AssetModelPropertySummary)
+
+-- | The data type of the structure for this property. This parameter exists
+-- on properties that have the @STRUCT@ data type.
+assetModelPropertySummary_dataTypeSpec :: Lens.Lens' AssetModelPropertySummary (Prelude.Maybe Prelude.Text)
+assetModelPropertySummary_dataTypeSpec = Lens.lens (\AssetModelPropertySummary' {dataTypeSpec} -> dataTypeSpec) (\s@AssetModelPropertySummary' {} a -> s {dataTypeSpec = a} :: AssetModelPropertySummary)
+
+-- | The ID of the property.
+assetModelPropertySummary_id :: Lens.Lens' AssetModelPropertySummary (Prelude.Maybe Prelude.Text)
+assetModelPropertySummary_id = Lens.lens (\AssetModelPropertySummary' {id} -> id) (\s@AssetModelPropertySummary' {} a -> s {id = a} :: AssetModelPropertySummary)
+
+-- | The unit (such as @Newtons@ or @RPM@) of the property.
+assetModelPropertySummary_unit :: Lens.Lens' AssetModelPropertySummary (Prelude.Maybe Prelude.Text)
+assetModelPropertySummary_unit = Lens.lens (\AssetModelPropertySummary' {unit} -> unit) (\s@AssetModelPropertySummary' {} a -> s {unit = a} :: AssetModelPropertySummary)
+
+-- | The name of the property.
+assetModelPropertySummary_name :: Lens.Lens' AssetModelPropertySummary Prelude.Text
+assetModelPropertySummary_name = Lens.lens (\AssetModelPropertySummary' {name} -> name) (\s@AssetModelPropertySummary' {} a -> s {name = a} :: AssetModelPropertySummary)
+
+-- | The data type of the property.
+assetModelPropertySummary_dataType :: Lens.Lens' AssetModelPropertySummary PropertyDataType
+assetModelPropertySummary_dataType = Lens.lens (\AssetModelPropertySummary' {dataType} -> dataType) (\s@AssetModelPropertySummary' {} a -> s {dataType = a} :: AssetModelPropertySummary)
+
+-- | Undocumented member.
+assetModelPropertySummary_type :: Lens.Lens' AssetModelPropertySummary PropertyType
+assetModelPropertySummary_type = Lens.lens (\AssetModelPropertySummary' {type'} -> type') (\s@AssetModelPropertySummary' {} a -> s {type' = a} :: AssetModelPropertySummary)
+
+instance Data.FromJSON AssetModelPropertySummary where
+  parseJSON =
+    Data.withObject
+      "AssetModelPropertySummary"
+      ( \x ->
+          AssetModelPropertySummary'
+            Prelude.<$> (x Data..:? "assetModelCompositeModelId")
+            Prelude.<*> (x Data..:? "dataTypeSpec")
+            Prelude.<*> (x Data..:? "id")
+            Prelude.<*> (x Data..:? "unit")
+            Prelude.<*> (x Data..: "name")
+            Prelude.<*> (x Data..: "dataType")
+            Prelude.<*> (x Data..: "type")
+      )
+
+instance Prelude.Hashable AssetModelPropertySummary where
+  hashWithSalt _salt AssetModelPropertySummary' {..} =
+    _salt
+      `Prelude.hashWithSalt` assetModelCompositeModelId
+      `Prelude.hashWithSalt` dataTypeSpec
+      `Prelude.hashWithSalt` id
+      `Prelude.hashWithSalt` unit
+      `Prelude.hashWithSalt` name
+      `Prelude.hashWithSalt` dataType
+      `Prelude.hashWithSalt` type'
+
+instance Prelude.NFData AssetModelPropertySummary where
+  rnf AssetModelPropertySummary' {..} =
+    Prelude.rnf assetModelCompositeModelId
+      `Prelude.seq` Prelude.rnf dataTypeSpec
+      `Prelude.seq` Prelude.rnf id
+      `Prelude.seq` Prelude.rnf unit
+      `Prelude.seq` Prelude.rnf name
+      `Prelude.seq` Prelude.rnf dataType
+      `Prelude.seq` Prelude.rnf type'
diff --git a/gen/Amazonka/IoTSiteWise/Types/AssetModelState.hs b/gen/Amazonka/IoTSiteWise/Types/AssetModelState.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/IoTSiteWise/Types/AssetModelState.hs
@@ -0,0 +1,91 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DerivingStrategies #-}
+{-# LANGUAGE GeneralizedNewtypeDeriving #-}
+{-# LANGUAGE LambdaCase #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE PatternSynonyms #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.IoTSiteWise.Types.AssetModelState
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.IoTSiteWise.Types.AssetModelState
+  ( AssetModelState
+      ( ..,
+        AssetModelState_ACTIVE,
+        AssetModelState_CREATING,
+        AssetModelState_DELETING,
+        AssetModelState_FAILED,
+        AssetModelState_PROPAGATING,
+        AssetModelState_UPDATING
+      ),
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+newtype AssetModelState = AssetModelState'
+  { fromAssetModelState ::
+      Data.Text
+  }
+  deriving stock
+    ( Prelude.Show,
+      Prelude.Read,
+      Prelude.Eq,
+      Prelude.Ord,
+      Prelude.Generic
+    )
+  deriving newtype
+    ( Prelude.Hashable,
+      Prelude.NFData,
+      Data.FromText,
+      Data.ToText,
+      Data.ToByteString,
+      Data.ToLog,
+      Data.ToHeader,
+      Data.ToQuery,
+      Data.FromJSON,
+      Data.FromJSONKey,
+      Data.ToJSON,
+      Data.ToJSONKey,
+      Data.FromXML,
+      Data.ToXML
+    )
+
+pattern AssetModelState_ACTIVE :: AssetModelState
+pattern AssetModelState_ACTIVE = AssetModelState' "ACTIVE"
+
+pattern AssetModelState_CREATING :: AssetModelState
+pattern AssetModelState_CREATING = AssetModelState' "CREATING"
+
+pattern AssetModelState_DELETING :: AssetModelState
+pattern AssetModelState_DELETING = AssetModelState' "DELETING"
+
+pattern AssetModelState_FAILED :: AssetModelState
+pattern AssetModelState_FAILED = AssetModelState' "FAILED"
+
+pattern AssetModelState_PROPAGATING :: AssetModelState
+pattern AssetModelState_PROPAGATING = AssetModelState' "PROPAGATING"
+
+pattern AssetModelState_UPDATING :: AssetModelState
+pattern AssetModelState_UPDATING = AssetModelState' "UPDATING"
+
+{-# COMPLETE
+  AssetModelState_ACTIVE,
+  AssetModelState_CREATING,
+  AssetModelState_DELETING,
+  AssetModelState_FAILED,
+  AssetModelState_PROPAGATING,
+  AssetModelState_UPDATING,
+  AssetModelState'
+  #-}
diff --git a/gen/Amazonka/IoTSiteWise/Types/AssetModelStatus.hs b/gen/Amazonka/IoTSiteWise/Types/AssetModelStatus.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/IoTSiteWise/Types/AssetModelStatus.hs
@@ -0,0 +1,90 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.IoTSiteWise.Types.AssetModelStatus
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.IoTSiteWise.Types.AssetModelStatus where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.IoTSiteWise.Types.AssetModelState
+import Amazonka.IoTSiteWise.Types.ErrorDetails
+import qualified Amazonka.Prelude as Prelude
+
+-- | Contains current status information for an asset model. For more
+-- information, see
+-- <https://docs.aws.amazon.com/iot-sitewise/latest/userguide/asset-and-model-states.html Asset and model states>
+-- in the /IoT SiteWise User Guide/.
+--
+-- /See:/ 'newAssetModelStatus' smart constructor.
+data AssetModelStatus = AssetModelStatus'
+  { -- | Contains associated error information, if any.
+    error :: Prelude.Maybe ErrorDetails,
+    -- | The current state of the asset model.
+    state :: AssetModelState
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'AssetModelStatus' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'error', 'assetModelStatus_error' - Contains associated error information, if any.
+--
+-- 'state', 'assetModelStatus_state' - The current state of the asset model.
+newAssetModelStatus ::
+  -- | 'state'
+  AssetModelState ->
+  AssetModelStatus
+newAssetModelStatus pState_ =
+  AssetModelStatus'
+    { error = Prelude.Nothing,
+      state = pState_
+    }
+
+-- | Contains associated error information, if any.
+assetModelStatus_error :: Lens.Lens' AssetModelStatus (Prelude.Maybe ErrorDetails)
+assetModelStatus_error = Lens.lens (\AssetModelStatus' {error} -> error) (\s@AssetModelStatus' {} a -> s {error = a} :: AssetModelStatus)
+
+-- | The current state of the asset model.
+assetModelStatus_state :: Lens.Lens' AssetModelStatus AssetModelState
+assetModelStatus_state = Lens.lens (\AssetModelStatus' {state} -> state) (\s@AssetModelStatus' {} a -> s {state = a} :: AssetModelStatus)
+
+instance Data.FromJSON AssetModelStatus where
+  parseJSON =
+    Data.withObject
+      "AssetModelStatus"
+      ( \x ->
+          AssetModelStatus'
+            Prelude.<$> (x Data..:? "error")
+            Prelude.<*> (x Data..: "state")
+      )
+
+instance Prelude.Hashable AssetModelStatus where
+  hashWithSalt _salt AssetModelStatus' {..} =
+    _salt
+      `Prelude.hashWithSalt` error
+      `Prelude.hashWithSalt` state
+
+instance Prelude.NFData AssetModelStatus where
+  rnf AssetModelStatus' {..} =
+    Prelude.rnf error `Prelude.seq` Prelude.rnf state
diff --git a/gen/Amazonka/IoTSiteWise/Types/AssetModelSummary.hs b/gen/Amazonka/IoTSiteWise/Types/AssetModelSummary.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/IoTSiteWise/Types/AssetModelSummary.hs
@@ -0,0 +1,178 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.IoTSiteWise.Types.AssetModelSummary
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.IoTSiteWise.Types.AssetModelSummary where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.IoTSiteWise.Types.AssetModelStatus
+import qualified Amazonka.Prelude as Prelude
+
+-- | Contains a summary of an asset model.
+--
+-- /See:/ 'newAssetModelSummary' smart constructor.
+data AssetModelSummary = AssetModelSummary'
+  { -- | The ID of the asset model (used with IoT SiteWise APIs).
+    id :: Prelude.Text,
+    -- | The
+    -- <https://docs.aws.amazon.com/general/latest/gr/aws-arns-and-namespaces.html ARN>
+    -- of the asset model, which has the following format.
+    --
+    -- @arn:${Partition}:iotsitewise:${Region}:${Account}:asset-model\/${AssetModelId}@
+    arn :: Prelude.Text,
+    -- | The name of the asset model.
+    name :: Prelude.Text,
+    -- | The asset model description.
+    description :: Prelude.Text,
+    -- | The date the asset model was created, in Unix epoch time.
+    creationDate :: Data.POSIX,
+    -- | The date the asset model was last updated, in Unix epoch time.
+    lastUpdateDate :: Data.POSIX,
+    -- | The current status of the asset model.
+    status :: AssetModelStatus
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'AssetModelSummary' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'id', 'assetModelSummary_id' - The ID of the asset model (used with IoT SiteWise APIs).
+--
+-- 'arn', 'assetModelSummary_arn' - The
+-- <https://docs.aws.amazon.com/general/latest/gr/aws-arns-and-namespaces.html ARN>
+-- of the asset model, which has the following format.
+--
+-- @arn:${Partition}:iotsitewise:${Region}:${Account}:asset-model\/${AssetModelId}@
+--
+-- 'name', 'assetModelSummary_name' - The name of the asset model.
+--
+-- 'description', 'assetModelSummary_description' - The asset model description.
+--
+-- 'creationDate', 'assetModelSummary_creationDate' - The date the asset model was created, in Unix epoch time.
+--
+-- 'lastUpdateDate', 'assetModelSummary_lastUpdateDate' - The date the asset model was last updated, in Unix epoch time.
+--
+-- 'status', 'assetModelSummary_status' - The current status of the asset model.
+newAssetModelSummary ::
+  -- | 'id'
+  Prelude.Text ->
+  -- | 'arn'
+  Prelude.Text ->
+  -- | 'name'
+  Prelude.Text ->
+  -- | 'description'
+  Prelude.Text ->
+  -- | 'creationDate'
+  Prelude.UTCTime ->
+  -- | 'lastUpdateDate'
+  Prelude.UTCTime ->
+  -- | 'status'
+  AssetModelStatus ->
+  AssetModelSummary
+newAssetModelSummary
+  pId_
+  pArn_
+  pName_
+  pDescription_
+  pCreationDate_
+  pLastUpdateDate_
+  pStatus_ =
+    AssetModelSummary'
+      { id = pId_,
+        arn = pArn_,
+        name = pName_,
+        description = pDescription_,
+        creationDate = Data._Time Lens.# pCreationDate_,
+        lastUpdateDate = Data._Time Lens.# pLastUpdateDate_,
+        status = pStatus_
+      }
+
+-- | The ID of the asset model (used with IoT SiteWise APIs).
+assetModelSummary_id :: Lens.Lens' AssetModelSummary Prelude.Text
+assetModelSummary_id = Lens.lens (\AssetModelSummary' {id} -> id) (\s@AssetModelSummary' {} a -> s {id = a} :: AssetModelSummary)
+
+-- | The
+-- <https://docs.aws.amazon.com/general/latest/gr/aws-arns-and-namespaces.html ARN>
+-- of the asset model, which has the following format.
+--
+-- @arn:${Partition}:iotsitewise:${Region}:${Account}:asset-model\/${AssetModelId}@
+assetModelSummary_arn :: Lens.Lens' AssetModelSummary Prelude.Text
+assetModelSummary_arn = Lens.lens (\AssetModelSummary' {arn} -> arn) (\s@AssetModelSummary' {} a -> s {arn = a} :: AssetModelSummary)
+
+-- | The name of the asset model.
+assetModelSummary_name :: Lens.Lens' AssetModelSummary Prelude.Text
+assetModelSummary_name = Lens.lens (\AssetModelSummary' {name} -> name) (\s@AssetModelSummary' {} a -> s {name = a} :: AssetModelSummary)
+
+-- | The asset model description.
+assetModelSummary_description :: Lens.Lens' AssetModelSummary Prelude.Text
+assetModelSummary_description = Lens.lens (\AssetModelSummary' {description} -> description) (\s@AssetModelSummary' {} a -> s {description = a} :: AssetModelSummary)
+
+-- | The date the asset model was created, in Unix epoch time.
+assetModelSummary_creationDate :: Lens.Lens' AssetModelSummary Prelude.UTCTime
+assetModelSummary_creationDate = Lens.lens (\AssetModelSummary' {creationDate} -> creationDate) (\s@AssetModelSummary' {} a -> s {creationDate = a} :: AssetModelSummary) Prelude.. Data._Time
+
+-- | The date the asset model was last updated, in Unix epoch time.
+assetModelSummary_lastUpdateDate :: Lens.Lens' AssetModelSummary Prelude.UTCTime
+assetModelSummary_lastUpdateDate = Lens.lens (\AssetModelSummary' {lastUpdateDate} -> lastUpdateDate) (\s@AssetModelSummary' {} a -> s {lastUpdateDate = a} :: AssetModelSummary) Prelude.. Data._Time
+
+-- | The current status of the asset model.
+assetModelSummary_status :: Lens.Lens' AssetModelSummary AssetModelStatus
+assetModelSummary_status = Lens.lens (\AssetModelSummary' {status} -> status) (\s@AssetModelSummary' {} a -> s {status = a} :: AssetModelSummary)
+
+instance Data.FromJSON AssetModelSummary where
+  parseJSON =
+    Data.withObject
+      "AssetModelSummary"
+      ( \x ->
+          AssetModelSummary'
+            Prelude.<$> (x Data..: "id")
+            Prelude.<*> (x Data..: "arn")
+            Prelude.<*> (x Data..: "name")
+            Prelude.<*> (x Data..: "description")
+            Prelude.<*> (x Data..: "creationDate")
+            Prelude.<*> (x Data..: "lastUpdateDate")
+            Prelude.<*> (x Data..: "status")
+      )
+
+instance Prelude.Hashable AssetModelSummary where
+  hashWithSalt _salt AssetModelSummary' {..} =
+    _salt
+      `Prelude.hashWithSalt` id
+      `Prelude.hashWithSalt` arn
+      `Prelude.hashWithSalt` name
+      `Prelude.hashWithSalt` description
+      `Prelude.hashWithSalt` creationDate
+      `Prelude.hashWithSalt` lastUpdateDate
+      `Prelude.hashWithSalt` status
+
+instance Prelude.NFData AssetModelSummary where
+  rnf AssetModelSummary' {..} =
+    Prelude.rnf id
+      `Prelude.seq` Prelude.rnf arn
+      `Prelude.seq` Prelude.rnf name
+      `Prelude.seq` Prelude.rnf description
+      `Prelude.seq` Prelude.rnf creationDate
+      `Prelude.seq` Prelude.rnf lastUpdateDate
+      `Prelude.seq` Prelude.rnf status
diff --git a/gen/Amazonka/IoTSiteWise/Types/AssetProperty.hs b/gen/Amazonka/IoTSiteWise/Types/AssetProperty.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/IoTSiteWise/Types/AssetProperty.hs
@@ -0,0 +1,176 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.IoTSiteWise.Types.AssetProperty
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.IoTSiteWise.Types.AssetProperty where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.IoTSiteWise.Types.PropertyDataType
+import Amazonka.IoTSiteWise.Types.PropertyNotification
+import qualified Amazonka.Prelude as Prelude
+
+-- | Contains asset property information.
+--
+-- /See:/ 'newAssetProperty' smart constructor.
+data AssetProperty = AssetProperty'
+  { -- | The alias that identifies the property, such as an OPC-UA server data
+    -- stream path (for example,
+    -- @\/company\/windfarm\/3\/turbine\/7\/temperature@). For more
+    -- information, see
+    -- <https://docs.aws.amazon.com/iot-sitewise/latest/userguide/connect-data-streams.html Mapping industrial data streams to asset properties>
+    -- in the /IoT SiteWise User Guide/.
+    alias :: Prelude.Maybe Prelude.Text,
+    -- | The data type of the structure for this property. This parameter exists
+    -- on properties that have the @STRUCT@ data type.
+    dataTypeSpec :: Prelude.Maybe Prelude.Text,
+    -- | The asset property\'s notification topic and state. For more
+    -- information, see
+    -- <https://docs.aws.amazon.com/iot-sitewise/latest/APIReference/API_UpdateAssetProperty.html UpdateAssetProperty>.
+    notification :: Prelude.Maybe PropertyNotification,
+    -- | The unit (such as @Newtons@ or @RPM@) of the asset property.
+    unit :: Prelude.Maybe Prelude.Text,
+    -- | The ID of the asset property.
+    id :: Prelude.Text,
+    -- | The name of the property.
+    name :: Prelude.Text,
+    -- | The data type of the asset property.
+    dataType :: PropertyDataType
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'AssetProperty' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'alias', 'assetProperty_alias' - The alias that identifies the property, such as an OPC-UA server data
+-- stream path (for example,
+-- @\/company\/windfarm\/3\/turbine\/7\/temperature@). For more
+-- information, see
+-- <https://docs.aws.amazon.com/iot-sitewise/latest/userguide/connect-data-streams.html Mapping industrial data streams to asset properties>
+-- in the /IoT SiteWise User Guide/.
+--
+-- 'dataTypeSpec', 'assetProperty_dataTypeSpec' - The data type of the structure for this property. This parameter exists
+-- on properties that have the @STRUCT@ data type.
+--
+-- 'notification', 'assetProperty_notification' - The asset property\'s notification topic and state. For more
+-- information, see
+-- <https://docs.aws.amazon.com/iot-sitewise/latest/APIReference/API_UpdateAssetProperty.html UpdateAssetProperty>.
+--
+-- 'unit', 'assetProperty_unit' - The unit (such as @Newtons@ or @RPM@) of the asset property.
+--
+-- 'id', 'assetProperty_id' - The ID of the asset property.
+--
+-- 'name', 'assetProperty_name' - The name of the property.
+--
+-- 'dataType', 'assetProperty_dataType' - The data type of the asset property.
+newAssetProperty ::
+  -- | 'id'
+  Prelude.Text ->
+  -- | 'name'
+  Prelude.Text ->
+  -- | 'dataType'
+  PropertyDataType ->
+  AssetProperty
+newAssetProperty pId_ pName_ pDataType_ =
+  AssetProperty'
+    { alias = Prelude.Nothing,
+      dataTypeSpec = Prelude.Nothing,
+      notification = Prelude.Nothing,
+      unit = Prelude.Nothing,
+      id = pId_,
+      name = pName_,
+      dataType = pDataType_
+    }
+
+-- | The alias that identifies the property, such as an OPC-UA server data
+-- stream path (for example,
+-- @\/company\/windfarm\/3\/turbine\/7\/temperature@). For more
+-- information, see
+-- <https://docs.aws.amazon.com/iot-sitewise/latest/userguide/connect-data-streams.html Mapping industrial data streams to asset properties>
+-- in the /IoT SiteWise User Guide/.
+assetProperty_alias :: Lens.Lens' AssetProperty (Prelude.Maybe Prelude.Text)
+assetProperty_alias = Lens.lens (\AssetProperty' {alias} -> alias) (\s@AssetProperty' {} a -> s {alias = a} :: AssetProperty)
+
+-- | The data type of the structure for this property. This parameter exists
+-- on properties that have the @STRUCT@ data type.
+assetProperty_dataTypeSpec :: Lens.Lens' AssetProperty (Prelude.Maybe Prelude.Text)
+assetProperty_dataTypeSpec = Lens.lens (\AssetProperty' {dataTypeSpec} -> dataTypeSpec) (\s@AssetProperty' {} a -> s {dataTypeSpec = a} :: AssetProperty)
+
+-- | The asset property\'s notification topic and state. For more
+-- information, see
+-- <https://docs.aws.amazon.com/iot-sitewise/latest/APIReference/API_UpdateAssetProperty.html UpdateAssetProperty>.
+assetProperty_notification :: Lens.Lens' AssetProperty (Prelude.Maybe PropertyNotification)
+assetProperty_notification = Lens.lens (\AssetProperty' {notification} -> notification) (\s@AssetProperty' {} a -> s {notification = a} :: AssetProperty)
+
+-- | The unit (such as @Newtons@ or @RPM@) of the asset property.
+assetProperty_unit :: Lens.Lens' AssetProperty (Prelude.Maybe Prelude.Text)
+assetProperty_unit = Lens.lens (\AssetProperty' {unit} -> unit) (\s@AssetProperty' {} a -> s {unit = a} :: AssetProperty)
+
+-- | The ID of the asset property.
+assetProperty_id :: Lens.Lens' AssetProperty Prelude.Text
+assetProperty_id = Lens.lens (\AssetProperty' {id} -> id) (\s@AssetProperty' {} a -> s {id = a} :: AssetProperty)
+
+-- | The name of the property.
+assetProperty_name :: Lens.Lens' AssetProperty Prelude.Text
+assetProperty_name = Lens.lens (\AssetProperty' {name} -> name) (\s@AssetProperty' {} a -> s {name = a} :: AssetProperty)
+
+-- | The data type of the asset property.
+assetProperty_dataType :: Lens.Lens' AssetProperty PropertyDataType
+assetProperty_dataType = Lens.lens (\AssetProperty' {dataType} -> dataType) (\s@AssetProperty' {} a -> s {dataType = a} :: AssetProperty)
+
+instance Data.FromJSON AssetProperty where
+  parseJSON =
+    Data.withObject
+      "AssetProperty"
+      ( \x ->
+          AssetProperty'
+            Prelude.<$> (x Data..:? "alias")
+            Prelude.<*> (x Data..:? "dataTypeSpec")
+            Prelude.<*> (x Data..:? "notification")
+            Prelude.<*> (x Data..:? "unit")
+            Prelude.<*> (x Data..: "id")
+            Prelude.<*> (x Data..: "name")
+            Prelude.<*> (x Data..: "dataType")
+      )
+
+instance Prelude.Hashable AssetProperty where
+  hashWithSalt _salt AssetProperty' {..} =
+    _salt
+      `Prelude.hashWithSalt` alias
+      `Prelude.hashWithSalt` dataTypeSpec
+      `Prelude.hashWithSalt` notification
+      `Prelude.hashWithSalt` unit
+      `Prelude.hashWithSalt` id
+      `Prelude.hashWithSalt` name
+      `Prelude.hashWithSalt` dataType
+
+instance Prelude.NFData AssetProperty where
+  rnf AssetProperty' {..} =
+    Prelude.rnf alias
+      `Prelude.seq` Prelude.rnf dataTypeSpec
+      `Prelude.seq` Prelude.rnf notification
+      `Prelude.seq` Prelude.rnf unit
+      `Prelude.seq` Prelude.rnf id
+      `Prelude.seq` Prelude.rnf name
+      `Prelude.seq` Prelude.rnf dataType
diff --git a/gen/Amazonka/IoTSiteWise/Types/AssetPropertySummary.hs b/gen/Amazonka/IoTSiteWise/Types/AssetPropertySummary.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/IoTSiteWise/Types/AssetPropertySummary.hs
@@ -0,0 +1,135 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.IoTSiteWise.Types.AssetPropertySummary
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.IoTSiteWise.Types.AssetPropertySummary where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.IoTSiteWise.Types.PropertyNotification
+import qualified Amazonka.Prelude as Prelude
+
+-- | Contains a summary of a property associated with an asset.
+--
+-- /See:/ 'newAssetPropertySummary' smart constructor.
+data AssetPropertySummary = AssetPropertySummary'
+  { -- | The alias that identifies the property, such as an OPC-UA server data
+    -- stream path (for example,
+    -- @\/company\/windfarm\/3\/turbine\/7\/temperature@). For more
+    -- information, see
+    -- <https://docs.aws.amazon.com/iot-sitewise/latest/userguide/connect-data-streams.html Mapping industrial data streams to asset properties>
+    -- in the /IoT SiteWise User Guide/.
+    alias :: Prelude.Maybe Prelude.Text,
+    -- | The ID of the composite model that contains the asset property.
+    assetCompositeModelId :: Prelude.Maybe Prelude.Text,
+    -- | The ID of the property.
+    id :: Prelude.Maybe Prelude.Text,
+    notification :: Prelude.Maybe PropertyNotification,
+    -- | The unit of measure (such as Newtons or RPM) of the asset property.
+    unit :: Prelude.Maybe Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'AssetPropertySummary' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'alias', 'assetPropertySummary_alias' - The alias that identifies the property, such as an OPC-UA server data
+-- stream path (for example,
+-- @\/company\/windfarm\/3\/turbine\/7\/temperature@). For more
+-- information, see
+-- <https://docs.aws.amazon.com/iot-sitewise/latest/userguide/connect-data-streams.html Mapping industrial data streams to asset properties>
+-- in the /IoT SiteWise User Guide/.
+--
+-- 'assetCompositeModelId', 'assetPropertySummary_assetCompositeModelId' - The ID of the composite model that contains the asset property.
+--
+-- 'id', 'assetPropertySummary_id' - The ID of the property.
+--
+-- 'notification', 'assetPropertySummary_notification' - Undocumented member.
+--
+-- 'unit', 'assetPropertySummary_unit' - The unit of measure (such as Newtons or RPM) of the asset property.
+newAssetPropertySummary ::
+  AssetPropertySummary
+newAssetPropertySummary =
+  AssetPropertySummary'
+    { alias = Prelude.Nothing,
+      assetCompositeModelId = Prelude.Nothing,
+      id = Prelude.Nothing,
+      notification = Prelude.Nothing,
+      unit = Prelude.Nothing
+    }
+
+-- | The alias that identifies the property, such as an OPC-UA server data
+-- stream path (for example,
+-- @\/company\/windfarm\/3\/turbine\/7\/temperature@). For more
+-- information, see
+-- <https://docs.aws.amazon.com/iot-sitewise/latest/userguide/connect-data-streams.html Mapping industrial data streams to asset properties>
+-- in the /IoT SiteWise User Guide/.
+assetPropertySummary_alias :: Lens.Lens' AssetPropertySummary (Prelude.Maybe Prelude.Text)
+assetPropertySummary_alias = Lens.lens (\AssetPropertySummary' {alias} -> alias) (\s@AssetPropertySummary' {} a -> s {alias = a} :: AssetPropertySummary)
+
+-- | The ID of the composite model that contains the asset property.
+assetPropertySummary_assetCompositeModelId :: Lens.Lens' AssetPropertySummary (Prelude.Maybe Prelude.Text)
+assetPropertySummary_assetCompositeModelId = Lens.lens (\AssetPropertySummary' {assetCompositeModelId} -> assetCompositeModelId) (\s@AssetPropertySummary' {} a -> s {assetCompositeModelId = a} :: AssetPropertySummary)
+
+-- | The ID of the property.
+assetPropertySummary_id :: Lens.Lens' AssetPropertySummary (Prelude.Maybe Prelude.Text)
+assetPropertySummary_id = Lens.lens (\AssetPropertySummary' {id} -> id) (\s@AssetPropertySummary' {} a -> s {id = a} :: AssetPropertySummary)
+
+-- | Undocumented member.
+assetPropertySummary_notification :: Lens.Lens' AssetPropertySummary (Prelude.Maybe PropertyNotification)
+assetPropertySummary_notification = Lens.lens (\AssetPropertySummary' {notification} -> notification) (\s@AssetPropertySummary' {} a -> s {notification = a} :: AssetPropertySummary)
+
+-- | The unit of measure (such as Newtons or RPM) of the asset property.
+assetPropertySummary_unit :: Lens.Lens' AssetPropertySummary (Prelude.Maybe Prelude.Text)
+assetPropertySummary_unit = Lens.lens (\AssetPropertySummary' {unit} -> unit) (\s@AssetPropertySummary' {} a -> s {unit = a} :: AssetPropertySummary)
+
+instance Data.FromJSON AssetPropertySummary where
+  parseJSON =
+    Data.withObject
+      "AssetPropertySummary"
+      ( \x ->
+          AssetPropertySummary'
+            Prelude.<$> (x Data..:? "alias")
+            Prelude.<*> (x Data..:? "assetCompositeModelId")
+            Prelude.<*> (x Data..:? "id")
+            Prelude.<*> (x Data..:? "notification")
+            Prelude.<*> (x Data..:? "unit")
+      )
+
+instance Prelude.Hashable AssetPropertySummary where
+  hashWithSalt _salt AssetPropertySummary' {..} =
+    _salt
+      `Prelude.hashWithSalt` alias
+      `Prelude.hashWithSalt` assetCompositeModelId
+      `Prelude.hashWithSalt` id
+      `Prelude.hashWithSalt` notification
+      `Prelude.hashWithSalt` unit
+
+instance Prelude.NFData AssetPropertySummary where
+  rnf AssetPropertySummary' {..} =
+    Prelude.rnf alias
+      `Prelude.seq` Prelude.rnf assetCompositeModelId
+      `Prelude.seq` Prelude.rnf id
+      `Prelude.seq` Prelude.rnf notification
+      `Prelude.seq` Prelude.rnf unit
diff --git a/gen/Amazonka/IoTSiteWise/Types/AssetPropertyValue.hs b/gen/Amazonka/IoTSiteWise/Types/AssetPropertyValue.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/IoTSiteWise/Types/AssetPropertyValue.hs
@@ -0,0 +1,113 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.IoTSiteWise.Types.AssetPropertyValue
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.IoTSiteWise.Types.AssetPropertyValue where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.IoTSiteWise.Types.Quality
+import Amazonka.IoTSiteWise.Types.TimeInNanos
+import Amazonka.IoTSiteWise.Types.Variant
+import qualified Amazonka.Prelude as Prelude
+
+-- | Contains asset property value information.
+--
+-- /See:/ 'newAssetPropertyValue' smart constructor.
+data AssetPropertyValue = AssetPropertyValue'
+  { -- | The quality of the asset property value.
+    quality :: Prelude.Maybe Quality,
+    -- | The value of the asset property (see @Variant@).
+    value :: Variant,
+    -- | The timestamp of the asset property value.
+    timestamp :: TimeInNanos
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'AssetPropertyValue' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'quality', 'assetPropertyValue_quality' - The quality of the asset property value.
+--
+-- 'value', 'assetPropertyValue_value' - The value of the asset property (see @Variant@).
+--
+-- 'timestamp', 'assetPropertyValue_timestamp' - The timestamp of the asset property value.
+newAssetPropertyValue ::
+  -- | 'value'
+  Variant ->
+  -- | 'timestamp'
+  TimeInNanos ->
+  AssetPropertyValue
+newAssetPropertyValue pValue_ pTimestamp_ =
+  AssetPropertyValue'
+    { quality = Prelude.Nothing,
+      value = pValue_,
+      timestamp = pTimestamp_
+    }
+
+-- | The quality of the asset property value.
+assetPropertyValue_quality :: Lens.Lens' AssetPropertyValue (Prelude.Maybe Quality)
+assetPropertyValue_quality = Lens.lens (\AssetPropertyValue' {quality} -> quality) (\s@AssetPropertyValue' {} a -> s {quality = a} :: AssetPropertyValue)
+
+-- | The value of the asset property (see @Variant@).
+assetPropertyValue_value :: Lens.Lens' AssetPropertyValue Variant
+assetPropertyValue_value = Lens.lens (\AssetPropertyValue' {value} -> value) (\s@AssetPropertyValue' {} a -> s {value = a} :: AssetPropertyValue)
+
+-- | The timestamp of the asset property value.
+assetPropertyValue_timestamp :: Lens.Lens' AssetPropertyValue TimeInNanos
+assetPropertyValue_timestamp = Lens.lens (\AssetPropertyValue' {timestamp} -> timestamp) (\s@AssetPropertyValue' {} a -> s {timestamp = a} :: AssetPropertyValue)
+
+instance Data.FromJSON AssetPropertyValue where
+  parseJSON =
+    Data.withObject
+      "AssetPropertyValue"
+      ( \x ->
+          AssetPropertyValue'
+            Prelude.<$> (x Data..:? "quality")
+            Prelude.<*> (x Data..: "value")
+            Prelude.<*> (x Data..: "timestamp")
+      )
+
+instance Prelude.Hashable AssetPropertyValue where
+  hashWithSalt _salt AssetPropertyValue' {..} =
+    _salt
+      `Prelude.hashWithSalt` quality
+      `Prelude.hashWithSalt` value
+      `Prelude.hashWithSalt` timestamp
+
+instance Prelude.NFData AssetPropertyValue where
+  rnf AssetPropertyValue' {..} =
+    Prelude.rnf quality
+      `Prelude.seq` Prelude.rnf value
+      `Prelude.seq` Prelude.rnf timestamp
+
+instance Data.ToJSON AssetPropertyValue where
+  toJSON AssetPropertyValue' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("quality" Data..=) Prelude.<$> quality,
+            Prelude.Just ("value" Data..= value),
+            Prelude.Just ("timestamp" Data..= timestamp)
+          ]
+      )
diff --git a/gen/Amazonka/IoTSiteWise/Types/AssetRelationshipSummary.hs b/gen/Amazonka/IoTSiteWise/Types/AssetRelationshipSummary.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/IoTSiteWise/Types/AssetRelationshipSummary.hs
@@ -0,0 +1,110 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.IoTSiteWise.Types.AssetRelationshipSummary
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.IoTSiteWise.Types.AssetRelationshipSummary where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.IoTSiteWise.Types.AssetHierarchyInfo
+import Amazonka.IoTSiteWise.Types.AssetRelationshipType
+import qualified Amazonka.Prelude as Prelude
+
+-- | Contains information about assets that are related to one another.
+--
+-- /See:/ 'newAssetRelationshipSummary' smart constructor.
+data AssetRelationshipSummary = AssetRelationshipSummary'
+  { -- | The assets that are related through an asset hierarchy.
+    --
+    -- This object is present if the @relationshipType@ is @HIERARCHY@.
+    hierarchyInfo :: Prelude.Maybe AssetHierarchyInfo,
+    -- | The relationship type of the assets in this relationship. This value is
+    -- one of the following:
+    --
+    -- -   @HIERARCHY@ – The assets are related through an asset hierarchy. If
+    --     you specify this relationship type, this asset relationship includes
+    --     the @hierarchyInfo@ object.
+    relationshipType :: AssetRelationshipType
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'AssetRelationshipSummary' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'hierarchyInfo', 'assetRelationshipSummary_hierarchyInfo' - The assets that are related through an asset hierarchy.
+--
+-- This object is present if the @relationshipType@ is @HIERARCHY@.
+--
+-- 'relationshipType', 'assetRelationshipSummary_relationshipType' - The relationship type of the assets in this relationship. This value is
+-- one of the following:
+--
+-- -   @HIERARCHY@ – The assets are related through an asset hierarchy. If
+--     you specify this relationship type, this asset relationship includes
+--     the @hierarchyInfo@ object.
+newAssetRelationshipSummary ::
+  -- | 'relationshipType'
+  AssetRelationshipType ->
+  AssetRelationshipSummary
+newAssetRelationshipSummary pRelationshipType_ =
+  AssetRelationshipSummary'
+    { hierarchyInfo =
+        Prelude.Nothing,
+      relationshipType = pRelationshipType_
+    }
+
+-- | The assets that are related through an asset hierarchy.
+--
+-- This object is present if the @relationshipType@ is @HIERARCHY@.
+assetRelationshipSummary_hierarchyInfo :: Lens.Lens' AssetRelationshipSummary (Prelude.Maybe AssetHierarchyInfo)
+assetRelationshipSummary_hierarchyInfo = Lens.lens (\AssetRelationshipSummary' {hierarchyInfo} -> hierarchyInfo) (\s@AssetRelationshipSummary' {} a -> s {hierarchyInfo = a} :: AssetRelationshipSummary)
+
+-- | The relationship type of the assets in this relationship. This value is
+-- one of the following:
+--
+-- -   @HIERARCHY@ – The assets are related through an asset hierarchy. If
+--     you specify this relationship type, this asset relationship includes
+--     the @hierarchyInfo@ object.
+assetRelationshipSummary_relationshipType :: Lens.Lens' AssetRelationshipSummary AssetRelationshipType
+assetRelationshipSummary_relationshipType = Lens.lens (\AssetRelationshipSummary' {relationshipType} -> relationshipType) (\s@AssetRelationshipSummary' {} a -> s {relationshipType = a} :: AssetRelationshipSummary)
+
+instance Data.FromJSON AssetRelationshipSummary where
+  parseJSON =
+    Data.withObject
+      "AssetRelationshipSummary"
+      ( \x ->
+          AssetRelationshipSummary'
+            Prelude.<$> (x Data..:? "hierarchyInfo")
+            Prelude.<*> (x Data..: "relationshipType")
+      )
+
+instance Prelude.Hashable AssetRelationshipSummary where
+  hashWithSalt _salt AssetRelationshipSummary' {..} =
+    _salt
+      `Prelude.hashWithSalt` hierarchyInfo
+      `Prelude.hashWithSalt` relationshipType
+
+instance Prelude.NFData AssetRelationshipSummary where
+  rnf AssetRelationshipSummary' {..} =
+    Prelude.rnf hierarchyInfo
+      `Prelude.seq` Prelude.rnf relationshipType
diff --git a/gen/Amazonka/IoTSiteWise/Types/AssetRelationshipType.hs b/gen/Amazonka/IoTSiteWise/Types/AssetRelationshipType.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/IoTSiteWise/Types/AssetRelationshipType.hs
@@ -0,0 +1,66 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DerivingStrategies #-}
+{-# LANGUAGE GeneralizedNewtypeDeriving #-}
+{-# LANGUAGE LambdaCase #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE PatternSynonyms #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.IoTSiteWise.Types.AssetRelationshipType
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.IoTSiteWise.Types.AssetRelationshipType
+  ( AssetRelationshipType
+      ( ..,
+        AssetRelationshipType_HIERARCHY
+      ),
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+newtype AssetRelationshipType = AssetRelationshipType'
+  { fromAssetRelationshipType ::
+      Data.Text
+  }
+  deriving stock
+    ( Prelude.Show,
+      Prelude.Read,
+      Prelude.Eq,
+      Prelude.Ord,
+      Prelude.Generic
+    )
+  deriving newtype
+    ( Prelude.Hashable,
+      Prelude.NFData,
+      Data.FromText,
+      Data.ToText,
+      Data.ToByteString,
+      Data.ToLog,
+      Data.ToHeader,
+      Data.ToQuery,
+      Data.FromJSON,
+      Data.FromJSONKey,
+      Data.ToJSON,
+      Data.ToJSONKey,
+      Data.FromXML,
+      Data.ToXML
+    )
+
+pattern AssetRelationshipType_HIERARCHY :: AssetRelationshipType
+pattern AssetRelationshipType_HIERARCHY = AssetRelationshipType' "HIERARCHY"
+
+{-# COMPLETE
+  AssetRelationshipType_HIERARCHY,
+  AssetRelationshipType'
+  #-}
diff --git a/gen/Amazonka/IoTSiteWise/Types/AssetState.hs b/gen/Amazonka/IoTSiteWise/Types/AssetState.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/IoTSiteWise/Types/AssetState.hs
@@ -0,0 +1,86 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DerivingStrategies #-}
+{-# LANGUAGE GeneralizedNewtypeDeriving #-}
+{-# LANGUAGE LambdaCase #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE PatternSynonyms #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.IoTSiteWise.Types.AssetState
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.IoTSiteWise.Types.AssetState
+  ( AssetState
+      ( ..,
+        AssetState_ACTIVE,
+        AssetState_CREATING,
+        AssetState_DELETING,
+        AssetState_FAILED,
+        AssetState_UPDATING
+      ),
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+newtype AssetState = AssetState'
+  { fromAssetState ::
+      Data.Text
+  }
+  deriving stock
+    ( Prelude.Show,
+      Prelude.Read,
+      Prelude.Eq,
+      Prelude.Ord,
+      Prelude.Generic
+    )
+  deriving newtype
+    ( Prelude.Hashable,
+      Prelude.NFData,
+      Data.FromText,
+      Data.ToText,
+      Data.ToByteString,
+      Data.ToLog,
+      Data.ToHeader,
+      Data.ToQuery,
+      Data.FromJSON,
+      Data.FromJSONKey,
+      Data.ToJSON,
+      Data.ToJSONKey,
+      Data.FromXML,
+      Data.ToXML
+    )
+
+pattern AssetState_ACTIVE :: AssetState
+pattern AssetState_ACTIVE = AssetState' "ACTIVE"
+
+pattern AssetState_CREATING :: AssetState
+pattern AssetState_CREATING = AssetState' "CREATING"
+
+pattern AssetState_DELETING :: AssetState
+pattern AssetState_DELETING = AssetState' "DELETING"
+
+pattern AssetState_FAILED :: AssetState
+pattern AssetState_FAILED = AssetState' "FAILED"
+
+pattern AssetState_UPDATING :: AssetState
+pattern AssetState_UPDATING = AssetState' "UPDATING"
+
+{-# COMPLETE
+  AssetState_ACTIVE,
+  AssetState_CREATING,
+  AssetState_DELETING,
+  AssetState_FAILED,
+  AssetState_UPDATING,
+  AssetState'
+  #-}
diff --git a/gen/Amazonka/IoTSiteWise/Types/AssetStatus.hs b/gen/Amazonka/IoTSiteWise/Types/AssetStatus.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/IoTSiteWise/Types/AssetStatus.hs
@@ -0,0 +1,90 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.IoTSiteWise.Types.AssetStatus
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.IoTSiteWise.Types.AssetStatus where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.IoTSiteWise.Types.AssetState
+import Amazonka.IoTSiteWise.Types.ErrorDetails
+import qualified Amazonka.Prelude as Prelude
+
+-- | Contains information about the current status of an asset. For more
+-- information, see
+-- <https://docs.aws.amazon.com/iot-sitewise/latest/userguide/asset-and-model-states.html Asset and model states>
+-- in the /IoT SiteWise User Guide/.
+--
+-- /See:/ 'newAssetStatus' smart constructor.
+data AssetStatus = AssetStatus'
+  { -- | Contains associated error information, if any.
+    error :: Prelude.Maybe ErrorDetails,
+    -- | The current status of the asset.
+    state :: AssetState
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'AssetStatus' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'error', 'assetStatus_error' - Contains associated error information, if any.
+--
+-- 'state', 'assetStatus_state' - The current status of the asset.
+newAssetStatus ::
+  -- | 'state'
+  AssetState ->
+  AssetStatus
+newAssetStatus pState_ =
+  AssetStatus'
+    { error = Prelude.Nothing,
+      state = pState_
+    }
+
+-- | Contains associated error information, if any.
+assetStatus_error :: Lens.Lens' AssetStatus (Prelude.Maybe ErrorDetails)
+assetStatus_error = Lens.lens (\AssetStatus' {error} -> error) (\s@AssetStatus' {} a -> s {error = a} :: AssetStatus)
+
+-- | The current status of the asset.
+assetStatus_state :: Lens.Lens' AssetStatus AssetState
+assetStatus_state = Lens.lens (\AssetStatus' {state} -> state) (\s@AssetStatus' {} a -> s {state = a} :: AssetStatus)
+
+instance Data.FromJSON AssetStatus where
+  parseJSON =
+    Data.withObject
+      "AssetStatus"
+      ( \x ->
+          AssetStatus'
+            Prelude.<$> (x Data..:? "error")
+            Prelude.<*> (x Data..: "state")
+      )
+
+instance Prelude.Hashable AssetStatus where
+  hashWithSalt _salt AssetStatus' {..} =
+    _salt
+      `Prelude.hashWithSalt` error
+      `Prelude.hashWithSalt` state
+
+instance Prelude.NFData AssetStatus where
+  rnf AssetStatus' {..} =
+    Prelude.rnf error `Prelude.seq` Prelude.rnf state
diff --git a/gen/Amazonka/IoTSiteWise/Types/AssetSummary.hs b/gen/Amazonka/IoTSiteWise/Types/AssetSummary.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/IoTSiteWise/Types/AssetSummary.hs
@@ -0,0 +1,206 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.IoTSiteWise.Types.AssetSummary
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.IoTSiteWise.Types.AssetSummary where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.IoTSiteWise.Types.AssetHierarchy
+import Amazonka.IoTSiteWise.Types.AssetStatus
+import qualified Amazonka.Prelude as Prelude
+
+-- | Contains a summary of an asset.
+--
+-- /See:/ 'newAssetSummary' smart constructor.
+data AssetSummary = AssetSummary'
+  { -- | A description for the asset.
+    description :: Prelude.Maybe Prelude.Text,
+    -- | The ID of the asset.
+    id :: Prelude.Text,
+    -- | The
+    -- <https://docs.aws.amazon.com/general/latest/gr/aws-arns-and-namespaces.html ARN>
+    -- of the asset, which has the following format.
+    --
+    -- @arn:${Partition}:iotsitewise:${Region}:${Account}:asset\/${AssetId}@
+    arn :: Prelude.Text,
+    -- | The name of the asset.
+    name :: Prelude.Text,
+    -- | The ID of the asset model used to create this asset.
+    assetModelId :: Prelude.Text,
+    -- | The date the asset was created, in Unix epoch time.
+    creationDate :: Data.POSIX,
+    -- | The date the asset was last updated, in Unix epoch time.
+    lastUpdateDate :: Data.POSIX,
+    -- | The current status of the asset.
+    status :: AssetStatus,
+    -- | A list of asset hierarchies that each contain a @hierarchyId@. A
+    -- hierarchy specifies allowed parent\/child asset relationships.
+    hierarchies :: [AssetHierarchy]
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'AssetSummary' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'description', 'assetSummary_description' - A description for the asset.
+--
+-- 'id', 'assetSummary_id' - The ID of the asset.
+--
+-- 'arn', 'assetSummary_arn' - The
+-- <https://docs.aws.amazon.com/general/latest/gr/aws-arns-and-namespaces.html ARN>
+-- of the asset, which has the following format.
+--
+-- @arn:${Partition}:iotsitewise:${Region}:${Account}:asset\/${AssetId}@
+--
+-- 'name', 'assetSummary_name' - The name of the asset.
+--
+-- 'assetModelId', 'assetSummary_assetModelId' - The ID of the asset model used to create this asset.
+--
+-- 'creationDate', 'assetSummary_creationDate' - The date the asset was created, in Unix epoch time.
+--
+-- 'lastUpdateDate', 'assetSummary_lastUpdateDate' - The date the asset was last updated, in Unix epoch time.
+--
+-- 'status', 'assetSummary_status' - The current status of the asset.
+--
+-- 'hierarchies', 'assetSummary_hierarchies' - A list of asset hierarchies that each contain a @hierarchyId@. A
+-- hierarchy specifies allowed parent\/child asset relationships.
+newAssetSummary ::
+  -- | 'id'
+  Prelude.Text ->
+  -- | 'arn'
+  Prelude.Text ->
+  -- | 'name'
+  Prelude.Text ->
+  -- | 'assetModelId'
+  Prelude.Text ->
+  -- | 'creationDate'
+  Prelude.UTCTime ->
+  -- | 'lastUpdateDate'
+  Prelude.UTCTime ->
+  -- | 'status'
+  AssetStatus ->
+  AssetSummary
+newAssetSummary
+  pId_
+  pArn_
+  pName_
+  pAssetModelId_
+  pCreationDate_
+  pLastUpdateDate_
+  pStatus_ =
+    AssetSummary'
+      { description = Prelude.Nothing,
+        id = pId_,
+        arn = pArn_,
+        name = pName_,
+        assetModelId = pAssetModelId_,
+        creationDate = Data._Time Lens.# pCreationDate_,
+        lastUpdateDate = Data._Time Lens.# pLastUpdateDate_,
+        status = pStatus_,
+        hierarchies = Prelude.mempty
+      }
+
+-- | A description for the asset.
+assetSummary_description :: Lens.Lens' AssetSummary (Prelude.Maybe Prelude.Text)
+assetSummary_description = Lens.lens (\AssetSummary' {description} -> description) (\s@AssetSummary' {} a -> s {description = a} :: AssetSummary)
+
+-- | The ID of the asset.
+assetSummary_id :: Lens.Lens' AssetSummary Prelude.Text
+assetSummary_id = Lens.lens (\AssetSummary' {id} -> id) (\s@AssetSummary' {} a -> s {id = a} :: AssetSummary)
+
+-- | The
+-- <https://docs.aws.amazon.com/general/latest/gr/aws-arns-and-namespaces.html ARN>
+-- of the asset, which has the following format.
+--
+-- @arn:${Partition}:iotsitewise:${Region}:${Account}:asset\/${AssetId}@
+assetSummary_arn :: Lens.Lens' AssetSummary Prelude.Text
+assetSummary_arn = Lens.lens (\AssetSummary' {arn} -> arn) (\s@AssetSummary' {} a -> s {arn = a} :: AssetSummary)
+
+-- | The name of the asset.
+assetSummary_name :: Lens.Lens' AssetSummary Prelude.Text
+assetSummary_name = Lens.lens (\AssetSummary' {name} -> name) (\s@AssetSummary' {} a -> s {name = a} :: AssetSummary)
+
+-- | The ID of the asset model used to create this asset.
+assetSummary_assetModelId :: Lens.Lens' AssetSummary Prelude.Text
+assetSummary_assetModelId = Lens.lens (\AssetSummary' {assetModelId} -> assetModelId) (\s@AssetSummary' {} a -> s {assetModelId = a} :: AssetSummary)
+
+-- | The date the asset was created, in Unix epoch time.
+assetSummary_creationDate :: Lens.Lens' AssetSummary Prelude.UTCTime
+assetSummary_creationDate = Lens.lens (\AssetSummary' {creationDate} -> creationDate) (\s@AssetSummary' {} a -> s {creationDate = a} :: AssetSummary) Prelude.. Data._Time
+
+-- | The date the asset was last updated, in Unix epoch time.
+assetSummary_lastUpdateDate :: Lens.Lens' AssetSummary Prelude.UTCTime
+assetSummary_lastUpdateDate = Lens.lens (\AssetSummary' {lastUpdateDate} -> lastUpdateDate) (\s@AssetSummary' {} a -> s {lastUpdateDate = a} :: AssetSummary) Prelude.. Data._Time
+
+-- | The current status of the asset.
+assetSummary_status :: Lens.Lens' AssetSummary AssetStatus
+assetSummary_status = Lens.lens (\AssetSummary' {status} -> status) (\s@AssetSummary' {} a -> s {status = a} :: AssetSummary)
+
+-- | A list of asset hierarchies that each contain a @hierarchyId@. A
+-- hierarchy specifies allowed parent\/child asset relationships.
+assetSummary_hierarchies :: Lens.Lens' AssetSummary [AssetHierarchy]
+assetSummary_hierarchies = Lens.lens (\AssetSummary' {hierarchies} -> hierarchies) (\s@AssetSummary' {} a -> s {hierarchies = a} :: AssetSummary) Prelude.. Lens.coerced
+
+instance Data.FromJSON AssetSummary where
+  parseJSON =
+    Data.withObject
+      "AssetSummary"
+      ( \x ->
+          AssetSummary'
+            Prelude.<$> (x Data..:? "description")
+            Prelude.<*> (x Data..: "id")
+            Prelude.<*> (x Data..: "arn")
+            Prelude.<*> (x Data..: "name")
+            Prelude.<*> (x Data..: "assetModelId")
+            Prelude.<*> (x Data..: "creationDate")
+            Prelude.<*> (x Data..: "lastUpdateDate")
+            Prelude.<*> (x Data..: "status")
+            Prelude.<*> (x Data..:? "hierarchies" Data..!= Prelude.mempty)
+      )
+
+instance Prelude.Hashable AssetSummary where
+  hashWithSalt _salt AssetSummary' {..} =
+    _salt
+      `Prelude.hashWithSalt` description
+      `Prelude.hashWithSalt` id
+      `Prelude.hashWithSalt` arn
+      `Prelude.hashWithSalt` name
+      `Prelude.hashWithSalt` assetModelId
+      `Prelude.hashWithSalt` creationDate
+      `Prelude.hashWithSalt` lastUpdateDate
+      `Prelude.hashWithSalt` status
+      `Prelude.hashWithSalt` hierarchies
+
+instance Prelude.NFData AssetSummary where
+  rnf AssetSummary' {..} =
+    Prelude.rnf description
+      `Prelude.seq` Prelude.rnf id
+      `Prelude.seq` Prelude.rnf arn
+      `Prelude.seq` Prelude.rnf name
+      `Prelude.seq` Prelude.rnf assetModelId
+      `Prelude.seq` Prelude.rnf creationDate
+      `Prelude.seq` Prelude.rnf lastUpdateDate
+      `Prelude.seq` Prelude.rnf status
+      `Prelude.seq` Prelude.rnf hierarchies
diff --git a/gen/Amazonka/IoTSiteWise/Types/AssociatedAssetsSummary.hs b/gen/Amazonka/IoTSiteWise/Types/AssociatedAssetsSummary.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/IoTSiteWise/Types/AssociatedAssetsSummary.hs
@@ -0,0 +1,208 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.IoTSiteWise.Types.AssociatedAssetsSummary
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.IoTSiteWise.Types.AssociatedAssetsSummary where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.IoTSiteWise.Types.AssetHierarchy
+import Amazonka.IoTSiteWise.Types.AssetStatus
+import qualified Amazonka.Prelude as Prelude
+
+-- | Contains a summary of an associated asset.
+--
+-- /See:/ 'newAssociatedAssetsSummary' smart constructor.
+data AssociatedAssetsSummary = AssociatedAssetsSummary'
+  { -- | A description for the asset.
+    description :: Prelude.Maybe Prelude.Text,
+    -- | The ID of the asset.
+    id :: Prelude.Text,
+    -- | The
+    -- <https://docs.aws.amazon.com/general/latest/gr/aws-arns-and-namespaces.html ARN>
+    -- of the asset, which has the following format.
+    --
+    -- @arn:${Partition}:iotsitewise:${Region}:${Account}:asset\/${AssetId}@
+    arn :: Prelude.Text,
+    -- | The name of the asset.
+    name :: Prelude.Text,
+    -- | The ID of the asset model used to create the asset.
+    assetModelId :: Prelude.Text,
+    -- | The date the asset was created, in Unix epoch time.
+    creationDate :: Data.POSIX,
+    -- | The date the asset was last updated, in Unix epoch time.
+    lastUpdateDate :: Data.POSIX,
+    -- | The current status of the asset.
+    status :: AssetStatus,
+    -- | A list of asset hierarchies that each contain a @hierarchyId@. A
+    -- hierarchy specifies allowed parent\/child asset relationships.
+    hierarchies :: [AssetHierarchy]
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'AssociatedAssetsSummary' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'description', 'associatedAssetsSummary_description' - A description for the asset.
+--
+-- 'id', 'associatedAssetsSummary_id' - The ID of the asset.
+--
+-- 'arn', 'associatedAssetsSummary_arn' - The
+-- <https://docs.aws.amazon.com/general/latest/gr/aws-arns-and-namespaces.html ARN>
+-- of the asset, which has the following format.
+--
+-- @arn:${Partition}:iotsitewise:${Region}:${Account}:asset\/${AssetId}@
+--
+-- 'name', 'associatedAssetsSummary_name' - The name of the asset.
+--
+-- 'assetModelId', 'associatedAssetsSummary_assetModelId' - The ID of the asset model used to create the asset.
+--
+-- 'creationDate', 'associatedAssetsSummary_creationDate' - The date the asset was created, in Unix epoch time.
+--
+-- 'lastUpdateDate', 'associatedAssetsSummary_lastUpdateDate' - The date the asset was last updated, in Unix epoch time.
+--
+-- 'status', 'associatedAssetsSummary_status' - The current status of the asset.
+--
+-- 'hierarchies', 'associatedAssetsSummary_hierarchies' - A list of asset hierarchies that each contain a @hierarchyId@. A
+-- hierarchy specifies allowed parent\/child asset relationships.
+newAssociatedAssetsSummary ::
+  -- | 'id'
+  Prelude.Text ->
+  -- | 'arn'
+  Prelude.Text ->
+  -- | 'name'
+  Prelude.Text ->
+  -- | 'assetModelId'
+  Prelude.Text ->
+  -- | 'creationDate'
+  Prelude.UTCTime ->
+  -- | 'lastUpdateDate'
+  Prelude.UTCTime ->
+  -- | 'status'
+  AssetStatus ->
+  AssociatedAssetsSummary
+newAssociatedAssetsSummary
+  pId_
+  pArn_
+  pName_
+  pAssetModelId_
+  pCreationDate_
+  pLastUpdateDate_
+  pStatus_ =
+    AssociatedAssetsSummary'
+      { description =
+          Prelude.Nothing,
+        id = pId_,
+        arn = pArn_,
+        name = pName_,
+        assetModelId = pAssetModelId_,
+        creationDate = Data._Time Lens.# pCreationDate_,
+        lastUpdateDate =
+          Data._Time Lens.# pLastUpdateDate_,
+        status = pStatus_,
+        hierarchies = Prelude.mempty
+      }
+
+-- | A description for the asset.
+associatedAssetsSummary_description :: Lens.Lens' AssociatedAssetsSummary (Prelude.Maybe Prelude.Text)
+associatedAssetsSummary_description = Lens.lens (\AssociatedAssetsSummary' {description} -> description) (\s@AssociatedAssetsSummary' {} a -> s {description = a} :: AssociatedAssetsSummary)
+
+-- | The ID of the asset.
+associatedAssetsSummary_id :: Lens.Lens' AssociatedAssetsSummary Prelude.Text
+associatedAssetsSummary_id = Lens.lens (\AssociatedAssetsSummary' {id} -> id) (\s@AssociatedAssetsSummary' {} a -> s {id = a} :: AssociatedAssetsSummary)
+
+-- | The
+-- <https://docs.aws.amazon.com/general/latest/gr/aws-arns-and-namespaces.html ARN>
+-- of the asset, which has the following format.
+--
+-- @arn:${Partition}:iotsitewise:${Region}:${Account}:asset\/${AssetId}@
+associatedAssetsSummary_arn :: Lens.Lens' AssociatedAssetsSummary Prelude.Text
+associatedAssetsSummary_arn = Lens.lens (\AssociatedAssetsSummary' {arn} -> arn) (\s@AssociatedAssetsSummary' {} a -> s {arn = a} :: AssociatedAssetsSummary)
+
+-- | The name of the asset.
+associatedAssetsSummary_name :: Lens.Lens' AssociatedAssetsSummary Prelude.Text
+associatedAssetsSummary_name = Lens.lens (\AssociatedAssetsSummary' {name} -> name) (\s@AssociatedAssetsSummary' {} a -> s {name = a} :: AssociatedAssetsSummary)
+
+-- | The ID of the asset model used to create the asset.
+associatedAssetsSummary_assetModelId :: Lens.Lens' AssociatedAssetsSummary Prelude.Text
+associatedAssetsSummary_assetModelId = Lens.lens (\AssociatedAssetsSummary' {assetModelId} -> assetModelId) (\s@AssociatedAssetsSummary' {} a -> s {assetModelId = a} :: AssociatedAssetsSummary)
+
+-- | The date the asset was created, in Unix epoch time.
+associatedAssetsSummary_creationDate :: Lens.Lens' AssociatedAssetsSummary Prelude.UTCTime
+associatedAssetsSummary_creationDate = Lens.lens (\AssociatedAssetsSummary' {creationDate} -> creationDate) (\s@AssociatedAssetsSummary' {} a -> s {creationDate = a} :: AssociatedAssetsSummary) Prelude.. Data._Time
+
+-- | The date the asset was last updated, in Unix epoch time.
+associatedAssetsSummary_lastUpdateDate :: Lens.Lens' AssociatedAssetsSummary Prelude.UTCTime
+associatedAssetsSummary_lastUpdateDate = Lens.lens (\AssociatedAssetsSummary' {lastUpdateDate} -> lastUpdateDate) (\s@AssociatedAssetsSummary' {} a -> s {lastUpdateDate = a} :: AssociatedAssetsSummary) Prelude.. Data._Time
+
+-- | The current status of the asset.
+associatedAssetsSummary_status :: Lens.Lens' AssociatedAssetsSummary AssetStatus
+associatedAssetsSummary_status = Lens.lens (\AssociatedAssetsSummary' {status} -> status) (\s@AssociatedAssetsSummary' {} a -> s {status = a} :: AssociatedAssetsSummary)
+
+-- | A list of asset hierarchies that each contain a @hierarchyId@. A
+-- hierarchy specifies allowed parent\/child asset relationships.
+associatedAssetsSummary_hierarchies :: Lens.Lens' AssociatedAssetsSummary [AssetHierarchy]
+associatedAssetsSummary_hierarchies = Lens.lens (\AssociatedAssetsSummary' {hierarchies} -> hierarchies) (\s@AssociatedAssetsSummary' {} a -> s {hierarchies = a} :: AssociatedAssetsSummary) Prelude.. Lens.coerced
+
+instance Data.FromJSON AssociatedAssetsSummary where
+  parseJSON =
+    Data.withObject
+      "AssociatedAssetsSummary"
+      ( \x ->
+          AssociatedAssetsSummary'
+            Prelude.<$> (x Data..:? "description")
+            Prelude.<*> (x Data..: "id")
+            Prelude.<*> (x Data..: "arn")
+            Prelude.<*> (x Data..: "name")
+            Prelude.<*> (x Data..: "assetModelId")
+            Prelude.<*> (x Data..: "creationDate")
+            Prelude.<*> (x Data..: "lastUpdateDate")
+            Prelude.<*> (x Data..: "status")
+            Prelude.<*> (x Data..:? "hierarchies" Data..!= Prelude.mempty)
+      )
+
+instance Prelude.Hashable AssociatedAssetsSummary where
+  hashWithSalt _salt AssociatedAssetsSummary' {..} =
+    _salt
+      `Prelude.hashWithSalt` description
+      `Prelude.hashWithSalt` id
+      `Prelude.hashWithSalt` arn
+      `Prelude.hashWithSalt` name
+      `Prelude.hashWithSalt` assetModelId
+      `Prelude.hashWithSalt` creationDate
+      `Prelude.hashWithSalt` lastUpdateDate
+      `Prelude.hashWithSalt` status
+      `Prelude.hashWithSalt` hierarchies
+
+instance Prelude.NFData AssociatedAssetsSummary where
+  rnf AssociatedAssetsSummary' {..} =
+    Prelude.rnf description
+      `Prelude.seq` Prelude.rnf id
+      `Prelude.seq` Prelude.rnf arn
+      `Prelude.seq` Prelude.rnf name
+      `Prelude.seq` Prelude.rnf assetModelId
+      `Prelude.seq` Prelude.rnf creationDate
+      `Prelude.seq` Prelude.rnf lastUpdateDate
+      `Prelude.seq` Prelude.rnf status
+      `Prelude.seq` Prelude.rnf hierarchies
diff --git a/gen/Amazonka/IoTSiteWise/Types/Attribute.hs b/gen/Amazonka/IoTSiteWise/Types/Attribute.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/IoTSiteWise/Types/Attribute.hs
@@ -0,0 +1,91 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.IoTSiteWise.Types.Attribute
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.IoTSiteWise.Types.Attribute where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+-- | Contains an asset attribute property. For more information, see
+-- <https://docs.aws.amazon.com/iot-sitewise/latest/userguide/asset-properties.html#attributes Attributes>
+-- in the /IoT SiteWise User Guide/.
+--
+-- /See:/ 'newAttribute' smart constructor.
+data Attribute = Attribute'
+  { -- | The default value of the asset model property attribute. All assets that
+    -- you create from the asset model contain this attribute value. You can
+    -- update an attribute\'s value after you create an asset. For more
+    -- information, see
+    -- <https://docs.aws.amazon.com/iot-sitewise/latest/userguide/update-attribute-values.html Updating attribute values>
+    -- in the /IoT SiteWise User Guide/.
+    defaultValue :: Prelude.Maybe Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'Attribute' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'defaultValue', 'attribute_defaultValue' - The default value of the asset model property attribute. All assets that
+-- you create from the asset model contain this attribute value. You can
+-- update an attribute\'s value after you create an asset. For more
+-- information, see
+-- <https://docs.aws.amazon.com/iot-sitewise/latest/userguide/update-attribute-values.html Updating attribute values>
+-- in the /IoT SiteWise User Guide/.
+newAttribute ::
+  Attribute
+newAttribute =
+  Attribute' {defaultValue = Prelude.Nothing}
+
+-- | The default value of the asset model property attribute. All assets that
+-- you create from the asset model contain this attribute value. You can
+-- update an attribute\'s value after you create an asset. For more
+-- information, see
+-- <https://docs.aws.amazon.com/iot-sitewise/latest/userguide/update-attribute-values.html Updating attribute values>
+-- in the /IoT SiteWise User Guide/.
+attribute_defaultValue :: Lens.Lens' Attribute (Prelude.Maybe Prelude.Text)
+attribute_defaultValue = Lens.lens (\Attribute' {defaultValue} -> defaultValue) (\s@Attribute' {} a -> s {defaultValue = a} :: Attribute)
+
+instance Data.FromJSON Attribute where
+  parseJSON =
+    Data.withObject
+      "Attribute"
+      ( \x ->
+          Attribute' Prelude.<$> (x Data..:? "defaultValue")
+      )
+
+instance Prelude.Hashable Attribute where
+  hashWithSalt _salt Attribute' {..} =
+    _salt `Prelude.hashWithSalt` defaultValue
+
+instance Prelude.NFData Attribute where
+  rnf Attribute' {..} = Prelude.rnf defaultValue
+
+instance Data.ToJSON Attribute where
+  toJSON Attribute' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [("defaultValue" Data..=) Prelude.<$> defaultValue]
+      )
diff --git a/gen/Amazonka/IoTSiteWise/Types/AuthMode.hs b/gen/Amazonka/IoTSiteWise/Types/AuthMode.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/IoTSiteWise/Types/AuthMode.hs
@@ -0,0 +1,71 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DerivingStrategies #-}
+{-# LANGUAGE GeneralizedNewtypeDeriving #-}
+{-# LANGUAGE LambdaCase #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE PatternSynonyms #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.IoTSiteWise.Types.AuthMode
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.IoTSiteWise.Types.AuthMode
+  ( AuthMode
+      ( ..,
+        AuthMode_IAM,
+        AuthMode_SSO
+      ),
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+newtype AuthMode = AuthMode'
+  { fromAuthMode ::
+      Data.Text
+  }
+  deriving stock
+    ( Prelude.Show,
+      Prelude.Read,
+      Prelude.Eq,
+      Prelude.Ord,
+      Prelude.Generic
+    )
+  deriving newtype
+    ( Prelude.Hashable,
+      Prelude.NFData,
+      Data.FromText,
+      Data.ToText,
+      Data.ToByteString,
+      Data.ToLog,
+      Data.ToHeader,
+      Data.ToQuery,
+      Data.FromJSON,
+      Data.FromJSONKey,
+      Data.ToJSON,
+      Data.ToJSONKey,
+      Data.FromXML,
+      Data.ToXML
+    )
+
+pattern AuthMode_IAM :: AuthMode
+pattern AuthMode_IAM = AuthMode' "IAM"
+
+pattern AuthMode_SSO :: AuthMode
+pattern AuthMode_SSO = AuthMode' "SSO"
+
+{-# COMPLETE
+  AuthMode_IAM,
+  AuthMode_SSO,
+  AuthMode'
+  #-}
diff --git a/gen/Amazonka/IoTSiteWise/Types/BatchEntryCompletionStatus.hs b/gen/Amazonka/IoTSiteWise/Types/BatchEntryCompletionStatus.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/IoTSiteWise/Types/BatchEntryCompletionStatus.hs
@@ -0,0 +1,71 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DerivingStrategies #-}
+{-# LANGUAGE GeneralizedNewtypeDeriving #-}
+{-# LANGUAGE LambdaCase #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE PatternSynonyms #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.IoTSiteWise.Types.BatchEntryCompletionStatus
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.IoTSiteWise.Types.BatchEntryCompletionStatus
+  ( BatchEntryCompletionStatus
+      ( ..,
+        BatchEntryCompletionStatus_ERROR,
+        BatchEntryCompletionStatus_SUCCESS
+      ),
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+newtype BatchEntryCompletionStatus = BatchEntryCompletionStatus'
+  { fromBatchEntryCompletionStatus ::
+      Data.Text
+  }
+  deriving stock
+    ( Prelude.Show,
+      Prelude.Read,
+      Prelude.Eq,
+      Prelude.Ord,
+      Prelude.Generic
+    )
+  deriving newtype
+    ( Prelude.Hashable,
+      Prelude.NFData,
+      Data.FromText,
+      Data.ToText,
+      Data.ToByteString,
+      Data.ToLog,
+      Data.ToHeader,
+      Data.ToQuery,
+      Data.FromJSON,
+      Data.FromJSONKey,
+      Data.ToJSON,
+      Data.ToJSONKey,
+      Data.FromXML,
+      Data.ToXML
+    )
+
+pattern BatchEntryCompletionStatus_ERROR :: BatchEntryCompletionStatus
+pattern BatchEntryCompletionStatus_ERROR = BatchEntryCompletionStatus' "ERROR"
+
+pattern BatchEntryCompletionStatus_SUCCESS :: BatchEntryCompletionStatus
+pattern BatchEntryCompletionStatus_SUCCESS = BatchEntryCompletionStatus' "SUCCESS"
+
+{-# COMPLETE
+  BatchEntryCompletionStatus_ERROR,
+  BatchEntryCompletionStatus_SUCCESS,
+  BatchEntryCompletionStatus'
+  #-}
diff --git a/gen/Amazonka/IoTSiteWise/Types/BatchGetAssetPropertyAggregatesEntry.hs b/gen/Amazonka/IoTSiteWise/Types/BatchGetAssetPropertyAggregatesEntry.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/IoTSiteWise/Types/BatchGetAssetPropertyAggregatesEntry.hs
@@ -0,0 +1,252 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.IoTSiteWise.Types.BatchGetAssetPropertyAggregatesEntry
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.IoTSiteWise.Types.BatchGetAssetPropertyAggregatesEntry where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.IoTSiteWise.Types.AggregateType
+import Amazonka.IoTSiteWise.Types.Quality
+import Amazonka.IoTSiteWise.Types.TimeOrdering
+import qualified Amazonka.Prelude as Prelude
+
+-- | Contains information for an asset property aggregate entry that is
+-- associated with the
+-- <https://docs.aws.amazon.com/iot-sitewise/latest/APIReference/API_BatchGetAssetPropertyAggregates.html BatchGetAssetPropertyAggregates>
+-- API.
+--
+-- To identify an asset property, you must specify one of the following:
+--
+-- -   The @assetId@ and @propertyId@ of an asset property.
+--
+-- -   A @propertyAlias@, which is a data stream alias (for example,
+--     @\/company\/windfarm\/3\/turbine\/7\/temperature@). To define an
+--     asset property\'s alias, see
+--     <https://docs.aws.amazon.com/iot-sitewise/latest/APIReference/API_UpdateAssetProperty.html UpdateAssetProperty>.
+--
+-- /See:/ 'newBatchGetAssetPropertyAggregatesEntry' smart constructor.
+data BatchGetAssetPropertyAggregatesEntry = BatchGetAssetPropertyAggregatesEntry'
+  { -- | The ID of the asset in which the asset property was created.
+    assetId :: Prelude.Maybe Prelude.Text,
+    -- | The alias that identifies the property, such as an OPC-UA server data
+    -- stream path (for example,
+    -- @\/company\/windfarm\/3\/turbine\/7\/temperature@). For more
+    -- information, see
+    -- <https://docs.aws.amazon.com/iot-sitewise/latest/userguide/connect-data-streams.html Mapping industrial data streams to asset properties>
+    -- in the /IoT SiteWise User Guide/.
+    propertyAlias :: Prelude.Maybe Prelude.Text,
+    -- | The ID of the asset property.
+    propertyId :: Prelude.Maybe Prelude.Text,
+    -- | The quality by which to filter asset data.
+    qualities :: Prelude.Maybe (Prelude.NonEmpty Quality),
+    -- | The chronological sorting order of the requested information.
+    --
+    -- Default: @ASCENDING@
+    timeOrdering :: Prelude.Maybe TimeOrdering,
+    -- | The ID of the entry.
+    entryId :: Prelude.Text,
+    -- | The data aggregating function.
+    aggregateTypes :: Prelude.NonEmpty AggregateType,
+    -- | The time interval over which to aggregate data.
+    resolution :: Prelude.Text,
+    -- | The exclusive start of the range from which to query historical data,
+    -- expressed in seconds in Unix epoch time.
+    startDate :: Data.POSIX,
+    -- | The inclusive end of the range from which to query historical data,
+    -- expressed in seconds in Unix epoch time.
+    endDate :: Data.POSIX
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'BatchGetAssetPropertyAggregatesEntry' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'assetId', 'batchGetAssetPropertyAggregatesEntry_assetId' - The ID of the asset in which the asset property was created.
+--
+-- 'propertyAlias', 'batchGetAssetPropertyAggregatesEntry_propertyAlias' - The alias that identifies the property, such as an OPC-UA server data
+-- stream path (for example,
+-- @\/company\/windfarm\/3\/turbine\/7\/temperature@). For more
+-- information, see
+-- <https://docs.aws.amazon.com/iot-sitewise/latest/userguide/connect-data-streams.html Mapping industrial data streams to asset properties>
+-- in the /IoT SiteWise User Guide/.
+--
+-- 'propertyId', 'batchGetAssetPropertyAggregatesEntry_propertyId' - The ID of the asset property.
+--
+-- 'qualities', 'batchGetAssetPropertyAggregatesEntry_qualities' - The quality by which to filter asset data.
+--
+-- 'timeOrdering', 'batchGetAssetPropertyAggregatesEntry_timeOrdering' - The chronological sorting order of the requested information.
+--
+-- Default: @ASCENDING@
+--
+-- 'entryId', 'batchGetAssetPropertyAggregatesEntry_entryId' - The ID of the entry.
+--
+-- 'aggregateTypes', 'batchGetAssetPropertyAggregatesEntry_aggregateTypes' - The data aggregating function.
+--
+-- 'resolution', 'batchGetAssetPropertyAggregatesEntry_resolution' - The time interval over which to aggregate data.
+--
+-- 'startDate', 'batchGetAssetPropertyAggregatesEntry_startDate' - The exclusive start of the range from which to query historical data,
+-- expressed in seconds in Unix epoch time.
+--
+-- 'endDate', 'batchGetAssetPropertyAggregatesEntry_endDate' - The inclusive end of the range from which to query historical data,
+-- expressed in seconds in Unix epoch time.
+newBatchGetAssetPropertyAggregatesEntry ::
+  -- | 'entryId'
+  Prelude.Text ->
+  -- | 'aggregateTypes'
+  Prelude.NonEmpty AggregateType ->
+  -- | 'resolution'
+  Prelude.Text ->
+  -- | 'startDate'
+  Prelude.UTCTime ->
+  -- | 'endDate'
+  Prelude.UTCTime ->
+  BatchGetAssetPropertyAggregatesEntry
+newBatchGetAssetPropertyAggregatesEntry
+  pEntryId_
+  pAggregateTypes_
+  pResolution_
+  pStartDate_
+  pEndDate_ =
+    BatchGetAssetPropertyAggregatesEntry'
+      { assetId =
+          Prelude.Nothing,
+        propertyAlias = Prelude.Nothing,
+        propertyId = Prelude.Nothing,
+        qualities = Prelude.Nothing,
+        timeOrdering = Prelude.Nothing,
+        entryId = pEntryId_,
+        aggregateTypes =
+          Lens.coerced
+            Lens.# pAggregateTypes_,
+        resolution = pResolution_,
+        startDate =
+          Data._Time Lens.# pStartDate_,
+        endDate = Data._Time Lens.# pEndDate_
+      }
+
+-- | The ID of the asset in which the asset property was created.
+batchGetAssetPropertyAggregatesEntry_assetId :: Lens.Lens' BatchGetAssetPropertyAggregatesEntry (Prelude.Maybe Prelude.Text)
+batchGetAssetPropertyAggregatesEntry_assetId = Lens.lens (\BatchGetAssetPropertyAggregatesEntry' {assetId} -> assetId) (\s@BatchGetAssetPropertyAggregatesEntry' {} a -> s {assetId = a} :: BatchGetAssetPropertyAggregatesEntry)
+
+-- | The alias that identifies the property, such as an OPC-UA server data
+-- stream path (for example,
+-- @\/company\/windfarm\/3\/turbine\/7\/temperature@). For more
+-- information, see
+-- <https://docs.aws.amazon.com/iot-sitewise/latest/userguide/connect-data-streams.html Mapping industrial data streams to asset properties>
+-- in the /IoT SiteWise User Guide/.
+batchGetAssetPropertyAggregatesEntry_propertyAlias :: Lens.Lens' BatchGetAssetPropertyAggregatesEntry (Prelude.Maybe Prelude.Text)
+batchGetAssetPropertyAggregatesEntry_propertyAlias = Lens.lens (\BatchGetAssetPropertyAggregatesEntry' {propertyAlias} -> propertyAlias) (\s@BatchGetAssetPropertyAggregatesEntry' {} a -> s {propertyAlias = a} :: BatchGetAssetPropertyAggregatesEntry)
+
+-- | The ID of the asset property.
+batchGetAssetPropertyAggregatesEntry_propertyId :: Lens.Lens' BatchGetAssetPropertyAggregatesEntry (Prelude.Maybe Prelude.Text)
+batchGetAssetPropertyAggregatesEntry_propertyId = Lens.lens (\BatchGetAssetPropertyAggregatesEntry' {propertyId} -> propertyId) (\s@BatchGetAssetPropertyAggregatesEntry' {} a -> s {propertyId = a} :: BatchGetAssetPropertyAggregatesEntry)
+
+-- | The quality by which to filter asset data.
+batchGetAssetPropertyAggregatesEntry_qualities :: Lens.Lens' BatchGetAssetPropertyAggregatesEntry (Prelude.Maybe (Prelude.NonEmpty Quality))
+batchGetAssetPropertyAggregatesEntry_qualities = Lens.lens (\BatchGetAssetPropertyAggregatesEntry' {qualities} -> qualities) (\s@BatchGetAssetPropertyAggregatesEntry' {} a -> s {qualities = a} :: BatchGetAssetPropertyAggregatesEntry) Prelude.. Lens.mapping Lens.coerced
+
+-- | The chronological sorting order of the requested information.
+--
+-- Default: @ASCENDING@
+batchGetAssetPropertyAggregatesEntry_timeOrdering :: Lens.Lens' BatchGetAssetPropertyAggregatesEntry (Prelude.Maybe TimeOrdering)
+batchGetAssetPropertyAggregatesEntry_timeOrdering = Lens.lens (\BatchGetAssetPropertyAggregatesEntry' {timeOrdering} -> timeOrdering) (\s@BatchGetAssetPropertyAggregatesEntry' {} a -> s {timeOrdering = a} :: BatchGetAssetPropertyAggregatesEntry)
+
+-- | The ID of the entry.
+batchGetAssetPropertyAggregatesEntry_entryId :: Lens.Lens' BatchGetAssetPropertyAggregatesEntry Prelude.Text
+batchGetAssetPropertyAggregatesEntry_entryId = Lens.lens (\BatchGetAssetPropertyAggregatesEntry' {entryId} -> entryId) (\s@BatchGetAssetPropertyAggregatesEntry' {} a -> s {entryId = a} :: BatchGetAssetPropertyAggregatesEntry)
+
+-- | The data aggregating function.
+batchGetAssetPropertyAggregatesEntry_aggregateTypes :: Lens.Lens' BatchGetAssetPropertyAggregatesEntry (Prelude.NonEmpty AggregateType)
+batchGetAssetPropertyAggregatesEntry_aggregateTypes = Lens.lens (\BatchGetAssetPropertyAggregatesEntry' {aggregateTypes} -> aggregateTypes) (\s@BatchGetAssetPropertyAggregatesEntry' {} a -> s {aggregateTypes = a} :: BatchGetAssetPropertyAggregatesEntry) Prelude.. Lens.coerced
+
+-- | The time interval over which to aggregate data.
+batchGetAssetPropertyAggregatesEntry_resolution :: Lens.Lens' BatchGetAssetPropertyAggregatesEntry Prelude.Text
+batchGetAssetPropertyAggregatesEntry_resolution = Lens.lens (\BatchGetAssetPropertyAggregatesEntry' {resolution} -> resolution) (\s@BatchGetAssetPropertyAggregatesEntry' {} a -> s {resolution = a} :: BatchGetAssetPropertyAggregatesEntry)
+
+-- | The exclusive start of the range from which to query historical data,
+-- expressed in seconds in Unix epoch time.
+batchGetAssetPropertyAggregatesEntry_startDate :: Lens.Lens' BatchGetAssetPropertyAggregatesEntry Prelude.UTCTime
+batchGetAssetPropertyAggregatesEntry_startDate = Lens.lens (\BatchGetAssetPropertyAggregatesEntry' {startDate} -> startDate) (\s@BatchGetAssetPropertyAggregatesEntry' {} a -> s {startDate = a} :: BatchGetAssetPropertyAggregatesEntry) Prelude.. Data._Time
+
+-- | The inclusive end of the range from which to query historical data,
+-- expressed in seconds in Unix epoch time.
+batchGetAssetPropertyAggregatesEntry_endDate :: Lens.Lens' BatchGetAssetPropertyAggregatesEntry Prelude.UTCTime
+batchGetAssetPropertyAggregatesEntry_endDate = Lens.lens (\BatchGetAssetPropertyAggregatesEntry' {endDate} -> endDate) (\s@BatchGetAssetPropertyAggregatesEntry' {} a -> s {endDate = a} :: BatchGetAssetPropertyAggregatesEntry) Prelude.. Data._Time
+
+instance
+  Prelude.Hashable
+    BatchGetAssetPropertyAggregatesEntry
+  where
+  hashWithSalt
+    _salt
+    BatchGetAssetPropertyAggregatesEntry' {..} =
+      _salt
+        `Prelude.hashWithSalt` assetId
+        `Prelude.hashWithSalt` propertyAlias
+        `Prelude.hashWithSalt` propertyId
+        `Prelude.hashWithSalt` qualities
+        `Prelude.hashWithSalt` timeOrdering
+        `Prelude.hashWithSalt` entryId
+        `Prelude.hashWithSalt` aggregateTypes
+        `Prelude.hashWithSalt` resolution
+        `Prelude.hashWithSalt` startDate
+        `Prelude.hashWithSalt` endDate
+
+instance
+  Prelude.NFData
+    BatchGetAssetPropertyAggregatesEntry
+  where
+  rnf BatchGetAssetPropertyAggregatesEntry' {..} =
+    Prelude.rnf assetId
+      `Prelude.seq` Prelude.rnf propertyAlias
+      `Prelude.seq` Prelude.rnf propertyId
+      `Prelude.seq` Prelude.rnf qualities
+      `Prelude.seq` Prelude.rnf timeOrdering
+      `Prelude.seq` Prelude.rnf entryId
+      `Prelude.seq` Prelude.rnf aggregateTypes
+      `Prelude.seq` Prelude.rnf resolution
+      `Prelude.seq` Prelude.rnf startDate
+      `Prelude.seq` Prelude.rnf endDate
+
+instance
+  Data.ToJSON
+    BatchGetAssetPropertyAggregatesEntry
+  where
+  toJSON BatchGetAssetPropertyAggregatesEntry' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("assetId" Data..=) Prelude.<$> assetId,
+            ("propertyAlias" Data..=) Prelude.<$> propertyAlias,
+            ("propertyId" Data..=) Prelude.<$> propertyId,
+            ("qualities" Data..=) Prelude.<$> qualities,
+            ("timeOrdering" Data..=) Prelude.<$> timeOrdering,
+            Prelude.Just ("entryId" Data..= entryId),
+            Prelude.Just
+              ("aggregateTypes" Data..= aggregateTypes),
+            Prelude.Just ("resolution" Data..= resolution),
+            Prelude.Just ("startDate" Data..= startDate),
+            Prelude.Just ("endDate" Data..= endDate)
+          ]
+      )
diff --git a/gen/Amazonka/IoTSiteWise/Types/BatchGetAssetPropertyAggregatesErrorCode.hs b/gen/Amazonka/IoTSiteWise/Types/BatchGetAssetPropertyAggregatesErrorCode.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/IoTSiteWise/Types/BatchGetAssetPropertyAggregatesErrorCode.hs
@@ -0,0 +1,76 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DerivingStrategies #-}
+{-# LANGUAGE GeneralizedNewtypeDeriving #-}
+{-# LANGUAGE LambdaCase #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE PatternSynonyms #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.IoTSiteWise.Types.BatchGetAssetPropertyAggregatesErrorCode
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.IoTSiteWise.Types.BatchGetAssetPropertyAggregatesErrorCode
+  ( BatchGetAssetPropertyAggregatesErrorCode
+      ( ..,
+        BatchGetAssetPropertyAggregatesErrorCode_AccessDeniedException,
+        BatchGetAssetPropertyAggregatesErrorCode_InvalidRequestException,
+        BatchGetAssetPropertyAggregatesErrorCode_ResourceNotFoundException
+      ),
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+newtype BatchGetAssetPropertyAggregatesErrorCode = BatchGetAssetPropertyAggregatesErrorCode'
+  { fromBatchGetAssetPropertyAggregatesErrorCode ::
+      Data.Text
+  }
+  deriving stock
+    ( Prelude.Show,
+      Prelude.Read,
+      Prelude.Eq,
+      Prelude.Ord,
+      Prelude.Generic
+    )
+  deriving newtype
+    ( Prelude.Hashable,
+      Prelude.NFData,
+      Data.FromText,
+      Data.ToText,
+      Data.ToByteString,
+      Data.ToLog,
+      Data.ToHeader,
+      Data.ToQuery,
+      Data.FromJSON,
+      Data.FromJSONKey,
+      Data.ToJSON,
+      Data.ToJSONKey,
+      Data.FromXML,
+      Data.ToXML
+    )
+
+pattern BatchGetAssetPropertyAggregatesErrorCode_AccessDeniedException :: BatchGetAssetPropertyAggregatesErrorCode
+pattern BatchGetAssetPropertyAggregatesErrorCode_AccessDeniedException = BatchGetAssetPropertyAggregatesErrorCode' "AccessDeniedException"
+
+pattern BatchGetAssetPropertyAggregatesErrorCode_InvalidRequestException :: BatchGetAssetPropertyAggregatesErrorCode
+pattern BatchGetAssetPropertyAggregatesErrorCode_InvalidRequestException = BatchGetAssetPropertyAggregatesErrorCode' "InvalidRequestException"
+
+pattern BatchGetAssetPropertyAggregatesErrorCode_ResourceNotFoundException :: BatchGetAssetPropertyAggregatesErrorCode
+pattern BatchGetAssetPropertyAggregatesErrorCode_ResourceNotFoundException = BatchGetAssetPropertyAggregatesErrorCode' "ResourceNotFoundException"
+
+{-# COMPLETE
+  BatchGetAssetPropertyAggregatesErrorCode_AccessDeniedException,
+  BatchGetAssetPropertyAggregatesErrorCode_InvalidRequestException,
+  BatchGetAssetPropertyAggregatesErrorCode_ResourceNotFoundException,
+  BatchGetAssetPropertyAggregatesErrorCode'
+  #-}
diff --git a/gen/Amazonka/IoTSiteWise/Types/BatchGetAssetPropertyAggregatesErrorEntry.hs b/gen/Amazonka/IoTSiteWise/Types/BatchGetAssetPropertyAggregatesErrorEntry.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/IoTSiteWise/Types/BatchGetAssetPropertyAggregatesErrorEntry.hs
@@ -0,0 +1,121 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.IoTSiteWise.Types.BatchGetAssetPropertyAggregatesErrorEntry
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.IoTSiteWise.Types.BatchGetAssetPropertyAggregatesErrorEntry where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.IoTSiteWise.Types.BatchGetAssetPropertyAggregatesErrorCode
+import qualified Amazonka.Prelude as Prelude
+
+-- | Contains error information for an asset property aggregate entry that is
+-- associated with the
+-- <https://docs.aws.amazon.com/iot-sitewise/latest/APIReference/API_BatchGetAssetPropertyAggregates.html BatchGetAssetPropertyAggregates>
+-- API.
+--
+-- /See:/ 'newBatchGetAssetPropertyAggregatesErrorEntry' smart constructor.
+data BatchGetAssetPropertyAggregatesErrorEntry = BatchGetAssetPropertyAggregatesErrorEntry'
+  { -- | The error code.
+    errorCode :: BatchGetAssetPropertyAggregatesErrorCode,
+    -- | The associated error message.
+    errorMessage :: Prelude.Text,
+    -- | The ID of the entry.
+    entryId :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'BatchGetAssetPropertyAggregatesErrorEntry' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'errorCode', 'batchGetAssetPropertyAggregatesErrorEntry_errorCode' - The error code.
+--
+-- 'errorMessage', 'batchGetAssetPropertyAggregatesErrorEntry_errorMessage' - The associated error message.
+--
+-- 'entryId', 'batchGetAssetPropertyAggregatesErrorEntry_entryId' - The ID of the entry.
+newBatchGetAssetPropertyAggregatesErrorEntry ::
+  -- | 'errorCode'
+  BatchGetAssetPropertyAggregatesErrorCode ->
+  -- | 'errorMessage'
+  Prelude.Text ->
+  -- | 'entryId'
+  Prelude.Text ->
+  BatchGetAssetPropertyAggregatesErrorEntry
+newBatchGetAssetPropertyAggregatesErrorEntry
+  pErrorCode_
+  pErrorMessage_
+  pEntryId_ =
+    BatchGetAssetPropertyAggregatesErrorEntry'
+      { errorCode =
+          pErrorCode_,
+        errorMessage = pErrorMessage_,
+        entryId = pEntryId_
+      }
+
+-- | The error code.
+batchGetAssetPropertyAggregatesErrorEntry_errorCode :: Lens.Lens' BatchGetAssetPropertyAggregatesErrorEntry BatchGetAssetPropertyAggregatesErrorCode
+batchGetAssetPropertyAggregatesErrorEntry_errorCode = Lens.lens (\BatchGetAssetPropertyAggregatesErrorEntry' {errorCode} -> errorCode) (\s@BatchGetAssetPropertyAggregatesErrorEntry' {} a -> s {errorCode = a} :: BatchGetAssetPropertyAggregatesErrorEntry)
+
+-- | The associated error message.
+batchGetAssetPropertyAggregatesErrorEntry_errorMessage :: Lens.Lens' BatchGetAssetPropertyAggregatesErrorEntry Prelude.Text
+batchGetAssetPropertyAggregatesErrorEntry_errorMessage = Lens.lens (\BatchGetAssetPropertyAggregatesErrorEntry' {errorMessage} -> errorMessage) (\s@BatchGetAssetPropertyAggregatesErrorEntry' {} a -> s {errorMessage = a} :: BatchGetAssetPropertyAggregatesErrorEntry)
+
+-- | The ID of the entry.
+batchGetAssetPropertyAggregatesErrorEntry_entryId :: Lens.Lens' BatchGetAssetPropertyAggregatesErrorEntry Prelude.Text
+batchGetAssetPropertyAggregatesErrorEntry_entryId = Lens.lens (\BatchGetAssetPropertyAggregatesErrorEntry' {entryId} -> entryId) (\s@BatchGetAssetPropertyAggregatesErrorEntry' {} a -> s {entryId = a} :: BatchGetAssetPropertyAggregatesErrorEntry)
+
+instance
+  Data.FromJSON
+    BatchGetAssetPropertyAggregatesErrorEntry
+  where
+  parseJSON =
+    Data.withObject
+      "BatchGetAssetPropertyAggregatesErrorEntry"
+      ( \x ->
+          BatchGetAssetPropertyAggregatesErrorEntry'
+            Prelude.<$> (x Data..: "errorCode")
+            Prelude.<*> (x Data..: "errorMessage")
+            Prelude.<*> (x Data..: "entryId")
+      )
+
+instance
+  Prelude.Hashable
+    BatchGetAssetPropertyAggregatesErrorEntry
+  where
+  hashWithSalt
+    _salt
+    BatchGetAssetPropertyAggregatesErrorEntry' {..} =
+      _salt
+        `Prelude.hashWithSalt` errorCode
+        `Prelude.hashWithSalt` errorMessage
+        `Prelude.hashWithSalt` entryId
+
+instance
+  Prelude.NFData
+    BatchGetAssetPropertyAggregatesErrorEntry
+  where
+  rnf BatchGetAssetPropertyAggregatesErrorEntry' {..} =
+    Prelude.rnf errorCode
+      `Prelude.seq` Prelude.rnf errorMessage
+      `Prelude.seq` Prelude.rnf entryId
diff --git a/gen/Amazonka/IoTSiteWise/Types/BatchGetAssetPropertyAggregatesErrorInfo.hs b/gen/Amazonka/IoTSiteWise/Types/BatchGetAssetPropertyAggregatesErrorInfo.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/IoTSiteWise/Types/BatchGetAssetPropertyAggregatesErrorInfo.hs
@@ -0,0 +1,108 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.IoTSiteWise.Types.BatchGetAssetPropertyAggregatesErrorInfo
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.IoTSiteWise.Types.BatchGetAssetPropertyAggregatesErrorInfo where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.IoTSiteWise.Types.BatchGetAssetPropertyAggregatesErrorCode
+import qualified Amazonka.Prelude as Prelude
+
+-- | Contains the error code and the timestamp for an asset property
+-- aggregate entry that is associated with the
+-- <https://docs.aws.amazon.com/iot-sitewise/latest/APIReference/API_BatchGetAssetPropertyAggregates.html BatchGetAssetPropertyAggregates>
+-- API.
+--
+-- /See:/ 'newBatchGetAssetPropertyAggregatesErrorInfo' smart constructor.
+data BatchGetAssetPropertyAggregatesErrorInfo = BatchGetAssetPropertyAggregatesErrorInfo'
+  { -- | The error code.
+    errorCode :: BatchGetAssetPropertyAggregatesErrorCode,
+    -- | The date the error occurred, in Unix epoch time.
+    errorTimestamp :: Data.POSIX
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'BatchGetAssetPropertyAggregatesErrorInfo' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'errorCode', 'batchGetAssetPropertyAggregatesErrorInfo_errorCode' - The error code.
+--
+-- 'errorTimestamp', 'batchGetAssetPropertyAggregatesErrorInfo_errorTimestamp' - The date the error occurred, in Unix epoch time.
+newBatchGetAssetPropertyAggregatesErrorInfo ::
+  -- | 'errorCode'
+  BatchGetAssetPropertyAggregatesErrorCode ->
+  -- | 'errorTimestamp'
+  Prelude.UTCTime ->
+  BatchGetAssetPropertyAggregatesErrorInfo
+newBatchGetAssetPropertyAggregatesErrorInfo
+  pErrorCode_
+  pErrorTimestamp_ =
+    BatchGetAssetPropertyAggregatesErrorInfo'
+      { errorCode =
+          pErrorCode_,
+        errorTimestamp =
+          Data._Time
+            Lens.# pErrorTimestamp_
+      }
+
+-- | The error code.
+batchGetAssetPropertyAggregatesErrorInfo_errorCode :: Lens.Lens' BatchGetAssetPropertyAggregatesErrorInfo BatchGetAssetPropertyAggregatesErrorCode
+batchGetAssetPropertyAggregatesErrorInfo_errorCode = Lens.lens (\BatchGetAssetPropertyAggregatesErrorInfo' {errorCode} -> errorCode) (\s@BatchGetAssetPropertyAggregatesErrorInfo' {} a -> s {errorCode = a} :: BatchGetAssetPropertyAggregatesErrorInfo)
+
+-- | The date the error occurred, in Unix epoch time.
+batchGetAssetPropertyAggregatesErrorInfo_errorTimestamp :: Lens.Lens' BatchGetAssetPropertyAggregatesErrorInfo Prelude.UTCTime
+batchGetAssetPropertyAggregatesErrorInfo_errorTimestamp = Lens.lens (\BatchGetAssetPropertyAggregatesErrorInfo' {errorTimestamp} -> errorTimestamp) (\s@BatchGetAssetPropertyAggregatesErrorInfo' {} a -> s {errorTimestamp = a} :: BatchGetAssetPropertyAggregatesErrorInfo) Prelude.. Data._Time
+
+instance
+  Data.FromJSON
+    BatchGetAssetPropertyAggregatesErrorInfo
+  where
+  parseJSON =
+    Data.withObject
+      "BatchGetAssetPropertyAggregatesErrorInfo"
+      ( \x ->
+          BatchGetAssetPropertyAggregatesErrorInfo'
+            Prelude.<$> (x Data..: "errorCode")
+            Prelude.<*> (x Data..: "errorTimestamp")
+      )
+
+instance
+  Prelude.Hashable
+    BatchGetAssetPropertyAggregatesErrorInfo
+  where
+  hashWithSalt
+    _salt
+    BatchGetAssetPropertyAggregatesErrorInfo' {..} =
+      _salt
+        `Prelude.hashWithSalt` errorCode
+        `Prelude.hashWithSalt` errorTimestamp
+
+instance
+  Prelude.NFData
+    BatchGetAssetPropertyAggregatesErrorInfo
+  where
+  rnf BatchGetAssetPropertyAggregatesErrorInfo' {..} =
+    Prelude.rnf errorCode
+      `Prelude.seq` Prelude.rnf errorTimestamp
diff --git a/gen/Amazonka/IoTSiteWise/Types/BatchGetAssetPropertyAggregatesSkippedEntry.hs b/gen/Amazonka/IoTSiteWise/Types/BatchGetAssetPropertyAggregatesSkippedEntry.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/IoTSiteWise/Types/BatchGetAssetPropertyAggregatesSkippedEntry.hs
@@ -0,0 +1,126 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.IoTSiteWise.Types.BatchGetAssetPropertyAggregatesSkippedEntry
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.IoTSiteWise.Types.BatchGetAssetPropertyAggregatesSkippedEntry where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.IoTSiteWise.Types.BatchEntryCompletionStatus
+import Amazonka.IoTSiteWise.Types.BatchGetAssetPropertyAggregatesErrorInfo
+import qualified Amazonka.Prelude as Prelude
+
+-- | Contains information for an entry that has been processed by the
+-- previous
+-- <https://docs.aws.amazon.com/iot-sitewise/latest/APIReference/API_BatchGetAssetPropertyAggregates.html BatchGetAssetPropertyAggregates>
+-- request.
+--
+-- /See:/ 'newBatchGetAssetPropertyAggregatesSkippedEntry' smart constructor.
+data BatchGetAssetPropertyAggregatesSkippedEntry = BatchGetAssetPropertyAggregatesSkippedEntry'
+  { -- | The error information, such as the error code and the timestamp.
+    errorInfo :: Prelude.Maybe BatchGetAssetPropertyAggregatesErrorInfo,
+    -- | The ID of the entry.
+    entryId :: Prelude.Text,
+    -- | The completion status of each entry that is associated with the
+    -- <https://docs.aws.amazon.com/iot-sitewise/latest/APIReference/API_BatchGetAssetPropertyAggregates.html BatchGetAssetPropertyAggregates>
+    -- API.
+    completionStatus :: BatchEntryCompletionStatus
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'BatchGetAssetPropertyAggregatesSkippedEntry' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'errorInfo', 'batchGetAssetPropertyAggregatesSkippedEntry_errorInfo' - The error information, such as the error code and the timestamp.
+--
+-- 'entryId', 'batchGetAssetPropertyAggregatesSkippedEntry_entryId' - The ID of the entry.
+--
+-- 'completionStatus', 'batchGetAssetPropertyAggregatesSkippedEntry_completionStatus' - The completion status of each entry that is associated with the
+-- <https://docs.aws.amazon.com/iot-sitewise/latest/APIReference/API_BatchGetAssetPropertyAggregates.html BatchGetAssetPropertyAggregates>
+-- API.
+newBatchGetAssetPropertyAggregatesSkippedEntry ::
+  -- | 'entryId'
+  Prelude.Text ->
+  -- | 'completionStatus'
+  BatchEntryCompletionStatus ->
+  BatchGetAssetPropertyAggregatesSkippedEntry
+newBatchGetAssetPropertyAggregatesSkippedEntry
+  pEntryId_
+  pCompletionStatus_ =
+    BatchGetAssetPropertyAggregatesSkippedEntry'
+      { errorInfo =
+          Prelude.Nothing,
+        entryId = pEntryId_,
+        completionStatus =
+          pCompletionStatus_
+      }
+
+-- | The error information, such as the error code and the timestamp.
+batchGetAssetPropertyAggregatesSkippedEntry_errorInfo :: Lens.Lens' BatchGetAssetPropertyAggregatesSkippedEntry (Prelude.Maybe BatchGetAssetPropertyAggregatesErrorInfo)
+batchGetAssetPropertyAggregatesSkippedEntry_errorInfo = Lens.lens (\BatchGetAssetPropertyAggregatesSkippedEntry' {errorInfo} -> errorInfo) (\s@BatchGetAssetPropertyAggregatesSkippedEntry' {} a -> s {errorInfo = a} :: BatchGetAssetPropertyAggregatesSkippedEntry)
+
+-- | The ID of the entry.
+batchGetAssetPropertyAggregatesSkippedEntry_entryId :: Lens.Lens' BatchGetAssetPropertyAggregatesSkippedEntry Prelude.Text
+batchGetAssetPropertyAggregatesSkippedEntry_entryId = Lens.lens (\BatchGetAssetPropertyAggregatesSkippedEntry' {entryId} -> entryId) (\s@BatchGetAssetPropertyAggregatesSkippedEntry' {} a -> s {entryId = a} :: BatchGetAssetPropertyAggregatesSkippedEntry)
+
+-- | The completion status of each entry that is associated with the
+-- <https://docs.aws.amazon.com/iot-sitewise/latest/APIReference/API_BatchGetAssetPropertyAggregates.html BatchGetAssetPropertyAggregates>
+-- API.
+batchGetAssetPropertyAggregatesSkippedEntry_completionStatus :: Lens.Lens' BatchGetAssetPropertyAggregatesSkippedEntry BatchEntryCompletionStatus
+batchGetAssetPropertyAggregatesSkippedEntry_completionStatus = Lens.lens (\BatchGetAssetPropertyAggregatesSkippedEntry' {completionStatus} -> completionStatus) (\s@BatchGetAssetPropertyAggregatesSkippedEntry' {} a -> s {completionStatus = a} :: BatchGetAssetPropertyAggregatesSkippedEntry)
+
+instance
+  Data.FromJSON
+    BatchGetAssetPropertyAggregatesSkippedEntry
+  where
+  parseJSON =
+    Data.withObject
+      "BatchGetAssetPropertyAggregatesSkippedEntry"
+      ( \x ->
+          BatchGetAssetPropertyAggregatesSkippedEntry'
+            Prelude.<$> (x Data..:? "errorInfo")
+            Prelude.<*> (x Data..: "entryId")
+            Prelude.<*> (x Data..: "completionStatus")
+      )
+
+instance
+  Prelude.Hashable
+    BatchGetAssetPropertyAggregatesSkippedEntry
+  where
+  hashWithSalt
+    _salt
+    BatchGetAssetPropertyAggregatesSkippedEntry' {..} =
+      _salt
+        `Prelude.hashWithSalt` errorInfo
+        `Prelude.hashWithSalt` entryId
+        `Prelude.hashWithSalt` completionStatus
+
+instance
+  Prelude.NFData
+    BatchGetAssetPropertyAggregatesSkippedEntry
+  where
+  rnf BatchGetAssetPropertyAggregatesSkippedEntry' {..} =
+    Prelude.rnf errorInfo
+      `Prelude.seq` Prelude.rnf entryId
+      `Prelude.seq` Prelude.rnf completionStatus
diff --git a/gen/Amazonka/IoTSiteWise/Types/BatchGetAssetPropertyAggregatesSuccessEntry.hs b/gen/Amazonka/IoTSiteWise/Types/BatchGetAssetPropertyAggregatesSuccessEntry.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/IoTSiteWise/Types/BatchGetAssetPropertyAggregatesSuccessEntry.hs
@@ -0,0 +1,109 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.IoTSiteWise.Types.BatchGetAssetPropertyAggregatesSuccessEntry
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.IoTSiteWise.Types.BatchGetAssetPropertyAggregatesSuccessEntry where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.IoTSiteWise.Types.AggregatedValue
+import qualified Amazonka.Prelude as Prelude
+
+-- | Contains success information for an entry that is associated with the
+-- <https://docs.aws.amazon.com/iot-sitewise/latest/APIReference/API_BatchGetAssetPropertyAggregates.html BatchGetAssetPropertyAggregates>
+-- API.
+--
+-- /See:/ 'newBatchGetAssetPropertyAggregatesSuccessEntry' smart constructor.
+data BatchGetAssetPropertyAggregatesSuccessEntry = BatchGetAssetPropertyAggregatesSuccessEntry'
+  { -- | The ID of the entry.
+    entryId :: Prelude.Text,
+    -- | The requested aggregated asset property values (for example, average,
+    -- minimum, and maximum).
+    aggregatedValues :: [AggregatedValue]
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'BatchGetAssetPropertyAggregatesSuccessEntry' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'entryId', 'batchGetAssetPropertyAggregatesSuccessEntry_entryId' - The ID of the entry.
+--
+-- 'aggregatedValues', 'batchGetAssetPropertyAggregatesSuccessEntry_aggregatedValues' - The requested aggregated asset property values (for example, average,
+-- minimum, and maximum).
+newBatchGetAssetPropertyAggregatesSuccessEntry ::
+  -- | 'entryId'
+  Prelude.Text ->
+  BatchGetAssetPropertyAggregatesSuccessEntry
+newBatchGetAssetPropertyAggregatesSuccessEntry
+  pEntryId_ =
+    BatchGetAssetPropertyAggregatesSuccessEntry'
+      { entryId =
+          pEntryId_,
+        aggregatedValues =
+          Prelude.mempty
+      }
+
+-- | The ID of the entry.
+batchGetAssetPropertyAggregatesSuccessEntry_entryId :: Lens.Lens' BatchGetAssetPropertyAggregatesSuccessEntry Prelude.Text
+batchGetAssetPropertyAggregatesSuccessEntry_entryId = Lens.lens (\BatchGetAssetPropertyAggregatesSuccessEntry' {entryId} -> entryId) (\s@BatchGetAssetPropertyAggregatesSuccessEntry' {} a -> s {entryId = a} :: BatchGetAssetPropertyAggregatesSuccessEntry)
+
+-- | The requested aggregated asset property values (for example, average,
+-- minimum, and maximum).
+batchGetAssetPropertyAggregatesSuccessEntry_aggregatedValues :: Lens.Lens' BatchGetAssetPropertyAggregatesSuccessEntry [AggregatedValue]
+batchGetAssetPropertyAggregatesSuccessEntry_aggregatedValues = Lens.lens (\BatchGetAssetPropertyAggregatesSuccessEntry' {aggregatedValues} -> aggregatedValues) (\s@BatchGetAssetPropertyAggregatesSuccessEntry' {} a -> s {aggregatedValues = a} :: BatchGetAssetPropertyAggregatesSuccessEntry) Prelude.. Lens.coerced
+
+instance
+  Data.FromJSON
+    BatchGetAssetPropertyAggregatesSuccessEntry
+  where
+  parseJSON =
+    Data.withObject
+      "BatchGetAssetPropertyAggregatesSuccessEntry"
+      ( \x ->
+          BatchGetAssetPropertyAggregatesSuccessEntry'
+            Prelude.<$> (x Data..: "entryId")
+            Prelude.<*> ( x
+                            Data..:? "aggregatedValues"
+                            Data..!= Prelude.mempty
+                        )
+      )
+
+instance
+  Prelude.Hashable
+    BatchGetAssetPropertyAggregatesSuccessEntry
+  where
+  hashWithSalt
+    _salt
+    BatchGetAssetPropertyAggregatesSuccessEntry' {..} =
+      _salt
+        `Prelude.hashWithSalt` entryId
+        `Prelude.hashWithSalt` aggregatedValues
+
+instance
+  Prelude.NFData
+    BatchGetAssetPropertyAggregatesSuccessEntry
+  where
+  rnf BatchGetAssetPropertyAggregatesSuccessEntry' {..} =
+    Prelude.rnf entryId
+      `Prelude.seq` Prelude.rnf aggregatedValues
diff --git a/gen/Amazonka/IoTSiteWise/Types/BatchGetAssetPropertyValueEntry.hs b/gen/Amazonka/IoTSiteWise/Types/BatchGetAssetPropertyValueEntry.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/IoTSiteWise/Types/BatchGetAssetPropertyValueEntry.hs
@@ -0,0 +1,145 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.IoTSiteWise.Types.BatchGetAssetPropertyValueEntry
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.IoTSiteWise.Types.BatchGetAssetPropertyValueEntry where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+-- | Contains information for an asset property value entry that is
+-- associated with the
+-- <https://docs.aws.amazon.com/iot-sitewise/latest/APIReference/API_BatchGetAssetPropertyValue.html BatchGetAssetPropertyValue>
+-- API.
+--
+-- To identify an asset property, you must specify one of the following:
+--
+-- -   The @assetId@ and @propertyId@ of an asset property.
+--
+-- -   A @propertyAlias@, which is a data stream alias (for example,
+--     @\/company\/windfarm\/3\/turbine\/7\/temperature@). To define an
+--     asset property\'s alias, see
+--     <https://docs.aws.amazon.com/iot-sitewise/latest/APIReference/API_UpdateAssetProperty.html UpdateAssetProperty>.
+--
+-- /See:/ 'newBatchGetAssetPropertyValueEntry' smart constructor.
+data BatchGetAssetPropertyValueEntry = BatchGetAssetPropertyValueEntry'
+  { -- | The ID of the asset in which the asset property was created.
+    assetId :: Prelude.Maybe Prelude.Text,
+    -- | The alias that identifies the property, such as an OPC-UA server data
+    -- stream path (for example,
+    -- @\/company\/windfarm\/3\/turbine\/7\/temperature@). For more
+    -- information, see
+    -- <https://docs.aws.amazon.com/iot-sitewise/latest/userguide/connect-data-streams.html Mapping industrial data streams to asset properties>
+    -- in the /IoT SiteWise User Guide/.
+    propertyAlias :: Prelude.Maybe Prelude.Text,
+    -- | The ID of the asset property.
+    propertyId :: Prelude.Maybe Prelude.Text,
+    -- | The ID of the entry.
+    entryId :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'BatchGetAssetPropertyValueEntry' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'assetId', 'batchGetAssetPropertyValueEntry_assetId' - The ID of the asset in which the asset property was created.
+--
+-- 'propertyAlias', 'batchGetAssetPropertyValueEntry_propertyAlias' - The alias that identifies the property, such as an OPC-UA server data
+-- stream path (for example,
+-- @\/company\/windfarm\/3\/turbine\/7\/temperature@). For more
+-- information, see
+-- <https://docs.aws.amazon.com/iot-sitewise/latest/userguide/connect-data-streams.html Mapping industrial data streams to asset properties>
+-- in the /IoT SiteWise User Guide/.
+--
+-- 'propertyId', 'batchGetAssetPropertyValueEntry_propertyId' - The ID of the asset property.
+--
+-- 'entryId', 'batchGetAssetPropertyValueEntry_entryId' - The ID of the entry.
+newBatchGetAssetPropertyValueEntry ::
+  -- | 'entryId'
+  Prelude.Text ->
+  BatchGetAssetPropertyValueEntry
+newBatchGetAssetPropertyValueEntry pEntryId_ =
+  BatchGetAssetPropertyValueEntry'
+    { assetId =
+        Prelude.Nothing,
+      propertyAlias = Prelude.Nothing,
+      propertyId = Prelude.Nothing,
+      entryId = pEntryId_
+    }
+
+-- | The ID of the asset in which the asset property was created.
+batchGetAssetPropertyValueEntry_assetId :: Lens.Lens' BatchGetAssetPropertyValueEntry (Prelude.Maybe Prelude.Text)
+batchGetAssetPropertyValueEntry_assetId = Lens.lens (\BatchGetAssetPropertyValueEntry' {assetId} -> assetId) (\s@BatchGetAssetPropertyValueEntry' {} a -> s {assetId = a} :: BatchGetAssetPropertyValueEntry)
+
+-- | The alias that identifies the property, such as an OPC-UA server data
+-- stream path (for example,
+-- @\/company\/windfarm\/3\/turbine\/7\/temperature@). For more
+-- information, see
+-- <https://docs.aws.amazon.com/iot-sitewise/latest/userguide/connect-data-streams.html Mapping industrial data streams to asset properties>
+-- in the /IoT SiteWise User Guide/.
+batchGetAssetPropertyValueEntry_propertyAlias :: Lens.Lens' BatchGetAssetPropertyValueEntry (Prelude.Maybe Prelude.Text)
+batchGetAssetPropertyValueEntry_propertyAlias = Lens.lens (\BatchGetAssetPropertyValueEntry' {propertyAlias} -> propertyAlias) (\s@BatchGetAssetPropertyValueEntry' {} a -> s {propertyAlias = a} :: BatchGetAssetPropertyValueEntry)
+
+-- | The ID of the asset property.
+batchGetAssetPropertyValueEntry_propertyId :: Lens.Lens' BatchGetAssetPropertyValueEntry (Prelude.Maybe Prelude.Text)
+batchGetAssetPropertyValueEntry_propertyId = Lens.lens (\BatchGetAssetPropertyValueEntry' {propertyId} -> propertyId) (\s@BatchGetAssetPropertyValueEntry' {} a -> s {propertyId = a} :: BatchGetAssetPropertyValueEntry)
+
+-- | The ID of the entry.
+batchGetAssetPropertyValueEntry_entryId :: Lens.Lens' BatchGetAssetPropertyValueEntry Prelude.Text
+batchGetAssetPropertyValueEntry_entryId = Lens.lens (\BatchGetAssetPropertyValueEntry' {entryId} -> entryId) (\s@BatchGetAssetPropertyValueEntry' {} a -> s {entryId = a} :: BatchGetAssetPropertyValueEntry)
+
+instance
+  Prelude.Hashable
+    BatchGetAssetPropertyValueEntry
+  where
+  hashWithSalt
+    _salt
+    BatchGetAssetPropertyValueEntry' {..} =
+      _salt
+        `Prelude.hashWithSalt` assetId
+        `Prelude.hashWithSalt` propertyAlias
+        `Prelude.hashWithSalt` propertyId
+        `Prelude.hashWithSalt` entryId
+
+instance
+  Prelude.NFData
+    BatchGetAssetPropertyValueEntry
+  where
+  rnf BatchGetAssetPropertyValueEntry' {..} =
+    Prelude.rnf assetId
+      `Prelude.seq` Prelude.rnf propertyAlias
+      `Prelude.seq` Prelude.rnf propertyId
+      `Prelude.seq` Prelude.rnf entryId
+
+instance Data.ToJSON BatchGetAssetPropertyValueEntry where
+  toJSON BatchGetAssetPropertyValueEntry' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("assetId" Data..=) Prelude.<$> assetId,
+            ("propertyAlias" Data..=) Prelude.<$> propertyAlias,
+            ("propertyId" Data..=) Prelude.<$> propertyId,
+            Prelude.Just ("entryId" Data..= entryId)
+          ]
+      )
diff --git a/gen/Amazonka/IoTSiteWise/Types/BatchGetAssetPropertyValueErrorCode.hs b/gen/Amazonka/IoTSiteWise/Types/BatchGetAssetPropertyValueErrorCode.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/IoTSiteWise/Types/BatchGetAssetPropertyValueErrorCode.hs
@@ -0,0 +1,76 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DerivingStrategies #-}
+{-# LANGUAGE GeneralizedNewtypeDeriving #-}
+{-# LANGUAGE LambdaCase #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE PatternSynonyms #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.IoTSiteWise.Types.BatchGetAssetPropertyValueErrorCode
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.IoTSiteWise.Types.BatchGetAssetPropertyValueErrorCode
+  ( BatchGetAssetPropertyValueErrorCode
+      ( ..,
+        BatchGetAssetPropertyValueErrorCode_AccessDeniedException,
+        BatchGetAssetPropertyValueErrorCode_InvalidRequestException,
+        BatchGetAssetPropertyValueErrorCode_ResourceNotFoundException
+      ),
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+newtype BatchGetAssetPropertyValueErrorCode = BatchGetAssetPropertyValueErrorCode'
+  { fromBatchGetAssetPropertyValueErrorCode ::
+      Data.Text
+  }
+  deriving stock
+    ( Prelude.Show,
+      Prelude.Read,
+      Prelude.Eq,
+      Prelude.Ord,
+      Prelude.Generic
+    )
+  deriving newtype
+    ( Prelude.Hashable,
+      Prelude.NFData,
+      Data.FromText,
+      Data.ToText,
+      Data.ToByteString,
+      Data.ToLog,
+      Data.ToHeader,
+      Data.ToQuery,
+      Data.FromJSON,
+      Data.FromJSONKey,
+      Data.ToJSON,
+      Data.ToJSONKey,
+      Data.FromXML,
+      Data.ToXML
+    )
+
+pattern BatchGetAssetPropertyValueErrorCode_AccessDeniedException :: BatchGetAssetPropertyValueErrorCode
+pattern BatchGetAssetPropertyValueErrorCode_AccessDeniedException = BatchGetAssetPropertyValueErrorCode' "AccessDeniedException"
+
+pattern BatchGetAssetPropertyValueErrorCode_InvalidRequestException :: BatchGetAssetPropertyValueErrorCode
+pattern BatchGetAssetPropertyValueErrorCode_InvalidRequestException = BatchGetAssetPropertyValueErrorCode' "InvalidRequestException"
+
+pattern BatchGetAssetPropertyValueErrorCode_ResourceNotFoundException :: BatchGetAssetPropertyValueErrorCode
+pattern BatchGetAssetPropertyValueErrorCode_ResourceNotFoundException = BatchGetAssetPropertyValueErrorCode' "ResourceNotFoundException"
+
+{-# COMPLETE
+  BatchGetAssetPropertyValueErrorCode_AccessDeniedException,
+  BatchGetAssetPropertyValueErrorCode_InvalidRequestException,
+  BatchGetAssetPropertyValueErrorCode_ResourceNotFoundException,
+  BatchGetAssetPropertyValueErrorCode'
+  #-}
diff --git a/gen/Amazonka/IoTSiteWise/Types/BatchGetAssetPropertyValueErrorEntry.hs b/gen/Amazonka/IoTSiteWise/Types/BatchGetAssetPropertyValueErrorEntry.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/IoTSiteWise/Types/BatchGetAssetPropertyValueErrorEntry.hs
@@ -0,0 +1,121 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.IoTSiteWise.Types.BatchGetAssetPropertyValueErrorEntry
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.IoTSiteWise.Types.BatchGetAssetPropertyValueErrorEntry where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.IoTSiteWise.Types.BatchGetAssetPropertyValueErrorCode
+import qualified Amazonka.Prelude as Prelude
+
+-- | Contains error information for an asset property value entry that is
+-- associated with the
+-- <https://docs.aws.amazon.com/iot-sitewise/latest/APIReference/API_BatchGetAssetPropertyValue.html BatchGetAssetPropertyValue>
+-- API.
+--
+-- /See:/ 'newBatchGetAssetPropertyValueErrorEntry' smart constructor.
+data BatchGetAssetPropertyValueErrorEntry = BatchGetAssetPropertyValueErrorEntry'
+  { -- | The error code.
+    errorCode :: BatchGetAssetPropertyValueErrorCode,
+    -- | The associated error message.
+    errorMessage :: Prelude.Text,
+    -- | The ID of the entry.
+    entryId :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'BatchGetAssetPropertyValueErrorEntry' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'errorCode', 'batchGetAssetPropertyValueErrorEntry_errorCode' - The error code.
+--
+-- 'errorMessage', 'batchGetAssetPropertyValueErrorEntry_errorMessage' - The associated error message.
+--
+-- 'entryId', 'batchGetAssetPropertyValueErrorEntry_entryId' - The ID of the entry.
+newBatchGetAssetPropertyValueErrorEntry ::
+  -- | 'errorCode'
+  BatchGetAssetPropertyValueErrorCode ->
+  -- | 'errorMessage'
+  Prelude.Text ->
+  -- | 'entryId'
+  Prelude.Text ->
+  BatchGetAssetPropertyValueErrorEntry
+newBatchGetAssetPropertyValueErrorEntry
+  pErrorCode_
+  pErrorMessage_
+  pEntryId_ =
+    BatchGetAssetPropertyValueErrorEntry'
+      { errorCode =
+          pErrorCode_,
+        errorMessage = pErrorMessage_,
+        entryId = pEntryId_
+      }
+
+-- | The error code.
+batchGetAssetPropertyValueErrorEntry_errorCode :: Lens.Lens' BatchGetAssetPropertyValueErrorEntry BatchGetAssetPropertyValueErrorCode
+batchGetAssetPropertyValueErrorEntry_errorCode = Lens.lens (\BatchGetAssetPropertyValueErrorEntry' {errorCode} -> errorCode) (\s@BatchGetAssetPropertyValueErrorEntry' {} a -> s {errorCode = a} :: BatchGetAssetPropertyValueErrorEntry)
+
+-- | The associated error message.
+batchGetAssetPropertyValueErrorEntry_errorMessage :: Lens.Lens' BatchGetAssetPropertyValueErrorEntry Prelude.Text
+batchGetAssetPropertyValueErrorEntry_errorMessage = Lens.lens (\BatchGetAssetPropertyValueErrorEntry' {errorMessage} -> errorMessage) (\s@BatchGetAssetPropertyValueErrorEntry' {} a -> s {errorMessage = a} :: BatchGetAssetPropertyValueErrorEntry)
+
+-- | The ID of the entry.
+batchGetAssetPropertyValueErrorEntry_entryId :: Lens.Lens' BatchGetAssetPropertyValueErrorEntry Prelude.Text
+batchGetAssetPropertyValueErrorEntry_entryId = Lens.lens (\BatchGetAssetPropertyValueErrorEntry' {entryId} -> entryId) (\s@BatchGetAssetPropertyValueErrorEntry' {} a -> s {entryId = a} :: BatchGetAssetPropertyValueErrorEntry)
+
+instance
+  Data.FromJSON
+    BatchGetAssetPropertyValueErrorEntry
+  where
+  parseJSON =
+    Data.withObject
+      "BatchGetAssetPropertyValueErrorEntry"
+      ( \x ->
+          BatchGetAssetPropertyValueErrorEntry'
+            Prelude.<$> (x Data..: "errorCode")
+            Prelude.<*> (x Data..: "errorMessage")
+            Prelude.<*> (x Data..: "entryId")
+      )
+
+instance
+  Prelude.Hashable
+    BatchGetAssetPropertyValueErrorEntry
+  where
+  hashWithSalt
+    _salt
+    BatchGetAssetPropertyValueErrorEntry' {..} =
+      _salt
+        `Prelude.hashWithSalt` errorCode
+        `Prelude.hashWithSalt` errorMessage
+        `Prelude.hashWithSalt` entryId
+
+instance
+  Prelude.NFData
+    BatchGetAssetPropertyValueErrorEntry
+  where
+  rnf BatchGetAssetPropertyValueErrorEntry' {..} =
+    Prelude.rnf errorCode
+      `Prelude.seq` Prelude.rnf errorMessage
+      `Prelude.seq` Prelude.rnf entryId
diff --git a/gen/Amazonka/IoTSiteWise/Types/BatchGetAssetPropertyValueErrorInfo.hs b/gen/Amazonka/IoTSiteWise/Types/BatchGetAssetPropertyValueErrorInfo.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/IoTSiteWise/Types/BatchGetAssetPropertyValueErrorInfo.hs
@@ -0,0 +1,104 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.IoTSiteWise.Types.BatchGetAssetPropertyValueErrorInfo
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.IoTSiteWise.Types.BatchGetAssetPropertyValueErrorInfo where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.IoTSiteWise.Types.BatchGetAssetPropertyValueErrorCode
+import qualified Amazonka.Prelude as Prelude
+
+-- | The error information, such as the error code and the timestamp.
+--
+-- /See:/ 'newBatchGetAssetPropertyValueErrorInfo' smart constructor.
+data BatchGetAssetPropertyValueErrorInfo = BatchGetAssetPropertyValueErrorInfo'
+  { -- | The error code.
+    errorCode :: BatchGetAssetPropertyValueErrorCode,
+    -- | The date the error occurred, in Unix epoch time.
+    errorTimestamp :: Data.POSIX
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'BatchGetAssetPropertyValueErrorInfo' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'errorCode', 'batchGetAssetPropertyValueErrorInfo_errorCode' - The error code.
+--
+-- 'errorTimestamp', 'batchGetAssetPropertyValueErrorInfo_errorTimestamp' - The date the error occurred, in Unix epoch time.
+newBatchGetAssetPropertyValueErrorInfo ::
+  -- | 'errorCode'
+  BatchGetAssetPropertyValueErrorCode ->
+  -- | 'errorTimestamp'
+  Prelude.UTCTime ->
+  BatchGetAssetPropertyValueErrorInfo
+newBatchGetAssetPropertyValueErrorInfo
+  pErrorCode_
+  pErrorTimestamp_ =
+    BatchGetAssetPropertyValueErrorInfo'
+      { errorCode =
+          pErrorCode_,
+        errorTimestamp =
+          Data._Time Lens.# pErrorTimestamp_
+      }
+
+-- | The error code.
+batchGetAssetPropertyValueErrorInfo_errorCode :: Lens.Lens' BatchGetAssetPropertyValueErrorInfo BatchGetAssetPropertyValueErrorCode
+batchGetAssetPropertyValueErrorInfo_errorCode = Lens.lens (\BatchGetAssetPropertyValueErrorInfo' {errorCode} -> errorCode) (\s@BatchGetAssetPropertyValueErrorInfo' {} a -> s {errorCode = a} :: BatchGetAssetPropertyValueErrorInfo)
+
+-- | The date the error occurred, in Unix epoch time.
+batchGetAssetPropertyValueErrorInfo_errorTimestamp :: Lens.Lens' BatchGetAssetPropertyValueErrorInfo Prelude.UTCTime
+batchGetAssetPropertyValueErrorInfo_errorTimestamp = Lens.lens (\BatchGetAssetPropertyValueErrorInfo' {errorTimestamp} -> errorTimestamp) (\s@BatchGetAssetPropertyValueErrorInfo' {} a -> s {errorTimestamp = a} :: BatchGetAssetPropertyValueErrorInfo) Prelude.. Data._Time
+
+instance
+  Data.FromJSON
+    BatchGetAssetPropertyValueErrorInfo
+  where
+  parseJSON =
+    Data.withObject
+      "BatchGetAssetPropertyValueErrorInfo"
+      ( \x ->
+          BatchGetAssetPropertyValueErrorInfo'
+            Prelude.<$> (x Data..: "errorCode")
+            Prelude.<*> (x Data..: "errorTimestamp")
+      )
+
+instance
+  Prelude.Hashable
+    BatchGetAssetPropertyValueErrorInfo
+  where
+  hashWithSalt
+    _salt
+    BatchGetAssetPropertyValueErrorInfo' {..} =
+      _salt
+        `Prelude.hashWithSalt` errorCode
+        `Prelude.hashWithSalt` errorTimestamp
+
+instance
+  Prelude.NFData
+    BatchGetAssetPropertyValueErrorInfo
+  where
+  rnf BatchGetAssetPropertyValueErrorInfo' {..} =
+    Prelude.rnf errorCode
+      `Prelude.seq` Prelude.rnf errorTimestamp
diff --git a/gen/Amazonka/IoTSiteWise/Types/BatchGetAssetPropertyValueHistoryEntry.hs b/gen/Amazonka/IoTSiteWise/Types/BatchGetAssetPropertyValueHistoryEntry.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/IoTSiteWise/Types/BatchGetAssetPropertyValueHistoryEntry.hs
@@ -0,0 +1,210 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.IoTSiteWise.Types.BatchGetAssetPropertyValueHistoryEntry
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.IoTSiteWise.Types.BatchGetAssetPropertyValueHistoryEntry where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.IoTSiteWise.Types.Quality
+import Amazonka.IoTSiteWise.Types.TimeOrdering
+import qualified Amazonka.Prelude as Prelude
+
+-- | Contains information for an asset property historical value entry that
+-- is associated with the
+-- <https://docs.aws.amazon.com/iot-sitewise/latest/APIReference/API_BatchGetAssetPropertyValue.html BatchGetAssetPropertyValueHistory>
+-- API.
+--
+-- To identify an asset property, you must specify one of the following:
+--
+-- -   The @assetId@ and @propertyId@ of an asset property.
+--
+-- -   A @propertyAlias@, which is a data stream alias (for example,
+--     @\/company\/windfarm\/3\/turbine\/7\/temperature@). To define an
+--     asset property\'s alias, see
+--     <https://docs.aws.amazon.com/iot-sitewise/latest/APIReference/API_UpdateAssetProperty.html UpdateAssetProperty>.
+--
+-- /See:/ 'newBatchGetAssetPropertyValueHistoryEntry' smart constructor.
+data BatchGetAssetPropertyValueHistoryEntry = BatchGetAssetPropertyValueHistoryEntry'
+  { -- | The ID of the asset in which the asset property was created.
+    assetId :: Prelude.Maybe Prelude.Text,
+    -- | The inclusive end of the range from which to query historical data,
+    -- expressed in seconds in Unix epoch time.
+    endDate :: Prelude.Maybe Data.POSIX,
+    -- | The alias that identifies the property, such as an OPC-UA server data
+    -- stream path (for example,
+    -- @\/company\/windfarm\/3\/turbine\/7\/temperature@). For more
+    -- information, see
+    -- <https://docs.aws.amazon.com/iot-sitewise/latest/userguide/connect-data-streams.html Mapping industrial data streams to asset properties>
+    -- in the /IoT SiteWise User Guide/.
+    propertyAlias :: Prelude.Maybe Prelude.Text,
+    -- | The ID of the asset property.
+    propertyId :: Prelude.Maybe Prelude.Text,
+    -- | The quality by which to filter asset data.
+    qualities :: Prelude.Maybe (Prelude.NonEmpty Quality),
+    -- | The exclusive start of the range from which to query historical data,
+    -- expressed in seconds in Unix epoch time.
+    startDate :: Prelude.Maybe Data.POSIX,
+    -- | The chronological sorting order of the requested information.
+    --
+    -- Default: @ASCENDING@
+    timeOrdering :: Prelude.Maybe TimeOrdering,
+    -- | The ID of the entry.
+    entryId :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'BatchGetAssetPropertyValueHistoryEntry' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'assetId', 'batchGetAssetPropertyValueHistoryEntry_assetId' - The ID of the asset in which the asset property was created.
+--
+-- 'endDate', 'batchGetAssetPropertyValueHistoryEntry_endDate' - The inclusive end of the range from which to query historical data,
+-- expressed in seconds in Unix epoch time.
+--
+-- 'propertyAlias', 'batchGetAssetPropertyValueHistoryEntry_propertyAlias' - The alias that identifies the property, such as an OPC-UA server data
+-- stream path (for example,
+-- @\/company\/windfarm\/3\/turbine\/7\/temperature@). For more
+-- information, see
+-- <https://docs.aws.amazon.com/iot-sitewise/latest/userguide/connect-data-streams.html Mapping industrial data streams to asset properties>
+-- in the /IoT SiteWise User Guide/.
+--
+-- 'propertyId', 'batchGetAssetPropertyValueHistoryEntry_propertyId' - The ID of the asset property.
+--
+-- 'qualities', 'batchGetAssetPropertyValueHistoryEntry_qualities' - The quality by which to filter asset data.
+--
+-- 'startDate', 'batchGetAssetPropertyValueHistoryEntry_startDate' - The exclusive start of the range from which to query historical data,
+-- expressed in seconds in Unix epoch time.
+--
+-- 'timeOrdering', 'batchGetAssetPropertyValueHistoryEntry_timeOrdering' - The chronological sorting order of the requested information.
+--
+-- Default: @ASCENDING@
+--
+-- 'entryId', 'batchGetAssetPropertyValueHistoryEntry_entryId' - The ID of the entry.
+newBatchGetAssetPropertyValueHistoryEntry ::
+  -- | 'entryId'
+  Prelude.Text ->
+  BatchGetAssetPropertyValueHistoryEntry
+newBatchGetAssetPropertyValueHistoryEntry pEntryId_ =
+  BatchGetAssetPropertyValueHistoryEntry'
+    { assetId =
+        Prelude.Nothing,
+      endDate = Prelude.Nothing,
+      propertyAlias = Prelude.Nothing,
+      propertyId = Prelude.Nothing,
+      qualities = Prelude.Nothing,
+      startDate = Prelude.Nothing,
+      timeOrdering = Prelude.Nothing,
+      entryId = pEntryId_
+    }
+
+-- | The ID of the asset in which the asset property was created.
+batchGetAssetPropertyValueHistoryEntry_assetId :: Lens.Lens' BatchGetAssetPropertyValueHistoryEntry (Prelude.Maybe Prelude.Text)
+batchGetAssetPropertyValueHistoryEntry_assetId = Lens.lens (\BatchGetAssetPropertyValueHistoryEntry' {assetId} -> assetId) (\s@BatchGetAssetPropertyValueHistoryEntry' {} a -> s {assetId = a} :: BatchGetAssetPropertyValueHistoryEntry)
+
+-- | The inclusive end of the range from which to query historical data,
+-- expressed in seconds in Unix epoch time.
+batchGetAssetPropertyValueHistoryEntry_endDate :: Lens.Lens' BatchGetAssetPropertyValueHistoryEntry (Prelude.Maybe Prelude.UTCTime)
+batchGetAssetPropertyValueHistoryEntry_endDate = Lens.lens (\BatchGetAssetPropertyValueHistoryEntry' {endDate} -> endDate) (\s@BatchGetAssetPropertyValueHistoryEntry' {} a -> s {endDate = a} :: BatchGetAssetPropertyValueHistoryEntry) Prelude.. Lens.mapping Data._Time
+
+-- | The alias that identifies the property, such as an OPC-UA server data
+-- stream path (for example,
+-- @\/company\/windfarm\/3\/turbine\/7\/temperature@). For more
+-- information, see
+-- <https://docs.aws.amazon.com/iot-sitewise/latest/userguide/connect-data-streams.html Mapping industrial data streams to asset properties>
+-- in the /IoT SiteWise User Guide/.
+batchGetAssetPropertyValueHistoryEntry_propertyAlias :: Lens.Lens' BatchGetAssetPropertyValueHistoryEntry (Prelude.Maybe Prelude.Text)
+batchGetAssetPropertyValueHistoryEntry_propertyAlias = Lens.lens (\BatchGetAssetPropertyValueHistoryEntry' {propertyAlias} -> propertyAlias) (\s@BatchGetAssetPropertyValueHistoryEntry' {} a -> s {propertyAlias = a} :: BatchGetAssetPropertyValueHistoryEntry)
+
+-- | The ID of the asset property.
+batchGetAssetPropertyValueHistoryEntry_propertyId :: Lens.Lens' BatchGetAssetPropertyValueHistoryEntry (Prelude.Maybe Prelude.Text)
+batchGetAssetPropertyValueHistoryEntry_propertyId = Lens.lens (\BatchGetAssetPropertyValueHistoryEntry' {propertyId} -> propertyId) (\s@BatchGetAssetPropertyValueHistoryEntry' {} a -> s {propertyId = a} :: BatchGetAssetPropertyValueHistoryEntry)
+
+-- | The quality by which to filter asset data.
+batchGetAssetPropertyValueHistoryEntry_qualities :: Lens.Lens' BatchGetAssetPropertyValueHistoryEntry (Prelude.Maybe (Prelude.NonEmpty Quality))
+batchGetAssetPropertyValueHistoryEntry_qualities = Lens.lens (\BatchGetAssetPropertyValueHistoryEntry' {qualities} -> qualities) (\s@BatchGetAssetPropertyValueHistoryEntry' {} a -> s {qualities = a} :: BatchGetAssetPropertyValueHistoryEntry) Prelude.. Lens.mapping Lens.coerced
+
+-- | The exclusive start of the range from which to query historical data,
+-- expressed in seconds in Unix epoch time.
+batchGetAssetPropertyValueHistoryEntry_startDate :: Lens.Lens' BatchGetAssetPropertyValueHistoryEntry (Prelude.Maybe Prelude.UTCTime)
+batchGetAssetPropertyValueHistoryEntry_startDate = Lens.lens (\BatchGetAssetPropertyValueHistoryEntry' {startDate} -> startDate) (\s@BatchGetAssetPropertyValueHistoryEntry' {} a -> s {startDate = a} :: BatchGetAssetPropertyValueHistoryEntry) Prelude.. Lens.mapping Data._Time
+
+-- | The chronological sorting order of the requested information.
+--
+-- Default: @ASCENDING@
+batchGetAssetPropertyValueHistoryEntry_timeOrdering :: Lens.Lens' BatchGetAssetPropertyValueHistoryEntry (Prelude.Maybe TimeOrdering)
+batchGetAssetPropertyValueHistoryEntry_timeOrdering = Lens.lens (\BatchGetAssetPropertyValueHistoryEntry' {timeOrdering} -> timeOrdering) (\s@BatchGetAssetPropertyValueHistoryEntry' {} a -> s {timeOrdering = a} :: BatchGetAssetPropertyValueHistoryEntry)
+
+-- | The ID of the entry.
+batchGetAssetPropertyValueHistoryEntry_entryId :: Lens.Lens' BatchGetAssetPropertyValueHistoryEntry Prelude.Text
+batchGetAssetPropertyValueHistoryEntry_entryId = Lens.lens (\BatchGetAssetPropertyValueHistoryEntry' {entryId} -> entryId) (\s@BatchGetAssetPropertyValueHistoryEntry' {} a -> s {entryId = a} :: BatchGetAssetPropertyValueHistoryEntry)
+
+instance
+  Prelude.Hashable
+    BatchGetAssetPropertyValueHistoryEntry
+  where
+  hashWithSalt
+    _salt
+    BatchGetAssetPropertyValueHistoryEntry' {..} =
+      _salt
+        `Prelude.hashWithSalt` assetId
+        `Prelude.hashWithSalt` endDate
+        `Prelude.hashWithSalt` propertyAlias
+        `Prelude.hashWithSalt` propertyId
+        `Prelude.hashWithSalt` qualities
+        `Prelude.hashWithSalt` startDate
+        `Prelude.hashWithSalt` timeOrdering
+        `Prelude.hashWithSalt` entryId
+
+instance
+  Prelude.NFData
+    BatchGetAssetPropertyValueHistoryEntry
+  where
+  rnf BatchGetAssetPropertyValueHistoryEntry' {..} =
+    Prelude.rnf assetId
+      `Prelude.seq` Prelude.rnf endDate
+      `Prelude.seq` Prelude.rnf propertyAlias
+      `Prelude.seq` Prelude.rnf propertyId
+      `Prelude.seq` Prelude.rnf qualities
+      `Prelude.seq` Prelude.rnf startDate
+      `Prelude.seq` Prelude.rnf timeOrdering
+      `Prelude.seq` Prelude.rnf entryId
+
+instance
+  Data.ToJSON
+    BatchGetAssetPropertyValueHistoryEntry
+  where
+  toJSON BatchGetAssetPropertyValueHistoryEntry' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("assetId" Data..=) Prelude.<$> assetId,
+            ("endDate" Data..=) Prelude.<$> endDate,
+            ("propertyAlias" Data..=) Prelude.<$> propertyAlias,
+            ("propertyId" Data..=) Prelude.<$> propertyId,
+            ("qualities" Data..=) Prelude.<$> qualities,
+            ("startDate" Data..=) Prelude.<$> startDate,
+            ("timeOrdering" Data..=) Prelude.<$> timeOrdering,
+            Prelude.Just ("entryId" Data..= entryId)
+          ]
+      )
diff --git a/gen/Amazonka/IoTSiteWise/Types/BatchGetAssetPropertyValueHistoryErrorCode.hs b/gen/Amazonka/IoTSiteWise/Types/BatchGetAssetPropertyValueHistoryErrorCode.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/IoTSiteWise/Types/BatchGetAssetPropertyValueHistoryErrorCode.hs
@@ -0,0 +1,76 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DerivingStrategies #-}
+{-# LANGUAGE GeneralizedNewtypeDeriving #-}
+{-# LANGUAGE LambdaCase #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE PatternSynonyms #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.IoTSiteWise.Types.BatchGetAssetPropertyValueHistoryErrorCode
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.IoTSiteWise.Types.BatchGetAssetPropertyValueHistoryErrorCode
+  ( BatchGetAssetPropertyValueHistoryErrorCode
+      ( ..,
+        BatchGetAssetPropertyValueHistoryErrorCode_AccessDeniedException,
+        BatchGetAssetPropertyValueHistoryErrorCode_InvalidRequestException,
+        BatchGetAssetPropertyValueHistoryErrorCode_ResourceNotFoundException
+      ),
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+newtype BatchGetAssetPropertyValueHistoryErrorCode = BatchGetAssetPropertyValueHistoryErrorCode'
+  { fromBatchGetAssetPropertyValueHistoryErrorCode ::
+      Data.Text
+  }
+  deriving stock
+    ( Prelude.Show,
+      Prelude.Read,
+      Prelude.Eq,
+      Prelude.Ord,
+      Prelude.Generic
+    )
+  deriving newtype
+    ( Prelude.Hashable,
+      Prelude.NFData,
+      Data.FromText,
+      Data.ToText,
+      Data.ToByteString,
+      Data.ToLog,
+      Data.ToHeader,
+      Data.ToQuery,
+      Data.FromJSON,
+      Data.FromJSONKey,
+      Data.ToJSON,
+      Data.ToJSONKey,
+      Data.FromXML,
+      Data.ToXML
+    )
+
+pattern BatchGetAssetPropertyValueHistoryErrorCode_AccessDeniedException :: BatchGetAssetPropertyValueHistoryErrorCode
+pattern BatchGetAssetPropertyValueHistoryErrorCode_AccessDeniedException = BatchGetAssetPropertyValueHistoryErrorCode' "AccessDeniedException"
+
+pattern BatchGetAssetPropertyValueHistoryErrorCode_InvalidRequestException :: BatchGetAssetPropertyValueHistoryErrorCode
+pattern BatchGetAssetPropertyValueHistoryErrorCode_InvalidRequestException = BatchGetAssetPropertyValueHistoryErrorCode' "InvalidRequestException"
+
+pattern BatchGetAssetPropertyValueHistoryErrorCode_ResourceNotFoundException :: BatchGetAssetPropertyValueHistoryErrorCode
+pattern BatchGetAssetPropertyValueHistoryErrorCode_ResourceNotFoundException = BatchGetAssetPropertyValueHistoryErrorCode' "ResourceNotFoundException"
+
+{-# COMPLETE
+  BatchGetAssetPropertyValueHistoryErrorCode_AccessDeniedException,
+  BatchGetAssetPropertyValueHistoryErrorCode_InvalidRequestException,
+  BatchGetAssetPropertyValueHistoryErrorCode_ResourceNotFoundException,
+  BatchGetAssetPropertyValueHistoryErrorCode'
+  #-}
diff --git a/gen/Amazonka/IoTSiteWise/Types/BatchGetAssetPropertyValueHistoryErrorEntry.hs b/gen/Amazonka/IoTSiteWise/Types/BatchGetAssetPropertyValueHistoryErrorEntry.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/IoTSiteWise/Types/BatchGetAssetPropertyValueHistoryErrorEntry.hs
@@ -0,0 +1,119 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.IoTSiteWise.Types.BatchGetAssetPropertyValueHistoryErrorEntry
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.IoTSiteWise.Types.BatchGetAssetPropertyValueHistoryErrorEntry where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.IoTSiteWise.Types.BatchGetAssetPropertyValueHistoryErrorCode
+import qualified Amazonka.Prelude as Prelude
+
+-- | A list of the errors (if any) associated with the batch request. Each
+-- error entry contains the @entryId@ of the entry that failed.
+--
+-- /See:/ 'newBatchGetAssetPropertyValueHistoryErrorEntry' smart constructor.
+data BatchGetAssetPropertyValueHistoryErrorEntry = BatchGetAssetPropertyValueHistoryErrorEntry'
+  { -- | The error code.
+    errorCode :: BatchGetAssetPropertyValueHistoryErrorCode,
+    -- | The associated error message.
+    errorMessage :: Prelude.Text,
+    -- | The ID of the entry.
+    entryId :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'BatchGetAssetPropertyValueHistoryErrorEntry' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'errorCode', 'batchGetAssetPropertyValueHistoryErrorEntry_errorCode' - The error code.
+--
+-- 'errorMessage', 'batchGetAssetPropertyValueHistoryErrorEntry_errorMessage' - The associated error message.
+--
+-- 'entryId', 'batchGetAssetPropertyValueHistoryErrorEntry_entryId' - The ID of the entry.
+newBatchGetAssetPropertyValueHistoryErrorEntry ::
+  -- | 'errorCode'
+  BatchGetAssetPropertyValueHistoryErrorCode ->
+  -- | 'errorMessage'
+  Prelude.Text ->
+  -- | 'entryId'
+  Prelude.Text ->
+  BatchGetAssetPropertyValueHistoryErrorEntry
+newBatchGetAssetPropertyValueHistoryErrorEntry
+  pErrorCode_
+  pErrorMessage_
+  pEntryId_ =
+    BatchGetAssetPropertyValueHistoryErrorEntry'
+      { errorCode =
+          pErrorCode_,
+        errorMessage = pErrorMessage_,
+        entryId = pEntryId_
+      }
+
+-- | The error code.
+batchGetAssetPropertyValueHistoryErrorEntry_errorCode :: Lens.Lens' BatchGetAssetPropertyValueHistoryErrorEntry BatchGetAssetPropertyValueHistoryErrorCode
+batchGetAssetPropertyValueHistoryErrorEntry_errorCode = Lens.lens (\BatchGetAssetPropertyValueHistoryErrorEntry' {errorCode} -> errorCode) (\s@BatchGetAssetPropertyValueHistoryErrorEntry' {} a -> s {errorCode = a} :: BatchGetAssetPropertyValueHistoryErrorEntry)
+
+-- | The associated error message.
+batchGetAssetPropertyValueHistoryErrorEntry_errorMessage :: Lens.Lens' BatchGetAssetPropertyValueHistoryErrorEntry Prelude.Text
+batchGetAssetPropertyValueHistoryErrorEntry_errorMessage = Lens.lens (\BatchGetAssetPropertyValueHistoryErrorEntry' {errorMessage} -> errorMessage) (\s@BatchGetAssetPropertyValueHistoryErrorEntry' {} a -> s {errorMessage = a} :: BatchGetAssetPropertyValueHistoryErrorEntry)
+
+-- | The ID of the entry.
+batchGetAssetPropertyValueHistoryErrorEntry_entryId :: Lens.Lens' BatchGetAssetPropertyValueHistoryErrorEntry Prelude.Text
+batchGetAssetPropertyValueHistoryErrorEntry_entryId = Lens.lens (\BatchGetAssetPropertyValueHistoryErrorEntry' {entryId} -> entryId) (\s@BatchGetAssetPropertyValueHistoryErrorEntry' {} a -> s {entryId = a} :: BatchGetAssetPropertyValueHistoryErrorEntry)
+
+instance
+  Data.FromJSON
+    BatchGetAssetPropertyValueHistoryErrorEntry
+  where
+  parseJSON =
+    Data.withObject
+      "BatchGetAssetPropertyValueHistoryErrorEntry"
+      ( \x ->
+          BatchGetAssetPropertyValueHistoryErrorEntry'
+            Prelude.<$> (x Data..: "errorCode")
+            Prelude.<*> (x Data..: "errorMessage")
+            Prelude.<*> (x Data..: "entryId")
+      )
+
+instance
+  Prelude.Hashable
+    BatchGetAssetPropertyValueHistoryErrorEntry
+  where
+  hashWithSalt
+    _salt
+    BatchGetAssetPropertyValueHistoryErrorEntry' {..} =
+      _salt
+        `Prelude.hashWithSalt` errorCode
+        `Prelude.hashWithSalt` errorMessage
+        `Prelude.hashWithSalt` entryId
+
+instance
+  Prelude.NFData
+    BatchGetAssetPropertyValueHistoryErrorEntry
+  where
+  rnf BatchGetAssetPropertyValueHistoryErrorEntry' {..} =
+    Prelude.rnf errorCode
+      `Prelude.seq` Prelude.rnf errorMessage
+      `Prelude.seq` Prelude.rnf entryId
diff --git a/gen/Amazonka/IoTSiteWise/Types/BatchGetAssetPropertyValueHistoryErrorInfo.hs b/gen/Amazonka/IoTSiteWise/Types/BatchGetAssetPropertyValueHistoryErrorInfo.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/IoTSiteWise/Types/BatchGetAssetPropertyValueHistoryErrorInfo.hs
@@ -0,0 +1,105 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.IoTSiteWise.Types.BatchGetAssetPropertyValueHistoryErrorInfo
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.IoTSiteWise.Types.BatchGetAssetPropertyValueHistoryErrorInfo where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.IoTSiteWise.Types.BatchGetAssetPropertyValueHistoryErrorCode
+import qualified Amazonka.Prelude as Prelude
+
+-- | The error information, such as the error code and the timestamp.
+--
+-- /See:/ 'newBatchGetAssetPropertyValueHistoryErrorInfo' smart constructor.
+data BatchGetAssetPropertyValueHistoryErrorInfo = BatchGetAssetPropertyValueHistoryErrorInfo'
+  { -- | The error code.
+    errorCode :: BatchGetAssetPropertyValueHistoryErrorCode,
+    -- | The date the error occurred, in Unix epoch time.
+    errorTimestamp :: Data.POSIX
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'BatchGetAssetPropertyValueHistoryErrorInfo' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'errorCode', 'batchGetAssetPropertyValueHistoryErrorInfo_errorCode' - The error code.
+--
+-- 'errorTimestamp', 'batchGetAssetPropertyValueHistoryErrorInfo_errorTimestamp' - The date the error occurred, in Unix epoch time.
+newBatchGetAssetPropertyValueHistoryErrorInfo ::
+  -- | 'errorCode'
+  BatchGetAssetPropertyValueHistoryErrorCode ->
+  -- | 'errorTimestamp'
+  Prelude.UTCTime ->
+  BatchGetAssetPropertyValueHistoryErrorInfo
+newBatchGetAssetPropertyValueHistoryErrorInfo
+  pErrorCode_
+  pErrorTimestamp_ =
+    BatchGetAssetPropertyValueHistoryErrorInfo'
+      { errorCode =
+          pErrorCode_,
+        errorTimestamp =
+          Data._Time
+            Lens.# pErrorTimestamp_
+      }
+
+-- | The error code.
+batchGetAssetPropertyValueHistoryErrorInfo_errorCode :: Lens.Lens' BatchGetAssetPropertyValueHistoryErrorInfo BatchGetAssetPropertyValueHistoryErrorCode
+batchGetAssetPropertyValueHistoryErrorInfo_errorCode = Lens.lens (\BatchGetAssetPropertyValueHistoryErrorInfo' {errorCode} -> errorCode) (\s@BatchGetAssetPropertyValueHistoryErrorInfo' {} a -> s {errorCode = a} :: BatchGetAssetPropertyValueHistoryErrorInfo)
+
+-- | The date the error occurred, in Unix epoch time.
+batchGetAssetPropertyValueHistoryErrorInfo_errorTimestamp :: Lens.Lens' BatchGetAssetPropertyValueHistoryErrorInfo Prelude.UTCTime
+batchGetAssetPropertyValueHistoryErrorInfo_errorTimestamp = Lens.lens (\BatchGetAssetPropertyValueHistoryErrorInfo' {errorTimestamp} -> errorTimestamp) (\s@BatchGetAssetPropertyValueHistoryErrorInfo' {} a -> s {errorTimestamp = a} :: BatchGetAssetPropertyValueHistoryErrorInfo) Prelude.. Data._Time
+
+instance
+  Data.FromJSON
+    BatchGetAssetPropertyValueHistoryErrorInfo
+  where
+  parseJSON =
+    Data.withObject
+      "BatchGetAssetPropertyValueHistoryErrorInfo"
+      ( \x ->
+          BatchGetAssetPropertyValueHistoryErrorInfo'
+            Prelude.<$> (x Data..: "errorCode")
+            Prelude.<*> (x Data..: "errorTimestamp")
+      )
+
+instance
+  Prelude.Hashable
+    BatchGetAssetPropertyValueHistoryErrorInfo
+  where
+  hashWithSalt
+    _salt
+    BatchGetAssetPropertyValueHistoryErrorInfo' {..} =
+      _salt
+        `Prelude.hashWithSalt` errorCode
+        `Prelude.hashWithSalt` errorTimestamp
+
+instance
+  Prelude.NFData
+    BatchGetAssetPropertyValueHistoryErrorInfo
+  where
+  rnf BatchGetAssetPropertyValueHistoryErrorInfo' {..} =
+    Prelude.rnf errorCode
+      `Prelude.seq` Prelude.rnf errorTimestamp
diff --git a/gen/Amazonka/IoTSiteWise/Types/BatchGetAssetPropertyValueHistorySkippedEntry.hs b/gen/Amazonka/IoTSiteWise/Types/BatchGetAssetPropertyValueHistorySkippedEntry.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/IoTSiteWise/Types/BatchGetAssetPropertyValueHistorySkippedEntry.hs
@@ -0,0 +1,127 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.IoTSiteWise.Types.BatchGetAssetPropertyValueHistorySkippedEntry
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.IoTSiteWise.Types.BatchGetAssetPropertyValueHistorySkippedEntry where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.IoTSiteWise.Types.BatchEntryCompletionStatus
+import Amazonka.IoTSiteWise.Types.BatchGetAssetPropertyValueHistoryErrorInfo
+import qualified Amazonka.Prelude as Prelude
+
+-- | Contains information for an entry that has been processed by the
+-- previous
+-- <https://docs.aws.amazon.com/iot-sitewise/latest/APIReference/API_BatchGetAssetPropertyValue.html BatchGetAssetPropertyValueHistory>
+-- request.
+--
+-- /See:/ 'newBatchGetAssetPropertyValueHistorySkippedEntry' smart constructor.
+data BatchGetAssetPropertyValueHistorySkippedEntry = BatchGetAssetPropertyValueHistorySkippedEntry'
+  { -- | The error information, such as the error code and the timestamp.
+    errorInfo :: Prelude.Maybe BatchGetAssetPropertyValueHistoryErrorInfo,
+    -- | The ID of the entry.
+    entryId :: Prelude.Text,
+    -- | The completion status of each entry that is associated with the
+    -- <https://docs.aws.amazon.com/iot-sitewise/latest/APIReference/API_BatchGetAssetPropertyValueHistory.html BatchGetAssetPropertyValueHistory>
+    -- API.
+    completionStatus :: BatchEntryCompletionStatus
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'BatchGetAssetPropertyValueHistorySkippedEntry' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'errorInfo', 'batchGetAssetPropertyValueHistorySkippedEntry_errorInfo' - The error information, such as the error code and the timestamp.
+--
+-- 'entryId', 'batchGetAssetPropertyValueHistorySkippedEntry_entryId' - The ID of the entry.
+--
+-- 'completionStatus', 'batchGetAssetPropertyValueHistorySkippedEntry_completionStatus' - The completion status of each entry that is associated with the
+-- <https://docs.aws.amazon.com/iot-sitewise/latest/APIReference/API_BatchGetAssetPropertyValueHistory.html BatchGetAssetPropertyValueHistory>
+-- API.
+newBatchGetAssetPropertyValueHistorySkippedEntry ::
+  -- | 'entryId'
+  Prelude.Text ->
+  -- | 'completionStatus'
+  BatchEntryCompletionStatus ->
+  BatchGetAssetPropertyValueHistorySkippedEntry
+newBatchGetAssetPropertyValueHistorySkippedEntry
+  pEntryId_
+  pCompletionStatus_ =
+    BatchGetAssetPropertyValueHistorySkippedEntry'
+      { errorInfo =
+          Prelude.Nothing,
+        entryId = pEntryId_,
+        completionStatus =
+          pCompletionStatus_
+      }
+
+-- | The error information, such as the error code and the timestamp.
+batchGetAssetPropertyValueHistorySkippedEntry_errorInfo :: Lens.Lens' BatchGetAssetPropertyValueHistorySkippedEntry (Prelude.Maybe BatchGetAssetPropertyValueHistoryErrorInfo)
+batchGetAssetPropertyValueHistorySkippedEntry_errorInfo = Lens.lens (\BatchGetAssetPropertyValueHistorySkippedEntry' {errorInfo} -> errorInfo) (\s@BatchGetAssetPropertyValueHistorySkippedEntry' {} a -> s {errorInfo = a} :: BatchGetAssetPropertyValueHistorySkippedEntry)
+
+-- | The ID of the entry.
+batchGetAssetPropertyValueHistorySkippedEntry_entryId :: Lens.Lens' BatchGetAssetPropertyValueHistorySkippedEntry Prelude.Text
+batchGetAssetPropertyValueHistorySkippedEntry_entryId = Lens.lens (\BatchGetAssetPropertyValueHistorySkippedEntry' {entryId} -> entryId) (\s@BatchGetAssetPropertyValueHistorySkippedEntry' {} a -> s {entryId = a} :: BatchGetAssetPropertyValueHistorySkippedEntry)
+
+-- | The completion status of each entry that is associated with the
+-- <https://docs.aws.amazon.com/iot-sitewise/latest/APIReference/API_BatchGetAssetPropertyValueHistory.html BatchGetAssetPropertyValueHistory>
+-- API.
+batchGetAssetPropertyValueHistorySkippedEntry_completionStatus :: Lens.Lens' BatchGetAssetPropertyValueHistorySkippedEntry BatchEntryCompletionStatus
+batchGetAssetPropertyValueHistorySkippedEntry_completionStatus = Lens.lens (\BatchGetAssetPropertyValueHistorySkippedEntry' {completionStatus} -> completionStatus) (\s@BatchGetAssetPropertyValueHistorySkippedEntry' {} a -> s {completionStatus = a} :: BatchGetAssetPropertyValueHistorySkippedEntry)
+
+instance
+  Data.FromJSON
+    BatchGetAssetPropertyValueHistorySkippedEntry
+  where
+  parseJSON =
+    Data.withObject
+      "BatchGetAssetPropertyValueHistorySkippedEntry"
+      ( \x ->
+          BatchGetAssetPropertyValueHistorySkippedEntry'
+            Prelude.<$> (x Data..:? "errorInfo")
+            Prelude.<*> (x Data..: "entryId")
+            Prelude.<*> (x Data..: "completionStatus")
+      )
+
+instance
+  Prelude.Hashable
+    BatchGetAssetPropertyValueHistorySkippedEntry
+  where
+  hashWithSalt
+    _salt
+    BatchGetAssetPropertyValueHistorySkippedEntry' {..} =
+      _salt
+        `Prelude.hashWithSalt` errorInfo
+        `Prelude.hashWithSalt` entryId
+        `Prelude.hashWithSalt` completionStatus
+
+instance
+  Prelude.NFData
+    BatchGetAssetPropertyValueHistorySkippedEntry
+  where
+  rnf
+    BatchGetAssetPropertyValueHistorySkippedEntry' {..} =
+      Prelude.rnf errorInfo
+        `Prelude.seq` Prelude.rnf entryId
+        `Prelude.seq` Prelude.rnf completionStatus
diff --git a/gen/Amazonka/IoTSiteWise/Types/BatchGetAssetPropertyValueHistorySuccessEntry.hs b/gen/Amazonka/IoTSiteWise/Types/BatchGetAssetPropertyValueHistorySuccessEntry.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/IoTSiteWise/Types/BatchGetAssetPropertyValueHistorySuccessEntry.hs
@@ -0,0 +1,107 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.IoTSiteWise.Types.BatchGetAssetPropertyValueHistorySuccessEntry
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.IoTSiteWise.Types.BatchGetAssetPropertyValueHistorySuccessEntry where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.IoTSiteWise.Types.AssetPropertyValue
+import qualified Amazonka.Prelude as Prelude
+
+-- | Contains success information for an entry that is associated with the
+-- <https://docs.aws.amazon.com/iot-sitewise/latest/APIReference/API_BatchGetAssetPropertyValue.html BatchGetAssetPropertyValueHistory>
+-- API.
+--
+-- /See:/ 'newBatchGetAssetPropertyValueHistorySuccessEntry' smart constructor.
+data BatchGetAssetPropertyValueHistorySuccessEntry = BatchGetAssetPropertyValueHistorySuccessEntry'
+  { -- | The ID of the entry.
+    entryId :: Prelude.Text,
+    -- | The requested historical values for the specified asset property.
+    assetPropertyValueHistory :: [AssetPropertyValue]
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'BatchGetAssetPropertyValueHistorySuccessEntry' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'entryId', 'batchGetAssetPropertyValueHistorySuccessEntry_entryId' - The ID of the entry.
+--
+-- 'assetPropertyValueHistory', 'batchGetAssetPropertyValueHistorySuccessEntry_assetPropertyValueHistory' - The requested historical values for the specified asset property.
+newBatchGetAssetPropertyValueHistorySuccessEntry ::
+  -- | 'entryId'
+  Prelude.Text ->
+  BatchGetAssetPropertyValueHistorySuccessEntry
+newBatchGetAssetPropertyValueHistorySuccessEntry
+  pEntryId_ =
+    BatchGetAssetPropertyValueHistorySuccessEntry'
+      { entryId =
+          pEntryId_,
+        assetPropertyValueHistory =
+          Prelude.mempty
+      }
+
+-- | The ID of the entry.
+batchGetAssetPropertyValueHistorySuccessEntry_entryId :: Lens.Lens' BatchGetAssetPropertyValueHistorySuccessEntry Prelude.Text
+batchGetAssetPropertyValueHistorySuccessEntry_entryId = Lens.lens (\BatchGetAssetPropertyValueHistorySuccessEntry' {entryId} -> entryId) (\s@BatchGetAssetPropertyValueHistorySuccessEntry' {} a -> s {entryId = a} :: BatchGetAssetPropertyValueHistorySuccessEntry)
+
+-- | The requested historical values for the specified asset property.
+batchGetAssetPropertyValueHistorySuccessEntry_assetPropertyValueHistory :: Lens.Lens' BatchGetAssetPropertyValueHistorySuccessEntry [AssetPropertyValue]
+batchGetAssetPropertyValueHistorySuccessEntry_assetPropertyValueHistory = Lens.lens (\BatchGetAssetPropertyValueHistorySuccessEntry' {assetPropertyValueHistory} -> assetPropertyValueHistory) (\s@BatchGetAssetPropertyValueHistorySuccessEntry' {} a -> s {assetPropertyValueHistory = a} :: BatchGetAssetPropertyValueHistorySuccessEntry) Prelude.. Lens.coerced
+
+instance
+  Data.FromJSON
+    BatchGetAssetPropertyValueHistorySuccessEntry
+  where
+  parseJSON =
+    Data.withObject
+      "BatchGetAssetPropertyValueHistorySuccessEntry"
+      ( \x ->
+          BatchGetAssetPropertyValueHistorySuccessEntry'
+            Prelude.<$> (x Data..: "entryId")
+            Prelude.<*> ( x
+                            Data..:? "assetPropertyValueHistory"
+                            Data..!= Prelude.mempty
+                        )
+      )
+
+instance
+  Prelude.Hashable
+    BatchGetAssetPropertyValueHistorySuccessEntry
+  where
+  hashWithSalt
+    _salt
+    BatchGetAssetPropertyValueHistorySuccessEntry' {..} =
+      _salt
+        `Prelude.hashWithSalt` entryId
+        `Prelude.hashWithSalt` assetPropertyValueHistory
+
+instance
+  Prelude.NFData
+    BatchGetAssetPropertyValueHistorySuccessEntry
+  where
+  rnf
+    BatchGetAssetPropertyValueHistorySuccessEntry' {..} =
+      Prelude.rnf entryId
+        `Prelude.seq` Prelude.rnf assetPropertyValueHistory
diff --git a/gen/Amazonka/IoTSiteWise/Types/BatchGetAssetPropertyValueSkippedEntry.hs b/gen/Amazonka/IoTSiteWise/Types/BatchGetAssetPropertyValueSkippedEntry.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/IoTSiteWise/Types/BatchGetAssetPropertyValueSkippedEntry.hs
@@ -0,0 +1,126 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.IoTSiteWise.Types.BatchGetAssetPropertyValueSkippedEntry
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.IoTSiteWise.Types.BatchGetAssetPropertyValueSkippedEntry where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.IoTSiteWise.Types.BatchEntryCompletionStatus
+import Amazonka.IoTSiteWise.Types.BatchGetAssetPropertyValueErrorInfo
+import qualified Amazonka.Prelude as Prelude
+
+-- | Contains information for an entry that has been processed by the
+-- previous
+-- <https://docs.aws.amazon.com/iot-sitewise/latest/APIReference/API_BatchGetAssetPropertyValue.html BatchGetAssetPropertyValue>
+-- request.
+--
+-- /See:/ 'newBatchGetAssetPropertyValueSkippedEntry' smart constructor.
+data BatchGetAssetPropertyValueSkippedEntry = BatchGetAssetPropertyValueSkippedEntry'
+  { -- | The error information, such as the error code and the timestamp.
+    errorInfo :: Prelude.Maybe BatchGetAssetPropertyValueErrorInfo,
+    -- | The ID of the entry.
+    entryId :: Prelude.Text,
+    -- | The completion status of each entry that is associated with the
+    -- <https://docs.aws.amazon.com/iot-sitewise/latest/APIReference/API_BatchGetAssetPropertyValue.html BatchGetAssetPropertyValue>
+    -- request.
+    completionStatus :: BatchEntryCompletionStatus
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'BatchGetAssetPropertyValueSkippedEntry' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'errorInfo', 'batchGetAssetPropertyValueSkippedEntry_errorInfo' - The error information, such as the error code and the timestamp.
+--
+-- 'entryId', 'batchGetAssetPropertyValueSkippedEntry_entryId' - The ID of the entry.
+--
+-- 'completionStatus', 'batchGetAssetPropertyValueSkippedEntry_completionStatus' - The completion status of each entry that is associated with the
+-- <https://docs.aws.amazon.com/iot-sitewise/latest/APIReference/API_BatchGetAssetPropertyValue.html BatchGetAssetPropertyValue>
+-- request.
+newBatchGetAssetPropertyValueSkippedEntry ::
+  -- | 'entryId'
+  Prelude.Text ->
+  -- | 'completionStatus'
+  BatchEntryCompletionStatus ->
+  BatchGetAssetPropertyValueSkippedEntry
+newBatchGetAssetPropertyValueSkippedEntry
+  pEntryId_
+  pCompletionStatus_ =
+    BatchGetAssetPropertyValueSkippedEntry'
+      { errorInfo =
+          Prelude.Nothing,
+        entryId = pEntryId_,
+        completionStatus =
+          pCompletionStatus_
+      }
+
+-- | The error information, such as the error code and the timestamp.
+batchGetAssetPropertyValueSkippedEntry_errorInfo :: Lens.Lens' BatchGetAssetPropertyValueSkippedEntry (Prelude.Maybe BatchGetAssetPropertyValueErrorInfo)
+batchGetAssetPropertyValueSkippedEntry_errorInfo = Lens.lens (\BatchGetAssetPropertyValueSkippedEntry' {errorInfo} -> errorInfo) (\s@BatchGetAssetPropertyValueSkippedEntry' {} a -> s {errorInfo = a} :: BatchGetAssetPropertyValueSkippedEntry)
+
+-- | The ID of the entry.
+batchGetAssetPropertyValueSkippedEntry_entryId :: Lens.Lens' BatchGetAssetPropertyValueSkippedEntry Prelude.Text
+batchGetAssetPropertyValueSkippedEntry_entryId = Lens.lens (\BatchGetAssetPropertyValueSkippedEntry' {entryId} -> entryId) (\s@BatchGetAssetPropertyValueSkippedEntry' {} a -> s {entryId = a} :: BatchGetAssetPropertyValueSkippedEntry)
+
+-- | The completion status of each entry that is associated with the
+-- <https://docs.aws.amazon.com/iot-sitewise/latest/APIReference/API_BatchGetAssetPropertyValue.html BatchGetAssetPropertyValue>
+-- request.
+batchGetAssetPropertyValueSkippedEntry_completionStatus :: Lens.Lens' BatchGetAssetPropertyValueSkippedEntry BatchEntryCompletionStatus
+batchGetAssetPropertyValueSkippedEntry_completionStatus = Lens.lens (\BatchGetAssetPropertyValueSkippedEntry' {completionStatus} -> completionStatus) (\s@BatchGetAssetPropertyValueSkippedEntry' {} a -> s {completionStatus = a} :: BatchGetAssetPropertyValueSkippedEntry)
+
+instance
+  Data.FromJSON
+    BatchGetAssetPropertyValueSkippedEntry
+  where
+  parseJSON =
+    Data.withObject
+      "BatchGetAssetPropertyValueSkippedEntry"
+      ( \x ->
+          BatchGetAssetPropertyValueSkippedEntry'
+            Prelude.<$> (x Data..:? "errorInfo")
+            Prelude.<*> (x Data..: "entryId")
+            Prelude.<*> (x Data..: "completionStatus")
+      )
+
+instance
+  Prelude.Hashable
+    BatchGetAssetPropertyValueSkippedEntry
+  where
+  hashWithSalt
+    _salt
+    BatchGetAssetPropertyValueSkippedEntry' {..} =
+      _salt
+        `Prelude.hashWithSalt` errorInfo
+        `Prelude.hashWithSalt` entryId
+        `Prelude.hashWithSalt` completionStatus
+
+instance
+  Prelude.NFData
+    BatchGetAssetPropertyValueSkippedEntry
+  where
+  rnf BatchGetAssetPropertyValueSkippedEntry' {..} =
+    Prelude.rnf errorInfo
+      `Prelude.seq` Prelude.rnf entryId
+      `Prelude.seq` Prelude.rnf completionStatus
diff --git a/gen/Amazonka/IoTSiteWise/Types/BatchGetAssetPropertyValueSuccessEntry.hs b/gen/Amazonka/IoTSiteWise/Types/BatchGetAssetPropertyValueSuccessEntry.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/IoTSiteWise/Types/BatchGetAssetPropertyValueSuccessEntry.hs
@@ -0,0 +1,100 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.IoTSiteWise.Types.BatchGetAssetPropertyValueSuccessEntry
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.IoTSiteWise.Types.BatchGetAssetPropertyValueSuccessEntry where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.IoTSiteWise.Types.AssetPropertyValue
+import qualified Amazonka.Prelude as Prelude
+
+-- | Contains success information for an entry that is associated with the
+-- <https://docs.aws.amazon.com/iot-sitewise/latest/APIReference/API_BatchGetAssetPropertyValue.html BatchGetAssetPropertyValue>
+-- API.
+--
+-- /See:/ 'newBatchGetAssetPropertyValueSuccessEntry' smart constructor.
+data BatchGetAssetPropertyValueSuccessEntry = BatchGetAssetPropertyValueSuccessEntry'
+  { assetPropertyValue :: Prelude.Maybe AssetPropertyValue,
+    -- | The ID of the entry.
+    entryId :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'BatchGetAssetPropertyValueSuccessEntry' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'assetPropertyValue', 'batchGetAssetPropertyValueSuccessEntry_assetPropertyValue' - Undocumented member.
+--
+-- 'entryId', 'batchGetAssetPropertyValueSuccessEntry_entryId' - The ID of the entry.
+newBatchGetAssetPropertyValueSuccessEntry ::
+  -- | 'entryId'
+  Prelude.Text ->
+  BatchGetAssetPropertyValueSuccessEntry
+newBatchGetAssetPropertyValueSuccessEntry pEntryId_ =
+  BatchGetAssetPropertyValueSuccessEntry'
+    { assetPropertyValue =
+        Prelude.Nothing,
+      entryId = pEntryId_
+    }
+
+-- | Undocumented member.
+batchGetAssetPropertyValueSuccessEntry_assetPropertyValue :: Lens.Lens' BatchGetAssetPropertyValueSuccessEntry (Prelude.Maybe AssetPropertyValue)
+batchGetAssetPropertyValueSuccessEntry_assetPropertyValue = Lens.lens (\BatchGetAssetPropertyValueSuccessEntry' {assetPropertyValue} -> assetPropertyValue) (\s@BatchGetAssetPropertyValueSuccessEntry' {} a -> s {assetPropertyValue = a} :: BatchGetAssetPropertyValueSuccessEntry)
+
+-- | The ID of the entry.
+batchGetAssetPropertyValueSuccessEntry_entryId :: Lens.Lens' BatchGetAssetPropertyValueSuccessEntry Prelude.Text
+batchGetAssetPropertyValueSuccessEntry_entryId = Lens.lens (\BatchGetAssetPropertyValueSuccessEntry' {entryId} -> entryId) (\s@BatchGetAssetPropertyValueSuccessEntry' {} a -> s {entryId = a} :: BatchGetAssetPropertyValueSuccessEntry)
+
+instance
+  Data.FromJSON
+    BatchGetAssetPropertyValueSuccessEntry
+  where
+  parseJSON =
+    Data.withObject
+      "BatchGetAssetPropertyValueSuccessEntry"
+      ( \x ->
+          BatchGetAssetPropertyValueSuccessEntry'
+            Prelude.<$> (x Data..:? "assetPropertyValue")
+            Prelude.<*> (x Data..: "entryId")
+      )
+
+instance
+  Prelude.Hashable
+    BatchGetAssetPropertyValueSuccessEntry
+  where
+  hashWithSalt
+    _salt
+    BatchGetAssetPropertyValueSuccessEntry' {..} =
+      _salt
+        `Prelude.hashWithSalt` assetPropertyValue
+        `Prelude.hashWithSalt` entryId
+
+instance
+  Prelude.NFData
+    BatchGetAssetPropertyValueSuccessEntry
+  where
+  rnf BatchGetAssetPropertyValueSuccessEntry' {..} =
+    Prelude.rnf assetPropertyValue
+      `Prelude.seq` Prelude.rnf entryId
diff --git a/gen/Amazonka/IoTSiteWise/Types/BatchPutAssetPropertyError.hs b/gen/Amazonka/IoTSiteWise/Types/BatchPutAssetPropertyError.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/IoTSiteWise/Types/BatchPutAssetPropertyError.hs
@@ -0,0 +1,106 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.IoTSiteWise.Types.BatchPutAssetPropertyError
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.IoTSiteWise.Types.BatchPutAssetPropertyError where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.IoTSiteWise.Types.BatchPutAssetPropertyValueErrorCode
+import Amazonka.IoTSiteWise.Types.TimeInNanos
+import qualified Amazonka.Prelude as Prelude
+
+-- | Contains error information from updating a batch of asset property
+-- values.
+--
+-- /See:/ 'newBatchPutAssetPropertyError' smart constructor.
+data BatchPutAssetPropertyError = BatchPutAssetPropertyError'
+  { -- | The error code.
+    errorCode :: BatchPutAssetPropertyValueErrorCode,
+    -- | The associated error message.
+    errorMessage :: Prelude.Text,
+    -- | A list of timestamps for each error, if any.
+    timestamps :: [TimeInNanos]
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'BatchPutAssetPropertyError' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'errorCode', 'batchPutAssetPropertyError_errorCode' - The error code.
+--
+-- 'errorMessage', 'batchPutAssetPropertyError_errorMessage' - The associated error message.
+--
+-- 'timestamps', 'batchPutAssetPropertyError_timestamps' - A list of timestamps for each error, if any.
+newBatchPutAssetPropertyError ::
+  -- | 'errorCode'
+  BatchPutAssetPropertyValueErrorCode ->
+  -- | 'errorMessage'
+  Prelude.Text ->
+  BatchPutAssetPropertyError
+newBatchPutAssetPropertyError
+  pErrorCode_
+  pErrorMessage_ =
+    BatchPutAssetPropertyError'
+      { errorCode =
+          pErrorCode_,
+        errorMessage = pErrorMessage_,
+        timestamps = Prelude.mempty
+      }
+
+-- | The error code.
+batchPutAssetPropertyError_errorCode :: Lens.Lens' BatchPutAssetPropertyError BatchPutAssetPropertyValueErrorCode
+batchPutAssetPropertyError_errorCode = Lens.lens (\BatchPutAssetPropertyError' {errorCode} -> errorCode) (\s@BatchPutAssetPropertyError' {} a -> s {errorCode = a} :: BatchPutAssetPropertyError)
+
+-- | The associated error message.
+batchPutAssetPropertyError_errorMessage :: Lens.Lens' BatchPutAssetPropertyError Prelude.Text
+batchPutAssetPropertyError_errorMessage = Lens.lens (\BatchPutAssetPropertyError' {errorMessage} -> errorMessage) (\s@BatchPutAssetPropertyError' {} a -> s {errorMessage = a} :: BatchPutAssetPropertyError)
+
+-- | A list of timestamps for each error, if any.
+batchPutAssetPropertyError_timestamps :: Lens.Lens' BatchPutAssetPropertyError [TimeInNanos]
+batchPutAssetPropertyError_timestamps = Lens.lens (\BatchPutAssetPropertyError' {timestamps} -> timestamps) (\s@BatchPutAssetPropertyError' {} a -> s {timestamps = a} :: BatchPutAssetPropertyError) Prelude.. Lens.coerced
+
+instance Data.FromJSON BatchPutAssetPropertyError where
+  parseJSON =
+    Data.withObject
+      "BatchPutAssetPropertyError"
+      ( \x ->
+          BatchPutAssetPropertyError'
+            Prelude.<$> (x Data..: "errorCode")
+            Prelude.<*> (x Data..: "errorMessage")
+            Prelude.<*> (x Data..:? "timestamps" Data..!= Prelude.mempty)
+      )
+
+instance Prelude.Hashable BatchPutAssetPropertyError where
+  hashWithSalt _salt BatchPutAssetPropertyError' {..} =
+    _salt
+      `Prelude.hashWithSalt` errorCode
+      `Prelude.hashWithSalt` errorMessage
+      `Prelude.hashWithSalt` timestamps
+
+instance Prelude.NFData BatchPutAssetPropertyError where
+  rnf BatchPutAssetPropertyError' {..} =
+    Prelude.rnf errorCode
+      `Prelude.seq` Prelude.rnf errorMessage
+      `Prelude.seq` Prelude.rnf timestamps
diff --git a/gen/Amazonka/IoTSiteWise/Types/BatchPutAssetPropertyErrorEntry.hs b/gen/Amazonka/IoTSiteWise/Types/BatchPutAssetPropertyErrorEntry.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/IoTSiteWise/Types/BatchPutAssetPropertyErrorEntry.hs
@@ -0,0 +1,102 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.IoTSiteWise.Types.BatchPutAssetPropertyErrorEntry
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.IoTSiteWise.Types.BatchPutAssetPropertyErrorEntry where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.IoTSiteWise.Types.BatchPutAssetPropertyError
+import qualified Amazonka.Prelude as Prelude
+
+-- | Contains error information for asset property value entries that are
+-- associated with the
+-- <https://docs.aws.amazon.com/iot-sitewise/latest/APIReference/API_BatchPutAssetPropertyValue.html BatchPutAssetPropertyValue>
+-- API.
+--
+-- /See:/ 'newBatchPutAssetPropertyErrorEntry' smart constructor.
+data BatchPutAssetPropertyErrorEntry = BatchPutAssetPropertyErrorEntry'
+  { -- | The ID of the failed entry.
+    entryId :: Prelude.Text,
+    -- | The list of update property value errors.
+    errors :: [BatchPutAssetPropertyError]
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'BatchPutAssetPropertyErrorEntry' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'entryId', 'batchPutAssetPropertyErrorEntry_entryId' - The ID of the failed entry.
+--
+-- 'errors', 'batchPutAssetPropertyErrorEntry_errors' - The list of update property value errors.
+newBatchPutAssetPropertyErrorEntry ::
+  -- | 'entryId'
+  Prelude.Text ->
+  BatchPutAssetPropertyErrorEntry
+newBatchPutAssetPropertyErrorEntry pEntryId_ =
+  BatchPutAssetPropertyErrorEntry'
+    { entryId =
+        pEntryId_,
+      errors = Prelude.mempty
+    }
+
+-- | The ID of the failed entry.
+batchPutAssetPropertyErrorEntry_entryId :: Lens.Lens' BatchPutAssetPropertyErrorEntry Prelude.Text
+batchPutAssetPropertyErrorEntry_entryId = Lens.lens (\BatchPutAssetPropertyErrorEntry' {entryId} -> entryId) (\s@BatchPutAssetPropertyErrorEntry' {} a -> s {entryId = a} :: BatchPutAssetPropertyErrorEntry)
+
+-- | The list of update property value errors.
+batchPutAssetPropertyErrorEntry_errors :: Lens.Lens' BatchPutAssetPropertyErrorEntry [BatchPutAssetPropertyError]
+batchPutAssetPropertyErrorEntry_errors = Lens.lens (\BatchPutAssetPropertyErrorEntry' {errors} -> errors) (\s@BatchPutAssetPropertyErrorEntry' {} a -> s {errors = a} :: BatchPutAssetPropertyErrorEntry) Prelude.. Lens.coerced
+
+instance
+  Data.FromJSON
+    BatchPutAssetPropertyErrorEntry
+  where
+  parseJSON =
+    Data.withObject
+      "BatchPutAssetPropertyErrorEntry"
+      ( \x ->
+          BatchPutAssetPropertyErrorEntry'
+            Prelude.<$> (x Data..: "entryId")
+            Prelude.<*> (x Data..:? "errors" Data..!= Prelude.mempty)
+      )
+
+instance
+  Prelude.Hashable
+    BatchPutAssetPropertyErrorEntry
+  where
+  hashWithSalt
+    _salt
+    BatchPutAssetPropertyErrorEntry' {..} =
+      _salt
+        `Prelude.hashWithSalt` entryId
+        `Prelude.hashWithSalt` errors
+
+instance
+  Prelude.NFData
+    BatchPutAssetPropertyErrorEntry
+  where
+  rnf BatchPutAssetPropertyErrorEntry' {..} =
+    Prelude.rnf entryId
+      `Prelude.seq` Prelude.rnf errors
diff --git a/gen/Amazonka/IoTSiteWise/Types/BatchPutAssetPropertyValueErrorCode.hs b/gen/Amazonka/IoTSiteWise/Types/BatchPutAssetPropertyValueErrorCode.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/IoTSiteWise/Types/BatchPutAssetPropertyValueErrorCode.hs
@@ -0,0 +1,106 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DerivingStrategies #-}
+{-# LANGUAGE GeneralizedNewtypeDeriving #-}
+{-# LANGUAGE LambdaCase #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE PatternSynonyms #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.IoTSiteWise.Types.BatchPutAssetPropertyValueErrorCode
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.IoTSiteWise.Types.BatchPutAssetPropertyValueErrorCode
+  ( BatchPutAssetPropertyValueErrorCode
+      ( ..,
+        BatchPutAssetPropertyValueErrorCode_AccessDeniedException,
+        BatchPutAssetPropertyValueErrorCode_ConflictingOperationException,
+        BatchPutAssetPropertyValueErrorCode_InternalFailureException,
+        BatchPutAssetPropertyValueErrorCode_InvalidRequestException,
+        BatchPutAssetPropertyValueErrorCode_LimitExceededException,
+        BatchPutAssetPropertyValueErrorCode_ResourceNotFoundException,
+        BatchPutAssetPropertyValueErrorCode_ServiceUnavailableException,
+        BatchPutAssetPropertyValueErrorCode_ThrottlingException,
+        BatchPutAssetPropertyValueErrorCode_TimestampOutOfRangeException
+      ),
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+newtype BatchPutAssetPropertyValueErrorCode = BatchPutAssetPropertyValueErrorCode'
+  { fromBatchPutAssetPropertyValueErrorCode ::
+      Data.Text
+  }
+  deriving stock
+    ( Prelude.Show,
+      Prelude.Read,
+      Prelude.Eq,
+      Prelude.Ord,
+      Prelude.Generic
+    )
+  deriving newtype
+    ( Prelude.Hashable,
+      Prelude.NFData,
+      Data.FromText,
+      Data.ToText,
+      Data.ToByteString,
+      Data.ToLog,
+      Data.ToHeader,
+      Data.ToQuery,
+      Data.FromJSON,
+      Data.FromJSONKey,
+      Data.ToJSON,
+      Data.ToJSONKey,
+      Data.FromXML,
+      Data.ToXML
+    )
+
+pattern BatchPutAssetPropertyValueErrorCode_AccessDeniedException :: BatchPutAssetPropertyValueErrorCode
+pattern BatchPutAssetPropertyValueErrorCode_AccessDeniedException = BatchPutAssetPropertyValueErrorCode' "AccessDeniedException"
+
+pattern BatchPutAssetPropertyValueErrorCode_ConflictingOperationException :: BatchPutAssetPropertyValueErrorCode
+pattern BatchPutAssetPropertyValueErrorCode_ConflictingOperationException = BatchPutAssetPropertyValueErrorCode' "ConflictingOperationException"
+
+pattern BatchPutAssetPropertyValueErrorCode_InternalFailureException :: BatchPutAssetPropertyValueErrorCode
+pattern BatchPutAssetPropertyValueErrorCode_InternalFailureException = BatchPutAssetPropertyValueErrorCode' "InternalFailureException"
+
+pattern BatchPutAssetPropertyValueErrorCode_InvalidRequestException :: BatchPutAssetPropertyValueErrorCode
+pattern BatchPutAssetPropertyValueErrorCode_InvalidRequestException = BatchPutAssetPropertyValueErrorCode' "InvalidRequestException"
+
+pattern BatchPutAssetPropertyValueErrorCode_LimitExceededException :: BatchPutAssetPropertyValueErrorCode
+pattern BatchPutAssetPropertyValueErrorCode_LimitExceededException = BatchPutAssetPropertyValueErrorCode' "LimitExceededException"
+
+pattern BatchPutAssetPropertyValueErrorCode_ResourceNotFoundException :: BatchPutAssetPropertyValueErrorCode
+pattern BatchPutAssetPropertyValueErrorCode_ResourceNotFoundException = BatchPutAssetPropertyValueErrorCode' "ResourceNotFoundException"
+
+pattern BatchPutAssetPropertyValueErrorCode_ServiceUnavailableException :: BatchPutAssetPropertyValueErrorCode
+pattern BatchPutAssetPropertyValueErrorCode_ServiceUnavailableException = BatchPutAssetPropertyValueErrorCode' "ServiceUnavailableException"
+
+pattern BatchPutAssetPropertyValueErrorCode_ThrottlingException :: BatchPutAssetPropertyValueErrorCode
+pattern BatchPutAssetPropertyValueErrorCode_ThrottlingException = BatchPutAssetPropertyValueErrorCode' "ThrottlingException"
+
+pattern BatchPutAssetPropertyValueErrorCode_TimestampOutOfRangeException :: BatchPutAssetPropertyValueErrorCode
+pattern BatchPutAssetPropertyValueErrorCode_TimestampOutOfRangeException = BatchPutAssetPropertyValueErrorCode' "TimestampOutOfRangeException"
+
+{-# COMPLETE
+  BatchPutAssetPropertyValueErrorCode_AccessDeniedException,
+  BatchPutAssetPropertyValueErrorCode_ConflictingOperationException,
+  BatchPutAssetPropertyValueErrorCode_InternalFailureException,
+  BatchPutAssetPropertyValueErrorCode_InvalidRequestException,
+  BatchPutAssetPropertyValueErrorCode_LimitExceededException,
+  BatchPutAssetPropertyValueErrorCode_ResourceNotFoundException,
+  BatchPutAssetPropertyValueErrorCode_ServiceUnavailableException,
+  BatchPutAssetPropertyValueErrorCode_ThrottlingException,
+  BatchPutAssetPropertyValueErrorCode_TimestampOutOfRangeException,
+  BatchPutAssetPropertyValueErrorCode'
+  #-}
diff --git a/gen/Amazonka/IoTSiteWise/Types/CapabilitySyncStatus.hs b/gen/Amazonka/IoTSiteWise/Types/CapabilitySyncStatus.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/IoTSiteWise/Types/CapabilitySyncStatus.hs
@@ -0,0 +1,81 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DerivingStrategies #-}
+{-# LANGUAGE GeneralizedNewtypeDeriving #-}
+{-# LANGUAGE LambdaCase #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE PatternSynonyms #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.IoTSiteWise.Types.CapabilitySyncStatus
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.IoTSiteWise.Types.CapabilitySyncStatus
+  ( CapabilitySyncStatus
+      ( ..,
+        CapabilitySyncStatus_IN_SYNC,
+        CapabilitySyncStatus_OUT_OF_SYNC,
+        CapabilitySyncStatus_SYNC_FAILED,
+        CapabilitySyncStatus_UNKNOWN
+      ),
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+newtype CapabilitySyncStatus = CapabilitySyncStatus'
+  { fromCapabilitySyncStatus ::
+      Data.Text
+  }
+  deriving stock
+    ( Prelude.Show,
+      Prelude.Read,
+      Prelude.Eq,
+      Prelude.Ord,
+      Prelude.Generic
+    )
+  deriving newtype
+    ( Prelude.Hashable,
+      Prelude.NFData,
+      Data.FromText,
+      Data.ToText,
+      Data.ToByteString,
+      Data.ToLog,
+      Data.ToHeader,
+      Data.ToQuery,
+      Data.FromJSON,
+      Data.FromJSONKey,
+      Data.ToJSON,
+      Data.ToJSONKey,
+      Data.FromXML,
+      Data.ToXML
+    )
+
+pattern CapabilitySyncStatus_IN_SYNC :: CapabilitySyncStatus
+pattern CapabilitySyncStatus_IN_SYNC = CapabilitySyncStatus' "IN_SYNC"
+
+pattern CapabilitySyncStatus_OUT_OF_SYNC :: CapabilitySyncStatus
+pattern CapabilitySyncStatus_OUT_OF_SYNC = CapabilitySyncStatus' "OUT_OF_SYNC"
+
+pattern CapabilitySyncStatus_SYNC_FAILED :: CapabilitySyncStatus
+pattern CapabilitySyncStatus_SYNC_FAILED = CapabilitySyncStatus' "SYNC_FAILED"
+
+pattern CapabilitySyncStatus_UNKNOWN :: CapabilitySyncStatus
+pattern CapabilitySyncStatus_UNKNOWN = CapabilitySyncStatus' "UNKNOWN"
+
+{-# COMPLETE
+  CapabilitySyncStatus_IN_SYNC,
+  CapabilitySyncStatus_OUT_OF_SYNC,
+  CapabilitySyncStatus_SYNC_FAILED,
+  CapabilitySyncStatus_UNKNOWN,
+  CapabilitySyncStatus'
+  #-}
diff --git a/gen/Amazonka/IoTSiteWise/Types/ColumnName.hs b/gen/Amazonka/IoTSiteWise/Types/ColumnName.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/IoTSiteWise/Types/ColumnName.hs
@@ -0,0 +1,101 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DerivingStrategies #-}
+{-# LANGUAGE GeneralizedNewtypeDeriving #-}
+{-# LANGUAGE LambdaCase #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE PatternSynonyms #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.IoTSiteWise.Types.ColumnName
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.IoTSiteWise.Types.ColumnName
+  ( ColumnName
+      ( ..,
+        ColumnName_ALIAS,
+        ColumnName_ASSET_ID,
+        ColumnName_DATA_TYPE,
+        ColumnName_PROPERTY_ID,
+        ColumnName_QUALITY,
+        ColumnName_TIMESTAMP_NANO_OFFSET,
+        ColumnName_TIMESTAMP_SECONDS,
+        ColumnName_VALUE
+      ),
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+newtype ColumnName = ColumnName'
+  { fromColumnName ::
+      Data.Text
+  }
+  deriving stock
+    ( Prelude.Show,
+      Prelude.Read,
+      Prelude.Eq,
+      Prelude.Ord,
+      Prelude.Generic
+    )
+  deriving newtype
+    ( Prelude.Hashable,
+      Prelude.NFData,
+      Data.FromText,
+      Data.ToText,
+      Data.ToByteString,
+      Data.ToLog,
+      Data.ToHeader,
+      Data.ToQuery,
+      Data.FromJSON,
+      Data.FromJSONKey,
+      Data.ToJSON,
+      Data.ToJSONKey,
+      Data.FromXML,
+      Data.ToXML
+    )
+
+pattern ColumnName_ALIAS :: ColumnName
+pattern ColumnName_ALIAS = ColumnName' "ALIAS"
+
+pattern ColumnName_ASSET_ID :: ColumnName
+pattern ColumnName_ASSET_ID = ColumnName' "ASSET_ID"
+
+pattern ColumnName_DATA_TYPE :: ColumnName
+pattern ColumnName_DATA_TYPE = ColumnName' "DATA_TYPE"
+
+pattern ColumnName_PROPERTY_ID :: ColumnName
+pattern ColumnName_PROPERTY_ID = ColumnName' "PROPERTY_ID"
+
+pattern ColumnName_QUALITY :: ColumnName
+pattern ColumnName_QUALITY = ColumnName' "QUALITY"
+
+pattern ColumnName_TIMESTAMP_NANO_OFFSET :: ColumnName
+pattern ColumnName_TIMESTAMP_NANO_OFFSET = ColumnName' "TIMESTAMP_NANO_OFFSET"
+
+pattern ColumnName_TIMESTAMP_SECONDS :: ColumnName
+pattern ColumnName_TIMESTAMP_SECONDS = ColumnName' "TIMESTAMP_SECONDS"
+
+pattern ColumnName_VALUE :: ColumnName
+pattern ColumnName_VALUE = ColumnName' "VALUE"
+
+{-# COMPLETE
+  ColumnName_ALIAS,
+  ColumnName_ASSET_ID,
+  ColumnName_DATA_TYPE,
+  ColumnName_PROPERTY_ID,
+  ColumnName_QUALITY,
+  ColumnName_TIMESTAMP_NANO_OFFSET,
+  ColumnName_TIMESTAMP_SECONDS,
+  ColumnName_VALUE,
+  ColumnName'
+  #-}
diff --git a/gen/Amazonka/IoTSiteWise/Types/CompositeModelProperty.hs b/gen/Amazonka/IoTSiteWise/Types/CompositeModelProperty.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/IoTSiteWise/Types/CompositeModelProperty.hs
@@ -0,0 +1,117 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.IoTSiteWise.Types.CompositeModelProperty
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.IoTSiteWise.Types.CompositeModelProperty where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.IoTSiteWise.Types.Property
+import qualified Amazonka.Prelude as Prelude
+
+-- | Contains information about a composite model property on an asset.
+--
+-- /See:/ 'newCompositeModelProperty' smart constructor.
+data CompositeModelProperty = CompositeModelProperty'
+  { -- | The ID of the composite model that contains the property.
+    id :: Prelude.Maybe Prelude.Text,
+    -- | The name of the property.
+    name :: Prelude.Text,
+    -- | The type of the composite model that defines this property.
+    type' :: Prelude.Text,
+    assetProperty :: Property
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'CompositeModelProperty' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'id', 'compositeModelProperty_id' - The ID of the composite model that contains the property.
+--
+-- 'name', 'compositeModelProperty_name' - The name of the property.
+--
+-- 'type'', 'compositeModelProperty_type' - The type of the composite model that defines this property.
+--
+-- 'assetProperty', 'compositeModelProperty_assetProperty' - Undocumented member.
+newCompositeModelProperty ::
+  -- | 'name'
+  Prelude.Text ->
+  -- | 'type''
+  Prelude.Text ->
+  -- | 'assetProperty'
+  Property ->
+  CompositeModelProperty
+newCompositeModelProperty
+  pName_
+  pType_
+  pAssetProperty_ =
+    CompositeModelProperty'
+      { id = Prelude.Nothing,
+        name = pName_,
+        type' = pType_,
+        assetProperty = pAssetProperty_
+      }
+
+-- | The ID of the composite model that contains the property.
+compositeModelProperty_id :: Lens.Lens' CompositeModelProperty (Prelude.Maybe Prelude.Text)
+compositeModelProperty_id = Lens.lens (\CompositeModelProperty' {id} -> id) (\s@CompositeModelProperty' {} a -> s {id = a} :: CompositeModelProperty)
+
+-- | The name of the property.
+compositeModelProperty_name :: Lens.Lens' CompositeModelProperty Prelude.Text
+compositeModelProperty_name = Lens.lens (\CompositeModelProperty' {name} -> name) (\s@CompositeModelProperty' {} a -> s {name = a} :: CompositeModelProperty)
+
+-- | The type of the composite model that defines this property.
+compositeModelProperty_type :: Lens.Lens' CompositeModelProperty Prelude.Text
+compositeModelProperty_type = Lens.lens (\CompositeModelProperty' {type'} -> type') (\s@CompositeModelProperty' {} a -> s {type' = a} :: CompositeModelProperty)
+
+-- | Undocumented member.
+compositeModelProperty_assetProperty :: Lens.Lens' CompositeModelProperty Property
+compositeModelProperty_assetProperty = Lens.lens (\CompositeModelProperty' {assetProperty} -> assetProperty) (\s@CompositeModelProperty' {} a -> s {assetProperty = a} :: CompositeModelProperty)
+
+instance Data.FromJSON CompositeModelProperty where
+  parseJSON =
+    Data.withObject
+      "CompositeModelProperty"
+      ( \x ->
+          CompositeModelProperty'
+            Prelude.<$> (x Data..:? "id")
+            Prelude.<*> (x Data..: "name")
+            Prelude.<*> (x Data..: "type")
+            Prelude.<*> (x Data..: "assetProperty")
+      )
+
+instance Prelude.Hashable CompositeModelProperty where
+  hashWithSalt _salt CompositeModelProperty' {..} =
+    _salt
+      `Prelude.hashWithSalt` id
+      `Prelude.hashWithSalt` name
+      `Prelude.hashWithSalt` type'
+      `Prelude.hashWithSalt` assetProperty
+
+instance Prelude.NFData CompositeModelProperty where
+  rnf CompositeModelProperty' {..} =
+    Prelude.rnf id
+      `Prelude.seq` Prelude.rnf name
+      `Prelude.seq` Prelude.rnf type'
+      `Prelude.seq` Prelude.rnf assetProperty
diff --git a/gen/Amazonka/IoTSiteWise/Types/ComputeLocation.hs b/gen/Amazonka/IoTSiteWise/Types/ComputeLocation.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/IoTSiteWise/Types/ComputeLocation.hs
@@ -0,0 +1,71 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DerivingStrategies #-}
+{-# LANGUAGE GeneralizedNewtypeDeriving #-}
+{-# LANGUAGE LambdaCase #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE PatternSynonyms #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.IoTSiteWise.Types.ComputeLocation
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.IoTSiteWise.Types.ComputeLocation
+  ( ComputeLocation
+      ( ..,
+        ComputeLocation_CLOUD,
+        ComputeLocation_EDGE
+      ),
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+newtype ComputeLocation = ComputeLocation'
+  { fromComputeLocation ::
+      Data.Text
+  }
+  deriving stock
+    ( Prelude.Show,
+      Prelude.Read,
+      Prelude.Eq,
+      Prelude.Ord,
+      Prelude.Generic
+    )
+  deriving newtype
+    ( Prelude.Hashable,
+      Prelude.NFData,
+      Data.FromText,
+      Data.ToText,
+      Data.ToByteString,
+      Data.ToLog,
+      Data.ToHeader,
+      Data.ToQuery,
+      Data.FromJSON,
+      Data.FromJSONKey,
+      Data.ToJSON,
+      Data.ToJSONKey,
+      Data.FromXML,
+      Data.ToXML
+    )
+
+pattern ComputeLocation_CLOUD :: ComputeLocation
+pattern ComputeLocation_CLOUD = ComputeLocation' "CLOUD"
+
+pattern ComputeLocation_EDGE :: ComputeLocation
+pattern ComputeLocation_EDGE = ComputeLocation' "EDGE"
+
+{-# COMPLETE
+  ComputeLocation_CLOUD,
+  ComputeLocation_EDGE,
+  ComputeLocation'
+  #-}
diff --git a/gen/Amazonka/IoTSiteWise/Types/ConfigurationErrorDetails.hs b/gen/Amazonka/IoTSiteWise/Types/ConfigurationErrorDetails.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/IoTSiteWise/Types/ConfigurationErrorDetails.hs
@@ -0,0 +1,88 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.IoTSiteWise.Types.ConfigurationErrorDetails
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.IoTSiteWise.Types.ConfigurationErrorDetails where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.IoTSiteWise.Types.ErrorCode
+import qualified Amazonka.Prelude as Prelude
+
+-- | Contains the details of an IoT SiteWise configuration error.
+--
+-- /See:/ 'newConfigurationErrorDetails' smart constructor.
+data ConfigurationErrorDetails = ConfigurationErrorDetails'
+  { -- | The error code.
+    code :: ErrorCode,
+    -- | The error message.
+    message :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ConfigurationErrorDetails' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'code', 'configurationErrorDetails_code' - The error code.
+--
+-- 'message', 'configurationErrorDetails_message' - The error message.
+newConfigurationErrorDetails ::
+  -- | 'code'
+  ErrorCode ->
+  -- | 'message'
+  Prelude.Text ->
+  ConfigurationErrorDetails
+newConfigurationErrorDetails pCode_ pMessage_ =
+  ConfigurationErrorDetails'
+    { code = pCode_,
+      message = pMessage_
+    }
+
+-- | The error code.
+configurationErrorDetails_code :: Lens.Lens' ConfigurationErrorDetails ErrorCode
+configurationErrorDetails_code = Lens.lens (\ConfigurationErrorDetails' {code} -> code) (\s@ConfigurationErrorDetails' {} a -> s {code = a} :: ConfigurationErrorDetails)
+
+-- | The error message.
+configurationErrorDetails_message :: Lens.Lens' ConfigurationErrorDetails Prelude.Text
+configurationErrorDetails_message = Lens.lens (\ConfigurationErrorDetails' {message} -> message) (\s@ConfigurationErrorDetails' {} a -> s {message = a} :: ConfigurationErrorDetails)
+
+instance Data.FromJSON ConfigurationErrorDetails where
+  parseJSON =
+    Data.withObject
+      "ConfigurationErrorDetails"
+      ( \x ->
+          ConfigurationErrorDetails'
+            Prelude.<$> (x Data..: "code")
+            Prelude.<*> (x Data..: "message")
+      )
+
+instance Prelude.Hashable ConfigurationErrorDetails where
+  hashWithSalt _salt ConfigurationErrorDetails' {..} =
+    _salt
+      `Prelude.hashWithSalt` code
+      `Prelude.hashWithSalt` message
+
+instance Prelude.NFData ConfigurationErrorDetails where
+  rnf ConfigurationErrorDetails' {..} =
+    Prelude.rnf code `Prelude.seq` Prelude.rnf message
diff --git a/gen/Amazonka/IoTSiteWise/Types/ConfigurationState.hs b/gen/Amazonka/IoTSiteWise/Types/ConfigurationState.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/IoTSiteWise/Types/ConfigurationState.hs
@@ -0,0 +1,76 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DerivingStrategies #-}
+{-# LANGUAGE GeneralizedNewtypeDeriving #-}
+{-# LANGUAGE LambdaCase #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE PatternSynonyms #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.IoTSiteWise.Types.ConfigurationState
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.IoTSiteWise.Types.ConfigurationState
+  ( ConfigurationState
+      ( ..,
+        ConfigurationState_ACTIVE,
+        ConfigurationState_UPDATE_FAILED,
+        ConfigurationState_UPDATE_IN_PROGRESS
+      ),
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+newtype ConfigurationState = ConfigurationState'
+  { fromConfigurationState ::
+      Data.Text
+  }
+  deriving stock
+    ( Prelude.Show,
+      Prelude.Read,
+      Prelude.Eq,
+      Prelude.Ord,
+      Prelude.Generic
+    )
+  deriving newtype
+    ( Prelude.Hashable,
+      Prelude.NFData,
+      Data.FromText,
+      Data.ToText,
+      Data.ToByteString,
+      Data.ToLog,
+      Data.ToHeader,
+      Data.ToQuery,
+      Data.FromJSON,
+      Data.FromJSONKey,
+      Data.ToJSON,
+      Data.ToJSONKey,
+      Data.FromXML,
+      Data.ToXML
+    )
+
+pattern ConfigurationState_ACTIVE :: ConfigurationState
+pattern ConfigurationState_ACTIVE = ConfigurationState' "ACTIVE"
+
+pattern ConfigurationState_UPDATE_FAILED :: ConfigurationState
+pattern ConfigurationState_UPDATE_FAILED = ConfigurationState' "UPDATE_FAILED"
+
+pattern ConfigurationState_UPDATE_IN_PROGRESS :: ConfigurationState
+pattern ConfigurationState_UPDATE_IN_PROGRESS = ConfigurationState' "UPDATE_IN_PROGRESS"
+
+{-# COMPLETE
+  ConfigurationState_ACTIVE,
+  ConfigurationState_UPDATE_FAILED,
+  ConfigurationState_UPDATE_IN_PROGRESS,
+  ConfigurationState'
+  #-}
diff --git a/gen/Amazonka/IoTSiteWise/Types/ConfigurationStatus.hs b/gen/Amazonka/IoTSiteWise/Types/ConfigurationStatus.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/IoTSiteWise/Types/ConfigurationStatus.hs
@@ -0,0 +1,87 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.IoTSiteWise.Types.ConfigurationStatus
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.IoTSiteWise.Types.ConfigurationStatus where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.IoTSiteWise.Types.ConfigurationErrorDetails
+import Amazonka.IoTSiteWise.Types.ConfigurationState
+import qualified Amazonka.Prelude as Prelude
+
+-- | Contains current status information for the configuration.
+--
+-- /See:/ 'newConfigurationStatus' smart constructor.
+data ConfigurationStatus = ConfigurationStatus'
+  { -- | Contains associated error information, if any.
+    error :: Prelude.Maybe ConfigurationErrorDetails,
+    -- | The current state of the configuration.
+    state :: ConfigurationState
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ConfigurationStatus' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'error', 'configurationStatus_error' - Contains associated error information, if any.
+--
+-- 'state', 'configurationStatus_state' - The current state of the configuration.
+newConfigurationStatus ::
+  -- | 'state'
+  ConfigurationState ->
+  ConfigurationStatus
+newConfigurationStatus pState_ =
+  ConfigurationStatus'
+    { error = Prelude.Nothing,
+      state = pState_
+    }
+
+-- | Contains associated error information, if any.
+configurationStatus_error :: Lens.Lens' ConfigurationStatus (Prelude.Maybe ConfigurationErrorDetails)
+configurationStatus_error = Lens.lens (\ConfigurationStatus' {error} -> error) (\s@ConfigurationStatus' {} a -> s {error = a} :: ConfigurationStatus)
+
+-- | The current state of the configuration.
+configurationStatus_state :: Lens.Lens' ConfigurationStatus ConfigurationState
+configurationStatus_state = Lens.lens (\ConfigurationStatus' {state} -> state) (\s@ConfigurationStatus' {} a -> s {state = a} :: ConfigurationStatus)
+
+instance Data.FromJSON ConfigurationStatus where
+  parseJSON =
+    Data.withObject
+      "ConfigurationStatus"
+      ( \x ->
+          ConfigurationStatus'
+            Prelude.<$> (x Data..:? "error")
+            Prelude.<*> (x Data..: "state")
+      )
+
+instance Prelude.Hashable ConfigurationStatus where
+  hashWithSalt _salt ConfigurationStatus' {..} =
+    _salt
+      `Prelude.hashWithSalt` error
+      `Prelude.hashWithSalt` state
+
+instance Prelude.NFData ConfigurationStatus where
+  rnf ConfigurationStatus' {..} =
+    Prelude.rnf error `Prelude.seq` Prelude.rnf state
diff --git a/gen/Amazonka/IoTSiteWise/Types/Csv.hs b/gen/Amazonka/IoTSiteWise/Types/Csv.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/IoTSiteWise/Types/Csv.hs
@@ -0,0 +1,75 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.IoTSiteWise.Types.Csv
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.IoTSiteWise.Types.Csv where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.IoTSiteWise.Types.ColumnName
+import qualified Amazonka.Prelude as Prelude
+
+-- | A .csv file.
+--
+-- /See:/ 'newCsv' smart constructor.
+data Csv = Csv'
+  { -- | The column names specified in the .csv file.
+    columnNames :: Prelude.Maybe [ColumnName]
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'Csv' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'columnNames', 'csv_columnNames' - The column names specified in the .csv file.
+newCsv ::
+  Csv
+newCsv = Csv' {columnNames = Prelude.Nothing}
+
+-- | The column names specified in the .csv file.
+csv_columnNames :: Lens.Lens' Csv (Prelude.Maybe [ColumnName])
+csv_columnNames = Lens.lens (\Csv' {columnNames} -> columnNames) (\s@Csv' {} a -> s {columnNames = a} :: Csv) Prelude.. Lens.mapping Lens.coerced
+
+instance Data.FromJSON Csv where
+  parseJSON =
+    Data.withObject
+      "Csv"
+      ( \x ->
+          Csv'
+            Prelude.<$> (x Data..:? "columnNames" Data..!= Prelude.mempty)
+      )
+
+instance Prelude.Hashable Csv where
+  hashWithSalt _salt Csv' {..} =
+    _salt `Prelude.hashWithSalt` columnNames
+
+instance Prelude.NFData Csv where
+  rnf Csv' {..} = Prelude.rnf columnNames
+
+instance Data.ToJSON Csv where
+  toJSON Csv' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [("columnNames" Data..=) Prelude.<$> columnNames]
+      )
diff --git a/gen/Amazonka/IoTSiteWise/Types/CustomerManagedS3Storage.hs b/gen/Amazonka/IoTSiteWise/Types/CustomerManagedS3Storage.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/IoTSiteWise/Types/CustomerManagedS3Storage.hs
@@ -0,0 +1,123 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.IoTSiteWise.Types.CustomerManagedS3Storage
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.IoTSiteWise.Types.CustomerManagedS3Storage where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+-- | Contains information about a customer managed Amazon S3 bucket.
+--
+-- /See:/ 'newCustomerManagedS3Storage' smart constructor.
+data CustomerManagedS3Storage = CustomerManagedS3Storage'
+  { -- | The
+    -- <https://docs.aws.amazon.com/general/latest/gr/aws-arns-and-namespaces.html ARN>
+    -- of the Amazon S3 object. For more information about how to find the ARN
+    -- for an Amazon S3 object, see
+    -- <https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-arn-format.html Amazon S3 resources>
+    -- in the /Amazon Simple Storage Service User Guide/.
+    s3ResourceArn :: Prelude.Text,
+    -- | The
+    -- <https://docs.aws.amazon.com/general/latest/gr/aws-arns-and-namespaces.html ARN>
+    -- of the Identity and Access Management role that allows IoT SiteWise to
+    -- send data to Amazon S3.
+    roleArn :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'CustomerManagedS3Storage' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 's3ResourceArn', 'customerManagedS3Storage_s3ResourceArn' - The
+-- <https://docs.aws.amazon.com/general/latest/gr/aws-arns-and-namespaces.html ARN>
+-- of the Amazon S3 object. For more information about how to find the ARN
+-- for an Amazon S3 object, see
+-- <https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-arn-format.html Amazon S3 resources>
+-- in the /Amazon Simple Storage Service User Guide/.
+--
+-- 'roleArn', 'customerManagedS3Storage_roleArn' - The
+-- <https://docs.aws.amazon.com/general/latest/gr/aws-arns-and-namespaces.html ARN>
+-- of the Identity and Access Management role that allows IoT SiteWise to
+-- send data to Amazon S3.
+newCustomerManagedS3Storage ::
+  -- | 's3ResourceArn'
+  Prelude.Text ->
+  -- | 'roleArn'
+  Prelude.Text ->
+  CustomerManagedS3Storage
+newCustomerManagedS3Storage pS3ResourceArn_ pRoleArn_ =
+  CustomerManagedS3Storage'
+    { s3ResourceArn =
+        pS3ResourceArn_,
+      roleArn = pRoleArn_
+    }
+
+-- | The
+-- <https://docs.aws.amazon.com/general/latest/gr/aws-arns-and-namespaces.html ARN>
+-- of the Amazon S3 object. For more information about how to find the ARN
+-- for an Amazon S3 object, see
+-- <https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-arn-format.html Amazon S3 resources>
+-- in the /Amazon Simple Storage Service User Guide/.
+customerManagedS3Storage_s3ResourceArn :: Lens.Lens' CustomerManagedS3Storage Prelude.Text
+customerManagedS3Storage_s3ResourceArn = Lens.lens (\CustomerManagedS3Storage' {s3ResourceArn} -> s3ResourceArn) (\s@CustomerManagedS3Storage' {} a -> s {s3ResourceArn = a} :: CustomerManagedS3Storage)
+
+-- | The
+-- <https://docs.aws.amazon.com/general/latest/gr/aws-arns-and-namespaces.html ARN>
+-- of the Identity and Access Management role that allows IoT SiteWise to
+-- send data to Amazon S3.
+customerManagedS3Storage_roleArn :: Lens.Lens' CustomerManagedS3Storage Prelude.Text
+customerManagedS3Storage_roleArn = Lens.lens (\CustomerManagedS3Storage' {roleArn} -> roleArn) (\s@CustomerManagedS3Storage' {} a -> s {roleArn = a} :: CustomerManagedS3Storage)
+
+instance Data.FromJSON CustomerManagedS3Storage where
+  parseJSON =
+    Data.withObject
+      "CustomerManagedS3Storage"
+      ( \x ->
+          CustomerManagedS3Storage'
+            Prelude.<$> (x Data..: "s3ResourceArn")
+            Prelude.<*> (x Data..: "roleArn")
+      )
+
+instance Prelude.Hashable CustomerManagedS3Storage where
+  hashWithSalt _salt CustomerManagedS3Storage' {..} =
+    _salt
+      `Prelude.hashWithSalt` s3ResourceArn
+      `Prelude.hashWithSalt` roleArn
+
+instance Prelude.NFData CustomerManagedS3Storage where
+  rnf CustomerManagedS3Storage' {..} =
+    Prelude.rnf s3ResourceArn
+      `Prelude.seq` Prelude.rnf roleArn
+
+instance Data.ToJSON CustomerManagedS3Storage where
+  toJSON CustomerManagedS3Storage' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ Prelude.Just
+              ("s3ResourceArn" Data..= s3ResourceArn),
+            Prelude.Just ("roleArn" Data..= roleArn)
+          ]
+      )
diff --git a/gen/Amazonka/IoTSiteWise/Types/DashboardSummary.hs b/gen/Amazonka/IoTSiteWise/Types/DashboardSummary.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/IoTSiteWise/Types/DashboardSummary.hs
@@ -0,0 +1,124 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.IoTSiteWise.Types.DashboardSummary
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.IoTSiteWise.Types.DashboardSummary where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+-- | Contains a dashboard summary.
+--
+-- /See:/ 'newDashboardSummary' smart constructor.
+data DashboardSummary = DashboardSummary'
+  { -- | The date the dashboard was created, in Unix epoch time.
+    creationDate :: Prelude.Maybe Data.POSIX,
+    -- | The dashboard\'s description.
+    description :: Prelude.Maybe Prelude.Text,
+    -- | The date the dashboard was last updated, in Unix epoch time.
+    lastUpdateDate :: Prelude.Maybe Data.POSIX,
+    -- | The ID of the dashboard.
+    id :: Prelude.Text,
+    -- | The name of the dashboard
+    name :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DashboardSummary' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'creationDate', 'dashboardSummary_creationDate' - The date the dashboard was created, in Unix epoch time.
+--
+-- 'description', 'dashboardSummary_description' - The dashboard\'s description.
+--
+-- 'lastUpdateDate', 'dashboardSummary_lastUpdateDate' - The date the dashboard was last updated, in Unix epoch time.
+--
+-- 'id', 'dashboardSummary_id' - The ID of the dashboard.
+--
+-- 'name', 'dashboardSummary_name' - The name of the dashboard
+newDashboardSummary ::
+  -- | 'id'
+  Prelude.Text ->
+  -- | 'name'
+  Prelude.Text ->
+  DashboardSummary
+newDashboardSummary pId_ pName_ =
+  DashboardSummary'
+    { creationDate = Prelude.Nothing,
+      description = Prelude.Nothing,
+      lastUpdateDate = Prelude.Nothing,
+      id = pId_,
+      name = pName_
+    }
+
+-- | The date the dashboard was created, in Unix epoch time.
+dashboardSummary_creationDate :: Lens.Lens' DashboardSummary (Prelude.Maybe Prelude.UTCTime)
+dashboardSummary_creationDate = Lens.lens (\DashboardSummary' {creationDate} -> creationDate) (\s@DashboardSummary' {} a -> s {creationDate = a} :: DashboardSummary) Prelude.. Lens.mapping Data._Time
+
+-- | The dashboard\'s description.
+dashboardSummary_description :: Lens.Lens' DashboardSummary (Prelude.Maybe Prelude.Text)
+dashboardSummary_description = Lens.lens (\DashboardSummary' {description} -> description) (\s@DashboardSummary' {} a -> s {description = a} :: DashboardSummary)
+
+-- | The date the dashboard was last updated, in Unix epoch time.
+dashboardSummary_lastUpdateDate :: Lens.Lens' DashboardSummary (Prelude.Maybe Prelude.UTCTime)
+dashboardSummary_lastUpdateDate = Lens.lens (\DashboardSummary' {lastUpdateDate} -> lastUpdateDate) (\s@DashboardSummary' {} a -> s {lastUpdateDate = a} :: DashboardSummary) Prelude.. Lens.mapping Data._Time
+
+-- | The ID of the dashboard.
+dashboardSummary_id :: Lens.Lens' DashboardSummary Prelude.Text
+dashboardSummary_id = Lens.lens (\DashboardSummary' {id} -> id) (\s@DashboardSummary' {} a -> s {id = a} :: DashboardSummary)
+
+-- | The name of the dashboard
+dashboardSummary_name :: Lens.Lens' DashboardSummary Prelude.Text
+dashboardSummary_name = Lens.lens (\DashboardSummary' {name} -> name) (\s@DashboardSummary' {} a -> s {name = a} :: DashboardSummary)
+
+instance Data.FromJSON DashboardSummary where
+  parseJSON =
+    Data.withObject
+      "DashboardSummary"
+      ( \x ->
+          DashboardSummary'
+            Prelude.<$> (x Data..:? "creationDate")
+            Prelude.<*> (x Data..:? "description")
+            Prelude.<*> (x Data..:? "lastUpdateDate")
+            Prelude.<*> (x Data..: "id")
+            Prelude.<*> (x Data..: "name")
+      )
+
+instance Prelude.Hashable DashboardSummary where
+  hashWithSalt _salt DashboardSummary' {..} =
+    _salt
+      `Prelude.hashWithSalt` creationDate
+      `Prelude.hashWithSalt` description
+      `Prelude.hashWithSalt` lastUpdateDate
+      `Prelude.hashWithSalt` id
+      `Prelude.hashWithSalt` name
+
+instance Prelude.NFData DashboardSummary where
+  rnf DashboardSummary' {..} =
+    Prelude.rnf creationDate
+      `Prelude.seq` Prelude.rnf description
+      `Prelude.seq` Prelude.rnf lastUpdateDate
+      `Prelude.seq` Prelude.rnf id
+      `Prelude.seq` Prelude.rnf name
diff --git a/gen/Amazonka/IoTSiteWise/Types/DetailedError.hs b/gen/Amazonka/IoTSiteWise/Types/DetailedError.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/IoTSiteWise/Types/DetailedError.hs
@@ -0,0 +1,85 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.IoTSiteWise.Types.DetailedError
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.IoTSiteWise.Types.DetailedError where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.IoTSiteWise.Types.DetailedErrorCode
+import qualified Amazonka.Prelude as Prelude
+
+-- | Contains detailed error information.
+--
+-- /See:/ 'newDetailedError' smart constructor.
+data DetailedError = DetailedError'
+  { -- | The error code.
+    code :: DetailedErrorCode,
+    -- | The error message.
+    message :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DetailedError' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'code', 'detailedError_code' - The error code.
+--
+-- 'message', 'detailedError_message' - The error message.
+newDetailedError ::
+  -- | 'code'
+  DetailedErrorCode ->
+  -- | 'message'
+  Prelude.Text ->
+  DetailedError
+newDetailedError pCode_ pMessage_ =
+  DetailedError' {code = pCode_, message = pMessage_}
+
+-- | The error code.
+detailedError_code :: Lens.Lens' DetailedError DetailedErrorCode
+detailedError_code = Lens.lens (\DetailedError' {code} -> code) (\s@DetailedError' {} a -> s {code = a} :: DetailedError)
+
+-- | The error message.
+detailedError_message :: Lens.Lens' DetailedError Prelude.Text
+detailedError_message = Lens.lens (\DetailedError' {message} -> message) (\s@DetailedError' {} a -> s {message = a} :: DetailedError)
+
+instance Data.FromJSON DetailedError where
+  parseJSON =
+    Data.withObject
+      "DetailedError"
+      ( \x ->
+          DetailedError'
+            Prelude.<$> (x Data..: "code")
+            Prelude.<*> (x Data..: "message")
+      )
+
+instance Prelude.Hashable DetailedError where
+  hashWithSalt _salt DetailedError' {..} =
+    _salt
+      `Prelude.hashWithSalt` code
+      `Prelude.hashWithSalt` message
+
+instance Prelude.NFData DetailedError where
+  rnf DetailedError' {..} =
+    Prelude.rnf code `Prelude.seq` Prelude.rnf message
diff --git a/gen/Amazonka/IoTSiteWise/Types/DetailedErrorCode.hs b/gen/Amazonka/IoTSiteWise/Types/DetailedErrorCode.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/IoTSiteWise/Types/DetailedErrorCode.hs
@@ -0,0 +1,71 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DerivingStrategies #-}
+{-# LANGUAGE GeneralizedNewtypeDeriving #-}
+{-# LANGUAGE LambdaCase #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE PatternSynonyms #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.IoTSiteWise.Types.DetailedErrorCode
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.IoTSiteWise.Types.DetailedErrorCode
+  ( DetailedErrorCode
+      ( ..,
+        DetailedErrorCode_INCOMPATIBLE_COMPUTE_LOCATION,
+        DetailedErrorCode_INCOMPATIBLE_FORWARDING_CONFIGURATION
+      ),
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+newtype DetailedErrorCode = DetailedErrorCode'
+  { fromDetailedErrorCode ::
+      Data.Text
+  }
+  deriving stock
+    ( Prelude.Show,
+      Prelude.Read,
+      Prelude.Eq,
+      Prelude.Ord,
+      Prelude.Generic
+    )
+  deriving newtype
+    ( Prelude.Hashable,
+      Prelude.NFData,
+      Data.FromText,
+      Data.ToText,
+      Data.ToByteString,
+      Data.ToLog,
+      Data.ToHeader,
+      Data.ToQuery,
+      Data.FromJSON,
+      Data.FromJSONKey,
+      Data.ToJSON,
+      Data.ToJSONKey,
+      Data.FromXML,
+      Data.ToXML
+    )
+
+pattern DetailedErrorCode_INCOMPATIBLE_COMPUTE_LOCATION :: DetailedErrorCode
+pattern DetailedErrorCode_INCOMPATIBLE_COMPUTE_LOCATION = DetailedErrorCode' "INCOMPATIBLE_COMPUTE_LOCATION"
+
+pattern DetailedErrorCode_INCOMPATIBLE_FORWARDING_CONFIGURATION :: DetailedErrorCode
+pattern DetailedErrorCode_INCOMPATIBLE_FORWARDING_CONFIGURATION = DetailedErrorCode' "INCOMPATIBLE_FORWARDING_CONFIGURATION"
+
+{-# COMPLETE
+  DetailedErrorCode_INCOMPATIBLE_COMPUTE_LOCATION,
+  DetailedErrorCode_INCOMPATIBLE_FORWARDING_CONFIGURATION,
+  DetailedErrorCode'
+  #-}
diff --git a/gen/Amazonka/IoTSiteWise/Types/DisassociatedDataStorageState.hs b/gen/Amazonka/IoTSiteWise/Types/DisassociatedDataStorageState.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/IoTSiteWise/Types/DisassociatedDataStorageState.hs
@@ -0,0 +1,71 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DerivingStrategies #-}
+{-# LANGUAGE GeneralizedNewtypeDeriving #-}
+{-# LANGUAGE LambdaCase #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE PatternSynonyms #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.IoTSiteWise.Types.DisassociatedDataStorageState
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.IoTSiteWise.Types.DisassociatedDataStorageState
+  ( DisassociatedDataStorageState
+      ( ..,
+        DisassociatedDataStorageState_DISABLED,
+        DisassociatedDataStorageState_ENABLED
+      ),
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+newtype DisassociatedDataStorageState = DisassociatedDataStorageState'
+  { fromDisassociatedDataStorageState ::
+      Data.Text
+  }
+  deriving stock
+    ( Prelude.Show,
+      Prelude.Read,
+      Prelude.Eq,
+      Prelude.Ord,
+      Prelude.Generic
+    )
+  deriving newtype
+    ( Prelude.Hashable,
+      Prelude.NFData,
+      Data.FromText,
+      Data.ToText,
+      Data.ToByteString,
+      Data.ToLog,
+      Data.ToHeader,
+      Data.ToQuery,
+      Data.FromJSON,
+      Data.FromJSONKey,
+      Data.ToJSON,
+      Data.ToJSONKey,
+      Data.FromXML,
+      Data.ToXML
+    )
+
+pattern DisassociatedDataStorageState_DISABLED :: DisassociatedDataStorageState
+pattern DisassociatedDataStorageState_DISABLED = DisassociatedDataStorageState' "DISABLED"
+
+pattern DisassociatedDataStorageState_ENABLED :: DisassociatedDataStorageState
+pattern DisassociatedDataStorageState_ENABLED = DisassociatedDataStorageState' "ENABLED"
+
+{-# COMPLETE
+  DisassociatedDataStorageState_DISABLED,
+  DisassociatedDataStorageState_ENABLED,
+  DisassociatedDataStorageState'
+  #-}
diff --git a/gen/Amazonka/IoTSiteWise/Types/EncryptionType.hs b/gen/Amazonka/IoTSiteWise/Types/EncryptionType.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/IoTSiteWise/Types/EncryptionType.hs
@@ -0,0 +1,71 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DerivingStrategies #-}
+{-# LANGUAGE GeneralizedNewtypeDeriving #-}
+{-# LANGUAGE LambdaCase #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE PatternSynonyms #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.IoTSiteWise.Types.EncryptionType
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.IoTSiteWise.Types.EncryptionType
+  ( EncryptionType
+      ( ..,
+        EncryptionType_KMS_BASED_ENCRYPTION,
+        EncryptionType_SITEWISE_DEFAULT_ENCRYPTION
+      ),
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+newtype EncryptionType = EncryptionType'
+  { fromEncryptionType ::
+      Data.Text
+  }
+  deriving stock
+    ( Prelude.Show,
+      Prelude.Read,
+      Prelude.Eq,
+      Prelude.Ord,
+      Prelude.Generic
+    )
+  deriving newtype
+    ( Prelude.Hashable,
+      Prelude.NFData,
+      Data.FromText,
+      Data.ToText,
+      Data.ToByteString,
+      Data.ToLog,
+      Data.ToHeader,
+      Data.ToQuery,
+      Data.FromJSON,
+      Data.FromJSONKey,
+      Data.ToJSON,
+      Data.ToJSONKey,
+      Data.FromXML,
+      Data.ToXML
+    )
+
+pattern EncryptionType_KMS_BASED_ENCRYPTION :: EncryptionType
+pattern EncryptionType_KMS_BASED_ENCRYPTION = EncryptionType' "KMS_BASED_ENCRYPTION"
+
+pattern EncryptionType_SITEWISE_DEFAULT_ENCRYPTION :: EncryptionType
+pattern EncryptionType_SITEWISE_DEFAULT_ENCRYPTION = EncryptionType' "SITEWISE_DEFAULT_ENCRYPTION"
+
+{-# COMPLETE
+  EncryptionType_KMS_BASED_ENCRYPTION,
+  EncryptionType_SITEWISE_DEFAULT_ENCRYPTION,
+  EncryptionType'
+  #-}
diff --git a/gen/Amazonka/IoTSiteWise/Types/ErrorCode.hs b/gen/Amazonka/IoTSiteWise/Types/ErrorCode.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/IoTSiteWise/Types/ErrorCode.hs
@@ -0,0 +1,71 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DerivingStrategies #-}
+{-# LANGUAGE GeneralizedNewtypeDeriving #-}
+{-# LANGUAGE LambdaCase #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE PatternSynonyms #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.IoTSiteWise.Types.ErrorCode
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.IoTSiteWise.Types.ErrorCode
+  ( ErrorCode
+      ( ..,
+        ErrorCode_INTERNAL_FAILURE,
+        ErrorCode_VALIDATION_ERROR
+      ),
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+newtype ErrorCode = ErrorCode'
+  { fromErrorCode ::
+      Data.Text
+  }
+  deriving stock
+    ( Prelude.Show,
+      Prelude.Read,
+      Prelude.Eq,
+      Prelude.Ord,
+      Prelude.Generic
+    )
+  deriving newtype
+    ( Prelude.Hashable,
+      Prelude.NFData,
+      Data.FromText,
+      Data.ToText,
+      Data.ToByteString,
+      Data.ToLog,
+      Data.ToHeader,
+      Data.ToQuery,
+      Data.FromJSON,
+      Data.FromJSONKey,
+      Data.ToJSON,
+      Data.ToJSONKey,
+      Data.FromXML,
+      Data.ToXML
+    )
+
+pattern ErrorCode_INTERNAL_FAILURE :: ErrorCode
+pattern ErrorCode_INTERNAL_FAILURE = ErrorCode' "INTERNAL_FAILURE"
+
+pattern ErrorCode_VALIDATION_ERROR :: ErrorCode
+pattern ErrorCode_VALIDATION_ERROR = ErrorCode' "VALIDATION_ERROR"
+
+{-# COMPLETE
+  ErrorCode_INTERNAL_FAILURE,
+  ErrorCode_VALIDATION_ERROR,
+  ErrorCode'
+  #-}
diff --git a/gen/Amazonka/IoTSiteWise/Types/ErrorDetails.hs b/gen/Amazonka/IoTSiteWise/Types/ErrorDetails.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/IoTSiteWise/Types/ErrorDetails.hs
@@ -0,0 +1,102 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.IoTSiteWise.Types.ErrorDetails
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.IoTSiteWise.Types.ErrorDetails where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.IoTSiteWise.Types.DetailedError
+import Amazonka.IoTSiteWise.Types.ErrorCode
+import qualified Amazonka.Prelude as Prelude
+
+-- | Contains the details of an IoT SiteWise error.
+--
+-- /See:/ 'newErrorDetails' smart constructor.
+data ErrorDetails = ErrorDetails'
+  { -- | A list of detailed errors.
+    details :: Prelude.Maybe [DetailedError],
+    -- | The error code.
+    code :: ErrorCode,
+    -- | The error message.
+    message :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ErrorDetails' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'details', 'errorDetails_details' - A list of detailed errors.
+--
+-- 'code', 'errorDetails_code' - The error code.
+--
+-- 'message', 'errorDetails_message' - The error message.
+newErrorDetails ::
+  -- | 'code'
+  ErrorCode ->
+  -- | 'message'
+  Prelude.Text ->
+  ErrorDetails
+newErrorDetails pCode_ pMessage_ =
+  ErrorDetails'
+    { details = Prelude.Nothing,
+      code = pCode_,
+      message = pMessage_
+    }
+
+-- | A list of detailed errors.
+errorDetails_details :: Lens.Lens' ErrorDetails (Prelude.Maybe [DetailedError])
+errorDetails_details = Lens.lens (\ErrorDetails' {details} -> details) (\s@ErrorDetails' {} a -> s {details = a} :: ErrorDetails) Prelude.. Lens.mapping Lens.coerced
+
+-- | The error code.
+errorDetails_code :: Lens.Lens' ErrorDetails ErrorCode
+errorDetails_code = Lens.lens (\ErrorDetails' {code} -> code) (\s@ErrorDetails' {} a -> s {code = a} :: ErrorDetails)
+
+-- | The error message.
+errorDetails_message :: Lens.Lens' ErrorDetails Prelude.Text
+errorDetails_message = Lens.lens (\ErrorDetails' {message} -> message) (\s@ErrorDetails' {} a -> s {message = a} :: ErrorDetails)
+
+instance Data.FromJSON ErrorDetails where
+  parseJSON =
+    Data.withObject
+      "ErrorDetails"
+      ( \x ->
+          ErrorDetails'
+            Prelude.<$> (x Data..:? "details" Data..!= Prelude.mempty)
+            Prelude.<*> (x Data..: "code")
+            Prelude.<*> (x Data..: "message")
+      )
+
+instance Prelude.Hashable ErrorDetails where
+  hashWithSalt _salt ErrorDetails' {..} =
+    _salt
+      `Prelude.hashWithSalt` details
+      `Prelude.hashWithSalt` code
+      `Prelude.hashWithSalt` message
+
+instance Prelude.NFData ErrorDetails where
+  rnf ErrorDetails' {..} =
+    Prelude.rnf details
+      `Prelude.seq` Prelude.rnf code
+      `Prelude.seq` Prelude.rnf message
diff --git a/gen/Amazonka/IoTSiteWise/Types/ErrorReportLocation.hs b/gen/Amazonka/IoTSiteWise/Types/ErrorReportLocation.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/IoTSiteWise/Types/ErrorReportLocation.hs
@@ -0,0 +1,115 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.IoTSiteWise.Types.ErrorReportLocation
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.IoTSiteWise.Types.ErrorReportLocation where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+-- | The Amazon S3 destination where errors associated with the job creation
+-- request are saved.
+--
+-- /See:/ 'newErrorReportLocation' smart constructor.
+data ErrorReportLocation = ErrorReportLocation'
+  { -- | The name of the Amazon S3 bucket to which errors associated with the
+    -- bulk import job are sent.
+    bucket :: Prelude.Text,
+    -- | Amazon S3 uses the prefix as a folder name to organize data in the
+    -- bucket. Each Amazon S3 object has a key that is its unique identifier in
+    -- the bucket. Each object in a bucket has exactly one key. The prefix must
+    -- end with a forward slash (\/). For more information, see
+    -- <https://docs.aws.amazon.com/AmazonS3/latest/userguide/using-prefixes.html Organizing objects using prefixes>
+    -- in the /Amazon Simple Storage Service User Guide/.
+    prefix :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ErrorReportLocation' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'bucket', 'errorReportLocation_bucket' - The name of the Amazon S3 bucket to which errors associated with the
+-- bulk import job are sent.
+--
+-- 'prefix', 'errorReportLocation_prefix' - Amazon S3 uses the prefix as a folder name to organize data in the
+-- bucket. Each Amazon S3 object has a key that is its unique identifier in
+-- the bucket. Each object in a bucket has exactly one key. The prefix must
+-- end with a forward slash (\/). For more information, see
+-- <https://docs.aws.amazon.com/AmazonS3/latest/userguide/using-prefixes.html Organizing objects using prefixes>
+-- in the /Amazon Simple Storage Service User Guide/.
+newErrorReportLocation ::
+  -- | 'bucket'
+  Prelude.Text ->
+  -- | 'prefix'
+  Prelude.Text ->
+  ErrorReportLocation
+newErrorReportLocation pBucket_ pPrefix_ =
+  ErrorReportLocation'
+    { bucket = pBucket_,
+      prefix = pPrefix_
+    }
+
+-- | The name of the Amazon S3 bucket to which errors associated with the
+-- bulk import job are sent.
+errorReportLocation_bucket :: Lens.Lens' ErrorReportLocation Prelude.Text
+errorReportLocation_bucket = Lens.lens (\ErrorReportLocation' {bucket} -> bucket) (\s@ErrorReportLocation' {} a -> s {bucket = a} :: ErrorReportLocation)
+
+-- | Amazon S3 uses the prefix as a folder name to organize data in the
+-- bucket. Each Amazon S3 object has a key that is its unique identifier in
+-- the bucket. Each object in a bucket has exactly one key. The prefix must
+-- end with a forward slash (\/). For more information, see
+-- <https://docs.aws.amazon.com/AmazonS3/latest/userguide/using-prefixes.html Organizing objects using prefixes>
+-- in the /Amazon Simple Storage Service User Guide/.
+errorReportLocation_prefix :: Lens.Lens' ErrorReportLocation Prelude.Text
+errorReportLocation_prefix = Lens.lens (\ErrorReportLocation' {prefix} -> prefix) (\s@ErrorReportLocation' {} a -> s {prefix = a} :: ErrorReportLocation)
+
+instance Data.FromJSON ErrorReportLocation where
+  parseJSON =
+    Data.withObject
+      "ErrorReportLocation"
+      ( \x ->
+          ErrorReportLocation'
+            Prelude.<$> (x Data..: "bucket")
+            Prelude.<*> (x Data..: "prefix")
+      )
+
+instance Prelude.Hashable ErrorReportLocation where
+  hashWithSalt _salt ErrorReportLocation' {..} =
+    _salt
+      `Prelude.hashWithSalt` bucket
+      `Prelude.hashWithSalt` prefix
+
+instance Prelude.NFData ErrorReportLocation where
+  rnf ErrorReportLocation' {..} =
+    Prelude.rnf bucket `Prelude.seq` Prelude.rnf prefix
+
+instance Data.ToJSON ErrorReportLocation where
+  toJSON ErrorReportLocation' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ Prelude.Just ("bucket" Data..= bucket),
+            Prelude.Just ("prefix" Data..= prefix)
+          ]
+      )
diff --git a/gen/Amazonka/IoTSiteWise/Types/ExpressionVariable.hs b/gen/Amazonka/IoTSiteWise/Types/ExpressionVariable.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/IoTSiteWise/Types/ExpressionVariable.hs
@@ -0,0 +1,94 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.IoTSiteWise.Types.ExpressionVariable
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.IoTSiteWise.Types.ExpressionVariable where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.IoTSiteWise.Types.VariableValue
+import qualified Amazonka.Prelude as Prelude
+
+-- | Contains expression variable information.
+--
+-- /See:/ 'newExpressionVariable' smart constructor.
+data ExpressionVariable = ExpressionVariable'
+  { -- | The friendly name of the variable to be used in the expression.
+    name :: Prelude.Text,
+    -- | The variable that identifies an asset property from which to use values.
+    value :: VariableValue
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ExpressionVariable' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'name', 'expressionVariable_name' - The friendly name of the variable to be used in the expression.
+--
+-- 'value', 'expressionVariable_value' - The variable that identifies an asset property from which to use values.
+newExpressionVariable ::
+  -- | 'name'
+  Prelude.Text ->
+  -- | 'value'
+  VariableValue ->
+  ExpressionVariable
+newExpressionVariable pName_ pValue_ =
+  ExpressionVariable' {name = pName_, value = pValue_}
+
+-- | The friendly name of the variable to be used in the expression.
+expressionVariable_name :: Lens.Lens' ExpressionVariable Prelude.Text
+expressionVariable_name = Lens.lens (\ExpressionVariable' {name} -> name) (\s@ExpressionVariable' {} a -> s {name = a} :: ExpressionVariable)
+
+-- | The variable that identifies an asset property from which to use values.
+expressionVariable_value :: Lens.Lens' ExpressionVariable VariableValue
+expressionVariable_value = Lens.lens (\ExpressionVariable' {value} -> value) (\s@ExpressionVariable' {} a -> s {value = a} :: ExpressionVariable)
+
+instance Data.FromJSON ExpressionVariable where
+  parseJSON =
+    Data.withObject
+      "ExpressionVariable"
+      ( \x ->
+          ExpressionVariable'
+            Prelude.<$> (x Data..: "name")
+            Prelude.<*> (x Data..: "value")
+      )
+
+instance Prelude.Hashable ExpressionVariable where
+  hashWithSalt _salt ExpressionVariable' {..} =
+    _salt
+      `Prelude.hashWithSalt` name
+      `Prelude.hashWithSalt` value
+
+instance Prelude.NFData ExpressionVariable where
+  rnf ExpressionVariable' {..} =
+    Prelude.rnf name `Prelude.seq` Prelude.rnf value
+
+instance Data.ToJSON ExpressionVariable where
+  toJSON ExpressionVariable' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ Prelude.Just ("name" Data..= name),
+            Prelude.Just ("value" Data..= value)
+          ]
+      )
diff --git a/gen/Amazonka/IoTSiteWise/Types/File.hs b/gen/Amazonka/IoTSiteWise/Types/File.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/IoTSiteWise/Types/File.hs
@@ -0,0 +1,116 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.IoTSiteWise.Types.File
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.IoTSiteWise.Types.File where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+-- | The file in Amazon S3 where your data is saved.
+--
+-- /See:/ 'newFile' smart constructor.
+data File = File'
+  { -- | The version ID to identify a specific version of the Amazon S3 object
+    -- that contains your data.
+    versionId :: Prelude.Maybe Prelude.Text,
+    -- | The name of the Amazon S3 bucket from which data is imported.
+    bucket :: Prelude.Text,
+    -- | The key of the Amazon S3 object that contains your data. Each object has
+    -- a key that is a unique identifier. Each object has exactly one key.
+    key :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'File' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'versionId', 'file_versionId' - The version ID to identify a specific version of the Amazon S3 object
+-- that contains your data.
+--
+-- 'bucket', 'file_bucket' - The name of the Amazon S3 bucket from which data is imported.
+--
+-- 'key', 'file_key' - The key of the Amazon S3 object that contains your data. Each object has
+-- a key that is a unique identifier. Each object has exactly one key.
+newFile ::
+  -- | 'bucket'
+  Prelude.Text ->
+  -- | 'key'
+  Prelude.Text ->
+  File
+newFile pBucket_ pKey_ =
+  File'
+    { versionId = Prelude.Nothing,
+      bucket = pBucket_,
+      key = pKey_
+    }
+
+-- | The version ID to identify a specific version of the Amazon S3 object
+-- that contains your data.
+file_versionId :: Lens.Lens' File (Prelude.Maybe Prelude.Text)
+file_versionId = Lens.lens (\File' {versionId} -> versionId) (\s@File' {} a -> s {versionId = a} :: File)
+
+-- | The name of the Amazon S3 bucket from which data is imported.
+file_bucket :: Lens.Lens' File Prelude.Text
+file_bucket = Lens.lens (\File' {bucket} -> bucket) (\s@File' {} a -> s {bucket = a} :: File)
+
+-- | The key of the Amazon S3 object that contains your data. Each object has
+-- a key that is a unique identifier. Each object has exactly one key.
+file_key :: Lens.Lens' File Prelude.Text
+file_key = Lens.lens (\File' {key} -> key) (\s@File' {} a -> s {key = a} :: File)
+
+instance Data.FromJSON File where
+  parseJSON =
+    Data.withObject
+      "File"
+      ( \x ->
+          File'
+            Prelude.<$> (x Data..:? "versionId")
+            Prelude.<*> (x Data..: "bucket")
+            Prelude.<*> (x Data..: "key")
+      )
+
+instance Prelude.Hashable File where
+  hashWithSalt _salt File' {..} =
+    _salt
+      `Prelude.hashWithSalt` versionId
+      `Prelude.hashWithSalt` bucket
+      `Prelude.hashWithSalt` key
+
+instance Prelude.NFData File where
+  rnf File' {..} =
+    Prelude.rnf versionId
+      `Prelude.seq` Prelude.rnf bucket
+      `Prelude.seq` Prelude.rnf key
+
+instance Data.ToJSON File where
+  toJSON File' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("versionId" Data..=) Prelude.<$> versionId,
+            Prelude.Just ("bucket" Data..= bucket),
+            Prelude.Just ("key" Data..= key)
+          ]
+      )
diff --git a/gen/Amazonka/IoTSiteWise/Types/FileFormat.hs b/gen/Amazonka/IoTSiteWise/Types/FileFormat.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/IoTSiteWise/Types/FileFormat.hs
@@ -0,0 +1,70 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.IoTSiteWise.Types.FileFormat
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.IoTSiteWise.Types.FileFormat where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.IoTSiteWise.Types.Csv
+import qualified Amazonka.Prelude as Prelude
+
+-- | The file format of the data.
+--
+-- /See:/ 'newFileFormat' smart constructor.
+data FileFormat = FileFormat'
+  { -- | The .csv file format.
+    csv :: Prelude.Maybe Csv
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'FileFormat' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'csv', 'fileFormat_csv' - The .csv file format.
+newFileFormat ::
+  FileFormat
+newFileFormat = FileFormat' {csv = Prelude.Nothing}
+
+-- | The .csv file format.
+fileFormat_csv :: Lens.Lens' FileFormat (Prelude.Maybe Csv)
+fileFormat_csv = Lens.lens (\FileFormat' {csv} -> csv) (\s@FileFormat' {} a -> s {csv = a} :: FileFormat)
+
+instance Data.FromJSON FileFormat where
+  parseJSON =
+    Data.withObject
+      "FileFormat"
+      (\x -> FileFormat' Prelude.<$> (x Data..:? "csv"))
+
+instance Prelude.Hashable FileFormat where
+  hashWithSalt _salt FileFormat' {..} =
+    _salt `Prelude.hashWithSalt` csv
+
+instance Prelude.NFData FileFormat where
+  rnf FileFormat' {..} = Prelude.rnf csv
+
+instance Data.ToJSON FileFormat where
+  toJSON FileFormat' {..} =
+    Data.object
+      (Prelude.catMaybes [("csv" Data..=) Prelude.<$> csv])
diff --git a/gen/Amazonka/IoTSiteWise/Types/ForwardingConfig.hs b/gen/Amazonka/IoTSiteWise/Types/ForwardingConfig.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/IoTSiteWise/Types/ForwardingConfig.hs
@@ -0,0 +1,77 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.IoTSiteWise.Types.ForwardingConfig
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.IoTSiteWise.Types.ForwardingConfig where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.IoTSiteWise.Types.ForwardingConfigState
+import qualified Amazonka.Prelude as Prelude
+
+-- | The forwarding configuration for a given property.
+--
+-- /See:/ 'newForwardingConfig' smart constructor.
+data ForwardingConfig = ForwardingConfig'
+  { -- | The forwarding state for the given property.
+    state :: ForwardingConfigState
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ForwardingConfig' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'state', 'forwardingConfig_state' - The forwarding state for the given property.
+newForwardingConfig ::
+  -- | 'state'
+  ForwardingConfigState ->
+  ForwardingConfig
+newForwardingConfig pState_ =
+  ForwardingConfig' {state = pState_}
+
+-- | The forwarding state for the given property.
+forwardingConfig_state :: Lens.Lens' ForwardingConfig ForwardingConfigState
+forwardingConfig_state = Lens.lens (\ForwardingConfig' {state} -> state) (\s@ForwardingConfig' {} a -> s {state = a} :: ForwardingConfig)
+
+instance Data.FromJSON ForwardingConfig where
+  parseJSON =
+    Data.withObject
+      "ForwardingConfig"
+      ( \x ->
+          ForwardingConfig' Prelude.<$> (x Data..: "state")
+      )
+
+instance Prelude.Hashable ForwardingConfig where
+  hashWithSalt _salt ForwardingConfig' {..} =
+    _salt `Prelude.hashWithSalt` state
+
+instance Prelude.NFData ForwardingConfig where
+  rnf ForwardingConfig' {..} = Prelude.rnf state
+
+instance Data.ToJSON ForwardingConfig where
+  toJSON ForwardingConfig' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [Prelude.Just ("state" Data..= state)]
+      )
diff --git a/gen/Amazonka/IoTSiteWise/Types/ForwardingConfigState.hs b/gen/Amazonka/IoTSiteWise/Types/ForwardingConfigState.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/IoTSiteWise/Types/ForwardingConfigState.hs
@@ -0,0 +1,71 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DerivingStrategies #-}
+{-# LANGUAGE GeneralizedNewtypeDeriving #-}
+{-# LANGUAGE LambdaCase #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE PatternSynonyms #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.IoTSiteWise.Types.ForwardingConfigState
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.IoTSiteWise.Types.ForwardingConfigState
+  ( ForwardingConfigState
+      ( ..,
+        ForwardingConfigState_DISABLED,
+        ForwardingConfigState_ENABLED
+      ),
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+newtype ForwardingConfigState = ForwardingConfigState'
+  { fromForwardingConfigState ::
+      Data.Text
+  }
+  deriving stock
+    ( Prelude.Show,
+      Prelude.Read,
+      Prelude.Eq,
+      Prelude.Ord,
+      Prelude.Generic
+    )
+  deriving newtype
+    ( Prelude.Hashable,
+      Prelude.NFData,
+      Data.FromText,
+      Data.ToText,
+      Data.ToByteString,
+      Data.ToLog,
+      Data.ToHeader,
+      Data.ToQuery,
+      Data.FromJSON,
+      Data.FromJSONKey,
+      Data.ToJSON,
+      Data.ToJSONKey,
+      Data.FromXML,
+      Data.ToXML
+    )
+
+pattern ForwardingConfigState_DISABLED :: ForwardingConfigState
+pattern ForwardingConfigState_DISABLED = ForwardingConfigState' "DISABLED"
+
+pattern ForwardingConfigState_ENABLED :: ForwardingConfigState
+pattern ForwardingConfigState_ENABLED = ForwardingConfigState' "ENABLED"
+
+{-# COMPLETE
+  ForwardingConfigState_DISABLED,
+  ForwardingConfigState_ENABLED,
+  ForwardingConfigState'
+  #-}
diff --git a/gen/Amazonka/IoTSiteWise/Types/GatewayCapabilitySummary.hs b/gen/Amazonka/IoTSiteWise/Types/GatewayCapabilitySummary.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/IoTSiteWise/Types/GatewayCapabilitySummary.hs
@@ -0,0 +1,128 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.IoTSiteWise.Types.GatewayCapabilitySummary
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.IoTSiteWise.Types.GatewayCapabilitySummary where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.IoTSiteWise.Types.CapabilitySyncStatus
+import qualified Amazonka.Prelude as Prelude
+
+-- | Contains a summary of a gateway capability configuration.
+--
+-- /See:/ 'newGatewayCapabilitySummary' smart constructor.
+data GatewayCapabilitySummary = GatewayCapabilitySummary'
+  { -- | The namespace of the capability configuration. For example, if you
+    -- configure OPC-UA sources from the IoT SiteWise console, your OPC-UA
+    -- capability configuration has the namespace
+    -- @iotsitewise:opcuacollector:version@, where @version@ is a number such
+    -- as @1@.
+    capabilityNamespace :: Prelude.Text,
+    -- | The synchronization status of the capability configuration. The sync
+    -- status can be one of the following:
+    --
+    -- -   @IN_SYNC@ – The gateway is running the capability configuration.
+    --
+    -- -   @OUT_OF_SYNC@ – The gateway hasn\'t received the capability
+    --     configuration.
+    --
+    -- -   @SYNC_FAILED@ – The gateway rejected the capability configuration.
+    capabilitySyncStatus :: CapabilitySyncStatus
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'GatewayCapabilitySummary' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'capabilityNamespace', 'gatewayCapabilitySummary_capabilityNamespace' - The namespace of the capability configuration. For example, if you
+-- configure OPC-UA sources from the IoT SiteWise console, your OPC-UA
+-- capability configuration has the namespace
+-- @iotsitewise:opcuacollector:version@, where @version@ is a number such
+-- as @1@.
+--
+-- 'capabilitySyncStatus', 'gatewayCapabilitySummary_capabilitySyncStatus' - The synchronization status of the capability configuration. The sync
+-- status can be one of the following:
+--
+-- -   @IN_SYNC@ – The gateway is running the capability configuration.
+--
+-- -   @OUT_OF_SYNC@ – The gateway hasn\'t received the capability
+--     configuration.
+--
+-- -   @SYNC_FAILED@ – The gateway rejected the capability configuration.
+newGatewayCapabilitySummary ::
+  -- | 'capabilityNamespace'
+  Prelude.Text ->
+  -- | 'capabilitySyncStatus'
+  CapabilitySyncStatus ->
+  GatewayCapabilitySummary
+newGatewayCapabilitySummary
+  pCapabilityNamespace_
+  pCapabilitySyncStatus_ =
+    GatewayCapabilitySummary'
+      { capabilityNamespace =
+          pCapabilityNamespace_,
+        capabilitySyncStatus = pCapabilitySyncStatus_
+      }
+
+-- | The namespace of the capability configuration. For example, if you
+-- configure OPC-UA sources from the IoT SiteWise console, your OPC-UA
+-- capability configuration has the namespace
+-- @iotsitewise:opcuacollector:version@, where @version@ is a number such
+-- as @1@.
+gatewayCapabilitySummary_capabilityNamespace :: Lens.Lens' GatewayCapabilitySummary Prelude.Text
+gatewayCapabilitySummary_capabilityNamespace = Lens.lens (\GatewayCapabilitySummary' {capabilityNamespace} -> capabilityNamespace) (\s@GatewayCapabilitySummary' {} a -> s {capabilityNamespace = a} :: GatewayCapabilitySummary)
+
+-- | The synchronization status of the capability configuration. The sync
+-- status can be one of the following:
+--
+-- -   @IN_SYNC@ – The gateway is running the capability configuration.
+--
+-- -   @OUT_OF_SYNC@ – The gateway hasn\'t received the capability
+--     configuration.
+--
+-- -   @SYNC_FAILED@ – The gateway rejected the capability configuration.
+gatewayCapabilitySummary_capabilitySyncStatus :: Lens.Lens' GatewayCapabilitySummary CapabilitySyncStatus
+gatewayCapabilitySummary_capabilitySyncStatus = Lens.lens (\GatewayCapabilitySummary' {capabilitySyncStatus} -> capabilitySyncStatus) (\s@GatewayCapabilitySummary' {} a -> s {capabilitySyncStatus = a} :: GatewayCapabilitySummary)
+
+instance Data.FromJSON GatewayCapabilitySummary where
+  parseJSON =
+    Data.withObject
+      "GatewayCapabilitySummary"
+      ( \x ->
+          GatewayCapabilitySummary'
+            Prelude.<$> (x Data..: "capabilityNamespace")
+            Prelude.<*> (x Data..: "capabilitySyncStatus")
+      )
+
+instance Prelude.Hashable GatewayCapabilitySummary where
+  hashWithSalt _salt GatewayCapabilitySummary' {..} =
+    _salt
+      `Prelude.hashWithSalt` capabilityNamespace
+      `Prelude.hashWithSalt` capabilitySyncStatus
+
+instance Prelude.NFData GatewayCapabilitySummary where
+  rnf GatewayCapabilitySummary' {..} =
+    Prelude.rnf capabilityNamespace
+      `Prelude.seq` Prelude.rnf capabilitySyncStatus
diff --git a/gen/Amazonka/IoTSiteWise/Types/GatewayPlatform.hs b/gen/Amazonka/IoTSiteWise/Types/GatewayPlatform.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/IoTSiteWise/Types/GatewayPlatform.hs
@@ -0,0 +1,95 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.IoTSiteWise.Types.GatewayPlatform
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.IoTSiteWise.Types.GatewayPlatform where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.IoTSiteWise.Types.Greengrass
+import Amazonka.IoTSiteWise.Types.GreengrassV2
+import qualified Amazonka.Prelude as Prelude
+
+-- | Contains a gateway\'s platform information.
+--
+-- /See:/ 'newGatewayPlatform' smart constructor.
+data GatewayPlatform = GatewayPlatform'
+  { -- | A gateway that runs on IoT Greengrass.
+    greengrass :: Prelude.Maybe Greengrass,
+    -- | A gateway that runs on IoT Greengrass V2.
+    greengrassV2 :: Prelude.Maybe GreengrassV2
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'GatewayPlatform' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'greengrass', 'gatewayPlatform_greengrass' - A gateway that runs on IoT Greengrass.
+--
+-- 'greengrassV2', 'gatewayPlatform_greengrassV2' - A gateway that runs on IoT Greengrass V2.
+newGatewayPlatform ::
+  GatewayPlatform
+newGatewayPlatform =
+  GatewayPlatform'
+    { greengrass = Prelude.Nothing,
+      greengrassV2 = Prelude.Nothing
+    }
+
+-- | A gateway that runs on IoT Greengrass.
+gatewayPlatform_greengrass :: Lens.Lens' GatewayPlatform (Prelude.Maybe Greengrass)
+gatewayPlatform_greengrass = Lens.lens (\GatewayPlatform' {greengrass} -> greengrass) (\s@GatewayPlatform' {} a -> s {greengrass = a} :: GatewayPlatform)
+
+-- | A gateway that runs on IoT Greengrass V2.
+gatewayPlatform_greengrassV2 :: Lens.Lens' GatewayPlatform (Prelude.Maybe GreengrassV2)
+gatewayPlatform_greengrassV2 = Lens.lens (\GatewayPlatform' {greengrassV2} -> greengrassV2) (\s@GatewayPlatform' {} a -> s {greengrassV2 = a} :: GatewayPlatform)
+
+instance Data.FromJSON GatewayPlatform where
+  parseJSON =
+    Data.withObject
+      "GatewayPlatform"
+      ( \x ->
+          GatewayPlatform'
+            Prelude.<$> (x Data..:? "greengrass")
+            Prelude.<*> (x Data..:? "greengrassV2")
+      )
+
+instance Prelude.Hashable GatewayPlatform where
+  hashWithSalt _salt GatewayPlatform' {..} =
+    _salt
+      `Prelude.hashWithSalt` greengrass
+      `Prelude.hashWithSalt` greengrassV2
+
+instance Prelude.NFData GatewayPlatform where
+  rnf GatewayPlatform' {..} =
+    Prelude.rnf greengrass
+      `Prelude.seq` Prelude.rnf greengrassV2
+
+instance Data.ToJSON GatewayPlatform where
+  toJSON GatewayPlatform' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("greengrass" Data..=) Prelude.<$> greengrass,
+            ("greengrassV2" Data..=) Prelude.<$> greengrassV2
+          ]
+      )
diff --git a/gen/Amazonka/IoTSiteWise/Types/GatewaySummary.hs b/gen/Amazonka/IoTSiteWise/Types/GatewaySummary.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/IoTSiteWise/Types/GatewaySummary.hs
@@ -0,0 +1,158 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.IoTSiteWise.Types.GatewaySummary
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.IoTSiteWise.Types.GatewaySummary where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.IoTSiteWise.Types.GatewayCapabilitySummary
+import Amazonka.IoTSiteWise.Types.GatewayPlatform
+import qualified Amazonka.Prelude as Prelude
+
+-- | Contains a summary of a gateway.
+--
+-- /See:/ 'newGatewaySummary' smart constructor.
+data GatewaySummary = GatewaySummary'
+  { -- | A list of gateway capability summaries that each contain a namespace and
+    -- status. Each gateway capability defines data sources for the gateway. To
+    -- retrieve a capability configuration\'s definition, use
+    -- <https://docs.aws.amazon.com/iot-sitewise/latest/APIReference/API_DescribeGatewayCapabilityConfiguration.html DescribeGatewayCapabilityConfiguration>.
+    gatewayCapabilitySummaries :: Prelude.Maybe [GatewayCapabilitySummary],
+    gatewayPlatform :: Prelude.Maybe GatewayPlatform,
+    -- | The ID of the gateway device.
+    gatewayId :: Prelude.Text,
+    -- | The name of the asset.
+    gatewayName :: Prelude.Text,
+    -- | The date the gateway was created, in Unix epoch time.
+    creationDate :: Data.POSIX,
+    -- | The date the gateway was last updated, in Unix epoch time.
+    lastUpdateDate :: Data.POSIX
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'GatewaySummary' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'gatewayCapabilitySummaries', 'gatewaySummary_gatewayCapabilitySummaries' - A list of gateway capability summaries that each contain a namespace and
+-- status. Each gateway capability defines data sources for the gateway. To
+-- retrieve a capability configuration\'s definition, use
+-- <https://docs.aws.amazon.com/iot-sitewise/latest/APIReference/API_DescribeGatewayCapabilityConfiguration.html DescribeGatewayCapabilityConfiguration>.
+--
+-- 'gatewayPlatform', 'gatewaySummary_gatewayPlatform' - Undocumented member.
+--
+-- 'gatewayId', 'gatewaySummary_gatewayId' - The ID of the gateway device.
+--
+-- 'gatewayName', 'gatewaySummary_gatewayName' - The name of the asset.
+--
+-- 'creationDate', 'gatewaySummary_creationDate' - The date the gateway was created, in Unix epoch time.
+--
+-- 'lastUpdateDate', 'gatewaySummary_lastUpdateDate' - The date the gateway was last updated, in Unix epoch time.
+newGatewaySummary ::
+  -- | 'gatewayId'
+  Prelude.Text ->
+  -- | 'gatewayName'
+  Prelude.Text ->
+  -- | 'creationDate'
+  Prelude.UTCTime ->
+  -- | 'lastUpdateDate'
+  Prelude.UTCTime ->
+  GatewaySummary
+newGatewaySummary
+  pGatewayId_
+  pGatewayName_
+  pCreationDate_
+  pLastUpdateDate_ =
+    GatewaySummary'
+      { gatewayCapabilitySummaries =
+          Prelude.Nothing,
+        gatewayPlatform = Prelude.Nothing,
+        gatewayId = pGatewayId_,
+        gatewayName = pGatewayName_,
+        creationDate = Data._Time Lens.# pCreationDate_,
+        lastUpdateDate = Data._Time Lens.# pLastUpdateDate_
+      }
+
+-- | A list of gateway capability summaries that each contain a namespace and
+-- status. Each gateway capability defines data sources for the gateway. To
+-- retrieve a capability configuration\'s definition, use
+-- <https://docs.aws.amazon.com/iot-sitewise/latest/APIReference/API_DescribeGatewayCapabilityConfiguration.html DescribeGatewayCapabilityConfiguration>.
+gatewaySummary_gatewayCapabilitySummaries :: Lens.Lens' GatewaySummary (Prelude.Maybe [GatewayCapabilitySummary])
+gatewaySummary_gatewayCapabilitySummaries = Lens.lens (\GatewaySummary' {gatewayCapabilitySummaries} -> gatewayCapabilitySummaries) (\s@GatewaySummary' {} a -> s {gatewayCapabilitySummaries = a} :: GatewaySummary) Prelude.. Lens.mapping Lens.coerced
+
+-- | Undocumented member.
+gatewaySummary_gatewayPlatform :: Lens.Lens' GatewaySummary (Prelude.Maybe GatewayPlatform)
+gatewaySummary_gatewayPlatform = Lens.lens (\GatewaySummary' {gatewayPlatform} -> gatewayPlatform) (\s@GatewaySummary' {} a -> s {gatewayPlatform = a} :: GatewaySummary)
+
+-- | The ID of the gateway device.
+gatewaySummary_gatewayId :: Lens.Lens' GatewaySummary Prelude.Text
+gatewaySummary_gatewayId = Lens.lens (\GatewaySummary' {gatewayId} -> gatewayId) (\s@GatewaySummary' {} a -> s {gatewayId = a} :: GatewaySummary)
+
+-- | The name of the asset.
+gatewaySummary_gatewayName :: Lens.Lens' GatewaySummary Prelude.Text
+gatewaySummary_gatewayName = Lens.lens (\GatewaySummary' {gatewayName} -> gatewayName) (\s@GatewaySummary' {} a -> s {gatewayName = a} :: GatewaySummary)
+
+-- | The date the gateway was created, in Unix epoch time.
+gatewaySummary_creationDate :: Lens.Lens' GatewaySummary Prelude.UTCTime
+gatewaySummary_creationDate = Lens.lens (\GatewaySummary' {creationDate} -> creationDate) (\s@GatewaySummary' {} a -> s {creationDate = a} :: GatewaySummary) Prelude.. Data._Time
+
+-- | The date the gateway was last updated, in Unix epoch time.
+gatewaySummary_lastUpdateDate :: Lens.Lens' GatewaySummary Prelude.UTCTime
+gatewaySummary_lastUpdateDate = Lens.lens (\GatewaySummary' {lastUpdateDate} -> lastUpdateDate) (\s@GatewaySummary' {} a -> s {lastUpdateDate = a} :: GatewaySummary) Prelude.. Data._Time
+
+instance Data.FromJSON GatewaySummary where
+  parseJSON =
+    Data.withObject
+      "GatewaySummary"
+      ( \x ->
+          GatewaySummary'
+            Prelude.<$> ( x
+                            Data..:? "gatewayCapabilitySummaries"
+                            Data..!= Prelude.mempty
+                        )
+            Prelude.<*> (x Data..:? "gatewayPlatform")
+            Prelude.<*> (x Data..: "gatewayId")
+            Prelude.<*> (x Data..: "gatewayName")
+            Prelude.<*> (x Data..: "creationDate")
+            Prelude.<*> (x Data..: "lastUpdateDate")
+      )
+
+instance Prelude.Hashable GatewaySummary where
+  hashWithSalt _salt GatewaySummary' {..} =
+    _salt
+      `Prelude.hashWithSalt` gatewayCapabilitySummaries
+      `Prelude.hashWithSalt` gatewayPlatform
+      `Prelude.hashWithSalt` gatewayId
+      `Prelude.hashWithSalt` gatewayName
+      `Prelude.hashWithSalt` creationDate
+      `Prelude.hashWithSalt` lastUpdateDate
+
+instance Prelude.NFData GatewaySummary where
+  rnf GatewaySummary' {..} =
+    Prelude.rnf gatewayCapabilitySummaries
+      `Prelude.seq` Prelude.rnf gatewayPlatform
+      `Prelude.seq` Prelude.rnf gatewayId
+      `Prelude.seq` Prelude.rnf gatewayName
+      `Prelude.seq` Prelude.rnf creationDate
+      `Prelude.seq` Prelude.rnf lastUpdateDate
diff --git a/gen/Amazonka/IoTSiteWise/Types/Greengrass.hs b/gen/Amazonka/IoTSiteWise/Types/Greengrass.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/IoTSiteWise/Types/Greengrass.hs
@@ -0,0 +1,103 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.IoTSiteWise.Types.Greengrass
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.IoTSiteWise.Types.Greengrass where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+-- | Contains details for a gateway that runs on IoT Greengrass. To create a
+-- gateway that runs on IoT Greengrass, you must add the IoT SiteWise
+-- connector to a Greengrass group and deploy it. Your Greengrass group
+-- must also have permissions to upload data to IoT SiteWise. For more
+-- information, see
+-- <https://docs.aws.amazon.com/iot-sitewise/latest/userguide/gateway-connector.html Ingesting data using a gateway>
+-- in the /IoT SiteWise User Guide/.
+--
+-- /See:/ 'newGreengrass' smart constructor.
+data Greengrass = Greengrass'
+  { -- | The
+    -- <https://docs.aws.amazon.com/general/latest/gr/aws-arns-and-namespaces.html ARN>
+    -- of the Greengrass group. For more information about how to find a
+    -- group\'s ARN, see
+    -- <https://docs.aws.amazon.com/greengrass/latest/apireference/listgroups-get.html ListGroups>
+    -- and
+    -- <https://docs.aws.amazon.com/greengrass/latest/apireference/getgroup-get.html GetGroup>
+    -- in the /IoT Greengrass API Reference/.
+    groupArn :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'Greengrass' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'groupArn', 'greengrass_groupArn' - The
+-- <https://docs.aws.amazon.com/general/latest/gr/aws-arns-and-namespaces.html ARN>
+-- of the Greengrass group. For more information about how to find a
+-- group\'s ARN, see
+-- <https://docs.aws.amazon.com/greengrass/latest/apireference/listgroups-get.html ListGroups>
+-- and
+-- <https://docs.aws.amazon.com/greengrass/latest/apireference/getgroup-get.html GetGroup>
+-- in the /IoT Greengrass API Reference/.
+newGreengrass ::
+  -- | 'groupArn'
+  Prelude.Text ->
+  Greengrass
+newGreengrass pGroupArn_ =
+  Greengrass' {groupArn = pGroupArn_}
+
+-- | The
+-- <https://docs.aws.amazon.com/general/latest/gr/aws-arns-and-namespaces.html ARN>
+-- of the Greengrass group. For more information about how to find a
+-- group\'s ARN, see
+-- <https://docs.aws.amazon.com/greengrass/latest/apireference/listgroups-get.html ListGroups>
+-- and
+-- <https://docs.aws.amazon.com/greengrass/latest/apireference/getgroup-get.html GetGroup>
+-- in the /IoT Greengrass API Reference/.
+greengrass_groupArn :: Lens.Lens' Greengrass Prelude.Text
+greengrass_groupArn = Lens.lens (\Greengrass' {groupArn} -> groupArn) (\s@Greengrass' {} a -> s {groupArn = a} :: Greengrass)
+
+instance Data.FromJSON Greengrass where
+  parseJSON =
+    Data.withObject
+      "Greengrass"
+      ( \x ->
+          Greengrass' Prelude.<$> (x Data..: "groupArn")
+      )
+
+instance Prelude.Hashable Greengrass where
+  hashWithSalt _salt Greengrass' {..} =
+    _salt `Prelude.hashWithSalt` groupArn
+
+instance Prelude.NFData Greengrass where
+  rnf Greengrass' {..} = Prelude.rnf groupArn
+
+instance Data.ToJSON Greengrass where
+  toJSON Greengrass' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [Prelude.Just ("groupArn" Data..= groupArn)]
+      )
diff --git a/gen/Amazonka/IoTSiteWise/Types/GreengrassV2.hs b/gen/Amazonka/IoTSiteWise/Types/GreengrassV2.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/IoTSiteWise/Types/GreengrassV2.hs
@@ -0,0 +1,90 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.IoTSiteWise.Types.GreengrassV2
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.IoTSiteWise.Types.GreengrassV2 where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+-- | Contains details for a gateway that runs on IoT Greengrass V2. To create
+-- a gateway that runs on IoT Greengrass V2, you must deploy the IoT
+-- SiteWise Edge component to your gateway device. Your
+-- <https://docs.aws.amazon.com/greengrass/v2/developerguide/device-service-role.html Greengrass device role>
+-- must use the @AWSIoTSiteWiseEdgeAccess@ policy. For more information,
+-- see
+-- <https://docs.aws.amazon.com/iot-sitewise/latest/userguide/sw-gateways.html Using IoT SiteWise at the edge>
+-- in the /IoT SiteWise User Guide/.
+--
+-- /See:/ 'newGreengrassV2' smart constructor.
+data GreengrassV2 = GreengrassV2'
+  { -- | The name of the IoT thing for your IoT Greengrass V2 core device.
+    coreDeviceThingName :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'GreengrassV2' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'coreDeviceThingName', 'greengrassV2_coreDeviceThingName' - The name of the IoT thing for your IoT Greengrass V2 core device.
+newGreengrassV2 ::
+  -- | 'coreDeviceThingName'
+  Prelude.Text ->
+  GreengrassV2
+newGreengrassV2 pCoreDeviceThingName_ =
+  GreengrassV2'
+    { coreDeviceThingName =
+        pCoreDeviceThingName_
+    }
+
+-- | The name of the IoT thing for your IoT Greengrass V2 core device.
+greengrassV2_coreDeviceThingName :: Lens.Lens' GreengrassV2 Prelude.Text
+greengrassV2_coreDeviceThingName = Lens.lens (\GreengrassV2' {coreDeviceThingName} -> coreDeviceThingName) (\s@GreengrassV2' {} a -> s {coreDeviceThingName = a} :: GreengrassV2)
+
+instance Data.FromJSON GreengrassV2 where
+  parseJSON =
+    Data.withObject
+      "GreengrassV2"
+      ( \x ->
+          GreengrassV2'
+            Prelude.<$> (x Data..: "coreDeviceThingName")
+      )
+
+instance Prelude.Hashable GreengrassV2 where
+  hashWithSalt _salt GreengrassV2' {..} =
+    _salt `Prelude.hashWithSalt` coreDeviceThingName
+
+instance Prelude.NFData GreengrassV2 where
+  rnf GreengrassV2' {..} =
+    Prelude.rnf coreDeviceThingName
+
+instance Data.ToJSON GreengrassV2 where
+  toJSON GreengrassV2' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ Prelude.Just
+              ("coreDeviceThingName" Data..= coreDeviceThingName)
+          ]
+      )
diff --git a/gen/Amazonka/IoTSiteWise/Types/GroupIdentity.hs b/gen/Amazonka/IoTSiteWise/Types/GroupIdentity.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/IoTSiteWise/Types/GroupIdentity.hs
@@ -0,0 +1,71 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.IoTSiteWise.Types.GroupIdentity
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.IoTSiteWise.Types.GroupIdentity where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+-- | Contains information for a group identity in an access policy.
+--
+-- /See:/ 'newGroupIdentity' smart constructor.
+data GroupIdentity = GroupIdentity'
+  { -- | The IAM Identity Center ID of the group.
+    id :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'GroupIdentity' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'id', 'groupIdentity_id' - The IAM Identity Center ID of the group.
+newGroupIdentity ::
+  -- | 'id'
+  Prelude.Text ->
+  GroupIdentity
+newGroupIdentity pId_ = GroupIdentity' {id = pId_}
+
+-- | The IAM Identity Center ID of the group.
+groupIdentity_id :: Lens.Lens' GroupIdentity Prelude.Text
+groupIdentity_id = Lens.lens (\GroupIdentity' {id} -> id) (\s@GroupIdentity' {} a -> s {id = a} :: GroupIdentity)
+
+instance Data.FromJSON GroupIdentity where
+  parseJSON =
+    Data.withObject
+      "GroupIdentity"
+      (\x -> GroupIdentity' Prelude.<$> (x Data..: "id"))
+
+instance Prelude.Hashable GroupIdentity where
+  hashWithSalt _salt GroupIdentity' {..} =
+    _salt `Prelude.hashWithSalt` id
+
+instance Prelude.NFData GroupIdentity where
+  rnf GroupIdentity' {..} = Prelude.rnf id
+
+instance Data.ToJSON GroupIdentity where
+  toJSON GroupIdentity' {..} =
+    Data.object
+      (Prelude.catMaybes [Prelude.Just ("id" Data..= id)])
diff --git a/gen/Amazonka/IoTSiteWise/Types/IAMRoleIdentity.hs b/gen/Amazonka/IoTSiteWise/Types/IAMRoleIdentity.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/IoTSiteWise/Types/IAMRoleIdentity.hs
@@ -0,0 +1,85 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.IoTSiteWise.Types.IAMRoleIdentity
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.IoTSiteWise.Types.IAMRoleIdentity where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+-- | Contains information about an Identity and Access Management role. For
+-- more information, see
+-- <https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles.html IAM roles>
+-- in the /IAM User Guide/.
+--
+-- /See:/ 'newIAMRoleIdentity' smart constructor.
+data IAMRoleIdentity = IAMRoleIdentity'
+  { -- | The ARN of the IAM role. For more information, see
+    -- <https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_identifiers.html IAM ARNs>
+    -- in the /IAM User Guide/.
+    arn :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'IAMRoleIdentity' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'arn', 'iAMRoleIdentity_arn' - The ARN of the IAM role. For more information, see
+-- <https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_identifiers.html IAM ARNs>
+-- in the /IAM User Guide/.
+newIAMRoleIdentity ::
+  -- | 'arn'
+  Prelude.Text ->
+  IAMRoleIdentity
+newIAMRoleIdentity pArn_ =
+  IAMRoleIdentity' {arn = pArn_}
+
+-- | The ARN of the IAM role. For more information, see
+-- <https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_identifiers.html IAM ARNs>
+-- in the /IAM User Guide/.
+iAMRoleIdentity_arn :: Lens.Lens' IAMRoleIdentity Prelude.Text
+iAMRoleIdentity_arn = Lens.lens (\IAMRoleIdentity' {arn} -> arn) (\s@IAMRoleIdentity' {} a -> s {arn = a} :: IAMRoleIdentity)
+
+instance Data.FromJSON IAMRoleIdentity where
+  parseJSON =
+    Data.withObject
+      "IAMRoleIdentity"
+      ( \x ->
+          IAMRoleIdentity' Prelude.<$> (x Data..: "arn")
+      )
+
+instance Prelude.Hashable IAMRoleIdentity where
+  hashWithSalt _salt IAMRoleIdentity' {..} =
+    _salt `Prelude.hashWithSalt` arn
+
+instance Prelude.NFData IAMRoleIdentity where
+  rnf IAMRoleIdentity' {..} = Prelude.rnf arn
+
+instance Data.ToJSON IAMRoleIdentity where
+  toJSON IAMRoleIdentity' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [Prelude.Just ("arn" Data..= arn)]
+      )
diff --git a/gen/Amazonka/IoTSiteWise/Types/IAMUserIdentity.hs b/gen/Amazonka/IoTSiteWise/Types/IAMUserIdentity.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/IoTSiteWise/Types/IAMUserIdentity.hs
@@ -0,0 +1,94 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.IoTSiteWise.Types.IAMUserIdentity
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.IoTSiteWise.Types.IAMUserIdentity where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+-- | Contains information about an Identity and Access Management user.
+--
+-- /See:/ 'newIAMUserIdentity' smart constructor.
+data IAMUserIdentity = IAMUserIdentity'
+  { -- | The ARN of the IAM user. For more information, see
+    -- <https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_identifiers.html IAM ARNs>
+    -- in the /IAM User Guide/.
+    --
+    -- If you delete the IAM user, access policies that contain this identity
+    -- include an empty @arn@. You can delete the access policy for the IAM
+    -- user that no longer exists.
+    arn :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'IAMUserIdentity' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'arn', 'iAMUserIdentity_arn' - The ARN of the IAM user. For more information, see
+-- <https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_identifiers.html IAM ARNs>
+-- in the /IAM User Guide/.
+--
+-- If you delete the IAM user, access policies that contain this identity
+-- include an empty @arn@. You can delete the access policy for the IAM
+-- user that no longer exists.
+newIAMUserIdentity ::
+  -- | 'arn'
+  Prelude.Text ->
+  IAMUserIdentity
+newIAMUserIdentity pArn_ =
+  IAMUserIdentity' {arn = pArn_}
+
+-- | The ARN of the IAM user. For more information, see
+-- <https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_identifiers.html IAM ARNs>
+-- in the /IAM User Guide/.
+--
+-- If you delete the IAM user, access policies that contain this identity
+-- include an empty @arn@. You can delete the access policy for the IAM
+-- user that no longer exists.
+iAMUserIdentity_arn :: Lens.Lens' IAMUserIdentity Prelude.Text
+iAMUserIdentity_arn = Lens.lens (\IAMUserIdentity' {arn} -> arn) (\s@IAMUserIdentity' {} a -> s {arn = a} :: IAMUserIdentity)
+
+instance Data.FromJSON IAMUserIdentity where
+  parseJSON =
+    Data.withObject
+      "IAMUserIdentity"
+      ( \x ->
+          IAMUserIdentity' Prelude.<$> (x Data..: "arn")
+      )
+
+instance Prelude.Hashable IAMUserIdentity where
+  hashWithSalt _salt IAMUserIdentity' {..} =
+    _salt `Prelude.hashWithSalt` arn
+
+instance Prelude.NFData IAMUserIdentity where
+  rnf IAMUserIdentity' {..} = Prelude.rnf arn
+
+instance Data.ToJSON IAMUserIdentity where
+  toJSON IAMUserIdentity' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [Prelude.Just ("arn" Data..= arn)]
+      )
diff --git a/gen/Amazonka/IoTSiteWise/Types/Identity.hs b/gen/Amazonka/IoTSiteWise/Types/Identity.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/IoTSiteWise/Types/Identity.hs
@@ -0,0 +1,128 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.IoTSiteWise.Types.Identity
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.IoTSiteWise.Types.Identity where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.IoTSiteWise.Types.GroupIdentity
+import Amazonka.IoTSiteWise.Types.IAMRoleIdentity
+import Amazonka.IoTSiteWise.Types.IAMUserIdentity
+import Amazonka.IoTSiteWise.Types.UserIdentity
+import qualified Amazonka.Prelude as Prelude
+
+-- | Contains an identity that can access an IoT SiteWise Monitor resource.
+--
+-- Currently, you can\'t use Amazon Web Services APIs to retrieve IAM
+-- Identity Center identity IDs. You can find the IAM Identity Center
+-- identity IDs in the URL of user and group pages in the
+-- <https://console.aws.amazon.com/singlesignon IAM Identity Center console>.
+--
+-- /See:/ 'newIdentity' smart constructor.
+data Identity = Identity'
+  { -- | An IAM Identity Center group identity.
+    group' :: Prelude.Maybe GroupIdentity,
+    -- | An IAM role identity.
+    iamRole :: Prelude.Maybe IAMRoleIdentity,
+    -- | An IAM user identity.
+    iamUser :: Prelude.Maybe IAMUserIdentity,
+    -- | An IAM Identity Center user identity.
+    user :: Prelude.Maybe UserIdentity
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'Identity' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'group'', 'identity_group' - An IAM Identity Center group identity.
+--
+-- 'iamRole', 'identity_iamRole' - An IAM role identity.
+--
+-- 'iamUser', 'identity_iamUser' - An IAM user identity.
+--
+-- 'user', 'identity_user' - An IAM Identity Center user identity.
+newIdentity ::
+  Identity
+newIdentity =
+  Identity'
+    { group' = Prelude.Nothing,
+      iamRole = Prelude.Nothing,
+      iamUser = Prelude.Nothing,
+      user = Prelude.Nothing
+    }
+
+-- | An IAM Identity Center group identity.
+identity_group :: Lens.Lens' Identity (Prelude.Maybe GroupIdentity)
+identity_group = Lens.lens (\Identity' {group'} -> group') (\s@Identity' {} a -> s {group' = a} :: Identity)
+
+-- | An IAM role identity.
+identity_iamRole :: Lens.Lens' Identity (Prelude.Maybe IAMRoleIdentity)
+identity_iamRole = Lens.lens (\Identity' {iamRole} -> iamRole) (\s@Identity' {} a -> s {iamRole = a} :: Identity)
+
+-- | An IAM user identity.
+identity_iamUser :: Lens.Lens' Identity (Prelude.Maybe IAMUserIdentity)
+identity_iamUser = Lens.lens (\Identity' {iamUser} -> iamUser) (\s@Identity' {} a -> s {iamUser = a} :: Identity)
+
+-- | An IAM Identity Center user identity.
+identity_user :: Lens.Lens' Identity (Prelude.Maybe UserIdentity)
+identity_user = Lens.lens (\Identity' {user} -> user) (\s@Identity' {} a -> s {user = a} :: Identity)
+
+instance Data.FromJSON Identity where
+  parseJSON =
+    Data.withObject
+      "Identity"
+      ( \x ->
+          Identity'
+            Prelude.<$> (x Data..:? "group")
+            Prelude.<*> (x Data..:? "iamRole")
+            Prelude.<*> (x Data..:? "iamUser")
+            Prelude.<*> (x Data..:? "user")
+      )
+
+instance Prelude.Hashable Identity where
+  hashWithSalt _salt Identity' {..} =
+    _salt
+      `Prelude.hashWithSalt` group'
+      `Prelude.hashWithSalt` iamRole
+      `Prelude.hashWithSalt` iamUser
+      `Prelude.hashWithSalt` user
+
+instance Prelude.NFData Identity where
+  rnf Identity' {..} =
+    Prelude.rnf group'
+      `Prelude.seq` Prelude.rnf iamRole
+      `Prelude.seq` Prelude.rnf iamUser
+      `Prelude.seq` Prelude.rnf user
+
+instance Data.ToJSON Identity where
+  toJSON Identity' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("group" Data..=) Prelude.<$> group',
+            ("iamRole" Data..=) Prelude.<$> iamRole,
+            ("iamUser" Data..=) Prelude.<$> iamUser,
+            ("user" Data..=) Prelude.<$> user
+          ]
+      )
diff --git a/gen/Amazonka/IoTSiteWise/Types/IdentityType.hs b/gen/Amazonka/IoTSiteWise/Types/IdentityType.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/IoTSiteWise/Types/IdentityType.hs
@@ -0,0 +1,76 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DerivingStrategies #-}
+{-# LANGUAGE GeneralizedNewtypeDeriving #-}
+{-# LANGUAGE LambdaCase #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE PatternSynonyms #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.IoTSiteWise.Types.IdentityType
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.IoTSiteWise.Types.IdentityType
+  ( IdentityType
+      ( ..,
+        IdentityType_GROUP,
+        IdentityType_IAM,
+        IdentityType_USER
+      ),
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+newtype IdentityType = IdentityType'
+  { fromIdentityType ::
+      Data.Text
+  }
+  deriving stock
+    ( Prelude.Show,
+      Prelude.Read,
+      Prelude.Eq,
+      Prelude.Ord,
+      Prelude.Generic
+    )
+  deriving newtype
+    ( Prelude.Hashable,
+      Prelude.NFData,
+      Data.FromText,
+      Data.ToText,
+      Data.ToByteString,
+      Data.ToLog,
+      Data.ToHeader,
+      Data.ToQuery,
+      Data.FromJSON,
+      Data.FromJSONKey,
+      Data.ToJSON,
+      Data.ToJSONKey,
+      Data.FromXML,
+      Data.ToXML
+    )
+
+pattern IdentityType_GROUP :: IdentityType
+pattern IdentityType_GROUP = IdentityType' "GROUP"
+
+pattern IdentityType_IAM :: IdentityType
+pattern IdentityType_IAM = IdentityType' "IAM"
+
+pattern IdentityType_USER :: IdentityType
+pattern IdentityType_USER = IdentityType' "USER"
+
+{-# COMPLETE
+  IdentityType_GROUP,
+  IdentityType_IAM,
+  IdentityType_USER,
+  IdentityType'
+  #-}
diff --git a/gen/Amazonka/IoTSiteWise/Types/Image.hs b/gen/Amazonka/IoTSiteWise/Types/Image.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/IoTSiteWise/Types/Image.hs
@@ -0,0 +1,90 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.IoTSiteWise.Types.Image
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.IoTSiteWise.Types.Image where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.IoTSiteWise.Types.ImageFile
+import qualified Amazonka.Prelude as Prelude
+
+-- | Contains an image that is one of the following:
+--
+-- -   An image file. Choose this option to upload a new image.
+--
+-- -   The ID of an existing image. Choose this option to keep an existing
+--     image.
+--
+-- /See:/ 'newImage' smart constructor.
+data Image = Image'
+  { file :: Prelude.Maybe ImageFile,
+    -- | The ID of an existing image. Specify this parameter to keep an existing
+    -- image.
+    id :: Prelude.Maybe Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'Image' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'file', 'image_file' - Undocumented member.
+--
+-- 'id', 'image_id' - The ID of an existing image. Specify this parameter to keep an existing
+-- image.
+newImage ::
+  Image
+newImage =
+  Image'
+    { file = Prelude.Nothing,
+      id = Prelude.Nothing
+    }
+
+-- | Undocumented member.
+image_file :: Lens.Lens' Image (Prelude.Maybe ImageFile)
+image_file = Lens.lens (\Image' {file} -> file) (\s@Image' {} a -> s {file = a} :: Image)
+
+-- | The ID of an existing image. Specify this parameter to keep an existing
+-- image.
+image_id :: Lens.Lens' Image (Prelude.Maybe Prelude.Text)
+image_id = Lens.lens (\Image' {id} -> id) (\s@Image' {} a -> s {id = a} :: Image)
+
+instance Prelude.Hashable Image where
+  hashWithSalt _salt Image' {..} =
+    _salt
+      `Prelude.hashWithSalt` file
+      `Prelude.hashWithSalt` id
+
+instance Prelude.NFData Image where
+  rnf Image' {..} =
+    Prelude.rnf file `Prelude.seq` Prelude.rnf id
+
+instance Data.ToJSON Image where
+  toJSON Image' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("file" Data..=) Prelude.<$> file,
+            ("id" Data..=) Prelude.<$> id
+          ]
+      )
diff --git a/gen/Amazonka/IoTSiteWise/Types/ImageFile.hs b/gen/Amazonka/IoTSiteWise/Types/ImageFile.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/IoTSiteWise/Types/ImageFile.hs
@@ -0,0 +1,98 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.IoTSiteWise.Types.ImageFile
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.IoTSiteWise.Types.ImageFile where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.IoTSiteWise.Types.ImageFileType
+import qualified Amazonka.Prelude as Prelude
+
+-- | Contains an image file.
+--
+-- /See:/ 'newImageFile' smart constructor.
+data ImageFile = ImageFile'
+  { -- | The image file contents, represented as a base64-encoded string. The
+    -- file size must be less than 1 MB.
+    data' :: Data.Base64,
+    -- | The file type of the image.
+    type' :: ImageFileType
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ImageFile' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'data'', 'imageFile_data' - The image file contents, represented as a base64-encoded string. The
+-- file size must be less than 1 MB.--
+-- -- /Note:/ This 'Lens' automatically encodes and decodes Base64 data.
+-- -- The underlying isomorphism will encode to Base64 representation during
+-- -- serialisation, and decode from Base64 representation during deserialisation.
+-- -- This 'Lens' accepts and returns only raw unencoded data.
+--
+-- 'type'', 'imageFile_type' - The file type of the image.
+newImageFile ::
+  -- | 'data''
+  Prelude.ByteString ->
+  -- | 'type''
+  ImageFileType ->
+  ImageFile
+newImageFile pData_ pType_ =
+  ImageFile'
+    { data' = Data._Base64 Lens.# pData_,
+      type' = pType_
+    }
+
+-- | The image file contents, represented as a base64-encoded string. The
+-- file size must be less than 1 MB.--
+-- -- /Note:/ This 'Lens' automatically encodes and decodes Base64 data.
+-- -- The underlying isomorphism will encode to Base64 representation during
+-- -- serialisation, and decode from Base64 representation during deserialisation.
+-- -- This 'Lens' accepts and returns only raw unencoded data.
+imageFile_data :: Lens.Lens' ImageFile Prelude.ByteString
+imageFile_data = Lens.lens (\ImageFile' {data'} -> data') (\s@ImageFile' {} a -> s {data' = a} :: ImageFile) Prelude.. Data._Base64
+
+-- | The file type of the image.
+imageFile_type :: Lens.Lens' ImageFile ImageFileType
+imageFile_type = Lens.lens (\ImageFile' {type'} -> type') (\s@ImageFile' {} a -> s {type' = a} :: ImageFile)
+
+instance Prelude.Hashable ImageFile where
+  hashWithSalt _salt ImageFile' {..} =
+    _salt
+      `Prelude.hashWithSalt` data'
+      `Prelude.hashWithSalt` type'
+
+instance Prelude.NFData ImageFile where
+  rnf ImageFile' {..} =
+    Prelude.rnf data' `Prelude.seq` Prelude.rnf type'
+
+instance Data.ToJSON ImageFile where
+  toJSON ImageFile' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ Prelude.Just ("data" Data..= data'),
+            Prelude.Just ("type" Data..= type')
+          ]
+      )
diff --git a/gen/Amazonka/IoTSiteWise/Types/ImageFileType.hs b/gen/Amazonka/IoTSiteWise/Types/ImageFileType.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/IoTSiteWise/Types/ImageFileType.hs
@@ -0,0 +1,66 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DerivingStrategies #-}
+{-# LANGUAGE GeneralizedNewtypeDeriving #-}
+{-# LANGUAGE LambdaCase #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE PatternSynonyms #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.IoTSiteWise.Types.ImageFileType
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.IoTSiteWise.Types.ImageFileType
+  ( ImageFileType
+      ( ..,
+        ImageFileType_PNG
+      ),
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+newtype ImageFileType = ImageFileType'
+  { fromImageFileType ::
+      Data.Text
+  }
+  deriving stock
+    ( Prelude.Show,
+      Prelude.Read,
+      Prelude.Eq,
+      Prelude.Ord,
+      Prelude.Generic
+    )
+  deriving newtype
+    ( Prelude.Hashable,
+      Prelude.NFData,
+      Data.FromText,
+      Data.ToText,
+      Data.ToByteString,
+      Data.ToLog,
+      Data.ToHeader,
+      Data.ToQuery,
+      Data.FromJSON,
+      Data.FromJSONKey,
+      Data.ToJSON,
+      Data.ToJSONKey,
+      Data.FromXML,
+      Data.ToXML
+    )
+
+pattern ImageFileType_PNG :: ImageFileType
+pattern ImageFileType_PNG = ImageFileType' "PNG"
+
+{-# COMPLETE
+  ImageFileType_PNG,
+  ImageFileType'
+  #-}
diff --git a/gen/Amazonka/IoTSiteWise/Types/ImageLocation.hs b/gen/Amazonka/IoTSiteWise/Types/ImageLocation.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/IoTSiteWise/Types/ImageLocation.hs
@@ -0,0 +1,88 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.IoTSiteWise.Types.ImageLocation
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.IoTSiteWise.Types.ImageLocation where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+-- | Contains an image that is uploaded to IoT SiteWise and available at a
+-- URL.
+--
+-- /See:/ 'newImageLocation' smart constructor.
+data ImageLocation = ImageLocation'
+  { -- | The ID of the image.
+    id :: Prelude.Text,
+    -- | The URL where the image is available. The URL is valid for 15 minutes so
+    -- that you can view and download the image
+    url :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ImageLocation' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'id', 'imageLocation_id' - The ID of the image.
+--
+-- 'url', 'imageLocation_url' - The URL where the image is available. The URL is valid for 15 minutes so
+-- that you can view and download the image
+newImageLocation ::
+  -- | 'id'
+  Prelude.Text ->
+  -- | 'url'
+  Prelude.Text ->
+  ImageLocation
+newImageLocation pId_ pUrl_ =
+  ImageLocation' {id = pId_, url = pUrl_}
+
+-- | The ID of the image.
+imageLocation_id :: Lens.Lens' ImageLocation Prelude.Text
+imageLocation_id = Lens.lens (\ImageLocation' {id} -> id) (\s@ImageLocation' {} a -> s {id = a} :: ImageLocation)
+
+-- | The URL where the image is available. The URL is valid for 15 minutes so
+-- that you can view and download the image
+imageLocation_url :: Lens.Lens' ImageLocation Prelude.Text
+imageLocation_url = Lens.lens (\ImageLocation' {url} -> url) (\s@ImageLocation' {} a -> s {url = a} :: ImageLocation)
+
+instance Data.FromJSON ImageLocation where
+  parseJSON =
+    Data.withObject
+      "ImageLocation"
+      ( \x ->
+          ImageLocation'
+            Prelude.<$> (x Data..: "id")
+            Prelude.<*> (x Data..: "url")
+      )
+
+instance Prelude.Hashable ImageLocation where
+  hashWithSalt _salt ImageLocation' {..} =
+    _salt
+      `Prelude.hashWithSalt` id
+      `Prelude.hashWithSalt` url
+
+instance Prelude.NFData ImageLocation where
+  rnf ImageLocation' {..} =
+    Prelude.rnf id `Prelude.seq` Prelude.rnf url
diff --git a/gen/Amazonka/IoTSiteWise/Types/InterpolatedAssetPropertyValue.hs b/gen/Amazonka/IoTSiteWise/Types/InterpolatedAssetPropertyValue.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/IoTSiteWise/Types/InterpolatedAssetPropertyValue.hs
@@ -0,0 +1,97 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.IoTSiteWise.Types.InterpolatedAssetPropertyValue
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.IoTSiteWise.Types.InterpolatedAssetPropertyValue where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.IoTSiteWise.Types.TimeInNanos
+import Amazonka.IoTSiteWise.Types.Variant
+import qualified Amazonka.Prelude as Prelude
+
+-- | Contains information about an interpolated asset property value.
+--
+-- /See:/ 'newInterpolatedAssetPropertyValue' smart constructor.
+data InterpolatedAssetPropertyValue = InterpolatedAssetPropertyValue'
+  { timestamp :: TimeInNanos,
+    value :: Variant
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'InterpolatedAssetPropertyValue' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'timestamp', 'interpolatedAssetPropertyValue_timestamp' - Undocumented member.
+--
+-- 'value', 'interpolatedAssetPropertyValue_value' - Undocumented member.
+newInterpolatedAssetPropertyValue ::
+  -- | 'timestamp'
+  TimeInNanos ->
+  -- | 'value'
+  Variant ->
+  InterpolatedAssetPropertyValue
+newInterpolatedAssetPropertyValue pTimestamp_ pValue_ =
+  InterpolatedAssetPropertyValue'
+    { timestamp =
+        pTimestamp_,
+      value = pValue_
+    }
+
+-- | Undocumented member.
+interpolatedAssetPropertyValue_timestamp :: Lens.Lens' InterpolatedAssetPropertyValue TimeInNanos
+interpolatedAssetPropertyValue_timestamp = Lens.lens (\InterpolatedAssetPropertyValue' {timestamp} -> timestamp) (\s@InterpolatedAssetPropertyValue' {} a -> s {timestamp = a} :: InterpolatedAssetPropertyValue)
+
+-- | Undocumented member.
+interpolatedAssetPropertyValue_value :: Lens.Lens' InterpolatedAssetPropertyValue Variant
+interpolatedAssetPropertyValue_value = Lens.lens (\InterpolatedAssetPropertyValue' {value} -> value) (\s@InterpolatedAssetPropertyValue' {} a -> s {value = a} :: InterpolatedAssetPropertyValue)
+
+instance Data.FromJSON InterpolatedAssetPropertyValue where
+  parseJSON =
+    Data.withObject
+      "InterpolatedAssetPropertyValue"
+      ( \x ->
+          InterpolatedAssetPropertyValue'
+            Prelude.<$> (x Data..: "timestamp")
+            Prelude.<*> (x Data..: "value")
+      )
+
+instance
+  Prelude.Hashable
+    InterpolatedAssetPropertyValue
+  where
+  hashWithSalt
+    _salt
+    InterpolatedAssetPropertyValue' {..} =
+      _salt
+        `Prelude.hashWithSalt` timestamp
+        `Prelude.hashWithSalt` value
+
+instance
+  Prelude.NFData
+    InterpolatedAssetPropertyValue
+  where
+  rnf InterpolatedAssetPropertyValue' {..} =
+    Prelude.rnf timestamp
+      `Prelude.seq` Prelude.rnf value
diff --git a/gen/Amazonka/IoTSiteWise/Types/JobConfiguration.hs b/gen/Amazonka/IoTSiteWise/Types/JobConfiguration.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/IoTSiteWise/Types/JobConfiguration.hs
@@ -0,0 +1,79 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.IoTSiteWise.Types.JobConfiguration
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.IoTSiteWise.Types.JobConfiguration where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.IoTSiteWise.Types.FileFormat
+import qualified Amazonka.Prelude as Prelude
+
+-- | Contains the configuration information of a job, such as the file format
+-- used to save data in Amazon S3.
+--
+-- /See:/ 'newJobConfiguration' smart constructor.
+data JobConfiguration = JobConfiguration'
+  { -- | The file format of the data in Amazon S3.
+    fileFormat :: FileFormat
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'JobConfiguration' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'fileFormat', 'jobConfiguration_fileFormat' - The file format of the data in Amazon S3.
+newJobConfiguration ::
+  -- | 'fileFormat'
+  FileFormat ->
+  JobConfiguration
+newJobConfiguration pFileFormat_ =
+  JobConfiguration' {fileFormat = pFileFormat_}
+
+-- | The file format of the data in Amazon S3.
+jobConfiguration_fileFormat :: Lens.Lens' JobConfiguration FileFormat
+jobConfiguration_fileFormat = Lens.lens (\JobConfiguration' {fileFormat} -> fileFormat) (\s@JobConfiguration' {} a -> s {fileFormat = a} :: JobConfiguration)
+
+instance Data.FromJSON JobConfiguration where
+  parseJSON =
+    Data.withObject
+      "JobConfiguration"
+      ( \x ->
+          JobConfiguration'
+            Prelude.<$> (x Data..: "fileFormat")
+      )
+
+instance Prelude.Hashable JobConfiguration where
+  hashWithSalt _salt JobConfiguration' {..} =
+    _salt `Prelude.hashWithSalt` fileFormat
+
+instance Prelude.NFData JobConfiguration where
+  rnf JobConfiguration' {..} = Prelude.rnf fileFormat
+
+instance Data.ToJSON JobConfiguration where
+  toJSON JobConfiguration' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [Prelude.Just ("fileFormat" Data..= fileFormat)]
+      )
diff --git a/gen/Amazonka/IoTSiteWise/Types/JobStatus.hs b/gen/Amazonka/IoTSiteWise/Types/JobStatus.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/IoTSiteWise/Types/JobStatus.hs
@@ -0,0 +1,91 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DerivingStrategies #-}
+{-# LANGUAGE GeneralizedNewtypeDeriving #-}
+{-# LANGUAGE LambdaCase #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE PatternSynonyms #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.IoTSiteWise.Types.JobStatus
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.IoTSiteWise.Types.JobStatus
+  ( JobStatus
+      ( ..,
+        JobStatus_CANCELLED,
+        JobStatus_COMPLETED,
+        JobStatus_COMPLETED_WITH_FAILURES,
+        JobStatus_FAILED,
+        JobStatus_PENDING,
+        JobStatus_RUNNING
+      ),
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+newtype JobStatus = JobStatus'
+  { fromJobStatus ::
+      Data.Text
+  }
+  deriving stock
+    ( Prelude.Show,
+      Prelude.Read,
+      Prelude.Eq,
+      Prelude.Ord,
+      Prelude.Generic
+    )
+  deriving newtype
+    ( Prelude.Hashable,
+      Prelude.NFData,
+      Data.FromText,
+      Data.ToText,
+      Data.ToByteString,
+      Data.ToLog,
+      Data.ToHeader,
+      Data.ToQuery,
+      Data.FromJSON,
+      Data.FromJSONKey,
+      Data.ToJSON,
+      Data.ToJSONKey,
+      Data.FromXML,
+      Data.ToXML
+    )
+
+pattern JobStatus_CANCELLED :: JobStatus
+pattern JobStatus_CANCELLED = JobStatus' "CANCELLED"
+
+pattern JobStatus_COMPLETED :: JobStatus
+pattern JobStatus_COMPLETED = JobStatus' "COMPLETED"
+
+pattern JobStatus_COMPLETED_WITH_FAILURES :: JobStatus
+pattern JobStatus_COMPLETED_WITH_FAILURES = JobStatus' "COMPLETED_WITH_FAILURES"
+
+pattern JobStatus_FAILED :: JobStatus
+pattern JobStatus_FAILED = JobStatus' "FAILED"
+
+pattern JobStatus_PENDING :: JobStatus
+pattern JobStatus_PENDING = JobStatus' "PENDING"
+
+pattern JobStatus_RUNNING :: JobStatus
+pattern JobStatus_RUNNING = JobStatus' "RUNNING"
+
+{-# COMPLETE
+  JobStatus_CANCELLED,
+  JobStatus_COMPLETED,
+  JobStatus_COMPLETED_WITH_FAILURES,
+  JobStatus_FAILED,
+  JobStatus_PENDING,
+  JobStatus_RUNNING,
+  JobStatus'
+  #-}
diff --git a/gen/Amazonka/IoTSiteWise/Types/JobSummary.hs b/gen/Amazonka/IoTSiteWise/Types/JobSummary.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/IoTSiteWise/Types/JobSummary.hs
@@ -0,0 +1,163 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.IoTSiteWise.Types.JobSummary
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.IoTSiteWise.Types.JobSummary where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.IoTSiteWise.Types.JobStatus
+import qualified Amazonka.Prelude as Prelude
+
+-- | Contains a job summary information.
+--
+-- /See:/ 'newJobSummary' smart constructor.
+data JobSummary = JobSummary'
+  { -- | The ID of the job.
+    id :: Prelude.Text,
+    -- | The unique name that helps identify the job request.
+    name :: Prelude.Text,
+    -- | The status of the bulk import job can be one of following values.
+    --
+    -- -   @PENDING@ – IoT SiteWise is waiting for the current bulk import job
+    --     to finish.
+    --
+    -- -   @CANCELLED@ – The bulk import job has been canceled.
+    --
+    -- -   @RUNNING@ – IoT SiteWise is processing your request to import your
+    --     data from Amazon S3.
+    --
+    -- -   @COMPLETED@ – IoT SiteWise successfully completed your request to
+    --     import data from Amazon S3.
+    --
+    -- -   @FAILED@ – IoT SiteWise couldn\'t process your request to import
+    --     data from Amazon S3. You can use logs saved in the specified error
+    --     report location in Amazon S3 to troubleshoot issues.
+    --
+    -- -   @COMPLETED_WITH_FAILURES@ – IoT SiteWise completed your request to
+    --     import data from Amazon S3 with errors. You can use logs saved in
+    --     the specified error report location in Amazon S3 to troubleshoot
+    --     issues.
+    status :: JobStatus
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'JobSummary' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'id', 'jobSummary_id' - The ID of the job.
+--
+-- 'name', 'jobSummary_name' - The unique name that helps identify the job request.
+--
+-- 'status', 'jobSummary_status' - The status of the bulk import job can be one of following values.
+--
+-- -   @PENDING@ – IoT SiteWise is waiting for the current bulk import job
+--     to finish.
+--
+-- -   @CANCELLED@ – The bulk import job has been canceled.
+--
+-- -   @RUNNING@ – IoT SiteWise is processing your request to import your
+--     data from Amazon S3.
+--
+-- -   @COMPLETED@ – IoT SiteWise successfully completed your request to
+--     import data from Amazon S3.
+--
+-- -   @FAILED@ – IoT SiteWise couldn\'t process your request to import
+--     data from Amazon S3. You can use logs saved in the specified error
+--     report location in Amazon S3 to troubleshoot issues.
+--
+-- -   @COMPLETED_WITH_FAILURES@ – IoT SiteWise completed your request to
+--     import data from Amazon S3 with errors. You can use logs saved in
+--     the specified error report location in Amazon S3 to troubleshoot
+--     issues.
+newJobSummary ::
+  -- | 'id'
+  Prelude.Text ->
+  -- | 'name'
+  Prelude.Text ->
+  -- | 'status'
+  JobStatus ->
+  JobSummary
+newJobSummary pId_ pName_ pStatus_ =
+  JobSummary'
+    { id = pId_,
+      name = pName_,
+      status = pStatus_
+    }
+
+-- | The ID of the job.
+jobSummary_id :: Lens.Lens' JobSummary Prelude.Text
+jobSummary_id = Lens.lens (\JobSummary' {id} -> id) (\s@JobSummary' {} a -> s {id = a} :: JobSummary)
+
+-- | The unique name that helps identify the job request.
+jobSummary_name :: Lens.Lens' JobSummary Prelude.Text
+jobSummary_name = Lens.lens (\JobSummary' {name} -> name) (\s@JobSummary' {} a -> s {name = a} :: JobSummary)
+
+-- | The status of the bulk import job can be one of following values.
+--
+-- -   @PENDING@ – IoT SiteWise is waiting for the current bulk import job
+--     to finish.
+--
+-- -   @CANCELLED@ – The bulk import job has been canceled.
+--
+-- -   @RUNNING@ – IoT SiteWise is processing your request to import your
+--     data from Amazon S3.
+--
+-- -   @COMPLETED@ – IoT SiteWise successfully completed your request to
+--     import data from Amazon S3.
+--
+-- -   @FAILED@ – IoT SiteWise couldn\'t process your request to import
+--     data from Amazon S3. You can use logs saved in the specified error
+--     report location in Amazon S3 to troubleshoot issues.
+--
+-- -   @COMPLETED_WITH_FAILURES@ – IoT SiteWise completed your request to
+--     import data from Amazon S3 with errors. You can use logs saved in
+--     the specified error report location in Amazon S3 to troubleshoot
+--     issues.
+jobSummary_status :: Lens.Lens' JobSummary JobStatus
+jobSummary_status = Lens.lens (\JobSummary' {status} -> status) (\s@JobSummary' {} a -> s {status = a} :: JobSummary)
+
+instance Data.FromJSON JobSummary where
+  parseJSON =
+    Data.withObject
+      "JobSummary"
+      ( \x ->
+          JobSummary'
+            Prelude.<$> (x Data..: "id")
+            Prelude.<*> (x Data..: "name")
+            Prelude.<*> (x Data..: "status")
+      )
+
+instance Prelude.Hashable JobSummary where
+  hashWithSalt _salt JobSummary' {..} =
+    _salt
+      `Prelude.hashWithSalt` id
+      `Prelude.hashWithSalt` name
+      `Prelude.hashWithSalt` status
+
+instance Prelude.NFData JobSummary where
+  rnf JobSummary' {..} =
+    Prelude.rnf id
+      `Prelude.seq` Prelude.rnf name
+      `Prelude.seq` Prelude.rnf status
diff --git a/gen/Amazonka/IoTSiteWise/Types/ListAssetModelPropertiesFilter.hs b/gen/Amazonka/IoTSiteWise/Types/ListAssetModelPropertiesFilter.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/IoTSiteWise/Types/ListAssetModelPropertiesFilter.hs
@@ -0,0 +1,71 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DerivingStrategies #-}
+{-# LANGUAGE GeneralizedNewtypeDeriving #-}
+{-# LANGUAGE LambdaCase #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE PatternSynonyms #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.IoTSiteWise.Types.ListAssetModelPropertiesFilter
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.IoTSiteWise.Types.ListAssetModelPropertiesFilter
+  ( ListAssetModelPropertiesFilter
+      ( ..,
+        ListAssetModelPropertiesFilter_ALL,
+        ListAssetModelPropertiesFilter_BASE
+      ),
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+newtype ListAssetModelPropertiesFilter = ListAssetModelPropertiesFilter'
+  { fromListAssetModelPropertiesFilter ::
+      Data.Text
+  }
+  deriving stock
+    ( Prelude.Show,
+      Prelude.Read,
+      Prelude.Eq,
+      Prelude.Ord,
+      Prelude.Generic
+    )
+  deriving newtype
+    ( Prelude.Hashable,
+      Prelude.NFData,
+      Data.FromText,
+      Data.ToText,
+      Data.ToByteString,
+      Data.ToLog,
+      Data.ToHeader,
+      Data.ToQuery,
+      Data.FromJSON,
+      Data.FromJSONKey,
+      Data.ToJSON,
+      Data.ToJSONKey,
+      Data.FromXML,
+      Data.ToXML
+    )
+
+pattern ListAssetModelPropertiesFilter_ALL :: ListAssetModelPropertiesFilter
+pattern ListAssetModelPropertiesFilter_ALL = ListAssetModelPropertiesFilter' "ALL"
+
+pattern ListAssetModelPropertiesFilter_BASE :: ListAssetModelPropertiesFilter
+pattern ListAssetModelPropertiesFilter_BASE = ListAssetModelPropertiesFilter' "BASE"
+
+{-# COMPLETE
+  ListAssetModelPropertiesFilter_ALL,
+  ListAssetModelPropertiesFilter_BASE,
+  ListAssetModelPropertiesFilter'
+  #-}
diff --git a/gen/Amazonka/IoTSiteWise/Types/ListAssetPropertiesFilter.hs b/gen/Amazonka/IoTSiteWise/Types/ListAssetPropertiesFilter.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/IoTSiteWise/Types/ListAssetPropertiesFilter.hs
@@ -0,0 +1,71 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DerivingStrategies #-}
+{-# LANGUAGE GeneralizedNewtypeDeriving #-}
+{-# LANGUAGE LambdaCase #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE PatternSynonyms #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.IoTSiteWise.Types.ListAssetPropertiesFilter
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.IoTSiteWise.Types.ListAssetPropertiesFilter
+  ( ListAssetPropertiesFilter
+      ( ..,
+        ListAssetPropertiesFilter_ALL,
+        ListAssetPropertiesFilter_BASE
+      ),
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+newtype ListAssetPropertiesFilter = ListAssetPropertiesFilter'
+  { fromListAssetPropertiesFilter ::
+      Data.Text
+  }
+  deriving stock
+    ( Prelude.Show,
+      Prelude.Read,
+      Prelude.Eq,
+      Prelude.Ord,
+      Prelude.Generic
+    )
+  deriving newtype
+    ( Prelude.Hashable,
+      Prelude.NFData,
+      Data.FromText,
+      Data.ToText,
+      Data.ToByteString,
+      Data.ToLog,
+      Data.ToHeader,
+      Data.ToQuery,
+      Data.FromJSON,
+      Data.FromJSONKey,
+      Data.ToJSON,
+      Data.ToJSONKey,
+      Data.FromXML,
+      Data.ToXML
+    )
+
+pattern ListAssetPropertiesFilter_ALL :: ListAssetPropertiesFilter
+pattern ListAssetPropertiesFilter_ALL = ListAssetPropertiesFilter' "ALL"
+
+pattern ListAssetPropertiesFilter_BASE :: ListAssetPropertiesFilter
+pattern ListAssetPropertiesFilter_BASE = ListAssetPropertiesFilter' "BASE"
+
+{-# COMPLETE
+  ListAssetPropertiesFilter_ALL,
+  ListAssetPropertiesFilter_BASE,
+  ListAssetPropertiesFilter'
+  #-}
diff --git a/gen/Amazonka/IoTSiteWise/Types/ListAssetsFilter.hs b/gen/Amazonka/IoTSiteWise/Types/ListAssetsFilter.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/IoTSiteWise/Types/ListAssetsFilter.hs
@@ -0,0 +1,71 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DerivingStrategies #-}
+{-# LANGUAGE GeneralizedNewtypeDeriving #-}
+{-# LANGUAGE LambdaCase #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE PatternSynonyms #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.IoTSiteWise.Types.ListAssetsFilter
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.IoTSiteWise.Types.ListAssetsFilter
+  ( ListAssetsFilter
+      ( ..,
+        ListAssetsFilter_ALL,
+        ListAssetsFilter_TOP_LEVEL
+      ),
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+newtype ListAssetsFilter = ListAssetsFilter'
+  { fromListAssetsFilter ::
+      Data.Text
+  }
+  deriving stock
+    ( Prelude.Show,
+      Prelude.Read,
+      Prelude.Eq,
+      Prelude.Ord,
+      Prelude.Generic
+    )
+  deriving newtype
+    ( Prelude.Hashable,
+      Prelude.NFData,
+      Data.FromText,
+      Data.ToText,
+      Data.ToByteString,
+      Data.ToLog,
+      Data.ToHeader,
+      Data.ToQuery,
+      Data.FromJSON,
+      Data.FromJSONKey,
+      Data.ToJSON,
+      Data.ToJSONKey,
+      Data.FromXML,
+      Data.ToXML
+    )
+
+pattern ListAssetsFilter_ALL :: ListAssetsFilter
+pattern ListAssetsFilter_ALL = ListAssetsFilter' "ALL"
+
+pattern ListAssetsFilter_TOP_LEVEL :: ListAssetsFilter
+pattern ListAssetsFilter_TOP_LEVEL = ListAssetsFilter' "TOP_LEVEL"
+
+{-# COMPLETE
+  ListAssetsFilter_ALL,
+  ListAssetsFilter_TOP_LEVEL,
+  ListAssetsFilter'
+  #-}
diff --git a/gen/Amazonka/IoTSiteWise/Types/ListBulkImportJobsFilter.hs b/gen/Amazonka/IoTSiteWise/Types/ListBulkImportJobsFilter.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/IoTSiteWise/Types/ListBulkImportJobsFilter.hs
@@ -0,0 +1,96 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DerivingStrategies #-}
+{-# LANGUAGE GeneralizedNewtypeDeriving #-}
+{-# LANGUAGE LambdaCase #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE PatternSynonyms #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.IoTSiteWise.Types.ListBulkImportJobsFilter
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.IoTSiteWise.Types.ListBulkImportJobsFilter
+  ( ListBulkImportJobsFilter
+      ( ..,
+        ListBulkImportJobsFilter_ALL,
+        ListBulkImportJobsFilter_CANCELLED,
+        ListBulkImportJobsFilter_COMPLETED,
+        ListBulkImportJobsFilter_COMPLETED_WITH_FAILURES,
+        ListBulkImportJobsFilter_FAILED,
+        ListBulkImportJobsFilter_PENDING,
+        ListBulkImportJobsFilter_RUNNING
+      ),
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+newtype ListBulkImportJobsFilter = ListBulkImportJobsFilter'
+  { fromListBulkImportJobsFilter ::
+      Data.Text
+  }
+  deriving stock
+    ( Prelude.Show,
+      Prelude.Read,
+      Prelude.Eq,
+      Prelude.Ord,
+      Prelude.Generic
+    )
+  deriving newtype
+    ( Prelude.Hashable,
+      Prelude.NFData,
+      Data.FromText,
+      Data.ToText,
+      Data.ToByteString,
+      Data.ToLog,
+      Data.ToHeader,
+      Data.ToQuery,
+      Data.FromJSON,
+      Data.FromJSONKey,
+      Data.ToJSON,
+      Data.ToJSONKey,
+      Data.FromXML,
+      Data.ToXML
+    )
+
+pattern ListBulkImportJobsFilter_ALL :: ListBulkImportJobsFilter
+pattern ListBulkImportJobsFilter_ALL = ListBulkImportJobsFilter' "ALL"
+
+pattern ListBulkImportJobsFilter_CANCELLED :: ListBulkImportJobsFilter
+pattern ListBulkImportJobsFilter_CANCELLED = ListBulkImportJobsFilter' "CANCELLED"
+
+pattern ListBulkImportJobsFilter_COMPLETED :: ListBulkImportJobsFilter
+pattern ListBulkImportJobsFilter_COMPLETED = ListBulkImportJobsFilter' "COMPLETED"
+
+pattern ListBulkImportJobsFilter_COMPLETED_WITH_FAILURES :: ListBulkImportJobsFilter
+pattern ListBulkImportJobsFilter_COMPLETED_WITH_FAILURES = ListBulkImportJobsFilter' "COMPLETED_WITH_FAILURES"
+
+pattern ListBulkImportJobsFilter_FAILED :: ListBulkImportJobsFilter
+pattern ListBulkImportJobsFilter_FAILED = ListBulkImportJobsFilter' "FAILED"
+
+pattern ListBulkImportJobsFilter_PENDING :: ListBulkImportJobsFilter
+pattern ListBulkImportJobsFilter_PENDING = ListBulkImportJobsFilter' "PENDING"
+
+pattern ListBulkImportJobsFilter_RUNNING :: ListBulkImportJobsFilter
+pattern ListBulkImportJobsFilter_RUNNING = ListBulkImportJobsFilter' "RUNNING"
+
+{-# COMPLETE
+  ListBulkImportJobsFilter_ALL,
+  ListBulkImportJobsFilter_CANCELLED,
+  ListBulkImportJobsFilter_COMPLETED,
+  ListBulkImportJobsFilter_COMPLETED_WITH_FAILURES,
+  ListBulkImportJobsFilter_FAILED,
+  ListBulkImportJobsFilter_PENDING,
+  ListBulkImportJobsFilter_RUNNING,
+  ListBulkImportJobsFilter'
+  #-}
diff --git a/gen/Amazonka/IoTSiteWise/Types/ListTimeSeriesType.hs b/gen/Amazonka/IoTSiteWise/Types/ListTimeSeriesType.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/IoTSiteWise/Types/ListTimeSeriesType.hs
@@ -0,0 +1,71 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DerivingStrategies #-}
+{-# LANGUAGE GeneralizedNewtypeDeriving #-}
+{-# LANGUAGE LambdaCase #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE PatternSynonyms #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.IoTSiteWise.Types.ListTimeSeriesType
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.IoTSiteWise.Types.ListTimeSeriesType
+  ( ListTimeSeriesType
+      ( ..,
+        ListTimeSeriesType_ASSOCIATED,
+        ListTimeSeriesType_DISASSOCIATED
+      ),
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+newtype ListTimeSeriesType = ListTimeSeriesType'
+  { fromListTimeSeriesType ::
+      Data.Text
+  }
+  deriving stock
+    ( Prelude.Show,
+      Prelude.Read,
+      Prelude.Eq,
+      Prelude.Ord,
+      Prelude.Generic
+    )
+  deriving newtype
+    ( Prelude.Hashable,
+      Prelude.NFData,
+      Data.FromText,
+      Data.ToText,
+      Data.ToByteString,
+      Data.ToLog,
+      Data.ToHeader,
+      Data.ToQuery,
+      Data.FromJSON,
+      Data.FromJSONKey,
+      Data.ToJSON,
+      Data.ToJSONKey,
+      Data.FromXML,
+      Data.ToXML
+    )
+
+pattern ListTimeSeriesType_ASSOCIATED :: ListTimeSeriesType
+pattern ListTimeSeriesType_ASSOCIATED = ListTimeSeriesType' "ASSOCIATED"
+
+pattern ListTimeSeriesType_DISASSOCIATED :: ListTimeSeriesType
+pattern ListTimeSeriesType_DISASSOCIATED = ListTimeSeriesType' "DISASSOCIATED"
+
+{-# COMPLETE
+  ListTimeSeriesType_ASSOCIATED,
+  ListTimeSeriesType_DISASSOCIATED,
+  ListTimeSeriesType'
+  #-}
diff --git a/gen/Amazonka/IoTSiteWise/Types/LoggingLevel.hs b/gen/Amazonka/IoTSiteWise/Types/LoggingLevel.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/IoTSiteWise/Types/LoggingLevel.hs
@@ -0,0 +1,76 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DerivingStrategies #-}
+{-# LANGUAGE GeneralizedNewtypeDeriving #-}
+{-# LANGUAGE LambdaCase #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE PatternSynonyms #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.IoTSiteWise.Types.LoggingLevel
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.IoTSiteWise.Types.LoggingLevel
+  ( LoggingLevel
+      ( ..,
+        LoggingLevel_ERROR,
+        LoggingLevel_INFO,
+        LoggingLevel_OFF
+      ),
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+newtype LoggingLevel = LoggingLevel'
+  { fromLoggingLevel ::
+      Data.Text
+  }
+  deriving stock
+    ( Prelude.Show,
+      Prelude.Read,
+      Prelude.Eq,
+      Prelude.Ord,
+      Prelude.Generic
+    )
+  deriving newtype
+    ( Prelude.Hashable,
+      Prelude.NFData,
+      Data.FromText,
+      Data.ToText,
+      Data.ToByteString,
+      Data.ToLog,
+      Data.ToHeader,
+      Data.ToQuery,
+      Data.FromJSON,
+      Data.FromJSONKey,
+      Data.ToJSON,
+      Data.ToJSONKey,
+      Data.FromXML,
+      Data.ToXML
+    )
+
+pattern LoggingLevel_ERROR :: LoggingLevel
+pattern LoggingLevel_ERROR = LoggingLevel' "ERROR"
+
+pattern LoggingLevel_INFO :: LoggingLevel
+pattern LoggingLevel_INFO = LoggingLevel' "INFO"
+
+pattern LoggingLevel_OFF :: LoggingLevel
+pattern LoggingLevel_OFF = LoggingLevel' "OFF"
+
+{-# COMPLETE
+  LoggingLevel_ERROR,
+  LoggingLevel_INFO,
+  LoggingLevel_OFF,
+  LoggingLevel'
+  #-}
diff --git a/gen/Amazonka/IoTSiteWise/Types/LoggingOptions.hs b/gen/Amazonka/IoTSiteWise/Types/LoggingOptions.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/IoTSiteWise/Types/LoggingOptions.hs
@@ -0,0 +1,77 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.IoTSiteWise.Types.LoggingOptions
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.IoTSiteWise.Types.LoggingOptions where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.IoTSiteWise.Types.LoggingLevel
+import qualified Amazonka.Prelude as Prelude
+
+-- | Contains logging options.
+--
+-- /See:/ 'newLoggingOptions' smart constructor.
+data LoggingOptions = LoggingOptions'
+  { -- | The IoT SiteWise logging verbosity level.
+    level :: LoggingLevel
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'LoggingOptions' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'level', 'loggingOptions_level' - The IoT SiteWise logging verbosity level.
+newLoggingOptions ::
+  -- | 'level'
+  LoggingLevel ->
+  LoggingOptions
+newLoggingOptions pLevel_ =
+  LoggingOptions' {level = pLevel_}
+
+-- | The IoT SiteWise logging verbosity level.
+loggingOptions_level :: Lens.Lens' LoggingOptions LoggingLevel
+loggingOptions_level = Lens.lens (\LoggingOptions' {level} -> level) (\s@LoggingOptions' {} a -> s {level = a} :: LoggingOptions)
+
+instance Data.FromJSON LoggingOptions where
+  parseJSON =
+    Data.withObject
+      "LoggingOptions"
+      ( \x ->
+          LoggingOptions' Prelude.<$> (x Data..: "level")
+      )
+
+instance Prelude.Hashable LoggingOptions where
+  hashWithSalt _salt LoggingOptions' {..} =
+    _salt `Prelude.hashWithSalt` level
+
+instance Prelude.NFData LoggingOptions where
+  rnf LoggingOptions' {..} = Prelude.rnf level
+
+instance Data.ToJSON LoggingOptions where
+  toJSON LoggingOptions' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [Prelude.Just ("level" Data..= level)]
+      )
diff --git a/gen/Amazonka/IoTSiteWise/Types/Measurement.hs b/gen/Amazonka/IoTSiteWise/Types/Measurement.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/IoTSiteWise/Types/Measurement.hs
@@ -0,0 +1,86 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.IoTSiteWise.Types.Measurement
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.IoTSiteWise.Types.Measurement where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.IoTSiteWise.Types.MeasurementProcessingConfig
+import qualified Amazonka.Prelude as Prelude
+
+-- | Contains an asset measurement property. For more information, see
+-- <https://docs.aws.amazon.com/iot-sitewise/latest/userguide/asset-properties.html#measurements Measurements>
+-- in the /IoT SiteWise User Guide/.
+--
+-- /See:/ 'newMeasurement' smart constructor.
+data Measurement = Measurement'
+  { -- | The processing configuration for the given measurement property. You can
+    -- configure measurements to be kept at the edge or forwarded to the Amazon
+    -- Web Services Cloud. By default, measurements are forwarded to the cloud.
+    processingConfig :: Prelude.Maybe MeasurementProcessingConfig
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'Measurement' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'processingConfig', 'measurement_processingConfig' - The processing configuration for the given measurement property. You can
+-- configure measurements to be kept at the edge or forwarded to the Amazon
+-- Web Services Cloud. By default, measurements are forwarded to the cloud.
+newMeasurement ::
+  Measurement
+newMeasurement =
+  Measurement' {processingConfig = Prelude.Nothing}
+
+-- | The processing configuration for the given measurement property. You can
+-- configure measurements to be kept at the edge or forwarded to the Amazon
+-- Web Services Cloud. By default, measurements are forwarded to the cloud.
+measurement_processingConfig :: Lens.Lens' Measurement (Prelude.Maybe MeasurementProcessingConfig)
+measurement_processingConfig = Lens.lens (\Measurement' {processingConfig} -> processingConfig) (\s@Measurement' {} a -> s {processingConfig = a} :: Measurement)
+
+instance Data.FromJSON Measurement where
+  parseJSON =
+    Data.withObject
+      "Measurement"
+      ( \x ->
+          Measurement'
+            Prelude.<$> (x Data..:? "processingConfig")
+      )
+
+instance Prelude.Hashable Measurement where
+  hashWithSalt _salt Measurement' {..} =
+    _salt `Prelude.hashWithSalt` processingConfig
+
+instance Prelude.NFData Measurement where
+  rnf Measurement' {..} = Prelude.rnf processingConfig
+
+instance Data.ToJSON Measurement where
+  toJSON Measurement' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("processingConfig" Data..=)
+              Prelude.<$> processingConfig
+          ]
+      )
diff --git a/gen/Amazonka/IoTSiteWise/Types/MeasurementProcessingConfig.hs b/gen/Amazonka/IoTSiteWise/Types/MeasurementProcessingConfig.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/IoTSiteWise/Types/MeasurementProcessingConfig.hs
@@ -0,0 +1,86 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.IoTSiteWise.Types.MeasurementProcessingConfig
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.IoTSiteWise.Types.MeasurementProcessingConfig where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.IoTSiteWise.Types.ForwardingConfig
+import qualified Amazonka.Prelude as Prelude
+
+-- | The processing configuration for the given measurement property. You can
+-- configure measurements to be kept at the edge or forwarded to the Amazon
+-- Web Services Cloud. By default, measurements are forwarded to the cloud.
+--
+-- /See:/ 'newMeasurementProcessingConfig' smart constructor.
+data MeasurementProcessingConfig = MeasurementProcessingConfig'
+  { -- | The forwarding configuration for the given measurement property.
+    forwardingConfig :: ForwardingConfig
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'MeasurementProcessingConfig' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'forwardingConfig', 'measurementProcessingConfig_forwardingConfig' - The forwarding configuration for the given measurement property.
+newMeasurementProcessingConfig ::
+  -- | 'forwardingConfig'
+  ForwardingConfig ->
+  MeasurementProcessingConfig
+newMeasurementProcessingConfig pForwardingConfig_ =
+  MeasurementProcessingConfig'
+    { forwardingConfig =
+        pForwardingConfig_
+    }
+
+-- | The forwarding configuration for the given measurement property.
+measurementProcessingConfig_forwardingConfig :: Lens.Lens' MeasurementProcessingConfig ForwardingConfig
+measurementProcessingConfig_forwardingConfig = Lens.lens (\MeasurementProcessingConfig' {forwardingConfig} -> forwardingConfig) (\s@MeasurementProcessingConfig' {} a -> s {forwardingConfig = a} :: MeasurementProcessingConfig)
+
+instance Data.FromJSON MeasurementProcessingConfig where
+  parseJSON =
+    Data.withObject
+      "MeasurementProcessingConfig"
+      ( \x ->
+          MeasurementProcessingConfig'
+            Prelude.<$> (x Data..: "forwardingConfig")
+      )
+
+instance Prelude.Hashable MeasurementProcessingConfig where
+  hashWithSalt _salt MeasurementProcessingConfig' {..} =
+    _salt `Prelude.hashWithSalt` forwardingConfig
+
+instance Prelude.NFData MeasurementProcessingConfig where
+  rnf MeasurementProcessingConfig' {..} =
+    Prelude.rnf forwardingConfig
+
+instance Data.ToJSON MeasurementProcessingConfig where
+  toJSON MeasurementProcessingConfig' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ Prelude.Just
+              ("forwardingConfig" Data..= forwardingConfig)
+          ]
+      )
diff --git a/gen/Amazonka/IoTSiteWise/Types/Metric.hs b/gen/Amazonka/IoTSiteWise/Types/Metric.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/IoTSiteWise/Types/Metric.hs
@@ -0,0 +1,170 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.IoTSiteWise.Types.Metric
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.IoTSiteWise.Types.Metric where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.IoTSiteWise.Types.ExpressionVariable
+import Amazonka.IoTSiteWise.Types.MetricProcessingConfig
+import Amazonka.IoTSiteWise.Types.MetricWindow
+import qualified Amazonka.Prelude as Prelude
+
+-- | Contains an asset metric property. With metrics, you can calculate
+-- aggregate functions, such as an average, maximum, or minimum, as
+-- specified through an expression. A metric maps several values to a
+-- single value (such as a sum).
+--
+-- The maximum number of dependent\/cascading variables used in any one
+-- metric calculation is 10. Therefore, a /root/ metric can have up to 10
+-- cascading metrics in its computational dependency tree. Additionally, a
+-- metric can only have a data type of @DOUBLE@ and consume properties with
+-- data types of @INTEGER@ or @DOUBLE@.
+--
+-- For more information, see
+-- <https://docs.aws.amazon.com/iot-sitewise/latest/userguide/asset-properties.html#metrics Metrics>
+-- in the /IoT SiteWise User Guide/.
+--
+-- /See:/ 'newMetric' smart constructor.
+data Metric = Metric'
+  { -- | The processing configuration for the given metric property. You can
+    -- configure metrics to be computed at the edge or in the Amazon Web
+    -- Services Cloud. By default, metrics are forwarded to the cloud.
+    processingConfig :: Prelude.Maybe MetricProcessingConfig,
+    -- | The mathematical expression that defines the metric aggregation
+    -- function. You can specify up to 10 variables per expression. You can
+    -- specify up to 10 functions per expression.
+    --
+    -- For more information, see
+    -- <https://docs.aws.amazon.com/iot-sitewise/latest/userguide/quotas.html Quotas>
+    -- in the /IoT SiteWise User Guide/.
+    expression :: Prelude.Text,
+    -- | The list of variables used in the expression.
+    variables :: [ExpressionVariable],
+    -- | The window (time interval) over which IoT SiteWise computes the
+    -- metric\'s aggregation expression. IoT SiteWise computes one data point
+    -- per @window@.
+    window :: MetricWindow
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'Metric' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'processingConfig', 'metric_processingConfig' - The processing configuration for the given metric property. You can
+-- configure metrics to be computed at the edge or in the Amazon Web
+-- Services Cloud. By default, metrics are forwarded to the cloud.
+--
+-- 'expression', 'metric_expression' - The mathematical expression that defines the metric aggregation
+-- function. You can specify up to 10 variables per expression. You can
+-- specify up to 10 functions per expression.
+--
+-- For more information, see
+-- <https://docs.aws.amazon.com/iot-sitewise/latest/userguide/quotas.html Quotas>
+-- in the /IoT SiteWise User Guide/.
+--
+-- 'variables', 'metric_variables' - The list of variables used in the expression.
+--
+-- 'window', 'metric_window' - The window (time interval) over which IoT SiteWise computes the
+-- metric\'s aggregation expression. IoT SiteWise computes one data point
+-- per @window@.
+newMetric ::
+  -- | 'expression'
+  Prelude.Text ->
+  -- | 'window'
+  MetricWindow ->
+  Metric
+newMetric pExpression_ pWindow_ =
+  Metric'
+    { processingConfig = Prelude.Nothing,
+      expression = pExpression_,
+      variables = Prelude.mempty,
+      window = pWindow_
+    }
+
+-- | The processing configuration for the given metric property. You can
+-- configure metrics to be computed at the edge or in the Amazon Web
+-- Services Cloud. By default, metrics are forwarded to the cloud.
+metric_processingConfig :: Lens.Lens' Metric (Prelude.Maybe MetricProcessingConfig)
+metric_processingConfig = Lens.lens (\Metric' {processingConfig} -> processingConfig) (\s@Metric' {} a -> s {processingConfig = a} :: Metric)
+
+-- | The mathematical expression that defines the metric aggregation
+-- function. You can specify up to 10 variables per expression. You can
+-- specify up to 10 functions per expression.
+--
+-- For more information, see
+-- <https://docs.aws.amazon.com/iot-sitewise/latest/userguide/quotas.html Quotas>
+-- in the /IoT SiteWise User Guide/.
+metric_expression :: Lens.Lens' Metric Prelude.Text
+metric_expression = Lens.lens (\Metric' {expression} -> expression) (\s@Metric' {} a -> s {expression = a} :: Metric)
+
+-- | The list of variables used in the expression.
+metric_variables :: Lens.Lens' Metric [ExpressionVariable]
+metric_variables = Lens.lens (\Metric' {variables} -> variables) (\s@Metric' {} a -> s {variables = a} :: Metric) Prelude.. Lens.coerced
+
+-- | The window (time interval) over which IoT SiteWise computes the
+-- metric\'s aggregation expression. IoT SiteWise computes one data point
+-- per @window@.
+metric_window :: Lens.Lens' Metric MetricWindow
+metric_window = Lens.lens (\Metric' {window} -> window) (\s@Metric' {} a -> s {window = a} :: Metric)
+
+instance Data.FromJSON Metric where
+  parseJSON =
+    Data.withObject
+      "Metric"
+      ( \x ->
+          Metric'
+            Prelude.<$> (x Data..:? "processingConfig")
+            Prelude.<*> (x Data..: "expression")
+            Prelude.<*> (x Data..:? "variables" Data..!= Prelude.mempty)
+            Prelude.<*> (x Data..: "window")
+      )
+
+instance Prelude.Hashable Metric where
+  hashWithSalt _salt Metric' {..} =
+    _salt
+      `Prelude.hashWithSalt` processingConfig
+      `Prelude.hashWithSalt` expression
+      `Prelude.hashWithSalt` variables
+      `Prelude.hashWithSalt` window
+
+instance Prelude.NFData Metric where
+  rnf Metric' {..} =
+    Prelude.rnf processingConfig
+      `Prelude.seq` Prelude.rnf expression
+      `Prelude.seq` Prelude.rnf variables
+      `Prelude.seq` Prelude.rnf window
+
+instance Data.ToJSON Metric where
+  toJSON Metric' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("processingConfig" Data..=)
+              Prelude.<$> processingConfig,
+            Prelude.Just ("expression" Data..= expression),
+            Prelude.Just ("variables" Data..= variables),
+            Prelude.Just ("window" Data..= window)
+          ]
+      )
diff --git a/gen/Amazonka/IoTSiteWise/Types/MetricProcessingConfig.hs b/gen/Amazonka/IoTSiteWise/Types/MetricProcessingConfig.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/IoTSiteWise/Types/MetricProcessingConfig.hs
@@ -0,0 +1,86 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.IoTSiteWise.Types.MetricProcessingConfig
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.IoTSiteWise.Types.MetricProcessingConfig where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.IoTSiteWise.Types.ComputeLocation
+import qualified Amazonka.Prelude as Prelude
+
+-- | The processing configuration for the given metric property. You can
+-- configure metrics to be computed at the edge or in the Amazon Web
+-- Services Cloud. By default, metrics are forwarded to the cloud.
+--
+-- /See:/ 'newMetricProcessingConfig' smart constructor.
+data MetricProcessingConfig = MetricProcessingConfig'
+  { -- | The compute location for the given metric property.
+    computeLocation :: ComputeLocation
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'MetricProcessingConfig' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'computeLocation', 'metricProcessingConfig_computeLocation' - The compute location for the given metric property.
+newMetricProcessingConfig ::
+  -- | 'computeLocation'
+  ComputeLocation ->
+  MetricProcessingConfig
+newMetricProcessingConfig pComputeLocation_ =
+  MetricProcessingConfig'
+    { computeLocation =
+        pComputeLocation_
+    }
+
+-- | The compute location for the given metric property.
+metricProcessingConfig_computeLocation :: Lens.Lens' MetricProcessingConfig ComputeLocation
+metricProcessingConfig_computeLocation = Lens.lens (\MetricProcessingConfig' {computeLocation} -> computeLocation) (\s@MetricProcessingConfig' {} a -> s {computeLocation = a} :: MetricProcessingConfig)
+
+instance Data.FromJSON MetricProcessingConfig where
+  parseJSON =
+    Data.withObject
+      "MetricProcessingConfig"
+      ( \x ->
+          MetricProcessingConfig'
+            Prelude.<$> (x Data..: "computeLocation")
+      )
+
+instance Prelude.Hashable MetricProcessingConfig where
+  hashWithSalt _salt MetricProcessingConfig' {..} =
+    _salt `Prelude.hashWithSalt` computeLocation
+
+instance Prelude.NFData MetricProcessingConfig where
+  rnf MetricProcessingConfig' {..} =
+    Prelude.rnf computeLocation
+
+instance Data.ToJSON MetricProcessingConfig where
+  toJSON MetricProcessingConfig' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ Prelude.Just
+              ("computeLocation" Data..= computeLocation)
+          ]
+      )
diff --git a/gen/Amazonka/IoTSiteWise/Types/MetricWindow.hs b/gen/Amazonka/IoTSiteWise/Types/MetricWindow.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/IoTSiteWise/Types/MetricWindow.hs
@@ -0,0 +1,76 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.IoTSiteWise.Types.MetricWindow
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.IoTSiteWise.Types.MetricWindow where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.IoTSiteWise.Types.TumblingWindow
+import qualified Amazonka.Prelude as Prelude
+
+-- | Contains a time interval window used for data aggregate computations
+-- (for example, average, sum, count, and so on).
+--
+-- /See:/ 'newMetricWindow' smart constructor.
+data MetricWindow = MetricWindow'
+  { -- | The tumbling time interval window.
+    tumbling :: Prelude.Maybe TumblingWindow
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'MetricWindow' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'tumbling', 'metricWindow_tumbling' - The tumbling time interval window.
+newMetricWindow ::
+  MetricWindow
+newMetricWindow =
+  MetricWindow' {tumbling = Prelude.Nothing}
+
+-- | The tumbling time interval window.
+metricWindow_tumbling :: Lens.Lens' MetricWindow (Prelude.Maybe TumblingWindow)
+metricWindow_tumbling = Lens.lens (\MetricWindow' {tumbling} -> tumbling) (\s@MetricWindow' {} a -> s {tumbling = a} :: MetricWindow)
+
+instance Data.FromJSON MetricWindow where
+  parseJSON =
+    Data.withObject
+      "MetricWindow"
+      ( \x ->
+          MetricWindow' Prelude.<$> (x Data..:? "tumbling")
+      )
+
+instance Prelude.Hashable MetricWindow where
+  hashWithSalt _salt MetricWindow' {..} =
+    _salt `Prelude.hashWithSalt` tumbling
+
+instance Prelude.NFData MetricWindow where
+  rnf MetricWindow' {..} = Prelude.rnf tumbling
+
+instance Data.ToJSON MetricWindow where
+  toJSON MetricWindow' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [("tumbling" Data..=) Prelude.<$> tumbling]
+      )
diff --git a/gen/Amazonka/IoTSiteWise/Types/MonitorErrorCode.hs b/gen/Amazonka/IoTSiteWise/Types/MonitorErrorCode.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/IoTSiteWise/Types/MonitorErrorCode.hs
@@ -0,0 +1,76 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DerivingStrategies #-}
+{-# LANGUAGE GeneralizedNewtypeDeriving #-}
+{-# LANGUAGE LambdaCase #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE PatternSynonyms #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.IoTSiteWise.Types.MonitorErrorCode
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.IoTSiteWise.Types.MonitorErrorCode
+  ( MonitorErrorCode
+      ( ..,
+        MonitorErrorCode_INTERNAL_FAILURE,
+        MonitorErrorCode_LIMIT_EXCEEDED,
+        MonitorErrorCode_VALIDATION_ERROR
+      ),
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+newtype MonitorErrorCode = MonitorErrorCode'
+  { fromMonitorErrorCode ::
+      Data.Text
+  }
+  deriving stock
+    ( Prelude.Show,
+      Prelude.Read,
+      Prelude.Eq,
+      Prelude.Ord,
+      Prelude.Generic
+    )
+  deriving newtype
+    ( Prelude.Hashable,
+      Prelude.NFData,
+      Data.FromText,
+      Data.ToText,
+      Data.ToByteString,
+      Data.ToLog,
+      Data.ToHeader,
+      Data.ToQuery,
+      Data.FromJSON,
+      Data.FromJSONKey,
+      Data.ToJSON,
+      Data.ToJSONKey,
+      Data.FromXML,
+      Data.ToXML
+    )
+
+pattern MonitorErrorCode_INTERNAL_FAILURE :: MonitorErrorCode
+pattern MonitorErrorCode_INTERNAL_FAILURE = MonitorErrorCode' "INTERNAL_FAILURE"
+
+pattern MonitorErrorCode_LIMIT_EXCEEDED :: MonitorErrorCode
+pattern MonitorErrorCode_LIMIT_EXCEEDED = MonitorErrorCode' "LIMIT_EXCEEDED"
+
+pattern MonitorErrorCode_VALIDATION_ERROR :: MonitorErrorCode
+pattern MonitorErrorCode_VALIDATION_ERROR = MonitorErrorCode' "VALIDATION_ERROR"
+
+{-# COMPLETE
+  MonitorErrorCode_INTERNAL_FAILURE,
+  MonitorErrorCode_LIMIT_EXCEEDED,
+  MonitorErrorCode_VALIDATION_ERROR,
+  MonitorErrorCode'
+  #-}
diff --git a/gen/Amazonka/IoTSiteWise/Types/MonitorErrorDetails.hs b/gen/Amazonka/IoTSiteWise/Types/MonitorErrorDetails.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/IoTSiteWise/Types/MonitorErrorDetails.hs
@@ -0,0 +1,84 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.IoTSiteWise.Types.MonitorErrorDetails
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.IoTSiteWise.Types.MonitorErrorDetails where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.IoTSiteWise.Types.MonitorErrorCode
+import qualified Amazonka.Prelude as Prelude
+
+-- | Contains IoT SiteWise Monitor error details.
+--
+-- /See:/ 'newMonitorErrorDetails' smart constructor.
+data MonitorErrorDetails = MonitorErrorDetails'
+  { -- | The error code.
+    code :: Prelude.Maybe MonitorErrorCode,
+    -- | The error message.
+    message :: Prelude.Maybe Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'MonitorErrorDetails' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'code', 'monitorErrorDetails_code' - The error code.
+--
+-- 'message', 'monitorErrorDetails_message' - The error message.
+newMonitorErrorDetails ::
+  MonitorErrorDetails
+newMonitorErrorDetails =
+  MonitorErrorDetails'
+    { code = Prelude.Nothing,
+      message = Prelude.Nothing
+    }
+
+-- | The error code.
+monitorErrorDetails_code :: Lens.Lens' MonitorErrorDetails (Prelude.Maybe MonitorErrorCode)
+monitorErrorDetails_code = Lens.lens (\MonitorErrorDetails' {code} -> code) (\s@MonitorErrorDetails' {} a -> s {code = a} :: MonitorErrorDetails)
+
+-- | The error message.
+monitorErrorDetails_message :: Lens.Lens' MonitorErrorDetails (Prelude.Maybe Prelude.Text)
+monitorErrorDetails_message = Lens.lens (\MonitorErrorDetails' {message} -> message) (\s@MonitorErrorDetails' {} a -> s {message = a} :: MonitorErrorDetails)
+
+instance Data.FromJSON MonitorErrorDetails where
+  parseJSON =
+    Data.withObject
+      "MonitorErrorDetails"
+      ( \x ->
+          MonitorErrorDetails'
+            Prelude.<$> (x Data..:? "code")
+            Prelude.<*> (x Data..:? "message")
+      )
+
+instance Prelude.Hashable MonitorErrorDetails where
+  hashWithSalt _salt MonitorErrorDetails' {..} =
+    _salt
+      `Prelude.hashWithSalt` code
+      `Prelude.hashWithSalt` message
+
+instance Prelude.NFData MonitorErrorDetails where
+  rnf MonitorErrorDetails' {..} =
+    Prelude.rnf code `Prelude.seq` Prelude.rnf message
diff --git a/gen/Amazonka/IoTSiteWise/Types/MultiLayerStorage.hs b/gen/Amazonka/IoTSiteWise/Types/MultiLayerStorage.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/IoTSiteWise/Types/MultiLayerStorage.hs
@@ -0,0 +1,87 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.IoTSiteWise.Types.MultiLayerStorage
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.IoTSiteWise.Types.MultiLayerStorage where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.IoTSiteWise.Types.CustomerManagedS3Storage
+import qualified Amazonka.Prelude as Prelude
+
+-- | Contains information about the storage destination.
+--
+-- /See:/ 'newMultiLayerStorage' smart constructor.
+data MultiLayerStorage = MultiLayerStorage'
+  { -- | Contains information about a customer managed Amazon S3 bucket.
+    customerManagedS3Storage :: CustomerManagedS3Storage
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'MultiLayerStorage' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'customerManagedS3Storage', 'multiLayerStorage_customerManagedS3Storage' - Contains information about a customer managed Amazon S3 bucket.
+newMultiLayerStorage ::
+  -- | 'customerManagedS3Storage'
+  CustomerManagedS3Storage ->
+  MultiLayerStorage
+newMultiLayerStorage pCustomerManagedS3Storage_ =
+  MultiLayerStorage'
+    { customerManagedS3Storage =
+        pCustomerManagedS3Storage_
+    }
+
+-- | Contains information about a customer managed Amazon S3 bucket.
+multiLayerStorage_customerManagedS3Storage :: Lens.Lens' MultiLayerStorage CustomerManagedS3Storage
+multiLayerStorage_customerManagedS3Storage = Lens.lens (\MultiLayerStorage' {customerManagedS3Storage} -> customerManagedS3Storage) (\s@MultiLayerStorage' {} a -> s {customerManagedS3Storage = a} :: MultiLayerStorage)
+
+instance Data.FromJSON MultiLayerStorage where
+  parseJSON =
+    Data.withObject
+      "MultiLayerStorage"
+      ( \x ->
+          MultiLayerStorage'
+            Prelude.<$> (x Data..: "customerManagedS3Storage")
+      )
+
+instance Prelude.Hashable MultiLayerStorage where
+  hashWithSalt _salt MultiLayerStorage' {..} =
+    _salt
+      `Prelude.hashWithSalt` customerManagedS3Storage
+
+instance Prelude.NFData MultiLayerStorage where
+  rnf MultiLayerStorage' {..} =
+    Prelude.rnf customerManagedS3Storage
+
+instance Data.ToJSON MultiLayerStorage where
+  toJSON MultiLayerStorage' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ Prelude.Just
+              ( "customerManagedS3Storage"
+                  Data..= customerManagedS3Storage
+              )
+          ]
+      )
diff --git a/gen/Amazonka/IoTSiteWise/Types/Permission.hs b/gen/Amazonka/IoTSiteWise/Types/Permission.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/IoTSiteWise/Types/Permission.hs
@@ -0,0 +1,71 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DerivingStrategies #-}
+{-# LANGUAGE GeneralizedNewtypeDeriving #-}
+{-# LANGUAGE LambdaCase #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE PatternSynonyms #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.IoTSiteWise.Types.Permission
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.IoTSiteWise.Types.Permission
+  ( Permission
+      ( ..,
+        Permission_ADMINISTRATOR,
+        Permission_VIEWER
+      ),
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+newtype Permission = Permission'
+  { fromPermission ::
+      Data.Text
+  }
+  deriving stock
+    ( Prelude.Show,
+      Prelude.Read,
+      Prelude.Eq,
+      Prelude.Ord,
+      Prelude.Generic
+    )
+  deriving newtype
+    ( Prelude.Hashable,
+      Prelude.NFData,
+      Data.FromText,
+      Data.ToText,
+      Data.ToByteString,
+      Data.ToLog,
+      Data.ToHeader,
+      Data.ToQuery,
+      Data.FromJSON,
+      Data.FromJSONKey,
+      Data.ToJSON,
+      Data.ToJSONKey,
+      Data.FromXML,
+      Data.ToXML
+    )
+
+pattern Permission_ADMINISTRATOR :: Permission
+pattern Permission_ADMINISTRATOR = Permission' "ADMINISTRATOR"
+
+pattern Permission_VIEWER :: Permission
+pattern Permission_VIEWER = Permission' "VIEWER"
+
+{-# COMPLETE
+  Permission_ADMINISTRATOR,
+  Permission_VIEWER,
+  Permission'
+  #-}
diff --git a/gen/Amazonka/IoTSiteWise/Types/PortalResource.hs b/gen/Amazonka/IoTSiteWise/Types/PortalResource.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/IoTSiteWise/Types/PortalResource.hs
@@ -0,0 +1,71 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.IoTSiteWise.Types.PortalResource
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.IoTSiteWise.Types.PortalResource where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+-- | Identifies an IoT SiteWise Monitor portal.
+--
+-- /See:/ 'newPortalResource' smart constructor.
+data PortalResource = PortalResource'
+  { -- | The ID of the portal.
+    id :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'PortalResource' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'id', 'portalResource_id' - The ID of the portal.
+newPortalResource ::
+  -- | 'id'
+  Prelude.Text ->
+  PortalResource
+newPortalResource pId_ = PortalResource' {id = pId_}
+
+-- | The ID of the portal.
+portalResource_id :: Lens.Lens' PortalResource Prelude.Text
+portalResource_id = Lens.lens (\PortalResource' {id} -> id) (\s@PortalResource' {} a -> s {id = a} :: PortalResource)
+
+instance Data.FromJSON PortalResource where
+  parseJSON =
+    Data.withObject
+      "PortalResource"
+      (\x -> PortalResource' Prelude.<$> (x Data..: "id"))
+
+instance Prelude.Hashable PortalResource where
+  hashWithSalt _salt PortalResource' {..} =
+    _salt `Prelude.hashWithSalt` id
+
+instance Prelude.NFData PortalResource where
+  rnf PortalResource' {..} = Prelude.rnf id
+
+instance Data.ToJSON PortalResource where
+  toJSON PortalResource' {..} =
+    Data.object
+      (Prelude.catMaybes [Prelude.Just ("id" Data..= id)])
diff --git a/gen/Amazonka/IoTSiteWise/Types/PortalState.hs b/gen/Amazonka/IoTSiteWise/Types/PortalState.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/IoTSiteWise/Types/PortalState.hs
@@ -0,0 +1,86 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DerivingStrategies #-}
+{-# LANGUAGE GeneralizedNewtypeDeriving #-}
+{-# LANGUAGE LambdaCase #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE PatternSynonyms #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.IoTSiteWise.Types.PortalState
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.IoTSiteWise.Types.PortalState
+  ( PortalState
+      ( ..,
+        PortalState_ACTIVE,
+        PortalState_CREATING,
+        PortalState_DELETING,
+        PortalState_FAILED,
+        PortalState_UPDATING
+      ),
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+newtype PortalState = PortalState'
+  { fromPortalState ::
+      Data.Text
+  }
+  deriving stock
+    ( Prelude.Show,
+      Prelude.Read,
+      Prelude.Eq,
+      Prelude.Ord,
+      Prelude.Generic
+    )
+  deriving newtype
+    ( Prelude.Hashable,
+      Prelude.NFData,
+      Data.FromText,
+      Data.ToText,
+      Data.ToByteString,
+      Data.ToLog,
+      Data.ToHeader,
+      Data.ToQuery,
+      Data.FromJSON,
+      Data.FromJSONKey,
+      Data.ToJSON,
+      Data.ToJSONKey,
+      Data.FromXML,
+      Data.ToXML
+    )
+
+pattern PortalState_ACTIVE :: PortalState
+pattern PortalState_ACTIVE = PortalState' "ACTIVE"
+
+pattern PortalState_CREATING :: PortalState
+pattern PortalState_CREATING = PortalState' "CREATING"
+
+pattern PortalState_DELETING :: PortalState
+pattern PortalState_DELETING = PortalState' "DELETING"
+
+pattern PortalState_FAILED :: PortalState
+pattern PortalState_FAILED = PortalState' "FAILED"
+
+pattern PortalState_UPDATING :: PortalState
+pattern PortalState_UPDATING = PortalState' "UPDATING"
+
+{-# COMPLETE
+  PortalState_ACTIVE,
+  PortalState_CREATING,
+  PortalState_DELETING,
+  PortalState_FAILED,
+  PortalState_UPDATING,
+  PortalState'
+  #-}
diff --git a/gen/Amazonka/IoTSiteWise/Types/PortalStatus.hs b/gen/Amazonka/IoTSiteWise/Types/PortalStatus.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/IoTSiteWise/Types/PortalStatus.hs
@@ -0,0 +1,87 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.IoTSiteWise.Types.PortalStatus
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.IoTSiteWise.Types.PortalStatus where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.IoTSiteWise.Types.MonitorErrorDetails
+import Amazonka.IoTSiteWise.Types.PortalState
+import qualified Amazonka.Prelude as Prelude
+
+-- | Contains information about the current status of a portal.
+--
+-- /See:/ 'newPortalStatus' smart constructor.
+data PortalStatus = PortalStatus'
+  { -- | Contains associated error information, if any.
+    error :: Prelude.Maybe MonitorErrorDetails,
+    -- | The current state of the portal.
+    state :: PortalState
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'PortalStatus' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'error', 'portalStatus_error' - Contains associated error information, if any.
+--
+-- 'state', 'portalStatus_state' - The current state of the portal.
+newPortalStatus ::
+  -- | 'state'
+  PortalState ->
+  PortalStatus
+newPortalStatus pState_ =
+  PortalStatus'
+    { error = Prelude.Nothing,
+      state = pState_
+    }
+
+-- | Contains associated error information, if any.
+portalStatus_error :: Lens.Lens' PortalStatus (Prelude.Maybe MonitorErrorDetails)
+portalStatus_error = Lens.lens (\PortalStatus' {error} -> error) (\s@PortalStatus' {} a -> s {error = a} :: PortalStatus)
+
+-- | The current state of the portal.
+portalStatus_state :: Lens.Lens' PortalStatus PortalState
+portalStatus_state = Lens.lens (\PortalStatus' {state} -> state) (\s@PortalStatus' {} a -> s {state = a} :: PortalStatus)
+
+instance Data.FromJSON PortalStatus where
+  parseJSON =
+    Data.withObject
+      "PortalStatus"
+      ( \x ->
+          PortalStatus'
+            Prelude.<$> (x Data..:? "error")
+            Prelude.<*> (x Data..: "state")
+      )
+
+instance Prelude.Hashable PortalStatus where
+  hashWithSalt _salt PortalStatus' {..} =
+    _salt
+      `Prelude.hashWithSalt` error
+      `Prelude.hashWithSalt` state
+
+instance Prelude.NFData PortalStatus where
+  rnf PortalStatus' {..} =
+    Prelude.rnf error `Prelude.seq` Prelude.rnf state
diff --git a/gen/Amazonka/IoTSiteWise/Types/PortalSummary.hs b/gen/Amazonka/IoTSiteWise/Types/PortalSummary.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/IoTSiteWise/Types/PortalSummary.hs
@@ -0,0 +1,188 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.IoTSiteWise.Types.PortalSummary
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.IoTSiteWise.Types.PortalSummary where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.IoTSiteWise.Types.PortalStatus
+import qualified Amazonka.Prelude as Prelude
+
+-- | Contains a portal summary.
+--
+-- /See:/ 'newPortalSummary' smart constructor.
+data PortalSummary = PortalSummary'
+  { -- | The date the portal was created, in Unix epoch time.
+    creationDate :: Prelude.Maybe Data.POSIX,
+    -- | The portal\'s description.
+    description :: Prelude.Maybe Prelude.Text,
+    -- | The date the portal was last updated, in Unix epoch time.
+    lastUpdateDate :: Prelude.Maybe Data.POSIX,
+    -- | The
+    -- <https://docs.aws.amazon.com/general/latest/gr/aws-arns-and-namespaces.html ARN>
+    -- of the service role that allows the portal\'s users to access your IoT
+    -- SiteWise resources on your behalf. For more information, see
+    -- <https://docs.aws.amazon.com/iot-sitewise/latest/userguide/monitor-service-role.html Using service roles for IoT SiteWise Monitor>
+    -- in the /IoT SiteWise User Guide/.
+    roleArn :: Prelude.Maybe Prelude.Text,
+    -- | The ID of the portal.
+    id :: Prelude.Text,
+    -- | The name of the portal.
+    name :: Prelude.Text,
+    -- | The URL for the IoT SiteWise Monitor portal. You can use this URL to
+    -- access portals that use IAM Identity Center for authentication. For
+    -- portals that use IAM for authentication, you must use the IoT SiteWise
+    -- console to get a URL that you can use to access the portal.
+    startUrl :: Prelude.Text,
+    status :: PortalStatus
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'PortalSummary' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'creationDate', 'portalSummary_creationDate' - The date the portal was created, in Unix epoch time.
+--
+-- 'description', 'portalSummary_description' - The portal\'s description.
+--
+-- 'lastUpdateDate', 'portalSummary_lastUpdateDate' - The date the portal was last updated, in Unix epoch time.
+--
+-- 'roleArn', 'portalSummary_roleArn' - The
+-- <https://docs.aws.amazon.com/general/latest/gr/aws-arns-and-namespaces.html ARN>
+-- of the service role that allows the portal\'s users to access your IoT
+-- SiteWise resources on your behalf. For more information, see
+-- <https://docs.aws.amazon.com/iot-sitewise/latest/userguide/monitor-service-role.html Using service roles for IoT SiteWise Monitor>
+-- in the /IoT SiteWise User Guide/.
+--
+-- 'id', 'portalSummary_id' - The ID of the portal.
+--
+-- 'name', 'portalSummary_name' - The name of the portal.
+--
+-- 'startUrl', 'portalSummary_startUrl' - The URL for the IoT SiteWise Monitor portal. You can use this URL to
+-- access portals that use IAM Identity Center for authentication. For
+-- portals that use IAM for authentication, you must use the IoT SiteWise
+-- console to get a URL that you can use to access the portal.
+--
+-- 'status', 'portalSummary_status' - Undocumented member.
+newPortalSummary ::
+  -- | 'id'
+  Prelude.Text ->
+  -- | 'name'
+  Prelude.Text ->
+  -- | 'startUrl'
+  Prelude.Text ->
+  -- | 'status'
+  PortalStatus ->
+  PortalSummary
+newPortalSummary pId_ pName_ pStartUrl_ pStatus_ =
+  PortalSummary'
+    { creationDate = Prelude.Nothing,
+      description = Prelude.Nothing,
+      lastUpdateDate = Prelude.Nothing,
+      roleArn = Prelude.Nothing,
+      id = pId_,
+      name = pName_,
+      startUrl = pStartUrl_,
+      status = pStatus_
+    }
+
+-- | The date the portal was created, in Unix epoch time.
+portalSummary_creationDate :: Lens.Lens' PortalSummary (Prelude.Maybe Prelude.UTCTime)
+portalSummary_creationDate = Lens.lens (\PortalSummary' {creationDate} -> creationDate) (\s@PortalSummary' {} a -> s {creationDate = a} :: PortalSummary) Prelude.. Lens.mapping Data._Time
+
+-- | The portal\'s description.
+portalSummary_description :: Lens.Lens' PortalSummary (Prelude.Maybe Prelude.Text)
+portalSummary_description = Lens.lens (\PortalSummary' {description} -> description) (\s@PortalSummary' {} a -> s {description = a} :: PortalSummary)
+
+-- | The date the portal was last updated, in Unix epoch time.
+portalSummary_lastUpdateDate :: Lens.Lens' PortalSummary (Prelude.Maybe Prelude.UTCTime)
+portalSummary_lastUpdateDate = Lens.lens (\PortalSummary' {lastUpdateDate} -> lastUpdateDate) (\s@PortalSummary' {} a -> s {lastUpdateDate = a} :: PortalSummary) Prelude.. Lens.mapping Data._Time
+
+-- | The
+-- <https://docs.aws.amazon.com/general/latest/gr/aws-arns-and-namespaces.html ARN>
+-- of the service role that allows the portal\'s users to access your IoT
+-- SiteWise resources on your behalf. For more information, see
+-- <https://docs.aws.amazon.com/iot-sitewise/latest/userguide/monitor-service-role.html Using service roles for IoT SiteWise Monitor>
+-- in the /IoT SiteWise User Guide/.
+portalSummary_roleArn :: Lens.Lens' PortalSummary (Prelude.Maybe Prelude.Text)
+portalSummary_roleArn = Lens.lens (\PortalSummary' {roleArn} -> roleArn) (\s@PortalSummary' {} a -> s {roleArn = a} :: PortalSummary)
+
+-- | The ID of the portal.
+portalSummary_id :: Lens.Lens' PortalSummary Prelude.Text
+portalSummary_id = Lens.lens (\PortalSummary' {id} -> id) (\s@PortalSummary' {} a -> s {id = a} :: PortalSummary)
+
+-- | The name of the portal.
+portalSummary_name :: Lens.Lens' PortalSummary Prelude.Text
+portalSummary_name = Lens.lens (\PortalSummary' {name} -> name) (\s@PortalSummary' {} a -> s {name = a} :: PortalSummary)
+
+-- | The URL for the IoT SiteWise Monitor portal. You can use this URL to
+-- access portals that use IAM Identity Center for authentication. For
+-- portals that use IAM for authentication, you must use the IoT SiteWise
+-- console to get a URL that you can use to access the portal.
+portalSummary_startUrl :: Lens.Lens' PortalSummary Prelude.Text
+portalSummary_startUrl = Lens.lens (\PortalSummary' {startUrl} -> startUrl) (\s@PortalSummary' {} a -> s {startUrl = a} :: PortalSummary)
+
+-- | Undocumented member.
+portalSummary_status :: Lens.Lens' PortalSummary PortalStatus
+portalSummary_status = Lens.lens (\PortalSummary' {status} -> status) (\s@PortalSummary' {} a -> s {status = a} :: PortalSummary)
+
+instance Data.FromJSON PortalSummary where
+  parseJSON =
+    Data.withObject
+      "PortalSummary"
+      ( \x ->
+          PortalSummary'
+            Prelude.<$> (x Data..:? "creationDate")
+            Prelude.<*> (x Data..:? "description")
+            Prelude.<*> (x Data..:? "lastUpdateDate")
+            Prelude.<*> (x Data..:? "roleArn")
+            Prelude.<*> (x Data..: "id")
+            Prelude.<*> (x Data..: "name")
+            Prelude.<*> (x Data..: "startUrl")
+            Prelude.<*> (x Data..: "status")
+      )
+
+instance Prelude.Hashable PortalSummary where
+  hashWithSalt _salt PortalSummary' {..} =
+    _salt
+      `Prelude.hashWithSalt` creationDate
+      `Prelude.hashWithSalt` description
+      `Prelude.hashWithSalt` lastUpdateDate
+      `Prelude.hashWithSalt` roleArn
+      `Prelude.hashWithSalt` id
+      `Prelude.hashWithSalt` name
+      `Prelude.hashWithSalt` startUrl
+      `Prelude.hashWithSalt` status
+
+instance Prelude.NFData PortalSummary where
+  rnf PortalSummary' {..} =
+    Prelude.rnf creationDate
+      `Prelude.seq` Prelude.rnf description
+      `Prelude.seq` Prelude.rnf lastUpdateDate
+      `Prelude.seq` Prelude.rnf roleArn
+      `Prelude.seq` Prelude.rnf id
+      `Prelude.seq` Prelude.rnf name
+      `Prelude.seq` Prelude.rnf startUrl
+      `Prelude.seq` Prelude.rnf status
diff --git a/gen/Amazonka/IoTSiteWise/Types/ProjectResource.hs b/gen/Amazonka/IoTSiteWise/Types/ProjectResource.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/IoTSiteWise/Types/ProjectResource.hs
@@ -0,0 +1,73 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.IoTSiteWise.Types.ProjectResource
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.IoTSiteWise.Types.ProjectResource where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+-- | Identifies a specific IoT SiteWise Monitor project.
+--
+-- /See:/ 'newProjectResource' smart constructor.
+data ProjectResource = ProjectResource'
+  { -- | The ID of the project.
+    id :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ProjectResource' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'id', 'projectResource_id' - The ID of the project.
+newProjectResource ::
+  -- | 'id'
+  Prelude.Text ->
+  ProjectResource
+newProjectResource pId_ = ProjectResource' {id = pId_}
+
+-- | The ID of the project.
+projectResource_id :: Lens.Lens' ProjectResource Prelude.Text
+projectResource_id = Lens.lens (\ProjectResource' {id} -> id) (\s@ProjectResource' {} a -> s {id = a} :: ProjectResource)
+
+instance Data.FromJSON ProjectResource where
+  parseJSON =
+    Data.withObject
+      "ProjectResource"
+      ( \x ->
+          ProjectResource' Prelude.<$> (x Data..: "id")
+      )
+
+instance Prelude.Hashable ProjectResource where
+  hashWithSalt _salt ProjectResource' {..} =
+    _salt `Prelude.hashWithSalt` id
+
+instance Prelude.NFData ProjectResource where
+  rnf ProjectResource' {..} = Prelude.rnf id
+
+instance Data.ToJSON ProjectResource where
+  toJSON ProjectResource' {..} =
+    Data.object
+      (Prelude.catMaybes [Prelude.Just ("id" Data..= id)])
diff --git a/gen/Amazonka/IoTSiteWise/Types/ProjectSummary.hs b/gen/Amazonka/IoTSiteWise/Types/ProjectSummary.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/IoTSiteWise/Types/ProjectSummary.hs
@@ -0,0 +1,124 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.IoTSiteWise.Types.ProjectSummary
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.IoTSiteWise.Types.ProjectSummary where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+-- | Contains project summary information.
+--
+-- /See:/ 'newProjectSummary' smart constructor.
+data ProjectSummary = ProjectSummary'
+  { -- | The date the project was created, in Unix epoch time.
+    creationDate :: Prelude.Maybe Data.POSIX,
+    -- | The project\'s description.
+    description :: Prelude.Maybe Prelude.Text,
+    -- | The date the project was last updated, in Unix epoch time.
+    lastUpdateDate :: Prelude.Maybe Data.POSIX,
+    -- | The ID of the project.
+    id :: Prelude.Text,
+    -- | The name of the project.
+    name :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ProjectSummary' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'creationDate', 'projectSummary_creationDate' - The date the project was created, in Unix epoch time.
+--
+-- 'description', 'projectSummary_description' - The project\'s description.
+--
+-- 'lastUpdateDate', 'projectSummary_lastUpdateDate' - The date the project was last updated, in Unix epoch time.
+--
+-- 'id', 'projectSummary_id' - The ID of the project.
+--
+-- 'name', 'projectSummary_name' - The name of the project.
+newProjectSummary ::
+  -- | 'id'
+  Prelude.Text ->
+  -- | 'name'
+  Prelude.Text ->
+  ProjectSummary
+newProjectSummary pId_ pName_ =
+  ProjectSummary'
+    { creationDate = Prelude.Nothing,
+      description = Prelude.Nothing,
+      lastUpdateDate = Prelude.Nothing,
+      id = pId_,
+      name = pName_
+    }
+
+-- | The date the project was created, in Unix epoch time.
+projectSummary_creationDate :: Lens.Lens' ProjectSummary (Prelude.Maybe Prelude.UTCTime)
+projectSummary_creationDate = Lens.lens (\ProjectSummary' {creationDate} -> creationDate) (\s@ProjectSummary' {} a -> s {creationDate = a} :: ProjectSummary) Prelude.. Lens.mapping Data._Time
+
+-- | The project\'s description.
+projectSummary_description :: Lens.Lens' ProjectSummary (Prelude.Maybe Prelude.Text)
+projectSummary_description = Lens.lens (\ProjectSummary' {description} -> description) (\s@ProjectSummary' {} a -> s {description = a} :: ProjectSummary)
+
+-- | The date the project was last updated, in Unix epoch time.
+projectSummary_lastUpdateDate :: Lens.Lens' ProjectSummary (Prelude.Maybe Prelude.UTCTime)
+projectSummary_lastUpdateDate = Lens.lens (\ProjectSummary' {lastUpdateDate} -> lastUpdateDate) (\s@ProjectSummary' {} a -> s {lastUpdateDate = a} :: ProjectSummary) Prelude.. Lens.mapping Data._Time
+
+-- | The ID of the project.
+projectSummary_id :: Lens.Lens' ProjectSummary Prelude.Text
+projectSummary_id = Lens.lens (\ProjectSummary' {id} -> id) (\s@ProjectSummary' {} a -> s {id = a} :: ProjectSummary)
+
+-- | The name of the project.
+projectSummary_name :: Lens.Lens' ProjectSummary Prelude.Text
+projectSummary_name = Lens.lens (\ProjectSummary' {name} -> name) (\s@ProjectSummary' {} a -> s {name = a} :: ProjectSummary)
+
+instance Data.FromJSON ProjectSummary where
+  parseJSON =
+    Data.withObject
+      "ProjectSummary"
+      ( \x ->
+          ProjectSummary'
+            Prelude.<$> (x Data..:? "creationDate")
+            Prelude.<*> (x Data..:? "description")
+            Prelude.<*> (x Data..:? "lastUpdateDate")
+            Prelude.<*> (x Data..: "id")
+            Prelude.<*> (x Data..: "name")
+      )
+
+instance Prelude.Hashable ProjectSummary where
+  hashWithSalt _salt ProjectSummary' {..} =
+    _salt
+      `Prelude.hashWithSalt` creationDate
+      `Prelude.hashWithSalt` description
+      `Prelude.hashWithSalt` lastUpdateDate
+      `Prelude.hashWithSalt` id
+      `Prelude.hashWithSalt` name
+
+instance Prelude.NFData ProjectSummary where
+  rnf ProjectSummary' {..} =
+    Prelude.rnf creationDate
+      `Prelude.seq` Prelude.rnf description
+      `Prelude.seq` Prelude.rnf lastUpdateDate
+      `Prelude.seq` Prelude.rnf id
+      `Prelude.seq` Prelude.rnf name
diff --git a/gen/Amazonka/IoTSiteWise/Types/Property.hs b/gen/Amazonka/IoTSiteWise/Types/Property.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/IoTSiteWise/Types/Property.hs
@@ -0,0 +1,174 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.IoTSiteWise.Types.Property
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.IoTSiteWise.Types.Property where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.IoTSiteWise.Types.PropertyDataType
+import Amazonka.IoTSiteWise.Types.PropertyNotification
+import Amazonka.IoTSiteWise.Types.PropertyType
+import qualified Amazonka.Prelude as Prelude
+
+-- | Contains asset property information.
+--
+-- /See:/ 'newProperty' smart constructor.
+data Property = Property'
+  { -- | The alias that identifies the property, such as an OPC-UA server data
+    -- stream path (for example,
+    -- @\/company\/windfarm\/3\/turbine\/7\/temperature@). For more
+    -- information, see
+    -- <https://docs.aws.amazon.com/iot-sitewise/latest/userguide/connect-data-streams.html Mapping industrial data streams to asset properties>
+    -- in the /IoT SiteWise User Guide/.
+    alias :: Prelude.Maybe Prelude.Text,
+    -- | The asset property\'s notification topic and state. For more
+    -- information, see
+    -- <https://docs.aws.amazon.com/iot-sitewise/latest/APIReference/API_UpdateAssetProperty.html UpdateAssetProperty>.
+    notification :: Prelude.Maybe PropertyNotification,
+    -- | The property type (see @PropertyType@). A property contains one type.
+    type' :: Prelude.Maybe PropertyType,
+    -- | The unit (such as @Newtons@ or @RPM@) of the asset property.
+    unit :: Prelude.Maybe Prelude.Text,
+    -- | The ID of the asset property.
+    id :: Prelude.Text,
+    -- | The name of the property.
+    name :: Prelude.Text,
+    -- | The property data type.
+    dataType :: PropertyDataType
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'Property' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'alias', 'property_alias' - The alias that identifies the property, such as an OPC-UA server data
+-- stream path (for example,
+-- @\/company\/windfarm\/3\/turbine\/7\/temperature@). For more
+-- information, see
+-- <https://docs.aws.amazon.com/iot-sitewise/latest/userguide/connect-data-streams.html Mapping industrial data streams to asset properties>
+-- in the /IoT SiteWise User Guide/.
+--
+-- 'notification', 'property_notification' - The asset property\'s notification topic and state. For more
+-- information, see
+-- <https://docs.aws.amazon.com/iot-sitewise/latest/APIReference/API_UpdateAssetProperty.html UpdateAssetProperty>.
+--
+-- 'type'', 'property_type' - The property type (see @PropertyType@). A property contains one type.
+--
+-- 'unit', 'property_unit' - The unit (such as @Newtons@ or @RPM@) of the asset property.
+--
+-- 'id', 'property_id' - The ID of the asset property.
+--
+-- 'name', 'property_name' - The name of the property.
+--
+-- 'dataType', 'property_dataType' - The property data type.
+newProperty ::
+  -- | 'id'
+  Prelude.Text ->
+  -- | 'name'
+  Prelude.Text ->
+  -- | 'dataType'
+  PropertyDataType ->
+  Property
+newProperty pId_ pName_ pDataType_ =
+  Property'
+    { alias = Prelude.Nothing,
+      notification = Prelude.Nothing,
+      type' = Prelude.Nothing,
+      unit = Prelude.Nothing,
+      id = pId_,
+      name = pName_,
+      dataType = pDataType_
+    }
+
+-- | The alias that identifies the property, such as an OPC-UA server data
+-- stream path (for example,
+-- @\/company\/windfarm\/3\/turbine\/7\/temperature@). For more
+-- information, see
+-- <https://docs.aws.amazon.com/iot-sitewise/latest/userguide/connect-data-streams.html Mapping industrial data streams to asset properties>
+-- in the /IoT SiteWise User Guide/.
+property_alias :: Lens.Lens' Property (Prelude.Maybe Prelude.Text)
+property_alias = Lens.lens (\Property' {alias} -> alias) (\s@Property' {} a -> s {alias = a} :: Property)
+
+-- | The asset property\'s notification topic and state. For more
+-- information, see
+-- <https://docs.aws.amazon.com/iot-sitewise/latest/APIReference/API_UpdateAssetProperty.html UpdateAssetProperty>.
+property_notification :: Lens.Lens' Property (Prelude.Maybe PropertyNotification)
+property_notification = Lens.lens (\Property' {notification} -> notification) (\s@Property' {} a -> s {notification = a} :: Property)
+
+-- | The property type (see @PropertyType@). A property contains one type.
+property_type :: Lens.Lens' Property (Prelude.Maybe PropertyType)
+property_type = Lens.lens (\Property' {type'} -> type') (\s@Property' {} a -> s {type' = a} :: Property)
+
+-- | The unit (such as @Newtons@ or @RPM@) of the asset property.
+property_unit :: Lens.Lens' Property (Prelude.Maybe Prelude.Text)
+property_unit = Lens.lens (\Property' {unit} -> unit) (\s@Property' {} a -> s {unit = a} :: Property)
+
+-- | The ID of the asset property.
+property_id :: Lens.Lens' Property Prelude.Text
+property_id = Lens.lens (\Property' {id} -> id) (\s@Property' {} a -> s {id = a} :: Property)
+
+-- | The name of the property.
+property_name :: Lens.Lens' Property Prelude.Text
+property_name = Lens.lens (\Property' {name} -> name) (\s@Property' {} a -> s {name = a} :: Property)
+
+-- | The property data type.
+property_dataType :: Lens.Lens' Property PropertyDataType
+property_dataType = Lens.lens (\Property' {dataType} -> dataType) (\s@Property' {} a -> s {dataType = a} :: Property)
+
+instance Data.FromJSON Property where
+  parseJSON =
+    Data.withObject
+      "Property"
+      ( \x ->
+          Property'
+            Prelude.<$> (x Data..:? "alias")
+            Prelude.<*> (x Data..:? "notification")
+            Prelude.<*> (x Data..:? "type")
+            Prelude.<*> (x Data..:? "unit")
+            Prelude.<*> (x Data..: "id")
+            Prelude.<*> (x Data..: "name")
+            Prelude.<*> (x Data..: "dataType")
+      )
+
+instance Prelude.Hashable Property where
+  hashWithSalt _salt Property' {..} =
+    _salt
+      `Prelude.hashWithSalt` alias
+      `Prelude.hashWithSalt` notification
+      `Prelude.hashWithSalt` type'
+      `Prelude.hashWithSalt` unit
+      `Prelude.hashWithSalt` id
+      `Prelude.hashWithSalt` name
+      `Prelude.hashWithSalt` dataType
+
+instance Prelude.NFData Property where
+  rnf Property' {..} =
+    Prelude.rnf alias
+      `Prelude.seq` Prelude.rnf notification
+      `Prelude.seq` Prelude.rnf type'
+      `Prelude.seq` Prelude.rnf unit
+      `Prelude.seq` Prelude.rnf id
+      `Prelude.seq` Prelude.rnf name
+      `Prelude.seq` Prelude.rnf dataType
diff --git a/gen/Amazonka/IoTSiteWise/Types/PropertyDataType.hs b/gen/Amazonka/IoTSiteWise/Types/PropertyDataType.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/IoTSiteWise/Types/PropertyDataType.hs
@@ -0,0 +1,86 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DerivingStrategies #-}
+{-# LANGUAGE GeneralizedNewtypeDeriving #-}
+{-# LANGUAGE LambdaCase #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE PatternSynonyms #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.IoTSiteWise.Types.PropertyDataType
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.IoTSiteWise.Types.PropertyDataType
+  ( PropertyDataType
+      ( ..,
+        PropertyDataType_BOOLEAN,
+        PropertyDataType_DOUBLE,
+        PropertyDataType_INTEGER,
+        PropertyDataType_STRING,
+        PropertyDataType_STRUCT
+      ),
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+newtype PropertyDataType = PropertyDataType'
+  { fromPropertyDataType ::
+      Data.Text
+  }
+  deriving stock
+    ( Prelude.Show,
+      Prelude.Read,
+      Prelude.Eq,
+      Prelude.Ord,
+      Prelude.Generic
+    )
+  deriving newtype
+    ( Prelude.Hashable,
+      Prelude.NFData,
+      Data.FromText,
+      Data.ToText,
+      Data.ToByteString,
+      Data.ToLog,
+      Data.ToHeader,
+      Data.ToQuery,
+      Data.FromJSON,
+      Data.FromJSONKey,
+      Data.ToJSON,
+      Data.ToJSONKey,
+      Data.FromXML,
+      Data.ToXML
+    )
+
+pattern PropertyDataType_BOOLEAN :: PropertyDataType
+pattern PropertyDataType_BOOLEAN = PropertyDataType' "BOOLEAN"
+
+pattern PropertyDataType_DOUBLE :: PropertyDataType
+pattern PropertyDataType_DOUBLE = PropertyDataType' "DOUBLE"
+
+pattern PropertyDataType_INTEGER :: PropertyDataType
+pattern PropertyDataType_INTEGER = PropertyDataType' "INTEGER"
+
+pattern PropertyDataType_STRING :: PropertyDataType
+pattern PropertyDataType_STRING = PropertyDataType' "STRING"
+
+pattern PropertyDataType_STRUCT :: PropertyDataType
+pattern PropertyDataType_STRUCT = PropertyDataType' "STRUCT"
+
+{-# COMPLETE
+  PropertyDataType_BOOLEAN,
+  PropertyDataType_DOUBLE,
+  PropertyDataType_INTEGER,
+  PropertyDataType_STRING,
+  PropertyDataType_STRUCT,
+  PropertyDataType'
+  #-}
diff --git a/gen/Amazonka/IoTSiteWise/Types/PropertyNotification.hs b/gen/Amazonka/IoTSiteWise/Types/PropertyNotification.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/IoTSiteWise/Types/PropertyNotification.hs
@@ -0,0 +1,95 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.IoTSiteWise.Types.PropertyNotification
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.IoTSiteWise.Types.PropertyNotification where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.IoTSiteWise.Types.PropertyNotificationState
+import qualified Amazonka.Prelude as Prelude
+
+-- | Contains asset property value notification information. When the
+-- notification state is enabled, IoT SiteWise publishes property value
+-- updates to a unique MQTT topic. For more information, see
+-- <https://docs.aws.amazon.com/iot-sitewise/latest/userguide/interact-with-other-services.html Interacting with other services>
+-- in the /IoT SiteWise User Guide/.
+--
+-- /See:/ 'newPropertyNotification' smart constructor.
+data PropertyNotification = PropertyNotification'
+  { -- | The MQTT topic to which IoT SiteWise publishes property value update
+    -- notifications.
+    topic :: Prelude.Text,
+    -- | The current notification state.
+    state :: PropertyNotificationState
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'PropertyNotification' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'topic', 'propertyNotification_topic' - The MQTT topic to which IoT SiteWise publishes property value update
+-- notifications.
+--
+-- 'state', 'propertyNotification_state' - The current notification state.
+newPropertyNotification ::
+  -- | 'topic'
+  Prelude.Text ->
+  -- | 'state'
+  PropertyNotificationState ->
+  PropertyNotification
+newPropertyNotification pTopic_ pState_ =
+  PropertyNotification'
+    { topic = pTopic_,
+      state = pState_
+    }
+
+-- | The MQTT topic to which IoT SiteWise publishes property value update
+-- notifications.
+propertyNotification_topic :: Lens.Lens' PropertyNotification Prelude.Text
+propertyNotification_topic = Lens.lens (\PropertyNotification' {topic} -> topic) (\s@PropertyNotification' {} a -> s {topic = a} :: PropertyNotification)
+
+-- | The current notification state.
+propertyNotification_state :: Lens.Lens' PropertyNotification PropertyNotificationState
+propertyNotification_state = Lens.lens (\PropertyNotification' {state} -> state) (\s@PropertyNotification' {} a -> s {state = a} :: PropertyNotification)
+
+instance Data.FromJSON PropertyNotification where
+  parseJSON =
+    Data.withObject
+      "PropertyNotification"
+      ( \x ->
+          PropertyNotification'
+            Prelude.<$> (x Data..: "topic")
+            Prelude.<*> (x Data..: "state")
+      )
+
+instance Prelude.Hashable PropertyNotification where
+  hashWithSalt _salt PropertyNotification' {..} =
+    _salt
+      `Prelude.hashWithSalt` topic
+      `Prelude.hashWithSalt` state
+
+instance Prelude.NFData PropertyNotification where
+  rnf PropertyNotification' {..} =
+    Prelude.rnf topic `Prelude.seq` Prelude.rnf state
diff --git a/gen/Amazonka/IoTSiteWise/Types/PropertyNotificationState.hs b/gen/Amazonka/IoTSiteWise/Types/PropertyNotificationState.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/IoTSiteWise/Types/PropertyNotificationState.hs
@@ -0,0 +1,71 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DerivingStrategies #-}
+{-# LANGUAGE GeneralizedNewtypeDeriving #-}
+{-# LANGUAGE LambdaCase #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE PatternSynonyms #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.IoTSiteWise.Types.PropertyNotificationState
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.IoTSiteWise.Types.PropertyNotificationState
+  ( PropertyNotificationState
+      ( ..,
+        PropertyNotificationState_DISABLED,
+        PropertyNotificationState_ENABLED
+      ),
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+newtype PropertyNotificationState = PropertyNotificationState'
+  { fromPropertyNotificationState ::
+      Data.Text
+  }
+  deriving stock
+    ( Prelude.Show,
+      Prelude.Read,
+      Prelude.Eq,
+      Prelude.Ord,
+      Prelude.Generic
+    )
+  deriving newtype
+    ( Prelude.Hashable,
+      Prelude.NFData,
+      Data.FromText,
+      Data.ToText,
+      Data.ToByteString,
+      Data.ToLog,
+      Data.ToHeader,
+      Data.ToQuery,
+      Data.FromJSON,
+      Data.FromJSONKey,
+      Data.ToJSON,
+      Data.ToJSONKey,
+      Data.FromXML,
+      Data.ToXML
+    )
+
+pattern PropertyNotificationState_DISABLED :: PropertyNotificationState
+pattern PropertyNotificationState_DISABLED = PropertyNotificationState' "DISABLED"
+
+pattern PropertyNotificationState_ENABLED :: PropertyNotificationState
+pattern PropertyNotificationState_ENABLED = PropertyNotificationState' "ENABLED"
+
+{-# COMPLETE
+  PropertyNotificationState_DISABLED,
+  PropertyNotificationState_ENABLED,
+  PropertyNotificationState'
+  #-}
diff --git a/gen/Amazonka/IoTSiteWise/Types/PropertyType.hs b/gen/Amazonka/IoTSiteWise/Types/PropertyType.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/IoTSiteWise/Types/PropertyType.hs
@@ -0,0 +1,154 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.IoTSiteWise.Types.PropertyType
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.IoTSiteWise.Types.PropertyType where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.IoTSiteWise.Types.Attribute
+import Amazonka.IoTSiteWise.Types.Measurement
+import Amazonka.IoTSiteWise.Types.Metric
+import Amazonka.IoTSiteWise.Types.Transform
+import qualified Amazonka.Prelude as Prelude
+
+-- | Contains a property type, which can be one of @attribute@,
+-- @measurement@, @metric@, or @transform@.
+--
+-- /See:/ 'newPropertyType' smart constructor.
+data PropertyType = PropertyType'
+  { -- | Specifies an asset attribute property. An attribute generally contains
+    -- static information, such as the serial number of an
+    -- <https://en.wikipedia.org/wiki/Internet_of_things#Industrial_applications IIoT>
+    -- wind turbine.
+    attribute :: Prelude.Maybe Attribute,
+    -- | Specifies an asset measurement property. A measurement represents a
+    -- device\'s raw sensor data stream, such as timestamped temperature values
+    -- or timestamped power values.
+    measurement :: Prelude.Maybe Measurement,
+    -- | Specifies an asset metric property. A metric contains a mathematical
+    -- expression that uses aggregate functions to process all input data
+    -- points over a time interval and output a single data point, such as to
+    -- calculate the average hourly temperature.
+    metric :: Prelude.Maybe Metric,
+    -- | Specifies an asset transform property. A transform contains a
+    -- mathematical expression that maps a property\'s data points from one
+    -- form to another, such as a unit conversion from Celsius to Fahrenheit.
+    transform :: Prelude.Maybe Transform
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'PropertyType' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'attribute', 'propertyType_attribute' - Specifies an asset attribute property. An attribute generally contains
+-- static information, such as the serial number of an
+-- <https://en.wikipedia.org/wiki/Internet_of_things#Industrial_applications IIoT>
+-- wind turbine.
+--
+-- 'measurement', 'propertyType_measurement' - Specifies an asset measurement property. A measurement represents a
+-- device\'s raw sensor data stream, such as timestamped temperature values
+-- or timestamped power values.
+--
+-- 'metric', 'propertyType_metric' - Specifies an asset metric property. A metric contains a mathematical
+-- expression that uses aggregate functions to process all input data
+-- points over a time interval and output a single data point, such as to
+-- calculate the average hourly temperature.
+--
+-- 'transform', 'propertyType_transform' - Specifies an asset transform property. A transform contains a
+-- mathematical expression that maps a property\'s data points from one
+-- form to another, such as a unit conversion from Celsius to Fahrenheit.
+newPropertyType ::
+  PropertyType
+newPropertyType =
+  PropertyType'
+    { attribute = Prelude.Nothing,
+      measurement = Prelude.Nothing,
+      metric = Prelude.Nothing,
+      transform = Prelude.Nothing
+    }
+
+-- | Specifies an asset attribute property. An attribute generally contains
+-- static information, such as the serial number of an
+-- <https://en.wikipedia.org/wiki/Internet_of_things#Industrial_applications IIoT>
+-- wind turbine.
+propertyType_attribute :: Lens.Lens' PropertyType (Prelude.Maybe Attribute)
+propertyType_attribute = Lens.lens (\PropertyType' {attribute} -> attribute) (\s@PropertyType' {} a -> s {attribute = a} :: PropertyType)
+
+-- | Specifies an asset measurement property. A measurement represents a
+-- device\'s raw sensor data stream, such as timestamped temperature values
+-- or timestamped power values.
+propertyType_measurement :: Lens.Lens' PropertyType (Prelude.Maybe Measurement)
+propertyType_measurement = Lens.lens (\PropertyType' {measurement} -> measurement) (\s@PropertyType' {} a -> s {measurement = a} :: PropertyType)
+
+-- | Specifies an asset metric property. A metric contains a mathematical
+-- expression that uses aggregate functions to process all input data
+-- points over a time interval and output a single data point, such as to
+-- calculate the average hourly temperature.
+propertyType_metric :: Lens.Lens' PropertyType (Prelude.Maybe Metric)
+propertyType_metric = Lens.lens (\PropertyType' {metric} -> metric) (\s@PropertyType' {} a -> s {metric = a} :: PropertyType)
+
+-- | Specifies an asset transform property. A transform contains a
+-- mathematical expression that maps a property\'s data points from one
+-- form to another, such as a unit conversion from Celsius to Fahrenheit.
+propertyType_transform :: Lens.Lens' PropertyType (Prelude.Maybe Transform)
+propertyType_transform = Lens.lens (\PropertyType' {transform} -> transform) (\s@PropertyType' {} a -> s {transform = a} :: PropertyType)
+
+instance Data.FromJSON PropertyType where
+  parseJSON =
+    Data.withObject
+      "PropertyType"
+      ( \x ->
+          PropertyType'
+            Prelude.<$> (x Data..:? "attribute")
+            Prelude.<*> (x Data..:? "measurement")
+            Prelude.<*> (x Data..:? "metric")
+            Prelude.<*> (x Data..:? "transform")
+      )
+
+instance Prelude.Hashable PropertyType where
+  hashWithSalt _salt PropertyType' {..} =
+    _salt
+      `Prelude.hashWithSalt` attribute
+      `Prelude.hashWithSalt` measurement
+      `Prelude.hashWithSalt` metric
+      `Prelude.hashWithSalt` transform
+
+instance Prelude.NFData PropertyType where
+  rnf PropertyType' {..} =
+    Prelude.rnf attribute
+      `Prelude.seq` Prelude.rnf measurement
+      `Prelude.seq` Prelude.rnf metric
+      `Prelude.seq` Prelude.rnf transform
+
+instance Data.ToJSON PropertyType where
+  toJSON PropertyType' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("attribute" Data..=) Prelude.<$> attribute,
+            ("measurement" Data..=) Prelude.<$> measurement,
+            ("metric" Data..=) Prelude.<$> metric,
+            ("transform" Data..=) Prelude.<$> transform
+          ]
+      )
diff --git a/gen/Amazonka/IoTSiteWise/Types/PutAssetPropertyValueEntry.hs b/gen/Amazonka/IoTSiteWise/Types/PutAssetPropertyValueEntry.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/IoTSiteWise/Types/PutAssetPropertyValueEntry.hs
@@ -0,0 +1,148 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.IoTSiteWise.Types.PutAssetPropertyValueEntry
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.IoTSiteWise.Types.PutAssetPropertyValueEntry where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.IoTSiteWise.Types.AssetPropertyValue
+import qualified Amazonka.Prelude as Prelude
+
+-- | Contains a list of value updates for an asset property in the list of
+-- asset entries consumed by the
+-- <https://docs.aws.amazon.com/iot-sitewise/latest/APIReference/API_BatchPutAssetPropertyValue.html BatchPutAssetPropertyValue>
+-- API operation.
+--
+-- /See:/ 'newPutAssetPropertyValueEntry' smart constructor.
+data PutAssetPropertyValueEntry = PutAssetPropertyValueEntry'
+  { -- | The ID of the asset to update.
+    assetId :: Prelude.Maybe Prelude.Text,
+    -- | The alias that identifies the property, such as an OPC-UA server data
+    -- stream path (for example,
+    -- @\/company\/windfarm\/3\/turbine\/7\/temperature@). For more
+    -- information, see
+    -- <https://docs.aws.amazon.com/iot-sitewise/latest/userguide/connect-data-streams.html Mapping industrial data streams to asset properties>
+    -- in the /IoT SiteWise User Guide/.
+    propertyAlias :: Prelude.Maybe Prelude.Text,
+    -- | The ID of the asset property for this entry.
+    propertyId :: Prelude.Maybe Prelude.Text,
+    -- | The user specified ID for the entry. You can use this ID to identify
+    -- which entries failed.
+    entryId :: Prelude.Text,
+    -- | The list of property values to upload. You can specify up to 10
+    -- @propertyValues@ array elements.
+    propertyValues :: [AssetPropertyValue]
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'PutAssetPropertyValueEntry' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'assetId', 'putAssetPropertyValueEntry_assetId' - The ID of the asset to update.
+--
+-- 'propertyAlias', 'putAssetPropertyValueEntry_propertyAlias' - The alias that identifies the property, such as an OPC-UA server data
+-- stream path (for example,
+-- @\/company\/windfarm\/3\/turbine\/7\/temperature@). For more
+-- information, see
+-- <https://docs.aws.amazon.com/iot-sitewise/latest/userguide/connect-data-streams.html Mapping industrial data streams to asset properties>
+-- in the /IoT SiteWise User Guide/.
+--
+-- 'propertyId', 'putAssetPropertyValueEntry_propertyId' - The ID of the asset property for this entry.
+--
+-- 'entryId', 'putAssetPropertyValueEntry_entryId' - The user specified ID for the entry. You can use this ID to identify
+-- which entries failed.
+--
+-- 'propertyValues', 'putAssetPropertyValueEntry_propertyValues' - The list of property values to upload. You can specify up to 10
+-- @propertyValues@ array elements.
+newPutAssetPropertyValueEntry ::
+  -- | 'entryId'
+  Prelude.Text ->
+  PutAssetPropertyValueEntry
+newPutAssetPropertyValueEntry pEntryId_ =
+  PutAssetPropertyValueEntry'
+    { assetId =
+        Prelude.Nothing,
+      propertyAlias = Prelude.Nothing,
+      propertyId = Prelude.Nothing,
+      entryId = pEntryId_,
+      propertyValues = Prelude.mempty
+    }
+
+-- | The ID of the asset to update.
+putAssetPropertyValueEntry_assetId :: Lens.Lens' PutAssetPropertyValueEntry (Prelude.Maybe Prelude.Text)
+putAssetPropertyValueEntry_assetId = Lens.lens (\PutAssetPropertyValueEntry' {assetId} -> assetId) (\s@PutAssetPropertyValueEntry' {} a -> s {assetId = a} :: PutAssetPropertyValueEntry)
+
+-- | The alias that identifies the property, such as an OPC-UA server data
+-- stream path (for example,
+-- @\/company\/windfarm\/3\/turbine\/7\/temperature@). For more
+-- information, see
+-- <https://docs.aws.amazon.com/iot-sitewise/latest/userguide/connect-data-streams.html Mapping industrial data streams to asset properties>
+-- in the /IoT SiteWise User Guide/.
+putAssetPropertyValueEntry_propertyAlias :: Lens.Lens' PutAssetPropertyValueEntry (Prelude.Maybe Prelude.Text)
+putAssetPropertyValueEntry_propertyAlias = Lens.lens (\PutAssetPropertyValueEntry' {propertyAlias} -> propertyAlias) (\s@PutAssetPropertyValueEntry' {} a -> s {propertyAlias = a} :: PutAssetPropertyValueEntry)
+
+-- | The ID of the asset property for this entry.
+putAssetPropertyValueEntry_propertyId :: Lens.Lens' PutAssetPropertyValueEntry (Prelude.Maybe Prelude.Text)
+putAssetPropertyValueEntry_propertyId = Lens.lens (\PutAssetPropertyValueEntry' {propertyId} -> propertyId) (\s@PutAssetPropertyValueEntry' {} a -> s {propertyId = a} :: PutAssetPropertyValueEntry)
+
+-- | The user specified ID for the entry. You can use this ID to identify
+-- which entries failed.
+putAssetPropertyValueEntry_entryId :: Lens.Lens' PutAssetPropertyValueEntry Prelude.Text
+putAssetPropertyValueEntry_entryId = Lens.lens (\PutAssetPropertyValueEntry' {entryId} -> entryId) (\s@PutAssetPropertyValueEntry' {} a -> s {entryId = a} :: PutAssetPropertyValueEntry)
+
+-- | The list of property values to upload. You can specify up to 10
+-- @propertyValues@ array elements.
+putAssetPropertyValueEntry_propertyValues :: Lens.Lens' PutAssetPropertyValueEntry [AssetPropertyValue]
+putAssetPropertyValueEntry_propertyValues = Lens.lens (\PutAssetPropertyValueEntry' {propertyValues} -> propertyValues) (\s@PutAssetPropertyValueEntry' {} a -> s {propertyValues = a} :: PutAssetPropertyValueEntry) Prelude.. Lens.coerced
+
+instance Prelude.Hashable PutAssetPropertyValueEntry where
+  hashWithSalt _salt PutAssetPropertyValueEntry' {..} =
+    _salt
+      `Prelude.hashWithSalt` assetId
+      `Prelude.hashWithSalt` propertyAlias
+      `Prelude.hashWithSalt` propertyId
+      `Prelude.hashWithSalt` entryId
+      `Prelude.hashWithSalt` propertyValues
+
+instance Prelude.NFData PutAssetPropertyValueEntry where
+  rnf PutAssetPropertyValueEntry' {..} =
+    Prelude.rnf assetId
+      `Prelude.seq` Prelude.rnf propertyAlias
+      `Prelude.seq` Prelude.rnf propertyId
+      `Prelude.seq` Prelude.rnf entryId
+      `Prelude.seq` Prelude.rnf propertyValues
+
+instance Data.ToJSON PutAssetPropertyValueEntry where
+  toJSON PutAssetPropertyValueEntry' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("assetId" Data..=) Prelude.<$> assetId,
+            ("propertyAlias" Data..=) Prelude.<$> propertyAlias,
+            ("propertyId" Data..=) Prelude.<$> propertyId,
+            Prelude.Just ("entryId" Data..= entryId),
+            Prelude.Just
+              ("propertyValues" Data..= propertyValues)
+          ]
+      )
diff --git a/gen/Amazonka/IoTSiteWise/Types/Quality.hs b/gen/Amazonka/IoTSiteWise/Types/Quality.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/IoTSiteWise/Types/Quality.hs
@@ -0,0 +1,73 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DerivingStrategies #-}
+{-# LANGUAGE GeneralizedNewtypeDeriving #-}
+{-# LANGUAGE LambdaCase #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE PatternSynonyms #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.IoTSiteWise.Types.Quality
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.IoTSiteWise.Types.Quality
+  ( Quality
+      ( ..,
+        Quality_BAD,
+        Quality_GOOD,
+        Quality_UNCERTAIN
+      ),
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+newtype Quality = Quality' {fromQuality :: Data.Text}
+  deriving stock
+    ( Prelude.Show,
+      Prelude.Read,
+      Prelude.Eq,
+      Prelude.Ord,
+      Prelude.Generic
+    )
+  deriving newtype
+    ( Prelude.Hashable,
+      Prelude.NFData,
+      Data.FromText,
+      Data.ToText,
+      Data.ToByteString,
+      Data.ToLog,
+      Data.ToHeader,
+      Data.ToQuery,
+      Data.FromJSON,
+      Data.FromJSONKey,
+      Data.ToJSON,
+      Data.ToJSONKey,
+      Data.FromXML,
+      Data.ToXML
+    )
+
+pattern Quality_BAD :: Quality
+pattern Quality_BAD = Quality' "BAD"
+
+pattern Quality_GOOD :: Quality
+pattern Quality_GOOD = Quality' "GOOD"
+
+pattern Quality_UNCERTAIN :: Quality
+pattern Quality_UNCERTAIN = Quality' "UNCERTAIN"
+
+{-# COMPLETE
+  Quality_BAD,
+  Quality_GOOD,
+  Quality_UNCERTAIN,
+  Quality'
+  #-}
diff --git a/gen/Amazonka/IoTSiteWise/Types/Resource.hs b/gen/Amazonka/IoTSiteWise/Types/Resource.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/IoTSiteWise/Types/Resource.hs
@@ -0,0 +1,95 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.IoTSiteWise.Types.Resource
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.IoTSiteWise.Types.Resource where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.IoTSiteWise.Types.PortalResource
+import Amazonka.IoTSiteWise.Types.ProjectResource
+import qualified Amazonka.Prelude as Prelude
+
+-- | Contains an IoT SiteWise Monitor resource ID for a portal or project.
+--
+-- /See:/ 'newResource' smart constructor.
+data Resource = Resource'
+  { -- | A portal resource.
+    portal :: Prelude.Maybe PortalResource,
+    -- | A project resource.
+    project :: Prelude.Maybe ProjectResource
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'Resource' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'portal', 'resource_portal' - A portal resource.
+--
+-- 'project', 'resource_project' - A project resource.
+newResource ::
+  Resource
+newResource =
+  Resource'
+    { portal = Prelude.Nothing,
+      project = Prelude.Nothing
+    }
+
+-- | A portal resource.
+resource_portal :: Lens.Lens' Resource (Prelude.Maybe PortalResource)
+resource_portal = Lens.lens (\Resource' {portal} -> portal) (\s@Resource' {} a -> s {portal = a} :: Resource)
+
+-- | A project resource.
+resource_project :: Lens.Lens' Resource (Prelude.Maybe ProjectResource)
+resource_project = Lens.lens (\Resource' {project} -> project) (\s@Resource' {} a -> s {project = a} :: Resource)
+
+instance Data.FromJSON Resource where
+  parseJSON =
+    Data.withObject
+      "Resource"
+      ( \x ->
+          Resource'
+            Prelude.<$> (x Data..:? "portal")
+            Prelude.<*> (x Data..:? "project")
+      )
+
+instance Prelude.Hashable Resource where
+  hashWithSalt _salt Resource' {..} =
+    _salt
+      `Prelude.hashWithSalt` portal
+      `Prelude.hashWithSalt` project
+
+instance Prelude.NFData Resource where
+  rnf Resource' {..} =
+    Prelude.rnf portal
+      `Prelude.seq` Prelude.rnf project
+
+instance Data.ToJSON Resource where
+  toJSON Resource' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("portal" Data..=) Prelude.<$> portal,
+            ("project" Data..=) Prelude.<$> project
+          ]
+      )
diff --git a/gen/Amazonka/IoTSiteWise/Types/ResourceType.hs b/gen/Amazonka/IoTSiteWise/Types/ResourceType.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/IoTSiteWise/Types/ResourceType.hs
@@ -0,0 +1,71 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DerivingStrategies #-}
+{-# LANGUAGE GeneralizedNewtypeDeriving #-}
+{-# LANGUAGE LambdaCase #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE PatternSynonyms #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.IoTSiteWise.Types.ResourceType
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.IoTSiteWise.Types.ResourceType
+  ( ResourceType
+      ( ..,
+        ResourceType_PORTAL,
+        ResourceType_PROJECT
+      ),
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+newtype ResourceType = ResourceType'
+  { fromResourceType ::
+      Data.Text
+  }
+  deriving stock
+    ( Prelude.Show,
+      Prelude.Read,
+      Prelude.Eq,
+      Prelude.Ord,
+      Prelude.Generic
+    )
+  deriving newtype
+    ( Prelude.Hashable,
+      Prelude.NFData,
+      Data.FromText,
+      Data.ToText,
+      Data.ToByteString,
+      Data.ToLog,
+      Data.ToHeader,
+      Data.ToQuery,
+      Data.FromJSON,
+      Data.FromJSONKey,
+      Data.ToJSON,
+      Data.ToJSONKey,
+      Data.FromXML,
+      Data.ToXML
+    )
+
+pattern ResourceType_PORTAL :: ResourceType
+pattern ResourceType_PORTAL = ResourceType' "PORTAL"
+
+pattern ResourceType_PROJECT :: ResourceType
+pattern ResourceType_PROJECT = ResourceType' "PROJECT"
+
+{-# COMPLETE
+  ResourceType_PORTAL,
+  ResourceType_PROJECT,
+  ResourceType'
+  #-}
diff --git a/gen/Amazonka/IoTSiteWise/Types/RetentionPeriod.hs b/gen/Amazonka/IoTSiteWise/Types/RetentionPeriod.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/IoTSiteWise/Types/RetentionPeriod.hs
@@ -0,0 +1,112 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.IoTSiteWise.Types.RetentionPeriod
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.IoTSiteWise.Types.RetentionPeriod where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+-- | How many days your data is kept in the hot tier. By default, your data
+-- is kept indefinitely in the hot tier.
+--
+-- /See:/ 'newRetentionPeriod' smart constructor.
+data RetentionPeriod = RetentionPeriod'
+  { -- | The number of days that your data is kept.
+    --
+    -- If you specified a value for this parameter, the @unlimited@ parameter
+    -- must be @false@.
+    numberOfDays :: Prelude.Maybe Prelude.Natural,
+    -- | If true, your data is kept indefinitely.
+    --
+    -- If configured to @true@, you must not specify a value for the
+    -- @numberOfDays@ parameter.
+    unlimited :: Prelude.Maybe Prelude.Bool
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'RetentionPeriod' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'numberOfDays', 'retentionPeriod_numberOfDays' - The number of days that your data is kept.
+--
+-- If you specified a value for this parameter, the @unlimited@ parameter
+-- must be @false@.
+--
+-- 'unlimited', 'retentionPeriod_unlimited' - If true, your data is kept indefinitely.
+--
+-- If configured to @true@, you must not specify a value for the
+-- @numberOfDays@ parameter.
+newRetentionPeriod ::
+  RetentionPeriod
+newRetentionPeriod =
+  RetentionPeriod'
+    { numberOfDays = Prelude.Nothing,
+      unlimited = Prelude.Nothing
+    }
+
+-- | The number of days that your data is kept.
+--
+-- If you specified a value for this parameter, the @unlimited@ parameter
+-- must be @false@.
+retentionPeriod_numberOfDays :: Lens.Lens' RetentionPeriod (Prelude.Maybe Prelude.Natural)
+retentionPeriod_numberOfDays = Lens.lens (\RetentionPeriod' {numberOfDays} -> numberOfDays) (\s@RetentionPeriod' {} a -> s {numberOfDays = a} :: RetentionPeriod)
+
+-- | If true, your data is kept indefinitely.
+--
+-- If configured to @true@, you must not specify a value for the
+-- @numberOfDays@ parameter.
+retentionPeriod_unlimited :: Lens.Lens' RetentionPeriod (Prelude.Maybe Prelude.Bool)
+retentionPeriod_unlimited = Lens.lens (\RetentionPeriod' {unlimited} -> unlimited) (\s@RetentionPeriod' {} a -> s {unlimited = a} :: RetentionPeriod)
+
+instance Data.FromJSON RetentionPeriod where
+  parseJSON =
+    Data.withObject
+      "RetentionPeriod"
+      ( \x ->
+          RetentionPeriod'
+            Prelude.<$> (x Data..:? "numberOfDays")
+            Prelude.<*> (x Data..:? "unlimited")
+      )
+
+instance Prelude.Hashable RetentionPeriod where
+  hashWithSalt _salt RetentionPeriod' {..} =
+    _salt
+      `Prelude.hashWithSalt` numberOfDays
+      `Prelude.hashWithSalt` unlimited
+
+instance Prelude.NFData RetentionPeriod where
+  rnf RetentionPeriod' {..} =
+    Prelude.rnf numberOfDays
+      `Prelude.seq` Prelude.rnf unlimited
+
+instance Data.ToJSON RetentionPeriod where
+  toJSON RetentionPeriod' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("numberOfDays" Data..=) Prelude.<$> numberOfDays,
+            ("unlimited" Data..=) Prelude.<$> unlimited
+          ]
+      )
diff --git a/gen/Amazonka/IoTSiteWise/Types/StorageType.hs b/gen/Amazonka/IoTSiteWise/Types/StorageType.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/IoTSiteWise/Types/StorageType.hs
@@ -0,0 +1,71 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DerivingStrategies #-}
+{-# LANGUAGE GeneralizedNewtypeDeriving #-}
+{-# LANGUAGE LambdaCase #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE PatternSynonyms #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.IoTSiteWise.Types.StorageType
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.IoTSiteWise.Types.StorageType
+  ( StorageType
+      ( ..,
+        StorageType_MULTI_LAYER_STORAGE,
+        StorageType_SITEWISE_DEFAULT_STORAGE
+      ),
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+newtype StorageType = StorageType'
+  { fromStorageType ::
+      Data.Text
+  }
+  deriving stock
+    ( Prelude.Show,
+      Prelude.Read,
+      Prelude.Eq,
+      Prelude.Ord,
+      Prelude.Generic
+    )
+  deriving newtype
+    ( Prelude.Hashable,
+      Prelude.NFData,
+      Data.FromText,
+      Data.ToText,
+      Data.ToByteString,
+      Data.ToLog,
+      Data.ToHeader,
+      Data.ToQuery,
+      Data.FromJSON,
+      Data.FromJSONKey,
+      Data.ToJSON,
+      Data.ToJSONKey,
+      Data.FromXML,
+      Data.ToXML
+    )
+
+pattern StorageType_MULTI_LAYER_STORAGE :: StorageType
+pattern StorageType_MULTI_LAYER_STORAGE = StorageType' "MULTI_LAYER_STORAGE"
+
+pattern StorageType_SITEWISE_DEFAULT_STORAGE :: StorageType
+pattern StorageType_SITEWISE_DEFAULT_STORAGE = StorageType' "SITEWISE_DEFAULT_STORAGE"
+
+{-# COMPLETE
+  StorageType_MULTI_LAYER_STORAGE,
+  StorageType_SITEWISE_DEFAULT_STORAGE,
+  StorageType'
+  #-}
diff --git a/gen/Amazonka/IoTSiteWise/Types/TimeInNanos.hs b/gen/Amazonka/IoTSiteWise/Types/TimeInNanos.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/IoTSiteWise/Types/TimeInNanos.hs
@@ -0,0 +1,99 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.IoTSiteWise.Types.TimeInNanos
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.IoTSiteWise.Types.TimeInNanos where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+-- | Contains a timestamp with optional nanosecond granularity.
+--
+-- /See:/ 'newTimeInNanos' smart constructor.
+data TimeInNanos = TimeInNanos'
+  { -- | The nanosecond offset from @timeInSeconds@.
+    offsetInNanos :: Prelude.Maybe Prelude.Natural,
+    -- | The timestamp date, in seconds, in the Unix epoch format. Fractional
+    -- nanosecond data is provided by @offsetInNanos@.
+    timeInSeconds :: Prelude.Natural
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'TimeInNanos' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'offsetInNanos', 'timeInNanos_offsetInNanos' - The nanosecond offset from @timeInSeconds@.
+--
+-- 'timeInSeconds', 'timeInNanos_timeInSeconds' - The timestamp date, in seconds, in the Unix epoch format. Fractional
+-- nanosecond data is provided by @offsetInNanos@.
+newTimeInNanos ::
+  -- | 'timeInSeconds'
+  Prelude.Natural ->
+  TimeInNanos
+newTimeInNanos pTimeInSeconds_ =
+  TimeInNanos'
+    { offsetInNanos = Prelude.Nothing,
+      timeInSeconds = pTimeInSeconds_
+    }
+
+-- | The nanosecond offset from @timeInSeconds@.
+timeInNanos_offsetInNanos :: Lens.Lens' TimeInNanos (Prelude.Maybe Prelude.Natural)
+timeInNanos_offsetInNanos = Lens.lens (\TimeInNanos' {offsetInNanos} -> offsetInNanos) (\s@TimeInNanos' {} a -> s {offsetInNanos = a} :: TimeInNanos)
+
+-- | The timestamp date, in seconds, in the Unix epoch format. Fractional
+-- nanosecond data is provided by @offsetInNanos@.
+timeInNanos_timeInSeconds :: Lens.Lens' TimeInNanos Prelude.Natural
+timeInNanos_timeInSeconds = Lens.lens (\TimeInNanos' {timeInSeconds} -> timeInSeconds) (\s@TimeInNanos' {} a -> s {timeInSeconds = a} :: TimeInNanos)
+
+instance Data.FromJSON TimeInNanos where
+  parseJSON =
+    Data.withObject
+      "TimeInNanos"
+      ( \x ->
+          TimeInNanos'
+            Prelude.<$> (x Data..:? "offsetInNanos")
+            Prelude.<*> (x Data..: "timeInSeconds")
+      )
+
+instance Prelude.Hashable TimeInNanos where
+  hashWithSalt _salt TimeInNanos' {..} =
+    _salt
+      `Prelude.hashWithSalt` offsetInNanos
+      `Prelude.hashWithSalt` timeInSeconds
+
+instance Prelude.NFData TimeInNanos where
+  rnf TimeInNanos' {..} =
+    Prelude.rnf offsetInNanos
+      `Prelude.seq` Prelude.rnf timeInSeconds
+
+instance Data.ToJSON TimeInNanos where
+  toJSON TimeInNanos' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("offsetInNanos" Data..=) Prelude.<$> offsetInNanos,
+            Prelude.Just
+              ("timeInSeconds" Data..= timeInSeconds)
+          ]
+      )
diff --git a/gen/Amazonka/IoTSiteWise/Types/TimeOrdering.hs b/gen/Amazonka/IoTSiteWise/Types/TimeOrdering.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/IoTSiteWise/Types/TimeOrdering.hs
@@ -0,0 +1,71 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DerivingStrategies #-}
+{-# LANGUAGE GeneralizedNewtypeDeriving #-}
+{-# LANGUAGE LambdaCase #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE PatternSynonyms #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.IoTSiteWise.Types.TimeOrdering
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.IoTSiteWise.Types.TimeOrdering
+  ( TimeOrdering
+      ( ..,
+        TimeOrdering_ASCENDING,
+        TimeOrdering_DESCENDING
+      ),
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+newtype TimeOrdering = TimeOrdering'
+  { fromTimeOrdering ::
+      Data.Text
+  }
+  deriving stock
+    ( Prelude.Show,
+      Prelude.Read,
+      Prelude.Eq,
+      Prelude.Ord,
+      Prelude.Generic
+    )
+  deriving newtype
+    ( Prelude.Hashable,
+      Prelude.NFData,
+      Data.FromText,
+      Data.ToText,
+      Data.ToByteString,
+      Data.ToLog,
+      Data.ToHeader,
+      Data.ToQuery,
+      Data.FromJSON,
+      Data.FromJSONKey,
+      Data.ToJSON,
+      Data.ToJSONKey,
+      Data.FromXML,
+      Data.ToXML
+    )
+
+pattern TimeOrdering_ASCENDING :: TimeOrdering
+pattern TimeOrdering_ASCENDING = TimeOrdering' "ASCENDING"
+
+pattern TimeOrdering_DESCENDING :: TimeOrdering
+pattern TimeOrdering_DESCENDING = TimeOrdering' "DESCENDING"
+
+{-# COMPLETE
+  TimeOrdering_ASCENDING,
+  TimeOrdering_DESCENDING,
+  TimeOrdering'
+  #-}
diff --git a/gen/Amazonka/IoTSiteWise/Types/TimeSeriesSummary.hs b/gen/Amazonka/IoTSiteWise/Types/TimeSeriesSummary.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/IoTSiteWise/Types/TimeSeriesSummary.hs
@@ -0,0 +1,198 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.IoTSiteWise.Types.TimeSeriesSummary
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.IoTSiteWise.Types.TimeSeriesSummary where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.IoTSiteWise.Types.PropertyDataType
+import qualified Amazonka.Prelude as Prelude
+
+-- | Contains a summary of a time series (data stream).
+--
+-- /See:/ 'newTimeSeriesSummary' smart constructor.
+data TimeSeriesSummary = TimeSeriesSummary'
+  { -- | The alias that identifies the time series.
+    alias :: Prelude.Maybe Prelude.Text,
+    -- | The ID of the asset in which the asset property was created.
+    assetId :: Prelude.Maybe Prelude.Text,
+    -- | The data type of the structure for this time series. This parameter is
+    -- required for time series that have the @STRUCT@ data type.
+    --
+    -- The options for this parameter depend on the type of the composite model
+    -- in which you created the asset property that is associated with your
+    -- time series. Use @AWS\/ALARM_STATE@ for alarm state in alarm composite
+    -- models.
+    dataTypeSpec :: Prelude.Maybe Prelude.Text,
+    -- | The ID of the asset property.
+    propertyId :: Prelude.Maybe Prelude.Text,
+    -- | The ID of the time series.
+    timeSeriesId :: Prelude.Text,
+    -- | The data type of the time series.
+    --
+    -- If you specify @STRUCT@, you must also specify @dataTypeSpec@ to
+    -- identify the type of the structure for this time series.
+    dataType :: PropertyDataType,
+    -- | The date that the time series was created, in Unix epoch time.
+    timeSeriesCreationDate :: Data.POSIX,
+    -- | The date that the time series was last updated, in Unix epoch time.
+    timeSeriesLastUpdateDate :: Data.POSIX
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'TimeSeriesSummary' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'alias', 'timeSeriesSummary_alias' - The alias that identifies the time series.
+--
+-- 'assetId', 'timeSeriesSummary_assetId' - The ID of the asset in which the asset property was created.
+--
+-- 'dataTypeSpec', 'timeSeriesSummary_dataTypeSpec' - The data type of the structure for this time series. This parameter is
+-- required for time series that have the @STRUCT@ data type.
+--
+-- The options for this parameter depend on the type of the composite model
+-- in which you created the asset property that is associated with your
+-- time series. Use @AWS\/ALARM_STATE@ for alarm state in alarm composite
+-- models.
+--
+-- 'propertyId', 'timeSeriesSummary_propertyId' - The ID of the asset property.
+--
+-- 'timeSeriesId', 'timeSeriesSummary_timeSeriesId' - The ID of the time series.
+--
+-- 'dataType', 'timeSeriesSummary_dataType' - The data type of the time series.
+--
+-- If you specify @STRUCT@, you must also specify @dataTypeSpec@ to
+-- identify the type of the structure for this time series.
+--
+-- 'timeSeriesCreationDate', 'timeSeriesSummary_timeSeriesCreationDate' - The date that the time series was created, in Unix epoch time.
+--
+-- 'timeSeriesLastUpdateDate', 'timeSeriesSummary_timeSeriesLastUpdateDate' - The date that the time series was last updated, in Unix epoch time.
+newTimeSeriesSummary ::
+  -- | 'timeSeriesId'
+  Prelude.Text ->
+  -- | 'dataType'
+  PropertyDataType ->
+  -- | 'timeSeriesCreationDate'
+  Prelude.UTCTime ->
+  -- | 'timeSeriesLastUpdateDate'
+  Prelude.UTCTime ->
+  TimeSeriesSummary
+newTimeSeriesSummary
+  pTimeSeriesId_
+  pDataType_
+  pTimeSeriesCreationDate_
+  pTimeSeriesLastUpdateDate_ =
+    TimeSeriesSummary'
+      { alias = Prelude.Nothing,
+        assetId = Prelude.Nothing,
+        dataTypeSpec = Prelude.Nothing,
+        propertyId = Prelude.Nothing,
+        timeSeriesId = pTimeSeriesId_,
+        dataType = pDataType_,
+        timeSeriesCreationDate =
+          Data._Time Lens.# pTimeSeriesCreationDate_,
+        timeSeriesLastUpdateDate =
+          Data._Time Lens.# pTimeSeriesLastUpdateDate_
+      }
+
+-- | The alias that identifies the time series.
+timeSeriesSummary_alias :: Lens.Lens' TimeSeriesSummary (Prelude.Maybe Prelude.Text)
+timeSeriesSummary_alias = Lens.lens (\TimeSeriesSummary' {alias} -> alias) (\s@TimeSeriesSummary' {} a -> s {alias = a} :: TimeSeriesSummary)
+
+-- | The ID of the asset in which the asset property was created.
+timeSeriesSummary_assetId :: Lens.Lens' TimeSeriesSummary (Prelude.Maybe Prelude.Text)
+timeSeriesSummary_assetId = Lens.lens (\TimeSeriesSummary' {assetId} -> assetId) (\s@TimeSeriesSummary' {} a -> s {assetId = a} :: TimeSeriesSummary)
+
+-- | The data type of the structure for this time series. This parameter is
+-- required for time series that have the @STRUCT@ data type.
+--
+-- The options for this parameter depend on the type of the composite model
+-- in which you created the asset property that is associated with your
+-- time series. Use @AWS\/ALARM_STATE@ for alarm state in alarm composite
+-- models.
+timeSeriesSummary_dataTypeSpec :: Lens.Lens' TimeSeriesSummary (Prelude.Maybe Prelude.Text)
+timeSeriesSummary_dataTypeSpec = Lens.lens (\TimeSeriesSummary' {dataTypeSpec} -> dataTypeSpec) (\s@TimeSeriesSummary' {} a -> s {dataTypeSpec = a} :: TimeSeriesSummary)
+
+-- | The ID of the asset property.
+timeSeriesSummary_propertyId :: Lens.Lens' TimeSeriesSummary (Prelude.Maybe Prelude.Text)
+timeSeriesSummary_propertyId = Lens.lens (\TimeSeriesSummary' {propertyId} -> propertyId) (\s@TimeSeriesSummary' {} a -> s {propertyId = a} :: TimeSeriesSummary)
+
+-- | The ID of the time series.
+timeSeriesSummary_timeSeriesId :: Lens.Lens' TimeSeriesSummary Prelude.Text
+timeSeriesSummary_timeSeriesId = Lens.lens (\TimeSeriesSummary' {timeSeriesId} -> timeSeriesId) (\s@TimeSeriesSummary' {} a -> s {timeSeriesId = a} :: TimeSeriesSummary)
+
+-- | The data type of the time series.
+--
+-- If you specify @STRUCT@, you must also specify @dataTypeSpec@ to
+-- identify the type of the structure for this time series.
+timeSeriesSummary_dataType :: Lens.Lens' TimeSeriesSummary PropertyDataType
+timeSeriesSummary_dataType = Lens.lens (\TimeSeriesSummary' {dataType} -> dataType) (\s@TimeSeriesSummary' {} a -> s {dataType = a} :: TimeSeriesSummary)
+
+-- | The date that the time series was created, in Unix epoch time.
+timeSeriesSummary_timeSeriesCreationDate :: Lens.Lens' TimeSeriesSummary Prelude.UTCTime
+timeSeriesSummary_timeSeriesCreationDate = Lens.lens (\TimeSeriesSummary' {timeSeriesCreationDate} -> timeSeriesCreationDate) (\s@TimeSeriesSummary' {} a -> s {timeSeriesCreationDate = a} :: TimeSeriesSummary) Prelude.. Data._Time
+
+-- | The date that the time series was last updated, in Unix epoch time.
+timeSeriesSummary_timeSeriesLastUpdateDate :: Lens.Lens' TimeSeriesSummary Prelude.UTCTime
+timeSeriesSummary_timeSeriesLastUpdateDate = Lens.lens (\TimeSeriesSummary' {timeSeriesLastUpdateDate} -> timeSeriesLastUpdateDate) (\s@TimeSeriesSummary' {} a -> s {timeSeriesLastUpdateDate = a} :: TimeSeriesSummary) Prelude.. Data._Time
+
+instance Data.FromJSON TimeSeriesSummary where
+  parseJSON =
+    Data.withObject
+      "TimeSeriesSummary"
+      ( \x ->
+          TimeSeriesSummary'
+            Prelude.<$> (x Data..:? "alias")
+            Prelude.<*> (x Data..:? "assetId")
+            Prelude.<*> (x Data..:? "dataTypeSpec")
+            Prelude.<*> (x Data..:? "propertyId")
+            Prelude.<*> (x Data..: "timeSeriesId")
+            Prelude.<*> (x Data..: "dataType")
+            Prelude.<*> (x Data..: "timeSeriesCreationDate")
+            Prelude.<*> (x Data..: "timeSeriesLastUpdateDate")
+      )
+
+instance Prelude.Hashable TimeSeriesSummary where
+  hashWithSalt _salt TimeSeriesSummary' {..} =
+    _salt
+      `Prelude.hashWithSalt` alias
+      `Prelude.hashWithSalt` assetId
+      `Prelude.hashWithSalt` dataTypeSpec
+      `Prelude.hashWithSalt` propertyId
+      `Prelude.hashWithSalt` timeSeriesId
+      `Prelude.hashWithSalt` dataType
+      `Prelude.hashWithSalt` timeSeriesCreationDate
+      `Prelude.hashWithSalt` timeSeriesLastUpdateDate
+
+instance Prelude.NFData TimeSeriesSummary where
+  rnf TimeSeriesSummary' {..} =
+    Prelude.rnf alias
+      `Prelude.seq` Prelude.rnf assetId
+      `Prelude.seq` Prelude.rnf dataTypeSpec
+      `Prelude.seq` Prelude.rnf propertyId
+      `Prelude.seq` Prelude.rnf timeSeriesId
+      `Prelude.seq` Prelude.rnf dataType
+      `Prelude.seq` Prelude.rnf timeSeriesCreationDate
+      `Prelude.seq` Prelude.rnf timeSeriesLastUpdateDate
diff --git a/gen/Amazonka/IoTSiteWise/Types/Transform.hs b/gen/Amazonka/IoTSiteWise/Types/Transform.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/IoTSiteWise/Types/Transform.hs
@@ -0,0 +1,147 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.IoTSiteWise.Types.Transform
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.IoTSiteWise.Types.Transform where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.IoTSiteWise.Types.ExpressionVariable
+import Amazonka.IoTSiteWise.Types.TransformProcessingConfig
+import qualified Amazonka.Prelude as Prelude
+
+-- | Contains an asset transform property. A transform is a one-to-one
+-- mapping of a property\'s data points from one form to another. For
+-- example, you can use a transform to convert a Celsius data stream to
+-- Fahrenheit by applying the transformation expression to each data point
+-- of the Celsius stream. A transform can only have a data type of @DOUBLE@
+-- and consume properties with data types of @INTEGER@ or @DOUBLE@.
+--
+-- For more information, see
+-- <https://docs.aws.amazon.com/iot-sitewise/latest/userguide/asset-properties.html#transforms Transforms>
+-- in the /IoT SiteWise User Guide/.
+--
+-- /See:/ 'newTransform' smart constructor.
+data Transform = Transform'
+  { -- | The processing configuration for the given transform property. You can
+    -- configure transforms to be kept at the edge or forwarded to the Amazon
+    -- Web Services Cloud. You can also configure transforms to be computed at
+    -- the edge or in the cloud.
+    processingConfig :: Prelude.Maybe TransformProcessingConfig,
+    -- | The mathematical expression that defines the transformation function.
+    -- You can specify up to 10 variables per expression. You can specify up to
+    -- 10 functions per expression.
+    --
+    -- For more information, see
+    -- <https://docs.aws.amazon.com/iot-sitewise/latest/userguide/quotas.html Quotas>
+    -- in the /IoT SiteWise User Guide/.
+    expression :: Prelude.Text,
+    -- | The list of variables used in the expression.
+    variables :: [ExpressionVariable]
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'Transform' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'processingConfig', 'transform_processingConfig' - The processing configuration for the given transform property. You can
+-- configure transforms to be kept at the edge or forwarded to the Amazon
+-- Web Services Cloud. You can also configure transforms to be computed at
+-- the edge or in the cloud.
+--
+-- 'expression', 'transform_expression' - The mathematical expression that defines the transformation function.
+-- You can specify up to 10 variables per expression. You can specify up to
+-- 10 functions per expression.
+--
+-- For more information, see
+-- <https://docs.aws.amazon.com/iot-sitewise/latest/userguide/quotas.html Quotas>
+-- in the /IoT SiteWise User Guide/.
+--
+-- 'variables', 'transform_variables' - The list of variables used in the expression.
+newTransform ::
+  -- | 'expression'
+  Prelude.Text ->
+  Transform
+newTransform pExpression_ =
+  Transform'
+    { processingConfig = Prelude.Nothing,
+      expression = pExpression_,
+      variables = Prelude.mempty
+    }
+
+-- | The processing configuration for the given transform property. You can
+-- configure transforms to be kept at the edge or forwarded to the Amazon
+-- Web Services Cloud. You can also configure transforms to be computed at
+-- the edge or in the cloud.
+transform_processingConfig :: Lens.Lens' Transform (Prelude.Maybe TransformProcessingConfig)
+transform_processingConfig = Lens.lens (\Transform' {processingConfig} -> processingConfig) (\s@Transform' {} a -> s {processingConfig = a} :: Transform)
+
+-- | The mathematical expression that defines the transformation function.
+-- You can specify up to 10 variables per expression. You can specify up to
+-- 10 functions per expression.
+--
+-- For more information, see
+-- <https://docs.aws.amazon.com/iot-sitewise/latest/userguide/quotas.html Quotas>
+-- in the /IoT SiteWise User Guide/.
+transform_expression :: Lens.Lens' Transform Prelude.Text
+transform_expression = Lens.lens (\Transform' {expression} -> expression) (\s@Transform' {} a -> s {expression = a} :: Transform)
+
+-- | The list of variables used in the expression.
+transform_variables :: Lens.Lens' Transform [ExpressionVariable]
+transform_variables = Lens.lens (\Transform' {variables} -> variables) (\s@Transform' {} a -> s {variables = a} :: Transform) Prelude.. Lens.coerced
+
+instance Data.FromJSON Transform where
+  parseJSON =
+    Data.withObject
+      "Transform"
+      ( \x ->
+          Transform'
+            Prelude.<$> (x Data..:? "processingConfig")
+            Prelude.<*> (x Data..: "expression")
+            Prelude.<*> (x Data..:? "variables" Data..!= Prelude.mempty)
+      )
+
+instance Prelude.Hashable Transform where
+  hashWithSalt _salt Transform' {..} =
+    _salt
+      `Prelude.hashWithSalt` processingConfig
+      `Prelude.hashWithSalt` expression
+      `Prelude.hashWithSalt` variables
+
+instance Prelude.NFData Transform where
+  rnf Transform' {..} =
+    Prelude.rnf processingConfig
+      `Prelude.seq` Prelude.rnf expression
+      `Prelude.seq` Prelude.rnf variables
+
+instance Data.ToJSON Transform where
+  toJSON Transform' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("processingConfig" Data..=)
+              Prelude.<$> processingConfig,
+            Prelude.Just ("expression" Data..= expression),
+            Prelude.Just ("variables" Data..= variables)
+          ]
+      )
diff --git a/gen/Amazonka/IoTSiteWise/Types/TransformProcessingConfig.hs b/gen/Amazonka/IoTSiteWise/Types/TransformProcessingConfig.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/IoTSiteWise/Types/TransformProcessingConfig.hs
@@ -0,0 +1,102 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.IoTSiteWise.Types.TransformProcessingConfig
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.IoTSiteWise.Types.TransformProcessingConfig where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.IoTSiteWise.Types.ComputeLocation
+import Amazonka.IoTSiteWise.Types.ForwardingConfig
+import qualified Amazonka.Prelude as Prelude
+
+-- | The processing configuration for the given transform property. You can
+-- configure transforms to be kept at the edge or forwarded to the Amazon
+-- Web Services Cloud. You can also configure transforms to be computed at
+-- the edge or in the cloud.
+--
+-- /See:/ 'newTransformProcessingConfig' smart constructor.
+data TransformProcessingConfig = TransformProcessingConfig'
+  { forwardingConfig :: Prelude.Maybe ForwardingConfig,
+    -- | The compute location for the given transform property.
+    computeLocation :: ComputeLocation
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'TransformProcessingConfig' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'forwardingConfig', 'transformProcessingConfig_forwardingConfig' - Undocumented member.
+--
+-- 'computeLocation', 'transformProcessingConfig_computeLocation' - The compute location for the given transform property.
+newTransformProcessingConfig ::
+  -- | 'computeLocation'
+  ComputeLocation ->
+  TransformProcessingConfig
+newTransformProcessingConfig pComputeLocation_ =
+  TransformProcessingConfig'
+    { forwardingConfig =
+        Prelude.Nothing,
+      computeLocation = pComputeLocation_
+    }
+
+-- | Undocumented member.
+transformProcessingConfig_forwardingConfig :: Lens.Lens' TransformProcessingConfig (Prelude.Maybe ForwardingConfig)
+transformProcessingConfig_forwardingConfig = Lens.lens (\TransformProcessingConfig' {forwardingConfig} -> forwardingConfig) (\s@TransformProcessingConfig' {} a -> s {forwardingConfig = a} :: TransformProcessingConfig)
+
+-- | The compute location for the given transform property.
+transformProcessingConfig_computeLocation :: Lens.Lens' TransformProcessingConfig ComputeLocation
+transformProcessingConfig_computeLocation = Lens.lens (\TransformProcessingConfig' {computeLocation} -> computeLocation) (\s@TransformProcessingConfig' {} a -> s {computeLocation = a} :: TransformProcessingConfig)
+
+instance Data.FromJSON TransformProcessingConfig where
+  parseJSON =
+    Data.withObject
+      "TransformProcessingConfig"
+      ( \x ->
+          TransformProcessingConfig'
+            Prelude.<$> (x Data..:? "forwardingConfig")
+            Prelude.<*> (x Data..: "computeLocation")
+      )
+
+instance Prelude.Hashable TransformProcessingConfig where
+  hashWithSalt _salt TransformProcessingConfig' {..} =
+    _salt
+      `Prelude.hashWithSalt` forwardingConfig
+      `Prelude.hashWithSalt` computeLocation
+
+instance Prelude.NFData TransformProcessingConfig where
+  rnf TransformProcessingConfig' {..} =
+    Prelude.rnf forwardingConfig
+      `Prelude.seq` Prelude.rnf computeLocation
+
+instance Data.ToJSON TransformProcessingConfig where
+  toJSON TransformProcessingConfig' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("forwardingConfig" Data..=)
+              Prelude.<$> forwardingConfig,
+            Prelude.Just
+              ("computeLocation" Data..= computeLocation)
+          ]
+      )
diff --git a/gen/Amazonka/IoTSiteWise/Types/TraversalDirection.hs b/gen/Amazonka/IoTSiteWise/Types/TraversalDirection.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/IoTSiteWise/Types/TraversalDirection.hs
@@ -0,0 +1,71 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DerivingStrategies #-}
+{-# LANGUAGE GeneralizedNewtypeDeriving #-}
+{-# LANGUAGE LambdaCase #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE PatternSynonyms #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.IoTSiteWise.Types.TraversalDirection
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.IoTSiteWise.Types.TraversalDirection
+  ( TraversalDirection
+      ( ..,
+        TraversalDirection_CHILD,
+        TraversalDirection_PARENT
+      ),
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+newtype TraversalDirection = TraversalDirection'
+  { fromTraversalDirection ::
+      Data.Text
+  }
+  deriving stock
+    ( Prelude.Show,
+      Prelude.Read,
+      Prelude.Eq,
+      Prelude.Ord,
+      Prelude.Generic
+    )
+  deriving newtype
+    ( Prelude.Hashable,
+      Prelude.NFData,
+      Data.FromText,
+      Data.ToText,
+      Data.ToByteString,
+      Data.ToLog,
+      Data.ToHeader,
+      Data.ToQuery,
+      Data.FromJSON,
+      Data.FromJSONKey,
+      Data.ToJSON,
+      Data.ToJSONKey,
+      Data.FromXML,
+      Data.ToXML
+    )
+
+pattern TraversalDirection_CHILD :: TraversalDirection
+pattern TraversalDirection_CHILD = TraversalDirection' "CHILD"
+
+pattern TraversalDirection_PARENT :: TraversalDirection
+pattern TraversalDirection_PARENT = TraversalDirection' "PARENT"
+
+{-# COMPLETE
+  TraversalDirection_CHILD,
+  TraversalDirection_PARENT,
+  TraversalDirection'
+  #-}
diff --git a/gen/Amazonka/IoTSiteWise/Types/TraversalType.hs b/gen/Amazonka/IoTSiteWise/Types/TraversalType.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/IoTSiteWise/Types/TraversalType.hs
@@ -0,0 +1,66 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DerivingStrategies #-}
+{-# LANGUAGE GeneralizedNewtypeDeriving #-}
+{-# LANGUAGE LambdaCase #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE PatternSynonyms #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.IoTSiteWise.Types.TraversalType
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.IoTSiteWise.Types.TraversalType
+  ( TraversalType
+      ( ..,
+        TraversalType_PATH_TO_ROOT
+      ),
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+newtype TraversalType = TraversalType'
+  { fromTraversalType ::
+      Data.Text
+  }
+  deriving stock
+    ( Prelude.Show,
+      Prelude.Read,
+      Prelude.Eq,
+      Prelude.Ord,
+      Prelude.Generic
+    )
+  deriving newtype
+    ( Prelude.Hashable,
+      Prelude.NFData,
+      Data.FromText,
+      Data.ToText,
+      Data.ToByteString,
+      Data.ToLog,
+      Data.ToHeader,
+      Data.ToQuery,
+      Data.FromJSON,
+      Data.FromJSONKey,
+      Data.ToJSON,
+      Data.ToJSONKey,
+      Data.FromXML,
+      Data.ToXML
+    )
+
+pattern TraversalType_PATH_TO_ROOT :: TraversalType
+pattern TraversalType_PATH_TO_ROOT = TraversalType' "PATH_TO_ROOT"
+
+{-# COMPLETE
+  TraversalType_PATH_TO_ROOT,
+  TraversalType'
+  #-}
diff --git a/gen/Amazonka/IoTSiteWise/Types/TumblingWindow.hs b/gen/Amazonka/IoTSiteWise/Types/TumblingWindow.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/IoTSiteWise/Types/TumblingWindow.hs
@@ -0,0 +1,278 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.IoTSiteWise.Types.TumblingWindow
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.IoTSiteWise.Types.TumblingWindow where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+-- | Contains a tumbling window, which is a repeating fixed-sized,
+-- non-overlapping, and contiguous time window. You can use this window in
+-- metrics to aggregate data from properties and other assets.
+--
+-- You can use @m@, @h@, @d@, and @w@ when you specify an interval or
+-- offset. Note that @m@ represents minutes, @h@ represents hours, @d@
+-- represents days, and @w@ represents weeks. You can also use @s@ to
+-- represent seconds in @offset@.
+--
+-- The @interval@ and @offset@ parameters support the
+-- <https://en.wikipedia.org/wiki/ISO_8601 ISO 8601 format>. For example,
+-- @PT5S@ represents 5 seconds, @PT5M@ represents 5 minutes, and @PT5H@
+-- represents 5 hours.
+--
+-- /See:/ 'newTumblingWindow' smart constructor.
+data TumblingWindow = TumblingWindow'
+  { -- | The offset for the tumbling window. The @offset@ parameter accepts the
+    -- following:
+    --
+    -- -   The offset time.
+    --
+    --     For example, if you specify @18h@ for @offset@ and @1d@ for
+    --     @interval@, IoT SiteWise aggregates data in one of the following
+    --     ways:
+    --
+    --     -   If you create the metric before or at 6 PM (UTC), you get the
+    --         first aggregation result at 6 PM (UTC) on the day when you
+    --         create the metric.
+    --
+    --     -   If you create the metric after 6 PM (UTC), you get the first
+    --         aggregation result at 6 PM (UTC) the next day.
+    --
+    -- -   The ISO 8601 format.
+    --
+    --     For example, if you specify @PT18H@ for @offset@ and @1d@ for
+    --     @interval@, IoT SiteWise aggregates data in one of the following
+    --     ways:
+    --
+    --     -   If you create the metric before or at 6 PM (UTC), you get the
+    --         first aggregation result at 6 PM (UTC) on the day when you
+    --         create the metric.
+    --
+    --     -   If you create the metric after 6 PM (UTC), you get the first
+    --         aggregation result at 6 PM (UTC) the next day.
+    --
+    -- -   The 24-hour clock.
+    --
+    --     For example, if you specify @00:03:00@ for @offset@, @5m@ for
+    --     @interval@, and you create the metric at 2 PM (UTC), you get the
+    --     first aggregation result at 2:03 PM (UTC). You get the second
+    --     aggregation result at 2:08 PM (UTC).
+    --
+    -- -   The offset time zone.
+    --
+    --     For example, if you specify @2021-07-23T18:00-08@ for @offset@ and
+    --     @1d@ for @interval@, IoT SiteWise aggregates data in one of the
+    --     following ways:
+    --
+    --     -   If you create the metric before or at 6 PM (PST), you get the
+    --         first aggregation result at 6 PM (PST) on the day when you
+    --         create the metric.
+    --
+    --     -   If you create the metric after 6 PM (PST), you get the first
+    --         aggregation result at 6 PM (PST) the next day.
+    offset :: Prelude.Maybe Prelude.Text,
+    -- | The time interval for the tumbling window. The interval time must be
+    -- between 1 minute and 1 week.
+    --
+    -- IoT SiteWise computes the @1w@ interval the end of Sunday at midnight
+    -- each week (UTC), the @1d@ interval at the end of each day at midnight
+    -- (UTC), the @1h@ interval at the end of each hour, and so on.
+    --
+    -- When IoT SiteWise aggregates data points for metric computations, the
+    -- start of each interval is exclusive and the end of each interval is
+    -- inclusive. IoT SiteWise places the computed data point at the end of the
+    -- interval.
+    interval :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'TumblingWindow' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'offset', 'tumblingWindow_offset' - The offset for the tumbling window. The @offset@ parameter accepts the
+-- following:
+--
+-- -   The offset time.
+--
+--     For example, if you specify @18h@ for @offset@ and @1d@ for
+--     @interval@, IoT SiteWise aggregates data in one of the following
+--     ways:
+--
+--     -   If you create the metric before or at 6 PM (UTC), you get the
+--         first aggregation result at 6 PM (UTC) on the day when you
+--         create the metric.
+--
+--     -   If you create the metric after 6 PM (UTC), you get the first
+--         aggregation result at 6 PM (UTC) the next day.
+--
+-- -   The ISO 8601 format.
+--
+--     For example, if you specify @PT18H@ for @offset@ and @1d@ for
+--     @interval@, IoT SiteWise aggregates data in one of the following
+--     ways:
+--
+--     -   If you create the metric before or at 6 PM (UTC), you get the
+--         first aggregation result at 6 PM (UTC) on the day when you
+--         create the metric.
+--
+--     -   If you create the metric after 6 PM (UTC), you get the first
+--         aggregation result at 6 PM (UTC) the next day.
+--
+-- -   The 24-hour clock.
+--
+--     For example, if you specify @00:03:00@ for @offset@, @5m@ for
+--     @interval@, and you create the metric at 2 PM (UTC), you get the
+--     first aggregation result at 2:03 PM (UTC). You get the second
+--     aggregation result at 2:08 PM (UTC).
+--
+-- -   The offset time zone.
+--
+--     For example, if you specify @2021-07-23T18:00-08@ for @offset@ and
+--     @1d@ for @interval@, IoT SiteWise aggregates data in one of the
+--     following ways:
+--
+--     -   If you create the metric before or at 6 PM (PST), you get the
+--         first aggregation result at 6 PM (PST) on the day when you
+--         create the metric.
+--
+--     -   If you create the metric after 6 PM (PST), you get the first
+--         aggregation result at 6 PM (PST) the next day.
+--
+-- 'interval', 'tumblingWindow_interval' - The time interval for the tumbling window. The interval time must be
+-- between 1 minute and 1 week.
+--
+-- IoT SiteWise computes the @1w@ interval the end of Sunday at midnight
+-- each week (UTC), the @1d@ interval at the end of each day at midnight
+-- (UTC), the @1h@ interval at the end of each hour, and so on.
+--
+-- When IoT SiteWise aggregates data points for metric computations, the
+-- start of each interval is exclusive and the end of each interval is
+-- inclusive. IoT SiteWise places the computed data point at the end of the
+-- interval.
+newTumblingWindow ::
+  -- | 'interval'
+  Prelude.Text ->
+  TumblingWindow
+newTumblingWindow pInterval_ =
+  TumblingWindow'
+    { offset = Prelude.Nothing,
+      interval = pInterval_
+    }
+
+-- | The offset for the tumbling window. The @offset@ parameter accepts the
+-- following:
+--
+-- -   The offset time.
+--
+--     For example, if you specify @18h@ for @offset@ and @1d@ for
+--     @interval@, IoT SiteWise aggregates data in one of the following
+--     ways:
+--
+--     -   If you create the metric before or at 6 PM (UTC), you get the
+--         first aggregation result at 6 PM (UTC) on the day when you
+--         create the metric.
+--
+--     -   If you create the metric after 6 PM (UTC), you get the first
+--         aggregation result at 6 PM (UTC) the next day.
+--
+-- -   The ISO 8601 format.
+--
+--     For example, if you specify @PT18H@ for @offset@ and @1d@ for
+--     @interval@, IoT SiteWise aggregates data in one of the following
+--     ways:
+--
+--     -   If you create the metric before or at 6 PM (UTC), you get the
+--         first aggregation result at 6 PM (UTC) on the day when you
+--         create the metric.
+--
+--     -   If you create the metric after 6 PM (UTC), you get the first
+--         aggregation result at 6 PM (UTC) the next day.
+--
+-- -   The 24-hour clock.
+--
+--     For example, if you specify @00:03:00@ for @offset@, @5m@ for
+--     @interval@, and you create the metric at 2 PM (UTC), you get the
+--     first aggregation result at 2:03 PM (UTC). You get the second
+--     aggregation result at 2:08 PM (UTC).
+--
+-- -   The offset time zone.
+--
+--     For example, if you specify @2021-07-23T18:00-08@ for @offset@ and
+--     @1d@ for @interval@, IoT SiteWise aggregates data in one of the
+--     following ways:
+--
+--     -   If you create the metric before or at 6 PM (PST), you get the
+--         first aggregation result at 6 PM (PST) on the day when you
+--         create the metric.
+--
+--     -   If you create the metric after 6 PM (PST), you get the first
+--         aggregation result at 6 PM (PST) the next day.
+tumblingWindow_offset :: Lens.Lens' TumblingWindow (Prelude.Maybe Prelude.Text)
+tumblingWindow_offset = Lens.lens (\TumblingWindow' {offset} -> offset) (\s@TumblingWindow' {} a -> s {offset = a} :: TumblingWindow)
+
+-- | The time interval for the tumbling window. The interval time must be
+-- between 1 minute and 1 week.
+--
+-- IoT SiteWise computes the @1w@ interval the end of Sunday at midnight
+-- each week (UTC), the @1d@ interval at the end of each day at midnight
+-- (UTC), the @1h@ interval at the end of each hour, and so on.
+--
+-- When IoT SiteWise aggregates data points for metric computations, the
+-- start of each interval is exclusive and the end of each interval is
+-- inclusive. IoT SiteWise places the computed data point at the end of the
+-- interval.
+tumblingWindow_interval :: Lens.Lens' TumblingWindow Prelude.Text
+tumblingWindow_interval = Lens.lens (\TumblingWindow' {interval} -> interval) (\s@TumblingWindow' {} a -> s {interval = a} :: TumblingWindow)
+
+instance Data.FromJSON TumblingWindow where
+  parseJSON =
+    Data.withObject
+      "TumblingWindow"
+      ( \x ->
+          TumblingWindow'
+            Prelude.<$> (x Data..:? "offset")
+            Prelude.<*> (x Data..: "interval")
+      )
+
+instance Prelude.Hashable TumblingWindow where
+  hashWithSalt _salt TumblingWindow' {..} =
+    _salt
+      `Prelude.hashWithSalt` offset
+      `Prelude.hashWithSalt` interval
+
+instance Prelude.NFData TumblingWindow where
+  rnf TumblingWindow' {..} =
+    Prelude.rnf offset
+      `Prelude.seq` Prelude.rnf interval
+
+instance Data.ToJSON TumblingWindow where
+  toJSON TumblingWindow' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("offset" Data..=) Prelude.<$> offset,
+            Prelude.Just ("interval" Data..= interval)
+          ]
+      )
diff --git a/gen/Amazonka/IoTSiteWise/Types/UserIdentity.hs b/gen/Amazonka/IoTSiteWise/Types/UserIdentity.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/IoTSiteWise/Types/UserIdentity.hs
@@ -0,0 +1,71 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.IoTSiteWise.Types.UserIdentity
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.IoTSiteWise.Types.UserIdentity where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+-- | Contains information for a user identity in an access policy.
+--
+-- /See:/ 'newUserIdentity' smart constructor.
+data UserIdentity = UserIdentity'
+  { -- | The IAM Identity Center ID of the user.
+    id :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'UserIdentity' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'id', 'userIdentity_id' - The IAM Identity Center ID of the user.
+newUserIdentity ::
+  -- | 'id'
+  Prelude.Text ->
+  UserIdentity
+newUserIdentity pId_ = UserIdentity' {id = pId_}
+
+-- | The IAM Identity Center ID of the user.
+userIdentity_id :: Lens.Lens' UserIdentity Prelude.Text
+userIdentity_id = Lens.lens (\UserIdentity' {id} -> id) (\s@UserIdentity' {} a -> s {id = a} :: UserIdentity)
+
+instance Data.FromJSON UserIdentity where
+  parseJSON =
+    Data.withObject
+      "UserIdentity"
+      (\x -> UserIdentity' Prelude.<$> (x Data..: "id"))
+
+instance Prelude.Hashable UserIdentity where
+  hashWithSalt _salt UserIdentity' {..} =
+    _salt `Prelude.hashWithSalt` id
+
+instance Prelude.NFData UserIdentity where
+  rnf UserIdentity' {..} = Prelude.rnf id
+
+instance Data.ToJSON UserIdentity where
+  toJSON UserIdentity' {..} =
+    Data.object
+      (Prelude.catMaybes [Prelude.Just ("id" Data..= id)])
diff --git a/gen/Amazonka/IoTSiteWise/Types/VariableValue.hs b/gen/Amazonka/IoTSiteWise/Types/VariableValue.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/IoTSiteWise/Types/VariableValue.hs
@@ -0,0 +1,122 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.IoTSiteWise.Types.VariableValue
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.IoTSiteWise.Types.VariableValue where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+-- | Identifies a property value used in an expression.
+--
+-- /See:/ 'newVariableValue' smart constructor.
+data VariableValue = VariableValue'
+  { -- | The ID of the hierarchy to query for the property ID. You can use the
+    -- hierarchy\'s name instead of the hierarchy\'s ID.
+    --
+    -- You use a hierarchy ID instead of a model ID because you can have
+    -- several hierarchies using the same model and therefore the same
+    -- @propertyId@. For example, you might have separately grouped assets that
+    -- come from the same asset model. For more information, see
+    -- <https://docs.aws.amazon.com/iot-sitewise/latest/userguide/asset-hierarchies.html Asset hierarchies>
+    -- in the /IoT SiteWise User Guide/.
+    hierarchyId :: Prelude.Maybe Prelude.Text,
+    -- | The ID of the property to use as the variable. You can use the property
+    -- @name@ if it\'s from the same asset model.
+    propertyId :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'VariableValue' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'hierarchyId', 'variableValue_hierarchyId' - The ID of the hierarchy to query for the property ID. You can use the
+-- hierarchy\'s name instead of the hierarchy\'s ID.
+--
+-- You use a hierarchy ID instead of a model ID because you can have
+-- several hierarchies using the same model and therefore the same
+-- @propertyId@. For example, you might have separately grouped assets that
+-- come from the same asset model. For more information, see
+-- <https://docs.aws.amazon.com/iot-sitewise/latest/userguide/asset-hierarchies.html Asset hierarchies>
+-- in the /IoT SiteWise User Guide/.
+--
+-- 'propertyId', 'variableValue_propertyId' - The ID of the property to use as the variable. You can use the property
+-- @name@ if it\'s from the same asset model.
+newVariableValue ::
+  -- | 'propertyId'
+  Prelude.Text ->
+  VariableValue
+newVariableValue pPropertyId_ =
+  VariableValue'
+    { hierarchyId = Prelude.Nothing,
+      propertyId = pPropertyId_
+    }
+
+-- | The ID of the hierarchy to query for the property ID. You can use the
+-- hierarchy\'s name instead of the hierarchy\'s ID.
+--
+-- You use a hierarchy ID instead of a model ID because you can have
+-- several hierarchies using the same model and therefore the same
+-- @propertyId@. For example, you might have separately grouped assets that
+-- come from the same asset model. For more information, see
+-- <https://docs.aws.amazon.com/iot-sitewise/latest/userguide/asset-hierarchies.html Asset hierarchies>
+-- in the /IoT SiteWise User Guide/.
+variableValue_hierarchyId :: Lens.Lens' VariableValue (Prelude.Maybe Prelude.Text)
+variableValue_hierarchyId = Lens.lens (\VariableValue' {hierarchyId} -> hierarchyId) (\s@VariableValue' {} a -> s {hierarchyId = a} :: VariableValue)
+
+-- | The ID of the property to use as the variable. You can use the property
+-- @name@ if it\'s from the same asset model.
+variableValue_propertyId :: Lens.Lens' VariableValue Prelude.Text
+variableValue_propertyId = Lens.lens (\VariableValue' {propertyId} -> propertyId) (\s@VariableValue' {} a -> s {propertyId = a} :: VariableValue)
+
+instance Data.FromJSON VariableValue where
+  parseJSON =
+    Data.withObject
+      "VariableValue"
+      ( \x ->
+          VariableValue'
+            Prelude.<$> (x Data..:? "hierarchyId")
+            Prelude.<*> (x Data..: "propertyId")
+      )
+
+instance Prelude.Hashable VariableValue where
+  hashWithSalt _salt VariableValue' {..} =
+    _salt
+      `Prelude.hashWithSalt` hierarchyId
+      `Prelude.hashWithSalt` propertyId
+
+instance Prelude.NFData VariableValue where
+  rnf VariableValue' {..} =
+    Prelude.rnf hierarchyId
+      `Prelude.seq` Prelude.rnf propertyId
+
+instance Data.ToJSON VariableValue where
+  toJSON VariableValue' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("hierarchyId" Data..=) Prelude.<$> hierarchyId,
+            Prelude.Just ("propertyId" Data..= propertyId)
+          ]
+      )
diff --git a/gen/Amazonka/IoTSiteWise/Types/Variant.hs b/gen/Amazonka/IoTSiteWise/Types/Variant.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/IoTSiteWise/Types/Variant.hs
@@ -0,0 +1,119 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.IoTSiteWise.Types.Variant
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.IoTSiteWise.Types.Variant where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+-- | Contains an asset property value (of a single type only).
+--
+-- /See:/ 'newVariant' smart constructor.
+data Variant = Variant'
+  { -- | Asset property data of type Boolean (true or false).
+    booleanValue :: Prelude.Maybe Prelude.Bool,
+    -- | Asset property data of type double (floating point number).
+    doubleValue :: Prelude.Maybe Prelude.Double,
+    -- | Asset property data of type integer (whole number).
+    integerValue :: Prelude.Maybe Prelude.Int,
+    -- | Asset property data of type string (sequence of characters).
+    stringValue :: Prelude.Maybe Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'Variant' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'booleanValue', 'variant_booleanValue' - Asset property data of type Boolean (true or false).
+--
+-- 'doubleValue', 'variant_doubleValue' - Asset property data of type double (floating point number).
+--
+-- 'integerValue', 'variant_integerValue' - Asset property data of type integer (whole number).
+--
+-- 'stringValue', 'variant_stringValue' - Asset property data of type string (sequence of characters).
+newVariant ::
+  Variant
+newVariant =
+  Variant'
+    { booleanValue = Prelude.Nothing,
+      doubleValue = Prelude.Nothing,
+      integerValue = Prelude.Nothing,
+      stringValue = Prelude.Nothing
+    }
+
+-- | Asset property data of type Boolean (true or false).
+variant_booleanValue :: Lens.Lens' Variant (Prelude.Maybe Prelude.Bool)
+variant_booleanValue = Lens.lens (\Variant' {booleanValue} -> booleanValue) (\s@Variant' {} a -> s {booleanValue = a} :: Variant)
+
+-- | Asset property data of type double (floating point number).
+variant_doubleValue :: Lens.Lens' Variant (Prelude.Maybe Prelude.Double)
+variant_doubleValue = Lens.lens (\Variant' {doubleValue} -> doubleValue) (\s@Variant' {} a -> s {doubleValue = a} :: Variant)
+
+-- | Asset property data of type integer (whole number).
+variant_integerValue :: Lens.Lens' Variant (Prelude.Maybe Prelude.Int)
+variant_integerValue = Lens.lens (\Variant' {integerValue} -> integerValue) (\s@Variant' {} a -> s {integerValue = a} :: Variant)
+
+-- | Asset property data of type string (sequence of characters).
+variant_stringValue :: Lens.Lens' Variant (Prelude.Maybe Prelude.Text)
+variant_stringValue = Lens.lens (\Variant' {stringValue} -> stringValue) (\s@Variant' {} a -> s {stringValue = a} :: Variant)
+
+instance Data.FromJSON Variant where
+  parseJSON =
+    Data.withObject
+      "Variant"
+      ( \x ->
+          Variant'
+            Prelude.<$> (x Data..:? "booleanValue")
+            Prelude.<*> (x Data..:? "doubleValue")
+            Prelude.<*> (x Data..:? "integerValue")
+            Prelude.<*> (x Data..:? "stringValue")
+      )
+
+instance Prelude.Hashable Variant where
+  hashWithSalt _salt Variant' {..} =
+    _salt
+      `Prelude.hashWithSalt` booleanValue
+      `Prelude.hashWithSalt` doubleValue
+      `Prelude.hashWithSalt` integerValue
+      `Prelude.hashWithSalt` stringValue
+
+instance Prelude.NFData Variant where
+  rnf Variant' {..} =
+    Prelude.rnf booleanValue
+      `Prelude.seq` Prelude.rnf doubleValue
+      `Prelude.seq` Prelude.rnf integerValue
+      `Prelude.seq` Prelude.rnf stringValue
+
+instance Data.ToJSON Variant where
+  toJSON Variant' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("booleanValue" Data..=) Prelude.<$> booleanValue,
+            ("doubleValue" Data..=) Prelude.<$> doubleValue,
+            ("integerValue" Data..=) Prelude.<$> integerValue,
+            ("stringValue" Data..=) Prelude.<$> stringValue
+          ]
+      )
diff --git a/gen/Amazonka/IoTSiteWise/UntagResource.hs b/gen/Amazonka/IoTSiteWise/UntagResource.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/IoTSiteWise/UntagResource.hs
@@ -0,0 +1,168 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.IoTSiteWise.UntagResource
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Removes a tag from an IoT SiteWise resource.
+module Amazonka.IoTSiteWise.UntagResource
+  ( -- * Creating a Request
+    UntagResource (..),
+    newUntagResource,
+
+    -- * Request Lenses
+    untagResource_resourceArn,
+    untagResource_tagKeys,
+
+    -- * Destructuring the Response
+    UntagResourceResponse (..),
+    newUntagResourceResponse,
+
+    -- * Response Lenses
+    untagResourceResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.IoTSiteWise.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newUntagResource' smart constructor.
+data UntagResource = UntagResource'
+  { -- | The
+    -- <https://docs.aws.amazon.com/general/latest/gr/aws-arns-and-namespaces.html ARN>
+    -- of the resource to untag.
+    resourceArn :: Prelude.Text,
+    -- | A list of keys for tags to remove from the resource.
+    tagKeys :: [Prelude.Text]
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'UntagResource' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'resourceArn', 'untagResource_resourceArn' - The
+-- <https://docs.aws.amazon.com/general/latest/gr/aws-arns-and-namespaces.html ARN>
+-- of the resource to untag.
+--
+-- 'tagKeys', 'untagResource_tagKeys' - A list of keys for tags to remove from the resource.
+newUntagResource ::
+  -- | 'resourceArn'
+  Prelude.Text ->
+  UntagResource
+newUntagResource pResourceArn_ =
+  UntagResource'
+    { resourceArn = pResourceArn_,
+      tagKeys = Prelude.mempty
+    }
+
+-- | The
+-- <https://docs.aws.amazon.com/general/latest/gr/aws-arns-and-namespaces.html ARN>
+-- of the resource to untag.
+untagResource_resourceArn :: Lens.Lens' UntagResource Prelude.Text
+untagResource_resourceArn = Lens.lens (\UntagResource' {resourceArn} -> resourceArn) (\s@UntagResource' {} a -> s {resourceArn = a} :: UntagResource)
+
+-- | A list of keys for tags to remove from the resource.
+untagResource_tagKeys :: Lens.Lens' UntagResource [Prelude.Text]
+untagResource_tagKeys = Lens.lens (\UntagResource' {tagKeys} -> tagKeys) (\s@UntagResource' {} a -> s {tagKeys = a} :: UntagResource) Prelude.. Lens.coerced
+
+instance Core.AWSRequest UntagResource where
+  type
+    AWSResponse UntagResource =
+      UntagResourceResponse
+  request overrides =
+    Request.delete (overrides defaultService)
+  response =
+    Response.receiveEmpty
+      ( \s h x ->
+          UntagResourceResponse'
+            Prelude.<$> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable UntagResource where
+  hashWithSalt _salt UntagResource' {..} =
+    _salt
+      `Prelude.hashWithSalt` resourceArn
+      `Prelude.hashWithSalt` tagKeys
+
+instance Prelude.NFData UntagResource where
+  rnf UntagResource' {..} =
+    Prelude.rnf resourceArn
+      `Prelude.seq` Prelude.rnf tagKeys
+
+instance Data.ToHeaders UntagResource where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToPath UntagResource where
+  toPath = Prelude.const "/tags"
+
+instance Data.ToQuery UntagResource where
+  toQuery UntagResource' {..} =
+    Prelude.mconcat
+      [ "resourceArn" Data.=: resourceArn,
+        "tagKeys" Data.=: Data.toQueryList "member" tagKeys
+      ]
+
+-- | /See:/ 'newUntagResourceResponse' smart constructor.
+data UntagResourceResponse = UntagResourceResponse'
+  { -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'UntagResourceResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'httpStatus', 'untagResourceResponse_httpStatus' - The response's http status code.
+newUntagResourceResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  UntagResourceResponse
+newUntagResourceResponse pHttpStatus_ =
+  UntagResourceResponse' {httpStatus = pHttpStatus_}
+
+-- | The response's http status code.
+untagResourceResponse_httpStatus :: Lens.Lens' UntagResourceResponse Prelude.Int
+untagResourceResponse_httpStatus = Lens.lens (\UntagResourceResponse' {httpStatus} -> httpStatus) (\s@UntagResourceResponse' {} a -> s {httpStatus = a} :: UntagResourceResponse)
+
+instance Prelude.NFData UntagResourceResponse where
+  rnf UntagResourceResponse' {..} =
+    Prelude.rnf httpStatus
diff --git a/gen/Amazonka/IoTSiteWise/UpdateAccessPolicy.hs b/gen/Amazonka/IoTSiteWise/UpdateAccessPolicy.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/IoTSiteWise/UpdateAccessPolicy.hs
@@ -0,0 +1,245 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.IoTSiteWise.UpdateAccessPolicy
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Updates an existing access policy that specifies an identity\'s access
+-- to an IoT SiteWise Monitor portal or project resource.
+module Amazonka.IoTSiteWise.UpdateAccessPolicy
+  ( -- * Creating a Request
+    UpdateAccessPolicy (..),
+    newUpdateAccessPolicy,
+
+    -- * Request Lenses
+    updateAccessPolicy_clientToken,
+    updateAccessPolicy_accessPolicyId,
+    updateAccessPolicy_accessPolicyIdentity,
+    updateAccessPolicy_accessPolicyResource,
+    updateAccessPolicy_accessPolicyPermission,
+
+    -- * Destructuring the Response
+    UpdateAccessPolicyResponse (..),
+    newUpdateAccessPolicyResponse,
+
+    -- * Response Lenses
+    updateAccessPolicyResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.IoTSiteWise.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newUpdateAccessPolicy' smart constructor.
+data UpdateAccessPolicy = UpdateAccessPolicy'
+  { -- | A unique case-sensitive identifier that you can provide to ensure the
+    -- idempotency of the request. Don\'t reuse this client token if a new
+    -- idempotent request is required.
+    clientToken :: Prelude.Maybe Prelude.Text,
+    -- | The ID of the access policy.
+    accessPolicyId :: Prelude.Text,
+    -- | The identity for this access policy. Choose an IAM Identity Center user,
+    -- an IAM Identity Center group, or an IAM user.
+    accessPolicyIdentity :: Identity,
+    -- | The IoT SiteWise Monitor resource for this access policy. Choose either
+    -- a portal or a project.
+    accessPolicyResource :: Resource,
+    -- | The permission level for this access policy. Note that a project
+    -- @ADMINISTRATOR@ is also known as a project owner.
+    accessPolicyPermission :: Permission
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'UpdateAccessPolicy' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'clientToken', 'updateAccessPolicy_clientToken' - A unique case-sensitive identifier that you can provide to ensure the
+-- idempotency of the request. Don\'t reuse this client token if a new
+-- idempotent request is required.
+--
+-- 'accessPolicyId', 'updateAccessPolicy_accessPolicyId' - The ID of the access policy.
+--
+-- 'accessPolicyIdentity', 'updateAccessPolicy_accessPolicyIdentity' - The identity for this access policy. Choose an IAM Identity Center user,
+-- an IAM Identity Center group, or an IAM user.
+--
+-- 'accessPolicyResource', 'updateAccessPolicy_accessPolicyResource' - The IoT SiteWise Monitor resource for this access policy. Choose either
+-- a portal or a project.
+--
+-- 'accessPolicyPermission', 'updateAccessPolicy_accessPolicyPermission' - The permission level for this access policy. Note that a project
+-- @ADMINISTRATOR@ is also known as a project owner.
+newUpdateAccessPolicy ::
+  -- | 'accessPolicyId'
+  Prelude.Text ->
+  -- | 'accessPolicyIdentity'
+  Identity ->
+  -- | 'accessPolicyResource'
+  Resource ->
+  -- | 'accessPolicyPermission'
+  Permission ->
+  UpdateAccessPolicy
+newUpdateAccessPolicy
+  pAccessPolicyId_
+  pAccessPolicyIdentity_
+  pAccessPolicyResource_
+  pAccessPolicyPermission_ =
+    UpdateAccessPolicy'
+      { clientToken = Prelude.Nothing,
+        accessPolicyId = pAccessPolicyId_,
+        accessPolicyIdentity = pAccessPolicyIdentity_,
+        accessPolicyResource = pAccessPolicyResource_,
+        accessPolicyPermission = pAccessPolicyPermission_
+      }
+
+-- | A unique case-sensitive identifier that you can provide to ensure the
+-- idempotency of the request. Don\'t reuse this client token if a new
+-- idempotent request is required.
+updateAccessPolicy_clientToken :: Lens.Lens' UpdateAccessPolicy (Prelude.Maybe Prelude.Text)
+updateAccessPolicy_clientToken = Lens.lens (\UpdateAccessPolicy' {clientToken} -> clientToken) (\s@UpdateAccessPolicy' {} a -> s {clientToken = a} :: UpdateAccessPolicy)
+
+-- | The ID of the access policy.
+updateAccessPolicy_accessPolicyId :: Lens.Lens' UpdateAccessPolicy Prelude.Text
+updateAccessPolicy_accessPolicyId = Lens.lens (\UpdateAccessPolicy' {accessPolicyId} -> accessPolicyId) (\s@UpdateAccessPolicy' {} a -> s {accessPolicyId = a} :: UpdateAccessPolicy)
+
+-- | The identity for this access policy. Choose an IAM Identity Center user,
+-- an IAM Identity Center group, or an IAM user.
+updateAccessPolicy_accessPolicyIdentity :: Lens.Lens' UpdateAccessPolicy Identity
+updateAccessPolicy_accessPolicyIdentity = Lens.lens (\UpdateAccessPolicy' {accessPolicyIdentity} -> accessPolicyIdentity) (\s@UpdateAccessPolicy' {} a -> s {accessPolicyIdentity = a} :: UpdateAccessPolicy)
+
+-- | The IoT SiteWise Monitor resource for this access policy. Choose either
+-- a portal or a project.
+updateAccessPolicy_accessPolicyResource :: Lens.Lens' UpdateAccessPolicy Resource
+updateAccessPolicy_accessPolicyResource = Lens.lens (\UpdateAccessPolicy' {accessPolicyResource} -> accessPolicyResource) (\s@UpdateAccessPolicy' {} a -> s {accessPolicyResource = a} :: UpdateAccessPolicy)
+
+-- | The permission level for this access policy. Note that a project
+-- @ADMINISTRATOR@ is also known as a project owner.
+updateAccessPolicy_accessPolicyPermission :: Lens.Lens' UpdateAccessPolicy Permission
+updateAccessPolicy_accessPolicyPermission = Lens.lens (\UpdateAccessPolicy' {accessPolicyPermission} -> accessPolicyPermission) (\s@UpdateAccessPolicy' {} a -> s {accessPolicyPermission = a} :: UpdateAccessPolicy)
+
+instance Core.AWSRequest UpdateAccessPolicy where
+  type
+    AWSResponse UpdateAccessPolicy =
+      UpdateAccessPolicyResponse
+  request overrides =
+    Request.putJSON (overrides defaultService)
+  response =
+    Response.receiveEmpty
+      ( \s h x ->
+          UpdateAccessPolicyResponse'
+            Prelude.<$> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable UpdateAccessPolicy where
+  hashWithSalt _salt UpdateAccessPolicy' {..} =
+    _salt
+      `Prelude.hashWithSalt` clientToken
+      `Prelude.hashWithSalt` accessPolicyId
+      `Prelude.hashWithSalt` accessPolicyIdentity
+      `Prelude.hashWithSalt` accessPolicyResource
+      `Prelude.hashWithSalt` accessPolicyPermission
+
+instance Prelude.NFData UpdateAccessPolicy where
+  rnf UpdateAccessPolicy' {..} =
+    Prelude.rnf clientToken
+      `Prelude.seq` Prelude.rnf accessPolicyId
+      `Prelude.seq` Prelude.rnf accessPolicyIdentity
+      `Prelude.seq` Prelude.rnf accessPolicyResource
+      `Prelude.seq` Prelude.rnf accessPolicyPermission
+
+instance Data.ToHeaders UpdateAccessPolicy where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON UpdateAccessPolicy where
+  toJSON UpdateAccessPolicy' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("clientToken" Data..=) Prelude.<$> clientToken,
+            Prelude.Just
+              ( "accessPolicyIdentity"
+                  Data..= accessPolicyIdentity
+              ),
+            Prelude.Just
+              ( "accessPolicyResource"
+                  Data..= accessPolicyResource
+              ),
+            Prelude.Just
+              ( "accessPolicyPermission"
+                  Data..= accessPolicyPermission
+              )
+          ]
+      )
+
+instance Data.ToPath UpdateAccessPolicy where
+  toPath UpdateAccessPolicy' {..} =
+    Prelude.mconcat
+      ["/access-policies/", Data.toBS accessPolicyId]
+
+instance Data.ToQuery UpdateAccessPolicy where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newUpdateAccessPolicyResponse' smart constructor.
+data UpdateAccessPolicyResponse = UpdateAccessPolicyResponse'
+  { -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'UpdateAccessPolicyResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'httpStatus', 'updateAccessPolicyResponse_httpStatus' - The response's http status code.
+newUpdateAccessPolicyResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  UpdateAccessPolicyResponse
+newUpdateAccessPolicyResponse pHttpStatus_ =
+  UpdateAccessPolicyResponse'
+    { httpStatus =
+        pHttpStatus_
+    }
+
+-- | The response's http status code.
+updateAccessPolicyResponse_httpStatus :: Lens.Lens' UpdateAccessPolicyResponse Prelude.Int
+updateAccessPolicyResponse_httpStatus = Lens.lens (\UpdateAccessPolicyResponse' {httpStatus} -> httpStatus) (\s@UpdateAccessPolicyResponse' {} a -> s {httpStatus = a} :: UpdateAccessPolicyResponse)
+
+instance Prelude.NFData UpdateAccessPolicyResponse where
+  rnf UpdateAccessPolicyResponse' {..} =
+    Prelude.rnf httpStatus
diff --git a/gen/Amazonka/IoTSiteWise/UpdateAsset.hs b/gen/Amazonka/IoTSiteWise/UpdateAsset.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/IoTSiteWise/UpdateAsset.hs
@@ -0,0 +1,221 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.IoTSiteWise.UpdateAsset
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Updates an asset\'s name. For more information, see
+-- <https://docs.aws.amazon.com/iot-sitewise/latest/userguide/update-assets-and-models.html Updating assets and models>
+-- in the /IoT SiteWise User Guide/.
+module Amazonka.IoTSiteWise.UpdateAsset
+  ( -- * Creating a Request
+    UpdateAsset (..),
+    newUpdateAsset,
+
+    -- * Request Lenses
+    updateAsset_assetDescription,
+    updateAsset_clientToken,
+    updateAsset_assetId,
+    updateAsset_assetName,
+
+    -- * Destructuring the Response
+    UpdateAssetResponse (..),
+    newUpdateAssetResponse,
+
+    -- * Response Lenses
+    updateAssetResponse_httpStatus,
+    updateAssetResponse_assetStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.IoTSiteWise.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newUpdateAsset' smart constructor.
+data UpdateAsset = UpdateAsset'
+  { -- | A description for the asset.
+    assetDescription :: Prelude.Maybe Prelude.Text,
+    -- | A unique case-sensitive identifier that you can provide to ensure the
+    -- idempotency of the request. Don\'t reuse this client token if a new
+    -- idempotent request is required.
+    clientToken :: Prelude.Maybe Prelude.Text,
+    -- | The ID of the asset to update.
+    assetId :: Prelude.Text,
+    -- | A friendly name for the asset.
+    assetName :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'UpdateAsset' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'assetDescription', 'updateAsset_assetDescription' - A description for the asset.
+--
+-- 'clientToken', 'updateAsset_clientToken' - A unique case-sensitive identifier that you can provide to ensure the
+-- idempotency of the request. Don\'t reuse this client token if a new
+-- idempotent request is required.
+--
+-- 'assetId', 'updateAsset_assetId' - The ID of the asset to update.
+--
+-- 'assetName', 'updateAsset_assetName' - A friendly name for the asset.
+newUpdateAsset ::
+  -- | 'assetId'
+  Prelude.Text ->
+  -- | 'assetName'
+  Prelude.Text ->
+  UpdateAsset
+newUpdateAsset pAssetId_ pAssetName_ =
+  UpdateAsset'
+    { assetDescription = Prelude.Nothing,
+      clientToken = Prelude.Nothing,
+      assetId = pAssetId_,
+      assetName = pAssetName_
+    }
+
+-- | A description for the asset.
+updateAsset_assetDescription :: Lens.Lens' UpdateAsset (Prelude.Maybe Prelude.Text)
+updateAsset_assetDescription = Lens.lens (\UpdateAsset' {assetDescription} -> assetDescription) (\s@UpdateAsset' {} a -> s {assetDescription = a} :: UpdateAsset)
+
+-- | A unique case-sensitive identifier that you can provide to ensure the
+-- idempotency of the request. Don\'t reuse this client token if a new
+-- idempotent request is required.
+updateAsset_clientToken :: Lens.Lens' UpdateAsset (Prelude.Maybe Prelude.Text)
+updateAsset_clientToken = Lens.lens (\UpdateAsset' {clientToken} -> clientToken) (\s@UpdateAsset' {} a -> s {clientToken = a} :: UpdateAsset)
+
+-- | The ID of the asset to update.
+updateAsset_assetId :: Lens.Lens' UpdateAsset Prelude.Text
+updateAsset_assetId = Lens.lens (\UpdateAsset' {assetId} -> assetId) (\s@UpdateAsset' {} a -> s {assetId = a} :: UpdateAsset)
+
+-- | A friendly name for the asset.
+updateAsset_assetName :: Lens.Lens' UpdateAsset Prelude.Text
+updateAsset_assetName = Lens.lens (\UpdateAsset' {assetName} -> assetName) (\s@UpdateAsset' {} a -> s {assetName = a} :: UpdateAsset)
+
+instance Core.AWSRequest UpdateAsset where
+  type AWSResponse UpdateAsset = UpdateAssetResponse
+  request overrides =
+    Request.putJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          UpdateAssetResponse'
+            Prelude.<$> (Prelude.pure (Prelude.fromEnum s))
+            Prelude.<*> (x Data..:> "assetStatus")
+      )
+
+instance Prelude.Hashable UpdateAsset where
+  hashWithSalt _salt UpdateAsset' {..} =
+    _salt
+      `Prelude.hashWithSalt` assetDescription
+      `Prelude.hashWithSalt` clientToken
+      `Prelude.hashWithSalt` assetId
+      `Prelude.hashWithSalt` assetName
+
+instance Prelude.NFData UpdateAsset where
+  rnf UpdateAsset' {..} =
+    Prelude.rnf assetDescription
+      `Prelude.seq` Prelude.rnf clientToken
+      `Prelude.seq` Prelude.rnf assetId
+      `Prelude.seq` Prelude.rnf assetName
+
+instance Data.ToHeaders UpdateAsset where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON UpdateAsset where
+  toJSON UpdateAsset' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("assetDescription" Data..=)
+              Prelude.<$> assetDescription,
+            ("clientToken" Data..=) Prelude.<$> clientToken,
+            Prelude.Just ("assetName" Data..= assetName)
+          ]
+      )
+
+instance Data.ToPath UpdateAsset where
+  toPath UpdateAsset' {..} =
+    Prelude.mconcat ["/assets/", Data.toBS assetId]
+
+instance Data.ToQuery UpdateAsset where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newUpdateAssetResponse' smart constructor.
+data UpdateAssetResponse = UpdateAssetResponse'
+  { -- | The response's http status code.
+    httpStatus :: Prelude.Int,
+    -- | The status of the asset, which contains a state (@UPDATING@ after
+    -- successfully calling this operation) and any error message.
+    assetStatus :: AssetStatus
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'UpdateAssetResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'httpStatus', 'updateAssetResponse_httpStatus' - The response's http status code.
+--
+-- 'assetStatus', 'updateAssetResponse_assetStatus' - The status of the asset, which contains a state (@UPDATING@ after
+-- successfully calling this operation) and any error message.
+newUpdateAssetResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  -- | 'assetStatus'
+  AssetStatus ->
+  UpdateAssetResponse
+newUpdateAssetResponse pHttpStatus_ pAssetStatus_ =
+  UpdateAssetResponse'
+    { httpStatus = pHttpStatus_,
+      assetStatus = pAssetStatus_
+    }
+
+-- | The response's http status code.
+updateAssetResponse_httpStatus :: Lens.Lens' UpdateAssetResponse Prelude.Int
+updateAssetResponse_httpStatus = Lens.lens (\UpdateAssetResponse' {httpStatus} -> httpStatus) (\s@UpdateAssetResponse' {} a -> s {httpStatus = a} :: UpdateAssetResponse)
+
+-- | The status of the asset, which contains a state (@UPDATING@ after
+-- successfully calling this operation) and any error message.
+updateAssetResponse_assetStatus :: Lens.Lens' UpdateAssetResponse AssetStatus
+updateAssetResponse_assetStatus = Lens.lens (\UpdateAssetResponse' {assetStatus} -> assetStatus) (\s@UpdateAssetResponse' {} a -> s {assetStatus = a} :: UpdateAssetResponse)
+
+instance Prelude.NFData UpdateAssetResponse where
+  rnf UpdateAssetResponse' {..} =
+    Prelude.rnf httpStatus
+      `Prelude.seq` Prelude.rnf assetStatus
diff --git a/gen/Amazonka/IoTSiteWise/UpdateAssetModel.hs b/gen/Amazonka/IoTSiteWise/UpdateAssetModel.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/IoTSiteWise/UpdateAssetModel.hs
@@ -0,0 +1,348 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.IoTSiteWise.UpdateAssetModel
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Updates an asset model and all of the assets that were created from the
+-- model. Each asset created from the model inherits the updated asset
+-- model\'s property and hierarchy definitions. For more information, see
+-- <https://docs.aws.amazon.com/iot-sitewise/latest/userguide/update-assets-and-models.html Updating assets and models>
+-- in the /IoT SiteWise User Guide/.
+--
+-- This operation overwrites the existing model with the provided model. To
+-- avoid deleting your asset model\'s properties or hierarchies, you must
+-- include their IDs and definitions in the updated asset model payload.
+-- For more information, see
+-- <https://docs.aws.amazon.com/iot-sitewise/latest/APIReference/API_DescribeAssetModel.html DescribeAssetModel>.
+--
+-- If you remove a property from an asset model, IoT SiteWise deletes all
+-- previous data for that property. If you remove a hierarchy definition
+-- from an asset model, IoT SiteWise disassociates every asset associated
+-- with that hierarchy. You can\'t change the type or data type of an
+-- existing property.
+module Amazonka.IoTSiteWise.UpdateAssetModel
+  ( -- * Creating a Request
+    UpdateAssetModel (..),
+    newUpdateAssetModel,
+
+    -- * Request Lenses
+    updateAssetModel_assetModelCompositeModels,
+    updateAssetModel_assetModelDescription,
+    updateAssetModel_assetModelHierarchies,
+    updateAssetModel_assetModelProperties,
+    updateAssetModel_clientToken,
+    updateAssetModel_assetModelId,
+    updateAssetModel_assetModelName,
+
+    -- * Destructuring the Response
+    UpdateAssetModelResponse (..),
+    newUpdateAssetModelResponse,
+
+    -- * Response Lenses
+    updateAssetModelResponse_httpStatus,
+    updateAssetModelResponse_assetModelStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.IoTSiteWise.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newUpdateAssetModel' smart constructor.
+data UpdateAssetModel = UpdateAssetModel'
+  { -- | The composite asset models that are part of this asset model. Composite
+    -- asset models are asset models that contain specific properties. Each
+    -- composite model has a type that defines the properties that the
+    -- composite model supports. Use composite asset models to define alarms on
+    -- this asset model.
+    assetModelCompositeModels :: Prelude.Maybe [AssetModelCompositeModel],
+    -- | A description for the asset model.
+    assetModelDescription :: Prelude.Maybe Prelude.Text,
+    -- | The updated hierarchy definitions of the asset model. Each hierarchy
+    -- specifies an asset model whose assets can be children of any other
+    -- assets created from this asset model. For more information, see
+    -- <https://docs.aws.amazon.com/iot-sitewise/latest/userguide/asset-hierarchies.html Asset hierarchies>
+    -- in the /IoT SiteWise User Guide/.
+    --
+    -- You can specify up to 10 hierarchies per asset model. For more
+    -- information, see
+    -- <https://docs.aws.amazon.com/iot-sitewise/latest/userguide/quotas.html Quotas>
+    -- in the /IoT SiteWise User Guide/.
+    assetModelHierarchies :: Prelude.Maybe [AssetModelHierarchy],
+    -- | The updated property definitions of the asset model. For more
+    -- information, see
+    -- <https://docs.aws.amazon.com/iot-sitewise/latest/userguide/asset-properties.html Asset properties>
+    -- in the /IoT SiteWise User Guide/.
+    --
+    -- You can specify up to 200 properties per asset model. For more
+    -- information, see
+    -- <https://docs.aws.amazon.com/iot-sitewise/latest/userguide/quotas.html Quotas>
+    -- in the /IoT SiteWise User Guide/.
+    assetModelProperties :: Prelude.Maybe [AssetModelProperty],
+    -- | A unique case-sensitive identifier that you can provide to ensure the
+    -- idempotency of the request. Don\'t reuse this client token if a new
+    -- idempotent request is required.
+    clientToken :: Prelude.Maybe Prelude.Text,
+    -- | The ID of the asset model to update.
+    assetModelId :: Prelude.Text,
+    -- | A unique, friendly name for the asset model.
+    assetModelName :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'UpdateAssetModel' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'assetModelCompositeModels', 'updateAssetModel_assetModelCompositeModels' - The composite asset models that are part of this asset model. Composite
+-- asset models are asset models that contain specific properties. Each
+-- composite model has a type that defines the properties that the
+-- composite model supports. Use composite asset models to define alarms on
+-- this asset model.
+--
+-- 'assetModelDescription', 'updateAssetModel_assetModelDescription' - A description for the asset model.
+--
+-- 'assetModelHierarchies', 'updateAssetModel_assetModelHierarchies' - The updated hierarchy definitions of the asset model. Each hierarchy
+-- specifies an asset model whose assets can be children of any other
+-- assets created from this asset model. For more information, see
+-- <https://docs.aws.amazon.com/iot-sitewise/latest/userguide/asset-hierarchies.html Asset hierarchies>
+-- in the /IoT SiteWise User Guide/.
+--
+-- You can specify up to 10 hierarchies per asset model. For more
+-- information, see
+-- <https://docs.aws.amazon.com/iot-sitewise/latest/userguide/quotas.html Quotas>
+-- in the /IoT SiteWise User Guide/.
+--
+-- 'assetModelProperties', 'updateAssetModel_assetModelProperties' - The updated property definitions of the asset model. For more
+-- information, see
+-- <https://docs.aws.amazon.com/iot-sitewise/latest/userguide/asset-properties.html Asset properties>
+-- in the /IoT SiteWise User Guide/.
+--
+-- You can specify up to 200 properties per asset model. For more
+-- information, see
+-- <https://docs.aws.amazon.com/iot-sitewise/latest/userguide/quotas.html Quotas>
+-- in the /IoT SiteWise User Guide/.
+--
+-- 'clientToken', 'updateAssetModel_clientToken' - A unique case-sensitive identifier that you can provide to ensure the
+-- idempotency of the request. Don\'t reuse this client token if a new
+-- idempotent request is required.
+--
+-- 'assetModelId', 'updateAssetModel_assetModelId' - The ID of the asset model to update.
+--
+-- 'assetModelName', 'updateAssetModel_assetModelName' - A unique, friendly name for the asset model.
+newUpdateAssetModel ::
+  -- | 'assetModelId'
+  Prelude.Text ->
+  -- | 'assetModelName'
+  Prelude.Text ->
+  UpdateAssetModel
+newUpdateAssetModel pAssetModelId_ pAssetModelName_ =
+  UpdateAssetModel'
+    { assetModelCompositeModels =
+        Prelude.Nothing,
+      assetModelDescription = Prelude.Nothing,
+      assetModelHierarchies = Prelude.Nothing,
+      assetModelProperties = Prelude.Nothing,
+      clientToken = Prelude.Nothing,
+      assetModelId = pAssetModelId_,
+      assetModelName = pAssetModelName_
+    }
+
+-- | The composite asset models that are part of this asset model. Composite
+-- asset models are asset models that contain specific properties. Each
+-- composite model has a type that defines the properties that the
+-- composite model supports. Use composite asset models to define alarms on
+-- this asset model.
+updateAssetModel_assetModelCompositeModels :: Lens.Lens' UpdateAssetModel (Prelude.Maybe [AssetModelCompositeModel])
+updateAssetModel_assetModelCompositeModels = Lens.lens (\UpdateAssetModel' {assetModelCompositeModels} -> assetModelCompositeModels) (\s@UpdateAssetModel' {} a -> s {assetModelCompositeModels = a} :: UpdateAssetModel) Prelude.. Lens.mapping Lens.coerced
+
+-- | A description for the asset model.
+updateAssetModel_assetModelDescription :: Lens.Lens' UpdateAssetModel (Prelude.Maybe Prelude.Text)
+updateAssetModel_assetModelDescription = Lens.lens (\UpdateAssetModel' {assetModelDescription} -> assetModelDescription) (\s@UpdateAssetModel' {} a -> s {assetModelDescription = a} :: UpdateAssetModel)
+
+-- | The updated hierarchy definitions of the asset model. Each hierarchy
+-- specifies an asset model whose assets can be children of any other
+-- assets created from this asset model. For more information, see
+-- <https://docs.aws.amazon.com/iot-sitewise/latest/userguide/asset-hierarchies.html Asset hierarchies>
+-- in the /IoT SiteWise User Guide/.
+--
+-- You can specify up to 10 hierarchies per asset model. For more
+-- information, see
+-- <https://docs.aws.amazon.com/iot-sitewise/latest/userguide/quotas.html Quotas>
+-- in the /IoT SiteWise User Guide/.
+updateAssetModel_assetModelHierarchies :: Lens.Lens' UpdateAssetModel (Prelude.Maybe [AssetModelHierarchy])
+updateAssetModel_assetModelHierarchies = Lens.lens (\UpdateAssetModel' {assetModelHierarchies} -> assetModelHierarchies) (\s@UpdateAssetModel' {} a -> s {assetModelHierarchies = a} :: UpdateAssetModel) Prelude.. Lens.mapping Lens.coerced
+
+-- | The updated property definitions of the asset model. For more
+-- information, see
+-- <https://docs.aws.amazon.com/iot-sitewise/latest/userguide/asset-properties.html Asset properties>
+-- in the /IoT SiteWise User Guide/.
+--
+-- You can specify up to 200 properties per asset model. For more
+-- information, see
+-- <https://docs.aws.amazon.com/iot-sitewise/latest/userguide/quotas.html Quotas>
+-- in the /IoT SiteWise User Guide/.
+updateAssetModel_assetModelProperties :: Lens.Lens' UpdateAssetModel (Prelude.Maybe [AssetModelProperty])
+updateAssetModel_assetModelProperties = Lens.lens (\UpdateAssetModel' {assetModelProperties} -> assetModelProperties) (\s@UpdateAssetModel' {} a -> s {assetModelProperties = a} :: UpdateAssetModel) Prelude.. Lens.mapping Lens.coerced
+
+-- | A unique case-sensitive identifier that you can provide to ensure the
+-- idempotency of the request. Don\'t reuse this client token if a new
+-- idempotent request is required.
+updateAssetModel_clientToken :: Lens.Lens' UpdateAssetModel (Prelude.Maybe Prelude.Text)
+updateAssetModel_clientToken = Lens.lens (\UpdateAssetModel' {clientToken} -> clientToken) (\s@UpdateAssetModel' {} a -> s {clientToken = a} :: UpdateAssetModel)
+
+-- | The ID of the asset model to update.
+updateAssetModel_assetModelId :: Lens.Lens' UpdateAssetModel Prelude.Text
+updateAssetModel_assetModelId = Lens.lens (\UpdateAssetModel' {assetModelId} -> assetModelId) (\s@UpdateAssetModel' {} a -> s {assetModelId = a} :: UpdateAssetModel)
+
+-- | A unique, friendly name for the asset model.
+updateAssetModel_assetModelName :: Lens.Lens' UpdateAssetModel Prelude.Text
+updateAssetModel_assetModelName = Lens.lens (\UpdateAssetModel' {assetModelName} -> assetModelName) (\s@UpdateAssetModel' {} a -> s {assetModelName = a} :: UpdateAssetModel)
+
+instance Core.AWSRequest UpdateAssetModel where
+  type
+    AWSResponse UpdateAssetModel =
+      UpdateAssetModelResponse
+  request overrides =
+    Request.putJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          UpdateAssetModelResponse'
+            Prelude.<$> (Prelude.pure (Prelude.fromEnum s))
+            Prelude.<*> (x Data..:> "assetModelStatus")
+      )
+
+instance Prelude.Hashable UpdateAssetModel where
+  hashWithSalt _salt UpdateAssetModel' {..} =
+    _salt
+      `Prelude.hashWithSalt` assetModelCompositeModels
+      `Prelude.hashWithSalt` assetModelDescription
+      `Prelude.hashWithSalt` assetModelHierarchies
+      `Prelude.hashWithSalt` assetModelProperties
+      `Prelude.hashWithSalt` clientToken
+      `Prelude.hashWithSalt` assetModelId
+      `Prelude.hashWithSalt` assetModelName
+
+instance Prelude.NFData UpdateAssetModel where
+  rnf UpdateAssetModel' {..} =
+    Prelude.rnf assetModelCompositeModels
+      `Prelude.seq` Prelude.rnf assetModelDescription
+      `Prelude.seq` Prelude.rnf assetModelHierarchies
+      `Prelude.seq` Prelude.rnf assetModelProperties
+      `Prelude.seq` Prelude.rnf clientToken
+      `Prelude.seq` Prelude.rnf assetModelId
+      `Prelude.seq` Prelude.rnf assetModelName
+
+instance Data.ToHeaders UpdateAssetModel where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON UpdateAssetModel where
+  toJSON UpdateAssetModel' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("assetModelCompositeModels" Data..=)
+              Prelude.<$> assetModelCompositeModels,
+            ("assetModelDescription" Data..=)
+              Prelude.<$> assetModelDescription,
+            ("assetModelHierarchies" Data..=)
+              Prelude.<$> assetModelHierarchies,
+            ("assetModelProperties" Data..=)
+              Prelude.<$> assetModelProperties,
+            ("clientToken" Data..=) Prelude.<$> clientToken,
+            Prelude.Just
+              ("assetModelName" Data..= assetModelName)
+          ]
+      )
+
+instance Data.ToPath UpdateAssetModel where
+  toPath UpdateAssetModel' {..} =
+    Prelude.mconcat
+      ["/asset-models/", Data.toBS assetModelId]
+
+instance Data.ToQuery UpdateAssetModel where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newUpdateAssetModelResponse' smart constructor.
+data UpdateAssetModelResponse = UpdateAssetModelResponse'
+  { -- | The response's http status code.
+    httpStatus :: Prelude.Int,
+    -- | The status of the asset model, which contains a state (@UPDATING@ after
+    -- successfully calling this operation) and any error message.
+    assetModelStatus :: AssetModelStatus
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'UpdateAssetModelResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'httpStatus', 'updateAssetModelResponse_httpStatus' - The response's http status code.
+--
+-- 'assetModelStatus', 'updateAssetModelResponse_assetModelStatus' - The status of the asset model, which contains a state (@UPDATING@ after
+-- successfully calling this operation) and any error message.
+newUpdateAssetModelResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  -- | 'assetModelStatus'
+  AssetModelStatus ->
+  UpdateAssetModelResponse
+newUpdateAssetModelResponse
+  pHttpStatus_
+  pAssetModelStatus_ =
+    UpdateAssetModelResponse'
+      { httpStatus =
+          pHttpStatus_,
+        assetModelStatus = pAssetModelStatus_
+      }
+
+-- | The response's http status code.
+updateAssetModelResponse_httpStatus :: Lens.Lens' UpdateAssetModelResponse Prelude.Int
+updateAssetModelResponse_httpStatus = Lens.lens (\UpdateAssetModelResponse' {httpStatus} -> httpStatus) (\s@UpdateAssetModelResponse' {} a -> s {httpStatus = a} :: UpdateAssetModelResponse)
+
+-- | The status of the asset model, which contains a state (@UPDATING@ after
+-- successfully calling this operation) and any error message.
+updateAssetModelResponse_assetModelStatus :: Lens.Lens' UpdateAssetModelResponse AssetModelStatus
+updateAssetModelResponse_assetModelStatus = Lens.lens (\UpdateAssetModelResponse' {assetModelStatus} -> assetModelStatus) (\s@UpdateAssetModelResponse' {} a -> s {assetModelStatus = a} :: UpdateAssetModelResponse)
+
+instance Prelude.NFData UpdateAssetModelResponse where
+  rnf UpdateAssetModelResponse' {..} =
+    Prelude.rnf httpStatus
+      `Prelude.seq` Prelude.rnf assetModelStatus
diff --git a/gen/Amazonka/IoTSiteWise/UpdateAssetProperty.hs b/gen/Amazonka/IoTSiteWise/UpdateAssetProperty.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/IoTSiteWise/UpdateAssetProperty.hs
@@ -0,0 +1,263 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.IoTSiteWise.UpdateAssetProperty
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Updates an asset property\'s alias and notification state.
+--
+-- This operation overwrites the property\'s existing alias and
+-- notification state. To keep your existing property\'s alias or
+-- notification state, you must include the existing values in the
+-- UpdateAssetProperty request. For more information, see
+-- <https://docs.aws.amazon.com/iot-sitewise/latest/APIReference/API_DescribeAssetProperty.html DescribeAssetProperty>.
+module Amazonka.IoTSiteWise.UpdateAssetProperty
+  ( -- * Creating a Request
+    UpdateAssetProperty (..),
+    newUpdateAssetProperty,
+
+    -- * Request Lenses
+    updateAssetProperty_clientToken,
+    updateAssetProperty_propertyAlias,
+    updateAssetProperty_propertyNotificationState,
+    updateAssetProperty_propertyUnit,
+    updateAssetProperty_assetId,
+    updateAssetProperty_propertyId,
+
+    -- * Destructuring the Response
+    UpdateAssetPropertyResponse (..),
+    newUpdateAssetPropertyResponse,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.IoTSiteWise.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newUpdateAssetProperty' smart constructor.
+data UpdateAssetProperty = UpdateAssetProperty'
+  { -- | A unique case-sensitive identifier that you can provide to ensure the
+    -- idempotency of the request. Don\'t reuse this client token if a new
+    -- idempotent request is required.
+    clientToken :: Prelude.Maybe Prelude.Text,
+    -- | The alias that identifies the property, such as an OPC-UA server data
+    -- stream path (for example,
+    -- @\/company\/windfarm\/3\/turbine\/7\/temperature@). For more
+    -- information, see
+    -- <https://docs.aws.amazon.com/iot-sitewise/latest/userguide/connect-data-streams.html Mapping industrial data streams to asset properties>
+    -- in the /IoT SiteWise User Guide/.
+    --
+    -- If you omit this parameter, the alias is removed from the property.
+    propertyAlias :: Prelude.Maybe Prelude.Text,
+    -- | The MQTT notification state (enabled or disabled) for this asset
+    -- property. When the notification state is enabled, IoT SiteWise publishes
+    -- property value updates to a unique MQTT topic. For more information, see
+    -- <https://docs.aws.amazon.com/iot-sitewise/latest/userguide/interact-with-other-services.html Interacting with other services>
+    -- in the /IoT SiteWise User Guide/.
+    --
+    -- If you omit this parameter, the notification state is set to @DISABLED@.
+    propertyNotificationState :: Prelude.Maybe PropertyNotificationState,
+    -- | The unit of measure (such as Newtons or RPM) of the asset property. If
+    -- you don\'t specify a value for this parameter, the service uses the
+    -- value of the @assetModelProperty@ in the asset model.
+    propertyUnit :: Prelude.Maybe Prelude.Text,
+    -- | The ID of the asset to be updated.
+    assetId :: Prelude.Text,
+    -- | The ID of the asset property to be updated.
+    propertyId :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'UpdateAssetProperty' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'clientToken', 'updateAssetProperty_clientToken' - A unique case-sensitive identifier that you can provide to ensure the
+-- idempotency of the request. Don\'t reuse this client token if a new
+-- idempotent request is required.
+--
+-- 'propertyAlias', 'updateAssetProperty_propertyAlias' - The alias that identifies the property, such as an OPC-UA server data
+-- stream path (for example,
+-- @\/company\/windfarm\/3\/turbine\/7\/temperature@). For more
+-- information, see
+-- <https://docs.aws.amazon.com/iot-sitewise/latest/userguide/connect-data-streams.html Mapping industrial data streams to asset properties>
+-- in the /IoT SiteWise User Guide/.
+--
+-- If you omit this parameter, the alias is removed from the property.
+--
+-- 'propertyNotificationState', 'updateAssetProperty_propertyNotificationState' - The MQTT notification state (enabled or disabled) for this asset
+-- property. When the notification state is enabled, IoT SiteWise publishes
+-- property value updates to a unique MQTT topic. For more information, see
+-- <https://docs.aws.amazon.com/iot-sitewise/latest/userguide/interact-with-other-services.html Interacting with other services>
+-- in the /IoT SiteWise User Guide/.
+--
+-- If you omit this parameter, the notification state is set to @DISABLED@.
+--
+-- 'propertyUnit', 'updateAssetProperty_propertyUnit' - The unit of measure (such as Newtons or RPM) of the asset property. If
+-- you don\'t specify a value for this parameter, the service uses the
+-- value of the @assetModelProperty@ in the asset model.
+--
+-- 'assetId', 'updateAssetProperty_assetId' - The ID of the asset to be updated.
+--
+-- 'propertyId', 'updateAssetProperty_propertyId' - The ID of the asset property to be updated.
+newUpdateAssetProperty ::
+  -- | 'assetId'
+  Prelude.Text ->
+  -- | 'propertyId'
+  Prelude.Text ->
+  UpdateAssetProperty
+newUpdateAssetProperty pAssetId_ pPropertyId_ =
+  UpdateAssetProperty'
+    { clientToken = Prelude.Nothing,
+      propertyAlias = Prelude.Nothing,
+      propertyNotificationState = Prelude.Nothing,
+      propertyUnit = Prelude.Nothing,
+      assetId = pAssetId_,
+      propertyId = pPropertyId_
+    }
+
+-- | A unique case-sensitive identifier that you can provide to ensure the
+-- idempotency of the request. Don\'t reuse this client token if a new
+-- idempotent request is required.
+updateAssetProperty_clientToken :: Lens.Lens' UpdateAssetProperty (Prelude.Maybe Prelude.Text)
+updateAssetProperty_clientToken = Lens.lens (\UpdateAssetProperty' {clientToken} -> clientToken) (\s@UpdateAssetProperty' {} a -> s {clientToken = a} :: UpdateAssetProperty)
+
+-- | The alias that identifies the property, such as an OPC-UA server data
+-- stream path (for example,
+-- @\/company\/windfarm\/3\/turbine\/7\/temperature@). For more
+-- information, see
+-- <https://docs.aws.amazon.com/iot-sitewise/latest/userguide/connect-data-streams.html Mapping industrial data streams to asset properties>
+-- in the /IoT SiteWise User Guide/.
+--
+-- If you omit this parameter, the alias is removed from the property.
+updateAssetProperty_propertyAlias :: Lens.Lens' UpdateAssetProperty (Prelude.Maybe Prelude.Text)
+updateAssetProperty_propertyAlias = Lens.lens (\UpdateAssetProperty' {propertyAlias} -> propertyAlias) (\s@UpdateAssetProperty' {} a -> s {propertyAlias = a} :: UpdateAssetProperty)
+
+-- | The MQTT notification state (enabled or disabled) for this asset
+-- property. When the notification state is enabled, IoT SiteWise publishes
+-- property value updates to a unique MQTT topic. For more information, see
+-- <https://docs.aws.amazon.com/iot-sitewise/latest/userguide/interact-with-other-services.html Interacting with other services>
+-- in the /IoT SiteWise User Guide/.
+--
+-- If you omit this parameter, the notification state is set to @DISABLED@.
+updateAssetProperty_propertyNotificationState :: Lens.Lens' UpdateAssetProperty (Prelude.Maybe PropertyNotificationState)
+updateAssetProperty_propertyNotificationState = Lens.lens (\UpdateAssetProperty' {propertyNotificationState} -> propertyNotificationState) (\s@UpdateAssetProperty' {} a -> s {propertyNotificationState = a} :: UpdateAssetProperty)
+
+-- | The unit of measure (such as Newtons or RPM) of the asset property. If
+-- you don\'t specify a value for this parameter, the service uses the
+-- value of the @assetModelProperty@ in the asset model.
+updateAssetProperty_propertyUnit :: Lens.Lens' UpdateAssetProperty (Prelude.Maybe Prelude.Text)
+updateAssetProperty_propertyUnit = Lens.lens (\UpdateAssetProperty' {propertyUnit} -> propertyUnit) (\s@UpdateAssetProperty' {} a -> s {propertyUnit = a} :: UpdateAssetProperty)
+
+-- | The ID of the asset to be updated.
+updateAssetProperty_assetId :: Lens.Lens' UpdateAssetProperty Prelude.Text
+updateAssetProperty_assetId = Lens.lens (\UpdateAssetProperty' {assetId} -> assetId) (\s@UpdateAssetProperty' {} a -> s {assetId = a} :: UpdateAssetProperty)
+
+-- | The ID of the asset property to be updated.
+updateAssetProperty_propertyId :: Lens.Lens' UpdateAssetProperty Prelude.Text
+updateAssetProperty_propertyId = Lens.lens (\UpdateAssetProperty' {propertyId} -> propertyId) (\s@UpdateAssetProperty' {} a -> s {propertyId = a} :: UpdateAssetProperty)
+
+instance Core.AWSRequest UpdateAssetProperty where
+  type
+    AWSResponse UpdateAssetProperty =
+      UpdateAssetPropertyResponse
+  request overrides =
+    Request.putJSON (overrides defaultService)
+  response =
+    Response.receiveNull UpdateAssetPropertyResponse'
+
+instance Prelude.Hashable UpdateAssetProperty where
+  hashWithSalt _salt UpdateAssetProperty' {..} =
+    _salt
+      `Prelude.hashWithSalt` clientToken
+      `Prelude.hashWithSalt` propertyAlias
+      `Prelude.hashWithSalt` propertyNotificationState
+      `Prelude.hashWithSalt` propertyUnit
+      `Prelude.hashWithSalt` assetId
+      `Prelude.hashWithSalt` propertyId
+
+instance Prelude.NFData UpdateAssetProperty where
+  rnf UpdateAssetProperty' {..} =
+    Prelude.rnf clientToken
+      `Prelude.seq` Prelude.rnf propertyAlias
+      `Prelude.seq` Prelude.rnf propertyNotificationState
+      `Prelude.seq` Prelude.rnf propertyUnit
+      `Prelude.seq` Prelude.rnf assetId
+      `Prelude.seq` Prelude.rnf propertyId
+
+instance Data.ToHeaders UpdateAssetProperty where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON UpdateAssetProperty where
+  toJSON UpdateAssetProperty' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("clientToken" Data..=) Prelude.<$> clientToken,
+            ("propertyAlias" Data..=) Prelude.<$> propertyAlias,
+            ("propertyNotificationState" Data..=)
+              Prelude.<$> propertyNotificationState,
+            ("propertyUnit" Data..=) Prelude.<$> propertyUnit
+          ]
+      )
+
+instance Data.ToPath UpdateAssetProperty where
+  toPath UpdateAssetProperty' {..} =
+    Prelude.mconcat
+      [ "/assets/",
+        Data.toBS assetId,
+        "/properties/",
+        Data.toBS propertyId
+      ]
+
+instance Data.ToQuery UpdateAssetProperty where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newUpdateAssetPropertyResponse' smart constructor.
+data UpdateAssetPropertyResponse = UpdateAssetPropertyResponse'
+  {
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'UpdateAssetPropertyResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+newUpdateAssetPropertyResponse ::
+  UpdateAssetPropertyResponse
+newUpdateAssetPropertyResponse =
+  UpdateAssetPropertyResponse'
+
+instance Prelude.NFData UpdateAssetPropertyResponse where
+  rnf _ = ()
diff --git a/gen/Amazonka/IoTSiteWise/UpdateDashboard.hs b/gen/Amazonka/IoTSiteWise/UpdateDashboard.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/IoTSiteWise/UpdateDashboard.hs
@@ -0,0 +1,231 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.IoTSiteWise.UpdateDashboard
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Updates an IoT SiteWise Monitor dashboard.
+module Amazonka.IoTSiteWise.UpdateDashboard
+  ( -- * Creating a Request
+    UpdateDashboard (..),
+    newUpdateDashboard,
+
+    -- * Request Lenses
+    updateDashboard_clientToken,
+    updateDashboard_dashboardDescription,
+    updateDashboard_dashboardId,
+    updateDashboard_dashboardName,
+    updateDashboard_dashboardDefinition,
+
+    -- * Destructuring the Response
+    UpdateDashboardResponse (..),
+    newUpdateDashboardResponse,
+
+    -- * Response Lenses
+    updateDashboardResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.IoTSiteWise.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newUpdateDashboard' smart constructor.
+data UpdateDashboard = UpdateDashboard'
+  { -- | A unique case-sensitive identifier that you can provide to ensure the
+    -- idempotency of the request. Don\'t reuse this client token if a new
+    -- idempotent request is required.
+    clientToken :: Prelude.Maybe Prelude.Text,
+    -- | A new description for the dashboard.
+    dashboardDescription :: Prelude.Maybe Prelude.Text,
+    -- | The ID of the dashboard to update.
+    dashboardId :: Prelude.Text,
+    -- | A new friendly name for the dashboard.
+    dashboardName :: Prelude.Text,
+    -- | The new dashboard definition, as specified in a JSON literal. For
+    -- detailed information, see
+    -- <https://docs.aws.amazon.com/iot-sitewise/latest/userguide/create-dashboards-using-aws-cli.html Creating dashboards (CLI)>
+    -- in the /IoT SiteWise User Guide/.
+    dashboardDefinition :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'UpdateDashboard' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'clientToken', 'updateDashboard_clientToken' - A unique case-sensitive identifier that you can provide to ensure the
+-- idempotency of the request. Don\'t reuse this client token if a new
+-- idempotent request is required.
+--
+-- 'dashboardDescription', 'updateDashboard_dashboardDescription' - A new description for the dashboard.
+--
+-- 'dashboardId', 'updateDashboard_dashboardId' - The ID of the dashboard to update.
+--
+-- 'dashboardName', 'updateDashboard_dashboardName' - A new friendly name for the dashboard.
+--
+-- 'dashboardDefinition', 'updateDashboard_dashboardDefinition' - The new dashboard definition, as specified in a JSON literal. For
+-- detailed information, see
+-- <https://docs.aws.amazon.com/iot-sitewise/latest/userguide/create-dashboards-using-aws-cli.html Creating dashboards (CLI)>
+-- in the /IoT SiteWise User Guide/.
+newUpdateDashboard ::
+  -- | 'dashboardId'
+  Prelude.Text ->
+  -- | 'dashboardName'
+  Prelude.Text ->
+  -- | 'dashboardDefinition'
+  Prelude.Text ->
+  UpdateDashboard
+newUpdateDashboard
+  pDashboardId_
+  pDashboardName_
+  pDashboardDefinition_ =
+    UpdateDashboard'
+      { clientToken = Prelude.Nothing,
+        dashboardDescription = Prelude.Nothing,
+        dashboardId = pDashboardId_,
+        dashboardName = pDashboardName_,
+        dashboardDefinition = pDashboardDefinition_
+      }
+
+-- | A unique case-sensitive identifier that you can provide to ensure the
+-- idempotency of the request. Don\'t reuse this client token if a new
+-- idempotent request is required.
+updateDashboard_clientToken :: Lens.Lens' UpdateDashboard (Prelude.Maybe Prelude.Text)
+updateDashboard_clientToken = Lens.lens (\UpdateDashboard' {clientToken} -> clientToken) (\s@UpdateDashboard' {} a -> s {clientToken = a} :: UpdateDashboard)
+
+-- | A new description for the dashboard.
+updateDashboard_dashboardDescription :: Lens.Lens' UpdateDashboard (Prelude.Maybe Prelude.Text)
+updateDashboard_dashboardDescription = Lens.lens (\UpdateDashboard' {dashboardDescription} -> dashboardDescription) (\s@UpdateDashboard' {} a -> s {dashboardDescription = a} :: UpdateDashboard)
+
+-- | The ID of the dashboard to update.
+updateDashboard_dashboardId :: Lens.Lens' UpdateDashboard Prelude.Text
+updateDashboard_dashboardId = Lens.lens (\UpdateDashboard' {dashboardId} -> dashboardId) (\s@UpdateDashboard' {} a -> s {dashboardId = a} :: UpdateDashboard)
+
+-- | A new friendly name for the dashboard.
+updateDashboard_dashboardName :: Lens.Lens' UpdateDashboard Prelude.Text
+updateDashboard_dashboardName = Lens.lens (\UpdateDashboard' {dashboardName} -> dashboardName) (\s@UpdateDashboard' {} a -> s {dashboardName = a} :: UpdateDashboard)
+
+-- | The new dashboard definition, as specified in a JSON literal. For
+-- detailed information, see
+-- <https://docs.aws.amazon.com/iot-sitewise/latest/userguide/create-dashboards-using-aws-cli.html Creating dashboards (CLI)>
+-- in the /IoT SiteWise User Guide/.
+updateDashboard_dashboardDefinition :: Lens.Lens' UpdateDashboard Prelude.Text
+updateDashboard_dashboardDefinition = Lens.lens (\UpdateDashboard' {dashboardDefinition} -> dashboardDefinition) (\s@UpdateDashboard' {} a -> s {dashboardDefinition = a} :: UpdateDashboard)
+
+instance Core.AWSRequest UpdateDashboard where
+  type
+    AWSResponse UpdateDashboard =
+      UpdateDashboardResponse
+  request overrides =
+    Request.putJSON (overrides defaultService)
+  response =
+    Response.receiveEmpty
+      ( \s h x ->
+          UpdateDashboardResponse'
+            Prelude.<$> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable UpdateDashboard where
+  hashWithSalt _salt UpdateDashboard' {..} =
+    _salt
+      `Prelude.hashWithSalt` clientToken
+      `Prelude.hashWithSalt` dashboardDescription
+      `Prelude.hashWithSalt` dashboardId
+      `Prelude.hashWithSalt` dashboardName
+      `Prelude.hashWithSalt` dashboardDefinition
+
+instance Prelude.NFData UpdateDashboard where
+  rnf UpdateDashboard' {..} =
+    Prelude.rnf clientToken
+      `Prelude.seq` Prelude.rnf dashboardDescription
+      `Prelude.seq` Prelude.rnf dashboardId
+      `Prelude.seq` Prelude.rnf dashboardName
+      `Prelude.seq` Prelude.rnf dashboardDefinition
+
+instance Data.ToHeaders UpdateDashboard where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON UpdateDashboard where
+  toJSON UpdateDashboard' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("clientToken" Data..=) Prelude.<$> clientToken,
+            ("dashboardDescription" Data..=)
+              Prelude.<$> dashboardDescription,
+            Prelude.Just ("dashboardName" Data..= dashboardName),
+            Prelude.Just
+              ("dashboardDefinition" Data..= dashboardDefinition)
+          ]
+      )
+
+instance Data.ToPath UpdateDashboard where
+  toPath UpdateDashboard' {..} =
+    Prelude.mconcat
+      ["/dashboards/", Data.toBS dashboardId]
+
+instance Data.ToQuery UpdateDashboard where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newUpdateDashboardResponse' smart constructor.
+data UpdateDashboardResponse = UpdateDashboardResponse'
+  { -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'UpdateDashboardResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'httpStatus', 'updateDashboardResponse_httpStatus' - The response's http status code.
+newUpdateDashboardResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  UpdateDashboardResponse
+newUpdateDashboardResponse pHttpStatus_ =
+  UpdateDashboardResponse' {httpStatus = pHttpStatus_}
+
+-- | The response's http status code.
+updateDashboardResponse_httpStatus :: Lens.Lens' UpdateDashboardResponse Prelude.Int
+updateDashboardResponse_httpStatus = Lens.lens (\UpdateDashboardResponse' {httpStatus} -> httpStatus) (\s@UpdateDashboardResponse' {} a -> s {httpStatus = a} :: UpdateDashboardResponse)
+
+instance Prelude.NFData UpdateDashboardResponse where
+  rnf UpdateDashboardResponse' {..} =
+    Prelude.rnf httpStatus
diff --git a/gen/Amazonka/IoTSiteWise/UpdateGateway.hs b/gen/Amazonka/IoTSiteWise/UpdateGateway.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/IoTSiteWise/UpdateGateway.hs
@@ -0,0 +1,148 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.IoTSiteWise.UpdateGateway
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Updates a gateway\'s name.
+module Amazonka.IoTSiteWise.UpdateGateway
+  ( -- * Creating a Request
+    UpdateGateway (..),
+    newUpdateGateway,
+
+    -- * Request Lenses
+    updateGateway_gatewayId,
+    updateGateway_gatewayName,
+
+    -- * Destructuring the Response
+    UpdateGatewayResponse (..),
+    newUpdateGatewayResponse,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.IoTSiteWise.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newUpdateGateway' smart constructor.
+data UpdateGateway = UpdateGateway'
+  { -- | The ID of the gateway to update.
+    gatewayId :: Prelude.Text,
+    -- | A unique, friendly name for the gateway.
+    gatewayName :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'UpdateGateway' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'gatewayId', 'updateGateway_gatewayId' - The ID of the gateway to update.
+--
+-- 'gatewayName', 'updateGateway_gatewayName' - A unique, friendly name for the gateway.
+newUpdateGateway ::
+  -- | 'gatewayId'
+  Prelude.Text ->
+  -- | 'gatewayName'
+  Prelude.Text ->
+  UpdateGateway
+newUpdateGateway pGatewayId_ pGatewayName_ =
+  UpdateGateway'
+    { gatewayId = pGatewayId_,
+      gatewayName = pGatewayName_
+    }
+
+-- | The ID of the gateway to update.
+updateGateway_gatewayId :: Lens.Lens' UpdateGateway Prelude.Text
+updateGateway_gatewayId = Lens.lens (\UpdateGateway' {gatewayId} -> gatewayId) (\s@UpdateGateway' {} a -> s {gatewayId = a} :: UpdateGateway)
+
+-- | A unique, friendly name for the gateway.
+updateGateway_gatewayName :: Lens.Lens' UpdateGateway Prelude.Text
+updateGateway_gatewayName = Lens.lens (\UpdateGateway' {gatewayName} -> gatewayName) (\s@UpdateGateway' {} a -> s {gatewayName = a} :: UpdateGateway)
+
+instance Core.AWSRequest UpdateGateway where
+  type
+    AWSResponse UpdateGateway =
+      UpdateGatewayResponse
+  request overrides =
+    Request.putJSON (overrides defaultService)
+  response =
+    Response.receiveNull UpdateGatewayResponse'
+
+instance Prelude.Hashable UpdateGateway where
+  hashWithSalt _salt UpdateGateway' {..} =
+    _salt
+      `Prelude.hashWithSalt` gatewayId
+      `Prelude.hashWithSalt` gatewayName
+
+instance Prelude.NFData UpdateGateway where
+  rnf UpdateGateway' {..} =
+    Prelude.rnf gatewayId
+      `Prelude.seq` Prelude.rnf gatewayName
+
+instance Data.ToHeaders UpdateGateway where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON UpdateGateway where
+  toJSON UpdateGateway' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [Prelude.Just ("gatewayName" Data..= gatewayName)]
+      )
+
+instance Data.ToPath UpdateGateway where
+  toPath UpdateGateway' {..} =
+    Prelude.mconcat
+      ["/20200301/gateways/", Data.toBS gatewayId]
+
+instance Data.ToQuery UpdateGateway where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newUpdateGatewayResponse' smart constructor.
+data UpdateGatewayResponse = UpdateGatewayResponse'
+  {
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'UpdateGatewayResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+newUpdateGatewayResponse ::
+  UpdateGatewayResponse
+newUpdateGatewayResponse = UpdateGatewayResponse'
+
+instance Prelude.NFData UpdateGatewayResponse where
+  rnf _ = ()
diff --git a/gen/Amazonka/IoTSiteWise/UpdateGatewayCapabilityConfiguration.hs b/gen/Amazonka/IoTSiteWise/UpdateGatewayCapabilityConfiguration.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/IoTSiteWise/UpdateGatewayCapabilityConfiguration.hs
@@ -0,0 +1,324 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.IoTSiteWise.UpdateGatewayCapabilityConfiguration
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Updates a gateway capability configuration or defines a new capability
+-- configuration. Each gateway capability defines data sources for a
+-- gateway. A capability configuration can contain multiple data source
+-- configurations. If you define OPC-UA sources for a gateway in the IoT
+-- SiteWise console, all of your OPC-UA sources are stored in one
+-- capability configuration. To list all capability configurations for a
+-- gateway, use
+-- <https://docs.aws.amazon.com/iot-sitewise/latest/APIReference/API_DescribeGateway.html DescribeGateway>.
+module Amazonka.IoTSiteWise.UpdateGatewayCapabilityConfiguration
+  ( -- * Creating a Request
+    UpdateGatewayCapabilityConfiguration (..),
+    newUpdateGatewayCapabilityConfiguration,
+
+    -- * Request Lenses
+    updateGatewayCapabilityConfiguration_gatewayId,
+    updateGatewayCapabilityConfiguration_capabilityNamespace,
+    updateGatewayCapabilityConfiguration_capabilityConfiguration,
+
+    -- * Destructuring the Response
+    UpdateGatewayCapabilityConfigurationResponse (..),
+    newUpdateGatewayCapabilityConfigurationResponse,
+
+    -- * Response Lenses
+    updateGatewayCapabilityConfigurationResponse_httpStatus,
+    updateGatewayCapabilityConfigurationResponse_capabilityNamespace,
+    updateGatewayCapabilityConfigurationResponse_capabilitySyncStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.IoTSiteWise.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newUpdateGatewayCapabilityConfiguration' smart constructor.
+data UpdateGatewayCapabilityConfiguration = UpdateGatewayCapabilityConfiguration'
+  { -- | The ID of the gateway to be updated.
+    gatewayId :: Prelude.Text,
+    -- | The namespace of the gateway capability configuration to be updated. For
+    -- example, if you configure OPC-UA sources from the IoT SiteWise console,
+    -- your OPC-UA capability configuration has the namespace
+    -- @iotsitewise:opcuacollector:version@, where @version@ is a number such
+    -- as @1@.
+    capabilityNamespace :: Prelude.Text,
+    -- | The JSON document that defines the configuration for the gateway
+    -- capability. For more information, see
+    -- <https://docs.aws.amazon.com/iot-sitewise/latest/userguide/configure-sources.html#configure-source-cli Configuring data sources (CLI)>
+    -- in the /IoT SiteWise User Guide/.
+    capabilityConfiguration :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'UpdateGatewayCapabilityConfiguration' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'gatewayId', 'updateGatewayCapabilityConfiguration_gatewayId' - The ID of the gateway to be updated.
+--
+-- 'capabilityNamespace', 'updateGatewayCapabilityConfiguration_capabilityNamespace' - The namespace of the gateway capability configuration to be updated. For
+-- example, if you configure OPC-UA sources from the IoT SiteWise console,
+-- your OPC-UA capability configuration has the namespace
+-- @iotsitewise:opcuacollector:version@, where @version@ is a number such
+-- as @1@.
+--
+-- 'capabilityConfiguration', 'updateGatewayCapabilityConfiguration_capabilityConfiguration' - The JSON document that defines the configuration for the gateway
+-- capability. For more information, see
+-- <https://docs.aws.amazon.com/iot-sitewise/latest/userguide/configure-sources.html#configure-source-cli Configuring data sources (CLI)>
+-- in the /IoT SiteWise User Guide/.
+newUpdateGatewayCapabilityConfiguration ::
+  -- | 'gatewayId'
+  Prelude.Text ->
+  -- | 'capabilityNamespace'
+  Prelude.Text ->
+  -- | 'capabilityConfiguration'
+  Prelude.Text ->
+  UpdateGatewayCapabilityConfiguration
+newUpdateGatewayCapabilityConfiguration
+  pGatewayId_
+  pCapabilityNamespace_
+  pCapabilityConfiguration_ =
+    UpdateGatewayCapabilityConfiguration'
+      { gatewayId =
+          pGatewayId_,
+        capabilityNamespace =
+          pCapabilityNamespace_,
+        capabilityConfiguration =
+          pCapabilityConfiguration_
+      }
+
+-- | The ID of the gateway to be updated.
+updateGatewayCapabilityConfiguration_gatewayId :: Lens.Lens' UpdateGatewayCapabilityConfiguration Prelude.Text
+updateGatewayCapabilityConfiguration_gatewayId = Lens.lens (\UpdateGatewayCapabilityConfiguration' {gatewayId} -> gatewayId) (\s@UpdateGatewayCapabilityConfiguration' {} a -> s {gatewayId = a} :: UpdateGatewayCapabilityConfiguration)
+
+-- | The namespace of the gateway capability configuration to be updated. For
+-- example, if you configure OPC-UA sources from the IoT SiteWise console,
+-- your OPC-UA capability configuration has the namespace
+-- @iotsitewise:opcuacollector:version@, where @version@ is a number such
+-- as @1@.
+updateGatewayCapabilityConfiguration_capabilityNamespace :: Lens.Lens' UpdateGatewayCapabilityConfiguration Prelude.Text
+updateGatewayCapabilityConfiguration_capabilityNamespace = Lens.lens (\UpdateGatewayCapabilityConfiguration' {capabilityNamespace} -> capabilityNamespace) (\s@UpdateGatewayCapabilityConfiguration' {} a -> s {capabilityNamespace = a} :: UpdateGatewayCapabilityConfiguration)
+
+-- | The JSON document that defines the configuration for the gateway
+-- capability. For more information, see
+-- <https://docs.aws.amazon.com/iot-sitewise/latest/userguide/configure-sources.html#configure-source-cli Configuring data sources (CLI)>
+-- in the /IoT SiteWise User Guide/.
+updateGatewayCapabilityConfiguration_capabilityConfiguration :: Lens.Lens' UpdateGatewayCapabilityConfiguration Prelude.Text
+updateGatewayCapabilityConfiguration_capabilityConfiguration = Lens.lens (\UpdateGatewayCapabilityConfiguration' {capabilityConfiguration} -> capabilityConfiguration) (\s@UpdateGatewayCapabilityConfiguration' {} a -> s {capabilityConfiguration = a} :: UpdateGatewayCapabilityConfiguration)
+
+instance
+  Core.AWSRequest
+    UpdateGatewayCapabilityConfiguration
+  where
+  type
+    AWSResponse UpdateGatewayCapabilityConfiguration =
+      UpdateGatewayCapabilityConfigurationResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          UpdateGatewayCapabilityConfigurationResponse'
+            Prelude.<$> (Prelude.pure (Prelude.fromEnum s))
+            Prelude.<*> (x Data..:> "capabilityNamespace")
+            Prelude.<*> (x Data..:> "capabilitySyncStatus")
+      )
+
+instance
+  Prelude.Hashable
+    UpdateGatewayCapabilityConfiguration
+  where
+  hashWithSalt
+    _salt
+    UpdateGatewayCapabilityConfiguration' {..} =
+      _salt
+        `Prelude.hashWithSalt` gatewayId
+        `Prelude.hashWithSalt` capabilityNamespace
+        `Prelude.hashWithSalt` capabilityConfiguration
+
+instance
+  Prelude.NFData
+    UpdateGatewayCapabilityConfiguration
+  where
+  rnf UpdateGatewayCapabilityConfiguration' {..} =
+    Prelude.rnf gatewayId
+      `Prelude.seq` Prelude.rnf capabilityNamespace
+      `Prelude.seq` Prelude.rnf capabilityConfiguration
+
+instance
+  Data.ToHeaders
+    UpdateGatewayCapabilityConfiguration
+  where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance
+  Data.ToJSON
+    UpdateGatewayCapabilityConfiguration
+  where
+  toJSON UpdateGatewayCapabilityConfiguration' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ Prelude.Just
+              ("capabilityNamespace" Data..= capabilityNamespace),
+            Prelude.Just
+              ( "capabilityConfiguration"
+                  Data..= capabilityConfiguration
+              )
+          ]
+      )
+
+instance
+  Data.ToPath
+    UpdateGatewayCapabilityConfiguration
+  where
+  toPath UpdateGatewayCapabilityConfiguration' {..} =
+    Prelude.mconcat
+      [ "/20200301/gateways/",
+        Data.toBS gatewayId,
+        "/capability"
+      ]
+
+instance
+  Data.ToQuery
+    UpdateGatewayCapabilityConfiguration
+  where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newUpdateGatewayCapabilityConfigurationResponse' smart constructor.
+data UpdateGatewayCapabilityConfigurationResponse = UpdateGatewayCapabilityConfigurationResponse'
+  { -- | The response's http status code.
+    httpStatus :: Prelude.Int,
+    -- | The namespace of the gateway capability.
+    capabilityNamespace :: Prelude.Text,
+    -- | The synchronization status of the capability configuration. The sync
+    -- status can be one of the following:
+    --
+    -- -   @IN_SYNC@ – The gateway is running the capability configuration.
+    --
+    -- -   @OUT_OF_SYNC@ – The gateway hasn\'t received the capability
+    --     configuration.
+    --
+    -- -   @SYNC_FAILED@ – The gateway rejected the capability configuration.
+    --
+    -- After you update a capability configuration, its sync status is
+    -- @OUT_OF_SYNC@ until the gateway receives and applies or rejects the
+    -- updated configuration.
+    capabilitySyncStatus :: CapabilitySyncStatus
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'UpdateGatewayCapabilityConfigurationResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'httpStatus', 'updateGatewayCapabilityConfigurationResponse_httpStatus' - The response's http status code.
+--
+-- 'capabilityNamespace', 'updateGatewayCapabilityConfigurationResponse_capabilityNamespace' - The namespace of the gateway capability.
+--
+-- 'capabilitySyncStatus', 'updateGatewayCapabilityConfigurationResponse_capabilitySyncStatus' - The synchronization status of the capability configuration. The sync
+-- status can be one of the following:
+--
+-- -   @IN_SYNC@ – The gateway is running the capability configuration.
+--
+-- -   @OUT_OF_SYNC@ – The gateway hasn\'t received the capability
+--     configuration.
+--
+-- -   @SYNC_FAILED@ – The gateway rejected the capability configuration.
+--
+-- After you update a capability configuration, its sync status is
+-- @OUT_OF_SYNC@ until the gateway receives and applies or rejects the
+-- updated configuration.
+newUpdateGatewayCapabilityConfigurationResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  -- | 'capabilityNamespace'
+  Prelude.Text ->
+  -- | 'capabilitySyncStatus'
+  CapabilitySyncStatus ->
+  UpdateGatewayCapabilityConfigurationResponse
+newUpdateGatewayCapabilityConfigurationResponse
+  pHttpStatus_
+  pCapabilityNamespace_
+  pCapabilitySyncStatus_ =
+    UpdateGatewayCapabilityConfigurationResponse'
+      { httpStatus =
+          pHttpStatus_,
+        capabilityNamespace =
+          pCapabilityNamespace_,
+        capabilitySyncStatus =
+          pCapabilitySyncStatus_
+      }
+
+-- | The response's http status code.
+updateGatewayCapabilityConfigurationResponse_httpStatus :: Lens.Lens' UpdateGatewayCapabilityConfigurationResponse Prelude.Int
+updateGatewayCapabilityConfigurationResponse_httpStatus = Lens.lens (\UpdateGatewayCapabilityConfigurationResponse' {httpStatus} -> httpStatus) (\s@UpdateGatewayCapabilityConfigurationResponse' {} a -> s {httpStatus = a} :: UpdateGatewayCapabilityConfigurationResponse)
+
+-- | The namespace of the gateway capability.
+updateGatewayCapabilityConfigurationResponse_capabilityNamespace :: Lens.Lens' UpdateGatewayCapabilityConfigurationResponse Prelude.Text
+updateGatewayCapabilityConfigurationResponse_capabilityNamespace = Lens.lens (\UpdateGatewayCapabilityConfigurationResponse' {capabilityNamespace} -> capabilityNamespace) (\s@UpdateGatewayCapabilityConfigurationResponse' {} a -> s {capabilityNamespace = a} :: UpdateGatewayCapabilityConfigurationResponse)
+
+-- | The synchronization status of the capability configuration. The sync
+-- status can be one of the following:
+--
+-- -   @IN_SYNC@ – The gateway is running the capability configuration.
+--
+-- -   @OUT_OF_SYNC@ – The gateway hasn\'t received the capability
+--     configuration.
+--
+-- -   @SYNC_FAILED@ – The gateway rejected the capability configuration.
+--
+-- After you update a capability configuration, its sync status is
+-- @OUT_OF_SYNC@ until the gateway receives and applies or rejects the
+-- updated configuration.
+updateGatewayCapabilityConfigurationResponse_capabilitySyncStatus :: Lens.Lens' UpdateGatewayCapabilityConfigurationResponse CapabilitySyncStatus
+updateGatewayCapabilityConfigurationResponse_capabilitySyncStatus = Lens.lens (\UpdateGatewayCapabilityConfigurationResponse' {capabilitySyncStatus} -> capabilitySyncStatus) (\s@UpdateGatewayCapabilityConfigurationResponse' {} a -> s {capabilitySyncStatus = a} :: UpdateGatewayCapabilityConfigurationResponse)
+
+instance
+  Prelude.NFData
+    UpdateGatewayCapabilityConfigurationResponse
+  where
+  rnf UpdateGatewayCapabilityConfigurationResponse' {..} =
+    Prelude.rnf httpStatus
+      `Prelude.seq` Prelude.rnf capabilityNamespace
+      `Prelude.seq` Prelude.rnf capabilitySyncStatus
diff --git a/gen/Amazonka/IoTSiteWise/UpdatePortal.hs b/gen/Amazonka/IoTSiteWise/UpdatePortal.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/IoTSiteWise/UpdatePortal.hs
@@ -0,0 +1,324 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.IoTSiteWise.UpdatePortal
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Updates an IoT SiteWise Monitor portal.
+module Amazonka.IoTSiteWise.UpdatePortal
+  ( -- * Creating a Request
+    UpdatePortal (..),
+    newUpdatePortal,
+
+    -- * Request Lenses
+    updatePortal_alarms,
+    updatePortal_clientToken,
+    updatePortal_notificationSenderEmail,
+    updatePortal_portalDescription,
+    updatePortal_portalLogoImage,
+    updatePortal_portalId,
+    updatePortal_portalName,
+    updatePortal_portalContactEmail,
+    updatePortal_roleArn,
+
+    -- * Destructuring the Response
+    UpdatePortalResponse (..),
+    newUpdatePortalResponse,
+
+    -- * Response Lenses
+    updatePortalResponse_httpStatus,
+    updatePortalResponse_portalStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.IoTSiteWise.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newUpdatePortal' smart constructor.
+data UpdatePortal = UpdatePortal'
+  { -- | Contains the configuration information of an alarm created in an IoT
+    -- SiteWise Monitor portal. You can use the alarm to monitor an asset
+    -- property and get notified when the asset property value is outside a
+    -- specified range. For more information, see
+    -- <https://docs.aws.amazon.com/iot-sitewise/latest/appguide/monitor-alarms.html Monitoring with alarms>
+    -- in the /IoT SiteWise Application Guide/.
+    alarms :: Prelude.Maybe Alarms,
+    -- | A unique case-sensitive identifier that you can provide to ensure the
+    -- idempotency of the request. Don\'t reuse this client token if a new
+    -- idempotent request is required.
+    clientToken :: Prelude.Maybe Prelude.Text,
+    -- | The email address that sends alarm notifications.
+    notificationSenderEmail :: Prelude.Maybe Prelude.Text,
+    -- | A new description for the portal.
+    portalDescription :: Prelude.Maybe Prelude.Text,
+    portalLogoImage :: Prelude.Maybe Image,
+    -- | The ID of the portal to update.
+    portalId :: Prelude.Text,
+    -- | A new friendly name for the portal.
+    portalName :: Prelude.Text,
+    -- | The Amazon Web Services administrator\'s contact email address.
+    portalContactEmail :: Prelude.Text,
+    -- | The
+    -- <https://docs.aws.amazon.com/general/latest/gr/aws-arns-and-namespaces.html ARN>
+    -- of a service role that allows the portal\'s users to access your IoT
+    -- SiteWise resources on your behalf. For more information, see
+    -- <https://docs.aws.amazon.com/iot-sitewise/latest/userguide/monitor-service-role.html Using service roles for IoT SiteWise Monitor>
+    -- in the /IoT SiteWise User Guide/.
+    roleArn :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'UpdatePortal' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'alarms', 'updatePortal_alarms' - Contains the configuration information of an alarm created in an IoT
+-- SiteWise Monitor portal. You can use the alarm to monitor an asset
+-- property and get notified when the asset property value is outside a
+-- specified range. For more information, see
+-- <https://docs.aws.amazon.com/iot-sitewise/latest/appguide/monitor-alarms.html Monitoring with alarms>
+-- in the /IoT SiteWise Application Guide/.
+--
+-- 'clientToken', 'updatePortal_clientToken' - A unique case-sensitive identifier that you can provide to ensure the
+-- idempotency of the request. Don\'t reuse this client token if a new
+-- idempotent request is required.
+--
+-- 'notificationSenderEmail', 'updatePortal_notificationSenderEmail' - The email address that sends alarm notifications.
+--
+-- 'portalDescription', 'updatePortal_portalDescription' - A new description for the portal.
+--
+-- 'portalLogoImage', 'updatePortal_portalLogoImage' - Undocumented member.
+--
+-- 'portalId', 'updatePortal_portalId' - The ID of the portal to update.
+--
+-- 'portalName', 'updatePortal_portalName' - A new friendly name for the portal.
+--
+-- 'portalContactEmail', 'updatePortal_portalContactEmail' - The Amazon Web Services administrator\'s contact email address.
+--
+-- 'roleArn', 'updatePortal_roleArn' - The
+-- <https://docs.aws.amazon.com/general/latest/gr/aws-arns-and-namespaces.html ARN>
+-- of a service role that allows the portal\'s users to access your IoT
+-- SiteWise resources on your behalf. For more information, see
+-- <https://docs.aws.amazon.com/iot-sitewise/latest/userguide/monitor-service-role.html Using service roles for IoT SiteWise Monitor>
+-- in the /IoT SiteWise User Guide/.
+newUpdatePortal ::
+  -- | 'portalId'
+  Prelude.Text ->
+  -- | 'portalName'
+  Prelude.Text ->
+  -- | 'portalContactEmail'
+  Prelude.Text ->
+  -- | 'roleArn'
+  Prelude.Text ->
+  UpdatePortal
+newUpdatePortal
+  pPortalId_
+  pPortalName_
+  pPortalContactEmail_
+  pRoleArn_ =
+    UpdatePortal'
+      { alarms = Prelude.Nothing,
+        clientToken = Prelude.Nothing,
+        notificationSenderEmail = Prelude.Nothing,
+        portalDescription = Prelude.Nothing,
+        portalLogoImage = Prelude.Nothing,
+        portalId = pPortalId_,
+        portalName = pPortalName_,
+        portalContactEmail = pPortalContactEmail_,
+        roleArn = pRoleArn_
+      }
+
+-- | Contains the configuration information of an alarm created in an IoT
+-- SiteWise Monitor portal. You can use the alarm to monitor an asset
+-- property and get notified when the asset property value is outside a
+-- specified range. For more information, see
+-- <https://docs.aws.amazon.com/iot-sitewise/latest/appguide/monitor-alarms.html Monitoring with alarms>
+-- in the /IoT SiteWise Application Guide/.
+updatePortal_alarms :: Lens.Lens' UpdatePortal (Prelude.Maybe Alarms)
+updatePortal_alarms = Lens.lens (\UpdatePortal' {alarms} -> alarms) (\s@UpdatePortal' {} a -> s {alarms = a} :: UpdatePortal)
+
+-- | A unique case-sensitive identifier that you can provide to ensure the
+-- idempotency of the request. Don\'t reuse this client token if a new
+-- idempotent request is required.
+updatePortal_clientToken :: Lens.Lens' UpdatePortal (Prelude.Maybe Prelude.Text)
+updatePortal_clientToken = Lens.lens (\UpdatePortal' {clientToken} -> clientToken) (\s@UpdatePortal' {} a -> s {clientToken = a} :: UpdatePortal)
+
+-- | The email address that sends alarm notifications.
+updatePortal_notificationSenderEmail :: Lens.Lens' UpdatePortal (Prelude.Maybe Prelude.Text)
+updatePortal_notificationSenderEmail = Lens.lens (\UpdatePortal' {notificationSenderEmail} -> notificationSenderEmail) (\s@UpdatePortal' {} a -> s {notificationSenderEmail = a} :: UpdatePortal)
+
+-- | A new description for the portal.
+updatePortal_portalDescription :: Lens.Lens' UpdatePortal (Prelude.Maybe Prelude.Text)
+updatePortal_portalDescription = Lens.lens (\UpdatePortal' {portalDescription} -> portalDescription) (\s@UpdatePortal' {} a -> s {portalDescription = a} :: UpdatePortal)
+
+-- | Undocumented member.
+updatePortal_portalLogoImage :: Lens.Lens' UpdatePortal (Prelude.Maybe Image)
+updatePortal_portalLogoImage = Lens.lens (\UpdatePortal' {portalLogoImage} -> portalLogoImage) (\s@UpdatePortal' {} a -> s {portalLogoImage = a} :: UpdatePortal)
+
+-- | The ID of the portal to update.
+updatePortal_portalId :: Lens.Lens' UpdatePortal Prelude.Text
+updatePortal_portalId = Lens.lens (\UpdatePortal' {portalId} -> portalId) (\s@UpdatePortal' {} a -> s {portalId = a} :: UpdatePortal)
+
+-- | A new friendly name for the portal.
+updatePortal_portalName :: Lens.Lens' UpdatePortal Prelude.Text
+updatePortal_portalName = Lens.lens (\UpdatePortal' {portalName} -> portalName) (\s@UpdatePortal' {} a -> s {portalName = a} :: UpdatePortal)
+
+-- | The Amazon Web Services administrator\'s contact email address.
+updatePortal_portalContactEmail :: Lens.Lens' UpdatePortal Prelude.Text
+updatePortal_portalContactEmail = Lens.lens (\UpdatePortal' {portalContactEmail} -> portalContactEmail) (\s@UpdatePortal' {} a -> s {portalContactEmail = a} :: UpdatePortal)
+
+-- | The
+-- <https://docs.aws.amazon.com/general/latest/gr/aws-arns-and-namespaces.html ARN>
+-- of a service role that allows the portal\'s users to access your IoT
+-- SiteWise resources on your behalf. For more information, see
+-- <https://docs.aws.amazon.com/iot-sitewise/latest/userguide/monitor-service-role.html Using service roles for IoT SiteWise Monitor>
+-- in the /IoT SiteWise User Guide/.
+updatePortal_roleArn :: Lens.Lens' UpdatePortal Prelude.Text
+updatePortal_roleArn = Lens.lens (\UpdatePortal' {roleArn} -> roleArn) (\s@UpdatePortal' {} a -> s {roleArn = a} :: UpdatePortal)
+
+instance Core.AWSRequest UpdatePortal where
+  type AWSResponse UpdatePortal = UpdatePortalResponse
+  request overrides =
+    Request.putJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          UpdatePortalResponse'
+            Prelude.<$> (Prelude.pure (Prelude.fromEnum s))
+            Prelude.<*> (x Data..:> "portalStatus")
+      )
+
+instance Prelude.Hashable UpdatePortal where
+  hashWithSalt _salt UpdatePortal' {..} =
+    _salt
+      `Prelude.hashWithSalt` alarms
+      `Prelude.hashWithSalt` clientToken
+      `Prelude.hashWithSalt` notificationSenderEmail
+      `Prelude.hashWithSalt` portalDescription
+      `Prelude.hashWithSalt` portalLogoImage
+      `Prelude.hashWithSalt` portalId
+      `Prelude.hashWithSalt` portalName
+      `Prelude.hashWithSalt` portalContactEmail
+      `Prelude.hashWithSalt` roleArn
+
+instance Prelude.NFData UpdatePortal where
+  rnf UpdatePortal' {..} =
+    Prelude.rnf alarms
+      `Prelude.seq` Prelude.rnf clientToken
+      `Prelude.seq` Prelude.rnf notificationSenderEmail
+      `Prelude.seq` Prelude.rnf portalDescription
+      `Prelude.seq` Prelude.rnf portalLogoImage
+      `Prelude.seq` Prelude.rnf portalId
+      `Prelude.seq` Prelude.rnf portalName
+      `Prelude.seq` Prelude.rnf portalContactEmail
+      `Prelude.seq` Prelude.rnf roleArn
+
+instance Data.ToHeaders UpdatePortal where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON UpdatePortal where
+  toJSON UpdatePortal' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("alarms" Data..=) Prelude.<$> alarms,
+            ("clientToken" Data..=) Prelude.<$> clientToken,
+            ("notificationSenderEmail" Data..=)
+              Prelude.<$> notificationSenderEmail,
+            ("portalDescription" Data..=)
+              Prelude.<$> portalDescription,
+            ("portalLogoImage" Data..=)
+              Prelude.<$> portalLogoImage,
+            Prelude.Just ("portalName" Data..= portalName),
+            Prelude.Just
+              ("portalContactEmail" Data..= portalContactEmail),
+            Prelude.Just ("roleArn" Data..= roleArn)
+          ]
+      )
+
+instance Data.ToPath UpdatePortal where
+  toPath UpdatePortal' {..} =
+    Prelude.mconcat ["/portals/", Data.toBS portalId]
+
+instance Data.ToQuery UpdatePortal where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newUpdatePortalResponse' smart constructor.
+data UpdatePortalResponse = UpdatePortalResponse'
+  { -- | The response's http status code.
+    httpStatus :: Prelude.Int,
+    -- | The status of the portal, which contains a state (@UPDATING@ after
+    -- successfully calling this operation) and any error message.
+    portalStatus :: PortalStatus
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'UpdatePortalResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'httpStatus', 'updatePortalResponse_httpStatus' - The response's http status code.
+--
+-- 'portalStatus', 'updatePortalResponse_portalStatus' - The status of the portal, which contains a state (@UPDATING@ after
+-- successfully calling this operation) and any error message.
+newUpdatePortalResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  -- | 'portalStatus'
+  PortalStatus ->
+  UpdatePortalResponse
+newUpdatePortalResponse pHttpStatus_ pPortalStatus_ =
+  UpdatePortalResponse'
+    { httpStatus = pHttpStatus_,
+      portalStatus = pPortalStatus_
+    }
+
+-- | The response's http status code.
+updatePortalResponse_httpStatus :: Lens.Lens' UpdatePortalResponse Prelude.Int
+updatePortalResponse_httpStatus = Lens.lens (\UpdatePortalResponse' {httpStatus} -> httpStatus) (\s@UpdatePortalResponse' {} a -> s {httpStatus = a} :: UpdatePortalResponse)
+
+-- | The status of the portal, which contains a state (@UPDATING@ after
+-- successfully calling this operation) and any error message.
+updatePortalResponse_portalStatus :: Lens.Lens' UpdatePortalResponse PortalStatus
+updatePortalResponse_portalStatus = Lens.lens (\UpdatePortalResponse' {portalStatus} -> portalStatus) (\s@UpdatePortalResponse' {} a -> s {portalStatus = a} :: UpdatePortalResponse)
+
+instance Prelude.NFData UpdatePortalResponse where
+  rnf UpdatePortalResponse' {..} =
+    Prelude.rnf httpStatus
+      `Prelude.seq` Prelude.rnf portalStatus
diff --git a/gen/Amazonka/IoTSiteWise/UpdateProject.hs b/gen/Amazonka/IoTSiteWise/UpdateProject.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/IoTSiteWise/UpdateProject.hs
@@ -0,0 +1,202 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.IoTSiteWise.UpdateProject
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Updates an IoT SiteWise Monitor project.
+module Amazonka.IoTSiteWise.UpdateProject
+  ( -- * Creating a Request
+    UpdateProject (..),
+    newUpdateProject,
+
+    -- * Request Lenses
+    updateProject_clientToken,
+    updateProject_projectDescription,
+    updateProject_projectId,
+    updateProject_projectName,
+
+    -- * Destructuring the Response
+    UpdateProjectResponse (..),
+    newUpdateProjectResponse,
+
+    -- * Response Lenses
+    updateProjectResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.IoTSiteWise.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newUpdateProject' smart constructor.
+data UpdateProject = UpdateProject'
+  { -- | A unique case-sensitive identifier that you can provide to ensure the
+    -- idempotency of the request. Don\'t reuse this client token if a new
+    -- idempotent request is required.
+    clientToken :: Prelude.Maybe Prelude.Text,
+    -- | A new description for the project.
+    projectDescription :: Prelude.Maybe Prelude.Text,
+    -- | The ID of the project to update.
+    projectId :: Prelude.Text,
+    -- | A new friendly name for the project.
+    projectName :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'UpdateProject' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'clientToken', 'updateProject_clientToken' - A unique case-sensitive identifier that you can provide to ensure the
+-- idempotency of the request. Don\'t reuse this client token if a new
+-- idempotent request is required.
+--
+-- 'projectDescription', 'updateProject_projectDescription' - A new description for the project.
+--
+-- 'projectId', 'updateProject_projectId' - The ID of the project to update.
+--
+-- 'projectName', 'updateProject_projectName' - A new friendly name for the project.
+newUpdateProject ::
+  -- | 'projectId'
+  Prelude.Text ->
+  -- | 'projectName'
+  Prelude.Text ->
+  UpdateProject
+newUpdateProject pProjectId_ pProjectName_ =
+  UpdateProject'
+    { clientToken = Prelude.Nothing,
+      projectDescription = Prelude.Nothing,
+      projectId = pProjectId_,
+      projectName = pProjectName_
+    }
+
+-- | A unique case-sensitive identifier that you can provide to ensure the
+-- idempotency of the request. Don\'t reuse this client token if a new
+-- idempotent request is required.
+updateProject_clientToken :: Lens.Lens' UpdateProject (Prelude.Maybe Prelude.Text)
+updateProject_clientToken = Lens.lens (\UpdateProject' {clientToken} -> clientToken) (\s@UpdateProject' {} a -> s {clientToken = a} :: UpdateProject)
+
+-- | A new description for the project.
+updateProject_projectDescription :: Lens.Lens' UpdateProject (Prelude.Maybe Prelude.Text)
+updateProject_projectDescription = Lens.lens (\UpdateProject' {projectDescription} -> projectDescription) (\s@UpdateProject' {} a -> s {projectDescription = a} :: UpdateProject)
+
+-- | The ID of the project to update.
+updateProject_projectId :: Lens.Lens' UpdateProject Prelude.Text
+updateProject_projectId = Lens.lens (\UpdateProject' {projectId} -> projectId) (\s@UpdateProject' {} a -> s {projectId = a} :: UpdateProject)
+
+-- | A new friendly name for the project.
+updateProject_projectName :: Lens.Lens' UpdateProject Prelude.Text
+updateProject_projectName = Lens.lens (\UpdateProject' {projectName} -> projectName) (\s@UpdateProject' {} a -> s {projectName = a} :: UpdateProject)
+
+instance Core.AWSRequest UpdateProject where
+  type
+    AWSResponse UpdateProject =
+      UpdateProjectResponse
+  request overrides =
+    Request.putJSON (overrides defaultService)
+  response =
+    Response.receiveEmpty
+      ( \s h x ->
+          UpdateProjectResponse'
+            Prelude.<$> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable UpdateProject where
+  hashWithSalt _salt UpdateProject' {..} =
+    _salt
+      `Prelude.hashWithSalt` clientToken
+      `Prelude.hashWithSalt` projectDescription
+      `Prelude.hashWithSalt` projectId
+      `Prelude.hashWithSalt` projectName
+
+instance Prelude.NFData UpdateProject where
+  rnf UpdateProject' {..} =
+    Prelude.rnf clientToken
+      `Prelude.seq` Prelude.rnf projectDescription
+      `Prelude.seq` Prelude.rnf projectId
+      `Prelude.seq` Prelude.rnf projectName
+
+instance Data.ToHeaders UpdateProject where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON UpdateProject where
+  toJSON UpdateProject' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("clientToken" Data..=) Prelude.<$> clientToken,
+            ("projectDescription" Data..=)
+              Prelude.<$> projectDescription,
+            Prelude.Just ("projectName" Data..= projectName)
+          ]
+      )
+
+instance Data.ToPath UpdateProject where
+  toPath UpdateProject' {..} =
+    Prelude.mconcat ["/projects/", Data.toBS projectId]
+
+instance Data.ToQuery UpdateProject where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newUpdateProjectResponse' smart constructor.
+data UpdateProjectResponse = UpdateProjectResponse'
+  { -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'UpdateProjectResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'httpStatus', 'updateProjectResponse_httpStatus' - The response's http status code.
+newUpdateProjectResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  UpdateProjectResponse
+newUpdateProjectResponse pHttpStatus_ =
+  UpdateProjectResponse' {httpStatus = pHttpStatus_}
+
+-- | The response's http status code.
+updateProjectResponse_httpStatus :: Lens.Lens' UpdateProjectResponse Prelude.Int
+updateProjectResponse_httpStatus = Lens.lens (\UpdateProjectResponse' {httpStatus} -> httpStatus) (\s@UpdateProjectResponse' {} a -> s {httpStatus = a} :: UpdateProjectResponse)
+
+instance Prelude.NFData UpdateProjectResponse where
+  rnf UpdateProjectResponse' {..} =
+    Prelude.rnf httpStatus
diff --git a/gen/Amazonka/IoTSiteWise/Waiters.hs b/gen/Amazonka/IoTSiteWise/Waiters.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/IoTSiteWise/Waiters.hs
@@ -0,0 +1,137 @@
+{-# LANGUAGE DisambiguateRecordFields #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.IoTSiteWise.Waiters
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.IoTSiteWise.Waiters where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.IoTSiteWise.DescribeAsset
+import Amazonka.IoTSiteWise.DescribeAssetModel
+import Amazonka.IoTSiteWise.DescribePortal
+import Amazonka.IoTSiteWise.Lens
+import Amazonka.IoTSiteWise.Types
+import qualified Amazonka.Prelude as Prelude
+
+-- | Polls 'Amazonka.IoTSiteWise.DescribeAsset' every 3 seconds until a successful state is reached. An error is returned after 20 failed checks.
+newAssetActive :: Core.Wait DescribeAsset
+newAssetActive =
+  Core.Wait
+    { Core.name = "AssetActive",
+      Core.attempts = 20,
+      Core.delay = 3,
+      Core.acceptors =
+        [ Core.matchAll
+            "ACTIVE"
+            Core.AcceptSuccess
+            ( describeAssetResponse_assetStatus
+                Prelude.. assetStatus_state
+                Prelude.. Lens.to Data.toTextCI
+            ),
+          Core.matchAll
+            "FAILED"
+            Core.AcceptFailure
+            ( describeAssetResponse_assetStatus
+                Prelude.. assetStatus_state
+                Prelude.. Lens.to Data.toTextCI
+            )
+        ]
+    }
+
+-- | Polls 'Amazonka.IoTSiteWise.DescribeAssetModel' every 3 seconds until a successful state is reached. An error is returned after 20 failed checks.
+newAssetModelActive :: Core.Wait DescribeAssetModel
+newAssetModelActive =
+  Core.Wait
+    { Core.name = "AssetModelActive",
+      Core.attempts = 20,
+      Core.delay = 3,
+      Core.acceptors =
+        [ Core.matchAll
+            "ACTIVE"
+            Core.AcceptSuccess
+            ( describeAssetModelResponse_assetModelStatus
+                Prelude.. assetModelStatus_state
+                Prelude.. Lens.to Data.toTextCI
+            ),
+          Core.matchAll
+            "FAILED"
+            Core.AcceptFailure
+            ( describeAssetModelResponse_assetModelStatus
+                Prelude.. assetModelStatus_state
+                Prelude.. Lens.to Data.toTextCI
+            )
+        ]
+    }
+
+-- | Polls 'Amazonka.IoTSiteWise.DescribeAssetModel' every 3 seconds until a successful state is reached. An error is returned after 20 failed checks.
+newAssetModelNotExists :: Core.Wait DescribeAssetModel
+newAssetModelNotExists =
+  Core.Wait
+    { Core.name = "AssetModelNotExists",
+      Core.attempts = 20,
+      Core.delay = 3,
+      Core.acceptors =
+        [ Core.matchError
+            "ResourceNotFoundException"
+            Core.AcceptSuccess
+        ]
+    }
+
+-- | Polls 'Amazonka.IoTSiteWise.DescribeAsset' every 3 seconds until a successful state is reached. An error is returned after 20 failed checks.
+newAssetNotExists :: Core.Wait DescribeAsset
+newAssetNotExists =
+  Core.Wait
+    { Core.name = "AssetNotExists",
+      Core.attempts = 20,
+      Core.delay = 3,
+      Core.acceptors =
+        [ Core.matchError
+            "ResourceNotFoundException"
+            Core.AcceptSuccess
+        ]
+    }
+
+-- | Polls 'Amazonka.IoTSiteWise.DescribePortal' every 3 seconds until a successful state is reached. An error is returned after 20 failed checks.
+newPortalActive :: Core.Wait DescribePortal
+newPortalActive =
+  Core.Wait
+    { Core.name = "PortalActive",
+      Core.attempts = 20,
+      Core.delay = 3,
+      Core.acceptors =
+        [ Core.matchAll
+            "ACTIVE"
+            Core.AcceptSuccess
+            ( describePortalResponse_portalStatus
+                Prelude.. portalStatus_state
+                Prelude.. Lens.to Data.toTextCI
+            )
+        ]
+    }
+
+-- | Polls 'Amazonka.IoTSiteWise.DescribePortal' every 3 seconds until a successful state is reached. An error is returned after 20 failed checks.
+newPortalNotExists :: Core.Wait DescribePortal
+newPortalNotExists =
+  Core.Wait
+    { Core.name = "PortalNotExists",
+      Core.attempts = 20,
+      Core.delay = 3,
+      Core.acceptors =
+        [ Core.matchError
+            "ResourceNotFoundException"
+            Core.AcceptSuccess
+        ]
+    }
diff --git a/src/.gitkeep b/src/.gitkeep
new file mode 100644
--- /dev/null
+++ b/src/.gitkeep
diff --git a/test/Main.hs b/test/Main.hs
new file mode 100644
--- /dev/null
+++ b/test/Main.hs
@@ -0,0 +1,23 @@
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+
+-- |
+-- Module      : Main
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Main (main) where
+
+import Test.Amazonka.IoTSiteWise
+import Test.Amazonka.IoTSiteWise.Internal
+import Test.Tasty
+
+main :: IO ()
+main =
+  defaultMain $
+    testGroup
+      "IoTSiteWise"
+      [ testGroup "tests" tests,
+        testGroup "fixtures" fixtures
+      ]
diff --git a/test/Test/Amazonka/Gen/IoTSiteWise.hs b/test/Test/Amazonka/Gen/IoTSiteWise.hs
new file mode 100644
--- /dev/null
+++ b/test/Test/Amazonka/Gen/IoTSiteWise.hs
@@ -0,0 +1,1498 @@
+{-# OPTIONS_GHC -fno-warn-orphans #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Test.Amazonka.Gen.IoTSiteWise
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Test.Amazonka.Gen.IoTSiteWise where
+
+import Amazonka.IoTSiteWise
+import qualified Data.Proxy as Proxy
+import Test.Amazonka.Fixture
+import Test.Amazonka.IoTSiteWise.Internal
+import Test.Amazonka.Prelude
+import Test.Tasty
+
+-- Auto-generated: the actual test selection needs to be manually placed into
+-- the top-level so that real test data can be incrementally added.
+--
+-- This commented snippet is what the entire set should look like:
+
+-- fixtures :: TestTree
+-- fixtures =
+--     [ testGroup "request"
+--         [ requestAssociateAssets $
+--             newAssociateAssets
+--
+--         , requestAssociateTimeSeriesToAssetProperty $
+--             newAssociateTimeSeriesToAssetProperty
+--
+--         , requestBatchAssociateProjectAssets $
+--             newBatchAssociateProjectAssets
+--
+--         , requestBatchDisassociateProjectAssets $
+--             newBatchDisassociateProjectAssets
+--
+--         , requestBatchGetAssetPropertyAggregates $
+--             newBatchGetAssetPropertyAggregates
+--
+--         , requestBatchGetAssetPropertyValue $
+--             newBatchGetAssetPropertyValue
+--
+--         , requestBatchGetAssetPropertyValueHistory $
+--             newBatchGetAssetPropertyValueHistory
+--
+--         , requestBatchPutAssetPropertyValue $
+--             newBatchPutAssetPropertyValue
+--
+--         , requestCreateAccessPolicy $
+--             newCreateAccessPolicy
+--
+--         , requestCreateAsset $
+--             newCreateAsset
+--
+--         , requestCreateAssetModel $
+--             newCreateAssetModel
+--
+--         , requestCreateBulkImportJob $
+--             newCreateBulkImportJob
+--
+--         , requestCreateDashboard $
+--             newCreateDashboard
+--
+--         , requestCreateGateway $
+--             newCreateGateway
+--
+--         , requestCreatePortal $
+--             newCreatePortal
+--
+--         , requestCreateProject $
+--             newCreateProject
+--
+--         , requestDeleteAccessPolicy $
+--             newDeleteAccessPolicy
+--
+--         , requestDeleteAsset $
+--             newDeleteAsset
+--
+--         , requestDeleteAssetModel $
+--             newDeleteAssetModel
+--
+--         , requestDeleteDashboard $
+--             newDeleteDashboard
+--
+--         , requestDeleteGateway $
+--             newDeleteGateway
+--
+--         , requestDeletePortal $
+--             newDeletePortal
+--
+--         , requestDeleteProject $
+--             newDeleteProject
+--
+--         , requestDeleteTimeSeries $
+--             newDeleteTimeSeries
+--
+--         , requestDescribeAccessPolicy $
+--             newDescribeAccessPolicy
+--
+--         , requestDescribeAsset $
+--             newDescribeAsset
+--
+--         , requestDescribeAssetModel $
+--             newDescribeAssetModel
+--
+--         , requestDescribeAssetProperty $
+--             newDescribeAssetProperty
+--
+--         , requestDescribeBulkImportJob $
+--             newDescribeBulkImportJob
+--
+--         , requestDescribeDashboard $
+--             newDescribeDashboard
+--
+--         , requestDescribeDefaultEncryptionConfiguration $
+--             newDescribeDefaultEncryptionConfiguration
+--
+--         , requestDescribeGateway $
+--             newDescribeGateway
+--
+--         , requestDescribeGatewayCapabilityConfiguration $
+--             newDescribeGatewayCapabilityConfiguration
+--
+--         , requestDescribeLoggingOptions $
+--             newDescribeLoggingOptions
+--
+--         , requestDescribePortal $
+--             newDescribePortal
+--
+--         , requestDescribeProject $
+--             newDescribeProject
+--
+--         , requestDescribeStorageConfiguration $
+--             newDescribeStorageConfiguration
+--
+--         , requestDescribeTimeSeries $
+--             newDescribeTimeSeries
+--
+--         , requestDisassociateAssets $
+--             newDisassociateAssets
+--
+--         , requestDisassociateTimeSeriesFromAssetProperty $
+--             newDisassociateTimeSeriesFromAssetProperty
+--
+--         , requestGetAssetPropertyAggregates $
+--             newGetAssetPropertyAggregates
+--
+--         , requestGetAssetPropertyValue $
+--             newGetAssetPropertyValue
+--
+--         , requestGetAssetPropertyValueHistory $
+--             newGetAssetPropertyValueHistory
+--
+--         , requestGetInterpolatedAssetPropertyValues $
+--             newGetInterpolatedAssetPropertyValues
+--
+--         , requestListAccessPolicies $
+--             newListAccessPolicies
+--
+--         , requestListAssetModelProperties $
+--             newListAssetModelProperties
+--
+--         , requestListAssetModels $
+--             newListAssetModels
+--
+--         , requestListAssetProperties $
+--             newListAssetProperties
+--
+--         , requestListAssetRelationships $
+--             newListAssetRelationships
+--
+--         , requestListAssets $
+--             newListAssets
+--
+--         , requestListAssociatedAssets $
+--             newListAssociatedAssets
+--
+--         , requestListBulkImportJobs $
+--             newListBulkImportJobs
+--
+--         , requestListDashboards $
+--             newListDashboards
+--
+--         , requestListGateways $
+--             newListGateways
+--
+--         , requestListPortals $
+--             newListPortals
+--
+--         , requestListProjectAssets $
+--             newListProjectAssets
+--
+--         , requestListProjects $
+--             newListProjects
+--
+--         , requestListTagsForResource $
+--             newListTagsForResource
+--
+--         , requestListTimeSeries $
+--             newListTimeSeries
+--
+--         , requestPutDefaultEncryptionConfiguration $
+--             newPutDefaultEncryptionConfiguration
+--
+--         , requestPutLoggingOptions $
+--             newPutLoggingOptions
+--
+--         , requestPutStorageConfiguration $
+--             newPutStorageConfiguration
+--
+--         , requestTagResource $
+--             newTagResource
+--
+--         , requestUntagResource $
+--             newUntagResource
+--
+--         , requestUpdateAccessPolicy $
+--             newUpdateAccessPolicy
+--
+--         , requestUpdateAsset $
+--             newUpdateAsset
+--
+--         , requestUpdateAssetModel $
+--             newUpdateAssetModel
+--
+--         , requestUpdateAssetProperty $
+--             newUpdateAssetProperty
+--
+--         , requestUpdateDashboard $
+--             newUpdateDashboard
+--
+--         , requestUpdateGateway $
+--             newUpdateGateway
+--
+--         , requestUpdateGatewayCapabilityConfiguration $
+--             newUpdateGatewayCapabilityConfiguration
+--
+--         , requestUpdatePortal $
+--             newUpdatePortal
+--
+--         , requestUpdateProject $
+--             newUpdateProject
+--
+--           ]
+
+--     , testGroup "response"
+--         [ responseAssociateAssets $
+--             newAssociateAssetsResponse
+--
+--         , responseAssociateTimeSeriesToAssetProperty $
+--             newAssociateTimeSeriesToAssetPropertyResponse
+--
+--         , responseBatchAssociateProjectAssets $
+--             newBatchAssociateProjectAssetsResponse
+--
+--         , responseBatchDisassociateProjectAssets $
+--             newBatchDisassociateProjectAssetsResponse
+--
+--         , responseBatchGetAssetPropertyAggregates $
+--             newBatchGetAssetPropertyAggregatesResponse
+--
+--         , responseBatchGetAssetPropertyValue $
+--             newBatchGetAssetPropertyValueResponse
+--
+--         , responseBatchGetAssetPropertyValueHistory $
+--             newBatchGetAssetPropertyValueHistoryResponse
+--
+--         , responseBatchPutAssetPropertyValue $
+--             newBatchPutAssetPropertyValueResponse
+--
+--         , responseCreateAccessPolicy $
+--             newCreateAccessPolicyResponse
+--
+--         , responseCreateAsset $
+--             newCreateAssetResponse
+--
+--         , responseCreateAssetModel $
+--             newCreateAssetModelResponse
+--
+--         , responseCreateBulkImportJob $
+--             newCreateBulkImportJobResponse
+--
+--         , responseCreateDashboard $
+--             newCreateDashboardResponse
+--
+--         , responseCreateGateway $
+--             newCreateGatewayResponse
+--
+--         , responseCreatePortal $
+--             newCreatePortalResponse
+--
+--         , responseCreateProject $
+--             newCreateProjectResponse
+--
+--         , responseDeleteAccessPolicy $
+--             newDeleteAccessPolicyResponse
+--
+--         , responseDeleteAsset $
+--             newDeleteAssetResponse
+--
+--         , responseDeleteAssetModel $
+--             newDeleteAssetModelResponse
+--
+--         , responseDeleteDashboard $
+--             newDeleteDashboardResponse
+--
+--         , responseDeleteGateway $
+--             newDeleteGatewayResponse
+--
+--         , responseDeletePortal $
+--             newDeletePortalResponse
+--
+--         , responseDeleteProject $
+--             newDeleteProjectResponse
+--
+--         , responseDeleteTimeSeries $
+--             newDeleteTimeSeriesResponse
+--
+--         , responseDescribeAccessPolicy $
+--             newDescribeAccessPolicyResponse
+--
+--         , responseDescribeAsset $
+--             newDescribeAssetResponse
+--
+--         , responseDescribeAssetModel $
+--             newDescribeAssetModelResponse
+--
+--         , responseDescribeAssetProperty $
+--             newDescribeAssetPropertyResponse
+--
+--         , responseDescribeBulkImportJob $
+--             newDescribeBulkImportJobResponse
+--
+--         , responseDescribeDashboard $
+--             newDescribeDashboardResponse
+--
+--         , responseDescribeDefaultEncryptionConfiguration $
+--             newDescribeDefaultEncryptionConfigurationResponse
+--
+--         , responseDescribeGateway $
+--             newDescribeGatewayResponse
+--
+--         , responseDescribeGatewayCapabilityConfiguration $
+--             newDescribeGatewayCapabilityConfigurationResponse
+--
+--         , responseDescribeLoggingOptions $
+--             newDescribeLoggingOptionsResponse
+--
+--         , responseDescribePortal $
+--             newDescribePortalResponse
+--
+--         , responseDescribeProject $
+--             newDescribeProjectResponse
+--
+--         , responseDescribeStorageConfiguration $
+--             newDescribeStorageConfigurationResponse
+--
+--         , responseDescribeTimeSeries $
+--             newDescribeTimeSeriesResponse
+--
+--         , responseDisassociateAssets $
+--             newDisassociateAssetsResponse
+--
+--         , responseDisassociateTimeSeriesFromAssetProperty $
+--             newDisassociateTimeSeriesFromAssetPropertyResponse
+--
+--         , responseGetAssetPropertyAggregates $
+--             newGetAssetPropertyAggregatesResponse
+--
+--         , responseGetAssetPropertyValue $
+--             newGetAssetPropertyValueResponse
+--
+--         , responseGetAssetPropertyValueHistory $
+--             newGetAssetPropertyValueHistoryResponse
+--
+--         , responseGetInterpolatedAssetPropertyValues $
+--             newGetInterpolatedAssetPropertyValuesResponse
+--
+--         , responseListAccessPolicies $
+--             newListAccessPoliciesResponse
+--
+--         , responseListAssetModelProperties $
+--             newListAssetModelPropertiesResponse
+--
+--         , responseListAssetModels $
+--             newListAssetModelsResponse
+--
+--         , responseListAssetProperties $
+--             newListAssetPropertiesResponse
+--
+--         , responseListAssetRelationships $
+--             newListAssetRelationshipsResponse
+--
+--         , responseListAssets $
+--             newListAssetsResponse
+--
+--         , responseListAssociatedAssets $
+--             newListAssociatedAssetsResponse
+--
+--         , responseListBulkImportJobs $
+--             newListBulkImportJobsResponse
+--
+--         , responseListDashboards $
+--             newListDashboardsResponse
+--
+--         , responseListGateways $
+--             newListGatewaysResponse
+--
+--         , responseListPortals $
+--             newListPortalsResponse
+--
+--         , responseListProjectAssets $
+--             newListProjectAssetsResponse
+--
+--         , responseListProjects $
+--             newListProjectsResponse
+--
+--         , responseListTagsForResource $
+--             newListTagsForResourceResponse
+--
+--         , responseListTimeSeries $
+--             newListTimeSeriesResponse
+--
+--         , responsePutDefaultEncryptionConfiguration $
+--             newPutDefaultEncryptionConfigurationResponse
+--
+--         , responsePutLoggingOptions $
+--             newPutLoggingOptionsResponse
+--
+--         , responsePutStorageConfiguration $
+--             newPutStorageConfigurationResponse
+--
+--         , responseTagResource $
+--             newTagResourceResponse
+--
+--         , responseUntagResource $
+--             newUntagResourceResponse
+--
+--         , responseUpdateAccessPolicy $
+--             newUpdateAccessPolicyResponse
+--
+--         , responseUpdateAsset $
+--             newUpdateAssetResponse
+--
+--         , responseUpdateAssetModel $
+--             newUpdateAssetModelResponse
+--
+--         , responseUpdateAssetProperty $
+--             newUpdateAssetPropertyResponse
+--
+--         , responseUpdateDashboard $
+--             newUpdateDashboardResponse
+--
+--         , responseUpdateGateway $
+--             newUpdateGatewayResponse
+--
+--         , responseUpdateGatewayCapabilityConfiguration $
+--             newUpdateGatewayCapabilityConfigurationResponse
+--
+--         , responseUpdatePortal $
+--             newUpdatePortalResponse
+--
+--         , responseUpdateProject $
+--             newUpdateProjectResponse
+--
+--           ]
+--     ]
+
+-- Requests
+
+requestAssociateAssets :: AssociateAssets -> TestTree
+requestAssociateAssets =
+  req
+    "AssociateAssets"
+    "fixture/AssociateAssets.yaml"
+
+requestAssociateTimeSeriesToAssetProperty :: AssociateTimeSeriesToAssetProperty -> TestTree
+requestAssociateTimeSeriesToAssetProperty =
+  req
+    "AssociateTimeSeriesToAssetProperty"
+    "fixture/AssociateTimeSeriesToAssetProperty.yaml"
+
+requestBatchAssociateProjectAssets :: BatchAssociateProjectAssets -> TestTree
+requestBatchAssociateProjectAssets =
+  req
+    "BatchAssociateProjectAssets"
+    "fixture/BatchAssociateProjectAssets.yaml"
+
+requestBatchDisassociateProjectAssets :: BatchDisassociateProjectAssets -> TestTree
+requestBatchDisassociateProjectAssets =
+  req
+    "BatchDisassociateProjectAssets"
+    "fixture/BatchDisassociateProjectAssets.yaml"
+
+requestBatchGetAssetPropertyAggregates :: BatchGetAssetPropertyAggregates -> TestTree
+requestBatchGetAssetPropertyAggregates =
+  req
+    "BatchGetAssetPropertyAggregates"
+    "fixture/BatchGetAssetPropertyAggregates.yaml"
+
+requestBatchGetAssetPropertyValue :: BatchGetAssetPropertyValue -> TestTree
+requestBatchGetAssetPropertyValue =
+  req
+    "BatchGetAssetPropertyValue"
+    "fixture/BatchGetAssetPropertyValue.yaml"
+
+requestBatchGetAssetPropertyValueHistory :: BatchGetAssetPropertyValueHistory -> TestTree
+requestBatchGetAssetPropertyValueHistory =
+  req
+    "BatchGetAssetPropertyValueHistory"
+    "fixture/BatchGetAssetPropertyValueHistory.yaml"
+
+requestBatchPutAssetPropertyValue :: BatchPutAssetPropertyValue -> TestTree
+requestBatchPutAssetPropertyValue =
+  req
+    "BatchPutAssetPropertyValue"
+    "fixture/BatchPutAssetPropertyValue.yaml"
+
+requestCreateAccessPolicy :: CreateAccessPolicy -> TestTree
+requestCreateAccessPolicy =
+  req
+    "CreateAccessPolicy"
+    "fixture/CreateAccessPolicy.yaml"
+
+requestCreateAsset :: CreateAsset -> TestTree
+requestCreateAsset =
+  req
+    "CreateAsset"
+    "fixture/CreateAsset.yaml"
+
+requestCreateAssetModel :: CreateAssetModel -> TestTree
+requestCreateAssetModel =
+  req
+    "CreateAssetModel"
+    "fixture/CreateAssetModel.yaml"
+
+requestCreateBulkImportJob :: CreateBulkImportJob -> TestTree
+requestCreateBulkImportJob =
+  req
+    "CreateBulkImportJob"
+    "fixture/CreateBulkImportJob.yaml"
+
+requestCreateDashboard :: CreateDashboard -> TestTree
+requestCreateDashboard =
+  req
+    "CreateDashboard"
+    "fixture/CreateDashboard.yaml"
+
+requestCreateGateway :: CreateGateway -> TestTree
+requestCreateGateway =
+  req
+    "CreateGateway"
+    "fixture/CreateGateway.yaml"
+
+requestCreatePortal :: CreatePortal -> TestTree
+requestCreatePortal =
+  req
+    "CreatePortal"
+    "fixture/CreatePortal.yaml"
+
+requestCreateProject :: CreateProject -> TestTree
+requestCreateProject =
+  req
+    "CreateProject"
+    "fixture/CreateProject.yaml"
+
+requestDeleteAccessPolicy :: DeleteAccessPolicy -> TestTree
+requestDeleteAccessPolicy =
+  req
+    "DeleteAccessPolicy"
+    "fixture/DeleteAccessPolicy.yaml"
+
+requestDeleteAsset :: DeleteAsset -> TestTree
+requestDeleteAsset =
+  req
+    "DeleteAsset"
+    "fixture/DeleteAsset.yaml"
+
+requestDeleteAssetModel :: DeleteAssetModel -> TestTree
+requestDeleteAssetModel =
+  req
+    "DeleteAssetModel"
+    "fixture/DeleteAssetModel.yaml"
+
+requestDeleteDashboard :: DeleteDashboard -> TestTree
+requestDeleteDashboard =
+  req
+    "DeleteDashboard"
+    "fixture/DeleteDashboard.yaml"
+
+requestDeleteGateway :: DeleteGateway -> TestTree
+requestDeleteGateway =
+  req
+    "DeleteGateway"
+    "fixture/DeleteGateway.yaml"
+
+requestDeletePortal :: DeletePortal -> TestTree
+requestDeletePortal =
+  req
+    "DeletePortal"
+    "fixture/DeletePortal.yaml"
+
+requestDeleteProject :: DeleteProject -> TestTree
+requestDeleteProject =
+  req
+    "DeleteProject"
+    "fixture/DeleteProject.yaml"
+
+requestDeleteTimeSeries :: DeleteTimeSeries -> TestTree
+requestDeleteTimeSeries =
+  req
+    "DeleteTimeSeries"
+    "fixture/DeleteTimeSeries.yaml"
+
+requestDescribeAccessPolicy :: DescribeAccessPolicy -> TestTree
+requestDescribeAccessPolicy =
+  req
+    "DescribeAccessPolicy"
+    "fixture/DescribeAccessPolicy.yaml"
+
+requestDescribeAsset :: DescribeAsset -> TestTree
+requestDescribeAsset =
+  req
+    "DescribeAsset"
+    "fixture/DescribeAsset.yaml"
+
+requestDescribeAssetModel :: DescribeAssetModel -> TestTree
+requestDescribeAssetModel =
+  req
+    "DescribeAssetModel"
+    "fixture/DescribeAssetModel.yaml"
+
+requestDescribeAssetProperty :: DescribeAssetProperty -> TestTree
+requestDescribeAssetProperty =
+  req
+    "DescribeAssetProperty"
+    "fixture/DescribeAssetProperty.yaml"
+
+requestDescribeBulkImportJob :: DescribeBulkImportJob -> TestTree
+requestDescribeBulkImportJob =
+  req
+    "DescribeBulkImportJob"
+    "fixture/DescribeBulkImportJob.yaml"
+
+requestDescribeDashboard :: DescribeDashboard -> TestTree
+requestDescribeDashboard =
+  req
+    "DescribeDashboard"
+    "fixture/DescribeDashboard.yaml"
+
+requestDescribeDefaultEncryptionConfiguration :: DescribeDefaultEncryptionConfiguration -> TestTree
+requestDescribeDefaultEncryptionConfiguration =
+  req
+    "DescribeDefaultEncryptionConfiguration"
+    "fixture/DescribeDefaultEncryptionConfiguration.yaml"
+
+requestDescribeGateway :: DescribeGateway -> TestTree
+requestDescribeGateway =
+  req
+    "DescribeGateway"
+    "fixture/DescribeGateway.yaml"
+
+requestDescribeGatewayCapabilityConfiguration :: DescribeGatewayCapabilityConfiguration -> TestTree
+requestDescribeGatewayCapabilityConfiguration =
+  req
+    "DescribeGatewayCapabilityConfiguration"
+    "fixture/DescribeGatewayCapabilityConfiguration.yaml"
+
+requestDescribeLoggingOptions :: DescribeLoggingOptions -> TestTree
+requestDescribeLoggingOptions =
+  req
+    "DescribeLoggingOptions"
+    "fixture/DescribeLoggingOptions.yaml"
+
+requestDescribePortal :: DescribePortal -> TestTree
+requestDescribePortal =
+  req
+    "DescribePortal"
+    "fixture/DescribePortal.yaml"
+
+requestDescribeProject :: DescribeProject -> TestTree
+requestDescribeProject =
+  req
+    "DescribeProject"
+    "fixture/DescribeProject.yaml"
+
+requestDescribeStorageConfiguration :: DescribeStorageConfiguration -> TestTree
+requestDescribeStorageConfiguration =
+  req
+    "DescribeStorageConfiguration"
+    "fixture/DescribeStorageConfiguration.yaml"
+
+requestDescribeTimeSeries :: DescribeTimeSeries -> TestTree
+requestDescribeTimeSeries =
+  req
+    "DescribeTimeSeries"
+    "fixture/DescribeTimeSeries.yaml"
+
+requestDisassociateAssets :: DisassociateAssets -> TestTree
+requestDisassociateAssets =
+  req
+    "DisassociateAssets"
+    "fixture/DisassociateAssets.yaml"
+
+requestDisassociateTimeSeriesFromAssetProperty :: DisassociateTimeSeriesFromAssetProperty -> TestTree
+requestDisassociateTimeSeriesFromAssetProperty =
+  req
+    "DisassociateTimeSeriesFromAssetProperty"
+    "fixture/DisassociateTimeSeriesFromAssetProperty.yaml"
+
+requestGetAssetPropertyAggregates :: GetAssetPropertyAggregates -> TestTree
+requestGetAssetPropertyAggregates =
+  req
+    "GetAssetPropertyAggregates"
+    "fixture/GetAssetPropertyAggregates.yaml"
+
+requestGetAssetPropertyValue :: GetAssetPropertyValue -> TestTree
+requestGetAssetPropertyValue =
+  req
+    "GetAssetPropertyValue"
+    "fixture/GetAssetPropertyValue.yaml"
+
+requestGetAssetPropertyValueHistory :: GetAssetPropertyValueHistory -> TestTree
+requestGetAssetPropertyValueHistory =
+  req
+    "GetAssetPropertyValueHistory"
+    "fixture/GetAssetPropertyValueHistory.yaml"
+
+requestGetInterpolatedAssetPropertyValues :: GetInterpolatedAssetPropertyValues -> TestTree
+requestGetInterpolatedAssetPropertyValues =
+  req
+    "GetInterpolatedAssetPropertyValues"
+    "fixture/GetInterpolatedAssetPropertyValues.yaml"
+
+requestListAccessPolicies :: ListAccessPolicies -> TestTree
+requestListAccessPolicies =
+  req
+    "ListAccessPolicies"
+    "fixture/ListAccessPolicies.yaml"
+
+requestListAssetModelProperties :: ListAssetModelProperties -> TestTree
+requestListAssetModelProperties =
+  req
+    "ListAssetModelProperties"
+    "fixture/ListAssetModelProperties.yaml"
+
+requestListAssetModels :: ListAssetModels -> TestTree
+requestListAssetModels =
+  req
+    "ListAssetModels"
+    "fixture/ListAssetModels.yaml"
+
+requestListAssetProperties :: ListAssetProperties -> TestTree
+requestListAssetProperties =
+  req
+    "ListAssetProperties"
+    "fixture/ListAssetProperties.yaml"
+
+requestListAssetRelationships :: ListAssetRelationships -> TestTree
+requestListAssetRelationships =
+  req
+    "ListAssetRelationships"
+    "fixture/ListAssetRelationships.yaml"
+
+requestListAssets :: ListAssets -> TestTree
+requestListAssets =
+  req
+    "ListAssets"
+    "fixture/ListAssets.yaml"
+
+requestListAssociatedAssets :: ListAssociatedAssets -> TestTree
+requestListAssociatedAssets =
+  req
+    "ListAssociatedAssets"
+    "fixture/ListAssociatedAssets.yaml"
+
+requestListBulkImportJobs :: ListBulkImportJobs -> TestTree
+requestListBulkImportJobs =
+  req
+    "ListBulkImportJobs"
+    "fixture/ListBulkImportJobs.yaml"
+
+requestListDashboards :: ListDashboards -> TestTree
+requestListDashboards =
+  req
+    "ListDashboards"
+    "fixture/ListDashboards.yaml"
+
+requestListGateways :: ListGateways -> TestTree
+requestListGateways =
+  req
+    "ListGateways"
+    "fixture/ListGateways.yaml"
+
+requestListPortals :: ListPortals -> TestTree
+requestListPortals =
+  req
+    "ListPortals"
+    "fixture/ListPortals.yaml"
+
+requestListProjectAssets :: ListProjectAssets -> TestTree
+requestListProjectAssets =
+  req
+    "ListProjectAssets"
+    "fixture/ListProjectAssets.yaml"
+
+requestListProjects :: ListProjects -> TestTree
+requestListProjects =
+  req
+    "ListProjects"
+    "fixture/ListProjects.yaml"
+
+requestListTagsForResource :: ListTagsForResource -> TestTree
+requestListTagsForResource =
+  req
+    "ListTagsForResource"
+    "fixture/ListTagsForResource.yaml"
+
+requestListTimeSeries :: ListTimeSeries -> TestTree
+requestListTimeSeries =
+  req
+    "ListTimeSeries"
+    "fixture/ListTimeSeries.yaml"
+
+requestPutDefaultEncryptionConfiguration :: PutDefaultEncryptionConfiguration -> TestTree
+requestPutDefaultEncryptionConfiguration =
+  req
+    "PutDefaultEncryptionConfiguration"
+    "fixture/PutDefaultEncryptionConfiguration.yaml"
+
+requestPutLoggingOptions :: PutLoggingOptions -> TestTree
+requestPutLoggingOptions =
+  req
+    "PutLoggingOptions"
+    "fixture/PutLoggingOptions.yaml"
+
+requestPutStorageConfiguration :: PutStorageConfiguration -> TestTree
+requestPutStorageConfiguration =
+  req
+    "PutStorageConfiguration"
+    "fixture/PutStorageConfiguration.yaml"
+
+requestTagResource :: TagResource -> TestTree
+requestTagResource =
+  req
+    "TagResource"
+    "fixture/TagResource.yaml"
+
+requestUntagResource :: UntagResource -> TestTree
+requestUntagResource =
+  req
+    "UntagResource"
+    "fixture/UntagResource.yaml"
+
+requestUpdateAccessPolicy :: UpdateAccessPolicy -> TestTree
+requestUpdateAccessPolicy =
+  req
+    "UpdateAccessPolicy"
+    "fixture/UpdateAccessPolicy.yaml"
+
+requestUpdateAsset :: UpdateAsset -> TestTree
+requestUpdateAsset =
+  req
+    "UpdateAsset"
+    "fixture/UpdateAsset.yaml"
+
+requestUpdateAssetModel :: UpdateAssetModel -> TestTree
+requestUpdateAssetModel =
+  req
+    "UpdateAssetModel"
+    "fixture/UpdateAssetModel.yaml"
+
+requestUpdateAssetProperty :: UpdateAssetProperty -> TestTree
+requestUpdateAssetProperty =
+  req
+    "UpdateAssetProperty"
+    "fixture/UpdateAssetProperty.yaml"
+
+requestUpdateDashboard :: UpdateDashboard -> TestTree
+requestUpdateDashboard =
+  req
+    "UpdateDashboard"
+    "fixture/UpdateDashboard.yaml"
+
+requestUpdateGateway :: UpdateGateway -> TestTree
+requestUpdateGateway =
+  req
+    "UpdateGateway"
+    "fixture/UpdateGateway.yaml"
+
+requestUpdateGatewayCapabilityConfiguration :: UpdateGatewayCapabilityConfiguration -> TestTree
+requestUpdateGatewayCapabilityConfiguration =
+  req
+    "UpdateGatewayCapabilityConfiguration"
+    "fixture/UpdateGatewayCapabilityConfiguration.yaml"
+
+requestUpdatePortal :: UpdatePortal -> TestTree
+requestUpdatePortal =
+  req
+    "UpdatePortal"
+    "fixture/UpdatePortal.yaml"
+
+requestUpdateProject :: UpdateProject -> TestTree
+requestUpdateProject =
+  req
+    "UpdateProject"
+    "fixture/UpdateProject.yaml"
+
+-- Responses
+
+responseAssociateAssets :: AssociateAssetsResponse -> TestTree
+responseAssociateAssets =
+  res
+    "AssociateAssetsResponse"
+    "fixture/AssociateAssetsResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy AssociateAssets)
+
+responseAssociateTimeSeriesToAssetProperty :: AssociateTimeSeriesToAssetPropertyResponse -> TestTree
+responseAssociateTimeSeriesToAssetProperty =
+  res
+    "AssociateTimeSeriesToAssetPropertyResponse"
+    "fixture/AssociateTimeSeriesToAssetPropertyResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy AssociateTimeSeriesToAssetProperty)
+
+responseBatchAssociateProjectAssets :: BatchAssociateProjectAssetsResponse -> TestTree
+responseBatchAssociateProjectAssets =
+  res
+    "BatchAssociateProjectAssetsResponse"
+    "fixture/BatchAssociateProjectAssetsResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy BatchAssociateProjectAssets)
+
+responseBatchDisassociateProjectAssets :: BatchDisassociateProjectAssetsResponse -> TestTree
+responseBatchDisassociateProjectAssets =
+  res
+    "BatchDisassociateProjectAssetsResponse"
+    "fixture/BatchDisassociateProjectAssetsResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy BatchDisassociateProjectAssets)
+
+responseBatchGetAssetPropertyAggregates :: BatchGetAssetPropertyAggregatesResponse -> TestTree
+responseBatchGetAssetPropertyAggregates =
+  res
+    "BatchGetAssetPropertyAggregatesResponse"
+    "fixture/BatchGetAssetPropertyAggregatesResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy BatchGetAssetPropertyAggregates)
+
+responseBatchGetAssetPropertyValue :: BatchGetAssetPropertyValueResponse -> TestTree
+responseBatchGetAssetPropertyValue =
+  res
+    "BatchGetAssetPropertyValueResponse"
+    "fixture/BatchGetAssetPropertyValueResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy BatchGetAssetPropertyValue)
+
+responseBatchGetAssetPropertyValueHistory :: BatchGetAssetPropertyValueHistoryResponse -> TestTree
+responseBatchGetAssetPropertyValueHistory =
+  res
+    "BatchGetAssetPropertyValueHistoryResponse"
+    "fixture/BatchGetAssetPropertyValueHistoryResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy BatchGetAssetPropertyValueHistory)
+
+responseBatchPutAssetPropertyValue :: BatchPutAssetPropertyValueResponse -> TestTree
+responseBatchPutAssetPropertyValue =
+  res
+    "BatchPutAssetPropertyValueResponse"
+    "fixture/BatchPutAssetPropertyValueResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy BatchPutAssetPropertyValue)
+
+responseCreateAccessPolicy :: CreateAccessPolicyResponse -> TestTree
+responseCreateAccessPolicy =
+  res
+    "CreateAccessPolicyResponse"
+    "fixture/CreateAccessPolicyResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy CreateAccessPolicy)
+
+responseCreateAsset :: CreateAssetResponse -> TestTree
+responseCreateAsset =
+  res
+    "CreateAssetResponse"
+    "fixture/CreateAssetResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy CreateAsset)
+
+responseCreateAssetModel :: CreateAssetModelResponse -> TestTree
+responseCreateAssetModel =
+  res
+    "CreateAssetModelResponse"
+    "fixture/CreateAssetModelResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy CreateAssetModel)
+
+responseCreateBulkImportJob :: CreateBulkImportJobResponse -> TestTree
+responseCreateBulkImportJob =
+  res
+    "CreateBulkImportJobResponse"
+    "fixture/CreateBulkImportJobResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy CreateBulkImportJob)
+
+responseCreateDashboard :: CreateDashboardResponse -> TestTree
+responseCreateDashboard =
+  res
+    "CreateDashboardResponse"
+    "fixture/CreateDashboardResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy CreateDashboard)
+
+responseCreateGateway :: CreateGatewayResponse -> TestTree
+responseCreateGateway =
+  res
+    "CreateGatewayResponse"
+    "fixture/CreateGatewayResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy CreateGateway)
+
+responseCreatePortal :: CreatePortalResponse -> TestTree
+responseCreatePortal =
+  res
+    "CreatePortalResponse"
+    "fixture/CreatePortalResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy CreatePortal)
+
+responseCreateProject :: CreateProjectResponse -> TestTree
+responseCreateProject =
+  res
+    "CreateProjectResponse"
+    "fixture/CreateProjectResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy CreateProject)
+
+responseDeleteAccessPolicy :: DeleteAccessPolicyResponse -> TestTree
+responseDeleteAccessPolicy =
+  res
+    "DeleteAccessPolicyResponse"
+    "fixture/DeleteAccessPolicyResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy DeleteAccessPolicy)
+
+responseDeleteAsset :: DeleteAssetResponse -> TestTree
+responseDeleteAsset =
+  res
+    "DeleteAssetResponse"
+    "fixture/DeleteAssetResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy DeleteAsset)
+
+responseDeleteAssetModel :: DeleteAssetModelResponse -> TestTree
+responseDeleteAssetModel =
+  res
+    "DeleteAssetModelResponse"
+    "fixture/DeleteAssetModelResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy DeleteAssetModel)
+
+responseDeleteDashboard :: DeleteDashboardResponse -> TestTree
+responseDeleteDashboard =
+  res
+    "DeleteDashboardResponse"
+    "fixture/DeleteDashboardResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy DeleteDashboard)
+
+responseDeleteGateway :: DeleteGatewayResponse -> TestTree
+responseDeleteGateway =
+  res
+    "DeleteGatewayResponse"
+    "fixture/DeleteGatewayResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy DeleteGateway)
+
+responseDeletePortal :: DeletePortalResponse -> TestTree
+responseDeletePortal =
+  res
+    "DeletePortalResponse"
+    "fixture/DeletePortalResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy DeletePortal)
+
+responseDeleteProject :: DeleteProjectResponse -> TestTree
+responseDeleteProject =
+  res
+    "DeleteProjectResponse"
+    "fixture/DeleteProjectResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy DeleteProject)
+
+responseDeleteTimeSeries :: DeleteTimeSeriesResponse -> TestTree
+responseDeleteTimeSeries =
+  res
+    "DeleteTimeSeriesResponse"
+    "fixture/DeleteTimeSeriesResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy DeleteTimeSeries)
+
+responseDescribeAccessPolicy :: DescribeAccessPolicyResponse -> TestTree
+responseDescribeAccessPolicy =
+  res
+    "DescribeAccessPolicyResponse"
+    "fixture/DescribeAccessPolicyResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy DescribeAccessPolicy)
+
+responseDescribeAsset :: DescribeAssetResponse -> TestTree
+responseDescribeAsset =
+  res
+    "DescribeAssetResponse"
+    "fixture/DescribeAssetResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy DescribeAsset)
+
+responseDescribeAssetModel :: DescribeAssetModelResponse -> TestTree
+responseDescribeAssetModel =
+  res
+    "DescribeAssetModelResponse"
+    "fixture/DescribeAssetModelResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy DescribeAssetModel)
+
+responseDescribeAssetProperty :: DescribeAssetPropertyResponse -> TestTree
+responseDescribeAssetProperty =
+  res
+    "DescribeAssetPropertyResponse"
+    "fixture/DescribeAssetPropertyResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy DescribeAssetProperty)
+
+responseDescribeBulkImportJob :: DescribeBulkImportJobResponse -> TestTree
+responseDescribeBulkImportJob =
+  res
+    "DescribeBulkImportJobResponse"
+    "fixture/DescribeBulkImportJobResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy DescribeBulkImportJob)
+
+responseDescribeDashboard :: DescribeDashboardResponse -> TestTree
+responseDescribeDashboard =
+  res
+    "DescribeDashboardResponse"
+    "fixture/DescribeDashboardResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy DescribeDashboard)
+
+responseDescribeDefaultEncryptionConfiguration :: DescribeDefaultEncryptionConfigurationResponse -> TestTree
+responseDescribeDefaultEncryptionConfiguration =
+  res
+    "DescribeDefaultEncryptionConfigurationResponse"
+    "fixture/DescribeDefaultEncryptionConfigurationResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy DescribeDefaultEncryptionConfiguration)
+
+responseDescribeGateway :: DescribeGatewayResponse -> TestTree
+responseDescribeGateway =
+  res
+    "DescribeGatewayResponse"
+    "fixture/DescribeGatewayResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy DescribeGateway)
+
+responseDescribeGatewayCapabilityConfiguration :: DescribeGatewayCapabilityConfigurationResponse -> TestTree
+responseDescribeGatewayCapabilityConfiguration =
+  res
+    "DescribeGatewayCapabilityConfigurationResponse"
+    "fixture/DescribeGatewayCapabilityConfigurationResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy DescribeGatewayCapabilityConfiguration)
+
+responseDescribeLoggingOptions :: DescribeLoggingOptionsResponse -> TestTree
+responseDescribeLoggingOptions =
+  res
+    "DescribeLoggingOptionsResponse"
+    "fixture/DescribeLoggingOptionsResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy DescribeLoggingOptions)
+
+responseDescribePortal :: DescribePortalResponse -> TestTree
+responseDescribePortal =
+  res
+    "DescribePortalResponse"
+    "fixture/DescribePortalResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy DescribePortal)
+
+responseDescribeProject :: DescribeProjectResponse -> TestTree
+responseDescribeProject =
+  res
+    "DescribeProjectResponse"
+    "fixture/DescribeProjectResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy DescribeProject)
+
+responseDescribeStorageConfiguration :: DescribeStorageConfigurationResponse -> TestTree
+responseDescribeStorageConfiguration =
+  res
+    "DescribeStorageConfigurationResponse"
+    "fixture/DescribeStorageConfigurationResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy DescribeStorageConfiguration)
+
+responseDescribeTimeSeries :: DescribeTimeSeriesResponse -> TestTree
+responseDescribeTimeSeries =
+  res
+    "DescribeTimeSeriesResponse"
+    "fixture/DescribeTimeSeriesResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy DescribeTimeSeries)
+
+responseDisassociateAssets :: DisassociateAssetsResponse -> TestTree
+responseDisassociateAssets =
+  res
+    "DisassociateAssetsResponse"
+    "fixture/DisassociateAssetsResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy DisassociateAssets)
+
+responseDisassociateTimeSeriesFromAssetProperty :: DisassociateTimeSeriesFromAssetPropertyResponse -> TestTree
+responseDisassociateTimeSeriesFromAssetProperty =
+  res
+    "DisassociateTimeSeriesFromAssetPropertyResponse"
+    "fixture/DisassociateTimeSeriesFromAssetPropertyResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy DisassociateTimeSeriesFromAssetProperty)
+
+responseGetAssetPropertyAggregates :: GetAssetPropertyAggregatesResponse -> TestTree
+responseGetAssetPropertyAggregates =
+  res
+    "GetAssetPropertyAggregatesResponse"
+    "fixture/GetAssetPropertyAggregatesResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy GetAssetPropertyAggregates)
+
+responseGetAssetPropertyValue :: GetAssetPropertyValueResponse -> TestTree
+responseGetAssetPropertyValue =
+  res
+    "GetAssetPropertyValueResponse"
+    "fixture/GetAssetPropertyValueResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy GetAssetPropertyValue)
+
+responseGetAssetPropertyValueHistory :: GetAssetPropertyValueHistoryResponse -> TestTree
+responseGetAssetPropertyValueHistory =
+  res
+    "GetAssetPropertyValueHistoryResponse"
+    "fixture/GetAssetPropertyValueHistoryResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy GetAssetPropertyValueHistory)
+
+responseGetInterpolatedAssetPropertyValues :: GetInterpolatedAssetPropertyValuesResponse -> TestTree
+responseGetInterpolatedAssetPropertyValues =
+  res
+    "GetInterpolatedAssetPropertyValuesResponse"
+    "fixture/GetInterpolatedAssetPropertyValuesResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy GetInterpolatedAssetPropertyValues)
+
+responseListAccessPolicies :: ListAccessPoliciesResponse -> TestTree
+responseListAccessPolicies =
+  res
+    "ListAccessPoliciesResponse"
+    "fixture/ListAccessPoliciesResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy ListAccessPolicies)
+
+responseListAssetModelProperties :: ListAssetModelPropertiesResponse -> TestTree
+responseListAssetModelProperties =
+  res
+    "ListAssetModelPropertiesResponse"
+    "fixture/ListAssetModelPropertiesResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy ListAssetModelProperties)
+
+responseListAssetModels :: ListAssetModelsResponse -> TestTree
+responseListAssetModels =
+  res
+    "ListAssetModelsResponse"
+    "fixture/ListAssetModelsResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy ListAssetModels)
+
+responseListAssetProperties :: ListAssetPropertiesResponse -> TestTree
+responseListAssetProperties =
+  res
+    "ListAssetPropertiesResponse"
+    "fixture/ListAssetPropertiesResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy ListAssetProperties)
+
+responseListAssetRelationships :: ListAssetRelationshipsResponse -> TestTree
+responseListAssetRelationships =
+  res
+    "ListAssetRelationshipsResponse"
+    "fixture/ListAssetRelationshipsResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy ListAssetRelationships)
+
+responseListAssets :: ListAssetsResponse -> TestTree
+responseListAssets =
+  res
+    "ListAssetsResponse"
+    "fixture/ListAssetsResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy ListAssets)
+
+responseListAssociatedAssets :: ListAssociatedAssetsResponse -> TestTree
+responseListAssociatedAssets =
+  res
+    "ListAssociatedAssetsResponse"
+    "fixture/ListAssociatedAssetsResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy ListAssociatedAssets)
+
+responseListBulkImportJobs :: ListBulkImportJobsResponse -> TestTree
+responseListBulkImportJobs =
+  res
+    "ListBulkImportJobsResponse"
+    "fixture/ListBulkImportJobsResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy ListBulkImportJobs)
+
+responseListDashboards :: ListDashboardsResponse -> TestTree
+responseListDashboards =
+  res
+    "ListDashboardsResponse"
+    "fixture/ListDashboardsResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy ListDashboards)
+
+responseListGateways :: ListGatewaysResponse -> TestTree
+responseListGateways =
+  res
+    "ListGatewaysResponse"
+    "fixture/ListGatewaysResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy ListGateways)
+
+responseListPortals :: ListPortalsResponse -> TestTree
+responseListPortals =
+  res
+    "ListPortalsResponse"
+    "fixture/ListPortalsResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy ListPortals)
+
+responseListProjectAssets :: ListProjectAssetsResponse -> TestTree
+responseListProjectAssets =
+  res
+    "ListProjectAssetsResponse"
+    "fixture/ListProjectAssetsResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy ListProjectAssets)
+
+responseListProjects :: ListProjectsResponse -> TestTree
+responseListProjects =
+  res
+    "ListProjectsResponse"
+    "fixture/ListProjectsResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy ListProjects)
+
+responseListTagsForResource :: ListTagsForResourceResponse -> TestTree
+responseListTagsForResource =
+  res
+    "ListTagsForResourceResponse"
+    "fixture/ListTagsForResourceResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy ListTagsForResource)
+
+responseListTimeSeries :: ListTimeSeriesResponse -> TestTree
+responseListTimeSeries =
+  res
+    "ListTimeSeriesResponse"
+    "fixture/ListTimeSeriesResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy ListTimeSeries)
+
+responsePutDefaultEncryptionConfiguration :: PutDefaultEncryptionConfigurationResponse -> TestTree
+responsePutDefaultEncryptionConfiguration =
+  res
+    "PutDefaultEncryptionConfigurationResponse"
+    "fixture/PutDefaultEncryptionConfigurationResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy PutDefaultEncryptionConfiguration)
+
+responsePutLoggingOptions :: PutLoggingOptionsResponse -> TestTree
+responsePutLoggingOptions =
+  res
+    "PutLoggingOptionsResponse"
+    "fixture/PutLoggingOptionsResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy PutLoggingOptions)
+
+responsePutStorageConfiguration :: PutStorageConfigurationResponse -> TestTree
+responsePutStorageConfiguration =
+  res
+    "PutStorageConfigurationResponse"
+    "fixture/PutStorageConfigurationResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy PutStorageConfiguration)
+
+responseTagResource :: TagResourceResponse -> TestTree
+responseTagResource =
+  res
+    "TagResourceResponse"
+    "fixture/TagResourceResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy TagResource)
+
+responseUntagResource :: UntagResourceResponse -> TestTree
+responseUntagResource =
+  res
+    "UntagResourceResponse"
+    "fixture/UntagResourceResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy UntagResource)
+
+responseUpdateAccessPolicy :: UpdateAccessPolicyResponse -> TestTree
+responseUpdateAccessPolicy =
+  res
+    "UpdateAccessPolicyResponse"
+    "fixture/UpdateAccessPolicyResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy UpdateAccessPolicy)
+
+responseUpdateAsset :: UpdateAssetResponse -> TestTree
+responseUpdateAsset =
+  res
+    "UpdateAssetResponse"
+    "fixture/UpdateAssetResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy UpdateAsset)
+
+responseUpdateAssetModel :: UpdateAssetModelResponse -> TestTree
+responseUpdateAssetModel =
+  res
+    "UpdateAssetModelResponse"
+    "fixture/UpdateAssetModelResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy UpdateAssetModel)
+
+responseUpdateAssetProperty :: UpdateAssetPropertyResponse -> TestTree
+responseUpdateAssetProperty =
+  res
+    "UpdateAssetPropertyResponse"
+    "fixture/UpdateAssetPropertyResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy UpdateAssetProperty)
+
+responseUpdateDashboard :: UpdateDashboardResponse -> TestTree
+responseUpdateDashboard =
+  res
+    "UpdateDashboardResponse"
+    "fixture/UpdateDashboardResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy UpdateDashboard)
+
+responseUpdateGateway :: UpdateGatewayResponse -> TestTree
+responseUpdateGateway =
+  res
+    "UpdateGatewayResponse"
+    "fixture/UpdateGatewayResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy UpdateGateway)
+
+responseUpdateGatewayCapabilityConfiguration :: UpdateGatewayCapabilityConfigurationResponse -> TestTree
+responseUpdateGatewayCapabilityConfiguration =
+  res
+    "UpdateGatewayCapabilityConfigurationResponse"
+    "fixture/UpdateGatewayCapabilityConfigurationResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy UpdateGatewayCapabilityConfiguration)
+
+responseUpdatePortal :: UpdatePortalResponse -> TestTree
+responseUpdatePortal =
+  res
+    "UpdatePortalResponse"
+    "fixture/UpdatePortalResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy UpdatePortal)
+
+responseUpdateProject :: UpdateProjectResponse -> TestTree
+responseUpdateProject =
+  res
+    "UpdateProjectResponse"
+    "fixture/UpdateProjectResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy UpdateProject)
diff --git a/test/Test/Amazonka/IoTSiteWise.hs b/test/Test/Amazonka/IoTSiteWise.hs
new file mode 100644
--- /dev/null
+++ b/test/Test/Amazonka/IoTSiteWise.hs
@@ -0,0 +1,20 @@
+-- |
+-- Module      : Test.Amazonka.IoTSiteWise
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Test.Amazonka.IoTSiteWise
+  ( tests,
+    fixtures,
+  )
+where
+
+import Test.Tasty (TestTree)
+
+tests :: [TestTree]
+tests = []
+
+fixtures :: [TestTree]
+fixtures = []
diff --git a/test/Test/Amazonka/IoTSiteWise/Internal.hs b/test/Test/Amazonka/IoTSiteWise/Internal.hs
new file mode 100644
--- /dev/null
+++ b/test/Test/Amazonka/IoTSiteWise/Internal.hs
@@ -0,0 +1,8 @@
+-- |
+-- Module      : Test.Amazonka.IoTSiteWise.Internal
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Test.Amazonka.IoTSiteWise.Internal where
