diff --git a/doc/config/_default/config.toml b/doc/config/_default/config.toml index 0ed39b8336..b2a8df1aa2 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.34.1" + version = "3.34.2" [markup] [markup.goldmark] diff --git a/doc/content/enterprise/aws/ecs/changelog/index.md b/doc/content/enterprise/aws/ecs/changelog/index.md index 044e13dd18..aa75c1726e 100644 --- a/doc/content/enterprise/aws/ecs/changelog/index.md +++ b/doc/content/enterprise/aws/ecs/changelog/index.md @@ -8,6 +8,8 @@ All meaningful changes to templates are documented in this file. ## Unreleased +## 3.34.2 + ## 3.34.1 - Resolve issues with certificate renewal in the certbot scheduled task to ensure proper execution. diff --git a/doc/content/enterprise/kubernetes/azure/architecture/_index.md b/doc/content/enterprise/kubernetes/azure/architecture/_index.md index 879994e09f..ea22b554b3 100644 --- a/doc/content/enterprise/kubernetes/azure/architecture/_index.md +++ b/doc/content/enterprise/kubernetes/azure/architecture/_index.md @@ -19,11 +19,15 @@ The NAT GW is assigned a Public IP Address Prefix while the LB is assigned a sta ## Data Storage -{{% tts %}} relies on two databases: PostgreSQL and Redis. Azure offers these databases as managed services. +{{% tts %}} relies on two databases: PostgreSQL and Redis. -We use [Azure Database for PostgreSQL](https://learn.microsoft.com/en-us/azure/postgresql/flexible-server/overview) as the relational database. +For PostgreSQL, we use [Azure Database for PostgreSQL](https://learn.microsoft.com/en-us/azure/postgresql/flexible-server/overview) as the relational database. -Azure offers a managed [Azure Cache for Redis Database](https://azure.microsoft.com/en-us/products/cache) service, but due to it's version not being compatible with {{% tts %}} the Redis we use is in-cluster. The newest Redis version supported by Azure Cache is 6.0, while the minimum required version of Redis for {{% tts %}} is 6.2. +For Redis, we use an in-cluster deployment instead of the [Azure Cache for Redis Database](https://azure.microsoft.com/en-us/products/cache) service due to incompatibility with {{% tts %}}. The newest Redis version supported by Azure Cache is 6.0, while the minimum required version of Redis for {{% tts %}} is 6.2. + +{{< note >}} +Azure Managed Redis does support a higher version, but it's available only in clustered mode. {{% tts %}} does not work on clustered Redis. +{{}} User uploads of profile pictures and end device pictures are stored in public Azure Storage Containers (Optional). diff --git a/doc/content/enterprise/kubernetes/generic/_index.md b/doc/content/enterprise/kubernetes/generic/_index.md index 41665925f0..8052259471 100644 --- a/doc/content/enterprise/kubernetes/generic/_index.md +++ b/doc/content/enterprise/kubernetes/generic/_index.md @@ -12,7 +12,7 @@ This guide helps the user to install and configure {{% tts %}} on a Kubernetes c -Operating The Things Stack on a Kubernetes cluster is only meant for advanced users with sufficient experience with the chosen infrastructure platform and with Kubernetes. +{{< warning "Operating The Things Stack on a Kubernetes cluster is only meant for advanced users with sufficient experience with the chosen infrastructure platform and with Kubernetes." />}} {{< warning >}} Until the release of v1.0.0, all versions are considered to be in the Alpha stage and are not suitable for production use. The Things Industries does not offer any guarantees on compatibility between the Alpha versions. {{}} diff --git a/doc/content/enterprise/kubernetes/generic/configuration/_index.md b/doc/content/enterprise/kubernetes/generic/configuration/_index.md index 760947c492..3f39609e12 100644 --- a/doc/content/enterprise/kubernetes/generic/configuration/_index.md +++ b/doc/content/enterprise/kubernetes/generic/configuration/_index.md @@ -29,7 +29,7 @@ global: adminUserID: # User ID for the Administrator of the tenant. Do not use `admin`. adminEmail: # Email of the Administrator of the tenant. blob: - provider: # "aws", "azure", "gcp", "local" or empty string to disable blob usage + provider: # "aws", "azure", "gcp", "local" or empty string to disable blob usage. aws: # Set only if provider is "aws". region: # region accessKeyID: # AWS access key ID @@ -108,6 +108,8 @@ To set up the gateway controller, the following fields must be filled in `values `global.ttgc.tls.secretName`| Kubernetes Secret name containing the TLS. Should be the same as `global.ingress.tls.secretName`. `global.ttgc.address` | (Optional) The URL of the gateway controller. It not specified, it defaults to `gc.thethings.industries:443`. +{{< note "In case you are using the cloud-managed The Things Gateway Controller (i.e. `gc.thethings.industries:443`), your network must be registered on our side, otherwise connections to the gateway controller will fail. Let us know if this is needed." />}} + {{% tts %}} verifies the identity of each connected TTIGPro gateway for security reasons, therefore mutual TLS is necessary to be configured in the ingress controller. mTLS configuration depends on the chosen ingress controller and is left to the operator of the Kubernetes cluster. {{% tts %}} recognizes the following client certificate header names: - `X-Forwarded-Client-Cert` - `X-Forwarded-Tls-Client-Cert` @@ -155,7 +157,7 @@ For more info check the [Traefik docs on the PassTLSClientCert middleware](https - Apply the k8s manifest to the cluster: ```bash - kubectl apply -f traefik-passtlsclientcert.yaml + kubectl apply -f traefik-tlsoption.yaml ``` {{< note "{{% tts %}} Helm chart uses wildcard domains in ingress routes. This is necessary for multi-tenant deployments as we don't know the names of the tenants in advance. Traefik does not support TLS options for wildcard domains, because it maps the TLS options based solely on the host name (the `Host` part of the ingress rule) and it needs a concrete domain to match ([check out more in the Traefik docs](https://doc.traefik.io/traefik/v2.3/routing/routers/#options)). To go around this limitation, a default TLS option can be used which is the fallback for any unmatched host." />}} diff --git a/doc/content/enterprise/kubernetes/generic/database-migrations/_index.md b/doc/content/enterprise/kubernetes/generic/database-migrations/_index.md index 01808efdd9..bbfb428a33 100644 --- a/doc/content/enterprise/kubernetes/generic/database-migrations/_index.md +++ b/doc/content/enterprise/kubernetes/generic/database-migrations/_index.md @@ -21,6 +21,7 @@ Set the respective Helm chart values to `true` to perform database migrations du | ------- | ---------------------------- | | IS | `is.database.migrate` | | NOC | `noc.store.database.migrate` | +| AS | `as.storage.migrate` | {{< note >}} For example to migrate Identity Server use the following config. @@ -33,8 +34,6 @@ is: {{}} -Remember to unset the value after the upgrade is done. - ## Manual Procedure 1. Delete current Jobs (if any). diff --git a/doc/content/enterprise/kubernetes/generic/install-charts/_index.md b/doc/content/enterprise/kubernetes/generic/install-charts/_index.md index 1997434c04..e9b0a6adef 100644 --- a/doc/content/enterprise/kubernetes/generic/install-charts/_index.md +++ b/doc/content/enterprise/kubernetes/generic/install-charts/_index.md @@ -45,7 +45,17 @@ Assuming that you created a deployment specific `values` file in the previous se $ helm install oci://registry-1.docker.io/thethingsindustries/lorawan-stack-helm-chart --version --values .values.yaml ``` -4. Update the chart. +4. Check if the chart is set up properly. + +Run the helm tests to see if {{% tts %}} is configured properly: + +```bash +$ helm test +``` + +If any test fails, check the logs of the test pods to troubleshoot the issue. + +5. Update the chart. To deploy updates to the chart. @@ -57,7 +67,7 @@ $ helm upgrade oci://registry-1.docker.io/thethingsindustries/lorawan-sta > Note: The `helm` CLI pulls a chart from the repository only if it's locally not present. -5. Uninstall the Chart. +6. Uninstall the Chart. Once done, you can uninstall the chart as follows. diff --git a/doc/content/enterprise/kubernetes/generic/prerequisites/_index.md b/doc/content/enterprise/kubernetes/generic/prerequisites/_index.md index 07909110fe..075f0fa9bf 100644 --- a/doc/content/enterprise/kubernetes/generic/prerequisites/_index.md +++ b/doc/content/enterprise/kubernetes/generic/prerequisites/_index.md @@ -39,8 +39,8 @@ Please [contact our sales team](mailto:sales@thethingsindustries.com) for access {{% tts %}} on Kubernetes requires the following infrastructural services to run. 1. A Kubernetes cluster -2. PostgreSQL compatible database -3. Redis compatible database (Redis 6.2 or above is required) +2. PostgreSQL 14 or above +3. Redis 6.2 or above 4. Blob Storage 5. An ingress controller to handle the ingress routes 6. TLS Certificates @@ -49,11 +49,11 @@ Please [contact our sales team](mailto:sales@thethingsindustries.com) for access These components are highly specific to the specific infrastructure chosen by the operator and hence are out of scope of this documentation. -However, the following is a guide of the general principles involved in setting up the infrastructure. +The following is a guide of the general principles involved in setting up the infrastructure. #### 1. Kubernetes Cluster -{{% tts %}} requires a minimum kubernetes version of v1.21. However, we recommend using the highest available version. +{{% tts %}} requires a minimum kubernetes version of v1.21. We recommend using the highest available version. #### 2. Postgres Compatible Database @@ -97,6 +97,12 @@ The Things Stack requires the following buckets. - The contents of this bucket must be _private_ since they contain secrets. - Enabling encryption and versioning is highly recommended. +5. Plugins configuration + +- Once this bucket is setup, place an empty `plugins.yml` file at the root of the bucket. +- The contents of this bucket must be _private_ since they contain secrets. +- Enabling encryption and versioning is highly recommended. + ##### Using Local Blob Storage In the case of using a local blob, the following steps are necessary. @@ -107,108 +113,27 @@ In the case of using a local blob, the following steps are necessary. $ sudo chown -R 886:886 ``` -2. Create the `edcs`, `interop`, `end_device_pictures` and `profile_pictures` folders at the root of the blob folder. +2. Create the `edcs`, `interop`, `end_device_pictures`, `profile_pictures`, `plugins` folders at the root of the blob folder. 3. Create an empty `config.yml` in the `edcs` and `interop` folders. +4. Create an empty `plugins.yml` in the `plugins` folder. -##### Disabling Blob Storage +#### 5. An ingress controller -{{% tts %}} Helm Chart by default expects a blob storage configured but it is possible to use {{% tts %}} without it. You can disable the usage of blob by setting `global.interop.configSource` and `global.blob.provider` values to an empty string `""`. +An ingress controller is needed to route the incoming traffic. {{% tts %}} Helm chart uses Kubernetes ingress resources for routing requests to the components of {{% tts %}}. This allows the users of {{% tts %}} Helm chart to configure an ingress controller of their choice. However, Kubernetes ingress routes support only L7 traffic (HTTP/gRPC). For this reason, the configuration for routing UDP Packet Forwarder traffic for gateways is not handled by the Helm chart. -#### 5. An ingress controller +{{% tts %}} needs several [port allocations with various protocols]({{< ref "/concepts/networking/#port-allocations" >}}). We recommend using an ingress controller that natively supports L4 and L7 protocols. Depending on your preferred setup for gateways, an ingress controller that supports only L7 protocols (such as Ingress-Nginx) can be used too, but the connecting gateways will be either limited to L7 protocols or more complex to setup and maintain if using L4 protocols. -An ingress controller is needed to route the incoming traffic. Specify the ingress controller by setting the `global.ingress.controller` to the class name of the ingress controller deployed in the cluster. For TLS, make sure to set the `global.ingress.controller.tls.secretName`. The secret has to be accessible from the namespace where the {{% tts %}} Helm Chart is deployed. These ports are needed by {{% tts %}} and must be exposed: - -```yaml -web: - protocol: TCP - port: 1885 - exposedPort: 80 -websecure: - protocol: TCP - port: 8885 - exposedPort: 443 -grpc: - protocol: TCP - port: 1884 - exposedPort: 1884 -grpcsecure: - protocol: TCP - port: 8884 - exposedPort: 8884 -# Gateway Connectivity -gtwmqttv2: - protocol: TCP - port: 1881 - exposedPort: 1881 -gtwmqttv2secure: - protocol: TCP - port: 8881 - exposedPort: 8881 -gtwmqttv3: - protocol: TCP - port: 1882 - exposedPort: 1882 -gtwmqttv3secure: - protocol: TCP - port: 8882 - exposedPort: 8882 -semtechws: - protocol: TCP - port: 1887 - exposedPort: 1887 -semtechwssecure: - protocol: TCP - port: 8887 - exposedPort: 8887 -# Application MQTT -appmqtt: - protocol: TCP - port: 1883 - exposedPort: 1883 -appmqttsecure: - protocol: TCP - port: 8883 - exposedPort: 8883 -# The Things Indoor Gateway Pro -ttigw: - protocol: "TCP" - port: 1889 - exposedPort: 1889 -ttigwsecure: - protocol: "TCP" - port: 8889 - exposedPort: 8889 -# Interoperability. This part is optional. Only enable it if interoperability is needed. -interop: - protocol: TCP - # Note: Change this to 1886 if using `server-only` mode. - port: 8886 - exposedPort: 8886 -``` +Although we do support UDP Packet Forwarder as a gateway connection option, it requires [more configuration on your side]({{< ref "enterprise/kubernetes/generic/#udp-gateway-support" >}}). We recommend using LoRa Basics™ Station LNS, The Things Industries Gateway or LBS CUPS mTLS protocols for connecting gateways. -In case annotations are needed for certain protocols or for the {{% tts %}} services, these can be specified under `global.ingress.annotations` and `global.ingress.serviceAnnotations`. E.g. Traefik annotations can be specified as: -```yaml -ingress: - controller: "traefik" - tls: - secretName: "ingress-tls-cert" - annotations: - grpc: - traefik.ingress.kubernetes.io/router.entrypoints: grpcsecure - traefik.ingress.kubernetes.io/router.tls: "true" - http: - traefik.ingress.kubernetes.io/router.entrypoints: websecure - semtechws: - traefik.ingress.kubernetes.io/router.entrypoints: semtechwssecure,semtechws - traefik.ingress.kubernetes.io/router.tls: "true" - serviceAnnotations: - traefik.ingress.kubernetes.io/service.serversscheme: h2c -``` +To configure the ingress controller for {{% tts %}}: +1. Specify the ingress controller by setting the `global.ingress.controller` to the class name of the ingress controller deployed in the cluster. This will be used to set the ingress class name in the ingress routes that handle {{% tts %}} traffic. +2. Specify the TLS secret by setting the `global.ingress.controller.tls.secretName`. The secret has to be accessible from the namespace where the {{% tts %}} Helm Chart is deployed. This will be used to terminate TLS for {{% tts %}} traffic +3. Add annotations for the ingress routes if needed by setting `global.ingress.annotations.http`, `global.ingress.annotations.grpc`, `global.ingress.annotations.semtechws` or `global.ingress.annotations.ttigw`. +4. Add ingress specific service annotations for {{% tts %}} services by setting `global.ingress.serviceAnnotations` if needed. +5. Expose the ports used by {{% tts %}} in your ingress controller. A list of all the ports can be found [here]({{< ref "/concepts/networking/#port-allocations" >}}). For production environments, make sure to expose only TLS ports. Examples of ingress controllers configurations can be found [here](https://www.thethingsindustries.com/docs/the-things-stack/host/kubernetes/generic/prerequisites/sample-ingress-controllers/). -{{< note "{{% tts %}} Helm chart uses Kubernetes ingress rules for routing requests to the components of {{% tts %}}. This allows the users of {{% tts %}} Helm chart to configure an ingress controller of their choice. However, Kubernetes ingress routes support only L7 traffic (HTTP/gRPC). For this reason, UDP Packet Forwarder for gateways is not supported in the Helm chart for now." />}} - #### 6. TLS Certificates The Things Stack expects a [Kubernetes TLS Secret](https://kubernetes.io/docs/concepts/configuration/secret/#tls-secrets) which contains the server leaf certificates. diff --git a/doc/content/enterprise/kubernetes/generic/prerequisites/sample-ingress-controllers.md b/doc/content/enterprise/kubernetes/generic/prerequisites/sample-ingress-controllers.md index 36880eec98..8371afda83 100644 --- a/doc/content/enterprise/kubernetes/generic/prerequisites/sample-ingress-controllers.md +++ b/doc/content/enterprise/kubernetes/generic/prerequisites/sample-ingress-controllers.md @@ -8,44 +8,46 @@ aliases: [ ] --- -The following are examples of ingress controllers for {{% tts %}} deployment on Kubernetes. +The following are examples of ingress controller configurations for {{% tts %}} deployment on Kubernetes. ## Traefik -Example of a Traefik configuration provided through the values of an Traefik Helm chart. More info about the Helm chart -can be found [here](https://github.com/traefik/traefik-helm-chart). +Example of a Traefik configuration. More info about the Helm chart can be found [here](https://github.com/traefik/traefik-helm-chart). + +{{% tts %}} Helm chart ingress configuration: + +```yaml +global: + ingress: + controller: "traefik" + tls: + secretName: "ingress-tls-cert" + annotations: + http: + traefik.ingress.kubernetes.io/router.entrypoints: web,websecure + grpc: + traefik.ingress.kubernetes.io/router.entrypoints: grpc,grpcsecure + traefik.ingress.kubernetes.io/router.tls: "true" + semtechws: + traefik.ingress.kubernetes.io/router.entrypoints: semtechws,semtechwssecure + traefik.ingress.kubernetes.io/router.tls: "true" + serviceAnnotations: + traefik.ingress.kubernetes.io/service.serversscheme: h2c +``` + +Traefik Helm chart port mapping configuration: ```yaml deployment: kind: "Deployment" replicas: 1 -ingressRoute: - dashboard: - enabled: false -additionalArguments: -- "--entrypoints.udp.udp.timeout=90s" ports: web: - protocol: "TCP" - port: 1885 - expose: - default: true - exposedPort: 80 - redirectTo: - port: "websecure" - websecure: - protocol: "TCP" - port: 8885 - expose: - default: true - exposedPort: 443 - traefik: - protocol: "TCP" - port: 9000 - expose: - default: false + redirections: + to: websecure + scheme: https grpc: protocol: "TCP" port: 1884 @@ -118,66 +120,114 @@ ports: expose: default: true exposedPort: 8889 - interop: - protocol: "TCP" - port: 8886 + udp: + protocol: "UDP" + port: 1700 expose: default: true - exposedPort: 8886 + exposedPort: 1700 ``` -## Ingress NGINX +UDP Ingress Route for the UDP Packet Forwarder: -Example of an Ingress NGINX configuration provided through the values of an Ingress NGINX Helm chart. More info about the -Helm chart can be found [here](https://artifacthub.io/packages/helm/bitnami/nginx). +{{< warning "The UDP Packet Forwarder requires session affinity to work properly. Traefik does not support session affinity for UDP. Session affinity can usually be set up on the Load Balancer of the cluster. We recommend using the newer LoRa Basics™ Station LNS protocol instead of the UDP Packet Forwarder." />}} ```yaml -fullnameOverride: "nginx" -namespaceOverride: "ingress-nginx" -kind: Deployment -replicaCount: '1' -config: - # redirect port 80 to 443 for HTTP to HTTPS. - ssl-redirect: "true" - upstream-keepalive-timeout: '90s' -service: - ports: - http: 80 - https: 443 - extraPorts: - - name: semtechws - port: 1887 - targetPort: 1887 - nodePorts: - tcp: - # http - "80": "1885" - # https - "443": "8885" - # grpc - "1884": "1884" - # grpcsecure - "8844": "8884" - # gtwmqttv2 - "1881": "1881" - # gtwmqttv2secure - "8881": "8881" - # gtwmqttv3 - "1882": "1882" - # gtwmqttv3secure - "8882": "8882" - # semtechws - "1887": "1887" - # semtechwssecure - "8887": "8887" - # appmqtt - "1883": "1883" - # appmqttsecure - "8883": "8883" - # interop - "8886": "8886" - # ttigw - "1889": "1889" - # ttigwsecure - "8889": "8889" +apiVersion: traefik.containo.us/v1alpha1 +kind: IngressRouteUDP +metadata: + name: tts-gs-udp-packet-forwarder + namespace: tts # Set this to the namespace where TTS is deployed. +spec: + entryPoints: + - udp + routes: + - services: + - name: tts-gs # -gs + port: 1700 +``` + +TCP Ingress Route for MQTT application integration: + +```yaml +apiVersion: traefik.io/v1alpha1 +kind: IngressRouteTCP +metadata: + name: tts-as-mqtt + namespace: tts # Set this to the namespace where TTS is deployed. +spec: + entryPoints: + - appmqtt + routes: + - match: HostSNI(`*`) + services: + - name: tts-as # -as + port: 1883 +--- +apiVersion: traefik.io/v1alpha1 +kind: IngressRouteTCP +metadata: + name: tts-app-mqtt-secure + namespace: tts # Set this to the namespace where TTS is deployed. +spec: + entryPoints: + - appmqttsecure + routes: + - match: HostSNI(`*`) + services: + - name: tts-as # -as + port: 1883 + tls: + secretName: ingress-tls-secret +``` + +## Ingress-Nginx Controller + +Example of an Ingress-Nginx Controller configuration. More info about the Helm chart can be found [here](https://kubernetes.github.io/ingress-nginx/). + +{{% tts %}} Helm chart ingress configuration: + +```yaml +global: + ingress: + controller: "nginx" + tls: + secretName: "ingress-tls-cert" + annotations: + grpc: + nginx.ingress.kubernetes.io/backend-protocol: GRPC + nginx.ingress.kubernetes.io/use-http2: "true" + http: + nginx.ingress.kubernetes.io/backend-protocol: HTTP + nginx.ingress.kubernetes.io/use-http2: "true" + semtechws: {} + ttigw: {} + serviceAnnotations: {} +``` + +Ingress-Nginx Helm chart port mapping configuration: + +{{< note "When using Ingress-Nginx, enable the TLS ports in the Helm chart." />}} + +```yaml +controller: + config: + use-http2: true + strict-validate-path-type: false # This is needed to allow GRPC paths that contain dots. + default-ssl-certificate: / # Make sure to set this. +tcp: + # Plain-text ports. + "1881": tts/the-things-stack-gs:1881 # /-gs:1881 + "1882": tts/the-things-stack-gs:1882 + "1883": tts/the-things-stack-as:1883 + "1887": tts/the-things-stack-gs:1887 + "1889": tts/the-things-stack-gs:1889 + # TLS ports. + "8881": tts/the-things-stack-gs:8881 + "8882": tts/the-things-stack-gs:8882 + "8883": tts/the-things-stack-as:8883 + "8887": tts/the-things-stack-gs:8887 + "8889": tts/the-things-stack-gs:8889 +udp: + "1700": tts/the-things-stack-gs:1700 ``` diff --git a/doc/content/getting-started/3-try-starter-kit/activate/_index.md b/doc/content/getting-started/3-try-starter-kit/activate/_index.md index 9dec74e936..efa442ee8e 100644 --- a/doc/content/getting-started/3-try-starter-kit/activate/_index.md +++ b/doc/content/getting-started/3-try-starter-kit/activate/_index.md @@ -8,9 +8,7 @@ This guide shows you how to activate your Starter Kit’s LoRaWAN® gateway and -
You can also check our YouTube video on how to get started. {{< youtube "JRTPpME2-bw" >}} -
### 1. {{% ttigpro %}} diff --git a/doc/content/hardware/gateways/models/thethingsindoorgatewaypro/_index.md b/doc/content/hardware/gateways/models/thethingsindoorgatewaypro/_index.md index ca014e1678..9959b7e077 100644 --- a/doc/content/hardware/gateways/models/thethingsindoorgatewaypro/_index.md +++ b/doc/content/hardware/gateways/models/thethingsindoorgatewaypro/_index.md @@ -159,6 +159,14 @@ If the issue persists, please contact [support@thethingsindustries.com](mailto:s ## Firmware Changelog +### 1.2.11 + +- Update dependencies +- Fix for DNS lookup when a single custom DNS server is configured +- Configure network hostname as `ttigpro-112233` (where `112233` are the last six hex digits of the MAC address) +- Reduce connect restart watchdog from 180 to 60 attempts +- Simplify logging + ### 1.2.10 - Adjust task stack sizes to avoid potential memory corruption diff --git a/doc/content/integrations/cloud-integrations/azure-iot-central/device-twin.md b/doc/content/integrations/cloud-integrations/azure-iot-central/device-twin.md index ab6597e1e8..04306206a7 100644 --- a/doc/content/integrations/cloud-integrations/azure-iot-central/device-twin.md +++ b/doc/content/integrations/cloud-integrations/azure-iot-central/device-twin.md @@ -87,7 +87,7 @@ An example of this property as unmodeled data would look as follows: > `frm-payload` is the service name for the service which derives the end device location from the decoded payload. -- `serviceData` - Object mapping between the service (name) and the service data reported by that service. Used by integrations such as [LoRa Cloud]({{< ref "/integrations/other-integrations/lora-cloud" >}}). +- `serviceData` - Object mapping between the service (name) and the service data reported by that service. Used by third-party integrations. - `decodedPayload` - Decoded payload of the uplink messages, which is generated using the [Payload Formatters]({{< ref "/integrations/payload-formatters" >}}). An example of this property as unmodeled data would look as follows: diff --git a/doc/content/integrations/cloud-integrations/blynk/_index.md b/doc/content/integrations/cloud-integrations/blynk/_index.md new file mode 100644 index 0000000000..1f132e835c --- /dev/null +++ b/doc/content/integrations/cloud-integrations/blynk/_index.md @@ -0,0 +1,15 @@ +--- +title: "Blynk" +description: "The integration guide with the Blynk IoT Platform" +weight: +distributions: ["Cloud", "Enterprise", "Sandbox"] +--- + +**[Blynk](https://blynk.io/)** is a powerful IoT platform that enables businesses to easily connect, monitor, and control devices. It includes secure cloud infrastructure and customizable mobile and web applications, all without the need for coding. + +## Key Benefits of Blynk Integration +- **Bidirectional Device Communication**: Leverage widgets on the [Console Dashboard](https://docs.blynk.io/en/blynk.console/devices/device-profile/dashboard) or [Mobile App](https://blynk.io/no-code-iot-mobile-apps) to both visualize data from devices and send commands to them seamlessly. +- **Enhanced Device Onboarding**: Streamline the onboarding process using LoRaWAN Device Identification QR Codes or [Blynk Static Tokens](https://docs.blynk.io/en/hardware-guides/the-things-stack/automated-device-onboarding#onboard-using-static-tokens) for automatic device registration in both Blynk and The Things Stack applications, via the Blynk App or Console. +- [**Device Lifecycle Management**](https://docs.blynk.io/en/blynk.console/templates/connection-lifecycle): Monitor device status and configurations with real-time in-app notifications and email alerts for efficient lifecycle management. + +**[The Things Stack integration documentation on Blynk](https://docs.blynk.io/en/hardware-guides/the-things-stack)** diff --git a/doc/content/integrations/cloud-integrations/blynk/api-key-permissions-settings.png b/doc/content/integrations/cloud-integrations/blynk/api-key-permissions-settings.png new file mode 100644 index 0000000000..ce5110ac51 Binary files /dev/null and b/doc/content/integrations/cloud-integrations/blynk/api-key-permissions-settings.png differ diff --git a/doc/content/integrations/cloud-integrations/blynk/automated-device-onboarding.md b/doc/content/integrations/cloud-integrations/blynk/automated-device-onboarding.md new file mode 100644 index 0000000000..cc9a012c96 --- /dev/null +++ b/doc/content/integrations/cloud-integrations/blynk/automated-device-onboarding.md @@ -0,0 +1,103 @@ +--- +title: "Automated Device Onboarding" +description: "Onboard your device using Blynk App or Blynk Console." +weight: 2 +--- + +Once the integration with Blynk is configured, all devices in your The Things Stack application will be automatically imported into Blynk as soon as they transmit any data. + +Additionally, you can manually create devices in Blynk or use the Automated Device Onboarding feature, which offers an optimal user experience for connecting devices. +However, this requires you to configure first the Automated Device Onboarding settings in your Blynk integration. + +## Enabling Automated Device Onboarding +To enable the Automated Device Onboarding feature: +- Open the **Blynk Console** and navigate to **Developer Tools -> Integrations -> The Things Stack**. +- Select the application you wish to configure and access the advanced settings. +- Turn on the **Enable Automated Device Onboarding** switch. +- Specify the LoRaWAN version, Frequency plan, and Regional Parameter Version. If needed, check the Support class B and/or Support class C boxes. +- Enter the addresses of The Things Stack components, which you can find at the bottom of the **Overview** page on your The Things Stack dashboard. +Save the changes. + +{{< figure src="../integration-advanced-settings.png" alt="The advanced settings of the integration on Blynk" >}} + +Additionally, Blynk requires the following permissions: +- **View device keys in application** +- **Create devices in application** +- **Edit device keys in application** + +To grant these permissions, either generate a new API key or edit the existing one that you have been using with Blynk. + +{{< figure src="../api-key-permissions-settings.png" alt="The API key permission settings on The Things Stack" >}} + +Now that the automated device onboarding is enabled and configured, you can onboard your first device. + +{{< note "Sometimes, a device requires a reboot to initiate the onboarding flow. Make sure to restart the device if it doesn't automatically start the onboarding process after following the setup steps. This can help ensure the device properly connects and begins the necessary communication with Blynk and The Things Stack." />}} + +## Manually configure the tokens +This is the easiest, but least scalable way to onboard the device: + +Begin by creating the device from the template on the Blynk Console: **Go to Devices -> + New Device -> From template**, select the template, and assign a meaningful name to the device. Then click **Create**. + +Next, to provision the device on The Things Stack, open **Info & Metadata** and fill out the three metadata fields: *Device EUI*, *App EUI* and *Application Key*. + +{{< figure src="../device-info.png" alt="The device information page on Blynk" >}} + +Once these three metadata fields are specified, Blynk will automatically create the device in The Things Stack application. + +## Onboard using Static Tokens +The preferred method for device provisioning is using [Blynk Static Tokens](https://docs.blynk.io/en/hardware-guides/the-things-stack/automated-device-onboarding#onboard-using-static-tokens). +Here’s how to do it: + +1. Create a CSV file listing the Device EUI, App EUI, and Application Key for each device. +2. Use this CSV file to create static tokens: open the **Blynk Console -> Developer Zone -> Static Tokens -> Generate Static Tokens -> Create From File**. Then select the device template and upload the file. +3. This process will generate a unique QR code for each device. +4. These QR codes can be scanned via the Blynk Mobile application or on the Blynk Console by the end customer. +5. Once a QR code is scanned and the device is created, it will be automatically created in The Things Stack application. + +Here is an example of a CSV file that could be used for creating static tokens: +```csv +Device EUI,App EUI,Application Key +0018B20000000101,70B3D57ED0000010,2B7E151628AED2A6ABF7158809CF4F3C +0018B20000000102,70B3D57ED0000011,3B7E151628AED2A6ABF7158809CF4F3D +0018B20000000103,70B3D57ED0000012,4B7E151628AED2A6ABF7158809CF4F3E +``` + +## Onboard using LoRaWAN QR Code +Blynk also supports [LoRaWAN® Device Identification QR Codes for Automated Onboarding](https://lora-alliance.org/wp-content/uploads/2020/11/TR005_LoRaWAN_Device_Identification_QR_Codes.pdf). +To use them, follow these steps: +1. First, create the static tokens as described in the [Onboard using Static Tokens](#onboard-using-static-tokens) section. +2. Construct the QR code in the LoRaWAN format using the Profile ID specified in the advanced settings of The Things Stack integration application card on Blynk. + +Additionally, you can change the Profile ID used in the QR code body. +To do so, open the application settings on Blynk, locate to the advanced settings and edit the Profile ID field. + +{{< figure src="../profile-id-field.png" alt="The Profile ID field" >}} + +For LoRaWAN QR codes, Blynk requires the following: +- The code must start with `LW:D0`. +- It must contain the App EUI, Device EUI, and the Profile ID. +- Optionally, it may contain a checksum. +- Any other parts of the QR code are ignored. + +Here is an example of how the QR code data should be structured: +``` +LW:D0:::: +``` +Here is an example of the QR code body with App EUI = `70B3D57ED0000010`, Device EUI = `0018B20000000101` and Profile ID = `000AF8BE`: +``` +LW:D0:70B3D57ED0000010:0018B20000000101:000AF8BE +``` +Generate the QR code by inputting this content into any QR code generator tool, such as [QR Code Generator](https://www.urldecoder.org/). +Then this QR code can be scanned by the end customer in the Blynk Mobile application or on the Blynk Console. +Once the device is created, it will be automatically added in The Things Stack application. + +## Re-provisioning +If you've changed your hardware or updated any LoRaWAN connection parameters (such as DevEUI, AppEUI/JoinEUI, or Application Key), you will need to create a new device in The Things Stack. + +To retain the historical data, settings, or any other details for the old device in Blynk, follow these steps: + +1. Navigate to the **Device Information & Metadata** tab for the old device in Blynk. +2. Update the **TheThingsStack Device ID** metafield. +3. Optionally, you can also update other related metafields like **DevEUI**, **JoinEUI**, and **Application Key**. + +{{< warning "If the new device goes online in The Things Stack before updating the metafields in Blynk, it may be automatically imported into Blynk. In case of a **TheThingsStack Device ID** collision (where two devices have the same ID), Blynk will randomly select one device. To resolve this, simply delete the automatically imported device to ensure the correct one is used." />}} diff --git a/doc/content/integrations/cloud-integrations/blynk/connected-application.png b/doc/content/integrations/cloud-integrations/blynk/connected-application.png new file mode 100644 index 0000000000..a5180cbf26 Binary files /dev/null and b/doc/content/integrations/cloud-integrations/blynk/connected-application.png differ diff --git a/doc/content/integrations/cloud-integrations/blynk/create-integration.png b/doc/content/integrations/cloud-integrations/blynk/create-integration.png new file mode 100644 index 0000000000..f5355173d3 Binary files /dev/null and b/doc/content/integrations/cloud-integrations/blynk/create-integration.png differ diff --git a/doc/content/integrations/cloud-integrations/blynk/create-tempalte.png b/doc/content/integrations/cloud-integrations/blynk/create-tempalte.png new file mode 100644 index 0000000000..4903de6990 Binary files /dev/null and b/doc/content/integrations/cloud-integrations/blynk/create-tempalte.png differ diff --git a/doc/content/integrations/cloud-integrations/blynk/device-info.png b/doc/content/integrations/cloud-integrations/blynk/device-info.png new file mode 100644 index 0000000000..750f4b121c Binary files /dev/null and b/doc/content/integrations/cloud-integrations/blynk/device-info.png differ diff --git a/doc/content/integrations/cloud-integrations/blynk/device_grouping.md b/doc/content/integrations/cloud-integrations/blynk/device_grouping.md new file mode 100644 index 0000000000..83c5b6733f --- /dev/null +++ b/doc/content/integrations/cloud-integrations/blynk/device_grouping.md @@ -0,0 +1,28 @@ +--- +title: "Device Grouping" +description: "Group your devices correctly to ensure seamless integration and effective device management." +weight: 3 +--- + +To ensure seamless integration and effective device management, follow these principles: + +## Use Separate Applications and Templates for Different Device Types +* **Why:** Each device type typically has unique data structures and behaviors. Using separate templates ensures that Blynk can correctly process and display device-specific telemetry data. +* **How:** Create a dedicated application in The Things Stack for each Blynk template. This alignment allows you to configure a payload formatter at the application level, ensuring consistent data formatting across devices within the same group. + +## Group Devices of the Same Type in the Same Application and Template +* **Why:** Grouping devices of the same type within a single application simplifies management and avoids issues caused by mixing different device types. +* **How:** Use a common payload formatter for all devices within an application. This reduces the risk of errors and ensures consistent behavior across similar devices. + +## Benefits of This Approach +**Consistency in Data Processing** \ +Configuring a shared payload formatter at the application level ensures uniformity, preventing potential bugs caused by incompatible data formats. + +**Simplified Maintenance** \ +Managing devices of the same type in a single application and template makes it easier to update configurations, troubleshoot issues, and scale the solution. + +**Accurate Template Association** \ +By separating applications for different templates, Blynk can correctly associate devices with their respective templates during the import process. + +{{< warning "If multiple Blynk templates are connected to a single The Things Stack application, Device Provisioning from The Things Stack will be disabled for all associated templates. This limitation can lead to challenges in managing device lifecycles and should be avoided." />}} +{{< figure src="../incorrect-device-grouping.png" alt="Incorrect Device Grouping warning" >}} diff --git a/doc/content/integrations/cloud-integrations/blynk/getting-started.md b/doc/content/integrations/cloud-integrations/blynk/getting-started.md new file mode 100644 index 0000000000..eba9913c81 --- /dev/null +++ b/doc/content/integrations/cloud-integrations/blynk/getting-started.md @@ -0,0 +1,92 @@ +--- +title: "Gettings started" +description: "Connect the application to the Blynk, send downlink and uplink." +weight: 1 +--- + +The easiest way to set up a device on Blynk is to use one already connected to The Things Stack. + +## Prerequirements +1. An application on The Things Stack server +2. A [Blynk](https://blynk.io/) account +3. A connected LoRaWAN device to The Things Stack server + +## Connecting your The Things Stack application to Blynk +Start by [creating a Blynk template for your device](https://docs.blynk.io/en/getting-started/template-quick-setup). +Navigate to **Blynk Console -> Developer Zone -> My Template -> + New Template**. +Provide a meaningful name, optionally select your hardware, and add a description. +Click **Done** to complete the setup. + +{{< figure src="../create-tempalte.png" alt="Create the Template on Blynk" >}} + +Now that you have a template, proceed with connecting it to The Things Stack application. +In the **Blynk Console**, go to **Developer Zone -> Integrations -> The Things Stack**. +Click the **+ Add** button and select the template you created earlier. + +{{< figure src="../create-integration.png" alt="Create the Integration on Blynk" >}} + +Next, navigate to your **The Things Stack Application -> Integrations -> MQTT**. +Copy the **Public TLS Address** and paste it into the **MQTT Server** field on Blynk. +Then, copy the **Username** from your The Things Stack Application and paste it into the **Username** field on Blynk. +Finally, click **Generate API Key** on The Things Stack, copy the generated key, and paste it into the **Password** field in Blynk. + +{{< figure src="../mqtt-integration-page.png" alt="MQTT Integration Page on The Things Stack" >}} + +Click the **Connect** button at the bottom of the application card on Blynk. You will see the integration status change to *Connected*. + +{{< figure src="../connected-application.png" alt="Connected Application on Blynk" >}} + +Once this is done, Blynk will automatically create the device connected to The Things Stack as soon as it sends any data. This device will then be available on the [Devices page](https://docs.blynk.io/en/blynk.console/devices). + +## Sending uplink and downlink messages +Once your first device is connected to Blynk, it's time to transfer some data! Start by configuring the Payload formatter on The Things Stack. + +### Uplink +For uplinks, Blynk requires the data to be in key-value pair format, where the key is either the datastream name or pin (such as v1 or a10) and the value is the datastream value. +The value type must match the datastream value type! Also, prefer using only Virtual Pin, Enum and Location datastream types. Here is an example of the decoded uplink: + +```json +{ + "temperature": 24.1, + "humidity": 54, + "location": [-73.935242, 40.730610] +} +``` +In this example, Blynk will set the datastream with the name *temperature* to the value *24.1* and the datastream with the name *humidity* to the value *54* and datastream with name *location* to the longitude *-73.935242* and latitude *40.730610* (longitude goes first). + +{{< note "Since Blynk does not support a boolean datastream value type, you must use either the Integer or Double datastream value type. The value `true` will be represented as `1`, and `false` as `0`." />}} + +To create or edit datastreams, go to **Blynk Console -> Developer Zone -> My Templates -> select your template -> Datastreams**. +Click the **Edit** button in the top right corner to make changes. +The datastreams configuration for this example may look like this: + +{{< figure src="../template-datastreams.png" alt="Template Datastream Settings on Blynk" >}} + +{{< note "Each time Blynk receives an update from the device, it will trigger the Online lifecycle event. Therefore, it is recommended [to configure a meaningful wait time](https://docs.blynk.io/en/blynk.console/templates/connection-lifecycle) to prevent your device from being stuck in the offline state." />}} + +### Downlink +For each datastream update via the web dashboard, mobile application, automation, etc., Blynk will send a separate downlink to the device. +This will trigger the `encodeDownlink` function of your Downlink Payload formatter. +Here is an example of the downlink that Blynk will send to the device, indicating that the datastream with the name *speed* (pin v2) has been updated to the value *3*: + +```json +{ + "name": "speed", + "pin": "v2", + "ts": 1721202415068, + "value": 3 +} +``` +The `ts` field represents the timestamp in Unix milliseconds format when the value was actually updated. + +## Visualizing data and sending commands to the device +After configuring the Payload Formatter on The Things Stack and setting up Datastreams in your Blynk template, you can proceed to visualize data and send commands to your device. +You can do this either from the device dashboard on the Blynk Console or through the Blynk IoT Smartphone App. + +For guidance on configuring widgets for the Device Dashboard and Mobile App, refer to the Blynk documentation: +- [Web Dashboard](https://docs.blynk.io/en/blynk.console/templates/dashboard) +- [Mobile Dashboard](https://docs.blynk.io/en/blynk.apps/constructor) + +Additionally, take advantage of other powerful Blynk features, such as [Automations](https://docs.blynk.io/en/concepts/automations), [WebHooks](https://docs.blynk.io/en/blynk.console/settings/developers/webhooks), and the [Device HTTPS API](https://docs.blynk.io/en/blynk.cloud/device-https-api), to build more advanced workflows. + +Also, check the [System DataStreams](https://docs.blynk.io/en/hardware-guides/the-things-stack/system-datastreams) section to grab more info from your device. diff --git a/doc/content/integrations/cloud-integrations/blynk/incorrect-device-grouping.png b/doc/content/integrations/cloud-integrations/blynk/incorrect-device-grouping.png new file mode 100644 index 0000000000..dd78ef2369 Binary files /dev/null and b/doc/content/integrations/cloud-integrations/blynk/incorrect-device-grouping.png differ diff --git a/doc/content/integrations/cloud-integrations/blynk/integration-advanced-settings.png b/doc/content/integrations/cloud-integrations/blynk/integration-advanced-settings.png new file mode 100644 index 0000000000..4608210cbb Binary files /dev/null and b/doc/content/integrations/cloud-integrations/blynk/integration-advanced-settings.png differ diff --git a/doc/content/integrations/cloud-integrations/blynk/mqtt-integration-page.png b/doc/content/integrations/cloud-integrations/blynk/mqtt-integration-page.png new file mode 100644 index 0000000000..b0935df2d2 Binary files /dev/null and b/doc/content/integrations/cloud-integrations/blynk/mqtt-integration-page.png differ diff --git a/doc/content/integrations/cloud-integrations/blynk/profile-id-field.png b/doc/content/integrations/cloud-integrations/blynk/profile-id-field.png new file mode 100644 index 0000000000..9a2e32d82d Binary files /dev/null and b/doc/content/integrations/cloud-integrations/blynk/profile-id-field.png differ diff --git a/doc/content/integrations/cloud-integrations/blynk/template-datastreams.png b/doc/content/integrations/cloud-integrations/blynk/template-datastreams.png new file mode 100644 index 0000000000..3f1426dc0a Binary files /dev/null and b/doc/content/integrations/cloud-integrations/blynk/template-datastreams.png differ diff --git a/doc/content/integrations/cloud-integrations/ttnmapper/_index.md b/doc/content/integrations/cloud-integrations/ttnmapper/_index.md index 9f242073af..f7aca37750 100644 --- a/doc/content/integrations/cloud-integrations/ttnmapper/_index.md +++ b/doc/content/integrations/cloud-integrations/ttnmapper/_index.md @@ -21,8 +21,6 @@ Your end device can be sending its GPS coordinates in an uplink message as part - If your end device is sending data in Cayenne LPP format, choose [Cayenne LPP payload formatter](({{< ref "/integrations/payload-formatters/cayenne" >}})) in your device's settings on {{% tts %}}. - Otherwise, create a custom [JavaScript payload formatter]({{< ref "/integrations/payload-formatters/javascript" >}}). This formatter will have to contain fields `latitude`, `longitude` and `altitude`. If possible, `hdop`, `accuracy` or `sats` fields should also be contained. - - The next step is to instantiate the **TTN Mapper** [Webhook template]({{< ref "/integrations/webhooks/webhook-templates" >}}). diff --git a/doc/content/integrations/other-integrations/lora-cloud/_index.md b/doc/content/integrations/other-integrations/lora-cloud/_index.md deleted file mode 100644 index 4b34e63674..0000000000 --- a/doc/content/integrations/other-integrations/lora-cloud/_index.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -title: "LoRa Cloud" -description: "" -weight: 60 -aliases: [/integrations/lora-cloud] ---- - -[LoRa Cloud™](https://www.loracloud.com/) platform offers value-added APIs that enable simple solutions for common tasks related to LoRaWAN® networks and LoRa-based devices. {{% tts %}} supports integrations with [LoRa Cloud Modem Services]({{< ref "/integrations/other-integrations/lora-cloud/modem-services" >}}) and [LoRa Cloud Geolocation Services]({{< ref "/integrations/other-integrations/lora-cloud/geolocation-services" >}}). - - - -The [LoRa Edge™ LR1110](https://www.semtech.com/products/wireless-rf/lora-edge/) solution was used for writing this guide. - -This device is running the LoRa Basics Modem-E Firmware and the LoRa Basics Modem-E Demo Application, which provide the device with enough capabilities to perform operations that are of interest in this guide, like WiFi and GNSS assisted scanning. To install the aforementioned firmware and the demo application, follow [this guide](https://lora-developers.semtech.com/learning-center/hands-on-labs/build-end-to-end-solution-using-lorawan-and-loraedge/install-nucleo-and-lr1110-software/). - -The device is claimed using the [LoRa Cloud Device Join Service](https://www.loracloud.com/documentation/join_service?url=index.html). That operation is out of the scope of this guide and {{% tts %}} documentation in general, but you can find the detailed documentation on how to claim your device at [Semtech's Learning Center site](https://lora-developers.semtech.com/learning-center/hands-on-labs/build-end-to-end-solution-using-lorawan-and-loraedge/claim-your-device-on-the-lora-cloud-portal/). - -In this guide, we assume you already [added the device]({{< ref "/hardware/devices/adding-devices" >}}) in {{% tts %}} Console. Please keep in mind that in case of using the LoRa Cloud Device Join Service for claiming, you have to tick the **External Join Server** box when adding the device in {{% tts %}} Console, as described [here]({{< ref "/hardware/devices/adding-devices#manually-create-end-device" >}}). - -Keep reading the subtopics in the **left menu** to learn how to integrate and make use of LoRa Cloud features. diff --git a/doc/content/integrations/other-integrations/lora-cloud/add-device.png b/doc/content/integrations/other-integrations/lora-cloud/add-device.png deleted file mode 100644 index 5670d74171..0000000000 Binary files a/doc/content/integrations/other-integrations/lora-cloud/add-device.png and /dev/null differ diff --git a/doc/content/integrations/other-integrations/lora-cloud/copy-token.png b/doc/content/integrations/other-integrations/lora-cloud/copy-token.png deleted file mode 100644 index 5bc2c99c91..0000000000 Binary files a/doc/content/integrations/other-integrations/lora-cloud/copy-token.png and /dev/null differ diff --git a/doc/content/integrations/other-integrations/lora-cloud/create-token.png b/doc/content/integrations/other-integrations/lora-cloud/create-token.png deleted file mode 100644 index 2a61b86447..0000000000 Binary files a/doc/content/integrations/other-integrations/lora-cloud/create-token.png and /dev/null differ diff --git a/doc/content/integrations/other-integrations/lora-cloud/full-info.png b/doc/content/integrations/other-integrations/lora-cloud/full-info.png deleted file mode 100644 index 0028abd85a..0000000000 Binary files a/doc/content/integrations/other-integrations/lora-cloud/full-info.png and /dev/null differ diff --git a/doc/content/integrations/other-integrations/lora-cloud/geolocation-services.md b/doc/content/integrations/other-integrations/lora-cloud/geolocation-services.md deleted file mode 100644 index b469b8255d..0000000000 --- a/doc/content/integrations/other-integrations/lora-cloud/geolocation-services.md +++ /dev/null @@ -1,105 +0,0 @@ ---- -title: "LoRa Cloud Geolocation Services" -description: "" -weight: 2 -aliases: [/integrations/lora-cloud/geolocation-services, /integrations/lora-cloud/geolocation/] ---- - -[LoRa Cloud Geolocation Services](https://www.loracloud.com/portal/geolocation/home) provides simple JSON web APIs that can be easily integrated with a LoRaWAN network or application server to enable estimating the location of LoRa-based devices. - - - -In general, LoRa allows locating devices withing approximately 50m, without the need for a geolocation hardware module and no extra power consumption. Instead, the RSSI, SNR and TOA metadata that are being sent as part of your device's LoRa radio frames are used to estimate the location of your device. If your device can perform WiFi scans, scanning results can also be used to estimate your device's location. This yields a significant cost reduction compared to GPS. - -{{< note >}} Keep in mind that TOA is available only in metadata of gateways that have appropriate high-resolution time-stamping features. Therefore, your gateway needs to support this feature in order for you to be able to use TOA-based geolocation features. {{}} - -Also, LoRa Cloud Geolocation integration allows estimating the location of LR1110-based devices with transceiver firmware from their GNSS scans. - -Three query types are supported in scope of this integration and will be demonstrated below: - -- [LoRa TOA/RSSI](https://www.loracloud.com/documentation/geolocation?url=v3.html) - allows computing the location estimates using TOA and/or RSSI information from a single or multiple LoRa frames (for all LoRa devices) -- [GNSS](https://www.loracloud.com/documentation/geolocation?url=gnss.html) - location estimates are computed from the information contained in the GNSS scan result messages (NAV messages) (for LR1110 transceiver-based devices only) -- [TOA/WiFi](https://www.loracloud.com/documentation/geolocation?url=v2.html#singleframe-wi-fi-tdoa-request) - the initial device location estimation is performed using the scanned WiFi access points, but if this estimation is not valid, another estimation is performed based on TOA metadata from device's LoRa radio frames (for all LoRa devices capable of performing WiFi scans) - -{{< warning >}} It is important to know that you can obtain the location estimates using LoRa Cloud Geolocation LoRa TOA/RSSI query only if the uplink messages sent by your end device are picked up by at least 3 LoRaWAN gateways. If this is not the case, you will see no errors in {{% tts %}} Console, but you will not see the `Location solved` message containing the location estimation results either. {{}} - -The location of your gateway has to be publicly available for this integration, as it participates in the process of computing the end device location. This is disabled in {{% tts %}} by default, because the application (and end device) owner does not have be the one providing the gateway coverage. If you own the gateway, it is safe for you to explicitly allow to publish its location. - -To make the gateway location public, tick the **Gateway location → Public** box when [adding your gateway]({{< ref "/hardware/gateways/concepts/adding-gateways" >}}) in {{% tts %}} Console. - -If your gateway is already added in {{% tts %}} Console, go to your gateway's settings, navigate to the **Location** tab on the left hand menu and tick the **Privacy → Publish location** box. - -{{< note >}} Using Semtech's [Modem-E firmware](https://lora-developers.semtech.com/library/tech-papers-and-guides/understanding-lora-basics-modem-e/) is recommended for LR1110-based devices, hence using the [LoRa Cloud Modem Services integration]({{< ref "/integrations/other-integrations/lora-cloud/modem-services" >}}) instead of LoRa Cloud Geolocation is also recommended. {{}} - -Before proceding with this guide, make sure you have completed the [LoRa Cloud Setup]({{< ref "/integrations/other-integrations/lora-cloud/portal" >}}) guide. - -## Configure Geolocation Integration - -To setup LoRa Cloud Geolocation integration, navigate to your application in {{% tts %}}. - -On the left hand menu, select **Integrations → LoRa Cloud**. Click the **Expand** button next to the **Geolocation services**. - -Next, copy the token you previously created in LoRa Cloud Modem & Geolocation Services portal and paste it in the **Token** field. - -{{< figure src="../copy-token.png" alt="Copy the token from LoRa Cloud" >}} - -Choose the **Query type** depending on the type of data you want to use for estimating the location of your device. As mentioned earlier, you can choose **LoRa TOA/RSSI**, **GNSS** or **TOA/WiFi** query type. - -If you choose **LoRa TOA/RSSI**, you also have an option to enable **Multiframe** location lookups. Multiframe mode allows using the sequence of radio frames (instead of just a single frame) to improve the device's location estimation accuracy. Multiframe mode is reported to be more accurate than averaging multiple location results calculated from several single radio frames. If you choose multiframe mode, you can also set the **Multiframe window size** to tell how many historical messages should be sent as part of the final request, and **Multiframe time window** as the maximum age of considered historical messages. - -The setting for the Server URL points to the LoRa Cloud Modem & Geolocation Services and is set by default. Changing this is unnecessary. - -Finish by clicking the **Set token** button. - -{{< figure src="../paste-token-geolocation.png" alt="LoRa Cloud Geolocation integration" >}} - -## Obtain Location Solutions - -This section will show you how to obtain the location estimates using LoRa® TOA/RSSI, GNSS and TOA/WiFi query types. - -After you obtain the location results, you can further integrate your {{% tts %}} application with other third-party IoT platforms to visualize them, etc. - -### LoRa TOA/RSSI - -At this point, when your LoRa device sends any uplink message and it gets picked up by at least 3 gateways, you will notice the location estimation results present in the `Location solved` message in {{% tts %}} **Live data** tab, as shown below. - -{{< figure src="../toa-rssi.png" alt="LoRa TOA/RSSI location estimate" >}} - -Notice the `Source: LORA_RSSI_GEOLOCATION` which indicates the type of the query you chose for geolocation. - -{{< warning >}} Keep in mind that if your device's uplink message was not picked up by at least 3 gateways, you will not see the Location solved message in {{% tts %}} **Live data** view, but you will not see any errors either. {{}} - -### GNSS - -When your LR1110 transceiver performs a GNSS scan and sends the resulting data in an uplink NAV message, you will see the location estimate present in the `Location solved` message in {{% tts %}} **Live data** tab, as shown below. - -{{< figure src="../gnss.png" alt="GNSS location estimate" >}} - -Notice the `Source: GPS` which indicates the type of the query you chose for geolocation. - -{{< warning >}} For GNSS-based geolocation, the GNSS payload has to be valid. Otherwise, you will see an error similar to `Ignore invalid GNSS message payload: `. This is likely going to happen if you are not using LR1110-based device with transceiver firmware. {{}} - -### TOA/WiFi - -When your LoRa device performs a WiFi scan and sends a resulting uplink message, the payload contains the MAC addresses of WiFi adapters and RSSIs of scanned WiFi networks. You need to decode this payload using the [uplink payload formatter function]({{< ref "/integrations/payload-formatters/javascript" >}}) in a way that the `decoded_payload` object that is a part of the `uplink_message` contains the access point records, like so: - -```js -"decoded_payload": { - "access_points": [ - { - "bssid": "14:60:80:9a:19:58", - "rssi": -20 - }, - { - "bssid": "fc:f5:28:7b:07:e5", - "rssi": -80 - } - ] -} -``` - -If estimating the location based on WiFi access point records cannot be performed, the location will be estimated using the TOA information from LoRa radio metadata and gateway location. In both cases, you will see the location estimate present in the `Location solved` message in {{% tts %}} **Live data** tab, as shown below. - -{{< figure src="../toa-wifi.png" alt="TOA/WiFi location estimate" >}} - -Notice the `Source: WIFI_RSSI_GEOLOCATION` which indicates the type of the query you chose for geolocation. diff --git a/doc/content/integrations/other-integrations/lora-cloud/get-info.png b/doc/content/integrations/other-integrations/lora-cloud/get-info.png deleted file mode 100644 index 3ac8273043..0000000000 Binary files a/doc/content/integrations/other-integrations/lora-cloud/get-info.png and /dev/null differ diff --git a/doc/content/integrations/other-integrations/lora-cloud/gnss-assisted-scan-result.png b/doc/content/integrations/other-integrations/lora-cloud/gnss-assisted-scan-result.png deleted file mode 100644 index 4acf512186..0000000000 Binary files a/doc/content/integrations/other-integrations/lora-cloud/gnss-assisted-scan-result.png and /dev/null differ diff --git a/doc/content/integrations/other-integrations/lora-cloud/gnss.png b/doc/content/integrations/other-integrations/lora-cloud/gnss.png deleted file mode 100644 index b7128fd114..0000000000 Binary files a/doc/content/integrations/other-integrations/lora-cloud/gnss.png and /dev/null differ diff --git a/doc/content/integrations/other-integrations/lora-cloud/modem-services.md b/doc/content/integrations/other-integrations/lora-cloud/modem-services.md deleted file mode 100644 index c6d72392a7..0000000000 --- a/doc/content/integrations/other-integrations/lora-cloud/modem-services.md +++ /dev/null @@ -1,97 +0,0 @@ ---- -title: "LoRa Cloud Modem Services" -description: "" -weight: 3 -aliases: [/integrations/lora-cloud/modem-services] ---- - -[LoRa Cloud Modem Services](https://www.loracloud.com/portal/device_management/home) complement your device management solution by giving you fine grain control of your LoRaWAN® end devices. It allows to obtain modem status information such as: system status, firmware version, voltage, downlink signal quality and time since last downlink. - - - -LoRa Cloud Modem Services protocol lets you manage common device functionality at the application layer for all LoRa-based devices, and manage geolocation for modem-based devices (like [LoRa Edge LR1110 Solution](https://www.loracloud.com/documentation/device_management?url=overview.html#lora-edge-lr1110-solution)). These services also provide protocols for reliable application data reception from all Semtech's LoRaWAN-compatible devices, with efficient techniques to fight against packet loss. - -In general, LoRa Cloud Modem Services do not interact directly with network servers to retrieve uplinks or schedule downlinks, so it is usually users's responsibility to forward uplinks towards and schedule downlinks from LoRa Cloud as a part of the response. - -However, when it comes to geolocation for modem-based devices, {{% tts %}} integration with LoRa Cloud Modem Services handles this on behalf of the user, i.e. it queries the protocol engine on LoRa Cloud in order to retrieve the response. This way, after the integration is configured and the uplink message containing scanning result is sent from the device, the user only has to monitor results in {{% tts %}}. - -Before proceding with this guide, make sure you have completed the [LoRa Cloud Setup]({{< ref "/integrations/other-integrations/lora-cloud/portal" >}}) guide. - -## Configure LoRa Cloud Modem Services Integration - -To setup LoRa Cloud Modem Services integration, navigate to your application in {{% tts %}}. - -On the left hand menu, select **Integrations → LoRa Cloud**. Click the **Expand** button next to the **Modem Services**. - -Next, copy the token you previously created in LoRa Cloud Modem & Geolocation Services portal and paste it in the **Token** field. - -{{< figure src="../copy-token.png" alt="Copy the token from LoRa Cloud" >}} - -Finish by clicking the **Set token** button. - -{{< figure src="../paste-token-modem.png" alt="Paste the token in The Things Stack" >}} - -## Obtain Location Solutions - -For LR1110 modem-based devices, location of the device can be estimated using Wi-Fi, assisted GNSS and autonomous GNSS scans. This section will show you how to obtain the location estimates using Wi-Fi and assisted GNSS scans. - -{{< note >}} Please keep in mind that this guide does not refer to LoRa Cloud Geolocation. In case you are looking for geolocation solutions that use RSSI and TOA metadata, or you are using LR1110-based device with transceiver firmware (instead of Modem-E firmware), you should follow the [LoRa Cloud Geolocation guide]({{< ref "/integrations/other-integrations/lora-cloud/geolocation-services" >}}). {{}} - -{{< note >}} The number of (useful) satellites detected when running the autonomous GNSS scan might not be enough to calculate the position of your device, so we will not include that case in this guide. However, if you want to read more about it, follow [this guide](https://lora-developers.semtech.com/learning-center/hands-on-labs/build-end-to-end-solution-using-lorawan-and-loraedge/find-the-location-of-your-tracking-device/#run-an-autonomous-gnss-scan-and-send-results). {{}} - -After you obtain the location results, you can further integrate your {{% tts %}} application with other third-party IoT platforms to visualize them, etc. - -### Wi-Fi Scans - -To learn how to perform Wi-Fi scans with LoRa Edge LR1110 device, follow [this guide](https://lora-developers.semtech.com/learning-center/hands-on-labs/build-end-to-end-solution-using-lorawan-and-loraedge/find-the-location-of-your-tracking-device/#run-a-wi-fi-scan-and-send-results). - -At this point, when your device performs a Wi-Fi scan and sends the resulting data in an uplink message, you will notice the location estimation results present in the `Location solved` message in {{% tts %}} **Live data** tab, as shown below. - -{{< figure src="../wifi-scan-result.png" alt="Location estimation result from a WiFi scan" >}} - -Notice the `Source: WIFI_RSSI_GEOLOCATION` which indicates the type of scan your device is performing. - -{{< warning >}} Keep in mind that the Wi-Fi triangulation is performed here, so you will be able to obtain location estimates only if your device's Wi-Fi scan resulted in 3 or more MAC addresses. If this is not the case, you will not see the `Location solved` message in {{% tts %}} **Live data** view, but you will not see any errors either. {{}} - -### Assisted GNSS Scans - -To learn how to perform GNSS assisted scans with LoRa Edge LR1110 device, follow [this guide](https://lora-developers.semtech.com/learning-center/hands-on-labs/build-end-to-end-solution-using-lorawan-and-loraedge/find-the-location-of-your-tracking-device/#configure-and-run-an-assisted-gnss-scan-and-send-results). - -{{< note >}} Keep in mind that in order to perform an assisted GNSS scan, you have to provide the approximate location coordinates to the LoRa Edge LR1110 device. {{}} - -Same as in the subsection above, when your device performs an assisted GNSS scan and sends the associated data in an uplink message, you will notice the location estimation results present in the `Location solved` message in {{% tts %}} **Live data** tab, as shown below. - -{{< figure src="../gnss-assisted-scan-result.png" alt="Location estimation result from an assisted GNSS scan" >}} - -Notice the `Source: GPS` which indicates the type of scan your device is performing. - -{{< warning >}} The device's active GNSS antenna should be placed outdoors in order to be able to detect as much satellites as possible. - -If you do not receive the `Location solved` message, it is possible that LoRa Cloud GNSS solver could not resolve your device's location. To verify, check the `log_messages` object in the `Service data` messages. You might see errors such as: - -- `Not enough received or usable satellites, totalReceived=4, usableGPS=3, usableBDS=0` if there is too few detected and/or usable satellites -- `Location fix dropped due to poor accuracy, caused most likely by big error in pseudo-ranges or timestamp` if the accuracy of the resulting location is too low - -If you are facing these errors, keep repeating the scan and re-sending results periodically until GNSS solver manages to resolve your device's location. Be aware that there is a high chance your device's battery will drain much faster if you are frequently repeating these steps. {{}} - -## Send Requests from LoRa Cloud - -Besides estimating the location of your device, you can also send requests from LoRa Cloud portal to mute or reset the device, trigger it for a re-join, set ADR profile or obtain information like temperature, voltage, signal strength, status, etc. In this section, we demonstrate how to send a request to obtain information from your device. - -To send a request, navigate to **Manage devices** on the left hand menu in the LoRa Cloud Modem Services portal. - -Click on the **Send requests** button. - -{{< figure src="../send-requests.png" alt="Send requests from LoRa Cloud portal" >}} - -Enter your device's EUI in the **EUI(S)** field and choose **Get Info** as a **Request type**. Tick the boxes next to the information you want to obtain from your device. - -Schedule the request to be sent by clicking the **Send requests** button. - -{{< figure src="../get-info.png" alt="Get Info request" >}} - -After a few moments, click on a reload button to refresh the device information in the **Manage devices** view. You can already see that the **Status** is changed to **Joined: Yes**, as well as the time of the **Last Uplink**, **Signal RSSI** and **Signal SNR**. - -Click the **>** button next to your device to see all the information that was obtained from the device. - -{{< figure src="../full-info.png" alt="Show full info" >}} diff --git a/doc/content/integrations/other-integrations/lora-cloud/paste-token-geolocation.png b/doc/content/integrations/other-integrations/lora-cloud/paste-token-geolocation.png deleted file mode 100644 index 402699a6fb..0000000000 Binary files a/doc/content/integrations/other-integrations/lora-cloud/paste-token-geolocation.png and /dev/null differ diff --git a/doc/content/integrations/other-integrations/lora-cloud/paste-token-modem.png b/doc/content/integrations/other-integrations/lora-cloud/paste-token-modem.png deleted file mode 100644 index e0a0183184..0000000000 Binary files a/doc/content/integrations/other-integrations/lora-cloud/paste-token-modem.png and /dev/null differ diff --git a/doc/content/integrations/other-integrations/lora-cloud/portal.md b/doc/content/integrations/other-integrations/lora-cloud/portal.md deleted file mode 100644 index d36020982a..0000000000 --- a/doc/content/integrations/other-integrations/lora-cloud/portal.md +++ /dev/null @@ -1,26 +0,0 @@ ---- -title: "LoRa Cloud Setup" -description: "" -weight: 1 -aliases: [/integrations/lora-cloud/portal] ---- - -Before connecting your device to {{% tts %}} you need to set up the [LoRa Cloud portal](https://www.loracloud.com/portal) by creating an API token. - - - -## LoRa Cloud Portal Setup - -On the [LoRa Cloud portal](https://www.loracloud.com/portal), navigate to **Modem & Geolocation Services**. - -{{< figure src="../portal.png" alt="LoRa Cloud Modem & Geolocation Services" >}} - -Choose **Manage tokens** on the left hand menu. Click the **Create new token** button. - -Give the name to your token and tick the boxes next to permissions you wish to allow for it. Click the **Create new token** button to finish. A user can decide to restrict some permissions. On the image below, all permissions are allowed for the sake of simplicity of this guide. - -{{< figure src="../create-token.png" alt="Creating a token" >}} - -To add a new device, choose **Manage devices** on the left hand menu and click the **Add devices** button. You only need to provide the device EUI as shown on the image below. - -{{< figure src="../add-device.png" alt="Adding a new device" >}} diff --git a/doc/content/integrations/other-integrations/lora-cloud/portal.png b/doc/content/integrations/other-integrations/lora-cloud/portal.png deleted file mode 100644 index 816f581c0a..0000000000 Binary files a/doc/content/integrations/other-integrations/lora-cloud/portal.png and /dev/null differ diff --git a/doc/content/integrations/other-integrations/lora-cloud/send-requests.png b/doc/content/integrations/other-integrations/lora-cloud/send-requests.png deleted file mode 100644 index 87c7ac1da6..0000000000 Binary files a/doc/content/integrations/other-integrations/lora-cloud/send-requests.png and /dev/null differ diff --git a/doc/content/integrations/other-integrations/lora-cloud/toa-rssi.png b/doc/content/integrations/other-integrations/lora-cloud/toa-rssi.png deleted file mode 100644 index 7105b6bd7e..0000000000 Binary files a/doc/content/integrations/other-integrations/lora-cloud/toa-rssi.png and /dev/null differ diff --git a/doc/content/integrations/other-integrations/lora-cloud/toa-wifi.png b/doc/content/integrations/other-integrations/lora-cloud/toa-wifi.png deleted file mode 100644 index 9a0a68654f..0000000000 Binary files a/doc/content/integrations/other-integrations/lora-cloud/toa-wifi.png and /dev/null differ diff --git a/doc/content/integrations/other-integrations/lora-cloud/token-creation.png b/doc/content/integrations/other-integrations/lora-cloud/token-creation.png deleted file mode 100644 index ce1a5dd5b3..0000000000 Binary files a/doc/content/integrations/other-integrations/lora-cloud/token-creation.png and /dev/null differ diff --git a/doc/content/integrations/other-integrations/lora-cloud/wifi-scan-result.png b/doc/content/integrations/other-integrations/lora-cloud/wifi-scan-result.png deleted file mode 100644 index 9eed5b7248..0000000000 Binary files a/doc/content/integrations/other-integrations/lora-cloud/wifi-scan-result.png and /dev/null differ diff --git a/doc/content/ttn-lw-cli/ttn-lw-cli_authentication-providers_create.md b/doc/content/ttn-lw-cli/ttn-lw-cli_authentication-providers_create.md index c95103fc0d..735b472738 100644 --- a/doc/content/ttn-lw-cli/ttn-lw-cli_authentication-providers_create.md +++ b/doc/content/ttn-lw-cli/ttn-lw-cli_authentication-providers_create.md @@ -14,14 +14,15 @@ ttn-lw-cli authentication-providers create [provider-id] [flags] ### Options ``` - --allow-registrations - --allowed-email-domains strings - --configuration.provider.oidc.client-id string - --configuration.provider.oidc.client-secret string - --configuration.provider.oidc.provider-url string - -h, --help help for create - --name string - --provider-id string + --allow-registrations + --allowed-email-domains strings + --configuration.provider.oidc.client-id string + --configuration.provider.oidc.client-secret string + --configuration.provider.oidc.preferred-response-type string + --configuration.provider.oidc.provider-url string + -h, --help help for create + --name string + --provider-id string ``` ### Options inherited from parent commands diff --git a/doc/content/ttn-lw-cli/ttn-lw-cli_authentication-providers_get.md b/doc/content/ttn-lw-cli/ttn-lw-cli_authentication-providers_get.md index 1f9db3aa63..cc51bce6a0 100644 --- a/doc/content/ttn-lw-cli/ttn-lw-cli_authentication-providers_get.md +++ b/doc/content/ttn-lw-cli/ttn-lw-cli_authentication-providers_get.md @@ -14,16 +14,17 @@ ttn-lw-cli authentication-providers get [provider-id] [flags] ### Options ``` - --allow-registrations select the allow_registrations field - --allowed-email-domains select the allowed_email_domains field - --configuration select the configuration field and all allowed sub-fields - --configuration.provider.oidc select the configuration.provider.oidc field and all allowed sub-fields - --configuration.provider.oidc.client-id select the configuration.provider.oidc.client_id field - --configuration.provider.oidc.client-secret select the configuration.provider.oidc.client_secret field - --configuration.provider.oidc.provider-url select the configuration.provider.oidc.provider_url field - -h, --help help for get - --name select the name field - --provider-id string + --allow-registrations select the allow_registrations field + --allowed-email-domains select the allowed_email_domains field + --configuration select the configuration field and all allowed sub-fields + --configuration.provider.oidc select the configuration.provider.oidc field and all allowed sub-fields + --configuration.provider.oidc.client-id select the configuration.provider.oidc.client_id field + --configuration.provider.oidc.client-secret select the configuration.provider.oidc.client_secret field + --configuration.provider.oidc.preferred-response-type select the configuration.provider.oidc.preferred_response_type field + --configuration.provider.oidc.provider-url select the configuration.provider.oidc.provider_url field + -h, --help help for get + --name select the name field + --provider-id string ``` ### Options inherited from parent commands diff --git a/doc/content/ttn-lw-cli/ttn-lw-cli_authentication-providers_list.md b/doc/content/ttn-lw-cli/ttn-lw-cli_authentication-providers_list.md index 74ab544e8d..59b77a4e62 100644 --- a/doc/content/ttn-lw-cli/ttn-lw-cli_authentication-providers_list.md +++ b/doc/content/ttn-lw-cli/ttn-lw-cli_authentication-providers_list.md @@ -14,18 +14,19 @@ ttn-lw-cli authentication-providers list [flags] ### Options ``` - --allow-registrations select the allow_registrations field - --allowed-email-domains select the allowed_email_domains field - --configuration select the configuration field and all allowed sub-fields - --configuration.provider.oidc select the configuration.provider.oidc field and all allowed sub-fields - --configuration.provider.oidc.client-id select the configuration.provider.oidc.client_id field - --configuration.provider.oidc.client-secret select the configuration.provider.oidc.client_secret field - --configuration.provider.oidc.provider-url select the configuration.provider.oidc.provider_url field - -h, --help help for list - --limit uint32 maximum number of results to get (default 50) - --name select the name field - --order string order by this field - --page uint32 results page number (default 1) + --allow-registrations select the allow_registrations field + --allowed-email-domains select the allowed_email_domains field + --configuration select the configuration field and all allowed sub-fields + --configuration.provider.oidc select the configuration.provider.oidc field and all allowed sub-fields + --configuration.provider.oidc.client-id select the configuration.provider.oidc.client_id field + --configuration.provider.oidc.client-secret select the configuration.provider.oidc.client_secret field + --configuration.provider.oidc.preferred-response-type select the configuration.provider.oidc.preferred_response_type field + --configuration.provider.oidc.provider-url select the configuration.provider.oidc.provider_url field + -h, --help help for list + --limit uint32 maximum number of results to get (default 50) + --name select the name field + --order string order by this field + --page uint32 results page number (default 1) ``` ### Options inherited from parent commands diff --git a/doc/content/ttn-lw-cli/ttn-lw-cli_authentication-providers_update.md b/doc/content/ttn-lw-cli/ttn-lw-cli_authentication-providers_update.md index 629fc2e482..84bbbd3d4f 100644 --- a/doc/content/ttn-lw-cli/ttn-lw-cli_authentication-providers_update.md +++ b/doc/content/ttn-lw-cli/ttn-lw-cli_authentication-providers_update.md @@ -14,15 +14,16 @@ ttn-lw-cli authentication-providers update [provider-id] [flags] ### Options ``` - --allow-registrations - --allowed-email-domains strings - --configuration.provider.oidc.client-id string - --configuration.provider.oidc.client-secret string - --configuration.provider.oidc.provider-url string - -h, --help help for update - --name string - --provider-id string - --unset strings list of fields to unset + --allow-registrations + --allowed-email-domains strings + --configuration.provider.oidc.client-id string + --configuration.provider.oidc.client-secret string + --configuration.provider.oidc.preferred-response-type string + --configuration.provider.oidc.provider-url string + -h, --help help for update + --name string + --provider-id string + --unset strings list of fields to unset ``` ### Options inherited from parent commands diff --git a/doc/content/ttn-lw-cli/ttn-lw-cli_end-devices_list-bands.md b/doc/content/ttn-lw-cli/ttn-lw-cli_end-devices_list-bands.md index 71a92dd0cc..712d06cc4f 100644 --- a/doc/content/ttn-lw-cli/ttn-lw-cli_end-devices_list-bands.md +++ b/doc/content/ttn-lw-cli/ttn-lw-cli_end-devices_list-bands.md @@ -15,6 +15,7 @@ ttn-lw-cli end-devices list-bands [flags] ``` --band-id string + --custom-bands -h, --help help for list-bands --phy-version string allowed values: PHY_UNKNOWN, unknown, 1.0, 1.0.0, PHY_V1_0, TS001_V1_0, V1_0, 1.0.1, PHY_V1_0_1, TS001_V1_0_1, V1_0_1, 1.0.2, 1.0.2-a, PHY_V1_0_2_REV_A, RP001_V1_0_2, V1_0_2, V1_0_2_REV_A, 1.0.2-b, PHY_V1_0_2_REV_B, RP001_V1_0_2_REV_B, V1_0_2_REV_B, 1.1-a, 1.1.0-a, PHY_V1_1_REV_A, RP001_V1_1_REV_A, V1_1_REV_A, 1.1-b, 1.1.0-b, PHY_V1_1_REV_B, RP001_V1_1_REV_B, V1_1_REV_B, 1.0.3-a, PHY_V1_0_3_REV_A, RP001_V1_0_3_REV_A, V1_0_3_REV_A, RP002_V1_0_0, RP002_V1_0_1, RP002_V1_0_2, RP002_V1_0_3, RP002_V1_0_4 ``` diff --git a/doc/content/ttn-lw-cli/ttn-lw-cli_end-devices_list-phy-versions.md b/doc/content/ttn-lw-cli/ttn-lw-cli_end-devices_list-phy-versions.md index 54f46e4bac..7f6f8a47da 100644 --- a/doc/content/ttn-lw-cli/ttn-lw-cli_end-devices_list-phy-versions.md +++ b/doc/content/ttn-lw-cli/ttn-lw-cli_end-devices_list-phy-versions.md @@ -15,6 +15,7 @@ ttn-lw-cli end-devices list-phy-versions [flags] ``` --band-id string + --custom-bands -h, --help help for list-phy-versions ``` diff --git a/doc/content/whats-new/3.34.2.md b/doc/content/whats-new/3.34.2.md new file mode 100644 index 0000000000..2555b0dd3f --- /dev/null +++ b/doc/content/whats-new/3.34.2.md @@ -0,0 +1,46 @@ +--- +date: 2025-08-04T11:10:12Z +title: "3.34.2" +featured: + { + added: + [ + Support to associate/disassociate MAC settings profiles to batch of end devices, + Show normalized payload in the Console, + "Introduced a backoff mechanism to the CLI device import process, allowing imports to exceed the default rate limit", + Support for selecting the preferred `response_type` used with the configured authentication provider, + ], + changed: [Improve error messages when claiming a managed gateway], + fixed: + [ + Network Operations Center no longer returns zero in the `x-total-count` header, + Improve query performance of label related requests envolving end devices, + Searching users in User management in the Console, + CLI no longer causes a panic when running from a docker container in a Linux machine, + ], + } +--- + +### Added + +- Support to associate/disassociate MAC settings profiles to batch of end devices + - This feature is experimental and subject to change. +- Show normalized payload in the Console. +- New modal in the gateway overview page for simplifying creation of API keys in the Console. +- Introduced a backoff mechanism to the CLI device import process, allowing imports to exceed the default rate limit. +- Added support for selecting the preferred `response_type` used with the configured authentication provider. + - Configure this via the `--oidc.preferred-response-type` flag in the create-auth-provider tti-lw-stack command. + - If unset, the default is either `code id_token` or `code`, depending on provider compatibility. + +### Changed + +- Improve error messages when claiming a managed gateway. + +### Fixed + +- Network Operations Center no longer returns zero in the `x-total-count` header. + - This previously only happened in gateway traffic rates query. +- Improve query performance of label related requests envolving end devices. + - This previously caused timeouts if the number of end-devices using labels was too large. +- Fixed searching users in User management in the Console. +- CLI no longer causes a panic when running from a docker container in a Linux machine. diff --git a/doc/data/api/tti.lorawan.v3/messages/AuthenticationProvider.OIDC.yml b/doc/data/api/tti.lorawan.v3/messages/AuthenticationProvider.OIDC.yml index 35e8f9e503..94749297bf 100644 --- a/doc/data/api/tti.lorawan.v3/messages/AuthenticationProvider.OIDC.yml +++ b/doc/data/api/tti.lorawan.v3/messages/AuthenticationProvider.OIDC.yml @@ -11,3 +11,17 @@ fields: rules: uri: true default: "" +- name: preferred_response_type + type: string + rules: + in: + - "" + - code + - token + - id_token + - code token + - code id_token + - id_token code + - id_token token + - code id_token token + default: "" diff --git a/doc/data/api/tti.lorawan.v3/messages/Label.yml b/doc/data/api/tti.lorawan.v3/messages/Label.yml index 6b7e5b4cc9..c4997f86fc 100644 --- a/doc/data/api/tti.lorawan.v3/messages/Label.yml +++ b/doc/data/api/tti.lorawan.v3/messages/Label.yml @@ -23,7 +23,9 @@ fields: - name: name type: string rules: - max_len: 50 + min_len: 3 + max_len: 36 + pattern: '^[a-zA-Z0-9]+(?: [a-zA-Z0-9\-]+)?$' default: "" - name: description type: string diff --git a/doc/data/api/ttn.lorawan.v3/messages/BatchSetMACSettingsProfileRequest.yml b/doc/data/api/ttn.lorawan.v3/messages/BatchSetMACSettingsProfileRequest.yml new file mode 100644 index 0000000000..7401378a9d --- /dev/null +++ b/doc/data/api/ttn.lorawan.v3/messages/BatchSetMACSettingsProfileRequest.yml @@ -0,0 +1,22 @@ +name: BatchSetMACSettingsProfileRequest +fields: +- name: application_ids + message: + name: ApplicationIdentifiers + rules: + required: true + default: {} +- name: mac_settings_profile_ids + message: + name: MACSettingsProfileIdentifiers + default: {} +- name: device_ids + rules: + min_items: 1 + max_items: 20 + repeated: + type: string + rules: + max_len: 36 + pattern: ^[a-z0-9](?:[-]?[a-z0-9]){2,}$ + default: [] diff --git a/doc/data/api/ttn.lorawan.v3/messages/GetPhyVersionsRequest.yml b/doc/data/api/ttn.lorawan.v3/messages/GetPhyVersionsRequest.yml index 2a1795a885..667eb86d47 100644 --- a/doc/data/api/ttn.lorawan.v3/messages/GetPhyVersionsRequest.yml +++ b/doc/data/api/ttn.lorawan.v3/messages/GetPhyVersionsRequest.yml @@ -6,3 +6,7 @@ fields: If unused, all supported Bands and their versions are returned. type: string default: "" +- name: custom_bands + comment: Optional field to include custom bands too. + type: bool + default: false diff --git a/doc/data/api/ttn.lorawan.v3/messages/ListBandsRequest.yml b/doc/data/api/ttn.lorawan.v3/messages/ListBandsRequest.yml index cb7dd7ceb2..bea5e6c7b3 100644 --- a/doc/data/api/ttn.lorawan.v3/messages/ListBandsRequest.yml +++ b/doc/data/api/ttn.lorawan.v3/messages/ListBandsRequest.yml @@ -15,3 +15,7 @@ fields: rules: defined_only: true default: PHY_UNKNOWN +- name: custom_bands + comment: Optional field to include custom bands too. + type: bool + default: false diff --git a/doc/data/api/ttn.lorawan.v3/services/NsEndDeviceBatchRegistry.yml b/doc/data/api/ttn.lorawan.v3/services/NsEndDeviceBatchRegistry.yml index 2a31c2a0cd..4e2c8c31e7 100644 --- a/doc/data/api/ttn.lorawan.v3/services/NsEndDeviceBatchRegistry.yml +++ b/doc/data/api/ttn.lorawan.v3/services/NsEndDeviceBatchRegistry.yml @@ -16,3 +16,13 @@ methods: http: - method: DELETE path: /ns/applications/{application_ids.application_id}/devices/batch + SetMACSettingsProfile: + name: SetMACSettingsProfile + comment: Set the MAC settings profile for a batch of end devices. + input: + name: BatchSetMACSettingsProfileRequest + output: + name: EndDevices + http: + - method: POST + path: /ns/applications/{application_ids.application_id}/devices/mac_settings_profile/batch diff --git a/doc/data/api/tts.swagger.json b/doc/data/api/tts.swagger.json index b23cb386fe..54430413f8 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.34.1" + "version": "3.34.2" }, "paths": { "/alerts/notifications/profiles": { @@ -192591,6 +192591,9 @@ "client_secret": { "type": "string" }, + "preferred_response_type": { + "type": "string" + }, "provider_url": { "type": "string" } @@ -192692,6 +192695,9 @@ "client_secret": { "type": "string" }, + "preferred_response_type": { + "type": "string" + }, "provider_url": { "type": "string" } @@ -192752,6 +192758,9 @@ "client_secret": { "type": "string" }, + "preferred_response_type": { + "type": "string" + }, "provider_url": { "type": "string" } @@ -192989,6 +192998,9 @@ "client_secret": { "type": "string" }, + "preferred_response_type": { + "type": "string" + }, "provider_url": { "type": "string" } @@ -193098,6 +193110,9 @@ "client_secret": { "type": "string" }, + "preferred_response_type": { + "type": "string" + }, "provider_url": { "type": "string" } @@ -193153,6 +193168,9 @@ "client_secret": { "type": "string" }, + "preferred_response_type": { + "type": "string" + }, "provider_url": { "type": "string" } @@ -196469,6 +196487,12 @@ "description": "Optional PHY version to filter the results.\nIf unused, all supported versions are returned.", "name": "phy_version", "in": "query" + }, + { + "type": "boolean", + "description": "Optional field to include custom bands too.", + "name": "custom_bands", + "in": "query" } ], "responses": { @@ -197007,6 +197031,12 @@ "description": "Optional PHY version to filter the results.\nIf unused, all supported versions are returned.", "name": "phy_version", "in": "query" + }, + { + "type": "boolean", + "description": "Optional field to include custom bands too.", + "name": "custom_bands", + "in": "query" } ], "responses": { @@ -197545,6 +197575,12 @@ "name": "phy_version", "in": "path", "required": true + }, + { + "type": "boolean", + "description": "Optional field to include custom bands too.", + "name": "custom_bands", + "in": "query" } ], "responses": { @@ -198148,6 +198184,12 @@ "description": "Optional Band ID to filter the results.\nIf unused, all supported Bands and their versions are returned.", "name": "band_id", "in": "query" + }, + { + "type": "boolean", + "description": "Optional field to include custom bands too.", + "name": "custom_bands", + "in": "query" } ], "responses": { @@ -362876,14 +362918,13 @@ } } }, - "/ns/applications/{application_ids.application_id}/devices/{device_id}": { - "delete": { - "description": "If there are multiple matches, an error will be returned.", + "/ns/applications/{application_ids.application_id}/devices/mac_settings_profile/batch": { + "post": { "tags": [ - "NsEndDeviceRegistry" + "NsEndDeviceBatchRegistry" ], - "summary": "Delete deletes the device that matches the given identifiers.", - "operationId": "NsEndDeviceRegistry_Delete", + "summary": "Set the MAC settings profile for a batch of end devices.", + "operationId": "NsEndDeviceBatchRegistry_SetMACSettingsProfile", "parameters": [ { "type": "string", @@ -362892,112 +362933,41 @@ "required": true }, { - "type": "string", - "name": "device_id", - "in": "path", - "required": true - }, - { - "type": "string", - "format": "string", - "description": "The LoRaWAN DevEUI.", - "name": "dev_eui", - "in": "query" - }, - { - "type": "string", - "format": "string", - "description": "The LoRaWAN JoinEUI (AppEUI until LoRaWAN 1.0.3 end devices).", - "name": "join_eui", - "in": "query" - }, - { - "type": "string", - "format": "string", - "description": "The LoRaWAN DevAddr.", - "name": "dev_addr", - "in": "query" - } - ], - "responses": { - "200": { - "description": "A successful response.", - "schema": { - "type": "object" - } - }, - "default": { - "description": "An unexpected error response.", + "name": "body", + "in": "body", + "required": true, "schema": { "type": "object", "properties": { - "code": { - "type": "integer", - "format": "int32" + "application_ids": { + "type": "object" }, - "details": { + "device_ids": { "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" + "type": "string" + } + }, + "mac_settings_profile_ids": { + "type": "object", + "properties": { + "application_ids": { + "type": "object", + "properties": { + "application_id": { + "type": "string" + } } }, - "additionalProperties": {} + "profile_id": { + "description": "Profile ID.", + "type": "string" + } } - }, - "message": { - "type": "string" } } } } - } - } - }, - "/ns/applications/{application_ids.application_id}/mac_settings_profiles": { - "get": { - "tags": [ - "NsMACSettingsProfileRegistry" - ], - "summary": "List lists the MAC settings profiles.", - "operationId": "NsMACSettingsProfileRegistry_List", - "parameters": [ - { - "type": "string", - "name": "application_ids.application_id", - "in": "path", - "required": true - }, - { - "type": "string", - "description": "The names of the fields that should be returned.", - "name": "field_mask", - "in": "query" - }, - { - "type": "string", - "description": "Order the results by this field path (must be present in the field mask).\nDefault ordering is by ID. Prepend with a minus (-) to reverse the order.", - "name": "order", - "in": "query" - }, - { - "type": "integer", - "format": "int64", - "description": "Limit the number of results per page.", - "name": "limit", - "in": "query" - }, - { - "type": "integer", - "format": "int64", - "description": "Page number for pagination. 0 is interpreted as 1.", - "name": "page", - "in": "query" - } ], "responses": { "200": { @@ -363005,16 +362975,111 @@ "schema": { "type": "object", "properties": { - "mac_settings_profiles": { - "description": "The MAC settings profiles.", + "end_devices": { "type": "array", "items": { + "description": "Defines an End Device registration and its state on the network.\nThe persistence of the EndDevice is divided between the Network Server, Application Server and Join Server.\nSDKs are responsible for combining (if desired) the three.", "type": "object", "properties": { - "end_devices_count": { - "description": "Associated end devices counter.", + "activated_at": { + "description": "Timestamp when the device has been activated. Stored in the Entity Registry.\nThis field is set by the Application Server when an end device sends\nits first uplink.\nThe Application Server will use the field in order to avoid repeated\ncalls to the Entity Registry.\nThe field cannot be unset once set.", + "type": "string", + "format": "date-time" + }, + "application_server_address": { + "description": "The address of the Application Server where this device is supposed to be registered.\nStored in Entity Registry and Join Server.\nThe typical format of the address is \"host:port\". If the port is omitted,\nthe normal port inference (with DNS lookup, otherwise defaults) is used.\nThe connection shall be established with transport layer security (TLS).\nCustom certificate authorities may be configured out-of-band.", + "type": "string" + }, + "application_server_id": { + "description": "The AS-ID of the Application Server to use.\nStored in Join Server.", + "type": "string" + }, + "application_server_kek_label": { + "description": "The KEK label of the Application Server to use for wrapping the application session key.\nStored in Join Server.", + "type": "string" + }, + "attributes": { + "description": "Key-value attributes for this end device. Typically used for organizing end devices or for storing integration-specific data. Stored in Entity Registry.", + "type": "object", + "additionalProperties": { + "type": "string" + } + }, + "battery_percentage": { + "description": "Latest-known battery percentage of the device.\nReceived via the DevStatus MAC command at last_dev_status_received_at or earlier.\nStored in Network Server.", + "type": "number", + "format": "float" + }, + "claim_authentication_code": { + "description": "Authentication code for end devices.", + "type": "object", + "properties": { + "valid_from": { + "type": "string", + "format": "date-time" + }, + "valid_to": { + "type": "string", + "format": "date-time" + }, + "value": { + "type": "string" + } + } + }, + "created_at": { + "type": "string", + "format": "date-time" + }, + "description": { + "description": "Description of the device. Stored in Entity Registry.", + "type": "string" + }, + "downlink_margin": { + "description": "Demodulation signal-to-noise ratio (dB).\nReceived via the DevStatus MAC command at last_dev_status_received_at.\nStored in Network Server.", "type": "integer", - "format": "int64" + "format": "int32" + }, + "formatters": { + "type": "object", + "properties": { + "down_formatter": { + "description": " - FORMATTER_NONE: No payload formatter to work with raw payload only.\n - FORMATTER_REPOSITORY: Use payload formatter for the end device type from a repository.\n - FORMATTER_GRPC_SERVICE: gRPC service payload formatter. The parameter is the host:port of the service.\n - FORMATTER_JAVASCRIPT: Custom payload formatter that executes Javascript code. The parameter is a JavaScript filename.\n - FORMATTER_CAYENNELPP: CayenneLPP payload formatter.\n\nMore payload formatters can be added.", + "type": "string", + "default": "FORMATTER_NONE", + "enum": [ + "FORMATTER_NONE", + "FORMATTER_REPOSITORY", + "FORMATTER_GRPC_SERVICE", + "FORMATTER_JAVASCRIPT", + "FORMATTER_CAYENNELPP" + ] + }, + "down_formatter_parameter": { + "description": "Parameter for the down_formatter, must be set together. The API enforces a maximum length of 16KB, but the size may be restricted further by deployment configuration.", + "type": "string" + }, + "up_formatter": { + "description": " - FORMATTER_NONE: No payload formatter to work with raw payload only.\n - FORMATTER_REPOSITORY: Use payload formatter for the end device type from a repository.\n - FORMATTER_GRPC_SERVICE: gRPC service payload formatter. The parameter is the host:port of the service.\n - FORMATTER_JAVASCRIPT: Custom payload formatter that executes Javascript code. The parameter is a JavaScript filename.\n - FORMATTER_CAYENNELPP: CayenneLPP payload formatter.\n\nMore payload formatters can be added.", + "type": "string", + "default": "FORMATTER_NONE", + "enum": [ + "FORMATTER_NONE", + "FORMATTER_REPOSITORY", + "FORMATTER_GRPC_SERVICE", + "FORMATTER_JAVASCRIPT", + "FORMATTER_CAYENNELPP" + ] + }, + "up_formatter_parameter": { + "description": "Parameter for the up_formatter, must be set together. The API enforces a maximum length of 16KB, but the size may be restricted further by deployment configuration.", + "type": "string" + } + } + }, + "frequency_plan_id": { + "description": "ID of the frequency plan used by this device.\nCopied on creation from template identified by version_ids, if any or from the home Network Server device profile, if any.", + "type": "string" }, "ids": { "type": "object", @@ -363027,8 +363092,12851 @@ } } }, - "profile_id": { - "description": "Profile ID.", + "dev_addr": { + "description": "The LoRaWAN DevAddr.", + "type": "string", + "format": "string", + "example": "2600ABCD" + }, + "dev_eui": { + "description": "The LoRaWAN DevEUI.", + "type": "string", + "format": "string", + "example": "70B3D57ED000ABCD" + }, + "device_id": { + "type": "string" + }, + "join_eui": { + "description": "The LoRaWAN JoinEUI (AppEUI until LoRaWAN 1.0.3 end devices).", + "type": "string", + "format": "string", + "example": "70B3D57ED000ABCD" + } + } + }, + "join_server_address": { + "description": "The address of the Join Server where this device is supposed to be registered.\nStored in Entity Registry.\nThe typical format of the address is \"host:port\". If the port is omitted,\nthe normal port inference (with DNS lookup, otherwise defaults) is used.\nThe connection shall be established with transport layer security (TLS).\nCustom certificate authorities may be configured out-of-band.", + "type": "string" + }, + "label_ids": { + "type": "array", + "items": { + "type": "string" + } + }, + "last_dev_nonce": { + "description": "Last DevNonce used.\nThis field is only used for devices using LoRaWAN version 1.1 and later.\nStored in Join Server.", + "type": "integer", + "format": "int64" + }, + "last_dev_status_received_at": { + "description": "Time when last DevStatus MAC command was received.\nStored in Network Server.", + "type": "string", + "format": "date-time" + }, + "last_join_nonce": { + "description": "Last JoinNonce/AppNonce(for devices using LoRaWAN versions preceding 1.1) used.\nStored in Join Server.", + "type": "integer", + "format": "int64" + }, + "last_rj_count_0": { + "description": "Last Rejoin counter value used (type 0/2).\nStored in Join Server.", + "type": "integer", + "format": "int64" + }, + "last_rj_count_1": { + "description": "Last Rejoin counter value used (type 1).\nStored in Join Server.", + "type": "integer", + "format": "int64" + }, + "last_seen_at": { + "description": "Timestamp when a device uplink has been last observed.\nThis field is set by the Application Server and stored in the Identity Server.", + "type": "string", + "format": "date-time" + }, + "locations": { + "description": "Location of the device. Stored in Entity Registry.", + "type": "object", + "additionalProperties": { + "type": "object", + "properties": { + "accuracy": { + "description": "The accuracy of the location (meters).", + "type": "integer", + "format": "int32" + }, + "altitude": { + "description": "The altitude (meters), where 0 is the mean sea level.", + "type": "integer", + "format": "int32" + }, + "latitude": { + "description": "The North–South position (degrees; -90 to +90), where 0 is the equator, North pole is positive, South pole is negative.", + "type": "number", + "format": "double" + }, + "longitude": { + "description": "The East-West position (degrees; -180 to +180), where 0 is the Prime Meridian (Greenwich), East is positive , West is negative.", + "type": "number", + "format": "double" + }, + "source": { + "description": " - SOURCE_UNKNOWN: The source of the location is not known or not set.\n - SOURCE_GPS: The location is determined by GPS.\n - SOURCE_REGISTRY: The location is set in and updated from a registry.\n - SOURCE_IP_GEOLOCATION: The location is estimated with IP geolocation.\n - SOURCE_WIFI_RSSI_GEOLOCATION: The location is estimated with WiFi RSSI geolocation.\n - SOURCE_BT_RSSI_GEOLOCATION: The location is estimated with BT/BLE RSSI geolocation.\n - SOURCE_LORA_RSSI_GEOLOCATION: The location is estimated with LoRa RSSI geolocation.\n - SOURCE_LORA_TDOA_GEOLOCATION: The location is estimated with LoRa TDOA geolocation.\n - SOURCE_COMBINED_GEOLOCATION: The location is estimated by a combination of geolocation sources.\n\nMore estimation methods can be added.", + "type": "string", + "default": "SOURCE_UNKNOWN", + "enum": [ + "SOURCE_UNKNOWN", + "SOURCE_GPS", + "SOURCE_REGISTRY", + "SOURCE_IP_GEOLOCATION", + "SOURCE_WIFI_RSSI_GEOLOCATION", + "SOURCE_BT_RSSI_GEOLOCATION", + "SOURCE_LORA_RSSI_GEOLOCATION", + "SOURCE_LORA_TDOA_GEOLOCATION", + "SOURCE_COMBINED_GEOLOCATION" + ] + } + } + } + }, + "lora_alliance_profile_ids": { + "type": "object", + "properties": { + "vendor_id": { + "description": "VendorID managed by the LoRa Alliance, as defined in TR005.", + "type": "integer", + "format": "int64" + }, + "vendor_profile_id": { + "description": "ID of the LoRaWAN end device profile assigned by the vendor.", + "type": "integer", + "format": "int64" + } + } + }, + "lorawan_phy_version": { + "type": "string", + "default": "PHY_UNKNOWN", + "enum": [ + "PHY_UNKNOWN", + "PHY_V1_0", + "TS001_V1_0", + "PHY_V1_0_1", + "TS001_V1_0_1", + "PHY_V1_0_2_REV_A", + "RP001_V1_0_2", + "PHY_V1_0_2_REV_B", + "RP001_V1_0_2_REV_B", + "PHY_V1_1_REV_A", + "RP001_V1_1_REV_A", + "PHY_V1_1_REV_B", + "RP001_V1_1_REV_B", + "PHY_V1_0_3_REV_A", + "RP001_V1_0_3_REV_A", + "RP002_V1_0_0", + "RP002_V1_0_1", + "RP002_V1_0_2", + "RP002_V1_0_3", + "RP002_V1_0_4" + ] + }, + "lorawan_version": { + "type": "string", + "default": "MAC_UNKNOWN", + "enum": [ + "MAC_UNKNOWN", + "MAC_V1_0", + "MAC_V1_0_1", + "MAC_V1_0_2", + "MAC_V1_1", + "MAC_V1_0_3", + "MAC_V1_0_4" + ] + }, + "mac_settings": { + "type": "object", + "properties": { + "adr": { + "description": "Adaptive Data Rate settings.", + "type": "object", + "properties": { + "disabled": { + "description": "Configuration options for cases in which ADR is to be disabled\ncompletely.", + "type": "object" + }, + "dynamic": { + "description": "Configuration options for dynamic ADR.", + "type": "object", + "properties": { + "channel_steering": { + "description": "EXPERIMENTAL: Channel steering settings.", + "type": "object", + "properties": { + "disabled": { + "description": "Configuration options for cases in which ADR is not supposed to steer the end device\nto another set of channels.", + "type": "object" + }, + "lora_narrow": { + "description": "Configuration options for LoRa narrow channels steering.\nThe narrow mode attempts to steer the end device towards\nusing the LoRa modulated, 125kHz bandwidth channels.", + "type": "object" + } + } + }, + "margin": { + "description": "The ADR margin (dB) tells the network server how much margin it should add in ADR requests.\nA bigger margin is less efficient, but gives a better chance of successful reception.\nIf unset, the default value from Network Server configuration will be used.", + "type": "number", + "format": "float" + }, + "max_data_rate_index": { + "type": "object", + "properties": { + "value": { + "type": "string", + "default": "DATA_RATE_0", + "enum": [ + "DATA_RATE_0", + "DATA_RATE_1", + "DATA_RATE_2", + "DATA_RATE_3", + "DATA_RATE_4", + "DATA_RATE_5", + "DATA_RATE_6", + "DATA_RATE_7", + "DATA_RATE_8", + "DATA_RATE_9", + "DATA_RATE_10", + "DATA_RATE_11", + "DATA_RATE_12", + "DATA_RATE_13", + "DATA_RATE_14", + "DATA_RATE_15" + ] + } + } + }, + "max_nb_trans": { + "description": "Maximum number of retransmissions.\nIf unset, the default value from Network Server configuration will be used.", + "type": "integer", + "format": "int64" + }, + "max_tx_power_index": { + "description": "Maximum transmission power index.\nIf unset, the default value from Network Server configuration will be used.", + "type": "integer", + "format": "int64" + }, + "min_data_rate_index": { + "type": "object", + "properties": { + "value": { + "type": "string", + "default": "DATA_RATE_0", + "enum": [ + "DATA_RATE_0", + "DATA_RATE_1", + "DATA_RATE_2", + "DATA_RATE_3", + "DATA_RATE_4", + "DATA_RATE_5", + "DATA_RATE_6", + "DATA_RATE_7", + "DATA_RATE_8", + "DATA_RATE_9", + "DATA_RATE_10", + "DATA_RATE_11", + "DATA_RATE_12", + "DATA_RATE_13", + "DATA_RATE_14", + "DATA_RATE_15" + ] + } + } + }, + "min_nb_trans": { + "description": "Minimum number of retransmissions.\nIf unset, the default value from Network Server configuration will be used.", + "type": "integer", + "format": "int64" + }, + "min_tx_power_index": { + "description": "Minimum transmission power index.\nIf unset, the default value from Network Server configuration will be used.", + "type": "integer", + "format": "int64" + }, + "overrides": { + "description": "EXPERIMENTAL: Configuration overrides.", + "type": "object", + "properties": { + "data_rate_0": { + "description": "EXPERIMENTAL: Data rate index override settings.", + "type": "object", + "properties": { + "max_nb_trans": { + "description": "Maximum number of retransmissions.\nIf unset, the default value from Network Server configuration will be used.", + "type": "integer", + "format": "int64" + }, + "min_nb_trans": { + "description": "Minimum number of retransmissions.\nIf unset, the default value from Network Server configuration will be used.", + "type": "integer", + "format": "int64" + } + } + }, + "data_rate_1": { + "description": "EXPERIMENTAL: Data rate index override settings.", + "type": "object", + "properties": { + "max_nb_trans": { + "description": "Maximum number of retransmissions.\nIf unset, the default value from Network Server configuration will be used.", + "type": "integer", + "format": "int64" + }, + "min_nb_trans": { + "description": "Minimum number of retransmissions.\nIf unset, the default value from Network Server configuration will be used.", + "type": "integer", + "format": "int64" + } + } + }, + "data_rate_10": { + "description": "EXPERIMENTAL: Data rate index override settings.", + "type": "object", + "properties": { + "max_nb_trans": { + "description": "Maximum number of retransmissions.\nIf unset, the default value from Network Server configuration will be used.", + "type": "integer", + "format": "int64" + }, + "min_nb_trans": { + "description": "Minimum number of retransmissions.\nIf unset, the default value from Network Server configuration will be used.", + "type": "integer", + "format": "int64" + } + } + }, + "data_rate_11": { + "description": "EXPERIMENTAL: Data rate index override settings.", + "type": "object", + "properties": { + "max_nb_trans": { + "description": "Maximum number of retransmissions.\nIf unset, the default value from Network Server configuration will be used.", + "type": "integer", + "format": "int64" + }, + "min_nb_trans": { + "description": "Minimum number of retransmissions.\nIf unset, the default value from Network Server configuration will be used.", + "type": "integer", + "format": "int64" + } + } + }, + "data_rate_12": { + "description": "EXPERIMENTAL: Data rate index override settings.", + "type": "object", + "properties": { + "max_nb_trans": { + "description": "Maximum number of retransmissions.\nIf unset, the default value from Network Server configuration will be used.", + "type": "integer", + "format": "int64" + }, + "min_nb_trans": { + "description": "Minimum number of retransmissions.\nIf unset, the default value from Network Server configuration will be used.", + "type": "integer", + "format": "int64" + } + } + }, + "data_rate_13": { + "description": "EXPERIMENTAL: Data rate index override settings.", + "type": "object", + "properties": { + "max_nb_trans": { + "description": "Maximum number of retransmissions.\nIf unset, the default value from Network Server configuration will be used.", + "type": "integer", + "format": "int64" + }, + "min_nb_trans": { + "description": "Minimum number of retransmissions.\nIf unset, the default value from Network Server configuration will be used.", + "type": "integer", + "format": "int64" + } + } + }, + "data_rate_14": { + "description": "EXPERIMENTAL: Data rate index override settings.", + "type": "object", + "properties": { + "max_nb_trans": { + "description": "Maximum number of retransmissions.\nIf unset, the default value from Network Server configuration will be used.", + "type": "integer", + "format": "int64" + }, + "min_nb_trans": { + "description": "Minimum number of retransmissions.\nIf unset, the default value from Network Server configuration will be used.", + "type": "integer", + "format": "int64" + } + } + }, + "data_rate_15": { + "description": "EXPERIMENTAL: Data rate index override settings.", + "type": "object", + "properties": { + "max_nb_trans": { + "description": "Maximum number of retransmissions.\nIf unset, the default value from Network Server configuration will be used.", + "type": "integer", + "format": "int64" + }, + "min_nb_trans": { + "description": "Minimum number of retransmissions.\nIf unset, the default value from Network Server configuration will be used.", + "type": "integer", + "format": "int64" + } + } + }, + "data_rate_2": { + "description": "EXPERIMENTAL: Data rate index override settings.", + "type": "object", + "properties": { + "max_nb_trans": { + "description": "Maximum number of retransmissions.\nIf unset, the default value from Network Server configuration will be used.", + "type": "integer", + "format": "int64" + }, + "min_nb_trans": { + "description": "Minimum number of retransmissions.\nIf unset, the default value from Network Server configuration will be used.", + "type": "integer", + "format": "int64" + } + } + }, + "data_rate_3": { + "description": "EXPERIMENTAL: Data rate index override settings.", + "type": "object", + "properties": { + "max_nb_trans": { + "description": "Maximum number of retransmissions.\nIf unset, the default value from Network Server configuration will be used.", + "type": "integer", + "format": "int64" + }, + "min_nb_trans": { + "description": "Minimum number of retransmissions.\nIf unset, the default value from Network Server configuration will be used.", + "type": "integer", + "format": "int64" + } + } + }, + "data_rate_4": { + "description": "EXPERIMENTAL: Data rate index override settings.", + "type": "object", + "properties": { + "max_nb_trans": { + "description": "Maximum number of retransmissions.\nIf unset, the default value from Network Server configuration will be used.", + "type": "integer", + "format": "int64" + }, + "min_nb_trans": { + "description": "Minimum number of retransmissions.\nIf unset, the default value from Network Server configuration will be used.", + "type": "integer", + "format": "int64" + } + } + }, + "data_rate_5": { + "description": "EXPERIMENTAL: Data rate index override settings.", + "type": "object", + "properties": { + "max_nb_trans": { + "description": "Maximum number of retransmissions.\nIf unset, the default value from Network Server configuration will be used.", + "type": "integer", + "format": "int64" + }, + "min_nb_trans": { + "description": "Minimum number of retransmissions.\nIf unset, the default value from Network Server configuration will be used.", + "type": "integer", + "format": "int64" + } + } + }, + "data_rate_6": { + "description": "EXPERIMENTAL: Data rate index override settings.", + "type": "object", + "properties": { + "max_nb_trans": { + "description": "Maximum number of retransmissions.\nIf unset, the default value from Network Server configuration will be used.", + "type": "integer", + "format": "int64" + }, + "min_nb_trans": { + "description": "Minimum number of retransmissions.\nIf unset, the default value from Network Server configuration will be used.", + "type": "integer", + "format": "int64" + } + } + }, + "data_rate_7": { + "description": "EXPERIMENTAL: Data rate index override settings.", + "type": "object", + "properties": { + "max_nb_trans": { + "description": "Maximum number of retransmissions.\nIf unset, the default value from Network Server configuration will be used.", + "type": "integer", + "format": "int64" + }, + "min_nb_trans": { + "description": "Minimum number of retransmissions.\nIf unset, the default value from Network Server configuration will be used.", + "type": "integer", + "format": "int64" + } + } + }, + "data_rate_8": { + "description": "EXPERIMENTAL: Data rate index override settings.", + "type": "object", + "properties": { + "max_nb_trans": { + "description": "Maximum number of retransmissions.\nIf unset, the default value from Network Server configuration will be used.", + "type": "integer", + "format": "int64" + }, + "min_nb_trans": { + "description": "Minimum number of retransmissions.\nIf unset, the default value from Network Server configuration will be used.", + "type": "integer", + "format": "int64" + } + } + }, + "data_rate_9": { + "description": "EXPERIMENTAL: Data rate index override settings.", + "type": "object", + "properties": { + "max_nb_trans": { + "description": "Maximum number of retransmissions.\nIf unset, the default value from Network Server configuration will be used.", + "type": "integer", + "format": "int64" + }, + "min_nb_trans": { + "description": "Minimum number of retransmissions.\nIf unset, the default value from Network Server configuration will be used.", + "type": "integer", + "format": "int64" + } + } + } + } + } + } + }, + "static": { + "description": "Configuration options for static ADR.", + "type": "object", + "properties": { + "data_rate_index": { + "type": "string", + "default": "DATA_RATE_0", + "enum": [ + "DATA_RATE_0", + "DATA_RATE_1", + "DATA_RATE_2", + "DATA_RATE_3", + "DATA_RATE_4", + "DATA_RATE_5", + "DATA_RATE_6", + "DATA_RATE_7", + "DATA_RATE_8", + "DATA_RATE_9", + "DATA_RATE_10", + "DATA_RATE_11", + "DATA_RATE_12", + "DATA_RATE_13", + "DATA_RATE_14", + "DATA_RATE_15" + ] + }, + "nb_trans": { + "description": "Number of retransmissions.", + "type": "integer", + "format": "int64" + }, + "tx_power_index": { + "description": "Transmission power index to use.", + "type": "integer", + "format": "int64" + } + } + } + } + }, + "adr_margin": { + "description": "The ADR margin (dB) tells the network server how much margin it should add in ADR requests.\nA bigger margin is less efficient, but gives a better chance of successful reception.\nThis field is deprecated, use adr_settings.dynamic.margin instead.", + "type": "number", + "format": "float" + }, + "beacon_frequency": { + "type": "object", + "properties": { + "value": { + "type": "string", + "format": "uint64" + } + } + }, + "class_b_c_downlink_interval": { + "description": "The minimum duration passed before a network-initiated(e.g. Class B or C) downlink following an arbitrary downlink.", + "type": "string" + }, + "class_b_timeout": { + "description": "Maximum delay for the device to answer a MAC request or a confirmed downlink frame.\nIf unset, the default value from Network Server configuration will be used.", + "type": "string" + }, + "class_c_timeout": { + "description": "Maximum delay for the device to answer a MAC request or a confirmed downlink frame.\nIf unset, the default value from Network Server configuration will be used.", + "type": "string" + }, + "desired_adr_ack_delay_exponent": { + "type": "object", + "properties": { + "value": { + "type": "string", + "default": "ADR_ACK_DELAY_1", + "enum": [ + "ADR_ACK_DELAY_1", + "ADR_ACK_DELAY_2", + "ADR_ACK_DELAY_4", + "ADR_ACK_DELAY_8", + "ADR_ACK_DELAY_16", + "ADR_ACK_DELAY_32", + "ADR_ACK_DELAY_64", + "ADR_ACK_DELAY_128", + "ADR_ACK_DELAY_256", + "ADR_ACK_DELAY_512", + "ADR_ACK_DELAY_1024", + "ADR_ACK_DELAY_2048", + "ADR_ACK_DELAY_4096", + "ADR_ACK_DELAY_8192", + "ADR_ACK_DELAY_16384", + "ADR_ACK_DELAY_32768" + ] + } + } + }, + "desired_adr_ack_limit_exponent": { + "type": "object", + "properties": { + "value": { + "type": "string", + "default": "ADR_ACK_LIMIT_1", + "enum": [ + "ADR_ACK_LIMIT_1", + "ADR_ACK_LIMIT_2", + "ADR_ACK_LIMIT_4", + "ADR_ACK_LIMIT_8", + "ADR_ACK_LIMIT_16", + "ADR_ACK_LIMIT_32", + "ADR_ACK_LIMIT_64", + "ADR_ACK_LIMIT_128", + "ADR_ACK_LIMIT_256", + "ADR_ACK_LIMIT_512", + "ADR_ACK_LIMIT_1024", + "ADR_ACK_LIMIT_2048", + "ADR_ACK_LIMIT_4096", + "ADR_ACK_LIMIT_8192", + "ADR_ACK_LIMIT_16384", + "ADR_ACK_LIMIT_32768" + ] + } + } + }, + "desired_beacon_frequency": { + "type": "object", + "properties": { + "value": { + "type": "string", + "format": "uint64" + } + } + }, + "desired_max_duty_cycle": { + "type": "object", + "properties": { + "value": { + "description": " - DUTY_CYCLE_1: 100%.\n - DUTY_CYCLE_2: 50%.\n - DUTY_CYCLE_4: 25%.\n - DUTY_CYCLE_8: 12.5%.\n - DUTY_CYCLE_16: 6.25%.\n - DUTY_CYCLE_32: 3.125%.\n - DUTY_CYCLE_64: 1.5625%.\n - DUTY_CYCLE_128: Roughly 0.781%.\n - DUTY_CYCLE_256: Roughly 0.390%.\n - DUTY_CYCLE_512: Roughly 0.195%.\n - DUTY_CYCLE_1024: Roughly 0.098%.\n - DUTY_CYCLE_2048: Roughly 0.049%.\n - DUTY_CYCLE_4096: Roughly 0.024%.\n - DUTY_CYCLE_8192: Roughly 0.012%.\n - DUTY_CYCLE_16384: Roughly 0.006%.\n - DUTY_CYCLE_32768: Roughly 0.003%.", + "type": "string", + "default": "DUTY_CYCLE_1", + "enum": [ + "DUTY_CYCLE_1", + "DUTY_CYCLE_2", + "DUTY_CYCLE_4", + "DUTY_CYCLE_8", + "DUTY_CYCLE_16", + "DUTY_CYCLE_32", + "DUTY_CYCLE_64", + "DUTY_CYCLE_128", + "DUTY_CYCLE_256", + "DUTY_CYCLE_512", + "DUTY_CYCLE_1024", + "DUTY_CYCLE_2048", + "DUTY_CYCLE_4096", + "DUTY_CYCLE_8192", + "DUTY_CYCLE_16384", + "DUTY_CYCLE_32768" + ] + } + } + }, + "desired_max_eirp": { + "type": "object", + "properties": { + "value": { + "description": " - DEVICE_EIRP_8: 8 dBm.\n - DEVICE_EIRP_10: 10 dBm.\n - DEVICE_EIRP_12: 12 dBm.\n - DEVICE_EIRP_13: 13 dBm.\n - DEVICE_EIRP_14: 14 dBm.\n - DEVICE_EIRP_16: 16 dBm.\n - DEVICE_EIRP_18: 18 dBm.\n - DEVICE_EIRP_20: 20 dBm.\n - DEVICE_EIRP_21: 21 dBm.\n - DEVICE_EIRP_24: 24 dBm.\n - DEVICE_EIRP_26: 26 dBm.\n - DEVICE_EIRP_27: 27 dBm.\n - DEVICE_EIRP_29: 29 dBm.\n - DEVICE_EIRP_30: 30 dBm.\n - DEVICE_EIRP_33: 33 dBm.\n - DEVICE_EIRP_36: 36 dBm.", + "type": "string", + "default": "DEVICE_EIRP_8", + "enum": [ + "DEVICE_EIRP_8", + "DEVICE_EIRP_10", + "DEVICE_EIRP_12", + "DEVICE_EIRP_13", + "DEVICE_EIRP_14", + "DEVICE_EIRP_16", + "DEVICE_EIRP_18", + "DEVICE_EIRP_20", + "DEVICE_EIRP_21", + "DEVICE_EIRP_24", + "DEVICE_EIRP_26", + "DEVICE_EIRP_27", + "DEVICE_EIRP_29", + "DEVICE_EIRP_30", + "DEVICE_EIRP_33", + "DEVICE_EIRP_36" + ] + } + } + }, + "desired_ping_slot_data_rate_index": { + "type": "object", + "properties": { + "value": { + "type": "string", + "default": "DATA_RATE_0", + "enum": [ + "DATA_RATE_0", + "DATA_RATE_1", + "DATA_RATE_2", + "DATA_RATE_3", + "DATA_RATE_4", + "DATA_RATE_5", + "DATA_RATE_6", + "DATA_RATE_7", + "DATA_RATE_8", + "DATA_RATE_9", + "DATA_RATE_10", + "DATA_RATE_11", + "DATA_RATE_12", + "DATA_RATE_13", + "DATA_RATE_14", + "DATA_RATE_15" + ] + } + } + }, + "desired_ping_slot_frequency": { + "type": "object", + "properties": { + "value": { + "type": "string", + "format": "uint64" + } + } + }, + "desired_relay": { + "description": "RelaySettings represent the settings of a relay.\nThis is used internally by the Network Server.", + "type": "object", + "properties": { + "served": { + "type": "object", + "properties": { + "always": { + "type": "object" + }, + "backoff": { + "description": "Number of wake on radio frames to be sent without an acknowledgement before sending the uplink message directly.\nIf unset, the default value from Network Server configuration will be used.", + "type": "integer", + "format": "int64" + }, + "dynamic": { + "type": "object", + "properties": { + "smart_enable_level": { + "type": "string", + "default": "RELAY_SMART_ENABLE_LEVEL_8", + "enum": [ + "RELAY_SMART_ENABLE_LEVEL_8", + "RELAY_SMART_ENABLE_LEVEL_16", + "RELAY_SMART_ENABLE_LEVEL_32", + "RELAY_SMART_ENABLE_LEVEL_64" + ] + } + } + }, + "end_device_controlled": { + "type": "object" + }, + "second_channel": { + "type": "object", + "properties": { + "ack_offset": { + "type": "string", + "title": "- RELAY_SECOND_CH_ACK_OFFSET_0: 0 kHz\n - RELAY_SECOND_CH_ACK_OFFSET_200: 200 kHz\n - RELAY_SECOND_CH_ACK_OFFSET_400: 400 kHz\n - RELAY_SECOND_CH_ACK_OFFSET_800: 800 kHz\n - RELAY_SECOND_CH_ACK_OFFSET_1600: 1.6 MHz\n - RELAY_SECOND_CH_ACK_OFFSET_3200: 3.2 MHz", + "default": "RELAY_SECOND_CH_ACK_OFFSET_0", + "enum": [ + "RELAY_SECOND_CH_ACK_OFFSET_0", + "RELAY_SECOND_CH_ACK_OFFSET_200", + "RELAY_SECOND_CH_ACK_OFFSET_400", + "RELAY_SECOND_CH_ACK_OFFSET_800", + "RELAY_SECOND_CH_ACK_OFFSET_1600", + "RELAY_SECOND_CH_ACK_OFFSET_3200" + ] + }, + "data_rate_index": { + "type": "string", + "default": "DATA_RATE_0", + "enum": [ + "DATA_RATE_0", + "DATA_RATE_1", + "DATA_RATE_2", + "DATA_RATE_3", + "DATA_RATE_4", + "DATA_RATE_5", + "DATA_RATE_6", + "DATA_RATE_7", + "DATA_RATE_8", + "DATA_RATE_9", + "DATA_RATE_10", + "DATA_RATE_11", + "DATA_RATE_12", + "DATA_RATE_13", + "DATA_RATE_14", + "DATA_RATE_15" + ] + }, + "frequency": { + "description": "The frequency (Hz) used by the wake on radio message.", + "type": "string", + "format": "uint64" + } + } + }, + "serving_device_id": { + "description": "End device identifier of the serving end device.", + "type": "string" + } + } + }, + "serving": { + "type": "object", + "properties": { + "cad_periodicity": { + "type": "string", + "title": "- RELAY_CAD_PERIODICITY_20_MILLISECONDS: sic", + "default": "RELAY_CAD_PERIODICITY_1_SECOND", + "enum": [ + "RELAY_CAD_PERIODICITY_1_SECOND", + "RELAY_CAD_PERIODICITY_500_MILLISECONDS", + "RELAY_CAD_PERIODICITY_250_MILLISECONDS", + "RELAY_CAD_PERIODICITY_100_MILLISECONDS", + "RELAY_CAD_PERIODICITY_50_MILLISECONDS", + "RELAY_CAD_PERIODICITY_20_MILLISECONDS" + ] + }, + "default_channel_index": { + "description": "Index of the default wake on radio channel.\nIf unset, the default value from Network Server configuration will be used.", + "type": "integer", + "format": "int64" + }, + "limits": { + "type": "object", + "properties": { + "join_requests": { + "type": "object", + "properties": { + "bucket_size": { + "type": "string", + "title": "- RELAY_LIMIT_BUCKET_SIZE_12: sic", + "default": "RELAY_LIMIT_BUCKET_SIZE_1", + "enum": [ + "RELAY_LIMIT_BUCKET_SIZE_1", + "RELAY_LIMIT_BUCKET_SIZE_2", + "RELAY_LIMIT_BUCKET_SIZE_4", + "RELAY_LIMIT_BUCKET_SIZE_12" + ] + }, + "reload_rate": { + "description": "The number of tokens which are replenished in the bucket every hour.", + "type": "integer", + "format": "int64" + } + } + }, + "notifications": { + "type": "object", + "properties": { + "bucket_size": { + "type": "string", + "title": "- RELAY_LIMIT_BUCKET_SIZE_12: sic", + "default": "RELAY_LIMIT_BUCKET_SIZE_1", + "enum": [ + "RELAY_LIMIT_BUCKET_SIZE_1", + "RELAY_LIMIT_BUCKET_SIZE_2", + "RELAY_LIMIT_BUCKET_SIZE_4", + "RELAY_LIMIT_BUCKET_SIZE_12" + ] + }, + "reload_rate": { + "description": "The number of tokens which are replenished in the bucket every hour.", + "type": "integer", + "format": "int64" + } + } + }, + "overall": { + "type": "object", + "properties": { + "bucket_size": { + "type": "string", + "title": "- RELAY_LIMIT_BUCKET_SIZE_12: sic", + "default": "RELAY_LIMIT_BUCKET_SIZE_1", + "enum": [ + "RELAY_LIMIT_BUCKET_SIZE_1", + "RELAY_LIMIT_BUCKET_SIZE_2", + "RELAY_LIMIT_BUCKET_SIZE_4", + "RELAY_LIMIT_BUCKET_SIZE_12" + ] + }, + "reload_rate": { + "description": "The number of tokens which are replenished in the bucket every hour.", + "type": "integer", + "format": "int64" + } + } + }, + "reset_behavior": { + "type": "string", + "default": "RELAY_RESET_LIMIT_COUNTER_ZERO", + "enum": [ + "RELAY_RESET_LIMIT_COUNTER_ZERO", + "RELAY_RESET_LIMIT_COUNTER_RELOAD_RATE", + "RELAY_RESET_LIMIT_COUNTER_MAX_VALUE", + "RELAY_RESET_LIMIT_COUNTER_NO_RESET" + ] + }, + "uplink_messages": { + "type": "object", + "properties": { + "bucket_size": { + "type": "string", + "title": "- RELAY_LIMIT_BUCKET_SIZE_12: sic", + "default": "RELAY_LIMIT_BUCKET_SIZE_1", + "enum": [ + "RELAY_LIMIT_BUCKET_SIZE_1", + "RELAY_LIMIT_BUCKET_SIZE_2", + "RELAY_LIMIT_BUCKET_SIZE_4", + "RELAY_LIMIT_BUCKET_SIZE_12" + ] + }, + "reload_rate": { + "description": "The number of tokens which are replenished in the bucket every hour.", + "type": "integer", + "format": "int64" + } + } + } + } + }, + "second_channel": { + "type": "object", + "properties": { + "ack_offset": { + "type": "string", + "title": "- RELAY_SECOND_CH_ACK_OFFSET_0: 0 kHz\n - RELAY_SECOND_CH_ACK_OFFSET_200: 200 kHz\n - RELAY_SECOND_CH_ACK_OFFSET_400: 400 kHz\n - RELAY_SECOND_CH_ACK_OFFSET_800: 800 kHz\n - RELAY_SECOND_CH_ACK_OFFSET_1600: 1.6 MHz\n - RELAY_SECOND_CH_ACK_OFFSET_3200: 3.2 MHz", + "default": "RELAY_SECOND_CH_ACK_OFFSET_0", + "enum": [ + "RELAY_SECOND_CH_ACK_OFFSET_0", + "RELAY_SECOND_CH_ACK_OFFSET_200", + "RELAY_SECOND_CH_ACK_OFFSET_400", + "RELAY_SECOND_CH_ACK_OFFSET_800", + "RELAY_SECOND_CH_ACK_OFFSET_1600", + "RELAY_SECOND_CH_ACK_OFFSET_3200" + ] + }, + "data_rate_index": { + "type": "string", + "default": "DATA_RATE_0", + "enum": [ + "DATA_RATE_0", + "DATA_RATE_1", + "DATA_RATE_2", + "DATA_RATE_3", + "DATA_RATE_4", + "DATA_RATE_5", + "DATA_RATE_6", + "DATA_RATE_7", + "DATA_RATE_8", + "DATA_RATE_9", + "DATA_RATE_10", + "DATA_RATE_11", + "DATA_RATE_12", + "DATA_RATE_13", + "DATA_RATE_14", + "DATA_RATE_15" + ] + }, + "frequency": { + "description": "The frequency (Hz) used by the wake on radio message.", + "type": "string", + "format": "uint64" + } + } + }, + "uplink_forwarding_rules": { + "description": "Configured uplink forwarding rules.", + "type": "array", + "items": { + "type": "object", + "properties": { + "device_id": { + "description": "End device identifier of the served end device.", + "type": "string" + }, + "last_w_f_cnt": { + "description": "Last wake on radio frame counter used by the served end device.", + "type": "integer", + "format": "int64" + }, + "limits": { + "type": "object", + "properties": { + "bucket_size": { + "type": "string", + "title": "- RELAY_LIMIT_BUCKET_SIZE_12: sic", + "default": "RELAY_LIMIT_BUCKET_SIZE_1", + "enum": [ + "RELAY_LIMIT_BUCKET_SIZE_1", + "RELAY_LIMIT_BUCKET_SIZE_2", + "RELAY_LIMIT_BUCKET_SIZE_4", + "RELAY_LIMIT_BUCKET_SIZE_12" + ] + }, + "reload_rate": { + "description": "The number of tokens which are replenished in the bucket every hour.", + "type": "integer", + "format": "int64" + } + } + }, + "session_key_id": { + "description": "Session key ID of the session keys used to derive the root relay session key.", + "type": "string", + "format": "byte" + } + } + } + } + } + } + } + }, + "desired_rx1_data_rate_offset": { + "type": "object", + "properties": { + "value": { + "type": "string", + "default": "DATA_RATE_OFFSET_0", + "enum": [ + "DATA_RATE_OFFSET_0", + "DATA_RATE_OFFSET_1", + "DATA_RATE_OFFSET_2", + "DATA_RATE_OFFSET_3", + "DATA_RATE_OFFSET_4", + "DATA_RATE_OFFSET_5", + "DATA_RATE_OFFSET_6", + "DATA_RATE_OFFSET_7" + ] + } + } + }, + "desired_rx1_delay": { + "type": "object", + "properties": { + "value": { + "description": " - RX_DELAY_0: 1 second.\n - RX_DELAY_1: 1 second.\n - RX_DELAY_2: 2 seconds.\n - RX_DELAY_3: 3 seconds.\n - RX_DELAY_4: 4 seconds.\n - RX_DELAY_5: 5 seconds.\n - RX_DELAY_6: 6 seconds.\n - RX_DELAY_7: 7 seconds.\n - RX_DELAY_8: 8 seconds.\n - RX_DELAY_9: 9 seconds.\n - RX_DELAY_10: 10 seconds.\n - RX_DELAY_11: 11 seconds.\n - RX_DELAY_12: 12 seconds.\n - RX_DELAY_13: 13 seconds.\n - RX_DELAY_14: 14 seconds.\n - RX_DELAY_15: 15 seconds.", + "type": "string", + "default": "RX_DELAY_0", + "enum": [ + "RX_DELAY_0", + "RX_DELAY_1", + "RX_DELAY_2", + "RX_DELAY_3", + "RX_DELAY_4", + "RX_DELAY_5", + "RX_DELAY_6", + "RX_DELAY_7", + "RX_DELAY_8", + "RX_DELAY_9", + "RX_DELAY_10", + "RX_DELAY_11", + "RX_DELAY_12", + "RX_DELAY_13", + "RX_DELAY_14", + "RX_DELAY_15" + ] + } + } + }, + "desired_rx2_data_rate_index": { + "type": "object", + "properties": { + "value": { + "type": "string", + "default": "DATA_RATE_0", + "enum": [ + "DATA_RATE_0", + "DATA_RATE_1", + "DATA_RATE_2", + "DATA_RATE_3", + "DATA_RATE_4", + "DATA_RATE_5", + "DATA_RATE_6", + "DATA_RATE_7", + "DATA_RATE_8", + "DATA_RATE_9", + "DATA_RATE_10", + "DATA_RATE_11", + "DATA_RATE_12", + "DATA_RATE_13", + "DATA_RATE_14", + "DATA_RATE_15" + ] + } + } + }, + "desired_rx2_frequency": { + "type": "object", + "properties": { + "value": { + "type": "string", + "format": "uint64" + } + } + }, + "downlink_dwell_time": { + "type": "object", + "properties": { + "value": { + "type": "boolean" + } + } + }, + "factory_preset_frequencies": { + "description": "List of factory-preset frequencies.\nIf unset, the default value from Network Server configuration or regional parameters specification will be used.", + "type": "array", + "items": { + "type": "string", + "format": "uint64" + } + }, + "max_duty_cycle": { + "type": "object", + "properties": { + "value": { + "description": " - DUTY_CYCLE_1: 100%.\n - DUTY_CYCLE_2: 50%.\n - DUTY_CYCLE_4: 25%.\n - DUTY_CYCLE_8: 12.5%.\n - DUTY_CYCLE_16: 6.25%.\n - DUTY_CYCLE_32: 3.125%.\n - DUTY_CYCLE_64: 1.5625%.\n - DUTY_CYCLE_128: Roughly 0.781%.\n - DUTY_CYCLE_256: Roughly 0.390%.\n - DUTY_CYCLE_512: Roughly 0.195%.\n - DUTY_CYCLE_1024: Roughly 0.098%.\n - DUTY_CYCLE_2048: Roughly 0.049%.\n - DUTY_CYCLE_4096: Roughly 0.024%.\n - DUTY_CYCLE_8192: Roughly 0.012%.\n - DUTY_CYCLE_16384: Roughly 0.006%.\n - DUTY_CYCLE_32768: Roughly 0.003%.", + "type": "string", + "default": "DUTY_CYCLE_1", + "enum": [ + "DUTY_CYCLE_1", + "DUTY_CYCLE_2", + "DUTY_CYCLE_4", + "DUTY_CYCLE_8", + "DUTY_CYCLE_16", + "DUTY_CYCLE_32", + "DUTY_CYCLE_64", + "DUTY_CYCLE_128", + "DUTY_CYCLE_256", + "DUTY_CYCLE_512", + "DUTY_CYCLE_1024", + "DUTY_CYCLE_2048", + "DUTY_CYCLE_4096", + "DUTY_CYCLE_8192", + "DUTY_CYCLE_16384", + "DUTY_CYCLE_32768" + ] + } + } + }, + "ping_slot_data_rate_index": { + "type": "object", + "properties": { + "value": { + "type": "string", + "default": "DATA_RATE_0", + "enum": [ + "DATA_RATE_0", + "DATA_RATE_1", + "DATA_RATE_2", + "DATA_RATE_3", + "DATA_RATE_4", + "DATA_RATE_5", + "DATA_RATE_6", + "DATA_RATE_7", + "DATA_RATE_8", + "DATA_RATE_9", + "DATA_RATE_10", + "DATA_RATE_11", + "DATA_RATE_12", + "DATA_RATE_13", + "DATA_RATE_14", + "DATA_RATE_15" + ] + } + } + }, + "ping_slot_frequency": { + "type": "object", + "properties": { + "value": { + "type": "string", + "format": "uint64" + } + } + }, + "ping_slot_periodicity": { + "type": "object", + "properties": { + "value": { + "description": " - PING_EVERY_1S: Every second.\n - PING_EVERY_2S: Every 2 seconds.\n - PING_EVERY_4S: Every 4 seconds.\n - PING_EVERY_8S: Every 8 seconds.\n - PING_EVERY_16S: Every 16 seconds.\n - PING_EVERY_32S: Every 32 seconds.\n - PING_EVERY_64S: Every 64 seconds.\n - PING_EVERY_128S: Every 128 seconds.", + "type": "string", + "default": "PING_EVERY_1S", + "enum": [ + "PING_EVERY_1S", + "PING_EVERY_2S", + "PING_EVERY_4S", + "PING_EVERY_8S", + "PING_EVERY_16S", + "PING_EVERY_32S", + "PING_EVERY_64S", + "PING_EVERY_128S" + ] + } + } + }, + "relay": { + "description": "RelaySettings represent the settings of a relay.\nThis is used internally by the Network Server.", + "type": "object", + "properties": { + "served": { + "type": "object", + "properties": { + "always": { + "type": "object" + }, + "backoff": { + "description": "Number of wake on radio frames to be sent without an acknowledgement before sending the uplink message directly.\nIf unset, the default value from Network Server configuration will be used.", + "type": "integer", + "format": "int64" + }, + "dynamic": { + "type": "object", + "properties": { + "smart_enable_level": { + "type": "string", + "default": "RELAY_SMART_ENABLE_LEVEL_8", + "enum": [ + "RELAY_SMART_ENABLE_LEVEL_8", + "RELAY_SMART_ENABLE_LEVEL_16", + "RELAY_SMART_ENABLE_LEVEL_32", + "RELAY_SMART_ENABLE_LEVEL_64" + ] + } + } + }, + "end_device_controlled": { + "type": "object" + }, + "second_channel": { + "type": "object", + "properties": { + "ack_offset": { + "type": "string", + "title": "- RELAY_SECOND_CH_ACK_OFFSET_0: 0 kHz\n - RELAY_SECOND_CH_ACK_OFFSET_200: 200 kHz\n - RELAY_SECOND_CH_ACK_OFFSET_400: 400 kHz\n - RELAY_SECOND_CH_ACK_OFFSET_800: 800 kHz\n - RELAY_SECOND_CH_ACK_OFFSET_1600: 1.6 MHz\n - RELAY_SECOND_CH_ACK_OFFSET_3200: 3.2 MHz", + "default": "RELAY_SECOND_CH_ACK_OFFSET_0", + "enum": [ + "RELAY_SECOND_CH_ACK_OFFSET_0", + "RELAY_SECOND_CH_ACK_OFFSET_200", + "RELAY_SECOND_CH_ACK_OFFSET_400", + "RELAY_SECOND_CH_ACK_OFFSET_800", + "RELAY_SECOND_CH_ACK_OFFSET_1600", + "RELAY_SECOND_CH_ACK_OFFSET_3200" + ] + }, + "data_rate_index": { + "type": "string", + "default": "DATA_RATE_0", + "enum": [ + "DATA_RATE_0", + "DATA_RATE_1", + "DATA_RATE_2", + "DATA_RATE_3", + "DATA_RATE_4", + "DATA_RATE_5", + "DATA_RATE_6", + "DATA_RATE_7", + "DATA_RATE_8", + "DATA_RATE_9", + "DATA_RATE_10", + "DATA_RATE_11", + "DATA_RATE_12", + "DATA_RATE_13", + "DATA_RATE_14", + "DATA_RATE_15" + ] + }, + "frequency": { + "description": "The frequency (Hz) used by the wake on radio message.", + "type": "string", + "format": "uint64" + } + } + }, + "serving_device_id": { + "description": "End device identifier of the serving end device.", + "type": "string" + } + } + }, + "serving": { + "type": "object", + "properties": { + "cad_periodicity": { + "type": "string", + "title": "- RELAY_CAD_PERIODICITY_20_MILLISECONDS: sic", + "default": "RELAY_CAD_PERIODICITY_1_SECOND", + "enum": [ + "RELAY_CAD_PERIODICITY_1_SECOND", + "RELAY_CAD_PERIODICITY_500_MILLISECONDS", + "RELAY_CAD_PERIODICITY_250_MILLISECONDS", + "RELAY_CAD_PERIODICITY_100_MILLISECONDS", + "RELAY_CAD_PERIODICITY_50_MILLISECONDS", + "RELAY_CAD_PERIODICITY_20_MILLISECONDS" + ] + }, + "default_channel_index": { + "description": "Index of the default wake on radio channel.\nIf unset, the default value from Network Server configuration will be used.", + "type": "integer", + "format": "int64" + }, + "limits": { + "type": "object", + "properties": { + "join_requests": { + "type": "object", + "properties": { + "bucket_size": { + "type": "string", + "title": "- RELAY_LIMIT_BUCKET_SIZE_12: sic", + "default": "RELAY_LIMIT_BUCKET_SIZE_1", + "enum": [ + "RELAY_LIMIT_BUCKET_SIZE_1", + "RELAY_LIMIT_BUCKET_SIZE_2", + "RELAY_LIMIT_BUCKET_SIZE_4", + "RELAY_LIMIT_BUCKET_SIZE_12" + ] + }, + "reload_rate": { + "description": "The number of tokens which are replenished in the bucket every hour.", + "type": "integer", + "format": "int64" + } + } + }, + "notifications": { + "type": "object", + "properties": { + "bucket_size": { + "type": "string", + "title": "- RELAY_LIMIT_BUCKET_SIZE_12: sic", + "default": "RELAY_LIMIT_BUCKET_SIZE_1", + "enum": [ + "RELAY_LIMIT_BUCKET_SIZE_1", + "RELAY_LIMIT_BUCKET_SIZE_2", + "RELAY_LIMIT_BUCKET_SIZE_4", + "RELAY_LIMIT_BUCKET_SIZE_12" + ] + }, + "reload_rate": { + "description": "The number of tokens which are replenished in the bucket every hour.", + "type": "integer", + "format": "int64" + } + } + }, + "overall": { + "type": "object", + "properties": { + "bucket_size": { + "type": "string", + "title": "- RELAY_LIMIT_BUCKET_SIZE_12: sic", + "default": "RELAY_LIMIT_BUCKET_SIZE_1", + "enum": [ + "RELAY_LIMIT_BUCKET_SIZE_1", + "RELAY_LIMIT_BUCKET_SIZE_2", + "RELAY_LIMIT_BUCKET_SIZE_4", + "RELAY_LIMIT_BUCKET_SIZE_12" + ] + }, + "reload_rate": { + "description": "The number of tokens which are replenished in the bucket every hour.", + "type": "integer", + "format": "int64" + } + } + }, + "reset_behavior": { + "type": "string", + "default": "RELAY_RESET_LIMIT_COUNTER_ZERO", + "enum": [ + "RELAY_RESET_LIMIT_COUNTER_ZERO", + "RELAY_RESET_LIMIT_COUNTER_RELOAD_RATE", + "RELAY_RESET_LIMIT_COUNTER_MAX_VALUE", + "RELAY_RESET_LIMIT_COUNTER_NO_RESET" + ] + }, + "uplink_messages": { + "type": "object", + "properties": { + "bucket_size": { + "type": "string", + "title": "- RELAY_LIMIT_BUCKET_SIZE_12: sic", + "default": "RELAY_LIMIT_BUCKET_SIZE_1", + "enum": [ + "RELAY_LIMIT_BUCKET_SIZE_1", + "RELAY_LIMIT_BUCKET_SIZE_2", + "RELAY_LIMIT_BUCKET_SIZE_4", + "RELAY_LIMIT_BUCKET_SIZE_12" + ] + }, + "reload_rate": { + "description": "The number of tokens which are replenished in the bucket every hour.", + "type": "integer", + "format": "int64" + } + } + } + } + }, + "second_channel": { + "type": "object", + "properties": { + "ack_offset": { + "type": "string", + "title": "- RELAY_SECOND_CH_ACK_OFFSET_0: 0 kHz\n - RELAY_SECOND_CH_ACK_OFFSET_200: 200 kHz\n - RELAY_SECOND_CH_ACK_OFFSET_400: 400 kHz\n - RELAY_SECOND_CH_ACK_OFFSET_800: 800 kHz\n - RELAY_SECOND_CH_ACK_OFFSET_1600: 1.6 MHz\n - RELAY_SECOND_CH_ACK_OFFSET_3200: 3.2 MHz", + "default": "RELAY_SECOND_CH_ACK_OFFSET_0", + "enum": [ + "RELAY_SECOND_CH_ACK_OFFSET_0", + "RELAY_SECOND_CH_ACK_OFFSET_200", + "RELAY_SECOND_CH_ACK_OFFSET_400", + "RELAY_SECOND_CH_ACK_OFFSET_800", + "RELAY_SECOND_CH_ACK_OFFSET_1600", + "RELAY_SECOND_CH_ACK_OFFSET_3200" + ] + }, + "data_rate_index": { + "type": "string", + "default": "DATA_RATE_0", + "enum": [ + "DATA_RATE_0", + "DATA_RATE_1", + "DATA_RATE_2", + "DATA_RATE_3", + "DATA_RATE_4", + "DATA_RATE_5", + "DATA_RATE_6", + "DATA_RATE_7", + "DATA_RATE_8", + "DATA_RATE_9", + "DATA_RATE_10", + "DATA_RATE_11", + "DATA_RATE_12", + "DATA_RATE_13", + "DATA_RATE_14", + "DATA_RATE_15" + ] + }, + "frequency": { + "description": "The frequency (Hz) used by the wake on radio message.", + "type": "string", + "format": "uint64" + } + } + }, + "uplink_forwarding_rules": { + "description": "Configured uplink forwarding rules.", + "type": "array", + "items": { + "type": "object", + "properties": { + "device_id": { + "description": "End device identifier of the served end device.", + "type": "string" + }, + "last_w_f_cnt": { + "description": "Last wake on radio frame counter used by the served end device.", + "type": "integer", + "format": "int64" + }, + "limits": { + "type": "object", + "properties": { + "bucket_size": { + "type": "string", + "title": "- RELAY_LIMIT_BUCKET_SIZE_12: sic", + "default": "RELAY_LIMIT_BUCKET_SIZE_1", + "enum": [ + "RELAY_LIMIT_BUCKET_SIZE_1", + "RELAY_LIMIT_BUCKET_SIZE_2", + "RELAY_LIMIT_BUCKET_SIZE_4", + "RELAY_LIMIT_BUCKET_SIZE_12" + ] + }, + "reload_rate": { + "description": "The number of tokens which are replenished in the bucket every hour.", + "type": "integer", + "format": "int64" + } + } + }, + "session_key_id": { + "description": "Session key ID of the session keys used to derive the root relay session key.", + "type": "string", + "format": "byte" + } + } + } + } + } + } + } + }, + "resets_f_cnt": { + "type": "object", + "properties": { + "value": { + "type": "boolean" + } + } + }, + "rx1_data_rate_offset": { + "type": "object", + "properties": { + "value": { + "type": "string", + "default": "DATA_RATE_OFFSET_0", + "enum": [ + "DATA_RATE_OFFSET_0", + "DATA_RATE_OFFSET_1", + "DATA_RATE_OFFSET_2", + "DATA_RATE_OFFSET_3", + "DATA_RATE_OFFSET_4", + "DATA_RATE_OFFSET_5", + "DATA_RATE_OFFSET_6", + "DATA_RATE_OFFSET_7" + ] + } + } + }, + "rx1_delay": { + "type": "object", + "properties": { + "value": { + "description": " - RX_DELAY_0: 1 second.\n - RX_DELAY_1: 1 second.\n - RX_DELAY_2: 2 seconds.\n - RX_DELAY_3: 3 seconds.\n - RX_DELAY_4: 4 seconds.\n - RX_DELAY_5: 5 seconds.\n - RX_DELAY_6: 6 seconds.\n - RX_DELAY_7: 7 seconds.\n - RX_DELAY_8: 8 seconds.\n - RX_DELAY_9: 9 seconds.\n - RX_DELAY_10: 10 seconds.\n - RX_DELAY_11: 11 seconds.\n - RX_DELAY_12: 12 seconds.\n - RX_DELAY_13: 13 seconds.\n - RX_DELAY_14: 14 seconds.\n - RX_DELAY_15: 15 seconds.", + "type": "string", + "default": "RX_DELAY_0", + "enum": [ + "RX_DELAY_0", + "RX_DELAY_1", + "RX_DELAY_2", + "RX_DELAY_3", + "RX_DELAY_4", + "RX_DELAY_5", + "RX_DELAY_6", + "RX_DELAY_7", + "RX_DELAY_8", + "RX_DELAY_9", + "RX_DELAY_10", + "RX_DELAY_11", + "RX_DELAY_12", + "RX_DELAY_13", + "RX_DELAY_14", + "RX_DELAY_15" + ] + } + } + }, + "rx2_data_rate_index": { + "type": "object", + "properties": { + "value": { + "type": "string", + "default": "DATA_RATE_0", + "enum": [ + "DATA_RATE_0", + "DATA_RATE_1", + "DATA_RATE_2", + "DATA_RATE_3", + "DATA_RATE_4", + "DATA_RATE_5", + "DATA_RATE_6", + "DATA_RATE_7", + "DATA_RATE_8", + "DATA_RATE_9", + "DATA_RATE_10", + "DATA_RATE_11", + "DATA_RATE_12", + "DATA_RATE_13", + "DATA_RATE_14", + "DATA_RATE_15" + ] + } + } + }, + "rx2_frequency": { + "type": "object", + "properties": { + "value": { + "type": "string", + "format": "uint64" + } + } + }, + "schedule_downlinks": { + "type": "object", + "properties": { + "value": { + "type": "boolean" + } + } + }, + "status_count_periodicity": { + "description": "Number of uplink messages after which a DevStatusReq MACCommand shall be sent.\nIf unset, the default value from Network Server configuration will be used.", + "type": "integer", + "format": "int64" + }, + "status_time_periodicity": { + "description": "The interval after which a DevStatusReq MACCommand shall be sent.\nIf unset, the default value from Network Server configuration will be used.", + "type": "string" + }, + "supports_32_bit_f_cnt": { + "type": "object", + "properties": { + "value": { + "type": "boolean" + } + } + }, + "uplink_dwell_time": { + "type": "object", + "properties": { + "value": { + "type": "boolean" + } + } + }, + "use_adr": { + "type": "object", + "properties": { + "value": { + "type": "boolean" + } + } + } + } + }, + "mac_settings_profile_ids": { + "type": "object", + "properties": { + "application_ids": { + "type": "object", + "properties": { + "application_id": { + "type": "string" + } + } + }, + "profile_id": { + "description": "Profile ID.", + "type": "string" + } + } + }, + "mac_state": { + "description": "MACState represents the state of MAC layer of the device.\nMACState is reset on each join for OTAA or ResetInd for ABP devices.\nThis is used internally by the Network Server.", + "type": "object", + "properties": { + "current_parameters": { + "description": "MACParameters represent the parameters of the device's MAC layer (active or desired).\nThis is used internally by the Network Server.", + "type": "object", + "properties": { + "adr_ack_delay": { + "description": "ADR: number of messages to wait after setting ADRAckReq and before changing TxPower or DataRate.\nThis field is deprecated, use adr_ack_delay_exponent instead.", + "type": "integer", + "format": "int64" + }, + "adr_ack_delay_exponent": { + "type": "object", + "properties": { + "value": { + "type": "string", + "default": "ADR_ACK_DELAY_1", + "enum": [ + "ADR_ACK_DELAY_1", + "ADR_ACK_DELAY_2", + "ADR_ACK_DELAY_4", + "ADR_ACK_DELAY_8", + "ADR_ACK_DELAY_16", + "ADR_ACK_DELAY_32", + "ADR_ACK_DELAY_64", + "ADR_ACK_DELAY_128", + "ADR_ACK_DELAY_256", + "ADR_ACK_DELAY_512", + "ADR_ACK_DELAY_1024", + "ADR_ACK_DELAY_2048", + "ADR_ACK_DELAY_4096", + "ADR_ACK_DELAY_8192", + "ADR_ACK_DELAY_16384", + "ADR_ACK_DELAY_32768" + ] + } + } + }, + "adr_ack_limit": { + "description": "ADR: number of messages to wait before setting ADRAckReq.\nThis field is deprecated, use adr_ack_limit_exponent instead.", + "type": "integer", + "format": "int64" + }, + "adr_ack_limit_exponent": { + "type": "object", + "properties": { + "value": { + "type": "string", + "default": "ADR_ACK_LIMIT_1", + "enum": [ + "ADR_ACK_LIMIT_1", + "ADR_ACK_LIMIT_2", + "ADR_ACK_LIMIT_4", + "ADR_ACK_LIMIT_8", + "ADR_ACK_LIMIT_16", + "ADR_ACK_LIMIT_32", + "ADR_ACK_LIMIT_64", + "ADR_ACK_LIMIT_128", + "ADR_ACK_LIMIT_256", + "ADR_ACK_LIMIT_512", + "ADR_ACK_LIMIT_1024", + "ADR_ACK_LIMIT_2048", + "ADR_ACK_LIMIT_4096", + "ADR_ACK_LIMIT_8192", + "ADR_ACK_LIMIT_16384", + "ADR_ACK_LIMIT_32768" + ] + } + } + }, + "adr_data_rate_index": { + "type": "string", + "default": "DATA_RATE_0", + "enum": [ + "DATA_RATE_0", + "DATA_RATE_1", + "DATA_RATE_2", + "DATA_RATE_3", + "DATA_RATE_4", + "DATA_RATE_5", + "DATA_RATE_6", + "DATA_RATE_7", + "DATA_RATE_8", + "DATA_RATE_9", + "DATA_RATE_10", + "DATA_RATE_11", + "DATA_RATE_12", + "DATA_RATE_13", + "DATA_RATE_14", + "DATA_RATE_15" + ] + }, + "adr_nb_trans": { + "description": "ADR: number of retransmissions.", + "type": "integer", + "format": "int64" + }, + "adr_tx_power_index": { + "description": "ADR: transmission power index to use.", + "type": "integer", + "format": "int64" + }, + "beacon_frequency": { + "description": "Frequency of the class B beacon (Hz).", + "type": "string", + "format": "uint64" + }, + "channels": { + "description": "Configured uplink channels and optionally Rx1 frequency.", + "type": "array", + "items": { + "type": "object", + "properties": { + "downlink_frequency": { + "description": "Downlink frequency of the channel (Hz).", + "type": "string", + "format": "uint64" + }, + "enable_uplink": { + "description": "Channel can be used by device for uplink.", + "type": "boolean" + }, + "max_data_rate_index": { + "type": "string", + "default": "DATA_RATE_0", + "enum": [ + "DATA_RATE_0", + "DATA_RATE_1", + "DATA_RATE_2", + "DATA_RATE_3", + "DATA_RATE_4", + "DATA_RATE_5", + "DATA_RATE_6", + "DATA_RATE_7", + "DATA_RATE_8", + "DATA_RATE_9", + "DATA_RATE_10", + "DATA_RATE_11", + "DATA_RATE_12", + "DATA_RATE_13", + "DATA_RATE_14", + "DATA_RATE_15" + ] + }, + "min_data_rate_index": { + "type": "string", + "default": "DATA_RATE_0", + "enum": [ + "DATA_RATE_0", + "DATA_RATE_1", + "DATA_RATE_2", + "DATA_RATE_3", + "DATA_RATE_4", + "DATA_RATE_5", + "DATA_RATE_6", + "DATA_RATE_7", + "DATA_RATE_8", + "DATA_RATE_9", + "DATA_RATE_10", + "DATA_RATE_11", + "DATA_RATE_12", + "DATA_RATE_13", + "DATA_RATE_14", + "DATA_RATE_15" + ] + }, + "uplink_frequency": { + "description": "Uplink frequency of the channel (Hz).", + "type": "string", + "format": "uint64" + } + } + } + }, + "downlink_dwell_time": { + "type": "object", + "properties": { + "value": { + "type": "boolean" + } + } + }, + "max_duty_cycle": { + "description": " - DUTY_CYCLE_1: 100%.\n - DUTY_CYCLE_2: 50%.\n - DUTY_CYCLE_4: 25%.\n - DUTY_CYCLE_8: 12.5%.\n - DUTY_CYCLE_16: 6.25%.\n - DUTY_CYCLE_32: 3.125%.\n - DUTY_CYCLE_64: 1.5625%.\n - DUTY_CYCLE_128: Roughly 0.781%.\n - DUTY_CYCLE_256: Roughly 0.390%.\n - DUTY_CYCLE_512: Roughly 0.195%.\n - DUTY_CYCLE_1024: Roughly 0.098%.\n - DUTY_CYCLE_2048: Roughly 0.049%.\n - DUTY_CYCLE_4096: Roughly 0.024%.\n - DUTY_CYCLE_8192: Roughly 0.012%.\n - DUTY_CYCLE_16384: Roughly 0.006%.\n - DUTY_CYCLE_32768: Roughly 0.003%.", + "type": "string", + "default": "DUTY_CYCLE_1", + "enum": [ + "DUTY_CYCLE_1", + "DUTY_CYCLE_2", + "DUTY_CYCLE_4", + "DUTY_CYCLE_8", + "DUTY_CYCLE_16", + "DUTY_CYCLE_32", + "DUTY_CYCLE_64", + "DUTY_CYCLE_128", + "DUTY_CYCLE_256", + "DUTY_CYCLE_512", + "DUTY_CYCLE_1024", + "DUTY_CYCLE_2048", + "DUTY_CYCLE_4096", + "DUTY_CYCLE_8192", + "DUTY_CYCLE_16384", + "DUTY_CYCLE_32768" + ] + }, + "max_eirp": { + "description": "Maximum EIRP (dBm).", + "type": "number", + "format": "float" + }, + "ping_slot_data_rate_index": { + "type": "string", + "default": "DATA_RATE_0", + "enum": [ + "DATA_RATE_0", + "DATA_RATE_1", + "DATA_RATE_2", + "DATA_RATE_3", + "DATA_RATE_4", + "DATA_RATE_5", + "DATA_RATE_6", + "DATA_RATE_7", + "DATA_RATE_8", + "DATA_RATE_9", + "DATA_RATE_10", + "DATA_RATE_11", + "DATA_RATE_12", + "DATA_RATE_13", + "DATA_RATE_14", + "DATA_RATE_15" + ] + }, + "ping_slot_data_rate_index_value": { + "type": "object", + "properties": { + "value": { + "type": "string", + "default": "DATA_RATE_0", + "enum": [ + "DATA_RATE_0", + "DATA_RATE_1", + "DATA_RATE_2", + "DATA_RATE_3", + "DATA_RATE_4", + "DATA_RATE_5", + "DATA_RATE_6", + "DATA_RATE_7", + "DATA_RATE_8", + "DATA_RATE_9", + "DATA_RATE_10", + "DATA_RATE_11", + "DATA_RATE_12", + "DATA_RATE_13", + "DATA_RATE_14", + "DATA_RATE_15" + ] + } + } + }, + "ping_slot_frequency": { + "description": "Frequency of the class B ping slot (Hz).", + "type": "string", + "format": "uint64" + }, + "rejoin_count_periodicity": { + "type": "string", + "default": "REJOIN_COUNT_16", + "enum": [ + "REJOIN_COUNT_16", + "REJOIN_COUNT_32", + "REJOIN_COUNT_64", + "REJOIN_COUNT_128", + "REJOIN_COUNT_256", + "REJOIN_COUNT_512", + "REJOIN_COUNT_1024", + "REJOIN_COUNT_2048", + "REJOIN_COUNT_4096", + "REJOIN_COUNT_8192", + "REJOIN_COUNT_16384", + "REJOIN_COUNT_32768", + "REJOIN_COUNT_65536", + "REJOIN_COUNT_131072", + "REJOIN_COUNT_262144", + "REJOIN_COUNT_524288" + ] + }, + "rejoin_time_periodicity": { + "description": " - REJOIN_TIME_0: Every ~17.1 minutes.\n - REJOIN_TIME_1: Every ~34.1 minutes.\n - REJOIN_TIME_2: Every ~1.1 hours.\n - REJOIN_TIME_3: Every ~2.3 hours.\n - REJOIN_TIME_4: Every ~4.6 hours.\n - REJOIN_TIME_5: Every ~9.1 hours.\n - REJOIN_TIME_6: Every ~18.2 hours.\n - REJOIN_TIME_7: Every ~1.5 days.\n - REJOIN_TIME_8: Every ~3.0 days.\n - REJOIN_TIME_9: Every ~6.1 days.\n - REJOIN_TIME_10: Every ~12.1 days.\n - REJOIN_TIME_11: Every ~3.5 weeks.\n - REJOIN_TIME_12: Every ~1.6 months.\n - REJOIN_TIME_13: Every ~3.2 months.\n - REJOIN_TIME_14: Every ~6.4 months.\n - REJOIN_TIME_15: Every ~1.1 year.", + "type": "string", + "default": "REJOIN_TIME_0", + "enum": [ + "REJOIN_TIME_0", + "REJOIN_TIME_1", + "REJOIN_TIME_2", + "REJOIN_TIME_3", + "REJOIN_TIME_4", + "REJOIN_TIME_5", + "REJOIN_TIME_6", + "REJOIN_TIME_7", + "REJOIN_TIME_8", + "REJOIN_TIME_9", + "REJOIN_TIME_10", + "REJOIN_TIME_11", + "REJOIN_TIME_12", + "REJOIN_TIME_13", + "REJOIN_TIME_14", + "REJOIN_TIME_15" + ] + }, + "relay": { + "description": "RelayParameters represent the parameters of a relay.\nThis is used internally by the Network Server.", + "type": "object", + "properties": { + "served": { + "type": "object", + "properties": { + "always": { + "type": "object" + }, + "backoff": { + "description": "Number of wake on radio frames to be sent without an acknowledgement before sending the uplink message directly.", + "type": "integer", + "format": "int64" + }, + "dynamic": { + "type": "object", + "properties": { + "smart_enable_level": { + "type": "string", + "default": "RELAY_SMART_ENABLE_LEVEL_8", + "enum": [ + "RELAY_SMART_ENABLE_LEVEL_8", + "RELAY_SMART_ENABLE_LEVEL_16", + "RELAY_SMART_ENABLE_LEVEL_32", + "RELAY_SMART_ENABLE_LEVEL_64" + ] + } + } + }, + "end_device_controlled": { + "type": "object" + }, + "second_channel": { + "type": "object", + "properties": { + "ack_offset": { + "type": "string", + "title": "- RELAY_SECOND_CH_ACK_OFFSET_0: 0 kHz\n - RELAY_SECOND_CH_ACK_OFFSET_200: 200 kHz\n - RELAY_SECOND_CH_ACK_OFFSET_400: 400 kHz\n - RELAY_SECOND_CH_ACK_OFFSET_800: 800 kHz\n - RELAY_SECOND_CH_ACK_OFFSET_1600: 1.6 MHz\n - RELAY_SECOND_CH_ACK_OFFSET_3200: 3.2 MHz", + "default": "RELAY_SECOND_CH_ACK_OFFSET_0", + "enum": [ + "RELAY_SECOND_CH_ACK_OFFSET_0", + "RELAY_SECOND_CH_ACK_OFFSET_200", + "RELAY_SECOND_CH_ACK_OFFSET_400", + "RELAY_SECOND_CH_ACK_OFFSET_800", + "RELAY_SECOND_CH_ACK_OFFSET_1600", + "RELAY_SECOND_CH_ACK_OFFSET_3200" + ] + }, + "data_rate_index": { + "type": "string", + "default": "DATA_RATE_0", + "enum": [ + "DATA_RATE_0", + "DATA_RATE_1", + "DATA_RATE_2", + "DATA_RATE_3", + "DATA_RATE_4", + "DATA_RATE_5", + "DATA_RATE_6", + "DATA_RATE_7", + "DATA_RATE_8", + "DATA_RATE_9", + "DATA_RATE_10", + "DATA_RATE_11", + "DATA_RATE_12", + "DATA_RATE_13", + "DATA_RATE_14", + "DATA_RATE_15" + ] + }, + "frequency": { + "description": "The frequency (Hz) used by the wake on radio message.", + "type": "string", + "format": "uint64" + } + } + }, + "serving_device_id": { + "description": "End device identifier of the serving end device.", + "type": "string" + } + } + }, + "serving": { + "type": "object", + "properties": { + "cad_periodicity": { + "type": "string", + "title": "- RELAY_CAD_PERIODICITY_20_MILLISECONDS: sic", + "default": "RELAY_CAD_PERIODICITY_1_SECOND", + "enum": [ + "RELAY_CAD_PERIODICITY_1_SECOND", + "RELAY_CAD_PERIODICITY_500_MILLISECONDS", + "RELAY_CAD_PERIODICITY_250_MILLISECONDS", + "RELAY_CAD_PERIODICITY_100_MILLISECONDS", + "RELAY_CAD_PERIODICITY_50_MILLISECONDS", + "RELAY_CAD_PERIODICITY_20_MILLISECONDS" + ] + }, + "default_channel_index": { + "description": "Index of the default wake on radio channel.", + "type": "integer", + "format": "int64" + }, + "limits": { + "type": "object", + "properties": { + "join_requests": { + "type": "object", + "properties": { + "bucket_size": { + "type": "string", + "title": "- RELAY_LIMIT_BUCKET_SIZE_12: sic", + "default": "RELAY_LIMIT_BUCKET_SIZE_1", + "enum": [ + "RELAY_LIMIT_BUCKET_SIZE_1", + "RELAY_LIMIT_BUCKET_SIZE_2", + "RELAY_LIMIT_BUCKET_SIZE_4", + "RELAY_LIMIT_BUCKET_SIZE_12" + ] + }, + "reload_rate": { + "description": "The number of tokens which are replenished in the bucket every hour.", + "type": "integer", + "format": "int64" + } + } + }, + "notifications": { + "type": "object", + "properties": { + "bucket_size": { + "type": "string", + "title": "- RELAY_LIMIT_BUCKET_SIZE_12: sic", + "default": "RELAY_LIMIT_BUCKET_SIZE_1", + "enum": [ + "RELAY_LIMIT_BUCKET_SIZE_1", + "RELAY_LIMIT_BUCKET_SIZE_2", + "RELAY_LIMIT_BUCKET_SIZE_4", + "RELAY_LIMIT_BUCKET_SIZE_12" + ] + }, + "reload_rate": { + "description": "The number of tokens which are replenished in the bucket every hour.", + "type": "integer", + "format": "int64" + } + } + }, + "overall": { + "type": "object", + "properties": { + "bucket_size": { + "type": "string", + "title": "- RELAY_LIMIT_BUCKET_SIZE_12: sic", + "default": "RELAY_LIMIT_BUCKET_SIZE_1", + "enum": [ + "RELAY_LIMIT_BUCKET_SIZE_1", + "RELAY_LIMIT_BUCKET_SIZE_2", + "RELAY_LIMIT_BUCKET_SIZE_4", + "RELAY_LIMIT_BUCKET_SIZE_12" + ] + }, + "reload_rate": { + "description": "The number of tokens which are replenished in the bucket every hour.", + "type": "integer", + "format": "int64" + } + } + }, + "reset_behavior": { + "type": "string", + "default": "RELAY_RESET_LIMIT_COUNTER_ZERO", + "enum": [ + "RELAY_RESET_LIMIT_COUNTER_ZERO", + "RELAY_RESET_LIMIT_COUNTER_RELOAD_RATE", + "RELAY_RESET_LIMIT_COUNTER_MAX_VALUE", + "RELAY_RESET_LIMIT_COUNTER_NO_RESET" + ] + }, + "uplink_messages": { + "type": "object", + "properties": { + "bucket_size": { + "type": "string", + "title": "- RELAY_LIMIT_BUCKET_SIZE_12: sic", + "default": "RELAY_LIMIT_BUCKET_SIZE_1", + "enum": [ + "RELAY_LIMIT_BUCKET_SIZE_1", + "RELAY_LIMIT_BUCKET_SIZE_2", + "RELAY_LIMIT_BUCKET_SIZE_4", + "RELAY_LIMIT_BUCKET_SIZE_12" + ] + }, + "reload_rate": { + "description": "The number of tokens which are replenished in the bucket every hour.", + "type": "integer", + "format": "int64" + } + } + } + } + }, + "second_channel": { + "type": "object", + "properties": { + "ack_offset": { + "type": "string", + "title": "- RELAY_SECOND_CH_ACK_OFFSET_0: 0 kHz\n - RELAY_SECOND_CH_ACK_OFFSET_200: 200 kHz\n - RELAY_SECOND_CH_ACK_OFFSET_400: 400 kHz\n - RELAY_SECOND_CH_ACK_OFFSET_800: 800 kHz\n - RELAY_SECOND_CH_ACK_OFFSET_1600: 1.6 MHz\n - RELAY_SECOND_CH_ACK_OFFSET_3200: 3.2 MHz", + "default": "RELAY_SECOND_CH_ACK_OFFSET_0", + "enum": [ + "RELAY_SECOND_CH_ACK_OFFSET_0", + "RELAY_SECOND_CH_ACK_OFFSET_200", + "RELAY_SECOND_CH_ACK_OFFSET_400", + "RELAY_SECOND_CH_ACK_OFFSET_800", + "RELAY_SECOND_CH_ACK_OFFSET_1600", + "RELAY_SECOND_CH_ACK_OFFSET_3200" + ] + }, + "data_rate_index": { + "type": "string", + "default": "DATA_RATE_0", + "enum": [ + "DATA_RATE_0", + "DATA_RATE_1", + "DATA_RATE_2", + "DATA_RATE_3", + "DATA_RATE_4", + "DATA_RATE_5", + "DATA_RATE_6", + "DATA_RATE_7", + "DATA_RATE_8", + "DATA_RATE_9", + "DATA_RATE_10", + "DATA_RATE_11", + "DATA_RATE_12", + "DATA_RATE_13", + "DATA_RATE_14", + "DATA_RATE_15" + ] + }, + "frequency": { + "description": "The frequency (Hz) used by the wake on radio message.", + "type": "string", + "format": "uint64" + } + } + }, + "uplink_forwarding_rules": { + "description": "Configured uplink forwarding rules.", + "type": "array", + "items": { + "type": "object", + "properties": { + "device_id": { + "description": "End device identifier of the served end device.", + "type": "string" + }, + "last_w_f_cnt": { + "description": "Last wake on radio frame counter used by the served end device.", + "type": "integer", + "format": "int64" + }, + "limits": { + "type": "object", + "properties": { + "bucket_size": { + "type": "string", + "title": "- RELAY_LIMIT_BUCKET_SIZE_12: sic", + "default": "RELAY_LIMIT_BUCKET_SIZE_1", + "enum": [ + "RELAY_LIMIT_BUCKET_SIZE_1", + "RELAY_LIMIT_BUCKET_SIZE_2", + "RELAY_LIMIT_BUCKET_SIZE_4", + "RELAY_LIMIT_BUCKET_SIZE_12" + ] + }, + "reload_rate": { + "description": "The number of tokens which are replenished in the bucket every hour.", + "type": "integer", + "format": "int64" + } + } + }, + "session_key_id": { + "description": "Session key ID of the session keys used to derive the root relay session key.", + "type": "string", + "format": "byte" + } + } + } + } + } + } + } + }, + "rx1_data_rate_offset": { + "type": "string", + "default": "DATA_RATE_OFFSET_0", + "enum": [ + "DATA_RATE_OFFSET_0", + "DATA_RATE_OFFSET_1", + "DATA_RATE_OFFSET_2", + "DATA_RATE_OFFSET_3", + "DATA_RATE_OFFSET_4", + "DATA_RATE_OFFSET_5", + "DATA_RATE_OFFSET_6", + "DATA_RATE_OFFSET_7" + ] + }, + "rx1_delay": { + "description": " - RX_DELAY_0: 1 second.\n - RX_DELAY_1: 1 second.\n - RX_DELAY_2: 2 seconds.\n - RX_DELAY_3: 3 seconds.\n - RX_DELAY_4: 4 seconds.\n - RX_DELAY_5: 5 seconds.\n - RX_DELAY_6: 6 seconds.\n - RX_DELAY_7: 7 seconds.\n - RX_DELAY_8: 8 seconds.\n - RX_DELAY_9: 9 seconds.\n - RX_DELAY_10: 10 seconds.\n - RX_DELAY_11: 11 seconds.\n - RX_DELAY_12: 12 seconds.\n - RX_DELAY_13: 13 seconds.\n - RX_DELAY_14: 14 seconds.\n - RX_DELAY_15: 15 seconds.", + "type": "string", + "default": "RX_DELAY_0", + "enum": [ + "RX_DELAY_0", + "RX_DELAY_1", + "RX_DELAY_2", + "RX_DELAY_3", + "RX_DELAY_4", + "RX_DELAY_5", + "RX_DELAY_6", + "RX_DELAY_7", + "RX_DELAY_8", + "RX_DELAY_9", + "RX_DELAY_10", + "RX_DELAY_11", + "RX_DELAY_12", + "RX_DELAY_13", + "RX_DELAY_14", + "RX_DELAY_15" + ] + }, + "rx2_data_rate_index": { + "type": "string", + "default": "DATA_RATE_0", + "enum": [ + "DATA_RATE_0", + "DATA_RATE_1", + "DATA_RATE_2", + "DATA_RATE_3", + "DATA_RATE_4", + "DATA_RATE_5", + "DATA_RATE_6", + "DATA_RATE_7", + "DATA_RATE_8", + "DATA_RATE_9", + "DATA_RATE_10", + "DATA_RATE_11", + "DATA_RATE_12", + "DATA_RATE_13", + "DATA_RATE_14", + "DATA_RATE_15" + ] + }, + "rx2_frequency": { + "description": "Frequency for Rx2 (Hz).", + "type": "string", + "format": "uint64" + }, + "uplink_dwell_time": { + "type": "object", + "properties": { + "value": { + "type": "boolean" + } + } + } + } + }, + "desired_parameters": { + "description": "MACParameters represent the parameters of the device's MAC layer (active or desired).\nThis is used internally by the Network Server.", + "type": "object", + "properties": { + "adr_ack_delay": { + "description": "ADR: number of messages to wait after setting ADRAckReq and before changing TxPower or DataRate.\nThis field is deprecated, use adr_ack_delay_exponent instead.", + "type": "integer", + "format": "int64" + }, + "adr_ack_delay_exponent": { + "type": "object", + "properties": { + "value": { + "type": "string", + "default": "ADR_ACK_DELAY_1", + "enum": [ + "ADR_ACK_DELAY_1", + "ADR_ACK_DELAY_2", + "ADR_ACK_DELAY_4", + "ADR_ACK_DELAY_8", + "ADR_ACK_DELAY_16", + "ADR_ACK_DELAY_32", + "ADR_ACK_DELAY_64", + "ADR_ACK_DELAY_128", + "ADR_ACK_DELAY_256", + "ADR_ACK_DELAY_512", + "ADR_ACK_DELAY_1024", + "ADR_ACK_DELAY_2048", + "ADR_ACK_DELAY_4096", + "ADR_ACK_DELAY_8192", + "ADR_ACK_DELAY_16384", + "ADR_ACK_DELAY_32768" + ] + } + } + }, + "adr_ack_limit": { + "description": "ADR: number of messages to wait before setting ADRAckReq.\nThis field is deprecated, use adr_ack_limit_exponent instead.", + "type": "integer", + "format": "int64" + }, + "adr_ack_limit_exponent": { + "type": "object", + "properties": { + "value": { + "type": "string", + "default": "ADR_ACK_LIMIT_1", + "enum": [ + "ADR_ACK_LIMIT_1", + "ADR_ACK_LIMIT_2", + "ADR_ACK_LIMIT_4", + "ADR_ACK_LIMIT_8", + "ADR_ACK_LIMIT_16", + "ADR_ACK_LIMIT_32", + "ADR_ACK_LIMIT_64", + "ADR_ACK_LIMIT_128", + "ADR_ACK_LIMIT_256", + "ADR_ACK_LIMIT_512", + "ADR_ACK_LIMIT_1024", + "ADR_ACK_LIMIT_2048", + "ADR_ACK_LIMIT_4096", + "ADR_ACK_LIMIT_8192", + "ADR_ACK_LIMIT_16384", + "ADR_ACK_LIMIT_32768" + ] + } + } + }, + "adr_data_rate_index": { + "type": "string", + "default": "DATA_RATE_0", + "enum": [ + "DATA_RATE_0", + "DATA_RATE_1", + "DATA_RATE_2", + "DATA_RATE_3", + "DATA_RATE_4", + "DATA_RATE_5", + "DATA_RATE_6", + "DATA_RATE_7", + "DATA_RATE_8", + "DATA_RATE_9", + "DATA_RATE_10", + "DATA_RATE_11", + "DATA_RATE_12", + "DATA_RATE_13", + "DATA_RATE_14", + "DATA_RATE_15" + ] + }, + "adr_nb_trans": { + "description": "ADR: number of retransmissions.", + "type": "integer", + "format": "int64" + }, + "adr_tx_power_index": { + "description": "ADR: transmission power index to use.", + "type": "integer", + "format": "int64" + }, + "beacon_frequency": { + "description": "Frequency of the class B beacon (Hz).", + "type": "string", + "format": "uint64" + }, + "channels": { + "description": "Configured uplink channels and optionally Rx1 frequency.", + "type": "array", + "items": { + "type": "object", + "properties": { + "downlink_frequency": { + "description": "Downlink frequency of the channel (Hz).", + "type": "string", + "format": "uint64" + }, + "enable_uplink": { + "description": "Channel can be used by device for uplink.", + "type": "boolean" + }, + "max_data_rate_index": { + "type": "string", + "default": "DATA_RATE_0", + "enum": [ + "DATA_RATE_0", + "DATA_RATE_1", + "DATA_RATE_2", + "DATA_RATE_3", + "DATA_RATE_4", + "DATA_RATE_5", + "DATA_RATE_6", + "DATA_RATE_7", + "DATA_RATE_8", + "DATA_RATE_9", + "DATA_RATE_10", + "DATA_RATE_11", + "DATA_RATE_12", + "DATA_RATE_13", + "DATA_RATE_14", + "DATA_RATE_15" + ] + }, + "min_data_rate_index": { + "type": "string", + "default": "DATA_RATE_0", + "enum": [ + "DATA_RATE_0", + "DATA_RATE_1", + "DATA_RATE_2", + "DATA_RATE_3", + "DATA_RATE_4", + "DATA_RATE_5", + "DATA_RATE_6", + "DATA_RATE_7", + "DATA_RATE_8", + "DATA_RATE_9", + "DATA_RATE_10", + "DATA_RATE_11", + "DATA_RATE_12", + "DATA_RATE_13", + "DATA_RATE_14", + "DATA_RATE_15" + ] + }, + "uplink_frequency": { + "description": "Uplink frequency of the channel (Hz).", + "type": "string", + "format": "uint64" + } + } + } + }, + "downlink_dwell_time": { + "type": "object", + "properties": { + "value": { + "type": "boolean" + } + } + }, + "max_duty_cycle": { + "description": " - DUTY_CYCLE_1: 100%.\n - DUTY_CYCLE_2: 50%.\n - DUTY_CYCLE_4: 25%.\n - DUTY_CYCLE_8: 12.5%.\n - DUTY_CYCLE_16: 6.25%.\n - DUTY_CYCLE_32: 3.125%.\n - DUTY_CYCLE_64: 1.5625%.\n - DUTY_CYCLE_128: Roughly 0.781%.\n - DUTY_CYCLE_256: Roughly 0.390%.\n - DUTY_CYCLE_512: Roughly 0.195%.\n - DUTY_CYCLE_1024: Roughly 0.098%.\n - DUTY_CYCLE_2048: Roughly 0.049%.\n - DUTY_CYCLE_4096: Roughly 0.024%.\n - DUTY_CYCLE_8192: Roughly 0.012%.\n - DUTY_CYCLE_16384: Roughly 0.006%.\n - DUTY_CYCLE_32768: Roughly 0.003%.", + "type": "string", + "default": "DUTY_CYCLE_1", + "enum": [ + "DUTY_CYCLE_1", + "DUTY_CYCLE_2", + "DUTY_CYCLE_4", + "DUTY_CYCLE_8", + "DUTY_CYCLE_16", + "DUTY_CYCLE_32", + "DUTY_CYCLE_64", + "DUTY_CYCLE_128", + "DUTY_CYCLE_256", + "DUTY_CYCLE_512", + "DUTY_CYCLE_1024", + "DUTY_CYCLE_2048", + "DUTY_CYCLE_4096", + "DUTY_CYCLE_8192", + "DUTY_CYCLE_16384", + "DUTY_CYCLE_32768" + ] + }, + "max_eirp": { + "description": "Maximum EIRP (dBm).", + "type": "number", + "format": "float" + }, + "ping_slot_data_rate_index": { + "type": "string", + "default": "DATA_RATE_0", + "enum": [ + "DATA_RATE_0", + "DATA_RATE_1", + "DATA_RATE_2", + "DATA_RATE_3", + "DATA_RATE_4", + "DATA_RATE_5", + "DATA_RATE_6", + "DATA_RATE_7", + "DATA_RATE_8", + "DATA_RATE_9", + "DATA_RATE_10", + "DATA_RATE_11", + "DATA_RATE_12", + "DATA_RATE_13", + "DATA_RATE_14", + "DATA_RATE_15" + ] + }, + "ping_slot_data_rate_index_value": { + "type": "object", + "properties": { + "value": { + "type": "string", + "default": "DATA_RATE_0", + "enum": [ + "DATA_RATE_0", + "DATA_RATE_1", + "DATA_RATE_2", + "DATA_RATE_3", + "DATA_RATE_4", + "DATA_RATE_5", + "DATA_RATE_6", + "DATA_RATE_7", + "DATA_RATE_8", + "DATA_RATE_9", + "DATA_RATE_10", + "DATA_RATE_11", + "DATA_RATE_12", + "DATA_RATE_13", + "DATA_RATE_14", + "DATA_RATE_15" + ] + } + } + }, + "ping_slot_frequency": { + "description": "Frequency of the class B ping slot (Hz).", + "type": "string", + "format": "uint64" + }, + "rejoin_count_periodicity": { + "type": "string", + "default": "REJOIN_COUNT_16", + "enum": [ + "REJOIN_COUNT_16", + "REJOIN_COUNT_32", + "REJOIN_COUNT_64", + "REJOIN_COUNT_128", + "REJOIN_COUNT_256", + "REJOIN_COUNT_512", + "REJOIN_COUNT_1024", + "REJOIN_COUNT_2048", + "REJOIN_COUNT_4096", + "REJOIN_COUNT_8192", + "REJOIN_COUNT_16384", + "REJOIN_COUNT_32768", + "REJOIN_COUNT_65536", + "REJOIN_COUNT_131072", + "REJOIN_COUNT_262144", + "REJOIN_COUNT_524288" + ] + }, + "rejoin_time_periodicity": { + "description": " - REJOIN_TIME_0: Every ~17.1 minutes.\n - REJOIN_TIME_1: Every ~34.1 minutes.\n - REJOIN_TIME_2: Every ~1.1 hours.\n - REJOIN_TIME_3: Every ~2.3 hours.\n - REJOIN_TIME_4: Every ~4.6 hours.\n - REJOIN_TIME_5: Every ~9.1 hours.\n - REJOIN_TIME_6: Every ~18.2 hours.\n - REJOIN_TIME_7: Every ~1.5 days.\n - REJOIN_TIME_8: Every ~3.0 days.\n - REJOIN_TIME_9: Every ~6.1 days.\n - REJOIN_TIME_10: Every ~12.1 days.\n - REJOIN_TIME_11: Every ~3.5 weeks.\n - REJOIN_TIME_12: Every ~1.6 months.\n - REJOIN_TIME_13: Every ~3.2 months.\n - REJOIN_TIME_14: Every ~6.4 months.\n - REJOIN_TIME_15: Every ~1.1 year.", + "type": "string", + "default": "REJOIN_TIME_0", + "enum": [ + "REJOIN_TIME_0", + "REJOIN_TIME_1", + "REJOIN_TIME_2", + "REJOIN_TIME_3", + "REJOIN_TIME_4", + "REJOIN_TIME_5", + "REJOIN_TIME_6", + "REJOIN_TIME_7", + "REJOIN_TIME_8", + "REJOIN_TIME_9", + "REJOIN_TIME_10", + "REJOIN_TIME_11", + "REJOIN_TIME_12", + "REJOIN_TIME_13", + "REJOIN_TIME_14", + "REJOIN_TIME_15" + ] + }, + "relay": { + "description": "RelayParameters represent the parameters of a relay.\nThis is used internally by the Network Server.", + "type": "object", + "properties": { + "served": { + "type": "object", + "properties": { + "always": { + "type": "object" + }, + "backoff": { + "description": "Number of wake on radio frames to be sent without an acknowledgement before sending the uplink message directly.", + "type": "integer", + "format": "int64" + }, + "dynamic": { + "type": "object", + "properties": { + "smart_enable_level": { + "type": "string", + "default": "RELAY_SMART_ENABLE_LEVEL_8", + "enum": [ + "RELAY_SMART_ENABLE_LEVEL_8", + "RELAY_SMART_ENABLE_LEVEL_16", + "RELAY_SMART_ENABLE_LEVEL_32", + "RELAY_SMART_ENABLE_LEVEL_64" + ] + } + } + }, + "end_device_controlled": { + "type": "object" + }, + "second_channel": { + "type": "object", + "properties": { + "ack_offset": { + "type": "string", + "title": "- RELAY_SECOND_CH_ACK_OFFSET_0: 0 kHz\n - RELAY_SECOND_CH_ACK_OFFSET_200: 200 kHz\n - RELAY_SECOND_CH_ACK_OFFSET_400: 400 kHz\n - RELAY_SECOND_CH_ACK_OFFSET_800: 800 kHz\n - RELAY_SECOND_CH_ACK_OFFSET_1600: 1.6 MHz\n - RELAY_SECOND_CH_ACK_OFFSET_3200: 3.2 MHz", + "default": "RELAY_SECOND_CH_ACK_OFFSET_0", + "enum": [ + "RELAY_SECOND_CH_ACK_OFFSET_0", + "RELAY_SECOND_CH_ACK_OFFSET_200", + "RELAY_SECOND_CH_ACK_OFFSET_400", + "RELAY_SECOND_CH_ACK_OFFSET_800", + "RELAY_SECOND_CH_ACK_OFFSET_1600", + "RELAY_SECOND_CH_ACK_OFFSET_3200" + ] + }, + "data_rate_index": { + "type": "string", + "default": "DATA_RATE_0", + "enum": [ + "DATA_RATE_0", + "DATA_RATE_1", + "DATA_RATE_2", + "DATA_RATE_3", + "DATA_RATE_4", + "DATA_RATE_5", + "DATA_RATE_6", + "DATA_RATE_7", + "DATA_RATE_8", + "DATA_RATE_9", + "DATA_RATE_10", + "DATA_RATE_11", + "DATA_RATE_12", + "DATA_RATE_13", + "DATA_RATE_14", + "DATA_RATE_15" + ] + }, + "frequency": { + "description": "The frequency (Hz) used by the wake on radio message.", + "type": "string", + "format": "uint64" + } + } + }, + "serving_device_id": { + "description": "End device identifier of the serving end device.", + "type": "string" + } + } + }, + "serving": { + "type": "object", + "properties": { + "cad_periodicity": { + "type": "string", + "title": "- RELAY_CAD_PERIODICITY_20_MILLISECONDS: sic", + "default": "RELAY_CAD_PERIODICITY_1_SECOND", + "enum": [ + "RELAY_CAD_PERIODICITY_1_SECOND", + "RELAY_CAD_PERIODICITY_500_MILLISECONDS", + "RELAY_CAD_PERIODICITY_250_MILLISECONDS", + "RELAY_CAD_PERIODICITY_100_MILLISECONDS", + "RELAY_CAD_PERIODICITY_50_MILLISECONDS", + "RELAY_CAD_PERIODICITY_20_MILLISECONDS" + ] + }, + "default_channel_index": { + "description": "Index of the default wake on radio channel.", + "type": "integer", + "format": "int64" + }, + "limits": { + "type": "object", + "properties": { + "join_requests": { + "type": "object", + "properties": { + "bucket_size": { + "type": "string", + "title": "- RELAY_LIMIT_BUCKET_SIZE_12: sic", + "default": "RELAY_LIMIT_BUCKET_SIZE_1", + "enum": [ + "RELAY_LIMIT_BUCKET_SIZE_1", + "RELAY_LIMIT_BUCKET_SIZE_2", + "RELAY_LIMIT_BUCKET_SIZE_4", + "RELAY_LIMIT_BUCKET_SIZE_12" + ] + }, + "reload_rate": { + "description": "The number of tokens which are replenished in the bucket every hour.", + "type": "integer", + "format": "int64" + } + } + }, + "notifications": { + "type": "object", + "properties": { + "bucket_size": { + "type": "string", + "title": "- RELAY_LIMIT_BUCKET_SIZE_12: sic", + "default": "RELAY_LIMIT_BUCKET_SIZE_1", + "enum": [ + "RELAY_LIMIT_BUCKET_SIZE_1", + "RELAY_LIMIT_BUCKET_SIZE_2", + "RELAY_LIMIT_BUCKET_SIZE_4", + "RELAY_LIMIT_BUCKET_SIZE_12" + ] + }, + "reload_rate": { + "description": "The number of tokens which are replenished in the bucket every hour.", + "type": "integer", + "format": "int64" + } + } + }, + "overall": { + "type": "object", + "properties": { + "bucket_size": { + "type": "string", + "title": "- RELAY_LIMIT_BUCKET_SIZE_12: sic", + "default": "RELAY_LIMIT_BUCKET_SIZE_1", + "enum": [ + "RELAY_LIMIT_BUCKET_SIZE_1", + "RELAY_LIMIT_BUCKET_SIZE_2", + "RELAY_LIMIT_BUCKET_SIZE_4", + "RELAY_LIMIT_BUCKET_SIZE_12" + ] + }, + "reload_rate": { + "description": "The number of tokens which are replenished in the bucket every hour.", + "type": "integer", + "format": "int64" + } + } + }, + "reset_behavior": { + "type": "string", + "default": "RELAY_RESET_LIMIT_COUNTER_ZERO", + "enum": [ + "RELAY_RESET_LIMIT_COUNTER_ZERO", + "RELAY_RESET_LIMIT_COUNTER_RELOAD_RATE", + "RELAY_RESET_LIMIT_COUNTER_MAX_VALUE", + "RELAY_RESET_LIMIT_COUNTER_NO_RESET" + ] + }, + "uplink_messages": { + "type": "object", + "properties": { + "bucket_size": { + "type": "string", + "title": "- RELAY_LIMIT_BUCKET_SIZE_12: sic", + "default": "RELAY_LIMIT_BUCKET_SIZE_1", + "enum": [ + "RELAY_LIMIT_BUCKET_SIZE_1", + "RELAY_LIMIT_BUCKET_SIZE_2", + "RELAY_LIMIT_BUCKET_SIZE_4", + "RELAY_LIMIT_BUCKET_SIZE_12" + ] + }, + "reload_rate": { + "description": "The number of tokens which are replenished in the bucket every hour.", + "type": "integer", + "format": "int64" + } + } + } + } + }, + "second_channel": { + "type": "object", + "properties": { + "ack_offset": { + "type": "string", + "title": "- RELAY_SECOND_CH_ACK_OFFSET_0: 0 kHz\n - RELAY_SECOND_CH_ACK_OFFSET_200: 200 kHz\n - RELAY_SECOND_CH_ACK_OFFSET_400: 400 kHz\n - RELAY_SECOND_CH_ACK_OFFSET_800: 800 kHz\n - RELAY_SECOND_CH_ACK_OFFSET_1600: 1.6 MHz\n - RELAY_SECOND_CH_ACK_OFFSET_3200: 3.2 MHz", + "default": "RELAY_SECOND_CH_ACK_OFFSET_0", + "enum": [ + "RELAY_SECOND_CH_ACK_OFFSET_0", + "RELAY_SECOND_CH_ACK_OFFSET_200", + "RELAY_SECOND_CH_ACK_OFFSET_400", + "RELAY_SECOND_CH_ACK_OFFSET_800", + "RELAY_SECOND_CH_ACK_OFFSET_1600", + "RELAY_SECOND_CH_ACK_OFFSET_3200" + ] + }, + "data_rate_index": { + "type": "string", + "default": "DATA_RATE_0", + "enum": [ + "DATA_RATE_0", + "DATA_RATE_1", + "DATA_RATE_2", + "DATA_RATE_3", + "DATA_RATE_4", + "DATA_RATE_5", + "DATA_RATE_6", + "DATA_RATE_7", + "DATA_RATE_8", + "DATA_RATE_9", + "DATA_RATE_10", + "DATA_RATE_11", + "DATA_RATE_12", + "DATA_RATE_13", + "DATA_RATE_14", + "DATA_RATE_15" + ] + }, + "frequency": { + "description": "The frequency (Hz) used by the wake on radio message.", + "type": "string", + "format": "uint64" + } + } + }, + "uplink_forwarding_rules": { + "description": "Configured uplink forwarding rules.", + "type": "array", + "items": { + "type": "object", + "properties": { + "device_id": { + "description": "End device identifier of the served end device.", + "type": "string" + }, + "last_w_f_cnt": { + "description": "Last wake on radio frame counter used by the served end device.", + "type": "integer", + "format": "int64" + }, + "limits": { + "type": "object", + "properties": { + "bucket_size": { + "type": "string", + "title": "- RELAY_LIMIT_BUCKET_SIZE_12: sic", + "default": "RELAY_LIMIT_BUCKET_SIZE_1", + "enum": [ + "RELAY_LIMIT_BUCKET_SIZE_1", + "RELAY_LIMIT_BUCKET_SIZE_2", + "RELAY_LIMIT_BUCKET_SIZE_4", + "RELAY_LIMIT_BUCKET_SIZE_12" + ] + }, + "reload_rate": { + "description": "The number of tokens which are replenished in the bucket every hour.", + "type": "integer", + "format": "int64" + } + } + }, + "session_key_id": { + "description": "Session key ID of the session keys used to derive the root relay session key.", + "type": "string", + "format": "byte" + } + } + } + } + } + } + } + }, + "rx1_data_rate_offset": { + "type": "string", + "default": "DATA_RATE_OFFSET_0", + "enum": [ + "DATA_RATE_OFFSET_0", + "DATA_RATE_OFFSET_1", + "DATA_RATE_OFFSET_2", + "DATA_RATE_OFFSET_3", + "DATA_RATE_OFFSET_4", + "DATA_RATE_OFFSET_5", + "DATA_RATE_OFFSET_6", + "DATA_RATE_OFFSET_7" + ] + }, + "rx1_delay": { + "description": " - RX_DELAY_0: 1 second.\n - RX_DELAY_1: 1 second.\n - RX_DELAY_2: 2 seconds.\n - RX_DELAY_3: 3 seconds.\n - RX_DELAY_4: 4 seconds.\n - RX_DELAY_5: 5 seconds.\n - RX_DELAY_6: 6 seconds.\n - RX_DELAY_7: 7 seconds.\n - RX_DELAY_8: 8 seconds.\n - RX_DELAY_9: 9 seconds.\n - RX_DELAY_10: 10 seconds.\n - RX_DELAY_11: 11 seconds.\n - RX_DELAY_12: 12 seconds.\n - RX_DELAY_13: 13 seconds.\n - RX_DELAY_14: 14 seconds.\n - RX_DELAY_15: 15 seconds.", + "type": "string", + "default": "RX_DELAY_0", + "enum": [ + "RX_DELAY_0", + "RX_DELAY_1", + "RX_DELAY_2", + "RX_DELAY_3", + "RX_DELAY_4", + "RX_DELAY_5", + "RX_DELAY_6", + "RX_DELAY_7", + "RX_DELAY_8", + "RX_DELAY_9", + "RX_DELAY_10", + "RX_DELAY_11", + "RX_DELAY_12", + "RX_DELAY_13", + "RX_DELAY_14", + "RX_DELAY_15" + ] + }, + "rx2_data_rate_index": { + "type": "string", + "default": "DATA_RATE_0", + "enum": [ + "DATA_RATE_0", + "DATA_RATE_1", + "DATA_RATE_2", + "DATA_RATE_3", + "DATA_RATE_4", + "DATA_RATE_5", + "DATA_RATE_6", + "DATA_RATE_7", + "DATA_RATE_8", + "DATA_RATE_9", + "DATA_RATE_10", + "DATA_RATE_11", + "DATA_RATE_12", + "DATA_RATE_13", + "DATA_RATE_14", + "DATA_RATE_15" + ] + }, + "rx2_frequency": { + "description": "Frequency for Rx2 (Hz).", + "type": "string", + "format": "uint64" + }, + "uplink_dwell_time": { + "type": "object", + "properties": { + "value": { + "type": "boolean" + } + } + } + } + }, + "device_class": { + "type": "string", + "default": "CLASS_A", + "enum": [ + "CLASS_A", + "CLASS_B", + "CLASS_C" + ] + }, + "last_adr_change_f_cnt_up": { + "description": "Frame counter of uplink, which confirmed the last ADR parameter change.", + "type": "integer", + "format": "int64" + }, + "last_confirmed_downlink_at": { + "description": "Time when the last confirmed downlink message or MAC command was scheduled.", + "type": "string", + "format": "date-time" + }, + "last_dev_status_f_cnt_up": { + "description": "Frame counter value of last uplink containing DevStatusAns.", + "type": "integer", + "format": "int64" + }, + "last_downlink_at": { + "description": "Time when the last downlink message was scheduled.", + "type": "string", + "format": "date-time" + }, + "last_network_initiated_downlink_at": { + "description": "Time when the last network-initiated downlink message was scheduled.", + "type": "string", + "format": "date-time" + }, + "lorawan_version": { + "type": "string", + "default": "MAC_UNKNOWN", + "enum": [ + "MAC_UNKNOWN", + "MAC_V1_0", + "MAC_V1_0_1", + "MAC_V1_0_2", + "MAC_V1_1", + "MAC_V1_0_3", + "MAC_V1_0_4" + ] + }, + "pending_application_downlink": { + "type": "object", + "properties": { + "attributes": { + "description": "Attributes for devices, set by the Application Server while handling the message.", + "type": "object", + "additionalProperties": { + "type": "string" + } + }, + "class_b_c": { + "type": "object", + "properties": { + "absolute_time": { + "description": "Absolute time when the downlink message should be transmitted.\nThis requires the gateway to have GPS time synchronization.\nIf the time is in the past or if there is a scheduling conflict, the downlink message fails.\nIf null, the time is selected based on slot availability. This is recommended in class B mode.", + "type": "string", + "format": "date-time" + }, + "gateways": { + "description": "Possible gateway identifiers, antenna index, and group index to use for this downlink message.\nThe Network Server selects one of these gateways for downlink, based on connectivity, signal quality, channel utilization and an available slot.\nIf none of the gateways can be selected, the downlink message fails.\nIf empty, a gateway and antenna is selected automatically from the gateways seen in recent uplinks.\nIf group index is set, gateways will be grouped by the index for the Network Server to select one gateway per group.", + "type": "array", + "items": { + "type": "object", + "properties": { + "antenna_index": { + "type": "integer", + "format": "int64" + }, + "gateway_ids": { + "type": "object", + "properties": { + "eui": { + "description": "Secondary identifier, which can only be used in specific requests.", + "type": "string", + "format": "string", + "example": "70B3D57ED000ABCD" + }, + "gateway_id": { + "type": "string" + } + } + }, + "group_index": { + "type": "integer", + "format": "int64" + } + } + } + } + } + }, + "confirmed": { + "type": "boolean" + }, + "confirmed_retry": { + "type": "object", + "properties": { + "attempt": { + "description": "The number of attempted confirmed downlink acknowledgements.", + "type": "integer", + "format": "int64" + }, + "max_attempts": { + "description": "The maximum number of confirmed downlink acknowledgement attempts.\nIf null, the Application Server configuration is used instead.", + "type": "integer", + "format": "int64" + } + } + }, + "correlation_ids": { + "type": "array", + "items": { + "type": "string" + } + }, + "decoded_payload": { + "description": "The decoded frame payload of the downlink message.\nWhen scheduling downlink with a message processor configured for the end device (see formatters) or application (see default_formatters),\nthis fields acts as input for the downlink encoder, and the output is set to frm_payload.\nWhen reading downlink (listing the queue, downlink message events, etc), this fields acts as output of the downlink decoder, and the input is frm_payload.", + "type": "object" + }, + "decoded_payload_warnings": { + "description": "Warnings generated by the message processor while encoding frm_payload (scheduling downlink) or decoding the frm_payload (reading downlink).", + "type": "array", + "items": { + "type": "string" + } + }, + "f_cnt": { + "type": "integer", + "format": "int64" + }, + "f_port": { + "type": "integer", + "format": "int64" + }, + "frm_payload": { + "description": "The frame payload of the downlink message.\nThe payload is encrypted if the skip_payload_crypto field of the EndDevice\nis true.", + "type": "string", + "format": "byte" + }, + "locations": { + "description": "End device location metadata, set by the Application Server while handling the message.", + "type": "object", + "additionalProperties": { + "type": "object", + "properties": { + "accuracy": { + "description": "The accuracy of the location (meters).", + "type": "integer", + "format": "int32" + }, + "altitude": { + "description": "The altitude (meters), where 0 is the mean sea level.", + "type": "integer", + "format": "int32" + }, + "latitude": { + "description": "The North–South position (degrees; -90 to +90), where 0 is the equator, North pole is positive, South pole is negative.", + "type": "number", + "format": "double" + }, + "longitude": { + "description": "The East-West position (degrees; -180 to +180), where 0 is the Prime Meridian (Greenwich), East is positive , West is negative.", + "type": "number", + "format": "double" + }, + "source": { + "description": " - SOURCE_UNKNOWN: The source of the location is not known or not set.\n - SOURCE_GPS: The location is determined by GPS.\n - SOURCE_REGISTRY: The location is set in and updated from a registry.\n - SOURCE_IP_GEOLOCATION: The location is estimated with IP geolocation.\n - SOURCE_WIFI_RSSI_GEOLOCATION: The location is estimated with WiFi RSSI geolocation.\n - SOURCE_BT_RSSI_GEOLOCATION: The location is estimated with BT/BLE RSSI geolocation.\n - SOURCE_LORA_RSSI_GEOLOCATION: The location is estimated with LoRa RSSI geolocation.\n - SOURCE_LORA_TDOA_GEOLOCATION: The location is estimated with LoRa TDOA geolocation.\n - SOURCE_COMBINED_GEOLOCATION: The location is estimated by a combination of geolocation sources.\n\nMore estimation methods can be added.", + "type": "string", + "default": "SOURCE_UNKNOWN", + "enum": [ + "SOURCE_UNKNOWN", + "SOURCE_GPS", + "SOURCE_REGISTRY", + "SOURCE_IP_GEOLOCATION", + "SOURCE_WIFI_RSSI_GEOLOCATION", + "SOURCE_BT_RSSI_GEOLOCATION", + "SOURCE_LORA_RSSI_GEOLOCATION", + "SOURCE_LORA_TDOA_GEOLOCATION", + "SOURCE_COMBINED_GEOLOCATION" + ] + } + } + } + }, + "network_ids": { + "description": "Identifies a Network Server.", + "type": "object", + "properties": { + "cluster_address": { + "description": "Cluster address of the Network Server.", + "type": "string" + }, + "cluster_id": { + "description": "Cluster identifier of the Network Server.", + "type": "string" + }, + "net_id": { + "description": "LoRa Alliance NetID.", + "type": "string", + "format": "string", + "example": "000013" + }, + "ns_id": { + "description": "LoRaWAN NSID (EUI-64) that uniquely identifies the Network Server instance.", + "type": "string", + "format": "string", + "example": "70B3D57ED000ABCD" + }, + "tenant_address": { + "description": "Optional tenant address for multi-tenant deployments.", + "type": "string" + }, + "tenant_id": { + "description": "Optional tenant identifier for multi-tenant deployments.", + "type": "string" + } + } + }, + "priority": { + "type": "string", + "default": "LOWEST", + "enum": [ + "LOWEST", + "LOW", + "BELOW_NORMAL", + "NORMAL", + "ABOVE_NORMAL", + "HIGH", + "HIGHEST" + ] + }, + "session_key_id": { + "description": "Join Server issued identifier for the session keys used by this downlink.", + "type": "string", + "format": "byte" + }, + "version_ids": { + "description": "Identifies an end device model with version information.", + "type": "object", + "properties": { + "band_id": { + "type": "string" + }, + "brand_id": { + "type": "string" + }, + "firmware_version": { + "type": "string" + }, + "hardware_version": { + "type": "string" + }, + "model_id": { + "type": "string" + } + } + } + } + }, + "pending_join_request": { + "type": "object", + "properties": { + "cf_list": { + "type": "object", + "properties": { + "ch_masks": { + "description": "ChMasks controlling the channels to be used.\nLength of this field must be equal to the amount of uplink channels\ndefined by the selected frequency plan.", + "type": "array", + "items": { + "type": "boolean" + } + }, + "freq": { + "description": "Frequencies to be broadcasted, in hecto-Hz.\nThese values are broadcasted as 24 bits unsigned integers.\nThis field should not contain default values.", + "type": "array", + "items": { + "type": "integer", + "format": "int64" + } + }, + "type": { + "type": "string", + "default": "FREQUENCIES", + "enum": [ + "FREQUENCIES", + "CHANNEL_MASKS" + ] + } + } + }, + "downlink_settings": { + "type": "object", + "properties": { + "opt_neg": { + "description": "OptNeg is set if Network Server implements LoRaWAN 1.1 or greater.", + "type": "boolean" + }, + "rx1_dr_offset": { + "type": "string", + "default": "DATA_RATE_OFFSET_0", + "enum": [ + "DATA_RATE_OFFSET_0", + "DATA_RATE_OFFSET_1", + "DATA_RATE_OFFSET_2", + "DATA_RATE_OFFSET_3", + "DATA_RATE_OFFSET_4", + "DATA_RATE_OFFSET_5", + "DATA_RATE_OFFSET_6", + "DATA_RATE_OFFSET_7" + ] + }, + "rx2_dr": { + "type": "string", + "default": "DATA_RATE_0", + "enum": [ + "DATA_RATE_0", + "DATA_RATE_1", + "DATA_RATE_2", + "DATA_RATE_3", + "DATA_RATE_4", + "DATA_RATE_5", + "DATA_RATE_6", + "DATA_RATE_7", + "DATA_RATE_8", + "DATA_RATE_9", + "DATA_RATE_10", + "DATA_RATE_11", + "DATA_RATE_12", + "DATA_RATE_13", + "DATA_RATE_14", + "DATA_RATE_15" + ] + } + } + }, + "rx_delay": { + "description": " - RX_DELAY_0: 1 second.\n - RX_DELAY_1: 1 second.\n - RX_DELAY_2: 2 seconds.\n - RX_DELAY_3: 3 seconds.\n - RX_DELAY_4: 4 seconds.\n - RX_DELAY_5: 5 seconds.\n - RX_DELAY_6: 6 seconds.\n - RX_DELAY_7: 7 seconds.\n - RX_DELAY_8: 8 seconds.\n - RX_DELAY_9: 9 seconds.\n - RX_DELAY_10: 10 seconds.\n - RX_DELAY_11: 11 seconds.\n - RX_DELAY_12: 12 seconds.\n - RX_DELAY_13: 13 seconds.\n - RX_DELAY_14: 14 seconds.\n - RX_DELAY_15: 15 seconds.", + "type": "string", + "default": "RX_DELAY_0", + "enum": [ + "RX_DELAY_0", + "RX_DELAY_1", + "RX_DELAY_2", + "RX_DELAY_3", + "RX_DELAY_4", + "RX_DELAY_5", + "RX_DELAY_6", + "RX_DELAY_7", + "RX_DELAY_8", + "RX_DELAY_9", + "RX_DELAY_10", + "RX_DELAY_11", + "RX_DELAY_12", + "RX_DELAY_13", + "RX_DELAY_14", + "RX_DELAY_15" + ] + } + } + }, + "pending_relay_downlink": { + "type": "object", + "properties": { + "raw_payload": { + "type": "string", + "format": "byte" + } + } + }, + "pending_requests": { + "description": "Pending MAC requests(i.e. sent requests, for which no response has been received yet).\nRegenerated on each downlink.", + "type": "array", + "items": { + "type": "object", + "properties": { + "adr_param_setup_req": { + "type": "object", + "properties": { + "adr_ack_delay_exponent": { + "type": "string", + "default": "ADR_ACK_DELAY_1", + "enum": [ + "ADR_ACK_DELAY_1", + "ADR_ACK_DELAY_2", + "ADR_ACK_DELAY_4", + "ADR_ACK_DELAY_8", + "ADR_ACK_DELAY_16", + "ADR_ACK_DELAY_32", + "ADR_ACK_DELAY_64", + "ADR_ACK_DELAY_128", + "ADR_ACK_DELAY_256", + "ADR_ACK_DELAY_512", + "ADR_ACK_DELAY_1024", + "ADR_ACK_DELAY_2048", + "ADR_ACK_DELAY_4096", + "ADR_ACK_DELAY_8192", + "ADR_ACK_DELAY_16384", + "ADR_ACK_DELAY_32768" + ] + }, + "adr_ack_limit_exponent": { + "type": "string", + "default": "ADR_ACK_LIMIT_1", + "enum": [ + "ADR_ACK_LIMIT_1", + "ADR_ACK_LIMIT_2", + "ADR_ACK_LIMIT_4", + "ADR_ACK_LIMIT_8", + "ADR_ACK_LIMIT_16", + "ADR_ACK_LIMIT_32", + "ADR_ACK_LIMIT_64", + "ADR_ACK_LIMIT_128", + "ADR_ACK_LIMIT_256", + "ADR_ACK_LIMIT_512", + "ADR_ACK_LIMIT_1024", + "ADR_ACK_LIMIT_2048", + "ADR_ACK_LIMIT_4096", + "ADR_ACK_LIMIT_8192", + "ADR_ACK_LIMIT_16384", + "ADR_ACK_LIMIT_32768" + ] + } + } + }, + "beacon_freq_ans": { + "type": "object", + "properties": { + "frequency_ack": { + "type": "boolean" + } + } + }, + "beacon_freq_req": { + "type": "object", + "properties": { + "frequency": { + "description": "Frequency of the Class B beacons (Hz).", + "type": "string", + "format": "uint64" + } + } + }, + "beacon_timing_ans": { + "type": "object", + "properties": { + "channel_index": { + "type": "integer", + "format": "int64" + }, + "delay": { + "description": "(uint16) See LoRaWAN specification.", + "type": "integer", + "format": "int64" + } + } + }, + "cid": { + "type": "string", + "title": "- CID_BEACON_TIMING: Deprecated", + "default": "CID_RFU_0", + "enum": [ + "CID_RFU_0", + "CID_RESET", + "CID_LINK_CHECK", + "CID_LINK_ADR", + "CID_DUTY_CYCLE", + "CID_RX_PARAM_SETUP", + "CID_DEV_STATUS", + "CID_NEW_CHANNEL", + "CID_RX_TIMING_SETUP", + "CID_TX_PARAM_SETUP", + "CID_DL_CHANNEL", + "CID_REKEY", + "CID_ADR_PARAM_SETUP", + "CID_DEVICE_TIME", + "CID_FORCE_REJOIN", + "CID_REJOIN_PARAM_SETUP", + "CID_PING_SLOT_INFO", + "CID_PING_SLOT_CHANNEL", + "CID_BEACON_TIMING", + "CID_BEACON_FREQ", + "CID_DEVICE_MODE", + "CID_RELAY_CONF", + "CID_RELAY_END_DEVICE_CONF", + "CID_RELAY_FILTER_LIST", + "CID_RELAY_UPDATE_UPLINK_LIST", + "CID_RELAY_CTRL_UPLINK_LIST", + "CID_RELAY_CONFIGURE_FWD_LIMIT", + "CID_RELAY_NOTIFY_NEW_END_DEVICE" + ] + }, + "dev_status_ans": { + "type": "object", + "properties": { + "battery": { + "description": "Device battery status.\n0 indicates that the device is connected to an external power source.\n1..254 indicates a battery level.\n255 indicates that the device was not able to measure the battery level.", + "type": "integer", + "format": "int64" + }, + "margin": { + "description": "SNR of the last downlink (dB; [-32, +31]).", + "type": "integer", + "format": "int32" + } + } + }, + "device_mode_conf": { + "type": "object", + "properties": { + "class": { + "type": "string", + "default": "CLASS_A", + "enum": [ + "CLASS_A", + "CLASS_B", + "CLASS_C" + ] + } + } + }, + "device_mode_ind": { + "type": "object", + "properties": { + "class": { + "type": "string", + "default": "CLASS_A", + "enum": [ + "CLASS_A", + "CLASS_B", + "CLASS_C" + ] + } + } + }, + "device_time_ans": { + "type": "object", + "properties": { + "time": { + "type": "string", + "format": "date-time" + } + } + }, + "dl_channel_ans": { + "type": "object", + "properties": { + "channel_index_ack": { + "type": "boolean" + }, + "frequency_ack": { + "type": "boolean" + } + } + }, + "dl_channel_req": { + "type": "object", + "properties": { + "channel_index": { + "type": "integer", + "format": "int64" + }, + "frequency": { + "description": "Downlink channel frequency (Hz).", + "type": "string", + "format": "uint64" + } + } + }, + "duty_cycle_req": { + "type": "object", + "properties": { + "max_duty_cycle": { + "description": " - DUTY_CYCLE_1: 100%.\n - DUTY_CYCLE_2: 50%.\n - DUTY_CYCLE_4: 25%.\n - DUTY_CYCLE_8: 12.5%.\n - DUTY_CYCLE_16: 6.25%.\n - DUTY_CYCLE_32: 3.125%.\n - DUTY_CYCLE_64: 1.5625%.\n - DUTY_CYCLE_128: Roughly 0.781%.\n - DUTY_CYCLE_256: Roughly 0.390%.\n - DUTY_CYCLE_512: Roughly 0.195%.\n - DUTY_CYCLE_1024: Roughly 0.098%.\n - DUTY_CYCLE_2048: Roughly 0.049%.\n - DUTY_CYCLE_4096: Roughly 0.024%.\n - DUTY_CYCLE_8192: Roughly 0.012%.\n - DUTY_CYCLE_16384: Roughly 0.006%.\n - DUTY_CYCLE_32768: Roughly 0.003%.", + "type": "string", + "default": "DUTY_CYCLE_1", + "enum": [ + "DUTY_CYCLE_1", + "DUTY_CYCLE_2", + "DUTY_CYCLE_4", + "DUTY_CYCLE_8", + "DUTY_CYCLE_16", + "DUTY_CYCLE_32", + "DUTY_CYCLE_64", + "DUTY_CYCLE_128", + "DUTY_CYCLE_256", + "DUTY_CYCLE_512", + "DUTY_CYCLE_1024", + "DUTY_CYCLE_2048", + "DUTY_CYCLE_4096", + "DUTY_CYCLE_8192", + "DUTY_CYCLE_16384", + "DUTY_CYCLE_32768" + ] + } + } + }, + "force_rejoin_req": { + "type": "object", + "properties": { + "data_rate_index": { + "type": "string", + "default": "DATA_RATE_0", + "enum": [ + "DATA_RATE_0", + "DATA_RATE_1", + "DATA_RATE_2", + "DATA_RATE_3", + "DATA_RATE_4", + "DATA_RATE_5", + "DATA_RATE_6", + "DATA_RATE_7", + "DATA_RATE_8", + "DATA_RATE_9", + "DATA_RATE_10", + "DATA_RATE_11", + "DATA_RATE_12", + "DATA_RATE_13", + "DATA_RATE_14", + "DATA_RATE_15" + ] + }, + "max_retries": { + "type": "integer", + "format": "int64" + }, + "period_exponent": { + "description": " - REJOIN_PERIOD_0: Every 32 to 64 seconds.\n - REJOIN_PERIOD_1: Every 64 to 96 seconds.\n - REJOIN_PERIOD_2: Every 128 to 160 seconds.\n - REJOIN_PERIOD_3: Every 256 to 288 seconds.\n - REJOIN_PERIOD_4: Every 512 to 544 seconds.\n - REJOIN_PERIOD_5: Every 1024 to 1056 seconds.\n - REJOIN_PERIOD_6: Every 2048 to 2080 seconds.\n - REJOIN_PERIOD_7: Every 4096 to 4128 seconds.", + "type": "string", + "default": "REJOIN_PERIOD_0", + "enum": [ + "REJOIN_PERIOD_0", + "REJOIN_PERIOD_1", + "REJOIN_PERIOD_2", + "REJOIN_PERIOD_3", + "REJOIN_PERIOD_4", + "REJOIN_PERIOD_5", + "REJOIN_PERIOD_6", + "REJOIN_PERIOD_7" + ] + }, + "rejoin_type": { + "description": " - CONTEXT: Resets DevAddr, Session Keys, Frame Counters, Radio Parameters.\n - SESSION: Equivalent to the initial JoinRequest.\n - KEYS: Resets DevAddr, Session Keys, Frame Counters, while keeping the Radio Parameters.", + "type": "string", + "default": "CONTEXT", + "enum": [ + "CONTEXT", + "SESSION", + "KEYS" + ] + } + } + }, + "link_adr_ans": { + "type": "object", + "properties": { + "channel_mask_ack": { + "type": "boolean" + }, + "data_rate_index_ack": { + "type": "boolean" + }, + "tx_power_index_ack": { + "type": "boolean" + } + } + }, + "link_adr_req": { + "type": "object", + "properties": { + "channel_mask": { + "type": "array", + "items": { + "type": "boolean" + } + }, + "channel_mask_control": { + "type": "integer", + "format": "int64" + }, + "data_rate_index": { + "type": "string", + "default": "DATA_RATE_0", + "enum": [ + "DATA_RATE_0", + "DATA_RATE_1", + "DATA_RATE_2", + "DATA_RATE_3", + "DATA_RATE_4", + "DATA_RATE_5", + "DATA_RATE_6", + "DATA_RATE_7", + "DATA_RATE_8", + "DATA_RATE_9", + "DATA_RATE_10", + "DATA_RATE_11", + "DATA_RATE_12", + "DATA_RATE_13", + "DATA_RATE_14", + "DATA_RATE_15" + ] + }, + "nb_trans": { + "type": "integer", + "format": "int64" + }, + "tx_power_index": { + "type": "integer", + "format": "int64" + } + } + }, + "link_check_ans": { + "type": "object", + "properties": { + "gateway_count": { + "type": "integer", + "format": "int64" + }, + "margin": { + "description": "Indicates the link margin in dB of the received LinkCheckReq, relative to the demodulation floor.", + "type": "integer", + "format": "int64" + } + } + }, + "new_channel_ans": { + "type": "object", + "properties": { + "data_rate_ack": { + "type": "boolean" + }, + "frequency_ack": { + "type": "boolean" + } + } + }, + "new_channel_req": { + "type": "object", + "properties": { + "channel_index": { + "type": "integer", + "format": "int64" + }, + "frequency": { + "description": "Channel frequency (Hz).", + "type": "string", + "format": "uint64" + }, + "max_data_rate_index": { + "type": "string", + "default": "DATA_RATE_0", + "enum": [ + "DATA_RATE_0", + "DATA_RATE_1", + "DATA_RATE_2", + "DATA_RATE_3", + "DATA_RATE_4", + "DATA_RATE_5", + "DATA_RATE_6", + "DATA_RATE_7", + "DATA_RATE_8", + "DATA_RATE_9", + "DATA_RATE_10", + "DATA_RATE_11", + "DATA_RATE_12", + "DATA_RATE_13", + "DATA_RATE_14", + "DATA_RATE_15" + ] + }, + "min_data_rate_index": { + "type": "string", + "default": "DATA_RATE_0", + "enum": [ + "DATA_RATE_0", + "DATA_RATE_1", + "DATA_RATE_2", + "DATA_RATE_3", + "DATA_RATE_4", + "DATA_RATE_5", + "DATA_RATE_6", + "DATA_RATE_7", + "DATA_RATE_8", + "DATA_RATE_9", + "DATA_RATE_10", + "DATA_RATE_11", + "DATA_RATE_12", + "DATA_RATE_13", + "DATA_RATE_14", + "DATA_RATE_15" + ] + } + } + }, + "ping_slot_channel_ans": { + "type": "object", + "properties": { + "data_rate_index_ack": { + "type": "boolean" + }, + "frequency_ack": { + "type": "boolean" + } + } + }, + "ping_slot_channel_req": { + "type": "object", + "properties": { + "data_rate_index": { + "type": "string", + "default": "DATA_RATE_0", + "enum": [ + "DATA_RATE_0", + "DATA_RATE_1", + "DATA_RATE_2", + "DATA_RATE_3", + "DATA_RATE_4", + "DATA_RATE_5", + "DATA_RATE_6", + "DATA_RATE_7", + "DATA_RATE_8", + "DATA_RATE_9", + "DATA_RATE_10", + "DATA_RATE_11", + "DATA_RATE_12", + "DATA_RATE_13", + "DATA_RATE_14", + "DATA_RATE_15" + ] + }, + "frequency": { + "description": "Ping slot channel frequency (Hz).", + "type": "string", + "format": "uint64" + } + } + }, + "ping_slot_info_req": { + "type": "object", + "properties": { + "period": { + "description": " - PING_EVERY_1S: Every second.\n - PING_EVERY_2S: Every 2 seconds.\n - PING_EVERY_4S: Every 4 seconds.\n - PING_EVERY_8S: Every 8 seconds.\n - PING_EVERY_16S: Every 16 seconds.\n - PING_EVERY_32S: Every 32 seconds.\n - PING_EVERY_64S: Every 64 seconds.\n - PING_EVERY_128S: Every 128 seconds.", + "type": "string", + "default": "PING_EVERY_1S", + "enum": [ + "PING_EVERY_1S", + "PING_EVERY_2S", + "PING_EVERY_4S", + "PING_EVERY_8S", + "PING_EVERY_16S", + "PING_EVERY_32S", + "PING_EVERY_64S", + "PING_EVERY_128S" + ] + } + } + }, + "raw_payload": { + "type": "string", + "format": "byte" + }, + "rejoin_param_setup_ans": { + "type": "object", + "properties": { + "max_time_exponent_ack": { + "type": "boolean" + } + } + }, + "rejoin_param_setup_req": { + "type": "object", + "properties": { + "max_count_exponent": { + "type": "string", + "default": "REJOIN_COUNT_16", + "enum": [ + "REJOIN_COUNT_16", + "REJOIN_COUNT_32", + "REJOIN_COUNT_64", + "REJOIN_COUNT_128", + "REJOIN_COUNT_256", + "REJOIN_COUNT_512", + "REJOIN_COUNT_1024", + "REJOIN_COUNT_2048", + "REJOIN_COUNT_4096", + "REJOIN_COUNT_8192", + "REJOIN_COUNT_16384", + "REJOIN_COUNT_32768", + "REJOIN_COUNT_65536", + "REJOIN_COUNT_131072", + "REJOIN_COUNT_262144", + "REJOIN_COUNT_524288" + ] + }, + "max_time_exponent": { + "description": " - REJOIN_TIME_0: Every ~17.1 minutes.\n - REJOIN_TIME_1: Every ~34.1 minutes.\n - REJOIN_TIME_2: Every ~1.1 hours.\n - REJOIN_TIME_3: Every ~2.3 hours.\n - REJOIN_TIME_4: Every ~4.6 hours.\n - REJOIN_TIME_5: Every ~9.1 hours.\n - REJOIN_TIME_6: Every ~18.2 hours.\n - REJOIN_TIME_7: Every ~1.5 days.\n - REJOIN_TIME_8: Every ~3.0 days.\n - REJOIN_TIME_9: Every ~6.1 days.\n - REJOIN_TIME_10: Every ~12.1 days.\n - REJOIN_TIME_11: Every ~3.5 weeks.\n - REJOIN_TIME_12: Every ~1.6 months.\n - REJOIN_TIME_13: Every ~3.2 months.\n - REJOIN_TIME_14: Every ~6.4 months.\n - REJOIN_TIME_15: Every ~1.1 year.", + "type": "string", + "default": "REJOIN_TIME_0", + "enum": [ + "REJOIN_TIME_0", + "REJOIN_TIME_1", + "REJOIN_TIME_2", + "REJOIN_TIME_3", + "REJOIN_TIME_4", + "REJOIN_TIME_5", + "REJOIN_TIME_6", + "REJOIN_TIME_7", + "REJOIN_TIME_8", + "REJOIN_TIME_9", + "REJOIN_TIME_10", + "REJOIN_TIME_11", + "REJOIN_TIME_12", + "REJOIN_TIME_13", + "REJOIN_TIME_14", + "REJOIN_TIME_15" + ] + } + } + }, + "rekey_conf": { + "type": "object", + "properties": { + "minor_version": { + "type": "string", + "default": "MINOR_RFU_0", + "enum": [ + "MINOR_RFU_0", + "MINOR_1", + "MINOR_RFU_2", + "MINOR_RFU_3", + "MINOR_RFU_4", + "MINOR_RFU_5", + "MINOR_RFU_6", + "MINOR_RFU_7", + "MINOR_RFU_8", + "MINOR_RFU_9", + "MINOR_RFU_10", + "MINOR_RFU_11", + "MINOR_RFU_12", + "MINOR_RFU_13", + "MINOR_RFU_14", + "MINOR_RFU_15" + ] + } + } + }, + "rekey_ind": { + "type": "object", + "properties": { + "minor_version": { + "type": "string", + "default": "MINOR_RFU_0", + "enum": [ + "MINOR_RFU_0", + "MINOR_1", + "MINOR_RFU_2", + "MINOR_RFU_3", + "MINOR_RFU_4", + "MINOR_RFU_5", + "MINOR_RFU_6", + "MINOR_RFU_7", + "MINOR_RFU_8", + "MINOR_RFU_9", + "MINOR_RFU_10", + "MINOR_RFU_11", + "MINOR_RFU_12", + "MINOR_RFU_13", + "MINOR_RFU_14", + "MINOR_RFU_15" + ] + } + } + }, + "relay_conf_ans": { + "type": "object", + "properties": { + "cad_periodicity_ack": { + "type": "boolean" + }, + "default_channel_index_ack": { + "type": "boolean" + }, + "second_channel_ack_offset_ack": { + "type": "boolean" + }, + "second_channel_data_rate_index_ack": { + "type": "boolean" + }, + "second_channel_frequency_ack": { + "type": "boolean" + }, + "second_channel_index_ack": { + "type": "boolean" + } + } + }, + "relay_conf_req": { + "type": "object", + "properties": { + "configuration": { + "type": "object", + "properties": { + "cad_periodicity": { + "type": "string", + "title": "- RELAY_CAD_PERIODICITY_20_MILLISECONDS: sic", + "default": "RELAY_CAD_PERIODICITY_1_SECOND", + "enum": [ + "RELAY_CAD_PERIODICITY_1_SECOND", + "RELAY_CAD_PERIODICITY_500_MILLISECONDS", + "RELAY_CAD_PERIODICITY_250_MILLISECONDS", + "RELAY_CAD_PERIODICITY_100_MILLISECONDS", + "RELAY_CAD_PERIODICITY_50_MILLISECONDS", + "RELAY_CAD_PERIODICITY_20_MILLISECONDS" + ] + }, + "default_channel_index": { + "type": "integer", + "format": "int64" + }, + "second_channel": { + "type": "object", + "properties": { + "ack_offset": { + "type": "string", + "title": "- RELAY_SECOND_CH_ACK_OFFSET_0: 0 kHz\n - RELAY_SECOND_CH_ACK_OFFSET_200: 200 kHz\n - RELAY_SECOND_CH_ACK_OFFSET_400: 400 kHz\n - RELAY_SECOND_CH_ACK_OFFSET_800: 800 kHz\n - RELAY_SECOND_CH_ACK_OFFSET_1600: 1.6 MHz\n - RELAY_SECOND_CH_ACK_OFFSET_3200: 3.2 MHz", + "default": "RELAY_SECOND_CH_ACK_OFFSET_0", + "enum": [ + "RELAY_SECOND_CH_ACK_OFFSET_0", + "RELAY_SECOND_CH_ACK_OFFSET_200", + "RELAY_SECOND_CH_ACK_OFFSET_400", + "RELAY_SECOND_CH_ACK_OFFSET_800", + "RELAY_SECOND_CH_ACK_OFFSET_1600", + "RELAY_SECOND_CH_ACK_OFFSET_3200" + ] + }, + "data_rate_index": { + "type": "string", + "default": "DATA_RATE_0", + "enum": [ + "DATA_RATE_0", + "DATA_RATE_1", + "DATA_RATE_2", + "DATA_RATE_3", + "DATA_RATE_4", + "DATA_RATE_5", + "DATA_RATE_6", + "DATA_RATE_7", + "DATA_RATE_8", + "DATA_RATE_9", + "DATA_RATE_10", + "DATA_RATE_11", + "DATA_RATE_12", + "DATA_RATE_13", + "DATA_RATE_14", + "DATA_RATE_15" + ] + }, + "frequency": { + "description": "The frequency (Hz) used by the wake on radio message.", + "type": "string", + "format": "uint64" + } + } + } + } + } + } + }, + "relay_configure_fwd_limit_ans": { + "type": "object" + }, + "relay_configure_fwd_limit_req": { + "type": "object", + "properties": { + "global_uplink_limits": { + "type": "object", + "properties": { + "bucket_size": { + "type": "string", + "title": "- RELAY_LIMIT_BUCKET_SIZE_12: sic", + "default": "RELAY_LIMIT_BUCKET_SIZE_1", + "enum": [ + "RELAY_LIMIT_BUCKET_SIZE_1", + "RELAY_LIMIT_BUCKET_SIZE_2", + "RELAY_LIMIT_BUCKET_SIZE_4", + "RELAY_LIMIT_BUCKET_SIZE_12" + ] + }, + "reload_rate": { + "description": "The number of tokens which are replenished in the bucket every hour.", + "type": "integer", + "format": "int64" + } + } + }, + "join_request_limits": { + "type": "object", + "properties": { + "bucket_size": { + "type": "string", + "title": "- RELAY_LIMIT_BUCKET_SIZE_12: sic", + "default": "RELAY_LIMIT_BUCKET_SIZE_1", + "enum": [ + "RELAY_LIMIT_BUCKET_SIZE_1", + "RELAY_LIMIT_BUCKET_SIZE_2", + "RELAY_LIMIT_BUCKET_SIZE_4", + "RELAY_LIMIT_BUCKET_SIZE_12" + ] + }, + "reload_rate": { + "description": "The number of tokens which are replenished in the bucket every hour.", + "type": "integer", + "format": "int64" + } + } + }, + "notify_limits": { + "type": "object", + "properties": { + "bucket_size": { + "type": "string", + "title": "- RELAY_LIMIT_BUCKET_SIZE_12: sic", + "default": "RELAY_LIMIT_BUCKET_SIZE_1", + "enum": [ + "RELAY_LIMIT_BUCKET_SIZE_1", + "RELAY_LIMIT_BUCKET_SIZE_2", + "RELAY_LIMIT_BUCKET_SIZE_4", + "RELAY_LIMIT_BUCKET_SIZE_12" + ] + }, + "reload_rate": { + "description": "The number of tokens which are replenished in the bucket every hour.", + "type": "integer", + "format": "int64" + } + } + }, + "overall_limits": { + "type": "object", + "properties": { + "bucket_size": { + "type": "string", + "title": "- RELAY_LIMIT_BUCKET_SIZE_12: sic", + "default": "RELAY_LIMIT_BUCKET_SIZE_1", + "enum": [ + "RELAY_LIMIT_BUCKET_SIZE_1", + "RELAY_LIMIT_BUCKET_SIZE_2", + "RELAY_LIMIT_BUCKET_SIZE_4", + "RELAY_LIMIT_BUCKET_SIZE_12" + ] + }, + "reload_rate": { + "description": "The number of tokens which are replenished in the bucket every hour.", + "type": "integer", + "format": "int64" + } + } + }, + "reset_limit_counter": { + "type": "string", + "default": "RELAY_RESET_LIMIT_COUNTER_ZERO", + "enum": [ + "RELAY_RESET_LIMIT_COUNTER_ZERO", + "RELAY_RESET_LIMIT_COUNTER_RELOAD_RATE", + "RELAY_RESET_LIMIT_COUNTER_MAX_VALUE", + "RELAY_RESET_LIMIT_COUNTER_NO_RESET" + ] + } + } + }, + "relay_ctrl_uplink_list_ans": { + "type": "object", + "properties": { + "rule_index_ack": { + "type": "boolean" + }, + "w_f_cnt": { + "type": "integer", + "format": "int64" + } + } + }, + "relay_ctrl_uplink_list_req": { + "type": "object", + "properties": { + "action": { + "type": "string", + "default": "RELAY_CTRL_UPLINK_LIST_ACTION_READ_W_F_CNT", + "enum": [ + "RELAY_CTRL_UPLINK_LIST_ACTION_READ_W_F_CNT", + "RELAY_CTRL_UPLINK_LIST_ACTION_REMOVE_TRUSTED_END_DEVICE" + ] + }, + "rule_index": { + "type": "integer", + "format": "int64" + } + } + }, + "relay_end_device_conf_ans": { + "type": "object", + "properties": { + "backoff_ack": { + "type": "boolean" + }, + "second_channel_data_rate_index_ack": { + "type": "boolean" + }, + "second_channel_frequency_ack": { + "type": "boolean" + }, + "second_channel_index_ack": { + "type": "boolean" + } + } + }, + "relay_end_device_conf_req": { + "type": "object", + "properties": { + "configuration": { + "type": "object", + "properties": { + "always": { + "type": "object" + }, + "backoff": { + "type": "integer", + "format": "int64" + }, + "dynamic": { + "type": "object", + "properties": { + "smart_enable_level": { + "type": "string", + "default": "RELAY_SMART_ENABLE_LEVEL_8", + "enum": [ + "RELAY_SMART_ENABLE_LEVEL_8", + "RELAY_SMART_ENABLE_LEVEL_16", + "RELAY_SMART_ENABLE_LEVEL_32", + "RELAY_SMART_ENABLE_LEVEL_64" + ] + } + } + }, + "end_device_controlled": { + "type": "object" + }, + "second_channel": { + "type": "object", + "properties": { + "ack_offset": { + "type": "string", + "title": "- RELAY_SECOND_CH_ACK_OFFSET_0: 0 kHz\n - RELAY_SECOND_CH_ACK_OFFSET_200: 200 kHz\n - RELAY_SECOND_CH_ACK_OFFSET_400: 400 kHz\n - RELAY_SECOND_CH_ACK_OFFSET_800: 800 kHz\n - RELAY_SECOND_CH_ACK_OFFSET_1600: 1.6 MHz\n - RELAY_SECOND_CH_ACK_OFFSET_3200: 3.2 MHz", + "default": "RELAY_SECOND_CH_ACK_OFFSET_0", + "enum": [ + "RELAY_SECOND_CH_ACK_OFFSET_0", + "RELAY_SECOND_CH_ACK_OFFSET_200", + "RELAY_SECOND_CH_ACK_OFFSET_400", + "RELAY_SECOND_CH_ACK_OFFSET_800", + "RELAY_SECOND_CH_ACK_OFFSET_1600", + "RELAY_SECOND_CH_ACK_OFFSET_3200" + ] + }, + "data_rate_index": { + "type": "string", + "default": "DATA_RATE_0", + "enum": [ + "DATA_RATE_0", + "DATA_RATE_1", + "DATA_RATE_2", + "DATA_RATE_3", + "DATA_RATE_4", + "DATA_RATE_5", + "DATA_RATE_6", + "DATA_RATE_7", + "DATA_RATE_8", + "DATA_RATE_9", + "DATA_RATE_10", + "DATA_RATE_11", + "DATA_RATE_12", + "DATA_RATE_13", + "DATA_RATE_14", + "DATA_RATE_15" + ] + }, + "frequency": { + "description": "The frequency (Hz) used by the wake on radio message.", + "type": "string", + "format": "uint64" + } + } + }, + "serving_device_id": { + "type": "string" + } + } + } + } + }, + "relay_notify_new_end_device_req": { + "type": "object", + "properties": { + "dev_addr": { + "type": "string", + "format": "string", + "example": "2600ABCD" + }, + "rssi": { + "type": "integer", + "format": "int32" + }, + "snr": { + "type": "integer", + "format": "int32" + } + } + }, + "relay_update_uplink_list_ans": { + "type": "object" + }, + "relay_update_uplink_list_req": { + "type": "object", + "properties": { + "dev_addr": { + "type": "string", + "format": "string", + "example": "2600ABCD" + }, + "device_id": { + "type": "string" + }, + "forward_limits": { + "type": "object", + "properties": { + "bucket_size": { + "type": "string", + "title": "- RELAY_LIMIT_BUCKET_SIZE_12: sic", + "default": "RELAY_LIMIT_BUCKET_SIZE_1", + "enum": [ + "RELAY_LIMIT_BUCKET_SIZE_1", + "RELAY_LIMIT_BUCKET_SIZE_2", + "RELAY_LIMIT_BUCKET_SIZE_4", + "RELAY_LIMIT_BUCKET_SIZE_12" + ] + }, + "reload_rate": { + "description": "The number of tokens which are replenished in the bucket every hour.", + "type": "integer", + "format": "int64" + } + } + }, + "root_wor_s_key": { + "type": "string", + "format": "string", + "example": "0123456789ABCDEF0123456789ABCDEF" + }, + "rule_index": { + "type": "integer", + "format": "int64" + }, + "session_key_id": { + "type": "string", + "format": "byte" + }, + "w_f_cnt": { + "type": "integer", + "format": "int64" + } + } + }, + "reset_conf": { + "type": "object", + "properties": { + "minor_version": { + "type": "string", + "default": "MINOR_RFU_0", + "enum": [ + "MINOR_RFU_0", + "MINOR_1", + "MINOR_RFU_2", + "MINOR_RFU_3", + "MINOR_RFU_4", + "MINOR_RFU_5", + "MINOR_RFU_6", + "MINOR_RFU_7", + "MINOR_RFU_8", + "MINOR_RFU_9", + "MINOR_RFU_10", + "MINOR_RFU_11", + "MINOR_RFU_12", + "MINOR_RFU_13", + "MINOR_RFU_14", + "MINOR_RFU_15" + ] + } + } + }, + "reset_ind": { + "type": "object", + "properties": { + "minor_version": { + "type": "string", + "default": "MINOR_RFU_0", + "enum": [ + "MINOR_RFU_0", + "MINOR_1", + "MINOR_RFU_2", + "MINOR_RFU_3", + "MINOR_RFU_4", + "MINOR_RFU_5", + "MINOR_RFU_6", + "MINOR_RFU_7", + "MINOR_RFU_8", + "MINOR_RFU_9", + "MINOR_RFU_10", + "MINOR_RFU_11", + "MINOR_RFU_12", + "MINOR_RFU_13", + "MINOR_RFU_14", + "MINOR_RFU_15" + ] + } + } + }, + "rx_param_setup_ans": { + "type": "object", + "properties": { + "rx1_data_rate_offset_ack": { + "type": "boolean" + }, + "rx2_data_rate_index_ack": { + "type": "boolean" + }, + "rx2_frequency_ack": { + "type": "boolean" + } + } + }, + "rx_param_setup_req": { + "type": "object", + "properties": { + "rx1_data_rate_offset": { + "type": "string", + "default": "DATA_RATE_OFFSET_0", + "enum": [ + "DATA_RATE_OFFSET_0", + "DATA_RATE_OFFSET_1", + "DATA_RATE_OFFSET_2", + "DATA_RATE_OFFSET_3", + "DATA_RATE_OFFSET_4", + "DATA_RATE_OFFSET_5", + "DATA_RATE_OFFSET_6", + "DATA_RATE_OFFSET_7" + ] + }, + "rx2_data_rate_index": { + "type": "string", + "default": "DATA_RATE_0", + "enum": [ + "DATA_RATE_0", + "DATA_RATE_1", + "DATA_RATE_2", + "DATA_RATE_3", + "DATA_RATE_4", + "DATA_RATE_5", + "DATA_RATE_6", + "DATA_RATE_7", + "DATA_RATE_8", + "DATA_RATE_9", + "DATA_RATE_10", + "DATA_RATE_11", + "DATA_RATE_12", + "DATA_RATE_13", + "DATA_RATE_14", + "DATA_RATE_15" + ] + }, + "rx2_frequency": { + "description": "Rx2 frequency (Hz).", + "type": "string", + "format": "uint64" + } + } + }, + "rx_timing_setup_req": { + "type": "object", + "properties": { + "delay": { + "description": " - RX_DELAY_0: 1 second.\n - RX_DELAY_1: 1 second.\n - RX_DELAY_2: 2 seconds.\n - RX_DELAY_3: 3 seconds.\n - RX_DELAY_4: 4 seconds.\n - RX_DELAY_5: 5 seconds.\n - RX_DELAY_6: 6 seconds.\n - RX_DELAY_7: 7 seconds.\n - RX_DELAY_8: 8 seconds.\n - RX_DELAY_9: 9 seconds.\n - RX_DELAY_10: 10 seconds.\n - RX_DELAY_11: 11 seconds.\n - RX_DELAY_12: 12 seconds.\n - RX_DELAY_13: 13 seconds.\n - RX_DELAY_14: 14 seconds.\n - RX_DELAY_15: 15 seconds.", + "type": "string", + "default": "RX_DELAY_0", + "enum": [ + "RX_DELAY_0", + "RX_DELAY_1", + "RX_DELAY_2", + "RX_DELAY_3", + "RX_DELAY_4", + "RX_DELAY_5", + "RX_DELAY_6", + "RX_DELAY_7", + "RX_DELAY_8", + "RX_DELAY_9", + "RX_DELAY_10", + "RX_DELAY_11", + "RX_DELAY_12", + "RX_DELAY_13", + "RX_DELAY_14", + "RX_DELAY_15" + ] + } + } + }, + "tx_param_setup_req": { + "type": "object", + "properties": { + "downlink_dwell_time": { + "type": "boolean" + }, + "max_eirp_index": { + "description": " - DEVICE_EIRP_8: 8 dBm.\n - DEVICE_EIRP_10: 10 dBm.\n - DEVICE_EIRP_12: 12 dBm.\n - DEVICE_EIRP_13: 13 dBm.\n - DEVICE_EIRP_14: 14 dBm.\n - DEVICE_EIRP_16: 16 dBm.\n - DEVICE_EIRP_18: 18 dBm.\n - DEVICE_EIRP_20: 20 dBm.\n - DEVICE_EIRP_21: 21 dBm.\n - DEVICE_EIRP_24: 24 dBm.\n - DEVICE_EIRP_26: 26 dBm.\n - DEVICE_EIRP_27: 27 dBm.\n - DEVICE_EIRP_29: 29 dBm.\n - DEVICE_EIRP_30: 30 dBm.\n - DEVICE_EIRP_33: 33 dBm.\n - DEVICE_EIRP_36: 36 dBm.", + "type": "string", + "default": "DEVICE_EIRP_8", + "enum": [ + "DEVICE_EIRP_8", + "DEVICE_EIRP_10", + "DEVICE_EIRP_12", + "DEVICE_EIRP_13", + "DEVICE_EIRP_14", + "DEVICE_EIRP_16", + "DEVICE_EIRP_18", + "DEVICE_EIRP_20", + "DEVICE_EIRP_21", + "DEVICE_EIRP_24", + "DEVICE_EIRP_26", + "DEVICE_EIRP_27", + "DEVICE_EIRP_29", + "DEVICE_EIRP_30", + "DEVICE_EIRP_33", + "DEVICE_EIRP_36" + ] + }, + "uplink_dwell_time": { + "type": "boolean" + } + } + } + } + } + }, + "ping_slot_periodicity": { + "type": "object", + "properties": { + "value": { + "description": " - PING_EVERY_1S: Every second.\n - PING_EVERY_2S: Every 2 seconds.\n - PING_EVERY_4S: Every 4 seconds.\n - PING_EVERY_8S: Every 8 seconds.\n - PING_EVERY_16S: Every 16 seconds.\n - PING_EVERY_32S: Every 32 seconds.\n - PING_EVERY_64S: Every 64 seconds.\n - PING_EVERY_128S: Every 128 seconds.", + "type": "string", + "default": "PING_EVERY_1S", + "enum": [ + "PING_EVERY_1S", + "PING_EVERY_2S", + "PING_EVERY_4S", + "PING_EVERY_8S", + "PING_EVERY_16S", + "PING_EVERY_32S", + "PING_EVERY_64S", + "PING_EVERY_128S" + ] + } + } + }, + "queued_join_accept": { + "type": "object", + "properties": { + "correlation_ids": { + "type": "array", + "items": { + "type": "string" + } + }, + "dev_addr": { + "type": "string", + "format": "string", + "example": "2600ABCD" + }, + "keys": { + "description": "Session keys for a LoRaWAN session.\nOnly the components for which the keys were meant, will have the key-encryption-key (KEK) to decrypt the individual keys.", + "type": "object", + "properties": { + "app_s_key": { + "type": "object", + "properties": { + "encrypted_key": { + "type": "string", + "format": "byte" + }, + "kek_label": { + "description": "The label of the RFC 3394 key-encryption-key (KEK) that was used to encrypt the key.", + "type": "string" + }, + "key": { + "description": "The unencrypted AES key.", + "type": "string", + "format": "string", + "example": "0123456789ABCDEF0123456789ABCDEF" + } + } + }, + "f_nwk_s_int_key": { + "type": "object", + "properties": { + "encrypted_key": { + "type": "string", + "format": "byte" + }, + "kek_label": { + "description": "The label of the RFC 3394 key-encryption-key (KEK) that was used to encrypt the key.", + "type": "string" + }, + "key": { + "description": "The unencrypted AES key.", + "type": "string", + "format": "string", + "example": "0123456789ABCDEF0123456789ABCDEF" + } + } + }, + "nwk_s_enc_key": { + "type": "object", + "properties": { + "encrypted_key": { + "type": "string", + "format": "byte" + }, + "kek_label": { + "description": "The label of the RFC 3394 key-encryption-key (KEK) that was used to encrypt the key.", + "type": "string" + }, + "key": { + "description": "The unencrypted AES key.", + "type": "string", + "format": "string", + "example": "0123456789ABCDEF0123456789ABCDEF" + } + } + }, + "s_nwk_s_int_key": { + "type": "object", + "properties": { + "encrypted_key": { + "type": "string", + "format": "byte" + }, + "kek_label": { + "description": "The label of the RFC 3394 key-encryption-key (KEK) that was used to encrypt the key.", + "type": "string" + }, + "key": { + "description": "The unencrypted AES key.", + "type": "string", + "format": "string", + "example": "0123456789ABCDEF0123456789ABCDEF" + } + } + }, + "session_key_id": { + "description": "Join Server issued identifier for the session keys.\nThis ID can be used to request the keys from the Join Server in case the are lost.", + "type": "string", + "format": "byte" + } + } + }, + "net_id": { + "type": "string", + "format": "string", + "example": "000013" + }, + "payload": { + "description": "Payload of the join-accept received from Join Server.", + "type": "string", + "format": "byte" + }, + "request": { + "type": "object", + "properties": { + "cf_list": { + "type": "object", + "properties": { + "ch_masks": { + "description": "ChMasks controlling the channels to be used.\nLength of this field must be equal to the amount of uplink channels\ndefined by the selected frequency plan.", + "type": "array", + "items": { + "type": "boolean" + } + }, + "freq": { + "description": "Frequencies to be broadcasted, in hecto-Hz.\nThese values are broadcasted as 24 bits unsigned integers.\nThis field should not contain default values.", + "type": "array", + "items": { + "type": "integer", + "format": "int64" + } + }, + "type": { + "type": "string", + "default": "FREQUENCIES", + "enum": [ + "FREQUENCIES", + "CHANNEL_MASKS" + ] + } + } + }, + "downlink_settings": { + "type": "object", + "properties": { + "opt_neg": { + "description": "OptNeg is set if Network Server implements LoRaWAN 1.1 or greater.", + "type": "boolean" + }, + "rx1_dr_offset": { + "type": "string", + "default": "DATA_RATE_OFFSET_0", + "enum": [ + "DATA_RATE_OFFSET_0", + "DATA_RATE_OFFSET_1", + "DATA_RATE_OFFSET_2", + "DATA_RATE_OFFSET_3", + "DATA_RATE_OFFSET_4", + "DATA_RATE_OFFSET_5", + "DATA_RATE_OFFSET_6", + "DATA_RATE_OFFSET_7" + ] + }, + "rx2_dr": { + "type": "string", + "default": "DATA_RATE_0", + "enum": [ + "DATA_RATE_0", + "DATA_RATE_1", + "DATA_RATE_2", + "DATA_RATE_3", + "DATA_RATE_4", + "DATA_RATE_5", + "DATA_RATE_6", + "DATA_RATE_7", + "DATA_RATE_8", + "DATA_RATE_9", + "DATA_RATE_10", + "DATA_RATE_11", + "DATA_RATE_12", + "DATA_RATE_13", + "DATA_RATE_14", + "DATA_RATE_15" + ] + } + } + }, + "rx_delay": { + "description": " - RX_DELAY_0: 1 second.\n - RX_DELAY_1: 1 second.\n - RX_DELAY_2: 2 seconds.\n - RX_DELAY_3: 3 seconds.\n - RX_DELAY_4: 4 seconds.\n - RX_DELAY_5: 5 seconds.\n - RX_DELAY_6: 6 seconds.\n - RX_DELAY_7: 7 seconds.\n - RX_DELAY_8: 8 seconds.\n - RX_DELAY_9: 9 seconds.\n - RX_DELAY_10: 10 seconds.\n - RX_DELAY_11: 11 seconds.\n - RX_DELAY_12: 12 seconds.\n - RX_DELAY_13: 13 seconds.\n - RX_DELAY_14: 14 seconds.\n - RX_DELAY_15: 15 seconds.", + "type": "string", + "default": "RX_DELAY_0", + "enum": [ + "RX_DELAY_0", + "RX_DELAY_1", + "RX_DELAY_2", + "RX_DELAY_3", + "RX_DELAY_4", + "RX_DELAY_5", + "RX_DELAY_6", + "RX_DELAY_7", + "RX_DELAY_8", + "RX_DELAY_9", + "RX_DELAY_10", + "RX_DELAY_11", + "RX_DELAY_12", + "RX_DELAY_13", + "RX_DELAY_14", + "RX_DELAY_15" + ] + } + } + } + } + }, + "queued_responses": { + "description": "Queued MAC responses.\nRegenerated on each uplink.", + "type": "array", + "items": { + "type": "object", + "properties": { + "adr_param_setup_req": { + "type": "object", + "properties": { + "adr_ack_delay_exponent": { + "type": "string", + "default": "ADR_ACK_DELAY_1", + "enum": [ + "ADR_ACK_DELAY_1", + "ADR_ACK_DELAY_2", + "ADR_ACK_DELAY_4", + "ADR_ACK_DELAY_8", + "ADR_ACK_DELAY_16", + "ADR_ACK_DELAY_32", + "ADR_ACK_DELAY_64", + "ADR_ACK_DELAY_128", + "ADR_ACK_DELAY_256", + "ADR_ACK_DELAY_512", + "ADR_ACK_DELAY_1024", + "ADR_ACK_DELAY_2048", + "ADR_ACK_DELAY_4096", + "ADR_ACK_DELAY_8192", + "ADR_ACK_DELAY_16384", + "ADR_ACK_DELAY_32768" + ] + }, + "adr_ack_limit_exponent": { + "type": "string", + "default": "ADR_ACK_LIMIT_1", + "enum": [ + "ADR_ACK_LIMIT_1", + "ADR_ACK_LIMIT_2", + "ADR_ACK_LIMIT_4", + "ADR_ACK_LIMIT_8", + "ADR_ACK_LIMIT_16", + "ADR_ACK_LIMIT_32", + "ADR_ACK_LIMIT_64", + "ADR_ACK_LIMIT_128", + "ADR_ACK_LIMIT_256", + "ADR_ACK_LIMIT_512", + "ADR_ACK_LIMIT_1024", + "ADR_ACK_LIMIT_2048", + "ADR_ACK_LIMIT_4096", + "ADR_ACK_LIMIT_8192", + "ADR_ACK_LIMIT_16384", + "ADR_ACK_LIMIT_32768" + ] + } + } + }, + "beacon_freq_ans": { + "type": "object", + "properties": { + "frequency_ack": { + "type": "boolean" + } + } + }, + "beacon_freq_req": { + "type": "object", + "properties": { + "frequency": { + "description": "Frequency of the Class B beacons (Hz).", + "type": "string", + "format": "uint64" + } + } + }, + "beacon_timing_ans": { + "type": "object", + "properties": { + "channel_index": { + "type": "integer", + "format": "int64" + }, + "delay": { + "description": "(uint16) See LoRaWAN specification.", + "type": "integer", + "format": "int64" + } + } + }, + "cid": { + "type": "string", + "title": "- CID_BEACON_TIMING: Deprecated", + "default": "CID_RFU_0", + "enum": [ + "CID_RFU_0", + "CID_RESET", + "CID_LINK_CHECK", + "CID_LINK_ADR", + "CID_DUTY_CYCLE", + "CID_RX_PARAM_SETUP", + "CID_DEV_STATUS", + "CID_NEW_CHANNEL", + "CID_RX_TIMING_SETUP", + "CID_TX_PARAM_SETUP", + "CID_DL_CHANNEL", + "CID_REKEY", + "CID_ADR_PARAM_SETUP", + "CID_DEVICE_TIME", + "CID_FORCE_REJOIN", + "CID_REJOIN_PARAM_SETUP", + "CID_PING_SLOT_INFO", + "CID_PING_SLOT_CHANNEL", + "CID_BEACON_TIMING", + "CID_BEACON_FREQ", + "CID_DEVICE_MODE", + "CID_RELAY_CONF", + "CID_RELAY_END_DEVICE_CONF", + "CID_RELAY_FILTER_LIST", + "CID_RELAY_UPDATE_UPLINK_LIST", + "CID_RELAY_CTRL_UPLINK_LIST", + "CID_RELAY_CONFIGURE_FWD_LIMIT", + "CID_RELAY_NOTIFY_NEW_END_DEVICE" + ] + }, + "dev_status_ans": { + "type": "object", + "properties": { + "battery": { + "description": "Device battery status.\n0 indicates that the device is connected to an external power source.\n1..254 indicates a battery level.\n255 indicates that the device was not able to measure the battery level.", + "type": "integer", + "format": "int64" + }, + "margin": { + "description": "SNR of the last downlink (dB; [-32, +31]).", + "type": "integer", + "format": "int32" + } + } + }, + "device_mode_conf": { + "type": "object", + "properties": { + "class": { + "type": "string", + "default": "CLASS_A", + "enum": [ + "CLASS_A", + "CLASS_B", + "CLASS_C" + ] + } + } + }, + "device_mode_ind": { + "type": "object", + "properties": { + "class": { + "type": "string", + "default": "CLASS_A", + "enum": [ + "CLASS_A", + "CLASS_B", + "CLASS_C" + ] + } + } + }, + "device_time_ans": { + "type": "object", + "properties": { + "time": { + "type": "string", + "format": "date-time" + } + } + }, + "dl_channel_ans": { + "type": "object", + "properties": { + "channel_index_ack": { + "type": "boolean" + }, + "frequency_ack": { + "type": "boolean" + } + } + }, + "dl_channel_req": { + "type": "object", + "properties": { + "channel_index": { + "type": "integer", + "format": "int64" + }, + "frequency": { + "description": "Downlink channel frequency (Hz).", + "type": "string", + "format": "uint64" + } + } + }, + "duty_cycle_req": { + "type": "object", + "properties": { + "max_duty_cycle": { + "description": " - DUTY_CYCLE_1: 100%.\n - DUTY_CYCLE_2: 50%.\n - DUTY_CYCLE_4: 25%.\n - DUTY_CYCLE_8: 12.5%.\n - DUTY_CYCLE_16: 6.25%.\n - DUTY_CYCLE_32: 3.125%.\n - DUTY_CYCLE_64: 1.5625%.\n - DUTY_CYCLE_128: Roughly 0.781%.\n - DUTY_CYCLE_256: Roughly 0.390%.\n - DUTY_CYCLE_512: Roughly 0.195%.\n - DUTY_CYCLE_1024: Roughly 0.098%.\n - DUTY_CYCLE_2048: Roughly 0.049%.\n - DUTY_CYCLE_4096: Roughly 0.024%.\n - DUTY_CYCLE_8192: Roughly 0.012%.\n - DUTY_CYCLE_16384: Roughly 0.006%.\n - DUTY_CYCLE_32768: Roughly 0.003%.", + "type": "string", + "default": "DUTY_CYCLE_1", + "enum": [ + "DUTY_CYCLE_1", + "DUTY_CYCLE_2", + "DUTY_CYCLE_4", + "DUTY_CYCLE_8", + "DUTY_CYCLE_16", + "DUTY_CYCLE_32", + "DUTY_CYCLE_64", + "DUTY_CYCLE_128", + "DUTY_CYCLE_256", + "DUTY_CYCLE_512", + "DUTY_CYCLE_1024", + "DUTY_CYCLE_2048", + "DUTY_CYCLE_4096", + "DUTY_CYCLE_8192", + "DUTY_CYCLE_16384", + "DUTY_CYCLE_32768" + ] + } + } + }, + "force_rejoin_req": { + "type": "object", + "properties": { + "data_rate_index": { + "type": "string", + "default": "DATA_RATE_0", + "enum": [ + "DATA_RATE_0", + "DATA_RATE_1", + "DATA_RATE_2", + "DATA_RATE_3", + "DATA_RATE_4", + "DATA_RATE_5", + "DATA_RATE_6", + "DATA_RATE_7", + "DATA_RATE_8", + "DATA_RATE_9", + "DATA_RATE_10", + "DATA_RATE_11", + "DATA_RATE_12", + "DATA_RATE_13", + "DATA_RATE_14", + "DATA_RATE_15" + ] + }, + "max_retries": { + "type": "integer", + "format": "int64" + }, + "period_exponent": { + "description": " - REJOIN_PERIOD_0: Every 32 to 64 seconds.\n - REJOIN_PERIOD_1: Every 64 to 96 seconds.\n - REJOIN_PERIOD_2: Every 128 to 160 seconds.\n - REJOIN_PERIOD_3: Every 256 to 288 seconds.\n - REJOIN_PERIOD_4: Every 512 to 544 seconds.\n - REJOIN_PERIOD_5: Every 1024 to 1056 seconds.\n - REJOIN_PERIOD_6: Every 2048 to 2080 seconds.\n - REJOIN_PERIOD_7: Every 4096 to 4128 seconds.", + "type": "string", + "default": "REJOIN_PERIOD_0", + "enum": [ + "REJOIN_PERIOD_0", + "REJOIN_PERIOD_1", + "REJOIN_PERIOD_2", + "REJOIN_PERIOD_3", + "REJOIN_PERIOD_4", + "REJOIN_PERIOD_5", + "REJOIN_PERIOD_6", + "REJOIN_PERIOD_7" + ] + }, + "rejoin_type": { + "description": " - CONTEXT: Resets DevAddr, Session Keys, Frame Counters, Radio Parameters.\n - SESSION: Equivalent to the initial JoinRequest.\n - KEYS: Resets DevAddr, Session Keys, Frame Counters, while keeping the Radio Parameters.", + "type": "string", + "default": "CONTEXT", + "enum": [ + "CONTEXT", + "SESSION", + "KEYS" + ] + } + } + }, + "link_adr_ans": { + "type": "object", + "properties": { + "channel_mask_ack": { + "type": "boolean" + }, + "data_rate_index_ack": { + "type": "boolean" + }, + "tx_power_index_ack": { + "type": "boolean" + } + } + }, + "link_adr_req": { + "type": "object", + "properties": { + "channel_mask": { + "type": "array", + "items": { + "type": "boolean" + } + }, + "channel_mask_control": { + "type": "integer", + "format": "int64" + }, + "data_rate_index": { + "type": "string", + "default": "DATA_RATE_0", + "enum": [ + "DATA_RATE_0", + "DATA_RATE_1", + "DATA_RATE_2", + "DATA_RATE_3", + "DATA_RATE_4", + "DATA_RATE_5", + "DATA_RATE_6", + "DATA_RATE_7", + "DATA_RATE_8", + "DATA_RATE_9", + "DATA_RATE_10", + "DATA_RATE_11", + "DATA_RATE_12", + "DATA_RATE_13", + "DATA_RATE_14", + "DATA_RATE_15" + ] + }, + "nb_trans": { + "type": "integer", + "format": "int64" + }, + "tx_power_index": { + "type": "integer", + "format": "int64" + } + } + }, + "link_check_ans": { + "type": "object", + "properties": { + "gateway_count": { + "type": "integer", + "format": "int64" + }, + "margin": { + "description": "Indicates the link margin in dB of the received LinkCheckReq, relative to the demodulation floor.", + "type": "integer", + "format": "int64" + } + } + }, + "new_channel_ans": { + "type": "object", + "properties": { + "data_rate_ack": { + "type": "boolean" + }, + "frequency_ack": { + "type": "boolean" + } + } + }, + "new_channel_req": { + "type": "object", + "properties": { + "channel_index": { + "type": "integer", + "format": "int64" + }, + "frequency": { + "description": "Channel frequency (Hz).", + "type": "string", + "format": "uint64" + }, + "max_data_rate_index": { + "type": "string", + "default": "DATA_RATE_0", + "enum": [ + "DATA_RATE_0", + "DATA_RATE_1", + "DATA_RATE_2", + "DATA_RATE_3", + "DATA_RATE_4", + "DATA_RATE_5", + "DATA_RATE_6", + "DATA_RATE_7", + "DATA_RATE_8", + "DATA_RATE_9", + "DATA_RATE_10", + "DATA_RATE_11", + "DATA_RATE_12", + "DATA_RATE_13", + "DATA_RATE_14", + "DATA_RATE_15" + ] + }, + "min_data_rate_index": { + "type": "string", + "default": "DATA_RATE_0", + "enum": [ + "DATA_RATE_0", + "DATA_RATE_1", + "DATA_RATE_2", + "DATA_RATE_3", + "DATA_RATE_4", + "DATA_RATE_5", + "DATA_RATE_6", + "DATA_RATE_7", + "DATA_RATE_8", + "DATA_RATE_9", + "DATA_RATE_10", + "DATA_RATE_11", + "DATA_RATE_12", + "DATA_RATE_13", + "DATA_RATE_14", + "DATA_RATE_15" + ] + } + } + }, + "ping_slot_channel_ans": { + "type": "object", + "properties": { + "data_rate_index_ack": { + "type": "boolean" + }, + "frequency_ack": { + "type": "boolean" + } + } + }, + "ping_slot_channel_req": { + "type": "object", + "properties": { + "data_rate_index": { + "type": "string", + "default": "DATA_RATE_0", + "enum": [ + "DATA_RATE_0", + "DATA_RATE_1", + "DATA_RATE_2", + "DATA_RATE_3", + "DATA_RATE_4", + "DATA_RATE_5", + "DATA_RATE_6", + "DATA_RATE_7", + "DATA_RATE_8", + "DATA_RATE_9", + "DATA_RATE_10", + "DATA_RATE_11", + "DATA_RATE_12", + "DATA_RATE_13", + "DATA_RATE_14", + "DATA_RATE_15" + ] + }, + "frequency": { + "description": "Ping slot channel frequency (Hz).", + "type": "string", + "format": "uint64" + } + } + }, + "ping_slot_info_req": { + "type": "object", + "properties": { + "period": { + "description": " - PING_EVERY_1S: Every second.\n - PING_EVERY_2S: Every 2 seconds.\n - PING_EVERY_4S: Every 4 seconds.\n - PING_EVERY_8S: Every 8 seconds.\n - PING_EVERY_16S: Every 16 seconds.\n - PING_EVERY_32S: Every 32 seconds.\n - PING_EVERY_64S: Every 64 seconds.\n - PING_EVERY_128S: Every 128 seconds.", + "type": "string", + "default": "PING_EVERY_1S", + "enum": [ + "PING_EVERY_1S", + "PING_EVERY_2S", + "PING_EVERY_4S", + "PING_EVERY_8S", + "PING_EVERY_16S", + "PING_EVERY_32S", + "PING_EVERY_64S", + "PING_EVERY_128S" + ] + } + } + }, + "raw_payload": { + "type": "string", + "format": "byte" + }, + "rejoin_param_setup_ans": { + "type": "object", + "properties": { + "max_time_exponent_ack": { + "type": "boolean" + } + } + }, + "rejoin_param_setup_req": { + "type": "object", + "properties": { + "max_count_exponent": { + "type": "string", + "default": "REJOIN_COUNT_16", + "enum": [ + "REJOIN_COUNT_16", + "REJOIN_COUNT_32", + "REJOIN_COUNT_64", + "REJOIN_COUNT_128", + "REJOIN_COUNT_256", + "REJOIN_COUNT_512", + "REJOIN_COUNT_1024", + "REJOIN_COUNT_2048", + "REJOIN_COUNT_4096", + "REJOIN_COUNT_8192", + "REJOIN_COUNT_16384", + "REJOIN_COUNT_32768", + "REJOIN_COUNT_65536", + "REJOIN_COUNT_131072", + "REJOIN_COUNT_262144", + "REJOIN_COUNT_524288" + ] + }, + "max_time_exponent": { + "description": " - REJOIN_TIME_0: Every ~17.1 minutes.\n - REJOIN_TIME_1: Every ~34.1 minutes.\n - REJOIN_TIME_2: Every ~1.1 hours.\n - REJOIN_TIME_3: Every ~2.3 hours.\n - REJOIN_TIME_4: Every ~4.6 hours.\n - REJOIN_TIME_5: Every ~9.1 hours.\n - REJOIN_TIME_6: Every ~18.2 hours.\n - REJOIN_TIME_7: Every ~1.5 days.\n - REJOIN_TIME_8: Every ~3.0 days.\n - REJOIN_TIME_9: Every ~6.1 days.\n - REJOIN_TIME_10: Every ~12.1 days.\n - REJOIN_TIME_11: Every ~3.5 weeks.\n - REJOIN_TIME_12: Every ~1.6 months.\n - REJOIN_TIME_13: Every ~3.2 months.\n - REJOIN_TIME_14: Every ~6.4 months.\n - REJOIN_TIME_15: Every ~1.1 year.", + "type": "string", + "default": "REJOIN_TIME_0", + "enum": [ + "REJOIN_TIME_0", + "REJOIN_TIME_1", + "REJOIN_TIME_2", + "REJOIN_TIME_3", + "REJOIN_TIME_4", + "REJOIN_TIME_5", + "REJOIN_TIME_6", + "REJOIN_TIME_7", + "REJOIN_TIME_8", + "REJOIN_TIME_9", + "REJOIN_TIME_10", + "REJOIN_TIME_11", + "REJOIN_TIME_12", + "REJOIN_TIME_13", + "REJOIN_TIME_14", + "REJOIN_TIME_15" + ] + } + } + }, + "rekey_conf": { + "type": "object", + "properties": { + "minor_version": { + "type": "string", + "default": "MINOR_RFU_0", + "enum": [ + "MINOR_RFU_0", + "MINOR_1", + "MINOR_RFU_2", + "MINOR_RFU_3", + "MINOR_RFU_4", + "MINOR_RFU_5", + "MINOR_RFU_6", + "MINOR_RFU_7", + "MINOR_RFU_8", + "MINOR_RFU_9", + "MINOR_RFU_10", + "MINOR_RFU_11", + "MINOR_RFU_12", + "MINOR_RFU_13", + "MINOR_RFU_14", + "MINOR_RFU_15" + ] + } + } + }, + "rekey_ind": { + "type": "object", + "properties": { + "minor_version": { + "type": "string", + "default": "MINOR_RFU_0", + "enum": [ + "MINOR_RFU_0", + "MINOR_1", + "MINOR_RFU_2", + "MINOR_RFU_3", + "MINOR_RFU_4", + "MINOR_RFU_5", + "MINOR_RFU_6", + "MINOR_RFU_7", + "MINOR_RFU_8", + "MINOR_RFU_9", + "MINOR_RFU_10", + "MINOR_RFU_11", + "MINOR_RFU_12", + "MINOR_RFU_13", + "MINOR_RFU_14", + "MINOR_RFU_15" + ] + } + } + }, + "relay_conf_ans": { + "type": "object", + "properties": { + "cad_periodicity_ack": { + "type": "boolean" + }, + "default_channel_index_ack": { + "type": "boolean" + }, + "second_channel_ack_offset_ack": { + "type": "boolean" + }, + "second_channel_data_rate_index_ack": { + "type": "boolean" + }, + "second_channel_frequency_ack": { + "type": "boolean" + }, + "second_channel_index_ack": { + "type": "boolean" + } + } + }, + "relay_conf_req": { + "type": "object", + "properties": { + "configuration": { + "type": "object", + "properties": { + "cad_periodicity": { + "type": "string", + "title": "- RELAY_CAD_PERIODICITY_20_MILLISECONDS: sic", + "default": "RELAY_CAD_PERIODICITY_1_SECOND", + "enum": [ + "RELAY_CAD_PERIODICITY_1_SECOND", + "RELAY_CAD_PERIODICITY_500_MILLISECONDS", + "RELAY_CAD_PERIODICITY_250_MILLISECONDS", + "RELAY_CAD_PERIODICITY_100_MILLISECONDS", + "RELAY_CAD_PERIODICITY_50_MILLISECONDS", + "RELAY_CAD_PERIODICITY_20_MILLISECONDS" + ] + }, + "default_channel_index": { + "type": "integer", + "format": "int64" + }, + "second_channel": { + "type": "object", + "properties": { + "ack_offset": { + "type": "string", + "title": "- RELAY_SECOND_CH_ACK_OFFSET_0: 0 kHz\n - RELAY_SECOND_CH_ACK_OFFSET_200: 200 kHz\n - RELAY_SECOND_CH_ACK_OFFSET_400: 400 kHz\n - RELAY_SECOND_CH_ACK_OFFSET_800: 800 kHz\n - RELAY_SECOND_CH_ACK_OFFSET_1600: 1.6 MHz\n - RELAY_SECOND_CH_ACK_OFFSET_3200: 3.2 MHz", + "default": "RELAY_SECOND_CH_ACK_OFFSET_0", + "enum": [ + "RELAY_SECOND_CH_ACK_OFFSET_0", + "RELAY_SECOND_CH_ACK_OFFSET_200", + "RELAY_SECOND_CH_ACK_OFFSET_400", + "RELAY_SECOND_CH_ACK_OFFSET_800", + "RELAY_SECOND_CH_ACK_OFFSET_1600", + "RELAY_SECOND_CH_ACK_OFFSET_3200" + ] + }, + "data_rate_index": { + "type": "string", + "default": "DATA_RATE_0", + "enum": [ + "DATA_RATE_0", + "DATA_RATE_1", + "DATA_RATE_2", + "DATA_RATE_3", + "DATA_RATE_4", + "DATA_RATE_5", + "DATA_RATE_6", + "DATA_RATE_7", + "DATA_RATE_8", + "DATA_RATE_9", + "DATA_RATE_10", + "DATA_RATE_11", + "DATA_RATE_12", + "DATA_RATE_13", + "DATA_RATE_14", + "DATA_RATE_15" + ] + }, + "frequency": { + "description": "The frequency (Hz) used by the wake on radio message.", + "type": "string", + "format": "uint64" + } + } + } + } + } + } + }, + "relay_configure_fwd_limit_ans": { + "type": "object" + }, + "relay_configure_fwd_limit_req": { + "type": "object", + "properties": { + "global_uplink_limits": { + "type": "object", + "properties": { + "bucket_size": { + "type": "string", + "title": "- RELAY_LIMIT_BUCKET_SIZE_12: sic", + "default": "RELAY_LIMIT_BUCKET_SIZE_1", + "enum": [ + "RELAY_LIMIT_BUCKET_SIZE_1", + "RELAY_LIMIT_BUCKET_SIZE_2", + "RELAY_LIMIT_BUCKET_SIZE_4", + "RELAY_LIMIT_BUCKET_SIZE_12" + ] + }, + "reload_rate": { + "description": "The number of tokens which are replenished in the bucket every hour.", + "type": "integer", + "format": "int64" + } + } + }, + "join_request_limits": { + "type": "object", + "properties": { + "bucket_size": { + "type": "string", + "title": "- RELAY_LIMIT_BUCKET_SIZE_12: sic", + "default": "RELAY_LIMIT_BUCKET_SIZE_1", + "enum": [ + "RELAY_LIMIT_BUCKET_SIZE_1", + "RELAY_LIMIT_BUCKET_SIZE_2", + "RELAY_LIMIT_BUCKET_SIZE_4", + "RELAY_LIMIT_BUCKET_SIZE_12" + ] + }, + "reload_rate": { + "description": "The number of tokens which are replenished in the bucket every hour.", + "type": "integer", + "format": "int64" + } + } + }, + "notify_limits": { + "type": "object", + "properties": { + "bucket_size": { + "type": "string", + "title": "- RELAY_LIMIT_BUCKET_SIZE_12: sic", + "default": "RELAY_LIMIT_BUCKET_SIZE_1", + "enum": [ + "RELAY_LIMIT_BUCKET_SIZE_1", + "RELAY_LIMIT_BUCKET_SIZE_2", + "RELAY_LIMIT_BUCKET_SIZE_4", + "RELAY_LIMIT_BUCKET_SIZE_12" + ] + }, + "reload_rate": { + "description": "The number of tokens which are replenished in the bucket every hour.", + "type": "integer", + "format": "int64" + } + } + }, + "overall_limits": { + "type": "object", + "properties": { + "bucket_size": { + "type": "string", + "title": "- RELAY_LIMIT_BUCKET_SIZE_12: sic", + "default": "RELAY_LIMIT_BUCKET_SIZE_1", + "enum": [ + "RELAY_LIMIT_BUCKET_SIZE_1", + "RELAY_LIMIT_BUCKET_SIZE_2", + "RELAY_LIMIT_BUCKET_SIZE_4", + "RELAY_LIMIT_BUCKET_SIZE_12" + ] + }, + "reload_rate": { + "description": "The number of tokens which are replenished in the bucket every hour.", + "type": "integer", + "format": "int64" + } + } + }, + "reset_limit_counter": { + "type": "string", + "default": "RELAY_RESET_LIMIT_COUNTER_ZERO", + "enum": [ + "RELAY_RESET_LIMIT_COUNTER_ZERO", + "RELAY_RESET_LIMIT_COUNTER_RELOAD_RATE", + "RELAY_RESET_LIMIT_COUNTER_MAX_VALUE", + "RELAY_RESET_LIMIT_COUNTER_NO_RESET" + ] + } + } + }, + "relay_ctrl_uplink_list_ans": { + "type": "object", + "properties": { + "rule_index_ack": { + "type": "boolean" + }, + "w_f_cnt": { + "type": "integer", + "format": "int64" + } + } + }, + "relay_ctrl_uplink_list_req": { + "type": "object", + "properties": { + "action": { + "type": "string", + "default": "RELAY_CTRL_UPLINK_LIST_ACTION_READ_W_F_CNT", + "enum": [ + "RELAY_CTRL_UPLINK_LIST_ACTION_READ_W_F_CNT", + "RELAY_CTRL_UPLINK_LIST_ACTION_REMOVE_TRUSTED_END_DEVICE" + ] + }, + "rule_index": { + "type": "integer", + "format": "int64" + } + } + }, + "relay_end_device_conf_ans": { + "type": "object", + "properties": { + "backoff_ack": { + "type": "boolean" + }, + "second_channel_data_rate_index_ack": { + "type": "boolean" + }, + "second_channel_frequency_ack": { + "type": "boolean" + }, + "second_channel_index_ack": { + "type": "boolean" + } + } + }, + "relay_end_device_conf_req": { + "type": "object", + "properties": { + "configuration": { + "type": "object", + "properties": { + "always": { + "type": "object" + }, + "backoff": { + "type": "integer", + "format": "int64" + }, + "dynamic": { + "type": "object", + "properties": { + "smart_enable_level": { + "type": "string", + "default": "RELAY_SMART_ENABLE_LEVEL_8", + "enum": [ + "RELAY_SMART_ENABLE_LEVEL_8", + "RELAY_SMART_ENABLE_LEVEL_16", + "RELAY_SMART_ENABLE_LEVEL_32", + "RELAY_SMART_ENABLE_LEVEL_64" + ] + } + } + }, + "end_device_controlled": { + "type": "object" + }, + "second_channel": { + "type": "object", + "properties": { + "ack_offset": { + "type": "string", + "title": "- RELAY_SECOND_CH_ACK_OFFSET_0: 0 kHz\n - RELAY_SECOND_CH_ACK_OFFSET_200: 200 kHz\n - RELAY_SECOND_CH_ACK_OFFSET_400: 400 kHz\n - RELAY_SECOND_CH_ACK_OFFSET_800: 800 kHz\n - RELAY_SECOND_CH_ACK_OFFSET_1600: 1.6 MHz\n - RELAY_SECOND_CH_ACK_OFFSET_3200: 3.2 MHz", + "default": "RELAY_SECOND_CH_ACK_OFFSET_0", + "enum": [ + "RELAY_SECOND_CH_ACK_OFFSET_0", + "RELAY_SECOND_CH_ACK_OFFSET_200", + "RELAY_SECOND_CH_ACK_OFFSET_400", + "RELAY_SECOND_CH_ACK_OFFSET_800", + "RELAY_SECOND_CH_ACK_OFFSET_1600", + "RELAY_SECOND_CH_ACK_OFFSET_3200" + ] + }, + "data_rate_index": { + "type": "string", + "default": "DATA_RATE_0", + "enum": [ + "DATA_RATE_0", + "DATA_RATE_1", + "DATA_RATE_2", + "DATA_RATE_3", + "DATA_RATE_4", + "DATA_RATE_5", + "DATA_RATE_6", + "DATA_RATE_7", + "DATA_RATE_8", + "DATA_RATE_9", + "DATA_RATE_10", + "DATA_RATE_11", + "DATA_RATE_12", + "DATA_RATE_13", + "DATA_RATE_14", + "DATA_RATE_15" + ] + }, + "frequency": { + "description": "The frequency (Hz) used by the wake on radio message.", + "type": "string", + "format": "uint64" + } + } + }, + "serving_device_id": { + "type": "string" + } + } + } + } + }, + "relay_notify_new_end_device_req": { + "type": "object", + "properties": { + "dev_addr": { + "type": "string", + "format": "string", + "example": "2600ABCD" + }, + "rssi": { + "type": "integer", + "format": "int32" + }, + "snr": { + "type": "integer", + "format": "int32" + } + } + }, + "relay_update_uplink_list_ans": { + "type": "object" + }, + "relay_update_uplink_list_req": { + "type": "object", + "properties": { + "dev_addr": { + "type": "string", + "format": "string", + "example": "2600ABCD" + }, + "device_id": { + "type": "string" + }, + "forward_limits": { + "type": "object", + "properties": { + "bucket_size": { + "type": "string", + "title": "- RELAY_LIMIT_BUCKET_SIZE_12: sic", + "default": "RELAY_LIMIT_BUCKET_SIZE_1", + "enum": [ + "RELAY_LIMIT_BUCKET_SIZE_1", + "RELAY_LIMIT_BUCKET_SIZE_2", + "RELAY_LIMIT_BUCKET_SIZE_4", + "RELAY_LIMIT_BUCKET_SIZE_12" + ] + }, + "reload_rate": { + "description": "The number of tokens which are replenished in the bucket every hour.", + "type": "integer", + "format": "int64" + } + } + }, + "root_wor_s_key": { + "type": "string", + "format": "string", + "example": "0123456789ABCDEF0123456789ABCDEF" + }, + "rule_index": { + "type": "integer", + "format": "int64" + }, + "session_key_id": { + "type": "string", + "format": "byte" + }, + "w_f_cnt": { + "type": "integer", + "format": "int64" + } + } + }, + "reset_conf": { + "type": "object", + "properties": { + "minor_version": { + "type": "string", + "default": "MINOR_RFU_0", + "enum": [ + "MINOR_RFU_0", + "MINOR_1", + "MINOR_RFU_2", + "MINOR_RFU_3", + "MINOR_RFU_4", + "MINOR_RFU_5", + "MINOR_RFU_6", + "MINOR_RFU_7", + "MINOR_RFU_8", + "MINOR_RFU_9", + "MINOR_RFU_10", + "MINOR_RFU_11", + "MINOR_RFU_12", + "MINOR_RFU_13", + "MINOR_RFU_14", + "MINOR_RFU_15" + ] + } + } + }, + "reset_ind": { + "type": "object", + "properties": { + "minor_version": { + "type": "string", + "default": "MINOR_RFU_0", + "enum": [ + "MINOR_RFU_0", + "MINOR_1", + "MINOR_RFU_2", + "MINOR_RFU_3", + "MINOR_RFU_4", + "MINOR_RFU_5", + "MINOR_RFU_6", + "MINOR_RFU_7", + "MINOR_RFU_8", + "MINOR_RFU_9", + "MINOR_RFU_10", + "MINOR_RFU_11", + "MINOR_RFU_12", + "MINOR_RFU_13", + "MINOR_RFU_14", + "MINOR_RFU_15" + ] + } + } + }, + "rx_param_setup_ans": { + "type": "object", + "properties": { + "rx1_data_rate_offset_ack": { + "type": "boolean" + }, + "rx2_data_rate_index_ack": { + "type": "boolean" + }, + "rx2_frequency_ack": { + "type": "boolean" + } + } + }, + "rx_param_setup_req": { + "type": "object", + "properties": { + "rx1_data_rate_offset": { + "type": "string", + "default": "DATA_RATE_OFFSET_0", + "enum": [ + "DATA_RATE_OFFSET_0", + "DATA_RATE_OFFSET_1", + "DATA_RATE_OFFSET_2", + "DATA_RATE_OFFSET_3", + "DATA_RATE_OFFSET_4", + "DATA_RATE_OFFSET_5", + "DATA_RATE_OFFSET_6", + "DATA_RATE_OFFSET_7" + ] + }, + "rx2_data_rate_index": { + "type": "string", + "default": "DATA_RATE_0", + "enum": [ + "DATA_RATE_0", + "DATA_RATE_1", + "DATA_RATE_2", + "DATA_RATE_3", + "DATA_RATE_4", + "DATA_RATE_5", + "DATA_RATE_6", + "DATA_RATE_7", + "DATA_RATE_8", + "DATA_RATE_9", + "DATA_RATE_10", + "DATA_RATE_11", + "DATA_RATE_12", + "DATA_RATE_13", + "DATA_RATE_14", + "DATA_RATE_15" + ] + }, + "rx2_frequency": { + "description": "Rx2 frequency (Hz).", + "type": "string", + "format": "uint64" + } + } + }, + "rx_timing_setup_req": { + "type": "object", + "properties": { + "delay": { + "description": " - RX_DELAY_0: 1 second.\n - RX_DELAY_1: 1 second.\n - RX_DELAY_2: 2 seconds.\n - RX_DELAY_3: 3 seconds.\n - RX_DELAY_4: 4 seconds.\n - RX_DELAY_5: 5 seconds.\n - RX_DELAY_6: 6 seconds.\n - RX_DELAY_7: 7 seconds.\n - RX_DELAY_8: 8 seconds.\n - RX_DELAY_9: 9 seconds.\n - RX_DELAY_10: 10 seconds.\n - RX_DELAY_11: 11 seconds.\n - RX_DELAY_12: 12 seconds.\n - RX_DELAY_13: 13 seconds.\n - RX_DELAY_14: 14 seconds.\n - RX_DELAY_15: 15 seconds.", + "type": "string", + "default": "RX_DELAY_0", + "enum": [ + "RX_DELAY_0", + "RX_DELAY_1", + "RX_DELAY_2", + "RX_DELAY_3", + "RX_DELAY_4", + "RX_DELAY_5", + "RX_DELAY_6", + "RX_DELAY_7", + "RX_DELAY_8", + "RX_DELAY_9", + "RX_DELAY_10", + "RX_DELAY_11", + "RX_DELAY_12", + "RX_DELAY_13", + "RX_DELAY_14", + "RX_DELAY_15" + ] + } + } + }, + "tx_param_setup_req": { + "type": "object", + "properties": { + "downlink_dwell_time": { + "type": "boolean" + }, + "max_eirp_index": { + "description": " - DEVICE_EIRP_8: 8 dBm.\n - DEVICE_EIRP_10: 10 dBm.\n - DEVICE_EIRP_12: 12 dBm.\n - DEVICE_EIRP_13: 13 dBm.\n - DEVICE_EIRP_14: 14 dBm.\n - DEVICE_EIRP_16: 16 dBm.\n - DEVICE_EIRP_18: 18 dBm.\n - DEVICE_EIRP_20: 20 dBm.\n - DEVICE_EIRP_21: 21 dBm.\n - DEVICE_EIRP_24: 24 dBm.\n - DEVICE_EIRP_26: 26 dBm.\n - DEVICE_EIRP_27: 27 dBm.\n - DEVICE_EIRP_29: 29 dBm.\n - DEVICE_EIRP_30: 30 dBm.\n - DEVICE_EIRP_33: 33 dBm.\n - DEVICE_EIRP_36: 36 dBm.", + "type": "string", + "default": "DEVICE_EIRP_8", + "enum": [ + "DEVICE_EIRP_8", + "DEVICE_EIRP_10", + "DEVICE_EIRP_12", + "DEVICE_EIRP_13", + "DEVICE_EIRP_14", + "DEVICE_EIRP_16", + "DEVICE_EIRP_18", + "DEVICE_EIRP_20", + "DEVICE_EIRP_21", + "DEVICE_EIRP_24", + "DEVICE_EIRP_26", + "DEVICE_EIRP_27", + "DEVICE_EIRP_29", + "DEVICE_EIRP_30", + "DEVICE_EIRP_33", + "DEVICE_EIRP_36" + ] + }, + "uplink_dwell_time": { + "type": "boolean" + } + } + } + } + } + }, + "recent_downlinks": { + "description": "Recent data downlink messages sorted by time.\nThe number of messages stored may depend on configuration.", + "type": "array", + "items": { + "description": "A minimal DownlinkMessage definition which is binary compatible with the top level DownlinkMessage message.\nUsed for type safe recent downlink storage.", + "type": "object", + "properties": { + "correlation_ids": { + "type": "array", + "items": { + "type": "string" + } + }, + "payload": { + "type": "object", + "properties": { + "m_hdr": { + "type": "object", + "properties": { + "m_type": { + "type": "string", + "default": "JOIN_REQUEST", + "enum": [ + "JOIN_REQUEST", + "JOIN_ACCEPT", + "UNCONFIRMED_UP", + "UNCONFIRMED_DOWN", + "CONFIRMED_UP", + "CONFIRMED_DOWN", + "REJOIN_REQUEST", + "PROPRIETARY" + ] + } + } + }, + "mac_payload": { + "type": "object", + "properties": { + "f_port": { + "type": "integer", + "format": "int64" + }, + "full_f_cnt": { + "type": "integer", + "format": "int64" + } + } + } + } + } + } + } + }, + "recent_mac_command_identifiers": { + "description": "MAC command identifiers sent by the end device in the last received uplink.\nThe Network Server may choose to store only certain types of MAC\ncommand identifiers in the underlying implementation.", + "type": "array", + "items": { + "type": "string", + "title": "- CID_BEACON_TIMING: Deprecated", + "default": "CID_RFU_0", + "enum": [ + "CID_RFU_0", + "CID_RESET", + "CID_LINK_CHECK", + "CID_LINK_ADR", + "CID_DUTY_CYCLE", + "CID_RX_PARAM_SETUP", + "CID_DEV_STATUS", + "CID_NEW_CHANNEL", + "CID_RX_TIMING_SETUP", + "CID_TX_PARAM_SETUP", + "CID_DL_CHANNEL", + "CID_REKEY", + "CID_ADR_PARAM_SETUP", + "CID_DEVICE_TIME", + "CID_FORCE_REJOIN", + "CID_REJOIN_PARAM_SETUP", + "CID_PING_SLOT_INFO", + "CID_PING_SLOT_CHANNEL", + "CID_BEACON_TIMING", + "CID_BEACON_FREQ", + "CID_DEVICE_MODE", + "CID_RELAY_CONF", + "CID_RELAY_END_DEVICE_CONF", + "CID_RELAY_FILTER_LIST", + "CID_RELAY_UPDATE_UPLINK_LIST", + "CID_RELAY_CTRL_UPLINK_LIST", + "CID_RELAY_CONFIGURE_FWD_LIMIT", + "CID_RELAY_NOTIFY_NEW_END_DEVICE" + ] + } + }, + "recent_uplinks": { + "description": "Recent data uplink messages sorted by time.\nThe number of messages stored may depend on configuration.", + "type": "array", + "items": { + "description": "A minimal UplinkMessage definition which is binary compatible with the top level UplinkMessage message.\nUsed for type safe recent uplink storage.", + "type": "object", + "properties": { + "correlation_ids": { + "type": "array", + "items": { + "type": "string" + } + }, + "device_channel_index": { + "type": "integer", + "format": "int64" + }, + "payload": { + "type": "object", + "title": "Message represents a LoRaWAN message", + "properties": { + "join_accept_payload": { + "type": "object", + "properties": { + "cf_list": { + "type": "object", + "properties": { + "ch_masks": { + "description": "ChMasks controlling the channels to be used.\nLength of this field must be equal to the amount of uplink channels\ndefined by the selected frequency plan.", + "type": "array", + "items": { + "type": "boolean" + } + }, + "freq": { + "description": "Frequencies to be broadcasted, in hecto-Hz.\nThese values are broadcasted as 24 bits unsigned integers.\nThis field should not contain default values.", + "type": "array", + "items": { + "type": "integer", + "format": "int64" + } + }, + "type": { + "type": "string", + "default": "FREQUENCIES", + "enum": [ + "FREQUENCIES", + "CHANNEL_MASKS" + ] + } + } + }, + "dev_addr": { + "type": "string", + "format": "string", + "example": "2600ABCD" + }, + "dl_settings": { + "type": "object", + "properties": { + "opt_neg": { + "description": "OptNeg is set if Network Server implements LoRaWAN 1.1 or greater.", + "type": "boolean" + }, + "rx1_dr_offset": { + "type": "string", + "default": "DATA_RATE_OFFSET_0", + "enum": [ + "DATA_RATE_OFFSET_0", + "DATA_RATE_OFFSET_1", + "DATA_RATE_OFFSET_2", + "DATA_RATE_OFFSET_3", + "DATA_RATE_OFFSET_4", + "DATA_RATE_OFFSET_5", + "DATA_RATE_OFFSET_6", + "DATA_RATE_OFFSET_7" + ] + }, + "rx2_dr": { + "type": "string", + "default": "DATA_RATE_0", + "enum": [ + "DATA_RATE_0", + "DATA_RATE_1", + "DATA_RATE_2", + "DATA_RATE_3", + "DATA_RATE_4", + "DATA_RATE_5", + "DATA_RATE_6", + "DATA_RATE_7", + "DATA_RATE_8", + "DATA_RATE_9", + "DATA_RATE_10", + "DATA_RATE_11", + "DATA_RATE_12", + "DATA_RATE_13", + "DATA_RATE_14", + "DATA_RATE_15" + ] + } + } + }, + "encrypted": { + "type": "string", + "format": "byte" + }, + "join_nonce": { + "type": "string", + "format": "string", + "example": "ABCDEF" + }, + "net_id": { + "type": "string", + "format": "string", + "example": "000013" + }, + "rx_delay": { + "description": " - RX_DELAY_0: 1 second.\n - RX_DELAY_1: 1 second.\n - RX_DELAY_2: 2 seconds.\n - RX_DELAY_3: 3 seconds.\n - RX_DELAY_4: 4 seconds.\n - RX_DELAY_5: 5 seconds.\n - RX_DELAY_6: 6 seconds.\n - RX_DELAY_7: 7 seconds.\n - RX_DELAY_8: 8 seconds.\n - RX_DELAY_9: 9 seconds.\n - RX_DELAY_10: 10 seconds.\n - RX_DELAY_11: 11 seconds.\n - RX_DELAY_12: 12 seconds.\n - RX_DELAY_13: 13 seconds.\n - RX_DELAY_14: 14 seconds.\n - RX_DELAY_15: 15 seconds.", + "type": "string", + "default": "RX_DELAY_0", + "enum": [ + "RX_DELAY_0", + "RX_DELAY_1", + "RX_DELAY_2", + "RX_DELAY_3", + "RX_DELAY_4", + "RX_DELAY_5", + "RX_DELAY_6", + "RX_DELAY_7", + "RX_DELAY_8", + "RX_DELAY_9", + "RX_DELAY_10", + "RX_DELAY_11", + "RX_DELAY_12", + "RX_DELAY_13", + "RX_DELAY_14", + "RX_DELAY_15" + ] + } + } + }, + "join_request_payload": { + "type": "object", + "properties": { + "dev_eui": { + "type": "string", + "format": "string", + "example": "70B3D57ED000ABCD" + }, + "dev_nonce": { + "type": "string", + "format": "string", + "example": "ABCD" + }, + "join_eui": { + "type": "string", + "format": "string", + "example": "70B3D57ED000ABCD" + } + } + }, + "m_hdr": { + "type": "object", + "properties": { + "m_type": { + "type": "string", + "default": "JOIN_REQUEST", + "enum": [ + "JOIN_REQUEST", + "JOIN_ACCEPT", + "UNCONFIRMED_UP", + "UNCONFIRMED_DOWN", + "CONFIRMED_UP", + "CONFIRMED_DOWN", + "REJOIN_REQUEST", + "PROPRIETARY" + ] + }, + "major": { + "type": "string", + "default": "LORAWAN_R1", + "enum": [ + "LORAWAN_R1" + ] + } + } + }, + "mac_payload": { + "type": "object", + "properties": { + "decoded_payload": { + "type": "object" + }, + "f_hdr": { + "type": "object", + "properties": { + "dev_addr": { + "type": "string", + "format": "string", + "example": "2600ABCD" + }, + "f_cnt": { + "type": "integer", + "format": "int64" + }, + "f_ctrl": { + "type": "object", + "properties": { + "ack": { + "type": "boolean" + }, + "adr": { + "type": "boolean" + }, + "adr_ack_req": { + "description": "Only on uplink.", + "type": "boolean" + }, + "class_b": { + "description": "Only on uplink.", + "type": "boolean" + }, + "f_pending": { + "description": "Only on downlink.", + "type": "boolean" + } + } + }, + "f_opts": { + "type": "string", + "format": "byte" + } + } + }, + "f_port": { + "type": "integer", + "format": "int64" + }, + "frm_payload": { + "type": "string", + "format": "byte" + }, + "full_f_cnt": { + "description": "Full 32-bit FCnt value. Used internally by Network Server.", + "type": "integer", + "format": "int64" + } + } + }, + "mic": { + "type": "string", + "format": "byte" + }, + "rejoin_request_payload": { + "type": "object", + "properties": { + "dev_eui": { + "type": "string", + "format": "string", + "example": "70B3D57ED000ABCD" + }, + "join_eui": { + "type": "string", + "format": "string", + "example": "70B3D57ED000ABCD" + }, + "net_id": { + "type": "string", + "format": "string", + "example": "000013" + }, + "rejoin_cnt": { + "description": "Contains RJCount0 or RJCount1 depending on rejoin_type.", + "type": "integer", + "format": "int64" + }, + "rejoin_type": { + "description": " - CONTEXT: Resets DevAddr, Session Keys, Frame Counters, Radio Parameters.\n - SESSION: Equivalent to the initial JoinRequest.\n - KEYS: Resets DevAddr, Session Keys, Frame Counters, while keeping the Radio Parameters.", + "type": "string", + "default": "CONTEXT", + "enum": [ + "CONTEXT", + "SESSION", + "KEYS" + ] + } + } + } + } + }, + "received_at": { + "type": "string", + "format": "date-time" + }, + "rx_metadata": { + "type": "array", + "items": { + "type": "object", + "properties": { + "channel_rssi": { + "type": "number", + "format": "float" + }, + "downlink_path_constraint": { + "description": " - DOWNLINK_PATH_CONSTRAINT_NONE: Indicates that the gateway can be selected for downlink without constraints by the Network Server.\n - DOWNLINK_PATH_CONSTRAINT_PREFER_OTHER: Indicates that the gateway can be selected for downlink only if no other or better gateway can be selected.\n - DOWNLINK_PATH_CONSTRAINT_NEVER: Indicates that this gateway will never be selected for downlink, even if that results in no available downlink path.", + "type": "string", + "default": "DOWNLINK_PATH_CONSTRAINT_NONE", + "enum": [ + "DOWNLINK_PATH_CONSTRAINT_NONE", + "DOWNLINK_PATH_CONSTRAINT_PREFER_OTHER", + "DOWNLINK_PATH_CONSTRAINT_NEVER" + ] + }, + "gateway_ids": { + "type": "object", + "properties": { + "eui": { + "description": "Secondary identifier, which can only be used in specific requests.", + "type": "string", + "format": "string", + "example": "70B3D57ED000ABCD" + }, + "gateway_id": { + "type": "string" + } + } + }, + "packet_broker": { + "type": "object" + }, + "relay": { + "type": "object" + }, + "snr": { + "type": "number", + "format": "float" + }, + "uplink_token": { + "type": "string", + "format": "byte" + } + } + } + }, + "settings": { + "type": "object", + "properties": { + "data_rate": { + "type": "object", + "properties": { + "fsk": { + "type": "object", + "properties": { + "bit_rate": { + "description": "Bit rate (bps).", + "type": "integer", + "format": "int64" + } + } + }, + "lora": { + "type": "object", + "properties": { + "bandwidth": { + "description": "Bandwidth (Hz).", + "type": "integer", + "format": "int64" + }, + "coding_rate": { + "type": "string" + }, + "spreading_factor": { + "type": "integer", + "format": "int64" + } + } + }, + "lrfhss": { + "type": "object", + "properties": { + "coding_rate": { + "type": "string" + }, + "modulation_type": { + "type": "integer", + "format": "int64" + }, + "operating_channel_width": { + "description": "Operating Channel Width (Hz).", + "type": "integer", + "format": "int64" + } + } + } + } + } + } + } + } + } + }, + "rejected_adr_data_rate_indexes": { + "description": "ADR Data rate index values rejected by the device.\nReset each time `current_parameters.channels` change.\nElements are sorted in ascending order.", + "type": "array", + "items": { + "type": "string", + "default": "DATA_RATE_0", + "enum": [ + "DATA_RATE_0", + "DATA_RATE_1", + "DATA_RATE_2", + "DATA_RATE_3", + "DATA_RATE_4", + "DATA_RATE_5", + "DATA_RATE_6", + "DATA_RATE_7", + "DATA_RATE_8", + "DATA_RATE_9", + "DATA_RATE_10", + "DATA_RATE_11", + "DATA_RATE_12", + "DATA_RATE_13", + "DATA_RATE_14", + "DATA_RATE_15" + ] + } + }, + "rejected_adr_tx_power_indexes": { + "description": "ADR TX output power index values rejected by the device.\nElements are sorted in ascending order.", + "type": "array", + "items": { + "type": "integer", + "format": "int64" + } + }, + "rejected_data_rate_ranges": { + "description": "Data rate ranges rejected by the device per frequency.", + "type": "object", + "additionalProperties": { + "type": "object", + "properties": { + "ranges": { + "type": "array", + "items": { + "type": "object", + "properties": { + "max_data_rate_index": { + "type": "string", + "default": "DATA_RATE_0", + "enum": [ + "DATA_RATE_0", + "DATA_RATE_1", + "DATA_RATE_2", + "DATA_RATE_3", + "DATA_RATE_4", + "DATA_RATE_5", + "DATA_RATE_6", + "DATA_RATE_7", + "DATA_RATE_8", + "DATA_RATE_9", + "DATA_RATE_10", + "DATA_RATE_11", + "DATA_RATE_12", + "DATA_RATE_13", + "DATA_RATE_14", + "DATA_RATE_15" + ] + }, + "min_data_rate_index": { + "type": "string", + "default": "DATA_RATE_0", + "enum": [ + "DATA_RATE_0", + "DATA_RATE_1", + "DATA_RATE_2", + "DATA_RATE_3", + "DATA_RATE_4", + "DATA_RATE_5", + "DATA_RATE_6", + "DATA_RATE_7", + "DATA_RATE_8", + "DATA_RATE_9", + "DATA_RATE_10", + "DATA_RATE_11", + "DATA_RATE_12", + "DATA_RATE_13", + "DATA_RATE_14", + "DATA_RATE_15" + ] + } + } + } + } + } + } + }, + "rejected_frequencies": { + "description": "Frequencies rejected by the device.", + "type": "array", + "items": { + "type": "string", + "format": "uint64" + } + }, + "rx_windows_available": { + "description": "Whether or not Rx windows are expected to be open.\nSet to true every time an uplink is received.\nSet to false every time a successful downlink scheduling attempt is made.", + "type": "boolean" + } + } + }, + "max_frequency": { + "description": "Maximum frequency the device is capable of using (Hz). Stored in Network Server.\nCopied on creation from template identified by version_ids, if any or from the home Network Server device profile, if any.", + "type": "string", + "format": "uint64" + }, + "min_frequency": { + "description": "Minimum frequency the device is capable of using (Hz). Stored in Network Server.\nCopied on creation from template identified by version_ids, if any or from the home Network Server device profile, if any.", + "type": "string", + "format": "uint64" + }, + "multicast": { + "description": "Indicates whether this device represents a multicast group.", + "type": "boolean" + }, + "name": { + "description": "Friendly name of the device. Stored in Entity Registry.", + "type": "string" + }, + "net_id": { + "description": "Home NetID. Stored in Join Server.", + "type": "string", + "format": "string", + "example": "000013" + }, + "network_server_address": { + "description": "The address of the Network Server where this device is supposed to be registered.\nStored in Entity Registry and Join Server.\nThe typical format of the address is \"host:port\". If the port is omitted,\nthe normal port inference (with DNS lookup, otherwise defaults) is used.\nThe connection shall be established with transport layer security (TLS).\nCustom certificate authorities may be configured out-of-band.", + "type": "string" + }, + "network_server_kek_label": { + "description": "The KEK label of the Network Server to use for wrapping network session keys.\nStored in Join Server.", + "type": "string" + }, + "pending_mac_state": { + "description": "MACState represents the state of MAC layer of the device.\nMACState is reset on each join for OTAA or ResetInd for ABP devices.\nThis is used internally by the Network Server.", + "type": "object", + "properties": { + "current_parameters": { + "description": "MACParameters represent the parameters of the device's MAC layer (active or desired).\nThis is used internally by the Network Server.", + "type": "object", + "properties": { + "adr_ack_delay": { + "description": "ADR: number of messages to wait after setting ADRAckReq and before changing TxPower or DataRate.\nThis field is deprecated, use adr_ack_delay_exponent instead.", + "type": "integer", + "format": "int64" + }, + "adr_ack_delay_exponent": { + "type": "object", + "properties": { + "value": { + "type": "string", + "default": "ADR_ACK_DELAY_1", + "enum": [ + "ADR_ACK_DELAY_1", + "ADR_ACK_DELAY_2", + "ADR_ACK_DELAY_4", + "ADR_ACK_DELAY_8", + "ADR_ACK_DELAY_16", + "ADR_ACK_DELAY_32", + "ADR_ACK_DELAY_64", + "ADR_ACK_DELAY_128", + "ADR_ACK_DELAY_256", + "ADR_ACK_DELAY_512", + "ADR_ACK_DELAY_1024", + "ADR_ACK_DELAY_2048", + "ADR_ACK_DELAY_4096", + "ADR_ACK_DELAY_8192", + "ADR_ACK_DELAY_16384", + "ADR_ACK_DELAY_32768" + ] + } + } + }, + "adr_ack_limit": { + "description": "ADR: number of messages to wait before setting ADRAckReq.\nThis field is deprecated, use adr_ack_limit_exponent instead.", + "type": "integer", + "format": "int64" + }, + "adr_ack_limit_exponent": { + "type": "object", + "properties": { + "value": { + "type": "string", + "default": "ADR_ACK_LIMIT_1", + "enum": [ + "ADR_ACK_LIMIT_1", + "ADR_ACK_LIMIT_2", + "ADR_ACK_LIMIT_4", + "ADR_ACK_LIMIT_8", + "ADR_ACK_LIMIT_16", + "ADR_ACK_LIMIT_32", + "ADR_ACK_LIMIT_64", + "ADR_ACK_LIMIT_128", + "ADR_ACK_LIMIT_256", + "ADR_ACK_LIMIT_512", + "ADR_ACK_LIMIT_1024", + "ADR_ACK_LIMIT_2048", + "ADR_ACK_LIMIT_4096", + "ADR_ACK_LIMIT_8192", + "ADR_ACK_LIMIT_16384", + "ADR_ACK_LIMIT_32768" + ] + } + } + }, + "adr_data_rate_index": { + "type": "string", + "default": "DATA_RATE_0", + "enum": [ + "DATA_RATE_0", + "DATA_RATE_1", + "DATA_RATE_2", + "DATA_RATE_3", + "DATA_RATE_4", + "DATA_RATE_5", + "DATA_RATE_6", + "DATA_RATE_7", + "DATA_RATE_8", + "DATA_RATE_9", + "DATA_RATE_10", + "DATA_RATE_11", + "DATA_RATE_12", + "DATA_RATE_13", + "DATA_RATE_14", + "DATA_RATE_15" + ] + }, + "adr_nb_trans": { + "description": "ADR: number of retransmissions.", + "type": "integer", + "format": "int64" + }, + "adr_tx_power_index": { + "description": "ADR: transmission power index to use.", + "type": "integer", + "format": "int64" + }, + "beacon_frequency": { + "description": "Frequency of the class B beacon (Hz).", + "type": "string", + "format": "uint64" + }, + "channels": { + "description": "Configured uplink channels and optionally Rx1 frequency.", + "type": "array", + "items": { + "type": "object", + "properties": { + "downlink_frequency": { + "description": "Downlink frequency of the channel (Hz).", + "type": "string", + "format": "uint64" + }, + "enable_uplink": { + "description": "Channel can be used by device for uplink.", + "type": "boolean" + }, + "max_data_rate_index": { + "type": "string", + "default": "DATA_RATE_0", + "enum": [ + "DATA_RATE_0", + "DATA_RATE_1", + "DATA_RATE_2", + "DATA_RATE_3", + "DATA_RATE_4", + "DATA_RATE_5", + "DATA_RATE_6", + "DATA_RATE_7", + "DATA_RATE_8", + "DATA_RATE_9", + "DATA_RATE_10", + "DATA_RATE_11", + "DATA_RATE_12", + "DATA_RATE_13", + "DATA_RATE_14", + "DATA_RATE_15" + ] + }, + "min_data_rate_index": { + "type": "string", + "default": "DATA_RATE_0", + "enum": [ + "DATA_RATE_0", + "DATA_RATE_1", + "DATA_RATE_2", + "DATA_RATE_3", + "DATA_RATE_4", + "DATA_RATE_5", + "DATA_RATE_6", + "DATA_RATE_7", + "DATA_RATE_8", + "DATA_RATE_9", + "DATA_RATE_10", + "DATA_RATE_11", + "DATA_RATE_12", + "DATA_RATE_13", + "DATA_RATE_14", + "DATA_RATE_15" + ] + }, + "uplink_frequency": { + "description": "Uplink frequency of the channel (Hz).", + "type": "string", + "format": "uint64" + } + } + } + }, + "downlink_dwell_time": { + "type": "object", + "properties": { + "value": { + "type": "boolean" + } + } + }, + "max_duty_cycle": { + "description": " - DUTY_CYCLE_1: 100%.\n - DUTY_CYCLE_2: 50%.\n - DUTY_CYCLE_4: 25%.\n - DUTY_CYCLE_8: 12.5%.\n - DUTY_CYCLE_16: 6.25%.\n - DUTY_CYCLE_32: 3.125%.\n - DUTY_CYCLE_64: 1.5625%.\n - DUTY_CYCLE_128: Roughly 0.781%.\n - DUTY_CYCLE_256: Roughly 0.390%.\n - DUTY_CYCLE_512: Roughly 0.195%.\n - DUTY_CYCLE_1024: Roughly 0.098%.\n - DUTY_CYCLE_2048: Roughly 0.049%.\n - DUTY_CYCLE_4096: Roughly 0.024%.\n - DUTY_CYCLE_8192: Roughly 0.012%.\n - DUTY_CYCLE_16384: Roughly 0.006%.\n - DUTY_CYCLE_32768: Roughly 0.003%.", + "type": "string", + "default": "DUTY_CYCLE_1", + "enum": [ + "DUTY_CYCLE_1", + "DUTY_CYCLE_2", + "DUTY_CYCLE_4", + "DUTY_CYCLE_8", + "DUTY_CYCLE_16", + "DUTY_CYCLE_32", + "DUTY_CYCLE_64", + "DUTY_CYCLE_128", + "DUTY_CYCLE_256", + "DUTY_CYCLE_512", + "DUTY_CYCLE_1024", + "DUTY_CYCLE_2048", + "DUTY_CYCLE_4096", + "DUTY_CYCLE_8192", + "DUTY_CYCLE_16384", + "DUTY_CYCLE_32768" + ] + }, + "max_eirp": { + "description": "Maximum EIRP (dBm).", + "type": "number", + "format": "float" + }, + "ping_slot_data_rate_index": { + "type": "string", + "default": "DATA_RATE_0", + "enum": [ + "DATA_RATE_0", + "DATA_RATE_1", + "DATA_RATE_2", + "DATA_RATE_3", + "DATA_RATE_4", + "DATA_RATE_5", + "DATA_RATE_6", + "DATA_RATE_7", + "DATA_RATE_8", + "DATA_RATE_9", + "DATA_RATE_10", + "DATA_RATE_11", + "DATA_RATE_12", + "DATA_RATE_13", + "DATA_RATE_14", + "DATA_RATE_15" + ] + }, + "ping_slot_data_rate_index_value": { + "type": "object", + "properties": { + "value": { + "type": "string", + "default": "DATA_RATE_0", + "enum": [ + "DATA_RATE_0", + "DATA_RATE_1", + "DATA_RATE_2", + "DATA_RATE_3", + "DATA_RATE_4", + "DATA_RATE_5", + "DATA_RATE_6", + "DATA_RATE_7", + "DATA_RATE_8", + "DATA_RATE_9", + "DATA_RATE_10", + "DATA_RATE_11", + "DATA_RATE_12", + "DATA_RATE_13", + "DATA_RATE_14", + "DATA_RATE_15" + ] + } + } + }, + "ping_slot_frequency": { + "description": "Frequency of the class B ping slot (Hz).", + "type": "string", + "format": "uint64" + }, + "rejoin_count_periodicity": { + "type": "string", + "default": "REJOIN_COUNT_16", + "enum": [ + "REJOIN_COUNT_16", + "REJOIN_COUNT_32", + "REJOIN_COUNT_64", + "REJOIN_COUNT_128", + "REJOIN_COUNT_256", + "REJOIN_COUNT_512", + "REJOIN_COUNT_1024", + "REJOIN_COUNT_2048", + "REJOIN_COUNT_4096", + "REJOIN_COUNT_8192", + "REJOIN_COUNT_16384", + "REJOIN_COUNT_32768", + "REJOIN_COUNT_65536", + "REJOIN_COUNT_131072", + "REJOIN_COUNT_262144", + "REJOIN_COUNT_524288" + ] + }, + "rejoin_time_periodicity": { + "description": " - REJOIN_TIME_0: Every ~17.1 minutes.\n - REJOIN_TIME_1: Every ~34.1 minutes.\n - REJOIN_TIME_2: Every ~1.1 hours.\n - REJOIN_TIME_3: Every ~2.3 hours.\n - REJOIN_TIME_4: Every ~4.6 hours.\n - REJOIN_TIME_5: Every ~9.1 hours.\n - REJOIN_TIME_6: Every ~18.2 hours.\n - REJOIN_TIME_7: Every ~1.5 days.\n - REJOIN_TIME_8: Every ~3.0 days.\n - REJOIN_TIME_9: Every ~6.1 days.\n - REJOIN_TIME_10: Every ~12.1 days.\n - REJOIN_TIME_11: Every ~3.5 weeks.\n - REJOIN_TIME_12: Every ~1.6 months.\n - REJOIN_TIME_13: Every ~3.2 months.\n - REJOIN_TIME_14: Every ~6.4 months.\n - REJOIN_TIME_15: Every ~1.1 year.", + "type": "string", + "default": "REJOIN_TIME_0", + "enum": [ + "REJOIN_TIME_0", + "REJOIN_TIME_1", + "REJOIN_TIME_2", + "REJOIN_TIME_3", + "REJOIN_TIME_4", + "REJOIN_TIME_5", + "REJOIN_TIME_6", + "REJOIN_TIME_7", + "REJOIN_TIME_8", + "REJOIN_TIME_9", + "REJOIN_TIME_10", + "REJOIN_TIME_11", + "REJOIN_TIME_12", + "REJOIN_TIME_13", + "REJOIN_TIME_14", + "REJOIN_TIME_15" + ] + }, + "relay": { + "description": "RelayParameters represent the parameters of a relay.\nThis is used internally by the Network Server.", + "type": "object", + "properties": { + "served": { + "type": "object", + "properties": { + "always": { + "type": "object" + }, + "backoff": { + "description": "Number of wake on radio frames to be sent without an acknowledgement before sending the uplink message directly.", + "type": "integer", + "format": "int64" + }, + "dynamic": { + "type": "object", + "properties": { + "smart_enable_level": { + "type": "string", + "default": "RELAY_SMART_ENABLE_LEVEL_8", + "enum": [ + "RELAY_SMART_ENABLE_LEVEL_8", + "RELAY_SMART_ENABLE_LEVEL_16", + "RELAY_SMART_ENABLE_LEVEL_32", + "RELAY_SMART_ENABLE_LEVEL_64" + ] + } + } + }, + "end_device_controlled": { + "type": "object" + }, + "second_channel": { + "type": "object", + "properties": { + "ack_offset": { + "type": "string", + "title": "- RELAY_SECOND_CH_ACK_OFFSET_0: 0 kHz\n - RELAY_SECOND_CH_ACK_OFFSET_200: 200 kHz\n - RELAY_SECOND_CH_ACK_OFFSET_400: 400 kHz\n - RELAY_SECOND_CH_ACK_OFFSET_800: 800 kHz\n - RELAY_SECOND_CH_ACK_OFFSET_1600: 1.6 MHz\n - RELAY_SECOND_CH_ACK_OFFSET_3200: 3.2 MHz", + "default": "RELAY_SECOND_CH_ACK_OFFSET_0", + "enum": [ + "RELAY_SECOND_CH_ACK_OFFSET_0", + "RELAY_SECOND_CH_ACK_OFFSET_200", + "RELAY_SECOND_CH_ACK_OFFSET_400", + "RELAY_SECOND_CH_ACK_OFFSET_800", + "RELAY_SECOND_CH_ACK_OFFSET_1600", + "RELAY_SECOND_CH_ACK_OFFSET_3200" + ] + }, + "data_rate_index": { + "type": "string", + "default": "DATA_RATE_0", + "enum": [ + "DATA_RATE_0", + "DATA_RATE_1", + "DATA_RATE_2", + "DATA_RATE_3", + "DATA_RATE_4", + "DATA_RATE_5", + "DATA_RATE_6", + "DATA_RATE_7", + "DATA_RATE_8", + "DATA_RATE_9", + "DATA_RATE_10", + "DATA_RATE_11", + "DATA_RATE_12", + "DATA_RATE_13", + "DATA_RATE_14", + "DATA_RATE_15" + ] + }, + "frequency": { + "description": "The frequency (Hz) used by the wake on radio message.", + "type": "string", + "format": "uint64" + } + } + }, + "serving_device_id": { + "description": "End device identifier of the serving end device.", + "type": "string" + } + } + }, + "serving": { + "type": "object", + "properties": { + "cad_periodicity": { + "type": "string", + "title": "- RELAY_CAD_PERIODICITY_20_MILLISECONDS: sic", + "default": "RELAY_CAD_PERIODICITY_1_SECOND", + "enum": [ + "RELAY_CAD_PERIODICITY_1_SECOND", + "RELAY_CAD_PERIODICITY_500_MILLISECONDS", + "RELAY_CAD_PERIODICITY_250_MILLISECONDS", + "RELAY_CAD_PERIODICITY_100_MILLISECONDS", + "RELAY_CAD_PERIODICITY_50_MILLISECONDS", + "RELAY_CAD_PERIODICITY_20_MILLISECONDS" + ] + }, + "default_channel_index": { + "description": "Index of the default wake on radio channel.", + "type": "integer", + "format": "int64" + }, + "limits": { + "type": "object", + "properties": { + "join_requests": { + "type": "object", + "properties": { + "bucket_size": { + "type": "string", + "title": "- RELAY_LIMIT_BUCKET_SIZE_12: sic", + "default": "RELAY_LIMIT_BUCKET_SIZE_1", + "enum": [ + "RELAY_LIMIT_BUCKET_SIZE_1", + "RELAY_LIMIT_BUCKET_SIZE_2", + "RELAY_LIMIT_BUCKET_SIZE_4", + "RELAY_LIMIT_BUCKET_SIZE_12" + ] + }, + "reload_rate": { + "description": "The number of tokens which are replenished in the bucket every hour.", + "type": "integer", + "format": "int64" + } + } + }, + "notifications": { + "type": "object", + "properties": { + "bucket_size": { + "type": "string", + "title": "- RELAY_LIMIT_BUCKET_SIZE_12: sic", + "default": "RELAY_LIMIT_BUCKET_SIZE_1", + "enum": [ + "RELAY_LIMIT_BUCKET_SIZE_1", + "RELAY_LIMIT_BUCKET_SIZE_2", + "RELAY_LIMIT_BUCKET_SIZE_4", + "RELAY_LIMIT_BUCKET_SIZE_12" + ] + }, + "reload_rate": { + "description": "The number of tokens which are replenished in the bucket every hour.", + "type": "integer", + "format": "int64" + } + } + }, + "overall": { + "type": "object", + "properties": { + "bucket_size": { + "type": "string", + "title": "- RELAY_LIMIT_BUCKET_SIZE_12: sic", + "default": "RELAY_LIMIT_BUCKET_SIZE_1", + "enum": [ + "RELAY_LIMIT_BUCKET_SIZE_1", + "RELAY_LIMIT_BUCKET_SIZE_2", + "RELAY_LIMIT_BUCKET_SIZE_4", + "RELAY_LIMIT_BUCKET_SIZE_12" + ] + }, + "reload_rate": { + "description": "The number of tokens which are replenished in the bucket every hour.", + "type": "integer", + "format": "int64" + } + } + }, + "reset_behavior": { + "type": "string", + "default": "RELAY_RESET_LIMIT_COUNTER_ZERO", + "enum": [ + "RELAY_RESET_LIMIT_COUNTER_ZERO", + "RELAY_RESET_LIMIT_COUNTER_RELOAD_RATE", + "RELAY_RESET_LIMIT_COUNTER_MAX_VALUE", + "RELAY_RESET_LIMIT_COUNTER_NO_RESET" + ] + }, + "uplink_messages": { + "type": "object", + "properties": { + "bucket_size": { + "type": "string", + "title": "- RELAY_LIMIT_BUCKET_SIZE_12: sic", + "default": "RELAY_LIMIT_BUCKET_SIZE_1", + "enum": [ + "RELAY_LIMIT_BUCKET_SIZE_1", + "RELAY_LIMIT_BUCKET_SIZE_2", + "RELAY_LIMIT_BUCKET_SIZE_4", + "RELAY_LIMIT_BUCKET_SIZE_12" + ] + }, + "reload_rate": { + "description": "The number of tokens which are replenished in the bucket every hour.", + "type": "integer", + "format": "int64" + } + } + } + } + }, + "second_channel": { + "type": "object", + "properties": { + "ack_offset": { + "type": "string", + "title": "- RELAY_SECOND_CH_ACK_OFFSET_0: 0 kHz\n - RELAY_SECOND_CH_ACK_OFFSET_200: 200 kHz\n - RELAY_SECOND_CH_ACK_OFFSET_400: 400 kHz\n - RELAY_SECOND_CH_ACK_OFFSET_800: 800 kHz\n - RELAY_SECOND_CH_ACK_OFFSET_1600: 1.6 MHz\n - RELAY_SECOND_CH_ACK_OFFSET_3200: 3.2 MHz", + "default": "RELAY_SECOND_CH_ACK_OFFSET_0", + "enum": [ + "RELAY_SECOND_CH_ACK_OFFSET_0", + "RELAY_SECOND_CH_ACK_OFFSET_200", + "RELAY_SECOND_CH_ACK_OFFSET_400", + "RELAY_SECOND_CH_ACK_OFFSET_800", + "RELAY_SECOND_CH_ACK_OFFSET_1600", + "RELAY_SECOND_CH_ACK_OFFSET_3200" + ] + }, + "data_rate_index": { + "type": "string", + "default": "DATA_RATE_0", + "enum": [ + "DATA_RATE_0", + "DATA_RATE_1", + "DATA_RATE_2", + "DATA_RATE_3", + "DATA_RATE_4", + "DATA_RATE_5", + "DATA_RATE_6", + "DATA_RATE_7", + "DATA_RATE_8", + "DATA_RATE_9", + "DATA_RATE_10", + "DATA_RATE_11", + "DATA_RATE_12", + "DATA_RATE_13", + "DATA_RATE_14", + "DATA_RATE_15" + ] + }, + "frequency": { + "description": "The frequency (Hz) used by the wake on radio message.", + "type": "string", + "format": "uint64" + } + } + }, + "uplink_forwarding_rules": { + "description": "Configured uplink forwarding rules.", + "type": "array", + "items": { + "type": "object", + "properties": { + "device_id": { + "description": "End device identifier of the served end device.", + "type": "string" + }, + "last_w_f_cnt": { + "description": "Last wake on radio frame counter used by the served end device.", + "type": "integer", + "format": "int64" + }, + "limits": { + "type": "object", + "properties": { + "bucket_size": { + "type": "string", + "title": "- RELAY_LIMIT_BUCKET_SIZE_12: sic", + "default": "RELAY_LIMIT_BUCKET_SIZE_1", + "enum": [ + "RELAY_LIMIT_BUCKET_SIZE_1", + "RELAY_LIMIT_BUCKET_SIZE_2", + "RELAY_LIMIT_BUCKET_SIZE_4", + "RELAY_LIMIT_BUCKET_SIZE_12" + ] + }, + "reload_rate": { + "description": "The number of tokens which are replenished in the bucket every hour.", + "type": "integer", + "format": "int64" + } + } + }, + "session_key_id": { + "description": "Session key ID of the session keys used to derive the root relay session key.", + "type": "string", + "format": "byte" + } + } + } + } + } + } + } + }, + "rx1_data_rate_offset": { + "type": "string", + "default": "DATA_RATE_OFFSET_0", + "enum": [ + "DATA_RATE_OFFSET_0", + "DATA_RATE_OFFSET_1", + "DATA_RATE_OFFSET_2", + "DATA_RATE_OFFSET_3", + "DATA_RATE_OFFSET_4", + "DATA_RATE_OFFSET_5", + "DATA_RATE_OFFSET_6", + "DATA_RATE_OFFSET_7" + ] + }, + "rx1_delay": { + "description": " - RX_DELAY_0: 1 second.\n - RX_DELAY_1: 1 second.\n - RX_DELAY_2: 2 seconds.\n - RX_DELAY_3: 3 seconds.\n - RX_DELAY_4: 4 seconds.\n - RX_DELAY_5: 5 seconds.\n - RX_DELAY_6: 6 seconds.\n - RX_DELAY_7: 7 seconds.\n - RX_DELAY_8: 8 seconds.\n - RX_DELAY_9: 9 seconds.\n - RX_DELAY_10: 10 seconds.\n - RX_DELAY_11: 11 seconds.\n - RX_DELAY_12: 12 seconds.\n - RX_DELAY_13: 13 seconds.\n - RX_DELAY_14: 14 seconds.\n - RX_DELAY_15: 15 seconds.", + "type": "string", + "default": "RX_DELAY_0", + "enum": [ + "RX_DELAY_0", + "RX_DELAY_1", + "RX_DELAY_2", + "RX_DELAY_3", + "RX_DELAY_4", + "RX_DELAY_5", + "RX_DELAY_6", + "RX_DELAY_7", + "RX_DELAY_8", + "RX_DELAY_9", + "RX_DELAY_10", + "RX_DELAY_11", + "RX_DELAY_12", + "RX_DELAY_13", + "RX_DELAY_14", + "RX_DELAY_15" + ] + }, + "rx2_data_rate_index": { + "type": "string", + "default": "DATA_RATE_0", + "enum": [ + "DATA_RATE_0", + "DATA_RATE_1", + "DATA_RATE_2", + "DATA_RATE_3", + "DATA_RATE_4", + "DATA_RATE_5", + "DATA_RATE_6", + "DATA_RATE_7", + "DATA_RATE_8", + "DATA_RATE_9", + "DATA_RATE_10", + "DATA_RATE_11", + "DATA_RATE_12", + "DATA_RATE_13", + "DATA_RATE_14", + "DATA_RATE_15" + ] + }, + "rx2_frequency": { + "description": "Frequency for Rx2 (Hz).", + "type": "string", + "format": "uint64" + }, + "uplink_dwell_time": { + "type": "object", + "properties": { + "value": { + "type": "boolean" + } + } + } + } + }, + "desired_parameters": { + "description": "MACParameters represent the parameters of the device's MAC layer (active or desired).\nThis is used internally by the Network Server.", + "type": "object", + "properties": { + "adr_ack_delay": { + "description": "ADR: number of messages to wait after setting ADRAckReq and before changing TxPower or DataRate.\nThis field is deprecated, use adr_ack_delay_exponent instead.", + "type": "integer", + "format": "int64" + }, + "adr_ack_delay_exponent": { + "type": "object", + "properties": { + "value": { + "type": "string", + "default": "ADR_ACK_DELAY_1", + "enum": [ + "ADR_ACK_DELAY_1", + "ADR_ACK_DELAY_2", + "ADR_ACK_DELAY_4", + "ADR_ACK_DELAY_8", + "ADR_ACK_DELAY_16", + "ADR_ACK_DELAY_32", + "ADR_ACK_DELAY_64", + "ADR_ACK_DELAY_128", + "ADR_ACK_DELAY_256", + "ADR_ACK_DELAY_512", + "ADR_ACK_DELAY_1024", + "ADR_ACK_DELAY_2048", + "ADR_ACK_DELAY_4096", + "ADR_ACK_DELAY_8192", + "ADR_ACK_DELAY_16384", + "ADR_ACK_DELAY_32768" + ] + } + } + }, + "adr_ack_limit": { + "description": "ADR: number of messages to wait before setting ADRAckReq.\nThis field is deprecated, use adr_ack_limit_exponent instead.", + "type": "integer", + "format": "int64" + }, + "adr_ack_limit_exponent": { + "type": "object", + "properties": { + "value": { + "type": "string", + "default": "ADR_ACK_LIMIT_1", + "enum": [ + "ADR_ACK_LIMIT_1", + "ADR_ACK_LIMIT_2", + "ADR_ACK_LIMIT_4", + "ADR_ACK_LIMIT_8", + "ADR_ACK_LIMIT_16", + "ADR_ACK_LIMIT_32", + "ADR_ACK_LIMIT_64", + "ADR_ACK_LIMIT_128", + "ADR_ACK_LIMIT_256", + "ADR_ACK_LIMIT_512", + "ADR_ACK_LIMIT_1024", + "ADR_ACK_LIMIT_2048", + "ADR_ACK_LIMIT_4096", + "ADR_ACK_LIMIT_8192", + "ADR_ACK_LIMIT_16384", + "ADR_ACK_LIMIT_32768" + ] + } + } + }, + "adr_data_rate_index": { + "type": "string", + "default": "DATA_RATE_0", + "enum": [ + "DATA_RATE_0", + "DATA_RATE_1", + "DATA_RATE_2", + "DATA_RATE_3", + "DATA_RATE_4", + "DATA_RATE_5", + "DATA_RATE_6", + "DATA_RATE_7", + "DATA_RATE_8", + "DATA_RATE_9", + "DATA_RATE_10", + "DATA_RATE_11", + "DATA_RATE_12", + "DATA_RATE_13", + "DATA_RATE_14", + "DATA_RATE_15" + ] + }, + "adr_nb_trans": { + "description": "ADR: number of retransmissions.", + "type": "integer", + "format": "int64" + }, + "adr_tx_power_index": { + "description": "ADR: transmission power index to use.", + "type": "integer", + "format": "int64" + }, + "beacon_frequency": { + "description": "Frequency of the class B beacon (Hz).", + "type": "string", + "format": "uint64" + }, + "channels": { + "description": "Configured uplink channels and optionally Rx1 frequency.", + "type": "array", + "items": { + "type": "object", + "properties": { + "downlink_frequency": { + "description": "Downlink frequency of the channel (Hz).", + "type": "string", + "format": "uint64" + }, + "enable_uplink": { + "description": "Channel can be used by device for uplink.", + "type": "boolean" + }, + "max_data_rate_index": { + "type": "string", + "default": "DATA_RATE_0", + "enum": [ + "DATA_RATE_0", + "DATA_RATE_1", + "DATA_RATE_2", + "DATA_RATE_3", + "DATA_RATE_4", + "DATA_RATE_5", + "DATA_RATE_6", + "DATA_RATE_7", + "DATA_RATE_8", + "DATA_RATE_9", + "DATA_RATE_10", + "DATA_RATE_11", + "DATA_RATE_12", + "DATA_RATE_13", + "DATA_RATE_14", + "DATA_RATE_15" + ] + }, + "min_data_rate_index": { + "type": "string", + "default": "DATA_RATE_0", + "enum": [ + "DATA_RATE_0", + "DATA_RATE_1", + "DATA_RATE_2", + "DATA_RATE_3", + "DATA_RATE_4", + "DATA_RATE_5", + "DATA_RATE_6", + "DATA_RATE_7", + "DATA_RATE_8", + "DATA_RATE_9", + "DATA_RATE_10", + "DATA_RATE_11", + "DATA_RATE_12", + "DATA_RATE_13", + "DATA_RATE_14", + "DATA_RATE_15" + ] + }, + "uplink_frequency": { + "description": "Uplink frequency of the channel (Hz).", + "type": "string", + "format": "uint64" + } + } + } + }, + "downlink_dwell_time": { + "type": "object", + "properties": { + "value": { + "type": "boolean" + } + } + }, + "max_duty_cycle": { + "description": " - DUTY_CYCLE_1: 100%.\n - DUTY_CYCLE_2: 50%.\n - DUTY_CYCLE_4: 25%.\n - DUTY_CYCLE_8: 12.5%.\n - DUTY_CYCLE_16: 6.25%.\n - DUTY_CYCLE_32: 3.125%.\n - DUTY_CYCLE_64: 1.5625%.\n - DUTY_CYCLE_128: Roughly 0.781%.\n - DUTY_CYCLE_256: Roughly 0.390%.\n - DUTY_CYCLE_512: Roughly 0.195%.\n - DUTY_CYCLE_1024: Roughly 0.098%.\n - DUTY_CYCLE_2048: Roughly 0.049%.\n - DUTY_CYCLE_4096: Roughly 0.024%.\n - DUTY_CYCLE_8192: Roughly 0.012%.\n - DUTY_CYCLE_16384: Roughly 0.006%.\n - DUTY_CYCLE_32768: Roughly 0.003%.", + "type": "string", + "default": "DUTY_CYCLE_1", + "enum": [ + "DUTY_CYCLE_1", + "DUTY_CYCLE_2", + "DUTY_CYCLE_4", + "DUTY_CYCLE_8", + "DUTY_CYCLE_16", + "DUTY_CYCLE_32", + "DUTY_CYCLE_64", + "DUTY_CYCLE_128", + "DUTY_CYCLE_256", + "DUTY_CYCLE_512", + "DUTY_CYCLE_1024", + "DUTY_CYCLE_2048", + "DUTY_CYCLE_4096", + "DUTY_CYCLE_8192", + "DUTY_CYCLE_16384", + "DUTY_CYCLE_32768" + ] + }, + "max_eirp": { + "description": "Maximum EIRP (dBm).", + "type": "number", + "format": "float" + }, + "ping_slot_data_rate_index": { + "type": "string", + "default": "DATA_RATE_0", + "enum": [ + "DATA_RATE_0", + "DATA_RATE_1", + "DATA_RATE_2", + "DATA_RATE_3", + "DATA_RATE_4", + "DATA_RATE_5", + "DATA_RATE_6", + "DATA_RATE_7", + "DATA_RATE_8", + "DATA_RATE_9", + "DATA_RATE_10", + "DATA_RATE_11", + "DATA_RATE_12", + "DATA_RATE_13", + "DATA_RATE_14", + "DATA_RATE_15" + ] + }, + "ping_slot_data_rate_index_value": { + "type": "object", + "properties": { + "value": { + "type": "string", + "default": "DATA_RATE_0", + "enum": [ + "DATA_RATE_0", + "DATA_RATE_1", + "DATA_RATE_2", + "DATA_RATE_3", + "DATA_RATE_4", + "DATA_RATE_5", + "DATA_RATE_6", + "DATA_RATE_7", + "DATA_RATE_8", + "DATA_RATE_9", + "DATA_RATE_10", + "DATA_RATE_11", + "DATA_RATE_12", + "DATA_RATE_13", + "DATA_RATE_14", + "DATA_RATE_15" + ] + } + } + }, + "ping_slot_frequency": { + "description": "Frequency of the class B ping slot (Hz).", + "type": "string", + "format": "uint64" + }, + "rejoin_count_periodicity": { + "type": "string", + "default": "REJOIN_COUNT_16", + "enum": [ + "REJOIN_COUNT_16", + "REJOIN_COUNT_32", + "REJOIN_COUNT_64", + "REJOIN_COUNT_128", + "REJOIN_COUNT_256", + "REJOIN_COUNT_512", + "REJOIN_COUNT_1024", + "REJOIN_COUNT_2048", + "REJOIN_COUNT_4096", + "REJOIN_COUNT_8192", + "REJOIN_COUNT_16384", + "REJOIN_COUNT_32768", + "REJOIN_COUNT_65536", + "REJOIN_COUNT_131072", + "REJOIN_COUNT_262144", + "REJOIN_COUNT_524288" + ] + }, + "rejoin_time_periodicity": { + "description": " - REJOIN_TIME_0: Every ~17.1 minutes.\n - REJOIN_TIME_1: Every ~34.1 minutes.\n - REJOIN_TIME_2: Every ~1.1 hours.\n - REJOIN_TIME_3: Every ~2.3 hours.\n - REJOIN_TIME_4: Every ~4.6 hours.\n - REJOIN_TIME_5: Every ~9.1 hours.\n - REJOIN_TIME_6: Every ~18.2 hours.\n - REJOIN_TIME_7: Every ~1.5 days.\n - REJOIN_TIME_8: Every ~3.0 days.\n - REJOIN_TIME_9: Every ~6.1 days.\n - REJOIN_TIME_10: Every ~12.1 days.\n - REJOIN_TIME_11: Every ~3.5 weeks.\n - REJOIN_TIME_12: Every ~1.6 months.\n - REJOIN_TIME_13: Every ~3.2 months.\n - REJOIN_TIME_14: Every ~6.4 months.\n - REJOIN_TIME_15: Every ~1.1 year.", + "type": "string", + "default": "REJOIN_TIME_0", + "enum": [ + "REJOIN_TIME_0", + "REJOIN_TIME_1", + "REJOIN_TIME_2", + "REJOIN_TIME_3", + "REJOIN_TIME_4", + "REJOIN_TIME_5", + "REJOIN_TIME_6", + "REJOIN_TIME_7", + "REJOIN_TIME_8", + "REJOIN_TIME_9", + "REJOIN_TIME_10", + "REJOIN_TIME_11", + "REJOIN_TIME_12", + "REJOIN_TIME_13", + "REJOIN_TIME_14", + "REJOIN_TIME_15" + ] + }, + "relay": { + "description": "RelayParameters represent the parameters of a relay.\nThis is used internally by the Network Server.", + "type": "object", + "properties": { + "served": { + "type": "object", + "properties": { + "always": { + "type": "object" + }, + "backoff": { + "description": "Number of wake on radio frames to be sent without an acknowledgement before sending the uplink message directly.", + "type": "integer", + "format": "int64" + }, + "dynamic": { + "type": "object", + "properties": { + "smart_enable_level": { + "type": "string", + "default": "RELAY_SMART_ENABLE_LEVEL_8", + "enum": [ + "RELAY_SMART_ENABLE_LEVEL_8", + "RELAY_SMART_ENABLE_LEVEL_16", + "RELAY_SMART_ENABLE_LEVEL_32", + "RELAY_SMART_ENABLE_LEVEL_64" + ] + } + } + }, + "end_device_controlled": { + "type": "object" + }, + "second_channel": { + "type": "object", + "properties": { + "ack_offset": { + "type": "string", + "title": "- RELAY_SECOND_CH_ACK_OFFSET_0: 0 kHz\n - RELAY_SECOND_CH_ACK_OFFSET_200: 200 kHz\n - RELAY_SECOND_CH_ACK_OFFSET_400: 400 kHz\n - RELAY_SECOND_CH_ACK_OFFSET_800: 800 kHz\n - RELAY_SECOND_CH_ACK_OFFSET_1600: 1.6 MHz\n - RELAY_SECOND_CH_ACK_OFFSET_3200: 3.2 MHz", + "default": "RELAY_SECOND_CH_ACK_OFFSET_0", + "enum": [ + "RELAY_SECOND_CH_ACK_OFFSET_0", + "RELAY_SECOND_CH_ACK_OFFSET_200", + "RELAY_SECOND_CH_ACK_OFFSET_400", + "RELAY_SECOND_CH_ACK_OFFSET_800", + "RELAY_SECOND_CH_ACK_OFFSET_1600", + "RELAY_SECOND_CH_ACK_OFFSET_3200" + ] + }, + "data_rate_index": { + "type": "string", + "default": "DATA_RATE_0", + "enum": [ + "DATA_RATE_0", + "DATA_RATE_1", + "DATA_RATE_2", + "DATA_RATE_3", + "DATA_RATE_4", + "DATA_RATE_5", + "DATA_RATE_6", + "DATA_RATE_7", + "DATA_RATE_8", + "DATA_RATE_9", + "DATA_RATE_10", + "DATA_RATE_11", + "DATA_RATE_12", + "DATA_RATE_13", + "DATA_RATE_14", + "DATA_RATE_15" + ] + }, + "frequency": { + "description": "The frequency (Hz) used by the wake on radio message.", + "type": "string", + "format": "uint64" + } + } + }, + "serving_device_id": { + "description": "End device identifier of the serving end device.", + "type": "string" + } + } + }, + "serving": { + "type": "object", + "properties": { + "cad_periodicity": { + "type": "string", + "title": "- RELAY_CAD_PERIODICITY_20_MILLISECONDS: sic", + "default": "RELAY_CAD_PERIODICITY_1_SECOND", + "enum": [ + "RELAY_CAD_PERIODICITY_1_SECOND", + "RELAY_CAD_PERIODICITY_500_MILLISECONDS", + "RELAY_CAD_PERIODICITY_250_MILLISECONDS", + "RELAY_CAD_PERIODICITY_100_MILLISECONDS", + "RELAY_CAD_PERIODICITY_50_MILLISECONDS", + "RELAY_CAD_PERIODICITY_20_MILLISECONDS" + ] + }, + "default_channel_index": { + "description": "Index of the default wake on radio channel.", + "type": "integer", + "format": "int64" + }, + "limits": { + "type": "object", + "properties": { + "join_requests": { + "type": "object", + "properties": { + "bucket_size": { + "type": "string", + "title": "- RELAY_LIMIT_BUCKET_SIZE_12: sic", + "default": "RELAY_LIMIT_BUCKET_SIZE_1", + "enum": [ + "RELAY_LIMIT_BUCKET_SIZE_1", + "RELAY_LIMIT_BUCKET_SIZE_2", + "RELAY_LIMIT_BUCKET_SIZE_4", + "RELAY_LIMIT_BUCKET_SIZE_12" + ] + }, + "reload_rate": { + "description": "The number of tokens which are replenished in the bucket every hour.", + "type": "integer", + "format": "int64" + } + } + }, + "notifications": { + "type": "object", + "properties": { + "bucket_size": { + "type": "string", + "title": "- RELAY_LIMIT_BUCKET_SIZE_12: sic", + "default": "RELAY_LIMIT_BUCKET_SIZE_1", + "enum": [ + "RELAY_LIMIT_BUCKET_SIZE_1", + "RELAY_LIMIT_BUCKET_SIZE_2", + "RELAY_LIMIT_BUCKET_SIZE_4", + "RELAY_LIMIT_BUCKET_SIZE_12" + ] + }, + "reload_rate": { + "description": "The number of tokens which are replenished in the bucket every hour.", + "type": "integer", + "format": "int64" + } + } + }, + "overall": { + "type": "object", + "properties": { + "bucket_size": { + "type": "string", + "title": "- RELAY_LIMIT_BUCKET_SIZE_12: sic", + "default": "RELAY_LIMIT_BUCKET_SIZE_1", + "enum": [ + "RELAY_LIMIT_BUCKET_SIZE_1", + "RELAY_LIMIT_BUCKET_SIZE_2", + "RELAY_LIMIT_BUCKET_SIZE_4", + "RELAY_LIMIT_BUCKET_SIZE_12" + ] + }, + "reload_rate": { + "description": "The number of tokens which are replenished in the bucket every hour.", + "type": "integer", + "format": "int64" + } + } + }, + "reset_behavior": { + "type": "string", + "default": "RELAY_RESET_LIMIT_COUNTER_ZERO", + "enum": [ + "RELAY_RESET_LIMIT_COUNTER_ZERO", + "RELAY_RESET_LIMIT_COUNTER_RELOAD_RATE", + "RELAY_RESET_LIMIT_COUNTER_MAX_VALUE", + "RELAY_RESET_LIMIT_COUNTER_NO_RESET" + ] + }, + "uplink_messages": { + "type": "object", + "properties": { + "bucket_size": { + "type": "string", + "title": "- RELAY_LIMIT_BUCKET_SIZE_12: sic", + "default": "RELAY_LIMIT_BUCKET_SIZE_1", + "enum": [ + "RELAY_LIMIT_BUCKET_SIZE_1", + "RELAY_LIMIT_BUCKET_SIZE_2", + "RELAY_LIMIT_BUCKET_SIZE_4", + "RELAY_LIMIT_BUCKET_SIZE_12" + ] + }, + "reload_rate": { + "description": "The number of tokens which are replenished in the bucket every hour.", + "type": "integer", + "format": "int64" + } + } + } + } + }, + "second_channel": { + "type": "object", + "properties": { + "ack_offset": { + "type": "string", + "title": "- RELAY_SECOND_CH_ACK_OFFSET_0: 0 kHz\n - RELAY_SECOND_CH_ACK_OFFSET_200: 200 kHz\n - RELAY_SECOND_CH_ACK_OFFSET_400: 400 kHz\n - RELAY_SECOND_CH_ACK_OFFSET_800: 800 kHz\n - RELAY_SECOND_CH_ACK_OFFSET_1600: 1.6 MHz\n - RELAY_SECOND_CH_ACK_OFFSET_3200: 3.2 MHz", + "default": "RELAY_SECOND_CH_ACK_OFFSET_0", + "enum": [ + "RELAY_SECOND_CH_ACK_OFFSET_0", + "RELAY_SECOND_CH_ACK_OFFSET_200", + "RELAY_SECOND_CH_ACK_OFFSET_400", + "RELAY_SECOND_CH_ACK_OFFSET_800", + "RELAY_SECOND_CH_ACK_OFFSET_1600", + "RELAY_SECOND_CH_ACK_OFFSET_3200" + ] + }, + "data_rate_index": { + "type": "string", + "default": "DATA_RATE_0", + "enum": [ + "DATA_RATE_0", + "DATA_RATE_1", + "DATA_RATE_2", + "DATA_RATE_3", + "DATA_RATE_4", + "DATA_RATE_5", + "DATA_RATE_6", + "DATA_RATE_7", + "DATA_RATE_8", + "DATA_RATE_9", + "DATA_RATE_10", + "DATA_RATE_11", + "DATA_RATE_12", + "DATA_RATE_13", + "DATA_RATE_14", + "DATA_RATE_15" + ] + }, + "frequency": { + "description": "The frequency (Hz) used by the wake on radio message.", + "type": "string", + "format": "uint64" + } + } + }, + "uplink_forwarding_rules": { + "description": "Configured uplink forwarding rules.", + "type": "array", + "items": { + "type": "object", + "properties": { + "device_id": { + "description": "End device identifier of the served end device.", + "type": "string" + }, + "last_w_f_cnt": { + "description": "Last wake on radio frame counter used by the served end device.", + "type": "integer", + "format": "int64" + }, + "limits": { + "type": "object", + "properties": { + "bucket_size": { + "type": "string", + "title": "- RELAY_LIMIT_BUCKET_SIZE_12: sic", + "default": "RELAY_LIMIT_BUCKET_SIZE_1", + "enum": [ + "RELAY_LIMIT_BUCKET_SIZE_1", + "RELAY_LIMIT_BUCKET_SIZE_2", + "RELAY_LIMIT_BUCKET_SIZE_4", + "RELAY_LIMIT_BUCKET_SIZE_12" + ] + }, + "reload_rate": { + "description": "The number of tokens which are replenished in the bucket every hour.", + "type": "integer", + "format": "int64" + } + } + }, + "session_key_id": { + "description": "Session key ID of the session keys used to derive the root relay session key.", + "type": "string", + "format": "byte" + } + } + } + } + } + } + } + }, + "rx1_data_rate_offset": { + "type": "string", + "default": "DATA_RATE_OFFSET_0", + "enum": [ + "DATA_RATE_OFFSET_0", + "DATA_RATE_OFFSET_1", + "DATA_RATE_OFFSET_2", + "DATA_RATE_OFFSET_3", + "DATA_RATE_OFFSET_4", + "DATA_RATE_OFFSET_5", + "DATA_RATE_OFFSET_6", + "DATA_RATE_OFFSET_7" + ] + }, + "rx1_delay": { + "description": " - RX_DELAY_0: 1 second.\n - RX_DELAY_1: 1 second.\n - RX_DELAY_2: 2 seconds.\n - RX_DELAY_3: 3 seconds.\n - RX_DELAY_4: 4 seconds.\n - RX_DELAY_5: 5 seconds.\n - RX_DELAY_6: 6 seconds.\n - RX_DELAY_7: 7 seconds.\n - RX_DELAY_8: 8 seconds.\n - RX_DELAY_9: 9 seconds.\n - RX_DELAY_10: 10 seconds.\n - RX_DELAY_11: 11 seconds.\n - RX_DELAY_12: 12 seconds.\n - RX_DELAY_13: 13 seconds.\n - RX_DELAY_14: 14 seconds.\n - RX_DELAY_15: 15 seconds.", + "type": "string", + "default": "RX_DELAY_0", + "enum": [ + "RX_DELAY_0", + "RX_DELAY_1", + "RX_DELAY_2", + "RX_DELAY_3", + "RX_DELAY_4", + "RX_DELAY_5", + "RX_DELAY_6", + "RX_DELAY_7", + "RX_DELAY_8", + "RX_DELAY_9", + "RX_DELAY_10", + "RX_DELAY_11", + "RX_DELAY_12", + "RX_DELAY_13", + "RX_DELAY_14", + "RX_DELAY_15" + ] + }, + "rx2_data_rate_index": { + "type": "string", + "default": "DATA_RATE_0", + "enum": [ + "DATA_RATE_0", + "DATA_RATE_1", + "DATA_RATE_2", + "DATA_RATE_3", + "DATA_RATE_4", + "DATA_RATE_5", + "DATA_RATE_6", + "DATA_RATE_7", + "DATA_RATE_8", + "DATA_RATE_9", + "DATA_RATE_10", + "DATA_RATE_11", + "DATA_RATE_12", + "DATA_RATE_13", + "DATA_RATE_14", + "DATA_RATE_15" + ] + }, + "rx2_frequency": { + "description": "Frequency for Rx2 (Hz).", + "type": "string", + "format": "uint64" + }, + "uplink_dwell_time": { + "type": "object", + "properties": { + "value": { + "type": "boolean" + } + } + } + } + }, + "device_class": { + "type": "string", + "default": "CLASS_A", + "enum": [ + "CLASS_A", + "CLASS_B", + "CLASS_C" + ] + }, + "last_adr_change_f_cnt_up": { + "description": "Frame counter of uplink, which confirmed the last ADR parameter change.", + "type": "integer", + "format": "int64" + }, + "last_confirmed_downlink_at": { + "description": "Time when the last confirmed downlink message or MAC command was scheduled.", + "type": "string", + "format": "date-time" + }, + "last_dev_status_f_cnt_up": { + "description": "Frame counter value of last uplink containing DevStatusAns.", + "type": "integer", + "format": "int64" + }, + "last_downlink_at": { + "description": "Time when the last downlink message was scheduled.", + "type": "string", + "format": "date-time" + }, + "last_network_initiated_downlink_at": { + "description": "Time when the last network-initiated downlink message was scheduled.", + "type": "string", + "format": "date-time" + }, + "lorawan_version": { + "type": "string", + "default": "MAC_UNKNOWN", + "enum": [ + "MAC_UNKNOWN", + "MAC_V1_0", + "MAC_V1_0_1", + "MAC_V1_0_2", + "MAC_V1_1", + "MAC_V1_0_3", + "MAC_V1_0_4" + ] + }, + "pending_application_downlink": { + "type": "object", + "properties": { + "attributes": { + "description": "Attributes for devices, set by the Application Server while handling the message.", + "type": "object", + "additionalProperties": { + "type": "string" + } + }, + "class_b_c": { + "type": "object", + "properties": { + "absolute_time": { + "description": "Absolute time when the downlink message should be transmitted.\nThis requires the gateway to have GPS time synchronization.\nIf the time is in the past or if there is a scheduling conflict, the downlink message fails.\nIf null, the time is selected based on slot availability. This is recommended in class B mode.", + "type": "string", + "format": "date-time" + }, + "gateways": { + "description": "Possible gateway identifiers, antenna index, and group index to use for this downlink message.\nThe Network Server selects one of these gateways for downlink, based on connectivity, signal quality, channel utilization and an available slot.\nIf none of the gateways can be selected, the downlink message fails.\nIf empty, a gateway and antenna is selected automatically from the gateways seen in recent uplinks.\nIf group index is set, gateways will be grouped by the index for the Network Server to select one gateway per group.", + "type": "array", + "items": { + "type": "object", + "properties": { + "antenna_index": { + "type": "integer", + "format": "int64" + }, + "gateway_ids": { + "type": "object", + "properties": { + "eui": { + "description": "Secondary identifier, which can only be used in specific requests.", + "type": "string", + "format": "string", + "example": "70B3D57ED000ABCD" + }, + "gateway_id": { + "type": "string" + } + } + }, + "group_index": { + "type": "integer", + "format": "int64" + } + } + } + } + } + }, + "confirmed": { + "type": "boolean" + }, + "confirmed_retry": { + "type": "object", + "properties": { + "attempt": { + "description": "The number of attempted confirmed downlink acknowledgements.", + "type": "integer", + "format": "int64" + }, + "max_attempts": { + "description": "The maximum number of confirmed downlink acknowledgement attempts.\nIf null, the Application Server configuration is used instead.", + "type": "integer", + "format": "int64" + } + } + }, + "correlation_ids": { + "type": "array", + "items": { + "type": "string" + } + }, + "decoded_payload": { + "description": "The decoded frame payload of the downlink message.\nWhen scheduling downlink with a message processor configured for the end device (see formatters) or application (see default_formatters),\nthis fields acts as input for the downlink encoder, and the output is set to frm_payload.\nWhen reading downlink (listing the queue, downlink message events, etc), this fields acts as output of the downlink decoder, and the input is frm_payload.", + "type": "object" + }, + "decoded_payload_warnings": { + "description": "Warnings generated by the message processor while encoding frm_payload (scheduling downlink) or decoding the frm_payload (reading downlink).", + "type": "array", + "items": { + "type": "string" + } + }, + "f_cnt": { + "type": "integer", + "format": "int64" + }, + "f_port": { + "type": "integer", + "format": "int64" + }, + "frm_payload": { + "description": "The frame payload of the downlink message.\nThe payload is encrypted if the skip_payload_crypto field of the EndDevice\nis true.", + "type": "string", + "format": "byte" + }, + "locations": { + "description": "End device location metadata, set by the Application Server while handling the message.", + "type": "object", + "additionalProperties": { + "type": "object", + "properties": { + "accuracy": { + "description": "The accuracy of the location (meters).", + "type": "integer", + "format": "int32" + }, + "altitude": { + "description": "The altitude (meters), where 0 is the mean sea level.", + "type": "integer", + "format": "int32" + }, + "latitude": { + "description": "The North–South position (degrees; -90 to +90), where 0 is the equator, North pole is positive, South pole is negative.", + "type": "number", + "format": "double" + }, + "longitude": { + "description": "The East-West position (degrees; -180 to +180), where 0 is the Prime Meridian (Greenwich), East is positive , West is negative.", + "type": "number", + "format": "double" + }, + "source": { + "description": " - SOURCE_UNKNOWN: The source of the location is not known or not set.\n - SOURCE_GPS: The location is determined by GPS.\n - SOURCE_REGISTRY: The location is set in and updated from a registry.\n - SOURCE_IP_GEOLOCATION: The location is estimated with IP geolocation.\n - SOURCE_WIFI_RSSI_GEOLOCATION: The location is estimated with WiFi RSSI geolocation.\n - SOURCE_BT_RSSI_GEOLOCATION: The location is estimated with BT/BLE RSSI geolocation.\n - SOURCE_LORA_RSSI_GEOLOCATION: The location is estimated with LoRa RSSI geolocation.\n - SOURCE_LORA_TDOA_GEOLOCATION: The location is estimated with LoRa TDOA geolocation.\n - SOURCE_COMBINED_GEOLOCATION: The location is estimated by a combination of geolocation sources.\n\nMore estimation methods can be added.", + "type": "string", + "default": "SOURCE_UNKNOWN", + "enum": [ + "SOURCE_UNKNOWN", + "SOURCE_GPS", + "SOURCE_REGISTRY", + "SOURCE_IP_GEOLOCATION", + "SOURCE_WIFI_RSSI_GEOLOCATION", + "SOURCE_BT_RSSI_GEOLOCATION", + "SOURCE_LORA_RSSI_GEOLOCATION", + "SOURCE_LORA_TDOA_GEOLOCATION", + "SOURCE_COMBINED_GEOLOCATION" + ] + } + } + } + }, + "network_ids": { + "description": "Identifies a Network Server.", + "type": "object", + "properties": { + "cluster_address": { + "description": "Cluster address of the Network Server.", + "type": "string" + }, + "cluster_id": { + "description": "Cluster identifier of the Network Server.", + "type": "string" + }, + "net_id": { + "description": "LoRa Alliance NetID.", + "type": "string", + "format": "string", + "example": "000013" + }, + "ns_id": { + "description": "LoRaWAN NSID (EUI-64) that uniquely identifies the Network Server instance.", + "type": "string", + "format": "string", + "example": "70B3D57ED000ABCD" + }, + "tenant_address": { + "description": "Optional tenant address for multi-tenant deployments.", + "type": "string" + }, + "tenant_id": { + "description": "Optional tenant identifier for multi-tenant deployments.", + "type": "string" + } + } + }, + "priority": { + "type": "string", + "default": "LOWEST", + "enum": [ + "LOWEST", + "LOW", + "BELOW_NORMAL", + "NORMAL", + "ABOVE_NORMAL", + "HIGH", + "HIGHEST" + ] + }, + "session_key_id": { + "description": "Join Server issued identifier for the session keys used by this downlink.", + "type": "string", + "format": "byte" + }, + "version_ids": { + "description": "Identifies an end device model with version information.", + "type": "object", + "properties": { + "band_id": { + "type": "string" + }, + "brand_id": { + "type": "string" + }, + "firmware_version": { + "type": "string" + }, + "hardware_version": { + "type": "string" + }, + "model_id": { + "type": "string" + } + } + } + } + }, + "pending_join_request": { + "type": "object", + "properties": { + "cf_list": { + "type": "object", + "properties": { + "ch_masks": { + "description": "ChMasks controlling the channels to be used.\nLength of this field must be equal to the amount of uplink channels\ndefined by the selected frequency plan.", + "type": "array", + "items": { + "type": "boolean" + } + }, + "freq": { + "description": "Frequencies to be broadcasted, in hecto-Hz.\nThese values are broadcasted as 24 bits unsigned integers.\nThis field should not contain default values.", + "type": "array", + "items": { + "type": "integer", + "format": "int64" + } + }, + "type": { + "type": "string", + "default": "FREQUENCIES", + "enum": [ + "FREQUENCIES", + "CHANNEL_MASKS" + ] + } + } + }, + "downlink_settings": { + "type": "object", + "properties": { + "opt_neg": { + "description": "OptNeg is set if Network Server implements LoRaWAN 1.1 or greater.", + "type": "boolean" + }, + "rx1_dr_offset": { + "type": "string", + "default": "DATA_RATE_OFFSET_0", + "enum": [ + "DATA_RATE_OFFSET_0", + "DATA_RATE_OFFSET_1", + "DATA_RATE_OFFSET_2", + "DATA_RATE_OFFSET_3", + "DATA_RATE_OFFSET_4", + "DATA_RATE_OFFSET_5", + "DATA_RATE_OFFSET_6", + "DATA_RATE_OFFSET_7" + ] + }, + "rx2_dr": { + "type": "string", + "default": "DATA_RATE_0", + "enum": [ + "DATA_RATE_0", + "DATA_RATE_1", + "DATA_RATE_2", + "DATA_RATE_3", + "DATA_RATE_4", + "DATA_RATE_5", + "DATA_RATE_6", + "DATA_RATE_7", + "DATA_RATE_8", + "DATA_RATE_9", + "DATA_RATE_10", + "DATA_RATE_11", + "DATA_RATE_12", + "DATA_RATE_13", + "DATA_RATE_14", + "DATA_RATE_15" + ] + } + } + }, + "rx_delay": { + "description": " - RX_DELAY_0: 1 second.\n - RX_DELAY_1: 1 second.\n - RX_DELAY_2: 2 seconds.\n - RX_DELAY_3: 3 seconds.\n - RX_DELAY_4: 4 seconds.\n - RX_DELAY_5: 5 seconds.\n - RX_DELAY_6: 6 seconds.\n - RX_DELAY_7: 7 seconds.\n - RX_DELAY_8: 8 seconds.\n - RX_DELAY_9: 9 seconds.\n - RX_DELAY_10: 10 seconds.\n - RX_DELAY_11: 11 seconds.\n - RX_DELAY_12: 12 seconds.\n - RX_DELAY_13: 13 seconds.\n - RX_DELAY_14: 14 seconds.\n - RX_DELAY_15: 15 seconds.", + "type": "string", + "default": "RX_DELAY_0", + "enum": [ + "RX_DELAY_0", + "RX_DELAY_1", + "RX_DELAY_2", + "RX_DELAY_3", + "RX_DELAY_4", + "RX_DELAY_5", + "RX_DELAY_6", + "RX_DELAY_7", + "RX_DELAY_8", + "RX_DELAY_9", + "RX_DELAY_10", + "RX_DELAY_11", + "RX_DELAY_12", + "RX_DELAY_13", + "RX_DELAY_14", + "RX_DELAY_15" + ] + } + } + }, + "pending_relay_downlink": { + "type": "object", + "properties": { + "raw_payload": { + "type": "string", + "format": "byte" + } + } + }, + "pending_requests": { + "description": "Pending MAC requests(i.e. sent requests, for which no response has been received yet).\nRegenerated on each downlink.", + "type": "array", + "items": { + "type": "object", + "properties": { + "adr_param_setup_req": { + "type": "object", + "properties": { + "adr_ack_delay_exponent": { + "type": "string", + "default": "ADR_ACK_DELAY_1", + "enum": [ + "ADR_ACK_DELAY_1", + "ADR_ACK_DELAY_2", + "ADR_ACK_DELAY_4", + "ADR_ACK_DELAY_8", + "ADR_ACK_DELAY_16", + "ADR_ACK_DELAY_32", + "ADR_ACK_DELAY_64", + "ADR_ACK_DELAY_128", + "ADR_ACK_DELAY_256", + "ADR_ACK_DELAY_512", + "ADR_ACK_DELAY_1024", + "ADR_ACK_DELAY_2048", + "ADR_ACK_DELAY_4096", + "ADR_ACK_DELAY_8192", + "ADR_ACK_DELAY_16384", + "ADR_ACK_DELAY_32768" + ] + }, + "adr_ack_limit_exponent": { + "type": "string", + "default": "ADR_ACK_LIMIT_1", + "enum": [ + "ADR_ACK_LIMIT_1", + "ADR_ACK_LIMIT_2", + "ADR_ACK_LIMIT_4", + "ADR_ACK_LIMIT_8", + "ADR_ACK_LIMIT_16", + "ADR_ACK_LIMIT_32", + "ADR_ACK_LIMIT_64", + "ADR_ACK_LIMIT_128", + "ADR_ACK_LIMIT_256", + "ADR_ACK_LIMIT_512", + "ADR_ACK_LIMIT_1024", + "ADR_ACK_LIMIT_2048", + "ADR_ACK_LIMIT_4096", + "ADR_ACK_LIMIT_8192", + "ADR_ACK_LIMIT_16384", + "ADR_ACK_LIMIT_32768" + ] + } + } + }, + "beacon_freq_ans": { + "type": "object", + "properties": { + "frequency_ack": { + "type": "boolean" + } + } + }, + "beacon_freq_req": { + "type": "object", + "properties": { + "frequency": { + "description": "Frequency of the Class B beacons (Hz).", + "type": "string", + "format": "uint64" + } + } + }, + "beacon_timing_ans": { + "type": "object", + "properties": { + "channel_index": { + "type": "integer", + "format": "int64" + }, + "delay": { + "description": "(uint16) See LoRaWAN specification.", + "type": "integer", + "format": "int64" + } + } + }, + "cid": { + "type": "string", + "title": "- CID_BEACON_TIMING: Deprecated", + "default": "CID_RFU_0", + "enum": [ + "CID_RFU_0", + "CID_RESET", + "CID_LINK_CHECK", + "CID_LINK_ADR", + "CID_DUTY_CYCLE", + "CID_RX_PARAM_SETUP", + "CID_DEV_STATUS", + "CID_NEW_CHANNEL", + "CID_RX_TIMING_SETUP", + "CID_TX_PARAM_SETUP", + "CID_DL_CHANNEL", + "CID_REKEY", + "CID_ADR_PARAM_SETUP", + "CID_DEVICE_TIME", + "CID_FORCE_REJOIN", + "CID_REJOIN_PARAM_SETUP", + "CID_PING_SLOT_INFO", + "CID_PING_SLOT_CHANNEL", + "CID_BEACON_TIMING", + "CID_BEACON_FREQ", + "CID_DEVICE_MODE", + "CID_RELAY_CONF", + "CID_RELAY_END_DEVICE_CONF", + "CID_RELAY_FILTER_LIST", + "CID_RELAY_UPDATE_UPLINK_LIST", + "CID_RELAY_CTRL_UPLINK_LIST", + "CID_RELAY_CONFIGURE_FWD_LIMIT", + "CID_RELAY_NOTIFY_NEW_END_DEVICE" + ] + }, + "dev_status_ans": { + "type": "object", + "properties": { + "battery": { + "description": "Device battery status.\n0 indicates that the device is connected to an external power source.\n1..254 indicates a battery level.\n255 indicates that the device was not able to measure the battery level.", + "type": "integer", + "format": "int64" + }, + "margin": { + "description": "SNR of the last downlink (dB; [-32, +31]).", + "type": "integer", + "format": "int32" + } + } + }, + "device_mode_conf": { + "type": "object", + "properties": { + "class": { + "type": "string", + "default": "CLASS_A", + "enum": [ + "CLASS_A", + "CLASS_B", + "CLASS_C" + ] + } + } + }, + "device_mode_ind": { + "type": "object", + "properties": { + "class": { + "type": "string", + "default": "CLASS_A", + "enum": [ + "CLASS_A", + "CLASS_B", + "CLASS_C" + ] + } + } + }, + "device_time_ans": { + "type": "object", + "properties": { + "time": { + "type": "string", + "format": "date-time" + } + } + }, + "dl_channel_ans": { + "type": "object", + "properties": { + "channel_index_ack": { + "type": "boolean" + }, + "frequency_ack": { + "type": "boolean" + } + } + }, + "dl_channel_req": { + "type": "object", + "properties": { + "channel_index": { + "type": "integer", + "format": "int64" + }, + "frequency": { + "description": "Downlink channel frequency (Hz).", + "type": "string", + "format": "uint64" + } + } + }, + "duty_cycle_req": { + "type": "object", + "properties": { + "max_duty_cycle": { + "description": " - DUTY_CYCLE_1: 100%.\n - DUTY_CYCLE_2: 50%.\n - DUTY_CYCLE_4: 25%.\n - DUTY_CYCLE_8: 12.5%.\n - DUTY_CYCLE_16: 6.25%.\n - DUTY_CYCLE_32: 3.125%.\n - DUTY_CYCLE_64: 1.5625%.\n - DUTY_CYCLE_128: Roughly 0.781%.\n - DUTY_CYCLE_256: Roughly 0.390%.\n - DUTY_CYCLE_512: Roughly 0.195%.\n - DUTY_CYCLE_1024: Roughly 0.098%.\n - DUTY_CYCLE_2048: Roughly 0.049%.\n - DUTY_CYCLE_4096: Roughly 0.024%.\n - DUTY_CYCLE_8192: Roughly 0.012%.\n - DUTY_CYCLE_16384: Roughly 0.006%.\n - DUTY_CYCLE_32768: Roughly 0.003%.", + "type": "string", + "default": "DUTY_CYCLE_1", + "enum": [ + "DUTY_CYCLE_1", + "DUTY_CYCLE_2", + "DUTY_CYCLE_4", + "DUTY_CYCLE_8", + "DUTY_CYCLE_16", + "DUTY_CYCLE_32", + "DUTY_CYCLE_64", + "DUTY_CYCLE_128", + "DUTY_CYCLE_256", + "DUTY_CYCLE_512", + "DUTY_CYCLE_1024", + "DUTY_CYCLE_2048", + "DUTY_CYCLE_4096", + "DUTY_CYCLE_8192", + "DUTY_CYCLE_16384", + "DUTY_CYCLE_32768" + ] + } + } + }, + "force_rejoin_req": { + "type": "object", + "properties": { + "data_rate_index": { + "type": "string", + "default": "DATA_RATE_0", + "enum": [ + "DATA_RATE_0", + "DATA_RATE_1", + "DATA_RATE_2", + "DATA_RATE_3", + "DATA_RATE_4", + "DATA_RATE_5", + "DATA_RATE_6", + "DATA_RATE_7", + "DATA_RATE_8", + "DATA_RATE_9", + "DATA_RATE_10", + "DATA_RATE_11", + "DATA_RATE_12", + "DATA_RATE_13", + "DATA_RATE_14", + "DATA_RATE_15" + ] + }, + "max_retries": { + "type": "integer", + "format": "int64" + }, + "period_exponent": { + "description": " - REJOIN_PERIOD_0: Every 32 to 64 seconds.\n - REJOIN_PERIOD_1: Every 64 to 96 seconds.\n - REJOIN_PERIOD_2: Every 128 to 160 seconds.\n - REJOIN_PERIOD_3: Every 256 to 288 seconds.\n - REJOIN_PERIOD_4: Every 512 to 544 seconds.\n - REJOIN_PERIOD_5: Every 1024 to 1056 seconds.\n - REJOIN_PERIOD_6: Every 2048 to 2080 seconds.\n - REJOIN_PERIOD_7: Every 4096 to 4128 seconds.", + "type": "string", + "default": "REJOIN_PERIOD_0", + "enum": [ + "REJOIN_PERIOD_0", + "REJOIN_PERIOD_1", + "REJOIN_PERIOD_2", + "REJOIN_PERIOD_3", + "REJOIN_PERIOD_4", + "REJOIN_PERIOD_5", + "REJOIN_PERIOD_6", + "REJOIN_PERIOD_7" + ] + }, + "rejoin_type": { + "description": " - CONTEXT: Resets DevAddr, Session Keys, Frame Counters, Radio Parameters.\n - SESSION: Equivalent to the initial JoinRequest.\n - KEYS: Resets DevAddr, Session Keys, Frame Counters, while keeping the Radio Parameters.", + "type": "string", + "default": "CONTEXT", + "enum": [ + "CONTEXT", + "SESSION", + "KEYS" + ] + } + } + }, + "link_adr_ans": { + "type": "object", + "properties": { + "channel_mask_ack": { + "type": "boolean" + }, + "data_rate_index_ack": { + "type": "boolean" + }, + "tx_power_index_ack": { + "type": "boolean" + } + } + }, + "link_adr_req": { + "type": "object", + "properties": { + "channel_mask": { + "type": "array", + "items": { + "type": "boolean" + } + }, + "channel_mask_control": { + "type": "integer", + "format": "int64" + }, + "data_rate_index": { + "type": "string", + "default": "DATA_RATE_0", + "enum": [ + "DATA_RATE_0", + "DATA_RATE_1", + "DATA_RATE_2", + "DATA_RATE_3", + "DATA_RATE_4", + "DATA_RATE_5", + "DATA_RATE_6", + "DATA_RATE_7", + "DATA_RATE_8", + "DATA_RATE_9", + "DATA_RATE_10", + "DATA_RATE_11", + "DATA_RATE_12", + "DATA_RATE_13", + "DATA_RATE_14", + "DATA_RATE_15" + ] + }, + "nb_trans": { + "type": "integer", + "format": "int64" + }, + "tx_power_index": { + "type": "integer", + "format": "int64" + } + } + }, + "link_check_ans": { + "type": "object", + "properties": { + "gateway_count": { + "type": "integer", + "format": "int64" + }, + "margin": { + "description": "Indicates the link margin in dB of the received LinkCheckReq, relative to the demodulation floor.", + "type": "integer", + "format": "int64" + } + } + }, + "new_channel_ans": { + "type": "object", + "properties": { + "data_rate_ack": { + "type": "boolean" + }, + "frequency_ack": { + "type": "boolean" + } + } + }, + "new_channel_req": { + "type": "object", + "properties": { + "channel_index": { + "type": "integer", + "format": "int64" + }, + "frequency": { + "description": "Channel frequency (Hz).", + "type": "string", + "format": "uint64" + }, + "max_data_rate_index": { + "type": "string", + "default": "DATA_RATE_0", + "enum": [ + "DATA_RATE_0", + "DATA_RATE_1", + "DATA_RATE_2", + "DATA_RATE_3", + "DATA_RATE_4", + "DATA_RATE_5", + "DATA_RATE_6", + "DATA_RATE_7", + "DATA_RATE_8", + "DATA_RATE_9", + "DATA_RATE_10", + "DATA_RATE_11", + "DATA_RATE_12", + "DATA_RATE_13", + "DATA_RATE_14", + "DATA_RATE_15" + ] + }, + "min_data_rate_index": { + "type": "string", + "default": "DATA_RATE_0", + "enum": [ + "DATA_RATE_0", + "DATA_RATE_1", + "DATA_RATE_2", + "DATA_RATE_3", + "DATA_RATE_4", + "DATA_RATE_5", + "DATA_RATE_6", + "DATA_RATE_7", + "DATA_RATE_8", + "DATA_RATE_9", + "DATA_RATE_10", + "DATA_RATE_11", + "DATA_RATE_12", + "DATA_RATE_13", + "DATA_RATE_14", + "DATA_RATE_15" + ] + } + } + }, + "ping_slot_channel_ans": { + "type": "object", + "properties": { + "data_rate_index_ack": { + "type": "boolean" + }, + "frequency_ack": { + "type": "boolean" + } + } + }, + "ping_slot_channel_req": { + "type": "object", + "properties": { + "data_rate_index": { + "type": "string", + "default": "DATA_RATE_0", + "enum": [ + "DATA_RATE_0", + "DATA_RATE_1", + "DATA_RATE_2", + "DATA_RATE_3", + "DATA_RATE_4", + "DATA_RATE_5", + "DATA_RATE_6", + "DATA_RATE_7", + "DATA_RATE_8", + "DATA_RATE_9", + "DATA_RATE_10", + "DATA_RATE_11", + "DATA_RATE_12", + "DATA_RATE_13", + "DATA_RATE_14", + "DATA_RATE_15" + ] + }, + "frequency": { + "description": "Ping slot channel frequency (Hz).", + "type": "string", + "format": "uint64" + } + } + }, + "ping_slot_info_req": { + "type": "object", + "properties": { + "period": { + "description": " - PING_EVERY_1S: Every second.\n - PING_EVERY_2S: Every 2 seconds.\n - PING_EVERY_4S: Every 4 seconds.\n - PING_EVERY_8S: Every 8 seconds.\n - PING_EVERY_16S: Every 16 seconds.\n - PING_EVERY_32S: Every 32 seconds.\n - PING_EVERY_64S: Every 64 seconds.\n - PING_EVERY_128S: Every 128 seconds.", + "type": "string", + "default": "PING_EVERY_1S", + "enum": [ + "PING_EVERY_1S", + "PING_EVERY_2S", + "PING_EVERY_4S", + "PING_EVERY_8S", + "PING_EVERY_16S", + "PING_EVERY_32S", + "PING_EVERY_64S", + "PING_EVERY_128S" + ] + } + } + }, + "raw_payload": { + "type": "string", + "format": "byte" + }, + "rejoin_param_setup_ans": { + "type": "object", + "properties": { + "max_time_exponent_ack": { + "type": "boolean" + } + } + }, + "rejoin_param_setup_req": { + "type": "object", + "properties": { + "max_count_exponent": { + "type": "string", + "default": "REJOIN_COUNT_16", + "enum": [ + "REJOIN_COUNT_16", + "REJOIN_COUNT_32", + "REJOIN_COUNT_64", + "REJOIN_COUNT_128", + "REJOIN_COUNT_256", + "REJOIN_COUNT_512", + "REJOIN_COUNT_1024", + "REJOIN_COUNT_2048", + "REJOIN_COUNT_4096", + "REJOIN_COUNT_8192", + "REJOIN_COUNT_16384", + "REJOIN_COUNT_32768", + "REJOIN_COUNT_65536", + "REJOIN_COUNT_131072", + "REJOIN_COUNT_262144", + "REJOIN_COUNT_524288" + ] + }, + "max_time_exponent": { + "description": " - REJOIN_TIME_0: Every ~17.1 minutes.\n - REJOIN_TIME_1: Every ~34.1 minutes.\n - REJOIN_TIME_2: Every ~1.1 hours.\n - REJOIN_TIME_3: Every ~2.3 hours.\n - REJOIN_TIME_4: Every ~4.6 hours.\n - REJOIN_TIME_5: Every ~9.1 hours.\n - REJOIN_TIME_6: Every ~18.2 hours.\n - REJOIN_TIME_7: Every ~1.5 days.\n - REJOIN_TIME_8: Every ~3.0 days.\n - REJOIN_TIME_9: Every ~6.1 days.\n - REJOIN_TIME_10: Every ~12.1 days.\n - REJOIN_TIME_11: Every ~3.5 weeks.\n - REJOIN_TIME_12: Every ~1.6 months.\n - REJOIN_TIME_13: Every ~3.2 months.\n - REJOIN_TIME_14: Every ~6.4 months.\n - REJOIN_TIME_15: Every ~1.1 year.", + "type": "string", + "default": "REJOIN_TIME_0", + "enum": [ + "REJOIN_TIME_0", + "REJOIN_TIME_1", + "REJOIN_TIME_2", + "REJOIN_TIME_3", + "REJOIN_TIME_4", + "REJOIN_TIME_5", + "REJOIN_TIME_6", + "REJOIN_TIME_7", + "REJOIN_TIME_8", + "REJOIN_TIME_9", + "REJOIN_TIME_10", + "REJOIN_TIME_11", + "REJOIN_TIME_12", + "REJOIN_TIME_13", + "REJOIN_TIME_14", + "REJOIN_TIME_15" + ] + } + } + }, + "rekey_conf": { + "type": "object", + "properties": { + "minor_version": { + "type": "string", + "default": "MINOR_RFU_0", + "enum": [ + "MINOR_RFU_0", + "MINOR_1", + "MINOR_RFU_2", + "MINOR_RFU_3", + "MINOR_RFU_4", + "MINOR_RFU_5", + "MINOR_RFU_6", + "MINOR_RFU_7", + "MINOR_RFU_8", + "MINOR_RFU_9", + "MINOR_RFU_10", + "MINOR_RFU_11", + "MINOR_RFU_12", + "MINOR_RFU_13", + "MINOR_RFU_14", + "MINOR_RFU_15" + ] + } + } + }, + "rekey_ind": { + "type": "object", + "properties": { + "minor_version": { + "type": "string", + "default": "MINOR_RFU_0", + "enum": [ + "MINOR_RFU_0", + "MINOR_1", + "MINOR_RFU_2", + "MINOR_RFU_3", + "MINOR_RFU_4", + "MINOR_RFU_5", + "MINOR_RFU_6", + "MINOR_RFU_7", + "MINOR_RFU_8", + "MINOR_RFU_9", + "MINOR_RFU_10", + "MINOR_RFU_11", + "MINOR_RFU_12", + "MINOR_RFU_13", + "MINOR_RFU_14", + "MINOR_RFU_15" + ] + } + } + }, + "relay_conf_ans": { + "type": "object", + "properties": { + "cad_periodicity_ack": { + "type": "boolean" + }, + "default_channel_index_ack": { + "type": "boolean" + }, + "second_channel_ack_offset_ack": { + "type": "boolean" + }, + "second_channel_data_rate_index_ack": { + "type": "boolean" + }, + "second_channel_frequency_ack": { + "type": "boolean" + }, + "second_channel_index_ack": { + "type": "boolean" + } + } + }, + "relay_conf_req": { + "type": "object", + "properties": { + "configuration": { + "type": "object", + "properties": { + "cad_periodicity": { + "type": "string", + "title": "- RELAY_CAD_PERIODICITY_20_MILLISECONDS: sic", + "default": "RELAY_CAD_PERIODICITY_1_SECOND", + "enum": [ + "RELAY_CAD_PERIODICITY_1_SECOND", + "RELAY_CAD_PERIODICITY_500_MILLISECONDS", + "RELAY_CAD_PERIODICITY_250_MILLISECONDS", + "RELAY_CAD_PERIODICITY_100_MILLISECONDS", + "RELAY_CAD_PERIODICITY_50_MILLISECONDS", + "RELAY_CAD_PERIODICITY_20_MILLISECONDS" + ] + }, + "default_channel_index": { + "type": "integer", + "format": "int64" + }, + "second_channel": { + "type": "object", + "properties": { + "ack_offset": { + "type": "string", + "title": "- RELAY_SECOND_CH_ACK_OFFSET_0: 0 kHz\n - RELAY_SECOND_CH_ACK_OFFSET_200: 200 kHz\n - RELAY_SECOND_CH_ACK_OFFSET_400: 400 kHz\n - RELAY_SECOND_CH_ACK_OFFSET_800: 800 kHz\n - RELAY_SECOND_CH_ACK_OFFSET_1600: 1.6 MHz\n - RELAY_SECOND_CH_ACK_OFFSET_3200: 3.2 MHz", + "default": "RELAY_SECOND_CH_ACK_OFFSET_0", + "enum": [ + "RELAY_SECOND_CH_ACK_OFFSET_0", + "RELAY_SECOND_CH_ACK_OFFSET_200", + "RELAY_SECOND_CH_ACK_OFFSET_400", + "RELAY_SECOND_CH_ACK_OFFSET_800", + "RELAY_SECOND_CH_ACK_OFFSET_1600", + "RELAY_SECOND_CH_ACK_OFFSET_3200" + ] + }, + "data_rate_index": { + "type": "string", + "default": "DATA_RATE_0", + "enum": [ + "DATA_RATE_0", + "DATA_RATE_1", + "DATA_RATE_2", + "DATA_RATE_3", + "DATA_RATE_4", + "DATA_RATE_5", + "DATA_RATE_6", + "DATA_RATE_7", + "DATA_RATE_8", + "DATA_RATE_9", + "DATA_RATE_10", + "DATA_RATE_11", + "DATA_RATE_12", + "DATA_RATE_13", + "DATA_RATE_14", + "DATA_RATE_15" + ] + }, + "frequency": { + "description": "The frequency (Hz) used by the wake on radio message.", + "type": "string", + "format": "uint64" + } + } + } + } + } + } + }, + "relay_configure_fwd_limit_ans": { + "type": "object" + }, + "relay_configure_fwd_limit_req": { + "type": "object", + "properties": { + "global_uplink_limits": { + "type": "object", + "properties": { + "bucket_size": { + "type": "string", + "title": "- RELAY_LIMIT_BUCKET_SIZE_12: sic", + "default": "RELAY_LIMIT_BUCKET_SIZE_1", + "enum": [ + "RELAY_LIMIT_BUCKET_SIZE_1", + "RELAY_LIMIT_BUCKET_SIZE_2", + "RELAY_LIMIT_BUCKET_SIZE_4", + "RELAY_LIMIT_BUCKET_SIZE_12" + ] + }, + "reload_rate": { + "description": "The number of tokens which are replenished in the bucket every hour.", + "type": "integer", + "format": "int64" + } + } + }, + "join_request_limits": { + "type": "object", + "properties": { + "bucket_size": { + "type": "string", + "title": "- RELAY_LIMIT_BUCKET_SIZE_12: sic", + "default": "RELAY_LIMIT_BUCKET_SIZE_1", + "enum": [ + "RELAY_LIMIT_BUCKET_SIZE_1", + "RELAY_LIMIT_BUCKET_SIZE_2", + "RELAY_LIMIT_BUCKET_SIZE_4", + "RELAY_LIMIT_BUCKET_SIZE_12" + ] + }, + "reload_rate": { + "description": "The number of tokens which are replenished in the bucket every hour.", + "type": "integer", + "format": "int64" + } + } + }, + "notify_limits": { + "type": "object", + "properties": { + "bucket_size": { + "type": "string", + "title": "- RELAY_LIMIT_BUCKET_SIZE_12: sic", + "default": "RELAY_LIMIT_BUCKET_SIZE_1", + "enum": [ + "RELAY_LIMIT_BUCKET_SIZE_1", + "RELAY_LIMIT_BUCKET_SIZE_2", + "RELAY_LIMIT_BUCKET_SIZE_4", + "RELAY_LIMIT_BUCKET_SIZE_12" + ] + }, + "reload_rate": { + "description": "The number of tokens which are replenished in the bucket every hour.", + "type": "integer", + "format": "int64" + } + } + }, + "overall_limits": { + "type": "object", + "properties": { + "bucket_size": { + "type": "string", + "title": "- RELAY_LIMIT_BUCKET_SIZE_12: sic", + "default": "RELAY_LIMIT_BUCKET_SIZE_1", + "enum": [ + "RELAY_LIMIT_BUCKET_SIZE_1", + "RELAY_LIMIT_BUCKET_SIZE_2", + "RELAY_LIMIT_BUCKET_SIZE_4", + "RELAY_LIMIT_BUCKET_SIZE_12" + ] + }, + "reload_rate": { + "description": "The number of tokens which are replenished in the bucket every hour.", + "type": "integer", + "format": "int64" + } + } + }, + "reset_limit_counter": { + "type": "string", + "default": "RELAY_RESET_LIMIT_COUNTER_ZERO", + "enum": [ + "RELAY_RESET_LIMIT_COUNTER_ZERO", + "RELAY_RESET_LIMIT_COUNTER_RELOAD_RATE", + "RELAY_RESET_LIMIT_COUNTER_MAX_VALUE", + "RELAY_RESET_LIMIT_COUNTER_NO_RESET" + ] + } + } + }, + "relay_ctrl_uplink_list_ans": { + "type": "object", + "properties": { + "rule_index_ack": { + "type": "boolean" + }, + "w_f_cnt": { + "type": "integer", + "format": "int64" + } + } + }, + "relay_ctrl_uplink_list_req": { + "type": "object", + "properties": { + "action": { + "type": "string", + "default": "RELAY_CTRL_UPLINK_LIST_ACTION_READ_W_F_CNT", + "enum": [ + "RELAY_CTRL_UPLINK_LIST_ACTION_READ_W_F_CNT", + "RELAY_CTRL_UPLINK_LIST_ACTION_REMOVE_TRUSTED_END_DEVICE" + ] + }, + "rule_index": { + "type": "integer", + "format": "int64" + } + } + }, + "relay_end_device_conf_ans": { + "type": "object", + "properties": { + "backoff_ack": { + "type": "boolean" + }, + "second_channel_data_rate_index_ack": { + "type": "boolean" + }, + "second_channel_frequency_ack": { + "type": "boolean" + }, + "second_channel_index_ack": { + "type": "boolean" + } + } + }, + "relay_end_device_conf_req": { + "type": "object", + "properties": { + "configuration": { + "type": "object", + "properties": { + "always": { + "type": "object" + }, + "backoff": { + "type": "integer", + "format": "int64" + }, + "dynamic": { + "type": "object", + "properties": { + "smart_enable_level": { + "type": "string", + "default": "RELAY_SMART_ENABLE_LEVEL_8", + "enum": [ + "RELAY_SMART_ENABLE_LEVEL_8", + "RELAY_SMART_ENABLE_LEVEL_16", + "RELAY_SMART_ENABLE_LEVEL_32", + "RELAY_SMART_ENABLE_LEVEL_64" + ] + } + } + }, + "end_device_controlled": { + "type": "object" + }, + "second_channel": { + "type": "object", + "properties": { + "ack_offset": { + "type": "string", + "title": "- RELAY_SECOND_CH_ACK_OFFSET_0: 0 kHz\n - RELAY_SECOND_CH_ACK_OFFSET_200: 200 kHz\n - RELAY_SECOND_CH_ACK_OFFSET_400: 400 kHz\n - RELAY_SECOND_CH_ACK_OFFSET_800: 800 kHz\n - RELAY_SECOND_CH_ACK_OFFSET_1600: 1.6 MHz\n - RELAY_SECOND_CH_ACK_OFFSET_3200: 3.2 MHz", + "default": "RELAY_SECOND_CH_ACK_OFFSET_0", + "enum": [ + "RELAY_SECOND_CH_ACK_OFFSET_0", + "RELAY_SECOND_CH_ACK_OFFSET_200", + "RELAY_SECOND_CH_ACK_OFFSET_400", + "RELAY_SECOND_CH_ACK_OFFSET_800", + "RELAY_SECOND_CH_ACK_OFFSET_1600", + "RELAY_SECOND_CH_ACK_OFFSET_3200" + ] + }, + "data_rate_index": { + "type": "string", + "default": "DATA_RATE_0", + "enum": [ + "DATA_RATE_0", + "DATA_RATE_1", + "DATA_RATE_2", + "DATA_RATE_3", + "DATA_RATE_4", + "DATA_RATE_5", + "DATA_RATE_6", + "DATA_RATE_7", + "DATA_RATE_8", + "DATA_RATE_9", + "DATA_RATE_10", + "DATA_RATE_11", + "DATA_RATE_12", + "DATA_RATE_13", + "DATA_RATE_14", + "DATA_RATE_15" + ] + }, + "frequency": { + "description": "The frequency (Hz) used by the wake on radio message.", + "type": "string", + "format": "uint64" + } + } + }, + "serving_device_id": { + "type": "string" + } + } + } + } + }, + "relay_notify_new_end_device_req": { + "type": "object", + "properties": { + "dev_addr": { + "type": "string", + "format": "string", + "example": "2600ABCD" + }, + "rssi": { + "type": "integer", + "format": "int32" + }, + "snr": { + "type": "integer", + "format": "int32" + } + } + }, + "relay_update_uplink_list_ans": { + "type": "object" + }, + "relay_update_uplink_list_req": { + "type": "object", + "properties": { + "dev_addr": { + "type": "string", + "format": "string", + "example": "2600ABCD" + }, + "device_id": { + "type": "string" + }, + "forward_limits": { + "type": "object", + "properties": { + "bucket_size": { + "type": "string", + "title": "- RELAY_LIMIT_BUCKET_SIZE_12: sic", + "default": "RELAY_LIMIT_BUCKET_SIZE_1", + "enum": [ + "RELAY_LIMIT_BUCKET_SIZE_1", + "RELAY_LIMIT_BUCKET_SIZE_2", + "RELAY_LIMIT_BUCKET_SIZE_4", + "RELAY_LIMIT_BUCKET_SIZE_12" + ] + }, + "reload_rate": { + "description": "The number of tokens which are replenished in the bucket every hour.", + "type": "integer", + "format": "int64" + } + } + }, + "root_wor_s_key": { + "type": "string", + "format": "string", + "example": "0123456789ABCDEF0123456789ABCDEF" + }, + "rule_index": { + "type": "integer", + "format": "int64" + }, + "session_key_id": { + "type": "string", + "format": "byte" + }, + "w_f_cnt": { + "type": "integer", + "format": "int64" + } + } + }, + "reset_conf": { + "type": "object", + "properties": { + "minor_version": { + "type": "string", + "default": "MINOR_RFU_0", + "enum": [ + "MINOR_RFU_0", + "MINOR_1", + "MINOR_RFU_2", + "MINOR_RFU_3", + "MINOR_RFU_4", + "MINOR_RFU_5", + "MINOR_RFU_6", + "MINOR_RFU_7", + "MINOR_RFU_8", + "MINOR_RFU_9", + "MINOR_RFU_10", + "MINOR_RFU_11", + "MINOR_RFU_12", + "MINOR_RFU_13", + "MINOR_RFU_14", + "MINOR_RFU_15" + ] + } + } + }, + "reset_ind": { + "type": "object", + "properties": { + "minor_version": { + "type": "string", + "default": "MINOR_RFU_0", + "enum": [ + "MINOR_RFU_0", + "MINOR_1", + "MINOR_RFU_2", + "MINOR_RFU_3", + "MINOR_RFU_4", + "MINOR_RFU_5", + "MINOR_RFU_6", + "MINOR_RFU_7", + "MINOR_RFU_8", + "MINOR_RFU_9", + "MINOR_RFU_10", + "MINOR_RFU_11", + "MINOR_RFU_12", + "MINOR_RFU_13", + "MINOR_RFU_14", + "MINOR_RFU_15" + ] + } + } + }, + "rx_param_setup_ans": { + "type": "object", + "properties": { + "rx1_data_rate_offset_ack": { + "type": "boolean" + }, + "rx2_data_rate_index_ack": { + "type": "boolean" + }, + "rx2_frequency_ack": { + "type": "boolean" + } + } + }, + "rx_param_setup_req": { + "type": "object", + "properties": { + "rx1_data_rate_offset": { + "type": "string", + "default": "DATA_RATE_OFFSET_0", + "enum": [ + "DATA_RATE_OFFSET_0", + "DATA_RATE_OFFSET_1", + "DATA_RATE_OFFSET_2", + "DATA_RATE_OFFSET_3", + "DATA_RATE_OFFSET_4", + "DATA_RATE_OFFSET_5", + "DATA_RATE_OFFSET_6", + "DATA_RATE_OFFSET_7" + ] + }, + "rx2_data_rate_index": { + "type": "string", + "default": "DATA_RATE_0", + "enum": [ + "DATA_RATE_0", + "DATA_RATE_1", + "DATA_RATE_2", + "DATA_RATE_3", + "DATA_RATE_4", + "DATA_RATE_5", + "DATA_RATE_6", + "DATA_RATE_7", + "DATA_RATE_8", + "DATA_RATE_9", + "DATA_RATE_10", + "DATA_RATE_11", + "DATA_RATE_12", + "DATA_RATE_13", + "DATA_RATE_14", + "DATA_RATE_15" + ] + }, + "rx2_frequency": { + "description": "Rx2 frequency (Hz).", + "type": "string", + "format": "uint64" + } + } + }, + "rx_timing_setup_req": { + "type": "object", + "properties": { + "delay": { + "description": " - RX_DELAY_0: 1 second.\n - RX_DELAY_1: 1 second.\n - RX_DELAY_2: 2 seconds.\n - RX_DELAY_3: 3 seconds.\n - RX_DELAY_4: 4 seconds.\n - RX_DELAY_5: 5 seconds.\n - RX_DELAY_6: 6 seconds.\n - RX_DELAY_7: 7 seconds.\n - RX_DELAY_8: 8 seconds.\n - RX_DELAY_9: 9 seconds.\n - RX_DELAY_10: 10 seconds.\n - RX_DELAY_11: 11 seconds.\n - RX_DELAY_12: 12 seconds.\n - RX_DELAY_13: 13 seconds.\n - RX_DELAY_14: 14 seconds.\n - RX_DELAY_15: 15 seconds.", + "type": "string", + "default": "RX_DELAY_0", + "enum": [ + "RX_DELAY_0", + "RX_DELAY_1", + "RX_DELAY_2", + "RX_DELAY_3", + "RX_DELAY_4", + "RX_DELAY_5", + "RX_DELAY_6", + "RX_DELAY_7", + "RX_DELAY_8", + "RX_DELAY_9", + "RX_DELAY_10", + "RX_DELAY_11", + "RX_DELAY_12", + "RX_DELAY_13", + "RX_DELAY_14", + "RX_DELAY_15" + ] + } + } + }, + "tx_param_setup_req": { + "type": "object", + "properties": { + "downlink_dwell_time": { + "type": "boolean" + }, + "max_eirp_index": { + "description": " - DEVICE_EIRP_8: 8 dBm.\n - DEVICE_EIRP_10: 10 dBm.\n - DEVICE_EIRP_12: 12 dBm.\n - DEVICE_EIRP_13: 13 dBm.\n - DEVICE_EIRP_14: 14 dBm.\n - DEVICE_EIRP_16: 16 dBm.\n - DEVICE_EIRP_18: 18 dBm.\n - DEVICE_EIRP_20: 20 dBm.\n - DEVICE_EIRP_21: 21 dBm.\n - DEVICE_EIRP_24: 24 dBm.\n - DEVICE_EIRP_26: 26 dBm.\n - DEVICE_EIRP_27: 27 dBm.\n - DEVICE_EIRP_29: 29 dBm.\n - DEVICE_EIRP_30: 30 dBm.\n - DEVICE_EIRP_33: 33 dBm.\n - DEVICE_EIRP_36: 36 dBm.", + "type": "string", + "default": "DEVICE_EIRP_8", + "enum": [ + "DEVICE_EIRP_8", + "DEVICE_EIRP_10", + "DEVICE_EIRP_12", + "DEVICE_EIRP_13", + "DEVICE_EIRP_14", + "DEVICE_EIRP_16", + "DEVICE_EIRP_18", + "DEVICE_EIRP_20", + "DEVICE_EIRP_21", + "DEVICE_EIRP_24", + "DEVICE_EIRP_26", + "DEVICE_EIRP_27", + "DEVICE_EIRP_29", + "DEVICE_EIRP_30", + "DEVICE_EIRP_33", + "DEVICE_EIRP_36" + ] + }, + "uplink_dwell_time": { + "type": "boolean" + } + } + } + } + } + }, + "ping_slot_periodicity": { + "type": "object", + "properties": { + "value": { + "description": " - PING_EVERY_1S: Every second.\n - PING_EVERY_2S: Every 2 seconds.\n - PING_EVERY_4S: Every 4 seconds.\n - PING_EVERY_8S: Every 8 seconds.\n - PING_EVERY_16S: Every 16 seconds.\n - PING_EVERY_32S: Every 32 seconds.\n - PING_EVERY_64S: Every 64 seconds.\n - PING_EVERY_128S: Every 128 seconds.", + "type": "string", + "default": "PING_EVERY_1S", + "enum": [ + "PING_EVERY_1S", + "PING_EVERY_2S", + "PING_EVERY_4S", + "PING_EVERY_8S", + "PING_EVERY_16S", + "PING_EVERY_32S", + "PING_EVERY_64S", + "PING_EVERY_128S" + ] + } + } + }, + "queued_join_accept": { + "type": "object", + "properties": { + "correlation_ids": { + "type": "array", + "items": { + "type": "string" + } + }, + "dev_addr": { + "type": "string", + "format": "string", + "example": "2600ABCD" + }, + "keys": { + "description": "Session keys for a LoRaWAN session.\nOnly the components for which the keys were meant, will have the key-encryption-key (KEK) to decrypt the individual keys.", + "type": "object", + "properties": { + "app_s_key": { + "type": "object", + "properties": { + "encrypted_key": { + "type": "string", + "format": "byte" + }, + "kek_label": { + "description": "The label of the RFC 3394 key-encryption-key (KEK) that was used to encrypt the key.", + "type": "string" + }, + "key": { + "description": "The unencrypted AES key.", + "type": "string", + "format": "string", + "example": "0123456789ABCDEF0123456789ABCDEF" + } + } + }, + "f_nwk_s_int_key": { + "type": "object", + "properties": { + "encrypted_key": { + "type": "string", + "format": "byte" + }, + "kek_label": { + "description": "The label of the RFC 3394 key-encryption-key (KEK) that was used to encrypt the key.", + "type": "string" + }, + "key": { + "description": "The unencrypted AES key.", + "type": "string", + "format": "string", + "example": "0123456789ABCDEF0123456789ABCDEF" + } + } + }, + "nwk_s_enc_key": { + "type": "object", + "properties": { + "encrypted_key": { + "type": "string", + "format": "byte" + }, + "kek_label": { + "description": "The label of the RFC 3394 key-encryption-key (KEK) that was used to encrypt the key.", + "type": "string" + }, + "key": { + "description": "The unencrypted AES key.", + "type": "string", + "format": "string", + "example": "0123456789ABCDEF0123456789ABCDEF" + } + } + }, + "s_nwk_s_int_key": { + "type": "object", + "properties": { + "encrypted_key": { + "type": "string", + "format": "byte" + }, + "kek_label": { + "description": "The label of the RFC 3394 key-encryption-key (KEK) that was used to encrypt the key.", + "type": "string" + }, + "key": { + "description": "The unencrypted AES key.", + "type": "string", + "format": "string", + "example": "0123456789ABCDEF0123456789ABCDEF" + } + } + }, + "session_key_id": { + "description": "Join Server issued identifier for the session keys.\nThis ID can be used to request the keys from the Join Server in case the are lost.", + "type": "string", + "format": "byte" + } + } + }, + "net_id": { + "type": "string", + "format": "string", + "example": "000013" + }, + "payload": { + "description": "Payload of the join-accept received from Join Server.", + "type": "string", + "format": "byte" + }, + "request": { + "type": "object", + "properties": { + "cf_list": { + "type": "object", + "properties": { + "ch_masks": { + "description": "ChMasks controlling the channels to be used.\nLength of this field must be equal to the amount of uplink channels\ndefined by the selected frequency plan.", + "type": "array", + "items": { + "type": "boolean" + } + }, + "freq": { + "description": "Frequencies to be broadcasted, in hecto-Hz.\nThese values are broadcasted as 24 bits unsigned integers.\nThis field should not contain default values.", + "type": "array", + "items": { + "type": "integer", + "format": "int64" + } + }, + "type": { + "type": "string", + "default": "FREQUENCIES", + "enum": [ + "FREQUENCIES", + "CHANNEL_MASKS" + ] + } + } + }, + "downlink_settings": { + "type": "object", + "properties": { + "opt_neg": { + "description": "OptNeg is set if Network Server implements LoRaWAN 1.1 or greater.", + "type": "boolean" + }, + "rx1_dr_offset": { + "type": "string", + "default": "DATA_RATE_OFFSET_0", + "enum": [ + "DATA_RATE_OFFSET_0", + "DATA_RATE_OFFSET_1", + "DATA_RATE_OFFSET_2", + "DATA_RATE_OFFSET_3", + "DATA_RATE_OFFSET_4", + "DATA_RATE_OFFSET_5", + "DATA_RATE_OFFSET_6", + "DATA_RATE_OFFSET_7" + ] + }, + "rx2_dr": { + "type": "string", + "default": "DATA_RATE_0", + "enum": [ + "DATA_RATE_0", + "DATA_RATE_1", + "DATA_RATE_2", + "DATA_RATE_3", + "DATA_RATE_4", + "DATA_RATE_5", + "DATA_RATE_6", + "DATA_RATE_7", + "DATA_RATE_8", + "DATA_RATE_9", + "DATA_RATE_10", + "DATA_RATE_11", + "DATA_RATE_12", + "DATA_RATE_13", + "DATA_RATE_14", + "DATA_RATE_15" + ] + } + } + }, + "rx_delay": { + "description": " - RX_DELAY_0: 1 second.\n - RX_DELAY_1: 1 second.\n - RX_DELAY_2: 2 seconds.\n - RX_DELAY_3: 3 seconds.\n - RX_DELAY_4: 4 seconds.\n - RX_DELAY_5: 5 seconds.\n - RX_DELAY_6: 6 seconds.\n - RX_DELAY_7: 7 seconds.\n - RX_DELAY_8: 8 seconds.\n - RX_DELAY_9: 9 seconds.\n - RX_DELAY_10: 10 seconds.\n - RX_DELAY_11: 11 seconds.\n - RX_DELAY_12: 12 seconds.\n - RX_DELAY_13: 13 seconds.\n - RX_DELAY_14: 14 seconds.\n - RX_DELAY_15: 15 seconds.", + "type": "string", + "default": "RX_DELAY_0", + "enum": [ + "RX_DELAY_0", + "RX_DELAY_1", + "RX_DELAY_2", + "RX_DELAY_3", + "RX_DELAY_4", + "RX_DELAY_5", + "RX_DELAY_6", + "RX_DELAY_7", + "RX_DELAY_8", + "RX_DELAY_9", + "RX_DELAY_10", + "RX_DELAY_11", + "RX_DELAY_12", + "RX_DELAY_13", + "RX_DELAY_14", + "RX_DELAY_15" + ] + } + } + } + } + }, + "queued_responses": { + "description": "Queued MAC responses.\nRegenerated on each uplink.", + "type": "array", + "items": { + "type": "object", + "properties": { + "adr_param_setup_req": { + "type": "object", + "properties": { + "adr_ack_delay_exponent": { + "type": "string", + "default": "ADR_ACK_DELAY_1", + "enum": [ + "ADR_ACK_DELAY_1", + "ADR_ACK_DELAY_2", + "ADR_ACK_DELAY_4", + "ADR_ACK_DELAY_8", + "ADR_ACK_DELAY_16", + "ADR_ACK_DELAY_32", + "ADR_ACK_DELAY_64", + "ADR_ACK_DELAY_128", + "ADR_ACK_DELAY_256", + "ADR_ACK_DELAY_512", + "ADR_ACK_DELAY_1024", + "ADR_ACK_DELAY_2048", + "ADR_ACK_DELAY_4096", + "ADR_ACK_DELAY_8192", + "ADR_ACK_DELAY_16384", + "ADR_ACK_DELAY_32768" + ] + }, + "adr_ack_limit_exponent": { + "type": "string", + "default": "ADR_ACK_LIMIT_1", + "enum": [ + "ADR_ACK_LIMIT_1", + "ADR_ACK_LIMIT_2", + "ADR_ACK_LIMIT_4", + "ADR_ACK_LIMIT_8", + "ADR_ACK_LIMIT_16", + "ADR_ACK_LIMIT_32", + "ADR_ACK_LIMIT_64", + "ADR_ACK_LIMIT_128", + "ADR_ACK_LIMIT_256", + "ADR_ACK_LIMIT_512", + "ADR_ACK_LIMIT_1024", + "ADR_ACK_LIMIT_2048", + "ADR_ACK_LIMIT_4096", + "ADR_ACK_LIMIT_8192", + "ADR_ACK_LIMIT_16384", + "ADR_ACK_LIMIT_32768" + ] + } + } + }, + "beacon_freq_ans": { + "type": "object", + "properties": { + "frequency_ack": { + "type": "boolean" + } + } + }, + "beacon_freq_req": { + "type": "object", + "properties": { + "frequency": { + "description": "Frequency of the Class B beacons (Hz).", + "type": "string", + "format": "uint64" + } + } + }, + "beacon_timing_ans": { + "type": "object", + "properties": { + "channel_index": { + "type": "integer", + "format": "int64" + }, + "delay": { + "description": "(uint16) See LoRaWAN specification.", + "type": "integer", + "format": "int64" + } + } + }, + "cid": { + "type": "string", + "title": "- CID_BEACON_TIMING: Deprecated", + "default": "CID_RFU_0", + "enum": [ + "CID_RFU_0", + "CID_RESET", + "CID_LINK_CHECK", + "CID_LINK_ADR", + "CID_DUTY_CYCLE", + "CID_RX_PARAM_SETUP", + "CID_DEV_STATUS", + "CID_NEW_CHANNEL", + "CID_RX_TIMING_SETUP", + "CID_TX_PARAM_SETUP", + "CID_DL_CHANNEL", + "CID_REKEY", + "CID_ADR_PARAM_SETUP", + "CID_DEVICE_TIME", + "CID_FORCE_REJOIN", + "CID_REJOIN_PARAM_SETUP", + "CID_PING_SLOT_INFO", + "CID_PING_SLOT_CHANNEL", + "CID_BEACON_TIMING", + "CID_BEACON_FREQ", + "CID_DEVICE_MODE", + "CID_RELAY_CONF", + "CID_RELAY_END_DEVICE_CONF", + "CID_RELAY_FILTER_LIST", + "CID_RELAY_UPDATE_UPLINK_LIST", + "CID_RELAY_CTRL_UPLINK_LIST", + "CID_RELAY_CONFIGURE_FWD_LIMIT", + "CID_RELAY_NOTIFY_NEW_END_DEVICE" + ] + }, + "dev_status_ans": { + "type": "object", + "properties": { + "battery": { + "description": "Device battery status.\n0 indicates that the device is connected to an external power source.\n1..254 indicates a battery level.\n255 indicates that the device was not able to measure the battery level.", + "type": "integer", + "format": "int64" + }, + "margin": { + "description": "SNR of the last downlink (dB; [-32, +31]).", + "type": "integer", + "format": "int32" + } + } + }, + "device_mode_conf": { + "type": "object", + "properties": { + "class": { + "type": "string", + "default": "CLASS_A", + "enum": [ + "CLASS_A", + "CLASS_B", + "CLASS_C" + ] + } + } + }, + "device_mode_ind": { + "type": "object", + "properties": { + "class": { + "type": "string", + "default": "CLASS_A", + "enum": [ + "CLASS_A", + "CLASS_B", + "CLASS_C" + ] + } + } + }, + "device_time_ans": { + "type": "object", + "properties": { + "time": { + "type": "string", + "format": "date-time" + } + } + }, + "dl_channel_ans": { + "type": "object", + "properties": { + "channel_index_ack": { + "type": "boolean" + }, + "frequency_ack": { + "type": "boolean" + } + } + }, + "dl_channel_req": { + "type": "object", + "properties": { + "channel_index": { + "type": "integer", + "format": "int64" + }, + "frequency": { + "description": "Downlink channel frequency (Hz).", + "type": "string", + "format": "uint64" + } + } + }, + "duty_cycle_req": { + "type": "object", + "properties": { + "max_duty_cycle": { + "description": " - DUTY_CYCLE_1: 100%.\n - DUTY_CYCLE_2: 50%.\n - DUTY_CYCLE_4: 25%.\n - DUTY_CYCLE_8: 12.5%.\n - DUTY_CYCLE_16: 6.25%.\n - DUTY_CYCLE_32: 3.125%.\n - DUTY_CYCLE_64: 1.5625%.\n - DUTY_CYCLE_128: Roughly 0.781%.\n - DUTY_CYCLE_256: Roughly 0.390%.\n - DUTY_CYCLE_512: Roughly 0.195%.\n - DUTY_CYCLE_1024: Roughly 0.098%.\n - DUTY_CYCLE_2048: Roughly 0.049%.\n - DUTY_CYCLE_4096: Roughly 0.024%.\n - DUTY_CYCLE_8192: Roughly 0.012%.\n - DUTY_CYCLE_16384: Roughly 0.006%.\n - DUTY_CYCLE_32768: Roughly 0.003%.", + "type": "string", + "default": "DUTY_CYCLE_1", + "enum": [ + "DUTY_CYCLE_1", + "DUTY_CYCLE_2", + "DUTY_CYCLE_4", + "DUTY_CYCLE_8", + "DUTY_CYCLE_16", + "DUTY_CYCLE_32", + "DUTY_CYCLE_64", + "DUTY_CYCLE_128", + "DUTY_CYCLE_256", + "DUTY_CYCLE_512", + "DUTY_CYCLE_1024", + "DUTY_CYCLE_2048", + "DUTY_CYCLE_4096", + "DUTY_CYCLE_8192", + "DUTY_CYCLE_16384", + "DUTY_CYCLE_32768" + ] + } + } + }, + "force_rejoin_req": { + "type": "object", + "properties": { + "data_rate_index": { + "type": "string", + "default": "DATA_RATE_0", + "enum": [ + "DATA_RATE_0", + "DATA_RATE_1", + "DATA_RATE_2", + "DATA_RATE_3", + "DATA_RATE_4", + "DATA_RATE_5", + "DATA_RATE_6", + "DATA_RATE_7", + "DATA_RATE_8", + "DATA_RATE_9", + "DATA_RATE_10", + "DATA_RATE_11", + "DATA_RATE_12", + "DATA_RATE_13", + "DATA_RATE_14", + "DATA_RATE_15" + ] + }, + "max_retries": { + "type": "integer", + "format": "int64" + }, + "period_exponent": { + "description": " - REJOIN_PERIOD_0: Every 32 to 64 seconds.\n - REJOIN_PERIOD_1: Every 64 to 96 seconds.\n - REJOIN_PERIOD_2: Every 128 to 160 seconds.\n - REJOIN_PERIOD_3: Every 256 to 288 seconds.\n - REJOIN_PERIOD_4: Every 512 to 544 seconds.\n - REJOIN_PERIOD_5: Every 1024 to 1056 seconds.\n - REJOIN_PERIOD_6: Every 2048 to 2080 seconds.\n - REJOIN_PERIOD_7: Every 4096 to 4128 seconds.", + "type": "string", + "default": "REJOIN_PERIOD_0", + "enum": [ + "REJOIN_PERIOD_0", + "REJOIN_PERIOD_1", + "REJOIN_PERIOD_2", + "REJOIN_PERIOD_3", + "REJOIN_PERIOD_4", + "REJOIN_PERIOD_5", + "REJOIN_PERIOD_6", + "REJOIN_PERIOD_7" + ] + }, + "rejoin_type": { + "description": " - CONTEXT: Resets DevAddr, Session Keys, Frame Counters, Radio Parameters.\n - SESSION: Equivalent to the initial JoinRequest.\n - KEYS: Resets DevAddr, Session Keys, Frame Counters, while keeping the Radio Parameters.", + "type": "string", + "default": "CONTEXT", + "enum": [ + "CONTEXT", + "SESSION", + "KEYS" + ] + } + } + }, + "link_adr_ans": { + "type": "object", + "properties": { + "channel_mask_ack": { + "type": "boolean" + }, + "data_rate_index_ack": { + "type": "boolean" + }, + "tx_power_index_ack": { + "type": "boolean" + } + } + }, + "link_adr_req": { + "type": "object", + "properties": { + "channel_mask": { + "type": "array", + "items": { + "type": "boolean" + } + }, + "channel_mask_control": { + "type": "integer", + "format": "int64" + }, + "data_rate_index": { + "type": "string", + "default": "DATA_RATE_0", + "enum": [ + "DATA_RATE_0", + "DATA_RATE_1", + "DATA_RATE_2", + "DATA_RATE_3", + "DATA_RATE_4", + "DATA_RATE_5", + "DATA_RATE_6", + "DATA_RATE_7", + "DATA_RATE_8", + "DATA_RATE_9", + "DATA_RATE_10", + "DATA_RATE_11", + "DATA_RATE_12", + "DATA_RATE_13", + "DATA_RATE_14", + "DATA_RATE_15" + ] + }, + "nb_trans": { + "type": "integer", + "format": "int64" + }, + "tx_power_index": { + "type": "integer", + "format": "int64" + } + } + }, + "link_check_ans": { + "type": "object", + "properties": { + "gateway_count": { + "type": "integer", + "format": "int64" + }, + "margin": { + "description": "Indicates the link margin in dB of the received LinkCheckReq, relative to the demodulation floor.", + "type": "integer", + "format": "int64" + } + } + }, + "new_channel_ans": { + "type": "object", + "properties": { + "data_rate_ack": { + "type": "boolean" + }, + "frequency_ack": { + "type": "boolean" + } + } + }, + "new_channel_req": { + "type": "object", + "properties": { + "channel_index": { + "type": "integer", + "format": "int64" + }, + "frequency": { + "description": "Channel frequency (Hz).", + "type": "string", + "format": "uint64" + }, + "max_data_rate_index": { + "type": "string", + "default": "DATA_RATE_0", + "enum": [ + "DATA_RATE_0", + "DATA_RATE_1", + "DATA_RATE_2", + "DATA_RATE_3", + "DATA_RATE_4", + "DATA_RATE_5", + "DATA_RATE_6", + "DATA_RATE_7", + "DATA_RATE_8", + "DATA_RATE_9", + "DATA_RATE_10", + "DATA_RATE_11", + "DATA_RATE_12", + "DATA_RATE_13", + "DATA_RATE_14", + "DATA_RATE_15" + ] + }, + "min_data_rate_index": { + "type": "string", + "default": "DATA_RATE_0", + "enum": [ + "DATA_RATE_0", + "DATA_RATE_1", + "DATA_RATE_2", + "DATA_RATE_3", + "DATA_RATE_4", + "DATA_RATE_5", + "DATA_RATE_6", + "DATA_RATE_7", + "DATA_RATE_8", + "DATA_RATE_9", + "DATA_RATE_10", + "DATA_RATE_11", + "DATA_RATE_12", + "DATA_RATE_13", + "DATA_RATE_14", + "DATA_RATE_15" + ] + } + } + }, + "ping_slot_channel_ans": { + "type": "object", + "properties": { + "data_rate_index_ack": { + "type": "boolean" + }, + "frequency_ack": { + "type": "boolean" + } + } + }, + "ping_slot_channel_req": { + "type": "object", + "properties": { + "data_rate_index": { + "type": "string", + "default": "DATA_RATE_0", + "enum": [ + "DATA_RATE_0", + "DATA_RATE_1", + "DATA_RATE_2", + "DATA_RATE_3", + "DATA_RATE_4", + "DATA_RATE_5", + "DATA_RATE_6", + "DATA_RATE_7", + "DATA_RATE_8", + "DATA_RATE_9", + "DATA_RATE_10", + "DATA_RATE_11", + "DATA_RATE_12", + "DATA_RATE_13", + "DATA_RATE_14", + "DATA_RATE_15" + ] + }, + "frequency": { + "description": "Ping slot channel frequency (Hz).", + "type": "string", + "format": "uint64" + } + } + }, + "ping_slot_info_req": { + "type": "object", + "properties": { + "period": { + "description": " - PING_EVERY_1S: Every second.\n - PING_EVERY_2S: Every 2 seconds.\n - PING_EVERY_4S: Every 4 seconds.\n - PING_EVERY_8S: Every 8 seconds.\n - PING_EVERY_16S: Every 16 seconds.\n - PING_EVERY_32S: Every 32 seconds.\n - PING_EVERY_64S: Every 64 seconds.\n - PING_EVERY_128S: Every 128 seconds.", + "type": "string", + "default": "PING_EVERY_1S", + "enum": [ + "PING_EVERY_1S", + "PING_EVERY_2S", + "PING_EVERY_4S", + "PING_EVERY_8S", + "PING_EVERY_16S", + "PING_EVERY_32S", + "PING_EVERY_64S", + "PING_EVERY_128S" + ] + } + } + }, + "raw_payload": { + "type": "string", + "format": "byte" + }, + "rejoin_param_setup_ans": { + "type": "object", + "properties": { + "max_time_exponent_ack": { + "type": "boolean" + } + } + }, + "rejoin_param_setup_req": { + "type": "object", + "properties": { + "max_count_exponent": { + "type": "string", + "default": "REJOIN_COUNT_16", + "enum": [ + "REJOIN_COUNT_16", + "REJOIN_COUNT_32", + "REJOIN_COUNT_64", + "REJOIN_COUNT_128", + "REJOIN_COUNT_256", + "REJOIN_COUNT_512", + "REJOIN_COUNT_1024", + "REJOIN_COUNT_2048", + "REJOIN_COUNT_4096", + "REJOIN_COUNT_8192", + "REJOIN_COUNT_16384", + "REJOIN_COUNT_32768", + "REJOIN_COUNT_65536", + "REJOIN_COUNT_131072", + "REJOIN_COUNT_262144", + "REJOIN_COUNT_524288" + ] + }, + "max_time_exponent": { + "description": " - REJOIN_TIME_0: Every ~17.1 minutes.\n - REJOIN_TIME_1: Every ~34.1 minutes.\n - REJOIN_TIME_2: Every ~1.1 hours.\n - REJOIN_TIME_3: Every ~2.3 hours.\n - REJOIN_TIME_4: Every ~4.6 hours.\n - REJOIN_TIME_5: Every ~9.1 hours.\n - REJOIN_TIME_6: Every ~18.2 hours.\n - REJOIN_TIME_7: Every ~1.5 days.\n - REJOIN_TIME_8: Every ~3.0 days.\n - REJOIN_TIME_9: Every ~6.1 days.\n - REJOIN_TIME_10: Every ~12.1 days.\n - REJOIN_TIME_11: Every ~3.5 weeks.\n - REJOIN_TIME_12: Every ~1.6 months.\n - REJOIN_TIME_13: Every ~3.2 months.\n - REJOIN_TIME_14: Every ~6.4 months.\n - REJOIN_TIME_15: Every ~1.1 year.", + "type": "string", + "default": "REJOIN_TIME_0", + "enum": [ + "REJOIN_TIME_0", + "REJOIN_TIME_1", + "REJOIN_TIME_2", + "REJOIN_TIME_3", + "REJOIN_TIME_4", + "REJOIN_TIME_5", + "REJOIN_TIME_6", + "REJOIN_TIME_7", + "REJOIN_TIME_8", + "REJOIN_TIME_9", + "REJOIN_TIME_10", + "REJOIN_TIME_11", + "REJOIN_TIME_12", + "REJOIN_TIME_13", + "REJOIN_TIME_14", + "REJOIN_TIME_15" + ] + } + } + }, + "rekey_conf": { + "type": "object", + "properties": { + "minor_version": { + "type": "string", + "default": "MINOR_RFU_0", + "enum": [ + "MINOR_RFU_0", + "MINOR_1", + "MINOR_RFU_2", + "MINOR_RFU_3", + "MINOR_RFU_4", + "MINOR_RFU_5", + "MINOR_RFU_6", + "MINOR_RFU_7", + "MINOR_RFU_8", + "MINOR_RFU_9", + "MINOR_RFU_10", + "MINOR_RFU_11", + "MINOR_RFU_12", + "MINOR_RFU_13", + "MINOR_RFU_14", + "MINOR_RFU_15" + ] + } + } + }, + "rekey_ind": { + "type": "object", + "properties": { + "minor_version": { + "type": "string", + "default": "MINOR_RFU_0", + "enum": [ + "MINOR_RFU_0", + "MINOR_1", + "MINOR_RFU_2", + "MINOR_RFU_3", + "MINOR_RFU_4", + "MINOR_RFU_5", + "MINOR_RFU_6", + "MINOR_RFU_7", + "MINOR_RFU_8", + "MINOR_RFU_9", + "MINOR_RFU_10", + "MINOR_RFU_11", + "MINOR_RFU_12", + "MINOR_RFU_13", + "MINOR_RFU_14", + "MINOR_RFU_15" + ] + } + } + }, + "relay_conf_ans": { + "type": "object", + "properties": { + "cad_periodicity_ack": { + "type": "boolean" + }, + "default_channel_index_ack": { + "type": "boolean" + }, + "second_channel_ack_offset_ack": { + "type": "boolean" + }, + "second_channel_data_rate_index_ack": { + "type": "boolean" + }, + "second_channel_frequency_ack": { + "type": "boolean" + }, + "second_channel_index_ack": { + "type": "boolean" + } + } + }, + "relay_conf_req": { + "type": "object", + "properties": { + "configuration": { + "type": "object", + "properties": { + "cad_periodicity": { + "type": "string", + "title": "- RELAY_CAD_PERIODICITY_20_MILLISECONDS: sic", + "default": "RELAY_CAD_PERIODICITY_1_SECOND", + "enum": [ + "RELAY_CAD_PERIODICITY_1_SECOND", + "RELAY_CAD_PERIODICITY_500_MILLISECONDS", + "RELAY_CAD_PERIODICITY_250_MILLISECONDS", + "RELAY_CAD_PERIODICITY_100_MILLISECONDS", + "RELAY_CAD_PERIODICITY_50_MILLISECONDS", + "RELAY_CAD_PERIODICITY_20_MILLISECONDS" + ] + }, + "default_channel_index": { + "type": "integer", + "format": "int64" + }, + "second_channel": { + "type": "object", + "properties": { + "ack_offset": { + "type": "string", + "title": "- RELAY_SECOND_CH_ACK_OFFSET_0: 0 kHz\n - RELAY_SECOND_CH_ACK_OFFSET_200: 200 kHz\n - RELAY_SECOND_CH_ACK_OFFSET_400: 400 kHz\n - RELAY_SECOND_CH_ACK_OFFSET_800: 800 kHz\n - RELAY_SECOND_CH_ACK_OFFSET_1600: 1.6 MHz\n - RELAY_SECOND_CH_ACK_OFFSET_3200: 3.2 MHz", + "default": "RELAY_SECOND_CH_ACK_OFFSET_0", + "enum": [ + "RELAY_SECOND_CH_ACK_OFFSET_0", + "RELAY_SECOND_CH_ACK_OFFSET_200", + "RELAY_SECOND_CH_ACK_OFFSET_400", + "RELAY_SECOND_CH_ACK_OFFSET_800", + "RELAY_SECOND_CH_ACK_OFFSET_1600", + "RELAY_SECOND_CH_ACK_OFFSET_3200" + ] + }, + "data_rate_index": { + "type": "string", + "default": "DATA_RATE_0", + "enum": [ + "DATA_RATE_0", + "DATA_RATE_1", + "DATA_RATE_2", + "DATA_RATE_3", + "DATA_RATE_4", + "DATA_RATE_5", + "DATA_RATE_6", + "DATA_RATE_7", + "DATA_RATE_8", + "DATA_RATE_9", + "DATA_RATE_10", + "DATA_RATE_11", + "DATA_RATE_12", + "DATA_RATE_13", + "DATA_RATE_14", + "DATA_RATE_15" + ] + }, + "frequency": { + "description": "The frequency (Hz) used by the wake on radio message.", + "type": "string", + "format": "uint64" + } + } + } + } + } + } + }, + "relay_configure_fwd_limit_ans": { + "type": "object" + }, + "relay_configure_fwd_limit_req": { + "type": "object", + "properties": { + "global_uplink_limits": { + "type": "object", + "properties": { + "bucket_size": { + "type": "string", + "title": "- RELAY_LIMIT_BUCKET_SIZE_12: sic", + "default": "RELAY_LIMIT_BUCKET_SIZE_1", + "enum": [ + "RELAY_LIMIT_BUCKET_SIZE_1", + "RELAY_LIMIT_BUCKET_SIZE_2", + "RELAY_LIMIT_BUCKET_SIZE_4", + "RELAY_LIMIT_BUCKET_SIZE_12" + ] + }, + "reload_rate": { + "description": "The number of tokens which are replenished in the bucket every hour.", + "type": "integer", + "format": "int64" + } + } + }, + "join_request_limits": { + "type": "object", + "properties": { + "bucket_size": { + "type": "string", + "title": "- RELAY_LIMIT_BUCKET_SIZE_12: sic", + "default": "RELAY_LIMIT_BUCKET_SIZE_1", + "enum": [ + "RELAY_LIMIT_BUCKET_SIZE_1", + "RELAY_LIMIT_BUCKET_SIZE_2", + "RELAY_LIMIT_BUCKET_SIZE_4", + "RELAY_LIMIT_BUCKET_SIZE_12" + ] + }, + "reload_rate": { + "description": "The number of tokens which are replenished in the bucket every hour.", + "type": "integer", + "format": "int64" + } + } + }, + "notify_limits": { + "type": "object", + "properties": { + "bucket_size": { + "type": "string", + "title": "- RELAY_LIMIT_BUCKET_SIZE_12: sic", + "default": "RELAY_LIMIT_BUCKET_SIZE_1", + "enum": [ + "RELAY_LIMIT_BUCKET_SIZE_1", + "RELAY_LIMIT_BUCKET_SIZE_2", + "RELAY_LIMIT_BUCKET_SIZE_4", + "RELAY_LIMIT_BUCKET_SIZE_12" + ] + }, + "reload_rate": { + "description": "The number of tokens which are replenished in the bucket every hour.", + "type": "integer", + "format": "int64" + } + } + }, + "overall_limits": { + "type": "object", + "properties": { + "bucket_size": { + "type": "string", + "title": "- RELAY_LIMIT_BUCKET_SIZE_12: sic", + "default": "RELAY_LIMIT_BUCKET_SIZE_1", + "enum": [ + "RELAY_LIMIT_BUCKET_SIZE_1", + "RELAY_LIMIT_BUCKET_SIZE_2", + "RELAY_LIMIT_BUCKET_SIZE_4", + "RELAY_LIMIT_BUCKET_SIZE_12" + ] + }, + "reload_rate": { + "description": "The number of tokens which are replenished in the bucket every hour.", + "type": "integer", + "format": "int64" + } + } + }, + "reset_limit_counter": { + "type": "string", + "default": "RELAY_RESET_LIMIT_COUNTER_ZERO", + "enum": [ + "RELAY_RESET_LIMIT_COUNTER_ZERO", + "RELAY_RESET_LIMIT_COUNTER_RELOAD_RATE", + "RELAY_RESET_LIMIT_COUNTER_MAX_VALUE", + "RELAY_RESET_LIMIT_COUNTER_NO_RESET" + ] + } + } + }, + "relay_ctrl_uplink_list_ans": { + "type": "object", + "properties": { + "rule_index_ack": { + "type": "boolean" + }, + "w_f_cnt": { + "type": "integer", + "format": "int64" + } + } + }, + "relay_ctrl_uplink_list_req": { + "type": "object", + "properties": { + "action": { + "type": "string", + "default": "RELAY_CTRL_UPLINK_LIST_ACTION_READ_W_F_CNT", + "enum": [ + "RELAY_CTRL_UPLINK_LIST_ACTION_READ_W_F_CNT", + "RELAY_CTRL_UPLINK_LIST_ACTION_REMOVE_TRUSTED_END_DEVICE" + ] + }, + "rule_index": { + "type": "integer", + "format": "int64" + } + } + }, + "relay_end_device_conf_ans": { + "type": "object", + "properties": { + "backoff_ack": { + "type": "boolean" + }, + "second_channel_data_rate_index_ack": { + "type": "boolean" + }, + "second_channel_frequency_ack": { + "type": "boolean" + }, + "second_channel_index_ack": { + "type": "boolean" + } + } + }, + "relay_end_device_conf_req": { + "type": "object", + "properties": { + "configuration": { + "type": "object", + "properties": { + "always": { + "type": "object" + }, + "backoff": { + "type": "integer", + "format": "int64" + }, + "dynamic": { + "type": "object", + "properties": { + "smart_enable_level": { + "type": "string", + "default": "RELAY_SMART_ENABLE_LEVEL_8", + "enum": [ + "RELAY_SMART_ENABLE_LEVEL_8", + "RELAY_SMART_ENABLE_LEVEL_16", + "RELAY_SMART_ENABLE_LEVEL_32", + "RELAY_SMART_ENABLE_LEVEL_64" + ] + } + } + }, + "end_device_controlled": { + "type": "object" + }, + "second_channel": { + "type": "object", + "properties": { + "ack_offset": { + "type": "string", + "title": "- RELAY_SECOND_CH_ACK_OFFSET_0: 0 kHz\n - RELAY_SECOND_CH_ACK_OFFSET_200: 200 kHz\n - RELAY_SECOND_CH_ACK_OFFSET_400: 400 kHz\n - RELAY_SECOND_CH_ACK_OFFSET_800: 800 kHz\n - RELAY_SECOND_CH_ACK_OFFSET_1600: 1.6 MHz\n - RELAY_SECOND_CH_ACK_OFFSET_3200: 3.2 MHz", + "default": "RELAY_SECOND_CH_ACK_OFFSET_0", + "enum": [ + "RELAY_SECOND_CH_ACK_OFFSET_0", + "RELAY_SECOND_CH_ACK_OFFSET_200", + "RELAY_SECOND_CH_ACK_OFFSET_400", + "RELAY_SECOND_CH_ACK_OFFSET_800", + "RELAY_SECOND_CH_ACK_OFFSET_1600", + "RELAY_SECOND_CH_ACK_OFFSET_3200" + ] + }, + "data_rate_index": { + "type": "string", + "default": "DATA_RATE_0", + "enum": [ + "DATA_RATE_0", + "DATA_RATE_1", + "DATA_RATE_2", + "DATA_RATE_3", + "DATA_RATE_4", + "DATA_RATE_5", + "DATA_RATE_6", + "DATA_RATE_7", + "DATA_RATE_8", + "DATA_RATE_9", + "DATA_RATE_10", + "DATA_RATE_11", + "DATA_RATE_12", + "DATA_RATE_13", + "DATA_RATE_14", + "DATA_RATE_15" + ] + }, + "frequency": { + "description": "The frequency (Hz) used by the wake on radio message.", + "type": "string", + "format": "uint64" + } + } + }, + "serving_device_id": { + "type": "string" + } + } + } + } + }, + "relay_notify_new_end_device_req": { + "type": "object", + "properties": { + "dev_addr": { + "type": "string", + "format": "string", + "example": "2600ABCD" + }, + "rssi": { + "type": "integer", + "format": "int32" + }, + "snr": { + "type": "integer", + "format": "int32" + } + } + }, + "relay_update_uplink_list_ans": { + "type": "object" + }, + "relay_update_uplink_list_req": { + "type": "object", + "properties": { + "dev_addr": { + "type": "string", + "format": "string", + "example": "2600ABCD" + }, + "device_id": { + "type": "string" + }, + "forward_limits": { + "type": "object", + "properties": { + "bucket_size": { + "type": "string", + "title": "- RELAY_LIMIT_BUCKET_SIZE_12: sic", + "default": "RELAY_LIMIT_BUCKET_SIZE_1", + "enum": [ + "RELAY_LIMIT_BUCKET_SIZE_1", + "RELAY_LIMIT_BUCKET_SIZE_2", + "RELAY_LIMIT_BUCKET_SIZE_4", + "RELAY_LIMIT_BUCKET_SIZE_12" + ] + }, + "reload_rate": { + "description": "The number of tokens which are replenished in the bucket every hour.", + "type": "integer", + "format": "int64" + } + } + }, + "root_wor_s_key": { + "type": "string", + "format": "string", + "example": "0123456789ABCDEF0123456789ABCDEF" + }, + "rule_index": { + "type": "integer", + "format": "int64" + }, + "session_key_id": { + "type": "string", + "format": "byte" + }, + "w_f_cnt": { + "type": "integer", + "format": "int64" + } + } + }, + "reset_conf": { + "type": "object", + "properties": { + "minor_version": { + "type": "string", + "default": "MINOR_RFU_0", + "enum": [ + "MINOR_RFU_0", + "MINOR_1", + "MINOR_RFU_2", + "MINOR_RFU_3", + "MINOR_RFU_4", + "MINOR_RFU_5", + "MINOR_RFU_6", + "MINOR_RFU_7", + "MINOR_RFU_8", + "MINOR_RFU_9", + "MINOR_RFU_10", + "MINOR_RFU_11", + "MINOR_RFU_12", + "MINOR_RFU_13", + "MINOR_RFU_14", + "MINOR_RFU_15" + ] + } + } + }, + "reset_ind": { + "type": "object", + "properties": { + "minor_version": { + "type": "string", + "default": "MINOR_RFU_0", + "enum": [ + "MINOR_RFU_0", + "MINOR_1", + "MINOR_RFU_2", + "MINOR_RFU_3", + "MINOR_RFU_4", + "MINOR_RFU_5", + "MINOR_RFU_6", + "MINOR_RFU_7", + "MINOR_RFU_8", + "MINOR_RFU_9", + "MINOR_RFU_10", + "MINOR_RFU_11", + "MINOR_RFU_12", + "MINOR_RFU_13", + "MINOR_RFU_14", + "MINOR_RFU_15" + ] + } + } + }, + "rx_param_setup_ans": { + "type": "object", + "properties": { + "rx1_data_rate_offset_ack": { + "type": "boolean" + }, + "rx2_data_rate_index_ack": { + "type": "boolean" + }, + "rx2_frequency_ack": { + "type": "boolean" + } + } + }, + "rx_param_setup_req": { + "type": "object", + "properties": { + "rx1_data_rate_offset": { + "type": "string", + "default": "DATA_RATE_OFFSET_0", + "enum": [ + "DATA_RATE_OFFSET_0", + "DATA_RATE_OFFSET_1", + "DATA_RATE_OFFSET_2", + "DATA_RATE_OFFSET_3", + "DATA_RATE_OFFSET_4", + "DATA_RATE_OFFSET_5", + "DATA_RATE_OFFSET_6", + "DATA_RATE_OFFSET_7" + ] + }, + "rx2_data_rate_index": { + "type": "string", + "default": "DATA_RATE_0", + "enum": [ + "DATA_RATE_0", + "DATA_RATE_1", + "DATA_RATE_2", + "DATA_RATE_3", + "DATA_RATE_4", + "DATA_RATE_5", + "DATA_RATE_6", + "DATA_RATE_7", + "DATA_RATE_8", + "DATA_RATE_9", + "DATA_RATE_10", + "DATA_RATE_11", + "DATA_RATE_12", + "DATA_RATE_13", + "DATA_RATE_14", + "DATA_RATE_15" + ] + }, + "rx2_frequency": { + "description": "Rx2 frequency (Hz).", + "type": "string", + "format": "uint64" + } + } + }, + "rx_timing_setup_req": { + "type": "object", + "properties": { + "delay": { + "description": " - RX_DELAY_0: 1 second.\n - RX_DELAY_1: 1 second.\n - RX_DELAY_2: 2 seconds.\n - RX_DELAY_3: 3 seconds.\n - RX_DELAY_4: 4 seconds.\n - RX_DELAY_5: 5 seconds.\n - RX_DELAY_6: 6 seconds.\n - RX_DELAY_7: 7 seconds.\n - RX_DELAY_8: 8 seconds.\n - RX_DELAY_9: 9 seconds.\n - RX_DELAY_10: 10 seconds.\n - RX_DELAY_11: 11 seconds.\n - RX_DELAY_12: 12 seconds.\n - RX_DELAY_13: 13 seconds.\n - RX_DELAY_14: 14 seconds.\n - RX_DELAY_15: 15 seconds.", + "type": "string", + "default": "RX_DELAY_0", + "enum": [ + "RX_DELAY_0", + "RX_DELAY_1", + "RX_DELAY_2", + "RX_DELAY_3", + "RX_DELAY_4", + "RX_DELAY_5", + "RX_DELAY_6", + "RX_DELAY_7", + "RX_DELAY_8", + "RX_DELAY_9", + "RX_DELAY_10", + "RX_DELAY_11", + "RX_DELAY_12", + "RX_DELAY_13", + "RX_DELAY_14", + "RX_DELAY_15" + ] + } + } + }, + "tx_param_setup_req": { + "type": "object", + "properties": { + "downlink_dwell_time": { + "type": "boolean" + }, + "max_eirp_index": { + "description": " - DEVICE_EIRP_8: 8 dBm.\n - DEVICE_EIRP_10: 10 dBm.\n - DEVICE_EIRP_12: 12 dBm.\n - DEVICE_EIRP_13: 13 dBm.\n - DEVICE_EIRP_14: 14 dBm.\n - DEVICE_EIRP_16: 16 dBm.\n - DEVICE_EIRP_18: 18 dBm.\n - DEVICE_EIRP_20: 20 dBm.\n - DEVICE_EIRP_21: 21 dBm.\n - DEVICE_EIRP_24: 24 dBm.\n - DEVICE_EIRP_26: 26 dBm.\n - DEVICE_EIRP_27: 27 dBm.\n - DEVICE_EIRP_29: 29 dBm.\n - DEVICE_EIRP_30: 30 dBm.\n - DEVICE_EIRP_33: 33 dBm.\n - DEVICE_EIRP_36: 36 dBm.", + "type": "string", + "default": "DEVICE_EIRP_8", + "enum": [ + "DEVICE_EIRP_8", + "DEVICE_EIRP_10", + "DEVICE_EIRP_12", + "DEVICE_EIRP_13", + "DEVICE_EIRP_14", + "DEVICE_EIRP_16", + "DEVICE_EIRP_18", + "DEVICE_EIRP_20", + "DEVICE_EIRP_21", + "DEVICE_EIRP_24", + "DEVICE_EIRP_26", + "DEVICE_EIRP_27", + "DEVICE_EIRP_29", + "DEVICE_EIRP_30", + "DEVICE_EIRP_33", + "DEVICE_EIRP_36" + ] + }, + "uplink_dwell_time": { + "type": "boolean" + } + } + } + } + } + }, + "recent_downlinks": { + "description": "Recent data downlink messages sorted by time.\nThe number of messages stored may depend on configuration.", + "type": "array", + "items": { + "description": "A minimal DownlinkMessage definition which is binary compatible with the top level DownlinkMessage message.\nUsed for type safe recent downlink storage.", + "type": "object", + "properties": { + "correlation_ids": { + "type": "array", + "items": { + "type": "string" + } + }, + "payload": { + "type": "object", + "properties": { + "m_hdr": { + "type": "object", + "properties": { + "m_type": { + "type": "string", + "default": "JOIN_REQUEST", + "enum": [ + "JOIN_REQUEST", + "JOIN_ACCEPT", + "UNCONFIRMED_UP", + "UNCONFIRMED_DOWN", + "CONFIRMED_UP", + "CONFIRMED_DOWN", + "REJOIN_REQUEST", + "PROPRIETARY" + ] + } + } + }, + "mac_payload": { + "type": "object", + "properties": { + "f_port": { + "type": "integer", + "format": "int64" + }, + "full_f_cnt": { + "type": "integer", + "format": "int64" + } + } + } + } + } + } + } + }, + "recent_mac_command_identifiers": { + "description": "MAC command identifiers sent by the end device in the last received uplink.\nThe Network Server may choose to store only certain types of MAC\ncommand identifiers in the underlying implementation.", + "type": "array", + "items": { + "type": "string", + "title": "- CID_BEACON_TIMING: Deprecated", + "default": "CID_RFU_0", + "enum": [ + "CID_RFU_0", + "CID_RESET", + "CID_LINK_CHECK", + "CID_LINK_ADR", + "CID_DUTY_CYCLE", + "CID_RX_PARAM_SETUP", + "CID_DEV_STATUS", + "CID_NEW_CHANNEL", + "CID_RX_TIMING_SETUP", + "CID_TX_PARAM_SETUP", + "CID_DL_CHANNEL", + "CID_REKEY", + "CID_ADR_PARAM_SETUP", + "CID_DEVICE_TIME", + "CID_FORCE_REJOIN", + "CID_REJOIN_PARAM_SETUP", + "CID_PING_SLOT_INFO", + "CID_PING_SLOT_CHANNEL", + "CID_BEACON_TIMING", + "CID_BEACON_FREQ", + "CID_DEVICE_MODE", + "CID_RELAY_CONF", + "CID_RELAY_END_DEVICE_CONF", + "CID_RELAY_FILTER_LIST", + "CID_RELAY_UPDATE_UPLINK_LIST", + "CID_RELAY_CTRL_UPLINK_LIST", + "CID_RELAY_CONFIGURE_FWD_LIMIT", + "CID_RELAY_NOTIFY_NEW_END_DEVICE" + ] + } + }, + "recent_uplinks": { + "description": "Recent data uplink messages sorted by time.\nThe number of messages stored may depend on configuration.", + "type": "array", + "items": { + "description": "A minimal UplinkMessage definition which is binary compatible with the top level UplinkMessage message.\nUsed for type safe recent uplink storage.", + "type": "object", + "properties": { + "correlation_ids": { + "type": "array", + "items": { + "type": "string" + } + }, + "device_channel_index": { + "type": "integer", + "format": "int64" + }, + "payload": { + "type": "object", + "title": "Message represents a LoRaWAN message", + "properties": { + "join_accept_payload": { + "type": "object", + "properties": { + "cf_list": { + "type": "object", + "properties": { + "ch_masks": { + "description": "ChMasks controlling the channels to be used.\nLength of this field must be equal to the amount of uplink channels\ndefined by the selected frequency plan.", + "type": "array", + "items": { + "type": "boolean" + } + }, + "freq": { + "description": "Frequencies to be broadcasted, in hecto-Hz.\nThese values are broadcasted as 24 bits unsigned integers.\nThis field should not contain default values.", + "type": "array", + "items": { + "type": "integer", + "format": "int64" + } + }, + "type": { + "type": "string", + "default": "FREQUENCIES", + "enum": [ + "FREQUENCIES", + "CHANNEL_MASKS" + ] + } + } + }, + "dev_addr": { + "type": "string", + "format": "string", + "example": "2600ABCD" + }, + "dl_settings": { + "type": "object", + "properties": { + "opt_neg": { + "description": "OptNeg is set if Network Server implements LoRaWAN 1.1 or greater.", + "type": "boolean" + }, + "rx1_dr_offset": { + "type": "string", + "default": "DATA_RATE_OFFSET_0", + "enum": [ + "DATA_RATE_OFFSET_0", + "DATA_RATE_OFFSET_1", + "DATA_RATE_OFFSET_2", + "DATA_RATE_OFFSET_3", + "DATA_RATE_OFFSET_4", + "DATA_RATE_OFFSET_5", + "DATA_RATE_OFFSET_6", + "DATA_RATE_OFFSET_7" + ] + }, + "rx2_dr": { + "type": "string", + "default": "DATA_RATE_0", + "enum": [ + "DATA_RATE_0", + "DATA_RATE_1", + "DATA_RATE_2", + "DATA_RATE_3", + "DATA_RATE_4", + "DATA_RATE_5", + "DATA_RATE_6", + "DATA_RATE_7", + "DATA_RATE_8", + "DATA_RATE_9", + "DATA_RATE_10", + "DATA_RATE_11", + "DATA_RATE_12", + "DATA_RATE_13", + "DATA_RATE_14", + "DATA_RATE_15" + ] + } + } + }, + "encrypted": { + "type": "string", + "format": "byte" + }, + "join_nonce": { + "type": "string", + "format": "string", + "example": "ABCDEF" + }, + "net_id": { + "type": "string", + "format": "string", + "example": "000013" + }, + "rx_delay": { + "description": " - RX_DELAY_0: 1 second.\n - RX_DELAY_1: 1 second.\n - RX_DELAY_2: 2 seconds.\n - RX_DELAY_3: 3 seconds.\n - RX_DELAY_4: 4 seconds.\n - RX_DELAY_5: 5 seconds.\n - RX_DELAY_6: 6 seconds.\n - RX_DELAY_7: 7 seconds.\n - RX_DELAY_8: 8 seconds.\n - RX_DELAY_9: 9 seconds.\n - RX_DELAY_10: 10 seconds.\n - RX_DELAY_11: 11 seconds.\n - RX_DELAY_12: 12 seconds.\n - RX_DELAY_13: 13 seconds.\n - RX_DELAY_14: 14 seconds.\n - RX_DELAY_15: 15 seconds.", + "type": "string", + "default": "RX_DELAY_0", + "enum": [ + "RX_DELAY_0", + "RX_DELAY_1", + "RX_DELAY_2", + "RX_DELAY_3", + "RX_DELAY_4", + "RX_DELAY_5", + "RX_DELAY_6", + "RX_DELAY_7", + "RX_DELAY_8", + "RX_DELAY_9", + "RX_DELAY_10", + "RX_DELAY_11", + "RX_DELAY_12", + "RX_DELAY_13", + "RX_DELAY_14", + "RX_DELAY_15" + ] + } + } + }, + "join_request_payload": { + "type": "object", + "properties": { + "dev_eui": { + "type": "string", + "format": "string", + "example": "70B3D57ED000ABCD" + }, + "dev_nonce": { + "type": "string", + "format": "string", + "example": "ABCD" + }, + "join_eui": { + "type": "string", + "format": "string", + "example": "70B3D57ED000ABCD" + } + } + }, + "m_hdr": { + "type": "object", + "properties": { + "m_type": { + "type": "string", + "default": "JOIN_REQUEST", + "enum": [ + "JOIN_REQUEST", + "JOIN_ACCEPT", + "UNCONFIRMED_UP", + "UNCONFIRMED_DOWN", + "CONFIRMED_UP", + "CONFIRMED_DOWN", + "REJOIN_REQUEST", + "PROPRIETARY" + ] + }, + "major": { + "type": "string", + "default": "LORAWAN_R1", + "enum": [ + "LORAWAN_R1" + ] + } + } + }, + "mac_payload": { + "type": "object", + "properties": { + "decoded_payload": { + "type": "object" + }, + "f_hdr": { + "type": "object", + "properties": { + "dev_addr": { + "type": "string", + "format": "string", + "example": "2600ABCD" + }, + "f_cnt": { + "type": "integer", + "format": "int64" + }, + "f_ctrl": { + "type": "object", + "properties": { + "ack": { + "type": "boolean" + }, + "adr": { + "type": "boolean" + }, + "adr_ack_req": { + "description": "Only on uplink.", + "type": "boolean" + }, + "class_b": { + "description": "Only on uplink.", + "type": "boolean" + }, + "f_pending": { + "description": "Only on downlink.", + "type": "boolean" + } + } + }, + "f_opts": { + "type": "string", + "format": "byte" + } + } + }, + "f_port": { + "type": "integer", + "format": "int64" + }, + "frm_payload": { + "type": "string", + "format": "byte" + }, + "full_f_cnt": { + "description": "Full 32-bit FCnt value. Used internally by Network Server.", + "type": "integer", + "format": "int64" + } + } + }, + "mic": { + "type": "string", + "format": "byte" + }, + "rejoin_request_payload": { + "type": "object", + "properties": { + "dev_eui": { + "type": "string", + "format": "string", + "example": "70B3D57ED000ABCD" + }, + "join_eui": { + "type": "string", + "format": "string", + "example": "70B3D57ED000ABCD" + }, + "net_id": { + "type": "string", + "format": "string", + "example": "000013" + }, + "rejoin_cnt": { + "description": "Contains RJCount0 or RJCount1 depending on rejoin_type.", + "type": "integer", + "format": "int64" + }, + "rejoin_type": { + "description": " - CONTEXT: Resets DevAddr, Session Keys, Frame Counters, Radio Parameters.\n - SESSION: Equivalent to the initial JoinRequest.\n - KEYS: Resets DevAddr, Session Keys, Frame Counters, while keeping the Radio Parameters.", + "type": "string", + "default": "CONTEXT", + "enum": [ + "CONTEXT", + "SESSION", + "KEYS" + ] + } + } + } + } + }, + "received_at": { + "type": "string", + "format": "date-time" + }, + "rx_metadata": { + "type": "array", + "items": { + "type": "object", + "properties": { + "channel_rssi": { + "type": "number", + "format": "float" + }, + "downlink_path_constraint": { + "description": " - DOWNLINK_PATH_CONSTRAINT_NONE: Indicates that the gateway can be selected for downlink without constraints by the Network Server.\n - DOWNLINK_PATH_CONSTRAINT_PREFER_OTHER: Indicates that the gateway can be selected for downlink only if no other or better gateway can be selected.\n - DOWNLINK_PATH_CONSTRAINT_NEVER: Indicates that this gateway will never be selected for downlink, even if that results in no available downlink path.", + "type": "string", + "default": "DOWNLINK_PATH_CONSTRAINT_NONE", + "enum": [ + "DOWNLINK_PATH_CONSTRAINT_NONE", + "DOWNLINK_PATH_CONSTRAINT_PREFER_OTHER", + "DOWNLINK_PATH_CONSTRAINT_NEVER" + ] + }, + "gateway_ids": { + "type": "object", + "properties": { + "eui": { + "description": "Secondary identifier, which can only be used in specific requests.", + "type": "string", + "format": "string", + "example": "70B3D57ED000ABCD" + }, + "gateway_id": { + "type": "string" + } + } + }, + "packet_broker": { + "type": "object" + }, + "relay": { + "type": "object" + }, + "snr": { + "type": "number", + "format": "float" + }, + "uplink_token": { + "type": "string", + "format": "byte" + } + } + } + }, + "settings": { + "type": "object", + "properties": { + "data_rate": { + "type": "object", + "properties": { + "fsk": { + "type": "object", + "properties": { + "bit_rate": { + "description": "Bit rate (bps).", + "type": "integer", + "format": "int64" + } + } + }, + "lora": { + "type": "object", + "properties": { + "bandwidth": { + "description": "Bandwidth (Hz).", + "type": "integer", + "format": "int64" + }, + "coding_rate": { + "type": "string" + }, + "spreading_factor": { + "type": "integer", + "format": "int64" + } + } + }, + "lrfhss": { + "type": "object", + "properties": { + "coding_rate": { + "type": "string" + }, + "modulation_type": { + "type": "integer", + "format": "int64" + }, + "operating_channel_width": { + "description": "Operating Channel Width (Hz).", + "type": "integer", + "format": "int64" + } + } + } + } + } + } + } + } + } + }, + "rejected_adr_data_rate_indexes": { + "description": "ADR Data rate index values rejected by the device.\nReset each time `current_parameters.channels` change.\nElements are sorted in ascending order.", + "type": "array", + "items": { + "type": "string", + "default": "DATA_RATE_0", + "enum": [ + "DATA_RATE_0", + "DATA_RATE_1", + "DATA_RATE_2", + "DATA_RATE_3", + "DATA_RATE_4", + "DATA_RATE_5", + "DATA_RATE_6", + "DATA_RATE_7", + "DATA_RATE_8", + "DATA_RATE_9", + "DATA_RATE_10", + "DATA_RATE_11", + "DATA_RATE_12", + "DATA_RATE_13", + "DATA_RATE_14", + "DATA_RATE_15" + ] + } + }, + "rejected_adr_tx_power_indexes": { + "description": "ADR TX output power index values rejected by the device.\nElements are sorted in ascending order.", + "type": "array", + "items": { + "type": "integer", + "format": "int64" + } + }, + "rejected_data_rate_ranges": { + "description": "Data rate ranges rejected by the device per frequency.", + "type": "object", + "additionalProperties": { + "type": "object", + "properties": { + "ranges": { + "type": "array", + "items": { + "type": "object", + "properties": { + "max_data_rate_index": { + "type": "string", + "default": "DATA_RATE_0", + "enum": [ + "DATA_RATE_0", + "DATA_RATE_1", + "DATA_RATE_2", + "DATA_RATE_3", + "DATA_RATE_4", + "DATA_RATE_5", + "DATA_RATE_6", + "DATA_RATE_7", + "DATA_RATE_8", + "DATA_RATE_9", + "DATA_RATE_10", + "DATA_RATE_11", + "DATA_RATE_12", + "DATA_RATE_13", + "DATA_RATE_14", + "DATA_RATE_15" + ] + }, + "min_data_rate_index": { + "type": "string", + "default": "DATA_RATE_0", + "enum": [ + "DATA_RATE_0", + "DATA_RATE_1", + "DATA_RATE_2", + "DATA_RATE_3", + "DATA_RATE_4", + "DATA_RATE_5", + "DATA_RATE_6", + "DATA_RATE_7", + "DATA_RATE_8", + "DATA_RATE_9", + "DATA_RATE_10", + "DATA_RATE_11", + "DATA_RATE_12", + "DATA_RATE_13", + "DATA_RATE_14", + "DATA_RATE_15" + ] + } + } + } + } + } + } + }, + "rejected_frequencies": { + "description": "Frequencies rejected by the device.", + "type": "array", + "items": { + "type": "string", + "format": "uint64" + } + }, + "rx_windows_available": { + "description": "Whether or not Rx windows are expected to be open.\nSet to true every time an uplink is received.\nSet to false every time a successful downlink scheduling attempt is made.", + "type": "boolean" + } + } + }, + "pending_session": { + "type": "object", + "properties": { + "dev_addr": { + "description": "Device Address, issued by the Network Server or chosen by device manufacturer in case of testing range (beginning with 00-03).\nKnown by Network Server, Application Server and Join Server. Owned by Network Server.", + "type": "string", + "format": "string", + "example": "2600ABCD" + }, + "keys": { + "description": "Session keys for a LoRaWAN session.\nOnly the components for which the keys were meant, will have the key-encryption-key (KEK) to decrypt the individual keys.", + "type": "object", + "properties": { + "app_s_key": { + "type": "object", + "properties": { + "encrypted_key": { + "type": "string", + "format": "byte" + }, + "kek_label": { + "description": "The label of the RFC 3394 key-encryption-key (KEK) that was used to encrypt the key.", + "type": "string" + }, + "key": { + "description": "The unencrypted AES key.", + "type": "string", + "format": "string", + "example": "0123456789ABCDEF0123456789ABCDEF" + } + } + }, + "f_nwk_s_int_key": { + "type": "object", + "properties": { + "encrypted_key": { + "type": "string", + "format": "byte" + }, + "kek_label": { + "description": "The label of the RFC 3394 key-encryption-key (KEK) that was used to encrypt the key.", + "type": "string" + }, + "key": { + "description": "The unencrypted AES key.", + "type": "string", + "format": "string", + "example": "0123456789ABCDEF0123456789ABCDEF" + } + } + }, + "nwk_s_enc_key": { + "type": "object", + "properties": { + "encrypted_key": { + "type": "string", + "format": "byte" + }, + "kek_label": { + "description": "The label of the RFC 3394 key-encryption-key (KEK) that was used to encrypt the key.", + "type": "string" + }, + "key": { + "description": "The unencrypted AES key.", + "type": "string", + "format": "string", + "example": "0123456789ABCDEF0123456789ABCDEF" + } + } + }, + "s_nwk_s_int_key": { + "type": "object", + "properties": { + "encrypted_key": { + "type": "string", + "format": "byte" + }, + "kek_label": { + "description": "The label of the RFC 3394 key-encryption-key (KEK) that was used to encrypt the key.", + "type": "string" + }, + "key": { + "description": "The unencrypted AES key.", + "type": "string", + "format": "string", + "example": "0123456789ABCDEF0123456789ABCDEF" + } + } + }, + "session_key_id": { + "description": "Join Server issued identifier for the session keys.\nThis ID can be used to request the keys from the Join Server in case the are lost.", + "type": "string", + "format": "byte" + } + } + }, + "last_a_f_cnt_down": { + "description": "Last application downlink frame counter value used. Application Server only.", + "type": "integer", + "format": "int64" + }, + "last_conf_f_cnt_down": { + "description": "Frame counter of the last confirmed downlink message sent. Network Server only.", + "type": "integer", + "format": "int64" + }, + "last_f_cnt_up": { + "description": "Last uplink frame counter value used. Network Server only. Application Server assumes the Network Server checked it.", + "type": "integer", + "format": "int64" + }, + "last_n_f_cnt_down": { + "description": "Last network downlink frame counter value used. Network Server only.", + "type": "integer", + "format": "int64" + }, + "queued_application_downlinks": { + "description": "Queued Application downlink messages. Stored in Application Server and Network Server.", + "type": "array", + "items": { + "type": "object", + "properties": { + "attributes": { + "description": "Attributes for devices, set by the Application Server while handling the message.", + "type": "object", + "additionalProperties": { + "type": "string" + } + }, + "class_b_c": { + "type": "object", + "properties": { + "absolute_time": { + "description": "Absolute time when the downlink message should be transmitted.\nThis requires the gateway to have GPS time synchronization.\nIf the time is in the past or if there is a scheduling conflict, the downlink message fails.\nIf null, the time is selected based on slot availability. This is recommended in class B mode.", + "type": "string", + "format": "date-time" + }, + "gateways": { + "description": "Possible gateway identifiers, antenna index, and group index to use for this downlink message.\nThe Network Server selects one of these gateways for downlink, based on connectivity, signal quality, channel utilization and an available slot.\nIf none of the gateways can be selected, the downlink message fails.\nIf empty, a gateway and antenna is selected automatically from the gateways seen in recent uplinks.\nIf group index is set, gateways will be grouped by the index for the Network Server to select one gateway per group.", + "type": "array", + "items": { + "type": "object", + "properties": { + "antenna_index": { + "type": "integer", + "format": "int64" + }, + "gateway_ids": { + "type": "object", + "properties": { + "eui": { + "description": "Secondary identifier, which can only be used in specific requests.", + "type": "string", + "format": "string", + "example": "70B3D57ED000ABCD" + }, + "gateway_id": { + "type": "string" + } + } + }, + "group_index": { + "type": "integer", + "format": "int64" + } + } + } + } + } + }, + "confirmed": { + "type": "boolean" + }, + "confirmed_retry": { + "type": "object", + "properties": { + "attempt": { + "description": "The number of attempted confirmed downlink acknowledgements.", + "type": "integer", + "format": "int64" + }, + "max_attempts": { + "description": "The maximum number of confirmed downlink acknowledgement attempts.\nIf null, the Application Server configuration is used instead.", + "type": "integer", + "format": "int64" + } + } + }, + "correlation_ids": { + "type": "array", + "items": { + "type": "string" + } + }, + "decoded_payload": { + "description": "The decoded frame payload of the downlink message.\nWhen scheduling downlink with a message processor configured for the end device (see formatters) or application (see default_formatters),\nthis fields acts as input for the downlink encoder, and the output is set to frm_payload.\nWhen reading downlink (listing the queue, downlink message events, etc), this fields acts as output of the downlink decoder, and the input is frm_payload.", + "type": "object" + }, + "decoded_payload_warnings": { + "description": "Warnings generated by the message processor while encoding frm_payload (scheduling downlink) or decoding the frm_payload (reading downlink).", + "type": "array", + "items": { + "type": "string" + } + }, + "f_cnt": { + "type": "integer", + "format": "int64" + }, + "f_port": { + "type": "integer", + "format": "int64" + }, + "frm_payload": { + "description": "The frame payload of the downlink message.\nThe payload is encrypted if the skip_payload_crypto field of the EndDevice\nis true.", + "type": "string", + "format": "byte" + }, + "locations": { + "description": "End device location metadata, set by the Application Server while handling the message.", + "type": "object", + "additionalProperties": { + "type": "object", + "properties": { + "accuracy": { + "description": "The accuracy of the location (meters).", + "type": "integer", + "format": "int32" + }, + "altitude": { + "description": "The altitude (meters), where 0 is the mean sea level.", + "type": "integer", + "format": "int32" + }, + "latitude": { + "description": "The North–South position (degrees; -90 to +90), where 0 is the equator, North pole is positive, South pole is negative.", + "type": "number", + "format": "double" + }, + "longitude": { + "description": "The East-West position (degrees; -180 to +180), where 0 is the Prime Meridian (Greenwich), East is positive , West is negative.", + "type": "number", + "format": "double" + }, + "source": { + "description": " - SOURCE_UNKNOWN: The source of the location is not known or not set.\n - SOURCE_GPS: The location is determined by GPS.\n - SOURCE_REGISTRY: The location is set in and updated from a registry.\n - SOURCE_IP_GEOLOCATION: The location is estimated with IP geolocation.\n - SOURCE_WIFI_RSSI_GEOLOCATION: The location is estimated with WiFi RSSI geolocation.\n - SOURCE_BT_RSSI_GEOLOCATION: The location is estimated with BT/BLE RSSI geolocation.\n - SOURCE_LORA_RSSI_GEOLOCATION: The location is estimated with LoRa RSSI geolocation.\n - SOURCE_LORA_TDOA_GEOLOCATION: The location is estimated with LoRa TDOA geolocation.\n - SOURCE_COMBINED_GEOLOCATION: The location is estimated by a combination of geolocation sources.\n\nMore estimation methods can be added.", + "type": "string", + "default": "SOURCE_UNKNOWN", + "enum": [ + "SOURCE_UNKNOWN", + "SOURCE_GPS", + "SOURCE_REGISTRY", + "SOURCE_IP_GEOLOCATION", + "SOURCE_WIFI_RSSI_GEOLOCATION", + "SOURCE_BT_RSSI_GEOLOCATION", + "SOURCE_LORA_RSSI_GEOLOCATION", + "SOURCE_LORA_TDOA_GEOLOCATION", + "SOURCE_COMBINED_GEOLOCATION" + ] + } + } + } + }, + "network_ids": { + "description": "Identifies a Network Server.", + "type": "object", + "properties": { + "cluster_address": { + "description": "Cluster address of the Network Server.", + "type": "string" + }, + "cluster_id": { + "description": "Cluster identifier of the Network Server.", + "type": "string" + }, + "net_id": { + "description": "LoRa Alliance NetID.", + "type": "string", + "format": "string", + "example": "000013" + }, + "ns_id": { + "description": "LoRaWAN NSID (EUI-64) that uniquely identifies the Network Server instance.", + "type": "string", + "format": "string", + "example": "70B3D57ED000ABCD" + }, + "tenant_address": { + "description": "Optional tenant address for multi-tenant deployments.", + "type": "string" + }, + "tenant_id": { + "description": "Optional tenant identifier for multi-tenant deployments.", + "type": "string" + } + } + }, + "priority": { + "type": "string", + "default": "LOWEST", + "enum": [ + "LOWEST", + "LOW", + "BELOW_NORMAL", + "NORMAL", + "ABOVE_NORMAL", + "HIGH", + "HIGHEST" + ] + }, + "session_key_id": { + "description": "Join Server issued identifier for the session keys used by this downlink.", + "type": "string", + "format": "byte" + }, + "version_ids": { + "description": "Identifies an end device model with version information.", + "type": "object", + "properties": { + "band_id": { + "type": "string" + }, + "brand_id": { + "type": "string" + }, + "firmware_version": { + "type": "string" + }, + "hardware_version": { + "type": "string" + }, + "model_id": { + "type": "string" + } + } + } + } + } + }, + "started_at": { + "description": "Time when the session started. Network Server only.", + "type": "string", + "format": "date-time" + } + } + }, + "picture": { + "type": "object", + "properties": { + "embedded": { + "type": "object", + "properties": { + "data": { + "description": "Picture data. A data URI can be constructed as follows:\n`data:\u003cmime_type\u003e;base64,\u003cdata\u003e`.", + "type": "string", + "format": "byte" + }, + "mime_type": { + "description": "MIME type of the picture.", + "type": "string" + } + } + }, + "sizes": { + "description": "URLs of the picture for different sizes, if available on a CDN.", + "type": "object", + "additionalProperties": { + "type": "string" + } + } + } + }, + "power_state": { + "description": "Power state of the device.", + "type": "string", + "default": "POWER_UNKNOWN", + "enum": [ + "POWER_UNKNOWN", + "POWER_BATTERY", + "POWER_EXTERNAL" + ] + }, + "provisioner_id": { + "description": "ID of the provisioner. Stored in Join Server.", + "type": "string" + }, + "provisioning_data": { + "description": "Vendor-specific provisioning data. Stored in Join Server.", + "type": "object" + }, + "queued_application_downlinks": { + "description": "Queued Application downlink messages. Stored in Application Server,\nwhich sets them on the Network Server.\nThis field is deprecated and is always set equal to session.queued_application_downlinks.", + "type": "array", + "items": { + "type": "object", + "properties": { + "attributes": { + "description": "Attributes for devices, set by the Application Server while handling the message.", + "type": "object", + "additionalProperties": { + "type": "string" + } + }, + "class_b_c": { + "type": "object", + "properties": { + "absolute_time": { + "description": "Absolute time when the downlink message should be transmitted.\nThis requires the gateway to have GPS time synchronization.\nIf the time is in the past or if there is a scheduling conflict, the downlink message fails.\nIf null, the time is selected based on slot availability. This is recommended in class B mode.", + "type": "string", + "format": "date-time" + }, + "gateways": { + "description": "Possible gateway identifiers, antenna index, and group index to use for this downlink message.\nThe Network Server selects one of these gateways for downlink, based on connectivity, signal quality, channel utilization and an available slot.\nIf none of the gateways can be selected, the downlink message fails.\nIf empty, a gateway and antenna is selected automatically from the gateways seen in recent uplinks.\nIf group index is set, gateways will be grouped by the index for the Network Server to select one gateway per group.", + "type": "array", + "items": { + "type": "object", + "properties": { + "antenna_index": { + "type": "integer", + "format": "int64" + }, + "gateway_ids": { + "type": "object", + "properties": { + "eui": { + "description": "Secondary identifier, which can only be used in specific requests.", + "type": "string", + "format": "string", + "example": "70B3D57ED000ABCD" + }, + "gateway_id": { + "type": "string" + } + } + }, + "group_index": { + "type": "integer", + "format": "int64" + } + } + } + } + } + }, + "confirmed": { + "type": "boolean" + }, + "confirmed_retry": { + "type": "object", + "properties": { + "attempt": { + "description": "The number of attempted confirmed downlink acknowledgements.", + "type": "integer", + "format": "int64" + }, + "max_attempts": { + "description": "The maximum number of confirmed downlink acknowledgement attempts.\nIf null, the Application Server configuration is used instead.", + "type": "integer", + "format": "int64" + } + } + }, + "correlation_ids": { + "type": "array", + "items": { + "type": "string" + } + }, + "decoded_payload": { + "description": "The decoded frame payload of the downlink message.\nWhen scheduling downlink with a message processor configured for the end device (see formatters) or application (see default_formatters),\nthis fields acts as input for the downlink encoder, and the output is set to frm_payload.\nWhen reading downlink (listing the queue, downlink message events, etc), this fields acts as output of the downlink decoder, and the input is frm_payload.", + "type": "object" + }, + "decoded_payload_warnings": { + "description": "Warnings generated by the message processor while encoding frm_payload (scheduling downlink) or decoding the frm_payload (reading downlink).", + "type": "array", + "items": { + "type": "string" + } + }, + "f_cnt": { + "type": "integer", + "format": "int64" + }, + "f_port": { + "type": "integer", + "format": "int64" + }, + "frm_payload": { + "description": "The frame payload of the downlink message.\nThe payload is encrypted if the skip_payload_crypto field of the EndDevice\nis true.", + "type": "string", + "format": "byte" + }, + "locations": { + "description": "End device location metadata, set by the Application Server while handling the message.", + "type": "object", + "additionalProperties": { + "type": "object", + "properties": { + "accuracy": { + "description": "The accuracy of the location (meters).", + "type": "integer", + "format": "int32" + }, + "altitude": { + "description": "The altitude (meters), where 0 is the mean sea level.", + "type": "integer", + "format": "int32" + }, + "latitude": { + "description": "The North–South position (degrees; -90 to +90), where 0 is the equator, North pole is positive, South pole is negative.", + "type": "number", + "format": "double" + }, + "longitude": { + "description": "The East-West position (degrees; -180 to +180), where 0 is the Prime Meridian (Greenwich), East is positive , West is negative.", + "type": "number", + "format": "double" + }, + "source": { + "description": " - SOURCE_UNKNOWN: The source of the location is not known or not set.\n - SOURCE_GPS: The location is determined by GPS.\n - SOURCE_REGISTRY: The location is set in and updated from a registry.\n - SOURCE_IP_GEOLOCATION: The location is estimated with IP geolocation.\n - SOURCE_WIFI_RSSI_GEOLOCATION: The location is estimated with WiFi RSSI geolocation.\n - SOURCE_BT_RSSI_GEOLOCATION: The location is estimated with BT/BLE RSSI geolocation.\n - SOURCE_LORA_RSSI_GEOLOCATION: The location is estimated with LoRa RSSI geolocation.\n - SOURCE_LORA_TDOA_GEOLOCATION: The location is estimated with LoRa TDOA geolocation.\n - SOURCE_COMBINED_GEOLOCATION: The location is estimated by a combination of geolocation sources.\n\nMore estimation methods can be added.", + "type": "string", + "default": "SOURCE_UNKNOWN", + "enum": [ + "SOURCE_UNKNOWN", + "SOURCE_GPS", + "SOURCE_REGISTRY", + "SOURCE_IP_GEOLOCATION", + "SOURCE_WIFI_RSSI_GEOLOCATION", + "SOURCE_BT_RSSI_GEOLOCATION", + "SOURCE_LORA_RSSI_GEOLOCATION", + "SOURCE_LORA_TDOA_GEOLOCATION", + "SOURCE_COMBINED_GEOLOCATION" + ] + } + } + } + }, + "network_ids": { + "description": "Identifies a Network Server.", + "type": "object", + "properties": { + "cluster_address": { + "description": "Cluster address of the Network Server.", + "type": "string" + }, + "cluster_id": { + "description": "Cluster identifier of the Network Server.", + "type": "string" + }, + "net_id": { + "description": "LoRa Alliance NetID.", + "type": "string", + "format": "string", + "example": "000013" + }, + "ns_id": { + "description": "LoRaWAN NSID (EUI-64) that uniquely identifies the Network Server instance.", + "type": "string", + "format": "string", + "example": "70B3D57ED000ABCD" + }, + "tenant_address": { + "description": "Optional tenant address for multi-tenant deployments.", + "type": "string" + }, + "tenant_id": { + "description": "Optional tenant identifier for multi-tenant deployments.", + "type": "string" + } + } + }, + "priority": { + "type": "string", + "default": "LOWEST", + "enum": [ + "LOWEST", + "LOW", + "BELOW_NORMAL", + "NORMAL", + "ABOVE_NORMAL", + "HIGH", + "HIGHEST" + ] + }, + "session_key_id": { + "description": "Join Server issued identifier for the session keys used by this downlink.", + "type": "string", + "format": "byte" + }, + "version_ids": { + "description": "Identifies an end device model with version information.", + "type": "object", + "properties": { + "band_id": { + "type": "string" + }, + "brand_id": { + "type": "string" + }, + "firmware_version": { + "type": "string" + }, + "hardware_version": { + "type": "string" + }, + "model_id": { + "type": "string" + } + } + } + } + } + }, + "resets_join_nonces": { + "description": "Whether the device resets the join and dev nonces (not LoRaWAN compliant). Stored in Join Server.\nCopied on creation from template identified by version_ids, if any or from the home Network Server device profile, if any.", + "type": "boolean" + }, + "root_keys": { + "description": "Root keys for a LoRaWAN device.\nThese are stored on the Join Server.", + "type": "object", + "properties": { + "app_key": { + "type": "object", + "properties": { + "encrypted_key": { + "type": "string", + "format": "byte" + }, + "kek_label": { + "description": "The label of the RFC 3394 key-encryption-key (KEK) that was used to encrypt the key.", + "type": "string" + }, + "key": { + "description": "The unencrypted AES key.", + "type": "string", + "format": "string", + "example": "0123456789ABCDEF0123456789ABCDEF" + } + } + }, + "nwk_key": { + "type": "object", + "properties": { + "encrypted_key": { + "type": "string", + "format": "byte" + }, + "kek_label": { + "description": "The label of the RFC 3394 key-encryption-key (KEK) that was used to encrypt the key.", + "type": "string" + }, + "key": { + "description": "The unencrypted AES key.", + "type": "string", + "format": "string", + "example": "0123456789ABCDEF0123456789ABCDEF" + } + } + }, + "root_key_id": { + "description": "Join Server issued identifier for the root keys.", + "type": "string" + } + } + }, + "serial_number": { + "type": "string" + }, + "service_profile_id": { + "description": "Default service profile. Stored in Entity Registry.", + "type": "string" + }, + "session": { + "type": "object", + "properties": { + "dev_addr": { + "description": "Device Address, issued by the Network Server or chosen by device manufacturer in case of testing range (beginning with 00-03).\nKnown by Network Server, Application Server and Join Server. Owned by Network Server.", + "type": "string", + "format": "string", + "example": "2600ABCD" + }, + "keys": { + "description": "Session keys for a LoRaWAN session.\nOnly the components for which the keys were meant, will have the key-encryption-key (KEK) to decrypt the individual keys.", + "type": "object", + "properties": { + "app_s_key": { + "type": "object", + "properties": { + "encrypted_key": { + "type": "string", + "format": "byte" + }, + "kek_label": { + "description": "The label of the RFC 3394 key-encryption-key (KEK) that was used to encrypt the key.", + "type": "string" + }, + "key": { + "description": "The unencrypted AES key.", + "type": "string", + "format": "string", + "example": "0123456789ABCDEF0123456789ABCDEF" + } + } + }, + "f_nwk_s_int_key": { + "type": "object", + "properties": { + "encrypted_key": { + "type": "string", + "format": "byte" + }, + "kek_label": { + "description": "The label of the RFC 3394 key-encryption-key (KEK) that was used to encrypt the key.", + "type": "string" + }, + "key": { + "description": "The unencrypted AES key.", + "type": "string", + "format": "string", + "example": "0123456789ABCDEF0123456789ABCDEF" + } + } + }, + "nwk_s_enc_key": { + "type": "object", + "properties": { + "encrypted_key": { + "type": "string", + "format": "byte" + }, + "kek_label": { + "description": "The label of the RFC 3394 key-encryption-key (KEK) that was used to encrypt the key.", + "type": "string" + }, + "key": { + "description": "The unencrypted AES key.", + "type": "string", + "format": "string", + "example": "0123456789ABCDEF0123456789ABCDEF" + } + } + }, + "s_nwk_s_int_key": { + "type": "object", + "properties": { + "encrypted_key": { + "type": "string", + "format": "byte" + }, + "kek_label": { + "description": "The label of the RFC 3394 key-encryption-key (KEK) that was used to encrypt the key.", + "type": "string" + }, + "key": { + "description": "The unencrypted AES key.", + "type": "string", + "format": "string", + "example": "0123456789ABCDEF0123456789ABCDEF" + } + } + }, + "session_key_id": { + "description": "Join Server issued identifier for the session keys.\nThis ID can be used to request the keys from the Join Server in case the are lost.", + "type": "string", + "format": "byte" + } + } + }, + "last_a_f_cnt_down": { + "description": "Last application downlink frame counter value used. Application Server only.", + "type": "integer", + "format": "int64" + }, + "last_conf_f_cnt_down": { + "description": "Frame counter of the last confirmed downlink message sent. Network Server only.", + "type": "integer", + "format": "int64" + }, + "last_f_cnt_up": { + "description": "Last uplink frame counter value used. Network Server only. Application Server assumes the Network Server checked it.", + "type": "integer", + "format": "int64" + }, + "last_n_f_cnt_down": { + "description": "Last network downlink frame counter value used. Network Server only.", + "type": "integer", + "format": "int64" + }, + "queued_application_downlinks": { + "description": "Queued Application downlink messages. Stored in Application Server and Network Server.", + "type": "array", + "items": { + "type": "object", + "properties": { + "attributes": { + "description": "Attributes for devices, set by the Application Server while handling the message.", + "type": "object", + "additionalProperties": { + "type": "string" + } + }, + "class_b_c": { + "type": "object", + "properties": { + "absolute_time": { + "description": "Absolute time when the downlink message should be transmitted.\nThis requires the gateway to have GPS time synchronization.\nIf the time is in the past or if there is a scheduling conflict, the downlink message fails.\nIf null, the time is selected based on slot availability. This is recommended in class B mode.", + "type": "string", + "format": "date-time" + }, + "gateways": { + "description": "Possible gateway identifiers, antenna index, and group index to use for this downlink message.\nThe Network Server selects one of these gateways for downlink, based on connectivity, signal quality, channel utilization and an available slot.\nIf none of the gateways can be selected, the downlink message fails.\nIf empty, a gateway and antenna is selected automatically from the gateways seen in recent uplinks.\nIf group index is set, gateways will be grouped by the index for the Network Server to select one gateway per group.", + "type": "array", + "items": { + "type": "object", + "properties": { + "antenna_index": { + "type": "integer", + "format": "int64" + }, + "gateway_ids": { + "type": "object", + "properties": { + "eui": { + "description": "Secondary identifier, which can only be used in specific requests.", + "type": "string", + "format": "string", + "example": "70B3D57ED000ABCD" + }, + "gateway_id": { + "type": "string" + } + } + }, + "group_index": { + "type": "integer", + "format": "int64" + } + } + } + } + } + }, + "confirmed": { + "type": "boolean" + }, + "confirmed_retry": { + "type": "object", + "properties": { + "attempt": { + "description": "The number of attempted confirmed downlink acknowledgements.", + "type": "integer", + "format": "int64" + }, + "max_attempts": { + "description": "The maximum number of confirmed downlink acknowledgement attempts.\nIf null, the Application Server configuration is used instead.", + "type": "integer", + "format": "int64" + } + } + }, + "correlation_ids": { + "type": "array", + "items": { + "type": "string" + } + }, + "decoded_payload": { + "description": "The decoded frame payload of the downlink message.\nWhen scheduling downlink with a message processor configured for the end device (see formatters) or application (see default_formatters),\nthis fields acts as input for the downlink encoder, and the output is set to frm_payload.\nWhen reading downlink (listing the queue, downlink message events, etc), this fields acts as output of the downlink decoder, and the input is frm_payload.", + "type": "object" + }, + "decoded_payload_warnings": { + "description": "Warnings generated by the message processor while encoding frm_payload (scheduling downlink) or decoding the frm_payload (reading downlink).", + "type": "array", + "items": { + "type": "string" + } + }, + "f_cnt": { + "type": "integer", + "format": "int64" + }, + "f_port": { + "type": "integer", + "format": "int64" + }, + "frm_payload": { + "description": "The frame payload of the downlink message.\nThe payload is encrypted if the skip_payload_crypto field of the EndDevice\nis true.", + "type": "string", + "format": "byte" + }, + "locations": { + "description": "End device location metadata, set by the Application Server while handling the message.", + "type": "object", + "additionalProperties": { + "type": "object", + "properties": { + "accuracy": { + "description": "The accuracy of the location (meters).", + "type": "integer", + "format": "int32" + }, + "altitude": { + "description": "The altitude (meters), where 0 is the mean sea level.", + "type": "integer", + "format": "int32" + }, + "latitude": { + "description": "The North–South position (degrees; -90 to +90), where 0 is the equator, North pole is positive, South pole is negative.", + "type": "number", + "format": "double" + }, + "longitude": { + "description": "The East-West position (degrees; -180 to +180), where 0 is the Prime Meridian (Greenwich), East is positive , West is negative.", + "type": "number", + "format": "double" + }, + "source": { + "description": " - SOURCE_UNKNOWN: The source of the location is not known or not set.\n - SOURCE_GPS: The location is determined by GPS.\n - SOURCE_REGISTRY: The location is set in and updated from a registry.\n - SOURCE_IP_GEOLOCATION: The location is estimated with IP geolocation.\n - SOURCE_WIFI_RSSI_GEOLOCATION: The location is estimated with WiFi RSSI geolocation.\n - SOURCE_BT_RSSI_GEOLOCATION: The location is estimated with BT/BLE RSSI geolocation.\n - SOURCE_LORA_RSSI_GEOLOCATION: The location is estimated with LoRa RSSI geolocation.\n - SOURCE_LORA_TDOA_GEOLOCATION: The location is estimated with LoRa TDOA geolocation.\n - SOURCE_COMBINED_GEOLOCATION: The location is estimated by a combination of geolocation sources.\n\nMore estimation methods can be added.", + "type": "string", + "default": "SOURCE_UNKNOWN", + "enum": [ + "SOURCE_UNKNOWN", + "SOURCE_GPS", + "SOURCE_REGISTRY", + "SOURCE_IP_GEOLOCATION", + "SOURCE_WIFI_RSSI_GEOLOCATION", + "SOURCE_BT_RSSI_GEOLOCATION", + "SOURCE_LORA_RSSI_GEOLOCATION", + "SOURCE_LORA_TDOA_GEOLOCATION", + "SOURCE_COMBINED_GEOLOCATION" + ] + } + } + } + }, + "network_ids": { + "description": "Identifies a Network Server.", + "type": "object", + "properties": { + "cluster_address": { + "description": "Cluster address of the Network Server.", + "type": "string" + }, + "cluster_id": { + "description": "Cluster identifier of the Network Server.", + "type": "string" + }, + "net_id": { + "description": "LoRa Alliance NetID.", + "type": "string", + "format": "string", + "example": "000013" + }, + "ns_id": { + "description": "LoRaWAN NSID (EUI-64) that uniquely identifies the Network Server instance.", + "type": "string", + "format": "string", + "example": "70B3D57ED000ABCD" + }, + "tenant_address": { + "description": "Optional tenant address for multi-tenant deployments.", + "type": "string" + }, + "tenant_id": { + "description": "Optional tenant identifier for multi-tenant deployments.", + "type": "string" + } + } + }, + "priority": { + "type": "string", + "default": "LOWEST", + "enum": [ + "LOWEST", + "LOW", + "BELOW_NORMAL", + "NORMAL", + "ABOVE_NORMAL", + "HIGH", + "HIGHEST" + ] + }, + "session_key_id": { + "description": "Join Server issued identifier for the session keys used by this downlink.", + "type": "string", + "format": "byte" + }, + "version_ids": { + "description": "Identifies an end device model with version information.", + "type": "object", + "properties": { + "band_id": { + "type": "string" + }, + "brand_id": { + "type": "string" + }, + "firmware_version": { + "type": "string" + }, + "hardware_version": { + "type": "string" + }, + "model_id": { + "type": "string" + } + } + } + } + } + }, + "started_at": { + "description": "Time when the session started. Network Server only.", + "type": "string", + "format": "date-time" + } + } + }, + "skip_payload_crypto": { + "description": "Skip decryption of uplink payloads and encryption of downlink payloads.\nThis field is deprecated, use skip_payload_crypto_override instead.", + "type": "boolean" + }, + "skip_payload_crypto_override": { + "description": "Skip decryption of uplink payloads and encryption of downlink payloads.\nThis field overrides the application-level setting.", + "type": "boolean" + }, + "supports_class_b": { + "description": "Whether the device supports class B.\nCopied on creation from template identified by version_ids, if any or from the home Network Server device profile, if any.", + "type": "boolean" + }, + "supports_class_c": { + "description": "Whether the device supports class C.\nCopied on creation from template identified by version_ids, if any or from the home Network Server device profile, if any.", + "type": "boolean" + }, + "supports_join": { + "description": "The device supports join (it's OTAA).\nCopied on creation from template identified by version_ids, if any or from the home Network Server device profile, if any.", + "type": "boolean" + }, + "updated_at": { + "type": "string", + "format": "date-time" + }, + "used_dev_nonces": { + "description": "Used DevNonces sorted in ascending order.\nThis field is only used for devices using LoRaWAN versions preceding 1.1.\nStored in Join Server.", + "type": "array", + "items": { + "type": "integer", + "format": "int64" + } + }, + "version_ids": { + "description": "Identifies an end device model with version information.", + "type": "object", + "properties": { + "band_id": { + "type": "string" + }, + "brand_id": { + "type": "string" + }, + "firmware_version": { + "type": "string" + }, + "hardware_version": { + "type": "string" + }, + "model_id": { + "type": "string" + } + } + } + } + } + } + } + } + }, + "default": { + "description": "An unexpected error response.", + "schema": { + "type": "object", + "properties": { + "code": { + "type": "integer", + "format": "int32" + }, + "details": { + "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": { + "type": "string" + } + } + } + } + } + } + }, + "/ns/applications/{application_ids.application_id}/devices/{device_id}": { + "delete": { + "description": "If there are multiple matches, an error will be returned.", + "tags": [ + "NsEndDeviceRegistry" + ], + "summary": "Delete deletes the device that matches the given identifiers.", + "operationId": "NsEndDeviceRegistry_Delete", + "parameters": [ + { + "type": "string", + "name": "application_ids.application_id", + "in": "path", + "required": true + }, + { + "type": "string", + "name": "device_id", + "in": "path", + "required": true + }, + { + "type": "string", + "format": "string", + "description": "The LoRaWAN DevEUI.", + "name": "dev_eui", + "in": "query" + }, + { + "type": "string", + "format": "string", + "description": "The LoRaWAN JoinEUI (AppEUI until LoRaWAN 1.0.3 end devices).", + "name": "join_eui", + "in": "query" + }, + { + "type": "string", + "format": "string", + "description": "The LoRaWAN DevAddr.", + "name": "dev_addr", + "in": "query" + } + ], + "responses": { + "200": { + "description": "A successful response.", + "schema": { + "type": "object" + } + }, + "default": { + "description": "An unexpected error response.", + "schema": { + "type": "object", + "properties": { + "code": { + "type": "integer", + "format": "int32" + }, + "details": { + "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": { + "type": "string" + } + } + } + } + } + } + }, + "/ns/applications/{application_ids.application_id}/mac_settings_profiles": { + "get": { + "tags": [ + "NsMACSettingsProfileRegistry" + ], + "summary": "List lists the MAC settings profiles.", + "operationId": "NsMACSettingsProfileRegistry_List", + "parameters": [ + { + "type": "string", + "name": "application_ids.application_id", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "The names of the fields that should be returned.", + "name": "field_mask", + "in": "query" + }, + { + "type": "string", + "description": "Order the results by this field path (must be present in the field mask).\nDefault ordering is by ID. Prepend with a minus (-) to reverse the order.", + "name": "order", + "in": "query" + }, + { + "type": "integer", + "format": "int64", + "description": "Limit the number of results per page.", + "name": "limit", + "in": "query" + }, + { + "type": "integer", + "format": "int64", + "description": "Page number for pagination. 0 is interpreted as 1.", + "name": "page", + "in": "query" + } + ], + "responses": { + "200": { + "description": "A successful response.", + "schema": { + "type": "object", + "properties": { + "mac_settings_profiles": { + "description": "The MAC settings profiles.", + "type": "array", + "items": { + "type": "object", + "properties": { + "end_devices_count": { + "description": "Associated end devices counter.", + "type": "integer", + "format": "int64" + }, + "ids": { + "type": "object", + "properties": { + "application_ids": { + "type": "object", + "properties": { + "application_id": { + "type": "string" + } + } + }, + "profile_id": { + "description": "Profile ID.", "type": "string" } } @@ -541401,6 +554309,9 @@ "client_secret": { "type": "string" }, + "preferred_response_type": { + "type": "string" + }, "provider_url": { "type": "string" } @@ -546189,967 +559100,998 @@ } } }, - "NocQueryApplicationWebhookFailureBody": { - "description": "Request for end device data using aggregates by time buckets with a specified interval.", + "NocQueryApplicationWebhookFailureBody": { + "description": "Request for end device data using aggregates by time buckets with a specified interval.", + "type": "object", + "properties": { + "application_ids": { + "type": "object" + }, + "time_bucket": { + "description": "Request for data using aggregates by time buckets with a specified interval.", + "type": "object", + "properties": { + "bucket_interval": { + "type": "string" + }, + "from": { + "type": "string", + "format": "date-time" + }, + "limit": { + "description": "Limit the number of results per page.", + "type": "integer", + "format": "int64" + }, + "page": { + "description": "Page number for pagination. 0 is interpreted as 1.", + "type": "integer", + "format": "int64" + }, + "to": { + "type": "string", + "format": "date-time" + } + } + } + } + }, + "NocQueryApplicationWebhookFailureToForwardRatioBody": { + "description": "Request for application data in a specific time window.", + "type": "object", + "properties": { + "application_ids": { + "type": "object" + }, + "time_window": { + "description": "Request for data in a specific time window.", + "type": "object", + "properties": { + "from": { + "type": "string", + "format": "date-time" + }, + "limit": { + "description": "Limit the number of results per page.", + "type": "integer", + "format": "int64" + }, + "page": { + "description": "Page number for pagination. 0 is interpreted as 1.", + "type": "integer", + "format": "int64" + }, + "to": { + "type": "string", + "format": "date-time" + } + } + } + } + }, + "NocQueryApplicationWebhookFailureTopFiveBody": { + "description": "Request for end device data using aggregates by time buckets with a specified interval.", + "type": "object", + "properties": { + "application_ids": { + "type": "object" + }, + "time_bucket": { + "description": "Request for data using aggregates by time buckets with a specified interval.", + "type": "object", + "properties": { + "bucket_interval": { + "type": "string" + }, + "from": { + "type": "string", + "format": "date-time" + }, + "limit": { + "description": "Limit the number of results per page.", + "type": "integer", + "format": "int64" + }, + "page": { + "description": "Page number for pagination. 0 is interpreted as 1.", + "type": "integer", + "format": "int64" + }, + "to": { + "type": "string", + "format": "date-time" + } + } + } + } + }, + "NocQueryEndDeviceChannelsLoRaPerformanceBody": { + "description": "Request for end device data using aggregates by time buckets with a specified interval.", + "type": "object", + "properties": { + "end_device_ids": { + "type": "object", + "properties": { + "application_ids": { + "type": "object" + }, + "dev_addr": { + "description": "The LoRaWAN DevAddr.", + "type": "string", + "format": "string", + "example": "2600ABCD" + }, + "dev_eui": { + "description": "The LoRaWAN DevEUI.", + "type": "string", + "format": "string", + "example": "70B3D57ED000ABCD" + }, + "join_eui": { + "description": "The LoRaWAN JoinEUI (AppEUI until LoRaWAN 1.0.3 end devices).", + "type": "string", + "format": "string", + "example": "70B3D57ED000ABCD" + } + } + }, + "time_bucket": { + "description": "Request for data using aggregates by time buckets with a specified interval.", + "type": "object", + "properties": { + "bucket_interval": { + "type": "string" + }, + "from": { + "type": "string", + "format": "date-time" + }, + "limit": { + "description": "Limit the number of results per page.", + "type": "integer", + "format": "int64" + }, + "page": { + "description": "Page number for pagination. 0 is interpreted as 1.", + "type": "integer", + "format": "int64" + }, + "to": { + "type": "string", + "format": "date-time" + } + } + } + } + }, + "NocQueryEndDeviceChannelsPacketCountBody": { + "description": "Request for end device data using aggregates by time buckets with a specified interval.", + "type": "object", + "properties": { + "end_device_ids": { + "type": "object", + "properties": { + "application_ids": { + "type": "object" + }, + "dev_addr": { + "description": "The LoRaWAN DevAddr.", + "type": "string", + "format": "string", + "example": "2600ABCD" + }, + "dev_eui": { + "description": "The LoRaWAN DevEUI.", + "type": "string", + "format": "string", + "example": "70B3D57ED000ABCD" + }, + "join_eui": { + "description": "The LoRaWAN JoinEUI (AppEUI until LoRaWAN 1.0.3 end devices).", + "type": "string", + "format": "string", + "example": "70B3D57ED000ABCD" + } + } + }, + "time_bucket": { + "description": "Request for data using aggregates by time buckets with a specified interval.", + "type": "object", + "properties": { + "bucket_interval": { + "type": "string" + }, + "from": { + "type": "string", + "format": "date-time" + }, + "limit": { + "description": "Limit the number of results per page.", + "type": "integer", + "format": "int64" + }, + "page": { + "description": "Page number for pagination. 0 is interpreted as 1.", + "type": "integer", + "format": "int64" + }, + "to": { + "type": "string", + "format": "date-time" + } + } + } + } + }, + "NocQueryEndDeviceChannelsUtilizationBody": { + "description": "Request for end device data using aggregates by time buckets with a specified interval.", + "type": "object", + "properties": { + "end_device_ids": { + "type": "object", + "properties": { + "application_ids": { + "type": "object" + }, + "dev_addr": { + "description": "The LoRaWAN DevAddr.", + "type": "string", + "format": "string", + "example": "2600ABCD" + }, + "dev_eui": { + "description": "The LoRaWAN DevEUI.", + "type": "string", + "format": "string", + "example": "70B3D57ED000ABCD" + }, + "join_eui": { + "description": "The LoRaWAN JoinEUI (AppEUI until LoRaWAN 1.0.3 end devices).", + "type": "string", + "format": "string", + "example": "70B3D57ED000ABCD" + } + } + }, + "time_bucket": { + "description": "Request for data using aggregates by time buckets with a specified interval.", + "type": "object", + "properties": { + "bucket_interval": { + "type": "string" + }, + "from": { + "type": "string", + "format": "date-time" + }, + "limit": { + "description": "Limit the number of results per page.", + "type": "integer", + "format": "int64" + }, + "page": { + "description": "Page number for pagination. 0 is interpreted as 1.", + "type": "integer", + "format": "int64" + }, + "to": { + "type": "string", + "format": "date-time" + } + } + } + } + }, + "NocQueryEndDeviceDataRatesPacketCountBody": { + "description": "Request for end device data using aggregates by time buckets with a specified interval.", + "type": "object", + "properties": { + "end_device_ids": { + "type": "object", + "properties": { + "application_ids": { + "type": "object" + }, + "dev_addr": { + "description": "The LoRaWAN DevAddr.", + "type": "string", + "format": "string", + "example": "2600ABCD" + }, + "dev_eui": { + "description": "The LoRaWAN DevEUI.", + "type": "string", + "format": "string", + "example": "70B3D57ED000ABCD" + }, + "join_eui": { + "description": "The LoRaWAN JoinEUI (AppEUI until LoRaWAN 1.0.3 end devices).", + "type": "string", + "format": "string", + "example": "70B3D57ED000ABCD" + } + } + }, + "time_bucket": { + "description": "Request for data using aggregates by time buckets with a specified interval.", + "type": "object", + "properties": { + "bucket_interval": { + "type": "string" + }, + "from": { + "type": "string", + "format": "date-time" + }, + "limit": { + "description": "Limit the number of results per page.", + "type": "integer", + "format": "int64" + }, + "page": { + "description": "Page number for pagination. 0 is interpreted as 1.", + "type": "integer", + "format": "int64" + }, + "to": { + "type": "string", + "format": "date-time" + } + } + } + } + }, + "NocQueryEndDeviceLastSeenBody": { + "description": "Request for end device data using aggregates by time buckets with a specified interval.", + "type": "object", + "properties": { + "end_device_ids": { + "type": "object", + "properties": { + "application_ids": { + "type": "object" + }, + "dev_addr": { + "description": "The LoRaWAN DevAddr.", + "type": "string", + "format": "string", + "example": "2600ABCD" + }, + "dev_eui": { + "description": "The LoRaWAN DevEUI.", + "type": "string", + "format": "string", + "example": "70B3D57ED000ABCD" + }, + "join_eui": { + "description": "The LoRaWAN JoinEUI (AppEUI until LoRaWAN 1.0.3 end devices).", + "type": "string", + "format": "string", + "example": "70B3D57ED000ABCD" + } + } + }, + "time_bucket": { + "description": "Request for data using aggregates by time buckets with a specified interval.", + "type": "object", + "properties": { + "bucket_interval": { + "type": "string" + }, + "from": { + "type": "string", + "format": "date-time" + }, + "limit": { + "description": "Limit the number of results per page.", + "type": "integer", + "format": "int64" + }, + "page": { + "description": "Page number for pagination. 0 is interpreted as 1.", + "type": "integer", + "format": "int64" + }, + "to": { + "type": "string", + "format": "date-time" + } + } + } + } + }, + "NocQueryEndDevicePacketErrorRateBody": { + "description": "Request for end device data using aggregates by time buckets with a specified interval.", + "type": "object", + "properties": { + "end_device_ids": { + "type": "object", + "properties": { + "application_ids": { + "type": "object" + }, + "dev_addr": { + "description": "The LoRaWAN DevAddr.", + "type": "string", + "format": "string", + "example": "2600ABCD" + }, + "dev_eui": { + "description": "The LoRaWAN DevEUI.", + "type": "string", + "format": "string", + "example": "70B3D57ED000ABCD" + }, + "join_eui": { + "description": "The LoRaWAN JoinEUI (AppEUI until LoRaWAN 1.0.3 end devices).", + "type": "string", + "format": "string", + "example": "70B3D57ED000ABCD" + } + } + }, + "time_bucket": { + "description": "Request for data using aggregates by time buckets with a specified interval.", + "type": "object", + "properties": { + "bucket_interval": { + "type": "string" + }, + "from": { + "type": "string", + "format": "date-time" + }, + "limit": { + "description": "Limit the number of results per page.", + "type": "integer", + "format": "int64" + }, + "page": { + "description": "Page number for pagination. 0 is interpreted as 1.", + "type": "integer", + "format": "int64" + }, + "to": { + "type": "string", + "format": "date-time" + } + } + } + } + }, + "NocQueryEndDeviceSessionStartBody": { + "description": "Request for end device data using aggregates by time buckets with a specified interval.", + "type": "object", + "properties": { + "end_device_ids": { + "type": "object", + "properties": { + "application_ids": { + "type": "object" + }, + "dev_addr": { + "description": "The LoRaWAN DevAddr.", + "type": "string", + "format": "string", + "example": "2600ABCD" + }, + "dev_eui": { + "description": "The LoRaWAN DevEUI.", + "type": "string", + "format": "string", + "example": "70B3D57ED000ABCD" + }, + "join_eui": { + "description": "The LoRaWAN JoinEUI (AppEUI until LoRaWAN 1.0.3 end devices).", + "type": "string", + "format": "string", + "example": "70B3D57ED000ABCD" + } + } + }, + "time_bucket": { + "description": "Request for data using aggregates by time buckets with a specified interval.", + "type": "object", + "properties": { + "bucket_interval": { + "type": "string" + }, + "from": { + "type": "string", + "format": "date-time" + }, + "limit": { + "description": "Limit the number of results per page.", + "type": "integer", + "format": "int64" + }, + "page": { + "description": "Page number for pagination. 0 is interpreted as 1.", + "type": "integer", + "format": "int64" + }, + "to": { + "type": "string", + "format": "date-time" + } + } + } + } + }, + "NocQueryGatewayChannelsLoRaPerformanceBody": { + "description": "Request for gateway data using aggregates by time buckets with a specified interval.", + "type": "object", + "properties": { + "gateway_ids": { + "type": "object", + "properties": { + "eui": { + "description": "Secondary identifier, which can only be used in specific requests.", + "type": "string", + "format": "string", + "example": "70B3D57ED000ABCD" + } + } + }, + "time_bucket": { + "description": "Request for data using aggregates by time buckets with a specified interval.", + "type": "object", + "properties": { + "bucket_interval": { + "type": "string" + }, + "from": { + "type": "string", + "format": "date-time" + }, + "limit": { + "description": "Limit the number of results per page.", + "type": "integer", + "format": "int64" + }, + "page": { + "description": "Page number for pagination. 0 is interpreted as 1.", + "type": "integer", + "format": "int64" + }, + "to": { + "type": "string", + "format": "date-time" + } + } + } + } + }, + "NocQueryGatewayChannelsPacketCountBody": { + "description": "Request for gateway data using aggregates by time buckets with a specified interval.", + "type": "object", + "properties": { + "gateway_ids": { + "type": "object", + "properties": { + "eui": { + "description": "Secondary identifier, which can only be used in specific requests.", + "type": "string", + "format": "string", + "example": "70B3D57ED000ABCD" + } + } + }, + "time_bucket": { + "description": "Request for data using aggregates by time buckets with a specified interval.", + "type": "object", + "properties": { + "bucket_interval": { + "type": "string" + }, + "from": { + "type": "string", + "format": "date-time" + }, + "limit": { + "description": "Limit the number of results per page.", + "type": "integer", + "format": "int64" + }, + "page": { + "description": "Page number for pagination. 0 is interpreted as 1.", + "type": "integer", + "format": "int64" + }, + "to": { + "type": "string", + "format": "date-time" + } + } + } + } + }, + "NocQueryGatewayChannelsUtilizationBody": { + "description": "Request for gateway data using aggregates by time buckets with a specified interval.", + "type": "object", + "properties": { + "gateway_ids": { + "type": "object", + "properties": { + "eui": { + "description": "Secondary identifier, which can only be used in specific requests.", + "type": "string", + "format": "string", + "example": "70B3D57ED000ABCD" + } + } + }, + "time_bucket": { + "description": "Request for data using aggregates by time buckets with a specified interval.", + "type": "object", + "properties": { + "bucket_interval": { + "type": "string" + }, + "from": { + "type": "string", + "format": "date-time" + }, + "limit": { + "description": "Limit the number of results per page.", + "type": "integer", + "format": "int64" + }, + "page": { + "description": "Page number for pagination. 0 is interpreted as 1.", + "type": "integer", + "format": "int64" + }, + "to": { + "type": "string", + "format": "date-time" + } + } + } + } + }, + "NocQueryGatewayConnectionEventsBody": { + "description": "Request for gateway connection events in a specific time window.", + "type": "object", + "properties": { + "event_type": { + "type": "object", + "properties": { + "value": { + "description": "Gateway connection event type.\n\n - GATEWAY_CONNECTION_EVENT_TYPE_CONNECT: The gateway connects.\n - GATEWAY_CONNECTION_EVENT_TYPE_DISCONNECT: The gateway disconnects.\n - GATEWAY_CONNECTION_EVENT_TYPE_STATS: The gateway connection statistics are updated.", + "type": "string", + "default": "GATEWAY_CONNECTION_EVENT_TYPE_CONNECT", + "enum": [ + "GATEWAY_CONNECTION_EVENT_TYPE_CONNECT", + "GATEWAY_CONNECTION_EVENT_TYPE_DISCONNECT", + "GATEWAY_CONNECTION_EVENT_TYPE_STATS" + ] + } + } + }, + "gateway_time_window": { + "description": "Request for gateway data in a specific time window.", + "type": "object", + "properties": { + "gateway_ids": { + "type": "object", + "properties": { + "eui": { + "description": "Secondary identifier, which can only be used in specific requests.", + "type": "string", + "format": "string", + "example": "70B3D57ED000ABCD" + } + } + }, + "time_window": { + "description": "Request for data in a specific time window.", + "type": "object", + "properties": { + "from": { + "type": "string", + "format": "date-time" + }, + "limit": { + "description": "Limit the number of results per page.", + "type": "integer", + "format": "int64" + }, + "page": { + "description": "Page number for pagination. 0 is interpreted as 1.", + "type": "integer", + "format": "int64" + }, + "to": { + "type": "string", + "format": "date-time" + } + } + } + } + } + } + }, + "NocQueryGatewayDataRatesPacketCountBody": { + "description": "Request for gateway data using aggregates by time buckets with a specified interval.", + "type": "object", + "properties": { + "gateway_ids": { + "type": "object", + "properties": { + "eui": { + "description": "Secondary identifier, which can only be used in specific requests.", + "type": "string", + "format": "string", + "example": "70B3D57ED000ABCD" + } + } + }, + "time_bucket": { + "description": "Request for data using aggregates by time buckets with a specified interval.", + "type": "object", + "properties": { + "bucket_interval": { + "type": "string" + }, + "from": { + "type": "string", + "format": "date-time" + }, + "limit": { + "description": "Limit the number of results per page.", + "type": "integer", + "format": "int64" + }, + "page": { + "description": "Page number for pagination. 0 is interpreted as 1.", + "type": "integer", + "format": "int64" + }, + "to": { + "type": "string", + "format": "date-time" + } + } + } + } + }, + "NocQueryGatewayRTTStatisticsBody": { + "description": "Request for gateway RTT data in a specific time window.", + "type": "object", + "properties": { + "gateway_ids": { + "type": "object", + "properties": { + "eui": { + "description": "Secondary identifier, which can only be used in specific requests.", + "type": "string", + "format": "string", + "example": "70B3D57ED000ABCD" + } + } + }, + "time_bucket": { + "description": "Request for data using aggregates by time buckets with a specified interval.", + "type": "object", + "properties": { + "bucket_interval": { + "type": "string" + }, + "from": { + "type": "string", + "format": "date-time" + }, + "limit": { + "description": "Limit the number of results per page.", + "type": "integer", + "format": "int64" + }, + "page": { + "description": "Page number for pagination. 0 is interpreted as 1.", + "type": "integer", + "format": "int64" + }, + "to": { + "type": "string", + "format": "date-time" + } + } + } + } + }, + "NocQueryGatewayTopNetworksSeenBody": { + "description": "Request for top network seen by a gateway.", + "type": "object", + "properties": { + "gateway_time_window": { + "description": "Request for gateway data in a specific time window.", + "type": "object", + "properties": { + "gateway_ids": { + "type": "object", + "properties": { + "eui": { + "description": "Secondary identifier, which can only be used in specific requests.", + "type": "string", + "format": "string", + "example": "70B3D57ED000ABCD" + } + } + }, + "time_window": { + "description": "Request for data in a specific time window.", + "type": "object", + "properties": { + "from": { + "type": "string", + "format": "date-time" + }, + "limit": { + "description": "Limit the number of results per page.", + "type": "integer", + "format": "int64" + }, + "page": { + "description": "Page number for pagination. 0 is interpreted as 1.", + "type": "integer", + "format": "int64" + }, + "to": { + "type": "string", + "format": "date-time" + } + } + } + } + } + } + }, + "NocQueryGatewayTrafficRatesBody": { + "description": "Request for gateway data using aggregates by time buckets with a specified interval.", + "type": "object", + "properties": { + "gateway_ids": { + "type": "object", + "properties": { + "eui": { + "description": "Secondary identifier, which can only be used in specific requests.", + "type": "string", + "format": "string", + "example": "70B3D57ED000ABCD" + } + } + }, + "time_bucket": { + "description": "Request for data using aggregates by time buckets with a specified interval.", + "type": "object", + "properties": { + "bucket_interval": { + "type": "string" + }, + "from": { + "type": "string", + "format": "date-time" + }, + "limit": { + "description": "Limit the number of results per page.", + "type": "integer", + "format": "int64" + }, + "page": { + "description": "Page number for pagination. 0 is interpreted as 1.", + "type": "integer", + "format": "int64" + }, + "to": { + "type": "string", + "format": "date-time" + } + } + } + } + }, + "NocQueryGatewayUptimeBody": { + "description": "Request for gateway data in a specific time window.", + "type": "object", + "properties": { + "gateway_ids": { + "type": "object", + "properties": { + "eui": { + "description": "Secondary identifier, which can only be used in specific requests.", + "type": "string", + "format": "string", + "example": "70B3D57ED000ABCD" + } + } + }, + "time_window": { + "description": "Request for data in a specific time window.", + "type": "object", + "properties": { + "from": { + "type": "string", + "format": "date-time" + }, + "limit": { + "description": "Limit the number of results per page.", + "type": "integer", + "format": "int64" + }, + "page": { + "description": "Page number for pagination. 0 is interpreted as 1.", + "type": "integer", + "format": "int64" + }, + "to": { + "type": "string", + "format": "date-time" + } + } + } + } + }, + "NotificationServiceUpdateStatusBody": { "type": "object", "properties": { - "application_ids": { - "type": "object" + "ids": { + "description": "The IDs of the notifications to update the status of.", + "type": "array", + "items": { + "type": "string" + } }, - "time_bucket": { - "description": "Request for data using aggregates by time buckets with a specified interval.", + "receiver_ids": { + "description": "The IDs of the receiving user.", "type": "object", + "title": "The IDs of the receiving user.", "properties": { - "bucket_interval": { + "email": { + "description": "Secondary identifier, which can only be used in specific requests.", "type": "string" - }, - "from": { - "type": "string", - "format": "date-time" - }, - "limit": { - "description": "Limit the number of results per page.", - "type": "integer", - "format": "int64" - }, - "page": { - "description": "Page number for pagination. 0 is interpreted as 1.", - "type": "integer", - "format": "int64" - }, - "to": { - "type": "string", - "format": "date-time" } } - } - } - }, - "NocQueryApplicationWebhookFailureToForwardRatioBody": { - "description": "Request for application data in a specific time window.", - "type": "object", - "properties": { - "application_ids": { - "type": "object" }, - "time_window": { - "description": "Request for data in a specific time window.", - "type": "object", - "properties": { - "from": { - "type": "string", - "format": "date-time" - }, - "limit": { - "description": "Limit the number of results per page.", - "type": "integer", - "format": "int64" - }, - "page": { - "description": "Page number for pagination. 0 is interpreted as 1.", - "type": "integer", - "format": "int64" - }, - "to": { - "type": "string", - "format": "date-time" - } - } + "status": { + "type": "string", + "default": "NOTIFICATION_STATUS_UNSEEN", + "enum": [ + "NOTIFICATION_STATUS_UNSEEN", + "NOTIFICATION_STATUS_SEEN", + "NOTIFICATION_STATUS_ARCHIVED" + ] } } }, - "NocQueryApplicationWebhookFailureTopFiveBody": { - "description": "Request for end device data using aggregates by time buckets with a specified interval.", + "NsEndDeviceBatchRegistrySetMACSettingsProfileBody": { "type": "object", "properties": { "application_ids": { "type": "object" }, - "time_bucket": { - "description": "Request for data using aggregates by time buckets with a specified interval.", - "type": "object", - "properties": { - "bucket_interval": { - "type": "string" - }, - "from": { - "type": "string", - "format": "date-time" - }, - "limit": { - "description": "Limit the number of results per page.", - "type": "integer", - "format": "int64" - }, - "page": { - "description": "Page number for pagination. 0 is interpreted as 1.", - "type": "integer", - "format": "int64" - }, - "to": { - "type": "string", - "format": "date-time" - } - } - } - } - }, - "NocQueryEndDeviceChannelsLoRaPerformanceBody": { - "description": "Request for end device data using aggregates by time buckets with a specified interval.", - "type": "object", - "properties": { - "end_device_ids": { - "type": "object", - "properties": { - "application_ids": { - "type": "object" - }, - "dev_addr": { - "description": "The LoRaWAN DevAddr.", - "type": "string", - "format": "string", - "example": "2600ABCD" - }, - "dev_eui": { - "description": "The LoRaWAN DevEUI.", - "type": "string", - "format": "string", - "example": "70B3D57ED000ABCD" - }, - "join_eui": { - "description": "The LoRaWAN JoinEUI (AppEUI until LoRaWAN 1.0.3 end devices).", - "type": "string", - "format": "string", - "example": "70B3D57ED000ABCD" - } - } - }, - "time_bucket": { - "description": "Request for data using aggregates by time buckets with a specified interval.", - "type": "object", - "properties": { - "bucket_interval": { - "type": "string" - }, - "from": { - "type": "string", - "format": "date-time" - }, - "limit": { - "description": "Limit the number of results per page.", - "type": "integer", - "format": "int64" - }, - "page": { - "description": "Page number for pagination. 0 is interpreted as 1.", - "type": "integer", - "format": "int64" - }, - "to": { - "type": "string", - "format": "date-time" - } - } - } - } - }, - "NocQueryEndDeviceChannelsPacketCountBody": { - "description": "Request for end device data using aggregates by time buckets with a specified interval.", - "type": "object", - "properties": { - "end_device_ids": { - "type": "object", - "properties": { - "application_ids": { - "type": "object" - }, - "dev_addr": { - "description": "The LoRaWAN DevAddr.", - "type": "string", - "format": "string", - "example": "2600ABCD" - }, - "dev_eui": { - "description": "The LoRaWAN DevEUI.", - "type": "string", - "format": "string", - "example": "70B3D57ED000ABCD" - }, - "join_eui": { - "description": "The LoRaWAN JoinEUI (AppEUI until LoRaWAN 1.0.3 end devices).", - "type": "string", - "format": "string", - "example": "70B3D57ED000ABCD" - } - } - }, - "time_bucket": { - "description": "Request for data using aggregates by time buckets with a specified interval.", - "type": "object", - "properties": { - "bucket_interval": { - "type": "string" - }, - "from": { - "type": "string", - "format": "date-time" - }, - "limit": { - "description": "Limit the number of results per page.", - "type": "integer", - "format": "int64" - }, - "page": { - "description": "Page number for pagination. 0 is interpreted as 1.", - "type": "integer", - "format": "int64" - }, - "to": { - "type": "string", - "format": "date-time" - } - } - } - } - }, - "NocQueryEndDeviceChannelsUtilizationBody": { - "description": "Request for end device data using aggregates by time buckets with a specified interval.", - "type": "object", - "properties": { - "end_device_ids": { - "type": "object", - "properties": { - "application_ids": { - "type": "object" - }, - "dev_addr": { - "description": "The LoRaWAN DevAddr.", - "type": "string", - "format": "string", - "example": "2600ABCD" - }, - "dev_eui": { - "description": "The LoRaWAN DevEUI.", - "type": "string", - "format": "string", - "example": "70B3D57ED000ABCD" - }, - "join_eui": { - "description": "The LoRaWAN JoinEUI (AppEUI until LoRaWAN 1.0.3 end devices).", - "type": "string", - "format": "string", - "example": "70B3D57ED000ABCD" - } - } - }, - "time_bucket": { - "description": "Request for data using aggregates by time buckets with a specified interval.", - "type": "object", - "properties": { - "bucket_interval": { - "type": "string" - }, - "from": { - "type": "string", - "format": "date-time" - }, - "limit": { - "description": "Limit the number of results per page.", - "type": "integer", - "format": "int64" - }, - "page": { - "description": "Page number for pagination. 0 is interpreted as 1.", - "type": "integer", - "format": "int64" - }, - "to": { - "type": "string", - "format": "date-time" - } - } - } - } - }, - "NocQueryEndDeviceDataRatesPacketCountBody": { - "description": "Request for end device data using aggregates by time buckets with a specified interval.", - "type": "object", - "properties": { - "end_device_ids": { - "type": "object", - "properties": { - "application_ids": { - "type": "object" - }, - "dev_addr": { - "description": "The LoRaWAN DevAddr.", - "type": "string", - "format": "string", - "example": "2600ABCD" - }, - "dev_eui": { - "description": "The LoRaWAN DevEUI.", - "type": "string", - "format": "string", - "example": "70B3D57ED000ABCD" - }, - "join_eui": { - "description": "The LoRaWAN JoinEUI (AppEUI until LoRaWAN 1.0.3 end devices).", - "type": "string", - "format": "string", - "example": "70B3D57ED000ABCD" - } - } - }, - "time_bucket": { - "description": "Request for data using aggregates by time buckets with a specified interval.", - "type": "object", - "properties": { - "bucket_interval": { - "type": "string" - }, - "from": { - "type": "string", - "format": "date-time" - }, - "limit": { - "description": "Limit the number of results per page.", - "type": "integer", - "format": "int64" - }, - "page": { - "description": "Page number for pagination. 0 is interpreted as 1.", - "type": "integer", - "format": "int64" - }, - "to": { - "type": "string", - "format": "date-time" - } - } - } - } - }, - "NocQueryEndDeviceLastSeenBody": { - "description": "Request for end device data using aggregates by time buckets with a specified interval.", - "type": "object", - "properties": { - "end_device_ids": { - "type": "object", - "properties": { - "application_ids": { - "type": "object" - }, - "dev_addr": { - "description": "The LoRaWAN DevAddr.", - "type": "string", - "format": "string", - "example": "2600ABCD" - }, - "dev_eui": { - "description": "The LoRaWAN DevEUI.", - "type": "string", - "format": "string", - "example": "70B3D57ED000ABCD" - }, - "join_eui": { - "description": "The LoRaWAN JoinEUI (AppEUI until LoRaWAN 1.0.3 end devices).", - "type": "string", - "format": "string", - "example": "70B3D57ED000ABCD" - } - } - }, - "time_bucket": { - "description": "Request for data using aggregates by time buckets with a specified interval.", - "type": "object", - "properties": { - "bucket_interval": { - "type": "string" - }, - "from": { - "type": "string", - "format": "date-time" - }, - "limit": { - "description": "Limit the number of results per page.", - "type": "integer", - "format": "int64" - }, - "page": { - "description": "Page number for pagination. 0 is interpreted as 1.", - "type": "integer", - "format": "int64" - }, - "to": { - "type": "string", - "format": "date-time" - } - } - } - } - }, - "NocQueryEndDevicePacketErrorRateBody": { - "description": "Request for end device data using aggregates by time buckets with a specified interval.", - "type": "object", - "properties": { - "end_device_ids": { - "type": "object", - "properties": { - "application_ids": { - "type": "object" - }, - "dev_addr": { - "description": "The LoRaWAN DevAddr.", - "type": "string", - "format": "string", - "example": "2600ABCD" - }, - "dev_eui": { - "description": "The LoRaWAN DevEUI.", - "type": "string", - "format": "string", - "example": "70B3D57ED000ABCD" - }, - "join_eui": { - "description": "The LoRaWAN JoinEUI (AppEUI until LoRaWAN 1.0.3 end devices).", - "type": "string", - "format": "string", - "example": "70B3D57ED000ABCD" - } + "device_ids": { + "type": "array", + "items": { + "type": "string" } }, - "time_bucket": { - "description": "Request for data using aggregates by time buckets with a specified interval.", - "type": "object", - "properties": { - "bucket_interval": { - "type": "string" - }, - "from": { - "type": "string", - "format": "date-time" - }, - "limit": { - "description": "Limit the number of results per page.", - "type": "integer", - "format": "int64" - }, - "page": { - "description": "Page number for pagination. 0 is interpreted as 1.", - "type": "integer", - "format": "int64" - }, - "to": { - "type": "string", - "format": "date-time" - } - } - } - } - }, - "NocQueryEndDeviceSessionStartBody": { - "description": "Request for end device data using aggregates by time buckets with a specified interval.", - "type": "object", - "properties": { - "end_device_ids": { + "mac_settings_profile_ids": { "type": "object", "properties": { "application_ids": { - "type": "object" - }, - "dev_addr": { - "description": "The LoRaWAN DevAddr.", - "type": "string", - "format": "string", - "example": "2600ABCD" - }, - "dev_eui": { - "description": "The LoRaWAN DevEUI.", - "type": "string", - "format": "string", - "example": "70B3D57ED000ABCD" - }, - "join_eui": { - "description": "The LoRaWAN JoinEUI (AppEUI until LoRaWAN 1.0.3 end devices).", - "type": "string", - "format": "string", - "example": "70B3D57ED000ABCD" - } - } - }, - "time_bucket": { - "description": "Request for data using aggregates by time buckets with a specified interval.", - "type": "object", - "properties": { - "bucket_interval": { - "type": "string" - }, - "from": { - "type": "string", - "format": "date-time" - }, - "limit": { - "description": "Limit the number of results per page.", - "type": "integer", - "format": "int64" - }, - "page": { - "description": "Page number for pagination. 0 is interpreted as 1.", - "type": "integer", - "format": "int64" - }, - "to": { - "type": "string", - "format": "date-time" - } - } - } - } - }, - "NocQueryGatewayChannelsLoRaPerformanceBody": { - "description": "Request for gateway data using aggregates by time buckets with a specified interval.", - "type": "object", - "properties": { - "gateway_ids": { - "type": "object", - "properties": { - "eui": { - "description": "Secondary identifier, which can only be used in specific requests.", - "type": "string", - "format": "string", - "example": "70B3D57ED000ABCD" - } - } - }, - "time_bucket": { - "description": "Request for data using aggregates by time buckets with a specified interval.", - "type": "object", - "properties": { - "bucket_interval": { - "type": "string" - }, - "from": { - "type": "string", - "format": "date-time" - }, - "limit": { - "description": "Limit the number of results per page.", - "type": "integer", - "format": "int64" - }, - "page": { - "description": "Page number for pagination. 0 is interpreted as 1.", - "type": "integer", - "format": "int64" - }, - "to": { - "type": "string", - "format": "date-time" - } - } - } - } - }, - "NocQueryGatewayChannelsPacketCountBody": { - "description": "Request for gateway data using aggregates by time buckets with a specified interval.", - "type": "object", - "properties": { - "gateway_ids": { - "type": "object", - "properties": { - "eui": { - "description": "Secondary identifier, which can only be used in specific requests.", - "type": "string", - "format": "string", - "example": "70B3D57ED000ABCD" - } - } - }, - "time_bucket": { - "description": "Request for data using aggregates by time buckets with a specified interval.", - "type": "object", - "properties": { - "bucket_interval": { - "type": "string" - }, - "from": { - "type": "string", - "format": "date-time" - }, - "limit": { - "description": "Limit the number of results per page.", - "type": "integer", - "format": "int64" - }, - "page": { - "description": "Page number for pagination. 0 is interpreted as 1.", - "type": "integer", - "format": "int64" - }, - "to": { - "type": "string", - "format": "date-time" - } - } - } - } - }, - "NocQueryGatewayChannelsUtilizationBody": { - "description": "Request for gateway data using aggregates by time buckets with a specified interval.", - "type": "object", - "properties": { - "gateway_ids": { - "type": "object", - "properties": { - "eui": { - "description": "Secondary identifier, which can only be used in specific requests.", - "type": "string", - "format": "string", - "example": "70B3D57ED000ABCD" - } - } - }, - "time_bucket": { - "description": "Request for data using aggregates by time buckets with a specified interval.", - "type": "object", - "properties": { - "bucket_interval": { - "type": "string" - }, - "from": { - "type": "string", - "format": "date-time" - }, - "limit": { - "description": "Limit the number of results per page.", - "type": "integer", - "format": "int64" - }, - "page": { - "description": "Page number for pagination. 0 is interpreted as 1.", - "type": "integer", - "format": "int64" - }, - "to": { - "type": "string", - "format": "date-time" - } - } - } - } - }, - "NocQueryGatewayConnectionEventsBody": { - "description": "Request for gateway connection events in a specific time window.", - "type": "object", - "properties": { - "event_type": { - "type": "object", - "properties": { - "value": { - "description": "Gateway connection event type.\n\n - GATEWAY_CONNECTION_EVENT_TYPE_CONNECT: The gateway connects.\n - GATEWAY_CONNECTION_EVENT_TYPE_DISCONNECT: The gateway disconnects.\n - GATEWAY_CONNECTION_EVENT_TYPE_STATS: The gateway connection statistics are updated.", - "type": "string", - "default": "GATEWAY_CONNECTION_EVENT_TYPE_CONNECT", - "enum": [ - "GATEWAY_CONNECTION_EVENT_TYPE_CONNECT", - "GATEWAY_CONNECTION_EVENT_TYPE_DISCONNECT", - "GATEWAY_CONNECTION_EVENT_TYPE_STATS" - ] - } - } - }, - "gateway_time_window": { - "description": "Request for gateway data in a specific time window.", - "type": "object", - "properties": { - "gateway_ids": { - "type": "object", - "properties": { - "eui": { - "description": "Secondary identifier, which can only be used in specific requests.", - "type": "string", - "format": "string", - "example": "70B3D57ED000ABCD" - } - } - }, - "time_window": { - "description": "Request for data in a specific time window.", "type": "object", "properties": { - "from": { - "type": "string", - "format": "date-time" - }, - "limit": { - "description": "Limit the number of results per page.", - "type": "integer", - "format": "int64" - }, - "page": { - "description": "Page number for pagination. 0 is interpreted as 1.", - "type": "integer", - "format": "int64" - }, - "to": { - "type": "string", - "format": "date-time" - } - } - } - } - } - } - }, - "NocQueryGatewayDataRatesPacketCountBody": { - "description": "Request for gateway data using aggregates by time buckets with a specified interval.", - "type": "object", - "properties": { - "gateway_ids": { - "type": "object", - "properties": { - "eui": { - "description": "Secondary identifier, which can only be used in specific requests.", - "type": "string", - "format": "string", - "example": "70B3D57ED000ABCD" - } - } - }, - "time_bucket": { - "description": "Request for data using aggregates by time buckets with a specified interval.", - "type": "object", - "properties": { - "bucket_interval": { - "type": "string" - }, - "from": { - "type": "string", - "format": "date-time" - }, - "limit": { - "description": "Limit the number of results per page.", - "type": "integer", - "format": "int64" - }, - "page": { - "description": "Page number for pagination. 0 is interpreted as 1.", - "type": "integer", - "format": "int64" - }, - "to": { - "type": "string", - "format": "date-time" - } - } - } - } - }, - "NocQueryGatewayRTTStatisticsBody": { - "description": "Request for gateway RTT data in a specific time window.", - "type": "object", - "properties": { - "gateway_ids": { - "type": "object", - "properties": { - "eui": { - "description": "Secondary identifier, which can only be used in specific requests.", - "type": "string", - "format": "string", - "example": "70B3D57ED000ABCD" - } - } - }, - "time_bucket": { - "description": "Request for data using aggregates by time buckets with a specified interval.", - "type": "object", - "properties": { - "bucket_interval": { - "type": "string" - }, - "from": { - "type": "string", - "format": "date-time" - }, - "limit": { - "description": "Limit the number of results per page.", - "type": "integer", - "format": "int64" - }, - "page": { - "description": "Page number for pagination. 0 is interpreted as 1.", - "type": "integer", - "format": "int64" - }, - "to": { - "type": "string", - "format": "date-time" - } - } - } - } - }, - "NocQueryGatewayTopNetworksSeenBody": { - "description": "Request for top network seen by a gateway.", - "type": "object", - "properties": { - "gateway_time_window": { - "description": "Request for gateway data in a specific time window.", - "type": "object", - "properties": { - "gateway_ids": { - "type": "object", - "properties": { - "eui": { - "description": "Secondary identifier, which can only be used in specific requests.", - "type": "string", - "format": "string", - "example": "70B3D57ED000ABCD" - } - } - }, - "time_window": { - "description": "Request for data in a specific time window.", - "type": "object", - "properties": { - "from": { - "type": "string", - "format": "date-time" - }, - "limit": { - "description": "Limit the number of results per page.", - "type": "integer", - "format": "int64" - }, - "page": { - "description": "Page number for pagination. 0 is interpreted as 1.", - "type": "integer", - "format": "int64" - }, - "to": { - "type": "string", - "format": "date-time" + "application_id": { + "type": "string" } } - } - } - } - } - }, - "NocQueryGatewayTrafficRatesBody": { - "description": "Request for gateway data using aggregates by time buckets with a specified interval.", - "type": "object", - "properties": { - "gateway_ids": { - "type": "object", - "properties": { - "eui": { - "description": "Secondary identifier, which can only be used in specific requests.", - "type": "string", - "format": "string", - "example": "70B3D57ED000ABCD" - } - } - }, - "time_bucket": { - "description": "Request for data using aggregates by time buckets with a specified interval.", - "type": "object", - "properties": { - "bucket_interval": { - "type": "string" - }, - "from": { - "type": "string", - "format": "date-time" }, - "limit": { - "description": "Limit the number of results per page.", - "type": "integer", - "format": "int64" - }, - "page": { - "description": "Page number for pagination. 0 is interpreted as 1.", - "type": "integer", - "format": "int64" - }, - "to": { - "type": "string", - "format": "date-time" - } - } - } - } - }, - "NocQueryGatewayUptimeBody": { - "description": "Request for gateway data in a specific time window.", - "type": "object", - "properties": { - "gateway_ids": { - "type": "object", - "properties": { - "eui": { - "description": "Secondary identifier, which can only be used in specific requests.", - "type": "string", - "format": "string", - "example": "70B3D57ED000ABCD" - } - } - }, - "time_window": { - "description": "Request for data in a specific time window.", - "type": "object", - "properties": { - "from": { - "type": "string", - "format": "date-time" - }, - "limit": { - "description": "Limit the number of results per page.", - "type": "integer", - "format": "int64" - }, - "page": { - "description": "Page number for pagination. 0 is interpreted as 1.", - "type": "integer", - "format": "int64" - }, - "to": { - "type": "string", - "format": "date-time" - } - } - } - } - }, - "NotificationServiceUpdateStatusBody": { - "type": "object", - "properties": { - "ids": { - "description": "The IDs of the notifications to update the status of.", - "type": "array", - "items": { - "type": "string" - } - }, - "receiver_ids": { - "description": "The IDs of the receiving user.", - "type": "object", - "title": "The IDs of the receiving user.", - "properties": { - "email": { - "description": "Secondary identifier, which can only be used in specific requests.", + "profile_id": { + "description": "Profile ID.", "type": "string" } } - }, - "status": { - "type": "string", - "default": "NOTIFICATION_STATUS_UNSEEN", - "enum": [ - "NOTIFICATION_STATUS_UNSEEN", - "NOTIFICATION_STATUS_SEEN", - "NOTIFICATION_STATUS_ARCHIVED" - ] } } }, @@ -577539,6 +590481,9 @@ "client_secret": { "type": "string" }, + "preferred_response_type": { + "type": "string" + }, "provider_url": { "type": "string" } @@ -577579,6 +590524,9 @@ "client_secret": { "type": "string" }, + "preferred_response_type": { + "type": "string" + }, "provider_url": { "type": "string" } @@ -577625,6 +590573,9 @@ "client_secret": { "type": "string" }, + "preferred_response_type": { + "type": "string" + }, "provider_url": { "type": "string" } @@ -577680,6 +590631,9 @@ "client_secret": { "type": "string" }, + "preferred_response_type": { + "type": "string" + }, "provider_url": { "type": "string" } @@ -581318,6 +594272,9 @@ "client_secret": { "type": "string" }, + "preferred_response_type": { + "type": "string" + }, "provider_url": { "type": "string" }