Change logs

These change logs document all relevant changes for the Cumulocity IoT cloud deployments.

The following types of change are included:

  • Feature - New features which are generally available.
  • Preview - Features which are in Public Preview and not yet generally available.
  • Improvement - Small improvements.
  • Announcement - Deprecations, removals or important UI changes.
  • API change - Breaking changes in the APIs.

Displaying all changes since December 6, 2023

April 25, 2024

UI improvement for ordering of complex properties

Users can now order the complex property keys by dragging and dropping them using the drag icon which appears on hovering over the row.

April 4, 2024

Added support for retrieving JWT session token with X.509 certificates for devices

Support has been added for retrieving JWT session tokens with X.509 certificates via REST API for devices. For details, refer to the Device authentication user documentation.

Option to ignore case of username or alias on login

To simplify the login process, tenant administrators can now activate an option which allows users to log in with case-insensitive usernames or aliases.

ZIP option now available when building an application

It is now possible to build an application with the –zip argument. This will generate a ZIP archive which contains the application and its dependencies in addition to the regular build artifacts.

New utility functions for the EPL TimeFormat event library

The following utility functions have been added to the TimeFormat event library to help with comparing and manipulating datetimes. As with the existing functions, the new utility functions work for the local time zone, an arbitrary time zone and, where appropriate, the UTC time zone.

  • dateComponent: Gives the datetime for the previous midnight in the time zone at the given datetime.
  • timeComponent: Gives the number of seconds since the previous midnight in the time zone at the given datetime.
  • daysSinceEpoch: Gives the number of Julian days since the beginning of the epoch at the given datetime.
  • getOffset: Gives the offset in seconds of the time zone from UTC at the given datetime, taking into account any daylight savings that may be being applied.
  • getRawOffset: Gives the base offset in seconds of the time zone, that is, without daylight savings applied.

For example, there are two ways to check if it is midnight in your local time zone:

float now := currentTime;

// Method 1
if TimeFormat.dateComponent(now) = now
{
     // It's midnight.
}
// Method 2
if TimeFormat.timeComponent(now) = 0.0
{
     // It's midnight.
}

For usage information, see the API Reference for EPL (ApamaDoc). This is available in Apama 10.15.5.

March 28, 2024

Alarms redesign and improvements

In the upcoming version, a redesign of the alarms feature will be introduced with both visual and functional enhancements.

Visual and UX enhancements:

  • The way alarms are displayed in the “Alarms” view and widgets has been redesigned.

Functional improvements:

  • The “Alarms” view now only shows one single list of alarms, in which filters can be applied.
  • A details section has been introduced which contains all information related to the alarm.
  • The functionalities of the “Alarm list”, “All critical alarms”, and “Recent alarms” widgets have been merged into a single, comprehensive widget called “Alarm list”.
  • The “Alarm list” widget has been migrated to Angular.
  • The real-time functionality has been replaced with an auto-refresh functionality.
  • Already existing widgets: “Alarm list”, “All critical alarms”, and “Recent alarms” will be automatically updated and migrated to the new version of the “Alarm list” widget.

Angular 17 upgrade

In a future version, we will update Angular to version 17. This update brings improvements and new features but may also introduce breaking changes that could impact your existing implementations.

To ensure a smooth transition and help you to adapt your implementations, we will provide an upgrade documentation when this change happens. This documentation will help you navigate through the changes and update your codebase accordingly.

Dashboards redesign and improvements

In the upcoming version, we will introduce redesigned dashboards with both visual and functional enhancements as well as new functionalities.

Visual and UX enhancements:

  • We have redesigned the way dashboards are edited.

Functional improvements:

  • The lock/unlock feature has been replaced with an edit mode for better control and clarity.

New functionalities:

  • Possibility to enable and disable dashboard template for device dashboards.
  • Versioning to manage and track dashboard changes.
  • Edit mode with undo/redo functionality for flexible adjustments.

For details refer to Working with dashboards.

March 27, 2024

Advance notice of reduced storage limits for Notifications 2.0 and microservice-based data broker

Messages processed by Notifications 2.0 are stored persistently by the Cumulocity IoT Messaging Service until they have been delivered to, and acknowledged by, all interested consumers. Likewise, messages processed by the microservice-based data broker are stored persistently until they have been delivered successfully to the destination tenant.

The current persistent storage limits for these services are considered too large for typical use cases, which can lead to excessive resource consumption and consumers being forced to process outdated messages after a disconnection.

Therefore, these limits will be lowered to better align with the expected usage patterns of the services.

These changes will take place not less than three months from the date of this announcement, on or after July 1st, 2024.

Message backlog quota

Persistent messages are stored in a “backlog” until they are received and acknowledged. The maximum size of a backlog is determined by the “backlog quota” limit, which directly affects the number of unacknowledged messages that can be stored and therefore the resource consumption of the platform. If the quota limit is reached, no new messages can be added to the backlog until some older messages have been consumed and acknowledged.

For Notifications 2.0, a separate backlog exists for every unique subscription name used with the /notification2/subscriptions API. This backlog is shared by all subscriptions using the same subscription name, and by all consumers attached to that subscription. For the microservice-based data broker, a separate backlog exists for each data broker connector.

Summary of changes to message backlog quota limits:

Service Current Limit New Limit
Notifications 2.0 2 GiB 25 MiB
Microservice-based data broker 2 GiB 50 MiB

For example, assuming an average message size of 200 bytes, each Notifications 2.0 subscription will be able to retain approximately 130,000 unacknowledged messages in its backlog. Similarly, each microservice-based data broker connector will be able to retain approximately 260,000 messages.

Message time-to-live

Alongside the backlog quota reduction, a new default message “time-to-live" (TTL) limit will be introduced. Any unacknowledged messages will be automatically deleted if they have been on the backlog for longer than the TTL limit. This policy helps to limit overall resource usage and reduces the need to process outdated data after a prolonged disconnection of a consumer or destination tenant.

Summary of changes to message TTL limits:

Service Current Limit New Limit
Notifications 2.0 ∞ (no limit) 36 hours
Microservice-based data broker ∞ (no limit) 36 hours

Additional details

The message backlog quota and TTL are configurable for each Cumulocity IoT tenant. Message backlog usage will be monitored during the three-month transition period, to identify tenants that may exceed the new limits when they are enabled. The owners of such tenants will be contacted to understand their use cases and whether a non-default limit could be appropriate.

Please contact product support if you have any questions or concerns about these changes.

March 21, 2024

Improved button text in Cockpit setup wizard

The text on the button in the Cockpit setup wizard has been updated. This change improves the clarity and consistency of the text for users going through the setup flow.

Improved measurement display in Linear Gauge and Silo widgets

The measurement display line size has been increased in both the “Linear Gauge” and the “Silo” widget. This enhancement improves readability, making it easier for users to interpret measurements at a glance.

Improvements to input range component

The input range component (c8y-range) can be used to show a slider to configure a range. The styling and documentation for this component has been improved to better suiting the overall styling of components and forms.

Introduce service registry with a hook for registering services

To improve the management and discoverability of services in Cumulocity IoT, a new service registry has been introduced allowing services to register with the platform via hooks.

EPL improvement to string.toDecimal() method

Previously, performing string.toDecimal() for a string with an invalid conversion resulted in a ParseException error. This now returns “0.0”. This was done to make the experience of using toDecimal() similar to using toFloat(). If you want the previous strict behavior, use decimal.parse() instead.

Paste the JSON code of an Analytics Builder model from the clipboard

In the Analytics Builder model manager, the Import model command in the toolbar has been changed to a dropdown menu. This dropdown menu contains a new Paste command. If you click this command and the clipboard contains valid JSON code for a model, a card for the pasted model is shown in the model manager. This change complements the accessibility enhancement that allows the JSON for an Analytics Builder model to be copied to the clipboard by allowing the JSON to be pasted back into Analytics Builder after any changes have been made. In addition, the dropdown menu contains an Upload command. This has the same functionality as the Import model command from previous versions. See also Pasting a model and Uploading a model in the user documentation.

March 14, 2024

Enhanced XSS protection in Asset notes widget

XSS protection has been enhanced in the “Asset notes” widget.

Improved JSDoc annotations

The JSDoc annotations have been improved. Changes include fixing broken links, updating outdated information, adding missing code snippets, and improving overall clarity. These improvements aim at providing developers with better references and guides when working with the Web SDK.

Improved sorting of properties in complex custom property in Digital Twin Manager

In the Subassets page of the Digital Twin Manager, the properties in the complex custom property were sorted alphabetically. Now, the sorting reflects the order specified by the user in the Digital Twin Manager.

Version numbers moved to the platform details file

The version numbers for the frontend and backend are no longer displayed in the platform UI. Instead, details on all components can be downloaded via the Download platform details button. This change was motivated by a component split resulting in many different components following different version number schemes. However, custom apps developed with the Web SDK may show a default version number if desired. Support requests should now always include the platform details information.

Consistent support of Enter and Escape keys

Improved the consistency of support of Enter and Escape keys (for save and cancel actions, respectively) on the following views: tenant details, user details, global role details, retention rule settings, branding configuration.

Improved context help in Subassets page

In the Subassets page, context help now provides more specific information if the displayed group is a smart group.

Improved information on "Use source timestamp" configuration

The user documentation and the tooltip for the “Use source timestamp” configuration have been improved to explain how the LWM2M agent makes use of timestamp information if reported by a device.

Migration of the Tracking tab to Angular

The Tracking tab in the device details has been migrated to Angular. The obsolete AngularJS module AssetTrack has been removed from the imports of the Device Management application (import @c8y/ng1-modules/devicemanagement-tracking/cumulocity.json). It is deprecated and will be removed in the future. With this change, an issue with incorrect results of custom date range filters has been fixed. Moreover, position marker popups have been made more informative.

Supported security modes retrieved dynamically from LWM2M agent

The supported security modes, which are available for selection on the configuration page, are now retrieved dynamically from the LWM2M agent rather than being hardcoded in the UI.

March 7, 2024

Obsolete AngularJS module AssetTrack (c8y.parts.tracking) has been removed

The AngularJS module AssetTrack (c8y.parts.tracking) has been removed as it is now considered obsolete. To include device tracking in your applications you can now use the Angular standalone TrackingComponent (@c8y/ngx-components/tracking) or directly provide the trackingFeatureProvider environment provider.

February 29, 2024

Copy the JSON code of an Analytics Builder model to the clipboard

In the Analytics Builder model manager, the Copy command has been added to the actions menu of a model. This is an accessibility enhancement that allows you to copy the JSON for an Analytics Builder model to the clipboard so that you can quickly paste it into a third-party editor. The JSON can then be read, for example, by a screen reader or in a higher contrast environment. The new Copy command is also available to read-only users. In addition, the Download command, which also appears in this actions menu, is now also available to read-only users. See also Copying a model and Downloading a model in the user documentation.

EPL events no longer throw exceptions from the isCreate and isUpdate actions

The Alarm, Event, ManagedObject and Operation events now no longer throw exceptions from the isCreate() and isUpdate() actions. If the event being checked was generated in EPL code, these two actions now simply return false. try ... catch blocks around these calls are no longer necessary if the event being checked was generated in EPL code. EPL code that uses these actions therefore behaves more robustly because it no longer throws exceptions that, if not caught properly, cause the monitor or app to terminate. In the unlikely case that the try ... catch block is used to intentionally check for internally generated events, you need to change the check to the following:

if not (evt.isCreate() or evt.isUpdate()) { ... }

New Analytics Builder filters for selecting the input source or output destination

In Analytics Builder, the dialog box that appears when you select a different input source or output destination for an input or output block now allows you to filter the entries that appear in this dialog box. By default, the dialog box displays all defined devices, device groups, smart groups and assets. This is the same as the previous behavior. If you also want to display other managed objects in the dialog box, you can now select the “Other” check box. See also Editing the parameters of a block in the user documentation.

Streaming Analytics microservices upgraded to use Red Hat UBI 9

The Apama-ctrl microservices now have Red Hat UBI 9 as their base operating system. Previously, this was Red Hat UBI 8. With version 9, security has been improved.

February 13, 2024

Switching to Linux cgroup v2

As announced earlier, see release 10.18, Cumulocity IoT SaaS instances will gradually be switched to Linux cgroup v2 in the second half of the year 2024. Microservices must use a Linux cgroup v2 aware application runtime from then on. When executing microservices which are not compatible with cgroup v2 on Cumulocity IoT in these versions it might happen that the information provided by the application runtime concerning available CPU and memory is not correct. This might lead to incorrect memory and thread allocation in the microservice container process.

cgroup is a Linux kernel feature to organize processes hierarchically and distribute system resources along the hierarchy in a controlled and configurable manner. Every process in the system belongs to one and only one cgroup. In Cumulocity IoT cgroups are used to enforce container resource limits.

When using the Cumulocity IoT Microservice SDK for developing microservices, ensure to configure a Java version which is cgroup v2 aware when building your microservice. When using Java 8, ensure to use openjdk8u372 or higher. When using Java 11, use Java 11.0.16 or higher, or use Java 15 or higher. When using a server runtime other than OpenJDK Java as microservice application runtime, refer to the documentation of the provider.

February 6, 2024

Improved information on "Use source timestamp" configuration

The user documentation and the tooltip for the Use source timestamp configuration have been improved to explain how the LWM2M agent makes use of timestamp information if reported by a device.

LWM2M Time-to-Live duration for device operation realtime subscription

The LWM2M agent realtime subscription for device operations now has a limited Time-To-Live (TTL) duration. The default TTL duration is 3 minutes. This setting may be configured on platform level.

Option to disable LWM2M object default actions

The default handling of object instance actions for LWM2M objects 3, 4 and 6 can now be turned off. In addition, the default server-side firmware update state machine for object 5 can be disabled. These settings can be enabled/disabled in the device´s LWM2M configuration in the UI.

December 20, 2023

Improved change password behavior

The password can now only be changed by the currently logged-in user. Administrators can no longer change the password and email for other users.

Added information on restrictions to auto-registration of LWM2M devices

The auto-registration option in trusted certification does not support devices communicating via the LWM2M protocol. This information has been included in the tooltip on the Trusted certificates page and in the user documentation.

New "Replace device" options

In the Subassets view, a “Replace device” option is now available in the context menu of every supported device. Previously, the “Replace device” option was only available in the All devices page. Moreover, a Replace device button has been added to the “Device status” widget on the Info tab in the device details. This functionality does not support LWM2M devices.

New toggle for switching off empty data

For LWM2M devices, it is now possible to switch off the sending of empty measurement/event/alarm/custom actions data for individual resources. Moreover, you can toggle on/off or optionally skip empty values for all resources using the LWM2M device protocol at once.

December 14, 2023

Assign a location to an asset

A new default property “Location” has been introduced. Add the Location property to the desired asset model to assign co-ordinates or select the location on a map while creating an asset.

Default values of asset properties available in assets bulk import template

The bulk import template now shows any default values that are set for asset properties.

DTM version moved under Platform info section

The DTM version is now displayed in the right drawer under the Platform info section.

Immediate feedback from validation of Key field

During the creation of asset models, asset properties and assets, upon entering input in the Key field, if the value entered is invalid then an error message will be shown, and if the value is valid and all required fields in the form are filled, the Save button will be enabled - no need to click outside the field. With de-bouncing implementation, the API requests are triggered after a short delay following the last key entry, significantly reducing the frequency of calls and enhancing the responsiveness of the application.

Implemented ordering of key value pairs in complex property

Key value pairs in a complex property can now be ordered as needed by entering the desired order in the Order field.

Improved action buttons in Localization page

Realigned the edit and delete icons for translations in the Localization page.

Improved asset model selection dropdown with search option

A search function has been added to the asset model dropdown when creating new assets.

Improved readability in Localization page

Renamed the column heading Keys to Identifier and the column heading Terms to Translation in the Localization page.

Improved validation for number property during asset instance creation

Users now receive validation errors when incorrect exponential values for asset properties are entered in number type fields during asset creation.

Improved visualization of steps skipped during asset instance creation

Non-mandatory steps that are skipped during the creation of an asset instance are now distinguished by a grey-colored tick.

Modified DTM URLs to match naming conventions of DTM entities

DTM URLs have been modified to reflect the naming conventions followed for DTM entities.

Optimized network calls for assets and asset models

Optimized calls to the backend from the Assets property and Asset model page.

Role-based access for bulk import of assets

Access to the bulk import feature can now be controlled using Cumulocity IoT global and inventory roles.

Saved filters for columns on Localization page

Filters that apply for columns in the Localization page are now saved automatically.

December 13, 2023
December 6, 2023

User administrator can no longer set password for other users

As announced earlier, see the release notes for release 10.17, to improve security, from a future version, user administrators will no longer be able to explicitly set passwords or email addresses for other users in the tenant. This change prevents that an attacker could have access to all users, in case the administrator account was compromised. Note that the administrator will still have the option to force the user to reset the password on the next login or disable the user.

Update of 3-party protobuf-java

In order to address security vulnerabilities (CVE-2022-3509, CVE-2022-3510, CVE-2022-3171), the third-party software “protobuf-java” has been updated from version 3.19.2 to version 3.19.6.

Improved performance of the Inventory API

The performance of the Inventory API GET /managedObjects has been improved.

Improved performance of GET requests on /user/users

The performance of GET requests on the /user/users endpoint has been improved.

Search for fields with null values now possible

The query language used by the managed objects API has been improved. You can now search for fields with null values. MTM-52677

Alarm status and severity now case-insensitive

The alarm status and severity are now case-insensitive. When searching by alarm status active the API also returns alarms with status ACTIVE. The same applies for the alarm severity, that is, searching for critical alarms also returns CRITICAL alarms. Alarms with status active and acknowledged are now subject of alarm deduplication.

Apama correlator version

This version of Cumulocity IoT Streaming Analytics includes the Apama version 10.15.4 correlator. EPL apps developers should also refer to What’s New In Apama 10.15.4 in the Apama documentation.

Extended ExplainQuery result

The ExplainQuery result info has been extended by the algorithm used when performing queries for a user with inventory roles:

GET {{url}}/inventory/hierarchy/info/management

Example: {“algorithm”: “Legacy” }

Possible results: Legacy, LimitedSourcesAcl, PostFilteringBySourceAcl, SingleSourceAcl, HierarchyAcl, SingleAgentAcl, SingleDeviceAcl, SingleAgentAndDeviceAcl.

Basic diagnostics information

The EPL memory profiler snapshots, which were previously only included in the enhanced diagnostics information, are now also included in the basic diagnostics information. This is helpful in case a high memory usage alarm is raised when the Apama-ctrl microservice consumes 90% of the maximum memory permitted for the microservice container and you only have basic diagnostics information available. See also Downloading diagnostics and logs in the user documentation.

Renamed commands for downloading analytic models and EPL apps

The commands for downloading analytic models and EPL apps have been renamed from Export to Download. See also Downloading a model and Developing apps with the Streaming Analytics application.

New EPL sample

A new EPL sample named “Receive update notifications” can now be accessed from the EPL editor of the Streaming Analytics application. It shows how to write an EPL app that can distinguish between notifications for creating and updating managed objects, measurements, alarms, events, and operations. See also Developing apps with the Streaming Analytics application in the user documentation.

For more detailed information, see Receiving update notifications in the Apama documentation for the Cumulocity IoT transport connectivity plug-in.

Latest measurement values can be stored as part of a device managed object

Feature preview
This feature is in Public Preview, that is, it is not enabled by default and maybe subject to change in the future.

Support of automated persistence of measurement values under the c8y_LatestMeasurements fragment has been introduced. If a measurement is created with a series that matches the configuration the device managed object is updated with the last series sent to the platform.

For details on how to enable the feature and how it works, refer to Managing data.

Receive input from all input sources

The Analytics Builder input blocks can now be configured to receive inputs from all input sources. You can simplify global tasks by creating a single Analytics Builder model that works with inputs from all input sources, for example, send an email for every critical alarm of type C8Y_TemperatureAlarm that is generated, regardless of the device that generated the alarm. A new All Inputs option is available for this purpose. When you add a new block to your model or when you edit the parameters of a new template instance, the All Inputs option is now set by default. See also Editing the parameters of a block in the user documentation.

You can also use the new All Inputs option in the replace dialog box when replacing input sources. Keep in mind that the replace dialog box is used for both input blocks and output blocks. So when you replace a device with the new All Inputs option, all matching output devices are automatically changed to trigger devices. See also Replacing sources or destinations in the user documentation.

A new Analytics Builder sample named “Aggregate measurements per input source” is now available, which creates new measurements that average the measurement values for each input source that has a specified fragment and series. This is a simple sample that creates a model without template parameters, so you can activate the model directly in the model manager. See also The Samples tab in the user documentation.

Planned change in full text search feature of Inventory API

As of a future version, the full text search functionality will only include the following properties:

  • _id
  • name
  • type
  • owner
  • external id

A text search functionality corresponds to a text parameter of GET {url}/inventory/managedObjects.

Example: When executing the following query: GET {url}/inventory/managedObjects?text=c8y_MajorDevice only the properties idnametypeowner and external id will be examined.

This change improves the user experience of the text search functionality by returning more relevant managed objects. At the same time it improves the Inventory API performance.

This change will be implemented after a 3-month period at the earliest.

Additional value types for the Constant Value block

The Constant Value block in Analytics Builder now supports float and boolean value types and can produce output of these types. This enables the block’s output to be consumed by other blocks that take input of type float or boolean like the blocks in the Logic and Aggregate categories. The Type parameter is also now optional. If a type is not selected, the type of the output value is inferred from the Value parameter.

Removing template parameters

In Analytics Builder, an icon is now provided for removing a template parameter from the Template Parameter dialog box. The actions menu (the three vertical dots at the end of a row) has therefore been removed. See also Managing template parameters in the user documentation.

New text index

A new text index has been introduced for the GET /inventory/managedObjects endpoint. By default it only includes the following fields:

_idtypenameownerexternalIds

Selection lists for template parameters

You can now create a selection list for an Analytics Builder template parameter. This allows the model author to provide a predefined list of values for the user to select from, ensuring that the user only enters the values you allow. You can define selection lists for types such as string, float, source or destination, or geofence and you can also select a specific value to be the default value. The values that you define for a selection list are then available for selection when you create instances of the model. See also Adding a selection list for a template parameter in the user documentation.

Missing subassets in a device group or asset hierarchy

Previously, when reactivating an Analytics Builder model, an error was thrown if a subasset of a device group or asset hierarchy from which the model receives events no longer existed in the inventory, for example, because a device was deleted. As of this version, missing subassets in a device group or asset hierarchy are ignored and an error is no longer thrown. However, if the deletion of a subasset results in an empty device group or asset hierarchy, an error is still thrown.

Removal of Machine Learning

As announced with release 10.16, the Machine Learning block in Analytics Builder has been removed. This is in line with the deprecation of Machine Learning Engine announced in release 10.16.

New sorting of Inventory API queries

If users do a search from the UI or via the Inventory API, the text parameters are now sorted by relevance making it easier to see the more appropriate data returned.

Cumulocity IoT transport in Apama 10.15.4

The Alarm and Operation events have new constants which define the valid values for their respective status and severity members. This allows more robust coding and eliminates runtime errors caused by typographical errors with literal strings.

External token validation in single sign-on configuration

In the single sign-on configuration page, users can now enable and configure the external token validation process.

Enhanced Cumulocity IoT transport in Apama 10.15.4 to reflect changes in REST API

Due to a change in Cumulocity IoT announced with release 10.17, Apama 10.15.4 now explicitly sets withTotalPages to true for applicable requests.

Range-based queries (such as FindManagedObject) attempt to retrieve all resources matching the query parameters by default. Explicitly setting a value for currentPage or setting withTotalPages to false can improve the query performance by disabling paging. See the information on REST usage and query result paging in the Cumulocity IoT OpenAPI Specifications for more information.

HTTP client in Apama 10.15.4 supports truncating responses

The HTTP client comes with two new configurable options, maxResponseKB and maxResponsePolicy, that enable the user to restrict the size of the server response. These options can be set for the entire transport, or on individual requests. Support has also been added to the predefined event definitions (see Using predefined generic event definitions to invoke HTTP services with JSON and string payloads in the Apama documentation). This enables you to prevent large server responses from causing out-of-memory issues.

Enhanced OpenSSL command

The OpenSSL command for generating a “signed verification code” for Proof of Possession has been enhanced to include additional encoding functionality.

Copy of web applications with versions

It is now possible to copy web applications with versions (packages) and web applications with SHARED availability. For applications with versions, by default the application with the “latest” tag is copied. The new application has a single version and no tags. If you want to copy different versions of an application, you can specify the query parameters “tag” or “version” (only a single version). For details, refer to the Cumulocity IoT OpenAPI Specification.

Version matrix for packages

The repository-connect microservice now offers to sync packages that include a versioning matrix which allows to filter exactly the versions to be synced. Versions which are not included in the matrix but uploaded to the platform will be removed by the microservice.

New filter option

Searching for items has been improved by filtering on applications, features, microservices and extensions lists.

EPL enhancements in Apama 10.15.4

String concatenation operator + supports non-string operands

If only one operand expression is of type string, then string conversion is now performed on the other operand to produce a string at runtime. For more details, see Additive operators in the Apama documentation.

New built-in convenience methods on string, sequence and dictionary

The EPL language has been enhanced with some convenience methods for common operations such as checking if a string or sequence contains a specified substring or item, and determining if a string, sequence or dictionary is empty.

There is a method to get a sequence value with a fallback default if there is no value at the specified index:

mySequence.getOr(100, "default value");

There is also a powerful regular expression group search for strings that finds the first match and returns the text captured by each “(…)” group of the regular expression:

// Prints ["Bob", "Eve"]
 print "Today Bob met Eve".groupSearch("([a-zA-Z]) met ([a-zA-Z])").toString();

The following table lists all new methods:

New method Description
string.contains(), sequence.contains() Determines whether the string or sequence contains the specified substring or item. This is a convenient alternative to checking the find() or indexOf() integer value.
string.groupSearch() Finds the first regular expression match in this string, and returns a list of the matched “(…)” groups.
string.startsWith(), string.endsWith() Determines whether the string has the specified prefix or suffix.
string.rfind() Locates a string within this string, starting from the right (that is, from the end) of the string.
string.substringFrom() Extracts part of this string, starting at a specified character and ending at the end of the string.
string.quote() Adds quotation marks and escaping according to the standard EPL event representation. This method may be useful for logging strings that may contain spaces and newline characters. This is the reverse of the existing string.parse() method.
string.isEmpty() Determines whether the string has a length of zero characters.
dictionary.isEmpty(), sequence.isEmpty() Determines whether the size is 0.
any.isEmpty(), optional.isEmpty(), listener.isEmpty(), Channel.isEmpty(), chunk.isEmpty() Aliases for the existing empty() methods on these types. It is recommended to use the new isEmpty() methods, but the use of empty() is not deprecated.
sequence.getOr() Gets the value at the specified index, or a specified fallback value if the index is not valid.

For more information, see the API Reference for EPL (ApamaDoc).

Support for negative indexes for sequence[…] access

Instead of throwing an out of bounds exception, it is now possible to refer to items near the end of a sequence by specifying a negative index. For example, seq[-1] gives the last item in the sequence and seq[-2] gives the item before that. Negative sequence indexes can also be used in the sequence.remove() and sequence.insert() methods.

Note that negative values cannot be specified when accessing a sequence item using the any.getEntry() method.

Mixed-type sequence and dictionary literals are now treated as <any> by default

It is no longer necessary to add an <any> cast around the first item in a sequence or dictionary literal that contains a mixture of different types. For example, the following sequence literal which produces a sequence<any>:

[<any> 12345, "a string"]

can now be written more simply as

[12345, "a string"]

This simplifies the functional example given in EPL enhancements in 10.15.3 in the Apama documentation: the <any> is no longer needed in the setFields call.

Discarding of unused return values

In EPL, it is now possible to discard the return value of a function or expression and not assign it to a variable. This is useful if you only want the side effects of the function and do not need the return value. Be careful not to discard a return value that indicates important conditions that your program may need to use.

Previously, you had to write:

any _ := Functional(newAlarms).map(Fn.getEntry("alarm")).map(allAlarms.append);

But now you can write:

Functional(newAlarms).map(Fn.getEntry("alarm")).map(allAlarms.append);

See also Using an expression as a statement in the Apama documentation.

Functional operators

The com.apama.functional.Fn and com.apama.functional.Functional events now have a new method mapKeys which can return a dictionary container with modified keys. For more details, see Functional operators in the Apama documentation and the API Reference for EPL (ApamaDoc).

Functional listeners

The functional onTimeout action now returns the wait listener it creates so that it can be quit if needed. For more details, see Functional listeners in the Apama documentation.

Handling uncaught exceptions

EPL monitors are no longer terminated by default when an uncaught exception is thrown in some cases.

Programming errors and unexpected data in incoming events can cause an uncaught exception in EPL. This causes the monitor instance to be terminated, rendering the application unusable. To provide a better experience, exceptions thrown from listeners and stream listeners which are not caught no longer terminate the monitor instance. Instead, they just stop the handling of the current event.

Developers are still encouraged to correctly catch and handle the exceptions in their EPL. If an exception is thrown and not caught, it is still possible for the events to be lost and not correctly handled.

This is a change in behavior. Some users may be relying on this previous behavior, in combination with an ondie() action. EPL with an ondie() action retains the previous behavior of always terminating the monitor and calling ondie(). If you must retain the previous behavior, you can add an empty ondie() action to your monitor.

Info
If you have an action that is called from within a stream query (for example, as part of a where or group by clause, or a window definition) which throws an exception, this still terminates the monitor instance.
Updated events in com.apama.cumulocity

To avoid confusion as to whether events were being sent towards Cumulocity IoT or being received back as updates from Cumulocity IoT, the Cumulocity event definitions API was changed in a previous release (10.5.2.0) so that the existing CHANNEL constant was deprecated and replaced by either SEND_CHANNEL or SUBSCRIBE_CHANNEL constants as appropriate. Some events were omitted from these changes and this has now been rectified. Therefore, the CHANNEL constant is deprecated on the following events:

  • SubscribeMeasurements
  • UnsubscribeMeasurements
  • FindManagedObjectResponseAck
  • FindMeasurementResponseAck
  • GenericResponseComplete
  • Subscribe
  • Unsubscribe

In addition, a new SUBSCRIBE_CHANNEL or SEND_CHANNEL has been added to the following events instead:

  • SubscribeMeasurements
  • UnsubscribeMeasurements
  • Subscribe
  • Unsubscribe

The constants on the following events are instead replaced with SUBSCRIBE_CHANNEL constants on their corresponding Response types:

  • FindManagedObjectResponseAck
  • FindMeasurementResponseAck
  • GenericResponseComplete

The API Reference for EPL (ApamaDoc) has been amended to make it clear that acknowledgement events are always received on the same channel as the corresponding response events, and to avoid confusion the CHANNEL constant has been deprecated on those acknowledgement events where it had been defined.

Package availability

To improve usability, the package availability (SHARED or PRIVATE) can now be set in the package upload wizard.

Removal of org.json dependency

The dependency on org.json:json has been removed from the Java SDK.

Removal of json-path dependency

The dependency on com.jayway.jsonpath:json-path has been removed from Java SDK.

Update on jetty dependency

Dependencies on org.eclipse.jetty:jetty-* were updated to version 9.4.51.v20230217.

Update on Sprint Boot dependency

The Spring Boot dependency has been updated to version 2.7.11.

Deprecation of the Microservice SDK for C#

With the introduction of auto-generated SDKs, we provide an always up-to-date developer library with the purpose to facilitate the development of Cumulocity IoT microservices in different programming languages including C#.

The new auto-generated SDKs make our existing Microservice SDK for C# obsolete. For this reason, the Microservice SDK for C# has been removed from our public product documentation.

To learn more about using the auto-generated SDKs, refer to our respective GitHub repository.

Location view migrated to Angular

The location view in the Device management and Cockpit application has been migrated to Angular. The map provider, the location search, and the map layers are now configurable via application options or tenant options. The angular.js module @c8y/ng1-modules/devicemanagement-location for location was removed and must be migrated or at least removed on update of a custom build application.

New wizard for device replacement

In the Device management application, a wizard has been implemented which guides users through replacing a physical device with another one. The replacing device must be registered in the platform in advance and is removed after the replacement procedure has been completed.

Customizable dashboard in the device details

Users can now customize the dashboard on the Info tab in the device details. Widgets can be moved and resized, and new widgets can be added from a list of available widgets. The dashboard can be reset anytime to the default dashboard settings. By default, the “Asset notes” widget has been removed.

Removal of software item

If the last version of a software is deleted, the software is entirely removed from the repository.

New option to remove a file when updating file property

It is now possible to remove a file when updating its file property within a complex property of an asset.

Improved device registration process

If a pending device in the registration list has been accepted, the device is now removed from the list instead of the list showing the “accepted” status for the device.

Improved smart group filter layout

In subasset views, smart group filters are now represented by a filter chips dropdown instead of displaying the raw text filter.

Improved filter by software type

In the Software tab in the device details, currently the Filter by software type dropdown in the Installed software list and the Install software modal shows types based on existing types in the software repository. This has been changed to show only the supported software types announced by the device in its c8y_SupportedSoftwareTypes fragment. If a device has not announced supported software types, then again all available existing software types are listed.

Removal of deprecated device-grid model classes, column implementations and services

As announced earlier, see also release 10.17, shared classes, components and services from the @c8y/ngx-components/device-grid are deprecated. Those deprecated items have now been removed.

This change only affects you, if you or your development team use the Web SDK to extend Cumulocity IoT UI applications or to build your own web applications. If you use the device-grid functionalities, check the deprecation documentation and alter your code accordingly. Refer to the deprecations in the WebSDK resources documentation for the device-grid service. Other deprecations for reference are also marked in this documentation.

New versioning matrix for blueprints/plugins

A versioning matrix can now be added to the cumulocity.json of a blueprint/plugin. When a blueprint/plugin is installed, its version is validated against the platform version. If the versions are incompatible a warning is shown.

Upgrade to Angular 15

The Web SDK has been upgraded to Angular 15.

Removal of deprecated implementations

In release 10.16.0.0, core re-usable data-grid-related components and services have been moved to the @c8y/ngx-components. The initial implementations were deprecated and have now been removed.

New activeClassName input in data-grid and device-grid components

A new activeClassName input has been added to the data-grid and device-grid components. It can be used to define a class name to be appended to the last clicked row in the grid. Its default value is “active”. This option can be deactivated by setting the input value to an empty string.

New filter dropdown in data grids

In the data grid component, a new filter overview dropdown has been added. It displays all active filters in one place and allows users to remove filters. For custom column implementations, the WebSDK allows developers to provide their own logic to display active filters as items in the filter overview.

Improved shell applications behavior

Shell applications now wait with their initial navigation until all plugins have been loaded. This allows, for example, to directly navigate via a link to a route which is provided by a plugin.

Data grid components return to first page after reload

Data grid components no longer persist their current page. After reloading they always return to the first page in the list.

Removal of references to deprecated classes

References to the deprecated classes ComponentFactory and ComponentFactoryResolver have been removed from the @c8y/ngx-components library.

Context path in the remotes application option

Scaffolding an application that uses the remotes application option via the c8ycli now also updates the context path used in the remotes application option.

Removal of Impact connectivity feature

The Impact connectivity feature has been removed from @c8y/ngx-components and @c8y/ng1-modules packages.

Improved behavior on plugin installation

When installing a plugin and the tenant has no custom applications, it is now possible to duplicate any existing application.

Fine-grained positioning of widgets on dashboards

The grid used in dashboards for placing widgets now supports 24 instead of 12 columns. This allows finer-grained positioning of widgets on dashboards. In case you share the same dashboards between different application versions, we strongly recommend you to upgrade to a version that includes the fix MTM-55923.

Improved error message on failure of device deletion

If a user with minimal permission tries to delete a device an error message showed up stating “Could not delete device.” Now, together with the failure message, the reason of failure is displayed.

Change aggregation for entire dashboard

It is now possible to change the aggregation for all widgets in a dashboard that support the dashboard context functionality at once. The following widgets support the dashboard context aggregation: Data points graph, Data points graph 2.0, Data points table.

Disabling OPC UA Server endpoint validation

The endpoint validation happening during the connection to an OPC UA server can now optionally be disabled. This can be done in the gateway configuration by changing the gateway.connectivity.validateDiscoveredEndpoints setting to “false”. Alternatively, it can be controlled via the OPC UA server managed object by setting the fragment validateDiscoveredEndpoints to “false”. For details, refer to OPC UA.

Support of HTML in input fields

To be able to provide more information in input fields on the expected input, dynamic form fields now support HTML markup in their description.

New configuration flag in LWM2M device registration settings for firmware reset

The configuration flag fwResetStateMachineOnStart has been added to control if the LWM2M agent resets the firmware update state machine on the client at the beginning of a firmware update. The default of this flag is true which matches the existing behaviour of the LWM2M agent. It is available in the device registration settings.

New static template 201

Added the SmartREST static template 201 for creating measurements with multiple fragments and series.

New static template 125

Added the SmartREST static template 125 for sending heartbeat from a device.

New static template 507

Added the SmartREST static template 507 for changing the device operations status from EXECUTING to FAILED. The operations can be filtered by type. The template is intended for facilitating an operations cleanup after a crash.

Changed form validation for assets defined via the Digital twin manager

If an asset custom property in the Digital twin manager application is declared as required and complex, all of its sub-properties are required too.

New shell commands

Two new LWM2M shell commands have been added.

  • The new executelegacy command allows LWM2M execute requests with non-standard LWM2M parameters. The behavior of this operation resembles the semantics of the existing execute operation until version 10.15.
  • The new coap shell command enables making raw CoAP requests to devices to facilitate non-standard communication in exceptional cases.

For details, refer to Handling LWM2M shell commands.

Disable/enable realtime for widgets on dashboard level

If a widget supports realtime, it can now be linked to the dashboard real-time context to disable/enable realtime on dashboard level. The following widgets support the real-time dashboard context: Data point graph, Data point table, Event list, Map.

Map shown for assets created in the Digital twin manager

If a complex location property is set in the Digital twin manager application, the map is now visible in the asset view and users can select a location on the map.

Improved performance of migration operation

The performance of the migrateLwm2mDevices operation has been improved. New command line arguments have been introduced with the operation. A list of legacy LWM2M devices can be specified directly from the shell command. Moreover, the migration of the LWM2M client registration objects can be skipped by using an argument.

For details, refer to Migration of the LWM2M devices. [DM-1866]

New LWM2M configuration tab

The details of a LWM2M device now show a LWM2M configuration tab which replaces the LWM2M bootstrap parameters tab. The new tab is better structured and allows detailed configuration. It contains all configuration options of the former LWM2M bootstrap parameters tab as well as additional setting options:

  • LWM2M device settings such as awake time registration parameter, request timeout, serialization format, binary delivery encoding, use timestamp resources, keeping old values
  • Device security modes selection including the new X.509 certificate mode and selection for LWM2M bootstrap and server individually
  • Firmware update configurations
  • A set of LWM2M Server configurations that can be written to the device during bootstrap

For details, refer to the LWM2M user documentation.

If the new LWM2M configuration tab is not displayed and the LWM2M bootstrap parameters tab is displayed instead, the LWM2M agent is installed in an older version that does not yet support the new tab.

Customizable home dashboard

The Device management home page now also provides a customizable dashboard which lets users add customized widgets.

New filter option in the datapoint selector

The asset selection in the datapoint selector is now filterable.

Introduced required parameters in the Alarms, Events, Measurements APIs

As announced earlier, see also release 10.17, at least one query parameter limiting the affected data will now be required to prevent accidental deletion of too many objects during a bulk delete operation. This change affects the following APIs:

  • DELETE /alarm/alarms requires at least one of the following parameters: source, dateFrom, dateTo, createdFrom, createdTo
  • DELETE /event/events requires at least one of the following parameters: source, dateFrom, dateTo, createdFrom, createdTo
  • DELETE /measurements/measurement requires at least one of the following parameters: source, dateFrom, dateTo

New time ranges for exports

The following time range options have been added to the export configuration: “Last 24 hours”, “Last 7 days”, “Last 30 days”.

X.509 security mode support

LWM2M device connections with X.509 certificates are now supported. The X.509 security mode can be selected separately for the Bootstrap server and the LWM2M server either during device registration or, for existing devices, by using the new LWM2M configuration tab. The Certificate Authority that issued device certificates must be added and enabled in trusted certificates in the tenant.

Together with this change also the following changes are introduced:

Separate security mode for Bootstrap and LWM2M server

Now all LWM2M device security modes can be selected separately for Bootstrap server and LWM2M server connections. This can be defined either during the device registration or using the LWM2M configuration tab of the device.

Disable authentication for Bootstrap or LWM2M server

Under Connectivity in the LWM2M configuration tab, the Bootstrap or LWM2M server connection can be disabled for a device.

PSK-generated option for LWM2M server security mode

During device registration, the “PSK generated” option can be selected for LWM2M Server connection to make LWM2M agent to generate the PSK ID and PSK key credentials for the device. These will be set to the device during the bootstrap process. For details, refer to the LWM2M user documentation.

MongoDB Java driver version upgrade

The MongoDB Java driver has been upgraded to the latest version 4.10.2.