matterbridge 1.6.1 → 1.6.3-dev.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (139) hide show
  1. package/CHANGELOG.md +45 -1
  2. package/README-DEV.md +0 -4
  3. package/README-NGINX.md +63 -0
  4. package/README.md +7 -3
  5. package/dist/cli.js +15 -7
  6. package/dist/cli.js.map +1 -1
  7. package/dist/deviceManager.d.ts +1 -1
  8. package/dist/deviceManager.d.ts.map +1 -1
  9. package/dist/deviceManager.js +1 -1
  10. package/dist/deviceManager.js.map +1 -1
  11. package/dist/index.d.ts +9 -9
  12. package/dist/index.d.ts.map +1 -1
  13. package/dist/index.js +23 -10
  14. package/dist/index.js.map +1 -1
  15. package/dist/matter/export.d.ts +5 -0
  16. package/dist/matter/export.d.ts.map +1 -0
  17. package/dist/matter/export.js +5 -0
  18. package/dist/matter/export.js.map +1 -0
  19. package/dist/matterbridge.d.ts +12 -7
  20. package/dist/matterbridge.d.ts.map +1 -1
  21. package/dist/matterbridge.js +133 -83
  22. package/dist/matterbridge.js.map +1 -1
  23. package/dist/matterbridgeAccessoryPlatform.d.ts.map +1 -1
  24. package/dist/matterbridgeAccessoryPlatform.js.map +1 -1
  25. package/dist/matterbridgeBehaviors.d.ts +1123 -0
  26. package/dist/matterbridgeBehaviors.d.ts.map +1 -0
  27. package/dist/matterbridgeBehaviors.js +281 -0
  28. package/dist/matterbridgeBehaviors.js.map +1 -0
  29. package/dist/matterbridgeDevice.d.ts +2089 -1511
  30. package/dist/matterbridgeDevice.d.ts.map +1 -1
  31. package/dist/matterbridgeDevice.js +243 -209
  32. package/dist/matterbridgeDevice.js.map +1 -1
  33. package/dist/matterbridgeDeviceTypes.d.ts +65 -0
  34. package/dist/matterbridgeDeviceTypes.d.ts.map +1 -0
  35. package/dist/matterbridgeDeviceTypes.js +307 -0
  36. package/dist/matterbridgeDeviceTypes.js.map +1 -0
  37. package/dist/matterbridgeDynamicPlatform.d.ts.map +1 -1
  38. package/dist/matterbridgeDynamicPlatform.js.map +1 -1
  39. package/dist/matterbridgeEdge.d.ts +19 -20
  40. package/dist/matterbridgeEdge.d.ts.map +1 -1
  41. package/dist/matterbridgeEdge.js +505 -102
  42. package/dist/matterbridgeEdge.js.map +1 -1
  43. package/dist/matterbridgeEndpoint.d.ts +3554 -2297
  44. package/dist/matterbridgeEndpoint.d.ts.map +1 -1
  45. package/dist/matterbridgeEndpoint.js +709 -476
  46. package/dist/matterbridgeEndpoint.js.map +1 -1
  47. package/dist/matterbridgePlatform.d.ts +4 -3
  48. package/dist/matterbridgePlatform.d.ts.map +1 -1
  49. package/dist/matterbridgePlatform.js +10 -2
  50. package/dist/matterbridgePlatform.js.map +1 -1
  51. package/dist/matterbridgeTypes.d.ts +7 -8
  52. package/dist/matterbridgeTypes.d.ts.map +1 -1
  53. package/dist/matterbridgeTypes.js.map +1 -1
  54. package/dist/matterbridgeWebsocket.d.ts +1 -1
  55. package/dist/matterbridgeWebsocket.d.ts.map +1 -1
  56. package/dist/matterbridgeWebsocket.js +5 -3
  57. package/dist/matterbridgeWebsocket.js.map +1 -1
  58. package/dist/pluginManager.d.ts.map +1 -1
  59. package/dist/pluginManager.js +16 -7
  60. package/dist/pluginManager.js.map +1 -1
  61. package/dist/utils/colorUtils.js +1 -1
  62. package/dist/utils/colorUtils.js.map +1 -1
  63. package/dist/utils/utils.d.ts +21 -0
  64. package/dist/utils/utils.d.ts.map +1 -1
  65. package/dist/utils/utils.js +49 -3
  66. package/dist/utils/utils.js.map +1 -1
  67. package/frontend/build/asset-manifest.json +62 -6
  68. package/frontend/build/index.html +1 -1
  69. package/frontend/build/static/css/main.823e08b6.css +2 -0
  70. package/frontend/build/static/css/main.823e08b6.css.map +1 -0
  71. package/frontend/build/static/js/main.a14c87e7.js +115 -0
  72. package/frontend/build/static/js/{main.045d08f7.js.LICENSE.txt → main.a14c87e7.js.LICENSE.txt} +3 -3
  73. package/frontend/build/static/js/main.a14c87e7.js.map +1 -0
  74. package/frontend/build/static/media/roboto-cyrillic-300-normal.1b79538ccd585c259996.woff2 +0 -0
  75. package/frontend/build/static/media/roboto-cyrillic-300-normal.5f077fd7b977d1715acf.woff +0 -0
  76. package/frontend/build/static/media/roboto-cyrillic-400-normal.5d2930082227d172f62c.woff +0 -0
  77. package/frontend/build/static/media/roboto-cyrillic-400-normal.a9e19870cf6c4b973427.woff2 +0 -0
  78. package/frontend/build/static/media/roboto-cyrillic-500-normal.0ae2428323939af5e1ad.woff2 +0 -0
  79. package/frontend/build/static/media/roboto-cyrillic-500-normal.dd7bc8a52c6c70c5a3f5.woff +0 -0
  80. package/frontend/build/static/media/roboto-cyrillic-700-normal.3f6e1548bd5175a8c342.woff +0 -0
  81. package/frontend/build/static/media/roboto-cyrillic-700-normal.4fdfc29a10e7d4b7c527.woff2 +0 -0
  82. package/frontend/build/static/media/roboto-cyrillic-ext-300-normal.795dbc8140e3fef82983.woff +0 -0
  83. package/frontend/build/static/media/roboto-cyrillic-ext-300-normal.80947a31d23c70204b47.woff2 +0 -0
  84. package/frontend/build/static/media/roboto-cyrillic-ext-400-normal.135d076fa32aa0b4d105.woff +0 -0
  85. package/frontend/build/static/media/roboto-cyrillic-ext-400-normal.5cec61a21cc20180fbe1.woff2 +0 -0
  86. package/frontend/build/static/media/roboto-cyrillic-ext-500-normal.6de16332fda843a3dc3d.woff2 +0 -0
  87. package/frontend/build/static/media/roboto-cyrillic-ext-500-normal.c0a0638f90b31d6454ba.woff +0 -0
  88. package/frontend/build/static/media/roboto-cyrillic-ext-700-normal.4750292c47fa2bc6ac1a.woff2 +0 -0
  89. package/frontend/build/static/media/roboto-cyrillic-ext-700-normal.ca247189fc12d00de361.woff +0 -0
  90. package/frontend/build/static/media/roboto-greek-300-normal.285f3e6261d8eb20417d.woff2 +0 -0
  91. package/frontend/build/static/media/roboto-greek-300-normal.889beddda1c9bd9f97df.woff +0 -0
  92. package/frontend/build/static/media/roboto-greek-400-normal.160a791a8e4f46bca3cc.woff +0 -0
  93. package/frontend/build/static/media/roboto-greek-400-normal.2c32b1315be61477013a.woff2 +0 -0
  94. package/frontend/build/static/media/roboto-greek-500-normal.60810e07c7b0273013aa.woff +0 -0
  95. package/frontend/build/static/media/roboto-greek-500-normal.f95e757c5483310f9c11.woff2 +0 -0
  96. package/frontend/build/static/media/roboto-greek-700-normal.77dd370f2001e184ba0d.woff2 +0 -0
  97. package/frontend/build/static/media/roboto-greek-700-normal.df87b053fae3d7ad5f7a.woff +0 -0
  98. package/frontend/build/static/media/roboto-greek-ext-300-normal.b590dbe5c639944366d1.woff +0 -0
  99. package/frontend/build/static/media/roboto-greek-ext-300-normal.d6049cb54aa6fbe14c42.woff2 +0 -0
  100. package/frontend/build/static/media/roboto-greek-ext-400-normal.16eb83b4a3b1ea994243.woff +0 -0
  101. package/frontend/build/static/media/roboto-greek-ext-400-normal.1df4abad55796d11a0c8.woff2 +0 -0
  102. package/frontend/build/static/media/roboto-greek-ext-500-normal.4a96ba31abcce0f5d52b.woff2 +0 -0
  103. package/frontend/build/static/media/roboto-greek-ext-500-normal.fd28d9c008bf3af1bed7.woff +0 -0
  104. package/frontend/build/static/media/roboto-greek-ext-700-normal.2dd6febad11502dec6a6.woff2 +0 -0
  105. package/frontend/build/static/media/roboto-greek-ext-700-normal.4abdc9fff4507f17d726.woff +0 -0
  106. package/frontend/build/static/media/roboto-latin-300-normal.b850f1ff581ea232fac9.woff2 +0 -0
  107. package/frontend/build/static/media/roboto-latin-300-normal.c4bc0593c9954d79cb3a.woff +0 -0
  108. package/frontend/build/static/media/roboto-latin-400-normal.047a7839f69b209db815.woff +0 -0
  109. package/frontend/build/static/media/roboto-latin-400-normal.297d48e1b5a10c0831a9.woff2 +0 -0
  110. package/frontend/build/static/media/roboto-latin-500-normal.68d40d6d01c6f85d24ba.woff +0 -0
  111. package/frontend/build/static/media/roboto-latin-500-normal.7077203b1982951ecf76.woff2 +0 -0
  112. package/frontend/build/static/media/roboto-latin-700-normal.4535474e1cf8598695ad.woff2 +0 -0
  113. package/frontend/build/static/media/roboto-latin-700-normal.9f6a16a7770c87b2042b.woff +0 -0
  114. package/frontend/build/static/media/roboto-latin-ext-300-normal.14982a9e4857a93b6dce.woff +0 -0
  115. package/frontend/build/static/media/roboto-latin-ext-300-normal.97cbc447d4a8d41a9543.woff2 +0 -0
  116. package/frontend/build/static/media/roboto-latin-ext-400-normal.27da5b36b6d3a16f53f4.woff +0 -0
  117. package/frontend/build/static/media/roboto-latin-ext-400-normal.2eeae187764baf05867d.woff2 +0 -0
  118. package/frontend/build/static/media/roboto-latin-ext-500-normal.06c30711d588145a4541.woff +0 -0
  119. package/frontend/build/static/media/roboto-latin-ext-500-normal.9a18d7bb9ff7a6af7b32.woff2 +0 -0
  120. package/frontend/build/static/media/roboto-latin-ext-700-normal.18841836e391d39e83a8.woff2 +0 -0
  121. package/frontend/build/static/media/roboto-latin-ext-700-normal.3c5bcdd0e69c4c3ffafe.woff +0 -0
  122. package/frontend/build/static/media/roboto-vietnamese-300-normal.c96b16e5c05c7b7c3e89.woff2 +0 -0
  123. package/frontend/build/static/media/roboto-vietnamese-300-normal.f5e7cea32756dfe7af40.woff +0 -0
  124. package/frontend/build/static/media/roboto-vietnamese-400-normal.0dc97c66f9b542d6fa17.woff +0 -0
  125. package/frontend/build/static/media/roboto-vietnamese-400-normal.d3f8e26d6c27de8102b6.woff2 +0 -0
  126. package/frontend/build/static/media/roboto-vietnamese-500-normal.090fabef926bdc0e9b9f.woff2 +0 -0
  127. package/frontend/build/static/media/roboto-vietnamese-500-normal.23b7b8a2524d2d4b637b.woff +0 -0
  128. package/frontend/build/static/media/roboto-vietnamese-700-normal.0a79a9fabfc32e33f360.woff2 +0 -0
  129. package/frontend/build/static/media/roboto-vietnamese-700-normal.35ed0597568ff6f19c16.woff +0 -0
  130. package/npm-shrinkwrap.json +117 -36
  131. package/package.json +8 -3
  132. package/dist/matterbridgeController.d.ts +0 -24
  133. package/dist/matterbridgeController.d.ts.map +0 -1
  134. package/dist/matterbridgeController.js +0 -386
  135. package/dist/matterbridgeController.js.map +0 -1
  136. package/frontend/build/static/css/main.1cf003ae.css +0 -2
  137. package/frontend/build/static/css/main.1cf003ae.css.map +0 -1
  138. package/frontend/build/static/js/main.045d08f7.js +0 -3
  139. package/frontend/build/static/js/main.045d08f7.js.map +0 -1
@@ -1,386 +0,0 @@
1
- /**
2
- * This file contains the class MatterbridgeController.
3
- *
4
- * @file matterbridge.ts
5
- * @author Luca Liguori
6
- * @date 2023-12-29
7
- * @version 1.2.0
8
- *
9
- * Copyright 2023, 2024, 2025 Luca Liguori.
10
- *
11
- * Licensed under the Apache License, Version 2.0 (the "License");
12
- * you may not use this file except in compliance with the License.
13
- * You may obtain a copy of the License at
14
- *
15
- * http://www.apache.org/licenses/LICENSE-2.0
16
- *
17
- * Unless required by applicable law or agreed to in writing, software
18
- * distributed under the License is distributed on an "AS IS" BASIS,
19
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
20
- * See the License for the specific language governing permissions and
21
- * limitations under the License. *
22
- */
23
- /*
24
- import { MatterbridgeDevice, SerializedMatterbridgeDevice } from './matterbridgeDevice.js';
25
-
26
- import { NodeStorageManager, NodeStorage } from 'node-persist-manager';
27
- import { AnsiLogger, BRIGHT, RESET, TimestampFormat, UNDERLINE, UNDERLINEOFF, YELLOW, db, debugStringify, stringify, er, nf, rs, wr } from 'node-ansi-logger';
28
- import { fileURLToPath, pathToFileURL } from 'url';
29
- import { promises as fs } from 'fs';
30
- import express from 'express';
31
- import os from 'os';
32
- import path from 'path';
33
-
34
- import { CommissioningController, CommissioningServer, MatterServer } from '@project-chip/matter-node.js';
35
- import { BasicInformationCluster, BridgedDeviceBasicInformationCluster, ClusterServer } from '@project-chip/matter-node.js/cluster';
36
- import { DeviceTypeId, EndpointNumber, VendorId } from '@project-chip/matter-node.js/datatype';
37
- import { Aggregator, Device, DeviceTypes } from '@project-chip/matter-node.js/device';
38
- import { Format, Level, Logger } from '@project-chip/matter-node.js/log';
39
- import { QrCodeSchema } from '@project-chip/matter-node.js/schema';
40
- import { StorageBackendDisk, StorageBackendJsonFile, StorageContext, StorageManager } from '@project-chip/matter-node.js/storage';
41
- import { requireMinNodeVersion, getParameter, getIntParameter, hasParameter } from '@project-chip/matter-node.js/util';
42
- import { CryptoNode } from '@project-chip/matter-node.js/crypto';
43
- import { logEndpoint } from '@project-chip/matter-node.js/device';
44
- import { Matterbridge } from './matterbridge.js';
45
- */
46
- export function startController() {
47
- /*
48
- npm run matter-controller -- --log-level=debug --storage-clear --pairingcode=05410803219
49
- -- undefined-0-53 id: 0 name: channel: 25
50
- -- undefined-0-53 id: 1 name: routingRole: 5
51
- -- undefined-0-53 id: 2 name: networkName: MyHome32
52
- -- undefined-0-53 id: 3 name: panId: 32477
53
- -- undefined-0-53 id: 4 name: extendedPanId: 8704323698196694754
54
- -- undefined-0-53 id: 5 name: meshLocalPrefix: "40fd78cbf849390000"
55
- */
56
- // const log: AnsiLogger;
57
- /*
58
- async startController() {
59
- this.log.info('Creating mattercontrollerContext: mattercontrollerContext');
60
- mattercontrollerContext = storageManager.createContext('mattercontrollerContext');
61
-
62
- await createMatterServer(storageManager);
63
-
64
- this.log.info('Creating matter commissioning controller');
65
- commissioningController = new CommissioningController({
66
- autoConnect: false,
67
- });
68
- await matterServer.addCommissioningController(commissioningController);
69
-
70
- this.log.info('Starting matter server');
71
- await matterServer.start();
72
- this.log.info('Started matter server');
73
-
74
- AllClustersMap[EveHistoryCluster.id] = EveHistoryCluster;
75
- this.log.info('Added custom cluster:', getClusterNameById(EveHistoryCluster.id));
76
-
77
- if (hasParameter('ble')) {
78
- //
79
- }
80
-
81
- if (hasParameter('pairingcode')) {
82
- const pairingCode = getParameter('pairingcode');
83
- const ip = mattercontrollerContext.has('ip') ? mattercontrollerContext.get<string>('ip') : undefined;
84
- const port = mattercontrollerContext.has('port') ? mattercontrollerContext.get<number>('port') : undefined;
85
-
86
- let longDiscriminator, setupPin, shortDiscriminator;
87
- if (pairingCode !== undefined) {
88
- const pairingCodeCodec = ManualPairingCodeCodec.decode(pairingCode);
89
- shortDiscriminator = pairingCodeCodec.shortDiscriminator;
90
- longDiscriminator = undefined;
91
- setupPin = pairingCodeCodec.passcode;
92
- logger.debug(`Data extracted from pairing code: ${Logger.toJSON(pairingCodeCodec)}`);
93
- } else {
94
- longDiscriminator = mattercontrollerContext.get('longDiscriminator', 3840);
95
- if (longDiscriminator > 4095) throw new Error('Discriminator value must be less than 4096');
96
- setupPin = mattercontrollerContext.get('pin', 20202021);
97
- }
98
- if ((shortDiscriminator === undefined && longDiscriminator === undefined) || setupPin === undefined) {
99
- throw new Error('Please specify the longDiscriminator of the device to commission with -longDiscriminator or provide a valid passcode with -passcode');
100
- }
101
-
102
- const commissioningOptions: CommissioningOptions = {
103
- regulatoryLocation: GeneralCommissioning.RegulatoryLocationType.IndoorOutdoor,
104
- regulatoryCountryCode: 'XX',
105
- };
106
- const options = {
107
- commissioning: commissioningOptions,
108
- discovery: {
109
- knownAddress: ip !== undefined && port !== undefined ? { ip, port, type: 'udp' } : undefined,
110
- identifierData: longDiscriminator !== undefined ? { longDiscriminator } : shortDiscriminator !== undefined ? { shortDiscriminator } : {},
111
- },
112
- passcode: setupPin,
113
- } as NodeCommissioningOptions;
114
- this.log.info(`Commissioning ... ${JSON.stringify(options)}`);
115
- const nodeId = await commissioningController.commissionNode(options);
116
- mattercontrollerContext.set('nodeId', nodeId.nodeId);
117
- this.log.info(`Commissioning successfully done with nodeId: ${nodeId.nodeId}`);
118
- console.log('ActiveSessionInformation:', commissioningController.getActiveSessionInformation());
119
- } // (hasParameter('pairingcode'))
120
-
121
- if (hasParameter('discover')) {
122
- Logger.defaultLogLevel = Level.DEBUG;
123
- const discover = await commissioningController.discoverCommissionableDevices({});
124
- console.log(discover);
125
- Logger.defaultLogLevel = Level.INFO;
126
- }
127
-
128
- this.log.info(`Commissioning controller is already commisioned: ${commissioningController.isCommissioned()}`);
129
- const nodes = commissioningController.getCommissionedNodes();
130
- nodes.forEach(async (nodeId) => {
131
- this.log.warn(`Connecting to commissioned node: ${nodeId}`);
132
- const node = await commissioningController.connectNode(nodeId, {
133
- attributeChangedCallback: (peerNodeId, { path: { nodeId, clusterId, endpointId, attributeName }, value }) =>
134
- console.log(`\x1b[37;44mattributeChangedCallback ${peerNodeId}: Attribute ${nodeId}/${endpointId}/${clusterId}/${attributeName} changed to ${Logger.toJSON(value)}\x1b[40;0m`),
135
- eventTriggeredCallback: (peerNodeId, { path: { nodeId, clusterId, endpointId, eventName }, events }) =>
136
- console.log(`\x1b[37;44meventTriggeredCallback ${peerNodeId}: Event ${nodeId}/${endpointId}/${clusterId}/${eventName} triggered with ${Logger.toJSON(events)}\x1b[40;0m`),
137
- stateInformationCallback: (peerNodeId, info) => {
138
- switch (info) {
139
- case NodeStateInformation.Connected:
140
- console.log(`\x1b[37;44mstateInformationCallback ${peerNodeId}: Node ${nodeId} connected\x1b[40;0m`);
141
- break;
142
- case NodeStateInformation.Disconnected:
143
- console.log(`\x1b[37;44mstateInformationCallback ${peerNodeId}: Node ${nodeId} disconnected\x1b[40;0m`);
144
- break;
145
- case NodeStateInformation.Reconnecting:
146
- console.log(`\x1b[37;44mstateInformationCallback ${peerNodeId}: Node ${nodeId} reconnecting\x1b[40;0m`);
147
- break;
148
- case NodeStateInformation.WaitingForDeviceDiscovery:
149
- console.log(`\x1b[37;44mstateInformationCallback ${peerNodeId}: Node ${nodeId} waiting for device discovery\x1b[40;0m`);
150
- break;
151
- case NodeStateInformation.StructureChanged:
152
- console.log(`\x1b[37;44mstateInformationCallback ${peerNodeId}: Node ${nodeId} structure changed\x1b[40;0m`);
153
- break;
154
- case NodeStateInformation.Decommissioned:
155
- console.log(`\x1b[37;44mstateInformationCallback ${peerNodeId}: Node ${nodeId} decommissioned\x1b[40;0m`);
156
- break;
157
- default:
158
- console.log(`\x1b[37;44mstateInformationCallback ${peerNodeId}: Node ${nodeId} NodeStateInformation.${info}\x1b[40;0m`);
159
- break;
160
- }
161
- },
162
- });
163
-
164
- const info = node.getRootClusterClient(BasicInformationCluster);
165
- let name = '';
166
- if (info !== undefined) {
167
- this.log.info(`Node ${nodeId} VendorName ${await info.getVendorNameAttribute()}`); // This call is executed remotely
168
- this.log.info(`Node ${nodeId} ProductName ${(name = await info.getProductNameAttribute())}`); // This call is executed remotely
169
- this.log.info(`Node ${nodeId} NodeLabel ${await info.getNodeLabelAttribute()}`); // This call is executed remotely
170
- this.log.info(`Node ${nodeId} ProductLabel ${await info.getProductLabelAttribute()}`); // This call is executed remotely
171
- this.log.info(`Node ${nodeId} SerialNumber ${await info.getSerialNumberAttribute()}`); // This call is executed remotely
172
- this.log.info(`Node ${nodeId} UniqueId ${await info.getUniqueIdAttribute()}`); // This call is executed remotely
173
- } else {
174
- this.log.error('No BasicInformation Cluster found. This should never happen!');
175
- }
176
-
177
- this.log.warn(`Logging commissioned node: ${nodeId} name: ${name}`);
178
- //node.logStructure();
179
-
180
- const mattercontrollerNodeContext = storageManager.createContext(name);
181
- const interactionClient = await node.getInteractionClient();
182
-
183
- // Log BasicInformationCluster
184
- const attributesInfoCluster = await interactionClient.getMultipleAttributes({
185
- attributes: [{ clusterId: BasicInformationCluster.id }],
186
- });
187
- attributesInfoCluster.forEach((attribute) => {
188
- this.log.info(
189
- `${name}:BasicInformationCluster ${attribute.path.nodeId}-${attribute.path.endpointId}-${attribute.path.clusterId} id: ${attribute.path.attributeId} name: ${attribute.path.attributeName}: ${typeof attribute.value === 'object' ? stringify(attribute.value) : attribute.value}`,
190
- );
191
- });
192
-
193
- // Log PowerSourceConfigurationCluster
194
- const attributesPowerConfigCluster = await interactionClient.getMultipleAttributes({
195
- attributes: [{ clusterId: PowerSourceConfigurationCluster.id }],
196
- });
197
- attributesPowerConfigCluster.forEach((attribute) => {
198
- this.log.info(
199
- `${name}:PowerSourceConfigurationCluster ${attribute.path.nodeId}-${attribute.path.endpointId}-${attribute.path.clusterId} id: ${attribute.path.attributeId} name: ${attribute.path.attributeName}: ${typeof attribute.value === 'object' ? stringify(attribute.value) : attribute.value}`,
200
- );
201
- });
202
-
203
- // Log PowerSourceCluster
204
- const attributesPowerCluster = await interactionClient.getMultipleAttributes({
205
- attributes: [{ clusterId: PowerSourceCluster.id }],
206
- });
207
- attributesPowerCluster.forEach((attribute) => {
208
- this.log.info(
209
- `${name}:PowerSourceCluster ${attribute.path.nodeId}-${attribute.path.endpointId}-${attribute.path.clusterId} id: ${attribute.path.attributeId} name: ${attribute.path.attributeName}: ${typeof attribute.value === 'object' ? stringify(attribute.value) : attribute.value}`,
210
- );
211
- });
212
-
213
- // Log ThreadNetworkDiagnostics
214
- const attributesThreadCluster = await interactionClient.getMultipleAttributes({
215
- attributes: [{ clusterId: ThreadNetworkDiagnosticsCluster.id }],
216
- });
217
- attributesThreadCluster.forEach((attribute) => {
218
- this.log.info(
219
- `${name}:ThreadNetworkDiagnosticsCluster ${attribute.path.nodeId}-${attribute.path.endpointId}-${attribute.path.clusterId} id: ${attribute.path.attributeId} name: ${attribute.path.attributeName}: ${typeof attribute.value === 'object' ? stringify(attribute.value) : attribute.value}`,
220
- );
221
- });
222
-
223
- const devices = node.getDevices();
224
- devices.forEach(async (device) => {
225
- this.log.info(`Device id: ${device.id} name: ${device.name}`);
226
- //logEndpoint(device);
227
-
228
- const eveHistory = device.getClusterClient(EveHistoryCluster);
229
- if (eveHistory !== undefined) {
230
- this.log.info(`EveHistory found on id: ${device.id} name: ${device.name}`);
231
-
232
- // Log EveHistoryCluster
233
- const attributesEveHistoryCluster = await interactionClient.getMultipleAttributes({
234
- attributes: [{ clusterId: EveHistoryCluster.id }],
235
- });
236
- attributesEveHistoryCluster.forEach((attribute) => {
237
- this.log.info(
238
- `${name}:EveHistoryCluster ${attribute.path.nodeId}-${attribute.path.endpointId}-${attribute.path.clusterId} id: ${attribute.path.attributeId} name: ${attribute.path.attributeName}: ${typeof attribute.value === 'object' ? stringify(attribute.value) : attribute.value}`,
239
- );
240
- });
241
-
242
- const history = new MatterHistory(this.log, name, { fileName: name + '_history.json' });
243
- let logMessage = '';
244
-
245
- // Get and decode HistoryStatus
246
- const historyStatus: Uint8Array = await eveHistory.getHistoryStatusAttribute();
247
- this.log.info((logMessage = history.decodeHistoryStatus(Buffer.from(historyStatus))));
248
- fs.appendFileSync(name + '.log', logMessage + '\n');
249
-
250
- // Set HistorySetTime
251
- const bufferSetTime = history.encodeHistorySetTime();
252
- this.log.info((logMessage = history.decodeHistorySetTime(bufferSetTime)));
253
- fs.appendFileSync(name + '.log', logMessage + '\n');
254
- await eveHistory.setHistorySetTimeAttribute(bufferSetTime);
255
-
256
- // Set HistoryRequest
257
- const entryNumber = mattercontrollerNodeContext.get('nextEntry', history.getFirstEntry());
258
- const bufferRequest = history.encodeHistoryRequest(history.clamp(entryNumber, history.getFirstEntry(), history.getLastEntry()));
259
- this.log.info((logMessage = history.decodeHistoryRequest(bufferRequest)));
260
- fs.appendFileSync(name + '.log', logMessage + '\n');
261
- await eveHistory.setHistoryRequestAttribute(bufferRequest);
262
-
263
- // Get HistoryEntries
264
- let historyEntries: Uint8Array = await eveHistory.getHistoryEntriesAttribute();
265
- let bufferHistoryEntries = Buffer.from(historyEntries);
266
- //console.log(history.historyEntriesToString(bufferHistoryEntries));
267
- while (bufferHistoryEntries.length > 0) {
268
- for (let i = 0; i < bufferHistoryEntries.length; ) {
269
- const bufferHistoryEntry = Buffer.copyBytesFrom(bufferHistoryEntries, i, bufferHistoryEntries.readUInt8(i));
270
- i += bufferHistoryEntries.readUInt8(i);
271
- history.decodeHistoryEntry(bufferHistoryEntry);
272
- this.log.info((logMessage = history.historyEntryToString(bufferHistoryEntry)));
273
- fs.appendFileSync(name + '.log', logMessage + '\n');
274
- mattercontrollerNodeContext.set('nextEntry', bufferHistoryEntry.readUInt32LE(1) + 1);
275
- }
276
- historyEntries = await eveHistory.getHistoryEntriesAttribute();
277
- bufferHistoryEntries = Buffer.from(historyEntries);
278
- //console.log(history.historyEntriesToString(bufferHistoryEntries));
279
- }
280
- history.writeHistoryFile();
281
- //history.logHistory(true);
282
-
283
- eveHistory
284
- .subscribeHistoryStatusAttribute(
285
- (value: Uint8Array) => {
286
- this.log.warn('Received EveHistoryStatus:', value.toHex());
287
- },
288
- 0,
289
- 30,
290
- )
291
- .then(() => {
292
- this.log.warn('Subscription successful to EveHistoryStatus.');
293
- })
294
- .catch((error) => {
295
- this.log.error('Error during subscription to EveHistoryStatus:', error);
296
- });
297
-
298
- eveHistory
299
- .subscribeHistoryEntriesAttribute(
300
- (value: Uint8Array) => {
301
- this.log.warn('Received EveHistoryEntries:', value.toHex());
302
- },
303
- 0,
304
- 30,
305
- )
306
- .then(() => {
307
- this.log.warn('Subscription successful to EveHistoryEntries.');
308
- })
309
- .catch((error) => {
310
- this.log.error('Error during subscription to EveHistoryEntries:', error);
311
- });
312
-
313
- setInterval(async () => {
314
- try {
315
- const attributesEveCluster = await interactionClient.getMultipleAttributes({
316
- attributes: [{ clusterId: EveHistoryCluster.id }],
317
- });
318
- this.log.info('\x1b[97;45mEve device: ' + name + '\x1b[40;0m');
319
-
320
- attributesEveCluster.forEach((attribute) => {
321
- if (attribute.path.attributeId === EveHistoryCluster.attributes.ConfigDataGet.id) {
322
- const data = Buffer.from(attribute.value);
323
- logMessage = `ConfigDataGet(${data.length}): [${data.toHex()}]`;
324
- this.log.info(logMessage);
325
- this.log.info('*' + history.decodeConfigData(data));
326
- fs.appendFileSync(name + '.config.log', logMessage + '\n');
327
- } else if (attribute.path.attributeId === EveHistoryCluster.attributes.HistoryStatus.id) {
328
- logMessage = history.decodeHistoryStatus(Buffer.from(attribute.value));
329
- this.log.info(logMessage);
330
- fs.appendFileSync(name + '.log', logMessage + '\n');
331
- } else if (attribute.path.attributeId === EveHistoryCluster.attributes.HistoryEntries.id) {
332
- const bufferHistoryEntries = Buffer.from(attribute.value);
333
- for (let i = 0; i < bufferHistoryEntries.length; ) {
334
- const bufferHistoryEntry = Buffer.copyBytesFrom(bufferHistoryEntries, i, bufferHistoryEntries.readUInt8(i));
335
- i += bufferHistoryEntries.readUInt8(i);
336
- history.decodeHistoryEntry(bufferHistoryEntry);
337
- this.log.info((logMessage = history.historyEntryToString(bufferHistoryEntry)));
338
- fs.appendFileSync(name + '.log', logMessage + '\n');
339
- }
340
- history.writeHistoryFile();
341
- } else if (attribute.path.attributeId === EveHistoryCluster.attributes.TimesOpened.id) {
342
- this.log.info(`TimesOpened: ${attribute.value}`);
343
- } else if (attribute.path.attributeId === EveHistoryCluster.attributes.LastEvent.id) {
344
- this.log.info(`LastEvent: ${attribute.value}=${history.secsToDateString(attribute.value + history.getInitialTime() - history.getTimeOffset())}`);
345
- } else if (attribute.path.attributeId === EveHistoryCluster.attributes.ResetTotal.id) {
346
- this.log.info(`ResetTotal: ${attribute.value}=${history.secsToDateStringSinceEveEpoch(attribute.value)}`);
347
- } else if (attribute.path.attributeId === EveHistoryCluster.attributes.Voltage.id) {
348
- this.log.info(`Voltage: ${attribute.value}`);
349
- } else if (attribute.path.attributeId === EveHistoryCluster.attributes.Current.id) {
350
- this.log.info(`Current: ${attribute.value}`);
351
- } else if (attribute.path.attributeId === EveHistoryCluster.attributes.Consumption.id) {
352
- this.log.info(`Consumption: ${attribute.value}`);
353
- } else if (attribute.path.attributeId === EveHistoryCluster.attributes.TotalConsumption.id) {
354
- this.log.info(`TotalConsumption: ${attribute.value}`);
355
- } else if (attribute.path.attributeId === EveHistoryCluster.attributes.ChildLock.id) {
356
- this.log.info(`ChildLock: ${attribute.value}`);
357
- } else if (attribute.path.attributeId === EveHistoryCluster.attributes.MotionSensitivity.id) {
358
- this.log.info(`MotionSensitivity: ${attribute.value}`);
359
- } else if (attribute.path.attributeId === EveHistoryCluster.attributes.RLoc.id) {
360
- this.log.info((logMessage = `RLoc: 0x${attribute.value.toString(16)}`));
361
- } else {
362
- if (attribute.path.attributeId >= 0x130a0000) {
363
- this.log.info(`Unknown attribute ${attribute.path.attributeName} type: ${typeof attribute.value} value: [${attribute.value.toString(16)}]${attribute.value}`);
364
- }
365
- }
366
- });
367
- } catch (error) {
368
- console.error(error);
369
- }
370
- }, 30000);
371
- } else {
372
- this.log.info(`EveHistory not found on ${device.id} name: ${device.name}`);
373
- }
374
- }); // devices.forEach(async device => {
375
- }); // nodes.forEach(async nodeId => {
376
-
377
- if (hasParameter('unpairall')) {
378
- nodes.forEach(async (nodeId) => {
379
- await commissioningController.removeNode(nodeId);
380
- });
381
- process.exit(0);
382
- }
383
- }
384
- */
385
- }
386
- //# sourceMappingURL=matterbridgeController.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"matterbridgeController.js","sourceRoot":"","sources":["../src/matterbridgeController.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAEH;;;;;;;;;;;;;;;;;;;;;;EAsBE;AACF,MAAM,UAAU,eAAe;IAC7B;;;;;;;;IAQA;IACA,yBAAyB;IACzB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;MAuUE;AACJ,CAAC"}
@@ -1,2 +0,0 @@
1
- body{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen,Ubuntu,Cantarell,Fira Sans,Droid Sans,Helvetica Neue,sans-serif;margin:0}code{font-family:source-code-pro,Menlo,Monaco,Consolas,Courier New,monospace}.tooltip-container{display:inline-block;position:relative}.tooltip-text{background-color:#555;border-radius:6px;bottom:calc(100% + 10px);color:#fff;font-size:12px;left:50%;margin-left:-60px;opacity:0;padding:5px;position:absolute;text-align:center;transition:opacity .3s;visibility:hidden;z-index:1}.tooltip-container:hover{cursor:pointer}.tooltip-container:hover .tooltip-text{opacity:1;visibility:visible}.status-enabled{background-color:green}.status-disabled,.status-enabled{border-radius:.25rem;box-shadow:2px 2px 2px #0003;color:#fff;cursor:pointer;font-size:12px;padding:.2rem;text-align:center}.status-disabled{background-color:red}.status-information{background-color:#9e9e9e;color:#fff}.status-information,.status-warning{border-radius:.25rem;box-shadow:2px 2px 2px #0003;cursor:pointer;font-size:12px;padding:2px 10px;text-align:center}.status-warning{background-color:#e9db18;color:#000}.status-sponsor{background-color:#b6409c;padding:2px 10px}.status-blue,.status-sponsor{border-radius:.25rem;box-shadow:2px 2px 2px #0003;color:#fff;cursor:pointer;font-size:12px;text-align:center}.status-blue{background-color:#5f8c9e;padding:.2rem}.PluginsIconButton{color:#000;gap:0;padding:0}.removeHeaderButton{color:#4caf50}.menu-background{background-color:#e2e2e2}.main-background{background-color:#c4c2c2}.header{gap:20px;height:40px;justify-content:flex-start;margin:0;padding:0}.header,nav{align-items:center;display:flex}.nav-link{color:#333;font-size:20px;margin:0 10px;text-decoration:none;transition:color .3s ease}.nav-link:hover{color:#007bff}.nav-link:hodddver{color:red}table{border-collapse:collapse;width:100%}thead{border:1px solid #ddd;position:-webkit-sticky;position:sticky;top:0;z-index:auto}thead th{background:#4caf50;color:#fff}tbody td,thead th{border:1px solid #ddd;padding:5px 10px;text-align:left}tbody td{font-size:14px;margin:0}.table-content-even{background-color:#bdbdbd}.table-content-odd{background-color:#9e9e9e}.table-content-selected{background-color:#5f8c9e}h3{margin:0}.MbfPageDiv{gap:20px;height:calc(100% - 60px);margin:0;padding:0;width:100%}.MbfPageDiv,.MbfWindowDiv{display:flex;flex-direction:column}.MbfWindowDiv{background-color:#9e9e9e;border:1px solid #ddd;box-shadow:5px 5px 10px #888;box-sizing:border-box}.MbfWindowDivTable{display:flex;display:block;flex:1 1 auto;flex-direction:column;gap:0;margin:-1px;overflow:auto;padding:0}.MbfWindowHeader{background-color:#4caf50;border-bottom:1px solid #ddd;box-sizing:border-box;padding:0;width:100%}.MbfWindowFooter,.MbfWindowHeader{align-items:center;display:"flex";margin:0}.MbfWindowFooter{color:#000;height:40px;justify-content:center;padding:0 10px 10px}.MbfWindowHeaderText{color:#fff;font-weight:700;margin:0;padding:5px 10px}.MbfWindowBodyColumn{flex:1 1 auto;flex-direction:column;padding:10px 0;width:100%}.MbfWindowBodyColumn,.MbfWindowBodyRow{display:flex;gap:0;margin:0;overflow:auto}.MbfWindowBodyRow{flex:1 1 auto;flex-direction:row;height:100%;padding:0}.MbfScreen{background-color:#c4c2c2;display:flex;flex-direction:column;gap:20px;height:calc(100vh - 40px);margin:0;padding:20px;width:calc(100vw - 40px)}@media (max-width:1600px){.MbfScreen{height:800px;width:1600px}}
2
- /*# sourceMappingURL=main.1cf003ae.css.map*/
@@ -1 +0,0 @@
1
- {"version":3,"file":"static/css/main.1cf003ae.css","mappings":"AAAA,KAKE,kCAAmC,CACnC,iCAAkC,CAJlC,mIAEY,CAHZ,QAMF,CAEA,KACE,uEAEF,CCTA,mBAEE,oBAAqB,CADrB,iBAEF,CAKA,cAEE,qBAAsB,CAItB,iBAAkB,CAIlB,wBAAyB,CAPzB,UAAW,CAaX,cAAe,CALf,QAAS,CACT,iBAAkB,CAElB,SAAU,CATV,WAAgB,CAGhB,iBAAkB,CAJlB,iBAAkB,CAWlB,sBAAwB,CAdxB,iBAAkB,CAQlB,SAQF,CAEA,yBACE,cACF,CAEA,uCAEE,SAAU,CADV,kBAEF,CAGA,gBACE,sBAQF,CAEA,iCAPE,oBAAsB,CAItB,4BAA0C,CAN1C,UAAY,CAKZ,cAAe,CADf,cAAe,CAHf,aAAe,CAEf,iBAeF,CATA,iBACE,oBAQF,CAEA,oBACE,wBAAyB,CACzB,UAUF,CAEA,oCAPE,oBAAsB,CAItB,4BAA0C,CAD1C,cAAe,CADf,cAAe,CAHf,gBAAgB,CAEhB,iBAkBF,CAZA,gBACE,wBAAyB,CACzB,UAUF,CAEA,gBACE,wBAAyB,CAKzB,gBAMF,CAEA,6BAPE,oBAAsB,CAItB,4BAA0C,CAT1C,UAAY,CAQZ,cAAe,CADf,cAAe,CADf,iBAeF,CATA,aACE,wBAAyB,CAEzB,aAMF,CAIA,mBACE,UAAc,CAEd,KAAM,CADN,SAEF,CAEA,oBACE,aACF,CAEA,iBACE,wBACF,CAEA,iBACE,wBACF,CAGA,QAIE,QAAS,CAGT,WAAY,CAJZ,0BAA2B,CAE3B,QAAS,CACT,SAEF,CAGA,YATE,kBAAmB,CADnB,YAaF,CAGA,UAIE,UAAW,CAFX,cAAe,CADf,aAAc,CAEd,oBAAqB,CAErB,yBACF,CAEA,gBACE,aACF,CAEA,mBACE,SACF,CAGA,MACE,wBAAyB,CACzB,UACF,CAEA,MAGE,qBAAsB,CAFtB,uBAAgB,CAAhB,eAAgB,CAChB,KAAM,CAEN,YACF,CAEA,SAME,kBAAmB,CADnB,UAGF,CAEA,kBATE,qBAAsB,CAGtB,gBAAkB,CAGlB,eAWF,CARA,SAOE,cAAe,CALf,QAMF,CAEA,oBACE,wBACF,CAEA,mBACE,wBACF,CAEA,wBACE,wBACF,CAEA,GACE,QACF,CAeA,YAOE,QAAS,CAJT,wBAAyB,CAEzB,QAAW,CACX,SAAY,CAFZ,UAIF,CAGA,0BAVE,YAAa,CACb,qBAgBF,CAPA,cAME,wBAAyB,CAFzB,qBAAsB,CADtB,4BAA6B,CAE7B,qBAEF,CAGA,mBACE,YAAa,CAOb,aAAc,CALd,aAAc,CADd,qBAAsB,CAItB,KAAM,CAFN,WAAY,CAGZ,aAAc,CAFd,SAIF,CAGA,iBAKE,wBAAyB,CADzB,4BAA6B,CAI7B,qBAAsB,CADtB,SAAY,CAJZ,UAMF,CAGA,kCAVE,kBAAmB,CADnB,cAAe,CAKf,QAeF,CATA,iBAKE,UAAY,CADZ,WAAY,CADZ,sBAAuB,CAKvB,mBACF,CAGA,qBACE,UAAY,CACZ,eAAiB,CACjB,QAAW,CAGX,gBACF,CAGA,qBAGE,aAAc,CADd,qBAAsB,CAItB,cAA0B,CAF1B,UAKF,CAGA,uCAXE,YAAa,CAMb,KAAQ,CAFR,QAAW,CAGX,aAcF,CAVA,kBAGE,aAAc,CADd,kBAAmB,CAEnB,WAAY,CAGZ,SAGF,CAGA,WAQE,wBAAyB,CAPzB,YAAa,CACb,qBAAsB,CAGtB,QAAS,CADT,yBAA0B,CAE1B,QAAS,CACT,YAAa,CAJb,wBAMF,CAGA,0BACE,WAEE,YAAa,CADb,YAEF,CACF","sources":["index.css","App.css"],"sourcesContent":["body {\n margin: 0;\n font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', 'Oxygen',\n 'Ubuntu', 'Cantarell', 'Fira Sans', 'Droid Sans', 'Helvetica Neue',\n sans-serif;\n -webkit-font-smoothing: antialiased;\n -moz-osx-font-smoothing: grayscale;\n}\n\ncode {\n font-family: source-code-pro, Menlo, Monaco, Consolas, 'Courier New',\n monospace;\n}\n","/* App.css */\r\n\r\n/* Tooltip style */\r\n.tooltip-container {\r\n position: relative;\r\n display: inline-block;\r\n}\r\n\r\n/*\r\nwidth: 120px;\r\n*/\r\n.tooltip-text {\r\n visibility: hidden;\r\n background-color: #555;\r\n color: #fff;\r\n text-align: center;\r\n padding: 5px 5px;\r\n border-radius: 6px;\r\n\r\n position: absolute;\r\n z-index: 1;\r\n bottom: calc(100% + 10px);\r\n left: 50%;\r\n margin-left: -60px;\r\n\r\n opacity: 0;\r\n transition: opacity 0.3s;\r\n font-size: 12px;\r\n}\r\n\r\n.tooltip-container:hover {\r\n cursor: pointer;\r\n}\r\n\r\n.tooltip-container:hover .tooltip-text {\r\n visibility: visible;\r\n opacity: 1;\r\n}\r\n\r\n/* StatusIndicator style */\r\n.status-enabled {\r\n background-color: green;\r\n color: white;\r\n padding: 0.2rem;\r\n border-radius: 0.25rem;\r\n text-align: center;\r\n font-size: 12px;\r\n cursor: pointer;\r\n box-shadow: 2px 2px 2px rgba(0, 0, 0, 0.2);\r\n}\r\n\r\n.status-disabled {\r\n background-color: red;\r\n color: white;\r\n padding: 0.2rem;\r\n border-radius: 0.25rem;\r\n text-align: center;\r\n font-size: 12px;\r\n cursor: pointer;\r\n box-shadow: 2px 2px 2px rgba(0, 0, 0, 0.2);\r\n}\r\n\r\n.status-information {\r\n background-color: #9e9e9e;\r\n color: white;\r\n padding-left: 10px;\r\n padding-right: 10px;\r\n padding-bottom: 2px;\r\n padding-top: 2px;\r\n border-radius: 0.25rem;\r\n text-align: center;\r\n font-size: 12px;\r\n cursor: pointer;\r\n box-shadow: 2px 2px 2px rgba(0, 0, 0, 0.2);\r\n}\r\n\r\n.status-warning {\r\n background-color: #e9db18;\r\n color: black;\r\n padding-left: 10px;\r\n padding-right: 10px;\r\n padding-bottom: 2px;\r\n padding-top: 2px;\r\n border-radius: 0.25rem;\r\n text-align: center;\r\n font-size: 12px;\r\n cursor: pointer;\r\n box-shadow: 2px 2px 2px rgba(0, 0, 0, 0.2);\r\n}\r\n\r\n.status-sponsor {\r\n background-color: #b6409c;\r\n color: white;\r\n padding-left: 10px;\r\n padding-right: 10px;\r\n padding-bottom: 2px;\r\n padding-top: 2px;\r\n border-radius: 0.25rem;\r\n text-align: center;\r\n font-size: 12px;\r\n cursor: pointer;\r\n box-shadow: 2px 2px 2px rgba(0, 0, 0, 0.2);\r\n}\r\n\r\n.status-blue {\r\n background-color: #5f8c9e;\r\n color: white;\r\n padding: 0.2rem;\r\n border-radius: 0.25rem;\r\n text-align: center;\r\n font-size: 12px;\r\n cursor: pointer;\r\n box-shadow: 2px 2px 2px rgba(0, 0, 0, 0.2);\r\n}\r\n\r\n/* Home page style */\r\n\r\n.PluginsIconButton {\r\n color: #000000;\r\n padding: 0;\r\n gap: 0;\r\n}\r\n\r\n.removeHeaderButton {\r\n color: #4CAF50;\r\n}\r\n\r\n.menu-background {\r\n background-color: #e2e2e2;\r\n}\r\n\r\n.main-background {\r\n background-color: #c4c2c2;\r\n}\r\n\r\n/* Header style */\r\n.header {\r\n display: flex;\r\n align-items: center;\r\n justify-content: flex-start;\r\n gap: 20px;\r\n margin: 0;\r\n padding: 0;\r\n height: 40px;\r\n}\r\n\r\n/* Navigation style */\r\nnav {\r\n display: flex;\r\n align-items: center;\r\n}\r\n\r\n/* Navigation in Header.js style */\r\n.nav-link {\r\n margin: 0 10px;\r\n font-size: 20px;\r\n text-decoration: none;\r\n color: #333;\r\n transition: color 0.3s ease;\r\n}\r\n\r\n.nav-link:hover {\r\n color: #007BFF;\r\n}\r\n\r\n.nav-link:hodddver {\r\n color: #ff0000;\r\n}\r\n\r\n/* Table style */\r\ntable {\r\n border-collapse: collapse;\r\n width: 100%;\r\n}\r\n\r\nthead {\r\n position: sticky;\r\n top: 0;\r\n border: 1px solid #ddd;\r\n z-index: auto;\r\n}\r\n\r\nthead th {\r\n border: 1px solid #ddd;\r\n padding: 5px;\r\n padding-right: 10px;\r\n padding-left: 10px;\r\n color: white;\r\n background: #4CAF50;\r\n text-align: left;\r\n}\r\n\r\ntbody td {\r\n border: 1px solid #ddd;\r\n margin: 0;\r\n padding: 5px;\r\n padding-right: 10px;\r\n padding-left: 10px;\r\n text-align: left;\r\n font-size: 14px;\r\n}\r\n\r\n.table-content-even {\r\n background-color: #bdbdbd;\r\n}\r\n\r\n.table-content-odd {\r\n background-color: #9e9e9e;\r\n}\r\n\r\n.table-content-selected {\r\n background-color: #5f8c9e;\r\n}\r\n\r\nh3 {\r\n margin: 0;\r\n}\r\n\r\n/* Mbf table content style \r\n.MbfWindowDiv table,\r\n.MbfWindowDiv table thead,\r\n.MbfWindowDiv table tbody,\r\n.MbfWindowDiv table tr,\r\n.MbfWindowDiv table th,\r\n.MbfWindowDiv table td {\r\n border: none;\r\n box-shadow: none;\r\n}\r\n*/\r\n\r\n/* Define the style for the main page element */\r\n.MbfPageDiv {\r\n display: flex;\r\n flex-direction: column;\r\n height: calc(100% - 60px);\r\n width: 100%;\r\n margin: 0px;\r\n padding: 0px;\r\n gap: 20px;\r\n}\r\n\r\n/* Define the style for the main div element */\r\n.MbfWindowDiv {\r\n display: flex;\r\n flex-direction: column;\r\n box-shadow: 5px 5px 10px #888;\r\n border: 1px solid #ddd;\r\n box-sizing: border-box;\r\n background-color: #9e9e9e;\r\n}\r\n\r\n/* Define the style for the main div element */\r\n.MbfWindowDivTable {\r\n display: flex;\r\n flex-direction: column;\r\n flex: 1 1 auto;\r\n margin: -1px;\r\n padding: 0;\r\n gap: 0;\r\n overflow: auto;\r\n display: block;\r\n}\r\n\r\n/* Define the style for the header element */\r\n.MbfWindowHeader {\r\n display: 'flex';\r\n align-items: center;\r\n width: 100%;\r\n border-bottom: 1px solid #ddd;\r\n background-color: #4CAF50;\r\n margin: 0px;\r\n padding: 0px;\r\n box-sizing: border-box;\r\n}\r\n\r\n/* Define the style for the header element */\r\n.MbfWindowFooter {\r\n display: 'flex';\r\n align-items: center;\r\n justify-content: center;\r\n height: 40px;\r\n color: black;\r\n margin: 0px;\r\n padding: 10px;\r\n padding-top: 0px;\r\n}\r\n\r\n/* Define the style for the header text element */\r\n.MbfWindowHeaderText {\r\n color: white;\r\n font-weight: bold;\r\n margin: 0px;\r\n padding: 5px;\r\n padding-right: 10px;\r\n padding-left: 10px;\r\n}\r\n\r\n/* Define the style for the body element width: 100%;*/\r\n.MbfWindowBodyColumn {\r\n display: flex;\r\n flex-direction: column;\r\n flex: 1 1 auto;\r\n width: 100%;\r\n margin: 0px;\r\n padding: 10px 0px 10px 0px;\r\n gap: 0px;\r\n overflow: auto;\r\n}\r\n\r\n/* Define the style for the body element */\r\n.MbfWindowBodyRow {\r\n display: flex;\r\n flex-direction: row;\r\n flex: 1 1 auto;\r\n height: 100%;\r\n padding: 0px 10px 0px 10px;\r\n margin: 0px;\r\n padding: 0px;\r\n gap: 0px;\r\n overflow: auto;\r\n}\r\n\r\n/* Table header style */\r\n.MbfScreen {\r\n display: flex;\r\n flex-direction: column;\r\n width: calc(100vw - 40px);\r\n height: calc(100vh - 40px);\r\n gap: 20px;\r\n margin: 0;\r\n padding: 20px;\r\n background-color: #c4c2c2;\r\n}\r\n\r\n/* Styles for mobile screens */\r\n@media (max-width: 1600px) {\r\n .MbfScreen {\r\n width: 1600px;\r\n height: 800px;\r\n }\r\n}"],"names":[],"sourceRoot":""}