From ca4fdd45f61ef8618abe66306c7058e8885ee788 Mon Sep 17 00:00:00 2001 From: The Things Bot <36884541+TheThingsBot@users.noreply.github.com> Date: Tue, 11 Feb 2025 16:03:20 +0100 Subject: [PATCH] Release 3.33.1 documentation (#1405) * docs: Release 3.33.1 * doc: Add featured section * doc: Fix `v3.33.0` `whats-new` * doc: Fix API messages --------- Co-authored-by: Aleksander Borowski --- doc/config/_default/config.toml | 2 +- .../api/reference/grpc/application_server.md | 2 + .../api/reference/grpc/network_server.md | 2 + .../api/reference/grpc/storage_integration.md | 2 + .../enterprise/aws/ecs/changelog/index.md | 6 +- .../ttn-lw-cli_applications_storage_get.md | 1 + .../ttn-lw-cli_end-devices_storage_get.md | 1 + .../ttn-lw-cli/ttn-lw-cli_tenants_create.md | 1 + .../ttn-lw-cli/ttn-lw-cli_users_create.md | 1 + .../ttn-lw-cli/ttn-lw-cli_users_get.md | 1 + .../ttn-lw-cli/ttn-lw-cli_users_list.md | 1 + .../ttn-lw-cli/ttn-lw-cli_users_search.md | 1 + .../ttn-lw-cli/ttn-lw-cli_users_set.md | 1 + doc/content/whats-new/3.33.0.md | 1 - doc/content/whats-new/3.33.1.md | 26 + .../messages/ApplicationUplink.yml | 8 + .../messages/LastBatteryPercentage.yml | 23 + doc/data/api/tts.swagger.json | 456 +++++++++++++++++- 18 files changed, 507 insertions(+), 29 deletions(-) create mode 100644 doc/content/whats-new/3.33.1.md create mode 100644 doc/data/api/ttn.lorawan.v3/messages/LastBatteryPercentage.yml diff --git a/doc/config/_default/config.toml b/doc/config/_default/config.toml index 52c995c12c..f5e7f9e938 100644 --- a/doc/config/_default/config.toml +++ b/doc/config/_default/config.toml @@ -23,7 +23,7 @@ pygmentsUseClasses = true github_repository = "https://github.com/TheThingsIndustries/lorawan-stack-docs" github_repository_edit = "https://github.com/TheThingsIndustries/lorawan-stack-docs/blob/master/doc/content" tts_github_repository = "https://github.com/TheThingsNetwork/lorawan-stack" - version = "3.33.0" + version = "3.33.1" [markup] [markup.goldmark] diff --git a/doc/content/api/reference/grpc/application_server.md b/doc/content/api/reference/grpc/application_server.md index 63ccb0e885..f8cf39b098 100644 --- a/doc/content/api/reference/grpc/application_server.md +++ b/doc/content/api/reference/grpc/application_server.md @@ -120,6 +120,8 @@ List of Application Server APIs. {{< proto/message message="KeyEnvelope" >}} +{{< proto/message message="LastBatteryPercentage" >}} + {{< proto/message message="Location" >}} {{< proto/message message="LoRaDataRate" >}} diff --git a/doc/content/api/reference/grpc/network_server.md b/doc/content/api/reference/grpc/network_server.md index 15e6cec5c8..9ad2580231 100644 --- a/doc/content/api/reference/grpc/network_server.md +++ b/doc/content/api/reference/grpc/network_server.md @@ -142,6 +142,8 @@ List of Network Server APIs. {{< proto/message message="KeyEnvelope" >}} +{{< proto/message message="LastBatteryPercentage" >}} + {{< proto/message message="Location" >}} {{< proto/message message="LoRaDataRate" >}} diff --git a/doc/content/api/reference/grpc/storage_integration.md b/doc/content/api/reference/grpc/storage_integration.md index 7cfc1d9926..b962753e83 100644 --- a/doc/content/api/reference/grpc/storage_integration.md +++ b/doc/content/api/reference/grpc/storage_integration.md @@ -63,6 +63,8 @@ List of Storage Integration APIs. {{< proto/message message="KeyEnvelope" >}} +{{< proto/message message="LastBatteryPercentage" >}} + {{< proto/message message="LoRaDataRate" >}} {{< proto/message message="Location" >}} diff --git a/doc/content/enterprise/aws/ecs/changelog/index.md b/doc/content/enterprise/aws/ecs/changelog/index.md index 2d5eb871ee..54c7a8d7c7 100644 --- a/doc/content/enterprise/aws/ecs/changelog/index.md +++ b/doc/content/enterprise/aws/ecs/changelog/index.md @@ -1,15 +1,15 @@ --- title: "Template Changelog" -aliases: - [/getting-started/aws/ecs/changelog, /the-things-stack/host/aws/ecs/changelog] +aliases: [/getting-started/aws/ecs/changelog] --- - # Upgrading All meaningful changes to templates are documented in this file. ## Unreleased +## 3.33.1 + ## 3.33.0 ## 3.32.3 diff --git a/doc/content/ttn-lw-cli/ttn-lw-cli_applications_storage_get.md b/doc/content/ttn-lw-cli/ttn-lw-cli_applications_storage_get.md index 4ed2025d37..3e688d7411 100644 --- a/doc/content/ttn-lw-cli/ttn-lw-cli_applications_storage_get.md +++ b/doc/content/ttn-lw-cli/ttn-lw-cli_applications_storage_get.md @@ -157,6 +157,7 @@ ttn-lw-cli applications storage get [application-id] [flags] --up.uplink-message.f-port select the up.uplink_message.f_port field --up.uplink-message.frm-payload select the up.uplink_message.frm_payload field --up.uplink-message.last-a-f-cnt-down select the up.uplink_message.last_a_f_cnt_down field + --up.uplink-message.last-battery-percentage select the up.uplink_message.last_battery_percentage field and all allowed sub-fields --up.uplink-message.locations select the up.uplink_message.locations field --up.uplink-message.network-ids select the up.uplink_message.network_ids field and all allowed sub-fields --up.uplink-message.network-ids.cluster-address select the up.uplink_message.network_ids.cluster_address field diff --git a/doc/content/ttn-lw-cli/ttn-lw-cli_end-devices_storage_get.md b/doc/content/ttn-lw-cli/ttn-lw-cli_end-devices_storage_get.md index 62ddacd820..b426223c06 100644 --- a/doc/content/ttn-lw-cli/ttn-lw-cli_end-devices_storage_get.md +++ b/doc/content/ttn-lw-cli/ttn-lw-cli_end-devices_storage_get.md @@ -160,6 +160,7 @@ ttn-lw-cli end-devices storage get [application-id] [device-id] [flags] --up.uplink-message.f-port select the up.uplink_message.f_port field --up.uplink-message.frm-payload select the up.uplink_message.frm_payload field --up.uplink-message.last-a-f-cnt-down select the up.uplink_message.last_a_f_cnt_down field + --up.uplink-message.last-battery-percentage select the up.uplink_message.last_battery_percentage field and all allowed sub-fields --up.uplink-message.locations select the up.uplink_message.locations field --up.uplink-message.network-ids select the up.uplink_message.network_ids field and all allowed sub-fields --up.uplink-message.network-ids.cluster-address select the up.uplink_message.network_ids.cluster_address field diff --git a/doc/content/ttn-lw-cli/ttn-lw-cli_tenants_create.md b/doc/content/ttn-lw-cli/ttn-lw-cli_tenants_create.md index c957aba77f..3b30db1558 100644 --- a/doc/content/ttn-lw-cli/ttn-lw-cli_tenants_create.md +++ b/doc/content/ttn-lw-cli/ttn-lw-cli_tenants_create.md @@ -65,6 +65,7 @@ ttn-lw-cli tenants create [tenant-id] [flags] --initial-user.attributes stringToString --initial-user.client-limit uint --initial-user.console-preferences.console-theme string allowed values: CONSOLE_THEME_SYSTEM, CONSOLE_THEME_LIGHT, CONSOLE_THEME_DARK + --initial-user.console-preferences.tutorials.seen strings allowed values: TUTORIAL_UNKNOWN, TUTORIAL_LIVE_DATA_SPLIT_VIEW --initial-user.description string --initial-user.gateway-limit uint --initial-user.ids.user-id string diff --git a/doc/content/ttn-lw-cli/ttn-lw-cli_users_create.md b/doc/content/ttn-lw-cli/ttn-lw-cli_users_create.md index 7ed691d4f9..4348515037 100644 --- a/doc/content/ttn-lw-cli/ttn-lw-cli_users_create.md +++ b/doc/content/ttn-lw-cli/ttn-lw-cli_users_create.md @@ -19,6 +19,7 @@ ttn-lw-cli users create [user-id] [flags] --attributes stringToString --client-limit uint --console-preferences.console-theme string allowed values: CONSOLE_THEME_SYSTEM, CONSOLE_THEME_LIGHT, CONSOLE_THEME_DARK + --console-preferences.tutorials.seen strings allowed values: TUTORIAL_UNKNOWN, TUTORIAL_LIVE_DATA_SPLIT_VIEW --description string --gateway-limit uint -h, --help help for create diff --git a/doc/content/ttn-lw-cli/ttn-lw-cli_users_get.md b/doc/content/ttn-lw-cli/ttn-lw-cli_users_get.md index 3a415d1db3..2b0941b1fa 100644 --- a/doc/content/ttn-lw-cli/ttn-lw-cli_users_get.md +++ b/doc/content/ttn-lw-cli/ttn-lw-cli_users_get.md @@ -24,6 +24,7 @@ ttn-lw-cli users get [user-id] [flags] --console-preferences.dashboard-layouts select the console_preferences.dashboard_layouts field and all allowed sub-fields --console-preferences.sort-by select the console_preferences.sort_by field and all allowed sub-fields --console-preferences.tutorials select the console_preferences.tutorials field and all allowed sub-fields + --console-preferences.tutorials.seen select the console_preferences.tutorials.seen field --contact-info select the contact_info field --deleted-at select the deleted_at field --description select the description field diff --git a/doc/content/ttn-lw-cli/ttn-lw-cli_users_list.md b/doc/content/ttn-lw-cli/ttn-lw-cli_users_list.md index a232ad89fb..369bfcf07e 100644 --- a/doc/content/ttn-lw-cli/ttn-lw-cli_users_list.md +++ b/doc/content/ttn-lw-cli/ttn-lw-cli_users_list.md @@ -24,6 +24,7 @@ ttn-lw-cli users list [flags] --console-preferences.dashboard-layouts select the console_preferences.dashboard_layouts field and all allowed sub-fields --console-preferences.sort-by select the console_preferences.sort_by field and all allowed sub-fields --console-preferences.tutorials select the console_preferences.tutorials field and all allowed sub-fields + --console-preferences.tutorials.seen select the console_preferences.tutorials.seen field --contact-info select the contact_info field --deleted --deleted-at select the deleted_at field diff --git a/doc/content/ttn-lw-cli/ttn-lw-cli_users_search.md b/doc/content/ttn-lw-cli/ttn-lw-cli_users_search.md index b5ec8ef9f0..31b0836a1b 100644 --- a/doc/content/ttn-lw-cli/ttn-lw-cli_users_search.md +++ b/doc/content/ttn-lw-cli/ttn-lw-cli_users_search.md @@ -25,6 +25,7 @@ ttn-lw-cli users search [flags] --console-preferences.dashboard-layouts select the console_preferences.dashboard_layouts field and all allowed sub-fields --console-preferences.sort-by select the console_preferences.sort_by field and all allowed sub-fields --console-preferences.tutorials select the console_preferences.tutorials field and all allowed sub-fields + --console-preferences.tutorials.seen select the console_preferences.tutorials.seen field --contact-info select the contact_info field --deleted --deleted-at select the deleted_at field diff --git a/doc/content/ttn-lw-cli/ttn-lw-cli_users_set.md b/doc/content/ttn-lw-cli/ttn-lw-cli_users_set.md index e21db69f24..0f9d8fc1d5 100644 --- a/doc/content/ttn-lw-cli/ttn-lw-cli_users_set.md +++ b/doc/content/ttn-lw-cli/ttn-lw-cli_users_set.md @@ -19,6 +19,7 @@ ttn-lw-cli users set [user-id] [flags] --attributes stringToString --client-limit uint --console-preferences.console-theme string allowed values: CONSOLE_THEME_SYSTEM, CONSOLE_THEME_LIGHT, CONSOLE_THEME_DARK + --console-preferences.tutorials.seen strings allowed values: TUTORIAL_UNKNOWN, TUTORIAL_LIVE_DATA_SPLIT_VIEW --description string --gateway-limit uint -h, --help help for set diff --git a/doc/content/whats-new/3.33.0.md b/doc/content/whats-new/3.33.0.md index 16d4226ab9..1605d34d24 100644 --- a/doc/content/whats-new/3.33.0.md +++ b/doc/content/whats-new/3.33.0.md @@ -42,7 +42,6 @@ featured: ### Fixed - Subscription nudge not showing correct device count in the Console. -- Enforce default page limit on AS and NS List RPCs if a value is not provided in the request. - Fix OAuth client authorizations delete request in the Console. - Consecutive disconnect/reconnect messages in the Live Data view in the Console. - Set retention policy for `application_webhook_failure` table in the Network Operation Center's store. diff --git a/doc/content/whats-new/3.33.1.md b/doc/content/whats-new/3.33.1.md new file mode 100644 index 0000000000..88d61718e0 --- /dev/null +++ b/doc/content/whats-new/3.33.1.md @@ -0,0 +1,26 @@ +--- +date: 2025-02-10T15:41:53Z +title: "3.33.1" +featured: + { + added: + [ + "Add recvTime field to the decodeUplink input in payload formatters", + "Add the latest battery percentage of the end device in the `ApplicationUplink` message.", + "Add live data split view tutorial to the Console.", + ], + } +--- + +### Added + +- Add recvTime field to the decodeUplink input in payload formatters +- Add the latest battery percentage of the end device in the `ApplicationUplink` message. +- Add live data split view tutorial to the Console. + +### Fixed + +- Enforce default page limit on AS and NS List RPCs if a value is not provided in the request. +- Swapped field order in `RelayNotifyNewEndDeviceReq` MAC command. +- `LinkADRAns` MAC command verification when the end device does not support ADR. +- Being able to remove all attributes in general settings. diff --git a/doc/data/api/ttn.lorawan.v3/messages/ApplicationUplink.yml b/doc/data/api/ttn.lorawan.v3/messages/ApplicationUplink.yml index e41e65ee4a..97467b5a4a 100644 --- a/doc/data/api/ttn.lorawan.v3/messages/ApplicationUplink.yml +++ b/doc/data/api/ttn.lorawan.v3/messages/ApplicationUplink.yml @@ -129,3 +129,11 @@ fields: message: name: NetworkIdentifiers default: {} +- name: last_battery_percentage + comment: |- + Last battery percentage of the end device. + Received via the DevStatus MAC command at last_dev_status_received_at or earlier. + Set by the Network Server while handling the message. + message: + name: LastBatteryPercentage + default: {} diff --git a/doc/data/api/ttn.lorawan.v3/messages/LastBatteryPercentage.yml b/doc/data/api/ttn.lorawan.v3/messages/LastBatteryPercentage.yml new file mode 100644 index 0000000000..4a3dd6b84a --- /dev/null +++ b/doc/data/api/ttn.lorawan.v3/messages/LastBatteryPercentage.yml @@ -0,0 +1,23 @@ +name: LastBatteryPercentage +fields: +- name: f_cnt + comment: Frame counter value of last uplink containing DevStatusAns. + type: uint32 + default: 0 +- name: value + comment: |- + The battery percentage of the end device. + The value is defined in the [0, 100] interval. + message: + package: google.protobuf + name: FloatValue + rules: + lte: 100 + gte: 0 + default: null +- name: received_at + comment: Time when last DevStatus MAC command was received. + message: + package: google.protobuf + name: Timestamp + default: "0001-01-01T00:00:00Z" diff --git a/doc/data/api/tts.swagger.json b/doc/data/api/tts.swagger.json index ffa9968073..0d3083ad62 100644 --- a/doc/data/api/tts.swagger.json +++ b/doc/data/api/tts.swagger.json @@ -8,7 +8,7 @@ "swagger": "2.0", "info": { "title": "The Things Stack for LoRaWAN® OpenAPI 2.0 Reference", - "version": "3.33.0" + "version": "3.33.1" }, "paths": { "/alerts/notifications/profiles": { @@ -105158,6 +105158,26 @@ "type": "integer", "format": "int64" }, + "last_battery_percentage": { + "type": "object", + "properties": { + "f_cnt": { + "description": "Frame counter value of last uplink containing DevStatusAns.", + "type": "integer", + "format": "int64" + }, + "received_at": { + "description": "Time when last DevStatus MAC command was received.", + "type": "string", + "format": "date-time" + }, + "value": { + "description": "The battery percentage of the end device.\nThe value is defined in the [0, 100] interval.", + "type": "number", + "format": "float" + } + } + }, "locations": { "description": "End device location metadata, set by the Application Server while handling the message.", "type": "object", @@ -170513,6 +170533,26 @@ "type": "integer", "format": "int64" }, + "last_battery_percentage": { + "type": "object", + "properties": { + "f_cnt": { + "description": "Frame counter value of last uplink containing DevStatusAns.", + "type": "integer", + "format": "int64" + }, + "received_at": { + "description": "Time when last DevStatus MAC command was received.", + "type": "string", + "format": "date-time" + }, + "value": { + "description": "The battery percentage of the end device.\nThe value is defined in the [0, 100] interval.", + "type": "number", + "format": "float" + } + } + }, "locations": { "description": "End device location metadata, set by the Application Server while handling the message.", "type": "object", @@ -171801,6 +171841,26 @@ "type": "integer", "format": "int64" }, + "last_battery_percentage": { + "type": "object", + "properties": { + "f_cnt": { + "description": "Frame counter value of last uplink containing DevStatusAns.", + "type": "integer", + "format": "int64" + }, + "received_at": { + "description": "Time when last DevStatus MAC command was received.", + "type": "string", + "format": "date-time" + }, + "value": { + "description": "The battery percentage of the end device.\nThe value is defined in the [0, 100] interval.", + "type": "number", + "format": "float" + } + } + }, "locations": { "description": "End device location metadata, set by the Application Server while handling the message.", "type": "object", @@ -172383,6 +172443,26 @@ "type": "integer", "format": "int64" }, + "last_battery_percentage": { + "type": "object", + "properties": { + "f_cnt": { + "description": "Frame counter value of last uplink containing DevStatusAns.", + "type": "integer", + "format": "int64" + }, + "received_at": { + "description": "Time when last DevStatus MAC command was received.", + "type": "string", + "format": "date-time" + }, + "value": { + "description": "The battery percentage of the end device.\nThe value is defined in the [0, 100] interval.", + "type": "number", + "format": "float" + } + } + }, "locations": { "description": "End device location metadata, set by the Application Server while handling the message.", "type": "object", @@ -173955,6 +174035,26 @@ "type": "integer", "format": "int64" }, + "last_battery_percentage": { + "type": "object", + "properties": { + "f_cnt": { + "description": "Frame counter value of last uplink containing DevStatusAns.", + "type": "integer", + "format": "int64" + }, + "received_at": { + "description": "Time when last DevStatus MAC command was received.", + "type": "string", + "format": "date-time" + }, + "value": { + "description": "The battery percentage of the end device.\nThe value is defined in the [0, 100] interval.", + "type": "number", + "format": "float" + } + } + }, "locations": { "description": "End device location metadata, set by the Application Server while handling the message.", "type": "object", @@ -178984,7 +179084,54 @@ "format": "date-time" }, "last_failed_attempt_details": { - "$ref": "#/definitions/v3ErrorDetails" + "description": "Error details that are communicated over gRPC (and HTTP) APIs.\nThe messages (for translation) are stored as \"error:\u003cnamespace\u003e:\u003cname\u003e\".", + "type": "object", + "properties": { + "attributes": { + "description": "Attributes that should be filled into the message format. Any extra attributes\ncan be displayed as error details.", + "type": "object" + }, + "cause": { + "description": "The error that caused this error.", + "$ref": "#/definitions/v3ErrorDetails" + }, + "code": { + "description": "The status code of the error.", + "type": "integer", + "format": "int64" + }, + "correlation_id": { + "description": "The correlation ID of the error can be used to correlate the error to stack\ntraces the network may (or may not) store about recent errors.", + "type": "string" + }, + "details": { + "description": "The details of the error.", + "type": "array", + "items": { + "description": "`Any` contains an arbitrary serialized protocol buffer message along with a\nURL that describes the type of the serialized message.\n\nProtobuf library provides support to pack/unpack Any values in the form\nof utility functions or additional generated methods of the Any type.\n\nExample 1: Pack and unpack a message in C++.\n\n Foo foo = ...;\n Any any;\n any.PackFrom(foo);\n ...\n if (any.UnpackTo(\u0026foo)) {\n ...\n }\n\nExample 2: Pack and unpack a message in Java.\n\n Foo foo = ...;\n Any any = Any.pack(foo);\n ...\n if (any.is(Foo.class)) {\n foo = any.unpack(Foo.class);\n }\n // or ...\n if (any.isSameTypeAs(Foo.getDefaultInstance())) {\n foo = any.unpack(Foo.getDefaultInstance());\n }\n\n Example 3: Pack and unpack a message in Python.\n\n foo = Foo(...)\n any = Any()\n any.Pack(foo)\n ...\n if any.Is(Foo.DESCRIPTOR):\n any.Unpack(foo)\n ...\n\n Example 4: Pack and unpack a message in Go\n\n foo := \u0026pb.Foo{...}\n any, err := anypb.New(foo)\n if err != nil {\n ...\n }\n ...\n foo := \u0026pb.Foo{}\n if err := any.UnmarshalTo(foo); err != nil {\n ...\n }\n\nThe pack methods provided by protobuf library will by default use\n'type.googleapis.com/full.type.name' as the type URL and the unpack\nmethods only use the fully qualified type name after the last '/'\nin the type URL, for example \"foo.bar.com/x/y.z\" will yield type\nname \"y.z\".\n\nJSON\n====\nThe JSON representation of an `Any` value uses the regular\nrepresentation of the deserialized, embedded message, with an\nadditional field `@type` which contains the type URL. Example:\n\n package google.profile;\n message Person {\n string first_name = 1;\n string last_name = 2;\n }\n\n {\n \"@type\": \"type.googleapis.com/google.profile.Person\",\n \"firstName\": \u003cstring\u003e,\n \"lastName\": \u003cstring\u003e\n }\n\nIf the embedded message type is well-known and has a custom JSON\nrepresentation, that representation will be embedded adding a field\n`value` which holds the custom JSON in addition to the `@type`\nfield. Example (for message [google.protobuf.Duration][]):\n\n {\n \"@type\": \"type.googleapis.com/google.protobuf.Duration\",\n \"value\": \"1.212s\"\n }", + "type": "object", + "properties": { + "@type": { + "description": "A URL/resource name that uniquely identifies the type of the serialized\nprotocol buffer message. This string must contain at least\none \"/\" character. The last segment of the URL's path must represent\nthe fully qualified name of the type (as in\n`path/google.protobuf.Duration`). The name should be in a canonical form\n(e.g., leading \".\" is not accepted).\n\nIn practice, teams usually precompile into the binary all types that they\nexpect it to use in the context of Any. However, for URLs which use the\nscheme `http`, `https`, or no scheme, one can optionally set up a type\nserver that maps type URLs to message definitions as follows:\n\n* If no scheme is provided, `https` is assumed.\n* An HTTP GET on the URL must yield a [google.protobuf.Type][]\n value in binary format, or produce an error.\n* Applications are allowed to cache lookup results based on the\n URL, or have them precompiled into a binary to avoid any\n lookup. Therefore, binary compatibility needs to be preserved\n on changes to types. (Use versioned type names to manage\n breaking changes.)\n\nNote: this functionality is not currently available in the official\nprotobuf release, and it is not used for type URLs beginning with\ntype.googleapis.com. As of May 2023, there are no widely used type server\nimplementations and no plans to implement one.\n\nSchemes other than `http`, `https` (or the empty scheme) might be\nused with implementation specific semantics.", + "type": "string" + } + }, + "additionalProperties": {} + } + }, + "message_format": { + "description": "The default (fallback) message format that should be used for the error.\nThis is also used if the client does not have a translation for the error.", + "type": "string" + }, + "name": { + "description": "Name of the error.", + "type": "string" + }, + "namespace": { + "description": "Namespace of the error (typically the package name in The Things Stack).", + "type": "string" + } + } } } } @@ -179497,7 +179644,54 @@ "format": "date-time" }, "last_failed_attempt_details": { - "$ref": "#/definitions/v3ErrorDetails" + "description": "Error details that are communicated over gRPC (and HTTP) APIs.\nThe messages (for translation) are stored as \"error:\u003cnamespace\u003e:\u003cname\u003e\".", + "type": "object", + "properties": { + "attributes": { + "description": "Attributes that should be filled into the message format. Any extra attributes\ncan be displayed as error details.", + "type": "object" + }, + "cause": { + "description": "The error that caused this error.", + "$ref": "#/definitions/v3ErrorDetails" + }, + "code": { + "description": "The status code of the error.", + "type": "integer", + "format": "int64" + }, + "correlation_id": { + "description": "The correlation ID of the error can be used to correlate the error to stack\ntraces the network may (or may not) store about recent errors.", + "type": "string" + }, + "details": { + "description": "The details of the error.", + "type": "array", + "items": { + "description": "`Any` contains an arbitrary serialized protocol buffer message along with a\nURL that describes the type of the serialized message.\n\nProtobuf library provides support to pack/unpack Any values in the form\nof utility functions or additional generated methods of the Any type.\n\nExample 1: Pack and unpack a message in C++.\n\n Foo foo = ...;\n Any any;\n any.PackFrom(foo);\n ...\n if (any.UnpackTo(\u0026foo)) {\n ...\n }\n\nExample 2: Pack and unpack a message in Java.\n\n Foo foo = ...;\n Any any = Any.pack(foo);\n ...\n if (any.is(Foo.class)) {\n foo = any.unpack(Foo.class);\n }\n // or ...\n if (any.isSameTypeAs(Foo.getDefaultInstance())) {\n foo = any.unpack(Foo.getDefaultInstance());\n }\n\n Example 3: Pack and unpack a message in Python.\n\n foo = Foo(...)\n any = Any()\n any.Pack(foo)\n ...\n if any.Is(Foo.DESCRIPTOR):\n any.Unpack(foo)\n ...\n\n Example 4: Pack and unpack a message in Go\n\n foo := \u0026pb.Foo{...}\n any, err := anypb.New(foo)\n if err != nil {\n ...\n }\n ...\n foo := \u0026pb.Foo{}\n if err := any.UnmarshalTo(foo); err != nil {\n ...\n }\n\nThe pack methods provided by protobuf library will by default use\n'type.googleapis.com/full.type.name' as the type URL and the unpack\nmethods only use the fully qualified type name after the last '/'\nin the type URL, for example \"foo.bar.com/x/y.z\" will yield type\nname \"y.z\".\n\nJSON\n====\nThe JSON representation of an `Any` value uses the regular\nrepresentation of the deserialized, embedded message, with an\nadditional field `@type` which contains the type URL. Example:\n\n package google.profile;\n message Person {\n string first_name = 1;\n string last_name = 2;\n }\n\n {\n \"@type\": \"type.googleapis.com/google.profile.Person\",\n \"firstName\": \u003cstring\u003e,\n \"lastName\": \u003cstring\u003e\n }\n\nIf the embedded message type is well-known and has a custom JSON\nrepresentation, that representation will be embedded adding a field\n`value` which holds the custom JSON in addition to the `@type`\nfield. Example (for message [google.protobuf.Duration][]):\n\n {\n \"@type\": \"type.googleapis.com/google.protobuf.Duration\",\n \"value\": \"1.212s\"\n }", + "type": "object", + "properties": { + "@type": { + "description": "A URL/resource name that uniquely identifies the type of the serialized\nprotocol buffer message. This string must contain at least\none \"/\" character. The last segment of the URL's path must represent\nthe fully qualified name of the type (as in\n`path/google.protobuf.Duration`). The name should be in a canonical form\n(e.g., leading \".\" is not accepted).\n\nIn practice, teams usually precompile into the binary all types that they\nexpect it to use in the context of Any. However, for URLs which use the\nscheme `http`, `https`, or no scheme, one can optionally set up a type\nserver that maps type URLs to message definitions as follows:\n\n* If no scheme is provided, `https` is assumed.\n* An HTTP GET on the URL must yield a [google.protobuf.Type][]\n value in binary format, or produce an error.\n* Applications are allowed to cache lookup results based on the\n URL, or have them precompiled into a binary to avoid any\n lookup. Therefore, binary compatibility needs to be preserved\n on changes to types. (Use versioned type names to manage\n breaking changes.)\n\nNote: this functionality is not currently available in the official\nprotobuf release, and it is not used for type URLs beginning with\ntype.googleapis.com. As of May 2023, there are no widely used type server\nimplementations and no plans to implement one.\n\nSchemes other than `http`, `https` (or the empty scheme) might be\nused with implementation specific semantics.", + "type": "string" + } + }, + "additionalProperties": {} + } + }, + "message_format": { + "description": "The default (fallback) message format that should be used for the error.\nThis is also used if the client does not have a translation for the error.", + "type": "string" + }, + "name": { + "description": "Name of the error.", + "type": "string" + }, + "namespace": { + "description": "Namespace of the error (typically the package name in The Things Stack).", + "type": "string" + } + } } } } @@ -253988,7 +254182,7 @@ } } }, - "/hardware/gateways": { + "/gateways": { "get": { "description": "If no user or organization is given, this returns the gateways the caller\nhas access to.\nSimilar to Get, this selects the fields given by the field mask.\nMore or less fields may be returned, depending on the rights of the caller.", "tags": [ @@ -254468,7 +254662,7 @@ } } }, - "/hardware/gateways/batch": { + "/gateways/batch": { "delete": { "description": "This operation is atomic; either all gateways are deleted or none.\nThe caller must have delete rights on all requested gateways.", "tags": [ @@ -254515,7 +254709,7 @@ } } }, - "/hardware/gateways/filter": { + "/gateways/filter": { "post": { "description": "If no user or organization is given, this returns the gateways the caller\nhas access to.\nSimilar to Get, this selects the fields given by the field mask.\nMore or less fields may be returned, depending on the rights of the caller.", "tags": [ @@ -255018,7 +255212,7 @@ } } }, - "/hardware/gateways/rights/batch": { + "/gateways/rights/batch": { "get": { "description": "The check is successful if there are no errors.", "tags": [ @@ -255171,7 +255365,7 @@ } } }, - "/hardware/gateways/{gateway.ids.gateway_id}": { + "/gateways/{gateway.ids.gateway_id}": { "put": { "tags": [ "GatewayRegistry" @@ -255987,7 +256181,7 @@ } } }, - "/hardware/gateways/{gateway_ids.gateway_id}": { + "/gateways/{gateway_ids.gateway_id}": { "get": { "description": "More or less fields may be returned, depending on the rights of the caller.", "tags": [ @@ -256428,7 +256622,7 @@ } } }, - "/hardware/gateways/{gateway_ids.gateway_id}/api-keys": { + "/gateways/{gateway_ids.gateway_id}/api-keys": { "get": { "tags": [ "GatewayAccess" @@ -256957,7 +257151,7 @@ } } }, - "/hardware/gateways/{gateway_ids.gateway_id}/api-keys/{api_key.id}": { + "/gateways/{gateway_ids.gateway_id}/api-keys/{api_key.id}": { "put": { "description": "This method can also be used to delete the API key, by giving it no rights.\nThe caller is required to have all assigned or/and removed rights.", "tags": [ @@ -257301,7 +257495,7 @@ } } }, - "/hardware/gateways/{gateway_ids.gateway_id}/api-keys/{key_id}": { + "/gateways/{gateway_ids.gateway_id}/api-keys/{key_id}": { "get": { "tags": [ "GatewayAccess" @@ -257563,7 +257757,7 @@ } } }, - "/hardware/gateways/{gateway_ids.gateway_id}/collaborator/organization/{collaborator.organization_ids.organization_id}": { + "/gateways/{gateway_ids.gateway_id}/collaborator/organization/{collaborator.organization_ids.organization_id}": { "get": { "description": "Pseudo-rights in the response (such as the \"_ALL\" right) are not expanded.", "tags": [ @@ -257776,7 +257970,7 @@ } } }, - "/hardware/gateways/{gateway_ids.gateway_id}/collaborator/user/{collaborator.user_ids.user_id}": { + "/gateways/{gateway_ids.gateway_id}/collaborator/user/{collaborator.user_ids.user_id}": { "get": { "description": "Pseudo-rights in the response (such as the \"_ALL\" right) are not expanded.", "tags": [ @@ -257989,7 +258183,7 @@ } } }, - "/hardware/gateways/{gateway_ids.gateway_id}/collaborators": { + "/gateways/{gateway_ids.gateway_id}/collaborators": { "get": { "tags": [ "GatewayAccess" @@ -258419,7 +258613,7 @@ } } }, - "/hardware/gateways/{gateway_ids.gateway_id}/collaborators/organization/{collaborator_ids.organization_ids.organization_id}": { + "/gateways/{gateway_ids.gateway_id}/collaborators/organization/{collaborator_ids.organization_ids.organization_id}": { "delete": { "tags": [ "GatewayAccess" @@ -258499,7 +258693,7 @@ } } }, - "/hardware/gateways/{gateway_ids.gateway_id}/collaborators/search": { + "/gateways/{gateway_ids.gateway_id}/collaborators/search": { "get": { "tags": [ "EntityRegistrySearch" @@ -258624,7 +258818,7 @@ } } }, - "/hardware/gateways/{gateway_ids.gateway_id}/collaborators/user/{collaborator_ids.user_ids.user_id}": { + "/gateways/{gateway_ids.gateway_id}/collaborators/user/{collaborator_ids.user_ids.user_id}": { "delete": { "tags": [ "GatewayAccess" @@ -258704,7 +258898,7 @@ } } }, - "/hardware/gateways/{gateway_id}": { + "/gateways/{gateway_id}": { "delete": { "description": "This may not release the gateway ID for reuse, but it does release the EUI.", "tags": [ @@ -258766,7 +258960,7 @@ } } }, - "/hardware/gateways/{gateway_id}/purge": { + "/gateways/{gateway_id}/purge": { "delete": { "description": "This will release both gateway ID and EUI for reuse.\nThe gateway owner is responsible for clearing data from any (external) integrations\nthat may store and expose data by gateway ID.", "tags": [ @@ -258828,7 +259022,7 @@ } } }, - "/hardware/gateways/{gateway_id}/restore": { + "/gateways/{gateway_id}/restore": { "post": { "description": "This does not restore the EUI,\nas that was released when deleting the gateway.", "tags": [ @@ -258890,7 +259084,7 @@ } } }, - "/hardware/gateways/{gateway_id}/rights": { + "/gateways/{gateway_id}/rights": { "get": { "tags": [ "GatewayAccess" @@ -510210,6 +510404,26 @@ "type": "integer", "format": "int64" }, + "last_battery_percentage": { + "type": "object", + "properties": { + "f_cnt": { + "description": "Frame counter value of last uplink containing DevStatusAns.", + "type": "integer", + "format": "int64" + }, + "received_at": { + "description": "Time when last DevStatus MAC command was received.", + "type": "string", + "format": "date-time" + }, + "value": { + "description": "The battery percentage of the end device.\nThe value is defined in the [0, 100] interval.", + "type": "number", + "format": "float" + } + } + }, "locations": { "description": "End device location metadata, set by the Application Server while handling the message.", "type": "object", @@ -511924,6 +512138,26 @@ "type": "integer", "format": "int64" }, + "last_battery_percentage": { + "type": "object", + "properties": { + "f_cnt": { + "description": "Frame counter value of last uplink containing DevStatusAns.", + "type": "integer", + "format": "int64" + }, + "received_at": { + "description": "Time when last DevStatus MAC command was received.", + "type": "string", + "format": "date-time" + }, + "value": { + "description": "The battery percentage of the end device.\nThe value is defined in the [0, 100] interval.", + "type": "number", + "format": "float" + } + } + }, "locations": { "description": "End device location metadata, set by the Application Server while handling the message.", "type": "object", @@ -529373,6 +529607,26 @@ "type": "integer", "format": "int64" }, + "last_battery_percentage": { + "type": "object", + "properties": { + "f_cnt": { + "description": "Frame counter value of last uplink containing DevStatusAns.", + "type": "integer", + "format": "int64" + }, + "received_at": { + "description": "Time when last DevStatus MAC command was received.", + "type": "string", + "format": "date-time" + }, + "value": { + "description": "The battery percentage of the end device.\nThe value is defined in the [0, 100] interval.", + "type": "number", + "format": "float" + } + } + }, "locations": { "description": "End device location metadata, set by the Application Server while handling the message.", "type": "object", @@ -530434,6 +530688,26 @@ "type": "integer", "format": "int64" }, + "last_battery_percentage": { + "type": "object", + "properties": { + "f_cnt": { + "description": "Frame counter value of last uplink containing DevStatusAns.", + "type": "integer", + "format": "int64" + }, + "received_at": { + "description": "Time when last DevStatus MAC command was received.", + "type": "string", + "format": "date-time" + }, + "value": { + "description": "The battery percentage of the end device.\nThe value is defined in the [0, 100] interval.", + "type": "number", + "format": "float" + } + } + }, "locations": { "description": "End device location metadata, set by the Application Server while handling the message.", "type": "object", @@ -531793,7 +532067,54 @@ "format": "date-time" }, "last_failed_attempt_details": { - "$ref": "#/definitions/v3ErrorDetails" + "description": "Error details that are communicated over gRPC (and HTTP) APIs.\nThe messages (for translation) are stored as \"error:\u003cnamespace\u003e:\u003cname\u003e\".", + "type": "object", + "properties": { + "attributes": { + "description": "Attributes that should be filled into the message format. Any extra attributes\ncan be displayed as error details.", + "type": "object" + }, + "cause": { + "description": "The error that caused this error.", + "$ref": "#/definitions/v3ErrorDetails" + }, + "code": { + "description": "The status code of the error.", + "type": "integer", + "format": "int64" + }, + "correlation_id": { + "description": "The correlation ID of the error can be used to correlate the error to stack\ntraces the network may (or may not) store about recent errors.", + "type": "string" + }, + "details": { + "description": "The details of the error.", + "type": "array", + "items": { + "description": "`Any` contains an arbitrary serialized protocol buffer message along with a\nURL that describes the type of the serialized message.\n\nProtobuf library provides support to pack/unpack Any values in the form\nof utility functions or additional generated methods of the Any type.\n\nExample 1: Pack and unpack a message in C++.\n\n Foo foo = ...;\n Any any;\n any.PackFrom(foo);\n ...\n if (any.UnpackTo(\u0026foo)) {\n ...\n }\n\nExample 2: Pack and unpack a message in Java.\n\n Foo foo = ...;\n Any any = Any.pack(foo);\n ...\n if (any.is(Foo.class)) {\n foo = any.unpack(Foo.class);\n }\n // or ...\n if (any.isSameTypeAs(Foo.getDefaultInstance())) {\n foo = any.unpack(Foo.getDefaultInstance());\n }\n\n Example 3: Pack and unpack a message in Python.\n\n foo = Foo(...)\n any = Any()\n any.Pack(foo)\n ...\n if any.Is(Foo.DESCRIPTOR):\n any.Unpack(foo)\n ...\n\n Example 4: Pack and unpack a message in Go\n\n foo := \u0026pb.Foo{...}\n any, err := anypb.New(foo)\n if err != nil {\n ...\n }\n ...\n foo := \u0026pb.Foo{}\n if err := any.UnmarshalTo(foo); err != nil {\n ...\n }\n\nThe pack methods provided by protobuf library will by default use\n'type.googleapis.com/full.type.name' as the type URL and the unpack\nmethods only use the fully qualified type name after the last '/'\nin the type URL, for example \"foo.bar.com/x/y.z\" will yield type\nname \"y.z\".\n\nJSON\n====\nThe JSON representation of an `Any` value uses the regular\nrepresentation of the deserialized, embedded message, with an\nadditional field `@type` which contains the type URL. Example:\n\n package google.profile;\n message Person {\n string first_name = 1;\n string last_name = 2;\n }\n\n {\n \"@type\": \"type.googleapis.com/google.profile.Person\",\n \"firstName\": \u003cstring\u003e,\n \"lastName\": \u003cstring\u003e\n }\n\nIf the embedded message type is well-known and has a custom JSON\nrepresentation, that representation will be embedded adding a field\n`value` which holds the custom JSON in addition to the `@type`\nfield. Example (for message [google.protobuf.Duration][]):\n\n {\n \"@type\": \"type.googleapis.com/google.protobuf.Duration\",\n \"value\": \"1.212s\"\n }", + "type": "object", + "properties": { + "@type": { + "description": "A URL/resource name that uniquely identifies the type of the serialized\nprotocol buffer message. This string must contain at least\none \"/\" character. The last segment of the URL's path must represent\nthe fully qualified name of the type (as in\n`path/google.protobuf.Duration`). The name should be in a canonical form\n(e.g., leading \".\" is not accepted).\n\nIn practice, teams usually precompile into the binary all types that they\nexpect it to use in the context of Any. However, for URLs which use the\nscheme `http`, `https`, or no scheme, one can optionally set up a type\nserver that maps type URLs to message definitions as follows:\n\n* If no scheme is provided, `https` is assumed.\n* An HTTP GET on the URL must yield a [google.protobuf.Type][]\n value in binary format, or produce an error.\n* Applications are allowed to cache lookup results based on the\n URL, or have them precompiled into a binary to avoid any\n lookup. Therefore, binary compatibility needs to be preserved\n on changes to types. (Use versioned type names to manage\n breaking changes.)\n\nNote: this functionality is not currently available in the official\nprotobuf release, and it is not used for type URLs beginning with\ntype.googleapis.com. As of May 2023, there are no widely used type server\nimplementations and no plans to implement one.\n\nSchemes other than `http`, `https` (or the empty scheme) might be\nused with implementation specific semantics.", + "type": "string" + } + }, + "additionalProperties": {} + } + }, + "message_format": { + "description": "The default (fallback) message format that should be used for the error.\nThis is also used if the client does not have a translation for the error.", + "type": "string" + }, + "name": { + "description": "Name of the error.", + "type": "string" + }, + "namespace": { + "description": "Namespace of the error (typically the package name in The Things Stack).", + "type": "string" + } + } } } } @@ -531939,7 +532260,54 @@ "format": "date-time" }, "last_failed_attempt_details": { - "$ref": "#/definitions/v3ErrorDetails" + "description": "Error details that are communicated over gRPC (and HTTP) APIs.\nThe messages (for translation) are stored as \"error:\u003cnamespace\u003e:\u003cname\u003e\".", + "type": "object", + "properties": { + "attributes": { + "description": "Attributes that should be filled into the message format. Any extra attributes\ncan be displayed as error details.", + "type": "object" + }, + "cause": { + "description": "The error that caused this error.", + "$ref": "#/definitions/v3ErrorDetails" + }, + "code": { + "description": "The status code of the error.", + "type": "integer", + "format": "int64" + }, + "correlation_id": { + "description": "The correlation ID of the error can be used to correlate the error to stack\ntraces the network may (or may not) store about recent errors.", + "type": "string" + }, + "details": { + "description": "The details of the error.", + "type": "array", + "items": { + "description": "`Any` contains an arbitrary serialized protocol buffer message along with a\nURL that describes the type of the serialized message.\n\nProtobuf library provides support to pack/unpack Any values in the form\nof utility functions or additional generated methods of the Any type.\n\nExample 1: Pack and unpack a message in C++.\n\n Foo foo = ...;\n Any any;\n any.PackFrom(foo);\n ...\n if (any.UnpackTo(\u0026foo)) {\n ...\n }\n\nExample 2: Pack and unpack a message in Java.\n\n Foo foo = ...;\n Any any = Any.pack(foo);\n ...\n if (any.is(Foo.class)) {\n foo = any.unpack(Foo.class);\n }\n // or ...\n if (any.isSameTypeAs(Foo.getDefaultInstance())) {\n foo = any.unpack(Foo.getDefaultInstance());\n }\n\n Example 3: Pack and unpack a message in Python.\n\n foo = Foo(...)\n any = Any()\n any.Pack(foo)\n ...\n if any.Is(Foo.DESCRIPTOR):\n any.Unpack(foo)\n ...\n\n Example 4: Pack and unpack a message in Go\n\n foo := \u0026pb.Foo{...}\n any, err := anypb.New(foo)\n if err != nil {\n ...\n }\n ...\n foo := \u0026pb.Foo{}\n if err := any.UnmarshalTo(foo); err != nil {\n ...\n }\n\nThe pack methods provided by protobuf library will by default use\n'type.googleapis.com/full.type.name' as the type URL and the unpack\nmethods only use the fully qualified type name after the last '/'\nin the type URL, for example \"foo.bar.com/x/y.z\" will yield type\nname \"y.z\".\n\nJSON\n====\nThe JSON representation of an `Any` value uses the regular\nrepresentation of the deserialized, embedded message, with an\nadditional field `@type` which contains the type URL. Example:\n\n package google.profile;\n message Person {\n string first_name = 1;\n string last_name = 2;\n }\n\n {\n \"@type\": \"type.googleapis.com/google.profile.Person\",\n \"firstName\": \u003cstring\u003e,\n \"lastName\": \u003cstring\u003e\n }\n\nIf the embedded message type is well-known and has a custom JSON\nrepresentation, that representation will be embedded adding a field\n`value` which holds the custom JSON in addition to the `@type`\nfield. Example (for message [google.protobuf.Duration][]):\n\n {\n \"@type\": \"type.googleapis.com/google.protobuf.Duration\",\n \"value\": \"1.212s\"\n }", + "type": "object", + "properties": { + "@type": { + "description": "A URL/resource name that uniquely identifies the type of the serialized\nprotocol buffer message. This string must contain at least\none \"/\" character. The last segment of the URL's path must represent\nthe fully qualified name of the type (as in\n`path/google.protobuf.Duration`). The name should be in a canonical form\n(e.g., leading \".\" is not accepted).\n\nIn practice, teams usually precompile into the binary all types that they\nexpect it to use in the context of Any. However, for URLs which use the\nscheme `http`, `https`, or no scheme, one can optionally set up a type\nserver that maps type URLs to message definitions as follows:\n\n* If no scheme is provided, `https` is assumed.\n* An HTTP GET on the URL must yield a [google.protobuf.Type][]\n value in binary format, or produce an error.\n* Applications are allowed to cache lookup results based on the\n URL, or have them precompiled into a binary to avoid any\n lookup. Therefore, binary compatibility needs to be preserved\n on changes to types. (Use versioned type names to manage\n breaking changes.)\n\nNote: this functionality is not currently available in the official\nprotobuf release, and it is not used for type URLs beginning with\ntype.googleapis.com. As of May 2023, there are no widely used type server\nimplementations and no plans to implement one.\n\nSchemes other than `http`, `https` (or the empty scheme) might be\nused with implementation specific semantics.", + "type": "string" + } + }, + "additionalProperties": {} + } + }, + "message_format": { + "description": "The default (fallback) message format that should be used for the error.\nThis is also used if the client does not have a translation for the error.", + "type": "string" + }, + "name": { + "description": "Name of the error.", + "type": "string" + }, + "namespace": { + "description": "Namespace of the error (typically the package name in The Things Stack).", + "type": "string" + } + } } } } @@ -553981,6 +554349,26 @@ "type": "integer", "format": "int64" }, + "last_battery_percentage": { + "type": "object", + "properties": { + "f_cnt": { + "description": "Frame counter value of last uplink containing DevStatusAns.", + "type": "integer", + "format": "int64" + }, + "received_at": { + "description": "Time when last DevStatus MAC command was received.", + "type": "string", + "format": "date-time" + }, + "value": { + "description": "The battery percentage of the end device.\nThe value is defined in the [0, 100] interval.", + "type": "number", + "format": "float" + } + } + }, "locations": { "description": "End device location metadata, set by the Application Server while handling the message.", "type": "object", @@ -648921,6 +649309,26 @@ } } }, + "v3LastBatteryPercentage": { + "type": "object", + "properties": { + "f_cnt": { + "description": "Frame counter value of last uplink containing DevStatusAns.", + "type": "integer", + "format": "int64" + }, + "received_at": { + "description": "Time when last DevStatus MAC command was received.", + "type": "string", + "format": "date-time" + }, + "value": { + "description": "The battery percentage of the end device.\nThe value is defined in the [0, 100] interval.", + "type": "number", + "format": "float" + } + } + }, "v3ListBandsResponse": { "type": "object", "properties": {