@victronenergy/mfd-modules 9.3.0 → 9.4.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.
Files changed (19) hide show
  1. package/dist/src/Modules/SwitchableOutputs/SwitchableOutput.provider.d.ts +3 -3
  2. package/dist/src/Modules/SwitchableOutputs/SwitchableOutput.provider.d.ts.map +1 -1
  3. package/dist/src/Modules/SwitchableOutputs/SwitchableOutput.provider.js +1 -1
  4. package/dist/src/Modules/SwitchableOutputs/SwitchableOutput.provider.js.map +1 -1
  5. package/dist/src/Modules/SwitchableOutputs/SwitchableOutputs.provider.d.ts.map +1 -1
  6. package/dist/src/Modules/SwitchableOutputs/SwitchableOutputs.provider.js +35 -55
  7. package/dist/src/Modules/SwitchableOutputs/SwitchableOutputs.provider.js.map +1 -1
  8. package/dist/src/Modules/SwitchableOutputs/SwitchableOutputs.store.d.ts +0 -4
  9. package/dist/src/Modules/SwitchableOutputs/SwitchableOutputs.store.d.ts.map +1 -1
  10. package/dist/src/Modules/SwitchableOutputs/SwitchableOutputs.store.js +1 -13
  11. package/dist/src/Modules/SwitchableOutputs/SwitchableOutputs.store.js.map +1 -1
  12. package/dist/src/Modules/SwitchableOutputs/SwitchingDevice.provider.d.ts +1 -0
  13. package/dist/src/Modules/SwitchableOutputs/SwitchingDevice.provider.d.ts.map +1 -1
  14. package/dist/src/Modules/SwitchableOutputs/SwitchingDevice.provider.js +34 -1
  15. package/dist/src/Modules/SwitchableOutputs/SwitchingDevice.provider.js.map +1 -1
  16. package/dist/src/Modules/SwitchableOutputs/SwitchingDevices.store.d.ts +4 -4
  17. package/dist/src/Modules/SwitchableOutputs/SwitchingDevices.store.d.ts.map +1 -1
  18. package/dist/src/Modules/SwitchableOutputs/SwitchingDevices.store.js.map +1 -1
  19. package/package.json +1 -1
@@ -10,7 +10,7 @@ export interface SwitchableOutputState {
10
10
  name: string;
11
11
  customName: string;
12
12
  group: string;
13
- isVisible: boolean;
13
+ showUIControl: 0 | 1;
14
14
  auto: 0 | 1;
15
15
  state: 0 | 1;
16
16
  dimming?: number;
@@ -32,7 +32,7 @@ export interface SwitchableOutputTopics extends Topics {
32
32
  name?: string;
33
33
  customName?: string;
34
34
  group?: string;
35
- isVisible?: string;
35
+ showUIControl?: string;
36
36
  auto?: string;
37
37
  state?: string;
38
38
  dimming?: string;
@@ -49,7 +49,7 @@ export declare const getSwitchableOutputStateTopics: (portalId: PortalId, device
49
49
  name: string;
50
50
  customName: string;
51
51
  group: string;
52
- isVisible: string;
52
+ showUIControl: string;
53
53
  auto: string;
54
54
  state: string;
55
55
  dimming: 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;AAEvC,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,SAAS,EAAE,OAAO,CAAA;IAClB,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,MAAM,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,CAAA;IAEjC,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,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,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,GAAI,UAAU,QAAQ,EAAE,UAAU,yBAAyB,EAAE,UAAU,kBAAkB;;;;;;;;;;;;;;;;CAgBlI,CAAA;AAEF,eAAO,MAAM,8BAA8B,GAAI,UAAU,QAAQ,EAAE,UAAU,yBAAyB,EAAE,UAAU,kBAAkB;;;;CAIlI,CAAA;AAEF,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,yBAAyB,EAAE,QAAQ,EAAE,kBAAkB,GAAG,wBAAwB,CAW/H"}
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;AAEvC,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,MAAM,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,CAAA;IAEjC,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,GAAI,UAAU,QAAQ,EAAE,UAAU,yBAAyB,EAAE,UAAU,kBAAkB;;;;;;;;;;;;;;;;CAgBlI,CAAA;AAEF,eAAO,MAAM,8BAA8B,GAAI,UAAU,QAAQ,EAAE,UAAU,yBAAyB,EAAE,UAAU,kBAAkB;;;;CAIlI,CAAA;AAEF,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,yBAAyB,EAAE,QAAQ,EAAE,kBAAkB,GAAG,wBAAwB,CAW/H"}
@@ -17,7 +17,7 @@ export var getSwitchableOutputStateTopics = function (portalId, deviceId, output
17
17
  name: "N/".concat(portalId, "/switch/").concat(deviceId, "/SwitchableOutput/").concat(outputId, "/Name"),
18
18
  customName: "N/".concat(portalId, "/switch/").concat(deviceId, "/SwitchableOutput/").concat(outputId, "/Settings/CustomName"),
19
19
  group: "N/".concat(portalId, "/switch/").concat(deviceId, "/SwitchableOutput/").concat(outputId, "/Settings/Group"),
20
- isVisible: "N/".concat(portalId, "/switch/").concat(deviceId, "/SwitchableOutput/").concat(outputId, "/Settings/ShowUIControl"),
20
+ showUIControl: "N/".concat(portalId, "/switch/").concat(deviceId, "/SwitchableOutput/").concat(outputId, "/Settings/ShowUIControl"),
21
21
  auto: "N/".concat(portalId, "/switch/").concat(deviceId, "/SwitchableOutput/").concat(outputId, "/Auto"),
22
22
  state: "N/".concat(portalId, "/switch/").concat(deviceId, "/SwitchableOutput/").concat(outputId, "/State"),
23
23
  dimming: "N/".concat(portalId, "/switch/").concat(deviceId, "/SwitchableOutput/").concat(outputId, "/Dimming"),
@@ -1 +1 @@
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\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 isVisible: boolean\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: string | \"/S\" | \"/T\" | \"/V\"\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 isVisible?: 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 getSwitchableOutputStateTopics = (portalId: PortalId, deviceId: SwitchingDeviceInstanceId, outputId: SwitchableOutputId) => ({\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 isVisible: `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}/DimmingMin`,\n dimmingMax: `N/${portalId}/switch/${deviceId}/SwitchableOutput/${outputId}/DimmingMax`,\n stepSize: `N/${portalId}/switch/${deviceId}/SwitchableOutput/${outputId}/StepSize`,\n measurement: `N/${portalId}/switch/${deviceId}/SwitchableOutput/${outputId}/Measurement`,\n unit: `N/${portalId}/switch/${deviceId}/SwitchableOutput/${outputId}/Unit`,\n labels: `N/${portalId}/switch/${deviceId}/SwitchableOutput/${outputId}/Labels`,\n})\n\nexport const getSwitchableOutputWriteTopics = (portalId: PortalId, deviceId: SwitchingDeviceInstanceId, outputId: SwitchableOutputId) => ({\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(deviceId: SwitchingDeviceInstanceId, outputId: SwitchableOutputId): SwitchableOutputProvider {\n\n const mqtt = useMqtt()\n const topics = useMemo(() => getSwitchableOutputStateTopics(mqtt.portalId, deviceId, outputId), [mqtt.portalId, deviceId, outputId])\n const writeTopics = useMemo(() => getSwitchableOutputWriteTopics(mqtt.portalId, deviceId, outputId), [mqtt.portalId, deviceId, outputId])\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
+ {"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\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 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: string | \"/S\" | \"/T\" | \"/V\"\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 getSwitchableOutputStateTopics = (portalId: PortalId, deviceId: SwitchingDeviceInstanceId, outputId: SwitchableOutputId) => ({\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}/DimmingMin`,\n dimmingMax: `N/${portalId}/switch/${deviceId}/SwitchableOutput/${outputId}/DimmingMax`,\n stepSize: `N/${portalId}/switch/${deviceId}/SwitchableOutput/${outputId}/StepSize`,\n measurement: `N/${portalId}/switch/${deviceId}/SwitchableOutput/${outputId}/Measurement`,\n unit: `N/${portalId}/switch/${deviceId}/SwitchableOutput/${outputId}/Unit`,\n labels: `N/${portalId}/switch/${deviceId}/SwitchableOutput/${outputId}/Labels`,\n})\n\nexport const getSwitchableOutputWriteTopics = (portalId: PortalId, deviceId: SwitchingDeviceInstanceId, outputId: SwitchableOutputId) => ({\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(deviceId: SwitchingDeviceInstanceId, outputId: SwitchableOutputId): SwitchableOutputProvider {\n\n const mqtt = useMqtt()\n const topics = useMemo(() => getSwitchableOutputStateTopics(mqtt.portalId, deviceId, outputId), [mqtt.portalId, deviceId, outputId])\n const writeTopics = useMemo(() => getSwitchableOutputWriteTopics(mqtt.portalId, deviceId, outputId), [mqtt.portalId, deviceId, outputId])\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,kEAiFhC,CAAA"}
1
+ {"version":3,"file":"SwitchableOutputs.provider.d.ts","sourceRoot":"/","sources":["src/Modules/SwitchableOutputs/SwitchableOutputs.provider.ts"],"names":[],"mappings":"AAQA,eAAO,MAAM,oBAAoB,kEA6DhC,CAAA"}
@@ -19,73 +19,53 @@ import { getSwitchableOutputStateTopics } from "./SwitchableOutput.provider";
19
19
  export var useSwitchableOutputs = function () {
20
20
  var switchableOutputsStore = useSwitchableOutputsStore();
21
21
  var getTopics = function (portalId) { return ({
22
- devices: "N/".concat(portalId, "/switch/+/DeviceInstance"),
23
- switchableOutputs: "N/".concat(portalId, "/switch/+/SwitchableOutput/+/Settings/Group"),
22
+ switchableOutputs: "N/".concat(portalId, "/switch/+/SwitchableOutput/+/Settings/+"),
24
23
  }); };
25
24
  var mqtt = useMqtt();
26
25
  var topics = useMemo(function () { return getTopics(mqtt.portalId); }, [mqtt.portalId]);
27
- var messagesForSwitchingDevices = mqtt.messagesByWildcard(topics.devices);
28
26
  var messagesForSwitchableOutputs = mqtt.messagesByWildcard(topics.switchableOutputs);
29
- // Examine MQTT to find all available switching devices
30
- useEffect(function () {
31
- if (!messagesForSwitchingDevices || Object.entries(messagesForSwitchingDevices).length === 0) {
32
- Logger.log("Waiting for switching devices...");
33
- }
34
- else {
35
- var deviceInstances_1 = Object.values(messagesForSwitchingDevices);
36
- var dispose_1 = autorun(function () {
37
- var oldDevices = switchableOutputsStore.devices;
38
- var newDevices = deviceInstances_1.map(function (deviceId) { return mqtt.messagesByTopics(getSwitchingDeviceStateTopics(mqtt.portalId, deviceId)); });
39
- // TODO: check unordered structural identify of old and new state
40
- // TODO: to avoid unnecessary re-rendering: O(n^2) baby
41
- if (!oldDevices || oldDevices.length != newDevices.length || !newDevices.every(function (id) { return deviceInstances_1.includes(id); })) {
42
- Logger.log("New switching devices instances: ".concat(JSON.stringify(deviceInstances_1)));
43
- switchableOutputsStore.setDevices(newDevices);
44
- }
45
- });
46
- return function () { return dispose_1(); };
47
- }
48
- }, [messagesForSwitchingDevices]);
49
27
  // Examine MQTT to find all available switchable outputs and their group assignments
50
28
  useEffect(function () {
51
29
  if (!messagesForSwitchableOutputs || Object.entries(messagesForSwitchableOutputs).length === 0) {
52
30
  Logger.log("Waiting for switchable outputs...");
53
31
  }
54
32
  else {
55
- var availableSwitchableOutputs_1 = Object.keys(messagesForSwitchableOutputs).sort();
56
- var customGroupAssigments_1 = availableSwitchableOutputs_1.map(function (topic) { return messagesForSwitchableOutputs[topic]; });
57
- var dispose_2 = autorun(function () {
58
- var oldAssignments = switchableOutputsStore.customGroupAssignments;
59
- var newAssignments = customGroupAssigments_1;
60
- // TODO: check ordered structural identify of old and new state
61
- // TODO: to avoid unnecessary re-rendering and re-grouping:
62
- if (!oldAssignments || oldAssignments.length != newAssignments.length || !oldAssignments.every(function (groupName, index) { return customGroupAssigments_1[index] === groupName; })) {
63
- switchableOutputsStore.setCustomGroupAssignments(newAssignments);
64
- var newGroups_1 = {};
65
- // Walk the array of all switchable outputs, determine to which group it belongs
66
- // and populate its initial state
67
- availableSwitchableOutputs_1.forEach(function (output, index) {
68
- var swo = extractSwitchableOutputInfo(output);
69
- var switchingDevice = mqtt.messagesByTopics(getSwitchingDeviceStateTopics(mqtt.portalId, swo.deviceId));
70
- var customGroupAssignment = newAssignments[index].trim();
71
- var groupName = customGroupAssignment === "" ? switchingDevice.customName || switchingDevice.productName : customGroupAssignment;
72
- var switchableOutput = mqtt.messagesByTopics(getSwitchableOutputStateTopics(mqtt.portalId, swo.deviceId, swo.outputId));
73
- newGroups_1[groupName] || (newGroups_1[groupName] = []);
74
- newGroups_1[groupName].push(__assign(__assign({}, switchableOutput), { deviceId: swo.deviceId, outputId: swo.outputId }));
75
- });
76
- Logger.log("New switchable output groups: ".concat(JSON.stringify(Object.keys(newGroups_1))));
77
- // Sort switches in a group by name
78
- Object.values(newGroups_1).forEach(function (array) {
79
- array.sort(function (a, b) {
80
- var aName = a.customName || a.name;
81
- var bName = b.customName || b.name;
82
- return aName.localeCompare(bName);
83
- });
33
+ var availableSwitchableOutputs_1 = Object.keys(messagesForSwitchableOutputs)
34
+ .filter(function (key) { return key.endsWith('/Settings/Group'); })
35
+ .sort();
36
+ var customGroupAssigments_1 = availableSwitchableOutputs_1
37
+ .filter(function (topic) { return topic.endsWith('/Settings/Group'); })
38
+ .map(function (topic) { return messagesForSwitchableOutputs[topic]; });
39
+ var dispose_1 = autorun(function () {
40
+ switchableOutputsStore.setCustomGroupAssignments(customGroupAssigments_1);
41
+ var newGroups = {};
42
+ // Walk the array of all switchable outputs, determine to which group it belongs
43
+ // and populate its initial state
44
+ availableSwitchableOutputs_1.forEach(function (output, index) {
45
+ var swo = extractSwitchableOutputInfo(output);
46
+ var switchingDevice = mqtt.messagesByTopics(getSwitchingDeviceStateTopics(mqtt.portalId, swo.deviceId));
47
+ var customGroupAssignment = customGroupAssigments_1[index].trim();
48
+ var groupName = customGroupAssignment === "" ? switchingDevice.customName || switchingDevice.productName : customGroupAssignment;
49
+ var switchableOutput = mqtt.messagesByTopics(getSwitchableOutputStateTopics(mqtt.portalId, swo.deviceId, swo.outputId));
50
+ // Ignore hidden controls
51
+ if (switchableOutput.showUIControl === 0) {
52
+ return;
53
+ }
54
+ newGroups[groupName] || (newGroups[groupName] = []);
55
+ newGroups[groupName].push(__assign(__assign({}, switchableOutput), { deviceId: swo.deviceId, outputId: swo.outputId }));
56
+ });
57
+ Logger.log("New switchable output groups: ".concat(JSON.stringify(Object.keys(newGroups))));
58
+ // Sort switches in a group by name
59
+ Object.values(newGroups).forEach(function (array) {
60
+ array.sort(function (a, b) {
61
+ var aName = a.customName || a.name;
62
+ var bName = b.customName || b.name;
63
+ return aName.localeCompare(bName);
84
64
  });
85
- switchableOutputsStore.setGroups(newGroups_1);
86
- }
65
+ });
66
+ switchableOutputsStore.setGroups(newGroups);
87
67
  });
88
- return function () { return dispose_2(); };
68
+ return function () { return dispose_1(); };
89
69
  }
90
70
  }, [messagesForSwitchableOutputs]);
91
71
  return switchableOutputsStore;
@@ -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, SwitchingDeviceState } 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 devices: `N/${portalId}/switch/+/DeviceInstance`,\n switchableOutputs: `N/${portalId}/switch/+/SwitchableOutput/+/Settings/Group`,\n })\n\n const mqtt = useMqtt()\n const topics = useMemo(() => getTopics(mqtt.portalId), [mqtt.portalId])\n\n const messagesForSwitchingDevices = mqtt.messagesByWildcard(topics.devices)\n const messagesForSwitchableOutputs = mqtt.messagesByWildcard(topics.switchableOutputs)\n\n // Examine MQTT to find all available switching devices\n useEffect(() => {\n if (!messagesForSwitchingDevices || Object.entries(messagesForSwitchingDevices).length === 0) {\n Logger.log(\"Waiting for switching devices...\")\n } else {\n const deviceInstances = Object.values(messagesForSwitchingDevices) as SwitchingDeviceInstanceId[]\n const dispose = autorun(() => {\n const oldDevices = switchableOutputsStore.devices\n const newDevices = deviceInstances.map((deviceId) => mqtt.messagesByTopics(getSwitchingDeviceStateTopics(mqtt.portalId, deviceId))) as unknown as SwitchingDeviceInstanceId[]\n // TODO: check unordered structural identify of old and new state\n // TODO: to avoid unnecessary re-rendering: O(n^2) baby\n if (!oldDevices || oldDevices.length != newDevices.length || !newDevices.every((id) => deviceInstances.includes(id))) {\n Logger.log(`New switching devices instances: ${JSON.stringify(deviceInstances)}`);\n switchableOutputsStore.setDevices(newDevices)\n }\n })\n return () => dispose()\n }\n }, [messagesForSwitchingDevices])\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 const availableSwitchableOutputs = Object.keys(messagesForSwitchableOutputs).sort() as string[]\n const customGroupAssigments = availableSwitchableOutputs.map(topic => messagesForSwitchableOutputs[topic])\n const dispose = autorun(() => {\n const oldAssignments = switchableOutputsStore.customGroupAssignments\n const newAssignments = customGroupAssigments\n // TODO: check ordered structural identify of old and new state\n // TODO: to avoid unnecessary re-rendering and re-grouping:\n if (!oldAssignments || oldAssignments.length != newAssignments.length || !oldAssignments.every((groupName, index) => customGroupAssigments[index] === groupName)) {\n switchableOutputsStore.setCustomGroupAssignments(newAssignments)\n\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 = newAssignments[index].trim()\n const groupName = customGroupAssignment === \"\" ? switchingDevice.customName || switchingDevice.productName : customGroupAssignment\n const switchableOutput = mqtt.messagesByTopics(getSwitchableOutputStateTopics(mqtt.portalId, swo.deviceId, swo.outputId)) as unknown as SwitchableOutputState\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])\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}"]}
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 })\n\n const mqtt = useMqtt()\n const topics = useMemo(() => getTopics(mqtt.portalId), [mqtt.portalId])\n\n const messagesForSwitchableOutputs = mqtt.messagesByWildcard(topics.switchableOutputs)\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 const availableSwitchableOutputs = Object.keys(messagesForSwitchableOutputs)\n .filter(key => key.endsWith('/Settings/Group'))\n .sort() as string[]\n const customGroupAssigments = availableSwitchableOutputs\n .filter(topic => topic.endsWith('/Settings/Group'))\n .map(topic => messagesForSwitchableOutputs[topic])\n const dispose = autorun(() => {\n switchableOutputsStore.setCustomGroupAssignments(customGroupAssigments)\n\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 = customGroupAssignment === \"\" ? switchingDevice.customName || switchingDevice.productName : customGroupAssignment\n const switchableOutput = mqtt.messagesByTopics(getSwitchableOutputStateTopics(mqtt.portalId, swo.deviceId, swo.outputId)) as unknown as SwitchableOutputState\n\n // Ignore hidden controls\n if (switchableOutput.showUIControl === 0) { return }\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])\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}"]}
@@ -1,20 +1,16 @@
1
1
  import { SwitchableOutputState } from "./SwitchableOutput.provider";
2
- import { SwitchingDeviceInstanceId } from "./SwitchingDevice.provider";
3
2
  export interface SwitchableOutputsState {
4
- devices: SwitchingDeviceInstanceId[];
5
3
  groups: {
6
4
  [key: string]: SwitchableOutputState[];
7
5
  };
8
6
  customGroupAssignments: string[];
9
7
  }
10
8
  export declare class SwitchableOutputsStore {
11
- devices: SwitchingDeviceInstanceId[];
12
9
  groups: {
13
10
  [key: string]: SwitchableOutputState[];
14
11
  };
15
12
  customGroupAssignments: string[];
16
13
  constructor();
17
- setDevices: (devices: SwitchingDeviceInstanceId[]) => number[];
18
14
  setGroups: (groups: {
19
15
  [key: string]: SwitchableOutputState[];
20
16
  }) => {
@@ -1 +1 @@
1
- {"version":3,"file":"SwitchableOutputs.store.d.ts","sourceRoot":"/","sources":["src/Modules/SwitchableOutputs/SwitchableOutputs.store.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,qBAAqB,EAAE,MAAM,6BAA6B,CAAA;AACnE,OAAO,EAAE,yBAAyB,EAAE,MAAM,4BAA4B,CAAA;AAItE,MAAM,WAAW,sBAAsB;IACrC,OAAO,EAAE,yBAAyB,EAAE,CAAA;IACpC,MAAM,EAAE;QAAE,CAAC,GAAG,EAAE,MAAM,GAAI,qBAAqB,EAAE,CAAA;KAAE,CAAA;IAEnD,sBAAsB,EAAE,MAAM,EAAE,CAAA;CACjC;AAED,qBAAa,sBAAsB;IACjC,OAAO,EAAE,yBAAyB,EAAE,CAAK;IACzC,MAAM,EAAE;QAAE,CAAC,GAAG,EAAE,MAAM,GAAI,qBAAqB,EAAE,CAAA;KAAE,CAAK;IACxD,sBAAsB,EAAE,MAAM,EAAE,CAAK;;IAMrC,UAAU,GAAI,SAAS,yBAAyB,EAAE,cAA2B;IAC7E,SAAS,GAAI,QAAQ;QAAE,CAAC,GAAG,EAAE,MAAM,GAAI,qBAAqB,EAAE,CAAA;KAAE;;MAAyB;IACzF,yBAAyB,GAAI,aAAa,MAAM,EAAE,cAA8C;CACjG;AAYD,wBAAgB,yBAAyB,2BAExC"}
1
+ {"version":3,"file":"SwitchableOutputs.store.d.ts","sourceRoot":"/","sources":["src/Modules/SwitchableOutputs/SwitchableOutputs.store.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,qBAAqB,EAAE,MAAM,6BAA6B,CAAA;AAInE,MAAM,WAAW,sBAAsB;IACrC,MAAM,EAAE;QAAE,CAAC,GAAG,EAAE,MAAM,GAAI,qBAAqB,EAAE,CAAA;KAAE,CAAA;IAEnD,sBAAsB,EAAE,MAAM,EAAE,CAAA;CACjC;AAED,qBAAa,sBAAsB;IACjC,MAAM,EAAE;QAAE,CAAC,GAAG,EAAE,MAAM,GAAI,qBAAqB,EAAE,CAAA;KAAE,CAAK;IACxD,sBAAsB,EAAE,MAAM,EAAE,CAAK;;IAMrC,SAAS,GAAI,QAAQ;QAAE,CAAC,GAAG,EAAE,MAAM,GAAI,qBAAqB,EAAE,CAAA;KAAE;;MAAyB;IACzF,yBAAyB,GAAI,aAAa,MAAM,EAAE,cAA8C;CACjG;AAYD,wBAAgB,yBAAyB,2BAExC"}
@@ -4,12 +4,6 @@ var store;
4
4
  var SwitchableOutputsStore = /** @class */ (function () {
5
5
  function SwitchableOutputsStore() {
6
6
  var _this = this;
7
- Object.defineProperty(this, "devices", {
8
- enumerable: true,
9
- configurable: true,
10
- writable: true,
11
- value: []
12
- });
13
7
  Object.defineProperty(this, "groups", {
14
8
  enumerable: true,
15
9
  configurable: true,
@@ -22,12 +16,6 @@ var SwitchableOutputsStore = /** @class */ (function () {
22
16
  writable: true,
23
17
  value: []
24
18
  });
25
- Object.defineProperty(this, "setDevices", {
26
- enumerable: true,
27
- configurable: true,
28
- writable: true,
29
- value: function (devices) { return _this.devices = devices; }
30
- });
31
19
  Object.defineProperty(this, "setGroups", {
32
20
  enumerable: true,
33
21
  configurable: true,
@@ -40,7 +28,7 @@ var SwitchableOutputsStore = /** @class */ (function () {
40
28
  writable: true,
41
29
  value: function (assignments) { return _this.customGroupAssignments = assignments; }
42
30
  });
43
- makeAutoObservable(this, { setDevices: action, setGroups: action, setCustomGroupAssignments: action });
31
+ makeAutoObservable(this, { setGroups: action, setCustomGroupAssignments: action });
44
32
  }
45
33
  return SwitchableOutputsStore;
46
34
  }());
@@ -1 +1 @@
1
- {"version":3,"file":"SwitchableOutputs.store.js","sourceRoot":"/","sources":["src/Modules/SwitchableOutputs/SwitchableOutputs.store.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,kBAAkB,EAAe,MAAM,MAAM,CAAA;AAC9D,OAAO,EAAE,OAAO,EAAE,MAAM,OAAO,CAAA;AAI/B,IAAI,KAA6B,CAAA;AASjC;IAKE;QAAA,iBAEC;QAND;;;;mBAAuC,EAAE;WAAA;QACzC;;;;mBAAsD,EAAE;WAAA;QACxD;;;;mBAAmC,EAAE;WAAA;QAMrC;;;;mBAAa,UAAC,OAAoC,IAAK,OAAA,KAAI,CAAC,OAAO,GAAG,OAAO,EAAtB,CAAsB;WAAA;QAC7E;;;;mBAAY,UAAC,MAAmD,IAAK,OAAA,KAAI,CAAC,MAAM,GAAG,MAAM,EAApB,CAAoB;WAAA;QACzF;;;;mBAA4B,UAAC,WAAqB,IAAK,OAAA,KAAI,CAAC,sBAAsB,GAAG,WAAW,EAAzC,CAAyC;WAAA;QAL9F,kBAAkB,CAAC,IAAI,EAAE,EAAE,UAAU,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,yBAAyB,EAAE,MAAM,EAAE,CAAC,CAAA;IACxG,CAAC;IAKH,6BAAC;AAAD,CAAC,AAZD,IAYC;;AAED,SAAS,eAAe;IACtB,IAAM,MAAM,GAAG,KAAK,aAAL,KAAK,cAAL,KAAK,GAAI,IAAI,sBAAsB,EAAE,CAAA;IACpD,4CAA4C;IAC5C,IAAI,OAAO,MAAM,KAAK,WAAW;QAAE,OAAO,MAAM,CAAA;IAChD,sCAAsC;IACtC,IAAI,CAAC,KAAK;QAAE,KAAK,GAAG,MAAM,CAAA;IAE1B,OAAO,MAAM,CAAA;AACf,CAAC;AAED,MAAM,UAAU,yBAAyB;IACvC,OAAO,OAAO,CAAC,cAAM,OAAA,eAAe,EAAE,EAAjB,CAAiB,EAAE,EAAE,CAAC,CAAA;AAC7C,CAAC","sourcesContent":["import { action, makeAutoObservable, runInAction } from \"mobx\"\nimport { useMemo } from \"react\"\nimport { SwitchableOutputState } from \"./SwitchableOutput.provider\"\nimport { SwitchingDeviceInstanceId } from \"./SwitchingDevice.provider\"\n\nlet store: SwitchableOutputsStore\n\nexport interface SwitchableOutputsState {\n devices: SwitchingDeviceInstanceId[]\n groups: { [key: string] : SwitchableOutputState[] }\n // custom group assignments for available switchable outputs sorted by their topic path\n customGroupAssignments: string[]\n}\n\nexport class SwitchableOutputsStore {\n devices: SwitchingDeviceInstanceId[] = []\n groups: { [key: string] : SwitchableOutputState[] } = {}\n customGroupAssignments: string[] = []\n\n constructor() {\n makeAutoObservable(this, { setDevices: action, setGroups: action, setCustomGroupAssignments: action })\n }\n\n setDevices = (devices: SwitchingDeviceInstanceId[]) => this.devices = devices\n setGroups = (groups: { [key: string] : SwitchableOutputState[] }) => this.groups = groups\n setCustomGroupAssignments = (assignments: string[]) => this.customGroupAssignments = assignments\n}\n\nfunction initializeStore() {\n const _store = store ?? new SwitchableOutputsStore()\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 useSwitchableOutputsStore() {\n return useMemo(() => initializeStore(), [])\n}"]}
1
+ {"version":3,"file":"SwitchableOutputs.store.js","sourceRoot":"/","sources":["src/Modules/SwitchableOutputs/SwitchableOutputs.store.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,kBAAkB,EAAe,MAAM,MAAM,CAAA;AAC9D,OAAO,EAAE,OAAO,EAAE,MAAM,OAAO,CAAA;AAG/B,IAAI,KAA6B,CAAA;AAQjC;IAIE;QAAA,iBAEC;QALD;;;;mBAAsD,EAAE;WAAA;QACxD;;;;mBAAmC,EAAE;WAAA;QAMrC;;;;mBAAY,UAAC,MAAmD,IAAK,OAAA,KAAI,CAAC,MAAM,GAAG,MAAM,EAApB,CAAoB;WAAA;QACzF;;;;mBAA4B,UAAC,WAAqB,IAAK,OAAA,KAAI,CAAC,sBAAsB,GAAG,WAAW,EAAzC,CAAyC;WAAA;QAJ9F,kBAAkB,CAAC,IAAI,EAAE,EAAE,SAAS,EAAE,MAAM,EAAE,yBAAyB,EAAE,MAAM,EAAE,CAAC,CAAA;IACpF,CAAC;IAIH,6BAAC;AAAD,CAAC,AAVD,IAUC;;AAED,SAAS,eAAe;IACtB,IAAM,MAAM,GAAG,KAAK,aAAL,KAAK,cAAL,KAAK,GAAI,IAAI,sBAAsB,EAAE,CAAA;IACpD,4CAA4C;IAC5C,IAAI,OAAO,MAAM,KAAK,WAAW;QAAE,OAAO,MAAM,CAAA;IAChD,sCAAsC;IACtC,IAAI,CAAC,KAAK;QAAE,KAAK,GAAG,MAAM,CAAA;IAE1B,OAAO,MAAM,CAAA;AACf,CAAC;AAED,MAAM,UAAU,yBAAyB;IACvC,OAAO,OAAO,CAAC,cAAM,OAAA,eAAe,EAAE,EAAjB,CAAiB,EAAE,EAAE,CAAC,CAAA;AAC7C,CAAC","sourcesContent":["import { action, makeAutoObservable, runInAction } from \"mobx\"\nimport { useMemo } from \"react\"\nimport { SwitchableOutputState } from \"./SwitchableOutput.provider\"\n\nlet store: SwitchableOutputsStore\n\nexport interface SwitchableOutputsState {\n groups: { [key: string] : SwitchableOutputState[] }\n // custom group assignments for available switchable outputs sorted by their topic path\n customGroupAssignments: string[]\n}\n\nexport class SwitchableOutputsStore {\n groups: { [key: string] : SwitchableOutputState[] } = {}\n customGroupAssignments: string[] = []\n\n constructor() {\n makeAutoObservable(this, { setGroups: action, setCustomGroupAssignments: action })\n }\n\n setGroups = (groups: { [key: string] : SwitchableOutputState[] }) => this.groups = groups\n setCustomGroupAssignments = (assignments: string[]) => this.customGroupAssignments = assignments\n}\n\nfunction initializeStore() {\n const _store = store ?? new SwitchableOutputsStore()\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 useSwitchableOutputsStore() {\n return useMemo(() => initializeStore(), [])\n}"]}
@@ -18,4 +18,5 @@ export declare const getSwitchingDeviceStateTopics: (portalId: PortalId, instanc
18
18
  instance: string;
19
19
  };
20
20
  export declare function useSwitchingDevice(instanceId: SwitchingDeviceInstanceId): SwitchingDeviceState;
21
+ export declare function useSwitchingDevices(): import("./SwitchingDevices.store").SwitchingDevicesStore;
21
22
  //# sourceMappingURL=SwitchingDevice.provider.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"SwitchingDevice.provider.d.ts","sourceRoot":"/","sources":["src/Modules/SwitchableOutputs/SwitchingDevice.provider.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAA2B,MAAM,SAAS,CAAA;AAEnE,OAAO,EAAE,qBAAqB,EAAE,MAAM,6BAA6B,CAAA;AAEnE,MAAM,MAAM,yBAAyB,GAAG,MAAM,CAAA;AAE9C,MAAM,WAAW,oBAAoB;IACnC,WAAW,EAAE,MAAM,CAAA;IACnB,UAAU,EAAE,MAAM,CAAA;IAClB,QAAQ,EAAE,MAAM,CAAA;IAChB,iBAAiB,EAAE,qBAAqB,EAAE,CAAA;CAC3C;AAED,MAAM,WAAW,qBAAsB,SAAQ,MAAM;IACnD,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAA;CAClB;AAED,eAAO,MAAM,6BAA6B,GAAI,UAAU,QAAQ,EAAE,YAAY,yBAAyB;;;;CAIrG,CAAA;AAEF,wBAAgB,kBAAkB,CAAC,UAAU,EAAE,yBAAyB,GAAG,oBAAoB,CAM9F"}
1
+ {"version":3,"file":"SwitchingDevice.provider.d.ts","sourceRoot":"/","sources":["src/Modules/SwitchableOutputs/SwitchingDevice.provider.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAA2B,MAAM,SAAS,CAAA;AAEnE,OAAO,EAAE,qBAAqB,EAAE,MAAM,6BAA6B,CAAA;AAInE,MAAM,MAAM,yBAAyB,GAAG,MAAM,CAAA;AAE9C,MAAM,WAAW,oBAAoB;IACnC,WAAW,EAAE,MAAM,CAAA;IACnB,UAAU,EAAE,MAAM,CAAA;IAClB,QAAQ,EAAE,MAAM,CAAA;IAChB,iBAAiB,EAAE,qBAAqB,EAAE,CAAA;CAC3C;AAED,MAAM,WAAW,qBAAsB,SAAQ,MAAM;IACnD,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAA;CAClB;AAED,eAAO,MAAM,6BAA6B,GAAI,UAAU,QAAQ,EAAE,YAAY,yBAAyB;;;;CAIrG,CAAA;AAEF,wBAAgB,kBAAkB,CAAC,UAAU,EAAE,yBAAyB,GAAG,oBAAoB,CAM9F;AAED,wBAAgB,mBAAmB,6DAiClC"}
@@ -1,5 +1,8 @@
1
+ import { useEffect, useMemo } from "react";
1
2
  import { useMqtt, useTopicsState } from "../Mqtt";
2
- import { useMemo } from "react";
3
+ import Logger from "../../utils/logger";
4
+ import { useSwitchingDevicesStore } from "./SwitchingDevices.store";
5
+ import { autorun } from "mobx";
3
6
  export var getSwitchingDeviceStateTopics = function (portalId, instanceId) { return ({
4
7
  productName: "N/".concat(portalId, "/switch/").concat(instanceId, "/ProductName"),
5
8
  customName: "N/".concat(portalId, "/switch/").concat(instanceId, "/CustomName"),
@@ -10,4 +13,34 @@ export function useSwitchingDevice(instanceId) {
10
13
  var topics = useMemo(function () { return getSwitchingDeviceStateTopics(portalId, instanceId); }, [portalId, instanceId]);
11
14
  return useTopicsState(topics);
12
15
  }
16
+ export function useSwitchingDevices() {
17
+ var switchingDevicesStore = useSwitchingDevicesStore();
18
+ var getTopics = function (portalId) { return ({
19
+ devices: "N/".concat(portalId, "/switch/+/DeviceInstance"),
20
+ }); };
21
+ var mqtt = useMqtt();
22
+ var topics = useMemo(function () { return getTopics(mqtt.portalId); }, [mqtt.portalId]);
23
+ var messagesForSwitchingDevices = mqtt.messagesByWildcard(topics.devices);
24
+ // Examine MQTT to find all available switching devices
25
+ useEffect(function () {
26
+ if (!messagesForSwitchingDevices || Object.entries(messagesForSwitchingDevices).length === 0) {
27
+ Logger.log("Waiting for switching devices...");
28
+ }
29
+ else {
30
+ var deviceInstances_1 = Object.values(messagesForSwitchingDevices);
31
+ var dispose_1 = autorun(function () {
32
+ var oldDevices = switchingDevicesStore.devices;
33
+ var newDevices = deviceInstances_1.map(function (deviceId) { return mqtt.messagesByTopics(getSwitchingDeviceStateTopics(mqtt.portalId, deviceId)); });
34
+ // TODO: check unordered structural identify of old and new state
35
+ // TODO: to avoid unnecessary re-rendering: O(n^2) baby
36
+ if (!oldDevices || oldDevices.length != newDevices.length || !newDevices.every(function (id) { return deviceInstances_1.includes(id); })) {
37
+ Logger.log("New switching devices instances: ".concat(JSON.stringify(deviceInstances_1)));
38
+ switchingDevicesStore.setDevices(newDevices);
39
+ }
40
+ });
41
+ return function () { return dispose_1(); };
42
+ }
43
+ }, [messagesForSwitchingDevices]);
44
+ return switchingDevicesStore;
45
+ }
13
46
  //# sourceMappingURL=SwitchingDevice.provider.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"SwitchingDevice.provider.js","sourceRoot":"/","sources":["src/Modules/SwitchableOutputs/SwitchingDevice.provider.ts"],"names":[],"mappings":"AAAA,OAAO,EAAoB,OAAO,EAAE,cAAc,EAAE,MAAM,SAAS,CAAA;AACnE,OAAO,EAAE,OAAO,EAAE,MAAM,OAAO,CAAA;AAkB/B,MAAM,CAAC,IAAM,6BAA6B,GAAG,UAAC,QAAkB,EAAE,UAAqC,IAAK,OAAA,CAAC;IAC3G,WAAW,EAAE,YAAK,QAAQ,qBAAW,UAAU,iBAAc;IAC7D,UAAU,EAAE,YAAK,QAAQ,qBAAW,UAAU,gBAAa;IAC3D,QAAQ,EAAE,YAAK,QAAQ,mBAAS,UAAU,oBAAiB;CAC5D,CAAC,EAJ0G,CAI1G,CAAA;AAEF,MAAM,UAAU,kBAAkB,CAAC,UAAqC;IAE9D,IAAA,QAAQ,GAAK,OAAO,EAAE,SAAd,CAAc;IAC9B,IAAM,MAAM,GAAG,OAAO,CAAC,cAAM,OAAA,6BAA6B,CAAC,QAAQ,EAAE,UAAU,CAAC,EAAnD,CAAmD,EAAE,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC,CAAA;IAEzG,OAAO,cAAc,CAAuB,MAAM,CAAC,CAAA;AACrD,CAAC","sourcesContent":["import { PortalId, Topics, useMqtt, useTopicsState } from \"../Mqtt\"\nimport { useMemo } from \"react\"\nimport { SwitchableOutputState } from \"./SwitchableOutput.provider\"\n\nexport type SwitchingDeviceInstanceId = number\n\nexport interface SwitchingDeviceState {\n productName: string\n customName: string\n instance: number\n switchableOutputs: SwitchableOutputState[]\n}\n\nexport interface SwitchingDeviceTopics extends Topics {\n productName?: string\n customName?: string\n instance?: string\n}\n\nexport const getSwitchingDeviceStateTopics = (portalId: PortalId, instanceId: SwitchingDeviceInstanceId) => ({\n productName: `N/${portalId}/switch/${instanceId}/ProductName`,\n customName: `N/${portalId}/switch/${instanceId}/CustomName`,\n instance: `N/${portalId}/tank/${instanceId}/DeviceInstance`,\n})\n\nexport function useSwitchingDevice(instanceId: SwitchingDeviceInstanceId): SwitchingDeviceState {\n\n const { portalId } = useMqtt()\n const topics = useMemo(() => getSwitchingDeviceStateTopics(portalId, instanceId), [portalId, instanceId])\n\n return useTopicsState<SwitchingDeviceState>(topics)\n}\n"]}
1
+ {"version":3,"file":"SwitchingDevice.provider.js","sourceRoot":"/","sources":["src/Modules/SwitchableOutputs/SwitchingDevice.provider.ts"],"names":[],"mappings":"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","sourcesContent":["import { useEffect, useMemo } from \"react\"\nimport { PortalId, Topics, useMqtt, useTopicsState } from \"../Mqtt\"\nimport Logger from \"../../utils/logger\"\nimport { SwitchableOutputState } from \"./SwitchableOutput.provider\"\nimport { useSwitchingDevicesStore } from \"./SwitchingDevices.store\"\nimport { autorun } from \"mobx\"\n\nexport type SwitchingDeviceInstanceId = number\n\nexport interface SwitchingDeviceState {\n productName: string\n customName: string\n instance: number\n switchableOutputs: SwitchableOutputState[]\n}\n\nexport interface SwitchingDeviceTopics extends Topics {\n productName?: string\n customName?: string\n instance?: string\n}\n\nexport const getSwitchingDeviceStateTopics = (portalId: PortalId, instanceId: SwitchingDeviceInstanceId) => ({\n productName: `N/${portalId}/switch/${instanceId}/ProductName`,\n customName: `N/${portalId}/switch/${instanceId}/CustomName`,\n instance: `N/${portalId}/tank/${instanceId}/DeviceInstance`,\n})\n\nexport function useSwitchingDevice(instanceId: SwitchingDeviceInstanceId): SwitchingDeviceState {\n\n const { portalId } = useMqtt()\n const topics = useMemo(() => getSwitchingDeviceStateTopics(portalId, instanceId), [portalId, instanceId])\n\n return useTopicsState<SwitchingDeviceState>(topics)\n}\n\nexport function useSwitchingDevices() {\n const switchingDevicesStore = useSwitchingDevicesStore()\n\n const getTopics = (portalId: PortalId) => ({\n devices: `N/${portalId}/switch/+/DeviceInstance`,\n })\n\n const mqtt = useMqtt()\n const topics = useMemo(() => getTopics(mqtt.portalId), [mqtt.portalId])\n\n const messagesForSwitchingDevices = mqtt.messagesByWildcard(topics.devices)\n\n // Examine MQTT to find all available switching devices\n useEffect(() => {\n if (!messagesForSwitchingDevices || Object.entries(messagesForSwitchingDevices).length === 0) {\n Logger.log(\"Waiting for switching devices...\")\n } else {\n const deviceInstances = Object.values(messagesForSwitchingDevices) as SwitchingDeviceInstanceId[]\n const dispose = autorun(() => {\n const oldDevices = switchingDevicesStore.devices\n const newDevices = deviceInstances.map((deviceId) => mqtt.messagesByTopics(getSwitchingDeviceStateTopics(mqtt.portalId, deviceId))) as unknown as SwitchingDeviceInstanceId[]\n // TODO: check unordered structural identify of old and new state\n // TODO: to avoid unnecessary re-rendering: O(n^2) baby\n if (!oldDevices || oldDevices.length != newDevices.length || !newDevices.every((id) => deviceInstances.includes(id))) {\n Logger.log(`New switching devices instances: ${JSON.stringify(deviceInstances)}`);\n switchingDevicesStore.setDevices(newDevices)\n }\n })\n return () => dispose()\n }\n }, [messagesForSwitchingDevices])\n\n return switchingDevicesStore\n}"]}
@@ -1,11 +1,11 @@
1
- import { SwitchingDeviceState } from "./SwitchingDevice.provider";
1
+ import { SwitchingDeviceInstanceId } from "./SwitchingDevice.provider";
2
2
  export interface SwitchingDevicesState {
3
- devices: SwitchingDeviceState[];
3
+ devices: SwitchingDeviceInstanceId[];
4
4
  }
5
5
  export declare class SwitchingDevicesStore {
6
- devices: SwitchingDeviceState[];
6
+ devices: SwitchingDeviceInstanceId[];
7
7
  constructor();
8
- setDevices: (devices: SwitchingDeviceState[]) => SwitchingDeviceState[];
8
+ setDevices: (devices: SwitchingDeviceInstanceId[]) => number[];
9
9
  }
10
10
  export declare function useSwitchingDevicesStore(): SwitchingDevicesStore;
11
11
  //# sourceMappingURL=SwitchingDevices.store.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"SwitchingDevices.store.d.ts","sourceRoot":"/","sources":["src/Modules/SwitchableOutputs/SwitchingDevices.store.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,oBAAoB,EAAE,MAAM,4BAA4B,CAAA;AAIjE,MAAM,WAAW,qBAAqB;IACpC,OAAO,EAAE,oBAAoB,EAAE,CAAA;CAChC;AAED,qBAAa,qBAAqB;IAChC,OAAO,EAAE,oBAAoB,EAAE,CAAK;;IAMpC,UAAU,GAAI,SAAS,oBAAoB,EAAE,4BAA2B;CACzE;AAYD,wBAAgB,wBAAwB,0BAEvC"}
1
+ {"version":3,"file":"SwitchingDevices.store.d.ts","sourceRoot":"/","sources":["src/Modules/SwitchableOutputs/SwitchingDevices.store.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,yBAAyB,EAAE,MAAM,4BAA4B,CAAA;AAItE,MAAM,WAAW,qBAAqB;IACpC,OAAO,EAAE,yBAAyB,EAAE,CAAA;CACrC;AAED,qBAAa,qBAAqB;IAChC,OAAO,EAAE,yBAAyB,EAAE,CAAK;;IAMzC,UAAU,GAAI,SAAS,yBAAyB,EAAE,cAA2B;CAC9E;AAYD,wBAAgB,wBAAwB,0BAEvC"}
@@ -1 +1 @@
1
- {"version":3,"file":"SwitchingDevices.store.js","sourceRoot":"/","sources":["src/Modules/SwitchableOutputs/SwitchingDevices.store.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,kBAAkB,EAAe,MAAM,MAAM,CAAA;AAC9D,OAAO,EAAE,OAAO,EAAE,MAAM,OAAO,CAAA;AAG/B,IAAI,KAA4B,CAAA;AAMhC;IAGE;QAAA,iBAEC;QAJD;;;;mBAAkC,EAAE;WAAA;QAMpC;;;;mBAAa,UAAC,OAA+B,IAAK,OAAA,KAAI,CAAC,OAAO,GAAG,OAAO,EAAtB,CAAsB;WAAA;QAHtE,kBAAkB,CAAC,IAAI,EAAE,EAAE,UAAU,EAAE,MAAM,EAAE,CAAC,CAAA;IAClD,CAAC;IAGH,4BAAC;AAAD,CAAC,AARD,IAQC;;AAED,SAAS,eAAe;IACtB,IAAM,MAAM,GAAG,KAAK,aAAL,KAAK,cAAL,KAAK,GAAI,IAAI,qBAAqB,EAAE,CAAA;IACnD,4CAA4C;IAC5C,IAAI,OAAO,MAAM,KAAK,WAAW;QAAE,OAAO,MAAM,CAAA;IAChD,sCAAsC;IACtC,IAAI,CAAC,KAAK;QAAE,KAAK,GAAG,MAAM,CAAA;IAE1B,OAAO,MAAM,CAAA;AACf,CAAC;AAED,MAAM,UAAU,wBAAwB;IACtC,OAAO,OAAO,CAAC,cAAM,OAAA,eAAe,EAAE,EAAjB,CAAiB,EAAE,EAAE,CAAC,CAAA;AAC7C,CAAC","sourcesContent":["import { action, makeAutoObservable, runInAction } from \"mobx\"\nimport { useMemo } from \"react\"\nimport { SwitchingDeviceState } from \"./SwitchingDevice.provider\"\n\nlet store: SwitchingDevicesStore\n\nexport interface SwitchingDevicesState {\n devices: SwitchingDeviceState[]\n}\n\nexport class SwitchingDevicesStore {\n devices: SwitchingDeviceState[] = []\n\n constructor() {\n makeAutoObservable(this, { setDevices: action })\n }\n\n setDevices = (devices: SwitchingDeviceState[]) => this.devices = devices\n}\n\nfunction initializeStore() {\n const _store = store ?? new SwitchingDevicesStore()\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 useSwitchingDevicesStore() {\n return useMemo(() => initializeStore(), [])\n}"]}
1
+ {"version":3,"file":"SwitchingDevices.store.js","sourceRoot":"/","sources":["src/Modules/SwitchableOutputs/SwitchingDevices.store.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,kBAAkB,EAAE,MAAM,MAAM,CAAA;AACjD,OAAO,EAAE,OAAO,EAAE,MAAM,OAAO,CAAA;AAG/B,IAAI,KAA4B,CAAA;AAMhC;IAGE;QAAA,iBAEC;QAJD;;;;mBAAuC,EAAE;WAAA;QAMzC;;;;mBAAa,UAAC,OAAoC,IAAK,OAAA,KAAI,CAAC,OAAO,GAAG,OAAO,EAAtB,CAAsB;WAAA;QAH3E,kBAAkB,CAAC,IAAI,EAAE,EAAE,UAAU,EAAE,MAAM,EAAE,CAAC,CAAA;IAClD,CAAC;IAGH,4BAAC;AAAD,CAAC,AARD,IAQC;;AAED,SAAS,eAAe;IACtB,IAAM,MAAM,GAAG,KAAK,aAAL,KAAK,cAAL,KAAK,GAAI,IAAI,qBAAqB,EAAE,CAAA;IACnD,4CAA4C;IAC5C,IAAI,OAAO,MAAM,KAAK,WAAW;QAAE,OAAO,MAAM,CAAA;IAChD,sCAAsC;IACtC,IAAI,CAAC,KAAK;QAAE,KAAK,GAAG,MAAM,CAAA;IAE1B,OAAO,MAAM,CAAA;AACf,CAAC;AAED,MAAM,UAAU,wBAAwB;IACtC,OAAO,OAAO,CAAC,cAAM,OAAA,eAAe,EAAE,EAAjB,CAAiB,EAAE,EAAE,CAAC,CAAA;AAC7C,CAAC","sourcesContent":["import { action, makeAutoObservable } from \"mobx\"\nimport { useMemo } from \"react\"\nimport { SwitchingDeviceInstanceId } from \"./SwitchingDevice.provider\"\n\nlet store: SwitchingDevicesStore\n\nexport interface SwitchingDevicesState {\n devices: SwitchingDeviceInstanceId[]\n}\n\nexport class SwitchingDevicesStore {\n devices: SwitchingDeviceInstanceId[] = []\n\n constructor() {\n makeAutoObservable(this, { setDevices: action })\n }\n\n setDevices = (devices: SwitchingDeviceInstanceId[]) => this.devices = devices\n}\n\nfunction initializeStore() {\n const _store = store ?? new SwitchingDevicesStore()\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 useSwitchingDevicesStore() {\n return useMemo(() => initializeStore(), [])\n}"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@victronenergy/mfd-modules",
3
- "version": "9.3.0",
3
+ "version": "9.4.0",
4
4
  "description": "",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",