@victronenergy/mfd-modules 9.7.1 → 9.8.0
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/SwitchableOutputs/SwitchableOutput.provider.d.ts +2 -0
- package/dist/src/Modules/SwitchableOutputs/SwitchableOutput.provider.d.ts.map +1 -1
- package/dist/src/Modules/SwitchableOutputs/SwitchableOutput.provider.js +8 -0
- package/dist/src/Modules/SwitchableOutputs/SwitchableOutput.provider.js.map +1 -1
- package/dist/src/Modules/SwitchableOutputs/SwitchableOutputs.provider.d.ts.map +1 -1
- package/dist/src/Modules/SwitchableOutputs/SwitchableOutputs.provider.js +6 -7
- package/dist/src/Modules/SwitchableOutputs/SwitchableOutputs.provider.js.map +1 -1
- package/package.json +1 -1
|
@@ -11,6 +11,7 @@ export interface SwitchableOutputState {
|
|
|
11
11
|
name: string;
|
|
12
12
|
customName: string;
|
|
13
13
|
group: string;
|
|
14
|
+
parentDeviceName: string;
|
|
14
15
|
showUIControl: 0 | 1;
|
|
15
16
|
auto: 0 | 1;
|
|
16
17
|
state: 0 | 1;
|
|
@@ -44,6 +45,7 @@ export interface SwitchableOutputTopics extends Topics {
|
|
|
44
45
|
unit?: string;
|
|
45
46
|
labels?: string;
|
|
46
47
|
}
|
|
48
|
+
export declare const getSwitchableOutputNameForDisplay: (state: SwitchableOutputState, switchingDeviceName: string) => string;
|
|
47
49
|
export declare const getSwitchableOutputStateTopics: (portalId: PortalId, deviceId: SwitchingDeviceInstanceId, outputId: SwitchableOutputId) => {
|
|
48
50
|
type: string;
|
|
49
51
|
status: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SwitchableOutput.provider.d.ts","sourceRoot":"/","sources":["src/Modules/SwitchableOutputs/SwitchableOutput.provider.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAA2B,MAAM,SAAS,CAAA;AAEnE,OAAO,EAAE,yBAAyB,EAAE,MAAM,4BAA4B,CAAA;AACtE,OAAO,EAAE,sBAAsB,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAA;AAEpF,MAAM,MAAM,kBAAkB,GAAG,MAAM,CAAA;AACvC,MAAM,MAAM,oBAAoB,GAAG,MAAM,GAAG,QAAQ,GAAG,cAAc,GAAG,SAAS,CAAA;AAEjF,MAAM,WAAW,qBAAqB;IACpC,QAAQ,EAAE,yBAAyB,CAAA;IACnC,QAAQ,EAAE,kBAAkB,CAAA;IAC5B,IAAI,EAAE,oBAAoB,CAAA;IAC1B,MAAM,EAAE,sBAAsB,CAAA;IAC9B,IAAI,EAAE,MAAM,CAAA;IACZ,UAAU,EAAE,MAAM,CAAA;IAClB,KAAK,EAAE,MAAM,CAAA;IACb,aAAa,EAAE,CAAC,GAAG,CAAC,CAAA;IACpB,IAAI,EAAE,CAAC,GAAG,CAAC,CAAA;IACX,KAAK,EAAE,CAAC,GAAG,CAAC,CAAA;IACZ,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,UAAU,CAAC,EAAE,MAAM,CAAA;IAEnB,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,IAAI,EAAE,oBAAoB,CAAA;IAE1B,MAAM,EAAE,MAAM,CAAA;CACf;AAED,MAAM,WAAW,wBAAyB,SAAQ,qBAAqB;IACrE,UAAU,EAAE,CAAC,IAAI,EAAE,CAAC,GAAG,CAAC,KAAK,IAAI,CAAA;IACjC,WAAW,EAAE,CAAC,KAAK,EAAE,CAAC,GAAG,CAAC,KAAK,IAAI,CAAA;IACnC,aAAa,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAA;CACzC;AAED,MAAM,WAAW,sBAAuB,SAAQ,MAAM;IACpD,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,MAAM,CAAC,EAAE,MAAM,CAAA;CAChB;AAED,eAAO,MAAM,8BAA8B,GACzC,UAAU,QAAQ,EAClB,UAAU,yBAAyB,EACnC,UAAU,kBAAkB;;;;;;;;;;;;;;;;CAiB5B,CAAA;AAEF,eAAO,MAAM,8BAA8B,GACzC,UAAU,QAAQ,EAClB,UAAU,yBAAyB,EACnC,UAAU,kBAAkB;;;;CAK5B,CAAA;AAEF,wBAAgB,mBAAmB,CACjC,QAAQ,EAAE,yBAAyB,EACnC,QAAQ,EAAE,kBAAkB,GAC3B,wBAAwB,CAgB1B"}
|
|
1
|
+
{"version":3,"file":"SwitchableOutput.provider.d.ts","sourceRoot":"/","sources":["src/Modules/SwitchableOutputs/SwitchableOutput.provider.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAA2B,MAAM,SAAS,CAAA;AAEnE,OAAO,EAAE,yBAAyB,EAAE,MAAM,4BAA4B,CAAA;AACtE,OAAO,EAAE,sBAAsB,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAA;AAEpF,MAAM,MAAM,kBAAkB,GAAG,MAAM,CAAA;AACvC,MAAM,MAAM,oBAAoB,GAAG,MAAM,GAAG,QAAQ,GAAG,cAAc,GAAG,SAAS,CAAA;AAEjF,MAAM,WAAW,qBAAqB;IACpC,QAAQ,EAAE,yBAAyB,CAAA;IACnC,QAAQ,EAAE,kBAAkB,CAAA;IAC5B,IAAI,EAAE,oBAAoB,CAAA;IAC1B,MAAM,EAAE,sBAAsB,CAAA;IAC9B,IAAI,EAAE,MAAM,CAAA;IACZ,UAAU,EAAE,MAAM,CAAA;IAClB,KAAK,EAAE,MAAM,CAAA;IACb,gBAAgB,EAAE,MAAM,CAAA;IACxB,aAAa,EAAE,CAAC,GAAG,CAAC,CAAA;IACpB,IAAI,EAAE,CAAC,GAAG,CAAC,CAAA;IACX,KAAK,EAAE,CAAC,GAAG,CAAC,CAAA;IACZ,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,UAAU,CAAC,EAAE,MAAM,CAAA;IAEnB,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,IAAI,EAAE,oBAAoB,CAAA;IAE1B,MAAM,EAAE,MAAM,CAAA;CACf;AAED,MAAM,WAAW,wBAAyB,SAAQ,qBAAqB;IACrE,UAAU,EAAE,CAAC,IAAI,EAAE,CAAC,GAAG,CAAC,KAAK,IAAI,CAAA;IACjC,WAAW,EAAE,CAAC,KAAK,EAAE,CAAC,GAAG,CAAC,KAAK,IAAI,CAAA;IACnC,aAAa,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAA;CACzC;AAED,MAAM,WAAW,sBAAuB,SAAQ,MAAM;IACpD,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,MAAM,CAAC,EAAE,MAAM,CAAA;CAChB;AAED,eAAO,MAAM,iCAAiC,GAAI,OAAO,qBAAqB,EAAE,qBAAqB,MAAM,WAO1G,CAAA;AAED,eAAO,MAAM,8BAA8B,GACzC,UAAU,QAAQ,EAClB,UAAU,yBAAyB,EACnC,UAAU,kBAAkB;;;;;;;;;;;;;;;;CAiB5B,CAAA;AAEF,eAAO,MAAM,8BAA8B,GACzC,UAAU,QAAQ,EAClB,UAAU,yBAAyB,EACnC,UAAU,kBAAkB;;;;CAK5B,CAAA;AAEF,wBAAgB,mBAAmB,CACjC,QAAQ,EAAE,yBAAyB,EACnC,QAAQ,EAAE,kBAAkB,GAC3B,wBAAwB,CAgB1B"}
|
|
@@ -11,6 +11,14 @@ var __assign = (this && this.__assign) || function () {
|
|
|
11
11
|
};
|
|
12
12
|
import { useMqtt, useTopicsState } from "../Mqtt";
|
|
13
13
|
import { useMemo } from "react";
|
|
14
|
+
export var getSwitchableOutputNameForDisplay = function (state, switchingDeviceName) {
|
|
15
|
+
// when custom name defined, or group not overriden
|
|
16
|
+
if (state.customName || state.group === "") {
|
|
17
|
+
return state.customName || state.name;
|
|
18
|
+
}
|
|
19
|
+
// otherwise prepend switching device name
|
|
20
|
+
return "".concat(switchingDeviceName, " | ").concat(state.name);
|
|
21
|
+
};
|
|
14
22
|
export var getSwitchableOutputStateTopics = function (portalId, deviceId, outputId) { return ({
|
|
15
23
|
type: "N/".concat(portalId, "/switch/").concat(deviceId, "/SwitchableOutput/").concat(outputId, "/Settings/Type"),
|
|
16
24
|
status: "N/".concat(portalId, "/switch/").concat(deviceId, "/SwitchableOutput/").concat(outputId, "/Status"),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SwitchableOutput.provider.js","sourceRoot":"/","sources":["src/Modules/SwitchableOutputs/SwitchableOutput.provider.ts"],"names":[],"mappings":";;;;;;;;;;;AAAA,OAAO,EAAoB,OAAO,EAAE,cAAc,EAAE,MAAM,SAAS,CAAA;AACnE,OAAO,EAAE,OAAO,EAAE,MAAM,OAAO,CAAA;
|
|
1
|
+
{"version":3,"file":"SwitchableOutput.provider.js","sourceRoot":"/","sources":["src/Modules/SwitchableOutputs/SwitchableOutput.provider.ts"],"names":[],"mappings":"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","sourcesContent":["import { PortalId, Topics, useMqtt, useTopicsState } from \"../Mqtt\"\nimport { useMemo } from \"react\"\nimport { SwitchingDeviceInstanceId } from \"./SwitchingDevice.provider\"\nimport { SwitchableOutputStatus, SwitchableOutputType } from \"../../utils/constants\"\n\nexport type SwitchableOutputId = string\nexport type SwitchableOutputUnit = string | \"/Speed\" | \"/Temperature\" | \"/Volume\"\n\nexport interface SwitchableOutputState {\n deviceId: SwitchingDeviceInstanceId\n outputId: SwitchableOutputId\n type: SwitchableOutputType\n status: SwitchableOutputStatus\n name: string\n customName: string\n group: string\n parentDeviceName: string\n showUIControl: 0 | 1\n auto: 0 | 1\n state: 0 | 1\n dimming?: number\n dimmingMin?: number\n dimmingMax?: number\n // NOTE: stepSize can be of any precision, respect the precision in the UI\n stepSize?: number\n measurement?: number\n unit: SwitchableOutputUnit\n // NOTE: JSON encoded string array\n labels: string\n}\n\nexport interface SwitchableOutputProvider extends SwitchableOutputState {\n updateAuto: (auto: 0 | 1) => void\n updateState: (state: 0 | 1) => void\n updateDimming: (dimming: number) => void\n}\n\nexport interface SwitchableOutputTopics extends Topics {\n type?: string\n status?: string\n name?: string\n customName?: string\n group?: string\n showUIControl?: string\n auto?: string\n state?: string\n dimming?: string\n dimmingMin?: string\n dimmingMax?: string\n stepSize?: string\n measurement?: string\n unit?: string\n labels?: string\n}\n\nexport const getSwitchableOutputNameForDisplay = (state: SwitchableOutputState, switchingDeviceName: string) => {\n // when custom name defined, or group not overriden\n if (state.customName || state.group === \"\") {\n return state.customName || state.name\n }\n // otherwise prepend switching device name\n return `${switchingDeviceName} | ${state.name}`\n}\n\nexport const getSwitchableOutputStateTopics = (\n portalId: PortalId,\n deviceId: SwitchingDeviceInstanceId,\n outputId: SwitchableOutputId\n) => ({\n type: `N/${portalId}/switch/${deviceId}/SwitchableOutput/${outputId}/Settings/Type`,\n status: `N/${portalId}/switch/${deviceId}/SwitchableOutput/${outputId}/Status`,\n name: `N/${portalId}/switch/${deviceId}/SwitchableOutput/${outputId}/Name`,\n customName: `N/${portalId}/switch/${deviceId}/SwitchableOutput/${outputId}/Settings/CustomName`,\n group: `N/${portalId}/switch/${deviceId}/SwitchableOutput/${outputId}/Settings/Group`,\n showUIControl: `N/${portalId}/switch/${deviceId}/SwitchableOutput/${outputId}/Settings/ShowUIControl`,\n auto: `N/${portalId}/switch/${deviceId}/SwitchableOutput/${outputId}/Auto`,\n state: `N/${portalId}/switch/${deviceId}/SwitchableOutput/${outputId}/State`,\n dimming: `N/${portalId}/switch/${deviceId}/SwitchableOutput/${outputId}/Dimming`,\n dimmingMin: `N/${portalId}/switch/${deviceId}/SwitchableOutput/${outputId}/Settings/DimmingMin`,\n dimmingMax: `N/${portalId}/switch/${deviceId}/SwitchableOutput/${outputId}/Settings/DimmingMax`,\n stepSize: `N/${portalId}/switch/${deviceId}/SwitchableOutput/${outputId}/Settings/StepSize`,\n measurement: `N/${portalId}/switch/${deviceId}/SwitchableOutput/${outputId}/Measurement`,\n unit: `N/${portalId}/switch/${deviceId}/SwitchableOutput/${outputId}/Settings/Unit`,\n labels: `N/${portalId}/switch/${deviceId}/SwitchableOutput/${outputId}/Settings/Labels`,\n})\n\nexport const getSwitchableOutputWriteTopics = (\n portalId: PortalId,\n deviceId: SwitchingDeviceInstanceId,\n outputId: SwitchableOutputId\n) => ({\n auto: `W/${portalId}/switch/${deviceId}/SwitchableOutput/${outputId}/Auto`,\n state: `W/${portalId}/switch/${deviceId}/SwitchableOutput/${outputId}/State`,\n dimming: `W/${portalId}/switch/${deviceId}/SwitchableOutput/${outputId}/Dimming`,\n})\n\nexport function useSwitchableOutput(\n deviceId: SwitchingDeviceInstanceId,\n outputId: SwitchableOutputId\n): SwitchableOutputProvider {\n const mqtt = useMqtt()\n const topics = useMemo(\n () => getSwitchableOutputStateTopics(mqtt.portalId, deviceId, outputId),\n [mqtt.portalId, deviceId, outputId]\n )\n const writeTopics = useMemo(\n () => getSwitchableOutputWriteTopics(mqtt.portalId, deviceId, outputId),\n [mqtt.portalId, deviceId, outputId]\n )\n\n const updateAuto = (auto: 0 | 1) => mqtt.publish(writeTopics!.auto, auto)\n const updateState = (state: 0 | 1) => mqtt.publish(writeTopics!.state, state)\n const updateDimming = (dimming: number) => mqtt.publish(writeTopics!.dimming, dimming)\n\n return { ...useTopicsState<SwitchableOutputState>(topics), updateAuto, updateState, updateDimming }\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SwitchableOutputs.provider.d.ts","sourceRoot":"/","sources":["src/Modules/SwitchableOutputs/SwitchableOutputs.provider.ts"],"names":[],"mappings":"AAQA,eAAO,MAAM,oBAAoB,
|
|
1
|
+
{"version":3,"file":"SwitchableOutputs.provider.d.ts","sourceRoot":"/","sources":["src/Modules/SwitchableOutputs/SwitchableOutputs.provider.ts"],"names":[],"mappings":"AAQA,eAAO,MAAM,oBAAoB,kEA6JhC,CAAA"}
|
|
@@ -15,7 +15,7 @@ import { useMqtt } from "../Mqtt";
|
|
|
15
15
|
import { useMemo, useEffect } from "react";
|
|
16
16
|
import { useSwitchableOutputsStore } from "./SwitchableOutputs.store";
|
|
17
17
|
import { getSwitchingDeviceStateTopics } from "./SwitchingDevice.provider";
|
|
18
|
-
import { getSwitchableOutputStateTopics } from "./SwitchableOutput.provider";
|
|
18
|
+
import { getSwitchableOutputNameForDisplay, getSwitchableOutputStateTopics } from "./SwitchableOutput.provider";
|
|
19
19
|
export var useSwitchableOutputs = function () {
|
|
20
20
|
var switchableOutputsStore = useSwitchableOutputsStore();
|
|
21
21
|
var getTopics = function (portalId) { return ({
|
|
@@ -119,23 +119,22 @@ export var useSwitchableOutputs = function () {
|
|
|
119
119
|
var swo = extractSwitchableOutputInfo(output);
|
|
120
120
|
var switchingDevice = mqtt.messagesByTopics(getSwitchingDeviceStateTopics(mqtt.portalId, swo.deviceId));
|
|
121
121
|
var customGroupAssignment = customGroupAssigments_1[index].trim();
|
|
122
|
-
var
|
|
123
|
-
|
|
124
|
-
: customGroupAssignment;
|
|
122
|
+
var deviceName = switchingDevice.customName || switchingDevice.productName;
|
|
123
|
+
var groupName = customGroupAssignment === "" ? deviceName : customGroupAssignment;
|
|
125
124
|
var switchableOutput = mqtt.messagesByTopics(getSwitchableOutputStateTopics(mqtt.portalId, swo.deviceId, swo.outputId));
|
|
126
125
|
// Ignore hidden controls
|
|
127
126
|
if (switchableOutput.showUIControl === 0) {
|
|
128
127
|
return;
|
|
129
128
|
}
|
|
130
129
|
newGroups_1[groupName] || (newGroups_1[groupName] = []);
|
|
131
|
-
newGroups_1[groupName].push(__assign(__assign({}, switchableOutput), { deviceId: swo.deviceId, outputId: swo.outputId }));
|
|
130
|
+
newGroups_1[groupName].push(__assign(__assign({}, switchableOutput), { deviceId: swo.deviceId, outputId: swo.outputId, parentDeviceName: deviceName }));
|
|
132
131
|
});
|
|
133
132
|
Logger.log("New switchable output groups: ".concat(JSON.stringify(Object.keys(newGroups_1))));
|
|
134
133
|
// Sort switches in a group by name
|
|
135
134
|
Object.values(newGroups_1).forEach(function (array) {
|
|
136
135
|
array.sort(function (a, b) {
|
|
137
|
-
var aName = a
|
|
138
|
-
var bName = b
|
|
136
|
+
var aName = getSwitchableOutputNameForDisplay(a, a.parentDeviceName);
|
|
137
|
+
var bName = getSwitchableOutputNameForDisplay(b, b.parentDeviceName);
|
|
139
138
|
return aName.localeCompare(bName);
|
|
140
139
|
});
|
|
141
140
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SwitchableOutputs.provider.js","sourceRoot":"/","sources":["src/Modules/SwitchableOutputs/SwitchableOutputs.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 { useSwitchableOutputsStore } from \"./SwitchableOutputs.store\"\nimport { getSwitchingDeviceStateTopics, SwitchingDeviceInstanceId } from \"./SwitchingDevice.provider\"\nimport { getSwitchableOutputStateTopics, SwitchableOutputId, SwitchableOutputState } from \"./SwitchableOutput.provider\"\n\nexport const useSwitchableOutputs = () => {\n const switchableOutputsStore = useSwitchableOutputsStore()\n\n const getTopics = (portalId: PortalId) => ({\n switchableOutputs: `N/${portalId}/switch/+/SwitchableOutput/+/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 messagesForSwitchingDevices = mqtt.messagesByWildcard(topics.switchingDevices)\n\n // Examine MQTT to find all available switchable outputs and their group assignments\n useEffect(() => {\n if (!messagesForSwitchableOutputs || Object.entries(messagesForSwitchableOutputs).length === 0) {\n Logger.log(\"Waiting for switchable outputs...\")\n } else {\n // All switchable outputs in array sorted by topic\n const availableSwitchableOutputs = Object.keys(messagesForSwitchableOutputs)\n .filter((key) => key.endsWith(\"/Settings/Group\"))\n .sort() as string[]\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 messagesForSwitchableOutputs[`${topic.slice(0, -\"/Group\".length)}/Type`]\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 messagesForSwitchableOutputs[`${topic.slice(0, -\"/Group\".length)}/ShowUIControl`]\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 // 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 = switchableOutputsStore.customGroupAssignments\n const newAssignments = customGroupAssigments\n const groupAssignmentsChanged = !arraysEqual(oldAssignments, newAssignments)\n if (groupAssignmentsChanged) {\n switchableOutputsStore.setCustomGroupAssignments(newAssignments)\n Logger.log(`Switchable outputs group assignments changed, recomputing...`)\n }\n\n const oldOutputTypes = switchableOutputsStore.outputTypes\n const newOutputTypes = availableSwitchableOutputTypes\n const outputTypesChanged = !arraysEqual(oldOutputTypes, newOutputTypes)\n if (outputTypesChanged) {\n switchableOutputsStore.setOutputTypes(newOutputTypes)\n Logger.log(`Switchable outputs types changed, recomputing...`)\n }\n\n const oldOutputNames = switchableOutputsStore.outputNames\n const newOutputNames = availableSwitchableOutputNames\n const outputNamesChanged = !arraysEqual(oldOutputNames, newOutputNames)\n if (outputNamesChanged) {\n switchableOutputsStore.setOutputNames(newOutputNames)\n Logger.log(`Switchable outputs names changed, recomputing...`)\n }\n\n const oldOutputVisibilityFlags = switchableOutputsStore.outputVisibilityFlags\n const newOutputVisibilityFlags = availableSwitchableOutputVisibilityFlags\n const outputVisibilityFlagsChanged = !arraysEqual(oldOutputVisibilityFlags, newOutputVisibilityFlags)\n if (outputVisibilityFlagsChanged) {\n switchableOutputsStore.setOutputVisibilityFlags(newOutputVisibilityFlags)\n Logger.log(`Switchable outputs visibility flags changed, recomputing...`)\n }\n\n const oldSwitchingDevices = switchableOutputsStore.switchingDevices\n const newSwitchingDevices = availableSwitchingDevices\n const switchingDevicesChanged = !arraysEqual(oldSwitchingDevices, newSwitchingDevices)\n if (switchingDevicesChanged) {\n switchableOutputsStore.setSwitchingDevices(newSwitchingDevices)\n Logger.log(`Switching devices changed, recomputing...`)\n }\n\n const oldSwitchingDeviceNames = switchableOutputsStore.switchingDeviceNames\n const newSwitchingDeviceNames = availableSwitchingDeviceNames\n const switchingDeviceNamesChanged = !arraysEqual(oldSwitchingDeviceNames, newSwitchingDeviceNames)\n if (switchingDeviceNamesChanged) {\n switchableOutputsStore.setSwitchingDeviceNames(newSwitchingDeviceNames)\n Logger.log(`Switching device names changed, recomputing...`)\n }\n\n if (\n groupAssignmentsChanged ||\n outputTypesChanged ||\n outputNamesChanged ||\n outputVisibilityFlagsChanged ||\n switchingDevicesChanged ||\n switchingDeviceNamesChanged\n ) {\n // New groups mapping array of switches to group name key\n const newGroups: { [key: string]: SwitchableOutputState[] } = {}\n\n // Walk the array of all switchable outputs, determine to which group it belongs\n // and populate its initial state\n availableSwitchableOutputs.forEach((output, index) => {\n const swo = extractSwitchableOutputInfo(output)\n const switchingDevice = mqtt.messagesByTopics(getSwitchingDeviceStateTopics(mqtt.portalId, swo.deviceId))\n const customGroupAssignment = customGroupAssigments[index].trim()\n const groupName =\n customGroupAssignment === \"\"\n ? switchingDevice.customName || switchingDevice.productName\n : customGroupAssignment\n const switchableOutput = mqtt.messagesByTopics(\n getSwitchableOutputStateTopics(mqtt.portalId, swo.deviceId, swo.outputId)\n ) as unknown as SwitchableOutputState\n\n // Ignore hidden controls\n if (switchableOutput.showUIControl === 0) {\n return\n }\n\n newGroups[groupName] ||= []\n newGroups[groupName].push({ ...switchableOutput, deviceId: swo.deviceId, outputId: swo.outputId })\n })\n\n Logger.log(`New switchable output groups: ${JSON.stringify(Object.keys(newGroups))}`)\n // Sort switches in a group by name\n Object.values(newGroups).forEach((array) => {\n array.sort((a, b) => {\n const aName = a.customName || a.name\n const bName = b.customName || b.name\n return aName.localeCompare(bName)\n })\n })\n switchableOutputsStore.setGroups(newGroups)\n }\n })\n return () => dispose()\n }\n }, [messagesForSwitchableOutputs, messagesForSwitchingDevices])\n\n return switchableOutputsStore\n}\n\nfunction extractSwitchableOutputInfo(topic: string) {\n const switchStart = topic.indexOf(\"/switch/\") + 8 // length of `/switch/`\n const outputStart = topic.indexOf(\"/SwitchableOutput/\") + 18 // length of `/SwitchableOutput/`\n\n return {\n deviceId: topic.substring(switchStart, topic.indexOf(\"/\", switchStart)) as unknown as SwitchingDeviceInstanceId,\n outputId: topic.substring(outputStart, topic.indexOf(\"/\", outputStart)) as unknown as SwitchableOutputId,\n }\n}\n\nfunction 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":"SwitchableOutputs.provider.js","sourceRoot":"/","sources":["src/Modules/SwitchableOutputs/SwitchableOutputs.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 { useSwitchableOutputsStore } from \"./SwitchableOutputs.store\"\nimport { getSwitchingDeviceStateTopics, SwitchingDeviceInstanceId } from \"./SwitchingDevice.provider\"\nimport { getSwitchableOutputNameForDisplay, getSwitchableOutputStateTopics, SwitchableOutputId, SwitchableOutputState } from \"./SwitchableOutput.provider\"\n\nexport const useSwitchableOutputs = () => {\n const switchableOutputsStore = useSwitchableOutputsStore()\n\n const getTopics = (portalId: PortalId) => ({\n switchableOutputs: `N/${portalId}/switch/+/SwitchableOutput/+/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 messagesForSwitchingDevices = mqtt.messagesByWildcard(topics.switchingDevices)\n\n // Examine MQTT to find all available switchable outputs and their group assignments\n useEffect(() => {\n if (!messagesForSwitchableOutputs || Object.entries(messagesForSwitchableOutputs).length === 0) {\n Logger.log(\"Waiting for switchable outputs...\")\n } else {\n // All switchable outputs in array sorted by topic\n const availableSwitchableOutputs = Object.keys(messagesForSwitchableOutputs)\n .filter((key) => key.endsWith(\"/Settings/Group\"))\n .sort() as string[]\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 messagesForSwitchableOutputs[`${topic.slice(0, -\"/Group\".length)}/Type`]\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 messagesForSwitchableOutputs[`${topic.slice(0, -\"/Group\".length)}/ShowUIControl`]\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 // 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 = switchableOutputsStore.customGroupAssignments\n const newAssignments = customGroupAssigments\n const groupAssignmentsChanged = !arraysEqual(oldAssignments, newAssignments)\n if (groupAssignmentsChanged) {\n switchableOutputsStore.setCustomGroupAssignments(newAssignments)\n Logger.log(`Switchable outputs group assignments changed, recomputing...`)\n }\n\n const oldOutputTypes = switchableOutputsStore.outputTypes\n const newOutputTypes = availableSwitchableOutputTypes\n const outputTypesChanged = !arraysEqual(oldOutputTypes, newOutputTypes)\n if (outputTypesChanged) {\n switchableOutputsStore.setOutputTypes(newOutputTypes)\n Logger.log(`Switchable outputs types changed, recomputing...`)\n }\n\n const oldOutputNames = switchableOutputsStore.outputNames\n const newOutputNames = availableSwitchableOutputNames\n const outputNamesChanged = !arraysEqual(oldOutputNames, newOutputNames)\n if (outputNamesChanged) {\n switchableOutputsStore.setOutputNames(newOutputNames)\n Logger.log(`Switchable outputs names changed, recomputing...`)\n }\n\n const oldOutputVisibilityFlags = switchableOutputsStore.outputVisibilityFlags\n const newOutputVisibilityFlags = availableSwitchableOutputVisibilityFlags\n const outputVisibilityFlagsChanged = !arraysEqual(oldOutputVisibilityFlags, newOutputVisibilityFlags)\n if (outputVisibilityFlagsChanged) {\n switchableOutputsStore.setOutputVisibilityFlags(newOutputVisibilityFlags)\n Logger.log(`Switchable outputs visibility flags changed, recomputing...`)\n }\n\n const oldSwitchingDevices = switchableOutputsStore.switchingDevices\n const newSwitchingDevices = availableSwitchingDevices\n const switchingDevicesChanged = !arraysEqual(oldSwitchingDevices, newSwitchingDevices)\n if (switchingDevicesChanged) {\n switchableOutputsStore.setSwitchingDevices(newSwitchingDevices)\n Logger.log(`Switching devices changed, recomputing...`)\n }\n\n const oldSwitchingDeviceNames = switchableOutputsStore.switchingDeviceNames\n const newSwitchingDeviceNames = availableSwitchingDeviceNames\n const switchingDeviceNamesChanged = !arraysEqual(oldSwitchingDeviceNames, newSwitchingDeviceNames)\n if (switchingDeviceNamesChanged) {\n switchableOutputsStore.setSwitchingDeviceNames(newSwitchingDeviceNames)\n Logger.log(`Switching device names changed, recomputing...`)\n }\n\n if (\n groupAssignmentsChanged ||\n outputTypesChanged ||\n outputNamesChanged ||\n outputVisibilityFlagsChanged ||\n switchingDevicesChanged ||\n switchingDeviceNamesChanged\n ) {\n // New groups mapping array of switches to group name key\n const newGroups: { [key: string]: SwitchableOutputState[] } = {}\n\n // Walk the array of all switchable outputs, determine to which group it belongs\n // and populate its initial state\n availableSwitchableOutputs.forEach((output, index) => {\n const swo = extractSwitchableOutputInfo(output)\n const switchingDevice = mqtt.messagesByTopics(getSwitchingDeviceStateTopics(mqtt.portalId, swo.deviceId))\n const customGroupAssignment = customGroupAssigments[index].trim()\n const deviceName = switchingDevice.customName || switchingDevice.productName\n const groupName = customGroupAssignment === \"\" ? deviceName : customGroupAssignment\n const switchableOutput = mqtt.messagesByTopics(\n getSwitchableOutputStateTopics(mqtt.portalId, swo.deviceId, swo.outputId)\n ) as unknown as SwitchableOutputState\n\n // Ignore hidden controls\n if (switchableOutput.showUIControl === 0) {\n return\n }\n\n newGroups[groupName] ||= []\n newGroups[groupName].push({\n ...switchableOutput,\n deviceId: swo.deviceId,\n outputId: swo.outputId,\n parentDeviceName: deviceName as unknown as string,\n })\n })\n\n Logger.log(`New switchable output groups: ${JSON.stringify(Object.keys(newGroups))}`)\n // Sort switches in a group by name\n Object.values(newGroups).forEach((array) => {\n array.sort((a, b) => {\n const aName = getSwitchableOutputNameForDisplay(a, a.parentDeviceName)\n const bName = getSwitchableOutputNameForDisplay(b, b.parentDeviceName)\n return aName.localeCompare(bName)\n })\n })\n switchableOutputsStore.setGroups(newGroups)\n }\n })\n return () => dispose()\n }\n }, [messagesForSwitchableOutputs, messagesForSwitchingDevices])\n\n return switchableOutputsStore\n}\n\nfunction extractSwitchableOutputInfo(topic: string) {\n const switchStart = topic.indexOf(\"/switch/\") + 8 // length of `/switch/`\n const outputStart = topic.indexOf(\"/SwitchableOutput/\") + 18 // length of `/SwitchableOutput/`\n\n return {\n deviceId: topic.substring(switchStart, topic.indexOf(\"/\", switchStart)) as unknown as SwitchingDeviceInstanceId,\n outputId: topic.substring(outputStart, topic.indexOf(\"/\", outputStart)) as unknown as SwitchableOutputId,\n }\n}\n\nfunction 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"]}
|