();
diff --git a/ui-ngx/src/app/modules/home/components/widget/lib/gateway/connectors-configuration/modbus/modbus-master-table/modbus-master-table.component.html b/ui-ngx/src/app/modules/home/components/widget/lib/gateway/connectors-configuration/modbus/modbus-master-table/modbus-master-table.component.html
index eb3fb8e3f5..0bdfc9ab87 100644
--- a/ui-ngx/src/app/modules/home/components/widget/lib/gateway/connectors-configuration/modbus/modbus-master-table/modbus-master-table.component.html
+++ b/ui-ngx/src/app/modules/home/components/widget/lib/gateway/connectors-configuration/modbus/modbus-master-table/modbus-master-table.component.html
@@ -62,6 +62,14 @@
+
+
+ {{ 'gateway.device-name' | translate }}
+
+
+ {{ slave['deviceName'] }}
+
+
{{ 'gateway.info' | translate }}
@@ -80,7 +88,7 @@
- {{ 'gateway.client-communication-type' | translate }}
+ {{ 'gateway.type' | translate }}
{{ ModbusProtocolLabelsMap.get(slave['type']) }}
@@ -121,8 +129,8 @@
-
-
+
+
diff --git a/ui-ngx/src/app/modules/home/components/widget/lib/gateway/connectors-configuration/modbus/modbus-slave-dialog/modbus-slave-dialog.abstract.ts b/ui-ngx/src/app/modules/home/components/widget/lib/gateway/connectors-configuration/modbus/modbus-slave-dialog/modbus-slave-dialog.abstract.ts
index ff2b642621..f9955b839b 100644
--- a/ui-ngx/src/app/modules/home/components/widget/lib/gateway/connectors-configuration/modbus/modbus-slave-dialog/modbus-slave-dialog.abstract.ts
+++ b/ui-ngx/src/app/modules/home/components/widget/lib/gateway/connectors-configuration/modbus/modbus-slave-dialog/modbus-slave-dialog.abstract.ts
@@ -35,6 +35,7 @@ import {
ModbusSlaveInfo,
noLeadTrailSpacesRegex,
PortLimits,
+ ReportStrategyDefaultValue,
} from '@home/components/widget/lib/gateway/gateway-widget.models';
import { Subject } from 'rxjs';
import { DialogComponent } from '@shared/components/dialog.component';
@@ -64,6 +65,7 @@ export abstract class ModbusSlaveDialogAbstract extends Dialo
readonly ModbusParityLabelsMap = ModbusParityLabelsMap;
readonly ModbusProtocolLabelsMap = ModbusProtocolLabelsMap;
readonly ModbusMethodLabelsMap = ModbusMethodLabelsMap;
+ readonly ReportStrategyDefaultValue = ReportStrategyDefaultValue;
readonly modbusHelpLink =
helpBaseUrl + '/docs/iot-gateway/config/modbus/#section-master-description-and-configuration-parameters';
diff --git a/ui-ngx/src/app/modules/home/components/widget/lib/gateway/connectors-configuration/modbus/modbus-slave-dialog/modbus-slave-dialog.component.html b/ui-ngx/src/app/modules/home/components/widget/lib/gateway/connectors-configuration/modbus/modbus-slave-dialog/modbus-slave-dialog.component.html
index bb7e90f280..0a480a88ae 100644
--- a/ui-ngx/src/app/modules/home/components/widget/lib/gateway/connectors-configuration/modbus/modbus-slave-dialog/modbus-slave-dialog.component.html
+++ b/ui-ngx/src/app/modules/home/components/widget/lib/gateway/connectors-configuration/modbus/modbus-slave-dialog/modbus-slave-dialog.component.html
@@ -218,7 +218,7 @@
-
+
diff --git a/ui-ngx/src/app/modules/home/components/widget/lib/gateway/connectors-configuration/report-strategy/report-strategy.component.ts b/ui-ngx/src/app/modules/home/components/widget/lib/gateway/connectors-configuration/report-strategy/report-strategy.component.ts
index fb0819d119..10eaf98f86 100644
--- a/ui-ngx/src/app/modules/home/components/widget/lib/gateway/connectors-configuration/report-strategy/report-strategy.component.ts
+++ b/ui-ngx/src/app/modules/home/components/widget/lib/gateway/connectors-configuration/report-strategy/report-strategy.component.ts
@@ -34,6 +34,7 @@ import {
} from '@angular/forms';
import {
ReportStrategyConfig,
+ ReportStrategyDefaultValue,
ReportStrategyType,
ReportStrategyTypeTranslationsMap
} from '@home/components/widget/lib/gateway/gateway-widget.models';
@@ -43,7 +44,7 @@ import { CommonModule } from '@angular/common';
import {
ModbusSecurityConfigComponent
} from '@home/components/widget/lib/gateway/connectors-configuration/modbus/modbus-security-config/modbus-security-config.component';
-import { coerceBoolean } from '@shared/decorators/coercion';
+import { coerceBoolean, coerceNumber } from '@shared/decorators/coercion';
@Component({
selector: 'tb-report-strategy',
@@ -73,6 +74,9 @@ export class ReportStrategyComponent implements ControlValueAccessor, OnDestroy
@coerceBoolean()
@Input() isExpansionMode = false;
+ @coerceNumber()
+ @Input() defaultValue = ReportStrategyDefaultValue.Key;
+
reportStrategyFormGroup: UntypedFormGroup;
showStrategyControl: FormControl;
@@ -90,7 +94,7 @@ export class ReportStrategyComponent implements ControlValueAccessor, OnDestroy
this.reportStrategyFormGroup = this.fb.group({
type: [{ value: ReportStrategyType.OnReportPeriod, disabled: true }, []],
- reportPeriod: [{ value: 5000, disabled: true }, [Validators.required]],
+ reportPeriod: [{ value: this.defaultValue, disabled: true }, [Validators.required]],
});
this.observeStrategyFormChange();
@@ -109,7 +113,7 @@ export class ReportStrategyComponent implements ControlValueAccessor, OnDestroy
if (reportStrategyConfig) {
this.reportStrategyFormGroup.enable({emitEvent: false});
}
- const { type = ReportStrategyType.OnReportPeriod, reportPeriod = 5000 } = reportStrategyConfig ?? {};
+ const { type = ReportStrategyType.OnReportPeriod, reportPeriod = this.defaultValue } = reportStrategyConfig ?? {};
this.reportStrategyFormGroup.setValue({ type, reportPeriod }, {emitEvent: false});
this.onTypeChange(type);
}
diff --git a/ui-ngx/src/app/modules/home/components/widget/lib/gateway/gateway-connectors.component.html b/ui-ngx/src/app/modules/home/components/widget/lib/gateway/gateway-connectors.component.html
index cec81ab637..cad7af4392 100644
--- a/ui-ngx/src/app/modules/home/components/widget/lib/gateway/gateway-connectors.component.html
+++ b/ui-ngx/src/app/modules/home/components/widget/lib/gateway/gateway-connectors.component.html
@@ -23,7 +23,7 @@
@@ -315,6 +315,7 @@
diff --git a/ui-ngx/src/app/modules/home/components/widget/lib/gateway/gateway-connectors.component.ts b/ui-ngx/src/app/modules/home/components/widget/lib/gateway/gateway-connectors.component.ts
index a4c1985595..8ca92d4ca7 100644
--- a/ui-ngx/src/app/modules/home/components/widget/lib/gateway/gateway-connectors.component.ts
+++ b/ui-ngx/src/app/modules/home/components/widget/lib/gateway/gateway-connectors.component.ts
@@ -42,7 +42,7 @@ import { MatTableDataSource } from '@angular/material/table';
import { ActionNotificationShow } from '@core/notification/notification.actions';
import { DialogService } from '@core/services/dialog.service';
import { WidgetContext } from '@home/models/widget-component.models';
-import { camelCase, deepClone, generateSecret, isEqual, isString } from '@core/utils';
+import { camelCase, deepClone, isEqual, isString } from '@core/utils';
import { NULL_UUID } from '@shared/models/id/has-uuid';
import { IWidgetSubscription, WidgetSubscriptionOptions } from '@core/api/widget-api.models';
import { DatasourceType, widgetType } from '@shared/models/widget.models';
@@ -60,6 +60,8 @@ import {
GatewayLogLevel,
noLeadTrailSpacesRegex,
GatewayVersion,
+ ReportStrategyDefaultValue,
+ ReportStrategyType,
} from './gateway-widget.models';
import { MatDialog } from '@angular/material/dialog';
import { AddConnectorDialogComponent } from '@home/components/widget/lib/gateway/dialog/add-connector-dialog.component';
@@ -103,6 +105,7 @@ export class GatewayConnectorComponent extends PageComponent implements AfterVie
readonly GatewayConnectorTypesTranslatesMap = GatewayConnectorDefaultTypesTranslatesMap;
readonly ConnectorConfigurationModes = ConfigurationModes;
readonly GatewayVersion = GatewayVersion;
+ readonly ReportStrategyDefaultValue = ReportStrategyDefaultValue;
pageLink: PageLink;
dataSource: MatTableDataSource;
@@ -170,18 +173,21 @@ export class GatewayConnectorComponent extends PageComponent implements AfterVie
super.ngOnDestroy();
}
- saveConnector(isNew = true): void {
- const value = this.getConnectorData();
+ onSaveConnector(): void {
+ this.saveConnector(this.getUpdatedConnectorData(this.connectorForm.value), false);
+ }
+
+ private saveConnector(connector: GatewayConnector, isNew = true): void {
const scope = (isNew || this.activeConnectors.includes(this.initialConnector.name))
? AttributeScope.SHARED_SCOPE
: AttributeScope.SERVER_SCOPE;
- forkJoin(this.getEntityAttributeTasks(value, scope)).pipe(take(1)).subscribe(_ => {
- this.showToast(!this.initialConnector
- ? this.translate.instant('gateway.connector-created')
- : this.translate.instant('gateway.connector-updated')
+ forkJoin(this.getEntityAttributeTasks(connector, scope)).pipe(take(1)).subscribe(_ => {
+ this.showToast(isNew
+ ? this.translate.instant('gateway.connector-created')
+ : this.translate.instant('gateway.connector-updated')
);
- this.initialConnector = value;
+ this.initialConnector = connector;
this.updateData(true);
this.connectorForm.markAsPristine();
});
@@ -237,8 +243,8 @@ export class GatewayConnectorComponent extends PageComponent implements AfterVie
}
}
- private getConnectorData(): GatewayConnector {
- const value = { ...this.connectorForm.value };
+ private getUpdatedConnectorData(connector: GatewayConnector): GatewayConnector {
+ const value = {...connector };
value.configuration = `${camelCase(value.name)}.json`;
delete value.basicConfig;
@@ -249,6 +255,16 @@ export class GatewayConnectorComponent extends PageComponent implements AfterVie
delete value.class;
}
+ if (value.type === ConnectorType.MODBUS && value.configVersion === GatewayVersion.Current) {
+ if (!value.reportStrategy) {
+ value.reportStrategy = {
+ type: ReportStrategyType.OnReportPeriod,
+ reportPeriod: ReportStrategyDefaultValue.Connector
+ };
+ delete value.sendDataOnlyOnChange;
+ }
+ }
+
if (this.gatewayVersion && !value.configVersion) {
value.configVersion = this.gatewayVersion;
}
@@ -472,7 +488,7 @@ export class GatewayConnectorComponent extends PageComponent implements AfterVie
return (connector && this.activeConnectors.includes(connectorName)) ? (connector.data[0][1] || 0) : 'Inactive';
}
- addConnector(event?: Event): void {
+ onAddConnector(event?: Event): void {
event?.stopPropagation();
this.confirmConnectorChange()
@@ -482,25 +498,42 @@ export class GatewayConnectorComponent extends PageComponent implements AfterVie
switchMap(() => this.openAddConnectorDialog()),
filter(Boolean),
)
- .subscribe(value => {
- if (this.connectorForm.disabled) {
- this.connectorForm.enable();
- }
- if (!value.configurationJson) {
- value.configurationJson = {} as ConnectorBaseConfig;
- }
- value.basicConfig = value.configurationJson;
- this.initialConnector = value;
- this.connectorForm.patchValue(value, {emitEvent: false});
- this.generate('basicConfig.broker.clientId');
- if (this.connectorForm.get('type').value === value.type || !this.allowBasicConfig.has(value.type)) {
- this.saveConnector();
- } else {
- this.basicConfigInitSubject.pipe(take(1)).subscribe(() => {
- this.saveConnector();
- });
- }
- });
+ .subscribe(connector => this.addConnector(connector));
+ }
+
+ private addConnector(connector: GatewayConnector): void {
+ if (this.connectorForm.disabled) {
+ this.connectorForm.enable();
+ }
+ if (!connector.configurationJson) {
+ connector.configurationJson = {} as ConnectorBaseConfig;
+ }
+ connector.basicConfig = connector.configurationJson;
+ this.initialConnector = connector;
+
+ const previousType = this.connectorForm.get('type').value;
+
+ this.setInitialConnectorValues(connector);
+
+ this.saveConnector(this.getUpdatedConnectorData(connector));
+
+ if (!previousType || previousType === connector.type || !this.allowBasicConfig.has(connector.type)) {
+ this.patchBasicConfigConnector(connector);
+ } else {
+ this.basicConfigInitSubject.pipe(take(1)).subscribe(() => {
+ this.patchBasicConfigConnector(connector);
+ });
+ }
+ }
+
+ private setInitialConnectorValues(connector: GatewayConnector): void {
+ this.toggleReportStrategy(connector.type);
+ this.connectorForm.get('mode').setValue(this.allowBasicConfig.has(connector.type)
+ ? connector.mode ?? ConfigurationModes.BASIC
+ : null, {emitEvent: false}
+ );
+ this.connectorForm.get('configVersion').setValue(connector.configVersion, {emitEvent: false});
+ this.connectorForm.get('type').setValue(connector.type, {emitEvent: false});
}
private openAddConnectorDialog(): Observable {
@@ -514,10 +547,6 @@ export class GatewayConnectorComponent extends PageComponent implements AfterVie
}).afterClosed();
}
- generate(formControlName: string): void {
- this.connectorForm.get(formControlName)?.patchValue('tb_gw_' + generateSecret(5));
- }
-
uniqNameRequired(): ValidatorFn {
return (control: UntypedFormControl) => {
const newName = control.value?.trim().toLowerCase();
@@ -607,7 +636,7 @@ export class GatewayConnectorComponent extends PageComponent implements AfterVie
const active = attributes.find(data => data.key === 'active').value;
const lastDisconnectedTime = attributes.find(data => data.key === 'lastDisconnectTime')?.value;
- const lastConnectedTime = attributes.find(data => data.key === 'lastConnectTime').value;
+ const lastConnectedTime = attributes.find(data => data.key === 'lastConnectTime')?.value;
this.isGatewayActive = this.getGatewayStatus(active, lastConnectedTime, lastDisconnectedTime);
});
@@ -804,7 +833,6 @@ export class GatewayConnectorComponent extends PageComponent implements AfterVie
}
private updateConnector(connector: GatewayConnector): void {
- this.toggleReportStrategy(connector.type);
switch (connector.type) {
case ConnectorType.MQTT:
case ConnectorType.OPCUA:
@@ -819,8 +847,7 @@ export class GatewayConnectorComponent extends PageComponent implements AfterVie
}
private updateBasicConfigConnector(connector: GatewayConnector): void {
- this.connectorForm.get('mode').setValue(connector.mode || ConfigurationModes.BASIC, {emitEvent: false});
- this.connectorForm.get('configVersion').setValue(connector.configVersion, {emitEvent: false});
+ this.setInitialConnectorValues(connector);
if ((!connector.mode || connector.mode === ConfigurationModes.BASIC) && this.connectorForm.get('type').value !== connector.type) {
this.basicConfigInitSubject.asObservable().pipe(take(1)).subscribe(() => {
this.patchBasicConfigConnector(connector);
diff --git a/ui-ngx/src/app/modules/home/components/widget/lib/gateway/gateway-widget.models.ts b/ui-ngx/src/app/modules/home/components/widget/lib/gateway/gateway-widget.models.ts
index f1fbd4d0f5..f8f1c99289 100644
--- a/ui-ngx/src/app/modules/home/components/widget/lib/gateway/gateway-widget.models.ts
+++ b/ui-ngx/src/app/modules/home/components/widget/lib/gateway/gateway-widget.models.ts
@@ -123,6 +123,9 @@ export interface GatewayConnectorBase {
class?: string;
mode?: ConfigurationModes;
configVersion?: string;
+ reportStrategy?: ReportStrategyConfig;
+ sendDataOnlyOnChange?: boolean;
+ ts?: number;
}
export interface GatewayConnector extends GatewayConnectorBase {
@@ -645,6 +648,12 @@ export enum ReportStrategyType {
OnChangeOrReportPeriod = 'ON_CHANGE_OR_REPORT_PERIOD'
}
+export enum ReportStrategyDefaultValue {
+ Connector = 60000,
+ Device = 30000,
+ Key = 15000
+}
+
export const ReportStrategyTypeTranslationsMap = new Map(
[
[ReportStrategyType.OnChange, 'gateway.report-strategy.on-change'],
diff --git a/ui-ngx/src/assets/locale/locale.constant-en_US.json b/ui-ngx/src/assets/locale/locale.constant-en_US.json
index bb4fc57e8a..3f22e78672 100644
--- a/ui-ngx/src/assets/locale/locale.constant-en_US.json
+++ b/ui-ngx/src/assets/locale/locale.constant-en_US.json
@@ -2955,7 +2955,6 @@
"configuration-delete-dialog-confirm": "Turn Off",
"connector-duplicate-name": "Connector with such name already exists.",
"connector-side": "Connector side",
- "client-communication-type": "Client communication type",
"payload-type": "Payload type",
"platform-side": "Platform side",
"JSON": "JSON",