This page is part of archived documentation for openHAB 3.1. Go to the current stable version
# Amazon DynamoDB Persistence
This service allows you to persist state updates using the Amazon DynamoDB (opens new window) database. Query functionality is also fully supported.
- Writing/reading information to relational database systems
- Configurable database table names
- Automatic table creation
This service is provided "AS IS", and the user takes full responsibility of any charges or damage to Amazon data.
# Table of Contents
You must first set up an Amazon account as described below.
Users are recommended to familiarize themselves with AWS pricing before using this service. Please note that there might be charges from Amazon when using this service to query/store data to DynamoDB. See Amazon DynamoDB pricing pages (opens new window) for more details. Please also note possible Free Tier (opens new window) benefits.
# Setting Up an Amazon Account
- Sign up (opens new window) for Amazon AWS.
- Select the AWS region in the AWS console (opens new window) using these instructions (opens new window). Note the region identifier in the URL (e.g.
https://eu-west-1.console.aws.amazon.com/console/home?region=eu-west-1means that region id is
- Create user for openHAB with IAM
- Open Services -> IAM -> Users -> Create new Users. Enter
openhabto User names, keep Generate an access key for each user checked, and finally click Create.
- Show User Security Credentials and record the keys displayed
- Open Services -> IAM -> Users -> Create new Users. Enter
- Configure user policy to have access for dynamodb
- Open Services -> IAM -> Policies
- Check AmazonDynamoDBFullAccess and click Policy actions -> Attach
- Check the user created in step 2 and click Attach policy
This service can be configured using the MainUI or using persistence configuration file
In order to configure the persistence service, you need to configure two things:
- Table schema revision to use
- AWS credentials to access DynamoDB
# Table schema
The DynamoDB persistence addon provides two different table schemas: "new" and "legacy". As the name implies, "legacy" is offered for backwards-compatibility purpose for old users who like to access the data that is already stored in DynamoDB. All users are advised to transition to "new" table schema, which is more optimized.
At this moment there is no supported way to migrate data from old format to new.
# New table schema
Configure the addon to use new schema by setting
table parameter (name of the table).
Only one table will be created for all data. The table will have the following fields
| ||String||Yes||Item name|
| ||Number||Yes||Timestamp in milliepoch|
| ||String||Yes||State of the item, stored as DynamoDB string.|
| ||Number||Yes||State of the item, stored as DynamoDB number.|
| ||Number||Yes||Expiry date for item, in epoch seconds|
tforms the composite primary key (partition key, sort key) for the table
- Only one of
nattributes are specified, not both. Most items are converted to number type for most compact representation.
- Compared to legacy format, data overhead is minimizing by using short attribute names, number timestamps and having only single table.
expattribute is used with DynamoDB Time To Live (TTL) feature to automatically delete old data
# Legacy schema
Configure the addon to use legacy schema by setting
- When an item is persisted via this service, a table is created (if necessary).
- The service will create at most two tables for different item types.
- The tables will be named
<tablePrefix><item-type>, where the
bigdecimal(numeric items) or
string(string and complex items).
- Each table will have three columns:
timeutc(in ISO 8601 format with millisecond accuracy), and
itemstate(either a number or string representing item state).
# Credentials Configuration Using Access Key and Secret Key
|accessKey||Yes||access key as shown in Setting up Amazon account.|
|secretKey||Yes||secret key as shown in Setting up Amazon account.|
|region||Yes||AWS region ID as described in Setting up Amazon account. The region needs to match the region that was used to create the user.|
# Credentials Configuration Using Credentials File
Alternatively, instead of specifying
secretKey, one can configure a configuration profile file.
|profilesConfigFile||Yes||path to the credentials file. For example, |
|profile||Yes||name of the profile to use|
|region||Yes||AWS region ID as described in Step 2 in Setting up Amazon account. The region needs to match the region that was used to create the user.|
Example of service configuration file (
profilesConfigFile=/etc/openhab2/aws_creds profile=fooprofile region=eu-west-1
Example of credentials file (
[fooprofile] aws_access_key_id=testAccessKey aws_secret_access_key=testSecretKey
# Advanced Configuration
In addition to the configuration properties above, the following are also available:
|expireDays||(null)||No||Expire time for data in days (relative to stored timestamp)|
|readCapacityUnits||1||No||read capacity for the created tables|
|writeCapacityUnits||1||No||write capacity for the created tables|
Refer to Amazon documentation on provisioned throughput (opens new window) for details on read/write capacity.
DynamoDB Time to Live (TTL) setting is configured using
All item- and event-related configuration is done in the file
When the tables are created, the read/write capacity is configured according to configuration. However, the service does not modify the capacity of existing tables. As a workaround, you can modify the read/write capacity of existing tables using the Amazon console (opens new window).
Similar caveat applies for DynamoDB Time to Live (TTL) setting
# Developer Notes
# Updating Amazon SDK
- Update SDK version in
scripts/fetch_sdk_pom.xml. You can use the maven online repository browser (opens new window) to find the latest version available online.
- Copy printed dependencies to
After these changes, it's good practice to run integration tests (against live AWS DynamoDB) in
See README.md (opens new window) in the test bundle for more information how to execute the tests.
# Running integration tests
When running integration tests, local temporary DynamoDB server is used, emulating the real AWS DynamoDB API. One can configure AWS credentials to run the test against real AWS DynamoDB for most realistic tests.
- Run all tests (in package org.openhab.persistence.dynamodb.internal) as JUnit Tests
- Configure the run configuration, and open Arguments sheet
- In VM arguments, provide the credentials for AWS
-DDYNAMODBTEST_REGION=REGION-ID -DDYNAMODBTEST_ACCESS=ACCESS-KEY -DDYNAMODBTEST_SECRET=SECRET