From 25dc6ac5bde944bb8c559cd554b2b68f63026d33 Mon Sep 17 00:00:00 2001 From: Johan Stokking Date: Fri, 26 Aug 2022 22:38:32 +0200 Subject: [PATCH] console: Configure normalized uplink payload messages --- .../components/events/utils/definitions.js | 1 + .../console/components/events/utils/index.js | 4 + .../console/components/pubsub-form/index.js | 8 ++ .../console/components/pubsub-form/mapping.js | 3 + .../console/components/webhook-form/index.js | 16 +++ .../components/webhook-form/mapping.js | 1 + .../containers/webhook-add/webhook-add.js | 1 + .../connect.js | 1 + .../connect.js | 1 + .../connect.js | 1 + pkg/webui/lib/shared-messages.js | 2 + pkg/webui/locales/en.json | 135 ++++++++++++++++++ 12 files changed, 174 insertions(+) diff --git a/pkg/webui/console/components/events/utils/definitions.js b/pkg/webui/console/components/events/utils/definitions.js index e6d5e1dd24c..a256003b45d 100644 --- a/pkg/webui/console/components/events/utils/definitions.js +++ b/pkg/webui/console/components/events/utils/definitions.js @@ -111,6 +111,7 @@ export const dataTypeMap = { export const applicationUpMessages = [ 'uplink_message', + 'uplink_normalized', 'join_accept', 'downlink_ack', 'downlink_nack', diff --git a/pkg/webui/console/components/events/utils/index.js b/pkg/webui/console/components/events/utils/index.js index 770b61e3960..18ef3daf288 100644 --- a/pkg/webui/console/components/events/utils/index.js +++ b/pkg/webui/console/components/events/utils/index.js @@ -68,6 +68,9 @@ export const getPreviewComponentByApplicationUpMessage = message => { case 'uplink_message': messageType = 'ApplicationUplink' break + case 'uplink_normalized': + messageType = 'ApplicationUplinkNormalized' + break case 'join_accept': messageType = 'ApplicationJoinAccept' break @@ -86,6 +89,7 @@ export const getPreviewComponentByApplicationUpMessage = message => { break case 'service_data': messageType = 'ApplicationServiceData' + break } return messageType in dataTypeMap ? dataTypeMap[messageType] : DefaultPreview diff --git a/pkg/webui/console/components/pubsub-form/index.js b/pkg/webui/console/components/pubsub-form/index.js index 5fa0a6175f2..1db0e11d68e 100644 --- a/pkg/webui/console/components/pubsub-form/index.js +++ b/pkg/webui/console/components/pubsub-form/index.js @@ -355,6 +355,14 @@ export default class PubsubForm extends Component { component={Input.Toggled} description={sharedMessages.eventUplinkMessageDesc} /> + { location_solved: mapPubsubMessageTypeToFormValue(pubsub.location_solved), service_data: mapPubsubMessageTypeToFormValue(pubsub.service_data), uplink_message: mapPubsubMessageTypeToFormValue(pubsub.uplink_message), + uplink_normalized: mapPubsubMessageTypeToFormValue(pubsub.uplink_normalized), } return result @@ -137,6 +138,7 @@ export const mapFormValuesToPubsub = (values, appId) => { location_solved: mapMessageTypeFormValueToPubsubMessageType(values.location_solved), service_data: mapMessageTypeFormValueToPubsubMessageType(values.service_data), uplink_message: mapMessageTypeFormValueToPubsubMessageType(values.uplink_message), + uplink_normalized: mapMessageTypeFormValueToPubsubMessageType(values.uplink_normalized), } switch (values._provider) { @@ -172,4 +174,5 @@ export const blankValues = { location_solved: { enabled: false, value: '' }, service_data: { enabled: false, value: '' }, uplink_message: { enabled: false, value: '' }, + uplink_normalized: { enabled: false, value: '' }, } diff --git a/pkg/webui/console/components/webhook-form/index.js b/pkg/webui/console/components/webhook-form/index.js index 07b352203a1..7b8d4def53a 100644 --- a/pkg/webui/console/components/webhook-form/index.js +++ b/pkg/webui/console/components/webhook-form/index.js @@ -168,6 +168,12 @@ const validationSchema = Yup.object().shape({ }) .test('has path length at most 64 characters', m.messagePathValidateTooLong, messageCheck) .nullable(), + uplink_normalized: Yup.object() + .shape({ + path: Yup.string(), + }) + .test('has path length at most 64 characters', m.messagePathValidateTooLong, messageCheck) + .nullable(), join_accept: Yup.object() .shape({ path: Yup.string(), @@ -516,6 +522,16 @@ export default class WebhookForm extends Component { component={Input.Toggled} description={sharedMessages.eventUplinkMessageDesc} /> + { template_fields: fields, base_url: urlTemplate.parse(template.base_url).expand(fields), uplink_message: pathExpand(template.uplink_message, fields), + uplink_normalized: pathExpand(template.uplink_normalized, fields), join_accept: pathExpand(template.join_accept, fields), downlink_ack: pathExpand(template.downlink_ack, fields), downlink_nack: pathExpand(template.downlink_nack, fields), diff --git a/pkg/webui/console/views/application-integrations-pubsub-edit/connect.js b/pkg/webui/console/views/application-integrations-pubsub-edit/connect.js index a52eff280a3..6ea7824986f 100644 --- a/pkg/webui/console/views/application-integrations-pubsub-edit/connect.js +++ b/pkg/webui/console/views/application-integrations-pubsub-edit/connect.js @@ -49,6 +49,7 @@ const pubsubEntitySelector = [ 'location_solved', 'service_data', 'uplink_message', + 'uplink_normalized', ] const mapStateToProps = state => ({ diff --git a/pkg/webui/console/views/application-integrations-webhook-edit/connect.js b/pkg/webui/console/views/application-integrations-webhook-edit/connect.js index ffbed7df837..941ce5a9e9b 100644 --- a/pkg/webui/console/views/application-integrations-webhook-edit/connect.js +++ b/pkg/webui/console/views/application-integrations-webhook-edit/connect.js @@ -35,6 +35,7 @@ const webhookEntitySelector = [ 'headers', 'downlink_api_key', 'uplink_message', + 'uplink_normalized', 'join_accept', 'downlink_ack', 'downlink_nack', diff --git a/pkg/webui/console/views/application-integrations-webhooks/connect.js b/pkg/webui/console/views/application-integrations-webhooks/connect.js index ddad4abc1c0..1a8bf918416 100644 --- a/pkg/webui/console/views/application-integrations-webhooks/connect.js +++ b/pkg/webui/console/views/application-integrations-webhooks/connect.js @@ -51,6 +51,7 @@ const selector = [ 'name', 'service_data', 'uplink_message', + 'uplink_normalized', ] const mapStateToProps = state => ({ diff --git a/pkg/webui/lib/shared-messages.js b/pkg/webui/lib/shared-messages.js index 9cf785e3add..9943f3a56f8 100644 --- a/pkg/webui/lib/shared-messages.js +++ b/pkg/webui/lib/shared-messages.js @@ -189,6 +189,7 @@ export default defineMessages({ eventLocationSolvedDesc: 'An integration succeeded locating the end device', eventServiceDataDesc: 'An integration emits an event', eventUplinkMessageDesc: 'An uplink message is received by the application', + eventUplinkNormalizedDesc: 'A normalized uplink payload', eventsCannotShow: 'Cannot show events', expiry: 'Expiry', exportJson: 'Export as JSON', @@ -416,6 +417,7 @@ export default defineMessages({ uplink: 'Uplink', uplinkFrameCount: 'Uplink frame count', uplinkMessage: 'Uplink message', + uplinkNormalized: 'Normalized uplink', uplinksReceived: 'Uplinks received', unexposed: 'Unexposed', used: '{currentValue}/{maxValue} used', diff --git a/pkg/webui/locales/en.json b/pkg/webui/locales/en.json index 834c4fc18a3..3fc243ed67b 100644 --- a/pkg/webui/locales/en.json +++ b/pkg/webui/locales/en.json @@ -140,9 +140,20 @@ "account.views.validate.index.validatingAccount": "Validating account…", "account.views.validate.index.tokenNotFoundTitle": "Token not found", "account.views.validate.index.tokenNotFoundMessage": "The validation token was not found. This could mean that the contact info has already been validated. Otherwise, please contact an administrator.", + "claim.containers.device-claim-form.index.claimRecognized": "End device JoinEUI `{joinEUI}` and DevEUI `{devEUI}` recognized", + "claim.containers.device-claim-form.index.claimAuthMessage": "Scan authentication QR code", + "claim.containers.device-claim-form.index.claimInvalid": "Invalid authentication QR code", + "claim.store.middleware.logics.lib.applicationIsOfflineTitle": "The application is offline", + "claim.store.middleware.logics.lib.applicationIsOfflineMessage": "The action cannot be performed because the application is currently offline or has connection issues. Please check your internet connection and try again.", + "claim.views.device-claim.index.claimSuccess": "End device JoinEUI `{joinEUI}` and DevEUI `{devEUI}` Device ID `{DeviceId}` claimed", "components.collapse.index.collapse": "Collapse", "components.collapse.index.expand": "Expand", "components.data-sheet.index.noData": "No data available", + "components.disclaimer-cycler.index.fairUsePolicyApplies": "Fair use policy applies", + "components.disclaimer-cycler.index.slaApplies": "{sla} SLA applies", + "components.disclaimer-cycler.index.noSla": "No SLA applicable", + "components.disclaimer-cycler.index.supportPlanApplies": "{support} support applies", + "components.disclaimer-cycler.index.noSupportPlan": "No support plan", "components.error-notification.story.problem": "We got a problem here!", "components.error-notification.story.lengthyProblem": "We got a problem here! And the description is quite lengthy as well, which can sometimes be a problem.", "components.file-input.index.selectAFile": "Select a file…", @@ -453,6 +464,47 @@ "console.containers.applications-table.index.purgeSuccess": "Application purged", "console.containers.applications-table.index.purgeFail": "There was an error and the application could not be purged", "console.containers.applications-table.index.otherClusterTooltip": "This application is registered on a different cluster (`{host}`). To access this application, use the Console of the cluster that this application was registered on.", + "console.containers.aws-iot-integration-form.index.assumeRoleArn": "Role ARN", + "console.containers.aws-iot-integration-form.index.assumeRoleArnDescription": "Copy the CloudFormation stack \"CrossAccountRoleArn\" output", + "console.containers.aws-iot-integration-form.index.disable": "Disable AWS IoT integration", + "console.containers.aws-iot-integration-form.index.disabled": "AWS IoT integration disabled", + "console.containers.aws-iot-integration-form.index.disableWarning": "Are you sure you want to disable the integration?", + "console.containers.aws-iot-integration-form.index.enable": "Enable AWS IoT integration", + "console.containers.aws-iot-integration-form.index.enabled": "AWS IoT integration enabled", + "console.containers.aws-iot-integration-form.index.region": "Region", + "console.containers.aws-iot-integration-form.index.stackName": "CloudFormation stack name", + "console.containers.aws-iot-integration-form.index.stackNameDescription": "Copy the CloudFormation stack name that you used when deploying the integration in your AWS account", + "console.containers.aws-iot-integration-form.index.update": "Update AWS IoT integration", + "console.containers.aws-iot-integration-form.index.updated": "AWS IoT integration updated", + "console.containers.aws-iot-integration-form.index.validateRoleArnFormat": "{field} must be a valid AWS IAM role ARN", + "console.containers.aws-iot-integration-form.index.validateStackNameFormat": "{field} must be a valid AWS CloudFormation stack name", + "console.containers.azure-iot-integration.central-integration-form.index.accessKey": "Azure Device Provisioning Service access key", + "console.containers.azure-iot-integration.central-integration-form.index.accessKeyDescription": "Provide the access key to be used for device provisioning", + "console.containers.azure-iot-integration.central-integration-form.index.delete": "Delete Azure IoT Central integration", + "console.containers.azure-iot-integration.central-integration-form.index.deleted": "Azure IoT Central integration deleted", + "console.containers.azure-iot-integration.central-integration-form.index.deleteWarning": "Are you sure you want to delete the integration?", + "console.containers.azure-iot-integration.central-integration-form.index.enable": "Enable Azure IoT Central integration", + "console.containers.azure-iot-integration.central-integration-form.index.enabled": "Azure IoT Central integration enabled", + "console.containers.azure-iot-integration.central-integration-form.index.scopeId": "Azure Device Provisioning Service scope ID", + "console.containers.azure-iot-integration.central-integration-form.index.scopeIdDescription": "Provide the scope ID to be used for device provisioning", + "console.containers.azure-iot-integration.central-integration-form.index.update": "Update Azure IoT Central integration", + "console.containers.azure-iot-integration.central-integration-form.index.updated": "Azure IoT Central integration updated", + "console.containers.azure-iot-integration.hub-integration-form.index.accessKey": "Azure IoT Hub access key", + "console.containers.azure-iot-integration.hub-integration-form.index.accessKeyDescription": "Copy the Azure deployment \"iotHubOwnerKey\" output", + "console.containers.azure-iot-integration.hub-integration-form.index.delete": "Delete Azure IoT Hub integration", + "console.containers.azure-iot-integration.hub-integration-form.index.deleted": "Azure IoT Hub integration deleted", + "console.containers.azure-iot-integration.hub-integration-form.index.deleteWarning": "Are you sure you want to delete the integration?", + "console.containers.azure-iot-integration.hub-integration-form.index.enable": "Enable Azure IoT Hub integration", + "console.containers.azure-iot-integration.hub-integration-form.index.enabled": "Azure IoT Hub integration enabled", + "console.containers.azure-iot-integration.hub-integration-form.index.hostName": "Azure IoT Hub hostname", + "console.containers.azure-iot-integration.hub-integration-form.index.hostNameDescription": "Copy the Azure deployment \"iotHubHostname\" output", + "console.containers.azure-iot-integration.hub-integration-form.index.update": "Update Azure IoT Hub integration", + "console.containers.azure-iot-integration.hub-integration-form.index.updated": "Azure IoT Hub integration updated", + "console.containers.azure-iot-integration.hub-integration-form.index.validateHostNameFormat": "{field} must be a valid Azure IoT Hostname", + "console.containers.azure-iot-integration.shared.index.reportedPropertiesFilter": "Reported properties filter", + "console.containers.azure-iot-integration.shared.index.reportedPropertiesFilterInfo": "For each enabled message type, the integration will update the reported properties on behalf of the end device", + "console.containers.azure-iot-integration.shared.index.eventFilter": "Event filter", + "console.containers.azure-iot-integration.shared.index.eventFilterInfo": "For each enabled message type, the integration will submit device events on behalf of the end device", "console.containers.collaborators-table.index.id": "User / Organization ID", "console.containers.dev-addr-input.dev-addr-input.generate": "Generate end device address", "console.containers.dev-addr-input.index.devAddrFetchingFailure": "There was an error and the end device address could not be generated", @@ -508,10 +560,15 @@ "console.containers.gateway-location-form.gateway-location-form.locationFromStatusMessage": "Location set automatically from status messages", "console.containers.gateway-location-form.gateway-location-form.setLocationManually": "Set location manually", "console.containers.gateway-location-form.gateway-location-form.noLocationSetInfo": "This gateway has no location information set", + "console.containers.gateway-onboarding-form.gateway-provisioning-form.gateway-claim-form-section.index.claimWarning": "We detected that your gateway is likely a The Things Indoor Gateway that uses gateway claiming. Use the WIFI password printed on the TTIG as claim authentication code below.", + "console.containers.gateway-onboarding-form.gateway-provisioning-form.gateway-claim-form-section.index.claimGateway": "Claim gateway", "console.containers.gateway-onboarding-form.gateway-provisioning-form.gateway-registration-form-section.index.requireAuthenticatedConnectionDescription": "Select which information can be seen by other network participants, including {packetBrokerURL}", "console.containers.gateway-onboarding-form.gateway-provisioning-form.gateway-registration-form-section.index.shareGatewayInfoDescription": "Choose this option eg. if your gateway is powered by {loraBasicStationURL}", "console.containers.gateway-onboarding-form.gateway-provisioning-form.gateway-registration-form-section.index.generateAPIKeyCups": "Generate API key for CUPS", "console.containers.gateway-onboarding-form.gateway-provisioning-form.gateway-registration-form-section.index.generateAPIKeyLNS": "Generate API key for LNS", + "console.containers.gateway-onboarding-form.gateway-provisioning-form.index.continue": "To continue, please confirm the Gateway EUI so we can determine onboarding options", + "console.containers.gateway-onboarding-form.gateway-provisioning-form.index.emtyEui": "Continue without EUI", + "console.containers.gateway-onboarding-form.gateway-provisioning-form.index.noEui": "No gateway EUI", "console.containers.gateways-table.index.ownedTabTitle": "Owned gateways", "console.containers.gateways-table.index.restoreSuccess": "Gateway restored", "console.containers.gateways-table.index.restoreFail": "There was an error and the gateway could not be restored", @@ -553,6 +610,61 @@ "console.containers.pubsub-formats-select.index.warning": "Pub/Sub formats unavailable", "console.containers.pubsubs-table.index.format": "Format", "console.containers.pubsubs-table.index.host": "Server host", + "console.containers.storage-integration-panel.index.isActivated": "The Storage Integration is currently activated", + "console.containers.storage-integration-panel.index.isDeactivated": "The Storage Integration is currently deactivated", + "console.containers.storage-integration-panel.index.activate": "Activate Storage Integration", + "console.containers.storage-integration-panel.index.deactivate": "Deactivate Storage Integration", + "console.containers.storage-integration-panel.index.apiInfo": "You can use the endpoints below to retrieve data from the storage. For detailed API description, see Storage Integration API.", + "console.containers.tenant-settings-form.messages.adminRightsAll": "Grant all rights to admins", + "console.containers.tenant-settings-form.messages.endDevicePictureDisableUpload": "Disable user upload of end device pictures", + "console.containers.tenant-settings-form.messages.profilePictureDisableUpload": "Disable profile picture uploads", + "console.containers.tenant-settings-form.messages.profilePictureDisableUploadDesc": "Uploading end device pictures is currently CLI only", + "console.containers.tenant-settings-form.messages.profilePictureUseGravatar": "Enable Gravatar for profile pictures", + "console.containers.tenant-settings-form.messages.profilePictureUseGravatarDesc": "Allows users to use a Gravatar associated with their email address", + "console.containers.tenant-settings-form.messages.userRegistration": "User registration", + "console.containers.tenant-settings-form.messages.userRegistrationDesc": "Customize how new user accounts are created, handled and validated.", + "console.containers.tenant-settings-form.messages.userRegistrationAdminApproval": "Require admin approval of new users", + "console.containers.tenant-settings-form.messages.userRegistrationContactInfoValidationRequired": "Require validation of user contact information", + "console.containers.tenant-settings-form.messages.userRegistrationContactInfoValidationDesc": "If enabled, users will have to verify their emails before usage", + "console.containers.tenant-settings-form.messages.userRegistrationAdminApprovalDesc": "If enabled, unapproved users will not be automatically approved", + "console.containers.tenant-settings-form.messages.userRegistrationEnabled": "Enable user registration", + "console.containers.tenant-settings-form.messages.userRegistrationEnabledDescription": "Disabling user registration will remove the registration screen; admins can still create new users manually", + "console.containers.tenant-settings-form.messages.userRegistrationInvitationRequired": "Allow user registration via invitation only", + "console.containers.tenant-settings-form.messages.userRegistrationInvitationDesc": "Invitations can be sent from admins (currently CLI only)", + "console.containers.tenant-settings-form.messages.userRegistrationInvitationTokenTTL": "Duration of the invitation token", + "console.containers.tenant-settings-form.messages.invitationTokenDesc": "Determines how long the invitation token is valid after being sent via email", + "console.containers.tenant-settings-form.messages.passwordRequirements": "Password requirements", + "console.containers.tenant-settings-form.messages.passwordRequirementsDesc": "Control security characteristics of user defined passwords.", + "console.containers.tenant-settings-form.messages.userRegistrationPasswordMaxLength": "Max. length", + "console.containers.tenant-settings-form.messages.userRegistrationPasswordMinDigits": "Min. digits", + "console.containers.tenant-settings-form.messages.userRegistrationPasswordMinLength": "Min. length", + "console.containers.tenant-settings-form.messages.userRegistrationPasswordMinSpecial": "Min. special characters", + "console.containers.tenant-settings-form.messages.userRegistrationPasswordMinUppercase": "Min. uppercase characters", + "console.containers.tenant-settings-form.messages.userRights": "User rights", + "console.containers.tenant-settings-form.messages.userRightsDesc": "Manage global rights for regular users and administrators.", + "console.containers.tenant-settings-form.messages.userRightsCreateApplications": "Users may create applications", + "console.containers.tenant-settings-form.messages.userRightsCreateClients": "Users may create OAuth clients", + "console.containers.tenant-settings-form.messages.userRightsCreateGateways": "Users may create gateways", + "console.containers.tenant-settings-form.messages.userRightsCreateOrganizations": "Users may create organizations", + "console.containers.tenant-settings-form.messages.networkSettings": "Network settings", + "console.containers.tenant-settings-form.messages.networkSettingsDesc": "Manage deduplication windows and end device address prefixes.", + "console.containers.tenant-settings-form.messages.cooldownWindow": "Cooldown window", + "console.containers.tenant-settings-form.messages.deduplicationWindow": "Deduplication window", + "console.containers.tenant-settings-form.messages.addPrefix": "Add prefix", + "console.containers.tenant-settings-form.messages.addPrefixPlaceholder": "e.g. 26000000/7", + "console.containers.tenant-settings-form.messages.devAddrPrefixes": "Device address prefixes", + "console.containers.tenant-settings-form.messages.brandingBaseUrl": "Branding base URL", + "console.containers.tenant-settings-form.messages.brandingBaseUrlDesc": "Controls where branding assets are sourced from. See Web UI Branding for more information.", + "console.containers.tenant-settings-form.messages.branding": "Branding", + "console.containers.tenant-settings-form.messages.brandingDesc": "Enable custom branded assets.", + "console.containers.tenant-settings-form.messages.uploads": "Uploads", + "console.containers.tenant-settings-form.messages.uploadsDesc": "Restrict or enable user image uploads and Gravatar settings.", + "console.containers.tenant-settings-form.messages.useDefaultSettings": "Use global default settings", + "console.containers.tenant-settings-form.messages.useDefaultSettingsDesc": "Global defaults are set by deployment owners", + "console.containers.tenant-settings-form.messages.successMessage": "Tenant settings updated. It can take some minutes for these changes to become effective.", + "console.containers.tenant-settings-form.messages.adminRightsAllDesc": "Grant access to all information (including keys) of entities not owned by admins", + "console.containers.tenant-settings-form.messages.devAddrPrefixesEmptyValidation": "Prefixes may not be empty. Please remove empty entries.", + "console.containers.tenant-settings-form.messages.devAddrPrefixesFormatValidation": "Prefixes must be in the format \"00000000/0\"", "console.containers.users-table.index.invite": "Invite user", "console.containers.users-table.index.revokeInvitation": "Revoke this invitation", "console.containers.users-table.index.sentAt": "Sent", @@ -703,6 +815,25 @@ "console.views.application-general-settings.application-general-settings.modalWarning": "Are you sure you want to delete \"{appName}\"? This action cannot be undone and it will not be possible to reuse the application ID.", "console.views.application-general-settings.application-general-settings.updateSuccess": "Application updated", "console.views.application-general-settings.application-general-settings.deleteSuccess": "Application deleted", + "console.views.application-integrations-aws-iot.index.awsIoTDefaultIntegration": "AWS IoT Default Integration", + "console.views.application-integrations-aws-iot.index.awsIoTIntegration": "AWS IoT integration", + "console.views.application-integrations-aws-iot.index.configuration": "Configuration", + "console.views.application-integrations-aws-iot.index.deploymentGuide": "Deployment Guide", + "console.views.application-integrations-aws-iot.index.infoText": "The AWS IoT integration supports streaming data, creating and claiming end devices, advanced security and metrics. This integration comes with an AWS CloudFormation template to deploy in your AWS account. Click Deployment Guide below to learn how to deploy the CloudFormation template.", + "console.views.application-integrations-azure.index.clusterAddress": "Cluster address", + "console.views.application-integrations-azure.index.configuration": "Configuration", + "console.views.application-integrations-azure.index.credentials": "Credentials", + "console.views.application-integrations-azure.index.dataExportAddress": "Data Export address", + "console.views.application-integrations-azure.index.dataExportHeaderKey": "Data Export header key", + "console.views.application-integrations-azure.index.dataExportHeaderValue": "Data Export header value", + "console.views.application-integrations-azure.index.generateApiKey": "Generate API Key", + "console.views.application-integrations-azure.index.goToApiKeys": "Go to API keys", + "console.views.application-integrations-azure.index.infoText": "The Azure Internet of Things (IoT) is a collection of Microsoft-managed cloud services that connect, monitor, and control billions of IoT assets. You can setup our Azure IoT integrations below.", + "console.views.application-integrations-azure.index.iotCentralInfo": "The Azure IoT Central integration supports streaming data and device twins. This integration connects to an Azure IoT Central application running in your Azure account.", + "console.views.application-integrations-azure.index.iotCentralIntegration": "Azure IoT Central Integration", + "console.views.application-integrations-azure.index.iotHubDeploymentGuide": "Azure IoT Hub Deployment Guide", + "console.views.application-integrations-azure.index.iotHubInfo": "The Azure IoT Hub integration supports streaming data, creating end devices and device twins. This integration comes with an Azure Resource Manager template to deploy in your Azure account.", + "console.views.application-integrations-azure.index.iotHubIntegration": "Azure IoT Hub Integration", "console.views.application-integrations-lora-cloud.index.loraCloudInfoText": "Lora Cloud provides value added APIs that enable simple solutions for common tasks related to LoRaWAN networks and LoRa-based devices. You can setup our LoRaCloud integrations below.", "console.views.application-integrations-lora-cloud.index.officialLoRaCloudDocumentation": "Official LoRa Cloud documentation", "console.views.application-integrations-lora-cloud.index.setToken": "Set LoRa Cloud token", @@ -722,6 +853,8 @@ "console.views.application-integrations-pubsub-edit.application-integrations-pubsub-edit.editPubsub": "Edit Pub/Sub", "console.views.application-integrations-pubsub-edit.application-integrations-pubsub-edit.updateSuccess": "Pub/Sub updated", "console.views.application-integrations-pubsub-edit.application-integrations-pubsub-edit.deleteSuccess": "Pub/Sub deleted", + "console.views.application-integrations-storage.index.storageIntegrationInfo": "The Storage Integration allows storing received upstream messages in a persistent database, and retrieving them at a later time. This integration is implemented as an Application Package and can be enabled per application or per end device.", + "console.views.application-integrations-storage.index.storageIntegrationApi": "Storage Integration API", "console.views.application-integrations-webhook-add-choose.application-integrations-webhook-add-choose.chooseTemplate": "Choose webhook template", "console.views.application-integrations-webhook-add-choose.application-integrations-webhook-add-choose.customTileDescription": "Create a custom webhook without template", "console.views.application-integrations-webhook-add-form.application-integrations-webhook-add-form.addCustomWebhook": "Add custom webhook", @@ -1219,6 +1352,7 @@ "lib.shared-messages.eventLocationSolvedDesc": "An integration succeeded locating the end device", "lib.shared-messages.eventServiceDataDesc": "An integration emits an event", "lib.shared-messages.eventUplinkMessageDesc": "An uplink message is received by the application", + "lib.shared-messages.eventUplinkNormalizedDesc": "A normalized uplink payload", "lib.shared-messages.eventsCannotShow": "Cannot show events", "lib.shared-messages.expiry": "Expiry", "lib.shared-messages.exportJson": "Export as JSON", @@ -1436,6 +1570,7 @@ "lib.shared-messages.uplink": "Uplink", "lib.shared-messages.uplinkFrameCount": "Uplink frame count", "lib.shared-messages.uplinkMessage": "Uplink message", + "lib.shared-messages.uplinkNormalized": "Normalized uplink", "lib.shared-messages.uplinksReceived": "Uplinks received", "lib.shared-messages.unexposed": "Unexposed", "lib.shared-messages.used": "{currentValue}/{maxValue} used",