Cumulocity Device Management Agent
Project description
Cumulocity IoT Device Management Reference Agent
Cumulocity Device Management (DM) Reference Agent written in Python3 to demonstrate most of the Device Management Capabilities of Cumulocity IoT
Quick Start
Native
To quickly run the agent natively make sure pyhton 3.7+ and pip is installed on your computer. Manually put the config file and the DM_Agent.json into the /.cumulocity folder in your user folder. For example: "/home/user1/.cumulocity" in Linux or "C:\Users\user1\.cumulocity" in Windows.
Installation
pip install c8ydm
To start the agent run
c8ydm.start
and to stop run
c8ydm.stop
Docker
To quickly run the agent clone this repo somewhere on your disk, make sure that Docker is installed on your computer and run in a Linux Shell:
./start.sh
In Windows Shells like PS or CMD run:
start.bat
The script will build a docker image and starting one instance afterwards. Per default Bootstrapping is used and no other information is necessary. In this case the docker container Id is the device Id which should be entered when registering a device in cumulocity.
You can find it out with:
docker ps
If you want to run the Agent without using docker you need to build and run the Agent manually.
Quick Start Configuration (Docker)
The DM Agent configuration can be either set by changing the agent.ini or setting variables before you build or start the container. For example to use Device Certificates you can use the following ENV Variables.
C8YDM_MQTT_URL=<tenant domain> \
C8YDM_MQTT_CERT_AUTH=TRUE \
C8YDM_MQTT_CLIENT_CERT=<path to cert file> \
C8YDM_MQTT_CLIENT_KEY=<path to key file>
As normal run ./start.sh afterwards.
If you want to use Cloud Remote Access with a VNC server, you can install the server and a desktop environment:
INSTALL_VNC=1 ./start.sh
By default, the docker container runs in background. If you want to run it interactively:
INTERACTIVE=1 ./start.sh
If you don't want to run within docker follow the steps below.
Features
Supported Cumulocity DM Features
Feature | Supported |
---|---|
Device Certificates | Yes |
Device Bootstrapping & Registration | Yes |
Software Updates (apt) | Yes |
Firmware Updates | Yes |
Configuration Updates text-based | Yes |
Configuration Snapshots | Yes |
Device Profiles | Yes |
Network | Yes |
Device Metrics (CPU, Memory etc.) | Yes |
Remote Logfile Requests | Yes |
Location Updates | Yes |
Remote Shell | Yes |
Remote Access (SSH, VNC, Passthrough) | Yes |
Hardware Metering (CPU, Memory, HDD) | Yes |
Raspberry PI SenseHAT | Yes |
Docker Management | Yes |
Raspberry PI & SenseHAT Support
The DM Agent can run on a Raspberry PI (3+) with a SenseHAT. It supports:
- Reading out all sensor values of the SenseHAT (Humidity, Temperature, Acceleration, Gyroscope, Compass)
- Display Messages on the LEDs sent via Cumulocity to the Pi (c8y_Message) via Message Widget.
- Generates Events when the Joystick is pressed in different direction.
It is suggested to run the Agent a Service. Use dm-agent.service to install it:
sudo cp ./service/dm-agent.service /etc/systemd/system/
sudo systemctl enable dm-agent.service
sudo systemctl daemon-reload
sudo service dm-agent start
Configuration
The agent can be configured via the agent.ini which must be placed in
{userFolder}/.cumulocity
When running in docker container the agent.ini can be mounted to the /root/.cumulocity/agent.ini
You can find a reference agent.ini here
Category | Property | Description |
---|---|---|
mqtt | url | The URL of the Cumulocity MQTT endpoint |
mqtt | port | The Port of the Cumulocity MQTT endpoint |
mqtt | tls | True when using port 8883, false when using port 1883 |
mqtt | cert_auth | true when you want use Device Certificates for Device Authentication |
mqtt | client_cert | Path to your cert which should be used to for Authentication |
mqtt | client_key | Path to your private key for Authentication |
mqtt | ping.interval.seconds | Interval in seconds for the mqtt client to send pings to MQTT Broker to keep the connection alive. |
agent | name | The prefix name of the Device in Cumulocity. The serial will be attached with a "-" e.g. dm-example-device-1234567. |
agent | type | The Device Type in Cumulocity |
agent | main.loop.interval.seconds | The interval in seconds sensor data will be forwarded to Cumulocity |
agent | requiredinterval | The interval in minutes for Cumulocity to detect that the device is online/offline. |
agent | loglevel | The log level to write and print to file/console. |
Environment variables
The environment variables which with C8YDM_ prefix are mapped to configuration files. Mapping rules:
- Prefix C8YDM__ means what section the option belongs to
- Upper case letters are mapped to lower case letters
- Double underscore __ is mapped to .
Build
The agent can be build in multiple ways.
Building via pip
To build the agent via pip just run (as a root user, otherwise add "sudo" prior all commands).
pip3 install -r requirements.txt
to install dependencies and afterwards
pip3 install .
to build the agent itself. Please note that in debian/ubuntu you need additionally install
apt install python-apt
via apt.
Continue with chapter Run
Building debian package
In order to build the .deb yourself first install python-stdeb via apt.
apt install python-stdeb
Afterwards run
python setup.py --command-packages=stdeb.command bdist_deb
on the level of the setup.py.
In oder to install the debian package locally run
apt install ./deb_dist/python-c8ydm_0.1-1_all.deb
Continue with chapter Run
Building docker image
To build a docker image you can make use of the provided Dockerfile.
Example:
docker build -t dm-image -f docker/Dockerfile .
Run
Python
Before running the agent some manual steps need to be taken
- Manually put the config file into {userfolder}/.cumulocity
You can run the agent by executing (as root, otherwise add "sudo")
c8ydm.start
in your console when you used Building via pip to build and install the agent.
apt / Debian package
Before running the agent some manual steps need to be taken
- Manually put the config file and the DM_Agent.json into ~/.cumulocity folder. ~ stands for the current user folder. The SmartRESTTemplate will be automatically uploaded on first start.
You can run the agent by executing (as root, otherwise add "sudo")
c8ydm.start
in your console when you used Building via deb to build and install the agent.
Docker
You can run the agent by executing
docker run -d -v /var/run/docker.sock:/var/run/docker.sock dm-image
in your console when you used Building Docker Image to build and install the agent.
The config can be mounted the container. Otherwise the default config will be used.
Mass deployment
You can run multiple instances of an container via:
. mass_start.sh 5
where in this example 5 is the number of agent instances.
Develop
Dev Container
The project comes with VS Code devcontainer support. Make sure you use Visual Studio Code in combination with docker. Just open the project in VS Code and click on "Reopen in Dev Container".
In the background the Agent will be build and started. Also a debug/run configuration is provided so you can easilly start/debug the agent within VS Code.
Using certificate authentication
You can generate certificates necessary to certficate authentication, and you can upload the generated root certificate o your tenant's trusted certificate list by executing the scripts like below:
./scripts/generate_cert.sh \
--serial pyagent0001 \
--root-name iot-ca \
--cert-dir /root/.cumulocity/certs \
--cert-name device-cert
./scripts/upload_cert.sh \
--tenant-domain <tenant domain> \
--tenant-id <tenant ID> \
--username <username for the tenant> \
--password <password for the tenant> \
--cert-path /root/.cumulocity/certs/iot-ca.pem \
--cert-name <(arbitrary) displayed name of the root certificate>
After this, you can connect the agent to your tenant using cert authentication (with the serial pyagent0001
in this case).
Testing
With the agent running in the container, execute
./test.sh \
--url <tenant domain> \
--tenant <tenant ID> \
--username <username for the tenant> \
--password <password for the tenant>
to run pytest.
Extending the agent
The agent knows three types of classes that it will automatically load and include from the "agentmodules" directory.
-
Sensors
class Sensor: __metaclass__ = ABCMeta def __init__(self, serial): self.serial = serial ''' Returns a list of SmartREST messages. Will be called every iteration of the main loop. ''' @abstractmethod def getSensorMessages(self): pass
Sensors are periodically polled by the main loop and published.
-
Listeners
class Listener: __metaclass__ = ABCMeta def __init__(self, serial, agent): self.serial = serial self.agent = agent ''' Callback that is executed for any operation received ''' @abstractmethod def handleOperation(self, message): pass ''' Returns a list of supported operations ''' @abstractmethod def getSupportedOperations(self): pass ''' Returns a list of supported SmartREST templates (X-Ids) ''' @abstractmethod def getSupportedTemplates(self): pass
Listeners are called whenever there is a message received on a subscribed topic.
-
Initializers
class Initializer: __metaclass__ = ABCMeta def __init__(self, serial): self.serial = serial ''' Returns a list of SmartREST messages. Will be called at the start of the agent ''' @abstractmethod def getMessages(self): pass
Initializers are only called once at the start of the agent.
You can take a look at the two example modules for how it can be used.
Log & Configuration
The logfile and configuration can be found in the following directory.
/root/.cumulocity
These tools are provided as-is and without warranty or support. They do not constitute part of the Software AG product suite. Users are free to use, fork and modify them, subject to the license agreement. While Software AG welcomes contributions, we cannot guarantee to include every contribution in the master project.
For more information you can Ask a Question in the Tech Community Forums.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
File details
Details for the file c8ydm-1.1.0.tar.gz
.
File metadata
- Download URL: c8ydm-1.1.0.tar.gz
- Upload date:
- Size: 40.2 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/3.8.0 pkginfo/1.8.2 readme-renderer/32.0 requests/2.27.1 requests-toolbelt/0.9.1 urllib3/1.26.8 tqdm/4.62.3 importlib-metadata/4.11.0 keyring/23.5.0 rfc3986/2.0.0 colorama/0.4.4 CPython/3.10.2
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | 7f259f540ea5b1773d704e5003cf620455c61dc0e5b7ecff33df0558c3bbb947 |
|
MD5 | 62906b3a406f02abd73f4e30423ce707 |
|
BLAKE2b-256 | 6bd465af64e151fb278e13d0f8e80fd891286bd881abf2c207a78622d0660eb1 |
File details
Details for the file c8ydm-1.1.0-py3-none-any.whl
.
File metadata
- Download URL: c8ydm-1.1.0-py3-none-any.whl
- Upload date:
- Size: 62.6 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/3.8.0 pkginfo/1.8.2 readme-renderer/32.0 requests/2.27.1 requests-toolbelt/0.9.1 urllib3/1.26.8 tqdm/4.62.3 importlib-metadata/4.11.0 keyring/23.5.0 rfc3986/2.0.0 colorama/0.4.4 CPython/3.10.2
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | 3f1f4366cd13a145775a1af6bce8f57dfee901cc5e080ef5ea665d0d82fee3c6 |
|
MD5 | 1c6e05a99479b28cd67a8fcf333dc366 |
|
BLAKE2b-256 | ed080a938833d8582b0487e90d2d5e9bc60667ff681286d70f5be2e6318e9c9e |