Below you will find the history of new feature changes to the Tartabit IoT Bridge
On KeepAlive behavior.
do-nothing responds to keep-alive messages, but does not update any internal state.statusDetail will set the dateLastKeepAlive status detail with the timestamp when the last keep-alive was received for an endpoint.touch will touch the endpoint and set the status detail so the endpoint remains connected and you can see the recent activity.event will set the status detail, touch the endpoint, and generate a coap-keepalive event for more advanced processing.lwm2m-fota-complete event when the FOTA operation is aborted early in the process.lwm2m-result events when messages are purged from the lwm2m endpoint's queue on registration.compact-binary formatted messages./log/csv for exporting logs as CSV files.setValue operation from reports./import now supports global variable import protection to control if a global variable's value can be overwritten on import.  (see trigger updates for more information)Import Protection, when enabled, imports of the global variable will not modify the current value.  This is useful when the initial value might be set on import but customized per-use after initial import.Internal-WiFi location resolution to improve location results in complex buildings.0001-01-01T00:00:00Z placeholders./report/details/csv to download report details as a CSV file.shared ports to enable customers to start using UDP protocols faster without waiting for ports to be assigned to them.history.search() next parameters not handling == signs in query./file/upload now supports multi-part mime uploads./endpoint/count now supports total query parameter to return a total number of endpoints in addition to the current count.history.one() now properly filters by accountId.history.search() supports next parameter for iterating history.history.search() supports options argument to control next, and limit support.advanced->files functionality from old user interface.serverInstance and securityInstance in bootstrap configurations for devices that need specific instances assigned.writeAs in bootstrap configuration to write as instances or resources for devices that do not support the default behavior of writing bootstrap objects as instances.includePortInUrl to FOTA functions/API to allow for forcing the correct port to be inserted into the URL instead suppressing the default port assignments.coap.notify(), trigger action timeout has been increased from 5 to 30 seconds.connected or unavailable state were rejected.lwm2m-data events now have an objectIds field which contains a list of objectIds being published, this facilitates faster searches in the event browser and simplified filters in triggers.lwm2m-data events now have a token field which includes the token that associates the request to its observation and its packet data.Client ID (key: client_id) that contains the MQTT client identifier for the connection.Client ID parameter.  If it is not matched, then it will fallback to checking the endpoint key.Client ID in the parameter instead of the endpoint key.Client ID field will automatically be set to ease migration.azure_blob.append() function to create or add a block to an append blob in azure storage.
azure_blob.append('storage_demo','test','testBlobAppend',{abc:'abc', xyz:123})wifi.apAdd() and wifi.apDelete().location.geolocate().queclink extractor for dual-ASCII/binary Queclink messages.exec.sync() to make cross-account calls using appToken parameter.trigger.exit('<error message>') to cause a trigger's execution to be marked as a failure.  This helps in determining problems during application logic.endpoint, with a limit of 1 per day.lifetime and remoteAddr status details on LWM2M update.lwm2m.firmwareUpdate() called appendFileName that, if set, will append the file name on the URL.externalRefs on account objects via the API.coap.notify() not is properly not an async function and can return results to the calling trigger.lwm2m.execWithArgs() to allow executing resources and providing data.
lwm2m-result event now properly includes data field when processing a read request from the CoAP queue.lwm2m-result event now has an intermediate field to indicate that the result is not the final result for a request.
endpoint.storageDelete() function for deleting storage objects.cache.set().directToQueue, if true, request will not be sent via CoAP and will be added directly to the queue for the device for the next time it sends a notification or update.data to the lwm2m-result event for read operations.values.yaml for private deployments.metrics/fields available to collect usage of specific fields in objects like services and endpoints.convert.objectToCbor() for converting javascript objects to CBOR binary buffers.endpoint.X() functions where errors were not properly returned and instead a blank object was returned.metrics/status API has a new parameter resolve=true which will add the associated trigger, endpoint, or service objects to their respective status return.metrics/status API now supports limit and sort parameters.imex/import API now will use real-time API for first 500 items instead of first 50 items before switching to bulk import mode.endpoint.create() to set endpoint parameters only if an endpoint was passed into the trigger.activity.getAll() for querying the activity counters in the IoT Bridge.output events that show the events generated using exec.now() and exec.sync() within the trigger.engpoint.update() and endpoint.updateTags() will now update the event.endpoint object as well as saving the requested changes.  This means that subsequent exec.now() calls will have the new updated information resulting from these function calls.exec.now() with an optional appToken parameter containing an app token from another account to generate cross-account events.k. prefix to select the key instead of id.generic service and endpoints for custom applications that can't use other service oriented endpoint strategies.convert.intToHex() to quickly print a number as a hex string.endpoint.attach() to attach an endpoint to an event during trigger execution, useful when the service cannot automatically attach an endpoint to an event.endpoint.delete() for deleting endpoints.email.send() now supports attaching table data.report.listEntries() to retrieve a list of entries in a report that match a search query.file apis for managing file repositoryhistory.one() now returns null if no record is found.endpoint.storageGet() now returns null if no data is found.cache.set2() and cache.get2() that will automatically encode and decode javascript objects reducing the need to read and parse the returns.status() functions to binary and bit readers to return streaming status.file.info() to retrieve information about a file in the file repository.file.read() to read small files directly into a trigger.endpoint lookup to aid with finding endpoints and not going back and forth from the endpoint list.advanced->files for managing file inventories.middle-mouse-click to open many links in new tabs.  Works in navigation menu and many of the event viewer and log viewer buttons.notes
core-api 1.4.14
core-bootstrap 1.1.15
core-events 1.1.28
core-trigger 1.5.17
endpoint.create() to create endpoints from triggers.endpoint.storeGet() and endpoint.storeSet() to get/set values from endpoint storage.once-event that fires exactly once after being started, useful for executing logic after importing a solution template.geospatial.geodist() to calculate the distance between two points.has-tag custom filter now allows tag key or key:value matches to allow for more use cases.missing-tag custom filter fires the trigger if the associated endpoint does NOT have the specified tag or tag:value.has-status-detail custom filter fires the trigger if it has the specified status detail key or value.missing-status-detail custom filter fires the trigger if it does not have the status detail key or value.has-endpoint custom filter to filter for events that have a valid endpoint.email.send() action to send an email from a trigger.endpoint.searchOne() action to retrieve a single endpoint.trigger.ratelimit() action to return true/false if the rate limit conditions are met.core-ui 1.7.11
new page Endpoints/Entrypoints that shows all available addresses to communicate from devices to your IoT Bridge instance.
new page for geofences.
look and feel now served from core-api instead of mounted in azure storage (private instance only).
templates now support cloud formation launches.
tag lists have been updated to dropdowns for easier management with large numbers of tag keys and values.
adding and editing tags will now suggest tag keys and values based on your selection.
event viewer has new option for data fields to aggregate and show field distribution.
users can now edit status details directly from the endpoint editor.
tags have been added to alerts to allow for better organization.
generic triggers can now specify a form to provide an enhanced user interface.
generic events will now have proper auto-completion based on analyzing recent event history
endpoints now have button to view any associated storage (expand from the list).
users can now view events for multiple devices by selecting them and choosing View event history from the Bulk menu in the endpoint list view.
added support for new trigger custom filters missing-tag, has-status-detail, missing-status-detail, and has-endpoint.
svc-aws-dynamo-db 1.0.3
svc-aws-iot 1.0.2
svc-aws-kinesis 1.0.2
svc-azure-iot 1.3.22
svc-cdp-bics 1.0.0
svc-gcp-pubsub 1.0.22
svc-geofence 1.0.1
geofence.eval() to generate geofence events.svc-mongodb 1.0.2
svc-mqtt 1.1.16
svc-udp 1.2.0
udp.send() can now be used with endpoint keys instead of a remote IP (if endpoints are used).udp.queue() to queue a packet to be sent after the device sends its next communication.'' and will be derived from the endpoint.history.one() and history.search() for finding events from the event history.endpoint.update() setting params.mqtt-subscribe that fires when the client subscribes to a topic.mqtt-unsubscribe that fires when a client unsubscribes from a topic.mqtt.subscribe() to dynamically subscribe to a new topic.network.isIpInCidrs() to check if an IP address is within a network.network.splitHostPort() to split the host and port portion of an address.convert.mccmnc() to network.decodeMccMnc() (backwards compatible).trigger.waitReset() to reset the signal/wait sequence to avoid synchronization issues.date.now() function to return the current date, accepts a single argument with the timezone for the date.convert.imeisvToimei() function for converting IMEI formats.seconds before missing, trace mode, add tags, and remove tags from selected endpoints, or all endpoints matching a query.azure_blob.upload() and azure_blob.download() for interacting with blob storage.date.format() now aceptes a 3rd parameter with the target timezone.endpoint.update().Super-Admin section for platform administrators (private instance only)convert.binReader() to read arbitray binary buffers.
convert.bitReader() to read bit-packed structures like ASN.1 UPER encodings
api.post(), api.put(), api.delete(), and api.get() functions to allow calling APIs within the IoT Bridge to automate provisioning and configuration of the platformdatetime format for date.format() function to support SQL syntaxhash.crc32(), hash.crc64(), hash.crc64signed(), and hash.sha256() functions to allow for inline hash generation on input data.on-create, on-connect, and on-disconnect events do better expose the connection lifecycle of a devicelastKnown() data.  Now variables with a ~ will contain a timestamp when a resource was last updateddraft-ietf-tls-dtls-connection-id-05 connection ID supportMicrosoft SQL ServerMySQL, and PostgreSQLsql.execute() and sql.select() to interact with remote SQL databasessuper API for future use.trigger APIs to svc-trigger.me query.convert.* APIs.convert.protobufToObject() and convert.objectToProtobuf() for Protobuf transcoding.trigger APIs from core-api.fCnt field for the uplink counter to generic uplink event.translateIds field to event so events can filter for specific formatting.last known value to support translateIds.lwm2m-result for any async action that has a context supplied to it enabling closed loop processing of write and exec operations.s_remapped sub-document.json.patchCreate() and json.patchApply() functions for manipulating JSON-Patch objects, especially useful with Azure Digital Twins.random.int() and random.float() functions.lwm2m-error event, and replaced with lwm2m-result event that returns both successes and failures.lwm2m-result that will be generated on asynchronous calls to read, write, exec, create, and delete operations that have a context specified.  This is useful for getting guaranteed acknowledgement of an operation if it has been queued waiting for the device to become available.mqtt-publish that is generated when a device publishes to a topic.mqtt.publish() that can be used to publish to one or more devices.convert.binToStr() and convert.strToBin() functions.convert.delimitedStringToObject() function with support for arrays of fields.queue.get(), queue.put(), and queue.flush() functions for managing FIFO queues within triggers.trigger.wait() and trigger.signal() functions for synchronizing trigger execution.Object.assign() in javascript engine.exec.now() events to other accounts.convert.msgPackToObject() decoder.ArrayBuffer and DataView objects in javascript engine.set(), get(), update(), push(), and delete() functions.location.geolocate() function for wifi/cell based geolocation using UnwiredLabs.LORA Uplink and LORA Join events to trigger system.lora.downlink() function to schedule a downlink message to a device.lwm2m.lastKnown() to retrieve the last known values for all resources within a trigger.resetSearch to clear search indexes and re-index them.endpoint.updateTags() for dynamic updates to tags via triggers.string.delimitedStringToObject() for fast parsing of ASCII delimited payloads.has-tag, one-of, contains, !=, >, >=, <=, <write, writeMulti, exec, and create functions.convert.mccmnc() function that accepts numerical MCC/MNC codes and translates them into country/network operator strings for easy display.trigger.exit() function to immediately stop executing a trigger.trigger.reply() function to return data on bi-directional events that expect a response.azure_iot.twin_retrieve() to query and return the current device twin for an IoT device.The server certificate for the LWM2M server has been updated, please download the new self-signed certificate to authenticate our servers.
queclink.queue() for sending commands to Queclink devices on their next communication.library triggers that can be imported into other triggers to make it easier to manage common functions, global variables, and reduce the copy/pasting between triggers.Azure Maps and OpenCageData with support for reverse-geocoding.