@victronenergy/mfd-modules 11.1.4 → 11.1.6
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.
- package/dist/src/Modules/SwitchingPane/SwitchingPane.provider.d.ts.map +1 -1
- package/dist/src/Modules/SwitchingPane/SwitchingPane.provider.js +134 -193
- package/dist/src/Modules/SwitchingPane/SwitchingPane.provider.js.map +1 -1
- package/dist/src/Modules/SwitchingPane/SwitchingPane.store.d.ts.map +1 -1
- package/dist/src/Modules/SwitchingPane/SwitchingPane.store.js.map +1 -1
- package/package.json +5 -5
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SwitchingPane.provider.d.ts","sourceRoot":"/","sources":["src/Modules/SwitchingPane/SwitchingPane.provider.ts"],"names":[],"mappings":"AAKA,OAAO,EAAiC,yBAAyB,EAAE,MAAM,4BAA4B,CAAA;AACrG,OAAO,EAIL,kBAAkB,EAKnB,MAAM,6BAA6B,CAAA;AACpC,OAAO,EAA8B,cAAc,EAAE,MAAM,yBAAyB,CAAA;AAYpF,eAAO,MAAM,gBAAgB,GAAI,yBAAyB,MAAM,
|
|
1
|
+
{"version":3,"file":"SwitchingPane.provider.d.ts","sourceRoot":"/","sources":["src/Modules/SwitchingPane/SwitchingPane.provider.ts"],"names":[],"mappings":"AAKA,OAAO,EAAiC,yBAAyB,EAAE,MAAM,4BAA4B,CAAA;AACrG,OAAO,EAIL,kBAAkB,EAKnB,MAAM,6BAA6B,CAAA;AACpC,OAAO,EAA8B,cAAc,EAAE,MAAM,yBAAyB,CAAA;AAYpF,eAAO,MAAM,gBAAgB,GAAI,yBAAyB,MAAM,uDAqQ/D,CAAA;AAED,wBAAgB,2BAA2B,CAAC,KAAK,EAAE,MAAM;;cAQ8B,yBAAyB;cACjC,kBAAkB;EAEhG;AAED,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,MAAM;;cAQ0B,yBAAyB;aAC5B,cAAc;EAEzF;AAED,wBAAgB,WAAW,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,GAAG,OAAO,CAGtD"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { runInAction, untracked } from "mobx";
|
|
2
2
|
import Logger from "../../utils/logger";
|
|
3
3
|
import { useMqtt } from "../Mqtt";
|
|
4
4
|
import { useMemo, useEffect } from "react";
|
|
@@ -9,153 +9,89 @@ import { getGenericInputStateTopics } from "./GenericInput.provider";
|
|
|
9
9
|
import { remapGenericInputType, SWITCHABLE_OUTPUT_FUNCTION, SWITCHABLE_OUTPUT_VISIBILITY, } from "../../utils/constants";
|
|
10
10
|
const hasMessages = (messages) => messages && Object.keys(messages).length > 0;
|
|
11
11
|
export const useSwitchingPane = (gxDeviceRelaysGroupName) => {
|
|
12
|
-
const
|
|
13
|
-
const getTopics = (portalId) => ({
|
|
14
|
-
switchableOutputs: `N/${portalId}/(${SWITCHABLE_OUTPUT_TREES.join("|")})/+/SwitchableOutput/+/Settings/+`,
|
|
15
|
-
genericInputs: `N/${portalId}/(${SWITCHABLE_OUTPUT_TREES.join("|")})/+/GenericInput/+/Settings/+`,
|
|
16
|
-
switchingDevices: `N/${portalId}/switch/+`,
|
|
17
|
-
});
|
|
12
|
+
const store = useSwitchingPaneStore();
|
|
18
13
|
const mqtt = useMqtt();
|
|
19
|
-
const topics = useMemo(() =>
|
|
20
|
-
|
|
21
|
-
|
|
14
|
+
const topics = useMemo(() => ({
|
|
15
|
+
systemOutputs: `N/${mqtt.portalId}/system/+/SwitchableOutput/+/Settings/+`,
|
|
16
|
+
switchOutputs: `N/${mqtt.portalId}/switch/+/SwitchableOutput/+/Settings/+`,
|
|
17
|
+
genericInputs: `N/${mqtt.portalId}/switch/+/GenericInput/+/Settings/+`,
|
|
18
|
+
switchingDevices: `N/${mqtt.portalId}/switch/+`,
|
|
19
|
+
}), [mqtt.portalId]);
|
|
20
|
+
const messagesForSystemOutputs = mqtt.messagesByWildcard(topics.systemOutputs);
|
|
21
|
+
const messagesForSwitchOutputs = mqtt.messagesByWildcard(topics.switchOutputs);
|
|
22
|
+
const messagesForInputs = mqtt.messagesByWildcard(topics.genericInputs);
|
|
22
23
|
const messagesForSwitchingDevices = mqtt.messagesByWildcard(topics.switchingDevices);
|
|
23
|
-
// Examine MQTT to find all available switchable outputs, generic inputs, and their group assignments
|
|
24
24
|
useEffect(() => {
|
|
25
|
-
if (!hasMessages(
|
|
25
|
+
if (!hasMessages(messagesForSystemOutputs) &&
|
|
26
|
+
!hasMessages(messagesForSwitchOutputs) &&
|
|
27
|
+
!hasMessages(messagesForInputs)) {
|
|
26
28
|
Logger.log("Waiting for switchable outputs or generic inputs...");
|
|
27
29
|
return;
|
|
28
30
|
}
|
|
29
|
-
//
|
|
30
|
-
const
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
const
|
|
37
|
-
|
|
38
|
-
});
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
return Number(messagesForSwitchableOutputs[`${topic.slice(0, -"/Group".length)}/Type`]);
|
|
42
|
-
});
|
|
43
|
-
// All switchable outputs names in array sorted by topic
|
|
44
|
-
const availableSwitchableOutputNames = availableSwitchableOutputs.map((topic) => {
|
|
45
|
-
return messagesForSwitchableOutputs[`${topic.slice(0, -"/Group".length)}/CustomName`];
|
|
46
|
-
});
|
|
47
|
-
// All switchable outputs visibility in array sorted by topic
|
|
48
|
-
const availableSwitchableOutputVisibilityFlags = availableSwitchableOutputs.map((topic) => {
|
|
49
|
-
return Number(messagesForSwitchableOutputs[`${topic.slice(0, -"/Group".length)}/ShowUIControl`]);
|
|
50
|
-
});
|
|
51
|
-
// All switchable outputs functions in array sorted by topic
|
|
52
|
-
const availableSwitchableOutputFunctions = availableSwitchableOutputs.map((topic) => {
|
|
53
|
-
return Number(messagesForSwitchableOutputs[`${topic.slice(0, -"/Group".length)}/Function`]);
|
|
54
|
-
});
|
|
55
|
-
// All generic inputs in array sorted by topic
|
|
56
|
-
const availableGenericInputs = messagesForGenericInputs
|
|
57
|
-
? Object.keys(messagesForGenericInputs)
|
|
58
|
-
.filter((key) => key.endsWith("/Settings/Group"))
|
|
59
|
-
.sort()
|
|
60
|
-
: [];
|
|
61
|
-
// All generic input group assignments in array sorted by topic
|
|
62
|
-
const genericInputGroupAssignments = availableGenericInputs.map((topic) => {
|
|
63
|
-
return messagesForGenericInputs[topic];
|
|
64
|
-
});
|
|
65
|
-
// All generic input types in array sorted by topic
|
|
66
|
-
const availableGenericInputTypes = availableGenericInputs.map((topic) => {
|
|
67
|
-
return Number(messagesForGenericInputs[`${topic.slice(0, -"/Group".length)}/Type`]);
|
|
68
|
-
});
|
|
69
|
-
// All generic input names in array sorted by topic
|
|
70
|
-
const availableGenericInputNames = availableGenericInputs.map((topic) => {
|
|
71
|
-
return messagesForGenericInputs[`${topic.slice(0, -"/Group".length)}/CustomName`];
|
|
72
|
-
});
|
|
73
|
-
// All generic input visibility in array sorted by topic
|
|
74
|
-
const availableGenericInputVisibilityFlags = availableGenericInputs.map((topic) => {
|
|
75
|
-
return Number(messagesForGenericInputs[`${topic.slice(0, -"/Group".length)}/ShowUIInput`]);
|
|
76
|
-
});
|
|
77
|
-
// All switching devices in array sorted by instance number
|
|
78
|
-
const availableSwitchingDevices = Object.keys(messagesForSwitchingDevices)
|
|
79
|
-
.filter((key) => key.endsWith("/DeviceInstance"))
|
|
31
|
+
// --- Phase A: Extract comparison arrays from wildcard messages (cheap) ---
|
|
32
|
+
const messagesForOutputs = Object.assign(Object.assign({}, messagesForSystemOutputs), messagesForSwitchOutputs);
|
|
33
|
+
const outputGroupTopics = Object.keys(messagesForOutputs)
|
|
34
|
+
.filter((k) => k.endsWith("/Settings/Group"))
|
|
35
|
+
.sort();
|
|
36
|
+
const customGroupAssignments = outputGroupTopics.map((t) => messagesForOutputs[t]);
|
|
37
|
+
const outputTypes = outputGroupTopics.map((t) => Number(messagesForOutputs[`${t.slice(0, -"/Group".length)}/Type`]));
|
|
38
|
+
const outputNames = outputGroupTopics.map((t) => messagesForOutputs[`${t.slice(0, -"/Group".length)}/CustomName`]);
|
|
39
|
+
const outputVisibilityFlags = outputGroupTopics.map((t) => Number(messagesForOutputs[`${t.slice(0, -"/Group".length)}/ShowUIControl`]));
|
|
40
|
+
const outputFunctions = outputGroupTopics.map((t) => Number(messagesForOutputs[`${t.slice(0, -"/Group".length)}/Function`]));
|
|
41
|
+
const inputGroupTopics = Object.keys(messagesForInputs)
|
|
42
|
+
.filter((k) => k.endsWith("/Settings/Group"))
|
|
80
43
|
.sort();
|
|
81
|
-
|
|
82
|
-
const
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
44
|
+
const genericInputGroupAssignments = inputGroupTopics.map((t) => messagesForInputs[t]);
|
|
45
|
+
const genericInputTypes = inputGroupTopics.map((t) => Number(messagesForInputs[`${t.slice(0, -"/Group".length)}/Type`]));
|
|
46
|
+
const genericInputNames = inputGroupTopics.map((t) => messagesForInputs[`${t.slice(0, -"/Group".length)}/CustomName`]);
|
|
47
|
+
const genericInputVisibilityFlags = inputGroupTopics.map((t) => Number(messagesForInputs[`${t.slice(0, -"/Group".length)}/ShowUIInput`]));
|
|
48
|
+
const switchingDevices = Object.keys(messagesForSwitchingDevices)
|
|
49
|
+
.filter((k) => k.endsWith("/DeviceInstance"))
|
|
50
|
+
.sort();
|
|
51
|
+
const switchingDeviceNames = switchingDevices.map((t) => {
|
|
52
|
+
const prefix = t.slice(0, -"/DeviceInstance".length);
|
|
53
|
+
return messagesForSwitchingDevices[`${prefix}/CustomName`] || messagesForSwitchingDevices[`${prefix}/ProductName`];
|
|
86
54
|
});
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
const groupAssignmentsChanged = !arraysEqual(
|
|
91
|
-
if (groupAssignmentsChanged)
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
const
|
|
97
|
-
if (
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
const
|
|
103
|
-
if (
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
const
|
|
109
|
-
if (
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
const
|
|
115
|
-
if (
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
const
|
|
121
|
-
if (
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
if (switchingDeviceNamesChanged) {
|
|
128
|
-
switchingPaneStore.setSwitchingDeviceNames(newSwitchingDeviceNames);
|
|
129
|
-
}
|
|
130
|
-
const oldGiAssignments = switchingPaneStore.genericInputGroupAssignments;
|
|
131
|
-
const newGiAssignments = genericInputGroupAssignments;
|
|
132
|
-
const giGroupAssignmentsChanged = !arraysEqual(oldGiAssignments, newGiAssignments);
|
|
133
|
-
if (giGroupAssignmentsChanged) {
|
|
134
|
-
switchingPaneStore.setGenericInputGroupAssignments(newGiAssignments);
|
|
135
|
-
}
|
|
136
|
-
const oldGiTypes = switchingPaneStore.genericInputTypes;
|
|
137
|
-
const newGiTypes = availableGenericInputTypes;
|
|
138
|
-
const giTypesChanged = !arraysEqual(oldGiTypes, newGiTypes);
|
|
139
|
-
if (giTypesChanged) {
|
|
140
|
-
switchingPaneStore.setGenericInputTypes(newGiTypes);
|
|
141
|
-
}
|
|
142
|
-
const oldGiNames = switchingPaneStore.genericInputNames;
|
|
143
|
-
const newGiNames = availableGenericInputNames;
|
|
144
|
-
const giNamesChanged = !arraysEqual(oldGiNames, newGiNames);
|
|
145
|
-
if (giNamesChanged) {
|
|
146
|
-
switchingPaneStore.setGenericInputNames(newGiNames);
|
|
147
|
-
}
|
|
148
|
-
const oldGiVisibilityFlags = switchingPaneStore.genericInputVisibilityFlags;
|
|
149
|
-
const newGiVisibilityFlags = availableGenericInputVisibilityFlags;
|
|
150
|
-
const giVisibilityFlagsChanged = !arraysEqual(oldGiVisibilityFlags, newGiVisibilityFlags);
|
|
151
|
-
if (giVisibilityFlagsChanged) {
|
|
152
|
-
switchingPaneStore.setGenericInputVisibilityFlags(newGiVisibilityFlags);
|
|
153
|
-
}
|
|
154
|
-
// On initial population (all old arrays empty), skip per-field logging
|
|
155
|
-
const isInitialLoad = oldAssignments.length === 0 &&
|
|
156
|
-
oldOutputTypes.length === 0 &&
|
|
157
|
-
oldSwitchingDevices.length === 0 &&
|
|
158
|
-
oldGiAssignments.length === 0;
|
|
55
|
+
// --- Phase B: comparison guard, batched in a single action ---
|
|
56
|
+
runInAction(() => {
|
|
57
|
+
var _a, _b;
|
|
58
|
+
const groupAssignmentsChanged = !arraysEqual(store.customGroupAssignments, customGroupAssignments);
|
|
59
|
+
if (groupAssignmentsChanged)
|
|
60
|
+
store.setCustomGroupAssignments(customGroupAssignments);
|
|
61
|
+
const outputTypesChanged = !arraysEqual(store.outputTypes, outputTypes);
|
|
62
|
+
if (outputTypesChanged)
|
|
63
|
+
store.setOutputTypes(outputTypes);
|
|
64
|
+
const outputNamesChanged = !arraysEqual(store.outputNames, outputNames);
|
|
65
|
+
if (outputNamesChanged)
|
|
66
|
+
store.setOutputNames(outputNames);
|
|
67
|
+
const outputVisibilityFlagsChanged = !arraysEqual(store.outputVisibilityFlags, outputVisibilityFlags);
|
|
68
|
+
if (outputVisibilityFlagsChanged)
|
|
69
|
+
store.setOutputVisibilityFlags(outputVisibilityFlags);
|
|
70
|
+
const outputFunctionsChanged = !arraysEqual(store.outputFunctions, outputFunctions);
|
|
71
|
+
if (outputFunctionsChanged)
|
|
72
|
+
store.setOutputFunctions(outputFunctions);
|
|
73
|
+
const switchingDevicesChanged = !arraysEqual(store.switchingDevices, switchingDevices);
|
|
74
|
+
if (switchingDevicesChanged)
|
|
75
|
+
store.setSwitchingDevices(switchingDevices);
|
|
76
|
+
const switchingDeviceNamesChanged = !arraysEqual(store.switchingDeviceNames, switchingDeviceNames);
|
|
77
|
+
if (switchingDeviceNamesChanged)
|
|
78
|
+
store.setSwitchingDeviceNames(switchingDeviceNames);
|
|
79
|
+
const giGroupAssignmentsChanged = !arraysEqual(store.genericInputGroupAssignments, genericInputGroupAssignments);
|
|
80
|
+
if (giGroupAssignmentsChanged)
|
|
81
|
+
store.setGenericInputGroupAssignments(genericInputGroupAssignments);
|
|
82
|
+
const giTypesChanged = !arraysEqual(store.genericInputTypes, genericInputTypes);
|
|
83
|
+
if (giTypesChanged)
|
|
84
|
+
store.setGenericInputTypes(genericInputTypes);
|
|
85
|
+
const giNamesChanged = !arraysEqual(store.genericInputNames, genericInputNames);
|
|
86
|
+
if (giNamesChanged)
|
|
87
|
+
store.setGenericInputNames(genericInputNames);
|
|
88
|
+
const giVisibilityFlagsChanged = !arraysEqual(store.genericInputVisibilityFlags, genericInputVisibilityFlags);
|
|
89
|
+
if (giVisibilityFlagsChanged)
|
|
90
|
+
store.setGenericInputVisibilityFlags(genericInputVisibilityFlags);
|
|
91
|
+
const isInitialLoad = store.customGroupAssignments.length === 0 &&
|
|
92
|
+
store.outputTypes.length === 0 &&
|
|
93
|
+
store.switchingDevices.length === 0 &&
|
|
94
|
+
store.genericInputGroupAssignments.length === 0;
|
|
159
95
|
if (!isInitialLoad) {
|
|
160
96
|
if (groupAssignmentsChanged)
|
|
161
97
|
Logger.log(`Switchable outputs group assignments changed, recomputing...`);
|
|
@@ -191,83 +127,88 @@ export const useSwitchingPane = (gxDeviceRelaysGroupName) => {
|
|
|
191
127
|
giTypesChanged ||
|
|
192
128
|
giNamesChanged ||
|
|
193
129
|
giVisibilityFlagsChanged) {
|
|
194
|
-
// Collect all switching pane items (switchable outputs + generic inputs) with their group info
|
|
195
130
|
const items = [];
|
|
196
|
-
|
|
197
|
-
const
|
|
198
|
-
const
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
131
|
+
for (const topic of outputGroupTopics) {
|
|
132
|
+
const info = extractSwitchableOutputInfo(topic);
|
|
133
|
+
const { deviceName, output } = untracked(() => {
|
|
134
|
+
const device = mqtt.messagesByTopics(getSwitchingDeviceStateTopics(mqtt.portalId, info.tree, info.deviceId));
|
|
135
|
+
const out = mqtt.messagesByTopics(getSwitchableOutputStateTopics(mqtt.portalId, info.tree, info.deviceId, info.outputId));
|
|
136
|
+
return {
|
|
137
|
+
deviceName: device.customName || device.productName || gxDeviceRelaysGroupName,
|
|
138
|
+
output: out,
|
|
139
|
+
};
|
|
140
|
+
});
|
|
141
|
+
if (!(output.showUIControl & SWITCHABLE_OUTPUT_VISIBILITY.VISIBLE ||
|
|
142
|
+
output.showUIControl & SWITCHABLE_OUTPUT_VISIBILITY.VISIBLE_LOCAL_UI)) {
|
|
143
|
+
continue;
|
|
206
144
|
}
|
|
207
145
|
// GX system relays: only show when Function is Manual (matching gui-v2)
|
|
208
|
-
if (
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
146
|
+
if (info.tree === "system" &&
|
|
147
|
+
output.function != null &&
|
|
148
|
+
output.function !== SWITCHABLE_OUTPUT_FUNCTION.MANUAL) {
|
|
149
|
+
continue;
|
|
212
150
|
}
|
|
151
|
+
const customGroup = ((_a = messagesForOutputs[topic]) !== null && _a !== void 0 ? _a : "").trim();
|
|
213
152
|
items.push({
|
|
214
|
-
groupName,
|
|
215
|
-
item: Object.assign(Object.assign({},
|
|
153
|
+
groupName: customGroup === "" ? deviceName : customGroup,
|
|
154
|
+
item: Object.assign(Object.assign({}, output), { kind: "switchableOutput", tree: info.tree, deviceId: info.deviceId, outputId: info.outputId, parentDeviceName: deviceName }),
|
|
155
|
+
});
|
|
156
|
+
}
|
|
157
|
+
for (const topic of inputGroupTopics) {
|
|
158
|
+
const info = extractGenericInputInfo(topic);
|
|
159
|
+
const { deviceName, input } = untracked(() => {
|
|
160
|
+
const device = mqtt.messagesByTopics(getSwitchingDeviceStateTopics(mqtt.portalId, info.tree, info.deviceId));
|
|
161
|
+
const inp = mqtt.messagesByTopics(getGenericInputStateTopics(mqtt.portalId, info.tree, info.deviceId, info.inputId));
|
|
162
|
+
return {
|
|
163
|
+
deviceName: device.customName || device.productName || gxDeviceRelaysGroupName,
|
|
164
|
+
input: inp,
|
|
165
|
+
};
|
|
216
166
|
});
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
const switchingDevice = mqtt.messagesByTopics(getSwitchingDeviceStateTopics(mqtt.portalId, gi.tree, gi.deviceId));
|
|
221
|
-
const customGroupAssignment = genericInputGroupAssignments[index].trim();
|
|
222
|
-
const deviceName = switchingDevice.customName || switchingDevice.productName || gxDeviceRelaysGroupName;
|
|
223
|
-
const groupName = customGroupAssignment === "" ? deviceName : customGroupAssignment;
|
|
224
|
-
const genericInput = mqtt.messagesByTopics(getGenericInputStateTopics(mqtt.portalId, gi.tree, gi.deviceId, gi.inputId));
|
|
225
|
-
if (!(genericInput.showUIControl & SWITCHABLE_OUTPUT_VISIBILITY.VISIBLE ||
|
|
226
|
-
genericInput.showUIControl & SWITCHABLE_OUTPUT_VISIBILITY.VISIBLE_LOCAL_UI)) {
|
|
227
|
-
return;
|
|
167
|
+
if (!(input.showUIControl & SWITCHABLE_OUTPUT_VISIBILITY.VISIBLE ||
|
|
168
|
+
input.showUIControl & SWITCHABLE_OUTPUT_VISIBILITY.VISIBLE_LOCAL_UI)) {
|
|
169
|
+
continue;
|
|
228
170
|
}
|
|
171
|
+
const customGroup = ((_b = messagesForInputs[topic]) !== null && _b !== void 0 ? _b : "").trim();
|
|
229
172
|
items.push({
|
|
230
|
-
groupName,
|
|
231
|
-
item: Object.assign(Object.assign({},
|
|
173
|
+
groupName: customGroup === "" ? deviceName : customGroup,
|
|
174
|
+
item: Object.assign(Object.assign({}, input), { kind: "genericInput", tree: info.tree, deviceId: info.deviceId, outputId: info.inputId, parentDeviceName: deviceName, type: remapGenericInputType(input.type) }),
|
|
232
175
|
});
|
|
233
|
-
}
|
|
234
|
-
|
|
235
|
-
const
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
Object.values(newGroups).forEach((array) => {
|
|
242
|
-
array.sort((a, b) => {
|
|
176
|
+
}
|
|
177
|
+
const groups = {};
|
|
178
|
+
for (const { groupName, item } of items) {
|
|
179
|
+
;
|
|
180
|
+
(groups[groupName] || (groups[groupName] = [])).push(item);
|
|
181
|
+
}
|
|
182
|
+
for (const arr of Object.values(groups)) {
|
|
183
|
+
arr.sort((a, b) => {
|
|
243
184
|
const aName = getSwitchingPaneItemNameForDisplay(a, a.parentDeviceName);
|
|
244
185
|
const bName = getSwitchingPaneItemNameForDisplay(b, b.parentDeviceName);
|
|
245
186
|
return aName.localeCompare(bName);
|
|
246
187
|
});
|
|
247
|
-
}
|
|
248
|
-
Logger.log(`New switching pane groups: ${JSON.stringify(Object.keys(
|
|
249
|
-
|
|
188
|
+
}
|
|
189
|
+
Logger.log(`New switching pane groups: ${JSON.stringify(Object.keys(groups))}`);
|
|
190
|
+
store.setGroups(groups);
|
|
250
191
|
}
|
|
251
192
|
});
|
|
252
|
-
return () => dispose();
|
|
253
193
|
}, [
|
|
254
|
-
|
|
255
|
-
|
|
194
|
+
messagesForSystemOutputs,
|
|
195
|
+
messagesForSwitchOutputs,
|
|
196
|
+
messagesForInputs,
|
|
256
197
|
messagesForSwitchingDevices,
|
|
257
198
|
gxDeviceRelaysGroupName,
|
|
258
199
|
mqtt,
|
|
259
|
-
|
|
200
|
+
store,
|
|
260
201
|
]);
|
|
261
|
-
return
|
|
202
|
+
return store;
|
|
262
203
|
};
|
|
263
204
|
export function extractSwitchableOutputInfo(topic) {
|
|
264
205
|
var _a;
|
|
265
206
|
const pattern = new RegExp(`/(${SWITCHABLE_OUTPUT_TREES.join("|")})/`);
|
|
266
207
|
const match = topic.match(pattern);
|
|
267
|
-
const switchStart = match ? match.index + match[0].length : -1;
|
|
268
|
-
const outputStart = topic.indexOf("/SwitchableOutput/") + 18;
|
|
208
|
+
const switchStart = match ? match.index + match[0].length : -1;
|
|
209
|
+
const outputStart = topic.indexOf("/SwitchableOutput/") + 18;
|
|
269
210
|
return {
|
|
270
|
-
tree: (_a = match === null || match === void 0 ? void 0 : match[1]) !== null && _a !== void 0 ? _a : null,
|
|
211
|
+
tree: (_a = match === null || match === void 0 ? void 0 : match[1]) !== null && _a !== void 0 ? _a : null,
|
|
271
212
|
deviceId: Number(topic.substring(switchStart, topic.indexOf("/", switchStart))),
|
|
272
213
|
outputId: topic.substring(outputStart, topic.indexOf("/", outputStart)),
|
|
273
214
|
};
|
|
@@ -277,7 +218,7 @@ export function extractGenericInputInfo(topic) {
|
|
|
277
218
|
const pattern = new RegExp(`/(${SWITCHABLE_OUTPUT_TREES.join("|")})/`);
|
|
278
219
|
const match = topic.match(pattern);
|
|
279
220
|
const treeEnd = match ? match.index + match[0].length : -1;
|
|
280
|
-
const inputStart = topic.indexOf("/GenericInput/") + 14;
|
|
221
|
+
const inputStart = topic.indexOf("/GenericInput/") + 14;
|
|
281
222
|
return {
|
|
282
223
|
tree: (_a = match === null || match === void 0 ? void 0 : match[1]) !== null && _a !== void 0 ? _a : null,
|
|
283
224
|
deviceId: Number(topic.substring(treeEnd, topic.indexOf("/", treeEnd))),
|
|
@@ -287,6 +228,6 @@ export function extractGenericInputInfo(topic) {
|
|
|
287
228
|
export function arraysEqual(a, b) {
|
|
288
229
|
if (a.length !== b.length)
|
|
289
230
|
return false;
|
|
290
|
-
return a.every((element, index) => b[index]
|
|
231
|
+
return a.every((element, index) => Object.is(element, b[index]));
|
|
291
232
|
}
|
|
292
233
|
//# sourceMappingURL=SwitchingPane.provider.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SwitchingPane.provider.js","sourceRoot":"/","sources":["src/Modules/SwitchingPane/SwitchingPane.provider.ts"],"names":[],"mappings":"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","sourcesContent":["import { autorun } from \"mobx\"\nimport Logger from \"../../utils/logger\"\nimport { PortalId, useMqtt } from \"../Mqtt\"\nimport { useMemo, useEffect } from \"react\"\nimport { useSwitchingPaneStore } from \"./SwitchingPane.store\"\nimport { getSwitchingDeviceStateTopics, SwitchingDeviceInstanceId } from \"./SwitchingDevice.provider\"\nimport {\n getSwitchingPaneItemNameForDisplay,\n getSwitchableOutputStateTopics,\n SWITCHABLE_OUTPUT_TREES,\n SwitchableOutputId,\n SwitchableOutputState,\n SwitchableOutputTree,\n GenericInputState,\n SwitchingPaneItem,\n} from \"./SwitchableOutput.provider\"\nimport { getGenericInputStateTopics, GenericInputId } from \"./GenericInput.provider\"\nimport {\n GenericInputType,\n remapGenericInputType,\n SwitchableOutputType,\n SwitchableOutputVisibility,\n SWITCHABLE_OUTPUT_FUNCTION,\n SWITCHABLE_OUTPUT_VISIBILITY,\n} from \"../../utils/constants\"\n\nconst hasMessages = (messages: Record<string, string> | undefined) => messages && Object.keys(messages).length > 0\n\nexport const useSwitchingPane = (gxDeviceRelaysGroupName: string) => {\n const switchingPaneStore = useSwitchingPaneStore()\n\n const getTopics = (portalId: PortalId) => ({\n switchableOutputs: `N/${portalId}/(${SWITCHABLE_OUTPUT_TREES.join(\"|\")})/+/SwitchableOutput/+/Settings/+`,\n genericInputs: `N/${portalId}/(${SWITCHABLE_OUTPUT_TREES.join(\"|\")})/+/GenericInput/+/Settings/+`,\n switchingDevices: `N/${portalId}/switch/+`,\n })\n\n const mqtt = useMqtt()\n const topics = useMemo(() => getTopics(mqtt.portalId), [mqtt.portalId])\n\n const messagesForSwitchableOutputs = mqtt.messagesByWildcard(topics.switchableOutputs)\n const messagesForGenericInputs = mqtt.messagesByWildcard(topics.genericInputs)\n const messagesForSwitchingDevices = mqtt.messagesByWildcard(topics.switchingDevices)\n\n // Examine MQTT to find all available switchable outputs, generic inputs, and their group assignments\n useEffect(() => {\n if (!hasMessages(messagesForSwitchableOutputs) && !hasMessages(messagesForGenericInputs)) {\n Logger.log(\"Waiting for switchable outputs or generic inputs...\")\n return\n }\n\n // All switchable outputs in array sorted by topic\n const availableSwitchableOutputs = messagesForSwitchableOutputs\n ? (Object.keys(messagesForSwitchableOutputs)\n .filter((key) => key.endsWith(\"/Settings/Group\"))\n .sort() as string[])\n : []\n\n // All switchable outputs group assignments in array sorted by topic\n const customGroupAssigments = availableSwitchableOutputs.map((topic) => {\n return messagesForSwitchableOutputs[topic]\n })\n // All switchable outputs types in array sorted by topic\n const availableSwitchableOutputTypes = availableSwitchableOutputs.map((topic) => {\n return Number(messagesForSwitchableOutputs[`${topic.slice(0, -\"/Group\".length)}/Type`]) as SwitchableOutputType\n })\n // All switchable outputs names in array sorted by topic\n const availableSwitchableOutputNames = availableSwitchableOutputs.map((topic) => {\n return messagesForSwitchableOutputs[`${topic.slice(0, -\"/Group\".length)}/CustomName`]\n })\n // All switchable outputs visibility in array sorted by topic\n const availableSwitchableOutputVisibilityFlags = availableSwitchableOutputs.map((topic) => {\n return Number(\n messagesForSwitchableOutputs[`${topic.slice(0, -\"/Group\".length)}/ShowUIControl`]\n ) as SwitchableOutputVisibility\n })\n // All switchable outputs functions in array sorted by topic\n const availableSwitchableOutputFunctions = availableSwitchableOutputs.map((topic) => {\n return Number(messagesForSwitchableOutputs[`${topic.slice(0, -\"/Group\".length)}/Function`])\n })\n\n // All generic inputs in array sorted by topic\n const availableGenericInputs = messagesForGenericInputs\n ? (Object.keys(messagesForGenericInputs)\n .filter((key) => key.endsWith(\"/Settings/Group\"))\n .sort() as string[])\n : []\n\n // All generic input group assignments in array sorted by topic\n const genericInputGroupAssignments = availableGenericInputs.map((topic) => {\n return messagesForGenericInputs[topic]\n })\n // All generic input types in array sorted by topic\n const availableGenericInputTypes = availableGenericInputs.map((topic) => {\n return Number(messagesForGenericInputs[`${topic.slice(0, -\"/Group\".length)}/Type`]) as GenericInputType\n })\n // All generic input names in array sorted by topic\n const availableGenericInputNames = availableGenericInputs.map((topic) => {\n return messagesForGenericInputs[`${topic.slice(0, -\"/Group\".length)}/CustomName`]\n })\n // All generic input visibility in array sorted by topic\n const availableGenericInputVisibilityFlags = availableGenericInputs.map((topic) => {\n return Number(\n messagesForGenericInputs[`${topic.slice(0, -\"/Group\".length)}/ShowUIInput`]\n ) as SwitchableOutputVisibility\n })\n\n // All switching devices in array sorted by instance number\n const availableSwitchingDevices = Object.keys(messagesForSwitchingDevices)\n .filter((key) => key.endsWith(\"/DeviceInstance\"))\n .sort() as string[]\n\n // All switching device names in array sorted by instance number\n const availableSwitchingDeviceNames = availableSwitchingDevices.map((topic) => {\n const topicPrefix = topic.slice(0, -\"/DeviceInstance\".length)\n return (\n messagesForSwitchingDevices[`${topicPrefix}/CustomName`] ||\n messagesForSwitchingDevices[`${topicPrefix}/ProductName`]\n )\n })\n\n const dispose = autorun(() => {\n const oldAssignments = switchingPaneStore.customGroupAssignments\n const newAssignments = customGroupAssigments\n const groupAssignmentsChanged = !arraysEqual(oldAssignments, newAssignments)\n if (groupAssignmentsChanged) {\n switchingPaneStore.setCustomGroupAssignments(newAssignments)\n }\n\n const oldOutputTypes = switchingPaneStore.outputTypes\n const newOutputTypes = availableSwitchableOutputTypes\n const outputTypesChanged = !arraysEqual(oldOutputTypes, newOutputTypes)\n if (outputTypesChanged) {\n switchingPaneStore.setOutputTypes(newOutputTypes)\n }\n\n const oldOutputNames = switchingPaneStore.outputNames\n const newOutputNames = availableSwitchableOutputNames\n const outputNamesChanged = !arraysEqual(oldOutputNames, newOutputNames)\n if (outputNamesChanged) {\n switchingPaneStore.setOutputNames(newOutputNames)\n }\n\n const oldOutputVisibilityFlags = switchingPaneStore.outputVisibilityFlags\n const newOutputVisibilityFlags = availableSwitchableOutputVisibilityFlags\n const outputVisibilityFlagsChanged = !arraysEqual(oldOutputVisibilityFlags, newOutputVisibilityFlags)\n if (outputVisibilityFlagsChanged) {\n switchingPaneStore.setOutputVisibilityFlags(newOutputVisibilityFlags)\n }\n\n const oldOutputFunctions = switchingPaneStore.outputFunctions\n const newOutputFunctions = availableSwitchableOutputFunctions\n const outputFunctionsChanged = !arraysEqual(oldOutputFunctions, newOutputFunctions)\n if (outputFunctionsChanged) {\n switchingPaneStore.setOutputFunctions(newOutputFunctions)\n }\n\n const oldSwitchingDevices = switchingPaneStore.switchingDevices\n const newSwitchingDevices = availableSwitchingDevices\n const switchingDevicesChanged = !arraysEqual(oldSwitchingDevices, newSwitchingDevices)\n if (switchingDevicesChanged) {\n switchingPaneStore.setSwitchingDevices(newSwitchingDevices)\n }\n\n const oldSwitchingDeviceNames = switchingPaneStore.switchingDeviceNames\n const newSwitchingDeviceNames = availableSwitchingDeviceNames\n const switchingDeviceNamesChanged = !arraysEqual(oldSwitchingDeviceNames, newSwitchingDeviceNames)\n if (switchingDeviceNamesChanged) {\n switchingPaneStore.setSwitchingDeviceNames(newSwitchingDeviceNames)\n }\n\n const oldGiAssignments = switchingPaneStore.genericInputGroupAssignments\n const newGiAssignments = genericInputGroupAssignments\n const giGroupAssignmentsChanged = !arraysEqual(oldGiAssignments, newGiAssignments)\n if (giGroupAssignmentsChanged) {\n switchingPaneStore.setGenericInputGroupAssignments(newGiAssignments)\n }\n\n const oldGiTypes = switchingPaneStore.genericInputTypes\n const newGiTypes = availableGenericInputTypes\n const giTypesChanged = !arraysEqual(oldGiTypes, newGiTypes)\n if (giTypesChanged) {\n switchingPaneStore.setGenericInputTypes(newGiTypes)\n }\n\n const oldGiNames = switchingPaneStore.genericInputNames\n const newGiNames = availableGenericInputNames\n const giNamesChanged = !arraysEqual(oldGiNames, newGiNames)\n if (giNamesChanged) {\n switchingPaneStore.setGenericInputNames(newGiNames)\n }\n\n const oldGiVisibilityFlags = switchingPaneStore.genericInputVisibilityFlags\n const newGiVisibilityFlags = availableGenericInputVisibilityFlags\n const giVisibilityFlagsChanged = !arraysEqual(oldGiVisibilityFlags, newGiVisibilityFlags)\n if (giVisibilityFlagsChanged) {\n switchingPaneStore.setGenericInputVisibilityFlags(newGiVisibilityFlags)\n }\n\n // On initial population (all old arrays empty), skip per-field logging\n const isInitialLoad =\n oldAssignments.length === 0 &&\n oldOutputTypes.length === 0 &&\n oldSwitchingDevices.length === 0 &&\n oldGiAssignments.length === 0\n\n if (!isInitialLoad) {\n if (groupAssignmentsChanged) Logger.log(`Switchable outputs group assignments changed, recomputing...`)\n if (outputTypesChanged) Logger.log(`Switchable outputs types changed, recomputing...`)\n if (outputNamesChanged) Logger.log(`Switchable outputs names changed, recomputing...`)\n if (outputVisibilityFlagsChanged) Logger.log(`Switchable outputs visibility flags changed, recomputing...`)\n if (outputFunctionsChanged) Logger.log(`Switchable outputs functions changed, recomputing...`)\n if (switchingDevicesChanged) Logger.log(`Switching devices changed, recomputing...`)\n if (switchingDeviceNamesChanged) Logger.log(`Switching device names changed, recomputing...`)\n if (giGroupAssignmentsChanged) Logger.log(`Generic input group assignments changed, recomputing...`)\n if (giTypesChanged) Logger.log(`Generic input types changed, recomputing...`)\n if (giNamesChanged) Logger.log(`Generic input names changed, recomputing...`)\n if (giVisibilityFlagsChanged) Logger.log(`Generic input visibility flags changed, recomputing...`)\n }\n\n if (\n groupAssignmentsChanged ||\n outputTypesChanged ||\n outputNamesChanged ||\n outputVisibilityFlagsChanged ||\n outputFunctionsChanged ||\n switchingDevicesChanged ||\n switchingDeviceNamesChanged ||\n giGroupAssignmentsChanged ||\n giTypesChanged ||\n giNamesChanged ||\n giVisibilityFlagsChanged\n ) {\n // Collect all switching pane items (switchable outputs + generic inputs) with their group info\n const items: { groupName: string; item: SwitchingPaneItem }[] = []\n\n availableSwitchableOutputs.forEach((output, index) => {\n const swo = extractSwitchableOutputInfo(output)\n const switchingDevice = mqtt.messagesByTopics(\n getSwitchingDeviceStateTopics(mqtt.portalId, swo.tree, swo.deviceId)\n ) as unknown as Record<string, string>\n const customGroupAssignment = customGroupAssigments[index].trim()\n const deviceName = switchingDevice.customName || switchingDevice.productName || gxDeviceRelaysGroupName\n const groupName = customGroupAssignment === \"\" ? deviceName : customGroupAssignment\n const switchableOutput = mqtt.messagesByTopics(\n getSwitchableOutputStateTopics(mqtt.portalId, swo.tree, swo.deviceId, swo.outputId)\n ) as unknown as SwitchableOutputState\n\n if (\n !(\n switchableOutput.showUIControl & SWITCHABLE_OUTPUT_VISIBILITY.VISIBLE ||\n switchableOutput.showUIControl & SWITCHABLE_OUTPUT_VISIBILITY.VISIBLE_LOCAL_UI\n )\n ) {\n return\n }\n\n // GX system relays: only show when Function is Manual (matching gui-v2)\n if (\n swo.tree === \"system\" &&\n switchableOutput.function != null &&\n switchableOutput.function !== SWITCHABLE_OUTPUT_FUNCTION.MANUAL\n ) {\n return\n }\n\n items.push({\n groupName,\n item: {\n ...switchableOutput,\n kind: \"switchableOutput\",\n tree: swo.tree,\n deviceId: swo.deviceId,\n outputId: swo.outputId,\n parentDeviceName: deviceName as string,\n },\n })\n })\n\n availableGenericInputs.forEach((input, index) => {\n const gi = extractGenericInputInfo(input)\n const switchingDevice = mqtt.messagesByTopics(\n getSwitchingDeviceStateTopics(mqtt.portalId, gi.tree, gi.deviceId)\n ) as unknown as Record<string, string>\n const customGroupAssignment = genericInputGroupAssignments[index].trim()\n const deviceName = switchingDevice.customName || switchingDevice.productName || gxDeviceRelaysGroupName\n const groupName = customGroupAssignment === \"\" ? deviceName : customGroupAssignment\n const genericInput = mqtt.messagesByTopics(\n getGenericInputStateTopics(mqtt.portalId, gi.tree, gi.deviceId, gi.inputId)\n ) as unknown as GenericInputState\n\n if (\n !(\n genericInput.showUIControl & SWITCHABLE_OUTPUT_VISIBILITY.VISIBLE ||\n genericInput.showUIControl & SWITCHABLE_OUTPUT_VISIBILITY.VISIBLE_LOCAL_UI\n )\n ) {\n return\n }\n\n items.push({\n groupName,\n item: {\n ...genericInput,\n kind: \"genericInput\",\n tree: gi.tree,\n deviceId: gi.deviceId,\n outputId: gi.inputId,\n parentDeviceName: deviceName as string,\n type: remapGenericInputType(genericInput.type as number),\n },\n })\n })\n\n // Distribute items to groups\n const newGroups: { [key: string]: SwitchingPaneItem[] } = {}\n items.forEach(({ groupName, item }) => {\n newGroups[groupName] ||= []\n newGroups[groupName].push(item)\n })\n\n // Sort items in each group by display name\n Object.values(newGroups).forEach((array) => {\n array.sort((a, b) => {\n const aName = getSwitchingPaneItemNameForDisplay(a, a.parentDeviceName)\n const bName = getSwitchingPaneItemNameForDisplay(b, b.parentDeviceName)\n return aName.localeCompare(bName)\n })\n })\n\n Logger.log(`New switching pane groups: ${JSON.stringify(Object.keys(newGroups))}`)\n switchingPaneStore.setGroups(newGroups)\n }\n })\n return () => dispose()\n }, [\n messagesForSwitchableOutputs,\n messagesForGenericInputs,\n messagesForSwitchingDevices,\n gxDeviceRelaysGroupName,\n mqtt,\n switchingPaneStore,\n ])\n\n return switchingPaneStore\n}\n\nexport function extractSwitchableOutputInfo(topic: string) {\n const pattern = new RegExp(`/(${SWITCHABLE_OUTPUT_TREES.join(\"|\")})/`)\n const match = topic.match(pattern)\n const switchStart = match ? match.index! + match[0].length : -1 // length of `/system/`, or `/switch/`, or ...\n const outputStart = topic.indexOf(\"/SwitchableOutput/\") + 18 // length of `/SwitchableOutput/`\n\n return {\n tree: (match?.[1] as SwitchableOutputTree) ?? null, // \"switch\", \"system\", ...\n deviceId: Number(topic.substring(switchStart, topic.indexOf(\"/\", switchStart))) as SwitchingDeviceInstanceId,\n outputId: topic.substring(outputStart, topic.indexOf(\"/\", outputStart)) as SwitchableOutputId,\n }\n}\n\nexport function extractGenericInputInfo(topic: string) {\n const pattern = new RegExp(`/(${SWITCHABLE_OUTPUT_TREES.join(\"|\")})/`)\n const match = topic.match(pattern)\n const treeEnd = match ? match.index! + match[0].length : -1\n const inputStart = topic.indexOf(\"/GenericInput/\") + 14 // length of `/GenericInput/`\n\n return {\n tree: (match?.[1] as SwitchableOutputTree) ?? null,\n deviceId: Number(topic.substring(treeEnd, topic.indexOf(\"/\", treeEnd))) as SwitchingDeviceInstanceId,\n inputId: topic.substring(inputStart, topic.indexOf(\"/\", inputStart)) as GenericInputId,\n }\n}\n\nexport function arraysEqual<T>(a: T[], b: T[]): boolean {\n if (a.length !== b.length) return false\n return a.every((element, index) => b[index] === element)\n}\n"]}
|
|
1
|
+
{"version":3,"file":"SwitchingPane.provider.js","sourceRoot":"/","sources":["src/Modules/SwitchingPane/SwitchingPane.provider.ts"],"names":[],"mappings":"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","sourcesContent":["import { runInAction, untracked } from \"mobx\"\nimport Logger from \"../../utils/logger\"\nimport { useMqtt } from \"../Mqtt\"\nimport { useMemo, useEffect } from \"react\"\nimport { useSwitchingPaneStore } from \"./SwitchingPane.store\"\nimport { getSwitchingDeviceStateTopics, SwitchingDeviceInstanceId } from \"./SwitchingDevice.provider\"\nimport {\n getSwitchingPaneItemNameForDisplay,\n getSwitchableOutputStateTopics,\n SWITCHABLE_OUTPUT_TREES,\n SwitchableOutputId,\n SwitchableOutputState,\n SwitchableOutputTree,\n GenericInputState,\n SwitchingPaneItem,\n} from \"./SwitchableOutput.provider\"\nimport { getGenericInputStateTopics, GenericInputId } from \"./GenericInput.provider\"\nimport {\n GenericInputType,\n remapGenericInputType,\n SwitchableOutputType,\n SwitchableOutputVisibility,\n SWITCHABLE_OUTPUT_FUNCTION,\n SWITCHABLE_OUTPUT_VISIBILITY,\n} from \"../../utils/constants\"\n\nconst hasMessages = (messages: Record<string, string> | undefined) => messages && Object.keys(messages).length > 0\n\nexport const useSwitchingPane = (gxDeviceRelaysGroupName: string) => {\n const store = useSwitchingPaneStore()\n const mqtt = useMqtt()\n\n const topics = useMemo(\n () => ({\n systemOutputs: `N/${mqtt.portalId}/system/+/SwitchableOutput/+/Settings/+`,\n switchOutputs: `N/${mqtt.portalId}/switch/+/SwitchableOutput/+/Settings/+`,\n genericInputs: `N/${mqtt.portalId}/switch/+/GenericInput/+/Settings/+`,\n switchingDevices: `N/${mqtt.portalId}/switch/+`,\n }),\n [mqtt.portalId]\n )\n\n const messagesForSystemOutputs = mqtt.messagesByWildcard(topics.systemOutputs)\n const messagesForSwitchOutputs = mqtt.messagesByWildcard(topics.switchOutputs)\n const messagesForInputs = mqtt.messagesByWildcard(topics.genericInputs)\n const messagesForSwitchingDevices = mqtt.messagesByWildcard(topics.switchingDevices)\n\n useEffect(() => {\n if (\n !hasMessages(messagesForSystemOutputs) &&\n !hasMessages(messagesForSwitchOutputs) &&\n !hasMessages(messagesForInputs)\n ) {\n Logger.log(\"Waiting for switchable outputs or generic inputs...\")\n return\n }\n\n // --- Phase A: Extract comparison arrays from wildcard messages (cheap) ---\n\n const messagesForOutputs = { ...messagesForSystemOutputs, ...messagesForSwitchOutputs }\n\n const outputGroupTopics = Object.keys(messagesForOutputs)\n .filter((k) => k.endsWith(\"/Settings/Group\"))\n .sort()\n\n const customGroupAssignments = outputGroupTopics.map((t) => messagesForOutputs[t])\n const outputTypes = outputGroupTopics.map(\n (t) => Number(messagesForOutputs[`${t.slice(0, -\"/Group\".length)}/Type`]) as SwitchableOutputType\n )\n const outputNames = outputGroupTopics.map((t) => messagesForOutputs[`${t.slice(0, -\"/Group\".length)}/CustomName`])\n const outputVisibilityFlags = outputGroupTopics.map(\n (t) => Number(messagesForOutputs[`${t.slice(0, -\"/Group\".length)}/ShowUIControl`]) as SwitchableOutputVisibility\n )\n const outputFunctions = outputGroupTopics.map((t) =>\n Number(messagesForOutputs[`${t.slice(0, -\"/Group\".length)}/Function`])\n )\n\n const inputGroupTopics = Object.keys(messagesForInputs)\n .filter((k) => k.endsWith(\"/Settings/Group\"))\n .sort()\n\n const genericInputGroupAssignments = inputGroupTopics.map((t) => messagesForInputs[t])\n const genericInputTypes = inputGroupTopics.map(\n (t) => Number(messagesForInputs[`${t.slice(0, -\"/Group\".length)}/Type`]) as GenericInputType\n )\n const genericInputNames = inputGroupTopics.map(\n (t) => messagesForInputs[`${t.slice(0, -\"/Group\".length)}/CustomName`]\n )\n const genericInputVisibilityFlags = inputGroupTopics.map(\n (t) => Number(messagesForInputs[`${t.slice(0, -\"/Group\".length)}/ShowUIInput`]) as SwitchableOutputVisibility\n )\n\n const switchingDevices = Object.keys(messagesForSwitchingDevices)\n .filter((k) => k.endsWith(\"/DeviceInstance\"))\n .sort()\n const switchingDeviceNames = switchingDevices.map((t) => {\n const prefix = t.slice(0, -\"/DeviceInstance\".length)\n return messagesForSwitchingDevices[`${prefix}/CustomName`] || messagesForSwitchingDevices[`${prefix}/ProductName`]\n })\n\n // --- Phase B: comparison guard, batched in a single action ---\n\n runInAction(() => {\n const groupAssignmentsChanged = !arraysEqual(store.customGroupAssignments, customGroupAssignments)\n if (groupAssignmentsChanged) store.setCustomGroupAssignments(customGroupAssignments)\n\n const outputTypesChanged = !arraysEqual(store.outputTypes, outputTypes)\n if (outputTypesChanged) store.setOutputTypes(outputTypes)\n\n const outputNamesChanged = !arraysEqual(store.outputNames, outputNames)\n if (outputNamesChanged) store.setOutputNames(outputNames)\n\n const outputVisibilityFlagsChanged = !arraysEqual(store.outputVisibilityFlags, outputVisibilityFlags)\n if (outputVisibilityFlagsChanged) store.setOutputVisibilityFlags(outputVisibilityFlags)\n\n const outputFunctionsChanged = !arraysEqual(store.outputFunctions, outputFunctions)\n if (outputFunctionsChanged) store.setOutputFunctions(outputFunctions)\n\n const switchingDevicesChanged = !arraysEqual(store.switchingDevices, switchingDevices)\n if (switchingDevicesChanged) store.setSwitchingDevices(switchingDevices)\n\n const switchingDeviceNamesChanged = !arraysEqual(store.switchingDeviceNames, switchingDeviceNames)\n if (switchingDeviceNamesChanged) store.setSwitchingDeviceNames(switchingDeviceNames)\n\n const giGroupAssignmentsChanged = !arraysEqual(store.genericInputGroupAssignments, genericInputGroupAssignments)\n if (giGroupAssignmentsChanged) store.setGenericInputGroupAssignments(genericInputGroupAssignments)\n\n const giTypesChanged = !arraysEqual(store.genericInputTypes, genericInputTypes)\n if (giTypesChanged) store.setGenericInputTypes(genericInputTypes)\n\n const giNamesChanged = !arraysEqual(store.genericInputNames, genericInputNames)\n if (giNamesChanged) store.setGenericInputNames(genericInputNames)\n\n const giVisibilityFlagsChanged = !arraysEqual(store.genericInputVisibilityFlags, genericInputVisibilityFlags)\n if (giVisibilityFlagsChanged) store.setGenericInputVisibilityFlags(genericInputVisibilityFlags)\n\n const isInitialLoad =\n store.customGroupAssignments.length === 0 &&\n store.outputTypes.length === 0 &&\n store.switchingDevices.length === 0 &&\n store.genericInputGroupAssignments.length === 0\n\n if (!isInitialLoad) {\n if (groupAssignmentsChanged) Logger.log(`Switchable outputs group assignments changed, recomputing...`)\n if (outputTypesChanged) Logger.log(`Switchable outputs types changed, recomputing...`)\n if (outputNamesChanged) Logger.log(`Switchable outputs names changed, recomputing...`)\n if (outputVisibilityFlagsChanged) Logger.log(`Switchable outputs visibility flags changed, recomputing...`)\n if (outputFunctionsChanged) Logger.log(`Switchable outputs functions changed, recomputing...`)\n if (switchingDevicesChanged) Logger.log(`Switching devices changed, recomputing...`)\n if (switchingDeviceNamesChanged) Logger.log(`Switching device names changed, recomputing...`)\n if (giGroupAssignmentsChanged) Logger.log(`Generic input group assignments changed, recomputing...`)\n if (giTypesChanged) Logger.log(`Generic input types changed, recomputing...`)\n if (giNamesChanged) Logger.log(`Generic input names changed, recomputing...`)\n if (giVisibilityFlagsChanged) Logger.log(`Generic input visibility flags changed, recomputing...`)\n }\n\n if (\n groupAssignmentsChanged ||\n outputTypesChanged ||\n outputNamesChanged ||\n outputVisibilityFlagsChanged ||\n outputFunctionsChanged ||\n switchingDevicesChanged ||\n switchingDeviceNamesChanged ||\n giGroupAssignmentsChanged ||\n giTypesChanged ||\n giNamesChanged ||\n giVisibilityFlagsChanged\n ) {\n const items: { groupName: string; item: SwitchingPaneItem }[] = []\n\n for (const topic of outputGroupTopics) {\n const info = extractSwitchableOutputInfo(topic)\n\n const { deviceName, output } = untracked(() => {\n const device = mqtt.messagesByTopics(\n getSwitchingDeviceStateTopics(mqtt.portalId, info.tree, info.deviceId)\n ) as unknown as Record<string, string>\n const out = mqtt.messagesByTopics(\n getSwitchableOutputStateTopics(mqtt.portalId, info.tree, info.deviceId, info.outputId)\n ) as unknown as SwitchableOutputState\n return {\n deviceName: device.customName || device.productName || gxDeviceRelaysGroupName,\n output: out,\n }\n })\n\n if (\n !(\n output.showUIControl & SWITCHABLE_OUTPUT_VISIBILITY.VISIBLE ||\n output.showUIControl & SWITCHABLE_OUTPUT_VISIBILITY.VISIBLE_LOCAL_UI\n )\n ) {\n continue\n }\n\n // GX system relays: only show when Function is Manual (matching gui-v2)\n if (\n info.tree === \"system\" &&\n output.function != null &&\n output.function !== SWITCHABLE_OUTPUT_FUNCTION.MANUAL\n ) {\n continue\n }\n\n const customGroup = (messagesForOutputs[topic] ?? \"\").trim()\n\n items.push({\n groupName: customGroup === \"\" ? deviceName : customGroup,\n item: {\n ...output,\n kind: \"switchableOutput\",\n tree: info.tree,\n deviceId: info.deviceId,\n outputId: info.outputId,\n parentDeviceName: deviceName as string,\n },\n })\n }\n\n for (const topic of inputGroupTopics) {\n const info = extractGenericInputInfo(topic)\n\n const { deviceName, input } = untracked(() => {\n const device = mqtt.messagesByTopics(\n getSwitchingDeviceStateTopics(mqtt.portalId, info.tree, info.deviceId)\n ) as unknown as Record<string, string>\n const inp = mqtt.messagesByTopics(\n getGenericInputStateTopics(mqtt.portalId, info.tree, info.deviceId, info.inputId)\n ) as unknown as GenericInputState\n return {\n deviceName: device.customName || device.productName || gxDeviceRelaysGroupName,\n input: inp,\n }\n })\n\n if (\n !(\n input.showUIControl & SWITCHABLE_OUTPUT_VISIBILITY.VISIBLE ||\n input.showUIControl & SWITCHABLE_OUTPUT_VISIBILITY.VISIBLE_LOCAL_UI\n )\n ) {\n continue\n }\n\n const customGroup = (messagesForInputs[topic] ?? \"\").trim()\n\n items.push({\n groupName: customGroup === \"\" ? deviceName : customGroup,\n item: {\n ...input,\n kind: \"genericInput\",\n tree: info.tree,\n deviceId: info.deviceId,\n outputId: info.inputId,\n parentDeviceName: deviceName as string,\n type: remapGenericInputType(input.type as number),\n },\n })\n }\n\n const groups: { [key: string]: SwitchingPaneItem[] } = {}\n for (const { groupName, item } of items) {\n ;(groups[groupName] ||= []).push(item)\n }\n\n for (const arr of Object.values(groups)) {\n arr.sort((a, b) => {\n const aName = getSwitchingPaneItemNameForDisplay(a, a.parentDeviceName)\n const bName = getSwitchingPaneItemNameForDisplay(b, b.parentDeviceName)\n return aName.localeCompare(bName)\n })\n }\n\n Logger.log(`New switching pane groups: ${JSON.stringify(Object.keys(groups))}`)\n store.setGroups(groups)\n }\n })\n }, [\n messagesForSystemOutputs,\n messagesForSwitchOutputs,\n messagesForInputs,\n messagesForSwitchingDevices,\n gxDeviceRelaysGroupName,\n mqtt,\n store,\n ])\n\n return store\n}\n\nexport function extractSwitchableOutputInfo(topic: string) {\n const pattern = new RegExp(`/(${SWITCHABLE_OUTPUT_TREES.join(\"|\")})/`)\n const match = topic.match(pattern)\n const switchStart = match ? match.index! + match[0].length : -1\n const outputStart = topic.indexOf(\"/SwitchableOutput/\") + 18\n\n return {\n tree: (match?.[1] as SwitchableOutputTree) ?? null,\n deviceId: Number(topic.substring(switchStart, topic.indexOf(\"/\", switchStart))) as SwitchingDeviceInstanceId,\n outputId: topic.substring(outputStart, topic.indexOf(\"/\", outputStart)) as SwitchableOutputId,\n }\n}\n\nexport function extractGenericInputInfo(topic: string) {\n const pattern = new RegExp(`/(${SWITCHABLE_OUTPUT_TREES.join(\"|\")})/`)\n const match = topic.match(pattern)\n const treeEnd = match ? match.index! + match[0].length : -1\n const inputStart = topic.indexOf(\"/GenericInput/\") + 14\n\n return {\n tree: (match?.[1] as SwitchableOutputTree) ?? null,\n deviceId: Number(topic.substring(treeEnd, topic.indexOf(\"/\", treeEnd))) as SwitchingDeviceInstanceId,\n inputId: topic.substring(inputStart, topic.indexOf(\"/\", inputStart)) as GenericInputId,\n }\n}\n\nexport function arraysEqual<T>(a: T[], b: T[]): boolean {\n if (a.length !== b.length) return false\n return a.every((element, index) => Object.is(element, b[index]))\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SwitchingPane.store.d.ts","sourceRoot":"/","sources":["src/Modules/SwitchingPane/SwitchingPane.store.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,iBAAiB,EAAE,MAAM,6BAA6B,CAAA;AAC/D,OAAO,EAAE,gBAAgB,EAAE,oBAAoB,EAAE,0BAA0B,EAAE,MAAM,uBAAuB,CAAA;AAI1G,MAAM,WAAW,kBAAkB;IACjC,MAAM,EAAE;QAAE,CAAC,GAAG,EAAE,MAAM,GAAG,iBAAiB,EAAE,CAAA;KAAE,CAAA;
|
|
1
|
+
{"version":3,"file":"SwitchingPane.store.d.ts","sourceRoot":"/","sources":["src/Modules/SwitchingPane/SwitchingPane.store.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,iBAAiB,EAAE,MAAM,6BAA6B,CAAA;AAC/D,OAAO,EAAE,gBAAgB,EAAE,oBAAoB,EAAE,0BAA0B,EAAE,MAAM,uBAAuB,CAAA;AAI1G,MAAM,WAAW,kBAAkB;IACjC,MAAM,EAAE;QAAE,CAAC,GAAG,EAAE,MAAM,GAAG,iBAAiB,EAAE,CAAA;KAAE,CAAA;IAC9C,sBAAsB,EAAE,MAAM,EAAE,CAAA;IAChC,WAAW,EAAE,oBAAoB,EAAE,CAAA;IACnC,WAAW,EAAE,MAAM,EAAE,CAAA;IACrB,qBAAqB,EAAE,0BAA0B,EAAE,CAAA;IACnD,eAAe,EAAE,MAAM,EAAE,CAAA;IACzB,gBAAgB,EAAE,MAAM,EAAE,CAAA;IAC1B,oBAAoB,EAAE,MAAM,EAAE,CAAA;IAC9B,4BAA4B,EAAE,MAAM,EAAE,CAAA;IACtC,iBAAiB,EAAE,gBAAgB,EAAE,CAAA;IACrC,iBAAiB,EAAE,MAAM,EAAE,CAAA;IAC3B,2BAA2B,EAAE,0BAA0B,EAAE,CAAA;CAC1D;AAED,qBAAa,kBAAkB;IAC7B,MAAM,EAAE;QAAE,CAAC,GAAG,EAAE,MAAM,GAAG,iBAAiB,EAAE,CAAA;KAAE,CAAK;IACnD,sBAAsB,EAAE,MAAM,EAAE,CAAK;IACrC,WAAW,EAAE,oBAAoB,EAAE,CAAK;IACxC,WAAW,EAAE,MAAM,EAAE,CAAK;IAC1B,qBAAqB,EAAE,0BAA0B,EAAE,CAAK;IACxD,eAAe,EAAE,MAAM,EAAE,CAAK;IAC9B,gBAAgB,EAAE,MAAM,EAAE,CAAK;IAC/B,oBAAoB,EAAE,MAAM,EAAE,CAAK;IACnC,4BAA4B,EAAE,MAAM,EAAE,CAAK;IAC3C,iBAAiB,EAAE,gBAAgB,EAAE,CAAK;IAC1C,iBAAiB,EAAE,MAAM,EAAE,CAAK;IAChC,2BAA2B,EAAE,0BAA0B,EAAE,CAAK;;IAkB9D,SAAS,GAAI,QAAQ;QAAE,CAAC,GAAG,EAAE,MAAM,GAAG,iBAAiB,EAAE,CAAA;KAAE;;MAA2B;IACtF,yBAAyB,GAAI,aAAa,MAAM,EAAE,cAAgD;IAClG,cAAc,GAAI,aAAa,oBAAoB,EAAE,4BAAqC;IAC1F,cAAc,GAAI,aAAa,MAAM,EAAE,cAAqC;IAC5E,wBAAwB,GAAI,uBAAuB,0BAA0B,EAAE,cACzB;IACtD,kBAAkB,GAAI,iBAAiB,MAAM,EAAE,cAA6C;IAC5F,mBAAmB,GAAI,kBAAkB,MAAM,EAAE,cAA+C;IAChG,uBAAuB,GAAI,sBAAsB,MAAM,EAAE,cAAuD;IAChH,+BAA+B,GAAI,aAAa,MAAM,EAAE,cAAsD;IAC9G,oBAAoB,GAAI,OAAO,gBAAgB,EAAE,wBAAqC;IACtF,oBAAoB,GAAI,OAAO,MAAM,EAAE,cAAqC;IAC5E,8BAA8B,GAAI,OAAO,0BAA0B,EAAE,cAA+C;CACrH;AAYD,wBAAgB,qBAAqB,uBAEpC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SwitchingPane.store.js","sourceRoot":"/","sources":["src/Modules/SwitchingPane/SwitchingPane.store.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,kBAAkB,EAAE,MAAM,MAAM,CAAA;AACjD,OAAO,EAAE,OAAO,EAAE,MAAM,OAAO,CAAA;AAI/B,IAAI,KAAyB,CAAA;
|
|
1
|
+
{"version":3,"file":"SwitchingPane.store.js","sourceRoot":"/","sources":["src/Modules/SwitchingPane/SwitchingPane.store.ts"],"names":[],"mappings":"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","sourcesContent":["import { action, makeAutoObservable } from \"mobx\"\nimport { useMemo } from \"react\"\nimport { SwitchingPaneItem } from \"./SwitchableOutput.provider\"\nimport { GenericInputType, SwitchableOutputType, SwitchableOutputVisibility } from \"../../utils/constants\"\n\nlet store: SwitchingPaneStore\n\nexport interface SwitchingPaneState {\n groups: { [key: string]: SwitchingPaneItem[] }\n customGroupAssignments: string[]\n outputTypes: SwitchableOutputType[]\n outputNames: string[]\n outputVisibilityFlags: SwitchableOutputVisibility[]\n outputFunctions: number[]\n switchingDevices: string[]\n switchingDeviceNames: string[]\n genericInputGroupAssignments: string[]\n genericInputTypes: GenericInputType[]\n genericInputNames: string[]\n genericInputVisibilityFlags: SwitchableOutputVisibility[]\n}\n\nexport class SwitchingPaneStore {\n groups: { [key: string]: SwitchingPaneItem[] } = {}\n customGroupAssignments: string[] = []\n outputTypes: SwitchableOutputType[] = []\n outputNames: string[] = []\n outputVisibilityFlags: SwitchableOutputVisibility[] = []\n outputFunctions: number[] = []\n switchingDevices: string[] = []\n switchingDeviceNames: string[] = []\n genericInputGroupAssignments: string[] = []\n genericInputTypes: GenericInputType[] = []\n genericInputNames: string[] = []\n genericInputVisibilityFlags: SwitchableOutputVisibility[] = []\n\n constructor() {\n makeAutoObservable(this, {\n setGroups: action,\n setCustomGroupAssignments: action,\n setOutputTypes: action,\n setOutputVisibilityFlags: action,\n setOutputFunctions: action,\n setSwitchingDevices: action,\n setSwitchingDeviceNames: action,\n setGenericInputGroupAssignments: action,\n setGenericInputTypes: action,\n setGenericInputNames: action,\n setGenericInputVisibilityFlags: action,\n })\n }\n\n setGroups = (groups: { [key: string]: SwitchingPaneItem[] }) => (this.groups = groups)\n setCustomGroupAssignments = (assignments: string[]) => (this.customGroupAssignments = assignments)\n setOutputTypes = (outputTypes: SwitchableOutputType[]) => (this.outputTypes = outputTypes)\n setOutputNames = (outputNames: string[]) => (this.outputNames = outputNames)\n setOutputVisibilityFlags = (outputVisibilityFlags: SwitchableOutputVisibility[]) =>\n (this.outputVisibilityFlags = outputVisibilityFlags)\n setOutputFunctions = (outputFunctions: number[]) => (this.outputFunctions = outputFunctions)\n setSwitchingDevices = (switchingDevices: string[]) => (this.switchingDevices = switchingDevices)\n setSwitchingDeviceNames = (switchingDeviceNames: string[]) => (this.switchingDeviceNames = switchingDeviceNames)\n setGenericInputGroupAssignments = (assignments: string[]) => (this.genericInputGroupAssignments = assignments)\n setGenericInputTypes = (types: GenericInputType[]) => (this.genericInputTypes = types)\n setGenericInputNames = (names: string[]) => (this.genericInputNames = names)\n setGenericInputVisibilityFlags = (flags: SwitchableOutputVisibility[]) => (this.genericInputVisibilityFlags = flags)\n}\n\nfunction initializeStore() {\n const _store = store ?? new SwitchingPaneStore()\n // For SSG and SSR always create a new store\n if (typeof window === \"undefined\") return _store\n // Create the store once in the client\n if (!store) store = _store\n\n return _store\n}\n\nexport function useSwitchingPaneStore() {\n return useMemo(() => initializeStore(), [])\n}\n"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@victronenergy/mfd-modules",
|
|
3
|
-
"version": "11.1.
|
|
3
|
+
"version": "11.1.6",
|
|
4
4
|
"description": "",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"types": "dist/index.d.ts",
|
|
@@ -26,7 +26,7 @@
|
|
|
26
26
|
"js-cookie": "^3.0.8",
|
|
27
27
|
"localforage": "^1.10.0",
|
|
28
28
|
"lodash-es": "^4.18.1",
|
|
29
|
-
"mobx": "^6.16.
|
|
29
|
+
"mobx": "^6.16.1",
|
|
30
30
|
"mobx-persist-store": "^1.1.8",
|
|
31
31
|
"mobx-utils": "^6.1.1",
|
|
32
32
|
"mqtt": "^4.3.8"
|
|
@@ -38,7 +38,7 @@
|
|
|
38
38
|
"@testing-library/react": "^16.3.2",
|
|
39
39
|
"@types/js-cookie": "^3.0.6",
|
|
40
40
|
"@types/lodash-es": "^4.17.12",
|
|
41
|
-
"@types/react": "^19.2.
|
|
41
|
+
"@types/react": "^19.2.17",
|
|
42
42
|
"es-check": "^9.6.4",
|
|
43
43
|
"eslint": "^10.4.1",
|
|
44
44
|
"eslint-config-prettier": "^10.1.8",
|
|
@@ -46,12 +46,12 @@
|
|
|
46
46
|
"eslint-plugin-prettier": "^5.5.6",
|
|
47
47
|
"eslint-plugin-react-hooks": "^7.1.1",
|
|
48
48
|
"jsdom": "^29.1.1",
|
|
49
|
-
"prettier": "^3.8.
|
|
49
|
+
"prettier": "^3.8.4",
|
|
50
50
|
"react": "^19.2.7",
|
|
51
51
|
"react-dom": "^19.2.7",
|
|
52
52
|
"semantic-release": "^25.0.3",
|
|
53
53
|
"typescript": "^6.0.3",
|
|
54
|
-
"typescript-eslint": "^8.
|
|
54
|
+
"typescript-eslint": "^8.61.0",
|
|
55
55
|
"vitest": "^4.1.8"
|
|
56
56
|
},
|
|
57
57
|
"peerDependencies": {
|