{ "$schema": "http://json-schema.org/draft-07/schema#", "$id": "https://api-evangelist.github.io/the-things-network/json-schema/the-things-stack-end-device-schema.json", "title": "v3EndDevice", "description": "JSON Schema for v3EndDevice, extracted from The Things Stack v3.36 api.swagger.json", "definitions": { "v3EndDevice": { "type": "object", "properties": { "ids": { "$ref": "#/definitions/v3EndDeviceIdentifiers" }, "created_at": { "type": "string", "format": "date-time" }, "updated_at": { "type": "string", "format": "date-time" }, "name": { "type": "string", "description": "Friendly name of the device. Stored in Entity Registry." }, "description": { "type": "string", "description": "Description of the device. Stored in Entity Registry." }, "attributes": { "type": "object", "additionalProperties": { "type": "string" }, "description": "Key-value attributes for this end device. Typically used for organizing end devices or for storing integration-specific data. Stored in Entity Registry." }, "version_ids": { "$ref": "#/definitions/v3EndDeviceVersionIdentifiers", "description": "Version Identifiers. Stored in Entity Registry, Network Server and Application Server." }, "service_profile_id": { "type": "string", "description": "Default service profile. Stored in Entity Registry." }, "network_server_address": { "type": "string", "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." }, "network_server_kek_label": { "type": "string", "description": "The KEK label of the Network Server to use for wrapping network session keys.\nStored in Join Server." }, "application_server_address": { "type": "string", "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." }, "application_server_kek_label": { "type": "string", "description": "The KEK label of the Application Server to use for wrapping the application session key.\nStored in Join Server." }, "application_server_id": { "type": "string", "description": "The AS-ID of the Application Server to use.\nStored in Join Server." }, "join_server_address": { "type": "string", "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." }, "locations": { "type": "object", "additionalProperties": { "$ref": "#/definitions/lorawanv3Location" }, "description": "Location of the device. Stored in Entity Registry." }, "picture": { "$ref": "#/definitions/v3Picture", "description": "Stored in Entity Registry." }, "supports_class_b": { "type": "boolean", "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." }, "supports_class_c": { "type": "boolean", "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." }, "lorawan_version": { "$ref": "#/definitions/v3MACVersion", "description": "LoRaWAN MAC version. 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." }, "lorawan_phy_version": { "$ref": "#/definitions/v3PHYVersion", "description": "LoRaWAN PHY version. 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." }, "frequency_plan_id": { "type": "string", "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." }, "min_frequency": { "type": "string", "format": "uint64", "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." }, "max_frequency": { "type": "string", "format": "uint64", "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." }, "supports_join": { "type": "boolean", "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." }, "resets_join_nonces": { "type": "boolean", "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." }, "root_keys": { "$ref": "#/definitions/v3RootKeys", "description": "Device root keys. Stored in Join Server." }, "net_id": { "type": "string", "format": "string", "example": "000013", "description": "Home NetID. Stored in Join Server." }, "mac_settings": { "$ref": "#/definitions/v3MACSettings", "description": "Settings for how the Network Server handles MAC layer for this device. Stored in Network Server.\nMutually exclusive with MAC settings profile." }, "mac_state": { "$ref": "#/definitions/v3MACState", "description": "MAC state of the device. Stored in Network Server." }, "pending_mac_state": { "$ref": "#/definitions/v3MACState", "description": "Pending MAC state of the device. Stored in Network Server." }, "session": { "$ref": "#/definitions/v3Session", "description": "Current session of the device. Stored in Network Server and Application Server." }, "pending_session": { "$ref": "#/definitions/v3Session", "description": "Pending session. Stored in Network Server and Application Server until RekeyInd is received." }, "last_dev_nonce": { "type": "integer", "format": "int64", "description": "Last DevNonce used.\nThis field is only used for devices using LoRaWAN version 1.1 and later.\nStored in Join Server." }, "used_dev_nonces": { "type": "array", "items": { "type": "integer", "format": "int64" }, "description": "Used DevNonces sorted in ascending order.\nThis field is only used for devices using LoRaWAN versions preceding 1.1.\nStored in Join Server." }, "last_join_nonce": { "type": "integer", "format": "int64", "description": "Last JoinNonce/AppNonce(for devices using LoRaWAN versions preceding 1.1) used.\nStored in Join Server." }, "last_rj_count_0": { "type": "integer", "format": "int64", "description": "Last Rejoin counter value used (type 0/2).\nStored in Join Server." }, "last_rj_count_1": { "type": "integer", "format": "int64", "description": "Last Rejoin counter value used (type 1).\nStored in Join Server." }, "last_dev_status_received_at": { "type": "string", "format": "date-time", "description": "Time when last DevStatus MAC command was received.\nStored in Network Server." }, "power_state": { "$ref": "#/definitions/v3PowerState", "description": "The power state of the device; whether it is battery-powered or connected to an external power source.\nReceived via the DevStatus MAC command at status_received_at.\nStored in Network Server." }, "battery_percentage": { "type": "number", "format": "float", "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." }, "downlink_margin": { "type": "integer", "format": "int32", "description": "Demodulation signal-to-noise ratio (dB).\nReceived via the DevStatus MAC command at last_dev_status_received_at.\nStored in Network Server." }, "queued_application_downlinks": { "type": "array", "items": { "type": "object", "$ref": "#/definitions/v3ApplicationDownlink" }, "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." }, "formatters": { "$ref": "#/definitions/v3MessagePayloadFormatters", "description": "The payload formatters for this end device. Stored in Application Server.\nCopied on creation from template identified by version_ids." }, "provisioner_id": { "type": "string", "description": "ID of the provisioner. Stored in Join Server." }, "provisioning_data": { "type": "object", "description": "Vendor-specific provisioning data. Stored in Join Server." }, "multicast": { "type": "boolean", "description": "Indicates whether this device represents a multicast group." }, "claim_authentication_code": { "$ref": "#/definitions/v3EndDeviceAuthenticationCode", "description": "Authentication code to claim ownership of the end device.\nFrom TTS v3.21.0 this field is stored in the Identity Server.\nFor TTS versions < 3.21.0, this field is stored in the Join Server.\nThe value stored on the Identity Server takes precedence." }, "skip_payload_crypto": { "type": "boolean", "description": "Skip decryption of uplink payloads and encryption of downlink payloads.\nThis field is deprecated, use skip_payload_crypto_override instead." }, "skip_payload_crypto_override": { "type": "boolean", "description": "Skip decryption of uplink payloads and encryption of downlink payloads.\nThis field overrides the application-level setting." }, "activated_at": { "type": "string", "format": "date-time", "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." }, "last_seen_at": { "type": "string", "format": "date-time", "description": "Timestamp when a device uplink has been last observed.\nThis field is set by the Application Server and stored in the Identity Server." }, "serial_number": { "type": "string" }, "lora_alliance_profile_ids": { "$ref": "#/definitions/v3LoRaAllianceProfileIdentifiers" }, "mac_settings_profile_ids": { "$ref": "#/definitions/v3MACSettingsProfileIdentifiers", "description": "MAC settings profile identifiers.\nMutually exclusive with MAC settings." } }, "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." }, "v3EndDeviceIdentifiers": { "type": "object", "properties": { "device_id": { "type": "string" }, "application_ids": { "$ref": "#/definitions/v3ApplicationIdentifiers" }, "dev_eui": { "type": "string", "format": "string", "example": "70B3D57ED000ABCD", "description": "The LoRaWAN DevEUI." }, "join_eui": { "type": "string", "format": "string", "example": "70B3D57ED000ABCD", "description": "The LoRaWAN JoinEUI (AppEUI until LoRaWAN 1.0.3 end devices)." }, "dev_addr": { "type": "string", "format": "string", "example": "2600ABCD", "description": "The LoRaWAN DevAddr." } } }, "v3ApplicationIdentifiers": { "type": "object", "properties": { "application_id": { "type": "string" } } }, "v3PHYVersion": { "type": "string", "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" ], "default": "PHY_UNKNOWN" }, "v3MACState": { "type": "object", "properties": { "current_parameters": { "$ref": "#/definitions/v3MACParameters", "description": "Current LoRaWAN MAC parameters." }, "desired_parameters": { "$ref": "#/definitions/v3MACParameters", "description": "Desired LoRaWAN MAC parameters." }, "device_class": { "$ref": "#/definitions/v3Class", "title": "Currently active LoRaWAN device class\n- Device class is A by default\n- If device sets ClassB bit in uplink, this will be set to B\n- If device sent DeviceModeInd MAC message, this will be set to that value" }, "lorawan_version": { "$ref": "#/definitions/v3MACVersion", "description": "LoRaWAN MAC version." }, "last_confirmed_downlink_at": { "type": "string", "format": "date-time", "description": "Time when the last confirmed downlink message or MAC command was scheduled." }, "last_dev_status_f_cnt_up": { "type": "integer", "format": "int64", "description": "Frame counter value of last uplink containing DevStatusAns." }, "ping_slot_periodicity": { "$ref": "#/definitions/v3PingSlotPeriodValue", "description": "Periodicity of the class B ping slot." }, "pending_application_downlink": { "$ref": "#/definitions/v3ApplicationDownlink", "description": "A confirmed application downlink, for which an acknowledgment is expected to arrive." }, "queued_responses": { "type": "array", "items": { "type": "object", "$ref": "#/definitions/v3MACCommand" }, "description": "Queued MAC responses.\nRegenerated on each uplink." }, "pending_requests": { "type": "array", "items": { "type": "object", "$ref": "#/definitions/v3MACCommand" }, "description": "Pending MAC requests(i.e. sent requests, for which no response has been received yet).\nRegenerated on each downlink." }, "queued_join_accept": { "$ref": "#/definitions/MACStateJoinAccept", "description": "Queued join-accept.\nSet each time a (re-)join request accept is received from Join Server and removed each time a downlink is scheduled." }, "pending_join_request": { "$ref": "#/definitions/v3MACStateJoinRequest", "description": "Pending join request.\nSet each time a join-accept is scheduled and removed each time an uplink is received from the device." }, "rx_windows_available": { "type": "boolean", "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." }, "recent_uplinks": { "type": "array", "items": { "type": "object", "$ref": "#/definitions/v3MACStateUplinkMessage" }, "description": "Recent data uplink messages sorted by time.\nThe number of messages stored may depend on configuration." }, "recent_downlinks": { "type": "array", "items": { "type": "object", "$ref": "#/definitions/v3MACStateDownlinkMessage" }, "description": "Recent data downlink messages sorted by time.\nThe number of messages stored may depend on configuration." }, "last_network_initiated_downlink_at": { "type": "string", "format": "date-time", "description": "Time when the last network-initiated downlink message was scheduled." }, "rejected_adr_data_rate_indexes": { "type": "array", "items": { "$ref": "#/definitions/v3DataRateIndex" }, "description": "ADR Data rate index values rejected by the device.\nReset each time `current_parameters.channels` change.\nElements are sorted in ascending order." }, "rejected_adr_tx_power_indexes": { "type": "array", "items": { "type": "integer", "format": "int64" }, "description": "ADR TX output power index values rejected by the device.\nElements are sorted in ascending order." }, "rejected_frequencies": { "type": "array", "items": { "type": "string", "format": "uint64" }, "description": "Frequencies rejected by the device." }, "last_downlink_at": { "type": "string", "format": "date-time", "description": "Time when the last downlink message was scheduled." }, "rejected_data_rate_ranges": { "type": "object", "additionalProperties": { "$ref": "#/definitions/MACStateDataRateRanges" }, "description": "Data rate ranges rejected by the device per frequency." }, "last_adr_change_f_cnt_up": { "type": "integer", "format": "int64", "description": "Frame counter of uplink, which confirmed the last ADR parameter change." }, "recent_mac_command_identifiers": { "type": "array", "items": { "$ref": "#/definitions/v3MACCommandIdentifier" }, "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." }, "pending_relay_downlink": { "$ref": "#/definitions/v3RelayForwardDownlinkReq", "description": "Pending relay downlink contents.\nThe pending downlink will be scheduled to the relay in either Rx1 or Rx2.\nThe pending downlink will be cleared after the scheduling attempt." } }, "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." }, "MACStateJoinAccept": { "type": "object", "properties": { "payload": { "type": "string", "format": "byte", "description": "Payload of the join-accept received from Join Server." }, "request": { "$ref": "#/definitions/v3MACStateJoinRequest" }, "keys": { "$ref": "#/definitions/v3SessionKeys", "description": "Network session keys associated with the join." }, "correlation_ids": { "type": "array", "items": { "type": "string" } }, "dev_addr": { "type": "string", "format": "string", "example": "2600ABCD" }, "net_id": { "type": "string", "format": "string", "example": "000013" } } }, "v3SessionKeys": { "type": "object", "properties": { "session_key_id": { "type": "string", "format": "byte", "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." }, "f_nwk_s_int_key": { "$ref": "#/definitions/v3KeyEnvelope", "description": "The (encrypted) Forwarding Network Session Integrity Key (or Network Session Key in 1.0 compatibility mode).\nThis key is stored by the (forwarding) Network Server." }, "s_nwk_s_int_key": { "$ref": "#/definitions/v3KeyEnvelope", "description": "The (encrypted) Serving Network Session Integrity Key.\nThis key is stored by the (serving) Network Server." }, "nwk_s_enc_key": { "$ref": "#/definitions/v3KeyEnvelope", "description": "The (encrypted) Network Session Encryption Key.\nThis key is stored by the (serving) Network Server." }, "app_s_key": { "$ref": "#/definitions/v3KeyEnvelope", "description": "The (encrypted) Application Session Key.\nThis key is stored by the Application Server." } }, "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." }, "v3KeyEnvelope": { "type": "object", "properties": { "key": { "type": "string", "format": "string", "example": "0123456789ABCDEF0123456789ABCDEF", "description": "The unencrypted AES key." }, "kek_label": { "type": "string", "description": "The label of the RFC 3394 key-encryption-key (KEK) that was used to encrypt the key." }, "encrypted_key": { "type": "string", "format": "byte" } } }, "v3MACStateJoinRequest": { "type": "object", "properties": { "downlink_settings": { "$ref": "#/definitions/v3DLSettings" }, "rx_delay": { "$ref": "#/definitions/v3RxDelay" }, "cf_list": { "$ref": "#/definitions/v3CFList" } } }, "v3CFList": { "type": "object", "properties": { "type": { "$ref": "#/definitions/v3CFListType" }, "freq": { "type": "array", "items": { "type": "integer", "format": "int64" }, "description": "Frequencies to be broadcasted, in hecto-Hz.\nThese values are broadcasted as 24 bits unsigned integers.\nThis field should not contain default values." }, "ch_masks": { "type": "array", "items": { "type": "boolean" }, "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." } } }, "v3CFListType": { "type": "string", "enum": [ "FREQUENCIES", "CHANNEL_MASKS" ], "default": "FREQUENCIES" }, "v3RxDelay": { "type": "string", "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" ], "default": "RX_DELAY_0", "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." }, "v3DLSettings": { "type": "object", "properties": { "rx1_dr_offset": { "$ref": "#/definitions/v3DataRateOffset" }, "rx2_dr": { "$ref": "#/definitions/v3DataRateIndex" }, "opt_neg": { "type": "boolean", "description": "OptNeg is set if Network Server implements LoRaWAN 1.1 or greater." } } }, "v3DataRateOffset": { "type": "string", "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" ], "default": "DATA_RATE_OFFSET_0" }, "v3DataRateIndex": { "type": "string", "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" ], "default": "DATA_RATE_0" }, "v3MACVersion": { "type": "string", "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" ], "default": "MAC_UNKNOWN" }, "v3Class": { "type": "string", "enum": [ "CLASS_A", "CLASS_B", "CLASS_C" ], "default": "CLASS_A" }, "v3MACStateUplinkMessage": { "type": "object", "properties": { "payload": { "$ref": "#/definitions/lorawanv3Message" }, "settings": { "$ref": "#/definitions/MACStateUplinkMessageTxSettings" }, "rx_metadata": { "type": "array", "items": { "type": "object", "$ref": "#/definitions/MACStateUplinkMessageRxMetadata" } }, "received_at": { "type": "string", "format": "date-time" }, "correlation_ids": { "type": "array", "items": { "type": "string" } }, "device_channel_index": { "type": "integer", "format": "int64" } }, "description": "A minimal UplinkMessage definition which is binary compatible with the top level UplinkMessage message.\nUsed for type safe recent uplink storage." }, "MACStateUplinkMessageRxMetadata": { "type": "object", "properties": { "gateway_ids": { "$ref": "#/definitions/lorawanv3GatewayIdentifiers" }, "channel_rssi": { "type": "number", "format": "float" }, "snr": { "type": "number", "format": "float" }, "downlink_path_constraint": { "$ref": "#/definitions/v3DownlinkPathConstraint" }, "uplink_token": { "type": "string", "format": "byte" }, "packet_broker": { "$ref": "#/definitions/UplinkMessageRxMetadataPacketBrokerMetadata" }, "relay": { "$ref": "#/definitions/UplinkMessageRxMetadataRelayMetadata" } } }, "UplinkMessageRxMetadataRelayMetadata": { "type": "object" }, "lorawanv3GatewayIdentifiers": { "type": "object", "properties": { "gateway_id": { "type": "string" }, "eui": { "type": "string", "format": "string", "example": "70B3D57ED000ABCD", "description": "Secondary identifier, which can only be used in specific requests." } } }, "v3DownlinkPathConstraint": { "type": "string", "enum": [ "DOWNLINK_PATH_CONSTRAINT_NONE", "DOWNLINK_PATH_CONSTRAINT_PREFER_OTHER", "DOWNLINK_PATH_CONSTRAINT_NEVER" ], "default": "DOWNLINK_PATH_CONSTRAINT_NONE", "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." }, "UplinkMessageRxMetadataPacketBrokerMetadata": { "type": "object" }, "lorawanv3Message": { "type": "object", "properties": { "m_hdr": { "$ref": "#/definitions/lorawanv3MHDR" }, "mic": { "type": "string", "format": "byte" }, "mac_payload": { "$ref": "#/definitions/lorawanv3MACPayload" }, "join_request_payload": { "$ref": "#/definitions/v3JoinRequestPayload" }, "join_accept_payload": { "$ref": "#/definitions/v3JoinAcceptPayload" }, "rejoin_request_payload": { "$ref": "#/definitions/v3RejoinRequestPayload" } }, "title": "Message represents a LoRaWAN message" }, "v3JoinAcceptPayload": { "type": "object", "properties": { "encrypted": { "type": "string", "format": "byte" }, "join_nonce": { "type": "string", "format": "string", "example": "ABCDEF" }, "net_id": { "type": "string", "format": "string", "example": "000013" }, "dev_addr": { "type": "string", "format": "string", "example": "2600ABCD" }, "dl_settings": { "$ref": "#/definitions/v3DLSettings" }, "rx_delay": { "$ref": "#/definitions/v3RxDelay" }, "cf_list": { "$ref": "#/definitions/v3CFList" } } }, "lorawanv3MACPayload": { "type": "object", "properties": { "f_hdr": { "$ref": "#/definitions/v3FHDR" }, "f_port": { "type": "integer", "format": "int64" }, "frm_payload": { "type": "string", "format": "byte" }, "decoded_payload": { "type": "object" }, "full_f_cnt": { "type": "integer", "format": "int64", "description": "Full 32-bit FCnt value. Used internally by Network Server." } } }, "v3FHDR": { "type": "object", "properties": { "dev_addr": { "type": "string", "format": "string", "example": "2600ABCD" }, "f_ctrl": { "$ref": "#/definitions/v3FCtrl" }, "f_cnt": { "type": "integer", "format": "int64" }, "f_opts": { "type": "string", "format": "byte" } } }, "v3FCtrl": { "type": "object", "properties": { "adr": { "type": "boolean" }, "adr_ack_req": { "type": "boolean", "description": "Only on uplink." }, "ack": { "type": "boolean" }, "f_pending": { "type": "boolean", "description": "Only on downlink." }, "class_b": { "type": "boolean", "description": "Only on uplink." } } }, "lorawanv3MHDR": { "type": "object", "properties": { "m_type": { "$ref": "#/definitions/v3MType" }, "major": { "$ref": "#/definitions/v3Major" } } }, "v3Major": { "type": "string", "enum": [ "LORAWAN_R1" ], "default": "LORAWAN_R1" }, "v3MType": { "type": "string", "enum": [ "JOIN_REQUEST", "JOIN_ACCEPT", "UNCONFIRMED_UP", "UNCONFIRMED_DOWN", "CONFIRMED_UP", "CONFIRMED_DOWN", "REJOIN_REQUEST", "PROPRIETARY" ], "default": "JOIN_REQUEST" }, "v3JoinRequestPayload": { "type": "object", "properties": { "join_eui": { "type": "string", "format": "string", "example": "70B3D57ED000ABCD" }, "dev_eui": { "type": "string", "format": "string", "example": "70B3D57ED000ABCD" }, "dev_nonce": { "type": "string", "format": "string", "example": "ABCD" } } }, "v3RejoinRequestPayload": { "type": "object", "properties": { "rejoin_type": { "$ref": "#/definitions/v3RejoinRequestType" }, "net_id": { "type": "string", "format": "string", "example": "000013" }, "join_eui": { "type": "string", "format": "string", "example": "70B3D57ED000ABCD" }, "dev_eui": { "type": "string", "format": "string", "example": "70B3D57ED000ABCD" }, "rejoin_cnt": { "type": "integer", "format": "int64", "description": "Contains RJCount0 or RJCount1 depending on rejoin_type." } } }, "v3RejoinRequestType": { "type": "string", "enum": [ "CONTEXT", "SESSION", "KEYS" ], "default": "CONTEXT", "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." }, "MACStateUplinkMessageTxSettings": { "type": "object", "properties": { "data_rate": { "$ref": "#/definitions/v3DataRate" } } }, "v3DataRate": { "type": "object", "properties": { "lora": { "$ref": "#/definitions/v3LoRaDataRate" }, "fsk": { "$ref": "#/definitions/v3FSKDataRate" }, "lrfhss": { "$ref": "#/definitions/v3LRFHSSDataRate" } } }, "v3FSKDataRate": { "type": "object", "properties": { "bit_rate": { "type": "integer", "format": "int64", "description": "Bit rate (bps)." } } }, "v3LoRaDataRate": { "type": "object", "properties": { "bandwidth": { "type": "integer", "format": "int64", "description": "Bandwidth (Hz)." }, "spreading_factor": { "type": "integer", "format": "int64" }, "coding_rate": { "type": "string" } } }, "v3LRFHSSDataRate": { "type": "object", "properties": { "modulation_type": { "type": "integer", "format": "int64" }, "operating_channel_width": { "type": "integer", "format": "int64", "description": "Operating Channel Width (Hz)." }, "coding_rate": { "type": "string" } } }, "MACStateDataRateRanges": { "type": "object", "properties": { "ranges": { "type": "array", "items": { "type": "object", "$ref": "#/definitions/MACStateDataRateRange" } } } }, "MACStateDataRateRange": { "type": "object", "properties": { "min_data_rate_index": { "$ref": "#/definitions/v3DataRateIndex" }, "max_data_rate_index": { "$ref": "#/definitions/v3DataRateIndex" } } }, "v3PingSlotPeriodValue": { "type": "object", "properties": { "value": { "$ref": "#/definitions/v3PingSlotPeriod" } } }, "v3PingSlotPeriod": { "type": "string", "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" ], "default": "PING_EVERY_1S", "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." }, "v3MACCommandIdentifier": { "type": "string", "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" ], "default": "CID_RFU_0", "title": "- CID_BEACON_TIMING: Deprecated" }, "v3MACStateDownlinkMessage": { "type": "object", "properties": { "payload": { "$ref": "#/definitions/MACStateDownlinkMessageMessage" }, "correlation_ids": { "type": "array", "items": { "type": "string" } } }, "description": "A minimal DownlinkMessage definition which is binary compatible with the top level DownlinkMessage message.\nUsed for type safe recent downlink storage." }, "MACStateDownlinkMessageMessage": { "type": "object", "properties": { "m_hdr": { "$ref": "#/definitions/DownlinkMessageMessageMHDR" }, "mac_payload": { "$ref": "#/definitions/DownlinkMessageMessageMACPayload" } } }, "DownlinkMessageMessageMHDR": { "type": "object", "properties": { "m_type": { "$ref": "#/definitions/v3MType" } } }, "DownlinkMessageMessageMACPayload": { "type": "object", "properties": { "f_port": { "type": "integer", "format": "int64" }, "full_f_cnt": { "type": "integer", "format": "int64" } } }, "v3MACCommand": { "type": "object", "properties": { "cid": { "$ref": "#/definitions/v3MACCommandIdentifier" }, "raw_payload": { "type": "string", "format": "byte" }, "reset_ind": { "$ref": "#/definitions/MACCommandResetInd" }, "reset_conf": { "$ref": "#/definitions/MACCommandResetConf" }, "link_check_ans": { "$ref": "#/definitions/MACCommandLinkCheckAns" }, "link_adr_req": { "$ref": "#/definitions/MACCommandLinkADRReq" }, "link_adr_ans": { "$ref": "#/definitions/MACCommandLinkADRAns" }, "duty_cycle_req": { "$ref": "#/definitions/MACCommandDutyCycleReq" }, "rx_param_setup_req": { "$ref": "#/definitions/MACCommandRxParamSetupReq" }, "rx_param_setup_ans": { "$ref": "#/definitions/MACCommandRxParamSetupAns" }, "dev_status_ans": { "$ref": "#/definitions/MACCommandDevStatusAns" }, "new_channel_req": { "$ref": "#/definitions/MACCommandNewChannelReq" }, "new_channel_ans": { "$ref": "#/definitions/MACCommandNewChannelAns" }, "dl_channel_req": { "$ref": "#/definitions/MACCommandDLChannelReq" }, "dl_channel_ans": { "$ref": "#/definitions/MACCommandDLChannelAns" }, "rx_timing_setup_req": { "$ref": "#/definitions/MACCommandRxTimingSetupReq" }, "tx_param_setup_req": { "$ref": "#/definitions/MACCommandTxParamSetupReq" }, "rekey_ind": { "$ref": "#/definitions/MACCommandRekeyInd" }, "rekey_conf": { "$ref": "#/definitions/MACCommandRekeyConf" }, "adr_param_setup_req": { "$ref": "#/definitions/MACCommandADRParamSetupReq" }, "device_time_ans": { "$ref": "#/definitions/MACCommandDeviceTimeAns" }, "force_rejoin_req": { "$ref": "#/definitions/MACCommandForceRejoinReq" }, "rejoin_param_setup_req": { "$ref": "#/definitions/MACCommandRejoinParamSetupReq" }, "rejoin_param_setup_ans": { "$ref": "#/definitions/MACCommandRejoinParamSetupAns" }, "ping_slot_info_req": { "$ref": "#/definitions/MACCommandPingSlotInfoReq" }, "ping_slot_channel_req": { "$ref": "#/definitions/MACCommandPingSlotChannelReq" }, "ping_slot_channel_ans": { "$ref": "#/definitions/MACCommandPingSlotChannelAns" }, "beacon_timing_ans": { "$ref": "#/definitions/MACCommandBeaconTimingAns" }, "beacon_freq_req": { "$ref": "#/definitions/MACCommandBeaconFreqReq" }, "beacon_freq_ans": { "$ref": "#/definitions/MACCommandBeaconFreqAns" }, "device_mode_ind": { "$ref": "#/definitions/MACCommandDeviceModeInd" }, "device_mode_conf": { "$ref": "#/definitions/MACCommandDeviceModeConf" }, "relay_conf_req": { "$ref": "#/definitions/MACCommandRelayConfReq" }, "relay_conf_ans": { "$ref": "#/definitions/MACCommandRelayConfAns" }, "relay_end_device_conf_req": { "$ref": "#/definitions/MACCommandRelayEndDeviceConfReq" }, "relay_end_device_conf_ans": { "$ref": "#/definitions/MACCommandRelayEndDeviceConfAns" }, "relay_update_uplink_list_req": { "$ref": "#/definitions/MACCommandRelayUpdateUplinkListReq" }, "relay_update_uplink_list_ans": { "$ref": "#/definitions/MACCommandRelayUpdateUplinkListAns" }, "relay_ctrl_uplink_list_req": { "$ref": "#/definitions/MACCommandRelayCtrlUplinkListReq" }, "relay_ctrl_uplink_list_ans": { "$ref": "#/definitions/MACCommandRelayCtrlUplinkListAns" }, "relay_configure_fwd_limit_req": { "$ref": "#/definitions/MACCommandRelayConfigureFwdLimitReq" }, "relay_configure_fwd_limit_ans": { "$ref": "#/definitions/MACCommandRelayConfigureFwdLimitAns" }, "relay_notify_new_end_device_req": { "$ref": "#/definitions/MACCommandRelayNotifyNewEndDeviceReq" } } }, "MACCommandRejoinParamSetupReq": { "type": "object", "properties": { "max_count_exponent": { "$ref": "#/definitions/v3RejoinCountExponent", "description": "Exponent e that configures the rejoin counter = 2^(e+4) messages." }, "max_time_exponent": { "$ref": "#/definitions/v3RejoinTimeExponent", "description": "Exponent e that configures the rejoin timer = 2^(e+10) seconds." } } }, "v3RejoinCountExponent": { "type": "string", "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" ], "default": "REJOIN_COUNT_16" }, "v3RejoinTimeExponent": { "type": "string", "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" ], "default": "REJOIN_TIME_0", "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." }, "MACCommandRxParamSetupAns": { "type": "object", "properties": { "rx2_data_rate_index_ack": { "type": "boolean" }, "rx1_data_rate_offset_ack": { "type": "boolean" }, "rx2_frequency_ack": { "type": "boolean" } } }, "MACCommandBeaconTimingAns": { "type": "object", "properties": { "delay": { "type": "integer", "format": "int64", "description": "(uint16) See LoRaWAN specification." }, "channel_index": { "type": "integer", "format": "int64" } } }, "MACCommandADRParamSetupReq": { "type": "object", "properties": { "adr_ack_limit_exponent": { "$ref": "#/definitions/v3ADRAckLimitExponent", "description": "Exponent e that configures the ADR_ACK_LIMIT = 2^e messages." }, "adr_ack_delay_exponent": { "$ref": "#/definitions/v3ADRAckDelayExponent", "description": "Exponent e that configures the ADR_ACK_DELAY = 2^e messages." } } }, "v3ADRAckDelayExponent": { "type": "string", "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" ], "default": "ADR_ACK_DELAY_1" }, "v3ADRAckLimitExponent": { "type": "string", "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" ], "default": "ADR_ACK_LIMIT_1" }, "MACCommandForceRejoinReq": { "type": "object", "properties": { "rejoin_type": { "$ref": "#/definitions/v3RejoinRequestType" }, "data_rate_index": { "$ref": "#/definitions/v3DataRateIndex" }, "max_retries": { "type": "integer", "format": "int64" }, "period_exponent": { "$ref": "#/definitions/v3RejoinPeriodExponent", "description": "Exponent e that configures the rejoin period = 32 * 2^e + rand(0,32) seconds." } } }, "v3RejoinPeriodExponent": { "type": "string", "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" ], "default": "REJOIN_PERIOD_0", "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." }, "MACCommandLinkADRReq": { "type": "object", "properties": { "data_rate_index": { "$ref": "#/definitions/v3DataRateIndex" }, "tx_power_index": { "type": "integer", "format": "int64" }, "channel_mask": { "type": "array", "items": { "type": "boolean" } }, "channel_mask_control": { "type": "integer", "format": "int64" }, "nb_trans": { "type": "integer", "format": "int64" } } }, "MACCommandPingSlotChannelAns": { "type": "object", "properties": { "frequency_ack": { "type": "boolean" }, "data_rate_index_ack": { "type": "boolean" } } }, "MACCommandResetInd": { "type": "object", "properties": { "minor_version": { "$ref": "#/definitions/v3Minor" } } }, "v3Minor": { "type": "string", "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" ], "default": "MINOR_RFU_0" }, "MACCommandRejoinParamSetupAns": { "type": "object", "properties": { "max_time_exponent_ack": { "type": "boolean" } } }, "MACCommandDutyCycleReq": { "type": "object", "properties": { "max_duty_cycle": { "$ref": "#/definitions/v3AggregatedDutyCycle" } } }, "v3AggregatedDutyCycle": { "type": "string", "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" ], "default": "DUTY_CYCLE_1", "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%." }, "MACCommandRxParamSetupReq": { "type": "object", "properties": { "rx2_data_rate_index": { "$ref": "#/definitions/v3DataRateIndex" }, "rx1_data_rate_offset": { "$ref": "#/definitions/v3DataRateOffset" }, "rx2_frequency": { "type": "string", "format": "uint64", "description": "Rx2 frequency (Hz)." } } }, "MACCommandRelayCtrlUplinkListAns": { "type": "object", "properties": { "rule_index_ack": { "type": "boolean" }, "w_f_cnt": { "type": "integer", "format": "int64" } } }, "MACCommandDeviceTimeAns": { "type": "object", "properties": { "time": { "type": "string", "format": "date-time" } } }, "MACCommandRelayConfReq": { "type": "object", "properties": { "configuration": { "$ref": "#/definitions/MACCommandRelayConfReqConfiguration" } } }, "MACCommandRelayConfReqConfiguration": { "type": "object", "properties": { "second_channel": { "$ref": "#/definitions/v3RelaySecondChannel" }, "default_channel_index": { "type": "integer", "format": "int64" }, "cad_periodicity": { "$ref": "#/definitions/v3RelayCADPeriodicity" } } }, "v3RelaySecondChannel": { "type": "object", "properties": { "ack_offset": { "$ref": "#/definitions/v3RelaySecondChAckOffset", "description": "The frequency (Hz) offset used for the WOR acknowledgement." }, "data_rate_index": { "$ref": "#/definitions/v3DataRateIndex", "description": "The data rate index used by the WOR and WOR acknowledgement." }, "frequency": { "type": "string", "format": "uint64", "description": "The frequency (Hz) used by the wake on radio message." } } }, "v3RelaySecondChAckOffset": { "type": "string", "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" ], "default": "RELAY_SECOND_CH_ACK_OFFSET_0", "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" }, "v3RelayCADPeriodicity": { "type": "string", "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": "RELAY_CAD_PERIODICITY_1_SECOND", "title": "- RELAY_CAD_PERIODICITY_20_MILLISECONDS: sic" }, "MACCommandRekeyInd": { "type": "object", "properties": { "minor_version": { "$ref": "#/definitions/v3Minor" } } }, "MACCommandPingSlotChannelReq": { "type": "object", "properties": { "frequency": { "type": "string", "format": "uint64", "description": "Ping slot channel frequency (Hz)." }, "data_rate_index": { "$ref": "#/definitions/v3DataRateIndex" } } }, "MACCommandLinkADRAns": { "type": "object", "properties": { "channel_mask_ack": { "type": "boolean" }, "data_rate_index_ack": { "type": "boolean" }, "tx_power_index_ack": { "type": "boolean" } } }, "MACCommandDeviceModeConf": { "type": "object", "properties": { "class": { "$ref": "#/definitions/v3Class" } } }, "MACCommandRelayEndDeviceConfReq": { "type": "object", "properties": { "configuration": { "$ref": "#/definitions/MACCommandRelayEndDeviceConfReqConfiguration" } } }, "MACCommandRelayEndDeviceConfReqConfiguration": { "type": "object", "properties": { "always": { "$ref": "#/definitions/v3RelayEndDeviceAlwaysMode" }, "dynamic": { "$ref": "#/definitions/v3RelayEndDeviceDynamicMode" }, "end_device_controlled": { "$ref": "#/definitions/v3RelayEndDeviceControlledMode" }, "backoff": { "type": "integer", "format": "int64" }, "second_channel": { "$ref": "#/definitions/v3RelaySecondChannel" }, "serving_device_id": { "type": "string" } } }, "v3RelayEndDeviceAlwaysMode": { "type": "object" }, "v3RelayEndDeviceControlledMode": { "type": "object" }, "v3RelayEndDeviceDynamicMode": { "type": "object", "properties": { "smart_enable_level": { "$ref": "#/definitions/v3RelaySmartEnableLevel", "description": "The number of consecutive uplinks without a valid downlink before the end device attempts\nto use the relay mode to transmit messages." } } }, "v3RelaySmartEnableLevel": { "type": "string", "enum": [ "RELAY_SMART_ENABLE_LEVEL_8", "RELAY_SMART_ENABLE_LEVEL_16", "RELAY_SMART_ENABLE_LEVEL_32", "RELAY_SMART_ENABLE_LEVEL_64" ], "default": "RELAY_SMART_ENABLE_LEVEL_8" }, "MACCommandRelayConfigureFwdLimitReq": { "type": "object", "properties": { "reset_limit_counter": { "$ref": "#/definitions/v3RelayResetLimitCounter" }, "join_request_limits": { "$ref": "#/definitions/v3RelayForwardLimits" }, "notify_limits": { "$ref": "#/definitions/v3RelayForwardLimits" }, "global_uplink_limits": { "$ref": "#/definitions/v3RelayForwardLimits" }, "overall_limits": { "$ref": "#/definitions/v3RelayForwardLimits" } } }, "v3RelayResetLimitCounter": { "type": "string", "enum": [ "RELAY_RESET_LIMIT_COUNTER_ZERO", "RELAY_RESET_LIMIT_COUNTER_RELOAD_RATE", "RELAY_RESET_LIMIT_COUNTER_MAX_VALUE", "RELAY_RESET_LIMIT_COUNTER_NO_RESET" ], "default": "RELAY_RESET_LIMIT_COUNTER_ZERO" }, "v3RelayForwardLimits": { "type": "object", "properties": { "bucket_size": { "$ref": "#/definitions/v3RelayLimitBucketSize", "description": "The multiplier used to compute the total bucket size for the limits.\nThe multiplier is multiplied by the reload rate in order to compute the total bucket size." }, "reload_rate": { "type": "integer", "format": "int64", "description": "The number of tokens which are replenished in the bucket every hour." } } }, "v3RelayLimitBucketSize": { "type": "string", "enum": [ "RELAY_LIMIT_BUCKET_SIZE_1", "RELAY_LIMIT_BUCKET_SIZE_2", "RELAY_LIMIT_BUCKET_SIZE_4", "RELAY_LIMIT_BUCKET_SIZE_12" ], "default": "RELAY_LIMIT_BUCKET_SIZE_1", "title": "- RELAY_LIMIT_BUCKET_SIZE_12: sic" }, "MACCommandRekeyConf": { "type": "object", "properties": { "minor_version": { "$ref": "#/definitions/v3Minor" } } }, "MACCommandRelayCtrlUplinkListReq": { "type": "object", "properties": { "rule_index": { "type": "integer", "format": "int64" }, "action": { "$ref": "#/definitions/v3RelayCtrlUplinkListAction" } } }, "v3RelayCtrlUplinkListAction": { "type": "string", "enum": [ "RELAY_CTRL_UPLINK_LIST_ACTION_READ_W_F_CNT", "RELAY_CTRL_UPLINK_LIST_ACTION_REMOVE_TRUSTED_END_DEVICE" ], "default": "RELAY_CTRL_UPLINK_LIST_ACTION_READ_W_F_CNT" }, "MACCommandLinkCheckAns": { "type": "object", "properties": { "margin": { "type": "integer", "format": "int64", "description": "Indicates the link margin in dB of the received LinkCheckReq, relative to the demodulation floor." }, "gateway_count": { "type": "integer", "format": "int64" } } }, "MACCommandDevStatusAns": { "type": "object", "properties": { "battery": { "type": "integer", "format": "int64", "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." }, "margin": { "type": "integer", "format": "int32", "description": "SNR of the last downlink (dB; [-32, +31])." } } }, "MACCommandNewChannelAns": { "type": "object", "properties": { "frequency_ack": { "type": "boolean" }, "data_rate_ack": { "type": "boolean" } } }, "MACCommandDeviceModeInd": { "type": "object", "properties": { "class": { "$ref": "#/definitions/v3Class" } } }, "MACCommandTxParamSetupReq": { "type": "object", "properties": { "max_eirp_index": { "$ref": "#/definitions/v3DeviceEIRP", "title": "Indicates the maximum EIRP value in dBm, indexed by the following vector:\n[ 8 10 12 13 14 16 18 20 21 24 26 27 29 30 33 36 ]" }, "uplink_dwell_time": { "type": "boolean" }, "downlink_dwell_time": { "type": "boolean" } } }, "v3DeviceEIRP": { "type": "string", "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" ], "default": "DEVICE_EIRP_8", "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." }, "MACCommandRelayNotifyNewEndDeviceReq": { "type": "object", "properties": { "dev_addr": { "type": "string", "format": "string", "example": "2600ABCD" }, "snr": { "type": "integer", "format": "int32" }, "rssi": { "type": "integer", "format": "int32" } } }, "MACCommandRelayUpdateUplinkListReq": { "type": "object", "properties": { "rule_index": { "type": "integer", "format": "int64" }, "forward_limits": { "$ref": "#/definitions/v3RelayUplinkForwardLimits" }, "dev_addr": { "type": "string", "format": "string", "example": "2600ABCD" }, "w_f_cnt": { "type": "integer", "format": "int64" }, "root_wor_s_key": { "type": "string", "format": "string", "example": "0123456789ABCDEF0123456789ABCDEF" }, "device_id": { "type": "string" }, "session_key_id": { "type": "string", "format": "byte" } } }, "v3RelayUplinkForwardLimits": { "type": "object", "properties": { "bucket_size": { "$ref": "#/definitions/v3RelayLimitBucketSize", "description": "The multiplier used to compute the total bucket size for the limits.\nThe multiplier is multiplied by the reload rate in order to compute the total bucket size." }, "reload_rate": { "type": "integer", "format": "int64", "description": "The number of tokens which are replenished in the bucket every hour." } } }, "MACCommandRelayConfigureFwdLimitAns": { "type": "object" }, "MACCommandNewChannelReq": { "type": "object", "properties": { "channel_index": { "type": "integer", "format": "int64" }, "frequency": { "type": "string", "format": "uint64", "description": "Channel frequency (Hz)." }, "min_data_rate_index": { "$ref": "#/definitions/v3DataRateIndex" }, "max_data_rate_index": { "$ref": "#/definitions/v3DataRateIndex" } } }, "MACCommandResetConf": { "type": "object", "properties": { "minor_version": { "$ref": "#/definitions/v3Minor" } } }, "MACCommandRxTimingSetupReq": { "type": "object", "properties": { "delay": { "$ref": "#/definitions/v3RxDelay" } } }, "MACCommandRelayEndDeviceConfAns": { "type": "object", "properties": { "second_channel_frequency_ack": { "type": "boolean" }, "second_channel_data_rate_index_ack": { "type": "boolean" }, "second_channel_index_ack": { "type": "boolean" }, "backoff_ack": { "type": "boolean" } } }, "MACCommandBeaconFreqAns": { "type": "object", "properties": { "frequency_ack": { "type": "boolean" } } }, "MACCommandDLChannelReq": { "type": "object", "properties": { "channel_index": { "type": "integer", "format": "int64" }, "frequency": { "type": "string", "format": "uint64", "description": "Downlink channel frequency (Hz)." } } }, "MACCommandPingSlotInfoReq": { "type": "object", "properties": { "period": { "$ref": "#/definitions/v3PingSlotPeriod" } } }, "MACCommandRelayUpdateUplinkListAns": { "type": "object" }, "MACCommandBeaconFreqReq": { "type": "object", "properties": { "frequency": { "type": "string", "format": "uint64", "description": "Frequency of the Class B beacons (Hz)." } } }, "MACCommandDLChannelAns": { "type": "object", "properties": { "channel_index_ack": { "type": "boolean" }, "frequency_ack": { "type": "boolean" } } }, "MACCommandRelayConfAns": { "type": "object", "properties": { "second_channel_frequency_ack": { "type": "boolean" }, "second_channel_ack_offset_ack": { "type": "boolean" }, "second_channel_data_rate_index_ack": { "type": "boolean" }, "second_channel_index_ack": { "type": "boolean" }, "default_channel_index_ack": { "type": "boolean" }, "cad_periodicity_ack": { "type": "boolean" } } }, "v3MACParameters": { "type": "object", "properties": { "max_eirp": { "type": "number", "format": "float", "description": "Maximum EIRP (dBm)." }, "adr_data_rate_index": { "$ref": "#/definitions/v3DataRateIndex", "description": "ADR: data rate index to use." }, "adr_tx_power_index": { "type": "integer", "format": "int64", "description": "ADR: transmission power index to use." }, "adr_nb_trans": { "type": "integer", "format": "int64", "description": "ADR: number of retransmissions." }, "adr_ack_limit": { "type": "integer", "format": "int64", "description": "ADR: number of messages to wait before setting ADRAckReq.\nThis field is deprecated, use adr_ack_limit_exponent instead." }, "adr_ack_delay": { "type": "integer", "format": "int64", "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." }, "rx1_delay": { "$ref": "#/definitions/v3RxDelay", "description": "Rx1 delay (Rx2 delay is Rx1 delay + 1 second)." }, "rx1_data_rate_offset": { "$ref": "#/definitions/v3DataRateOffset", "description": "Data rate offset for Rx1." }, "rx2_data_rate_index": { "$ref": "#/definitions/v3DataRateIndex", "description": "Data rate index for Rx2." }, "rx2_frequency": { "type": "string", "format": "uint64", "description": "Frequency for Rx2 (Hz)." }, "max_duty_cycle": { "$ref": "#/definitions/v3AggregatedDutyCycle", "description": "Maximum uplink duty cycle (of all channels)." }, "rejoin_time_periodicity": { "$ref": "#/definitions/v3RejoinTimeExponent", "description": "Time within which a rejoin-request must be sent." }, "rejoin_count_periodicity": { "$ref": "#/definitions/v3RejoinCountExponent", "description": "Message count within which a rejoin-request must be sent." }, "ping_slot_frequency": { "type": "string", "format": "uint64", "description": "Frequency of the class B ping slot (Hz)." }, "ping_slot_data_rate_index": { "$ref": "#/definitions/v3DataRateIndex", "description": "Data rate index of the class B ping slot.\nThis field is deprecated, use ping_slot_data_rate_index_value instead." }, "beacon_frequency": { "type": "string", "format": "uint64", "description": "Frequency of the class B beacon (Hz)." }, "channels": { "type": "array", "items": { "type": "object", "$ref": "#/definitions/v3MACParametersChannel" }, "description": "Configured uplink channels and optionally Rx1 frequency." }, "uplink_dwell_time": { "$ref": "#/definitions/lorawanv3BoolValue", "description": "Whether uplink dwell time is set (400ms).\nIf unset, then the value is either unknown or irrelevant(Network Server cannot modify it)." }, "downlink_dwell_time": { "$ref": "#/definitions/lorawanv3BoolValue", "description": "Whether downlink dwell time is set (400ms).\nIf unset, then the value is either unknown or irrelevant(Network Server cannot modify it)." }, "adr_ack_limit_exponent": { "$ref": "#/definitions/v3ADRAckLimitExponentValue", "description": "ADR: number of messages to wait before setting ADRAckReq." }, "adr_ack_delay_exponent": { "$ref": "#/definitions/v3ADRAckDelayExponentValue", "description": "ADR: number of messages to wait after setting ADRAckReq and before changing TxPower or DataRate." }, "ping_slot_data_rate_index_value": { "$ref": "#/definitions/v3DataRateIndexValue", "description": "Data rate index of the class B ping slot." }, "relay": { "$ref": "#/definitions/lorawanv3RelayParameters", "description": "Relay parameters." } }, "description": "MACParameters represent the parameters of the device's MAC layer (active or desired).\nThis is used internally by the Network Server." }, "lorawanv3RelayParameters": { "type": "object", "properties": { "serving": { "$ref": "#/definitions/v3ServingRelayParameters", "description": "Parameters related to a relay which is serving end devices." }, "served": { "$ref": "#/definitions/v3ServedRelayParameters", "description": "Parameters related to an end device served by a relay." } }, "description": "RelayParameters represent the parameters of a relay.\nThis is used internally by the Network Server." }, "v3ServingRelayParameters": { "type": "object", "properties": { "second_channel": { "$ref": "#/definitions/v3RelaySecondChannel", "description": "Second wake on radio channel configuration." }, "default_channel_index": { "type": "integer", "format": "int64", "description": "Index of the default wake on radio channel." }, "cad_periodicity": { "$ref": "#/definitions/v3RelayCADPeriodicity", "description": "Channel activity detection periodicity." }, "uplink_forwarding_rules": { "type": "array", "items": { "type": "object", "$ref": "#/definitions/v3RelayUplinkForwardingRule" }, "description": "Configured uplink forwarding rules." }, "limits": { "$ref": "#/definitions/v3ServingRelayForwardingLimits", "description": "Configured forwarding limits.\nIf unset, the default value from Network Server configuration will be used." } } }, "v3ServingRelayForwardingLimits": { "type": "object", "properties": { "reset_behavior": { "$ref": "#/definitions/v3RelayResetLimitCounter", "description": "Reset behavior of the buckets upon limit update." }, "join_requests": { "$ref": "#/definitions/v3RelayForwardLimits", "description": "Bucket configuration for join requests.\nIf unset, no individual limits will apply to join requests, but the relay overall limitations will apply." }, "notifications": { "$ref": "#/definitions/v3RelayForwardLimits", "description": "Bucket configuration for unknown device notifications.\nIf unset, no individual limits will apply to unknown end device notifications, but the relay overall\nlimitations will still apply." }, "uplink_messages": { "$ref": "#/definitions/v3RelayForwardLimits", "description": "Bucket configuration for uplink messages across all served end devices.\nIf unset, no individual limits will apply to uplink messages across all served end devices, but the relay\noverall limitations will still apply." }, "overall": { "$ref": "#/definitions/v3RelayForwardLimits", "description": "Bucket configuration for all relay messages.\nIf unset, no overall limits will apply to the relay, but individual limitations will still apply." } } }, "v3RelayUplinkForwardingRule": { "type": "object", "properties": { "limits": { "$ref": "#/definitions/v3RelayUplinkForwardLimits", "description": "Bucket configuration for the served end device.\nIf unset, no individual limits will apply to the end device, but the relay global limitations will apply." }, "last_w_f_cnt": { "type": "integer", "format": "int64", "description": "Last wake on radio frame counter used by the served end device." }, "device_id": { "type": "string", "description": "End device identifier of the served end device." }, "session_key_id": { "type": "string", "format": "byte", "description": "Session key ID of the session keys used to derive the root relay session key." } } }, "v3ServedRelayParameters": { "type": "object", "properties": { "always": { "$ref": "#/definitions/v3RelayEndDeviceAlwaysMode", "description": "The end device will always attempt to use the relay mode in order to send uplink messages." }, "dynamic": { "$ref": "#/definitions/v3RelayEndDeviceDynamicMode", "description": "The end device will attempt to use relay mode only after a number of uplink messages have been sent without\nreceiving a valid a downlink message." }, "end_device_controlled": { "$ref": "#/definitions/v3RelayEndDeviceControlledMode", "description": "The end device will control when it uses the relay mode. This is the default mode." }, "backoff": { "type": "integer", "format": "int64", "description": "Number of wake on radio frames to be sent without an acknowledgement before sending the uplink message directly." }, "second_channel": { "$ref": "#/definitions/v3RelaySecondChannel", "description": "Second wake on radio channel configuration." }, "serving_device_id": { "type": "string", "description": "End device identifier of the serving end device." } } }, "v3ADRAckLimitExponentValue": { "type": "object", "properties": { "value": { "$ref": "#/definitions/v3ADRAckLimitExponent" } } }, "v3MACParametersChannel": { "type": "object", "properties": { "uplink_frequency": { "type": "string", "format": "uint64", "description": "Uplink frequency of the channel (Hz)." }, "downlink_frequency": { "type": "string", "format": "uint64", "description": "Downlink frequency of the channel (Hz)." }, "min_data_rate_index": { "$ref": "#/definitions/v3DataRateIndex", "description": "Index of the minimum data rate for uplink." }, "max_data_rate_index": { "$ref": "#/definitions/v3DataRateIndex", "description": "Index of the maximum data rate for uplink." }, "enable_uplink": { "type": "boolean", "description": "Channel can be used by device for uplink." } } }, "lorawanv3BoolValue": { "type": "object", "properties": { "value": { "type": "boolean" } } }, "v3DataRateIndexValue": { "type": "object", "properties": { "value": { "$ref": "#/definitions/v3DataRateIndex" } } }, "v3ADRAckDelayExponentValue": { "type": "object", "properties": { "value": { "$ref": "#/definitions/v3ADRAckDelayExponent" } } }, "v3RelayForwardDownlinkReq": { "type": "object", "properties": { "raw_payload": { "type": "string", "format": "byte" } } }, "v3ApplicationDownlink": { "type": "object", "properties": { "session_key_id": { "type": "string", "format": "byte", "description": "Join Server issued identifier for the session keys used by this downlink." }, "f_port": { "type": "integer", "format": "int64" }, "f_cnt": { "type": "integer", "format": "int64" }, "frm_payload": { "type": "string", "format": "byte", "description": "The frame payload of the downlink message.\nThe payload is encrypted if the skip_payload_crypto field of the EndDevice\nis true." }, "decoded_payload": { "type": "object", "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." }, "decoded_payload_warnings": { "type": "array", "items": { "type": "string" }, "description": "Warnings generated by the message processor while encoding frm_payload (scheduling downlink) or decoding the frm_payload (reading downlink)." }, "confirmed": { "type": "boolean" }, "class_b_c": { "$ref": "#/definitions/ApplicationDownlinkClassBC", "description": "Optional gateway and timing information for class B and C.\nIf set, this downlink message will only be transmitted as class B or C downlink.\nIf not set, this downlink message may be transmitted in class A, B and C." }, "priority": { "$ref": "#/definitions/v3TxSchedulePriority", "description": "Priority for scheduling the downlink message." }, "correlation_ids": { "type": "array", "items": { "type": "string" } }, "confirmed_retry": { "$ref": "#/definitions/ApplicationDownlinkConfirmedRetry" }, "locations": { "type": "object", "additionalProperties": { "$ref": "#/definitions/lorawanv3Location" }, "description": "End device location metadata, set by the Application Server while handling the message." }, "version_ids": { "$ref": "#/definitions/v3EndDeviceVersionIdentifiers", "description": "End device version identifiers, set by the Application Server while handling the message." }, "network_ids": { "$ref": "#/definitions/v3NetworkIdentifiers", "description": "Network identifiers, set by the Network Server that handles the message." }, "attributes": { "type": "object", "additionalProperties": { "type": "string" }, "description": "Attributes for devices, set by the Application Server while handling the message." } } }, "ApplicationDownlinkClassBC": { "type": "object", "properties": { "gateways": { "type": "array", "items": { "type": "object", "$ref": "#/definitions/v3ClassBCGatewayIdentifiers" }, "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." }, "absolute_time": { "type": "string", "format": "date-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." } } }, "v3ClassBCGatewayIdentifiers": { "type": "object", "properties": { "gateway_ids": { "$ref": "#/definitions/lorawanv3GatewayIdentifiers" }, "antenna_index": { "type": "integer", "format": "int64" }, "group_index": { "type": "integer", "format": "int64" } } }, "v3TxSchedulePriority": { "type": "string", "enum": [ "LOWEST", "LOW", "BELOW_NORMAL", "NORMAL", "ABOVE_NORMAL", "HIGH", "HIGHEST" ], "default": "LOWEST" }, "v3EndDeviceVersionIdentifiers": { "type": "object", "properties": { "brand_id": { "type": "string" }, "model_id": { "type": "string" }, "hardware_version": { "type": "string" }, "firmware_version": { "type": "string" }, "band_id": { "type": "string" } }, "description": "Identifies an end device model with version information." }, "lorawanv3Location": { "type": "object", "properties": { "latitude": { "type": "number", "format": "double", "description": "The North\u2013South position (degrees; -90 to +90), where 0 is the equator, North pole is positive, South pole is negative." }, "longitude": { "type": "number", "format": "double", "description": "The East-West position (degrees; -180 to +180), where 0 is the Prime Meridian (Greenwich), East is positive , West is negative." }, "altitude": { "type": "integer", "format": "int32", "description": "The altitude (meters), where 0 is the mean sea level." }, "accuracy": { "type": "integer", "format": "int32", "description": "The accuracy of the location (meters)." }, "source": { "$ref": "#/definitions/v3LocationSource", "description": "Source of the location information." } } }, "v3LocationSource": { "type": "string", "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" ], "default": "SOURCE_UNKNOWN", "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." }, "ApplicationDownlinkConfirmedRetry": { "type": "object", "properties": { "attempt": { "type": "integer", "format": "int64", "description": "The number of attempted confirmed downlink acknowledgements." }, "max_attempts": { "type": "integer", "format": "int64", "description": "The maximum number of confirmed downlink acknowledgement attempts.\nIf null, the Application Server configuration is used instead." } } }, "v3NetworkIdentifiers": { "type": "object", "properties": { "net_id": { "type": "string", "format": "string", "example": "000013", "description": "LoRa Alliance NetID." }, "ns_id": { "type": "string", "format": "string", "example": "70B3D57ED000ABCD", "description": "LoRaWAN NSID (EUI-64) that uniquely identifies the Network Server instance." }, "tenant_id": { "type": "string", "description": "Optional tenant identifier for multi-tenant deployments." }, "cluster_id": { "type": "string", "description": "Cluster identifier of the Network Server." }, "cluster_address": { "type": "string", "description": "Cluster address of the Network Server." }, "tenant_address": { "type": "string", "description": "Optional tenant address for multi-tenant deployments." } }, "description": "Identifies a Network Server." }, "v3EndDeviceAuthenticationCode": { "type": "object", "properties": { "value": { "type": "string" }, "valid_from": { "type": "string", "format": "date-time" }, "valid_to": { "type": "string", "format": "date-time" } }, "description": "Authentication code for end devices." }, "v3LoRaAllianceProfileIdentifiers": { "type": "object", "properties": { "vendor_id": { "type": "integer", "format": "int64", "description": "VendorID managed by the LoRa Alliance, as defined in TR005." }, "vendor_profile_id": { "type": "integer", "format": "int64", "description": "ID of the LoRaWAN end device profile assigned by the vendor." } } }, "v3Picture": { "type": "object", "properties": { "embedded": { "$ref": "#/definitions/PictureEmbedded", "description": "Embedded picture.\nOmitted if there are external URLs available (in sizes)." }, "sizes": { "type": "object", "additionalProperties": { "type": "string" }, "description": "URLs of the picture for different sizes, if available on a CDN." } } }, "PictureEmbedded": { "type": "object", "properties": { "mime_type": { "type": "string", "description": "MIME type of the picture." }, "data": { "type": "string", "format": "byte", "description": "Picture data. A data URI can be constructed as follows:\n`data:;base64,`." } } }, "v3MACSettings": { "type": "object", "properties": { "class_b_timeout": { "type": "string", "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." }, "ping_slot_periodicity": { "$ref": "#/definitions/v3PingSlotPeriodValue", "description": "Periodicity of the class B ping slot.\nIf unset, the default value from Network Server configuration will be used." }, "ping_slot_data_rate_index": { "$ref": "#/definitions/v3DataRateIndexValue", "description": "Data rate index of the class B ping slot.\nIf unset, the default value from Network Server configuration will be used." }, "ping_slot_frequency": { "$ref": "#/definitions/v3ZeroableFrequencyValue", "description": "Frequency of the class B ping slot (Hz).\nIf unset, the default value from Network Server configuration will be used." }, "beacon_frequency": { "$ref": "#/definitions/v3ZeroableFrequencyValue", "description": "Frequency of the class B beacon (Hz).\nIf unset, the default value from Network Server configuration will be used." }, "class_c_timeout": { "type": "string", "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." }, "rx1_delay": { "$ref": "#/definitions/v3RxDelayValue", "description": "Class A Rx1 delay.\nIf unset, the default value from Network Server configuration or regional parameters specification will be used." }, "rx1_data_rate_offset": { "$ref": "#/definitions/v3DataRateOffsetValue", "description": "Rx1 data rate offset.\nIf unset, the default value from Network Server configuration will be used." }, "rx2_data_rate_index": { "$ref": "#/definitions/v3DataRateIndexValue", "description": "Data rate index for Rx2.\nIf unset, the default value from Network Server configuration or regional parameters specification will be used." }, "rx2_frequency": { "$ref": "#/definitions/v3FrequencyValue", "description": "Frequency for Rx2 (Hz).\nIf unset, the default value from Network Server configuration or regional parameters specification will be used." }, "factory_preset_frequencies": { "type": "array", "items": { "type": "string", "format": "uint64" }, "description": "List of factory-preset frequencies.\nIf unset, the default value from Network Server configuration or regional parameters specification will be used." }, "max_duty_cycle": { "$ref": "#/definitions/v3AggregatedDutyCycleValue", "description": "Maximum uplink duty cycle (of all channels)." }, "supports_32_bit_f_cnt": { "$ref": "#/definitions/lorawanv3BoolValue", "description": "Whether the device supports 32-bit frame counters.\nIf unset, the default value from Network Server configuration will be used." }, "use_adr": { "$ref": "#/definitions/lorawanv3BoolValue", "description": "Whether the Network Server should use ADR for the device.\nThis field is deprecated, use adr_settings instead." }, "adr_margin": { "type": "number", "format": "float", "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." }, "resets_f_cnt": { "$ref": "#/definitions/lorawanv3BoolValue", "description": "Whether the device resets the frame counters (not LoRaWAN compliant).\nIf unset, the default value from Network Server configuration will be used." }, "status_time_periodicity": { "type": "string", "description": "The interval after which a DevStatusReq MACCommand shall be sent.\nIf unset, the default value from Network Server configuration will be used." }, "status_count_periodicity": { "type": "integer", "format": "int64", "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." }, "desired_rx1_delay": { "$ref": "#/definitions/v3RxDelayValue", "description": "The Rx1 delay Network Server should configure device to use via MAC commands or Join-Accept.\nIf unset, the default value from Network Server configuration or regional parameters specification will be used." }, "desired_rx1_data_rate_offset": { "$ref": "#/definitions/v3DataRateOffsetValue", "description": "The Rx1 data rate offset Network Server should configure device to use via MAC commands or Join-Accept.\nIf unset, the default value from Network Server configuration will be used." }, "desired_rx2_data_rate_index": { "$ref": "#/definitions/v3DataRateIndexValue", "description": "The Rx2 data rate index Network Server should configure device to use via MAC commands or Join-Accept.\nIf unset, the default value from frequency plan, Network Server configuration or regional parameters specification will be used." }, "desired_rx2_frequency": { "$ref": "#/definitions/v3FrequencyValue", "description": "The Rx2 frequency index Network Server should configure device to use via MAC commands.\nIf unset, the default value from frequency plan, Network Server configuration or regional parameters specification will be used." }, "desired_max_duty_cycle": { "$ref": "#/definitions/v3AggregatedDutyCycleValue", "description": "The maximum uplink duty cycle (of all channels) Network Server should configure device to use via MAC commands.\nIf unset, the default value from Network Server configuration will be used." }, "desired_adr_ack_limit_exponent": { "$ref": "#/definitions/v3ADRAckLimitExponentValue", "description": "The ADR ACK limit Network Server should configure device to use via MAC commands.\nIf unset, the default value from Network Server configuration or regional parameters specification will be used." }, "desired_adr_ack_delay_exponent": { "$ref": "#/definitions/v3ADRAckDelayExponentValue", "description": "The ADR ACK delay Network Server should configure device to use via MAC commands.\nIf unset, the default value from Network Server configuration or regional parameters specification will be used." }, "desired_ping_slot_data_rate_index": { "$ref": "#/definitions/v3DataRateIndexValue", "description": "The data rate index of the class B ping slot Network Server should configure device to use via MAC commands.\nIf unset, the default value from Network Server configuration will be used." }, "desired_ping_slot_frequency": { "$ref": "#/definitions/v3ZeroableFrequencyValue", "description": "The frequency of the class B ping slot (Hz) Network Server should configure device to use via MAC commands.\nIf unset, the default value from Network Server configuration or regional parameters specification will be used." }, "desired_beacon_frequency": { "$ref": "#/definitions/v3ZeroableFrequencyValue", "description": "The frequency of the class B beacon (Hz) Network Server should configure device to use via MAC commands.\nIf unset, the default value from Network Server configuration will be used." }, "desired_max_eirp": { "$ref": "#/definitions/v3DeviceEIRPValue", "description": "Maximum EIRP (dBm).\nIf unset, the default value from regional parameters specification will be used." }, "class_b_c_downlink_interval": { "type": "string", "description": "The minimum duration passed before a network-initiated(e.g. Class B or C) downlink following an arbitrary downlink." }, "uplink_dwell_time": { "$ref": "#/definitions/lorawanv3BoolValue", "description": "Whether uplink dwell time is set (400ms).\nIf unset, the default value from Network Server configuration or regional parameters specification will be used." }, "downlink_dwell_time": { "$ref": "#/definitions/lorawanv3BoolValue", "description": "Whether downlink dwell time is set (400ms).\nIf unset, the default value from Network Server configuration or regional parameters specification will be used." }, "adr": { "$ref": "#/definitions/v3ADRSettings", "description": "Adaptive Data Rate settings.\nIf unset, the default value from Network Server configuration or regional parameters specification will be used." }, "schedule_downlinks": { "$ref": "#/definitions/lorawanv3BoolValue", "description": "Whether or not downlink messages should be scheduled.\nThis option can be used in order to disable any downlink interaction with the end device. It will affect all types\nof downlink messages: data and MAC downlinks, and join accepts." }, "relay": { "$ref": "#/definitions/v3RelaySettings", "description": "The relay settings the end device is using.\nIf unset, the default value from Network Server configuration or regional parameters specification will be used." }, "desired_relay": { "$ref": "#/definitions/v3RelaySettings", "description": "The relay settings the Network Server should configure device to use via MAC commands.\nIf unset, the default value from Network Server configuration or regional parameters specification will be used." } } }, "v3FrequencyValue": { "type": "object", "properties": { "value": { "type": "string", "format": "uint64" } } }, "v3RelaySettings": { "type": "object", "properties": { "serving": { "$ref": "#/definitions/v3ServingRelaySettings" }, "served": { "$ref": "#/definitions/v3ServedRelaySettings" } }, "description": "RelaySettings represent the settings of a relay.\nThis is used internally by the Network Server." }, "v3ServingRelaySettings": { "type": "object", "properties": { "second_channel": { "$ref": "#/definitions/v3RelaySecondChannel", "description": "Second wake on radio channel configuration." }, "default_channel_index": { "type": "integer", "format": "int64", "description": "Index of the default wake on radio channel.\nIf unset, the default value from Network Server configuration will be used." }, "cad_periodicity": { "$ref": "#/definitions/v3RelayCADPeriodicity", "description": "Channel activity detection periodicity." }, "uplink_forwarding_rules": { "type": "array", "items": { "type": "object", "$ref": "#/definitions/v3RelayUplinkForwardingRule" }, "description": "Configured uplink forwarding rules." }, "limits": { "$ref": "#/definitions/v3ServingRelayForwardingLimits", "description": "Configured forwarding limits.\nIf unset, the default value from Network Server configuration will be used." } } }, "v3ServedRelaySettings": { "type": "object", "properties": { "always": { "$ref": "#/definitions/v3RelayEndDeviceAlwaysMode", "description": "The end device will always attempt to use the relay mode in order to send uplink messages." }, "dynamic": { "$ref": "#/definitions/v3RelayEndDeviceDynamicMode", "description": "The end device will attempt to use relay mode only after a number of uplink messages have been sent without\nreceiving a valid a downlink message." }, "end_device_controlled": { "$ref": "#/definitions/v3RelayEndDeviceControlledMode", "description": "The end device will control when it uses the relay mode. This is the default mode." }, "backoff": { "type": "integer", "format": "int64", "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." }, "second_channel": { "$ref": "#/definitions/v3RelaySecondChannel", "description": "Second wake on radio channel configuration." }, "serving_device_id": { "type": "string", "description": "End device identifier of the serving end device." } } }, "v3ZeroableFrequencyValue": { "type": "object", "properties": { "value": { "type": "string", "format": "uint64" } } }, "v3AggregatedDutyCycleValue": { "type": "object", "properties": { "value": { "$ref": "#/definitions/v3AggregatedDutyCycle" } } }, "v3RxDelayValue": { "type": "object", "properties": { "value": { "$ref": "#/definitions/v3RxDelay" } } }, "v3DeviceEIRPValue": { "type": "object", "properties": { "value": { "$ref": "#/definitions/v3DeviceEIRP" } } }, "v3ADRSettings": { "type": "object", "properties": { "static": { "$ref": "#/definitions/ADRSettingsStaticMode" }, "dynamic": { "$ref": "#/definitions/ADRSettingsDynamicMode" }, "disabled": { "$ref": "#/definitions/v3ADRSettingsDisabledMode" } }, "description": "Adaptive Data Rate settings." }, "ADRSettingsDynamicMode": { "type": "object", "properties": { "margin": { "type": "number", "format": "float", "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." }, "min_data_rate_index": { "$ref": "#/definitions/v3DataRateIndexValue", "description": "Minimum data rate index.\nIf unset, the default value from Network Server configuration will be used." }, "max_data_rate_index": { "$ref": "#/definitions/v3DataRateIndexValue", "description": "Maximum data rate index.\nIf unset, the default value from Network Server configuration will be used." }, "min_tx_power_index": { "type": "integer", "format": "int64", "description": "Minimum transmission power index.\nIf unset, the default value from Network Server configuration will be used." }, "max_tx_power_index": { "type": "integer", "format": "int64", "description": "Maximum transmission power index.\nIf unset, the default value from Network Server configuration will be used." }, "min_nb_trans": { "type": "integer", "format": "int64", "description": "Minimum number of retransmissions.\nIf unset, the default value from Network Server configuration will be used." }, "max_nb_trans": { "type": "integer", "format": "int64", "description": "Maximum number of retransmissions.\nIf unset, the default value from Network Server configuration will be used." }, "channel_steering": { "$ref": "#/definitions/DynamicModeChannelSteeringSettings" }, "overrides": { "$ref": "#/definitions/DynamicModeOverrides" } }, "description": "Configuration options for dynamic ADR." }, "DynamicModeOverrides": { "type": "object", "properties": { "data_rate_0": { "$ref": "#/definitions/DynamicModePerDataRateIndexOverride" }, "data_rate_1": { "$ref": "#/definitions/DynamicModePerDataRateIndexOverride" }, "data_rate_2": { "$ref": "#/definitions/DynamicModePerDataRateIndexOverride" }, "data_rate_3": { "$ref": "#/definitions/DynamicModePerDataRateIndexOverride" }, "data_rate_4": { "$ref": "#/definitions/DynamicModePerDataRateIndexOverride" }, "data_rate_5": { "$ref": "#/definitions/DynamicModePerDataRateIndexOverride" }, "data_rate_6": { "$ref": "#/definitions/DynamicModePerDataRateIndexOverride" }, "data_rate_7": { "$ref": "#/definitions/DynamicModePerDataRateIndexOverride" }, "data_rate_8": { "$ref": "#/definitions/DynamicModePerDataRateIndexOverride" }, "data_rate_9": { "$ref": "#/definitions/DynamicModePerDataRateIndexOverride" }, "data_rate_10": { "$ref": "#/definitions/DynamicModePerDataRateIndexOverride" }, "data_rate_11": { "$ref": "#/definitions/DynamicModePerDataRateIndexOverride" }, "data_rate_12": { "$ref": "#/definitions/DynamicModePerDataRateIndexOverride" }, "data_rate_13": { "$ref": "#/definitions/DynamicModePerDataRateIndexOverride" }, "data_rate_14": { "$ref": "#/definitions/DynamicModePerDataRateIndexOverride" }, "data_rate_15": { "$ref": "#/definitions/DynamicModePerDataRateIndexOverride" } }, "description": "EXPERIMENTAL: Configuration overrides." }, "DynamicModePerDataRateIndexOverride": { "type": "object", "properties": { "min_nb_trans": { "type": "integer", "format": "int64", "description": "Minimum number of retransmissions.\nIf unset, the default value from Network Server configuration will be used." }, "max_nb_trans": { "type": "integer", "format": "int64", "description": "Maximum number of retransmissions.\nIf unset, the default value from Network Server configuration will be used." } }, "description": "EXPERIMENTAL: Data rate index override settings." }, "DynamicModeChannelSteeringSettings": { "type": "object", "properties": { "lora_narrow": { "$ref": "#/definitions/ChannelSteeringSettingsLoRaNarrowMode" }, "disabled": { "$ref": "#/definitions/DynamicModeChannelSteeringSettingsDisabledMode" } }, "description": "EXPERIMENTAL: Channel steering settings." }, "ChannelSteeringSettingsLoRaNarrowMode": { "type": "object", "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." }, "DynamicModeChannelSteeringSettingsDisabledMode": { "type": "object", "description": "Configuration options for cases in which ADR is not supposed to steer the end device\nto another set of channels." }, "v3ADRSettingsDisabledMode": { "type": "object", "description": "Configuration options for cases in which ADR is to be disabled\ncompletely." }, "ADRSettingsStaticMode": { "type": "object", "properties": { "data_rate_index": { "$ref": "#/definitions/v3DataRateIndex", "description": "Data rate index to use." }, "tx_power_index": { "type": "integer", "format": "int64", "description": "Transmission power index to use." }, "nb_trans": { "type": "integer", "format": "int64", "description": "Number of retransmissions." } }, "description": "Configuration options for static ADR." }, "v3DataRateOffsetValue": { "type": "object", "properties": { "value": { "$ref": "#/definitions/v3DataRateOffset" } } }, "v3PowerState": { "type": "string", "enum": [ "POWER_UNKNOWN", "POWER_BATTERY", "POWER_EXTERNAL" ], "default": "POWER_UNKNOWN", "description": "Power state of the device." }, "v3MACSettingsProfileIdentifiers": { "type": "object", "properties": { "application_ids": { "$ref": "#/definitions/v3ApplicationIdentifiers", "description": "Application IDs." }, "profile_id": { "type": "string", "description": "Profile ID." } } }, "v3RootKeys": { "type": "object", "properties": { "root_key_id": { "type": "string", "description": "Join Server issued identifier for the root keys." }, "app_key": { "$ref": "#/definitions/v3KeyEnvelope", "description": "The (encrypted) Application Key." }, "nwk_key": { "$ref": "#/definitions/v3KeyEnvelope", "description": "The (encrypted) Network Key." } }, "description": "Root keys for a LoRaWAN device.\nThese are stored on the Join Server." }, "v3Session": { "type": "object", "properties": { "dev_addr": { "type": "string", "format": "string", "example": "2600ABCD", "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." }, "keys": { "$ref": "#/definitions/v3SessionKeys" }, "last_f_cnt_up": { "type": "integer", "format": "int64", "description": "Last uplink frame counter value used. Network Server only. Application Server assumes the Network Server checked it." }, "last_n_f_cnt_down": { "type": "integer", "format": "int64", "description": "Last network downlink frame counter value used. Network Server only." }, "last_a_f_cnt_down": { "type": "integer", "format": "int64", "description": "Last application downlink frame counter value used. Application Server only." }, "last_conf_f_cnt_down": { "type": "integer", "format": "int64", "description": "Frame counter of the last confirmed downlink message sent. Network Server only." }, "started_at": { "type": "string", "format": "date-time", "description": "Time when the session started. Network Server only." }, "queued_application_downlinks": { "type": "array", "items": { "type": "object", "$ref": "#/definitions/v3ApplicationDownlink" }, "description": "Queued Application downlink messages. Stored in Application Server and Network Server." } } }, "v3MessagePayloadFormatters": { "type": "object", "properties": { "up_formatter": { "$ref": "#/definitions/v3PayloadFormatter", "description": "Payload formatter for uplink messages, must be set together with its parameter." }, "up_formatter_parameter": { "type": "string", "description": "Parameter for the up_formatter, must be set together. The API enforces a maximum length of 64KB, but the size may be restricted further by deployment configuration." }, "down_formatter": { "$ref": "#/definitions/v3PayloadFormatter", "description": "Payload formatter for downlink messages, must be set together with its parameter." }, "down_formatter_parameter": { "type": "string", "description": "Parameter for the down_formatter, must be set together. The API enforces a maximum length of 64KB, but the size may be restricted further by deployment configuration." } } }, "v3PayloadFormatter": { "type": "string", "enum": [ "FORMATTER_NONE", "FORMATTER_REPOSITORY", "FORMATTER_GRPC_SERVICE", "FORMATTER_JAVASCRIPT", "FORMATTER_CAYENNELPP" ], "default": "FORMATTER_NONE", "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." } }, "$ref": "#/definitions/v3EndDevice" }