\n\n',components:[{type:V.MatFormField,selector:"mat-form-field",inputs:["color","floatLabel","appearance","hideRequiredMarker","hintLabel"],exportAs:["matFormField"]},{type:B.MatSelect,selector:"mat-select",inputs:["disabled","disableRipple","tabIndex"],exportAs:["matSelect"]},{type:K.MatOption,selector:"mat-option",exportAs:["matOption"]},{type:E.MatCheckbox,selector:"mat-checkbox",inputs:["disableRipple","color","tabIndex","aria-label","aria-labelledby","id","labelPosition","name","required","checked","disabled","indeterminate","aria-describedby","value"],outputs:["change","indeterminateChange"],exportAs:["matCheckbox"]}],directives:[{type:P.DefaultLayoutDirective,selector:" [fxLayout], [fxLayout.xs], [fxLayout.sm], [fxLayout.md], [fxLayout.lg], [fxLayout.xl], [fxLayout.lt-sm], [fxLayout.lt-md], [fxLayout.lt-lg], [fxLayout.lt-xl], [fxLayout.gt-xs], [fxLayout.gt-sm], [fxLayout.gt-md], [fxLayout.gt-lg]",inputs:["fxLayout","fxLayout.xs","fxLayout.sm","fxLayout.md","fxLayout.lg","fxLayout.xl","fxLayout.lt-sm","fxLayout.lt-md","fxLayout.lt-lg","fxLayout.lt-xl","fxLayout.gt-xs","fxLayout.gt-sm","fxLayout.gt-md","fxLayout.gt-lg"]},{type:M.NgControlStatusGroup,selector:"[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]"},{type:M.FormGroupDirective,selector:"[formGroup]",inputs:["formGroup"],outputs:["ngSubmit"],exportAs:["ngForm"]},{type:P.DefaultFlexDirective,selector:" [fxFlex], [fxFlex.xs], [fxFlex.sm], [fxFlex.md], [fxFlex.lg], [fxFlex.xl], [fxFlex.lt-sm], [fxFlex.lt-md], [fxFlex.lt-lg], [fxFlex.lt-xl], [fxFlex.gt-xs], [fxFlex.gt-sm], [fxFlex.gt-md], [fxFlex.gt-lg]",inputs:["fxFlex","fxFlex.xs","fxFlex.sm","fxFlex.md","fxFlex.lg","fxFlex.xl","fxFlex.lt-sm","fxFlex.lt-md","fxFlex.lt-lg","fxFlex.lt-xl","fxFlex.gt-xs","fxFlex.gt-sm","fxFlex.gt-md","fxFlex.gt-lg"]},{type:V.MatLabel,selector:"mat-label"},{type:R.TranslateDirective,selector:"[translate],[ngx-translate]",inputs:["translate","translateParams"]},{type:M.NgControlStatus,selector:"[formControlName],[ngModel],[formControl]"},{type:M.FormControlName,selector:"[formControlName]",inputs:["disabled","formControlName","ngModel"],outputs:["ngModelChange"]},{type:M.RequiredValidator,selector:":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]",inputs:["required"]},{type:w.NgForOf,selector:"[ngFor][ngForOf]",inputs:["ngForOf","ngForTrackBy","ngForTemplate"]},{type:w.NgIf,selector:"[ngIf]",inputs:["ngIf","ngIfThen","ngIfElse"]}],pipes:{translate:R.TranslatePipe}}),e.ɵɵngDeclareClassMetadata({minVersion:"12.0.0",version:"12.2.16",ngImport:e,type:Pt,decorators:[{type:o,args:[{selector:"tb-action-node-attributes-config",templateUrl:"./attributes-config.component.html",styleUrls:[]}]}],ctorParameters:function(){return[{type:k.Store},{type:M.FormBuilder}]}}),function(t){t.CUSTOMER="CUSTOMER",t.TENANT="TENANT",t.RELATED="RELATED",t.ALARM_ORIGINATOR="ALARM_ORIGINATOR",t.ENTITY="ENTITY"}(Rt||(Rt={}));const Ot=new Map([[Rt.CUSTOMER,"tb.rulenode.originator-customer"],[Rt.TENANT,"tb.rulenode.originator-tenant"],[Rt.RELATED,"tb.rulenode.originator-related"],[Rt.ALARM_ORIGINATOR,"tb.rulenode.originator-alarm-originator"],[Rt.ENTITY,"tb.rulenode.originator-entity"]]);var wt;!function(t){t.CIRCLE="CIRCLE",t.POLYGON="POLYGON"}(wt||(wt={}));const Ht=new Map([[wt.CIRCLE,"tb.rulenode.perimeter-circle"],[wt.POLYGON,"tb.rulenode.perimeter-polygon"]]);var Ut;!function(t){t.MILLISECONDS="MILLISECONDS",t.SECONDS="SECONDS",t.MINUTES="MINUTES",t.HOURS="HOURS",t.DAYS="DAYS"}(Ut||(Ut={}));const Bt=new Map([[Ut.MILLISECONDS,"tb.rulenode.time-unit-milliseconds"],[Ut.SECONDS,"tb.rulenode.time-unit-seconds"],[Ut.MINUTES,"tb.rulenode.time-unit-minutes"],[Ut.HOURS,"tb.rulenode.time-unit-hours"],[Ut.DAYS,"tb.rulenode.time-unit-days"]]);var Kt;!function(t){t.METER="METER",t.KILOMETER="KILOMETER",t.FOOT="FOOT",t.MILE="MILE",t.NAUTICAL_MILE="NAUTICAL_MILE"}(Kt||(Kt={}));const jt=new Map([[Kt.METER,"tb.rulenode.range-unit-meter"],[Kt.KILOMETER,"tb.rulenode.range-unit-kilometer"],[Kt.FOOT,"tb.rulenode.range-unit-foot"],[Kt.MILE,"tb.rulenode.range-unit-mile"],[Kt.NAUTICAL_MILE,"tb.rulenode.range-unit-nautical-mile"]]);var _t;!function(t){t.ID="ID",t.TITLE="TITLE",t.COUNTRY="COUNTRY",t.STATE="STATE",t.CITY="CITY",t.ZIP="ZIP",t.ADDRESS="ADDRESS",t.ADDRESS2="ADDRESS2",t.PHONE="PHONE",t.EMAIL="EMAIL",t.ADDITIONAL_INFO="ADDITIONAL_INFO"}(_t||(_t={}));const zt=new Map([[_t.TITLE,"tb.rulenode.entity-details-title"],[_t.COUNTRY,"tb.rulenode.entity-details-country"],[_t.STATE,"tb.rulenode.entity-details-state"],[_t.CITY,"tb.rulenode.entity-details-city"],[_t.ZIP,"tb.rulenode.entity-details-zip"],[_t.ADDRESS,"tb.rulenode.entity-details-address"],[_t.ADDRESS2,"tb.rulenode.entity-details-address2"],[_t.PHONE,"tb.rulenode.entity-details-phone"],[_t.EMAIL,"tb.rulenode.entity-details-email"],[_t.ADDITIONAL_INFO,"tb.rulenode.entity-details-additional_info"]]);var Jt,Qt,$t;!function(t){t.FIRST="FIRST",t.LAST="LAST",t.ALL="ALL"}(Jt||(Jt={})),function(t){t.ASC="ASC",t.DESC="DESC"}(Qt||(Qt={})),function(t){t.STANDARD="STANDARD",t.FIFO="FIFO"}($t||($t={}));const Wt=new Map([[$t.STANDARD,"tb.rulenode.sqs-queue-standard"],[$t.FIFO,"tb.rulenode.sqs-queue-fifo"]]),Yt=["anonymous","basic","cert.PEM"],Xt=new Map([["anonymous","tb.rulenode.credentials-anonymous"],["basic","tb.rulenode.credentials-basic"],["cert.PEM","tb.rulenode.credentials-pem"]]),Zt=["sas","cert.PEM"],te=new Map([["sas","tb.rulenode.credentials-sas"],["cert.PEM","tb.rulenode.credentials-pem"]]);var ee;!function(t){t.GET="GET",t.POST="POST",t.PUT="PUT",t.DELETE="DELETE"}(ee||(ee={}));const oe=["US-ASCII","ISO-8859-1","UTF-8","UTF-16BE","UTF-16LE","UTF-16"],re=new Map([["US-ASCII","tb.rulenode.charset-us-ascii"],["ISO-8859-1","tb.rulenode.charset-iso-8859-1"],["UTF-8","tb.rulenode.charset-utf-8"],["UTF-16BE","tb.rulenode.charset-utf-16be"],["UTF-16LE","tb.rulenode.charset-utf-16le"],["UTF-16","tb.rulenode.charset-utf-16"]]);var ae;!function(t){t.CUSTOM="CUSTOM",t.ADD="ADD",t.SUB="SUB",t.MULT="MULT",t.DIV="DIV",t.SIN="SIN",t.SINH="SINH",t.COS="COS",t.COSH="COSH",t.TAN="TAN",t.TANH="TANH",t.ACOS="ACOS",t.ASIN="ASIN",t.ATAN="ATAN",t.ATAN2="ATAN2",t.EXP="EXP",t.EXPM1="EXPM1",t.SQRT="SQRT",t.CBRT="CBRT",t.GET_EXP="GET_EXP",t.HYPOT="HYPOT",t.LOG="LOG",t.LOG10="LOG10",t.LOG1P="LOG1P",t.CEIL="CEIL",t.FLOOR="FLOOR",t.FLOOR_DIV="FLOOR_DIV",t.FLOOR_MOD="FLOOR_MOD",t.ABS="ABS",t.MIN="MIN",t.MAX="MAX",t.POW="POW",t.SIGNUM="SIGNUM",t.RAD="RAD",t.DEG="DEG"}(ae||(ae={}));const ne=new Map([[ae.CUSTOM,{value:ae.CUSTOM,name:"Custom Function",description:"Use this function to specify complex mathematical expression.",minArgs:1,maxArgs:16}],[ae.ADD,{value:ae.ADD,name:"Addition",description:"x + y",minArgs:2,maxArgs:2}],[ae.SUB,{value:ae.SUB,name:"Subtraction",description:"x - y",minArgs:2,maxArgs:2}],[ae.MULT,{value:ae.MULT,name:"Multiplication",description:"x * y",minArgs:2,maxArgs:2}],[ae.DIV,{value:ae.DIV,name:"Division",description:"x / y",minArgs:2,maxArgs:2}],[ae.SIN,{value:ae.SIN,name:"Sine",description:"Returns the trigonometric sine of an angle in radians.",minArgs:1,maxArgs:1}],[ae.SINH,{value:ae.SINH,name:"Hyperbolic sine",description:"Returns the hyperbolic sine of an argument.",minArgs:1,maxArgs:1}],[ae.COS,{value:ae.COS,name:"Cosine",description:"Returns the trigonometric cosine of an angle in radians.",minArgs:1,maxArgs:1}],[ae.COSH,{value:ae.COSH,name:"Hyperbolic cosine",description:"Returns the hyperbolic cosine of an argument.",minArgs:1,maxArgs:1}],[ae.TAN,{value:ae.TAN,name:"Tangent",description:"Returns the trigonometric tangent of an angle in radians",minArgs:1,maxArgs:1}],[ae.TANH,{value:ae.TANH,name:"Hyperbolic tangent",description:"Returns the hyperbolic tangent of an argument",minArgs:1,maxArgs:1}],[ae.ACOS,{value:ae.ACOS,name:"Arc cosine",description:"Returns the arc cosine of an argument",minArgs:1,maxArgs:1}],[ae.ASIN,{value:ae.ASIN,name:"Arc sine",description:"Returns the arc sine of an argument",minArgs:1,maxArgs:1}],[ae.ATAN,{value:ae.ATAN,name:"Arc tangent",description:"Returns the arc tangent of an argument",minArgs:1,maxArgs:1}],[ae.ATAN2,{value:ae.ATAN2,name:"2-argument arc tangent",description:"Returns the angle theta from the conversion of rectangular coordinates (x, y) to polar coordinates (r, theta)",minArgs:2,maxArgs:2}],[ae.EXP,{value:ae.EXP,name:"Exponential",description:"Returns Euler's number e raised to the power of an argument",minArgs:1,maxArgs:1}],[ae.EXPM1,{value:ae.EXPM1,name:"Exponential minus one",description:"Returns Euler's number e raised to the power of an argument minus one",minArgs:1,maxArgs:1}],[ae.SQRT,{value:ae.SQRT,name:"Square",description:"Returns the correctly rounded positive square root of an argument",minArgs:1,maxArgs:1}],[ae.CBRT,{value:ae.CBRT,name:"Cube root",description:"Returns the cube root of an argument",minArgs:1,maxArgs:1}],[ae.GET_EXP,{value:ae.GET_EXP,name:"Get exponent",description:"Returns the unbiased exponent used in the representation of an argument",minArgs:1,maxArgs:1}],[ae.HYPOT,{value:ae.HYPOT,name:"Square root",description:"Returns the square root of the squares of the arguments",minArgs:2,maxArgs:2}],[ae.LOG,{value:ae.LOG,name:"Logarithm",description:"Returns the natural logarithm of an argument",minArgs:1,maxArgs:1}],[ae.LOG10,{value:ae.LOG10,name:"Base 10 logarithm",description:"Returns the base 10 logarithm of an argument",minArgs:1,maxArgs:1}],[ae.LOG1P,{value:ae.LOG1P,name:"Logarithm of the sum",description:"Returns the natural logarithm of the sum of an argument",minArgs:1,maxArgs:1}],[ae.CEIL,{value:ae.CEIL,name:"Ceiling",description:"Returns the smallest (closest to negative infinity) of an argument",minArgs:1,maxArgs:1}],[ae.FLOOR,{value:ae.FLOOR,name:"Floor",description:"Returns the largest (closest to positive infinity) of an argument",minArgs:1,maxArgs:1}],[ae.FLOOR_DIV,{value:ae.FLOOR_DIV,name:"Floor division",description:"Returns the largest (closest to positive infinity) of the arguments",minArgs:2,maxArgs:2}],[ae.FLOOR_MOD,{value:ae.FLOOR_MOD,name:"Floor modulus",description:"Returns the floor modulus of the arguments",minArgs:2,maxArgs:2}],[ae.ABS,{value:ae.ABS,name:"Absolute",description:"Returns the absolute value of an argument",minArgs:1,maxArgs:1}],[ae.MIN,{value:ae.MIN,name:"Min",description:"Returns the smaller of the arguments",minArgs:2,maxArgs:2}],[ae.MAX,{value:ae.MAX,name:"Max",description:"Returns the greater of the arguments",minArgs:2,maxArgs:2}],[ae.POW,{value:ae.POW,name:"Raise to a power",description:"Returns the value of the first argument raised to the power of the second argument",minArgs:2,maxArgs:2}],[ae.SIGNUM,{value:ae.SIGNUM,name:"Sign of a real number",description:"Returns the signum function of the argument",minArgs:1,maxArgs:1}],[ae.RAD,{value:ae.RAD,name:"Radian",description:"Converts an angle measured in degrees to an approximately equivalent angle measured in radians",minArgs:1,maxArgs:1}],[ae.DEG,{value:ae.DEG,name:"Degrees",description:"Converts an angle measured in radians to an approximately equivalent angle measured in degrees.",minArgs:1,maxArgs:1}]]);var le,ie;!function(t){t.ATTRIBUTE="ATTRIBUTE",t.TIME_SERIES="TIME_SERIES",t.CONSTANT="CONSTANT",t.MESSAGE_BODY="MESSAGE_BODY",t.MESSAGE_METADATA="MESSAGE_METADATA"}(le||(le={})),function(t){t.ATTRIBUTE="ATTRIBUTE",t.TIME_SERIES="TIME_SERIES",t.MESSAGE_BODY="MESSAGE_BODY",t.MESSAGE_METADATA="MESSAGE_METADATA"}(ie||(ie={}));const se=new Map([[le.ATTRIBUTE,"tb.rulenode.attribute-type"],[le.TIME_SERIES,"tb.rulenode.time-series-type"],[le.CONSTANT,"tb.rulenode.constant-type"],[le.MESSAGE_BODY,"tb.rulenode.message-body-type"],[le.MESSAGE_METADATA,"tb.rulenode.message-metadata-type"]]),me=["x","y","z","a","b","c","d","k","l","m","n","o","p","r","s","t"];var ue,pe;!function(t){t.SHARED_SCOPE="SHARED_SCOPE",t.SERVER_SCOPE="SERVER_SCOPE",t.CLIENT_SCOPE="CLIENT_SCOPE"}(ue||(ue={})),function(t){t.SHARED_SCOPE="SHARED_SCOPE",t.SERVER_SCOPE="SERVER_SCOPE"}(pe||(pe={}));const de=new Map([[ue.SHARED_SCOPE,"tb.rulenode.shared-scope"],[ue.SERVER_SCOPE,"tb.rulenode.server-scope"],[ue.CLIENT_SCOPE,"tb.rulenode.client-scope"]]);class fe extends s{constructor(t,e){super(t),this.store=t,this.fb=e,this.allAzureIotHubCredentialsTypes=Zt,this.azureIotHubCredentialsTypeTranslationsMap=te}configForm(){return this.azureIotHubConfigForm}onConfigurationSet(t){this.azureIotHubConfigForm=this.fb.group({topicPattern:[t?t.topicPattern:null,[q.required]],host:[t?t.host:null,[q.required]],port:[t?t.port:null,[q.required,q.min(1),q.max(65535)]],connectTimeoutSec:[t?t.connectTimeoutSec:null,[q.required,q.min(1),q.max(200)]],clientId:[t?t.clientId:null,[q.required]],cleanSession:[!!t&&t.cleanSession,[]],ssl:[!!t&&t.ssl,[]],credentials:this.fb.group({type:[t&&t.credentials?t.credentials.type:null,[q.required]],sasKey:[t&&t.credentials?t.credentials.sasKey:null,[]],caCert:[t&&t.credentials?t.credentials.caCert:null,[]],caCertFileName:[t&&t.credentials?t.credentials.caCertFileName:null,[]],privateKey:[t&&t.credentials?t.credentials.privateKey:null,[]],privateKeyFileName:[t&&t.credentials?t.credentials.privateKeyFileName:null,[]],cert:[t&&t.credentials?t.credentials.cert:null,[]],certFileName:[t&&t.credentials?t.credentials.certFileName:null,[]],password:[t&&t.credentials?t.credentials.password:null,[]]})})}prepareOutputConfig(t){const e=t.credentials.type;return"sas"===e&&(t.credentials={type:e,sasKey:t.credentials.sasKey,caCert:t.credentials.caCert,caCertFileName:t.credentials.caCertFileName}),t}validatorTriggers(){return["credentials.type"]}updateValidators(t){const e=this.azureIotHubConfigForm.get("credentials"),o=e.get("type").value;switch(t&&e.reset({type:o},{emitEvent:!1}),e.get("sasKey").setValidators([]),e.get("privateKey").setValidators([]),e.get("privateKeyFileName").setValidators([]),e.get("cert").setValidators([]),e.get("certFileName").setValidators([]),o){case"sas":e.get("sasKey").setValidators([q.required]);break;case"cert.PEM":e.get("privateKey").setValidators([q.required]),e.get("privateKeyFileName").setValidators([q.required]),e.get("cert").setValidators([q.required]),e.get("certFileName").setValidators([q.required])}e.get("sasKey").updateValueAndValidity({emitEvent:t}),e.get("privateKey").updateValueAndValidity({emitEvent:t}),e.get("privateKeyFileName").updateValueAndValidity({emitEvent:t}),e.get("cert").updateValueAndValidity({emitEvent:t}),e.get("certFileName").updateValueAndValidity({emitEvent:t})}}t("AzureIotHubConfigComponent",fe),fe.ɵfac=e.ɵɵngDeclareFactory({minVersion:"12.0.0",version:"12.2.16",ngImport:e,type:fe,deps:[{token:k.Store},{token:M.FormBuilder}],target:e.ɵɵFactoryTarget.Component}),fe.ɵcmp=e.ɵɵngDeclareComponent({minVersion:"12.0.0",version:"12.2.16",type:fe,selector:"tb-action-node-azure-iot-hub-config",usesInheritance:!0,ngImport:e,template:'\n \n tb.rulenode.topic\n \n \n {{ \'tb.rulenode.topic-required\' | translate }}\n \n \n \n \n tb.rulenode.hostname\n \n \n {{ \'tb.rulenode.hostname-required\' | translate }}\n \n \n \n tb.rulenode.device-id\n \n \n {{ \'tb.rulenode.device-id-required\' | translate }}\n \n \n \n \n \n tb.rulenode.credentials\n \n {{ azureIotHubCredentialsTypeTranslationsMap.get(azureIotHubConfigForm.get(\'credentials.type\').value) | translate }}\n \n \n \n \n tb.rulenode.credentials-type\n \n \n {{ azureIotHubCredentialsTypeTranslationsMap.get(credentialsType) | translate }}\n \n \n \n {{ \'tb.rulenode.credentials-type-required\' | translate }}\n \n \n \n \n \n \n \n tb.rulenode.sas-key\n \n \n \n {{ \'tb.rulenode.sas-key-required\' | translate }}\n \n \n \n \n \n \n \n \n \n \n \n \n \n tb.rulenode.private-key-password\n \n \n \n \n \n \n \n \n\n',styles:[":host .tb-mqtt-credentials-panel-group{margin:0 6px}:host .tb-hint.client-id{margin-top:-1.25em;max-width:-moz-fit-content;max-width:fit-content}:host mat-checkbox{padding-bottom:16px}\n"],components:[{type:V.MatFormField,selector:"mat-form-field",inputs:["color","floatLabel","appearance","hideRequiredMarker","hintLabel"],exportAs:["matFormField"]},{type:j.MatExpansionPanel,selector:"mat-expansion-panel",inputs:["disabled","expanded","hideToggle","togglePosition"],outputs:["opened","closed","expandedChange","afterExpand","afterCollapse"],exportAs:["matExpansionPanel"]},{type:j.MatExpansionPanelHeader,selector:"mat-expansion-panel-header",inputs:["tabIndex","expandedHeight","collapsedHeight"]},{type:B.MatSelect,selector:"mat-select",inputs:["disabled","disableRipple","tabIndex"],exportAs:["matSelect"]},{type:K.MatOption,selector:"mat-option",exportAs:["matOption"]},{type:_.TogglePasswordComponent,selector:"tb-toggle-password"},{type:z.FileInputComponent,selector:"tb-file-input",inputs:["label","accept","noFileText","inputId","allowedExtensions","dropLabel","contentConvertFunction","required","requiredAsError","disabled","existingFileName","readAsBinary","workFromFileObj","multipleFile"],outputs:["fileNameChanged"]}],directives:[{type:P.DefaultLayoutDirective,selector:" [fxLayout], [fxLayout.xs], [fxLayout.sm], [fxLayout.md], [fxLayout.lg], [fxLayout.xl], [fxLayout.lt-sm], [fxLayout.lt-md], [fxLayout.lt-lg], [fxLayout.lt-xl], [fxLayout.gt-xs], [fxLayout.gt-sm], [fxLayout.gt-md], [fxLayout.gt-lg]",inputs:["fxLayout","fxLayout.xs","fxLayout.sm","fxLayout.md","fxLayout.lg","fxLayout.xl","fxLayout.lt-sm","fxLayout.lt-md","fxLayout.lt-lg","fxLayout.lt-xl","fxLayout.gt-xs","fxLayout.gt-sm","fxLayout.gt-md","fxLayout.gt-lg"]},{type:M.NgControlStatusGroup,selector:"[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]"},{type:M.FormGroupDirective,selector:"[formGroup]",inputs:["formGroup"],outputs:["ngSubmit"],exportAs:["ngForm"]},{type:V.MatLabel,selector:"mat-label"},{type:R.TranslateDirective,selector:"[translate],[ngx-translate]",inputs:["translate","translateParams"]},{type:O.MatInput,selector:"input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]",inputs:["id","disabled","required","type","value","readonly","placeholder","errorStateMatcher","aria-describedby"],exportAs:["matInput"]},{type:M.DefaultValueAccessor,selector:"input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]"},{type:M.RequiredValidator,selector:":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]",inputs:["required"]},{type:M.NgControlStatus,selector:"[formControlName],[ngModel],[formControl]"},{type:M.FormControlName,selector:"[formControlName]",inputs:["disabled","formControlName","ngModel"],outputs:["ngModelChange"]},{type:w.NgIf,selector:"[ngIf]",inputs:["ngIf","ngIfThen","ngIfElse"]},{type:V.MatError,selector:"mat-error",inputs:["id"]},{type:V.MatHint,selector:"mat-hint",inputs:["align","id"]},{type:j.MatAccordion,selector:"mat-accordion",inputs:["multi","displayMode","togglePosition","hideToggle"],exportAs:["matAccordion"]},{type:j.MatExpansionPanelTitle,selector:"mat-panel-title"},{type:j.MatExpansionPanelDescription,selector:"mat-panel-description"},{type:M.FormGroupName,selector:"[formGroupName]",inputs:["formGroupName"]},{type:w.NgForOf,selector:"[ngFor][ngForOf]",inputs:["ngForOf","ngForTrackBy","ngForTemplate"]},{type:w.NgSwitch,selector:"[ngSwitch]",inputs:["ngSwitch"]},{type:w.NgSwitchCase,selector:"[ngSwitchCase]",inputs:["ngSwitchCase"]},{type:V.MatSuffix,selector:"[matSuffix]"}],pipes:{translate:R.TranslatePipe,safeHtml:Vt}}),e.ɵɵngDeclareClassMetadata({minVersion:"12.0.0",version:"12.2.16",ngImport:e,type:fe,decorators:[{type:o,args:[{selector:"tb-action-node-azure-iot-hub-config",templateUrl:"./azure-iot-hub-config.component.html",styleUrls:["./mqtt-config.component.scss"]}]}],ctorParameters:function(){return[{type:k.Store},{type:M.FormBuilder}]}});class ce extends s{constructor(t,e){super(t),this.store=t,this.fb=e,this.serviceType=p.TB_RULE_ENGINE}configForm(){return this.checkPointConfigForm}onConfigurationSet(t){this.checkPointConfigForm=this.fb.group({queueName:[t?t.queueName:null,[q.required]]})}}t("CheckPointConfigComponent",ce),ce.ɵfac=e.ɵɵngDeclareFactory({minVersion:"12.0.0",version:"12.2.16",ngImport:e,type:ce,deps:[{token:k.Store},{token:M.FormBuilder}],target:e.ɵɵFactoryTarget.Component}),ce.ɵcmp=e.ɵɵngDeclareComponent({minVersion:"12.0.0",version:"12.2.16",type:ce,selector:"tb-action-node-check-point-config",usesInheritance:!0,ngImport:e,template:'\n \n \n\n',components:[{type:J.QueueAutocompleteComponent,selector:"tb-queue-autocomplete",inputs:["labelText","requiredText","required","queueType","disabled"]}],directives:[{type:P.DefaultLayoutDirective,selector:" [fxLayout], [fxLayout.xs], [fxLayout.sm], [fxLayout.md], [fxLayout.lg], [fxLayout.xl], [fxLayout.lt-sm], [fxLayout.lt-md], [fxLayout.lt-lg], [fxLayout.lt-xl], [fxLayout.gt-xs], [fxLayout.gt-sm], [fxLayout.gt-md], [fxLayout.gt-lg]",inputs:["fxLayout","fxLayout.xs","fxLayout.sm","fxLayout.md","fxLayout.lg","fxLayout.xl","fxLayout.lt-sm","fxLayout.lt-md","fxLayout.lt-lg","fxLayout.lt-xl","fxLayout.gt-xs","fxLayout.gt-sm","fxLayout.gt-md","fxLayout.gt-lg"]},{type:M.NgControlStatusGroup,selector:"[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]"},{type:M.FormGroupDirective,selector:"[formGroup]",inputs:["formGroup"],outputs:["ngSubmit"],exportAs:["ngForm"]},{type:M.RequiredValidator,selector:":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]",inputs:["required"]},{type:M.NgControlStatus,selector:"[formControlName],[ngModel],[formControl]"},{type:M.FormControlName,selector:"[formControlName]",inputs:["disabled","formControlName","ngModel"],outputs:["ngModelChange"]}]}),e.ɵɵngDeclareClassMetadata({minVersion:"12.0.0",version:"12.2.16",ngImport:e,type:ce,decorators:[{type:o,args:[{selector:"tb-action-node-check-point-config",templateUrl:"./check-point-config.component.html",styleUrls:[]}]}],ctorParameters:function(){return[{type:k.Store},{type:M.FormBuilder}]}});class ge extends s{constructor(t,e,o,r){super(t),this.store=t,this.fb=e,this.nodeScriptTestService=o,this.translate=r,this.mvelEnabled=Q(this.store).mvelEnabled,this.scriptLanguage=d}configForm(){return this.clearAlarmConfigForm}onConfigurationSet(t){this.clearAlarmConfigForm=this.fb.group({scriptLang:[t?t.scriptLang:d.JS,[q.required]],alarmDetailsBuildJs:[t?t.alarmDetailsBuildJs:null,[]],alarmDetailsBuildMvel:[t?t.alarmDetailsBuildMvel:null,[]],alarmType:[t?t.alarmType:null,[q.required]]})}validatorTriggers(){return["scriptLang"]}updateValidators(t){let e=this.clearAlarmConfigForm.get("scriptLang").value;e!==d.MVEL||this.mvelEnabled||(e=d.JS,this.clearAlarmConfigForm.get("scriptLang").patchValue(e,{emitEvent:!1}),setTimeout((()=>{this.clearAlarmConfigForm.updateValueAndValidity({emitEvent:!0})}))),this.clearAlarmConfigForm.get("alarmDetailsBuildJs").setValidators(e===d.JS?[q.required]:[]),this.clearAlarmConfigForm.get("alarmDetailsBuildJs").updateValueAndValidity({emitEvent:t}),this.clearAlarmConfigForm.get("alarmDetailsBuildMvel").setValidators(e===d.MVEL?[q.required]:[]),this.clearAlarmConfigForm.get("alarmDetailsBuildMvel").updateValueAndValidity({emitEvent:t})}prepareInputConfig(t){return t&&(t.scriptLang||(t.scriptLang=d.JS)),t}testScript(){const t=this.clearAlarmConfigForm.get("scriptLang").value,e=t===d.JS?"alarmDetailsBuildJs":"alarmDetailsBuildMvel",o=this.clearAlarmConfigForm.get(e).value;this.nodeScriptTestService.testNodeScript(o,"json",this.translate.instant("tb.rulenode.details"),"Details",["msg","metadata","msgType"],this.ruleNodeId,"rulenode/clear_alarm_node_script_fn",t).subscribe((t=>{t&&this.clearAlarmConfigForm.get(e).setValue(t)}))}onValidate(){(this.clearAlarmConfigForm.get("scriptLang").value===d.JS?this.jsFuncComponent:this.mvelFuncComponent).validateOnSubmit()}}t("ClearAlarmConfigComponent",ge),ge.ɵfac=e.ɵɵngDeclareFactory({minVersion:"12.0.0",version:"12.2.16",ngImport:e,type:ge,deps:[{token:k.Store},{token:M.FormBuilder},{token:$.NodeScriptTestService},{token:R.TranslateService}],target:e.ɵɵFactoryTarget.Component}),ge.ɵcmp=e.ɵɵngDeclareComponent({minVersion:"12.0.0",version:"12.2.16",type:ge,selector:"tb-action-node-clear-alarm-config",viewQueries:[{propertyName:"jsFuncComponent",first:!0,predicate:["jsFuncComponent"],descendants:!0},{propertyName:"mvelFuncComponent",first:!0,predicate:["mvelFuncComponent"],descendants:!0}],usesInheritance:!0,ngImport:e,template:'\n \n \n \n \n \n
\n \n \n {{\'tb.rulenode.data\' | translate}}\n \n \n {{\'tb.rulenode.metadata\' | translate}}\n \n \n \n \n \n \n {{key}}\n close\n \n \n \n {{ \'tb.rulenode.keys-required\' | translate }}\n \n \n\n',components:[{type:qt.MatRadioButton,selector:"mat-radio-button",inputs:["disableRipple","tabIndex"],exportAs:["matRadioButton"]},{type:V.MatFormField,selector:"mat-form-field",inputs:["color","floatLabel","appearance","hideRequiredMarker","hintLabel"],exportAs:["matFormField"]},{type:at.MatChipList,selector:"mat-chip-list",inputs:["aria-orientation","multiple","compareWith","value","required","placeholder","disabled","selectable","tabIndex","errorStateMatcher"],outputs:["change","valueChange"],exportAs:["matChipList"]},{type:nt.MatIcon,selector:"mat-icon",inputs:["color","inline","svgIcon","fontSet","fontIcon"],exportAs:["matIcon"]}],directives:[{type:P.DefaultLayoutDirective,selector:" [fxLayout], [fxLayout.xs], [fxLayout.sm], [fxLayout.md], [fxLayout.lg], [fxLayout.xl], [fxLayout.lt-sm], [fxLayout.lt-md], [fxLayout.lt-lg], [fxLayout.lt-xl], [fxLayout.gt-xs], [fxLayout.gt-sm], [fxLayout.gt-md], [fxLayout.gt-lg]",inputs:["fxLayout","fxLayout.xs","fxLayout.sm","fxLayout.md","fxLayout.lg","fxLayout.xl","fxLayout.lt-sm","fxLayout.lt-md","fxLayout.lt-lg","fxLayout.lt-xl","fxLayout.gt-xs","fxLayout.gt-sm","fxLayout.gt-md","fxLayout.gt-lg"]},{type:M.NgControlStatusGroup,selector:"[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]"},{type:M.FormGroupDirective,selector:"[formGroup]",inputs:["formGroup"],outputs:["ngSubmit"],exportAs:["ngForm"]},{type:qt.MatRadioGroup,selector:"mat-radio-group",exportAs:["matRadioGroup"]},{type:M.NgControlStatus,selector:"[formControlName],[ngModel],[formControl]"},{type:M.FormControlName,selector:"[formControlName]",inputs:["disabled","formControlName","ngModel"],outputs:["ngModelChange"]},{type:P.DefaultLayoutGapDirective,selector:" [fxLayoutGap], [fxLayoutGap.xs], [fxLayoutGap.sm], [fxLayoutGap.md], [fxLayoutGap.lg], [fxLayoutGap.xl], [fxLayoutGap.lt-sm], [fxLayoutGap.lt-md], [fxLayoutGap.lt-lg], [fxLayoutGap.lt-xl], [fxLayoutGap.gt-xs], [fxLayoutGap.gt-sm], [fxLayoutGap.gt-md], [fxLayoutGap.gt-lg]",inputs:["fxLayoutGap","fxLayoutGap.xs","fxLayoutGap.sm","fxLayoutGap.md","fxLayoutGap.lg","fxLayoutGap.xl","fxLayoutGap.lt-sm","fxLayoutGap.lt-md","fxLayoutGap.lt-lg","fxLayoutGap.lt-xl","fxLayoutGap.gt-xs","fxLayoutGap.gt-sm","fxLayoutGap.gt-md","fxLayoutGap.gt-lg"]},{type:V.MatLabel,selector:"mat-label"},{type:w.NgForOf,selector:"[ngFor][ngForOf]",inputs:["ngForOf","ngForTrackBy","ngForTemplate"]},{type:at.MatChip,selector:"mat-basic-chip, [mat-basic-chip], mat-chip, [mat-chip]",inputs:["color","disableRipple","tabIndex","selected","value","selectable","disabled","removable"],outputs:["selectionChange","destroyed","removed"],exportAs:["matChip"]},{type:at.MatChipRemove,selector:"[matChipRemove]"},{type:O.MatInput,selector:"input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]",inputs:["id","disabled","required","type","value","readonly","placeholder","errorStateMatcher","aria-describedby"],exportAs:["matInput"]},{type:at.MatChipInput,selector:"input[matChipInputFor]",inputs:["matChipInputSeparatorKeyCodes","placeholder","id","matChipInputFor","matChipInputAddOnBlur","disabled"],outputs:["matChipInputTokenEnd"],exportAs:["matChipInput","matChipInputFor"]},{type:w.NgIf,selector:"[ngIf]",inputs:["ngIf","ngIfThen","ngIfElse"]},{type:V.MatError,selector:"mat-error",inputs:["id"]},{type:V.MatHint,selector:"mat-hint",inputs:["align","id"]}],pipes:{translate:R.TranslatePipe,safeHtml:Vt}}),e.ɵɵngDeclareClassMetadata({minVersion:"12.0.0",version:"12.2.16",ngImport:e,type:No,decorators:[{type:o,args:[{selector:"tb-transformation-node-delete-keys-config",templateUrl:"./delete-keys-config.component.html",styleUrls:[]}]}],ctorParameters:function(){return[{type:k.Store},{type:M.FormBuilder}]}});class To{}t("RulenodeCoreConfigTransformModule",To),To.ɵfac=e.ɵɵngDeclareFactory({minVersion:"12.0.0",version:"12.2.16",ngImport:e,type:To,deps:[],target:e.ɵɵFactoryTarget.NgModule}),To.ɵmod=e.ɵɵngDeclareNgModule({minVersion:"12.0.0",version:"12.2.16",ngImport:e,type:To,declarations:[ho,Co,Fo,Lo,vo,Io,No],imports:[H,L,We],exports:[ho,Co,Fo,Lo,vo,Io,No]}),To.ɵinj=e.ɵɵngDeclareInjector({minVersion:"12.0.0",version:"12.2.16",ngImport:e,type:To,imports:[[H,L,We]]}),e.ɵɵngDeclareClassMetadata({minVersion:"12.0.0",version:"12.2.16",ngImport:e,type:To,decorators:[{type:i,args:[{declarations:[ho,Co,Fo,Lo,vo,Io,No],imports:[H,L,We],exports:[ho,Co,Fo,Lo,vo,Io,No]}]}]});class ko extends s{constructor(t,e){super(t),this.store=t,this.fb=e,this.entityType=y}configForm(){return this.ruleChainInputConfigForm}onConfigurationSet(t){this.ruleChainInputConfigForm=this.fb.group({ruleChainId:[t?t.ruleChainId:null,[q.required]]})}}t("RuleChainInputComponent",ko),ko.ɵfac=e.ɵɵngDeclareFactory({minVersion:"12.0.0",version:"12.2.16",ngImport:e,type:ko,deps:[{token:k.Store},{token:M.FormBuilder}],target:e.ɵɵFactoryTarget.Component}),ko.ɵcmp=e.ɵɵngDeclareComponent({minVersion:"12.0.0",version:"12.2.16",type:ko,selector:"tb-flow-node-rule-chain-input-config",usesInheritance:!0,ngImport:e,template:'\n \n \n\n',components:[{type:At.EntityAutocompleteComponent,selector:"tb-entity-autocomplete",inputs:["entityType","entitySubtype","excludeEntityIds","labelText","requiredText","required","disabled"],outputs:["entityChanged"]}],directives:[{type:P.DefaultLayoutDirective,selector:" [fxLayout], [fxLayout.xs], [fxLayout.sm], [fxLayout.md], [fxLayout.lg], [fxLayout.xl], [fxLayout.lt-sm], [fxLayout.lt-md], [fxLayout.lt-lg], [fxLayout.lt-xl], [fxLayout.gt-xs], [fxLayout.gt-sm], [fxLayout.gt-md], [fxLayout.gt-lg]",inputs:["fxLayout","fxLayout.xs","fxLayout.sm","fxLayout.md","fxLayout.lg","fxLayout.xl","fxLayout.lt-sm","fxLayout.lt-md","fxLayout.lt-lg","fxLayout.lt-xl","fxLayout.gt-xs","fxLayout.gt-sm","fxLayout.gt-md","fxLayout.gt-lg"]},{type:M.NgControlStatusGroup,selector:"[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]"},{type:M.FormGroupDirective,selector:"[formGroup]",inputs:["formGroup"],outputs:["ngSubmit"],exportAs:["ngForm"]},{type:M.RequiredValidator,selector:":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]",inputs:["required"]},{type:M.NgControlStatus,selector:"[formControlName],[ngModel],[formControl]"},{type:M.FormControlName,selector:"[formControlName]",inputs:["disabled","formControlName","ngModel"],outputs:["ngModelChange"]}]}),e.ɵɵngDeclareClassMetadata({minVersion:"12.0.0",version:"12.2.16",ngImport:e,type:ko,decorators:[{type:o,args:[{selector:"tb-flow-node-rule-chain-input-config",templateUrl:"./rule-chain-input.component.html",styleUrls:[]}]}],ctorParameters:function(){return[{type:k.Store},{type:M.FormBuilder}]}});class Mo extends s{constructor(t,e){super(t),this.store=t,this.fb=e}configForm(){return this.ruleChainOutputConfigForm}onConfigurationSet(t){this.ruleChainOutputConfigForm=this.fb.group({})}}t("RuleChainOutputComponent",Mo),Mo.ɵfac=e.ɵɵngDeclareFactory({minVersion:"12.0.0",version:"12.2.16",ngImport:e,type:Mo,deps:[{token:k.Store},{token:M.FormBuilder}],target:e.ɵɵFactoryTarget.Component}),Mo.ɵcmp=e.ɵɵngDeclareComponent({minVersion:"12.0.0",version:"12.2.16",type:Mo,selector:"tb-flow-node-rule-chain-output-config",usesInheritance:!0,ngImport:e,template:'\n \n\n',directives:[{type:P.DefaultLayoutDirective,selector:" [fxLayout], [fxLayout.xs], [fxLayout.sm], [fxLayout.md], [fxLayout.lg], [fxLayout.xl], [fxLayout.lt-sm], [fxLayout.lt-md], [fxLayout.lt-lg], [fxLayout.lt-xl], [fxLayout.gt-xs], [fxLayout.gt-sm], [fxLayout.gt-md], [fxLayout.gt-lg]",inputs:["fxLayout","fxLayout.xs","fxLayout.sm","fxLayout.md","fxLayout.lg","fxLayout.xl","fxLayout.lt-sm","fxLayout.lt-md","fxLayout.lt-lg","fxLayout.lt-xl","fxLayout.gt-xs","fxLayout.gt-sm","fxLayout.gt-md","fxLayout.gt-lg"]},{type:M.NgControlStatusGroup,selector:"[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]"},{type:M.FormGroupDirective,selector:"[formGroup]",inputs:["formGroup"],outputs:["ngSubmit"],exportAs:["ngForm"]}],pipes:{translate:R.TranslatePipe}}),e.ɵɵngDeclareClassMetadata({minVersion:"12.0.0",version:"12.2.16",ngImport:e,type:Mo,decorators:[{type:o,args:[{selector:"tb-flow-node-rule-chain-output-config",templateUrl:"./rule-chain-output.component.html",styleUrls:[]}]}],ctorParameters:function(){return[{type:k.Store},{type:M.FormBuilder}]}});class qo{}t("RuleNodeCoreConfigFlowModule",qo),qo.ɵfac=e.ɵɵngDeclareFactory({minVersion:"12.0.0",version:"12.2.16",ngImport:e,type:qo,deps:[],target:e.ɵɵFactoryTarget.NgModule}),qo.ɵmod=e.ɵɵngDeclareNgModule({minVersion:"12.0.0",version:"12.2.16",ngImport:e,type:qo,declarations:[ko,Mo],imports:[H,L,We],exports:[ko,Mo]}),qo.ɵinj=e.ɵɵngDeclareInjector({minVersion:"12.0.0",version:"12.2.16",ngImport:e,type:qo,imports:[[H,L,We]]}),e.ɵɵngDeclareClassMetadata({minVersion:"12.0.0",version:"12.2.16",ngImport:e,type:qo,decorators:[{type:i,args:[{declarations:[ko,Mo],imports:[H,L,We],exports:[ko,Mo]}]}]});class So{constructor(t){!function(t){t.setTranslation("en_US",{tb:{rulenode:{"create-entity-if-not-exists":"Create new entity if not exists","create-entity-if-not-exists-hint":"Create a new entity set above if it does not exist.","entity-name-pattern":"Name pattern","entity-name-pattern-required":"Name pattern is required","entity-type-pattern":"Type pattern","entity-type-pattern-required":"Type pattern is required","entity-cache-expiration":"Entities cache expiration time (sec)","entity-cache-expiration-hint":"Specifies maximum time interval allowed to store found entity records. 0 value means that records will never expire.","entity-cache-expiration-required":"Entities cache expiration time is required.","entity-cache-expiration-range":"Entities cache expiration time should be greater than or equal to 0.","customer-name-pattern":"Customer name pattern","customer-name-pattern-required":"Customer name pattern is required","create-customer-if-not-exists":"Create new customer if not exists","customer-cache-expiration":"Customers cache expiration time (sec)","customer-cache-expiration-hint":"Specifies maximum time interval allowed to store found customer records. 0 value means that records will never expire.","customer-cache-expiration-required":"Customers cache expiration time is required.","customer-cache-expiration-range":"Customers cache expiration time should be greater than or equal to 0.","start-interval":"Start Interval","end-interval":"End Interval","start-interval-time-unit":"Start Interval Time Unit","end-interval-time-unit":"End Interval Time Unit","fetch-mode":"Fetch mode","fetch-mode-hint":"If selected fetch mode 'ALL' you able to choose telemetry sampling order.","order-by":"Order by","order-by-hint":"Select to choose telemetry sampling order.",limit:"Limit","limit-hint":"Min limit value is 2, max - 1000. In case you want to fetch a single entry, select fetch mode 'FIRST' or 'LAST'.","time-unit-milliseconds":"Milliseconds","time-unit-seconds":"Seconds","time-unit-minutes":"Minutes","time-unit-hours":"Hours","time-unit-days":"Days","time-value-range":"Time value should be in a range from 1 to 2147483647.","start-interval-value-required":"Start interval value is required.","end-interval-value-required":"End interval value is required.",filter:"Filter",switch:"Switch","message-type":"Message type","message-type-required":"Message type is required.","message-types-filter":"Message types filter","no-message-types-found":"No message types found","no-message-type-matching":"'{{messageType}}' not found.","create-new-message-type":"Create a new one!","message-types-required":"Message types are required.","client-attributes":"Client attributes","shared-attributes":"Shared attributes","server-attributes":"Server attributes","attributes-keys":"Attributes keys","attributes-keys-required":"Attributes keys are required","notify-device":"Notify Device","fetch-credentials-to-metadata":"Fetch credentials to metadata","notify-device-hint":"If the message arrives from the device, we will push it back to the device by default.","latest-timeseries":"Latest timeseries","timeseries-key":"Timeseries key","data-keys":"Message data","copy-from":"Copy from","data-to-metadata":"Data to metadata","metadata-to-data":"Metadata to data","use-regular-expression-hint":"Hint: use regular expression to copy keys by pattern",keys:"Keys","keys-required":"Keys are required","rename-keys-in":"Rename keys in",data:"Data",metadata:"Metadata","key-name":"Key name","key-name-required":"Key name is required","new-key-name":"New key name","new-key-name-required":"New key name is required","metadata-keys":"Message metadata","json-path-expression":"JSON path expression","json-path-expression-required":"JSON path expression is required","json-path-expression-hint":"JSONPath specifies a path to an element or a set of elements in a JSON structure. '$' represents the root object or array.","relations-query":"Relations query","device-relations-query":"Device relations query","max-relation-level":"Max relation level","relation-type-pattern":"Relation type pattern","relation-type-pattern-required":"Relation type pattern is required","relation-types-list":"Relation types to propagate","relation-types-list-hint":"If Propagate relation types are not selected, alarms will be propagated without filtering by relation type.","unlimited-level":"Unlimited level","latest-telemetry":"Latest telemetry","delete-from":"Delete from","use-regular-expression-delete-hint":"Use regular expression to delete keys by pattern","fetch-into":"Fetch into","attr-mapping":"Attributes mapping","source-attribute":"Source attribute","source-attribute-required":"Source attribute is required.","source-telemetry":"Source telemetry","source-telemetry-required":"Source telemetry is required.","target-attribute":"Target attribute","target-attribute-required":"Target attribute is required.","attr-mapping-required":"At least one attribute mapping should be specified.","fields-mapping":"Fields mapping","fields-mapping-required":"At least one field mapping should be specified.","source-field":"Source field","source-field-required":"Source field is required.","originator-source":"Originator source","originator-customer":"Customer","originator-tenant":"Tenant","originator-related":"Related","originator-alarm-originator":"Alarm Originator","originator-entity":"Entity","clone-message":"Clone message",transform:"Transform","default-ttl":"Default TTL in seconds","default-ttl-required":"Default TTL is required.","min-default-ttl-message":"Only 0 minimum TTL is allowed.","message-count":"Message count (0 - unlimited)","message-count-required":"Message count is required.","min-message-count-message":"Only 0 minimum message count is allowed.","period-seconds":"Period in seconds","period-seconds-required":"Period is required.","use-metadata-period-in-seconds-patterns":"Use period in seconds pattern","use-metadata-period-in-seconds-patterns-hint":"If selected, rule node use period in seconds interval pattern from message metadata or data assuming that intervals are in the seconds.","period-in-seconds-pattern":"Period in seconds pattern","period-in-seconds-pattern-required":"Period in seconds pattern is required","min-period-seconds-message":"Only 1 second minimum period is allowed.",originator:"Originator","message-body":"Message body","message-metadata":"Message metadata",generate:"Generate","test-generator-function":"Test generator function",generator:"Generator","test-filter-function":"Test filter function","test-switch-function":"Test switch function","test-transformer-function":"Test transformer function",transformer:"Transformer","alarm-create-condition":"Alarm create condition","test-condition-function":"Test condition function","alarm-clear-condition":"Alarm clear condition","alarm-details-builder":"Alarm details builder","test-details-function":"Test details function","alarm-type":"Alarm type","alarm-type-required":"Alarm type is required.","alarm-severity":"Alarm severity","alarm-severity-required":"Alarm severity is required","alarm-severity-pattern":"Alarm severity pattern","alarm-status-filter":"Alarm status filter","alarm-status-list-empty":"Alarm status list is empty","no-alarm-status-matching":"No alarm status matching were found.",propagate:"Propagate alarm to related entities","propagate-to-owner":"Propagate alarm to entity owner (Customer or Tenant)","propagate-to-tenant":"Propagate alarm to Tenant",condition:"Condition",details:"Details","to-string":"To string","test-to-string-function":"Test to string function","from-template":"From Template","from-template-required":"From Template is required","to-template":"To Template","to-template-required":"To Template is required","mail-address-list-template-hint":'Comma separated address list, use ${metadataKey} for value from metadata, $[messageKey] for value from message body',"cc-template":"Cc Template","bcc-template":"Bcc Template","subject-template":"Subject Template","subject-template-required":"Subject Template is required","body-template":"Body Template","body-template-required":"Body Template is required","dynamic-mail-body-type":"Dynamic mail body type","mail-body-type":"Mail body type","request-id-metadata-attribute":"Request Id Metadata attribute name","timeout-sec":"Timeout in seconds","timeout-required":"Timeout is required","min-timeout-message":"Only 0 minimum timeout value is allowed.","endpoint-url-pattern":"Endpoint URL pattern","endpoint-url-pattern-required":"Endpoint URL pattern is required","request-method":"Request method","use-simple-client-http-factory":"Use simple client HTTP factory","ignore-request-body":"Without request body","read-timeout":"Read timeout in millis","read-timeout-hint":"The value of 0 means an infinite timeout","max-parallel-requests-count":"Max number of parallel requests","max-parallel-requests-count-hint":"The value of 0 specifies no limit in parallel processing",headers:"Headers","headers-hint":'Use ${metadataKey} for value from metadata, $[messageKey] for value from message body in header/value fields',header:"Header","header-required":"Header is required",value:"Value","value-required":"Value is required","topic-pattern":"Topic pattern","key-pattern":"Key pattern","key-pattern-hint":"Hint: Optional. If a valid partition number is specified, it will be used when sending the record. If no partition is specified, the key will be used instead. If neither is specified, a partition will be assigned in a round-robin fashion.","topic-pattern-required":"Topic pattern is required",topic:"Topic","topic-required":"Topic is required","bootstrap-servers":"Bootstrap servers","bootstrap-servers-required":"Bootstrap servers value is required","other-properties":"Other properties",key:"Key","key-required":"Key is required",retries:"Automatically retry times if fails","min-retries-message":"Only 0 minimum retries is allowed.","batch-size-bytes":"Produces batch size in bytes","min-batch-size-bytes-message":"Only 0 minimum batch size is allowed.","linger-ms":"Time to buffer locally (ms)","min-linger-ms-message":"Only 0 ms minimum value is allowed.","buffer-memory-bytes":"Client buffer max size in bytes","min-buffer-memory-message":"Only 0 minimum buffer size is allowed.",acks:"Number of acknowledgments","key-serializer":"Key serializer","key-serializer-required":"Key serializer is required","value-serializer":"Value serializer","value-serializer-required":"Value serializer is required","topic-arn-pattern":"Topic ARN pattern","topic-arn-pattern-required":"Topic ARN pattern is required","aws-access-key-id":"AWS Access Key ID","aws-access-key-id-required":"AWS Access Key ID is required","aws-secret-access-key":"AWS Secret Access Key","aws-secret-access-key-required":"AWS Secret Access Key is required","aws-region":"AWS Region","aws-region-required":"AWS Region is required","exchange-name-pattern":"Exchange name pattern","routing-key-pattern":"Routing key pattern","message-properties":"Message properties",host:"Host","host-required":"Host is required",port:"Port","port-required":"Port is required","port-range":"Port should be in a range from 1 to 65535.","virtual-host":"Virtual host",username:"Username",password:"Password","automatic-recovery":"Automatic recovery","connection-timeout-ms":"Connection timeout (ms)","min-connection-timeout-ms-message":"Only 0 ms minimum value is allowed.","handshake-timeout-ms":"Handshake timeout (ms)","min-handshake-timeout-ms-message":"Only 0 ms minimum value is allowed.","client-properties":"Client properties","queue-url-pattern":"Queue URL pattern","queue-url-pattern-required":"Queue URL pattern is required","delay-seconds":"Delay (seconds)","min-delay-seconds-message":"Only 0 seconds minimum value is allowed.","max-delay-seconds-message":"Only 900 seconds maximum value is allowed.",name:"Name","name-required":"Name is required","queue-type":"Queue type","sqs-queue-standard":"Standard","sqs-queue-fifo":"FIFO","gcp-project-id":"GCP project ID","gcp-project-id-required":"GCP project ID is required","gcp-service-account-key":"GCP service account key file","gcp-service-account-key-required":"GCP service account key file is required","pubsub-topic-name":"Topic name","pubsub-topic-name-required":"Topic name is required","message-attributes":"Message attributes","message-attributes-hint":'Use ${metadataKey} for value from metadata, $[messageKey] for value from message body in name/value fields',"connect-timeout":"Connection timeout (sec)","connect-timeout-required":"Connection timeout is required.","connect-timeout-range":"Connection timeout should be in a range from 1 to 200.","client-id":"Client ID","client-id-hint":'Hint: Optional. Leave empty for auto-generated Client ID. Be careful when specifying the Client ID. Majority of the MQTT brokers will not allow multiple connections with the same Client ID. To connect to such brokers, your mqtt Client ID must be unique. When platform is running in a micro-services mode, the copy of rule node is launched in each micro-service. This will automatically lead to multiple mqtt clients with the same ID and may cause failures of the rule node. To avoid such failures enable "Add Service ID as suffix to Client ID" option below.',"append-client-id-suffix":"Add Service ID as suffix to Client ID","client-id-suffix-hint":'Hint: Optional. Applied when "Client ID" specified explicitly. If selected then Service ID will be added to Client ID as a suffix. Helps to avoid failures when platform is running in a micro-services mode.',"device-id":"Device ID","device-id-required":"Device ID is required.","clean-session":"Clean session","enable-ssl":"Enable SSL",credentials:"Credentials","credentials-type":"Credentials type","credentials-type-required":"Credentials type is required.","credentials-anonymous":"Anonymous","credentials-basic":"Basic","credentials-pem":"PEM","credentials-pem-hint":"At least Server CA certificate file or a pair of Client certificate and Client private key files are required","credentials-sas":"Shared Access Signature","sas-key":"SAS Key","sas-key-required":"SAS Key is required.",hostname:"Hostname","hostname-required":"Hostname is required.","azure-ca-cert":"CA certificate file","username-required":"Username is required.","password-required":"Password is required.","ca-cert":"Server CA certificate file *","private-key":"Client private key file *",cert:"Client certificate file *","no-file":"No file selected.","drop-file":"Drop a file or click to select a file to upload.","private-key-password":"Private key password","use-system-smtp-settings":"Use system SMTP settings","use-metadata-interval-patterns":"Use interval patterns","use-metadata-interval-patterns-hint":"If selected, rule node use start and end interval patterns from message metadata or data assuming that intervals are in the milliseconds.","use-message-alarm-data":"Use message alarm data","overwrite-alarm-details":"Overwrite alarm details","use-alarm-severity-pattern":"Use alarm severity pattern","check-all-keys":"Check that all selected keys are present","check-all-keys-hint":"If selected, checks that all specified keys are present in the message data and metadata.","check-relation-to-specific-entity":"Check relation to specific entity","check-relation-hint":"Checks existence of relation to specific entity or to any entity based on direction and relation type.","delete-relation-to-specific-entity":"Delete relation to specific entity","delete-relation-hint":"Deletes relation from the originator of the incoming message to the specified entity or list of entities based on direction and type.","remove-current-relations":"Remove current relations","remove-current-relations-hint":"Removes current relations from the originator of the incoming message based on direction and type.","change-originator-to-related-entity":"Change originator to related entity","change-originator-to-related-entity-hint":"Used to process submitted message as a message from another entity.","start-interval-pattern":"Start interval pattern","end-interval-pattern":"End interval pattern","start-interval-pattern-required":"Start interval pattern is required","end-interval-pattern-required":"End interval pattern is required","smtp-protocol":"Protocol","smtp-host":"SMTP host","smtp-host-required":"SMTP host is required.","smtp-port":"SMTP port","smtp-port-required":"You must supply a smtp port.","smtp-port-range":"SMTP port should be in a range from 1 to 65535.","timeout-msec":"Timeout ms","min-timeout-msec-message":"Only 0 ms minimum value is allowed.","enter-username":"Enter username","enter-password":"Enter password","enable-tls":"Enable TLS","tls-version":"TLS version","enable-proxy":"Enable proxy","use-system-proxy-properties":"Use system proxy properties","proxy-host":"Proxy host","proxy-host-required":"Proxy host is required.","proxy-port":"Proxy port","proxy-port-required":"Proxy port is required.","proxy-port-range":"Proxy port should be in a range from 1 to 65535.","proxy-user":"Proxy user","proxy-password":"Proxy password","proxy-scheme":"Proxy scheme","numbers-to-template":"Phone Numbers To Template","numbers-to-template-required":"Phone Numbers To Template is required","numbers-to-template-hint":'Comma separated Phone Numbers, use ${metadataKey} for value from metadata, $[messageKey] for value from message body',"sms-message-template":"SMS message Template","sms-message-template-required":"SMS message Template is required","use-system-sms-settings":"Use system SMS provider settings","min-period-0-seconds-message":"Only 0 second minimum period is allowed.","max-pending-messages":"Maximum pending messages","max-pending-messages-required":"Maximum pending messages is required.","max-pending-messages-range":"Maximum pending messages should be in a range from 1 to 100000.","originator-types-filter":"Originator types filter","interval-seconds":"Interval in seconds","interval-seconds-required":"Interval is required.","min-interval-seconds-message":"Only 1 second minimum interval is allowed.","output-timeseries-key-prefix":"Output timeseries key prefix","output-timeseries-key-prefix-required":"Output timeseries key prefix required.","separator-hint":'You should press "enter" to complete field input.',"entity-details":"Select entity details:","entity-details-title":"Title","entity-details-country":"Country","entity-details-state":"State","entity-details-city":"City","entity-details-zip":"Zip","entity-details-address":"Address","entity-details-address2":"Address2","entity-details-additional_info":"Additional Info","entity-details-phone":"Phone","entity-details-email":"Email","add-to-metadata":"Add selected details to message metadata","add-to-metadata-hint":"If selected, adds the selected details keys to the message metadata instead of message data.","entity-details-list-empty":"No entity details selected.","no-entity-details-matching":"No entity details matching were found.","custom-table-name":"Custom table name","custom-table-name-required":"Table Name is required","custom-table-hint":"You should enter the table name without prefix 'cs_tb_'.","message-field":"Message field","message-field-required":"Message field is required.","table-col":"Table column","table-col-required":"Table column is required.","latitude-key-name":"Latitude key name","longitude-key-name":"Longitude key name","latitude-key-name-required":"Latitude key name is required.","longitude-key-name-required":"Longitude key name is required.","fetch-perimeter-info-from-message-metadata":"Fetch perimeter information from message metadata","perimeter-key-name":"Perimeter key name","perimeter-key-name-required":"Perimeter key name is required.","perimeter-circle":"Circle","perimeter-polygon":"Polygon","perimeter-type":"Perimeter type","circle-center-latitude":"Center latitude","circle-center-latitude-required":"Center latitude is required.","circle-center-longitude":"Center longitude","circle-center-longitude-required":"Center longitude is required.","range-unit-meter":"Meter","range-unit-kilometer":"Kilometer","range-unit-foot":"Foot","range-unit-mile":"Mile","range-unit-nautical-mile":"Nautical mile","range-units":"Range units",range:"Range","range-required":"Range is required.","polygon-definition":"Polygon definition","polygon-definition-required":"Polygon definition is required.","polygon-definition-hint":"Please, use the following format for manual definition of polygon: [[lat1,lon1],[lat2,lon2], ... ,[latN,lonN]].","min-inside-duration":"Minimal inside duration","min-inside-duration-value-required":"Minimal inside duration is required","min-inside-duration-time-unit":"Minimal inside duration time unit","min-outside-duration":"Minimal outside duration","min-outside-duration-value-required":"Minimal outside duration is required","min-outside-duration-time-unit":"Minimal outside duration time unit","tell-failure-if-absent":"Tell Failure","tell-failure-if-absent-hint":'If at least one selected key doesn\'t exist the outbound message will report "Failure".',"get-latest-value-with-ts":"Fetch Latest telemetry with Timestamp","get-latest-value-with-ts-hint":'If selected, latest telemetry values will be added to the outbound message metadata with timestamp, e.g: "temp": "{"ts":1574329385897, "value":42}"',"use-redis-queue":"Use redis queue for message persistence","ignore-null-strings":"Ignore null strings","ignore-null-strings-hint":"If selected rule node will ignore entity fields with empty value.","trim-redis-queue":"Trim redis queue","redis-queue-max-size":"Redis queue max size","add-metadata-key-values-as-kafka-headers":"Add Message metadata key-value pairs to Kafka record headers","add-metadata-key-values-as-kafka-headers-hint":"If selected, key-value pairs from message metadata will be added to the outgoing records headers as byte arrays with predefined charset encoding.","charset-encoding":"Charset encoding","charset-encoding-required":"Charset encoding is required.","charset-us-ascii":"US-ASCII","charset-iso-8859-1":"ISO-8859-1","charset-utf-8":"UTF-8","charset-utf-16be":"UTF-16BE","charset-utf-16le":"UTF-16LE","charset-utf-16":"UTF-16","select-queue-hint":"The queue name can be selected from a drop-down list or add a custom name.","persist-alarm-rules":"Persist state of alarm rules","fetch-alarm-rules":"Fetch state of alarm rules","input-value-key":"Input value key","input-value-key-required":"Input value key is required.","output-value-key":"Output value key","output-value-key-required":"Output value key is required.",round:"Decimals","round-range":"Decimals should be in a range from 0 to 15.","use-cache":"Use cache for latest value","tell-failure-if-delta-is-negative":"Tell Failure if delta is negative","add-period-between-msgs":"Add period between messages","period-value-key":"Period value key","period-value-key-required":"Period value key is required.","general-pattern-hint":'Hint: use ${metadataKey} for value from metadata, $[messageKey] for value from message body',"alarm-severity-pattern-hint":'Hint: use ${metadataKey} for value from metadata, $[messageKey] for value from message body. Alarm severity should be system (CRITICAL, MAJOR etc.)',"output-node-name-hint":"The rule node name corresponds to the relation type of the output message, and it is used to forward messages to other rule nodes in the caller rule chain.","skip-latest-persistence":"Skip latest persistence","use-server-ts":"Use server ts","use-server-ts-hint":"Enable this setting to use the timestamp of the message processing instead of the timestamp from the message. Useful for all sorts of sequential processing if you merge messages from multiple sources (devices, assets, etc).","kv-map-pattern-hint":'Hint: use ${metadataKey} for value from metadata, $[messageKey] for value from message body to substitute "Source" and "Target" key names',"shared-scope":"Shared scope","server-scope":"Server scope","client-scope":"Client scope","attribute-type":"Attribute","constant-type":"Constant","time-series-type":"Time series","message-body-type":"Message body","message-metadata-type":"Message metadata","argument-tile":"Arguments","no-arguments-prompt":"No arguments configured","result-title":"Result","functions-field-input":"Functions","no-option-found":"No option found","argument-type-field-input":"Type","argument-type-field-input-required":"Argument type is required.","argument-key-field-input":"Key","argument-key-field-input-required":"Argument key is required.","constant-value-field-input":"Constant value","constant-value-field-input-required":"Constant value is required.","attribute-scope-field-input":"Attribute scope","attribute-scope-field-input-required":"Attribute scope os required.","default-value-field-input":"Default value","type-field-input":"Type","type-field-input-required":"Type is required.","key-field-input":"Key","key-field-input-required":"Key is required.","number-floating-point-field-input":"Number of digits after floating point","number-floating-point-field-input-hint":"Hint: use 0 to convert result to integer","add-to-body-field-input":"Add to message body","add-to-metadata-field-input":"Add to message metadata","custom-expression-field-input":"Mathematical Expression","custom-expression-field-input-required":"Mathematical expression is required","custom-expression-field-input-hint":"Hint: specify a mathematical expression to evaluate. For example, transform Fahrenheit to Celsius using (x - 32) / 1.8)","retained-message":"Retained"},"key-val":{key:"Key",value:"Value","remove-entry":"Remove entry","add-entry":"Add entry","unique-key-value-pair-error":"'{{valText}}' must be different from the current '{{keyText}}'"},"mail-body-type":{"plain-text":"Plain Text",html:"HTML",dynamic:"Dynamic"}}},!0)}(t)}}t("RuleNodeCoreConfigModule",So),So.ɵfac=e.ɵɵngDeclareFactory({minVersion:"12.0.0",version:"12.2.16",ngImport:e,type:So,deps:[{token:R.TranslateService}],target:e.ɵɵFactoryTarget.NgModule}),So.ɵmod=e.ɵɵngDeclareNgModule({minVersion:"12.0.0",version:"12.2.16",ngImport:e,type:So,declarations:[Dt],imports:[H,L],exports:[Ye,bo,so,To,qo,Dt]}),So.ɵinj=e.ɵɵngDeclareInjector({minVersion:"12.0.0",version:"12.2.16",ngImport:e,type:So,imports:[[H,L],Ye,bo,so,To,qo]}),e.ɵɵngDeclareClassMetadata({minVersion:"12.0.0",version:"12.2.16",ngImport:e,type:So,decorators:[{type:i,args:[{declarations:[Dt],imports:[H,L],exports:[Ye,bo,so,To,qo,Dt]}]}],ctorParameters:function(){return[{type:R.TranslateService}]}})}}}));//# sourceMappingURL=rulenode-core-config.js.map
+System.register(["@angular/core","@shared/public-api","@ngrx/store","@angular/forms","@angular/material/form-field","@angular/material/checkbox","@angular/flex-layout/flex","@ngx-translate/core","@angular/material/input","@angular/common","@angular/platform-browser","@angular/material/select","@angular/material/core","@angular/material/expansion","@shared/components/button/toggle-password.component","@shared/components/file-input.component","@shared/components/queue/queue-autocomplete.component","@core/public-api","@shared/components/script-lang.component","@shared/components/js-func.component","@angular/material/button","@angular/cdk/keycodes","@angular/material/chips","@angular/material/icon","@shared/components/entity/entity-type-select.component","@shared/components/entity/entity-select.component","@angular/cdk/coercion","@shared/components/tb-error.component","@angular/flex-layout/extended","@angular/material/tooltip","rxjs/operators","@shared/components/tb-checkbox.component","@home/components/sms/sms-provider-configuration.component","@angular/material/autocomplete","@shared/pipe/highlight.pipe","@angular/material/list","@angular/cdk/drag-drop","@home/components/public-api","@shared/components/relation/relation-type-autocomplete.component","@shared/components/entity/entity-subtype-list.component","@home/components/relation/relation-filters.component","rxjs","@angular/material/radio","@angular/material/slide-toggle","@shared/components/entity/entity-autocomplete.component","@shared/components/entity/entity-type-list.component"],(function(t){"use strict";var e,o,r,a,n,l,i,s,m,u,p,d,f,c,g,x,y,b,h,C,F,L,v,I,N,T,k,M,q,S,A,G,D,E,V,P,R,O,w,B,H,U,K,j,_,z,J,Q,$,W,Y,X,Z,tt,et,ot,rt,at,nt,lt,it,st,mt,ut,pt,dt,ft,ct,gt,xt,yt,bt,ht,Ct,Ft,Lt,vt,It,Nt,Tt,kt,Mt,qt,St,At,Gt;return{setters:[function(t){e=t,o=t.Component,r=t.Pipe,a=t.ViewChild,n=t.forwardRef,l=t.Input,i=t.NgModule},function(t){s=t.RuleNodeConfigurationComponent,m=t.AttributeScope,u=t.telemetryTypeTranslations,p=t.ServiceType,d=t.ScriptLanguage,f=t.AlarmSeverity,c=t.alarmSeverityTranslations,g=t.EntitySearchDirection,x=t.entitySearchDirectionTranslations,y=t.EntityType,b=t.PageComponent,h=t.MessageType,C=t.messageTypeNames,F=t,L=t.SharedModule,v=t.AggregationType,I=t.aggregationTranslations,N=t.alarmStatusTranslations,T=t.AlarmStatus},function(t){k=t},function(t){M=t,q=t.Validators,S=t.NgControl,A=t.NG_VALUE_ACCESSOR,G=t.NG_VALIDATORS,D=t.FormControl},function(t){E=t},function(t){V=t},function(t){P=t},function(t){R=t},function(t){O=t},function(t){w=t,B=t.CommonModule},function(t){H=t},function(t){U=t},function(t){K=t},function(t){j=t},function(t){_=t},function(t){z=t},function(t){J=t},function(t){Q=t.getCurrentAuthState,$=t,W=t.isDefinedAndNotNull,Y=t.isNotEmptyStr},function(t){X=t},function(t){Z=t},function(t){tt=t},function(t){et=t.ENTER,ot=t.COMMA,rt=t.SEMICOLON},function(t){at=t},function(t){nt=t},function(t){lt=t},function(t){it=t},function(t){st=t.coerceBooleanProperty},function(t){mt=t},function(t){ut=t},function(t){pt=t},function(t){dt=t.distinctUntilChanged,ft=t.tap,ct=t.map,gt=t.startWith,xt=t.mergeMap,yt=t.share},function(t){bt=t},function(t){ht=t},function(t){Ct=t},function(t){Ft=t},function(t){Lt=t},function(t){vt=t},function(t){It=t.HomeComponentsModule},function(t){Nt=t},function(t){Tt=t},function(t){kt=t},function(t){Mt=t.of},function(t){qt=t},function(t){St=t},function(t){At=t},function(t){Gt=t}],execute:function(){class Dt extends s{constructor(t,e){super(t),this.store=t,this.fb=e}configForm(){return this.emptyConfigForm}onConfigurationSet(t){this.emptyConfigForm=this.fb.group({})}}t("EmptyConfigComponent",Dt),Dt.ɵfac=e.ɵɵngDeclareFactory({minVersion:"12.0.0",version:"12.2.16",ngImport:e,type:Dt,deps:[{token:k.Store},{token:M.FormBuilder}],target:e.ɵɵFactoryTarget.Component}),Dt.ɵcmp=e.ɵɵngDeclareComponent({minVersion:"12.0.0",version:"12.2.16",type:Dt,selector:"tb-node-empty-config",usesInheritance:!0,ngImport:e,template:"",isInline:!0}),e.ɵɵngDeclareClassMetadata({minVersion:"12.0.0",version:"12.2.16",ngImport:e,type:Dt,decorators:[{type:o,args:[{selector:"tb-node-empty-config",template:"",styleUrls:[]}]}],ctorParameters:function(){return[{type:k.Store},{type:M.FormBuilder}]}});class Et{constructor(t){this.sanitizer=t}transform(t){return this.sanitizer.bypassSecurityTrustHtml(t)}}t("SafeHtmlPipe",Et),Et.ɵfac=e.ɵɵngDeclareFactory({minVersion:"12.0.0",version:"12.2.16",ngImport:e,type:Et,deps:[{token:H.DomSanitizer}],target:e.ɵɵFactoryTarget.Pipe}),Et.ɵpipe=e.ɵɵngDeclarePipe({minVersion:"12.0.0",version:"12.2.16",ngImport:e,type:Et,name:"safeHtml"}),e.ɵɵngDeclareClassMetadata({minVersion:"12.0.0",version:"12.2.16",ngImport:e,type:Et,decorators:[{type:r,args:[{name:"safeHtml"}]}],ctorParameters:function(){return[{type:H.DomSanitizer}]}});class Vt extends s{constructor(t,e){super(t),this.store=t,this.fb=e}configForm(){return this.assignCustomerConfigForm}onConfigurationSet(t){this.assignCustomerConfigForm=this.fb.group({customerNamePattern:[t?t.customerNamePattern:null,[q.required,q.pattern(/.*\S.*/)]],createCustomerIfNotExists:[!!t&&t.createCustomerIfNotExists,[]],customerCacheExpiration:[t?t.customerCacheExpiration:null,[q.required,q.min(0)]]})}prepareOutputConfig(t){return t.customerNamePattern=t.customerNamePattern.trim(),t}}t("AssignCustomerConfigComponent",Vt),Vt.ɵfac=e.ɵɵngDeclareFactory({minVersion:"12.0.0",version:"12.2.16",ngImport:e,type:Vt,deps:[{token:k.Store},{token:M.FormBuilder}],target:e.ɵɵFactoryTarget.Component}),Vt.ɵcmp=e.ɵɵngDeclareComponent({minVersion:"12.0.0",version:"12.2.16",type:Vt,selector:"tb-action-node-assign-to-customer-config",usesInheritance:!0,ngImport:e,template:'\n \n tb.rulenode.customer-name-pattern\n \n \n {{ \'tb.rulenode.customer-name-pattern-required\' | translate }}\n \n \n \n \n {{ \'tb.rulenode.create-customer-if-not-exists\' | translate }}\n \n \n tb.rulenode.customer-cache-expiration\n \n \n {{ \'tb.rulenode.customer-cache-expiration-required\' | translate }}\n \n \n {{ \'tb.rulenode.customer-cache-expiration-range\' | translate }}\n \n tb.rulenode.customer-cache-expiration-hint\n \n\n',components:[{type:E.MatFormField,selector:"mat-form-field",inputs:["color","floatLabel","appearance","hideRequiredMarker","hintLabel"],exportAs:["matFormField"]},{type:V.MatCheckbox,selector:"mat-checkbox",inputs:["disableRipple","color","tabIndex","aria-label","aria-labelledby","id","labelPosition","name","required","checked","disabled","indeterminate","aria-describedby","value"],outputs:["change","indeterminateChange"],exportAs:["matCheckbox"]}],directives:[{type:P.DefaultLayoutDirective,selector:" [fxLayout], [fxLayout.xs], [fxLayout.sm], [fxLayout.md], [fxLayout.lg], [fxLayout.xl], [fxLayout.lt-sm], [fxLayout.lt-md], [fxLayout.lt-lg], [fxLayout.lt-xl], [fxLayout.gt-xs], [fxLayout.gt-sm], [fxLayout.gt-md], [fxLayout.gt-lg]",inputs:["fxLayout","fxLayout.xs","fxLayout.sm","fxLayout.md","fxLayout.lg","fxLayout.xl","fxLayout.lt-sm","fxLayout.lt-md","fxLayout.lt-lg","fxLayout.lt-xl","fxLayout.gt-xs","fxLayout.gt-sm","fxLayout.gt-md","fxLayout.gt-lg"]},{type:M.NgControlStatusGroup,selector:"[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]"},{type:M.FormGroupDirective,selector:"[formGroup]",inputs:["formGroup"],outputs:["ngSubmit"],exportAs:["ngForm"]},{type:E.MatLabel,selector:"mat-label"},{type:R.TranslateDirective,selector:"[translate],[ngx-translate]",inputs:["translate","translateParams"]},{type:O.MatInput,selector:"input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]",inputs:["id","disabled","required","type","value","readonly","placeholder","errorStateMatcher","aria-describedby"],exportAs:["matInput"]},{type:M.DefaultValueAccessor,selector:"input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]"},{type:M.RequiredValidator,selector:":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]",inputs:["required"]},{type:M.NgControlStatus,selector:"[formControlName],[ngModel],[formControl]"},{type:M.FormControlName,selector:"[formControlName]",inputs:["disabled","formControlName","ngModel"],outputs:["ngModelChange"]},{type:w.NgIf,selector:"[ngIf]",inputs:["ngIf","ngIfThen","ngIfElse"]},{type:E.MatError,selector:"mat-error",inputs:["id"]},{type:E.MatHint,selector:"mat-hint",inputs:["align","id"]},{type:P.DefaultFlexDirective,selector:" [fxFlex], [fxFlex.xs], [fxFlex.sm], [fxFlex.md], [fxFlex.lg], [fxFlex.xl], [fxFlex.lt-sm], [fxFlex.lt-md], [fxFlex.lt-lg], [fxFlex.lt-xl], [fxFlex.gt-xs], [fxFlex.gt-sm], [fxFlex.gt-md], [fxFlex.gt-lg]",inputs:["fxFlex","fxFlex.xs","fxFlex.sm","fxFlex.md","fxFlex.lg","fxFlex.xl","fxFlex.lt-sm","fxFlex.lt-md","fxFlex.lt-lg","fxFlex.lt-xl","fxFlex.gt-xs","fxFlex.gt-sm","fxFlex.gt-md","fxFlex.gt-lg"]},{type:M.MinValidator,selector:"input[type=number][min][formControlName],input[type=number][min][formControl],input[type=number][min][ngModel]",inputs:["min"]},{type:M.NumberValueAccessor,selector:"input[type=number][formControlName],input[type=number][formControl],input[type=number][ngModel]"}],pipes:{translate:R.TranslatePipe,safeHtml:Et}}),e.ɵɵngDeclareClassMetadata({minVersion:"12.0.0",version:"12.2.16",ngImport:e,type:Vt,decorators:[{type:o,args:[{selector:"tb-action-node-assign-to-customer-config",templateUrl:"./assign-customer-config.component.html",styleUrls:[]}]}],ctorParameters:function(){return[{type:k.Store},{type:M.FormBuilder}]}});class Pt extends s{constructor(t,e){super(t),this.store=t,this.fb=e,this.attributeScopeMap=m,this.attributeScopes=Object.keys(m),this.telemetryTypeTranslationsMap=u}configForm(){return this.attributesConfigForm}onConfigurationSet(t){this.attributesConfigForm=this.fb.group({scope:[t?t.scope:null,[q.required]],notifyDevice:[!t||t.notifyDevice,[]],sendAttributesUpdatedNotification:[!!t&&t.sendAttributesUpdatedNotification,[]]}),this.attributesConfigForm.get("scope").valueChanges.subscribe((t=>{t!==m.SHARED_SCOPE&&this.attributesConfigForm.get("notifyDevice").patchValue(!1,{emitEvent:!1}),t===m.CLIENT_SCOPE&&this.attributesConfigForm.get("sendAttributesUpdatedNotification").patchValue(!1,{emitEvent:!1})}))}}var Rt;t("AttributesConfigComponent",Pt),Pt.ɵfac=e.ɵɵngDeclareFactory({minVersion:"12.0.0",version:"12.2.16",ngImport:e,type:Pt,deps:[{token:k.Store},{token:M.FormBuilder}],target:e.ɵɵFactoryTarget.Component}),Pt.ɵcmp=e.ɵɵngDeclareComponent({minVersion:"12.0.0",version:"12.2.16",type:Pt,selector:"tb-action-node-attributes-config",usesInheritance:!0,ngImport:e,template:'\n \n attribute.attributes-scope\n \n \n {{ telemetryTypeTranslationsMap.get(scope) | translate }}\n \n \n \n
\n\n',components:[{type:E.MatFormField,selector:"mat-form-field",inputs:["color","floatLabel","appearance","hideRequiredMarker","hintLabel"],exportAs:["matFormField"]},{type:U.MatSelect,selector:"mat-select",inputs:["disabled","disableRipple","tabIndex"],exportAs:["matSelect"]},{type:K.MatOption,selector:"mat-option",exportAs:["matOption"]},{type:V.MatCheckbox,selector:"mat-checkbox",inputs:["disableRipple","color","tabIndex","aria-label","aria-labelledby","id","labelPosition","name","required","checked","disabled","indeterminate","aria-describedby","value"],outputs:["change","indeterminateChange"],exportAs:["matCheckbox"]}],directives:[{type:P.DefaultLayoutDirective,selector:" [fxLayout], [fxLayout.xs], [fxLayout.sm], [fxLayout.md], [fxLayout.lg], [fxLayout.xl], [fxLayout.lt-sm], [fxLayout.lt-md], [fxLayout.lt-lg], [fxLayout.lt-xl], [fxLayout.gt-xs], [fxLayout.gt-sm], [fxLayout.gt-md], [fxLayout.gt-lg]",inputs:["fxLayout","fxLayout.xs","fxLayout.sm","fxLayout.md","fxLayout.lg","fxLayout.xl","fxLayout.lt-sm","fxLayout.lt-md","fxLayout.lt-lg","fxLayout.lt-xl","fxLayout.gt-xs","fxLayout.gt-sm","fxLayout.gt-md","fxLayout.gt-lg"]},{type:M.NgControlStatusGroup,selector:"[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]"},{type:M.FormGroupDirective,selector:"[formGroup]",inputs:["formGroup"],outputs:["ngSubmit"],exportAs:["ngForm"]},{type:P.DefaultFlexDirective,selector:" [fxFlex], [fxFlex.xs], [fxFlex.sm], [fxFlex.md], [fxFlex.lg], [fxFlex.xl], [fxFlex.lt-sm], [fxFlex.lt-md], [fxFlex.lt-lg], [fxFlex.lt-xl], [fxFlex.gt-xs], [fxFlex.gt-sm], [fxFlex.gt-md], [fxFlex.gt-lg]",inputs:["fxFlex","fxFlex.xs","fxFlex.sm","fxFlex.md","fxFlex.lg","fxFlex.xl","fxFlex.lt-sm","fxFlex.lt-md","fxFlex.lt-lg","fxFlex.lt-xl","fxFlex.gt-xs","fxFlex.gt-sm","fxFlex.gt-md","fxFlex.gt-lg"]},{type:E.MatLabel,selector:"mat-label"},{type:R.TranslateDirective,selector:"[translate],[ngx-translate]",inputs:["translate","translateParams"]},{type:M.NgControlStatus,selector:"[formControlName],[ngModel],[formControl]"},{type:M.FormControlName,selector:"[formControlName]",inputs:["disabled","formControlName","ngModel"],outputs:["ngModelChange"]},{type:M.RequiredValidator,selector:":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]",inputs:["required"]},{type:w.NgForOf,selector:"[ngFor][ngForOf]",inputs:["ngForOf","ngForTrackBy","ngForTemplate"]},{type:w.NgIf,selector:"[ngIf]",inputs:["ngIf","ngIfThen","ngIfElse"]}],pipes:{translate:R.TranslatePipe}}),e.ɵɵngDeclareClassMetadata({minVersion:"12.0.0",version:"12.2.16",ngImport:e,type:Pt,decorators:[{type:o,args:[{selector:"tb-action-node-attributes-config",templateUrl:"./attributes-config.component.html",styleUrls:[]}]}],ctorParameters:function(){return[{type:k.Store},{type:M.FormBuilder}]}}),function(t){t.CUSTOMER="CUSTOMER",t.TENANT="TENANT",t.RELATED="RELATED",t.ALARM_ORIGINATOR="ALARM_ORIGINATOR",t.ENTITY="ENTITY"}(Rt||(Rt={}));const Ot=new Map([[Rt.CUSTOMER,"tb.rulenode.originator-customer"],[Rt.TENANT,"tb.rulenode.originator-tenant"],[Rt.RELATED,"tb.rulenode.originator-related"],[Rt.ALARM_ORIGINATOR,"tb.rulenode.originator-alarm-originator"],[Rt.ENTITY,"tb.rulenode.originator-entity"]]);var wt;!function(t){t.CIRCLE="CIRCLE",t.POLYGON="POLYGON"}(wt||(wt={}));const Bt=new Map([[wt.CIRCLE,"tb.rulenode.perimeter-circle"],[wt.POLYGON,"tb.rulenode.perimeter-polygon"]]);var Ht;!function(t){t.MILLISECONDS="MILLISECONDS",t.SECONDS="SECONDS",t.MINUTES="MINUTES",t.HOURS="HOURS",t.DAYS="DAYS"}(Ht||(Ht={}));const Ut=new Map([[Ht.MILLISECONDS,"tb.rulenode.time-unit-milliseconds"],[Ht.SECONDS,"tb.rulenode.time-unit-seconds"],[Ht.MINUTES,"tb.rulenode.time-unit-minutes"],[Ht.HOURS,"tb.rulenode.time-unit-hours"],[Ht.DAYS,"tb.rulenode.time-unit-days"]]);var Kt;!function(t){t.METER="METER",t.KILOMETER="KILOMETER",t.FOOT="FOOT",t.MILE="MILE",t.NAUTICAL_MILE="NAUTICAL_MILE"}(Kt||(Kt={}));const jt=new Map([[Kt.METER,"tb.rulenode.range-unit-meter"],[Kt.KILOMETER,"tb.rulenode.range-unit-kilometer"],[Kt.FOOT,"tb.rulenode.range-unit-foot"],[Kt.MILE,"tb.rulenode.range-unit-mile"],[Kt.NAUTICAL_MILE,"tb.rulenode.range-unit-nautical-mile"]]);var _t;!function(t){t.ID="ID",t.TITLE="TITLE",t.COUNTRY="COUNTRY",t.STATE="STATE",t.CITY="CITY",t.ZIP="ZIP",t.ADDRESS="ADDRESS",t.ADDRESS2="ADDRESS2",t.PHONE="PHONE",t.EMAIL="EMAIL",t.ADDITIONAL_INFO="ADDITIONAL_INFO"}(_t||(_t={}));const zt=new Map([[_t.TITLE,"tb.rulenode.entity-details-title"],[_t.COUNTRY,"tb.rulenode.entity-details-country"],[_t.STATE,"tb.rulenode.entity-details-state"],[_t.CITY,"tb.rulenode.entity-details-city"],[_t.ZIP,"tb.rulenode.entity-details-zip"],[_t.ADDRESS,"tb.rulenode.entity-details-address"],[_t.ADDRESS2,"tb.rulenode.entity-details-address2"],[_t.PHONE,"tb.rulenode.entity-details-phone"],[_t.EMAIL,"tb.rulenode.entity-details-email"],[_t.ADDITIONAL_INFO,"tb.rulenode.entity-details-additional_info"]]);var Jt,Qt,$t;!function(t){t.FIRST="FIRST",t.LAST="LAST",t.ALL="ALL"}(Jt||(Jt={})),function(t){t.ASC="ASC",t.DESC="DESC"}(Qt||(Qt={})),function(t){t.STANDARD="STANDARD",t.FIFO="FIFO"}($t||($t={}));const Wt=new Map([[$t.STANDARD,"tb.rulenode.sqs-queue-standard"],[$t.FIFO,"tb.rulenode.sqs-queue-fifo"]]),Yt=["anonymous","basic","cert.PEM"],Xt=new Map([["anonymous","tb.rulenode.credentials-anonymous"],["basic","tb.rulenode.credentials-basic"],["cert.PEM","tb.rulenode.credentials-pem"]]),Zt=["sas","cert.PEM"],te=new Map([["sas","tb.rulenode.credentials-sas"],["cert.PEM","tb.rulenode.credentials-pem"]]);var ee;!function(t){t.GET="GET",t.POST="POST",t.PUT="PUT",t.DELETE="DELETE"}(ee||(ee={}));const oe=["US-ASCII","ISO-8859-1","UTF-8","UTF-16BE","UTF-16LE","UTF-16"],re=new Map([["US-ASCII","tb.rulenode.charset-us-ascii"],["ISO-8859-1","tb.rulenode.charset-iso-8859-1"],["UTF-8","tb.rulenode.charset-utf-8"],["UTF-16BE","tb.rulenode.charset-utf-16be"],["UTF-16LE","tb.rulenode.charset-utf-16le"],["UTF-16","tb.rulenode.charset-utf-16"]]);var ae;!function(t){t.CUSTOM="CUSTOM",t.ADD="ADD",t.SUB="SUB",t.MULT="MULT",t.DIV="DIV",t.SIN="SIN",t.SINH="SINH",t.COS="COS",t.COSH="COSH",t.TAN="TAN",t.TANH="TANH",t.ACOS="ACOS",t.ASIN="ASIN",t.ATAN="ATAN",t.ATAN2="ATAN2",t.EXP="EXP",t.EXPM1="EXPM1",t.SQRT="SQRT",t.CBRT="CBRT",t.GET_EXP="GET_EXP",t.HYPOT="HYPOT",t.LOG="LOG",t.LOG10="LOG10",t.LOG1P="LOG1P",t.CEIL="CEIL",t.FLOOR="FLOOR",t.FLOOR_DIV="FLOOR_DIV",t.FLOOR_MOD="FLOOR_MOD",t.ABS="ABS",t.MIN="MIN",t.MAX="MAX",t.POW="POW",t.SIGNUM="SIGNUM",t.RAD="RAD",t.DEG="DEG"}(ae||(ae={}));const ne=new Map([[ae.CUSTOM,{value:ae.CUSTOM,name:"Custom Function",description:"Use this function to specify complex mathematical expression.",minArgs:1,maxArgs:16}],[ae.ADD,{value:ae.ADD,name:"Addition",description:"x + y",minArgs:2,maxArgs:2}],[ae.SUB,{value:ae.SUB,name:"Subtraction",description:"x - y",minArgs:2,maxArgs:2}],[ae.MULT,{value:ae.MULT,name:"Multiplication",description:"x * y",minArgs:2,maxArgs:2}],[ae.DIV,{value:ae.DIV,name:"Division",description:"x / y",minArgs:2,maxArgs:2}],[ae.SIN,{value:ae.SIN,name:"Sine",description:"Returns the trigonometric sine of an angle in radians.",minArgs:1,maxArgs:1}],[ae.SINH,{value:ae.SINH,name:"Hyperbolic sine",description:"Returns the hyperbolic sine of an argument.",minArgs:1,maxArgs:1}],[ae.COS,{value:ae.COS,name:"Cosine",description:"Returns the trigonometric cosine of an angle in radians.",minArgs:1,maxArgs:1}],[ae.COSH,{value:ae.COSH,name:"Hyperbolic cosine",description:"Returns the hyperbolic cosine of an argument.",minArgs:1,maxArgs:1}],[ae.TAN,{value:ae.TAN,name:"Tangent",description:"Returns the trigonometric tangent of an angle in radians",minArgs:1,maxArgs:1}],[ae.TANH,{value:ae.TANH,name:"Hyperbolic tangent",description:"Returns the hyperbolic tangent of an argument",minArgs:1,maxArgs:1}],[ae.ACOS,{value:ae.ACOS,name:"Arc cosine",description:"Returns the arc cosine of an argument",minArgs:1,maxArgs:1}],[ae.ASIN,{value:ae.ASIN,name:"Arc sine",description:"Returns the arc sine of an argument",minArgs:1,maxArgs:1}],[ae.ATAN,{value:ae.ATAN,name:"Arc tangent",description:"Returns the arc tangent of an argument",minArgs:1,maxArgs:1}],[ae.ATAN2,{value:ae.ATAN2,name:"2-argument arc tangent",description:"Returns the angle theta from the conversion of rectangular coordinates (x, y) to polar coordinates (r, theta)",minArgs:2,maxArgs:2}],[ae.EXP,{value:ae.EXP,name:"Exponential",description:"Returns Euler's number e raised to the power of an argument",minArgs:1,maxArgs:1}],[ae.EXPM1,{value:ae.EXPM1,name:"Exponential minus one",description:"Returns Euler's number e raised to the power of an argument minus one",minArgs:1,maxArgs:1}],[ae.SQRT,{value:ae.SQRT,name:"Square",description:"Returns the correctly rounded positive square root of an argument",minArgs:1,maxArgs:1}],[ae.CBRT,{value:ae.CBRT,name:"Cube root",description:"Returns the cube root of an argument",minArgs:1,maxArgs:1}],[ae.GET_EXP,{value:ae.GET_EXP,name:"Get exponent",description:"Returns the unbiased exponent used in the representation of an argument",minArgs:1,maxArgs:1}],[ae.HYPOT,{value:ae.HYPOT,name:"Square root",description:"Returns the square root of the squares of the arguments",minArgs:2,maxArgs:2}],[ae.LOG,{value:ae.LOG,name:"Logarithm",description:"Returns the natural logarithm of an argument",minArgs:1,maxArgs:1}],[ae.LOG10,{value:ae.LOG10,name:"Base 10 logarithm",description:"Returns the base 10 logarithm of an argument",minArgs:1,maxArgs:1}],[ae.LOG1P,{value:ae.LOG1P,name:"Logarithm of the sum",description:"Returns the natural logarithm of the sum of an argument",minArgs:1,maxArgs:1}],[ae.CEIL,{value:ae.CEIL,name:"Ceiling",description:"Returns the smallest (closest to negative infinity) of an argument",minArgs:1,maxArgs:1}],[ae.FLOOR,{value:ae.FLOOR,name:"Floor",description:"Returns the largest (closest to positive infinity) of an argument",minArgs:1,maxArgs:1}],[ae.FLOOR_DIV,{value:ae.FLOOR_DIV,name:"Floor division",description:"Returns the largest (closest to positive infinity) of the arguments",minArgs:2,maxArgs:2}],[ae.FLOOR_MOD,{value:ae.FLOOR_MOD,name:"Floor modulus",description:"Returns the floor modulus of the arguments",minArgs:2,maxArgs:2}],[ae.ABS,{value:ae.ABS,name:"Absolute",description:"Returns the absolute value of an argument",minArgs:1,maxArgs:1}],[ae.MIN,{value:ae.MIN,name:"Min",description:"Returns the smaller of the arguments",minArgs:2,maxArgs:2}],[ae.MAX,{value:ae.MAX,name:"Max",description:"Returns the greater of the arguments",minArgs:2,maxArgs:2}],[ae.POW,{value:ae.POW,name:"Raise to a power",description:"Returns the value of the first argument raised to the power of the second argument",minArgs:2,maxArgs:2}],[ae.SIGNUM,{value:ae.SIGNUM,name:"Sign of a real number",description:"Returns the signum function of the argument",minArgs:1,maxArgs:1}],[ae.RAD,{value:ae.RAD,name:"Radian",description:"Converts an angle measured in degrees to an approximately equivalent angle measured in radians",minArgs:1,maxArgs:1}],[ae.DEG,{value:ae.DEG,name:"Degrees",description:"Converts an angle measured in radians to an approximately equivalent angle measured in degrees.",minArgs:1,maxArgs:1}]]);var le,ie;!function(t){t.ATTRIBUTE="ATTRIBUTE",t.TIME_SERIES="TIME_SERIES",t.CONSTANT="CONSTANT",t.MESSAGE_BODY="MESSAGE_BODY",t.MESSAGE_METADATA="MESSAGE_METADATA"}(le||(le={})),function(t){t.ATTRIBUTE="ATTRIBUTE",t.TIME_SERIES="TIME_SERIES",t.MESSAGE_BODY="MESSAGE_BODY",t.MESSAGE_METADATA="MESSAGE_METADATA"}(ie||(ie={}));const se=new Map([[le.ATTRIBUTE,"tb.rulenode.attribute-type"],[le.TIME_SERIES,"tb.rulenode.time-series-type"],[le.CONSTANT,"tb.rulenode.constant-type"],[le.MESSAGE_BODY,"tb.rulenode.message-body-type"],[le.MESSAGE_METADATA,"tb.rulenode.message-metadata-type"]]),me=["x","y","z","a","b","c","d","k","l","m","n","o","p","r","s","t"];var ue,pe;!function(t){t.SHARED_SCOPE="SHARED_SCOPE",t.SERVER_SCOPE="SERVER_SCOPE",t.CLIENT_SCOPE="CLIENT_SCOPE"}(ue||(ue={})),function(t){t.SHARED_SCOPE="SHARED_SCOPE",t.SERVER_SCOPE="SERVER_SCOPE"}(pe||(pe={}));const de=new Map([[ue.SHARED_SCOPE,"tb.rulenode.shared-scope"],[ue.SERVER_SCOPE,"tb.rulenode.server-scope"],[ue.CLIENT_SCOPE,"tb.rulenode.client-scope"]]);class fe extends s{constructor(t,e){super(t),this.store=t,this.fb=e,this.allAzureIotHubCredentialsTypes=Zt,this.azureIotHubCredentialsTypeTranslationsMap=te}configForm(){return this.azureIotHubConfigForm}onConfigurationSet(t){this.azureIotHubConfigForm=this.fb.group({topicPattern:[t?t.topicPattern:null,[q.required]],host:[t?t.host:null,[q.required]],port:[t?t.port:null,[q.required,q.min(1),q.max(65535)]],connectTimeoutSec:[t?t.connectTimeoutSec:null,[q.required,q.min(1),q.max(200)]],clientId:[t?t.clientId:null,[q.required]],cleanSession:[!!t&&t.cleanSession,[]],ssl:[!!t&&t.ssl,[]],credentials:this.fb.group({type:[t&&t.credentials?t.credentials.type:null,[q.required]],sasKey:[t&&t.credentials?t.credentials.sasKey:null,[]],caCert:[t&&t.credentials?t.credentials.caCert:null,[]],caCertFileName:[t&&t.credentials?t.credentials.caCertFileName:null,[]],privateKey:[t&&t.credentials?t.credentials.privateKey:null,[]],privateKeyFileName:[t&&t.credentials?t.credentials.privateKeyFileName:null,[]],cert:[t&&t.credentials?t.credentials.cert:null,[]],certFileName:[t&&t.credentials?t.credentials.certFileName:null,[]],password:[t&&t.credentials?t.credentials.password:null,[]]})})}prepareOutputConfig(t){const e=t.credentials.type;return"sas"===e&&(t.credentials={type:e,sasKey:t.credentials.sasKey,caCert:t.credentials.caCert,caCertFileName:t.credentials.caCertFileName}),t}validatorTriggers(){return["credentials.type"]}updateValidators(t){const e=this.azureIotHubConfigForm.get("credentials"),o=e.get("type").value;switch(t&&e.reset({type:o},{emitEvent:!1}),e.get("sasKey").setValidators([]),e.get("privateKey").setValidators([]),e.get("privateKeyFileName").setValidators([]),e.get("cert").setValidators([]),e.get("certFileName").setValidators([]),o){case"sas":e.get("sasKey").setValidators([q.required]);break;case"cert.PEM":e.get("privateKey").setValidators([q.required]),e.get("privateKeyFileName").setValidators([q.required]),e.get("cert").setValidators([q.required]),e.get("certFileName").setValidators([q.required])}e.get("sasKey").updateValueAndValidity({emitEvent:t}),e.get("privateKey").updateValueAndValidity({emitEvent:t}),e.get("privateKeyFileName").updateValueAndValidity({emitEvent:t}),e.get("cert").updateValueAndValidity({emitEvent:t}),e.get("certFileName").updateValueAndValidity({emitEvent:t})}}t("AzureIotHubConfigComponent",fe),fe.ɵfac=e.ɵɵngDeclareFactory({minVersion:"12.0.0",version:"12.2.16",ngImport:e,type:fe,deps:[{token:k.Store},{token:M.FormBuilder}],target:e.ɵɵFactoryTarget.Component}),fe.ɵcmp=e.ɵɵngDeclareComponent({minVersion:"12.0.0",version:"12.2.16",type:fe,selector:"tb-action-node-azure-iot-hub-config",usesInheritance:!0,ngImport:e,template:'\n \n tb.rulenode.topic\n \n \n {{ \'tb.rulenode.topic-required\' | translate }}\n \n \n \n \n tb.rulenode.hostname\n \n \n {{ \'tb.rulenode.hostname-required\' | translate }}\n \n \n \n tb.rulenode.device-id\n \n \n {{ \'tb.rulenode.device-id-required\' | translate }}\n \n \n \n \n \n tb.rulenode.credentials\n \n {{ azureIotHubCredentialsTypeTranslationsMap.get(azureIotHubConfigForm.get(\'credentials.type\').value) | translate }}\n \n \n \n \n tb.rulenode.credentials-type\n \n \n {{ azureIotHubCredentialsTypeTranslationsMap.get(credentialsType) | translate }}\n \n \n \n {{ \'tb.rulenode.credentials-type-required\' | translate }}\n \n \n \n \n \n \n \n tb.rulenode.sas-key\n \n \n \n {{ \'tb.rulenode.sas-key-required\' | translate }}\n \n \n \n \n \n \n \n \n \n \n \n \n \n tb.rulenode.private-key-password\n \n \n \n \n \n \n \n \n\n',styles:[":host .tb-mqtt-credentials-panel-group{margin:0 6px}:host .tb-hint.client-id{margin-top:-1.25em;max-width:-moz-fit-content;max-width:fit-content}:host mat-checkbox{padding-bottom:16px}\n"],components:[{type:E.MatFormField,selector:"mat-form-field",inputs:["color","floatLabel","appearance","hideRequiredMarker","hintLabel"],exportAs:["matFormField"]},{type:j.MatExpansionPanel,selector:"mat-expansion-panel",inputs:["disabled","expanded","hideToggle","togglePosition"],outputs:["opened","closed","expandedChange","afterExpand","afterCollapse"],exportAs:["matExpansionPanel"]},{type:j.MatExpansionPanelHeader,selector:"mat-expansion-panel-header",inputs:["tabIndex","expandedHeight","collapsedHeight"]},{type:U.MatSelect,selector:"mat-select",inputs:["disabled","disableRipple","tabIndex"],exportAs:["matSelect"]},{type:K.MatOption,selector:"mat-option",exportAs:["matOption"]},{type:_.TogglePasswordComponent,selector:"tb-toggle-password"},{type:z.FileInputComponent,selector:"tb-file-input",inputs:["label","accept","noFileText","inputId","allowedExtensions","dropLabel","contentConvertFunction","required","requiredAsError","disabled","existingFileName","readAsBinary","workFromFileObj","multipleFile"],outputs:["fileNameChanged"]}],directives:[{type:P.DefaultLayoutDirective,selector:" [fxLayout], [fxLayout.xs], [fxLayout.sm], [fxLayout.md], [fxLayout.lg], [fxLayout.xl], [fxLayout.lt-sm], [fxLayout.lt-md], [fxLayout.lt-lg], [fxLayout.lt-xl], [fxLayout.gt-xs], [fxLayout.gt-sm], [fxLayout.gt-md], [fxLayout.gt-lg]",inputs:["fxLayout","fxLayout.xs","fxLayout.sm","fxLayout.md","fxLayout.lg","fxLayout.xl","fxLayout.lt-sm","fxLayout.lt-md","fxLayout.lt-lg","fxLayout.lt-xl","fxLayout.gt-xs","fxLayout.gt-sm","fxLayout.gt-md","fxLayout.gt-lg"]},{type:M.NgControlStatusGroup,selector:"[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]"},{type:M.FormGroupDirective,selector:"[formGroup]",inputs:["formGroup"],outputs:["ngSubmit"],exportAs:["ngForm"]},{type:E.MatLabel,selector:"mat-label"},{type:R.TranslateDirective,selector:"[translate],[ngx-translate]",inputs:["translate","translateParams"]},{type:O.MatInput,selector:"input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]",inputs:["id","disabled","required","type","value","readonly","placeholder","errorStateMatcher","aria-describedby"],exportAs:["matInput"]},{type:M.DefaultValueAccessor,selector:"input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]"},{type:M.RequiredValidator,selector:":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]",inputs:["required"]},{type:M.NgControlStatus,selector:"[formControlName],[ngModel],[formControl]"},{type:M.FormControlName,selector:"[formControlName]",inputs:["disabled","formControlName","ngModel"],outputs:["ngModelChange"]},{type:w.NgIf,selector:"[ngIf]",inputs:["ngIf","ngIfThen","ngIfElse"]},{type:E.MatError,selector:"mat-error",inputs:["id"]},{type:E.MatHint,selector:"mat-hint",inputs:["align","id"]},{type:j.MatAccordion,selector:"mat-accordion",inputs:["multi","displayMode","togglePosition","hideToggle"],exportAs:["matAccordion"]},{type:j.MatExpansionPanelTitle,selector:"mat-panel-title"},{type:j.MatExpansionPanelDescription,selector:"mat-panel-description"},{type:M.FormGroupName,selector:"[formGroupName]",inputs:["formGroupName"]},{type:w.NgForOf,selector:"[ngFor][ngForOf]",inputs:["ngForOf","ngForTrackBy","ngForTemplate"]},{type:w.NgSwitch,selector:"[ngSwitch]",inputs:["ngSwitch"]},{type:w.NgSwitchCase,selector:"[ngSwitchCase]",inputs:["ngSwitchCase"]},{type:E.MatSuffix,selector:"[matSuffix]"}],pipes:{translate:R.TranslatePipe,safeHtml:Et}}),e.ɵɵngDeclareClassMetadata({minVersion:"12.0.0",version:"12.2.16",ngImport:e,type:fe,decorators:[{type:o,args:[{selector:"tb-action-node-azure-iot-hub-config",templateUrl:"./azure-iot-hub-config.component.html",styleUrls:["./mqtt-config.component.scss"]}]}],ctorParameters:function(){return[{type:k.Store},{type:M.FormBuilder}]}});class ce extends s{constructor(t,e){super(t),this.store=t,this.fb=e,this.serviceType=p.TB_RULE_ENGINE}configForm(){return this.checkPointConfigForm}onConfigurationSet(t){this.checkPointConfigForm=this.fb.group({queueName:[t?t.queueName:null,[q.required]]})}}t("CheckPointConfigComponent",ce),ce.ɵfac=e.ɵɵngDeclareFactory({minVersion:"12.0.0",version:"12.2.16",ngImport:e,type:ce,deps:[{token:k.Store},{token:M.FormBuilder}],target:e.ɵɵFactoryTarget.Component}),ce.ɵcmp=e.ɵɵngDeclareComponent({minVersion:"12.0.0",version:"12.2.16",type:ce,selector:"tb-action-node-check-point-config",usesInheritance:!0,ngImport:e,template:'\n \n \n\n',components:[{type:J.QueueAutocompleteComponent,selector:"tb-queue-autocomplete",inputs:["labelText","requiredText","required","queueType","disabled"]}],directives:[{type:P.DefaultLayoutDirective,selector:" [fxLayout], [fxLayout.xs], [fxLayout.sm], [fxLayout.md], [fxLayout.lg], [fxLayout.xl], [fxLayout.lt-sm], [fxLayout.lt-md], [fxLayout.lt-lg], [fxLayout.lt-xl], [fxLayout.gt-xs], [fxLayout.gt-sm], [fxLayout.gt-md], [fxLayout.gt-lg]",inputs:["fxLayout","fxLayout.xs","fxLayout.sm","fxLayout.md","fxLayout.lg","fxLayout.xl","fxLayout.lt-sm","fxLayout.lt-md","fxLayout.lt-lg","fxLayout.lt-xl","fxLayout.gt-xs","fxLayout.gt-sm","fxLayout.gt-md","fxLayout.gt-lg"]},{type:M.NgControlStatusGroup,selector:"[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]"},{type:M.FormGroupDirective,selector:"[formGroup]",inputs:["formGroup"],outputs:["ngSubmit"],exportAs:["ngForm"]},{type:M.RequiredValidator,selector:":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]",inputs:["required"]},{type:M.NgControlStatus,selector:"[formControlName],[ngModel],[formControl]"},{type:M.FormControlName,selector:"[formControlName]",inputs:["disabled","formControlName","ngModel"],outputs:["ngModelChange"]}]}),e.ɵɵngDeclareClassMetadata({minVersion:"12.0.0",version:"12.2.16",ngImport:e,type:ce,decorators:[{type:o,args:[{selector:"tb-action-node-check-point-config",templateUrl:"./check-point-config.component.html",styleUrls:[]}]}],ctorParameters:function(){return[{type:k.Store},{type:M.FormBuilder}]}});class ge extends s{constructor(t,e,o,r){super(t),this.store=t,this.fb=e,this.nodeScriptTestService=o,this.translate=r,this.tbelEnabled=Q(this.store).tbelEnabled,this.scriptLanguage=d}configForm(){return this.clearAlarmConfigForm}onConfigurationSet(t){this.clearAlarmConfigForm=this.fb.group({scriptLang:[t?t.scriptLang:d.JS,[q.required]],alarmDetailsBuildJs:[t?t.alarmDetailsBuildJs:null,[]],alarmDetailsBuildTbel:[t?t.alarmDetailsBuildTbel:null,[]],alarmType:[t?t.alarmType:null,[q.required]]})}validatorTriggers(){return["scriptLang"]}updateValidators(t){let e=this.clearAlarmConfigForm.get("scriptLang").value;e!==d.TBEL||this.tbelEnabled||(e=d.JS,this.clearAlarmConfigForm.get("scriptLang").patchValue(e,{emitEvent:!1}),setTimeout((()=>{this.clearAlarmConfigForm.updateValueAndValidity({emitEvent:!0})}))),this.clearAlarmConfigForm.get("alarmDetailsBuildJs").setValidators(e===d.JS?[q.required]:[]),this.clearAlarmConfigForm.get("alarmDetailsBuildJs").updateValueAndValidity({emitEvent:t}),this.clearAlarmConfigForm.get("alarmDetailsBuildTbel").setValidators(e===d.TBEL?[q.required]:[]),this.clearAlarmConfigForm.get("alarmDetailsBuildTbel").updateValueAndValidity({emitEvent:t})}prepareInputConfig(t){return t&&(t.scriptLang||(t.scriptLang=d.JS)),t}testScript(){const t=this.clearAlarmConfigForm.get("scriptLang").value,e=t===d.JS?"alarmDetailsBuildJs":"alarmDetailsBuildTbel",o=t===d.JS?"rulenode/clear_alarm_node_script_fn":"rulenode/tbel/clear_alarm_node_script_fn",r=this.clearAlarmConfigForm.get(e).value;this.nodeScriptTestService.testNodeScript(r,"json",this.translate.instant("tb.rulenode.details"),"Details",["msg","metadata","msgType"],this.ruleNodeId,o,t).subscribe((t=>{t&&this.clearAlarmConfigForm.get(e).setValue(t)}))}onValidate(){this.clearAlarmConfigForm.get("scriptLang").value===d.JS&&this.jsFuncComponent.validateOnSubmit()}}t("ClearAlarmConfigComponent",ge),ge.ɵfac=e.ɵɵngDeclareFactory({minVersion:"12.0.0",version:"12.2.16",ngImport:e,type:ge,deps:[{token:k.Store},{token:M.FormBuilder},{token:$.NodeScriptTestService},{token:R.TranslateService}],target:e.ɵɵFactoryTarget.Component}),ge.ɵcmp=e.ɵɵngDeclareComponent({minVersion:"12.0.0",version:"12.2.16",type:ge,selector:"tb-action-node-clear-alarm-config",viewQueries:[{propertyName:"jsFuncComponent",first:!0,predicate:["jsFuncComponent"],descendants:!0},{propertyName:"tbelFuncComponent",first:!0,predicate:["tbelFuncComponent"],descendants:!0}],usesInheritance:!0,ngImport:e,template:'\n \n \n \n \n \n
\n \n \n {{\'tb.rulenode.data\' | translate}}\n \n \n {{\'tb.rulenode.metadata\' | translate}}\n \n \n \n \n \n \n {{key}}\n close\n \n \n \n {{ \'tb.rulenode.keys-required\' | translate }}\n \n \n\n',components:[{type:qt.MatRadioButton,selector:"mat-radio-button",inputs:["disableRipple","tabIndex"],exportAs:["matRadioButton"]},{type:E.MatFormField,selector:"mat-form-field",inputs:["color","floatLabel","appearance","hideRequiredMarker","hintLabel"],exportAs:["matFormField"]},{type:at.MatChipList,selector:"mat-chip-list",inputs:["aria-orientation","multiple","compareWith","value","required","placeholder","disabled","selectable","tabIndex","errorStateMatcher"],outputs:["change","valueChange"],exportAs:["matChipList"]},{type:nt.MatIcon,selector:"mat-icon",inputs:["color","inline","svgIcon","fontSet","fontIcon"],exportAs:["matIcon"]}],directives:[{type:P.DefaultLayoutDirective,selector:" [fxLayout], [fxLayout.xs], [fxLayout.sm], [fxLayout.md], [fxLayout.lg], [fxLayout.xl], [fxLayout.lt-sm], [fxLayout.lt-md], [fxLayout.lt-lg], [fxLayout.lt-xl], [fxLayout.gt-xs], [fxLayout.gt-sm], [fxLayout.gt-md], [fxLayout.gt-lg]",inputs:["fxLayout","fxLayout.xs","fxLayout.sm","fxLayout.md","fxLayout.lg","fxLayout.xl","fxLayout.lt-sm","fxLayout.lt-md","fxLayout.lt-lg","fxLayout.lt-xl","fxLayout.gt-xs","fxLayout.gt-sm","fxLayout.gt-md","fxLayout.gt-lg"]},{type:M.NgControlStatusGroup,selector:"[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]"},{type:M.FormGroupDirective,selector:"[formGroup]",inputs:["formGroup"],outputs:["ngSubmit"],exportAs:["ngForm"]},{type:qt.MatRadioGroup,selector:"mat-radio-group",exportAs:["matRadioGroup"]},{type:M.NgControlStatus,selector:"[formControlName],[ngModel],[formControl]"},{type:M.FormControlName,selector:"[formControlName]",inputs:["disabled","formControlName","ngModel"],outputs:["ngModelChange"]},{type:P.DefaultLayoutGapDirective,selector:" [fxLayoutGap], [fxLayoutGap.xs], [fxLayoutGap.sm], [fxLayoutGap.md], [fxLayoutGap.lg], [fxLayoutGap.xl], [fxLayoutGap.lt-sm], [fxLayoutGap.lt-md], [fxLayoutGap.lt-lg], [fxLayoutGap.lt-xl], [fxLayoutGap.gt-xs], [fxLayoutGap.gt-sm], [fxLayoutGap.gt-md], [fxLayoutGap.gt-lg]",inputs:["fxLayoutGap","fxLayoutGap.xs","fxLayoutGap.sm","fxLayoutGap.md","fxLayoutGap.lg","fxLayoutGap.xl","fxLayoutGap.lt-sm","fxLayoutGap.lt-md","fxLayoutGap.lt-lg","fxLayoutGap.lt-xl","fxLayoutGap.gt-xs","fxLayoutGap.gt-sm","fxLayoutGap.gt-md","fxLayoutGap.gt-lg"]},{type:E.MatLabel,selector:"mat-label"},{type:w.NgForOf,selector:"[ngFor][ngForOf]",inputs:["ngForOf","ngForTrackBy","ngForTemplate"]},{type:at.MatChip,selector:"mat-basic-chip, [mat-basic-chip], mat-chip, [mat-chip]",inputs:["color","disableRipple","tabIndex","selected","value","selectable","disabled","removable"],outputs:["selectionChange","destroyed","removed"],exportAs:["matChip"]},{type:at.MatChipRemove,selector:"[matChipRemove]"},{type:O.MatInput,selector:"input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]",inputs:["id","disabled","required","type","value","readonly","placeholder","errorStateMatcher","aria-describedby"],exportAs:["matInput"]},{type:at.MatChipInput,selector:"input[matChipInputFor]",inputs:["matChipInputSeparatorKeyCodes","placeholder","id","matChipInputFor","matChipInputAddOnBlur","disabled"],outputs:["matChipInputTokenEnd"],exportAs:["matChipInput","matChipInputFor"]},{type:w.NgIf,selector:"[ngIf]",inputs:["ngIf","ngIfThen","ngIfElse"]},{type:E.MatError,selector:"mat-error",inputs:["id"]},{type:E.MatHint,selector:"mat-hint",inputs:["align","id"]}],pipes:{translate:R.TranslatePipe,safeHtml:Et}}),e.ɵɵngDeclareClassMetadata({minVersion:"12.0.0",version:"12.2.16",ngImport:e,type:No,decorators:[{type:o,args:[{selector:"tb-transformation-node-delete-keys-config",templateUrl:"./delete-keys-config.component.html",styleUrls:[]}]}],ctorParameters:function(){return[{type:k.Store},{type:M.FormBuilder}]}});class To{}t("RulenodeCoreConfigTransformModule",To),To.ɵfac=e.ɵɵngDeclareFactory({minVersion:"12.0.0",version:"12.2.16",ngImport:e,type:To,deps:[],target:e.ɵɵFactoryTarget.NgModule}),To.ɵmod=e.ɵɵngDeclareNgModule({minVersion:"12.0.0",version:"12.2.16",ngImport:e,type:To,declarations:[ho,Co,Fo,Lo,vo,Io,No],imports:[B,L,We],exports:[ho,Co,Fo,Lo,vo,Io,No]}),To.ɵinj=e.ɵɵngDeclareInjector({minVersion:"12.0.0",version:"12.2.16",ngImport:e,type:To,imports:[[B,L,We]]}),e.ɵɵngDeclareClassMetadata({minVersion:"12.0.0",version:"12.2.16",ngImport:e,type:To,decorators:[{type:i,args:[{declarations:[ho,Co,Fo,Lo,vo,Io,No],imports:[B,L,We],exports:[ho,Co,Fo,Lo,vo,Io,No]}]}]});class ko extends s{constructor(t,e){super(t),this.store=t,this.fb=e,this.entityType=y}configForm(){return this.ruleChainInputConfigForm}onConfigurationSet(t){this.ruleChainInputConfigForm=this.fb.group({ruleChainId:[t?t.ruleChainId:null,[q.required]]})}}t("RuleChainInputComponent",ko),ko.ɵfac=e.ɵɵngDeclareFactory({minVersion:"12.0.0",version:"12.2.16",ngImport:e,type:ko,deps:[{token:k.Store},{token:M.FormBuilder}],target:e.ɵɵFactoryTarget.Component}),ko.ɵcmp=e.ɵɵngDeclareComponent({minVersion:"12.0.0",version:"12.2.16",type:ko,selector:"tb-flow-node-rule-chain-input-config",usesInheritance:!0,ngImport:e,template:'\n \n \n\n',components:[{type:At.EntityAutocompleteComponent,selector:"tb-entity-autocomplete",inputs:["entityType","entitySubtype","excludeEntityIds","labelText","requiredText","appearance","required","disabled"],outputs:["entityChanged"]}],directives:[{type:P.DefaultLayoutDirective,selector:" [fxLayout], [fxLayout.xs], [fxLayout.sm], [fxLayout.md], [fxLayout.lg], [fxLayout.xl], [fxLayout.lt-sm], [fxLayout.lt-md], [fxLayout.lt-lg], [fxLayout.lt-xl], [fxLayout.gt-xs], [fxLayout.gt-sm], [fxLayout.gt-md], [fxLayout.gt-lg]",inputs:["fxLayout","fxLayout.xs","fxLayout.sm","fxLayout.md","fxLayout.lg","fxLayout.xl","fxLayout.lt-sm","fxLayout.lt-md","fxLayout.lt-lg","fxLayout.lt-xl","fxLayout.gt-xs","fxLayout.gt-sm","fxLayout.gt-md","fxLayout.gt-lg"]},{type:M.NgControlStatusGroup,selector:"[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]"},{type:M.FormGroupDirective,selector:"[formGroup]",inputs:["formGroup"],outputs:["ngSubmit"],exportAs:["ngForm"]},{type:M.RequiredValidator,selector:":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]",inputs:["required"]},{type:M.NgControlStatus,selector:"[formControlName],[ngModel],[formControl]"},{type:M.FormControlName,selector:"[formControlName]",inputs:["disabled","formControlName","ngModel"],outputs:["ngModelChange"]}]}),e.ɵɵngDeclareClassMetadata({minVersion:"12.0.0",version:"12.2.16",ngImport:e,type:ko,decorators:[{type:o,args:[{selector:"tb-flow-node-rule-chain-input-config",templateUrl:"./rule-chain-input.component.html",styleUrls:[]}]}],ctorParameters:function(){return[{type:k.Store},{type:M.FormBuilder}]}});class Mo extends s{constructor(t,e){super(t),this.store=t,this.fb=e}configForm(){return this.ruleChainOutputConfigForm}onConfigurationSet(t){this.ruleChainOutputConfigForm=this.fb.group({})}}t("RuleChainOutputComponent",Mo),Mo.ɵfac=e.ɵɵngDeclareFactory({minVersion:"12.0.0",version:"12.2.16",ngImport:e,type:Mo,deps:[{token:k.Store},{token:M.FormBuilder}],target:e.ɵɵFactoryTarget.Component}),Mo.ɵcmp=e.ɵɵngDeclareComponent({minVersion:"12.0.0",version:"12.2.16",type:Mo,selector:"tb-flow-node-rule-chain-output-config",usesInheritance:!0,ngImport:e,template:'\n \n\n',directives:[{type:P.DefaultLayoutDirective,selector:" [fxLayout], [fxLayout.xs], [fxLayout.sm], [fxLayout.md], [fxLayout.lg], [fxLayout.xl], [fxLayout.lt-sm], [fxLayout.lt-md], [fxLayout.lt-lg], [fxLayout.lt-xl], [fxLayout.gt-xs], [fxLayout.gt-sm], [fxLayout.gt-md], [fxLayout.gt-lg]",inputs:["fxLayout","fxLayout.xs","fxLayout.sm","fxLayout.md","fxLayout.lg","fxLayout.xl","fxLayout.lt-sm","fxLayout.lt-md","fxLayout.lt-lg","fxLayout.lt-xl","fxLayout.gt-xs","fxLayout.gt-sm","fxLayout.gt-md","fxLayout.gt-lg"]},{type:M.NgControlStatusGroup,selector:"[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]"},{type:M.FormGroupDirective,selector:"[formGroup]",inputs:["formGroup"],outputs:["ngSubmit"],exportAs:["ngForm"]}],pipes:{translate:R.TranslatePipe}}),e.ɵɵngDeclareClassMetadata({minVersion:"12.0.0",version:"12.2.16",ngImport:e,type:Mo,decorators:[{type:o,args:[{selector:"tb-flow-node-rule-chain-output-config",templateUrl:"./rule-chain-output.component.html",styleUrls:[]}]}],ctorParameters:function(){return[{type:k.Store},{type:M.FormBuilder}]}});class qo{}t("RuleNodeCoreConfigFlowModule",qo),qo.ɵfac=e.ɵɵngDeclareFactory({minVersion:"12.0.0",version:"12.2.16",ngImport:e,type:qo,deps:[],target:e.ɵɵFactoryTarget.NgModule}),qo.ɵmod=e.ɵɵngDeclareNgModule({minVersion:"12.0.0",version:"12.2.16",ngImport:e,type:qo,declarations:[ko,Mo],imports:[B,L,We],exports:[ko,Mo]}),qo.ɵinj=e.ɵɵngDeclareInjector({minVersion:"12.0.0",version:"12.2.16",ngImport:e,type:qo,imports:[[B,L,We]]}),e.ɵɵngDeclareClassMetadata({minVersion:"12.0.0",version:"12.2.16",ngImport:e,type:qo,decorators:[{type:i,args:[{declarations:[ko,Mo],imports:[B,L,We],exports:[ko,Mo]}]}]});class So{constructor(t){!function(t){t.setTranslation("en_US",{tb:{rulenode:{"create-entity-if-not-exists":"Create new entity if not exists","create-entity-if-not-exists-hint":"Create a new entity set above if it does not exist.","entity-name-pattern":"Name pattern","entity-name-pattern-required":"Name pattern is required","entity-type-pattern":"Type pattern","entity-type-pattern-required":"Type pattern is required","entity-cache-expiration":"Entities cache expiration time (sec)","entity-cache-expiration-hint":"Specifies maximum time interval allowed to store found entity records. 0 value means that records will never expire.","entity-cache-expiration-required":"Entities cache expiration time is required.","entity-cache-expiration-range":"Entities cache expiration time should be greater than or equal to 0.","customer-name-pattern":"Customer name pattern","customer-name-pattern-required":"Customer name pattern is required","create-customer-if-not-exists":"Create new customer if not exists","customer-cache-expiration":"Customers cache expiration time (sec)","customer-cache-expiration-hint":"Specifies maximum time interval allowed to store found customer records. 0 value means that records will never expire.","customer-cache-expiration-required":"Customers cache expiration time is required.","customer-cache-expiration-range":"Customers cache expiration time should be greater than or equal to 0.","start-interval":"Start Interval","end-interval":"End Interval","start-interval-time-unit":"Start Interval Time Unit","end-interval-time-unit":"End Interval Time Unit","fetch-mode":"Fetch mode","fetch-mode-hint":"If selected fetch mode 'ALL' you able to choose telemetry sampling order.","order-by":"Order by","order-by-hint":"Select to choose telemetry sampling order.",limit:"Limit","limit-hint":"Min limit value is 2, max - 1000. In case you want to fetch a single entry, select fetch mode 'FIRST' or 'LAST'.","time-unit-milliseconds":"Milliseconds","time-unit-seconds":"Seconds","time-unit-minutes":"Minutes","time-unit-hours":"Hours","time-unit-days":"Days","time-value-range":"Time value should be in a range from 1 to 2147483647.","start-interval-value-required":"Start interval value is required.","end-interval-value-required":"End interval value is required.",filter:"Filter",switch:"Switch","message-type":"Message type","message-type-required":"Message type is required.","message-types-filter":"Message types filter","no-message-types-found":"No message types found","no-message-type-matching":"'{{messageType}}' not found.","create-new-message-type":"Create a new one!","message-types-required":"Message types are required.","client-attributes":"Client attributes","shared-attributes":"Shared attributes","server-attributes":"Server attributes","attributes-keys":"Attributes keys","attributes-keys-required":"Attributes keys are required","notify-device":"Notify device","send-attributes-updated-notification":"Send attributes updated notification","send-attributes-updated-notification-hint":"Send notification about updated attributes as a separate message to the rule engine queue.","send-attributes-deleted-notification":"Send attributes deleted notification","send-attributes-deleted-notification-hint":"Send notification about deleted attributes as a separate message to the rule engine queue.","fetch-credentials-to-metadata":"Fetch credentials to metadata","notify-device-hint":"If the message arrives from the device, we will push it back to the device by default.","notify-device-delete-hint":"Send notification about deleted attributes to device.","latest-timeseries":"Latest timeseries","timeseries-key":"Timeseries key","data-keys":"Message data","copy-from":"Copy from","data-to-metadata":"Data to metadata","metadata-to-data":"Metadata to data","use-regular-expression-hint":"Hint: use regular expression to copy keys by pattern",keys:"Keys","keys-required":"Keys are required","rename-keys-in":"Rename keys in",data:"Data",metadata:"Metadata","key-name":"Key name","key-name-required":"Key name is required","new-key-name":"New key name","new-key-name-required":"New key name is required","metadata-keys":"Message metadata","json-path-expression":"JSON path expression","json-path-expression-required":"JSON path expression is required","json-path-expression-hint":"JSONPath specifies a path to an element or a set of elements in a JSON structure. '$' represents the root object or array.","relations-query":"Relations query","device-relations-query":"Device relations query","max-relation-level":"Max relation level","relation-type-pattern":"Relation type pattern","relation-type-pattern-required":"Relation type pattern is required","relation-types-list":"Relation types to propagate","relation-types-list-hint":"If Propagate relation types are not selected, alarms will be propagated without filtering by relation type.","unlimited-level":"Unlimited level","latest-telemetry":"Latest telemetry","delete-from":"Delete from","use-regular-expression-delete-hint":"Use regular expression to delete keys by pattern","fetch-into":"Fetch into","attr-mapping":"Attributes mapping","source-attribute":"Source attribute","source-attribute-required":"Source attribute is required.","source-telemetry":"Source telemetry","source-telemetry-required":"Source telemetry is required.","target-attribute":"Target attribute","target-attribute-required":"Target attribute is required.","attr-mapping-required":"At least one attribute mapping should be specified.","fields-mapping":"Fields mapping","fields-mapping-required":"At least one field mapping should be specified.","source-field":"Source field","source-field-required":"Source field is required.","originator-source":"Originator source","originator-customer":"Customer","originator-tenant":"Tenant","originator-related":"Related","originator-alarm-originator":"Alarm Originator","originator-entity":"Entity","clone-message":"Clone message",transform:"Transform","default-ttl":"Default TTL in seconds","default-ttl-required":"Default TTL is required.","min-default-ttl-message":"Only 0 minimum TTL is allowed.","message-count":"Message count (0 - unlimited)","message-count-required":"Message count is required.","min-message-count-message":"Only 0 minimum message count is allowed.","period-seconds":"Period in seconds","period-seconds-required":"Period is required.","use-metadata-period-in-seconds-patterns":"Use period in seconds pattern","use-metadata-period-in-seconds-patterns-hint":"If selected, rule node use period in seconds interval pattern from message metadata or data assuming that intervals are in the seconds.","period-in-seconds-pattern":"Period in seconds pattern","period-in-seconds-pattern-required":"Period in seconds pattern is required","min-period-seconds-message":"Only 1 second minimum period is allowed.",originator:"Originator","message-body":"Message body","message-metadata":"Message metadata",generate:"Generate","test-generator-function":"Test generator function",generator:"Generator","test-filter-function":"Test filter function","test-switch-function":"Test switch function","test-transformer-function":"Test transformer function",transformer:"Transformer","alarm-create-condition":"Alarm create condition","test-condition-function":"Test condition function","alarm-clear-condition":"Alarm clear condition","alarm-details-builder":"Alarm details builder","test-details-function":"Test details function","alarm-type":"Alarm type","alarm-type-required":"Alarm type is required.","alarm-severity":"Alarm severity","alarm-severity-required":"Alarm severity is required","alarm-severity-pattern":"Alarm severity pattern","alarm-status-filter":"Alarm status filter","alarm-status-list-empty":"Alarm status list is empty","no-alarm-status-matching":"No alarm status matching were found.",propagate:"Propagate alarm to related entities","propagate-to-owner":"Propagate alarm to entity owner (Customer or Tenant)","propagate-to-tenant":"Propagate alarm to Tenant",condition:"Condition",details:"Details","to-string":"To string","test-to-string-function":"Test to string function","from-template":"From Template","from-template-required":"From Template is required","to-template":"To Template","to-template-required":"To Template is required","mail-address-list-template-hint":'Comma separated address list, use ${metadataKey} for value from metadata, $[messageKey] for value from message body',"cc-template":"Cc Template","bcc-template":"Bcc Template","subject-template":"Subject Template","subject-template-required":"Subject Template is required","body-template":"Body Template","body-template-required":"Body Template is required","dynamic-mail-body-type":"Dynamic mail body type","mail-body-type":"Mail body type","request-id-metadata-attribute":"Request Id Metadata attribute name","timeout-sec":"Timeout in seconds","timeout-required":"Timeout is required","min-timeout-message":"Only 0 minimum timeout value is allowed.","endpoint-url-pattern":"Endpoint URL pattern","endpoint-url-pattern-required":"Endpoint URL pattern is required","request-method":"Request method","use-simple-client-http-factory":"Use simple client HTTP factory","ignore-request-body":"Without request body","read-timeout":"Read timeout in millis","read-timeout-hint":"The value of 0 means an infinite timeout","max-parallel-requests-count":"Max number of parallel requests","max-parallel-requests-count-hint":"The value of 0 specifies no limit in parallel processing",headers:"Headers","headers-hint":'Use ${metadataKey} for value from metadata, $[messageKey] for value from message body in header/value fields',header:"Header","header-required":"Header is required",value:"Value","value-required":"Value is required","topic-pattern":"Topic pattern","key-pattern":"Key pattern","key-pattern-hint":"Hint: Optional. If a valid partition number is specified, it will be used when sending the record. If no partition is specified, the key will be used instead. If neither is specified, a partition will be assigned in a round-robin fashion.","topic-pattern-required":"Topic pattern is required",topic:"Topic","topic-required":"Topic is required","bootstrap-servers":"Bootstrap servers","bootstrap-servers-required":"Bootstrap servers value is required","other-properties":"Other properties",key:"Key","key-required":"Key is required",retries:"Automatically retry times if fails","min-retries-message":"Only 0 minimum retries is allowed.","batch-size-bytes":"Produces batch size in bytes","min-batch-size-bytes-message":"Only 0 minimum batch size is allowed.","linger-ms":"Time to buffer locally (ms)","min-linger-ms-message":"Only 0 ms minimum value is allowed.","buffer-memory-bytes":"Client buffer max size in bytes","min-buffer-memory-message":"Only 0 minimum buffer size is allowed.",acks:"Number of acknowledgments","key-serializer":"Key serializer","key-serializer-required":"Key serializer is required","value-serializer":"Value serializer","value-serializer-required":"Value serializer is required","topic-arn-pattern":"Topic ARN pattern","topic-arn-pattern-required":"Topic ARN pattern is required","aws-access-key-id":"AWS Access Key ID","aws-access-key-id-required":"AWS Access Key ID is required","aws-secret-access-key":"AWS Secret Access Key","aws-secret-access-key-required":"AWS Secret Access Key is required","aws-region":"AWS Region","aws-region-required":"AWS Region is required","exchange-name-pattern":"Exchange name pattern","routing-key-pattern":"Routing key pattern","message-properties":"Message properties",host:"Host","host-required":"Host is required",port:"Port","port-required":"Port is required","port-range":"Port should be in a range from 1 to 65535.","virtual-host":"Virtual host",username:"Username",password:"Password","automatic-recovery":"Automatic recovery","connection-timeout-ms":"Connection timeout (ms)","min-connection-timeout-ms-message":"Only 0 ms minimum value is allowed.","handshake-timeout-ms":"Handshake timeout (ms)","min-handshake-timeout-ms-message":"Only 0 ms minimum value is allowed.","client-properties":"Client properties","queue-url-pattern":"Queue URL pattern","queue-url-pattern-required":"Queue URL pattern is required","delay-seconds":"Delay (seconds)","min-delay-seconds-message":"Only 0 seconds minimum value is allowed.","max-delay-seconds-message":"Only 900 seconds maximum value is allowed.",name:"Name","name-required":"Name is required","queue-type":"Queue type","sqs-queue-standard":"Standard","sqs-queue-fifo":"FIFO","gcp-project-id":"GCP project ID","gcp-project-id-required":"GCP project ID is required","gcp-service-account-key":"GCP service account key file","gcp-service-account-key-required":"GCP service account key file is required","pubsub-topic-name":"Topic name","pubsub-topic-name-required":"Topic name is required","message-attributes":"Message attributes","message-attributes-hint":'Use ${metadataKey} for value from metadata, $[messageKey] for value from message body in name/value fields',"connect-timeout":"Connection timeout (sec)","connect-timeout-required":"Connection timeout is required.","connect-timeout-range":"Connection timeout should be in a range from 1 to 200.","client-id":"Client ID","client-id-hint":'Hint: Optional. Leave empty for auto-generated Client ID. Be careful when specifying the Client ID. Majority of the MQTT brokers will not allow multiple connections with the same Client ID. To connect to such brokers, your mqtt Client ID must be unique. When platform is running in a micro-services mode, the copy of rule node is launched in each micro-service. This will automatically lead to multiple mqtt clients with the same ID and may cause failures of the rule node. To avoid such failures enable "Add Service ID as suffix to Client ID" option below.',"append-client-id-suffix":"Add Service ID as suffix to Client ID","client-id-suffix-hint":'Hint: Optional. Applied when "Client ID" specified explicitly. If selected then Service ID will be added to Client ID as a suffix. Helps to avoid failures when platform is running in a micro-services mode.',"device-id":"Device ID","device-id-required":"Device ID is required.","clean-session":"Clean session","enable-ssl":"Enable SSL",credentials:"Credentials","credentials-type":"Credentials type","credentials-type-required":"Credentials type is required.","credentials-anonymous":"Anonymous","credentials-basic":"Basic","credentials-pem":"PEM","credentials-pem-hint":"At least Server CA certificate file or a pair of Client certificate and Client private key files are required","credentials-sas":"Shared Access Signature","sas-key":"SAS Key","sas-key-required":"SAS Key is required.",hostname:"Hostname","hostname-required":"Hostname is required.","azure-ca-cert":"CA certificate file","username-required":"Username is required.","password-required":"Password is required.","ca-cert":"Server CA certificate file *","private-key":"Client private key file *",cert:"Client certificate file *","no-file":"No file selected.","drop-file":"Drop a file or click to select a file to upload.","private-key-password":"Private key password","use-system-smtp-settings":"Use system SMTP settings","use-metadata-interval-patterns":"Use interval patterns","use-metadata-interval-patterns-hint":"If selected, rule node use start and end interval patterns from message metadata or data assuming that intervals are in the milliseconds.","use-message-alarm-data":"Use message alarm data","overwrite-alarm-details":"Overwrite alarm details","use-alarm-severity-pattern":"Use alarm severity pattern","check-all-keys":"Check that all selected keys are present","check-all-keys-hint":"If selected, checks that all specified keys are present in the message data and metadata.","check-relation-to-specific-entity":"Check relation to specific entity","check-relation-hint":"Checks existence of relation to specific entity or to any entity based on direction and relation type.","delete-relation-to-specific-entity":"Delete relation to specific entity","delete-relation-hint":"Deletes relation from the originator of the incoming message to the specified entity or list of entities based on direction and type.","remove-current-relations":"Remove current relations","remove-current-relations-hint":"Removes current relations from the originator of the incoming message based on direction and type.","change-originator-to-related-entity":"Change originator to related entity","change-originator-to-related-entity-hint":"Used to process submitted message as a message from another entity.","start-interval-pattern":"Start interval pattern","end-interval-pattern":"End interval pattern","start-interval-pattern-required":"Start interval pattern is required","end-interval-pattern-required":"End interval pattern is required","smtp-protocol":"Protocol","smtp-host":"SMTP host","smtp-host-required":"SMTP host is required.","smtp-port":"SMTP port","smtp-port-required":"You must supply a smtp port.","smtp-port-range":"SMTP port should be in a range from 1 to 65535.","timeout-msec":"Timeout ms","min-timeout-msec-message":"Only 0 ms minimum value is allowed.","enter-username":"Enter username","enter-password":"Enter password","enable-tls":"Enable TLS","tls-version":"TLS version","enable-proxy":"Enable proxy","use-system-proxy-properties":"Use system proxy properties","proxy-host":"Proxy host","proxy-host-required":"Proxy host is required.","proxy-port":"Proxy port","proxy-port-required":"Proxy port is required.","proxy-port-range":"Proxy port should be in a range from 1 to 65535.","proxy-user":"Proxy user","proxy-password":"Proxy password","proxy-scheme":"Proxy scheme","numbers-to-template":"Phone Numbers To Template","numbers-to-template-required":"Phone Numbers To Template is required","numbers-to-template-hint":'Comma separated Phone Numbers, use ${metadataKey} for value from metadata, $[messageKey] for value from message body',"sms-message-template":"SMS message Template","sms-message-template-required":"SMS message Template is required","use-system-sms-settings":"Use system SMS provider settings","min-period-0-seconds-message":"Only 0 second minimum period is allowed.","max-pending-messages":"Maximum pending messages","max-pending-messages-required":"Maximum pending messages is required.","max-pending-messages-range":"Maximum pending messages should be in a range from 1 to 100000.","originator-types-filter":"Originator types filter","interval-seconds":"Interval in seconds","interval-seconds-required":"Interval is required.","min-interval-seconds-message":"Only 1 second minimum interval is allowed.","output-timeseries-key-prefix":"Output timeseries key prefix","output-timeseries-key-prefix-required":"Output timeseries key prefix required.","separator-hint":'You should press "enter" to complete field input.',"entity-details":"Select entity details:","entity-details-title":"Title","entity-details-country":"Country","entity-details-state":"State","entity-details-city":"City","entity-details-zip":"Zip","entity-details-address":"Address","entity-details-address2":"Address2","entity-details-additional_info":"Additional Info","entity-details-phone":"Phone","entity-details-email":"Email","add-to-metadata":"Add selected details to message metadata","add-to-metadata-hint":"If selected, adds the selected details keys to the message metadata instead of message data.","entity-details-list-empty":"No entity details selected.","no-entity-details-matching":"No entity details matching were found.","custom-table-name":"Custom table name","custom-table-name-required":"Table Name is required","custom-table-hint":"You should enter the table name without prefix 'cs_tb_'.","message-field":"Message field","message-field-required":"Message field is required.","table-col":"Table column","table-col-required":"Table column is required.","latitude-key-name":"Latitude key name","longitude-key-name":"Longitude key name","latitude-key-name-required":"Latitude key name is required.","longitude-key-name-required":"Longitude key name is required.","fetch-perimeter-info-from-message-metadata":"Fetch perimeter information from message metadata","perimeter-key-name":"Perimeter key name","perimeter-key-name-required":"Perimeter key name is required.","perimeter-circle":"Circle","perimeter-polygon":"Polygon","perimeter-type":"Perimeter type","circle-center-latitude":"Center latitude","circle-center-latitude-required":"Center latitude is required.","circle-center-longitude":"Center longitude","circle-center-longitude-required":"Center longitude is required.","range-unit-meter":"Meter","range-unit-kilometer":"Kilometer","range-unit-foot":"Foot","range-unit-mile":"Mile","range-unit-nautical-mile":"Nautical mile","range-units":"Range units",range:"Range","range-required":"Range is required.","polygon-definition":"Polygon definition","polygon-definition-required":"Polygon definition is required.","polygon-definition-hint":"Please, use the following format for manual definition of polygon: [[lat1,lon1],[lat2,lon2], ... ,[latN,lonN]].","min-inside-duration":"Minimal inside duration","min-inside-duration-value-required":"Minimal inside duration is required","min-inside-duration-time-unit":"Minimal inside duration time unit","min-outside-duration":"Minimal outside duration","min-outside-duration-value-required":"Minimal outside duration is required","min-outside-duration-time-unit":"Minimal outside duration time unit","tell-failure-if-absent":"Tell Failure","tell-failure-if-absent-hint":'If at least one selected key doesn\'t exist the outbound message will report "Failure".',"get-latest-value-with-ts":"Fetch Latest telemetry with Timestamp","get-latest-value-with-ts-hint":'If selected, latest telemetry values will be added to the outbound message metadata with timestamp, e.g: "temp": "{"ts":1574329385897, "value":42}"',"use-redis-queue":"Use redis queue for message persistence","ignore-null-strings":"Ignore null strings","ignore-null-strings-hint":"If selected rule node will ignore entity fields with empty value.","trim-redis-queue":"Trim redis queue","redis-queue-max-size":"Redis queue max size","add-metadata-key-values-as-kafka-headers":"Add Message metadata key-value pairs to Kafka record headers","add-metadata-key-values-as-kafka-headers-hint":"If selected, key-value pairs from message metadata will be added to the outgoing records headers as byte arrays with predefined charset encoding.","charset-encoding":"Charset encoding","charset-encoding-required":"Charset encoding is required.","charset-us-ascii":"US-ASCII","charset-iso-8859-1":"ISO-8859-1","charset-utf-8":"UTF-8","charset-utf-16be":"UTF-16BE","charset-utf-16le":"UTF-16LE","charset-utf-16":"UTF-16","select-queue-hint":"The queue name can be selected from a drop-down list or add a custom name.","persist-alarm-rules":"Persist state of alarm rules","fetch-alarm-rules":"Fetch state of alarm rules","input-value-key":"Input value key","input-value-key-required":"Input value key is required.","output-value-key":"Output value key","output-value-key-required":"Output value key is required.",round:"Decimals","round-range":"Decimals should be in a range from 0 to 15.","use-cache":"Use cache for latest value","tell-failure-if-delta-is-negative":"Tell Failure if delta is negative","add-period-between-msgs":"Add period between messages","period-value-key":"Period value key","period-value-key-required":"Period value key is required.","general-pattern-hint":'Hint: use ${metadataKey} for value from metadata, $[messageKey] for value from message body',"alarm-severity-pattern-hint":'Hint: use ${metadataKey} for value from metadata, $[messageKey] for value from message body. Alarm severity should be system (CRITICAL, MAJOR etc.)',"output-node-name-hint":"The rule node name corresponds to the relation type of the output message, and it is used to forward messages to other rule nodes in the caller rule chain.","skip-latest-persistence":"Skip latest persistence","use-server-ts":"Use server ts","use-server-ts-hint":"Enable this setting to use the timestamp of the message processing instead of the timestamp from the message. Useful for all sorts of sequential processing if you merge messages from multiple sources (devices, assets, etc).","kv-map-pattern-hint":'Hint: use ${metadataKey} for value from metadata, $[messageKey] for value from message body to substitute "Source" and "Target" key names',"shared-scope":"Shared scope","server-scope":"Server scope","client-scope":"Client scope","attribute-type":"Attribute","constant-type":"Constant","time-series-type":"Time series","message-body-type":"Message body","message-metadata-type":"Message metadata","argument-tile":"Arguments","no-arguments-prompt":"No arguments configured","result-title":"Result","functions-field-input":"Functions","no-option-found":"No option found","argument-type-field-input":"Type","argument-type-field-input-required":"Argument type is required.","argument-key-field-input":"Key","argument-key-field-input-required":"Argument key is required.","constant-value-field-input":"Constant value","constant-value-field-input-required":"Constant value is required.","attribute-scope-field-input":"Attribute scope","attribute-scope-field-input-required":"Attribute scope os required.","default-value-field-input":"Default value","type-field-input":"Type","type-field-input-required":"Type is required.","key-field-input":"Key","key-field-input-required":"Key is required.","number-floating-point-field-input":"Number of digits after floating point","number-floating-point-field-input-hint":"Hint: use 0 to convert result to integer","add-to-body-field-input":"Add to message body","add-to-metadata-field-input":"Add to message metadata","custom-expression-field-input":"Mathematical Expression","custom-expression-field-input-required":"Mathematical expression is required","custom-expression-field-input-hint":"Hint: specify a mathematical expression to evaluate. For example, transform Fahrenheit to Celsius using (x - 32) / 1.8)","retained-message":"Retained"},"key-val":{key:"Key",value:"Value","remove-entry":"Remove entry","add-entry":"Add entry","unique-key-value-pair-error":"'{{valText}}' must be different from the current '{{keyText}}'"},"mail-body-type":{"plain-text":"Plain Text",html:"HTML",dynamic:"Dynamic"}}},!0)}(t)}}t("RuleNodeCoreConfigModule",So),So.ɵfac=e.ɵɵngDeclareFactory({minVersion:"12.0.0",version:"12.2.16",ngImport:e,type:So,deps:[{token:R.TranslateService}],target:e.ɵɵFactoryTarget.NgModule}),So.ɵmod=e.ɵɵngDeclareNgModule({minVersion:"12.0.0",version:"12.2.16",ngImport:e,type:So,declarations:[Dt],imports:[B,L],exports:[Ye,bo,so,To,qo,Dt]}),So.ɵinj=e.ɵɵngDeclareInjector({minVersion:"12.0.0",version:"12.2.16",ngImport:e,type:So,imports:[[B,L],Ye,bo,so,To,qo]}),e.ɵɵngDeclareClassMetadata({minVersion:"12.0.0",version:"12.2.16",ngImport:e,type:So,decorators:[{type:i,args:[{declarations:[Dt],imports:[B,L],exports:[Ye,bo,so,To,qo,Dt]}]}],ctorParameters:function(){return[{type:R.TranslateService}]}})}}}));//# sourceMappingURL=rulenode-core-config.js.map
diff --git a/rule-engine/rule-engine-components/src/test/java/org/thingsboard/rule/engine/edge/TbMsgPushToEdgeNodeTest.java b/rule-engine/rule-engine-components/src/test/java/org/thingsboard/rule/engine/edge/TbMsgPushToEdgeNodeTest.java
index b7dbda1780..5950dd1c47 100644
--- a/rule-engine/rule-engine-components/src/test/java/org/thingsboard/rule/engine/edge/TbMsgPushToEdgeNodeTest.java
+++ b/rule-engine/rule-engine-components/src/test/java/org/thingsboard/rule/engine/edge/TbMsgPushToEdgeNodeTest.java
@@ -15,6 +15,7 @@
*/
package org.thingsboard.rule.engine.edge;
+import com.google.common.util.concurrent.SettableFuture;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
@@ -22,21 +23,28 @@ import org.mockito.Mock;
import org.mockito.Mockito;
import org.mockito.junit.MockitoJUnitRunner;
import org.thingsboard.common.util.JacksonUtil;
+import org.thingsboard.common.util.ListeningExecutor;
import org.thingsboard.rule.engine.api.TbContext;
import org.thingsboard.rule.engine.api.TbNodeConfiguration;
import org.thingsboard.rule.engine.api.TbNodeException;
+import org.thingsboard.server.common.data.DataConstants;
import org.thingsboard.server.common.data.id.DeviceId;
+import org.thingsboard.server.common.data.id.EdgeId;
import org.thingsboard.server.common.data.id.TenantId;
+import org.thingsboard.server.common.data.id.UserId;
import org.thingsboard.server.common.data.page.PageData;
import org.thingsboard.server.common.data.page.PageLink;
import org.thingsboard.server.common.msg.TbMsg;
import org.thingsboard.server.common.msg.TbMsgDataType;
import org.thingsboard.server.common.msg.TbMsgMetaData;
import org.thingsboard.server.common.msg.session.SessionMsgType;
+import org.thingsboard.server.dao.edge.EdgeEventService;
import org.thingsboard.server.dao.edge.EdgeService;
+import java.util.List;
import java.util.UUID;
+import static org.mockito.ArgumentMatchers.any;
import static org.mockito.Mockito.verify;
@RunWith(MockitoJUnitRunner.class)
@@ -52,6 +60,10 @@ public class TbMsgPushToEdgeNodeTest {
@Mock
private EdgeService edgeService;
+ @Mock
+ private EdgeEventService edgeEventService;
+ @Mock
+ private ListeningExecutor dbCallbackExecutor;
@Before
public void setUp() throws TbNodeException {
@@ -73,4 +85,25 @@ public class TbMsgPushToEdgeNodeTest {
verify(ctx).ack(msg);
}
+
+ @Test
+ public void testAttributeUpdateMsg_userEntity() {
+ Mockito.when(ctx.getTenantId()).thenReturn(tenantId);
+ Mockito.when(ctx.getEdgeService()).thenReturn(edgeService);
+ Mockito.when(ctx.getEdgeEventService()).thenReturn(edgeEventService);
+ Mockito.when(ctx.getDbCallbackExecutor()).thenReturn(dbCallbackExecutor);
+ Mockito.when(edgeEventService.saveAsync(any())).thenReturn(SettableFuture.create());
+
+ UserId userId = new UserId(UUID.randomUUID());
+ EdgeId edgeId = new EdgeId(UUID.randomUUID());
+ PageData edgePageData = new PageData<>(List.of(edgeId), 1, 1, false);
+ Mockito.when(edgeService.findRelatedEdgeIdsByEntityId(tenantId, userId, new PageLink(TbMsgPushToEdgeNode.DEFAULT_PAGE_SIZE))).thenReturn(edgePageData);
+
+ TbMsg msg = TbMsg.newMsg(DataConstants.ATTRIBUTES_UPDATED, userId, new TbMsgMetaData(),
+ TbMsgDataType.JSON, "{}", null, null);
+
+ node.onMsg(ctx, msg);
+
+ verify(edgeEventService).saveAsync(any());
+ }
}
diff --git a/rule-engine/rule-engine-components/src/test/java/org/thingsboard/rule/engine/telemetry/TbMsgDeleteAttributesTest.java b/rule-engine/rule-engine-components/src/test/java/org/thingsboard/rule/engine/telemetry/TbMsgDeleteAttributesNodeTest.java
similarity index 57%
rename from rule-engine/rule-engine-components/src/test/java/org/thingsboard/rule/engine/telemetry/TbMsgDeleteAttributesTest.java
rename to rule-engine/rule-engine-components/src/test/java/org/thingsboard/rule/engine/telemetry/TbMsgDeleteAttributesNodeTest.java
index 8972a3aa1f..e641e0ded4 100644
--- a/rule-engine/rule-engine-components/src/test/java/org/thingsboard/rule/engine/telemetry/TbMsgDeleteAttributesTest.java
+++ b/rule-engine/rule-engine-components/src/test/java/org/thingsboard/rule/engine/telemetry/TbMsgDeleteAttributesNodeTest.java
@@ -20,15 +20,11 @@ import lombok.extern.slf4j.Slf4j;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
-import org.junit.runner.RunWith;
import org.mockito.ArgumentCaptor;
-import org.mockito.Captor;
-import org.mockito.junit.MockitoJUnitRunner;
import org.thingsboard.rule.engine.api.RuleEngineTelemetryService;
import org.thingsboard.rule.engine.api.TbContext;
import org.thingsboard.rule.engine.api.TbNodeConfiguration;
import org.thingsboard.rule.engine.api.TbNodeException;
-import org.thingsboard.server.common.data.DataConstants;
import org.thingsboard.server.common.data.id.DeviceId;
import org.thingsboard.server.common.msg.TbMsg;
import org.thingsboard.server.common.msg.TbMsgMetaData;
@@ -42,8 +38,10 @@ import java.util.function.Consumer;
import static org.assertj.core.api.Assertions.assertThat;
import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.ArgumentMatchers.anyBoolean;
import static org.mockito.ArgumentMatchers.anyList;
import static org.mockito.ArgumentMatchers.anyString;
+import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.BDDMockito.willAnswer;
import static org.mockito.BDDMockito.willReturn;
import static org.mockito.Mockito.mock;
@@ -51,14 +49,18 @@ import static org.mockito.Mockito.never;
import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
+import static org.thingsboard.server.common.data.DataConstants.NOTIFY_DEVICE_METADATA_KEY;
+import static org.thingsboard.server.common.data.DataConstants.SCOPE;
+import static org.thingsboard.server.common.data.DataConstants.SERVER_SCOPE;
+import static org.thingsboard.server.common.data.DataConstants.SHARED_SCOPE;
@Slf4j
-public class TbMsgDeleteAttributesTest {
+public class TbMsgDeleteAttributesNodeTest {
final ObjectMapper mapper = new ObjectMapper();
DeviceId deviceId;
- TbMsgDeleteAttributes node;
- TbMsgDeleteAttributesConfiguration config;
+ TbMsgDeleteAttributesNode node;
+ TbMsgDeleteAttributesNodeConfiguration config;
TbNodeConfiguration nodeConfiguration;
TbContext ctx;
TbMsgCallback callback;
@@ -70,20 +72,20 @@ public class TbMsgDeleteAttributesTest {
deviceId = new DeviceId(UUID.randomUUID());
callback = mock(TbMsgCallback.class);
ctx = mock(TbContext.class);
- config = new TbMsgDeleteAttributesConfiguration().defaultConfiguration();
+ config = new TbMsgDeleteAttributesNodeConfiguration().defaultConfiguration();
config.setKeys(List.of("${TestAttribute_1}", "$[TestAttribute_2]", "$[TestAttribute_3]", "TestAttribute_4"));
nodeConfiguration = new TbNodeConfiguration(mapper.valueToTree(config));
- node = spy(new TbMsgDeleteAttributes());
+ node = spy(new TbMsgDeleteAttributesNode());
node.init(ctx, nodeConfiguration);
telemetryService = mock(RuleEngineTelemetryService.class);
willReturn(telemetryService).given(ctx).getTelemetryService();
willAnswer(invocation -> {
- TelemetryNodeCallback callBack = invocation.getArgument(4);
+ TelemetryNodeCallback callBack = invocation.getArgument(5);
callBack.onSuccess(null);
return null;
}).given(telemetryService).deleteAndNotify(
- any(), any(), anyString(), anyList(), any());
+ any(), any(), anyString(), anyList(), anyBoolean(), any());
}
@AfterEach
@@ -93,18 +95,51 @@ public class TbMsgDeleteAttributesTest {
@Test
void givenDefaultConfig_whenVerify_thenOK() {
- TbMsgDeleteAttributesConfiguration defaultConfig = new TbMsgDeleteAttributesConfiguration().defaultConfiguration();
- assertThat(defaultConfig.getScope()).isEqualTo(DataConstants.SERVER_SCOPE);
+ TbMsgDeleteAttributesNodeConfiguration defaultConfig = new TbMsgDeleteAttributesNodeConfiguration().defaultConfiguration();
+ assertThat(defaultConfig.getScope()).isEqualTo(SERVER_SCOPE);
assertThat(defaultConfig.getKeys()).isEqualTo(Collections.emptyList());
}
@Test
- void givenMsg_whenOnMsg_thenVerifyOutput() throws Exception {
+ void givenMsg_whenOnMsg_thenVerifyOutput_NoSendAttributesDeletedNotification_NoNotifyDevice() throws Exception {
+ onMsg_thenVerifyOutput(false, false, false);
+ }
+
+ @Test
+ void givenMsg_whenOnMsg_thenVerifyOutput_SendAttributesDeletedNotification_NoNotifyDevice() throws Exception {
+ config.setSendAttributesDeletedNotification(true);
+ nodeConfiguration = new TbNodeConfiguration(mapper.valueToTree(config));
+ node.init(ctx, nodeConfiguration);
+ onMsg_thenVerifyOutput(true, false, false);
+ }
+
+ @Test
+ void givenMsg_whenOnMsg_thenVerifyOutput_SendAttributesDeletedNotification_NotifyDevice() throws Exception {
+ config.setSendAttributesDeletedNotification(true);
+ config.setNotifyDevice(true);
+ config.setScope(SHARED_SCOPE);
+ nodeConfiguration = new TbNodeConfiguration(mapper.valueToTree(config));
+ node.init(ctx, nodeConfiguration);
+ onMsg_thenVerifyOutput(true, true, false);
+ }
+
+ @Test
+ void givenMsg_whenOnMsg_thenVerifyOutput_NoSendAttributesDeletedNotification_NotifyDeviceMetadata() throws Exception {
+ nodeConfiguration = new TbNodeConfiguration(mapper.valueToTree(config));
+ node.init(ctx, nodeConfiguration);
+ onMsg_thenVerifyOutput(false, false, true);
+ }
+
+ void onMsg_thenVerifyOutput(boolean sendAttributesDeletedNotification, boolean notifyDevice, boolean notifyDeviceMetadata) throws Exception {
final Map mdMap = Map.of(
"TestAttribute_1", "temperature",
"city", "NY"
);
- final TbMsgMetaData metaData = new TbMsgMetaData(mdMap);
+ TbMsgMetaData metaData = new TbMsgMetaData(mdMap);
+ if (notifyDeviceMetadata) {
+ metaData.putValue(NOTIFY_DEVICE_METADATA_KEY, "true");
+ metaData.putValue(SCOPE, SHARED_SCOPE);
+ }
final String data = "{\"TestAttribute_2\": \"humidity\", \"TestAttribute_3\": \"voltage\"}";
TbMsg msg = TbMsg.newMsg("POST_ATTRIBUTES_REQUEST", deviceId, metaData, data, callback);
@@ -114,12 +149,13 @@ public class TbMsgDeleteAttributesTest {
ArgumentCaptor> failureCaptor = ArgumentCaptor.forClass(Consumer.class);
ArgumentCaptor newMsgCaptor = ArgumentCaptor.forClass(TbMsg.class);
- verify(ctx, times(1)).enqueue(any(), successCaptor.capture(), failureCaptor.capture());
- successCaptor.getValue().run();
+ if (sendAttributesDeletedNotification) {
+ verify(ctx, times(1)).enqueue(any(), successCaptor.capture(), failureCaptor.capture());
+ successCaptor.getValue().run();
+ verify(ctx, times(1)).attributesDeletedActionMsg(any(), any(), anyString(), anyList());
+ }
verify(ctx, times(1)).tellSuccess(newMsgCaptor.capture());
-
- verify(ctx, times(1)).attributesDeletedActionMsg(any(), any(), anyString(), anyList());
verify(ctx, never()).tellFailure(any(), any());
- verify(telemetryService, times(1)).deleteAndNotify(any(), any(), anyString(), anyList(), any());
+ verify(telemetryService, times(1)).deleteAndNotify(any(), any(), anyString(), anyList(), eq(notifyDevice || notifyDeviceMetadata), any());
}
}
diff --git a/rule-engine/rule-engine-components/src/test/java/org/thingsboard/rule/engine/transform/TbJsonPathNodeTest.java b/rule-engine/rule-engine-components/src/test/java/org/thingsboard/rule/engine/transform/TbJsonPathNodeTest.java
index ae9a8f9fdb..82d65dd544 100644
--- a/rule-engine/rule-engine-components/src/test/java/org/thingsboard/rule/engine/transform/TbJsonPathNodeTest.java
+++ b/rule-engine/rule-engine-components/src/test/java/org/thingsboard/rule/engine/transform/TbJsonPathNodeTest.java
@@ -85,7 +85,7 @@ public class TbJsonPathNodeTest {
}
@Test
- void givenPrimitiveMsg_whenOnMsg_thenVerifyOutput() throws Exception {
+ void givenJsonMsg_whenOnMsg_thenVerifyOutputJsonPrimitiveNode() throws Exception {
String data = "{\"Attribute_1\":22.5,\"Attribute_2\":100}";
VerifyOutputMsg(data, 1, 100);
@@ -93,6 +93,17 @@ public class TbJsonPathNodeTest {
VerifyOutputMsg(data, 2, "StringValue");
}
+ @Test
+ void givenJsonMsg_whenOnMsg_thenVerifyJavaPrimitiveOutput() throws Exception {
+ config.setJsonPath("$.attributes.length()");
+ nodeConfiguration = new TbNodeConfiguration(mapper.valueToTree(config));
+ node.init(ctx, nodeConfiguration);
+
+ String data = "{\"attributes\":[{\"attribute_1\":10},{\"attribute_2\":20},{\"attribute_3\":30},{\"attribute_4\":40}]}";
+ VerifyOutputMsg(data, 1, 4);
+
+ }
+
@Test
void givenJsonArray_whenOnMsg_thenVerifyOutput() throws Exception {
String data = "{\"Attribute_1\":22.5,\"Attribute_2\":[{\"Attribute_3\":22.5,\"Attribute_4\":10.3}, {\"Attribute_5\":22.5,\"Attribute_6\":10.3}]}";
diff --git a/tools/pom.xml b/tools/pom.xml
index 91cf576ae1..d414a7a777 100644
--- a/tools/pom.xml
+++ b/tools/pom.xml
@@ -20,7 +20,7 @@
4.0.0org.thingsboard
- 3.4.2-SNAPSHOT
+ 3.4.3-SNAPSHOTthingsboardtools
diff --git a/transport/coap/pom.xml b/transport/coap/pom.xml
index dd151dc920..2640d1d80d 100644
--- a/transport/coap/pom.xml
+++ b/transport/coap/pom.xml
@@ -20,7 +20,7 @@
4.0.0org.thingsboard
- 3.4.2-SNAPSHOT
+ 3.4.3-SNAPSHOTtransportorg.thingsboard.transport
diff --git a/transport/http/pom.xml b/transport/http/pom.xml
index 15a9305c76..7820c585ec 100644
--- a/transport/http/pom.xml
+++ b/transport/http/pom.xml
@@ -20,7 +20,7 @@
4.0.0org.thingsboard
- 3.4.2-SNAPSHOT
+ 3.4.3-SNAPSHOTtransportorg.thingsboard.transport
diff --git a/transport/lwm2m/pom.xml b/transport/lwm2m/pom.xml
index b2d7809f4d..b36c8372ef 100644
--- a/transport/lwm2m/pom.xml
+++ b/transport/lwm2m/pom.xml
@@ -20,7 +20,7 @@
4.0.0org.thingsboard
- 3.4.2-SNAPSHOT
+ 3.4.3-SNAPSHOTtransportorg.thingsboard.transport
diff --git a/transport/mqtt/pom.xml b/transport/mqtt/pom.xml
index 4115434335..91ce12908b 100644
--- a/transport/mqtt/pom.xml
+++ b/transport/mqtt/pom.xml
@@ -20,7 +20,7 @@
4.0.0org.thingsboard
- 3.4.2-SNAPSHOT
+ 3.4.3-SNAPSHOTtransportorg.thingsboard.transport
diff --git a/transport/pom.xml b/transport/pom.xml
index d46c850c41..26af07f6a2 100644
--- a/transport/pom.xml
+++ b/transport/pom.xml
@@ -20,7 +20,7 @@
4.0.0org.thingsboard
- 3.4.2-SNAPSHOT
+ 3.4.3-SNAPSHOTthingsboardtransport
diff --git a/transport/snmp/pom.xml b/transport/snmp/pom.xml
index 57cfd4d8f0..0701f7aa57 100644
--- a/transport/snmp/pom.xml
+++ b/transport/snmp/pom.xml
@@ -21,7 +21,7 @@
org.thingsboard
- 3.4.2-SNAPSHOT
+ 3.4.3-SNAPSHOTtransport
diff --git a/ui-ngx/package.json b/ui-ngx/package.json
index 6cacbda8bb..6b8112adad 100644
--- a/ui-ngx/package.json
+++ b/ui-ngx/package.json
@@ -1,6 +1,6 @@
{
"name": "thingsboard",
- "version": "3.4.2",
+ "version": "3.4.3",
"scripts": {
"ng": "ng",
"start": "node --max_old_space_size=8048 ./node_modules/@angular/cli/bin/ng serve --configuration development --host 0.0.0.0 --open",
diff --git a/ui-ngx/pom.xml b/ui-ngx/pom.xml
index dade6f8c28..f78d168144 100644
--- a/ui-ngx/pom.xml
+++ b/ui-ngx/pom.xml
@@ -20,7 +20,7 @@
4.0.0org.thingsboard
- 3.4.2-SNAPSHOT
+ 3.4.3-SNAPSHOTthingsboardorg.thingsboard
diff --git a/ui-ngx/src/app/core/api/widget-subscription.ts b/ui-ngx/src/app/core/api/widget-subscription.ts
index d40dc95db7..332b8db14f 100644
--- a/ui-ngx/src/app/core/api/widget-subscription.ts
+++ b/ui-ngx/src/app/core/api/widget-subscription.ts
@@ -204,6 +204,7 @@ export class WidgetSubscription implements IWidgetSubscription {
this.timeWindow = {};
this.useDashboardTimewindow = options.useDashboardTimewindow;
this.useTimewindow = true;
+ this.onTimewindowChangeFunction = options.onTimewindowChangeFunction || ((timewindow) => timewindow);
if (this.useDashboardTimewindow) {
this.timeWindowConfig = deepClone(options.dashboardTimewindow);
} else {
diff --git a/ui-ngx/src/app/core/auth/auth.models.ts b/ui-ngx/src/app/core/auth/auth.models.ts
index 7e97cb7a13..96d2d834df 100644
--- a/ui-ngx/src/app/core/auth/auth.models.ts
+++ b/ui-ngx/src/app/core/auth/auth.models.ts
@@ -21,7 +21,7 @@ export interface SysParamsState {
allowedDashboardIds: string[];
edgesSupportEnabled: boolean;
hasRepository: boolean;
- mvelEnabled: boolean;
+ tbelEnabled: boolean;
}
export interface AuthPayload extends SysParamsState {
diff --git a/ui-ngx/src/app/core/auth/auth.reducer.ts b/ui-ngx/src/app/core/auth/auth.reducer.ts
index 7408f29145..4f93896a4c 100644
--- a/ui-ngx/src/app/core/auth/auth.reducer.ts
+++ b/ui-ngx/src/app/core/auth/auth.reducer.ts
@@ -25,7 +25,7 @@ const emptyUserAuthState: AuthPayload = {
allowedDashboardIds: [],
edgesSupportEnabled: false,
hasRepository: false,
- mvelEnabled: false
+ tbelEnabled: false
};
export const initialState: AuthState = {
diff --git a/ui-ngx/src/app/core/auth/auth.selectors.ts b/ui-ngx/src/app/core/auth/auth.selectors.ts
index f703d72f57..d736c3447f 100644
--- a/ui-ngx/src/app/core/auth/auth.selectors.ts
+++ b/ui-ngx/src/app/core/auth/auth.selectors.ts
@@ -60,9 +60,9 @@ export const selectHasRepository = createSelector(
(state: AuthState) => state.hasRepository
);
-export const selectMvelEnabled = createSelector(
+export const selectTbelEnabled = createSelector(
selectAuthState,
- (state: AuthState) => state.mvelEnabled
+ (state: AuthState) => state.tbelEnabled
);
export function getCurrentAuthState(store: Store): AuthState {
diff --git a/ui-ngx/src/app/core/auth/auth.service.ts b/ui-ngx/src/app/core/auth/auth.service.ts
index f5d2823508..a62623260f 100644
--- a/ui-ngx/src/app/core/auth/auth.service.ts
+++ b/ui-ngx/src/app/core/auth/auth.service.ts
@@ -482,9 +482,9 @@ export class AuthService {
}
}
- private loadMvelEnabled(authUser: AuthUser): Observable {
+ private loadTbelEnabled(authUser: AuthUser): Observable {
if (authUser.authority === Authority.TENANT_ADMIN) {
- return this.http.get('/api/ruleChain/mvelEnabled', defaultHttpOptions());
+ return this.http.get('/api/ruleChain/tbelEnabled', defaultHttpOptions());
} else {
return of(false);
}
@@ -495,7 +495,7 @@ export class AuthService {
this.fetchAllowedDashboardIds(authPayload),
this.loadIsEdgesSupportEnabled(),
this.loadHasRepository(authPayload.authUser),
- this.loadMvelEnabled(authPayload.authUser),
+ this.loadTbelEnabled(authPayload.authUser),
this.timeService.loadMaxDatapointsLimit()];
return forkJoin(sources)
.pipe(map((data) => {
@@ -503,8 +503,8 @@ export class AuthService {
const allowedDashboardIds: string[] = data[1] as string[];
const edgesSupportEnabled: boolean = data[2] as boolean;
const hasRepository: boolean = data[3] as boolean;
- const mvelEnabled: boolean = data[4] as boolean;
- return {userTokenAccessEnabled, allowedDashboardIds, edgesSupportEnabled, hasRepository, mvelEnabled};
+ const tbelEnabled: boolean = data[4] as boolean;
+ return {userTokenAccessEnabled, allowedDashboardIds, edgesSupportEnabled, hasRepository, tbelEnabled};
}, catchError((err) => {
return of({});
})));
diff --git a/ui-ngx/src/app/core/services/dashboard-utils.service.ts b/ui-ngx/src/app/core/services/dashboard-utils.service.ts
index 90238ebaba..ccb7de73b1 100644
--- a/ui-ngx/src/app/core/services/dashboard-utils.service.ts
+++ b/ui-ngx/src/app/core/services/dashboard-utils.service.ts
@@ -395,7 +395,8 @@ export class DashboardUtilsService {
sizeY: originalSize ? originalSize.sizeY : widget.sizeY,
mobileOrder: widget.config.mobileOrder,
mobileHeight: widget.config.mobileHeight,
- mobileHide: widget.config.mobileHide
+ mobileHide: widget.config.mobileHide,
+ desktopHide: widget.config.desktopHide
};
if (isUndefined(originalColumns)) {
originalColumns = 24;
diff --git a/ui-ngx/src/app/modules/home/components/dashboard-page/add-widget-dialog.component.ts b/ui-ngx/src/app/modules/home/components/dashboard-page/add-widget-dialog.component.ts
index e8fdde15c2..e147866df9 100644
--- a/ui-ngx/src/app/modules/home/components/dashboard-page/add-widget-dialog.component.ts
+++ b/ui-ngx/src/app/modules/home/components/dashboard-page/add-widget-dialog.component.ts
@@ -140,6 +140,7 @@ export class AddWidgetDialogComponent extends DialogComponent
diff --git a/ui-ngx/src/app/shared/models/dashboard.models.ts b/ui-ngx/src/app/shared/models/dashboard.models.ts
index 1869420c56..bf71997e35 100644
--- a/ui-ngx/src/app/shared/models/dashboard.models.ts
+++ b/ui-ngx/src/app/shared/models/dashboard.models.ts
@@ -36,6 +36,7 @@ export interface DashboardInfo extends BaseData, ExportableEntity
```javascript
var details = {};
if (metadata.prevAlarmDetails) {
+ details = JSON.parse(metadata.prevAlarmDetails);
// remove prevAlarmDetails from metadata
delete metadata.prevAlarmDetails;
- details = JSON.parse(metadata.prevAlarmDetails);
+ //now metadata is the same as it comes IN this rule node
}
{:copy-code}
```
diff --git a/ui-ngx/src/assets/help/en_US/rulenode/create_alarm_node_script_fn.md b/ui-ngx/src/assets/help/en_US/rulenode/create_alarm_node_script_fn.md
index c6c2fe2481..36bdd21d16 100644
--- a/ui-ngx/src/assets/help/en_US/rulenode/create_alarm_node_script_fn.md
+++ b/ui-ngx/src/assets/help/en_US/rulenode/create_alarm_node_script_fn.md
@@ -22,10 +22,11 @@ is a raw String field, and it needs to be converted into object using this const
```javascript
var details = {};
-if (metadata.prevAlarmDetails) {
- // remove prevAlarmDetails from metadata
- delete metadata.prevAlarmDetails;
+if (metadata.prevAlarmDetails != null) {
details = JSON.parse(metadata.prevAlarmDetails);
+ // remove prevAlarmDetails from metadata
+ metadata.remove('prevAlarmDetails');
+ //now metadata is the same as it comes IN this rule node
}
{:copy-code}
```
@@ -44,11 +45,11 @@ Also put temperature attribute from inbound Message payload into Al
```javascript
var details = {temperature: msg.temperature, count: 1};
-if (metadata.prevAlarmDetails) {
+if (metadata.prevAlarmDetails != null) {
var prevDetails = JSON.parse(metadata.prevAlarmDetails);
// remove prevAlarmDetails from metadata
- delete metadata.prevAlarmDetails;
- if (prevDetails.count) {
+ metadata.remove('prevAlarmDetails');
+ if (prevDetails.count != null) {
details.count = prevDetails.count + 1;
}
}
diff --git a/ui-ngx/src/assets/help/en_US/rulenode/tbel/clear_alarm_node_script_fn.md b/ui-ngx/src/assets/help/en_US/rulenode/tbel/clear_alarm_node_script_fn.md
new file mode 100644
index 0000000000..311086e785
--- /dev/null
+++ b/ui-ngx/src/assets/help/en_US/rulenode/tbel/clear_alarm_node_script_fn.md
@@ -0,0 +1,69 @@
+#### Clear alarm details builder function
+
+
+
+
+*function Details(msg, metadata, msgType): any*
+
+[TBEL{:target="_blank"}](${siteBaseUrl}/docs/user-guide/tbel/) function generating **Alarm Details** object to update existing one. Used for storing additional parameters inside Alarm.
+For example you can save attribute name/value pair from Original Message payload or Metadata.
+
+**Parameters:**
+
+{% include rulenode/tbel/common_node_script_args %}
+
+**Returns:**
+
+Should return the object presenting **Alarm Details**.
+
+Current Alarm Details can be accessed via `metadata.prevAlarmDetails`.
+**Note** that `metadata.prevAlarmDetails` is a raw String field, and it needs to be converted into object using this construction:
+
+```javascript
+var details = {};
+if (metadata.prevAlarmDetails != null) {
+ details = JSON.parse(metadata.prevAlarmDetails);
+ // remove prevAlarmDetails from metadata
+ metadata.remove('prevAlarmDetails');
+ //now metadata is the same as it comes IN this rule node
+}
+{:copy-code}
+```
+
+
+
+##### Examples
+
+
+
+Take count property from previous Alarm and increment it.
+Also put temperature attribute from inbound Message payload into Alarm details:
+
+
+
+```javascript
+var details = {temperature: msg.temperature, count: 1};
+
+if (metadata.prevAlarmDetails != null) {
+ var prevDetails = JSON.parse(metadata.prevAlarmDetails);
+ // remove prevAlarmDetails from metadata
+ metadata.remove('prevAlarmDetails');
+ if (prevDetails.count != null) {
+ details.count = prevDetails.count + 1;
+ }
+}
+
+return details;
+{:copy-code}
+```
+
+
+
+More details about Alarms can be found in [this tutorial{:target="_blank"}](${siteBaseUrl}/docs/user-guide/alarms/).
+
+You can see the real life example, where this node is used, in the next tutorial:
+
+- [Create and Clear Alarms{:target="_blank"}](${siteBaseUrl}/docs/user-guide/rule-engine-2-0/tutorials/create-clear-alarms/)
+
+
+
diff --git a/ui-ngx/src/assets/help/en_US/rulenode/tbel/common_node_script_args.md b/ui-ngx/src/assets/help/en_US/rulenode/tbel/common_node_script_args.md
new file mode 100644
index 0000000000..296e5b735c
--- /dev/null
+++ b/ui-ngx/src/assets/help/en_US/rulenode/tbel/common_node_script_args.md
@@ -0,0 +1,11 @@
+
+
msg:{[key: string]: any} - is a Message payload key/value object.
+
+
metadata:{[key: string]: string} - is a Message metadata key/value map, where both keys and values are strings.
+
+
msgType:string - is a string containing Message type. See MessageType enum for common used values.
+
+
+
+Enable 'debug mode' for your rule node to see the messages that arrive in near real-time.
+See Debugging for more information.
\ No newline at end of file
diff --git a/ui-ngx/src/assets/help/en_US/rulenode/tbel/create_alarm_node_script_fn.md b/ui-ngx/src/assets/help/en_US/rulenode/tbel/create_alarm_node_script_fn.md
new file mode 100644
index 0000000000..afc9051590
--- /dev/null
+++ b/ui-ngx/src/assets/help/en_US/rulenode/tbel/create_alarm_node_script_fn.md
@@ -0,0 +1,69 @@
+#### Create alarm details builder function
+
+
+
+
+*function Details(msg, metadata, msgType): any*
+
+[TBEL{:target="_blank"}](${siteBaseUrl}/docs/user-guide/tbel/) function generating **Alarm Details** object. Used for storing additional parameters inside Alarm.
+For example you can save attribute name/value pair from Original Message payload or Metadata.
+
+**Parameters:**
+
+{% include rulenode/tbel/common_node_script_args %}
+
+**Returns:**
+
+Should return the object presenting **Alarm Details**.
+
+**Optional:** previous Alarm Details can be accessed via `metadata.prevAlarmDetails`.
+If previous Alarm does not exist, this field will not be present in Metadata. **Note** that `metadata.prevAlarmDetails`
+is a raw String field, and it needs to be converted into object using this construction:
+
+```javascript
+var details = {};
+if (metadata.prevAlarmDetails) {
+ // remove prevAlarmDetails from metadata
+ delete metadata.prevAlarmDetails;
+ details = JSON.parse(metadata.prevAlarmDetails);
+}
+{:copy-code}
+```
+
+
+
+##### Examples
+
+
+
+Take count property from previous Alarm and increment it.
+Also put temperature attribute from inbound Message payload into Alarm details:
+
+
+
+```javascript
+var details = {temperature: msg.temperature, count: 1};
+
+if (metadata.prevAlarmDetails) {
+ var prevDetails = JSON.parse(metadata.prevAlarmDetails);
+ // remove prevAlarmDetails from metadata
+ delete metadata.prevAlarmDetails;
+ if (prevDetails.count) {
+ details.count = prevDetails.count + 1;
+ }
+}
+
+return details;
+{:copy-code}
+```
+
+
+
+More details about Alarms can be found in [this tutorial{:target="_blank"}](${siteBaseUrl}/docs/user-guide/alarms/).
+
+You can see the real life example, where this node is used, in the next tutorial:
+
+- [Create and Clear Alarms{:target="_blank"}](${siteBaseUrl}/docs/user-guide/rule-engine-2-0/tutorials/create-clear-alarms/)
+
+
+
diff --git a/ui-ngx/src/assets/help/en_US/rulenode/tbel/filter_node_script_fn.md b/ui-ngx/src/assets/help/en_US/rulenode/tbel/filter_node_script_fn.md
new file mode 100644
index 0000000000..4435acaeff
--- /dev/null
+++ b/ui-ngx/src/assets/help/en_US/rulenode/tbel/filter_node_script_fn.md
@@ -0,0 +1,84 @@
+#### Filter message function
+
+
+
+
+*function Filter(msg, metadata, msgType): boolean*
+
+[TBEL{:target="_blank"}](${siteBaseUrl}/docs/user-guide/tbel/) function defines a boolean expression based on the incoming Message and Metadata.
+
+**Parameters:**
+
+{% include rulenode/tbel/common_node_script_args %}
+
+**Returns:**
+
+Must return a `boolean` value. If `true` - routes Message to subsequent rule nodes that are related via **True** link,
+otherwise sends Message to rule nodes related via **False** link.
+Uses 'Failure' link in case of any failures to evaluate the expression.
+
+
+
+##### Examples
+
+* Forward all messages with `temperature` value greater than `20` to the **True** link and all other messages to the **False** link.
+ Assumes that incoming messages always contain the 'temperature' field:
+
+```javascript
+return msg.temperature > 20;
+{:copy-code}
+```
+
+
+Example of the rule chain configuration:
+
+
+
+* Same as above, but checks that the message has 'temperature' field to **avoid failures** on unexpected messages:
+
+```javascript
+return msg.temperature != null && msg.temperature > 20;
+{:copy-code}
+```
+
+* Forward all messages with type `ATTRIBUTES_UPDATED` to the **True** chain and all other messages to the **False** chain:
+
+```javascript
+if (msgType == 'ATTRIBUTES_UPDATED') {
+ return true;
+} else {
+ return false;
+}
+{:copy-code}
+```
+
+
+
Send message to the True chain if the following conditions are met. Message type is POST_TELEMETRY_REQUEST and
+(device type is vehicle and humidity value is greater than 50 or
+device type is controller and temperature value is greater than 20 and humidity value is greater than 60).
+Otherwise send message to the False chain:
+
+
+
+```javascript
+if (msgType == 'POST_TELEMETRY_REQUEST') {
+ if (metadata.deviceType == 'vehicle') {
+ return msg.humidity > 50;
+ } else if (metadata.deviceType == 'controller') {
+ return msg.temperature > 20 && msg.humidity > 60;
+ }
+}
+return false;
+{:copy-code}
+```
+
+
+
+You can see real life example, how to use this node in those tutorials:
+
+- [Create and Clear Alarms{:target="_blank"}](${siteBaseUrl}/docs/user-guide/rule-engine-2-0/tutorials/create-clear-alarms/#node-a-filter-script)
+- [Reply to RPC Calls{:target="_blank"}](${siteBaseUrl}/docs/user-guide/rule-engine-2-0/tutorials/rpc-reply-tutorial#add-filter-script-node)
+
+
+
+
diff --git a/ui-ngx/src/assets/help/en_US/rulenode/tbel/generator_node_script_fn.md b/ui-ngx/src/assets/help/en_US/rulenode/tbel/generator_node_script_fn.md
new file mode 100644
index 0000000000..7618ac4090
--- /dev/null
+++ b/ui-ngx/src/assets/help/en_US/rulenode/tbel/generator_node_script_fn.md
@@ -0,0 +1,110 @@
+#### Message generator function
+
+
+
+
+*function Generate(prevMsg, prevMetadata, prevMsgType): {msg: object, metadata: object, msgType: string}*
+
+[TBEL{:target="_blank"}](${siteBaseUrl}/docs/user-guide/tbel/) function generating new Message using previous Message payload, Metadata and Message type as input arguments.
+
+**Parameters:**
+
+
+
prevMsg:{[key: string]: any} - is a previously generated Message payload key/value object.
+
+
prevMetadata:{[key: string]: string} - is a previously generated Message metadata key/value object.
+
+
prevMsgType:string - is a previously generated string Message type. See MessageType enum for common used values.
+
+
+
+**Returns:**
+
+Should return the object with the following structure:
+
+```javascript
+{
+ msg: {[key: string]: any},
+ metadata: {[key: string]: string},
+ msgType: string
+}
+```
+
+All fields in resulting object are mandatory.
+
+
+
+##### Examples
+
+* Generate message of type `POST_TELEMETRY_REQUEST` with random `temperature` value from `18` to `32`:
+
+```javascript
+var temperature = 18 + Math.random() * (32 - 18);
+// Round to at most 2 decimal places (optional)
+temperature = Math.round( temperature * 100 ) / 100;
+var msg = { temperature: temperature };
+return { msg: msg, metadata: {}, msgType: "POST_TELEMETRY_REQUEST" };
+{:copy-code}
+```
+
+
+
+
+Generate message of type POST_TELEMETRY_REQUEST with temp value 42,
+humidity value 77
+and metadata with field data having value 40:
+
+Generate message of type POST_TELEMETRY_REQUEST with temperature value
+increasing and decreasing linearly in the range from 18 to 32:
+
+
+
+```javascript
+var lower = 18;
+var upper = 32;
+var isDecrement = 'false';
+var temperature = lower;
+
+// Get previous values
+
+if (prevMetadata != null && prevMetadata.isDecrement != null) {
+ isDecrement = prevMetadata.isDecrement;
+}
+if (prevMsg != null && prevMsg.temperature != null) {
+ temperature = prevMsg.temperature;
+}
+
+if (isDecrement == 'true') {
+ temperature--;
+ if (temperature <= lower) {
+ isDecrement = 'false';
+ temperature = lower;
+ }
+} else {
+ temperature++;
+ if (temperature >= upper) {
+ isDecrement = 'true';
+ temperature = upper;
+ }
+}
+
+var msg = { temperature: temperature };
+var metadata = { isDecrement: isDecrement };
+
+return { msg: msg, metadata: metadata, msgType: "POST_TELEMETRY_REQUEST" };
+{:copy-code}
+```
+
+
+
diff --git a/ui-ngx/src/assets/help/en_US/rulenode/tbel/log_node_script_fn.md b/ui-ngx/src/assets/help/en_US/rulenode/tbel/log_node_script_fn.md
new file mode 100644
index 0000000000..bab38ad46f
--- /dev/null
+++ b/ui-ngx/src/assets/help/en_US/rulenode/tbel/log_node_script_fn.md
@@ -0,0 +1,37 @@
+#### Message to string function
+
+
+
+
+*function toString(msg, metadata, msgType): string*
+
+[TBEL{:target="_blank"}](${siteBaseUrl}/docs/user-guide/tbel/) function transforming incoming Message to String for further logging to the server log file.
+
+**Parameters:**
+
+{% include rulenode/tbel/common_node_script_args %}
+
+**Returns:**
+
+Should return `string` value used for logging to the server log file.
+
+
+
+##### Examples
+
+* Create string message containing incoming message and incoming metadata values:
+
+```javascript
+return 'Incoming message:\n' + JSON.stringify(msg) +
+ '\nIncoming metadata:\n' + JSON.stringify(metadata);
+{:copy-code}
+```
+
+
+
+You can see real life example, how to use this node in this tutorial:
+
+- [Reply to RPC Calls{:target="_blank"}](${siteBaseUrl}/docs/user-guide/rule-engine-2-0/tutorials/rpc-reply-tutorial#log-unknown-request)
+
+
+
diff --git a/ui-ngx/src/assets/help/en_US/rulenode/tbel/switch_node_script_fn.md b/ui-ngx/src/assets/help/en_US/rulenode/tbel/switch_node_script_fn.md
new file mode 100644
index 0000000000..7fd3b7447b
--- /dev/null
+++ b/ui-ngx/src/assets/help/en_US/rulenode/tbel/switch_node_script_fn.md
@@ -0,0 +1,101 @@
+#### Switch message function
+
+
+
+
+*function Switch(msg, metadata, msgType): string[]*
+
+[TBEL{:target="_blank"}](${siteBaseUrl}/docs/user-guide/tbel/) function computing **an array of Link names** to forward the incoming Message.
+
+**Parameters:**
+
+{% include rulenode/tbel/common_node_script_args %}
+
+**Returns:**
+
+Should return an array of `string` values presenting **link names** that the Rule Engine should use to further route the incoming Message.
+If the result is an empty array - message will not be routed to any Node and will be immediately
+acknowledged.
+
+
+
+##### Examples
+
+
+
+Forward all messages with temperature value greater than 30 to the 'High temperature' chain,
+with temperature value lower than 20 to the 'Low temperature' chain and all other messages
+to the 'Other' chain:
+
+ For messages with type POST_TELEMETRY_REQUEST:
+
+
+ if temperature value lower than 18 forward to the 'Low temperature telemetry' chain,
+
+
+ otherwise to the 'Normal temperature telemetry' chain.
+
+
+ For messages with type POST_ATTRIBUTES_REQUEST:
+
+
+ if currentState value is IDLE forward to the 'Idle State' and 'Update State Attribute' chains,
+
+
+ if currentState value is RUNNING forward to the 'Running State' and 'Update State Attribute' chains,
+
+
+ otherwise to the 'Unknown State' chain.
+
+
+ For all other message types - discard the message (do not route to any Node).
+
+
+
+```javascript
+if (msgType == 'POST_TELEMETRY_REQUEST') {
+ if (msg.temperature < 18) {
+ return ['Low Temperature Telemetry'];
+ } else {
+ return ['Normal Temperature Telemetry'];
+ }
+} else if (msgType == 'POST_ATTRIBUTES_REQUEST') {
+ if (msg.currentState == 'IDLE') {
+ return ['Idle State', 'Update State Attribute'];
+ } else if (msg.currentState == 'RUNNING') {
+ return ['Running State', 'Update State Attribute'];
+ } else {
+ return ['Unknown State'];
+ }
+}
+return [];
+{:copy-code}
+```
+
+
+
+You can see real life example, how to use this node in this tutorial:
+
+- [Data function based on telemetry from 2 devices{:target="_blank"}](${siteBaseUrl}/docs/user-guide/rule-engine-2-0/tutorials/function-based-on-telemetry-from-two-devices#delta-temperature-rule-chain)
+
+
+
diff --git a/ui-ngx/src/assets/help/en_US/rulenode/tbel/transformation_node_script_fn.md b/ui-ngx/src/assets/help/en_US/rulenode/tbel/transformation_node_script_fn.md
new file mode 100644
index 0000000000..44ada19967
--- /dev/null
+++ b/ui-ngx/src/assets/help/en_US/rulenode/tbel/transformation_node_script_fn.md
@@ -0,0 +1,89 @@
+#### Transform message function
+
+
+
+
+*function Transform(msg, metadata, msgType): {msg: object, metadata: object, msgType: string}*
+
+The [TBEL{:target="_blank"}](${siteBaseUrl}/docs/user-guide/tbel/) function to transform input Message payload, Metadata and/or Message type to the output message.
+
+**Parameters:**
+
+{% include rulenode/tbel/common_node_script_args %}
+
+**Returns:**
+
+Should return the object with the following structure:
+
+```javascript
+{
+ msg?: {[key: string]: any},
+ metadata?: {[key: string]: string},
+ msgType?: string
+}
+```
+
+All fields in resulting object are optional and will be taken from original message if not specified.
+
+
+
+##### Examples
+
+* Add sum of two fields ('a' and 'b') as a new field ('sum') of existing message:
+
+```javascript
+if(msg.a != null && msg.b != null){
+ msg.sum = msg.a + msg.b;
+}
+return {msg: msg};
+```
+
+* Transform value of the 'temperature' field from °F to °C:
+
+```javascript
+msg.temperature = toFixed((msg.temperature - 32) * 5 / 9, 1);
+return {msg: msg};
+```
+
+* Replace the incoming message with the new message that contains only one field - count of properties in the original message:
+
+```javascript
+var newMsg = {
+ count: msg.size()
+};
+return {msg: newMsg};
+```
+
+
+
Change message type to CUSTOM_UPDATE, add additional attribute version into payload with value v1.1, change sensorType attribute value in Metadata to roomTemp:
+
+
+```javascript
+var newType = "CUSTOM_UPDATE";
+msg.version = "v1.1";
+metadata.sensorType = "roomTemp"
+return {msg: msg, metadata: metadata, msgType: newType};
+{:copy-code}
+```
+
+* Replace the incoming message with **two** new messages that contain only one field - sum or difference of properties in the original message:
+
+```javascript
+var sum = msg.a + msg.b;
+var diff = msg.a - msg.b;
+
+return [
+ {msg: {sum: sum}, metadata: metadata, msgType: msgType},
+ {msg: {difference: diff}, metadata: metadata, msgType: msgType}
+ ];
+```
+
+
+
+You can see real life example, how to use this node in those tutorials:
+
+- [Transform incoming telemetry{:target="_blank"}](${siteBaseUrl}/docs/user-guide/rule-engine-2-0/tutorials/transform-incoming-telemetry/)
+- [Reply to RPC Calls{:target="_blank"}](${siteBaseUrl}/docs/user-guide/rule-engine-2-0/tutorials/rpc-reply-tutorial#add-transform-script-node)
+
+
+
diff --git a/ui-ngx/src/assets/locale/locale.constant-es_CA.json b/ui-ngx/src/assets/locale/locale.constant-ca_ES.json
similarity index 100%
rename from ui-ngx/src/assets/locale/locale.constant-es_CA.json
rename to ui-ngx/src/assets/locale/locale.constant-ca_ES.json
diff --git a/ui-ngx/src/assets/locale/locale.constant-da_DK.json b/ui-ngx/src/assets/locale/locale.constant-da_DK.json
new file mode 100644
index 0000000000..6200b26ce7
--- /dev/null
+++ b/ui-ngx/src/assets/locale/locale.constant-da_DK.json
@@ -0,0 +1,4002 @@
+{
+ "access": {
+ "unauthorized": "Uautoriseret",
+ "unauthorized-access": "Uautoriseret adgang",
+ "unauthorized-access-text": "Du skal logge ind for at få adgang til denne ressource!",
+ "access-forbidden": "Adgang forbudt",
+ "access-forbidden-text": "Du har ikke adgangsrettigheder til denne placering! Prøv at logge ind med en anden bruger, hvis du stadig ønsker at få adgang til denne placering.",
+ "refresh-token-expired": "Sessionen er udløbet",
+ "refresh-token-failed": "Kunne ikke opdatere session",
+ "permission-denied": "Tilladelse nægtet",
+ "permission-denied-text": "Du har ikke tilladelse til at udføre denne handling!"
+ },
+ "action": {
+ "activate": "Aktivér",
+ "suspend": "Udsæt",
+ "save": "Gem",
+ "saveAs": "Gem som",
+ "cancel": "Annuller",
+ "ok": "Okay",
+ "delete": "Slet",
+ "add": "Tilføj",
+ "yes": "Ja",
+ "no": "Nej",
+ "update": "Opdatering",
+ "remove": "Fjern",
+ "search": "Søg",
+ "clear-search": "Ryd søgning",
+ "assign": "Tildel",
+ "unassign": "Fjern tildeling",
+ "share": "Del",
+ "make-private": "Gør privat",
+ "make-public": "Gør offentlig",
+ "apply": "Anvend",
+ "apply-changes": "Anvend ændringer",
+ "edit-mode": "Redigeringstilstand",
+ "enter-edit-mode": "Gå til redigeringstilstand",
+ "decline-changes": "Afvis ændringer",
+ "open": "Åbn",
+ "close": "Tæt",
+ "back": "Tilbage",
+ "run": "Kør",
+ "sign-in": "Log på!",
+ "edit": "Rediger",
+ "view": "Vis",
+ "create": "Opret",
+ "drag": "Træk",
+ "refresh": "Genopfrisk",
+ "undo": "Fortryd",
+ "copy": "Kopiér",
+ "paste": "Sæt ind",
+ "copy-reference": "Kopiér reference",
+ "paste-reference": "Indsæt reference",
+ "import": "Importér",
+ "export": "Eksportér",
+ "share-via": "",
+ "move": "Flyt",
+ "select": "Vælg",
+ "continue": "Fortsæt",
+ "discard-changes": "Kassér ændringer",
+ "download": "Download",
+ "next-with-label": "",
+ "read-more": "Læs mere",
+ "hide": "Skjul"
+ },
+ "aggregation": {
+ "aggregation": "Opsamling",
+ "function": "Dataopsamlingsfunktion",
+ "limit": "Maks.-værdier",
+ "group-interval": "Grupperingsinterval",
+ "min": "Min",
+ "max": "Maks",
+ "avg": "Gennemsnit",
+ "sum": "I alt",
+ "count": "Sammentælling",
+ "none": "Ingen"
+ },
+ "admin": {
+ "general": "Generelt",
+ "general-settings": "Generelle indstillinger",
+ "home-settings": "Hjem-indstillinger",
+ "outgoing-mail": "Mailserver",
+ "outgoing-mail-settings": "Udgående mailserverindstillinger",
+ "system-settings": "Systemindstillinger",
+ "test-mail-sent": "Test-e-mail blev sendt!",
+ "base-url": "Basis-URL",
+ "base-url-required": "Basis-URL er påkrævet.",
+ "prohibit-different-url": "Det er ikke tilladt at bruge værtsnavn fra overskrifterne for klientanmodninger",
+ "prohibit-different-url-hint": "Denne indstilling skal aktiveres for produktionsmiljøer. Kan forårsage sikkerhedsproblemer ved deaktivering",
+ "mail-from": "Afsender",
+ "mail-from-required": "Afsender er påkrævet.",
+ "smtp-protocol": "SMTP-protokol",
+ "smtp-host": "SMTP-vært",
+ "smtp-host-required": "SMTP-vært er påkrævet.",
+ "smtp-port": "SMTP-port",
+ "smtp-port-required": "Du skal angive en smtp-port.",
+ "smtp-port-invalid": "Det ligner ikke en gyldig smtp-port.",
+ "timeout-msec": "Timeout (msek.)",
+ "timeout-required": "Timeout er påkrævet.",
+ "timeout-invalid": "Det ser ikke ud til at være en gyldig timeout.",
+ "enable-tls": "Aktivér TLS",
+ "tls-version": "TLS-version",
+ "enable-proxy": "Aktivér proxy",
+ "proxy-host": "Proxy-vært",
+ "proxy-host-required": "Proxy-vært er påkrævet.",
+ "proxy-port": "Proxy-port",
+ "proxy-port-required": "Proxy-port er påkrævet.",
+ "proxy-port-range": "Proxy-porten skal ligge i området fra 1 til 65535.",
+ "proxy-user": "Proxy-bruger",
+ "proxy-password": "Proxy-adgangskode",
+ "send-test-mail": "Send testmail",
+ "use-system-mail-settings": "Brug systemets mailserverindstillinger",
+ "mail-templates": "Mailskabeloner",
+ "mail-template-settings": "Indstillinger for mailskabeloner",
+ "use-system-mail-template-settings": "Brug systemmailskabeloner",
+ "mail-template": {
+ "mail-template": "Mailskabelon",
+ "test": "Test-e-mailmeddelelse",
+ "activation": "Meddelelse om aktivering af konto",
+ "account-activated": "Meddelelse om aktiveret konto",
+ "account-lockout": "Meddelelse om kontospærring",
+ "reset-password": "Meddelelse om nulstilling af adgangskode",
+ "password-was-reset": "Meddelelse om nulstillet adgangskode",
+ "user-activated": "Brugeraktiveret-meddelelse",
+ "user-registered": "Brugerregistreret-meddelelse",
+ "api-usage-state-enabled": "Api-brugstilstand aktiveret",
+ "api-usage-state-warning": "Advarsel om Api-brugstilstand",
+ "api-usage-state-disabled": "Api-brugstilstand deaktiveret"
+ },
+ "mail-subject": "Mailens emne",
+ "mail-body": "Mailens brødtekst",
+ "sms-provider": "SMS-udbyder",
+ "sms-provider-settings": "Indstillinger for SMS-udbyder",
+ "use-system-sms-settings": "Anvend systemets indstillinger for SMS-udbyder",
+ "sms-provider-type": "SMS-udbydertype",
+ "sms-provider-type-required": "SMS-udbydertype er påkrævet.",
+ "sms-provider-type-aws-sns": "Amazon SNS",
+ "sms-provider-type-twilio": "Twilio",
+ "aws-access-key-id": "AWS-adgangsnøgle-id",
+ "aws-access-key-id-required": "AWS-adgangsnøgle-id er påkrævet",
+ "aws-secret-access-key": "AWS hemmelig adgangsnøgle",
+ "aws-secret-access-key-required": "AWS hemmelig adgangsnøgle er påkrævet",
+ "aws-region": "AWS-region",
+ "aws-region-required": "AWS-region er påkrævet",
+ "number-from": "Telefonnummer fra",
+ "number-from-required": "Telefonnummer fra er påkrævet.",
+ "number-to": "Telefonnummer til",
+ "number-to-required": "Telefonnummer til er påkrævet.",
+ "phone-number-hint": "Telefonnummer i E.164-format, f.eks. +19995550123",
+ "phone-number-hint-twilio": "Telefonnummer i E.164-format/Telefonnummers SID/Meddelelsesservice SID, f.eks. +19995550123/PNXXX/MGXXX",
+ "phone-number-pattern": "Ugyldigt telefonnummer. Skal være i E.164-format, f.eks. +19995550123.",
+ "phone-number-pattern-twilio": "Ugyldigt telefonnummer. Skal være i E.164-format/Telefonnummers SID/Meddelelsesservice SID, f.eks. +19995550123/PNXXX/MGXXX.",
+ "sms-message": "SMS-besked",
+ "sms-message-required": "SMS-besked er påkrævet.",
+ "sms-message-max-length": "SMS-beskeden må ikke være længere end 1600 tegn",
+ "twilio-account-sid": "Twilio-konto SID",
+ "twilio-account-sid-required": "Twilio-konto SID er påkrævet",
+ "twilio-account-token": "Twilio-konto-token",
+ "twilio-account-token-required": "Twilio-konto-token er påkrævet",
+ "send-test-sms": "Send test-SMS",
+ "test-sms-sent": "Test-SMS'en blev sendt!",
+ "security-settings": "Sikkerhedsindstillinger",
+ "password-policy": "Adgangskodepolitik",
+ "minimum-password-length": "Min. adgangskodelængde",
+ "minimum-password-length-required": "Min. adgangskodelængde er påkrævet",
+ "minimum-password-length-range": "Min. adgangskodelængde skal være mellem 5 og 50",
+ "minimum-uppercase-letters": "Min. antal store bogstaver",
+ "minimum-uppercase-letters-range": "Min. antal store bogstaver kan ikke være negativt",
+ "minimum-lowercase-letters": "Min. antal små bogstaver",
+ "minimum-lowercase-letters-range": "Min. antal små bogstaver kan ikke være negativt",
+ "minimum-digits": "Min. antal cifre",
+ "minimum-digits-range": "Minimum antal cifre kan ikke være negativt",
+ "minimum-special-characters": "Minimum antal specialtegn",
+ "minimum-special-characters-range": "Minimum antal specialtegn kan ikke være negativt",
+ "password-expiration-period-days": "Adgangskodens udløbsperiode i dage",
+ "password-expiration-period-days-range": "Adgangskodens udløbsperiode i dage kan ikke være negativ",
+ "password-reuse-frequency-days": "Hyppighed af genbrug af adgangskode i dage",
+ "password-reuse-frequency-days-range": "Hyppigheden af genbrug af adgangskode i dage kan ikke være negativ",
+ "general-policy": "Generelle retningslinjer",
+ "max-failed-login-attempts": "Maks. antal mislykkede loginforsøg, før kontoen spærres",
+ "minimum-max-failed-login-attempts-range": "Maks. antal mislykkede loginforsøg kan ikke være negativt",
+ "user-lockout-notification-email": "Hvis brugerkontoen spærres, sendes en meddelelse til e-mail",
+ "domain-name": "Domænenavn",
+ "domain-name-unique": "Domænenavn og protokol skal være entydige.",
+ "error-verification-url": "Et domænenavn må ikke indeholde symbolerne '/' og ':'. Eksempel: thingsboard.io",
+ "oauth2": {
+ "access-token-uri": "Adgangstoken URI",
+ "access-token-uri-required": "Adgangstoken URI er påkrævet.",
+ "activate-user": "Aktivér bruger",
+ "add-domain": "Tilføj domæne",
+ "delete-domain": "Slet domæne",
+ "add-provider": "Tilføj udbyder",
+ "delete-provider": "Slet udbyder",
+ "allow-user-creation": "Tillad brugeroprettelse",
+ "always-fullscreen": "Altid fuld skærm",
+ "authorization-uri": "Godkendelses-URI",
+ "authorization-uri-required": "Godkendelses-URI er påkrævet.",
+ "client-authentication-method": "Klientgodkendelsesmetode",
+ "client-id": "Klient-id",
+ "client-id-required": "Klient-id er påkrævet.",
+ "client-secret": "Kunde hemmelig",
+ "client-secret-required": "Kunde hemmelig er påkrævet.",
+ "custom-setting": "Brugerdefinerede indstillinger",
+ "customer-name-pattern": "Kundenavnsmønster",
+ "parent-customer-name-pattern": "Overordnet kundenavnsmønster",
+ "user-groups-name-pattern": "Mønster for brugergruppenavn",
+ "default-dashboard-name": "Standard dashboardnavn",
+ "delete-domain-text": "Vær forsigtig. Efter bekræftelsen vil et domæne og alle udbyderdata være utilgængelige.",
+ "delete-domain-title": "",
+ "delete-registration-text": "Vær forsigtig. Efter bekræftelsen vil udbyderdata være utilgængelige.",
+ "delete-registration-title": "",
+ "email-attribute-key": "E-mailattributnøgle",
+ "email-attribute-key-required": "E-mailattributnøgle er påkrævet.",
+ "first-name-attribute-key": "Fornavn attributnøgle",
+ "general": "Generelt",
+ "jwk-set-uri": "JSON webnøgle-URI",
+ "last-name-attribute-key": "Efternavn attributnøgle",
+ "login-button-icon": "Logon-knapikon",
+ "login-button-label": "Udbyder etiket",
+ "login-button-label-placeholder": "Log ind med $(Udbyder etiket)",
+ "login-button-label-required": "Etiket er påkrævet.",
+ "login-provider": "Log ind udbyder",
+ "mapper": "Kortlægger",
+ "new-domain": "Nyt domæne",
+ "oauth2": "OAuth2",
+ "redirect-uri-template": "Omdiriger URI-skabelon",
+ "copy-redirect-uri": "Kopiér omdirigering af URI",
+ "registration-id": "Registrerings-id",
+ "registration-id-required": "Registrerings-id er påkrævet.",
+ "registration-id-unique": "Registrerings-id skal være entydigt for systemet.",
+ "scope": "Omfang",
+ "scope-required": "Omfang er påkrævet.",
+ "tenant-name-pattern": "Mønster for lejernavn",
+ "tenant-name-pattern-required": "Mønster for lejernavn er påkrævet.",
+ "tenant-name-strategy": "Strategi for lejernavn",
+ "type": "Kortlæggertype",
+ "uri-pattern-error": "Ugyldigt URI-format.",
+ "url": "URL",
+ "url-pattern": "Ugyldigt URL-format.",
+ "url-required": "URL er påkrævet.",
+ "user-info-uri": "Brugerinfo URI",
+ "user-info-uri-required": "Brugerinfo URI er påkrævet.",
+ "user-name-attribute-name": "Attributnøgle for brugernavn",
+ "user-name-attribute-name-required": "Attributnøgle for brugernavn er påkrævet",
+ "protocol": "Protokol",
+ "domain-schema-http": "HTTP",
+ "domain-schema-https": "HTTPS",
+ "domain-schema-mixed": "HTTP+HTTPS",
+ "enable": "Aktivér OAuth2-indstillinger"
+ }
+ },
+ "alarm": {
+ "alarm": "Alarm",
+ "alarms": "Alarmer",
+ "select-alarm": "Vælg alarm",
+ "no-alarms-matching": "",
+ "alarm-required": "Alarm er påkrævet",
+ "alarm-status": "Alarmstatus",
+ "alarm-status-list": "Alarmstatusliste",
+ "any-status": "Enhver status",
+ "search-status": {
+ "ANY": "Enhver",
+ "ACTIVE": "Aktiv",
+ "CLEARED": "Ryddet",
+ "ACK": "Kvitteret",
+ "UNACK": "Ikke kvitteret"
+ },
+ "display-status": {
+ "ACTIVE_UNACK": "Aktiv Ikke-kvitteret",
+ "ACTIVE_ACK": "Aktiv Kvitteret",
+ "CLEARED_UNACK": "Ryddet Ikke-kvitteret",
+ "CLEARED_ACK": "Ryddet Kvitteret"
+ },
+ "no-alarms-prompt": "Ingen alarmer fundet",
+ "created-time": "Oprettelsestidspunkt",
+ "type": "Type",
+ "severity": "Alvorsgrad",
+ "originator": "Ophavsmand",
+ "originator-type": "Ophavsmandtype",
+ "details": "Oplysninger",
+ "status": "Status",
+ "alarm-details": "Alarmoplysninger",
+ "start-time": "Starttid",
+ "end-time": "Sluttid",
+ "ack-time": "Tidspunkt for Kvitteret",
+ "clear-time": "Tidspunkt for Ryddet",
+ "alarm-severity-list": "Liste over alvorsgrad for alamer",
+ "any-severity": "Enhver alvorsgrad",
+ "severity-critical": "Kritisk",
+ "severity-major": "Stor",
+ "severity-minor": "Mindre",
+ "severity-warning": "Advarsel",
+ "severity-indeterminate": "Ubestemt",
+ "acknowledge": "Kvittér",
+ "clear": "Klar",
+ "search": "Søg efter alarmer",
+ "selected-alarms": "",
+ "no-data": "Ingen data at vise",
+ "polling-interval": "Alarmer undersøgelsesinterval (sek.)",
+ "polling-interval-required": "Alarmer undersøgelsesinterval er påkrævet.",
+ "min-polling-interval-message": "Mindst 1 sek. undersøgelsesinterval er tilladt.",
+ "aknowledge-alarms-title": "",
+ "aknowledge-alarms-text": "",
+ "aknowledge-alarm-title": "Kvittér for alarm",
+ "aknowledge-alarm-text": "Er du sikker på, du ønsker at kvittere for alarm?",
+ "clear-alarms-title": "",
+ "clear-alarms-text": "",
+ "clear-alarm-title": "Ryd alarm",
+ "clear-alarm-text": "Er du sikker på, at du vil slette Alarm?",
+ "alarm-status-filter": "Filter for alarmstatus",
+ "alarm-filter": "Alarmfilter",
+ "max-count-load": "Maks. antal alarmer, der skal indlæses (0 – ubegrænset)",
+ "max-count-load-required": "Maks. antal alarmer, der skal indlæses, er påkrævet.",
+ "max-count-load-error-min": "Minimumværdien er 0.",
+ "fetch-size": "Hent størrelse",
+ "fetch-size-required": "Hent størrelse er påkrævet.",
+ "fetch-size-error-min": "Minimumværdien er 10.",
+ "alarm-type-list": "Liste over alarmtyper",
+ "any-type": "Enhver type",
+ "search-propagated-alarms": "Søg efter overførte alarmer"
+ },
+ "alias": {
+ "add": "Tilføj alias",
+ "edit": "Rediger alias",
+ "name": "Aliasnavn",
+ "name-required": "Aliasnavn er påkrævet",
+ "duplicate-alias": "Alias med samme navn findes allerede.",
+ "filter-type-single-entity": "Enkelt entitet",
+ "filter-type-entity-group": "Gruppeentiteter",
+ "filter-type-entity-list": "Entitetsliste",
+ "filter-type-entity-name": "Entitetsnavn",
+ "filter-type-entity-type": "Entitetstype",
+ "filter-type-entity-group-list": "Entitetsgruppeliste",
+ "filter-type-entity-group-name": "Entitetsgruppenavn",
+ "filter-type-entities-by-group-name": "Entiteter efter gruppenavn",
+ "filter-type-state-entity": "Entitet fra dashboardtilstand",
+ "filter-type-state-entity-description": "Entitet taget fra dashboardtilstandsparametre",
+ "filter-type-state-entity-owner": "Ejer af entitet fra dashboardtilstand",
+ "filter-type-state-entity-owner-description": "Ejer af entitet taget fra dashboardtilstandsparametre",
+ "filter-type-asset-type": "Aktivtype",
+ "filter-type-asset-type-description": "",
+ "filter-type-asset-type-and-name-description": "",
+ "filter-type-device-type": "Enhedstype",
+ "filter-type-device-type-description": "",
+ "filter-type-device-type-and-name-description": "",
+ "filter-type-entity-view-type": "Entitetsvisningstype",
+ "filter-type-entity-view-type-description": "",
+ "filter-type-entity-view-type-and-name-description": "",
+ "filter-type-relations-query": "Relationsforespørgsel",
+ "filter-type-relations-query-description": "",
+ "filter-type-asset-search-query": "Aktivsøgningsforespørgsel",
+ "filter-type-asset-search-query-description": "",
+ "filter-type-device-search-query": "Enhedssøgningsforespørgsel",
+ "filter-type-device-search-query-description": "",
+ "filter-type-entity-view-search-query": "Entitetsvisning for søgningsforespørgsel",
+ "filter-type-entity-view-search-query-description": "",
+ "filter-type-apiUsageState": "Api-brugstilstand",
+ "entity-filter": "Entitetsfilter",
+ "resolve-multiple": "Løs som flere entiteter",
+ "filter-type": "Filtertype",
+ "filter-type-required": "Filtertype er påkrævet.",
+ "entity-filter-no-entity-matched": "Der blev ikke fundet nogen entiteter, der matcher det angivne filter.",
+ "no-entity-filter-specified": "Intet entitetsfilter angivet",
+ "root-state-entity": "Brug dashboardtilstandsentitet som rod",
+ "group-state-entity": "Brug dashboardtilstandsentitet som entitetsgruppe",
+ "group-state-entity-owner": "Brug dashboardtilstandsentitet som entitetsgruppeejer",
+ "last-level-relation": "Hent kun sidste niveaurelation",
+ "root-entity": "Rodentitet",
+ "state-entity-parameter-name": "Parameternavn for tilstandsentitet",
+ "default-state-entity": "Standard tilstandsentitet",
+ "default-state-entity-group": "Standard tilstandsentitetsgruppe",
+ "default-entity-parameter-name": "Som standard",
+ "max-relation-level": "Maks. niveaurelation",
+ "unlimited-level": "Ubegrænset niveau",
+ "state-entity": "Dashboardtilstandsentitet",
+ "entities-of-group-state-entity": "Entiteter fra dashboardtilstandsentitetsgruppe",
+ "all-entities": "Alle entiteter",
+ "any-relation": "enhver"
+ },
+ "asset": {
+ "asset": "Aktiv",
+ "assets": "Aktiver",
+ "management": "Styring af aktiver",
+ "view-assets": "Vis aktiver",
+ "add": "Tilføj aktiv",
+ "assign-to-customer": "Tildel til kunde",
+ "assign-asset-to-customer": "Tildel aktiv(er) til kunde",
+ "assign-asset-to-customer-text": "Vælg de aktiver, der skal tildeles til kunden",
+ "no-assets-text": "Ingen aktiver fundet",
+ "assign-to-customer-text": "Vælg den kunde, der skal tildeles aktivet/aktiverne",
+ "public": "Offentlig",
+ "assignedToCustomer": "Tildelt til kunde",
+ "make-public": "Gør aktiv offentligt",
+ "make-private": "Gør aktiv privat",
+ "unassign-from-customer": "Fjern tildeling fra kunde",
+ "delete": "Slet aktiv",
+ "asset-public": "Aktiv er offentligt",
+ "asset-type": "Aktivtype",
+ "asset-type-required": "Aktivtype er påkrævet.",
+ "select-asset-type": "Vælg aktivtype",
+ "enter-asset-type": "Indtast aktivtype",
+ "any-asset": "Ethvert aktiv",
+ "no-asset-types-matching": "",
+ "asset-type-list-empty": "Ingen aktivtyper valgt.",
+ "asset-types": "Aktivtyper",
+ "name": "Navn",
+ "name-required": "Navn er påkrævet.",
+ "description": "Beskrivelse",
+ "type": "Type",
+ "type-required": "Type er påkrævet.",
+ "details": "Oplysninger",
+ "events": "Begivenheder",
+ "add-asset-text": "Tilføj nyt aktiv",
+ "asset-details": "Oplysninger om aktiv",
+ "assign-assets": "Tildel aktiver",
+ "assign-assets-text": "",
+ "delete-assets": "Slet aktiver",
+ "unassign-assets": "Fjern tildeling af aktiver",
+ "unassign-assets-action-title": "",
+ "assign-new-asset": "Tildel nyt aktiv",
+ "delete-asset-title": "",
+ "delete-asset-text": "Vær forsigtig. Efter bekræftelsen vil aktivet og alle relaterede data være uoprettelige.",
+ "delete-assets-title": "",
+ "delete-assets-action-title": "",
+ "delete-assets-text": "Vær forsigtig. Efter bekræftelsen vil alle valgte aktiver blive fjernet, og alle relaterede data vil være uoprettelige.",
+ "make-public-asset-title": "",
+ "make-public-asset-text": "Efter bekræftelsen vil aktivet og alle dets data blive gjort offentlige og tilgængelige for andre.",
+ "make-private-asset-title": "",
+ "make-private-asset-text": "Efter bekræftelsen vil aktivet og alle dets data blive gjort private og vil ikke være tilgængelige for andre.",
+ "unassign-asset-title": "",
+ "unassign-asset-text": "Efter bekræftelsen fjernes tildelingen af aktivet og vil ikke være tilgængeligt for kunden.",
+ "unassign-asset": "Fjern tildeling af aktiv",
+ "unassign-assets-title": "",
+ "unassign-assets-text": "Efter bekræftelsen vil alle valgte aktiver få fjernet tildelingen og ikke være tilgængelige for kunden.",
+ "copyId": "Kopiér aktiv-id",
+ "idCopiedMessage": "Aktiv-id er blevet kopieret til udklipsholder",
+ "select-asset": "Vælg aktiv",
+ "no-assets-matching": "",
+ "asset-required": "Aktiv er påkrævet",
+ "name-starts-with": "Aktivnavn starter med",
+ "selected-assets": "",
+ "search": "Søg efter aktiver",
+ "select-group-to-add": "Vælg målgruppe for at tilføje valgte aktiver",
+ "select-group-to-move": "Vælg målgruppe for at flytte valgte aktiver",
+ "remove-assets-from-group": "",
+ "group": "Aktivgruppe",
+ "list-of-groups": "",
+ "group-name-starts-with": "",
+ "import": "Importér aktiver",
+ "asset-file": "Aktivfil",
+ "label": "Mærkning"
+ },
+ "attribute": {
+ "attributes": "Attributter",
+ "latest-telemetry": "Seneste telemetri",
+ "attributes-scope": "Omfang af entitetsattributter",
+ "scope-latest-telemetry": "Seneste telemetri",
+ "scope-client": "Klientattributter",
+ "scope-server": "Serverattributter",
+ "scope-shared": "Delte attributter",
+ "add": "Tilføj attribut",
+ "add-attribute-prompt": "Tilføj venligst attribut",
+ "key": "Nøgle",
+ "last-update-time": "Seneste opdateringstid",
+ "key-required": "Attributnøgle er påkrævet.",
+ "value": "Værdi",
+ "value-required": "Attributværdi er påkrævet.",
+ "delete-attributes-title": "",
+ "delete-attributes-text": "Vær forsigtig. Efter bekræftelsen vil alle valgte attributter blive fjernet.",
+ "delete-attributes": "Slet attributter",
+ "enter-attribute-value": "Indtast attributværdi",
+ "show-on-widget": "Vis på widget",
+ "widget-mode": "Widget-tilstand",
+ "next-widget": "Næste widget",
+ "prev-widget": "Forrige widget",
+ "add-to-dashboard": "Føj til dashboard",
+ "add-widget-to-dashboard": "Føj widget til dashboard",
+ "selected-attributes": "",
+ "selected-telemetry": "",
+ "no-attributes-text": "Ingen attributter fundet",
+ "no-telemetry-text": "Ingen telemetri fundet"
+ },
+ "api-usage": {
+ "api-usage": "Api-brug",
+ "data-points": "Datapunkter",
+ "data-points-storage-days": "Lagringsdage for datapunkter",
+ "email": "E-mail",
+ "email-messages": "E-mailbeskeder",
+ "email-messages-daily-activity": "Daglig aktivitet for e-mailbeskeder",
+ "email-messages-hourly-activity": "Timeaktivitet for e-mailbeskeder",
+ "email-messages-monthly-activity": "Månedlig aktivitet for e-mailbeskeder",
+ "exceptions": "Undtagelser",
+ "executions": "Udførelser",
+ "javascript": "JavaScript",
+ "javascript-executions": "JavaScript-udførelser",
+ "javascript-functions": "JavaScript-funktioner",
+ "javascript-functions-daily-activity": "JavaScript-funktioners daglige aktivitet",
+ "javascript-functions-hourly-activity": "JavaScript-funktioners timeaktivitet",
+ "javascript-functions-monthly-activity": "JavaScript-funktioners månedlige aktivitet",
+ "latest-error": "Seneste fejl",
+ "messages": "Beskeder",
+ "permanent-failures": "${entityName} Permanente fejl",
+ "permanent-timeouts": "${entityName} Permanente timeouts",
+ "processing-failures": "${entityName} Behandling af fejl",
+ "processing-failures-and-timeouts": "Behandling af fejl og timeouts",
+ "processing-timeouts": "${entityName} Behandling af timeouts",
+ "queue-stats": "Køstatistikker",
+ "rule-chain": "Regelkæde",
+ "rule-engine": "Regelprogram",
+ "rule-engine-daily-activity": "Regelmotors daglige aktivitet",
+ "rule-engine-executions": "Regelmotorudførelser",
+ "rule-engine-hourly-activity": "Regelmotors timeaktivitet",
+ "rule-engine-monthly-activity": "Regelmotors månedlige aktivitet",
+ "rule-engine-statistics": "Statistik for regelmotor",
+ "rule-node": "Regelknude",
+ "sms": "SMS",
+ "sms-messages": "SMS-beskeder",
+ "sms-messages-daily-activity": "Daglig aktivitet for SMS-beskeder",
+ "sms-messages-hourly-activity": "Timeaktivitet for SMS-beskeder",
+ "sms-messages-monthly-activity": "Månedlig aktivitet for SMS-beskeder",
+ "successful": "${entityName} Vellykket",
+ "telemetry": "Telemetri",
+ "telemetry-persistence": "Telemetri-vedholdenhed",
+ "telemetry-persistence-daily-activity": "Daglig aktivitet for telemetri-vedholdenhed",
+ "telemetry-persistence-hourly-activity": "Timeaktivitet for telemetri-vedholdenhed",
+ "telemetry-persistence-monthly-activity": "Månedlig aktivitet for telemetri-vedholdenhed",
+ "transport": "Transport",
+ "transport-daily-activity": "Daglig aktivitet for transport",
+ "transport-data-points": "Transportdatapunkter",
+ "transport-hourly-activity": "Timeaktivitet for transport",
+ "transport-messages": "Transportmeddelelser",
+ "transport-monthly-activity": "Månedlig aktivitet for transport",
+ "view-details": "Vis oplysninger",
+ "view-statistics": "Vis statistik"
+ },
+ "audit-log": {
+ "audit": "Audit",
+ "audit-logs": "Auditlogs",
+ "timestamp": "Tidsstempel",
+ "entity-type": "Entitetstype",
+ "entity-name": "Entitetsnavn",
+ "user": "Bruger",
+ "type": "Type",
+ "status": "Status",
+ "details": "Oplysninger",
+ "type-added": "Tilføjet",
+ "type-deleted": "Slettet",
+ "type-updated": "Opdateret",
+ "type-attributes-updated": "Attributter opdateret",
+ "type-attributes-deleted": "Attributter slettet",
+ "type-rpc-call": "RPC-opkald",
+ "type-credentials-updated": "Brugeroplysninger opdateret",
+ "type-assigned-to-customer": "Tildelt til kunde",
+ "type-unassigned-from-customer": "Tildeling fjernet fra kunde",
+ "type-activated": "Aktiveret",
+ "type-suspended": "Indstillet",
+ "type-credentials-read": "Brugeroplysninger læst",
+ "type-attributes-read": "Attributter læst",
+ "type-added-to-entity-group": "Tilføjet til gruppe",
+ "type-removed-from-entity-group": "Fjernet fra gruppe",
+ "type-relation-add-or-update": "Relation opdateret",
+ "type-relation-delete": "Relation slettet",
+ "type-relations-delete": "Alle relationer slettet",
+ "type-alarm-ack": "Kvitteret",
+ "type-alarm-clear": "Ryddet",
+ "type-rest-api-rule-engine-call": "Regelmotor REST API-opkald",
+ "type-made-public": "Gjort offentligt",
+ "type-made-private": "Gjort privat",
+ "type-login": "Log på",
+ "type-logout": "Log af",
+ "type-lockout": "Spærring",
+ "status-success": "Succes",
+ "status-failure": "Fejl",
+ "audit-log-details": "Oplysninger om auditlog",
+ "no-audit-logs-prompt": "Ingen logs fundet",
+ "action-data": "Handlingsdata",
+ "failure-details": "Fejloplysninger",
+ "search": "Søg efter auditlogfiler",
+ "clear-search": "Ryd søgning",
+ "type-assigned-from-tenant": "Tildelt fra lejer",
+ "type-assigned-to-tenant": "Tildelt til lejer",
+ "type-provision-success": "Enhed klargjort",
+ "type-provision-failure": "Enhed klargjort mislykkedes",
+ "type-timeseries-updated": "Telemetri opdateret",
+ "type-timeseries-deleted": "Telemetri slettet",
+ "type-owner-changed": "Ejer ændret"
+ },
+ "confirm-on-exit": {
+ "message": "Du har ikke-gemte ændringer. Er du sikker på, at du vil forlade denne side?",
+ "html-message": "Du har ikke-gemte ændringer. Er du sikker på, at du vil forlade denne side?",
+ "title": "Ugemte ændringer"
+ },
+ "contact": {
+ "country": "Land",
+ "city": "By",
+ "state": "Region",
+ "postal-code": "Postnummer",
+ "postal-code-invalid": "Ugyldigt postnummerformat.",
+ "address": "Adresse",
+ "address2": "Adresse 2",
+ "phone": "Telefon",
+ "email": "E-mail",
+ "no-address": "Ingen adresse"
+ },
+ "common": {
+ "username": "Brugernavn",
+ "password": "Adgangskode",
+ "enter-username": "Indtast brugernavn",
+ "enter-password": "Indtast adgangskode",
+ "enter-search": "Indtast søgning",
+ "created-time": "Oprettelsestidspunkt",
+ "loading": "Indlæser..."
+ },
+ "converter": {
+ "converter": "Dataomformer",
+ "converters": "Dataomformere",
+ "select-converter": "Vælg dataomformer",
+ "no-converters-matching": "",
+ "converter-required": "Dataomformer er påkrævet",
+ "delete": "Slet omformer",
+ "management": "Styring af dataomformere",
+ "add-converter-text": "Tilføj ny dataomformer",
+ "no-converters-text": "Ingen dataomformere fundet",
+ "selected-converters": "",
+ "delete-converter-title": "",
+ "delete-converter-text": "Vær forsigtig. Efter bekræftelsen vil dataomformeren og alle relaterede data være uoprettelige.",
+ "delete-converters-title": "",
+ "delete-converters-action-title": "",
+ "delete-converters-text": "Vær forsigtig. Efter bekræftelsen vil alle valgte dataomformere blive fjernet, og alle relaterede data vil være uoprettelige.",
+ "events": "Begivenheder",
+ "add": "Tilføj dataomformer",
+ "search": "Søg efter dataomformere",
+ "converter-details": "Oplysninger om dataomformer",
+ "details": "Oplysninger",
+ "copyId": "Kopiér omformer-id",
+ "idCopiedMessage": "Omformer-id er blevet kopieret til udklipsholder",
+ "debug-mode": "Debug-tilstand",
+ "created-time": "Oprettelsestidspunkt",
+ "name": "Navn",
+ "name-required": "Navn er påkrævet.",
+ "description": "Beskrivelse",
+ "decoder": "Dekoder",
+ "encoder": "Indkoder",
+ "test-decoder-fuction": "Test af dekoderfunktion",
+ "test-encoder-fuction": "Test af indkoderfunktion",
+ "decoder-input-params": "Parametre for dekoderindgang",
+ "encoder-input-params": "Parametre for indkoderindgang",
+ "payload": "Data",
+ "payload-content-type": "Dataindholdstype",
+ "payload-content": "Dataindhold",
+ "message": "Meddelelse",
+ "message-type": "Meddelelsestype",
+ "message-type-required": "Meddelelsestype er påkrævet",
+ "test": "Test",
+ "metadata": "Metadata",
+ "metadata-required": "Metadataposter må ikke være tomme.",
+ "integration-metadata": "Integrationsmetadata",
+ "integration-metadata-required": "Integrationsmetadataposter må ikke være tomme.",
+ "output": "Output",
+ "import": "Importér omformer",
+ "export": "Eksportér omformer",
+ "export-failed-error": "",
+ "create-new-converter": "Opret ny omformer",
+ "converter-file": "Omformerfil",
+ "invalid-converter-file-error": "Omformeren kunne ikke importeres: Ugyldig omformerdatastruktur.",
+ "type": "Type",
+ "type-required": "Type er påkrævet.",
+ "type-uplink": "Uplink",
+ "type-downlink": "Downlink"
+ },
+ "content-type": {
+ "json": "Json",
+ "text": "Tekst",
+ "binary": "Binær (Base64)"
+ },
+ "customer": {
+ "customer": "Kunde",
+ "customers": "Kunder",
+ "management": "Kundeadministration",
+ "dashboard": "Kundens dashboard",
+ "dashboards": "Kundens dashboards",
+ "devices": "Kundeenheder",
+ "entity-views": "Kundeentitetsvisninger",
+ "assets": "Kundeaktiver",
+ "public-dashboards": "Offentlige dashboards",
+ "public-devices": "Offentlige enheder",
+ "public-assets": "Offentlige aktiver",
+ "public-entity-views": "Visninger af offentlig entitet",
+ "add": "Tilføj kunde",
+ "delete": "Slet kunde",
+ "manage-customer-user-groups": "Administrer kundebrugergrupper",
+ "manage-customer-groups": "Administrer kundegrupper",
+ "manage-customer-device-groups": "Administrer kundeenhedsgrupper",
+ "manage-customer-asset-groups": "Administrer kundeaktivgrupper",
+ "manage-customer-entity-view-groups": "Administrer visningsgrupper for kundeentitet",
+ "manage-customer-dashboard-groups": "Administrer kundedashboardgrupper",
+ "manage-customer-users": "Administrer kundebrugere",
+ "manage-customers": "Administrer kunder",
+ "manage-customer-devices": "Administrer kundeenheder",
+ "manage-customer-entity-views": "Administrer visninger af kundeentitet",
+ "manage-customer-dashboards": "Administrer kundedashboards",
+ "manage-public-devices": "Administrer offentlige enheder",
+ "manage-public-dashboards": "Administrer offentlige dashboards",
+ "manage-customer-assets": "Administrer kundeaktiver",
+ "manage-public-assets": "Administrer offentlige aktiver",
+ "add-customer-text": "Tilføj ny kunde",
+ "no-customers-text": "Ingen kunder fundet",
+ "customer-details": "Kundeinformation",
+ "delete-customer-title": "",
+ "delete-customer-text": "Vær forsigtig. Efter bekræftelsen vil kunden og alle relaterede data være uoprettelige.",
+ "delete-customers-title": "",
+ "delete-customers-action-title": "",
+ "delete-customers-text": "Vær forsigtig. Efter bekræftelsen vil alle valgte kunder blive fjernet, og alle relaterede data vil være uoprettelige.",
+ "manage-user-groups": "Administrer brugergrupper",
+ "manage-asset-groups": "Administrer aktivgrupper",
+ "manage-device-groups": "Administrer enhedsgrupper",
+ "manage-dashboard-groups": "Administrer dashboardgrupper",
+ "manage-entity-view-groups": "Administrer entitetsvisningsgrupper",
+ "manage-users": "Administrer brugere",
+ "manage-assets": "Administrer aktiver",
+ "manage-devices": "Administrer enheder",
+ "manage-dashboards": "Administrer dashboards",
+ "title": "Titel",
+ "title-required": "Titel er påkrævet.",
+ "description": "Beskrivelse",
+ "details": "Oplysninger",
+ "events": "Begivenheder",
+ "copyId": "Kopiér kunde-id",
+ "idCopiedMessage": "Kunde-id er blevet kopieret til udklipsholder",
+ "select-customer": "Vælg kunde",
+ "no-customers-matching": "",
+ "customer-required": "Kunde er påkrævet",
+ "selected-customers": "",
+ "search": "Søg efter kunder",
+ "select-group-to-add": "Vælg målgruppe for at tilføje udvalgte kunder",
+ "select-group-to-move": "Vælg målgruppe for at flytte udvalgte kunder",
+ "remove-customers-from-group": "",
+ "group": "Kundegruppe",
+ "list-of-groups": "",
+ "group-name-starts-with": "",
+ "select-default-customer": "Vælg standardkunde",
+ "default-customer": "Standardkunde",
+ "default-customer-required": "Standardkunde er påkrævet for at debugge dashboard på lejerniveau",
+ "allow-white-labeling": "Tillad hvid mærkning"
+ },
+ "customers-hierarchy": {
+ "customers-hierarchy": "Kundehierarki",
+ "open-nav-tree": "Åbn navigationstræ",
+ "return-to-top-level": "Tilbage til øverste niveau"
+ },
+ "custom-menu": {
+ "custom-menu": "Brugerdefineret menu",
+ "custom-menu-hint": "Definer brugerdefineret menu JSON nedenfor. Denne JSON indeholder en liste over brugerdefinerede menupunkter."
+ },
+ "custom-translation": {
+ "custom-translation": "Brugerdefineret oversættelse",
+ "translation-map": "Oversættelsestilknytning",
+ "key": "Oversættelsesnøgle",
+ "import": "Importér oversættelse",
+ "export": "Eksportér oversættelse",
+ "export-data": "Eksportér oversættelsesdata",
+ "import-data": "Importér oversættelsesdata",
+ "translation-file": "Oversættelsesfil",
+ "invalid-translation-file-error": "Kunne ikke importere oversættelsesfil: Ugyldig oversættelsesdatastruktur.",
+ "custom-translation-hint": "Definer brugerdefineret oversættelse JSON nedenfor. Denne JSON overskriver standardoversættelsen. Klik på 'Download lokalfil' for at hente eksisterende oversættelse. Du kan også bruge den downloadede fil som reference til tilgængelige nøgleværdipar for oversættelse.",
+ "download-locale-file": "Download lokalfil"
+ },
+ "datetime": {
+ "date-from": "Dato fra",
+ "time-from": "Tidspunkt fra",
+ "date-to": "Dato til",
+ "time-to": "Tidspunkt til"
+ },
+ "dashboard": {
+ "dashboard": "Dashboard",
+ "dashboards": "Dashboards",
+ "management": "Dashboardadministration",
+ "view-dashboards": "Vis dashboards",
+ "add": "Tilføj dashboard",
+ "assign-dashboard-to-customer": "Tildel dashboard(s) til kunde",
+ "assign-dashboard-to-customer-text": "Vælg de dashboards, der skal tildeles til kunden",
+ "assign-to-customer-text": "Vælg den kunde, der skal tildeles dashboard(s)",
+ "assign-to-customer": "Tildel til kunde",
+ "unassign-from-customer": "Fjern tildeling fra kunde",
+ "make-public": "Gør dashboard offentligt",
+ "make-private": "Gør dashboard privat",
+ "manage-assigned-customers": "Administrer tildelte kunder",
+ "assigned-customers": "Tildelte kunder",
+ "assign-to-customers": "Tildel dashboard(s) til kunder",
+ "assign-to-customers-text": "Vælg de kunder, der skal tildeles dashboard(s)",
+ "unassign-from-customers": "Fjern tildeling af dashboard(s) fra kunder",
+ "unassign-from-customers-text": "Vælg de kunder, hvor tildeling skal fjernes fra dashboard(s)",
+ "no-dashboards-text": "Ingen dashboards fundet",
+ "no-widgets": "Ingen widgets konfigureret",
+ "add-widget": "Tilføj ny widget",
+ "title": "Titel",
+ "select-widget-title": "Vælg widget",
+ "select-widget-value": "",
+ "select-widget-subtitle": "Liste over tilgængelige widget-typer",
+ "delete": "Slet dashboard",
+ "title-required": "Titel er påkrævet.",
+ "description": "Beskrivelse",
+ "details": "Oplysninger",
+ "dashboard-details": "Oplysninger om dashboard",
+ "add-dashboard-text": "Tilføj nyt dashboard",
+ "assign-dashboards": "Tildel dashboards",
+ "assign-new-dashboard": "Tildel nyt dashboard",
+ "assign-dashboards-text": "",
+ "unassign-dashboards-action-text": "",
+ "delete-dashboards": "Slet dashboards",
+ "unassign-dashboards": "Fjern tildeling af dashboards",
+ "unassign-dashboards-action-title": "",
+ "delete-dashboard-title": "",
+ "delete-dashboard-text": "Vær forsigtig. Efter bekræftelsen vil dashboardet og alle relaterede data være uoprettelige.",
+ "delete-dashboards-title": "",
+ "delete-dashboards-action-title": "",
+ "delete-dashboards-text": "Vær forsigtig. Efter bekræftelsen vil alle valgte dashboards blive fjernet, og alle relaterede data vil være uoprettelige.",
+ "unassign-dashboard-title": "",
+ "unassign-dashboard-text": "Efter bekræftelsen vil dashboardets tildeling blive fjernet og vil ikke være tilgængelig for kunden.",
+ "unassign-dashboard": "Fjern tildeling af dashboard",
+ "unassign-dashboards-title": "",
+ "unassign-dashboards-text": "Efter bekræftelsen vil tildelingen af alle valgte dashboards blive fjernet og vil ikke være tilgængelige for kunden.",
+ "public-dashboard-title": "Dashboard er nu offentligt",
+ "public-dashboard-text": "",
+ "public-dashboard-notice": "Bemærk: Glem ikke at gøre relaterede enheder offentlige for at få adgang til deres data.",
+ "public-dashboard-link": "Link til offentligt dashboard",
+ "public-dashboard-link-text": "",
+ "public-dashboard-link-notice": "Bemærk: Glem ikke at gøre relaterede enheder, aktiver og entitetsvisninger offentlige for at få adgang til deres data.",
+ "make-private-dashboard-title": "",
+ "make-private-dashboard-text": "Efter bekræftelsen vil dashboardet blive gjort privat og vil ikke være tilgængeligt for andre.",
+ "make-private-dashboard": "Gør dashboard privat",
+ "socialshare-text": "",
+ "socialshare-title": "",
+ "select-dashboard": "Vælg dashboard",
+ "no-dashboards-matching": "",
+ "dashboard-required": "Dashboard er påkrævet.",
+ "select-existing": "Vælg eksisterende dashboard",
+ "create-new": "Opret nyt dashboard",
+ "new-dashboard-title": "Ny dashboardtitel",
+ "open-dashboard": "Åbn dashboard",
+ "set-background": "Angiv baggrund",
+ "background-color": "Baggrundsfarve",
+ "background-image": "Baggrundsbillede",
+ "background-size-mode": "Baggrundsstørrelsestilstand",
+ "no-image": "Intet billede valgt",
+ "drop-image": "Træk og slip et billede, eller klik for at vælge en fil, der skal uploades.",
+ "maximum-upload-file-size": "",
+ "cannot-upload-file": "Filen kan ikke uploades",
+ "settings": "Indstillinger",
+ "columns-count": "Kolonneantal",
+ "columns-count-required": "Kolonneantal er påkrævet.",
+ "min-columns-count-message": "Kun 10 minimum kolonneantal er tilladt.",
+ "max-columns-count-message": "Kun 1000 maksimum kolonneantal er tilladt.",
+ "widgets-margins": "Margin mellem widgets",
+ "margin-required": "Marginværdi er påkrævet.",
+ "min-margin-message": "Kun 0 er tilladt som minimummarginværdi.",
+ "max-margin-message": "Kun 50 er tilladt som maksimummarginværdi.",
+ "horizontal-margin": "Horisontal margin",
+ "horizontal-margin-required": "Horisontal marginværdi er påkrævet.",
+ "min-horizontal-margin-message": "Kun 0 er tilladt som horisontal minimummarginværdi.",
+ "max-horizontal-margin-message": "Kun 50 er tilladt som horisontal maksimummarginværdi.",
+ "vertical-margin": "Vertikal margin",
+ "vertical-margin-required": "Vertikal marginværdi er påkrævet.",
+ "min-vertical-margin-message": "Kun 0 er tilladt som vertikal minimummarginværdi.",
+ "max-vertical-margin-message": "Kun 50 er tilladt som vertikal maksimummarginværdi.",
+ "autofill-height": "Autoudfyld layouthøjde",
+ "mobile-layout": "Mobile layoutindstillinger",
+ "mobile-row-height": "Mobil rækkehøjde, px",
+ "mobile-row-height-required": "Mobil rækkehøjdeværdi er påkrævet.",
+ "min-mobile-row-height-message": "Kun 5 pixel er tilladt som minimumværdi for mobilrækkehøjde.",
+ "max-mobile-row-height-message": "Kun 200 pixel er tilladt som maksimumværdi for mobilrækkehøjde.",
+ "display-title": "Vis dashboardtitel",
+ "toolbar-always-open": "Hold værktøjslinjen åben",
+ "title-color": "Titelfarve",
+ "display-dashboards-selection": "Vis valg af dashboards",
+ "display-entities-selection": "Vis valg af entiteter",
+ "display-filters": "Vis filtre",
+ "display-dashboard-timewindow": "Vis tidsvindue",
+ "display-dashboard-export": "Vis eksport",
+ "import": "Importér dashboard",
+ "export": "Eksportér dashboard",
+ "export-failed-error": "",
+ "export-pdf": "Eksportér som PDF",
+ "export-png": "Eksportér som PNG",
+ "export-jpg": "Eksportér som JPEG",
+ "export-json-config": "Eksportér JSON-konfiguration",
+ "download-dashboard-progress": "",
+ "create-new-dashboard": "Opret nyt dashboard",
+ "dashboard-file": "Dashboardfil",
+ "invalid-dashboard-file-error": "Kunne ikke importere dashboard: Ugyldig dashboarddatastruktur.",
+ "dashboard-import-missing-aliases-title": "Konfigurer aliasser anvendt af importeret dashboard",
+ "create-new-widget": "Opret ny widget",
+ "import-widget": "Importér widget",
+ "widget-file": "Widget-fil",
+ "invalid-widget-file-error": "Kan ikke importere widget: Ugyldig widget-datastruktur.",
+ "widget-import-missing-aliases-title": "Konfigurer aliasser, der bruges af importeret widget",
+ "open-toolbar": "Skjul dashboardets værktøjslinje",
+ "close-toolbar": "Luk værktøjslinje",
+ "configuration-error": "Konfigurationsfejl",
+ "alias-resolution-error-title": "Konfigurationsfejl i dashboardaliasser",
+ "invalid-aliases-config": "Kunne ikke finde nogen enheder, der matcher nogle af aliasfiltrene. Kontakt din administrator for at løse dette problem.",
+ "select-devices": "Vælg enheder",
+ "assignedToCustomer": "Tildelt til kunde",
+ "assignedToCustomers": "Tildelt til kunder",
+ "public": "Offentlig",
+ "public-link": "Offentligt link",
+ "copy-public-link": "Kopiér offentligt link",
+ "public-link-copied-message": "Dashboardets offentilige link er blevet kopieret til udklipsholderen",
+ "manage-states": "Administrer dashboardtilstande",
+ "states": "Dashboardtilstande",
+ "search-states": "Søg efter dashboardtilstande",
+ "selected-states": "",
+ "edit-state": "Rediger dashboardtilstand",
+ "delete-state": "Slet dashboardtilstand",
+ "add-state": "Tilføj dashboardtilstand",
+ "no-states-text": "Ingen tilstande fundet",
+ "state": "Dashboardtilstand",
+ "state-name": "Navn",
+ "state-name-required": "Dashboardtilstandsnavn er påkrævet.",
+ "state-id": "Tilstands-id",
+ "state-id-required": "Dashboardtilstands-id er påkrævet.",
+ "state-id-exists": "Dashboardtilstand med samme id findes allerede.",
+ "is-root-state": "Rodtilstand",
+ "delete-state-title": "Slet dashboardtilstand",
+ "delete-state-text": "",
+ "show-details": "Vis oplysninger",
+ "hide-details": "Skjul oplysninger",
+ "select-state": "Vælg måltilstand",
+ "state-controller": "Tilstandscontroller",
+ "selected-dashboards": "",
+ "search": "Søg efter dashboards",
+ "home-dashboard": "Startside",
+ "home-dashboard-hide-toolbar": "Skjul startsidens værktøjslinje",
+ "select-group-to-add": "Vælg målgruppe for at tilføje valgte dashboards",
+ "select-group-to-move": "Vælg målgruppe for at flytte valgte dashboards",
+ "remove-dashboards-from-group": "",
+ "group": "Gruppe af dashboards",
+ "list-of-groups": "",
+ "group-name-starts-with": ""
+ },
+ "datakey": {
+ "settings": "Indstillinger",
+ "advanced": "Fremskreden",
+ "label": "Mærkning",
+ "color": "Farve",
+ "units": "Specielt symbol, der vises ved siden af værdi",
+ "decimals": "Antal cifre efter flydende punkt",
+ "data-generation-func": "Datagenereringsfunktion",
+ "use-data-post-processing-func": "Brug dataefterbehandlingsfunktion",
+ "configuration": "Konfiguration af datanøgle",
+ "timeseries": "Tidsserier",
+ "attributes": "Attributter",
+ "entity-field": "Entitetsfelt",
+ "alarm": "Alarmfelter",
+ "timeseries-required": "Entitets tidsserier er påkrævet.",
+ "timeseries-or-attributes-required": "Entitets tidsserier/attributter er påkrævet.",
+ "alarm-fields-timeseries-or-attributes-required": "Alarmfelter eller entitets tidsserier/attributter er påkrævet.",
+ "maximum-timeseries-or-attributes": "",
+ "alarm-fields-required": "Alarmfelter er påkrævet.",
+ "function-types": "Funktionstyper",
+ "function-types-required": "Funktionstyper er påkrævet.",
+ "maximum-function-types": "",
+ "time-description": "tidsstempel for den aktuelle værdi",
+ "value-description": "den aktuelle værdi",
+ "prev-value-description": "resultat af forrige funktionskald",
+ "time-prev-description": "tidsstempel for den forrige værdi",
+ "prev-orig-value-description": "oprindelig tidligere værdi"
+ },
+ "datasource": {
+ "type": "Datakildetype",
+ "name": "Navn",
+ "label": "Mærkning",
+ "add-datasource-prompt": "Tilføj datakilde"
+ },
+ "details": {
+ "details": "Oplysninger",
+ "edit-mode": "Redigeringstilstand",
+ "edit-json": "Rediger JSON",
+ "toggle-edit-mode": "Skift redigeringstilstand"
+ },
+ "device": {
+ "device": "Enhed",
+ "device-required": "Enhed er påkrævet.",
+ "devices": "Enheder",
+ "management": "Enhedsadministration",
+ "view-devices": "Vis enheder",
+ "device-alias": "Enhedsalias",
+ "aliases": "Enhedsaliasser",
+ "no-alias-matching": "",
+ "no-aliases-found": "Ingen aliasser fundet.",
+ "no-key-matching": "",
+ "no-keys-found": "Ingen nøgler fundet.",
+ "create-new-alias": "Opret en ny!",
+ "create-new-key": "Opret en ny!",
+ "duplicate-alias-error": "",
+ "configure-alias": "",
+ "no-devices-matching": "",
+ "alias": "Alias",
+ "alias-required": "Enhedsalias er påkrævet.",
+ "remove-alias": "Fjern enhedsalias",
+ "add-alias": "Tilføj enhedsalias",
+ "name-starts-with": "Enhedens navn starter med",
+ "device-list": "Enhedsliste",
+ "use-device-name-filter": "Anvend filter",
+ "device-list-empty": "Ingen enheder valgt.",
+ "device-name-filter-required": "Enhedsnavnfilter er påkrævet.",
+ "device-name-filter-no-device-matched": "",
+ "add": "Tilføj enhed",
+ "assign-to-customer": "Tildel til kunde",
+ "assign-device-to-customer": "Tildel enhed(er) til kunde",
+ "assign-device-to-customer-text": "Vælg de enheder, der skal tildeles kunden",
+ "make-public": "Gør enheden offentlig",
+ "make-private": "Gør enheden privat",
+ "no-devices-text": "Ingen enheder fundet",
+ "assign-to-customer-text": "Vælg den kunde, der skal tilknyttes enheden/enhederne",
+ "device-details": "Enhedsoplysninger",
+ "add-device-text": "Tilføj ny enhed",
+ "credentials": "Brugeroplysninger",
+ "manage-credentials": "Administrer brugeroplysninger",
+ "delete": "Slet enhed",
+ "assign-devices": "Tildel enheder",
+ "assign-devices-text": "",
+ "delete-devices": "Slet enheder",
+ "unassign-from-customer": "Fjern tildeling fra kunde",
+ "unassign-devices": "Fjern tildeling af enheder",
+ "unassign-devices-action-title": "",
+ "assign-new-device": "Tildel ny enhed",
+ "make-public-device-title": "",
+ "make-public-device-text": "Efter bekræftelsen vil enheden og alle dens data blive gjort offentlige og tilgængelige for andre.",
+ "make-private-device-title": "",
+ "make-private-device-text": "Efter bekræftelsen vil enheden og alle dens data blive gjort private og vil ikke være tilgængelige for andre.",
+ "view-credentials": "Vis brugeroplysninger",
+ "delete-device-title": "",
+ "delete-device-text": "Vær forsigtig. Efter bekræftelsen vil enheden og alle relaterede data være uoprettelige.",
+ "delete-devices-title": "",
+ "delete-devices-action-title": "",
+ "delete-devices-text": "Vær forsigtig. Efter bekræftelsen vil alle valgte enheder blive fjernet, og alle relaterede data vil være uoprettelige.",
+ "unassign-device-title": "",
+ "unassign-device-text": "Efter bekræftelsen vil enhedens tildeling blive fjernet og vil ikke være tilgængelig for kunden.",
+ "unassign-device": "Fjern tildeling af enhed",
+ "unassign-devices-title": "",
+ "unassign-devices-text": "Efter bekræftelsen vil tildelingen af alle valgte enheder blive fjernet og vil ikke være tilgængelige for kunden.",
+ "device-credentials": "Enhedsbrugeroplysninger",
+ "credentials-type": "Type af brugeroplysninger",
+ "access-token": "Adgangstoken",
+ "access-token-required": "Adgangstoken er påkrævet.",
+ "access-token-invalid": "Adgangstokenlængden skal være fra 1 til 20 tegn.",
+ "rsa-key": "RSA offentlig nøgle",
+ "rsa-key-required": "RSA offentlig nøgle er påkrævet.",
+ "client-id": "Klient-id",
+ "client-id-pattern": "Indeholder ugyldigt tegn.",
+ "user-name": "Brugernavn",
+ "user-name-required": "Brugernavn er påkrævet.",
+ "client-id-or-user-name-necessary": "Klient-id og/eller brugernavn er nødvendige",
+ "password": "Adgangskode",
+ "secret": "Hemmelig",
+ "secret-required": "Hemmelig er påkrævet.",
+ "device-type": "Enhedstype",
+ "device-type-required": "Enhedstype er påkrævet.",
+ "select-device-type": "Vælg enhedstype",
+ "enter-device-type": "Indtast enhedstype",
+ "any-device": "Enhver enhed",
+ "no-device-types-matching": "",
+ "device-type-list-empty": "Ingen enhedstyper valgt.",
+ "device-types": "Enhedstyper",
+ "name": "Navn",
+ "name-required": "Navn er påkrævet.",
+ "description": "Beskrivelse",
+ "label": "Mærkning",
+ "events": "Begivenheder",
+ "details": "Oplysninger",
+ "copyId": "Kopiér enheds-id",
+ "copyAccessToken": "Kopiér adgangstoken",
+ "copy-mqtt-authentication": "Kopiér MQTT-brugeroplysninger",
+ "idCopiedMessage": "Enheds-id er blevet kopieret til udklipsholder",
+ "accessTokenCopiedMessage": "Enhedsadgangstoken er blevet kopieret til udklipsholder",
+ "mqtt-authentication-copied-message": "Enhedens MQTT-godkendelse er blevet kopieret til udklipsholder",
+ "assignedToCustomer": "Tildelt til kunde",
+ "unable-delete-device-alias-title": "Kan ikke slette enhedsalias",
+ "unable-delete-device-alias-text": "",
+ "is-gateway": "Er gateway",
+ "overwrite-activity-time": "Overskriv aktivitetstid for tilsluttet enhed",
+ "public": "Offentlig",
+ "device-public": "Enheden er offentlig",
+ "select-device": "Vælg enhed",
+ "selected-devices": "",
+ "search": "Søg efter enheder",
+ "select-group-to-add": "Vælg målgruppe for at tilføje valgte enheder",
+ "select-group-to-move": "Vælg målgruppe for at flytte valgte enheder",
+ "remove-devices-from-group": "",
+ "group": "Gruppe af enheder",
+ "list-of-groups": "",
+ "group-name-starts-with": "",
+ "import": "Importér enhed",
+ "device-file": "Enhedsfil",
+ "device-configuration": "Enhedskonfiguration",
+ "transport-configuration": "Transportkonfiguration",
+ "wizard": {
+ "device-wizard": "Enhedsguide",
+ "device-details": "Enhedsoplysninger",
+ "new-device-profile": "Opret ny enhedsprofil",
+ "existing-device-profile": "Vælg eksisterende enhedsprofil",
+ "specific-configuration": "Specifik konfiguration",
+ "customer-to-assign-device": "Kunden skal tildele enheden",
+ "add-credential": "Tilføj brugeroplysninger"
+ }
+ },
+ "device-profile": {
+ "device-profile": "Enhedsprofil",
+ "device-profiles": "Enhedsprofiler",
+ "all-device-profiles": "Alle",
+ "add": "Tilføj enhedsprofil",
+ "edit": "Rediger enhedsprofil",
+ "device-profile-details": "Oplysninger om enhedsprofil",
+ "no-device-profiles-text": "Ingen enhedsprofiler fundet",
+ "search": "Søg efter enhedsprofiler",
+ "selected-device-profiles": "",
+ "no-device-profiles-matching": "",
+ "device-profile-required": "Enhedsprofil er påkrævet",
+ "idCopiedMessage": "Enhedsprofil-id er blevet kopieret til udklipsholder",
+ "set-default": "Gør enhedsprofil standard",
+ "delete": "Slet enhedsprofil",
+ "copyId": "Kopiér enhedsprofil-id",
+ "new-device-profile-name": "Enhedsprofilnavn",
+ "new-device-profile-name-required": "Enhedsprofilnavn er påkrævet.",
+ "name": "Navn",
+ "name-required": "Navn er påkrævet.",
+ "type": "Profiltype",
+ "type-required": "Profiltype er påkrævet.",
+ "type-default": "Standard",
+ "transport-type": "Transporttype",
+ "transport-type-required": "Transporttype er påkrævet.",
+ "transport-type-default": "Standard",
+ "transport-type-default-hint": "Understøtter grundlæggende MQTT-, HTTP- og CoAP-transport",
+ "transport-type-mqtt": "MQTT",
+ "transport-type-mqtt-hint": "Aktiverer avancerede MQTT-transportindstillinger",
+ "transport-type-lwm2m": "LWM2M",
+ "transport-type-lwm2m-hint": "LWM2M-transporttype",
+ "transport-type-coap": "CoAP",
+ "transport-type-coap-hint": "Aktiverer avancerede CoAP-transportindstillinger",
+ "description": "Beskrivelse",
+ "default": "Standard",
+ "profile-configuration": "Profilkonfiguration",
+ "transport-configuration": "Transportkonfiguration",
+ "default-rule-chain": "Standardregelkæde",
+ "select-queue-hint": "Vælg fra en rulleliste, eller tilføj et brugerdefineret navn.",
+ "delete-device-profile-title": "",
+ "delete-device-profile-text": "Vær forsigtig. Efter bekræftelsen vil enhedsprofilen og alle relaterede data være uoprettelige.",
+ "delete-device-profiles-title": "",
+ "delete-device-profiles-text": "Vær forsigtig. Efter bekræftelsen vil alle valgte enhedsprofiler blive fjernet, og alle relaterede data vil være uoprettelige.",
+ "set-default-device-profile-title": "",
+ "set-default-device-profile-text": "Efter bekræftelsen vil enhedsprofilen blive markeret som standard og vil blive brugt til nye enheder, hvor der ikke er angivet nogen profil.",
+ "no-device-profiles-found": "Ingen enhedsprofiler fundet.",
+ "create-new-device-profile": "Opret en ny!",
+ "mqtt-device-topic-filters": "MQTT-enhedsemnefiltre",
+ "mqtt-device-topic-filters-unique": "MQTT-enhedsemnefiltre skal være unikke.",
+ "mqtt-device-payload-type": "MQTT-enhedsdata",
+ "transport-device-payload-type-json": "JSON",
+ "transport-device-payload-type-proto": "Protobuf",
+ "mqtt-payload-type-required": "Datatype er påkrævet.",
+ "coap-device-type": "CoAP-enhedstype",
+ "coap-device-payload-type": "CoAP-enhedsdata",
+ "coap-device-type-required": "CoAP-enhedstype er påkrævet.",
+ "coap-device-type-default": "Standard",
+ "coap-device-type-efento": "Efento NB-IoT",
+ "support-level-wildcards": "Enkelt [+] jokertegn og [#] jokertegn på flere niveauer understøttes.",
+ "telemetry-topic-filter": "Telemetriemnefilter",
+ "telemetry-topic-filter-required": "Telemetriemnefilter er påkrævet.",
+ "attributes-topic-filter": "Attributemnefilter",
+ "attributes-topic-filter-required": "Attributemnefilter er påkrævet.",
+ "telemetry-proto-schema": "Telemetri-protoskema",
+ "telemetry-proto-schema-required": "Telemetri-protoskema er påkrævet.",
+ "attributes-proto-schema": "Protoskema for attributter",
+ "attributes-proto-schema-required": "Protoskema for attributter er påkrævet.",
+ "rpc-response-topic-filter": "RPC-svaremnefilter",
+ "rpc-response-topic-filter-required": "RPC-svaremnefilter er påkrævet.",
+ "not-valid-pattern-topic-filter": "Ikke gyldigt mønsteremnefilter",
+ "not-valid-single-character": "Ugyldig brug af jokertegn i et enkelt niveau",
+ "not-valid-multi-character": "Ugyldig brug af jokertegn i flere niveauer",
+ "single-level-wildcards-hint": "[+] er velegnet til ethvert emnefilterniveau. Eks.: v1/enheder/+/telemetri eller +/enheder/+/attributter.",
+ "multi-level-wildcards-hint": "[#] kan selv erstatte emnefilteret og skal være det sidste symbol i emnet. Eks.: # eller v1/enheder/me/#.",
+ "alarm-rules": "Alarmregler",
+ "alarm-rules-with-count": "",
+ "no-alarm-rules": "Ingen alarmregler konfigureret",
+ "add-alarm-rule": "Tilføj alarmregel",
+ "edit-alarm-rule": "Rediger alarmregel",
+ "alarm-type": "Alarmtype",
+ "alarm-type-required": "Alarmtype er påkrævet.",
+ "alarm-type-unique": "Alarmtypen skal være unik inden for alarmreglerne for enhedsprofilen.",
+ "create-alarm-pattern": "",
+ "create-alarm-rules": "Opret alarmregler",
+ "no-create-alarm-rules": "Ingen opret betingelser konfigureret",
+ "add-create-alarm-rule-prompt": "Tilføj opret alarmregel",
+ "clear-alarm-rule": "Ryd alarmregel",
+ "no-clear-alarm-rule": "Ingen klar betingelse konfigureret",
+ "add-create-alarm-rule": "Tilføj opret betingelse",
+ "add-clear-alarm-rule": "Tilføj ryd tilstand",
+ "select-alarm-severity": "Vælg alarmens alvorsgrad",
+ "alarm-severity-required": "Alarmens alvorsgrad er påkrævet.",
+ "condition-duration": "Varighed af betingelse",
+ "condition-duration-value": "Varighedsværdi",
+ "condition-duration-time-unit": "Tidsenhed",
+ "condition-duration-value-range": "Varighedsværdien skal ligge i området fra 1 til 2147483647.",
+ "condition-duration-value-pattern": "Varighedsværdien skal være heltal.",
+ "condition-duration-value-required": "Varighedsværdi er påkrævet.",
+ "condition-duration-time-unit-required": "Tidsenhed er påkrævet.",
+ "advanced-settings": "Avancerede indstillinger",
+ "alarm-rule-details": "Oplysninger",
+ "add-alarm-rule-details": "Tilføj oplysninger",
+ "propagate-alarm": "Overfør alarm",
+ "alarm-rule-relation-types-list": "Relationstyper, der skal overføres",
+ "alarm-rule-relation-types-list-hint": "Hvis der ikke vælges Overfør relationstyper vil alarmer blive overført uden filtrering på relationstype.",
+ "alarm-details": "Alarmoplysninger",
+ "alarm-rule-condition": "Alarmregelbetingelse",
+ "enter-alarm-rule-condition-prompt": "Tilføj alarmregelbetingelse",
+ "edit-alarm-rule-condition": "Rediger alarmregelbetingelse",
+ "device-provisioning": "Klargøring af enheden",
+ "provision-strategy": "Strategi for klargøring",
+ "provision-strategy-required": "Strategi for klargøring er påkrævet.",
+ "provision-strategy-disabled": "Deaktiveret",
+ "provision-strategy-created-new": "Tillad oprettelse af nye enheder",
+ "provision-strategy-check-pre-provisioned": "Kontrollér, om der er forhåndsklargjorte enheder",
+ "provision-device-key": "Klargøringsenhedsnøgle",
+ "provision-device-key-required": "Klargøringsenhedsnøgle er påkrævet.",
+ "copy-provision-key": "Kopiér klargøringsnøgle",
+ "provision-key-copied-message": "Klargøringsnøgle er blevet kopieret til udklipsholder",
+ "provision-device-secret": "Klargøringsenhed hemmelig",
+ "provision-device-secret-required": "Klargøringsenhed hemmelig er påkrævet.",
+ "copy-provision-secret": "Kopiér klargøring hemmelig",
+ "provision-secret-copied-message": "Klargøring hemmelig er blevet kopieret til udklipsholder",
+ "condition": "Betingelse",
+ "condition-type": "Betingelsestype",
+ "condition-type-simple": "Enkel",
+ "condition-type-duration": "Varighed",
+ "condition-during": "",
+ "condition-type-repeating": "Gentager",
+ "condition-type-required": "Betingelsesnavn er påkrævet.",
+ "condition-repeating-value": "Antal begivenheder",
+ "condition-repeating-value-range": "Antallet af begivenheder skal ligge i intervallet fra 1 til 2147483647.",
+ "condition-repeating-value-pattern": "Antal begivenheder skal være heltal.",
+ "condition-repeating-value-required": "Antal begivenheder er påkrævet.",
+ "condition-repeat-times": "",
+ "schedule-type": "Planlægningstype",
+ "schedule-type-required": "Planlægningstype er påkrævet.",
+ "schedule": "Tidsplan",
+ "edit-schedule": "Rediger alarmtidsplan",
+ "schedule-any-time": "Aktiv hele tiden",
+ "schedule-specific-time": "Aktiv på et bestemt tidspunkt",
+ "schedule-custom": "Brugerdefineret",
+ "schedule-day": {
+ "monday": "Mandag",
+ "tuesday": "Tirsdag",
+ "wednesday": "Onsdag",
+ "thursday": "Torsdag",
+ "friday": "Fredag",
+ "saturday": "Lørdag",
+ "sunday": "Søndag"
+ },
+ "schedule-days": "Dage",
+ "schedule-time": "Tid",
+ "schedule-time-from": "Fra",
+ "schedule-time-to": "Til",
+ "schedule-days-of-week-required": "Der skal vælges mindst én ugedag.",
+ "create-device-profile": "Opret ny enhedsprofil",
+ "import": "Importér enhedsprofil",
+ "export": "Eksportér enhedsprofil",
+ "export-failed-error": "",
+ "device-profile-file": "Fil for enhedsprofil",
+ "invalid-device-profile-file-error": "Kan ikke importere enhedsprofil: Ugyldig datastruktur for enhedsprofil."
+ },
+ "dialog": {
+ "close": "Tæt"
+ },
+ "direction": {
+ "column": "Kolonne",
+ "row": "Række"
+ },
+ "error": {
+ "unable-to-connect": "Kan ikke oprette forbindelse til serveren! Kontrollér din internetforbindelse.",
+ "unhandled-error-code": "",
+ "unknown-error": "Ukendt fejl"
+ },
+ "entity": {
+ "entity": "Entitet",
+ "entities": "Entiteter",
+ "entities-count": "Antal entiteter",
+ "aliases": "Entitetsaliasser",
+ "entity-alias": "Entitetsalias",
+ "unable-delete-entity-alias-title": "Entitetsalias kunne ikke slettes",
+ "unable-delete-entity-alias-text": "",
+ "duplicate-alias-error": "",
+ "missing-entity-filter-error": "",
+ "configure-alias": "",
+ "alias": "Alias",
+ "alias-required": "Entitetsalias er påkrævet.",
+ "remove-alias": "Fjern entitetsalias",
+ "add-alias": "Tilføj entitetsalias",
+ "entity-list": "Entitetsliste",
+ "entity-type": "Entitetstype",
+ "entity-types": "Entitetstyper",
+ "entity-type-list": "Liste over entitetstype",
+ "any-entity": "Enhver entitet",
+ "enter-entity-type": "Indtast entitetstype",
+ "no-entities-matching": "",
+ "no-entity-types-matching": "",
+ "name-starts-with": "Navnet begynder med",
+ "use-entity-name-filter": "Anvend filter",
+ "entity-list-empty": "Ingen entiteter valgt.",
+ "entity-type-list-empty": "Ingen entitetstyper valgt.",
+ "entity-name-filter-required": "Entitetsnavnfilter er påkrævet.",
+ "entity-name-filter-no-entity-matched": "",
+ "all-subtypes": "Alle",
+ "select-entities": "Vælg entiteter",
+ "no-aliases-found": "Ingen aliasser fundet.",
+ "no-alias-matching": "",
+ "create-new-alias": "Opret en ny!",
+ "key": "Nøgle",
+ "key-name": "Nøglenavn",
+ "no-keys-found": "Ingen nøgler fundet.",
+ "no-key-matching": "",
+ "create-new-key": "Opret en ny!",
+ "type": "Type",
+ "type-required": "Entitetstype er påkrævet.",
+ "type-device": "Enhed",
+ "type-devices": "Enheder",
+ "list-of-devices": "",
+ "device-name-starts-with": "",
+ "type-device-profile": "Enhedsprofil",
+ "type-device-profiles": "Enhedsprofiler",
+ "list-of-device-profiles": "",
+ "device-profile-name-starts-with": "",
+ "type-asset": "Aktiv",
+ "type-assets": "Aktiver",
+ "list-of-assets": "",
+ "asset-name-starts-with": "",
+ "type-entity-view": "Entitetsvisning",
+ "type-entity-views": "Entitetsvisninger",
+ "list-of-entity-views": "",
+ "entity-view-name-starts-with": "",
+ "type-rule": "Regel",
+ "type-rules": "Regler",
+ "list-of-rules": "",
+ "rule-name-starts-with": "",
+ "type-plugin": "Plugin",
+ "type-plugins": "Plugins",
+ "list-of-plugins": "",
+ "plugin-name-starts-with": "",
+ "type-tenant": "Lejer",
+ "type-tenants": "Lejere",
+ "list-of-tenants": "",
+ "tenant-name-starts-with": "",
+ "type-tenant-profile": "Lejerprofil",
+ "type-tenant-profiles": "Lejerprofiler",
+ "list-of-tenant-profiles": "",
+ "tenant-profile-name-starts-with": "",
+ "type-customer": "Kunde",
+ "type-customers": "Kunder",
+ "list-of-customers": "",
+ "customer-name-starts-with": "",
+ "type-user": "Bruger",
+ "type-users": "Brugere",
+ "list-of-users": "",
+ "user-name-starts-with": "",
+ "type-dashboard": "Dashboard",
+ "type-dashboards": "Dashboards",
+ "list-of-dashboards": "",
+ "dashboard-name-starts-with": "",
+ "type-alarm": "Alarm",
+ "type-alarms": "Alarmer",
+ "list-of-alarms": "",
+ "alarm-name-starts-with": "",
+ "type-rulechain": "Regelkæde",
+ "type-rulechains": "Regelkæder",
+ "list-of-rulechains": "",
+ "rulechain-name-starts-with": "",
+ "type-scheduler-event": "Planlægningsbegivenhed",
+ "type-scheduler-events": "Planlægningsbegivenheder",
+ "list-of-scheduler-events": "",
+ "scheduler-event-name-starts-with": "",
+ "type-blob-entity": "Blob-entitet",
+ "type-blob-entities": "Blob-entiteter",
+ "list-of-blob-entities": "",
+ "blob-entity-name-starts-with": "",
+ "type-rulenode": "Regelknude",
+ "type-rulenodes": "Regelknuder",
+ "list-of-rulenodes": "",
+ "rulenode-name-starts-with": "",
+ "type-current-customer": "Nuværende kunde",
+ "type-current-tenant": "Nuværende lejer",
+ "type-current-user": "Nuværende bruger",
+ "type-current-user-owner": "Nuværende brugerejer",
+ "search": "Søg efter entiteter",
+ "selected-entities": "",
+ "entity-name": "Entitetsnavn",
+ "entity-label": "Entitetsetiket",
+ "details": "Entitetsoplysninger",
+ "no-entities-prompt": "Ingen entiteter fundet",
+ "no-data": "Ingen data at vise",
+ "columns-to-display": "Kolonner, der skal vises",
+ "type-api-usage-state": "Api-brugstilstand",
+ "type-entity-group": "Entitetsgruppe",
+ "type-converter": "Dataomformer",
+ "type-converters": "Dataomformere",
+ "list-of-converters": "",
+ "converter-name-starts-with": "",
+ "type-integration": "Integration",
+ "type-integrations": "Integrationer",
+ "list-of-integrations": "",
+ "integration-name-starts-with": "",
+ "type-role": "Rolle",
+ "type-roles": "Roller",
+ "list-of-roles": "",
+ "role-name-starts-with": "",
+ "type-group-permission": "Gruppetilladelse"
+ },
+ "entity-group": {
+ "entity-group": "Entitetsgruppe",
+ "details": "Oplysninger",
+ "columns": "Kolonner",
+ "add-column": "Tilføj kolonne",
+ "column-value": "Værdi",
+ "column-value-required": "Kolonneværdi er påkrævet.",
+ "column-title": "Titel",
+ "default-sort-order": "Standardsorteringsrækkefølge",
+ "default-sort-order-required": "Standardsorteringsrækkefølge er påkrævet.",
+ "hide-in-mobile-view": "Mobil skjult",
+ "use-cell-style-function": "Brug celletypefunktion",
+ "use-cell-content-function": "Brug celleindholdsfunktion",
+ "edit-column": "Rediger kolonne",
+ "column-details": "Kolonneoplysninger",
+ "actions": "Handlinger",
+ "settings": "Indstillinger",
+ "search": "Søg entitetsgrupper",
+ "delete": "Slet entitetsgruppe",
+ "name": "Navn",
+ "name-required": "Navn er påkrævet.",
+ "description": "Beskrivelse",
+ "add": "Tilføj entitetsgruppe",
+ "open-entity-group": "Åbn entitetsgruppe",
+ "add-entity-group-text": "Tilføj ny entitetsgruppe",
+ "no-entity-groups-text": "Ingen entitetsgrupper fundet",
+ "entity-group-details": "Oplysninger om entitetsgruppe",
+ "selected-entity-groups": "",
+ "delete-entity-groups": "Slet entitetsgrupper",
+ "delete-entity-group-title": "",
+ "delete-entity-group-text": "Vær forsigtig. Efter bekræftelsen vil entitetsgruppen og alle relaterede data være uoprettelige.",
+ "delete-entity-groups-title": "",
+ "delete-entity-groups-action-title": "",
+ "delete-entity-groups-text": "Vær forsigtig. Efter bekræftelsen vil alle valgte entitetsgrupper blive fjernet, og alle relaterede data vil være uoprettelige.",
+ "device-groups": "Enhedsgrupper",
+ "asset-groups": "Aktivgrupper",
+ "customer-groups": "Kundegrupper",
+ "device-group": "Enhedsgruppe",
+ "asset-group": "Aktivgruppe",
+ "user-group": "Brugergruppe",
+ "user-groups": "Brugergrupper",
+ "customer-group": "Kundegruppe",
+ "entity-view-groups": "Entitetsvisningsgrupper",
+ "entity-view-group": "Entitetsvisningsgruppe",
+ "dashboard-groups": "Dashboardgrupper",
+ "dashboard-group": "Dashboardgruppe",
+ "fetch-more": "Hent mere",
+ "column-type": {
+ "column-type": "Kolonnetype",
+ "client-attribute": "Klientattribut",
+ "shared-attribute": "Delt attribut",
+ "server-attribute": "Serverattribut",
+ "timeseries": "Tidsserier",
+ "entity-field": "Entitetsfelt"
+ },
+ "column-type-required": "Kolonnetype er påkrævet.",
+ "entity-field": {
+ "created-time": "Oprettelsestidspunkt",
+ "name": "Navn",
+ "type": "Type",
+ "device_profile": "Enhedsprofil",
+ "assigned_customer": "Tildelt kunde",
+ "authority": "Autoritet",
+ "first_name": "Fornavn",
+ "last_name": "Efternavn",
+ "email": "E-mail",
+ "title": "Titel",
+ "country": "Land",
+ "state": "Region",
+ "city": "By",
+ "address": "Adresse",
+ "address2": "Adresse 2",
+ "zip": "Postnummer",
+ "phone": "Telefon",
+ "label": "Mærkning"
+ },
+ "sort-order": {
+ "asc": "Stigende",
+ "desc": "Faldende",
+ "none": "Ingen"
+ },
+ "details-mode": {
+ "on-row-click": "Ved klik på række",
+ "on-action-button-click": "Ved klik på knappen Oplysninger",
+ "disabled": "Deaktiveret"
+ },
+ "change-owner": "Skift ejer",
+ "select-target-owner": "Vælg målejer",
+ "no-owners-matching": "",
+ "target-owner-required": "Målejer er påkrævet.",
+ "confirm-change-owner-title": "",
+ "confirm-change-owner-text": "Vær forsigtig. Efter bekræftelsen vil alle valgte enheder blive fjernet fra den aktuelle ejer og blive placeret i gruppen 'Alle' for målejeren.",
+ "add-to-group": "Tilføj til gruppe",
+ "move-to-group": "Flyt til gruppe",
+ "select-entity-group": "Vælg entitetsgruppe",
+ "no-entity-groups-matching": "",
+ "target-entity-group-required": "Målentitetsgruppe er påkrævet.",
+ "select-user-group": "Vælg brugergruppe",
+ "no-user-groups-matching": "",
+ "target-user-group-required": "Målbrugergruppe er påkrævet.",
+ "remove-from-group": "Fjern fra gruppe",
+ "group-table-title": "Gruppetabeltitel",
+ "enable-search": "Aktivér entitetssøgning",
+ "enable-add": "Aktivér tilføjelse af entiteter",
+ "enable-delete": "Aktivér sletning af entiteter",
+ "enable-selection": "Aktivér entitetsvalg",
+ "enable-group-transfer": "Aktivér gruppeoverførselshandlinger",
+ "display-pagination": "Vis sidenummerering",
+ "default-page-size": "Standard sidestørrelse",
+ "enable-assignment-actions": "Aktivér tildelingshandlinger",
+ "enable-credentials-management": "Aktivér administration af brugeroplysninger",
+ "enable-login-as-user": "Aktivér login som brugerhandling",
+ "enable-users-management": "Aktivér administration af brugere",
+ "enable-customers-management": "Aktivér administration af kunder",
+ "enable-assets-management": "Aktivér administration af aktiver",
+ "enable-devices-management": "Aktivér administration af enheder",
+ "enable-entity-views-management": "Aktivér administration af entitetsvisninger",
+ "enable-dashboards-management": "Aktivér administration af dashboards",
+ "open-details-on": "Åbn entitetsoplysninger på",
+ "select-existing": "Vælg eksisterende entitetsgruppe",
+ "create-new": "Opret ny entitetsgruppe",
+ "new-entity-group-name": "Nyt entitetsgruppenavn",
+ "entity-group-list": "Entitetsgruppeliste",
+ "entity-group-list-empty": "Ingen entitetsgrupper valgt.",
+ "name-starts-with": "Entitetsgruppenavn starter med",
+ "entity-group-name-filter-required": "Entitetsgruppenavnfilter er påkrævet.",
+ "roles": "Roller",
+ "permissions": "Tilladelser",
+ "public": "Offentlig",
+ "entity-group-public": "Entitetsgruppe er offentlig",
+ "make-public": "Gør entitetsgruppen offentlig",
+ "make-private": "Gør entitetsgruppen privat",
+ "make-public-entity-group-title": "",
+ "make-public-entity-group-text": "Efter bekræftelsen vil entitetsgruppen og alle dens entiteter blive gjort offentlige og tilgængelige for andre.",
+ "make-private-entity-group-title": "",
+ "make-private-entity-group-text": "Efter bekræftelsen vil entitetsgruppen og alle dens entiteter blive gjort private og vil ikke være tilgængelige for andre.",
+ "share": "Del entitetsgruppe",
+ "copyId": "Kopiér entitetsgruppe-id",
+ "idCopiedMessage": "Entitetsgruppe-id er blevet kopieret til udklipsholder",
+ "entity-group-name": "Entitetsgruppenavn",
+ "all-users": "Alle brugere"
+ },
+ "entity-field": {
+ "created-time": "Oprettelsestidspunkt",
+ "name": "Navn",
+ "type": "Type",
+ "first-name": "Fornavn",
+ "last-name": "Efternavn",
+ "email": "E-mail",
+ "title": "Titel",
+ "country": "Land",
+ "state": "Region",
+ "city": "By",
+ "address": "Adresse",
+ "address2": "Adresse 2",
+ "zip": "Postnummer",
+ "phone": "Telefon",
+ "label": "Mærkning"
+ },
+ "entity-view": {
+ "entity-view": "Entitetsvisning",
+ "entity-view-required": "Entitetsvisning er påkrævet.",
+ "entity-views": "Entitetsvisninger",
+ "management": "Administration af entitetsvisning",
+ "view-entity-views": "Vis entitetsvisninger",
+ "entity-view-alias": "Alias for entitetsvisning",
+ "aliases": "Aliasser for entitetsvisning",
+ "no-alias-matching": "",
+ "no-aliases-found": "Ingen aliasser fundet.",
+ "no-key-matching": "",
+ "no-keys-found": "Ingen nøgler fundet.",
+ "create-new-alias": "Opret en ny!",
+ "create-new-key": "Opret en ny!",
+ "duplicate-alias-error": "",
+ "configure-alias": "",
+ "no-entity-views-matching": "",
+ "public": "Offentlig",
+ "alias": "Alias",
+ "alias-required": "Alias for entitetsvisning er påkrævet.",
+ "remove-alias": "Fjern alias for entitetsvisning",
+ "add-alias": "Tilføj alias for entitetsvisning",
+ "name-starts-with": "Entitetsvisningsnavn starter med",
+ "entity-view-list": "Liste over entitetsvisning",
+ "use-entity-view-name-filter": "Anvend filter",
+ "entity-view-list-empty": "Ingen entitetsvisninger valgt.",
+ "entity-view-name-filter-required": "Entitetsvisningsnavnfilter er påkrævet.",
+ "entity-view-name-filter-no-entity-view-matched": "",
+ "add": "Tilføj entitetsvisning",
+ "entity-view-public": "Entitetsvisning er offentlig",
+ "assign-to-customer": "Tildel til kunde",
+ "assign-entity-view-to-customer": "Tildel entitetsvisning(er) til kunde",
+ "assign-entity-view-to-customer-text": "Vælg de entitetsvisninger, der skal tildeles til kunden",
+ "no-entity-views-text": "Ingen entitetsvisninger fundet",
+ "assign-to-customer-text": "Vælg den kunde, der skal tildeles entitetsvisning(er)",
+ "entity-view-details": "Oplysninger for entitetsvisning",
+ "add-entity-view-text": "Tilføj ny entitetsvisning",
+ "delete": "Slet entitetsvisning",
+ "assign-entity-views": "Tildel entitetsvisninger",
+ "assign-entity-views-text": "",
+ "delete-entity-views": "Slet entitetsvisninger",
+ "make-public": "Gør entitetsvisning offentlig",
+ "make-private": "Gør entitetsvisning privat",
+ "unassign-from-customer": "Fjern tildeling fra kunde",
+ "unassign-entity-views": "Fjern tildeling af entitetsvisninger",
+ "unassign-entity-views-action-title": "",
+ "assign-new-entity-view": "Tildel ny entitetsvisning",
+ "delete-entity-view-title": "",
+ "delete-entity-view-text": "Vær forsigtig. Efter bekræftelsen vil entitetsvisningen og alle relaterede data være uoprettelige.",
+ "delete-entity-views-title": "",
+ "delete-entity-views-action-title": "",
+ "delete-entity-views-text": "Vær forsigtig. Efter bekræftelsen vil alle valgte entitetsvisninger blive fjernet, og alle relaterede data vil være uoprettelige.",
+ "make-public-entity-view-title": "",
+ "make-public-entity-view-text": "Efter bekræftelsen vil entitetsvisningen og alle dens data blive gjort offentlige og tilgængelige for andre.",
+ "make-private-entity-view-title": "",
+ "make-private-entity-view-text": "Efter bekræftelsen vil entitetsvisningen og alle dens data blive gjort private og vil ikke være tilgængelige for andre.",
+ "unassign-entity-view-title": "",
+ "unassign-entity-view-text": "Efter bekræftelsen vil entitetsvisningens tildeling blive fjernet og vil ikke være tilgængelig for kunden.",
+ "unassign-entity-view": "Fjern tildeling af entitetsvisning",
+ "unassign-entity-views-title": "",
+ "unassign-entity-views-text": "Efter bekræftelsen vil tildelingen af alle valgte entitetsvisninger blive fjernet og vil ikke være tilgængelige for kunden.",
+ "entity-view-type": "Entitetsvisningstype",
+ "entity-view-type-required": "Entitetsvisningstype er påkrævet.",
+ "select-entity-view-type": "Vælg entitetsvisningstype",
+ "enter-entity-view-type": "Indtast entitetsvisningstype",
+ "any-entity-view": "Enhver entitetsvisning",
+ "no-entity-view-types-matching": "",
+ "entity-view-type-list-empty": "Der er ikke valgt nogen entitetsvisningstyper.",
+ "entity-view-types": "Entitetsvisningstyper",
+ "created-time": "Oprettelsestidspunkt",
+ "name": "Navn",
+ "name-required": "Navn er påkrævet.",
+ "description": "Beskrivelse",
+ "events": "Begivenheder",
+ "details": "Oplysninger",
+ "copyId": "Kopiér entitetsvisnings-id",
+ "idCopiedMessage": "Entitetsvisnings-id er blevet kopieret til udklipsholder",
+ "assignedToCustomer": "Tildelt til kunde",
+ "unable-entity-view-device-alias-title": "Kan ikke slette entitetsvisningsalias",
+ "unable-entity-view-device-alias-text": "",
+ "select-entity-view": "Vælg entitetsvisning",
+ "start-date": "Startdato",
+ "start-ts": "Starttid",
+ "end-date": "Slutdato",
+ "end-ts": "Sluttid",
+ "date-limits": "Datofrister",
+ "client-attributes": "Klientattributter",
+ "shared-attributes": "Delte attributter",
+ "server-attributes": "Serverattributter",
+ "timeseries": "Tidsserier",
+ "client-attributes-placeholder": "Klientattributter",
+ "shared-attributes-placeholder": "Delte attributter",
+ "server-attributes-placeholder": "Serverattributter",
+ "timeseries-placeholder": "Tidsserier",
+ "target-entity": "Målentitet",
+ "attributes-propagation": "Overførsel af attributter",
+ "attributes-propagation-hint": "Entitetsvisning vil automatisk kopiere specificerede attributter fra målentitet, hver gang du gemmer eller opdaterer denne entitetsvisning. Af ydelsesmæssige årsager overføres målenhedsattributter ikke til entitetsvisning ved hver attributændring. Du kan aktivere automatisk overførsel ved at konfigurere regelknuden \"Kopiér til visning\" i din regelkæde og knytte meddelelserne \"Postattributter\" og \"Attributter opdateret\" til den nye regelknude.",
+ "timeseries-data": "Tidsseriedata",
+ "timeseries-data-hint": "Konfigurer tidsseriedatanøgler for målentiteten, der vil være tilgængelige for entitetsvisningen. Disse tidsseriedata er skrivebeskyttede.",
+ "selected-entity-views": "",
+ "search": "Søg efter entitetsvisninger",
+ "select-group-to-add": "Vælg målgruppe for at tilføje valgte entitetsvisninger",
+ "select-group-to-move": "Vælg målgruppe for at flytte valgte entitetsvisninger",
+ "remove-entity-views-from-group": "",
+ "group": "Gruppe af entitetsvisninger",
+ "list-of-groups": "",
+ "group-name-starts-with": ""
+ },
+ "event": {
+ "events": "Begivenheder",
+ "event-type": "Begivenhedstype",
+ "type-error": "Fejl",
+ "type-lc-event": "Livscyklusbegivenhed",
+ "type-rw-event": "Rådata",
+ "type-stats": "Statistikker",
+ "type-debug-converter": "Debug",
+ "type-debug-integration": "Debug",
+ "type-debug-rule-node": "Debug",
+ "type-debug-rule-chain": "Debug",
+ "no-events-prompt": "Ingen begivenheder fundet",
+ "error": "Fejl",
+ "alarm": "Alarm",
+ "event-time": "Begivenhedstidspunkt",
+ "server": "Server",
+ "body": "Tekst",
+ "method": "Metode",
+ "type": "Type",
+ "in": "Ind",
+ "out": "Ud",
+ "metadata": "Metadata",
+ "message": "Meddelelse",
+ "entity": "Entitet",
+ "message-id": "Meddelelses-id",
+ "message-type": "Meddelelsestype",
+ "data-type": "Datatype",
+ "relation-type": "Relationstype",
+ "data": "Data",
+ "event": "Begivenhed",
+ "status": "Status",
+ "success": "Succes",
+ "failed": "Mislykket",
+ "messages-processed": "Behandlede meddelelser",
+ "errors-occurred": "Der opstod fejl",
+ "uuid": "UUID"
+ },
+ "extension": {
+ "extensions": "Udvidelser",
+ "selected-extensions": "",
+ "type": "Type",
+ "key": "Nøgle",
+ "value": "Værdi",
+ "id": "Id",
+ "extension-id": "Udvidelses-id",
+ "extension-type": "Udvidelsestype",
+ "transformer-json": "JSON *",
+ "unique-id-required": "Aktuelt udvidelses-id findes allerede.",
+ "delete": "Slet udvidelse",
+ "add": "Tilføj udvidelse",
+ "edit": "Rediger udvidelse",
+ "view": "Vis udvidelse",
+ "delete-extension-title": "",
+ "delete-extension-text": "Vær forsigtig. Efter bekræftelsen vil udvidelsen og alle relaterede data være uoprettelige.",
+ "delete-extensions-title": "",
+ "delete-extensions-text": "Vær forsigtig. Efter bekræftelsen vil alle valgte udvidelser blive fjernet.",
+ "converters": "Omformere",
+ "converter-id": "Omformer-id",
+ "configuration": "Konfiguration",
+ "converter-configurations": "Omformerkonfigurationer",
+ "token": "Sikkerhedstoken",
+ "add-converter": "Tilføj omformer",
+ "add-config": "Tilføj omformerkonfiguration",
+ "device-name-expression": "Enhedsnavnudtryk",
+ "device-type-expression": "Enhedstypeudtryk",
+ "custom": "Brugerdefineret",
+ "to-double": "Til dobbelt",
+ "transformer": "Transformer",
+ "json-required": "Transformer-json er påkrævet.",
+ "json-parse": "Kan ikke parse transformer-json.",
+ "attributes": "Attributter",
+ "add-attribute": "Tilføj attribut",
+ "add-map": "Tilføj tilknytningselement",
+ "timeseries": "Tidsserier",
+ "add-timeseries": "Tilføj tidsserier",
+ "field-required": "Felt er påkrævet",
+ "brokers": "Mæglere",
+ "add-broker": "Tilføj mægler",
+ "host": "Vært",
+ "port": "Port",
+ "port-range": "Porten skal ligge i området fra 1 til 65535.",
+ "ssl": "Ssl",
+ "credentials": "Brugeroplysninger",
+ "username": "Brugernavn",
+ "password": "Adgangskode",
+ "retry-interval": "Forsøg interval igen i millisekunder",
+ "sas": "Signatur for delt adgang",
+ "anonymous": "Anonym",
+ "basic": "Basis",
+ "pem": "PEM",
+ "ca-cert": "CA-certifikatfil *",
+ "private-key": "Privat nøglefil *",
+ "cert": "Certifikatfil *",
+ "no-file": "Ingen fil valgt.",
+ "drop-file": "Træk og slip en fil, eller klik for at vælge en fil, der skal uploades.",
+ "mapping": "Tilknytning",
+ "topic-filter": "Emnefilter",
+ "converter-type": "Omformertype",
+ "converter-json": "Json",
+ "json-name-expression": "Udtryk for enhedsnavn json",
+ "topic-name-expression": "Udtryk for enhedsnavnemne",
+ "json-type-expression": "Udtryk for enhedstype json",
+ "topic-type-expression": "Udtryk for enhedstypeemne",
+ "attribute-key-expression": "Udtryk for attributnøgle",
+ "attr-json-key-expression": "Udtryk for attributnøgle json",
+ "attr-topic-key-expression": "Udtryk for attributnøgleemne",
+ "request-id-expression": "Udtryk for anmodnings-id",
+ "request-id-json-expression": "Udtryk for anmodnings-id json",
+ "request-id-topic-expression": "Udtryk for anmodnings-id emne",
+ "response-topic-expression": "Udtryk for svaremne",
+ "value-expression": "Udtryk for værdi",
+ "topic": "Emne",
+ "timeout": "Timeout i millisekunder",
+ "converter-json-required": "Omformer-json er påkrævet.",
+ "converter-json-parse": "Omformeren json kunne ikke parses.",
+ "filter-expression": "Udtryk for filter",
+ "connect-requests": "Tilslutningsanmodninger",
+ "add-connect-request": "Tilføj tilslutningsanmodning",
+ "disconnect-requests": "Afbryd anmodninger",
+ "add-disconnect-request": "Tilføj afbrydelsesanmodning",
+ "attribute-requests": "Attributanmodninger",
+ "add-attribute-request": "Tilføj attributanmodning",
+ "attribute-updates": "Attributopdateringer",
+ "add-attribute-update": "Tilføj attributopdatering",
+ "server-side-rpc": "Serverside RPC",
+ "add-server-side-rpc-request": "Tilføj serverside RPC-anmodning",
+ "device-name-filter": "Enhedsnavnfilter",
+ "attribute-filter": "Attributfilter",
+ "method-filter": "Metodefilter",
+ "request-topic-expression": "Anmod om udtryk for emne",
+ "response-timeout": "Svartimeout i millisekunder",
+ "topic-expression": "Udtryk for emne",
+ "client-scope": "Klientomfang",
+ "add-device": "Tilføj enhed",
+ "opc-server": "Servere",
+ "opc-add-server": "Tilføj server",
+ "opc-add-server-prompt": "Tilføj venligst server",
+ "opc-application-name": "Applikationsnavn",
+ "opc-application-uri": "Applikation uri",
+ "opc-scan-period-in-seconds": "Scanningsperiode i sekunder",
+ "opc-security": "Sikkerhed",
+ "opc-identity": "Identitet",
+ "opc-keystore": "Keystore",
+ "opc-type": "Type",
+ "opc-keystore-type": "Type",
+ "opc-keystore-location": "Placering *",
+ "opc-keystore-password": "Adgangskode",
+ "opc-keystore-alias": "Alias",
+ "opc-keystore-key-password": "Nøgleadgangskode",
+ "opc-device-node-pattern": "Mønster for enhedsknude",
+ "opc-device-name-pattern": "Mønster for enhedsnavn",
+ "modbus-server": "Servere/slaver",
+ "modbus-add-server": "Tilføj server/slave",
+ "modbus-add-server-prompt": "Tilføj venligst server/slave",
+ "modbus-transport": "Transport",
+ "modbus-tcp-reconnect": "Automatisk gentilslutning",
+ "modbus-rtu-over-tcp": "RTU over TCP",
+ "modbus-port-name": "Serielt portnavn",
+ "modbus-encoding": "Kodning",
+ "modbus-parity": "Paritet",
+ "modbus-baudrate": "Baudrate",
+ "modbus-databits": "Databits",
+ "modbus-stopbits": "Stopbits",
+ "modbus-databits-range": "Databits skal ligge i området fra 7 til 8.",
+ "modbus-stopbits-range": "Stopbits skal ligge i området fra 1 til 2.",
+ "modbus-unit-id": "Enheds-id",
+ "modbus-unit-id-range": "Enheds-id skal ligge i området fra 1 til 247.",
+ "modbus-device-name": "Enhedsnavn",
+ "modbus-poll-period": "Undersøgelsesperiode (ms)",
+ "modbus-attributes-poll-period": "Attributundersøgelsesperiode (ms)",
+ "modbus-timeseries-poll-period": "Tidsserieundersøgelsesperiode (ms)",
+ "modbus-poll-period-range": "Undersøgelsesperioden skal have positiv værdi.",
+ "modbus-tag": "Tag",
+ "modbus-function": "Funktion",
+ "modbus-register-address": "Registeradresse",
+ "modbus-register-address-range": "Registeradresse skal ligge i området fra 0 til 65535.",
+ "modbus-register-bit-index": "Bitindeks",
+ "modbus-register-bit-index-range": "Bitindeks skal ligge i området fra 0 til 15.",
+ "modbus-register-count": "Registeroptælling",
+ "modbus-register-count-range": "Registeroptælling skal være en positiv værdi.",
+ "modbus-byte-order": "Byterækkefølge",
+ "sync": {
+ "status": "Status",
+ "sync": "Synkroniseret",
+ "not-sync": "Ikke synkroniseret",
+ "last-sync-time": "Sidste synkroniseringstidspunkt",
+ "not-available": "Ikke til rådighed"
+ },
+ "export-extensions-configuration": "Konfiguration af eksportér udvidelser",
+ "import-extensions-configuration": "Konfiguration af importér udvidelser",
+ "import-extensions": "Importér udvidelser",
+ "import-extension": "Importér udvidelse",
+ "export-extension": "Eksportér udvidelse",
+ "file": "Fil for udvidelser",
+ "invalid-file-error": "Ugyldig udvidelsesfil",
+ "text": "TEKST",
+ "json": "JSON",
+ "binary": "BINÆR",
+ "hex": "HEX"
+ },
+ "filter": {
+ "add": "Tilføj filter",
+ "edit": "Rediger filter",
+ "name": "Filternavn",
+ "name-required": "Filternavn er påkrævet.",
+ "duplicate-filter": "Filter med samme navn findes allerede.",
+ "filters": "Filtre",
+ "unable-delete-filter-title": "Filteret kunne ikke slettes",
+ "unable-delete-filter-text": "",
+ "duplicate-filter-error": "",
+ "missing-key-filters-error": "",
+ "filter": "Filter",
+ "editable": "Redigerbar",
+ "no-filters-found": "Ingen filtre fundet.",
+ "no-filter-text": "Intet filter angivet",
+ "add-filter-prompt": "Tilføj venligst filter",
+ "no-filter-matching": "",
+ "create-new-filter": "Opret en ny!",
+ "filter-required": "Filter er påkrævet.",
+ "operation": {
+ "operation": "Driftsopgave",
+ "equal": "lig med",
+ "not-equal": "ikke lig med",
+ "starts-with": "starter med",
+ "ends-with": "slutter med",
+ "contains": "indeholder",
+ "not-contains": "indeholder ikke",
+ "greater": "større end",
+ "less": "mindre end",
+ "greater-or-equal": "større end eller lig med",
+ "less-or-equal": "mindre end eller lig med",
+ "and": "og",
+ "or": "eller"
+ },
+ "ignore-case": "ignorer versalfølsomhed",
+ "value": "Værdi",
+ "remove-filter": "Fjern filter",
+ "preview": "Visning af filter",
+ "no-filters": "Ingen filtre konfigureret",
+ "add-filter": "Tilføj filter",
+ "add-complex-filter": "Tilføj komplekst filter",
+ "add-complex": "Tilføj kompleks",
+ "complex-filter": "Komplekst filter",
+ "edit-complex-filter": "Rediger komplekst filter",
+ "edit-filter-user-params": "Rediger filterprædikat for brugerparametre",
+ "filter-user-params": "Filtrerprædikat for brugerparametre",
+ "user-parameters": "Brugerparametre",
+ "display-label": "Etiket, der skal vises",
+ "autogenerated-label": "Generer automatisk etiket",
+ "order-priority": "Prioritet af feltrækkefølge",
+ "key-filter": "Nøglefilter",
+ "key-filters": "Nøglefiltre",
+ "key-name": "Nøglenavn",
+ "key-name-required": "Nøglenavn er påkrævet.",
+ "key-type": {
+ "key-type": "Nøgletype",
+ "attribute": "Attribut",
+ "timeseries": "Tidsserier",
+ "entity-field": "Entitetsfelt",
+ "constant": "Konstant"
+ },
+ "value-type": {
+ "value-type": "Værditype",
+ "string": "Streng",
+ "numeric": "Numerisk",
+ "boolean": "Boolesk",
+ "date-time": "Datotid"
+ },
+ "value-type-required": "Nøgleværditype er påkrævet.",
+ "key-value-type-change-title": "Er du sikker på, at du vil ændre nøgleværditypen?",
+ "key-value-type-change-message": "Hvis du bekræfter ny værditype, fjernes alle indtastede nøglefiltre.",
+ "no-key-filters": "Ingen nøglefiltre konfigureret",
+ "add-key-filter": "Tilføj nøglefilter",
+ "remove-key-filter": "Fjern nøglefilter",
+ "edit-key-filter": "Rediger nøglefilter",
+ "date": "Dato",
+ "time": "Tid",
+ "current-tenant": "Nuværende lejer",
+ "current-customer": "Nuværende kunde",
+ "current-user": "Nuværende bruger",
+ "current-device": "Nuværende enhed",
+ "default-value": "Standardværdi",
+ "dynamic-source-type": "Dynamisk kildetype",
+ "no-dynamic-value": "Ingen dynamisk værdi",
+ "source-attribute": "Kildeattribut",
+ "switch-to-dynamic-value": "Skift til dynamisk værdi",
+ "switch-to-default-value": "Skift til standardværdi",
+ "inherit-owner": "Nedarv fra ejer",
+ "source-attribute-not-set": "Hvis kildeattributten ikke er angivet"
+ },
+ "fullscreen": {
+ "expand": "Udvid til fuld skærm",
+ "exit": "Afslut fuldskærm",
+ "toggle": "Skift mellem fuldskærmstilstand",
+ "fullscreen": "Fuld skærm"
+ },
+ "function": {
+ "function": "Funktion"
+ },
+ "gateway": {
+ "add-entry": "Tilføj konfiguration",
+ "connector-add": "Tilføj ny stikforbindelse",
+ "connector-enabled": "Aktivér stikforbindelse",
+ "connector-name": "Navn på stikforbindelse",
+ "connector-name-required": "Navn på stikforbindelse er påkrævet.",
+ "connector-type": "Stikforbindelsestype",
+ "connector-type-required": "Stikforbindelsestype er påkrævet.",
+ "connectors": "Konfiguration af stikforbindelser",
+ "create-new-gateway": "Opret en ny gateway",
+ "create-new-gateway-text": "",
+ "delete": "Slet konfiguration",
+ "download-tip": "Download konfigurationsfil",
+ "gateway": "Gateway",
+ "gateway-exists": "Enhed med samme navn findes allerede.",
+ "gateway-name": "Gateway-navn",
+ "gateway-name-required": "Gateway-navn er påkrævet.",
+ "gateway-saved": "Gateway-konfigurationen blev gemt.",
+ "json-parse": "Ikke gyldig JSON.",
+ "json-required": "Feltet må ikke være tomt.",
+ "no-connectors": "Ingen stikforbindelser",
+ "no-data": "Ingen konfigurationer",
+ "no-gateway-found": "Ingen gateway fundet.",
+ "no-gateway-matching": "",
+ "path-logs": "Sti til logfiler",
+ "path-logs-required": "Sti er påkrævet.",
+ "remote": "Fjernkonfiguration",
+ "remote-logging-level": "Logføringsniveau",
+ "remove-entry": "Fjern konfiguration",
+ "save-tip": "Gem konfigurationsfil",
+ "security-type": "Sikkerhedstype",
+ "security-types": {
+ "access-token": "Adgangstoken",
+ "tls": "TLS"
+ },
+ "storage": "Lagring",
+ "storage-max-file-records": "Maks. antal poster i fil",
+ "storage-max-files": "Maks. antal filer",
+ "storage-max-files-min": "Min. antal er 1.",
+ "storage-max-files-pattern": "Antal er ikke gyldigt.",
+ "storage-max-files-required": "Antal er påkrævet.",
+ "storage-max-records": "Maks. antal poster i lagring",
+ "storage-max-records-min": "Min. antal poster er 1.",
+ "storage-max-records-pattern": "Antal er ikke gyldigt.",
+ "storage-max-records-required": "Maks. antal poster er påkrævet.",
+ "storage-pack-size": "Maks. antal pakkestørrelse for begivenhed",
+ "storage-pack-size-min": "Min. antal er 1.",
+ "storage-pack-size-pattern": "Antal er ikke gyldigt.",
+ "storage-pack-size-required": "Maks. antal pakkestørrelse for begivenhed er påkrævet.",
+ "storage-path": "Lagringssti",
+ "storage-path-required": "Lagringssti er påkrævet.",
+ "storage-type": "Lagringstype",
+ "storage-types": {
+ "file-storage": "Lagring af filter",
+ "memory-storage": "Lagring af hukommelse"
+ },
+ "thingsboard": "ThingsBoard",
+ "thingsboard-host": "ThingsBoard-vært",
+ "thingsboard-host-required": "Vært er påkrævet.",
+ "thingsboard-port": "ThingsBoard-port",
+ "thingsboard-port-max": "Maks. portnummer er 65535.",
+ "thingsboard-port-min": "Min. portnummer er 1.",
+ "thingsboard-port-pattern": "Port er ikke gyldig.",
+ "thingsboard-port-required": "Port er påkrævet.",
+ "tidy": "Tidy",
+ "tidy-tip": "Tidy konfig. JSON",
+ "title-connectors-json": "",
+ "tls-path-ca-certificate": "Sti til CA-certifikat på gateway",
+ "tls-path-client-certificate": "Sti til klientcertifikat på gateway",
+ "tls-path-private-key": "Sti til privat nøgle på gateway",
+ "toggle-fullscreen": "Skift til fuld skærm",
+ "transformer-json-config": "Konfiguration JSON*",
+ "update-config": "Tilføj/opdater konfiguration JSON"
+ },
+ "grid": {
+ "delete-item-title": "Er du sikker på, du ønsker at slette dette element?",
+ "delete-item-text": "Vær forsigtig. Efter bekræftelsen vil dette element og alle relaterede data være uoprettelige.",
+ "delete-items-title": "",
+ "delete-items-action-title": "",
+ "delete-items-text": "Vær forsigtig. Efter bekræftelsen vil alle valgte elementer blive fjernet, og alle relaterede data vil være uoprettelige.",
+ "add-item-text": "Tilføj nyt element",
+ "no-items-text": "Ingen elementer fundet",
+ "item-details": "Oplysninger om element",
+ "delete-item": "Slet element",
+ "delete-items": "Slet elementer",
+ "scroll-to-top": "Gå til toppen"
+ },
+ "help": {
+ "goto-help-page": "Gå til hjælpesiden"
+ },
+ "home": {
+ "home": "Hjem",
+ "profile": "Profil",
+ "logout": "Log ud",
+ "menu": "Menu",
+ "avatar": "Avatar",
+ "open-user-menu": "Åbn brugermenu"
+ },
+ "import": {
+ "no-file": "Ingen fil valgt",
+ "drop-file": "Træk og slip en JSON-fil, eller klik for at vælge en fil, der skal uploades.",
+ "drop-csv-file": "Træk og slip en CSV-fil, eller klik for at vælge en fil, der skal uploades.",
+ "drop-file-csv": "Træk og slip en CSV-fil, eller klik for at vælge en fil, der skal uploades.",
+ "column-value": "Værdi",
+ "column-title": "Titel",
+ "column-example": "Eksempel på værdidata",
+ "column-key": "Attribut-/telemetrinøgle",
+ "csv-delimiter": "CSV-skilletegn",
+ "csv-first-line-header": "Første linje indeholder kolonnenavne",
+ "csv-update-data": "Opdater attributter/telemetri",
+ "import-csv-number-columns-error": "En fil skal indeholde mindst to kolonner",
+ "import-csv-invalid-format-error": "",
+ "column-type": {
+ "name": "Navn",
+ "type": "Type",
+ "label": "Mærkning",
+ "column-type": "Kolonnetype",
+ "client-attribute": "Klientattribut",
+ "shared-attribute": "Delt attribut",
+ "server-attribute": "Serverattribut",
+ "timeseries": "Tidsserier",
+ "entity-field": "Entitetsfelt",
+ "access-token": "Adgangstoken",
+ "isgateway": "Er gateway",
+ "activity-time-from-gateway-device": "Aktivitetstid fra gateway-enhed",
+ "description": "Beskrivelse"
+ },
+ "stepper-text": {
+ "select-file": "Vælg en fil",
+ "configuration": "Importér konfiguration",
+ "column-type": "Vælg kolonnetype",
+ "creat-entities": "Oprettelse af nye entiteter",
+ "done": "Udført"
+ },
+ "message": {
+ "create-entities": "",
+ "update-entities": "",
+ "error-entities": ""
+ }
+ },
+ "integration": {
+ "integration": "Integration",
+ "integrations": "Integrationer",
+ "select-integration": "Vælg integration",
+ "no-integrations-matching": "",
+ "integration-required": "Integration er påkrævet",
+ "delete": "Slet integration",
+ "management": "Integrationsstyring",
+ "add-integration-text": "Tilføj ny integration",
+ "no-integrations-text": "Ingen integrationer fundet",
+ "selected-integrations": "",
+ "delete-integration-title": "",
+ "delete-integration-text": "Vær forsigtig. Efter bekræftelsen vil integrationen og alle relaterede data være uoprettelige.",
+ "delete-integrations-title": "",
+ "delete-integrations-action-title": "",
+ "delete-integrations-text": "Vær forsigtig. Efter bekræftelsen vil alle valgte integrationer blive fjernet, og alle relaterede data vil være uoprettelige.",
+ "events": "Begivenheder",
+ "enabled": "Aktiveret",
+ "allow-create-devices-or-assets": "Tillad oprettelse af enheder eller aktiver",
+ "add": "Tilføj integration",
+ "search": "Søg efter integrationer",
+ "integration-details": "Integrationsoplysninger",
+ "details": "Oplysninger",
+ "copyId": "Kopiér integrations-id",
+ "idCopiedMessage": "Integrations-id er blevet kopieret til udklipsholder",
+ "debug-mode": "Debug-tilstand",
+ "enable-security": "Aktivér sikkerhed",
+ "enable-security-new": "Aktivér sikkerhed for automatiske tokenopdateringer",
+ "headers-filter": "Filter for overskrifter",
+ "header": "Overskrift",
+ "no-headers-filter": "Intet filter for overskrifter",
+ "downlink-url": "Downlink URL",
+ "downlink-url-required": "Downlink URL er påkrævet",
+ "create-loriot-output": "Opret Loriot-applikationsoutput",
+ "send-downlink": "Send downlink",
+ "server": "Server",
+ "server-required": "Server er påkrævet",
+ "app-id": "Applikations-id",
+ "app-id-required": "Applikations-id er påkrævet",
+ "app-token": "Applikationsadgangstoken",
+ "app-token-required": "Applikationsadgangstoken er påkrævet",
+ "email": "E-mail",
+ "email-required": "E-mail er påkrævet",
+ "application-uri": "Applikation URI",
+ "as-id": "AS-id",
+ "as-id-required": "AS-id er påkrævet.",
+ "as-key": "AS-nøgle",
+ "as-key-required": "AS-nøgle er påkrævet.",
+ "client-id-new": "Klient-id",
+ "client-id-new-required": "Klient-id (login) er påkrævet (login).",
+ "client-secret": "Klient hemmelig",
+ "client-secret-required": "Klient hemmelig (adgangskode) er påkrævet (adgangskode).",
+ "max-time-diff-in-seconds": "Maksimal tidsforskel (sekunder)",
+ "max-time-diff-in-seconds-required": "Maksimal tidsforskel er påkrævet.",
+ "created-time": "Oprettelsestidspunkt",
+ "name": "Navn",
+ "name-required": "Navn er påkrævet.",
+ "description": "Beskrivelse",
+ "base-url": "Basis-URL",
+ "base-url-required": "Basis-URL er påkrævet",
+ "security-key": "Sikkerhedsnøgle",
+ "http-endpoint": "HTTP-slutpunkts-URL",
+ "replace-no-content-to-ok": "Erstat svarstatus fra 'Intet indhold' til 'OK'",
+ "copy-http-endpoint-url": "Kopiér HTTP-slutpunkts-URL",
+ "http-endpoint-url-copied-message": "HTTP-slutpunkts-URL er blevet kopieret til udklipsholder",
+ "host": "Vært",
+ "host-required": "Vært er påkrævet.",
+ "host-type": "Værtstype",
+ "host-type-required": "Værtstype er påkrævet.",
+ "custom-host": "Brugerdefineret vært",
+ "custom-host-required": "Brugerdefineret vært er påkrævet.",
+ "port": "Port",
+ "port-required": "Port er påkrævet.",
+ "port-range": "Porten skal ligge i området fra 1 til 65535.",
+ "connect-timeout": "Forbindelsestimeout (sek.)",
+ "connect-timeout-required": "Forbindelsestimeout er påkrævet.",
+ "connect-timeout-range": "Forbindelsestimeout skal ligge i området fra 1 til 200.",
+ "client-id": "Klient-id",
+ "client-id-required": "Klient-id er påkrævet.",
+ "client-id-range": "Klient-id skal ligge i et interval fra 1 til 23 tegn. [MQTT-3.1.3-5]",
+ "client-id-pattern": "Klient-id skal bestå af tal og store og små bogstaver. [MQTT-3.1.3-5]",
+ "max-bytes-in-message": "Maksimum bytes i meddelelse",
+ "max-bytes-in-message-range": "Maksimum bytes i meddelelsen skal ligge i området fra 1 til 256000000.",
+ "device-id": "Enheds-id",
+ "device-id-required": "Enheds-id er påkrævet.",
+ "device-id-range": "Enheds-id'et skal ligge i området fra 1 til 65535 tegn.",
+ "device-id-pattern": "Enheds-id'et skal bestå af tal og store og små bogstaver. [MQTT-3.1.3-5]",
+ "group-id": "Gruppe-id",
+ "group-id-required": "Gruppe-id er påkrævet.",
+ "topics": "Emner",
+ "topics-required": "Emne er påkrævet.",
+ "routing-keys": "Routing-nøgler",
+ "routing-keys-required": "Routing-nøgle er påkrævet.",
+ "queues": "Køer",
+ "queues-required": "Kønavn er påkrævet.",
+ "exchange-name": "Udskiftningsnavn",
+ "exchange-name-required": "Udskiftningsnavn er påkrævet.",
+ "downlink-topic": "Downlink-emne",
+ "connection-timeout": "Forbindelsestimeout, ms",
+ "connection-timeout-min": "Ugyldig forbindelsestimeoutværdi.",
+ "handshake-timeout": "Handshake-timeout, ms",
+ "handshake-timeout-min": "Ugyldig handshake-timeoutværdi.",
+ "virtual-host": "Virtuel vært",
+ "rabbit-mq-poll-interval": "Undersøgelsesinterval, ms",
+ "rabbit-mq-poll-interval-min": "Ugyldig undersøgelsesintervalværdi.",
+ "application-server-url": "Applikationsserver URL",
+ "application-server-api-token": "Applikationsserver API-token",
+ "application-server-api-token-required": "Applikationsserver API-token er påkrævet.",
+ "bootstrap-servers": "Bootstrap-servere",
+ "bootstrap-servers-required": "Bootstrap-servere er påkrævet.",
+ "poll-interval": "Undersøgelsesinterval",
+ "poll-interval-required": "Undersøgelsesinterval er påkrævet.",
+ "auto-create-topics": "Opret emner automatisk",
+ "clean-session": "Ryd session",
+ "enable-ssl": "Aktivér SSL",
+ "credentials": "Brugeroplysninger",
+ "credentials-type": "Type af brugeroplysninger",
+ "credentials-type-required": "Type af brugeroplysninger er påkrævet.",
+ "username": "Brugernavn",
+ "username-required": "Brugernavn er påkrævet.",
+ "password": "Adgangskode",
+ "password-required": "Brugernavn er påkrævet.",
+ "azure-ca-cert": "CA-certifikatfil",
+ "ca-cert": "CA-certifikatfil *",
+ "private-key": "Privat nøglefil *",
+ "private-key-password": "Adgangskode til privat nøgle",
+ "cert": "Certifikatfil *",
+ "no-file": "Ingen fil valgt.",
+ "drop-file": "Træk og slip en fil, eller klik for at vælge en fil, der skal uploades.",
+ "check-connection": "Kontrollér forbindelsen",
+ "check-success": "Forbindelse oprettet.",
+ "topic-filters": "Emnefiltre",
+ "remove-topic-filter": "Fjern emnefilter",
+ "add-topic-filter": "Tilføj emnefilter",
+ "add-topic-filter-prompt": "Tilføj venligst emnefilter",
+ "topic": "Emne",
+ "mqtt-qos": "QoS",
+ "mqtt-qos-at-most-once": "Højst én gang",
+ "mqtt-qos-at-least-once": "Mindst én gang",
+ "mqtt-qos-exactly-once": "Præcis én gang",
+ "downlink-topic-pattern": "Mønster for downlink-emne",
+ "downlink-topic-pattern-required": "Mønster for downlink-emne er påkrævet.",
+ "aws-access-key-id": "AWS-adgangsnøgle-id",
+ "aws-secret-access-key": "AWS hemmelig adgangsnøgle",
+ "aws-region": "Region",
+ "aws-iot-endpoint": "AWS IoT-slutpunkt",
+ "aws-iot-endpoint-required": "AWS IoT-slutpunkt er påkrævet.",
+ "aws-iot-credentials": "AWS IoT-brugeroplysninger",
+ "aws-sqs-polling-period-in-seconds": "Undersøgelsesperiode i sekunder",
+ "aws-sqs-queue-url": "SQS Kø URL",
+ "aws-sqs-queue-url-required": "SQS Kø URL er påkrævet",
+ "aws-sqs-access-key-id-required": "Adgangsnøgle-id er påkrævet",
+ "aws-sqs-secret-access-key-required": "Hemmelig adgangsnøgle er påkrævet",
+ "application-credentials": "Applikationsbrugeroplysninger",
+ "api-key": "API-nøgle",
+ "api-key-required": "API-nøgle er påkrævet.",
+ "api-key-format": "Ugyldigt API-nøgleformat.",
+ "auth-token": "Godkendelsestoken",
+ "auth-token-required": "Godkendelsestoken er påkrævet.",
+ "region": "Region",
+ "region-required": "Region er påkrævet.",
+ "application-id": "Applikations-id",
+ "application-id-required": "Applikations-id er påkrævet.",
+ "access-key": "Adgangsnøgle",
+ "access-key-required": "Adgangsnøgle er påkrævet.",
+ "connection-parameters": "Tilslutningsparametre",
+ "service-bus-namespace-name": "Namespace-navn for servicebus",
+ "service-bus-namespace-name-required": "Namespace-navn for servicebus er påkrævet.",
+ "connection-string": "Tilslutningsstreng",
+ "connection-string-required": "Tilslutningsstreng påkrævet!",
+ "event-hub-name": "Navn på begivenhedshub",
+ "event-hub-name-required": "Navn på begivenhedshub er påkrævet.",
+ "event-iot-hub-name-required": "Iot-hubnavn er påkrævet for downlink",
+ "sas-key-name": "SAS-nøglenavn",
+ "sas-key-name-required": "SAS-nøglenavn er påkrævet.",
+ "sas-key": "SAS-nøgle",
+ "sas-key-required": "SAS-nøgle er påkrævet.",
+ "iot-hub-name": "IoT-hubnavn (påkrævet for downlink)",
+ "hostname": "Værtsnavn",
+ "hostname-required": "Værtsnavn er påkrævet",
+ "integration-clazz": "Integrationsklasse",
+ "integration-clazz-required": "Integrationsklasse er påkrævet",
+ "integration-configuration": "Konfiguration af integration JSON",
+ "metadata": "Metadata",
+ "type": "Type",
+ "type-required": "Type er påkrævet.",
+ "uplink-converter": "Uplink-dataomformer",
+ "uplink-converter-required": "Uplink-dataomformer er påkrævet.",
+ "downlink-converter": "Downlink-dataomformer",
+ "type-http": "HTTP",
+ "type-ocean-connect": "OceanConnect",
+ "type-sigfox": "SigFox",
+ "type-thingpark": "ThingPark",
+ "type-loriot": "Loriot",
+ "type-thingpark-enterprise": "ThingParkEnterprise",
+ "type-tmobile-iot-cdp": "T-Mobile – IoT CDP",
+ "type-mqtt": "MQTT",
+ "type-aws-iot": "AWS IoT",
+ "type-aws-sqs": "AWS SQS",
+ "type-aws-kinesis": "AWS-kinese",
+ "type-ibm-watson-iot": "IBM Watson IoT",
+ "type-ttn": "TheThingsNetwork",
+ "type-tti": "The Things Stack",
+ "type-chirpstack": "ChirpStack",
+ "type-azure-event-hub": "Azure-begivenhedshub",
+ "type-azure-iot-hub": "Azure IoT-hub",
+ "type-opc-ua": "OPC-UA",
+ "type-custom": "Brugerdefineret",
+ "type-udp": "UDP",
+ "type-tcp": "TCP",
+ "type-kafka": "Kafka",
+ "type-rabbitmq": "RabbitMQ",
+ "type-pubsub": "Pub/Sub",
+ "opc-ua-application-name": "Applikationsnavn",
+ "opc-ua-application-uri": "Applikation uri",
+ "opc-ua-scan-period-in-seconds": "Scanningsperiode i sekunder",
+ "opc-ua-scan-period-in-seconds-required": "Scanningsperiode er påkrævet",
+ "opc-ua-timeout": "Timeout i millisekunder",
+ "opc-ua-timeout-required": "Timeout er påkrævet",
+ "opc-ua-security": "Sikkerhed",
+ "opc-ua-security-required": "Sikkerhed er påkrævet",
+ "opc-ua-identity": "Identitet",
+ "opc-ua-identity-required": "Identitet er påkrævet",
+ "opc-ua-keystore": "Keystore",
+ "add-opc-ua-keystore-prompt": "Tilføj venligst keystore-fil",
+ "opc-ua-keystore-required": "Keystore er påkrævet",
+ "opc-ua-type": "Type",
+ "opc-ua-keystore-type": "Type",
+ "opc-ua-keystore-type-required": "Type er påkrævet",
+ "opc-ua-keystore-location": "Placering *",
+ "opc-ua-keystore-password": "Adgangskode",
+ "opc-ua-keystore-password-required": "Adgangskode er påkrævet",
+ "opc-ua-keystore-alias": "Alias",
+ "opc-ua-keystore-alias-required": "Alias er påkrævet",
+ "opc-ua-keystore-key-password": "Nøgleadgangskode",
+ "opc-ua-keystore-key-password-required": "Adgangskode er påkrævet",
+ "opc-ua-mapping": "Tilknytning",
+ "add-opc-ua-mapping-prompt": "Tilføj tilknytning",
+ "opc-ua-mapping-type": "Tilknytningstype",
+ "opc-ua-mapping-type-required": "Tilknytningstype er påkrævet",
+ "opc-ua-device-node-pattern": "Enhedsknudemønster",
+ "opc-ua-device-node-pattern-required": "Enhedsknudemønster er påkrævet",
+ "opc-ua-namespace": "Namespace",
+ "opc-ua-add-map": "Tilføj tilknytningselement",
+ "kinesis-stream-name": "Streamnavn",
+ "kinesis-stream-name-required": "Streamnavn er påkrævet",
+ "kinesis-region": "Region",
+ "kinesis-region-required": "Region er påkrævet",
+ "kinesis-access-key-id": "Adgangsnøgle-id",
+ "kinesis-access-key-id-required": "Adgangsnøgle-id er påkrævet",
+ "kinesis-secret-access-key": "Hemmelig adgangsnøgle",
+ "kinesis-secret-access-key-required": "Hemmelig adgangsnøgle er påkrævet",
+ "kinesis-use-consumers-with-enhanced-fan-out": "Anvend forbrugere med forbedret Fan-Out",
+ "kinesis-use-credentials-from-instance-metadata": "Anvend brugeroplysninger fra Amazon EC2 Instance Metadata Service",
+ "kinesis-application-name": "Applikationsnavn (som standard lig med Streamnavn)",
+ "kinesis-initial-position-in-stream": "Startposition i stream",
+ "kinesis-initial-position-in-stream-required": "Startposition i stream påkrævet",
+ "kinesis-max-records": "Maks. poster",
+ "kinesis-max-records-required": "Maks. poster er påkrævet",
+ "kinesis-max-records-length-range": "Maks. længde for poster skal ligge i et område fra 1 til 10000",
+ "kinesis-request-timeout": "Anmodningstimeout i sekunder",
+ "kinesis-request-timeout-required": "Anmodningstimeout er påkrævet",
+ "other-properties": "Andre egenskaber",
+ "subscription-tags": "Abonnementstags",
+ "remove-subscription-tag": "Fjern abonnementstags",
+ "add-subscription-tag": "Tilføj abonnementstags",
+ "add-subscription-tag-prompt": "Tilføj venligst abonnementstags",
+ "key": "Nøgle",
+ "path": "Sti",
+ "required": "Påkrævet",
+ "integration-key": "Integrationsnøgle",
+ "copy-integration-key": "Kopiér integrationsnøgle",
+ "integration-key-copied-message": "Integrationsnøgle er blevet kopieret til udklipsholder",
+ "integration-secret": "Integration hemmelig",
+ "copy-integration-secret": "Kopiér integration hemmelig",
+ "integration-secret-copied-message": "Integration hemmelig er kopieret til udklipsholder",
+ "execute-remotely": "Fjernbetjent udførelse",
+ "handler-configuration": "Handler-konfiguration",
+ "handler-configuration-type": "Handler-type",
+ "so-broadcast": "Aktivér broadcast – integration accepterer adressepakker for broadcast",
+ "so-keepalive-option": "Muliggør afsendelse af keepalive-meddelelser på tilslutningsorienterede stik",
+ "so-reuse-addr": "Bind processen til en port",
+ "tcp-no-delay": "Tvinger et stik til at sende data uden buffer (deaktiver Nagle's bufferalgoritme)",
+ "fail-fast": "Undtagelse, når dekoderen bemærker, at rammelængden vil overstige maksimumstørrelse",
+ "strip-delimiter": "Fjern skilletegn",
+ "length-field-offset": "Feltforskydning for længde",
+ "length-field-offset-required": "Feltforskydning for længde er påkrævet.",
+ "length-field-offset-range": "Feltforskydning for længde skal ligge i et område fra 0 til 8.",
+ "length-field-length": "Længdefeltlængde",
+ "length-field-length-required": "Længdefeltlængde er påkrævet.",
+ "length-field-length-range": "Længdefeltlængde skal ligge i et område fra 0 til 8.",
+ "length-adjustment": "Længdejustering (kompenseringsværdien, der skal lægges til værdien af længdefeltet)",
+ "length-adjustment-required": "Længdejustering er påkrævet.",
+ "length-adjustment-range": "Længdejustering skal ligge i et område fra 0 til 8.",
+ "byte-order": "Byterækkefølge for længdefeltet",
+ "initial-bytes-to-strip": "Antal første bytes, der skal fjernes fra den afkodede ramme",
+ "initial-bytes-to-strip-required": "Antal første bytes, der skal fjernes fra den afkodede ramme, er påkrævet.",
+ "initial-bytes-to-strip-range": "Antal første bytes, der skal fjernes fra den afkodede ramme, skal ligge i området fra 0 til 8.",
+ "so-backlog-option": "Maks. antal ventende tilslutninger på stikket",
+ "so-backlog-option-required": "Maks. antal ventende tilslutninger på stikket er påkrævet.",
+ "so-backlog-option-range": "Maks. antal ventende tilslutninger på stikket skal ligge i området fra 1 til 65535.",
+ "so-rcv-buf": "Bufferens størrelse til indgående stik (i KB)",
+ "so-rcv-buf-required": "Bufferens størrelse til indgående stik (i KB) er påkrævet.",
+ "so-rcv-buf-range": "Bufferens størrelse til indgående stik (i KB) skal ligge i området fra 1 til 65535.",
+ "so-snd-buf": "Bufferens størrelse til udgående stik (i KB)",
+ "so-snd-buf-required": "Bufferens størrelse til udgående stik (i KB) er påkrævet.",
+ "so-snd-buf-range": "Bufferens størrelse til udgående stik (i KB) skal ligge i et område fra 1 til 65535.",
+ "charset-name": "Tegnsætnavn",
+ "charset-name-required": "Tegnsætnavn er påkrævet.",
+ "message-separator": "Meddelelsesseparator",
+ "message-separator-required": "Meddelelsesseparator er påkrævet.",
+ "character-sequence": "Tegnsekvens",
+ "character-sequence-required": "Tegnsekvens er påkrævet.",
+ "max-frame-length": "Maks. rammelængde (i bytes)",
+ "max-frame-length-required": "Maks. rammelængde (i bytes) er påkrævet.",
+ "max-frame-length-range": "Maks. rammelængde (i byte) skal ligge i området fra 1 til 65535.",
+ "handler-type": "Handler-type",
+ "message-size": "Meddelelsesstørrelse",
+ "message-size-required": "Meddelelsesstørrelse er påkrævet.",
+ "type-apache-pulsar": "Apache Pulsar",
+ "service-url": "Service-URL",
+ "service-url-required": "Service-URL er påkrævet.",
+ "subscription-name": "Abonnementsnavn",
+ "subscription-name-required": "Abonnementsnavn er påkrævet.",
+ "max-num-messages": "Maks. antal meddelelser",
+ "max-num-messages-required": "Maks. antal meddelelser er påkrævet.",
+ "max-num-bytes": "Maks. antal bytes",
+ "max-num-bytes-required": "Maks. antal bytes påkrævet.",
+ "timeout-in-ms": "Timeout i millisekunder",
+ "timeout-in-ms-required": "Timeout i millisekunder er påkrævet.",
+ "user-id": "Bruger-id",
+ "user-id-required": "Bruger-id er påkrævet.",
+ "token": "Token",
+ "token-required": "Token er påkrævet.",
+ "project-id": "Projekt-id",
+ "project-id-required": "Projekt-id er påkrævet.",
+ "subscription-id": "Abonnements-id",
+ "subscription-id-required": "Abonnements-id er påkrævet.",
+ "service-account-key": "Nøglefil til servicekonto",
+ "service-account-key-required": "Nøglefil til servicekonto er påkrævet.",
+ "tcp": {
+ "system-line-separator": "Systemlinjeseparator",
+ "nul-delimiter": "Nul-skilletegn",
+ "byte-order-little-endian": "Little Endian",
+ "byte-order-big-endian": "Big Endian"
+ },
+ "cache-size": "Cachestørrelse",
+ "cache-time-to-live": "Cache time-to-live i minutter",
+ "min-cache-size": "Cachestørrelse kan ikke være lavere 0",
+ "min-cache-time-to-live": "Cache time-to-live kan ikke være lavere 0",
+ "max-cache-time-to-live": "Ugyldigt cache time-to-live, vælg mellem 0 og 525600"
+ },
+ "item": {
+ "selected": "Valgt"
+ },
+ "js-func": {
+ "no-return-error": "Funktionen skal returnere værdi!",
+ "return-type-mismatch": "",
+ "tidy": "Tidy",
+ "mini": "Mini"
+ },
+ "key-val": {
+ "key": "Nøgle",
+ "value": "Værdi",
+ "remove-entry": "Fjern post",
+ "add-entry": "Tilføj post",
+ "no-data": "Ingen poster"
+ },
+ "layout": {
+ "layout": "Layout",
+ "manage": "Administrer layouts",
+ "settings": "Layoutindstillinger",
+ "color": "Farve",
+ "main": "Hoved",
+ "right": "Højre",
+ "select": "Vælg mållayout"
+ },
+ "legend": {
+ "direction": "Signaturforklaringens retning",
+ "position": "Signaturforklaringens placering",
+ "sort-legend": "Sortér datanøgler i signaturforklaring",
+ "show-max": "Vis maks. værdi",
+ "show-min": "Vis min. værdi",
+ "show-avg": "Vis gennemsnitsværdi",
+ "show-total": "Vis samlet værdi",
+ "settings": "Indstillinger for signaturforklaring",
+ "min": "min.",
+ "max": "maks.",
+ "avg": "gns.",
+ "total": "i alt",
+ "comparison-time-ago": {
+ "previousInterval": "(tidligere interval)",
+ "days": "(dag siden)",
+ "weeks": "(uge siden)",
+ "months": "(måned siden)",
+ "years": "(år siden)"
+ }
+ },
+ "login": {
+ "login": "Log på",
+ "request-password-reset": "Anmod om nulstilling af adgangskode",
+ "reset-password": "Nulstil adgangskode",
+ "create-password": "Opret adgangskode",
+ "passwords-mismatch-error": "De indtastede adgangskoder skal være ens!",
+ "password-again": "Gentag adgangskode",
+ "sign-in": "Log på",
+ "username": "Brugernavn (e-mail)",
+ "remember-me": "Husk mig",
+ "forgot-password": "Glemt adgangskode?",
+ "password-reset": "Nulstilling af adgangskode",
+ "expired-password-reset-message": "Dine brugeroplysninger er udløbet! Opret venligst en ny adgangskode.",
+ "new-password": "Ny adgangskode",
+ "new-password-again": "Gentag ny adgangskode",
+ "password-link-sent-message": "Link til nulstilling af adgangskode blev sendt!",
+ "email": "E-mail",
+ "no-account": "Har du ikke en konto?",
+ "create-account": "Opret en konto",
+ "login-with": "Log ind med din e-mail",
+ "or": "eller",
+ "error": "Login-fejl"
+ },
+ "signup": {
+ "firstname": "Fornavn",
+ "lastname": "Efternavn",
+ "email": "E-mail",
+ "signup": "Tilmeld",
+ "create-password": "Opret en adgangskode",
+ "repeat-password": "Gentag din adgangskode",
+ "have-account": "Har du allerede en konto?",
+ "signin": "Log på",
+ "no-captcha-message": "Du skal bekræfte, at du ikke er en robot",
+ "password-length-message": "Din adgangskode skal bestå af mindst 6 tegn",
+ "email-verification": "E-mailbekræftelse",
+ "email-verification-message": "Der er sendt en e-mail med bekræftelsesoplysninger til den angivne e-mailadresse. Følg instruktionerne i e-mailen for at fuldføre din tilmeldingsprocedure. Bemærk: Hvis du ikke har set e-mailen efter et stykke tid, skal du tjekke din 'spam'-mappe eller forsøge at sende e-mailen igen ved at klikke på knappen 'Send igen'.",
+ "account-activation-title": "Aktivering af konto",
+ "account-activated": "Kontoen er aktiveret!",
+ "account-activated-text": "Tillykke! Din konto er blevet aktiveret.",
+ "resend": "Send igen",
+ "inactive-user-exists-title": "Inaktiv bruger findes allerede",
+ "inactive-user-exists-text": "Der er allerede registreret en bruger med en ikke-bekræftet e-mailadresse. Klik på knappen \"Send igen\", hvis du ønsker at sende bekræftelses-e-mailen igen.",
+ "activating-account": "Aktiverer konto...",
+ "activating-account-text": "Din konto er i øjeblikket ved at blive aktiveret. Vent venligst...",
+ "accept-privacy-policy": "Accepter fortrolighedspolitik",
+ "accept": "Accepter",
+ "privacy-policy": "Fortrolighedspolitik"
+ },
+ "position": {
+ "top": "Top",
+ "bottom": "Bund",
+ "left": "Venstre",
+ "right": "Højre"
+ },
+ "profile": {
+ "profile": "Profil",
+ "last-login-time": "Sidste login",
+ "change-password": "Skift adgangskode",
+ "current-password": "Nuværende adgangskode"
+ },
+ "relation": {
+ "relations": "Relationer",
+ "direction": "Retning",
+ "search-direction": {
+ "FROM": "Fra",
+ "TO": "Til"
+ },
+ "direction-type": {
+ "FROM": "fra",
+ "TO": "til"
+ },
+ "from-relations": "Udgående relationer",
+ "to-relations": "Indgående relationer",
+ "selected-relations": "",
+ "type": "Type",
+ "to-entity-type": "Til entitetstype",
+ "to-entity-name": "Til entitetsnavn",
+ "from-entity-type": "Fra entitetstype",
+ "from-entity-name": "Fra entitetsnavn",
+ "to-entity": "Til entitet",
+ "from-entity": "Fra entitet",
+ "delete": "Slet relation",
+ "relation-type": "Relationstype",
+ "relation-type-required": "Relationstype er påkrævet.",
+ "any-relation-type": "Enhver type",
+ "add": "Tilføj relation",
+ "edit": "Rediger relation",
+ "delete-to-relation-title": "",
+ "delete-to-relation-text": "",
+ "delete-to-relations-title": "",
+ "delete-to-relations-text": "Vær forsigtig. Efter bekræftelsen vil alle valgte relationer blive fjernet, og tilsvarende entiteter vil ikke være relaterede til den aktuelle entitet.",
+ "delete-from-relation-title": "",
+ "delete-from-relation-text": "",
+ "delete-from-relations-title": "",
+ "delete-from-relations-text": "Vær forsigtig. Efter bekræftelsen vil alle valgte relationer blive fjernet, og den aktuelle entitet vil ikke være relateret til de tilsvarende entiteter.",
+ "remove-relation-filter": "Fjern relationsfilter",
+ "add-relation-filter": "Tilføj relationsfilter",
+ "any-relation": "Enhver relation",
+ "relation-filters": "Relationsfiltre",
+ "additional-info": "Yderligere info (JSON)",
+ "invalid-additional-info": "Kan ikke parse yderligere info-json.",
+ "no-relations-text": "Ingen relationer fundet"
+ },
+ "rulechain": {
+ "rulechain": "Regelkæde",
+ "rulechains": "Regelkæder",
+ "root": "Rod",
+ "delete": "Slet regelkæde",
+ "name": "Navn",
+ "name-required": "Navn er påkrævet.",
+ "description": "Beskrivelse",
+ "add": "Tilføj regelkæde",
+ "set-root": "Lav regelkæde for rod",
+ "set-root-rulechain-title": "",
+ "set-root-rulechain-text": "Efter bekræftelsen vil regelkæden være rod og håndtere alle indgående transportmeddelelser.",
+ "delete-rulechain-title": "",
+ "delete-rulechain-text": "Vær forsigtig. Efter bekræftelsen vil regelkæden og alle relaterede data være uoprettelige.",
+ "delete-rulechains-title": "",
+ "delete-rulechains-action-title": "",
+ "delete-rulechains-text": "Vær forsigtig. Efter bekræftelsen vil alle valgte regelkæder blive fjernet, og alle relaterede data vil være uoprettelige.",
+ "add-rulechain-text": "Tilføj ny regelkæde",
+ "no-rulechains-text": "Ingen regelkæder fundet",
+ "rulechain-details": "Oplysninger om regelkæde",
+ "details": "Oplysninger",
+ "events": "Begivenheder",
+ "system": "System",
+ "import": "Importér regelkæde",
+ "export": "Eksportér regelkæde",
+ "export-failed-error": "",
+ "create-new-rulechain": "Opret ny regelkæde",
+ "rulechain-file": "Regelkædefil",
+ "invalid-rulechain-file-error": "Regelkæden kunne ikke importeres: Ugyldig datastruktur for regelkæde.",
+ "copyId": "Kopiér regelkæde-id",
+ "idCopiedMessage": "Regelkæde-id er blevet kopieret til udklipsholder",
+ "select-rulechain": "Vælg regelkæde",
+ "no-rulechains-matching": "",
+ "rulechain-required": "Regelkæde er påkrævet",
+ "management": "Regelstyring",
+ "debug-mode": "Debug-tilstand",
+ "search": "Søg efter regelkæder",
+ "selected-rulechains": "",
+ "open-rulechain": "Åbn regelkæde"
+ },
+ "rulenode": {
+ "details": "Oplysninger",
+ "events": "Begivenheder",
+ "search": "Søg efter knuder",
+ "open-node-library": "Åbn knudebibliotek",
+ "add": "Tilføj regelknude",
+ "name": "Navn",
+ "name-required": "Navn er påkrævet.",
+ "type": "Type",
+ "description": "Beskrivelse",
+ "delete": "Slet regelknude",
+ "select-all-objects": "Vælg alle knuder og tilslutninger",
+ "deselect-all-objects": "Fravælg alle knuder og tilslutninger",
+ "delete-selected-objects": "Slet valgte knuder og tilslutninger",
+ "delete-selected": "Slet valgte",
+ "select-all": "Vælg alle",
+ "copy-selected": "Kopiér valgte",
+ "deselect-all": "Fravælg alle",
+ "rulenode-details": "Oplysninger om regelknude",
+ "debug-mode": "Debug-tilstand",
+ "configuration": "Konfiguration",
+ "link": "Link",
+ "link-details": "Oplysninger om regelknudelink",
+ "add-link": "Tilføj link",
+ "link-label": "Link-etiket",
+ "link-label-required": "Link-etiket er påkrævet.",
+ "custom-link-label": "Brugerdefineret link-etiket",
+ "custom-link-label-required": "Brugerdefineret link-etiket er påkrævet.",
+ "link-labels": "Link-etiketter",
+ "link-labels-required": "Link-etiketter er påkrævet.",
+ "no-link-labels-found": "Ingen link-etiketter fundet",
+ "no-link-label-matching": "",
+ "create-new-link-label": "Opret en ny!",
+ "type-filter": "Filter",
+ "type-filter-details": "Filtrer indgående meddelelser med konfigurerede betingelser",
+ "type-enrichment": "Berigelse",
+ "type-enrichment-details": "Tilføj yderligere oplysninger i meddelelsesmetadata",
+ "type-transformation": "Omdannelse",
+ "type-transformation-details": "Skift meddelelsesdata og metadata",
+ "type-action": "Handling",
+ "type-action-details": "Gennemfør ekstrahandling",
+ "type-analytics": "Analytik",
+ "type-analytics-details": "Udfør analyse af streamede eller vedvarende data",
+ "type-external": "Ekstern",
+ "type-external-details": "Interagerer med eksternt system",
+ "type-rule-chain": "Regelkæde",
+ "type-rule-chain-details": "Videresender indgående meddelelser til specificeret regelkæde",
+ "type-input": "Input",
+ "type-input-details": "Logisk input af regelkæde, videresender indgående meddelelser til næste relaterede regelknude",
+ "type-unknown": "Ukendt",
+ "type-unknown-details": "Uløst regelknude",
+ "directive-is-not-loaded": "",
+ "ui-resources-load-error": "Kunne ikke indlæse konfigurations-UI-ressourcer.",
+ "invalid-target-rulechain": "Kan ikke løse målregelkæde!",
+ "test-script-function": "Testscriptfunktion",
+ "message": "Meddelelse",
+ "message-type": "Meddelelsestype",
+ "select-message-type": "Vælg meddelelsestype",
+ "message-type-required": "Meddelelsestype er påkrævet",
+ "metadata": "Metadata",
+ "metadata-required": "Metadataposter må ikke være tomme.",
+ "output": "Output",
+ "test": "Test",
+ "help": "Hjælp",
+ "reset-debug-mode": "Nulstil debug-tilstand i alle knuder"
+ },
+ "role": {
+ "role": "Rolle",
+ "roles": "Roller",
+ "management": "Rollestyring",
+ "view-roles": "Vis roller",
+ "no-roles-matching": "",
+ "role-list": "Rolleliste",
+ "add": "Tilføj rolle",
+ "view": "Vis rolle",
+ "search": "Søg efter roller",
+ "selected-roles": "",
+ "no-roles-text": "Ingen roller fundet",
+ "role-details": "Rolleoplysninger",
+ "add-role-text": "Tilføj ny rolle",
+ "delete": "Slet rolle",
+ "delete-roles": "Slet roller",
+ "delete-role-title": "",
+ "delete-role-text": "Vær forsigtig. Efter bekræftelsen vil rollen og alle relaterede data være uoprettelige.",
+ "delete-roles-title": "",
+ "delete-roles-action-title": "",
+ "delete-roles-text": "Vær forsigtig. Efter bekræftelsen vil alle valgte roller blive fjernet, og alle relaterede data vil være uoprettelige.",
+ "role-type": "Rolletype",
+ "role-type-required": "Rolletype er påkrævet.",
+ "select-role-type": "Vælg rolletype",
+ "enter-role-type": "Indtast rolletype",
+ "any-role": "Enhver rolle",
+ "no-role-types-matching": "",
+ "role-type-list-empty": "Ingen rolletyper valgt.",
+ "role-types": "Rolletyper",
+ "created-time": "Oprettelsestidspunkt",
+ "name": "Navn",
+ "name-required": "Navn er påkrævet.",
+ "description": "Beskrivelse",
+ "events": "Begivenheder",
+ "details": "Oplysninger",
+ "copyId": "Kopiér rolle-id",
+ "idCopiedMessage": "Rolle-id er blevet kopieret til udklipsholder",
+ "permissions": "Tilladelser",
+ "role-required": "Rolle påkrævet",
+ "roles-required": "Roller påkrævet",
+ "display-type": {
+ "GENERIC": "Generisk",
+ "GROUP": "Gruppe"
+ }
+ },
+ "group-permission": {
+ "user-group-roles": "Brugergrupperoller",
+ "entity-group-permissions": "Tilladelser for entitetsgruppe",
+ "role-type": "Rolletype",
+ "role-name": "Rollenavn",
+ "group-type": "Gruppetype",
+ "group-name": "Gruppenavn",
+ "group-owner": "Gruppeejer",
+ "user-group-name": "Brugergruppenavn",
+ "user-group-owner": "Brugergruppeejer",
+ "edit": "Rediger tilladelser",
+ "delete": "Slet tilladelser",
+ "selected-group-permissions": "",
+ "delete-group-permission-title": "",
+ "delete-group-permission-text": "Vær forsigtig. Efter bekræftelsen vil gruppetilladelsen og alle relaterede data være uoprettelige.",
+ "delete-group-permission": "Slet gruppetilladelse",
+ "delete-group-permissions-title": "",
+ "delete-group-permissions-text": "Vær forsigtig. Efter bekræftelsen vil alle valgte gruppetilladelser blive fjernet, og tilsvarende brugere vil miste adgang til specificerede ressourcer.",
+ "delete-group-permissions": "Slet gruppetilladelser",
+ "add-group-permission": "Tilføj gruppetilladelse",
+ "edit-group-permission": "Rediger gruppetilladelse",
+ "entity-group": "Entitetsgruppe",
+ "user-group": "Brugergruppe",
+ "no-owners-matching": "",
+ "target-owner-required": "Entitetsgruppeejer er påkrævet.",
+ "target-user-group-owner-required": "Brugergruppeejer er påkrævet.",
+ "no-group-permissions-text": "Ingen gruppetilladelser fundet"
+ },
+ "permission": {
+ "permissions-required": "Mindst én tilladelsespost skal angives.",
+ "remove-permission": "Fjern tilladelsespost",
+ "add-permission": "Tilføj tilladelsespost",
+ "other": "Andet",
+ "resource": {
+ "resource": "Ressource",
+ "select-resource": "Vælg ressource",
+ "resource-required": "Ressource er påkrævet",
+ "no-resources-matching": "",
+ "display-type": {
+ "ALL": "Alle",
+ "PROFILE": "Profil",
+ "ADMIN_SETTINGS": "Admin-indstillinger",
+ "ALARM": "Alarm",
+ "DEVICE": "Enhed",
+ "DEVICE_PROFILE": "Enhedsprofil",
+ "ASSET": "Aktiv",
+ "CUSTOMER": "Kunde",
+ "DASHBOARD": "Dashboard",
+ "ENTITY_VIEW": "Entitetsvisning",
+ "TENANT": "Lejer",
+ "TENANT_PROFILE": "Lejerprofil",
+ "RULE_CHAIN": "Regelkæde",
+ "USER": "Bruger",
+ "WIDGETS_BUNDLE": "Widgets-bundt",
+ "WIDGET_TYPE": "Widget-type",
+ "CONVERTER": "Omformer",
+ "INTEGRATION": "Integration",
+ "SCHEDULER_EVENT": "Planlægningsbegivenheder",
+ "BLOB_ENTITY": "Blob-entitet",
+ "CUSTOMER_GROUP": "Kundegruppe",
+ "DEVICE_GROUP": "Enhedsgruppe",
+ "ASSET_GROUP": "Aktivgruppe",
+ "USER_GROUP": "Brugergruppe",
+ "ENTITY_VIEW_GROUP": "Entitetsvisningsgruppe",
+ "DASHBOARD_GROUP": "Dashboardgruppe",
+ "ROLE": "Rolle",
+ "GROUP_PERMISSION": "Gruppetilladelse",
+ "WHITE_LABELING": "Hvid mærkning",
+ "AUDIT_LOG": "Auditlog",
+ "API_USAGE_STATE": "API-brugstilstand"
+ }
+ },
+ "operation": {
+ "operation": "Driftsopgave",
+ "operations": "Driftsopgaver",
+ "operations-required": "Der skal angives mindst én driftsopgave.",
+ "enter-operation": "Indtast driftsopgave.",
+ "no-operations-matching": "",
+ "display-type": {
+ "ALL": "Alle",
+ "CREATE": "Opret",
+ "READ": "Læs",
+ "WRITE": "Skriv",
+ "DELETE": "Slet",
+ "ASSIGN_TO_CUSTOMER": "Tildel til kunde",
+ "UNASSIGN_FROM_CUSTOMER": "Fjern tildeling fra kunde",
+ "RPC_CALL": "RPC-opkald",
+ "READ_CREDENTIALS": "Læs brugeroplysninger",
+ "WRITE_CREDENTIALS": "Skriv brugeroplysninger",
+ "READ_ATTRIBUTES": "Læs attributter",
+ "WRITE_ATTRIBUTES": "Skriv attributter",
+ "READ_TELEMETRY": "Læs telemetri",
+ "WRITE_TELEMETRY": "Skriv telemetri",
+ "CLAIM_DEVICES": "Gør krav på enheder",
+ "IMPERSONATE": "Efterlign",
+ "CHANGE_OWNER": "Skift ejer",
+ "ADD_TO_GROUP": "Tilføj til gruppe",
+ "REMOVE_FROM_GROUP": "Fjern fra gruppe",
+ "SHARE_GROUP": "Del gruppe",
+ "ASSIGN_TO_TENANT": "Tildel til lejer"
+ }
+ }
+ },
+ "scheduler": {
+ "scheduler": "Planlægger",
+ "scheduler-event": "Planlægningsbegivenhed",
+ "select-scheduler-event": "Vælg planlægningsbegivenhed",
+ "no-scheduler-events-matching": "",
+ "scheduler-event-required": "Planlægningsbegivenhed er påkrævet",
+ "management": "Tidsplansstyring",
+ "scheduler-events": "Planlægningsbegivenheder",
+ "add-scheduler-event": "Tilfjøj planlægningsbegivenhed",
+ "search-scheduler-events": "Søg efter planlægningsbegivenheder",
+ "created-time": "Oprettelsestidspunkt",
+ "name": "Navn",
+ "type": "Type",
+ "created_customer": "Oprettet af kunde",
+ "edit-scheduler-event": "Rediger planlægningsbegivenhed",
+ "view-scheduler-event": "Vis planlægningsbegivenhed",
+ "delete-scheduler-event": "Slet planlægningsbegivenhed",
+ "no-scheduler-events": "Ingen planlægningsbegivenheder fundet",
+ "selected-scheduler-events": "",
+ "delete-scheduler-event-title": "",
+ "delete-scheduler-event-text": "Vær forsigtig. Efter bekræftelsen vil planlægningsbegivenheden og alle relaterede data være uoprettelige.",
+ "delete-scheduler-events-title": "",
+ "delete-scheduler-events-text": "Vær forsigtig. Efter bekræftelsen vil alle valgte planlægningsbegivenheder blive fjernet, og alle relaterede data vil være uoprettelige.",
+ "create": "Opret planlægningsbegivenhed",
+ "edit": "Rediger planlægningsbegivenhed",
+ "view": "Vis planlægningsbegivenhed",
+ "name-required": "Navn er påkrævet.",
+ "configuration": "Konfiguration",
+ "schedule": "Tidsplan",
+ "start-time": "Starttid",
+ "repeat": "Gentag",
+ "repeats": "Gentagelser",
+ "daily": "Daglig",
+ "weekly": "Ugentlig",
+ "monthly": "Månedlig",
+ "yearly": "Årlig",
+ "timer": "Timerbaseret",
+ "repeats-required": "Gentagelser er påkrævet.",
+ "repeat-on": "Gentag den",
+ "repeat-every": "Gentag hver",
+ "ends-on": "Slutter den",
+ "sunday-label": "L",
+ "monday-label": "M",
+ "tuesday-label": "T",
+ "wednesday-label": "O",
+ "thursday-label": "T",
+ "friday-label": "F",
+ "saturday-label": "L",
+ "repeat-on-sunday": "Gentag på søndag",
+ "repeat-on-monday": "Gentag på mandag",
+ "repeat-on-tuesday": "Gentag på tirsdag",
+ "repeat-on-wednesday": "Gentag på onsdag",
+ "repeat-on-thursday": "Gentag på torsdag",
+ "repeat-on-friday": "Gentag på fredag",
+ "repeat-on-saturday": "Gentag på lørdag",
+ "event-type": "Begivenhedstype",
+ "select-event-type": "Vælg begivenhedstype",
+ "event-type-required": "Begivenhedstype er påkrævet.",
+ "list-mode": "Listevisning",
+ "calendar-mode": "Kalendervisning",
+ "calendar-view-type": "Kalendervisningstype",
+ "month": "Måned",
+ "week": "Uge",
+ "day": "Dag",
+ "agenda-week": "Program for uge",
+ "agenda-day": "Program for dag",
+ "list-year": "Liste for år",
+ "list-month": "Liste for måned",
+ "list-week": "Liste for uge",
+ "list-day": "Liste for dag",
+ "today": "I dag",
+ "navigate-before": "Naviger før",
+ "navigate-next": "Naviger næste",
+ "starting-from": "Starter fra",
+ "until": "til og med",
+ "on": "den",
+ "sunday": "Søndag",
+ "monday": "Mandag",
+ "tuesday": "Tirsdag",
+ "wednesday": "Onsdag",
+ "thursday": "Torsdag",
+ "friday": "Fredag",
+ "saturday": "Lørdag",
+ "originator": "Ophavsmand",
+ "single-entity": "Enkelt entitet",
+ "group-of-entities": "Gruppe af entiteter",
+ "entities-group-owner": "Ejer af gruppe af entiteter",
+ "single-device": "Enkelt enhed",
+ "group-of-devices": "Gruppe af enheder",
+ "devices-group-owner": "Ejer af gruppe af enheder",
+ "message-body": "Meddelelsestekst",
+ "target": "Mål",
+ "rpc-method": "Metode",
+ "rpc-method-required": "Metode er påkrævet",
+ "rpc-params": "Parametre",
+ "select-dashboard-state": "Vælg dashboardtilstand",
+ "hours": "Timer",
+ "minutes": "Minutter",
+ "seconds": "Sekunder",
+ "time-interval-required": "Tidsinterval er påkrævet",
+ "time-unit-required": "Tidsenhed er påkrævet",
+ "every-hour": "",
+ "every-minute": "",
+ "every-second": ""
+ },
+ "report": {
+ "report-config": "Rapportkonfiguration",
+ "email-config": "E-mailkonfiguration",
+ "dashboard-state-param": "Parameterværdi for dashboardtilstand",
+ "base-url": "Basis-URL",
+ "base-url-required": "Basis-URL er påkrævet.",
+ "use-dashboard-timewindow": "Brug dashboardtidsvindue",
+ "timewindow": "Tidsvindue",
+ "name-pattern": "Rapportnavnsmønster",
+ "name-pattern-required": "Rapportnavnsmønster er påkrævet",
+ "type": "Rapporttype",
+ "use-current-user-credentials": "Brug aktuelle brugeroplysninger",
+ "customer-user-credentials": "Kundens brugeroplysninger",
+ "customer-user-credentials-required": "Kundens brugeroplysninger er påkrævet",
+ "generate-test-report": "Generer testrapport",
+ "send-email": "Send e-mail",
+ "from": "Fra",
+ "from-required": "Fra er påkrævet.",
+ "to": "Til",
+ "to-required": "Til er påkrævet.",
+ "cc": "Cc",
+ "bcc": "Bcc",
+ "subject": "Emne",
+ "subject-required": "Emne er påkrævet.",
+ "body": "Tekst",
+ "body-required": "Tekst er påkrævet."
+ },
+ "blob-entity": {
+ "blob-entity": "Blob-entitet",
+ "select-blob-entity": "Vælg blob-entitet",
+ "no-blob-entities-matching": "",
+ "blob-entity-required": "Blob-entitet er påkrævet",
+ "files": "Filer",
+ "search": "Søg efter filer",
+ "clear-search": "Ryd søgning",
+ "no-blob-entities-prompt": "Ingen filer fundet",
+ "report": "Rapport",
+ "created-time": "Oprettelsestidspunkt",
+ "name": "Navn",
+ "type": "Type",
+ "created_customer": "Oprettet af kunde",
+ "selected-blob-entities": "",
+ "download-blob-entity": "Download fil",
+ "delete-blob-entity": "Slet fil",
+ "delete-blob-entity-title": "",
+ "delete-blob-entity-text": "Vær forsigtig. Efter bekræftelsen vil fildata være uoprettelige.",
+ "delete-blob-entities-title": "",
+ "delete-blob-entities-text": "Vær forsigtig. Efter bekræftelsen vil alle valgte filer blive fjernet, og alle relaterede data vil være uoprettelige."
+ },
+ "timezone": {
+ "timezone": "Tidszone",
+ "select-timezone": "Vælg tidszone",
+ "no-timezones-matching": "",
+ "timezone-required": "Tidszone er påkrævet.",
+ "browser-time": "Browsertid"
+ },
+ "queue": {
+ "select_name": "Vælg kønavn",
+ "name": "Kønavn",
+ "name_required": "Kønavn er påkrævet."
+ },
+ "tenant": {
+ "tenant": "Lejer",
+ "tenants": "Lejere",
+ "management": "Administration af lejer",
+ "add": "Tilføj lejer",
+ "admins": "Admin.",
+ "manage-tenant-admins": "Administrer lejeradmin.",
+ "delete": "Slet lejer",
+ "add-tenant-text": "Tilføj ny lejer",
+ "no-tenants-text": "Ingen lejere fundet",
+ "tenant-details": "Lejeroplysninger",
+ "delete-tenant-title": "",
+ "delete-tenant-text": "Vær forsigtig. Efter bekræftelsen vil lejeren og alle relaterede data være uoprettelige.",
+ "delete-tenants-title": "",
+ "delete-tenants-action-title": "",
+ "delete-tenants-text": "Vær forsigtig. Efter bekræftelsen vil alle valgte lejere blive fjernet, og alle relaterede data vil være uoprettelige.",
+ "title": "Titel",
+ "title-required": "Titel er påkrævet.",
+ "description": "Beskrivelse",
+ "details": "Oplysninger",
+ "events": "Begivenheder",
+ "copyId": "Kopiér lejer-id",
+ "idCopiedMessage": "Lejer-id er blevet kopieret til udklipsholder",
+ "select-tenant": "Vælg lejer",
+ "no-tenants-matching": "",
+ "tenant-required": "Lejer er påkrævet",
+ "selected-tenants": "",
+ "search": "Søg efter lejere",
+ "allow-white-labeling": "Tillad hvid mærkning",
+ "allow-customer-white-labeling": "Tillad hvid mærkning af kunder",
+ "isolated-tb-core": "Behandling i isoleret ThingsBoard Core-beholder",
+ "isolated-tb-rule-engine": "Behandling i isoleret ThingsBoard regelmotor-beholder",
+ "isolated-tb-core-details": "Kræver separat(e) microserviceydelse(r) pr. isoleret lejer",
+ "isolated-tb-rule-engine-details": "Kræver separat(e) microserviceydelse(r) pr. isoleret lejer"
+ },
+ "tenant-profile": {
+ "tenant-profile": "Lejerprofil",
+ "tenant-profiles": "Lejerprofiler",
+ "add": "Tilføj lejerprofil",
+ "edit": "Rediger lejerprofil",
+ "tenant-profile-details": "Oplysninger om lejerprofil",
+ "no-tenant-profiles-text": "Ingen lejerprofiler fundet",
+ "search": "Søg efter lejerprofiler",
+ "selected-tenant-profiles": "",
+ "no-tenant-profiles-matching": "",
+ "tenant-profile-required": "Lejerprofil er påkrævet",
+ "idCopiedMessage": "Lejerprofil-id er blevet kopieret til udklipsholder",
+ "set-default": "Gør lejerprofil til standard",
+ "delete": "Slet lejerprofil",
+ "copyId": "Kopiér lejerprofil-id",
+ "name": "Navn",
+ "name-required": "Navn er påkrævet.",
+ "data": "Profildata",
+ "profile-configuration": "Profilkonfiguration",
+ "description": "Beskrivelse",
+ "default": "Standard",
+ "delete-tenant-profile-title": "",
+ "delete-tenant-profile-text": "Vær forsigtig. Efter bekræftelsen vil lejerprofilen og alle relaterede data være uoprettelige.",
+ "delete-tenant-profiles-title": "",
+ "delete-tenant-profiles-text": "Vær forsigtig. Efter bekræftelsen vil alle valgte lejerprofiler blive fjernet, og alle relaterede data vil være uoprettelige.",
+ "set-default-tenant-profile-title": "",
+ "set-default-tenant-profile-text": "Efter bekræftelsen vil lejerprofilen blive markeret som standard og vil blive brugt til nye lejere, hvor der ikke er angivet nogen profil.",
+ "no-tenant-profiles-found": "Ingen lejerprofiler fundet.",
+ "create-new-tenant-profile": "Opret en ny!",
+ "maximum-devices": "Maks. antal enheder (0 – ubegrænset)",
+ "maximum-devices-required": "Maks. antal enheder er påkrævet.",
+ "maximum-devices-range": "Min. antal enheder kan ikke være negativt",
+ "maximum-assets": "Maks. antal aktiver (0 – ubegrænset)",
+ "maximum-assets-required": "Maks. antal aktiver er påkrævet.",
+ "maximum-assets-range": "Maks. antal aktiver kan ikke være negativt",
+ "maximum-customers": "Maks. antal kunder (0 – ubegrænset)",
+ "maximum-customers-required": "Maks. antal kunder er påkrævet.",
+ "maximum-customers-range": "Maks. antal kunder kan ikke være negativt",
+ "maximum-users": "Maks. antal brugere (0 – ubegrænset)",
+ "maximum-users-required": "Maks. antal brugere er påkrævet.",
+ "maximum-users-range": "Maks. antal brugere kan ikke være negativt",
+ "maximum-dashboards": "Maks. antal dashboards (0 – ubegrænset)",
+ "maximum-dashboards-required": "Maks. antal dashboards er påkrævet.",
+ "maximum-dashboards-range": "Maks. antal dashboards kan ikke være negativt",
+ "maximum-rule-chains": "Maks. antal regelkæder (0 – ubegrænset)",
+ "maximum-rule-chains-required": "Maks. antal regelkæder er påkrævet.",
+ "maximum-rule-chains-range": "Maks. antal regelkæder kan ikke være negativt",
+ "maximum-integrations": "Maks. antal integrationer (0 – ubegrænset)",
+ "maximum-integrations-required": "Maks. antal integrationer er påkrævet.",
+ "maximum-integrations-range": "Maks. antal integrationer kan ikke være negativt",
+ "maximum-converters": "Maks. antal omformere (0 – ubegrænset)",
+ "maximum-converters-required": "Maks. antal omformere er påkrævet.",
+ "maximum-converters-range": "Maks. antal omformere kan ikke være negativt",
+ "maximum-scheduler-events": "Maks. antal planlægningsbegivenheder (0 – ubegrænset)",
+ "maximum-scheduler-events-required": "Maks. antal planlægningsbegivenheder er påkrævet.",
+ "maximum-scheduler-events-range": "Maks. antal planlægningsbegivenheder kan ikke være negativt",
+ "transport-tenant-msg-rate-limit": "Hastighedsgrænse for transport af lejermeddelelser.",
+ "transport-tenant-telemetry-msg-rate-limit": "Hastighedsgrænse for transport af lejertelemetrimeddelelser.",
+ "transport-tenant-telemetry-data-points-rate-limit": "Hastighedsgrænse for transport af lejertelemetridatapunkter.",
+ "transport-device-msg-rate-limit": "Hastighedsgrænse for transport af enhedsmeddelelser.",
+ "transport-device-telemetry-msg-rate-limit": "Hastighedsgrænse for transport af enhedstelemetrimeddelelser.",
+ "transport-device-telemetry-data-points-rate-limit": "Hastighedsgrænse for transport af enhedstelemetridatapunkter.",
+ "max-transport-messages": "Maks. antal transportmeddelelser (0 – ubegrænset)",
+ "max-transport-messages-required": "Maks. antal transportmeddelelser er påkrævet.",
+ "max-transport-messages-range": "Maks. antal transportmeddelelser kan ikke være negativt",
+ "max-transport-data-points": "Maks. antal transportdatapunkter (0 – ubegrænset)",
+ "max-transport-data-points-required": "Maks. antal transportdatapunkter er påkrævet.",
+ "max-transport-data-points-range": "Maks. antal transportdatapunkter kan ikke være negativt",
+ "max-r-e-executions": "Maks. antal regelmotor-udførelser (0 – ubegrænset)",
+ "max-r-e-executions-required": "Maks. antal regelmotor-udførelser er påkrævet.",
+ "max-r-e-executions-range": "Maks. antal regelmotor-udførelser kan ikke være negativt",
+ "max-j-s-executions": "Maks. antal JavaScript-udførelser (0 – ubegrænset)",
+ "max-j-s-executions-required": "Maks. antal JavaScript-udførelser er påkrævet.",
+ "max-j-s-executions-range": "Maks. antal JavaScript-udførelser kan ikke være negativt",
+ "max-d-p-storage-days": "Maks. antal lagringsdage for datapunkter (0 – ubegrænset)",
+ "max-d-p-storage-days-required": "Maks. antal lagringsdage for datapunkter er påkrævet.",
+ "max-d-p-storage-days-range": "Maks. antal lagringsdage for datapunkter kan ikke være negativt",
+ "default-storage-ttl-days": "Standard lagringsdage for TTL (0 – ubegrænset)",
+ "default-storage-ttl-days-required": "Standard lagringsdage for TTL er påkrævet.",
+ "default-storage-ttl-days-range": "Standard lagringsdage for TTL kan ikke være negative",
+ "max-rule-node-executions-per-message": "Maks. antal regelknudeudførelser pr. meddelelse (0 – ubegrænset)",
+ "max-rule-node-executions-per-message-required": "Maks. antal regelknudeudførelser pr. meddelelse er påkrævet.",
+ "max-rule-node-executions-per-message-range": "Maks. antal regelknudeudførelser pr. meddelelse kan ikke være negativt",
+ "max-emails": "Maks. antal sendte e-mails (0 – ubegrænset)",
+ "max-emails-required": "Maks. antal sendte e-mails er påkrævet.",
+ "max-emails-range": "Maks. antal sendte e-mails kan ikke være negativt",
+ "max-sms": "Maks. antal sendte SMS'er (0 – ubegrænset)",
+ "max-sms-required": "Maks. antal sendte SMS'er er påkrævet.",
+ "max-sms-range": "Maks. antal sendte SMS'er kan ikke være negativt"
+ },
+ "timeinterval": {
+ "seconds-interval": "{ seconds, plural, 1 {1 sekund} other {# sekunder} }",
+ "minutes-interval": "{ minutes, plural, 1 {1 minut} other {# minutter} }",
+ "hours-interval": "{ hours, plural, 1 {1 time} other {# timer} }",
+ "days-interval": "{ days, plural, 1 {1 dag} other {# dage} }",
+ "days": "Dage",
+ "hours": "Timer",
+ "minutes": "Minutter",
+ "seconds": "Sekunder",
+ "advanced": "Fremskreden",
+ "predefined": {
+ "yesterday": "I går",
+ "day-before-yesterday": "Dagen før i går",
+ "this-day-last-week": "Denne dag i sidste uge",
+ "previous-week": "Forrige uge (søn – lør)",
+ "previous-week-iso": "Forrige uge (man – søn)",
+ "previous-month": "Forrige måned",
+ "previous-year": "Forrige år",
+ "current-hour": "Aktuel time",
+ "current-day": "Aktuel dag",
+ "current-day-so-far": "Aktuel dag indtil nu",
+ "current-week": "Aktuel uge (søn – lør)",
+ "current-week-iso": "Aktuel uge (man – søn)",
+ "current-week-so-far": "Aktuel uge indtil videre (søn – lør)",
+ "current-week-iso-so-far": "Aktuel uge indtil videre (man– søn)",
+ "current-month": "Aktuel måned",
+ "current-month-so-far": "Aktuel måned indtil nu",
+ "current-year": "Aktuelt år",
+ "current-year-so-far": "Aktuelt år indtil nu"
+ }
+ },
+ "timeunit": {
+ "seconds": "Sekunder",
+ "minutes": "Minutter",
+ "hours": "Timer",
+ "days": "Dage"
+ },
+ "timewindow": {
+ "days": "{ days, plural, 1 { dag } other {# dage } }",
+ "hours": "{ hours, plural, 0 { time } 1 {1 time } other {# timer } }",
+ "minutes": "{ minutes, plural, 0 { minut } 1 {1 minut } other {# minutter } }",
+ "seconds": "{ seconds, plural, 0 { sekund } 1 {1 sekund } other {# sekunder } }",
+ "realtime": "Realtid",
+ "history": "Historie",
+ "last-prefix": "sidst",
+ "period": "fra {{ startTime }} til {{ endTime }}",
+ "edit": "Rediger tidsvindue",
+ "date-range": "Datointerval",
+ "last": "Sidst",
+ "time-period": "Tidsperiode",
+ "hide": "Skjul",
+ "interval": "Interval"
+ },
+ "user": {
+ "user": "Bruger",
+ "users": "Brugere",
+ "management": "Brugeradministration",
+ "customer-users": "Kundebrugere",
+ "tenant-admins": "Lejeradmin.",
+ "sys-admin": "Systemadministrator",
+ "tenant-admin": "Bruger",
+ "customer": "Kunde",
+ "anonymous": "Anonym",
+ "add": "Tilføj bruger",
+ "delete": "Slet bruger",
+ "add-user-text": "Tilføj ny bruger",
+ "no-users-text": "Ingen brugere fundet",
+ "user-details": "Brugerdetaljer",
+ "delete-users": "Slet brugere",
+ "delete-user-title": "",
+ "delete-user-text": "Vær forsigtig. Efter bekræftelsen vil brugeren og alle relaterede data være uoprettelige.",
+ "delete-users-title": "",
+ "delete-users-action-title": "",
+ "delete-users-text": "Vær forsigtig. Efter bekræftelsen vil alle valgte brugere blive fjernet, og alle relaterede data vil være uoprettelige.",
+ "activation-email-sent-message": "Aktiverings-e-mail blev sendt!",
+ "resend-activation": "Gensend aktivering",
+ "email": "E-mail",
+ "email-required": "E-mail er påkrævet.",
+ "invalid-email-format": "Ugyldigt e-mailformat.",
+ "first-name": "Fornavn",
+ "last-name": "Efternavn",
+ "description": "Beskrivelse",
+ "default-dashboard": "Standard dashboard",
+ "always-fullscreen": "Altid fuld skærm",
+ "select-user": "Vælg bruger",
+ "no-users-matching": "",
+ "user-required": "Bruger er påkrævet",
+ "activation-method": "Aktiveringsmetode",
+ "display-activation-link": "Vis aktiveringslink",
+ "send-activation-mail": "Send aktiverings-e-mail",
+ "activation-link": "Link til brugeraktivering",
+ "activation-link-text": "",
+ "copy-activation-link": "Kopiér aktiveringslink",
+ "activation-link-copied-message": "Brugeraktiveringslinket er blevet kopieret til udklipsholderen",
+ "selected-users": "",
+ "search": "Søg efter brugere",
+ "details": "Oplysninger",
+ "login-as-tenant-admin": "Log ind som lejeradministrator",
+ "login-as-customer-user": "Log ind som kundebruger",
+ "select-group-to-add": "Vælg målgruppe for at tilføje valgte brugere",
+ "select-group-to-move": "Vælg målgruppe for at flytte valgte brugere",
+ "remove-users-from-group": "",
+ "group": "Gruppe af brugere",
+ "list-of-groups": "",
+ "group-name-starts-with": "",
+ "disable-account": "Deaktiver brugerkonto",
+ "enable-account": "Aktivér brugerkonto",
+ "enable-account-message": "Brugerkontoen er blevet aktiveret!",
+ "disable-account-message": "Brugerkontoen blev deaktiveret!"
+ },
+ "value": {
+ "type": "Værditype",
+ "string": "Streng",
+ "string-value": "Strengværdi",
+ "string-value-required": "Strengværdi er påkrævet",
+ "integer": "Heltal",
+ "integer-value": "Heltalsværdi",
+ "integer-value-required": "Heltalsværdi er påkrævet",
+ "invalid-integer-value": "Ugyldig heltalsværdi",
+ "double": "Dobbelt",
+ "double-value": "Dobbelt værdi",
+ "double-value-required": "Dobbelt værdi er påkrævet",
+ "boolean": "Boolesk",
+ "boolean-value": "Boolesk værdi",
+ "false": "FALSK",
+ "true": "SANDT",
+ "long": "Lang",
+ "json": "JSON",
+ "json-value": "JSON-værdi",
+ "json-value-invalid": "JSON-værdi har et ugyldigt format",
+ "json-value-required": "JSON-værdi er påkrævet."
+ },
+ "widget": {
+ "widget-library": "Widgets-bibliotek",
+ "widget-bundle": "Widgets-bundt",
+ "all-bundles": "Alle bundter",
+ "select-widgets-bundle": "Vælg widgets-bundt",
+ "management": "Widget-administration",
+ "editor": "Widget-editor",
+ "widget-type-not-found": "Problem under indlæsning af widget-konfiguration. Sandsynligvis tilknyttet\r\n widget-type blev fjernet.",
+ "widget-type-load-error": "Widget blev ikke indlæst pga. følgende fejl:",
+ "remove": "Fjern widget",
+ "edit": "Rediger widget",
+ "remove-widget-title": "",
+ "remove-widget-text": "Efter bekræftelsen vil widgeten og alle relaterede data være uoprettelige.",
+ "timeseries": "Tidsserier",
+ "search-data": "Søg efter data",
+ "no-data-found": "Ingen data fundet",
+ "latest": "Seneste værdier",
+ "rpc": "Styring af widget",
+ "alarm": "Alarm-widget",
+ "static": "Statisk widget",
+ "select-widget-type": "Vælg widget-type",
+ "missing-widget-title-error": "Widget-titel skal angives!",
+ "widget-saved": "Widget gemt",
+ "unable-to-save-widget-error": "Widget kunne ikke gemmes! Widget har fejl!",
+ "save": "Gem widget",
+ "saveAs": "Gem widget som",
+ "save-widget-type-as": "Gem widget-type som",
+ "save-widget-type-as-text": "Indtast en ny widget-titel, og/eller vælg målwidget-bundt",
+ "toggle-fullscreen": "Skift til fuld skærm",
+ "run": "Kør widget",
+ "title": "Widget-titel",
+ "title-required": "Widget-titel er påkrævet.",
+ "type": "Widget-type",
+ "resources": "Ressourcer",
+ "resource-url": "JavaScript/CSS URL",
+ "resource-is-module": "Er modul",
+ "remove-resource": "Fjern ressource",
+ "add-resource": "Tilføj ressource",
+ "html": "HTML",
+ "tidy": "Tidy",
+ "css": "CSS",
+ "settings-schema": "Indstillingsskema",
+ "datakey-settings-schema": "Skema over datanøgleindstillinger",
+ "widget-settings": "Widget-indstillinger",
+ "description": "Beskrivelse",
+ "image-preview": "Forhåndsvisning af billede",
+ "javascript": "Javascript",
+ "js": "JS",
+ "remove-widget-type-title": "",
+ "remove-widget-type-text": "Efter bekræftelsen vil widget-typen og alle relaterede data være uoprettelige.",
+ "remove-widget-type": "Fjern widget-type",
+ "add-widget-type": "Tilføj ny widget-type",
+ "widget-type-load-failed-error": "Kunne ikke indlæse widget-type!",
+ "widget-template-load-failed-error": "Kunne ikke indlæse widget-skabelon!",
+ "add": "Tilføj widget",
+ "undo": "Fortryd widget-ændringer",
+ "export": "Eksportér widget",
+ "export-data": "Eksportér widget-data",
+ "export-to-csv": "Eksportér data til CSV...",
+ "export-to-excel": "Eksportér data til XLS...",
+ "export-to-excel-xlsx": "Eksportér data til XLSX...",
+ "no-data": "Ingen data at vise på widget",
+ "data-overflow": "",
+ "alarm-data-overflow": "",
+ "search": "Søg efter widget",
+ "filter": "Widget-filtertype",
+ "loading-widgets": "Indlæser widgets..."
+ },
+ "widget-action": {
+ "header-button": "Widget-overskriftsknap",
+ "open-dashboard-state": "Naviger til ny dashboardtilstand",
+ "update-dashboard-state": "Opdater aktuel dashboardtilstand",
+ "open-dashboard": "Naviger til et andet dashboard",
+ "custom": "Brugerdefineret handling",
+ "custom-pretty": "Brugerdefineret handling (med HTML-skabelon)",
+ "target-dashboard-state": "Mål-dashboardtilstand",
+ "target-dashboard-state-required": "Mål-dashboardtilstand er påkrævet",
+ "set-entity-from-widget": "Angiv entitet fra widget",
+ "target-dashboard": "Mål-dashboard",
+ "open-right-layout": "Åbn højre dashboardlayout (mobilvisning)",
+ "open-in-separate-dialog": "Åbn i separat dialogboks",
+ "dialog-title": "Dialogbokstitel",
+ "dialog-hide-dashboard-toolbar": "Skjul dashboardets værktøjslinje i dialogboks",
+ "dialog-width": "Dialogboksbredde i procent i forhold til visningsportens bredde",
+ "dialog-height": "Dialogbokshøjde i procent i forhold til visningsportens højde",
+ "dialog-size-range-error": "Dialogboksstørrelsens procentværdi skal ligge i området fra 1 til 100.",
+ "open-new-browser-tab": "Åbn i en ny browserfane"
+ },
+ "widgets-bundle": {
+ "current": "Nuværende bundt",
+ "widgets-bundles": "Widgets-bundter",
+ "add": "Tilføj widgets-bundt",
+ "delete": "Slet widgets-bundt",
+ "title": "Titel",
+ "title-required": "Titel er påkrævet.",
+ "description": "Beskrivelse",
+ "image-preview": "Forhåndsvisning af billede",
+ "add-widgets-bundle-text": "Tilføj nye widgets-bundter",
+ "no-widgets-bundles-text": "Ingen widgets-bundter fundet",
+ "empty": "Widgets-bundt er tomt",
+ "details": "Oplysninger",
+ "widgets-bundle-details": "Oplysninger om widgets-bundt",
+ "delete-widgets-bundle-title": "",
+ "delete-widgets-bundle-text": "Vær forsigtig. Efter bekræftelsen vil widgets-bundtet og alle relaterede data være uoprettelige.",
+ "delete-widgets-bundles-title": "",
+ "delete-widgets-bundles-action-title": "",
+ "delete-widgets-bundles-text": "Vær forsigtig. Efter bekræftelsen vil alle valgte widgets-bundter blive fjernet, og alle relaterede data vil være uoprettelige.",
+ "no-widgets-bundles-matching": "",
+ "widgets-bundle-required": "Widgets-bundt er påkrævet.",
+ "system": "System",
+ "import": "Importér widgets-bundt",
+ "export": "Eksportér widgets-bundt",
+ "export-failed-error": "",
+ "create-new-widgets-bundle": "Opret nyt widgets-bundt",
+ "widgets-bundle-file": "Widgets-bundtfil",
+ "invalid-widgets-bundle-file-error": "Widgets-bundt kunne ikke importeres: Ugyldig datastruktur for widgets-bundt.",
+ "search": "Søg efter widget-bundter",
+ "selected-widgets-bundles": "",
+ "open-widgets-bundle": "Åbn widgets-bundt",
+ "loading-widgets-bundles": "Indlæser widgets-bundter..."
+ },
+ "widget-config": {
+ "data": "Data",
+ "settings": "Indstillinger",
+ "advanced": "Fremskreden",
+ "title": "Titel",
+ "title-tooltip": "Værktøjstip for titel",
+ "general-settings": "Generelle indstillinger",
+ "display-title": "Vis titel",
+ "drop-shadow": "Slip skygge",
+ "enable-fullscreen": "Aktivér fuldskærm",
+ "enable-data-export": "Aktivér dataeksport",
+ "background-color": "Baggrundsfarve",
+ "text-color": "Tekstfarve",
+ "padding": "Padding",
+ "margin": "Margin",
+ "widget-style": "Widget-stil",
+ "title-style": "Titeltype",
+ "mobile-mode-settings": "Indstillinger for mobiltilstand",
+ "order": "Rækkefølge",
+ "height": "Højde",
+ "units": "Specielt symbol, der vises ved siden af værdi",
+ "decimals": "Antal cifre efter flydende punkt",
+ "timewindow": "Tidsvindue",
+ "use-dashboard-timewindow": "Brug dashboardtidsvindue",
+ "display-timewindow": "Vis tidsvindue",
+ "display-legend": "Vis siganturforklaring",
+ "datasources": "Datakilder",
+ "maximum-datasources": "",
+ "datasource-type": "Type",
+ "datasource-parameters": "Parametre",
+ "remove-datasource": "Fjern datakilde",
+ "add-datasource": "Tilføj datakilde",
+ "target-device": "Målenhed",
+ "alarm-source": "Alarmkilde",
+ "actions": "Handlinger",
+ "action": "Handling",
+ "add-action": "Tilføj handling",
+ "search-actions": "Søg efter handlinger",
+ "no-actions-text": "Ingen handlinger fundet",
+ "action-source": "Handlingskilde",
+ "action-source-required": "Handlingskilde er påkrævet.",
+ "action-name": "Navn",
+ "action-name-required": "Handlingsnavn er påkrævet.",
+ "action-name-not-unique": "Der findes allerede en anden handling med samme navn. Handlingsnavnet skal være unikt inden for den samme handlingskilde.",
+ "action-icon": "Ikon",
+ "action-type": "Type",
+ "action-type-required": "Handlingstype er påkrævet.",
+ "edit-action": "Rediger handling",
+ "delete-action": "Slet handling",
+ "delete-action-title": "Slet widget-handling",
+ "delete-action-text": "",
+ "display-icon": "Vis titelikon",
+ "icon-color": "Ikonfarve",
+ "icon-size": "Ikonstørrelse"
+ },
+ "widget-type": {
+ "import": "Importér widget-type",
+ "export": "Eksportér widget-type",
+ "export-failed-error": "",
+ "create-new-widget-type": "Opret ny widget-type",
+ "widget-type-file": "Widget-typefil",
+ "invalid-widget-type-file-error": "Kan ikke importere widget-type: Ugyldig datastruktur for widget-type."
+ },
+ "self-registration": {
+ "self-registration": "Selvregistrering",
+ "self-registration-url": "Selvregistrerings-URL",
+ "captcha-site-key": "reCAPTCHA site-nøgle",
+ "captcha-secret-key": "reCAPTCHA hemmelig nøgle",
+ "notification-email": "Notifikations-e-mail",
+ "privacy-policy-text": "Fortrolighedspolitik tekst",
+ "text-message-page": "Tekstmeddelelse til tilmeldingsside"
+ },
+ "white-labeling": {
+ "white-labeling": "Hvid mærkning",
+ "login-white-labeling": "Login for hvid mærkning",
+ "preview": "Forhåndsvisning",
+ "app-title": "Applikationstitel",
+ "favicon": "Website-ikon",
+ "favicon-description": "",
+ "favicon-size-error": "",
+ "favicon-type-error": "Ugyldigt filformat for website-billede. Kun ICO-, GIF- eller PNG-billeder accepteres.",
+ "drop-favicon-image": "Træk og slip et website-ikonbillede, eller klik for at vælge en fil, der skal uploades.",
+ "no-favicon-image": "Intet ikon valgt",
+ "logo": "Logo",
+ "logo-description": "",
+ "logo-size-error": "",
+ "logo-type-error": "Ugyldigt logofilformat. Kun billeder accepteres.",
+ "drop-logo-image": "Træk og slip et logobillede, eller klik for at vælge en fil, der skal uploades.",
+ "no-logo-image": "Intet logo valgt",
+ "logo-height": "Logohøjde, px",
+ "primary-palette": "Primær palet",
+ "accent-palette": "Accent palet",
+ "customize-palette": "Tilpas",
+ "advanced-css": "Avanceret CSS",
+ "edit-palette": "Rediger palet",
+ "save-palette": "Gem palet",
+ "primary-background": "Primær baggrund",
+ "secondary-background": "Sekundær baggrund",
+ "hue1": "HUE 1",
+ "hue2": "HUE 2",
+ "hue3": "HUE 3",
+ "page-background-color": "Baggrundsfarve for side",
+ "dark-foreground": "Mørk forgrund",
+ "domain-name": "Domænenavn",
+ "base-url": "Basis-URL",
+ "base-url-required": "Basis-URL er påkrævet.",
+ "prohibit-different-url": "Det er ikke tilladt at bruge værtsnavn fra overskrifterne for klientanmodninger",
+ "prohibit-different-url-hint": "Denne indstilling skal aktiveres for produktionsmiljøer. Kan forårsage sikkerhedsproblemer ved deaktivering",
+ "help-link-base-url": "Basis-URL for hjælpelinks",
+ "enable-help-links": "Aktivér hjælpelinks",
+ "error-verification-url": "Et domænenavn må ikke indeholde symbolerne '/' og ':'. Eksempel: thingsboard.io",
+ "show-platform-name-version": "Vis platformnavn og version",
+ "platform-name": "Platformnavn",
+ "platform-version": "Platformversion",
+ "version-mask": "",
+ "position": {
+ "label": "Platformnavn og versionsposition",
+ "under-logo": "Under logoet",
+ "bottom": "Nederst i login-formularen"
+ }
+ },
+ "widgets": {
+ "date-range-navigator": {
+ "localizationMap": {
+ "Sun": "Søn",
+ "Mon": "Man",
+ "Tue": "Tir",
+ "Wed": "Ons",
+ "Thu": "Tor",
+ "Fri": "Fre",
+ "Sat": "Lør",
+ "Jan": "Jan",
+ "Feb": "Feb",
+ "Mar": "Mar",
+ "Apr": "Apr",
+ "May": "Maj",
+ "Jun": "Jun",
+ "Jul": "Jul",
+ "Aug": "Aug",
+ "Sep": "Sep",
+ "Oct": "Okt",
+ "Nov": "Nov",
+ "Dec": "Dec",
+ "January": "Januar",
+ "February": "Februar",
+ "March": "Marts",
+ "April": "April",
+ "June": "Juni",
+ "July": "Juli",
+ "August": "August",
+ "September": "September",
+ "October": "Oktober",
+ "November": "November",
+ "December": "December",
+ "Custom Date Range": "Brugerdefineret datointerval",
+ "Date Range Template": "Skabelon for datointerval",
+ "Today": "I dag",
+ "Yesterday": "I går",
+ "This Week": "Denne uge",
+ "Last Week": "Sidste uge",
+ "This Month": "Denne måned",
+ "Last Month": "Sidste måned",
+ "Year": "År",
+ "This Year": "I år",
+ "Last Year": "Sidste år",
+ "Date picker": "Datovælger",
+ "Hour": "Time",
+ "Day": "Dag",
+ "Week": "Uge",
+ "2 weeks": "2 uger",
+ "Month": "Måned",
+ "3 months": "3 måneder",
+ "6 months": "6 måneder",
+ "Custom interval": "Brugerdefineret interval",
+ "Interval": "Interval",
+ "Step size": "Trinstørrelse",
+ "Ok": "Okay"
+ }
+ },
+ "input-widgets": {
+ "attribute-not-allowed": "Attributparameter kan ikke bruges i denne widget",
+ "blocked-location": "Geoplaceringen er blokeret i din browser",
+ "claim-device": "Gør krav på enhed",
+ "claim-failed": "Kunne ikke gøre krav på enheden!",
+ "claim-not-found": "Enhed ikke fundet!",
+ "claim-successful": "Enheden er blevet krævet!",
+ "date": "Dato",
+ "device-name": "Enhedsnavn",
+ "device-name-required": "Enhedsnavn er påkrævet",
+ "discard-changes": "Kassér ændringer",
+ "entity-attribute-required": "Entitetsattribut er påkrævet",
+ "entity-coordinate-required": "Både felter, breddegrad og længdegrad er påkrævet",
+ "entity-timeseries-required": "Tidsserie for entitet er påkrævet",
+ "get-location": "Få den aktuelle placering",
+ "invalid-date": "Ugyldig dato",
+ "latitude": "Breddegrad",
+ "longitude": "Længde",
+ "min-value-error": "",
+ "max-value-error": "",
+ "not-allowed-entity": "Den valgte entitet kan ikke have delte attributter",
+ "no-attribute-selected": "Ingen attribut er valgt",
+ "no-datakey-selected": "Ingen datanøgle er valgt",
+ "no-coordinate-specified": "Datanøgle for breddegrad/længdegrad er ikke angivet",
+ "no-entity-selected": "Ingen entitet valgt",
+ "no-image": "Intet billede",
+ "no-support-geolocation": "Din browser understøtter ikke geoplacering",
+ "no-support-web-camera": "Din browser understøtter ikke kameraer",
+ "enable-https-use-widget": "Aktivér HTTPS for at bruge denne widget",
+ "no-found-your-camera": "Kan ikke finde dit kamera",
+ "no-permission-camera": "Tilladelse blev nægtet af brugeren / Dette website har ikke tilladelse til at bruge kameraet",
+ "no-timeseries-selected": "Ingen tidsserier valgt",
+ "secret-key": "Hemmelig nøgle",
+ "secret-key-required": "Hemmelig nøgle er påkrævet",
+ "switch-attribute-value": "Skift entitetsattributværdi",
+ "switch-camera": "Skift kamera",
+ "switch-timeseries-value": "Skift entitetstidsserieværdi",
+ "take-photo": "Tag et billede",
+ "time": "Tid",
+ "timeseries-not-allowed": "Tidsserieparameter kan ikke bruges i denne widget",
+ "update-failed": "Opdatering mislykkedes",
+ "update-successful": "Opdatering lykkedes",
+ "update-attribute": "Opdatering",
+ "update-timeseries": "Opdater tidsserier",
+ "value": "Værdi"
+ }
+ },
+ "icon": {
+ "icon": "Ikon",
+ "select-icon": "Vælg ikon",
+ "material-icons": "Materialeikoner",
+ "show-all": "Vis alle ikoner"
+ },
+ "subscription": {
+ "entity-limit-text": "Du kan dog opgradere din abonnementsordning for at øge dine begrænsninger.",
+ "upgrade-your-plan": "Opgrader abonnementsordning",
+ "white-labeling-feature": "Funktion til hvid mærkning",
+ "white-labeling-text-full": "Rebrand ThingsBoard-platformens webinterface med dit virksomheds- eller produktlogo og farveskema på 2 minutter.