@victronenergy/mfd-modules 11.0.0 → 11.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (28) hide show
  1. package/dist/src/Modules/Mqtt/Mqtt.store.d.ts +2 -0
  2. package/dist/src/Modules/Mqtt/Mqtt.store.d.ts.map +1 -1
  3. package/dist/src/Modules/Mqtt/Mqtt.store.js +21 -2
  4. package/dist/src/Modules/Mqtt/Mqtt.store.js.map +1 -1
  5. package/dist/src/Modules/ShorePowerInput/ShorePowerInput.provider.d.ts +1 -0
  6. package/dist/src/Modules/ShorePowerInput/ShorePowerInput.provider.d.ts.map +1 -1
  7. package/dist/src/Modules/ShorePowerInput/ShorePowerInput.provider.js +1 -1
  8. package/dist/src/Modules/ShorePowerInput/ShorePowerInput.provider.js.map +1 -1
  9. package/dist/src/Modules/SwitchingPane/SwitchableOutput.provider.d.ts +4 -1
  10. package/dist/src/Modules/SwitchingPane/SwitchableOutput.provider.d.ts.map +1 -1
  11. package/dist/src/Modules/SwitchingPane/SwitchableOutput.provider.js +1 -0
  12. package/dist/src/Modules/SwitchingPane/SwitchableOutput.provider.js.map +1 -1
  13. package/dist/src/Modules/SwitchingPane/SwitchingPane.provider.d.ts +14 -0
  14. package/dist/src/Modules/SwitchingPane/SwitchingPane.provider.d.ts.map +1 -1
  15. package/dist/src/Modules/SwitchingPane/SwitchingPane.provider.js +50 -14
  16. package/dist/src/Modules/SwitchingPane/SwitchingPane.provider.js.map +1 -1
  17. package/dist/src/Modules/SwitchingPane/SwitchingPane.store.d.ts +3 -0
  18. package/dist/src/Modules/SwitchingPane/SwitchingPane.store.d.ts.map +1 -1
  19. package/dist/src/Modules/SwitchingPane/SwitchingPane.store.js +13 -0
  20. package/dist/src/Modules/SwitchingPane/SwitchingPane.store.js.map +1 -1
  21. package/dist/src/utils/constants.d.ts +4 -0
  22. package/dist/src/utils/constants.d.ts.map +1 -1
  23. package/dist/src/utils/constants.js +4 -0
  24. package/dist/src/utils/constants.js.map +1 -1
  25. package/dist/src/utils/logger.d.ts.map +1 -1
  26. package/dist/src/utils/logger.js +2 -1
  27. package/dist/src/utils/logger.js.map +1 -1
  28. package/package.json +10 -4
@@ -13,6 +13,7 @@ export declare class MqttStore {
13
13
  queueWorker: ReturnType<typeof setTimeout> | undefined;
14
14
  meanQueueWorkerPassDuration: number;
15
15
  urgentTopicPrefixes: string[];
16
+ initialLoadComplete: boolean;
16
17
  /**
17
18
  * Returns the current cached message for a given MQTT topic.
18
19
  *
@@ -79,6 +80,7 @@ export declare class MqttStore {
79
80
  addMessage: (topic: string, message: {
80
81
  value: string | undefined;
81
82
  }) => void;
83
+ completeInitialLoad: () => void;
82
84
  addMessagesFromQueue: () => void;
83
85
  scheduleNextQueueWorkerPass: (timeout: number) => void;
84
86
  setupQueueWorker: () => void;
@@ -1 +1 @@
1
- {"version":3,"file":"Mqtt.store.d.ts","sourceRoot":"/","sources":["src/Modules/Mqtt/Mqtt.store.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,qBAAqB,EAAE,UAAU,EAAE,MAAM,MAAM,CAAA;AACxD,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,QAAQ,EAAU,MAAM,EAAE,MAAM,SAAS,CAAA;AAQ7E,qBAAa,SAAS;IACpB,MAAM,CAAC,EAAE,UAAU,GAAG,IAAI,CAAA;IAC1B,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,GAAG,OAAO,CAAA;IAC/B,MAAM,EAAE,MAAM,CAAoB;IAClC,QAAQ,EAAE,YAAY,CAAK;IAC3B,YAAY,EAAE,YAAY,CAAK;IAC/B,gBAAgB,EAAE,GAAG,CAAC,MAAM,CAAC,CAAoB;IACjD,QAAQ,EAAE,QAAQ,CAAA;IAClB,QAAQ,EAAE,MAAM,CAA0C;IAC1D,mBAAmB,EAAE,UAAU,CAAC,OAAO,WAAW,CAAC,GAAG,SAAS,CAAA;IAC/D,WAAW,EAAE,UAAU,CAAC,OAAO,UAAU,CAAC,GAAG,SAAS,CAAA;IACtD,2BAA2B,EAAE,MAAM,CAAI;IACvC,mBAAmB,EAAE,MAAM,EAAE,CAAK;IAElC;;;;;;;;;;;;;;;;OAgBG;IACH,gBAAgB,WACL,MAAM,iBAMhB;IAED;;;;;;;;;;;;;;;;;;UAkBM;IACN,gBAAgB,YACJ,MAAM;;MAsBjB;IAED;;;;;;;;;;;;;;;;;OAiBG;IACH,kBAAkB,cACJ,MAAM,SAsBnB;;IAmBD,IAAI,WAAW,YAEd;IAED,gBAAgB,GAAI,QAAQ,MAAM,UAqBjC;IAED,qBAAqB;IAQrB,UAAU,GAAI,OAAO,MAAM,EAAE,SAAS;QAAE,KAAK,EAAE,MAAM,GAAG,SAAS,CAAA;KAAE,UAUlE;IAED,oBAAoB,aAOnB;IAED,2BAA2B,GAAI,SAAS,MAAM,UAW7C;IAED,gBAAgB,aAKf;IAED,iBAAiB,aAKhB;IAED,WAAW,GAAI,UAAU,MAAM,UAO9B;IAED,SAAS,CAAC,MAAM,EAAE,MAAM;IAIxB,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,GAAG,OAAO;IAIvC,IAAI,GACF,UAAU,MAAM,EAChB,MAAM,MAAM,YAAc,EAC1B,MAAM,MAAM,GAAG,IAAI,EACnB,OAAM,MAAyB,EAC/B,SAAQ,OAAe,EACvB,WAAW,MAAM,UAmGlB;IAED,oBAAoB,aA4BnB;IAED,uBAAuB,aAQtB;IAED,iBAAiB,aAOhB;IAED,mBAAmB,aAMlB;IAED,mBAAmB,aAMlB;IAED,OAAO,GAAI,OAAO,MAAM,EAAE,MAAM,MAAM,GAAG,MAAM,GAAG;QAAE,GAAG,EAAE,MAAM,CAAA;KAAE,EAAE,UAAU,qBAAqB,UAWjG;CACF;AA2BD,wBAAgB,OAAO,cAEtB"}
1
+ {"version":3,"file":"Mqtt.store.d.ts","sourceRoot":"/","sources":["src/Modules/Mqtt/Mqtt.store.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,qBAAqB,EAAE,UAAU,EAAE,MAAM,MAAM,CAAA;AACxD,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,QAAQ,EAAU,MAAM,EAAE,MAAM,SAAS,CAAA;AAQ7E,qBAAa,SAAS;IACpB,MAAM,CAAC,EAAE,UAAU,GAAG,IAAI,CAAA;IAC1B,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,GAAG,OAAO,CAAA;IAC/B,MAAM,EAAE,MAAM,CAAoB;IAClC,QAAQ,EAAE,YAAY,CAAK;IAC3B,YAAY,EAAE,YAAY,CAAK;IAC/B,gBAAgB,EAAE,GAAG,CAAC,MAAM,CAAC,CAAoB;IACjD,QAAQ,EAAE,QAAQ,CAAA;IAClB,QAAQ,EAAE,MAAM,CAA0C;IAC1D,mBAAmB,EAAE,UAAU,CAAC,OAAO,WAAW,CAAC,GAAG,SAAS,CAAA;IAC/D,WAAW,EAAE,UAAU,CAAC,OAAO,UAAU,CAAC,GAAG,SAAS,CAAA;IACtD,2BAA2B,EAAE,MAAM,CAAI;IACvC,mBAAmB,EAAE,MAAM,EAAE,CAAK;IAClC,mBAAmB,EAAE,OAAO,CAAQ;IAEpC;;;;;;;;;;;;;;;;OAgBG;IACH,gBAAgB,WACL,MAAM,iBAMhB;IAED;;;;;;;;;;;;;;;;;;UAkBM;IACN,gBAAgB,YACJ,MAAM;;MAsBjB;IAED;;;;;;;;;;;;;;;;;OAiBG;IACH,kBAAkB,cACJ,MAAM,SAsBnB;;IAqBD,IAAI,WAAW,YAEd;IAED,gBAAgB,GAAI,QAAQ,MAAM,UAqBjC;IAED,qBAAqB;IASrB,UAAU,GAAI,OAAO,MAAM,EAAE,SAAS;QAAE,KAAK,EAAE,MAAM,GAAG,SAAS,CAAA;KAAE,UAUlE;IAED,mBAAmB,aAGlB;IAED,oBAAoB,aAOnB;IAED,2BAA2B,GAAI,SAAS,MAAM,UAW7C;IAED,gBAAgB,aAKf;IAED,iBAAiB,aAKhB;IAED,WAAW,GAAI,UAAU,MAAM,UAO9B;IAED,SAAS,CAAC,MAAM,EAAE,MAAM;IAIxB,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,GAAG,OAAO;IAIvC,IAAI,GACF,UAAU,MAAM,EAChB,MAAM,MAAM,YAAc,EAC1B,MAAM,MAAM,GAAG,IAAI,EACnB,OAAM,MAAyB,EAC/B,SAAQ,OAAe,EACvB,WAAW,MAAM,UAoGlB;IAED,oBAAoB,aA4BnB;IAED,uBAAuB,aAQtB;IAED,iBAAiB,aAOhB;IAED,mBAAmB,aAMlB;IAED,mBAAmB,aAMlB;IAED,OAAO,GAAI,OAAO,MAAM,EAAE,MAAM,MAAM,GAAG,MAAM,GAAG;QAAE,GAAG,EAAE,MAAM,CAAA;KAAE,EAAE,UAAU,qBAAqB,UAWjG;CACF;AA2BD,wBAAgB,OAAO,cAEtB"}
@@ -81,6 +81,12 @@ export class MqttStore {
81
81
  writable: true,
82
82
  value: []
83
83
  });
84
+ Object.defineProperty(this, "initialLoadComplete", {
85
+ enumerable: true,
86
+ configurable: true,
87
+ writable: true,
88
+ value: false
89
+ });
84
90
  /**
85
91
  * Returns the current cached message for a given MQTT topic.
86
92
  *
@@ -224,7 +230,7 @@ export class MqttStore {
224
230
  writable: true,
225
231
  value: (topic, message) => {
226
232
  // Logger.log(`DEBUG: addMessage: topic: ${topic}, urgentPrefixes: ${JSON.stringify(this.urgentTopicPrefixes)}`)
227
- if (this.urgentTopicPrefixes.some((prefix) => topic.startsWith(prefix))) {
233
+ if (this.initialLoadComplete && this.urgentTopicPrefixes.some((prefix) => topic.startsWith(prefix))) {
228
234
  // NOTE: If topic starts with one of the urgent prefixes, deliver it immediately
229
235
  this.messages[topic] = message.value;
230
236
  }
@@ -235,6 +241,15 @@ export class MqttStore {
235
241
  }
236
242
  }
237
243
  });
244
+ Object.defineProperty(this, "completeInitialLoad", {
245
+ enumerable: true,
246
+ configurable: true,
247
+ writable: true,
248
+ value: () => {
249
+ this.addMessagesFromQueue();
250
+ this.initialLoadComplete = true;
251
+ }
252
+ });
238
253
  Object.defineProperty(this, "addMessagesFromQueue", {
239
254
  enumerable: true,
240
255
  configurable: true,
@@ -312,6 +327,7 @@ export class MqttStore {
312
327
  this.portalId = undefined;
313
328
  this.topicsSubscribed = new Set();
314
329
  this.urgentTopicPrefixes = [];
330
+ this.initialLoadComplete = false;
315
331
  }
316
332
  let url;
317
333
  if (remote) {
@@ -378,7 +394,7 @@ export class MqttStore {
378
394
  const uniqueId = getMessageJson(message)["full-publish-completed-echo"] || "";
379
395
  Logger.log(`Received full_publish_completed for ${this.portalId} with full-publish-completed-echo: '${uniqueId}'`);
380
396
  if (uniqueId === this.uniqueId) {
381
- this.addMessagesFromQueue();
397
+ this.completeInitialLoad();
382
398
  this.setupQueueWorker();
383
399
  }
384
400
  }
@@ -489,6 +505,8 @@ export class MqttStore {
489
505
  makeAutoObservable(this, {
490
506
  messageQueue: false,
491
507
  urgentTopicPrefixes: false,
508
+ initialLoadComplete: false,
509
+ completeInitialLoad: false,
492
510
  setupKeepaliveTimer: false,
493
511
  clearKeepaliveTimer: false,
494
512
  sendFullKeepalive: false,
@@ -507,6 +525,7 @@ export class MqttStore {
507
525
  clearSubscribedTopics() {
508
526
  this.topicsSubscribed.clear();
509
527
  this.urgentTopicPrefixes = [];
528
+ this.initialLoadComplete = false;
510
529
  runInAction(() => {
511
530
  this.portalId = undefined;
512
531
  });
@@ -1 +1 @@
1
- {"version":3,"file":"Mqtt.store.js","sourceRoot":"/","sources":["src/Modules/Mqtt/Mqtt.store.ts"],"names":[],"mappings":"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","sourcesContent":["import { comparer, makeAutoObservable, runInAction } from \"mobx\"\nimport { computedFn } from \"mobx-utils\"\nimport * as mqtt from \"mqtt\"\nimport { IClientPublishOptions, MqttClient } from \"mqtt\"\nimport { MqttMessage, MqttMessages, PortalId, STATUS, Topics } from \"../Mqtt\"\nimport Logger from \"../../utils/logger\"\nimport { getMessageJson } from \"../../utils/util\"\nimport { useMemo } from \"react\"\nimport { assign } from \"lodash-es\"\n\nlet store: MqttStore\n\nexport class MqttStore {\n client?: MqttClient | null\n error?: object | null | boolean\n status: string = STATUS.CONNECTING\n messages: MqttMessages = {}\n messageQueue: MqttMessages = {}\n topicsSubscribed: Set<string> = new Set<string>()\n portalId: PortalId\n uniqueId: string = Math.random().toString(16).substr(2, 8)\n keepAliveHandlerRef: ReturnType<typeof setInterval> | undefined\n queueWorker: ReturnType<typeof setTimeout> | undefined\n meanQueueWorkerPassDuration: number = 0\n urgentTopicPrefixes: string[] = []\n\n /**\n * Returns the current cached message for a given MQTT topic.\n *\n * React Components using this method will re-render when their specific\n * topic's message changes.\n *\n * Using comparer.identity will trigger the re-renders any time\n * a message arrives for the given topic. We rely on the fact\n * that MQTT will only re-send a message when the value changes,\n * or on a full keep alive.\n *\n * Note: Receiving the same message for a given topic will cause re-renders,\n * as we do not check structural identity of the message.\n *\n * @param topic - The MQTT topic to retrieve the message for\n * @returns The message object for the topic, or undefined if topic is not provided or not found\n */\n messageFromTopic = computedFn(\n (topic?: string) => {\n // Logger.log(`DEBUG: messageFromTopic: ${JSON.stringify(topic)}`)\n // trace()\n return topic ? this.messages[topic] : undefined\n },\n { name: \"Mqtt.store.messageFromTopic\", equals: comparer.identity }\n )\n\n /**\n * Returns the current cached messages for a given set of MQTT topics.\n *\n * This is a memoized computed function - each set of topics has its own cached value.\n *\n * React Components using this method will re-render when\n * any of the messages for specified topics change.\n *\n * Using comparer.identity will trigger the re-renders any time\n * a message arrives for any of the specified topics. We rely on the fact\n * that MQTT will only re-send a message when the value changes,\n * or on a full keep alive.\n\n * Note: Receiving the same message for a given topic will cause re-renders,\n * as we do not check structural identity of the message.\n *\n * @param topics - The MQTT topics to retrieve the messages for\n * @returns The messages objects for the given topics, or empty dictionary if topics not found\n */\n messagesByTopics = computedFn(\n (topics?: Topics) => {\n // Logger.log(`DEBUG: messagesByTopics: ${JSON.stringify(topics)}`)\n // trace()\n if (!topics) {\n return {}\n }\n\n const result: { [key: string]: MqttMessage | MqttMessage[] } = {}\n\n Object.entries(topics).forEach(([label, topic]) => {\n if (Array.isArray(topic)) {\n result[label] = topic.map((t) => this.messageFromTopic(t))\n } else if (topic === undefined) {\n result[label] = undefined\n } else {\n result[label] = this.messageFromTopic(topic)\n }\n })\n\n return result\n },\n { name: \"Mqtt.store.messagesByTopics\", equals: comparer.identity }\n )\n\n /**\n * Returns the current cached messages for MQTT topics specified via regex.\n *\n * React Components using this method will re-render when\n * values of any of the matched topics change. The components also re-render\n * when new MQTT topics are received and match needs to be checked.\n *\n * Using comparer.identity will trigger the re-renders any time\n * a message arrives for any of the matched topics. We rely on the fact\n * that MQTT will only re-send a message when the value changes,\n * or on a full keep alive.\n *\n * Note: Receiving the same message for a given topic will cause re-renders,\n * as we do not check structural identity of the message.\n *\n * @param wildcard - The MQTT wildcard to retrieve the message for\n * @returns The messages objects for the given topics, or empty dictionary if topics not found\n */\n messagesByWildcard = computedFn(\n (wildcard?: string) => {\n // Logger.log(`DEBUG: messagesByWildcard: ${JSON.stringify(wildcard)}`)\n // trace()\n if (wildcard === undefined || wildcard === \"\" || wildcard === null) return {}\n\n const topicRegex = new RegExp(wildcard.replace(/\\+/g, \"\\\\w*\")) // + in mqtt is anything -> .*\n\n return Object.fromEntries(\n Object.keys(this.messages)\n .filter((topic) => topic.match(topicRegex))\n .map((topic) => [topic, this.messages[topic]])\n // Filter out empty results\n .filter(\n ([_key, message]) =>\n message !== undefined &&\n message !== null &&\n (!Array.isArray(message) ||\n (message.length !== 0 && !message.every((v) => v === undefined || v === null)))\n )\n )\n },\n { name: \"Mqtt.store.messagesByWildcard\", equals: comparer.identity }\n )\n\n constructor() {\n makeAutoObservable(this, {\n messageQueue: false,\n urgentTopicPrefixes: false,\n setupKeepaliveTimer: false,\n clearKeepaliveTimer: false,\n sendFullKeepalive: false,\n sendSuppressedKeepalive: false,\n setupQueueWorker: false,\n removeQueueWorker: false,\n scheduleNextQueueWorkerPass: false,\n subscribeToTopic: false,\n subscribeToAllTopics: false,\n clearSubscribedTopics: false,\n })\n }\n\n get isConnected() {\n return this.status === STATUS.CONNECTED\n }\n\n subscribeToTopic = (topic?: string) => {\n if (!topic) return\n if (topic.includes(\"undefined\")) return\n\n if (!this.topicsSubscribed.has(topic)) {\n Logger.log(`Subscribing to ${topic}`)\n this.client?.subscribe(topic, (err, granted) => {\n if (err) {\n Logger.error(err)\n return\n }\n\n if (granted !== undefined && granted[0]) {\n Logger.log(`Subscribed to ${granted[0].topic} with Qos ${granted[0].qos}`)\n } else {\n Logger.log(`Subscribed to ${topic} with Qos unknown`)\n }\n })\n\n this.topicsSubscribed.add(topic)\n }\n }\n\n clearSubscribedTopics() {\n this.topicsSubscribed.clear()\n this.urgentTopicPrefixes = []\n runInAction(() => {\n this.portalId = undefined\n })\n }\n\n addMessage = (topic: string, message: { value: string | undefined }) => {\n // Logger.log(`DEBUG: addMessage: topic: ${topic}, urgentPrefixes: ${JSON.stringify(this.urgentTopicPrefixes)}`)\n if (this.urgentTopicPrefixes.some((prefix) => topic.startsWith(prefix))) {\n // NOTE: If topic starts with one of the urgent prefixes, deliver it immediately\n this.messages[topic] = message.value\n } else {\n // NOTE: Otherwise store message to the queue, and move messages from the queue\n // NOTE: to the React components that are MobX observers periodically and in batches\n this.messageQueue[topic] = message.value\n }\n }\n\n addMessagesFromQueue = () => {\n if (Object.values(this.messageQueue).length > 0) {\n // Logger.log(`DEBUG: addMessagesFromQueue: in queue: ${JSON.stringify(Object.values(this.messageQueue).length)}`)\n assign(this.messages, this.messageQueue)\n // Logger.log(`DEBUG: addMessagesFromQueue: to process: ${JSON.stringify(Object.values(this.messages).length)}`)\n this.messageQueue = {}\n }\n }\n\n scheduleNextQueueWorkerPass = (timeout: number) => {\n this.queueWorker = setTimeout(() => {\n const started = performance.now()\n this.addMessagesFromQueue()\n const ended = performance.now()\n this.meanQueueWorkerPassDuration = addToMean(this.meanQueueWorkerPassDuration, 10, ended - started)\n // Schedule next update after 1 - 3 seconds\n // depending on how fast we were able to process the incoming messages\n const newTimeout = Math.max(1000, Math.min(this.meanQueueWorkerPassDuration * 50, 3000))\n this.scheduleNextQueueWorkerPass(newTimeout)\n }, timeout)\n }\n\n setupQueueWorker = () => {\n this.removeQueueWorker()\n\n this.meanQueueWorkerPassDuration = 20 // ms\n this.scheduleNextQueueWorkerPass(1000) // ms\n }\n\n removeQueueWorker = () => {\n if (this.queueWorker) {\n clearTimeout(this.queueWorker)\n }\n this.queueWorker = undefined\n }\n\n setPortalId = (portalId: string) => {\n this.portalId = portalId\n this.urgentTopicPrefixes = [\n `N/${portalId}/switch/`,\n `N/${portalId}/system/0/SwitchableOutput`,\n `N/${portalId}/system/0/GenericInput`,\n ]\n }\n\n setStatus(status: string) {\n this.status = status\n }\n\n setError(error: object | null | boolean) {\n this.error = error\n }\n\n boot = (\n protocol: string,\n host: string = \"localhost\",\n port: number | null,\n path: string = \"websocket-mqtt\",\n remote: boolean = false,\n portalId?: string\n ) => {\n Logger.log(\"MQTT booting\")\n\n let client = this.client\n\n if (client) {\n client.end(true)\n this.client = undefined\n this.portalId = undefined\n this.topicsSubscribed = new Set<string>()\n this.urgentTopicPrefixes = []\n }\n\n let url\n if (remote) {\n if (!host) {\n return\n }\n // remote connection to VRM broker always uses MQTTS over 443\n url = `mqtts://${host}:443`\n } else {\n // local connection derives websocket protocol from web app protocol\n const wsproto = protocol === \"https:\" ? \"wss:\" : \"ws:\"\n if (port) {\n url = `${wsproto}//${host}:${port}/${path}`\n } else {\n url = `${wsproto}//${host}/${path}`\n }\n }\n\n Logger.log(`MQTT connecting to ${url}`)\n client = mqtt.connect(url, { resubscribe: false })\n\n this.client = client\n this.portalId = portalId\n\n client.on(\"error\", (error) => {\n Logger.log(\"MQTT error\")\n runInAction(() => {\n this.setError(error)\n this.setStatus(STATUS.DISCONNECTED)\n })\n this.removeQueueWorker()\n this.clearKeepaliveTimer()\n this.clearSubscribedTopics()\n })\n\n client.on(\"offline\", () => {\n Logger.log(\"MQTT offline\")\n runInAction(() => {\n this.setError(true)\n this.setStatus(STATUS.OFFLINE)\n })\n this.removeQueueWorker()\n this.clearKeepaliveTimer()\n this.clearSubscribedTopics()\n })\n\n client.on(\"connect\", () => {\n Logger.log(\"MQTT connected\")\n runInAction(() => {\n this.setError(null)\n this.setStatus(STATUS.CONNECTED)\n // Never use wildcard when connecting remotely\n this.subscribeToTopic(`N/${remote ? portalId : \"+\"}/system/0/Serial`)\n this.setupKeepaliveTimer()\n })\n })\n\n client.on(\"message\", (topic, message) => {\n // Logger.log(`DEBUG: Message received: ${topic} - ${message.toString()}`)\n\n if (topic.endsWith(\"/system/0/Serial\") && !this.portalId) {\n const portalId = getMessageJson(message).value\n\n if (this.portalId !== portalId && portalId !== undefined) {\n this.setPortalId(portalId)\n }\n\n runInAction(() => this.subscribeToAllTopics())\n }\n if (topic.endsWith(\"full_publish_completed\")) {\n const uniqueId = getMessageJson(message)[\"full-publish-completed-echo\"] || \"\"\n Logger.log(\n `Received full_publish_completed for ${this.portalId} with full-publish-completed-echo: '${uniqueId}'`\n )\n if (uniqueId === this.uniqueId) {\n this.addMessagesFromQueue()\n this.setupQueueWorker()\n }\n }\n\n if (message.toString() !== \"\") {\n this.addMessage(topic, getMessageJson(message))\n }\n })\n\n Logger.log(\"MQTT booted\")\n }\n\n subscribeToAllTopics = () => {\n const topics = [\n `N/${this.portalId}/settings/#`,\n `N/${this.portalId}/system/#`,\n `N/${this.portalId}/vebus/#`,\n `N/${this.portalId}/alternator/#`,\n `N/${this.portalId}/battery/#`,\n `N/${this.portalId}/charger/#`,\n `N/${this.portalId}/dcsource/#`,\n `N/${this.portalId}/generator/#`,\n `N/${this.portalId}/genset/#`,\n `N/${this.portalId}/dcgenset/#`,\n `N/${this.portalId}/inverter/#`,\n `N/${this.portalId}/tank/#`,\n `N/${this.portalId}/temperature/#`,\n `N/${this.portalId}/switch/#`,\n `N/${this.portalId}/full_publish_completed`,\n ]\n\n this.client?.subscribe(topics, (err) => {\n if (err) {\n Logger.error(err)\n return\n }\n\n // When we received all topics we send a full keepalive.\n this.sendFullKeepalive()\n })\n }\n\n sendSuppressedKeepalive = () => {\n if (this.portalId) {\n const options = JSON.stringify({ \"keepalive-options\": [\"suppress-republish\"] })\n const topic = `R/${this.portalId}/keepalive`\n\n Logger.log(`Sending keepalive for ${this.portalId} with ${options}`)\n this.client?.publish(topic, options)\n }\n }\n\n sendFullKeepalive = () => {\n if (this.portalId) {\n const topic = `R/${this.portalId}/keepalive`\n\n Logger.log(`Sending first keepalive for ${this.portalId} with full-publish-completed-echo: '${this.uniqueId}'`)\n this.client?.publish(topic, `{ \"keepalive-options\" : [ {\"full-publish-completed-echo\": \"${this.uniqueId}\" } ] }`)\n }\n }\n\n setupKeepaliveTimer = () => {\n this.clearKeepaliveTimer()\n\n this.keepAliveHandlerRef = setInterval(this.sendSuppressedKeepalive, 30000)\n\n this.sendFullKeepalive()\n }\n\n clearKeepaliveTimer = () => {\n const ref = this.keepAliveHandlerRef\n if (ref) {\n clearInterval(ref)\n }\n this.keepAliveHandlerRef = undefined\n }\n\n publish = (topic: string, data: string | number | { raw: string }, options?: IClientPublishOptions) => {\n if (this.status !== STATUS.CONNECTED || !this.client) {\n Logger.log(\"Could not publish value, not connected to MQTT broker\")\n return\n }\n const message =\n typeof data === \"object\" && data !== null && \"raw\" in data ? data.raw : JSON.stringify({ value: data })\n\n Logger.log(`Publishing to ${topic}: ${message}`)\n\n this.client?.publish(topic, message, options ?? {})\n }\n}\n\n/**\n * Compute mean by providing existing mean, number of samples, and new sample.\n *\n * @param {number} mean current mean\n * @param {number} n number of sampled values\n * @param {number} newValue the sample\n * @returns {number} the new mean\n *\n * @example\n * addToMean(14, 5, 53); // => 20.5\n */\nfunction addToMean(mean: number, n: number, newValue: number): number {\n return mean + (newValue - mean) / (n + 1)\n}\n\nfunction initializeStore() {\n const _store = store ?? new MqttStore()\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 useMqtt() {\n return useMemo(() => initializeStore(), [])\n}\n"]}
1
+ {"version":3,"file":"Mqtt.store.js","sourceRoot":"/","sources":["src/Modules/Mqtt/Mqtt.store.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,kBAAkB,EAAE,WAAW,EAAE,MAAM,MAAM,CAAA;AAChE,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAA;AACvC,OAAO,KAAK,IAAI,MAAM,MAAM,CAAA;AAE5B,OAAO,EAAuC,MAAM,EAAU,MAAM,SAAS,CAAA;AAC7E,OAAO,MAAM,MAAM,oBAAoB,CAAA;AACvC,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAA;AACjD,OAAO,EAAE,OAAO,EAAE,MAAM,OAAO,CAAA;AAC/B,OAAO,EAAE,MAAM,EAAE,MAAM,WAAW,CAAA;AAElC,IAAI,KAAgB,CAAA;AAEpB,MAAM,OAAO,SAAS;IAgIpB;QA/HA;;;;;WAA0B;QAC1B;;;;;WAA+B;QAC/B;;;;mBAAiB,MAAM,CAAC,UAAU;WAAA;QAClC;;;;mBAAyB,EAAE;WAAA;QAC3B;;;;mBAA6B,EAAE;WAAA;QAC/B;;;;mBAAgC,IAAI,GAAG,EAAU;WAAA;QACjD;;;;;WAAkB;QAClB;;;;mBAAmB,IAAI,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC;WAAA;QAC1D;;;;;WAA+D;QAC/D;;;;;WAAsD;QACtD;;;;mBAAsC,CAAC;WAAA;QACvC;;;;mBAAgC,EAAE;WAAA;QAClC;;;;mBAA+B,KAAK;WAAA;QAEpC;;;;;;;;;;;;;;;;WAgBG;QACH;;;;mBAAmB,UAAU,CAC3B,CAAC,KAAc,EAAE,EAAE;gBACjB,kEAAkE;gBAClE,UAAU;gBACV,OAAO,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,SAAS,CAAA;YACjD,CAAC,EACD,EAAE,IAAI,EAAE,6BAA6B,EAAE,MAAM,EAAE,QAAQ,CAAC,QAAQ,EAAE,CACnE;WAAA;QAED;;;;;;;;;;;;;;;;;;cAkBM;QACN;;;;mBAAmB,UAAU,CAC3B,CAAC,MAAe,EAAE,EAAE;gBAClB,mEAAmE;gBACnE,UAAU;gBACV,IAAI,CAAC,MAAM,EAAE,CAAC;oBACZ,OAAO,EAAE,CAAA;gBACX,CAAC;gBAED,MAAM,MAAM,GAAmD,EAAE,CAAA;gBAEjE,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,EAAE,KAAK,CAAC,EAAE,EAAE;oBAChD,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;wBACzB,MAAM,CAAC,KAAK,CAAC,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC,CAAA;oBAC5D,CAAC;yBAAM,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;wBAC/B,MAAM,CAAC,KAAK,CAAC,GAAG,SAAS,CAAA;oBAC3B,CAAC;yBAAM,CAAC;wBACN,MAAM,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,gBAAgB,CAAC,KAAK,CAAC,CAAA;oBAC9C,CAAC;gBACH,CAAC,CAAC,CAAA;gBAEF,OAAO,MAAM,CAAA;YACf,CAAC,EACD,EAAE,IAAI,EAAE,6BAA6B,EAAE,MAAM,EAAE,QAAQ,CAAC,QAAQ,EAAE,CACnE;WAAA;QAED;;;;;;;;;;;;;;;;;WAiBG;QACH;;;;mBAAqB,UAAU,CAC7B,CAAC,QAAiB,EAAE,EAAE;gBACpB,uEAAuE;gBACvE,UAAU;gBACV,IAAI,QAAQ,KAAK,SAAS,IAAI,QAAQ,KAAK,EAAE,IAAI,QAAQ,KAAK,IAAI;oBAAE,OAAO,EAAE,CAAA;gBAE7E,MAAM,UAAU,GAAG,IAAI,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,CAAA,CAAC,8BAA8B;gBAE7F,OAAO,MAAM,CAAC,WAAW,CACvB,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC;qBACvB,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;qBAC1C,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,KAAK,EAAE,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC;oBAC9C,2BAA2B;qBAC1B,MAAM,CACL,CAAC,CAAC,IAAI,EAAE,OAAO,CAAC,EAAE,EAAE,CAClB,OAAO,KAAK,SAAS;oBACrB,OAAO,KAAK,IAAI;oBAChB,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC;wBACtB,CAAC,OAAO,CAAC,MAAM,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,SAAS,IAAI,CAAC,KAAK,IAAI,CAAC,CAAC,CAAC,CACpF,CACJ,CAAA;YACH,CAAC,EACD,EAAE,IAAI,EAAE,+BAA+B,EAAE,MAAM,EAAE,QAAQ,CAAC,QAAQ,EAAE,CACrE;WAAA;QAyBD;;;;mBAAmB,CAAC,KAAc,EAAE,EAAE;;gBACpC,IAAI,CAAC,KAAK;oBAAE,OAAM;gBAClB,IAAI,KAAK,CAAC,QAAQ,CAAC,WAAW,CAAC;oBAAE,OAAM;gBAEvC,IAAI,CAAC,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC;oBACtC,MAAM,CAAC,GAAG,CAAC,kBAAkB,KAAK,EAAE,CAAC,CAAA;oBACrC,MAAA,IAAI,CAAC,MAAM,0CAAE,SAAS,CAAC,KAAK,EAAE,CAAC,GAAG,EAAE,OAAO,EAAE,EAAE;wBAC7C,IAAI,GAAG,EAAE,CAAC;4BACR,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;4BACjB,OAAM;wBACR,CAAC;wBAED,IAAI,OAAO,KAAK,SAAS,IAAI,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC;4BACxC,MAAM,CAAC,GAAG,CAAC,iBAAiB,OAAO,CAAC,CAAC,CAAC,CAAC,KAAK,aAAa,OAAO,CAAC,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,CAAA;wBAC5E,CAAC;6BAAM,CAAC;4BACN,MAAM,CAAC,GAAG,CAAC,iBAAiB,KAAK,mBAAmB,CAAC,CAAA;wBACvD,CAAC;oBACH,CAAC,CAAC,CAAA;oBAEF,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,KAAK,CAAC,CAAA;gBAClC,CAAC;YACH,CAAC;WAAA;QAWD;;;;mBAAa,CAAC,KAAa,EAAE,OAAsC,EAAE,EAAE;gBACrE,gHAAgH;gBAChH,IAAI,IAAI,CAAC,mBAAmB,IAAI,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,KAAK,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC;oBACpG,gFAAgF;oBAChF,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,GAAG,OAAO,CAAC,KAAK,CAAA;gBACtC,CAAC;qBAAM,CAAC;oBACN,+EAA+E;oBAC/E,oFAAoF;oBACpF,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,GAAG,OAAO,CAAC,KAAK,CAAA;gBAC1C,CAAC;YACH,CAAC;WAAA;QAED;;;;mBAAsB,GAAG,EAAE;gBACzB,IAAI,CAAC,oBAAoB,EAAE,CAAA;gBAC3B,IAAI,CAAC,mBAAmB,GAAG,IAAI,CAAA;YACjC,CAAC;WAAA;QAED;;;;mBAAuB,GAAG,EAAE;gBAC1B,IAAI,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;oBAChD,kHAAkH;oBAClH,MAAM,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,YAAY,CAAC,CAAA;oBACxC,gHAAgH;oBAChH,IAAI,CAAC,YAAY,GAAG,EAAE,CAAA;gBACxB,CAAC;YACH,CAAC;WAAA;QAED;;;;mBAA8B,CAAC,OAAe,EAAE,EAAE;gBAChD,IAAI,CAAC,WAAW,GAAG,UAAU,CAAC,GAAG,EAAE;oBACjC,MAAM,OAAO,GAAG,WAAW,CAAC,GAAG,EAAE,CAAA;oBACjC,IAAI,CAAC,oBAAoB,EAAE,CAAA;oBAC3B,MAAM,KAAK,GAAG,WAAW,CAAC,GAAG,EAAE,CAAA;oBAC/B,IAAI,CAAC,2BAA2B,GAAG,SAAS,CAAC,IAAI,CAAC,2BAA2B,EAAE,EAAE,EAAE,KAAK,GAAG,OAAO,CAAC,CAAA;oBACnG,2CAA2C;oBAC3C,sEAAsE;oBACtE,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,2BAA2B,GAAG,EAAE,EAAE,IAAI,CAAC,CAAC,CAAA;oBACxF,IAAI,CAAC,2BAA2B,CAAC,UAAU,CAAC,CAAA;gBAC9C,CAAC,EAAE,OAAO,CAAC,CAAA;YACb,CAAC;WAAA;QAED;;;;mBAAmB,GAAG,EAAE;gBACtB,IAAI,CAAC,iBAAiB,EAAE,CAAA;gBAExB,IAAI,CAAC,2BAA2B,GAAG,EAAE,CAAA,CAAC,KAAK;gBAC3C,IAAI,CAAC,2BAA2B,CAAC,IAAI,CAAC,CAAA,CAAC,KAAK;YAC9C,CAAC;WAAA;QAED;;;;mBAAoB,GAAG,EAAE;gBACvB,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;oBACrB,YAAY,CAAC,IAAI,CAAC,WAAW,CAAC,CAAA;gBAChC,CAAC;gBACD,IAAI,CAAC,WAAW,GAAG,SAAS,CAAA;YAC9B,CAAC;WAAA;QAED;;;;mBAAc,CAAC,QAAgB,EAAE,EAAE;gBACjC,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAA;gBACxB,IAAI,CAAC,mBAAmB,GAAG;oBACzB,KAAK,QAAQ,UAAU;oBACvB,KAAK,QAAQ,4BAA4B;oBACzC,KAAK,QAAQ,wBAAwB;iBACtC,CAAA;YACH,CAAC;WAAA;QAUD;;;;mBAAO,CACL,QAAgB,EAChB,OAAe,WAAW,EAC1B,IAAmB,EACnB,OAAe,gBAAgB,EAC/B,SAAkB,KAAK,EACvB,QAAiB,EACjB,EAAE;gBACF,MAAM,CAAC,GAAG,CAAC,cAAc,CAAC,CAAA;gBAE1B,IAAI,MAAM,GAAG,IAAI,CAAC,MAAM,CAAA;gBAExB,IAAI,MAAM,EAAE,CAAC;oBACX,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAA;oBAChB,IAAI,CAAC,MAAM,GAAG,SAAS,CAAA;oBACvB,IAAI,CAAC,QAAQ,GAAG,SAAS,CAAA;oBACzB,IAAI,CAAC,gBAAgB,GAAG,IAAI,GAAG,EAAU,CAAA;oBACzC,IAAI,CAAC,mBAAmB,GAAG,EAAE,CAAA;oBAC7B,IAAI,CAAC,mBAAmB,GAAG,KAAK,CAAA;gBAClC,CAAC;gBAED,IAAI,GAAG,CAAA;gBACP,IAAI,MAAM,EAAE,CAAC;oBACX,IAAI,CAAC,IAAI,EAAE,CAAC;wBACV,OAAM;oBACR,CAAC;oBACD,6DAA6D;oBAC7D,GAAG,GAAG,WAAW,IAAI,MAAM,CAAA;gBAC7B,CAAC;qBAAM,CAAC;oBACN,oEAAoE;oBACpE,MAAM,OAAO,GAAG,QAAQ,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAA;oBACtD,IAAI,IAAI,EAAE,CAAC;wBACT,GAAG,GAAG,GAAG,OAAO,KAAK,IAAI,IAAI,IAAI,IAAI,IAAI,EAAE,CAAA;oBAC7C,CAAC;yBAAM,CAAC;wBACN,GAAG,GAAG,GAAG,OAAO,KAAK,IAAI,IAAI,IAAI,EAAE,CAAA;oBACrC,CAAC;gBACH,CAAC;gBAED,MAAM,CAAC,GAAG,CAAC,sBAAsB,GAAG,EAAE,CAAC,CAAA;gBACvC,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,WAAW,EAAE,KAAK,EAAE,CAAC,CAAA;gBAElD,IAAI,CAAC,MAAM,GAAG,MAAM,CAAA;gBACpB,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAA;gBAExB,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE;oBAC3B,MAAM,CAAC,GAAG,CAAC,YAAY,CAAC,CAAA;oBACxB,WAAW,CAAC,GAAG,EAAE;wBACf,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAA;wBACpB,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,YAAY,CAAC,CAAA;oBACrC,CAAC,CAAC,CAAA;oBACF,IAAI,CAAC,iBAAiB,EAAE,CAAA;oBACxB,IAAI,CAAC,mBAAmB,EAAE,CAAA;oBAC1B,IAAI,CAAC,qBAAqB,EAAE,CAAA;gBAC9B,CAAC,CAAC,CAAA;gBAEF,MAAM,CAAC,EAAE,CAAC,SAAS,EAAE,GAAG,EAAE;oBACxB,MAAM,CAAC,GAAG,CAAC,cAAc,CAAC,CAAA;oBAC1B,WAAW,CAAC,GAAG,EAAE;wBACf,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAA;wBACnB,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,OAAO,CAAC,CAAA;oBAChC,CAAC,CAAC,CAAA;oBACF,IAAI,CAAC,iBAAiB,EAAE,CAAA;oBACxB,IAAI,CAAC,mBAAmB,EAAE,CAAA;oBAC1B,IAAI,CAAC,qBAAqB,EAAE,CAAA;gBAC9B,CAAC,CAAC,CAAA;gBAEF,MAAM,CAAC,EAAE,CAAC,SAAS,EAAE,GAAG,EAAE;oBACxB,MAAM,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAA;oBAC5B,WAAW,CAAC,GAAG,EAAE;wBACf,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAA;wBACnB,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,SAAS,CAAC,CAAA;wBAChC,8CAA8C;wBAC9C,IAAI,CAAC,gBAAgB,CAAC,KAAK,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,GAAG,kBAAkB,CAAC,CAAA;wBACrE,IAAI,CAAC,mBAAmB,EAAE,CAAA;oBAC5B,CAAC,CAAC,CAAA;gBACJ,CAAC,CAAC,CAAA;gBAEF,MAAM,CAAC,EAAE,CAAC,SAAS,EAAE,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE;oBACtC,0EAA0E;oBAE1E,IAAI,KAAK,CAAC,QAAQ,CAAC,kBAAkB,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC;wBACzD,MAAM,QAAQ,GAAG,cAAc,CAAC,OAAO,CAAC,CAAC,KAAK,CAAA;wBAE9C,IAAI,IAAI,CAAC,QAAQ,KAAK,QAAQ,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;4BACzD,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAA;wBAC5B,CAAC;wBAED,WAAW,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,oBAAoB,EAAE,CAAC,CAAA;oBAChD,CAAC;oBACD,IAAI,KAAK,CAAC,QAAQ,CAAC,wBAAwB,CAAC,EAAE,CAAC;wBAC7C,MAAM,QAAQ,GAAG,cAAc,CAAC,OAAO,CAAC,CAAC,6BAA6B,CAAC,IAAI,EAAE,CAAA;wBAC7E,MAAM,CAAC,GAAG,CACR,uCAAuC,IAAI,CAAC,QAAQ,uCAAuC,QAAQ,GAAG,CACvG,CAAA;wBACD,IAAI,QAAQ,KAAK,IAAI,CAAC,QAAQ,EAAE,CAAC;4BAC/B,IAAI,CAAC,mBAAmB,EAAE,CAAA;4BAC1B,IAAI,CAAC,gBAAgB,EAAE,CAAA;wBACzB,CAAC;oBACH,CAAC;oBAED,IAAI,OAAO,CAAC,QAAQ,EAAE,KAAK,EAAE,EAAE,CAAC;wBAC9B,IAAI,CAAC,UAAU,CAAC,KAAK,EAAE,cAAc,CAAC,OAAO,CAAC,CAAC,CAAA;oBACjD,CAAC;gBACH,CAAC,CAAC,CAAA;gBAEF,MAAM,CAAC,GAAG,CAAC,aAAa,CAAC,CAAA;YAC3B,CAAC;WAAA;QAED;;;;mBAAuB,GAAG,EAAE;;gBAC1B,MAAM,MAAM,GAAG;oBACb,KAAK,IAAI,CAAC,QAAQ,aAAa;oBAC/B,KAAK,IAAI,CAAC,QAAQ,WAAW;oBAC7B,KAAK,IAAI,CAAC,QAAQ,UAAU;oBAC5B,KAAK,IAAI,CAAC,QAAQ,eAAe;oBACjC,KAAK,IAAI,CAAC,QAAQ,YAAY;oBAC9B,KAAK,IAAI,CAAC,QAAQ,YAAY;oBAC9B,KAAK,IAAI,CAAC,QAAQ,aAAa;oBAC/B,KAAK,IAAI,CAAC,QAAQ,cAAc;oBAChC,KAAK,IAAI,CAAC,QAAQ,WAAW;oBAC7B,KAAK,IAAI,CAAC,QAAQ,aAAa;oBAC/B,KAAK,IAAI,CAAC,QAAQ,aAAa;oBAC/B,KAAK,IAAI,CAAC,QAAQ,SAAS;oBAC3B,KAAK,IAAI,CAAC,QAAQ,gBAAgB;oBAClC,KAAK,IAAI,CAAC,QAAQ,WAAW;oBAC7B,KAAK,IAAI,CAAC,QAAQ,yBAAyB;iBAC5C,CAAA;gBAED,MAAA,IAAI,CAAC,MAAM,0CAAE,SAAS,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,EAAE;oBACrC,IAAI,GAAG,EAAE,CAAC;wBACR,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;wBACjB,OAAM;oBACR,CAAC;oBAED,wDAAwD;oBACxD,IAAI,CAAC,iBAAiB,EAAE,CAAA;gBAC1B,CAAC,CAAC,CAAA;YACJ,CAAC;WAAA;QAED;;;;mBAA0B,GAAG,EAAE;;gBAC7B,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;oBAClB,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,EAAE,mBAAmB,EAAE,CAAC,oBAAoB,CAAC,EAAE,CAAC,CAAA;oBAC/E,MAAM,KAAK,GAAG,KAAK,IAAI,CAAC,QAAQ,YAAY,CAAA;oBAE5C,MAAM,CAAC,GAAG,CAAC,yBAAyB,IAAI,CAAC,QAAQ,SAAS,OAAO,EAAE,CAAC,CAAA;oBACpE,MAAA,IAAI,CAAC,MAAM,0CAAE,OAAO,CAAC,KAAK,EAAE,OAAO,CAAC,CAAA;gBACtC,CAAC;YACH,CAAC;WAAA;QAED;;;;mBAAoB,GAAG,EAAE;;gBACvB,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;oBAClB,MAAM,KAAK,GAAG,KAAK,IAAI,CAAC,QAAQ,YAAY,CAAA;oBAE5C,MAAM,CAAC,GAAG,CAAC,+BAA+B,IAAI,CAAC,QAAQ,uCAAuC,IAAI,CAAC,QAAQ,GAAG,CAAC,CAAA;oBAC/G,MAAA,IAAI,CAAC,MAAM,0CAAE,OAAO,CAAC,KAAK,EAAE,8DAA8D,IAAI,CAAC,QAAQ,SAAS,CAAC,CAAA;gBACnH,CAAC;YACH,CAAC;WAAA;QAED;;;;mBAAsB,GAAG,EAAE;gBACzB,IAAI,CAAC,mBAAmB,EAAE,CAAA;gBAE1B,IAAI,CAAC,mBAAmB,GAAG,WAAW,CAAC,IAAI,CAAC,uBAAuB,EAAE,KAAK,CAAC,CAAA;gBAE3E,IAAI,CAAC,iBAAiB,EAAE,CAAA;YAC1B,CAAC;WAAA;QAED;;;;mBAAsB,GAAG,EAAE;gBACzB,MAAM,GAAG,GAAG,IAAI,CAAC,mBAAmB,CAAA;gBACpC,IAAI,GAAG,EAAE,CAAC;oBACR,aAAa,CAAC,GAAG,CAAC,CAAA;gBACpB,CAAC;gBACD,IAAI,CAAC,mBAAmB,GAAG,SAAS,CAAA;YACtC,CAAC;WAAA;QAED;;;;mBAAU,CAAC,KAAa,EAAE,IAAuC,EAAE,OAA+B,EAAE,EAAE;;gBACpG,IAAI,IAAI,CAAC,MAAM,KAAK,MAAM,CAAC,SAAS,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;oBACrD,MAAM,CAAC,GAAG,CAAC,uDAAuD,CAAC,CAAA;oBACnE,OAAM;gBACR,CAAC;gBACD,MAAM,OAAO,GACX,OAAO,IAAI,KAAK,QAAQ,IAAI,IAAI,KAAK,IAAI,IAAI,KAAK,IAAI,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAA;gBAEzG,MAAM,CAAC,GAAG,CAAC,iBAAiB,KAAK,KAAK,OAAO,EAAE,CAAC,CAAA;gBAEhD,MAAA,IAAI,CAAC,MAAM,0CAAE,OAAO,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO,aAAP,OAAO,cAAP,OAAO,GAAI,EAAE,CAAC,CAAA;YACrD,CAAC;WAAA;QApTC,kBAAkB,CAAC,IAAI,EAAE;YACvB,YAAY,EAAE,KAAK;YACnB,mBAAmB,EAAE,KAAK;YAC1B,mBAAmB,EAAE,KAAK;YAC1B,mBAAmB,EAAE,KAAK;YAC1B,mBAAmB,EAAE,KAAK;YAC1B,mBAAmB,EAAE,KAAK;YAC1B,iBAAiB,EAAE,KAAK;YACxB,uBAAuB,EAAE,KAAK;YAC9B,gBAAgB,EAAE,KAAK;YACvB,iBAAiB,EAAE,KAAK;YACxB,2BAA2B,EAAE,KAAK;YAClC,gBAAgB,EAAE,KAAK;YACvB,oBAAoB,EAAE,KAAK;YAC3B,qBAAqB,EAAE,KAAK;SAC7B,CAAC,CAAA;IACJ,CAAC;IAED,IAAI,WAAW;QACb,OAAO,IAAI,CAAC,MAAM,KAAK,MAAM,CAAC,SAAS,CAAA;IACzC,CAAC;IAyBD,qBAAqB;QACnB,IAAI,CAAC,gBAAgB,CAAC,KAAK,EAAE,CAAA;QAC7B,IAAI,CAAC,mBAAmB,GAAG,EAAE,CAAA;QAC7B,IAAI,CAAC,mBAAmB,GAAG,KAAK,CAAA;QAChC,WAAW,CAAC,GAAG,EAAE;YACf,IAAI,CAAC,QAAQ,GAAG,SAAS,CAAA;QAC3B,CAAC,CAAC,CAAA;IACJ,CAAC;IAgED,SAAS,CAAC,MAAc;QACtB,IAAI,CAAC,MAAM,GAAG,MAAM,CAAA;IACtB,CAAC;IAED,QAAQ,CAAC,KAA8B;QACrC,IAAI,CAAC,KAAK,GAAG,KAAK,CAAA;IACpB,CAAC;CA2LF;AAED;;;;;;;;;;GAUG;AACH,SAAS,SAAS,CAAC,IAAY,EAAE,CAAS,EAAE,QAAgB;IAC1D,OAAO,IAAI,GAAG,CAAC,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAA;AAC3C,CAAC;AAED,SAAS,eAAe;IACtB,MAAM,MAAM,GAAG,KAAK,aAAL,KAAK,cAAL,KAAK,GAAI,IAAI,SAAS,EAAE,CAAA;IACvC,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,OAAO;IACrB,OAAO,OAAO,CAAC,GAAG,EAAE,CAAC,eAAe,EAAE,EAAE,EAAE,CAAC,CAAA;AAC7C,CAAC","sourcesContent":["import { comparer, makeAutoObservable, runInAction } from \"mobx\"\nimport { computedFn } from \"mobx-utils\"\nimport * as mqtt from \"mqtt\"\nimport { IClientPublishOptions, MqttClient } from \"mqtt\"\nimport { MqttMessage, MqttMessages, PortalId, STATUS, Topics } from \"../Mqtt\"\nimport Logger from \"../../utils/logger\"\nimport { getMessageJson } from \"../../utils/util\"\nimport { useMemo } from \"react\"\nimport { assign } from \"lodash-es\"\n\nlet store: MqttStore\n\nexport class MqttStore {\n client?: MqttClient | null\n error?: object | null | boolean\n status: string = STATUS.CONNECTING\n messages: MqttMessages = {}\n messageQueue: MqttMessages = {}\n topicsSubscribed: Set<string> = new Set<string>()\n portalId: PortalId\n uniqueId: string = Math.random().toString(16).substr(2, 8)\n keepAliveHandlerRef: ReturnType<typeof setInterval> | undefined\n queueWorker: ReturnType<typeof setTimeout> | undefined\n meanQueueWorkerPassDuration: number = 0\n urgentTopicPrefixes: string[] = []\n initialLoadComplete: boolean = false\n\n /**\n * Returns the current cached message for a given MQTT topic.\n *\n * React Components using this method will re-render when their specific\n * topic's message changes.\n *\n * Using comparer.identity will trigger the re-renders any time\n * a message arrives for the given topic. We rely on the fact\n * that MQTT will only re-send a message when the value changes,\n * or on a full keep alive.\n *\n * Note: Receiving the same message for a given topic will cause re-renders,\n * as we do not check structural identity of the message.\n *\n * @param topic - The MQTT topic to retrieve the message for\n * @returns The message object for the topic, or undefined if topic is not provided or not found\n */\n messageFromTopic = computedFn(\n (topic?: string) => {\n // Logger.log(`DEBUG: messageFromTopic: ${JSON.stringify(topic)}`)\n // trace()\n return topic ? this.messages[topic] : undefined\n },\n { name: \"Mqtt.store.messageFromTopic\", equals: comparer.identity }\n )\n\n /**\n * Returns the current cached messages for a given set of MQTT topics.\n *\n * This is a memoized computed function - each set of topics has its own cached value.\n *\n * React Components using this method will re-render when\n * any of the messages for specified topics change.\n *\n * Using comparer.identity will trigger the re-renders any time\n * a message arrives for any of the specified topics. We rely on the fact\n * that MQTT will only re-send a message when the value changes,\n * or on a full keep alive.\n\n * Note: Receiving the same message for a given topic will cause re-renders,\n * as we do not check structural identity of the message.\n *\n * @param topics - The MQTT topics to retrieve the messages for\n * @returns The messages objects for the given topics, or empty dictionary if topics not found\n */\n messagesByTopics = computedFn(\n (topics?: Topics) => {\n // Logger.log(`DEBUG: messagesByTopics: ${JSON.stringify(topics)}`)\n // trace()\n if (!topics) {\n return {}\n }\n\n const result: { [key: string]: MqttMessage | MqttMessage[] } = {}\n\n Object.entries(topics).forEach(([label, topic]) => {\n if (Array.isArray(topic)) {\n result[label] = topic.map((t) => this.messageFromTopic(t))\n } else if (topic === undefined) {\n result[label] = undefined\n } else {\n result[label] = this.messageFromTopic(topic)\n }\n })\n\n return result\n },\n { name: \"Mqtt.store.messagesByTopics\", equals: comparer.identity }\n )\n\n /**\n * Returns the current cached messages for MQTT topics specified via regex.\n *\n * React Components using this method will re-render when\n * values of any of the matched topics change. The components also re-render\n * when new MQTT topics are received and match needs to be checked.\n *\n * Using comparer.identity will trigger the re-renders any time\n * a message arrives for any of the matched topics. We rely on the fact\n * that MQTT will only re-send a message when the value changes,\n * or on a full keep alive.\n *\n * Note: Receiving the same message for a given topic will cause re-renders,\n * as we do not check structural identity of the message.\n *\n * @param wildcard - The MQTT wildcard to retrieve the message for\n * @returns The messages objects for the given topics, or empty dictionary if topics not found\n */\n messagesByWildcard = computedFn(\n (wildcard?: string) => {\n // Logger.log(`DEBUG: messagesByWildcard: ${JSON.stringify(wildcard)}`)\n // trace()\n if (wildcard === undefined || wildcard === \"\" || wildcard === null) return {}\n\n const topicRegex = new RegExp(wildcard.replace(/\\+/g, \"\\\\w*\")) // + in mqtt is anything -> .*\n\n return Object.fromEntries(\n Object.keys(this.messages)\n .filter((topic) => topic.match(topicRegex))\n .map((topic) => [topic, this.messages[topic]])\n // Filter out empty results\n .filter(\n ([_key, message]) =>\n message !== undefined &&\n message !== null &&\n (!Array.isArray(message) ||\n (message.length !== 0 && !message.every((v) => v === undefined || v === null)))\n )\n )\n },\n { name: \"Mqtt.store.messagesByWildcard\", equals: comparer.identity }\n )\n\n constructor() {\n makeAutoObservable(this, {\n messageQueue: false,\n urgentTopicPrefixes: false,\n initialLoadComplete: false,\n completeInitialLoad: false,\n setupKeepaliveTimer: false,\n clearKeepaliveTimer: false,\n sendFullKeepalive: false,\n sendSuppressedKeepalive: false,\n setupQueueWorker: false,\n removeQueueWorker: false,\n scheduleNextQueueWorkerPass: false,\n subscribeToTopic: false,\n subscribeToAllTopics: false,\n clearSubscribedTopics: false,\n })\n }\n\n get isConnected() {\n return this.status === STATUS.CONNECTED\n }\n\n subscribeToTopic = (topic?: string) => {\n if (!topic) return\n if (topic.includes(\"undefined\")) return\n\n if (!this.topicsSubscribed.has(topic)) {\n Logger.log(`Subscribing to ${topic}`)\n this.client?.subscribe(topic, (err, granted) => {\n if (err) {\n Logger.error(err)\n return\n }\n\n if (granted !== undefined && granted[0]) {\n Logger.log(`Subscribed to ${granted[0].topic} with Qos ${granted[0].qos}`)\n } else {\n Logger.log(`Subscribed to ${topic} with Qos unknown`)\n }\n })\n\n this.topicsSubscribed.add(topic)\n }\n }\n\n clearSubscribedTopics() {\n this.topicsSubscribed.clear()\n this.urgentTopicPrefixes = []\n this.initialLoadComplete = false\n runInAction(() => {\n this.portalId = undefined\n })\n }\n\n addMessage = (topic: string, message: { value: string | undefined }) => {\n // Logger.log(`DEBUG: addMessage: topic: ${topic}, urgentPrefixes: ${JSON.stringify(this.urgentTopicPrefixes)}`)\n if (this.initialLoadComplete && this.urgentTopicPrefixes.some((prefix) => topic.startsWith(prefix))) {\n // NOTE: If topic starts with one of the urgent prefixes, deliver it immediately\n this.messages[topic] = message.value\n } else {\n // NOTE: Otherwise store message to the queue, and move messages from the queue\n // NOTE: to the React components that are MobX observers periodically and in batches\n this.messageQueue[topic] = message.value\n }\n }\n\n completeInitialLoad = () => {\n this.addMessagesFromQueue()\n this.initialLoadComplete = true\n }\n\n addMessagesFromQueue = () => {\n if (Object.values(this.messageQueue).length > 0) {\n // Logger.log(`DEBUG: addMessagesFromQueue: in queue: ${JSON.stringify(Object.values(this.messageQueue).length)}`)\n assign(this.messages, this.messageQueue)\n // Logger.log(`DEBUG: addMessagesFromQueue: to process: ${JSON.stringify(Object.values(this.messages).length)}`)\n this.messageQueue = {}\n }\n }\n\n scheduleNextQueueWorkerPass = (timeout: number) => {\n this.queueWorker = setTimeout(() => {\n const started = performance.now()\n this.addMessagesFromQueue()\n const ended = performance.now()\n this.meanQueueWorkerPassDuration = addToMean(this.meanQueueWorkerPassDuration, 10, ended - started)\n // Schedule next update after 1 - 3 seconds\n // depending on how fast we were able to process the incoming messages\n const newTimeout = Math.max(1000, Math.min(this.meanQueueWorkerPassDuration * 50, 3000))\n this.scheduleNextQueueWorkerPass(newTimeout)\n }, timeout)\n }\n\n setupQueueWorker = () => {\n this.removeQueueWorker()\n\n this.meanQueueWorkerPassDuration = 20 // ms\n this.scheduleNextQueueWorkerPass(1000) // ms\n }\n\n removeQueueWorker = () => {\n if (this.queueWorker) {\n clearTimeout(this.queueWorker)\n }\n this.queueWorker = undefined\n }\n\n setPortalId = (portalId: string) => {\n this.portalId = portalId\n this.urgentTopicPrefixes = [\n `N/${portalId}/switch/`,\n `N/${portalId}/system/0/SwitchableOutput`,\n `N/${portalId}/system/0/GenericInput`,\n ]\n }\n\n setStatus(status: string) {\n this.status = status\n }\n\n setError(error: object | null | boolean) {\n this.error = error\n }\n\n boot = (\n protocol: string,\n host: string = \"localhost\",\n port: number | null,\n path: string = \"websocket-mqtt\",\n remote: boolean = false,\n portalId?: string\n ) => {\n Logger.log(\"MQTT booting\")\n\n let client = this.client\n\n if (client) {\n client.end(true)\n this.client = undefined\n this.portalId = undefined\n this.topicsSubscribed = new Set<string>()\n this.urgentTopicPrefixes = []\n this.initialLoadComplete = false\n }\n\n let url\n if (remote) {\n if (!host) {\n return\n }\n // remote connection to VRM broker always uses MQTTS over 443\n url = `mqtts://${host}:443`\n } else {\n // local connection derives websocket protocol from web app protocol\n const wsproto = protocol === \"https:\" ? \"wss:\" : \"ws:\"\n if (port) {\n url = `${wsproto}//${host}:${port}/${path}`\n } else {\n url = `${wsproto}//${host}/${path}`\n }\n }\n\n Logger.log(`MQTT connecting to ${url}`)\n client = mqtt.connect(url, { resubscribe: false })\n\n this.client = client\n this.portalId = portalId\n\n client.on(\"error\", (error) => {\n Logger.log(\"MQTT error\")\n runInAction(() => {\n this.setError(error)\n this.setStatus(STATUS.DISCONNECTED)\n })\n this.removeQueueWorker()\n this.clearKeepaliveTimer()\n this.clearSubscribedTopics()\n })\n\n client.on(\"offline\", () => {\n Logger.log(\"MQTT offline\")\n runInAction(() => {\n this.setError(true)\n this.setStatus(STATUS.OFFLINE)\n })\n this.removeQueueWorker()\n this.clearKeepaliveTimer()\n this.clearSubscribedTopics()\n })\n\n client.on(\"connect\", () => {\n Logger.log(\"MQTT connected\")\n runInAction(() => {\n this.setError(null)\n this.setStatus(STATUS.CONNECTED)\n // Never use wildcard when connecting remotely\n this.subscribeToTopic(`N/${remote ? portalId : \"+\"}/system/0/Serial`)\n this.setupKeepaliveTimer()\n })\n })\n\n client.on(\"message\", (topic, message) => {\n // Logger.log(`DEBUG: Message received: ${topic} - ${message.toString()}`)\n\n if (topic.endsWith(\"/system/0/Serial\") && !this.portalId) {\n const portalId = getMessageJson(message).value\n\n if (this.portalId !== portalId && portalId !== undefined) {\n this.setPortalId(portalId)\n }\n\n runInAction(() => this.subscribeToAllTopics())\n }\n if (topic.endsWith(\"full_publish_completed\")) {\n const uniqueId = getMessageJson(message)[\"full-publish-completed-echo\"] || \"\"\n Logger.log(\n `Received full_publish_completed for ${this.portalId} with full-publish-completed-echo: '${uniqueId}'`\n )\n if (uniqueId === this.uniqueId) {\n this.completeInitialLoad()\n this.setupQueueWorker()\n }\n }\n\n if (message.toString() !== \"\") {\n this.addMessage(topic, getMessageJson(message))\n }\n })\n\n Logger.log(\"MQTT booted\")\n }\n\n subscribeToAllTopics = () => {\n const topics = [\n `N/${this.portalId}/settings/#`,\n `N/${this.portalId}/system/#`,\n `N/${this.portalId}/vebus/#`,\n `N/${this.portalId}/alternator/#`,\n `N/${this.portalId}/battery/#`,\n `N/${this.portalId}/charger/#`,\n `N/${this.portalId}/dcsource/#`,\n `N/${this.portalId}/generator/#`,\n `N/${this.portalId}/genset/#`,\n `N/${this.portalId}/dcgenset/#`,\n `N/${this.portalId}/inverter/#`,\n `N/${this.portalId}/tank/#`,\n `N/${this.portalId}/temperature/#`,\n `N/${this.portalId}/switch/#`,\n `N/${this.portalId}/full_publish_completed`,\n ]\n\n this.client?.subscribe(topics, (err) => {\n if (err) {\n Logger.error(err)\n return\n }\n\n // When we received all topics we send a full keepalive.\n this.sendFullKeepalive()\n })\n }\n\n sendSuppressedKeepalive = () => {\n if (this.portalId) {\n const options = JSON.stringify({ \"keepalive-options\": [\"suppress-republish\"] })\n const topic = `R/${this.portalId}/keepalive`\n\n Logger.log(`Sending keepalive for ${this.portalId} with ${options}`)\n this.client?.publish(topic, options)\n }\n }\n\n sendFullKeepalive = () => {\n if (this.portalId) {\n const topic = `R/${this.portalId}/keepalive`\n\n Logger.log(`Sending first keepalive for ${this.portalId} with full-publish-completed-echo: '${this.uniqueId}'`)\n this.client?.publish(topic, `{ \"keepalive-options\" : [ {\"full-publish-completed-echo\": \"${this.uniqueId}\" } ] }`)\n }\n }\n\n setupKeepaliveTimer = () => {\n this.clearKeepaliveTimer()\n\n this.keepAliveHandlerRef = setInterval(this.sendSuppressedKeepalive, 30000)\n\n this.sendFullKeepalive()\n }\n\n clearKeepaliveTimer = () => {\n const ref = this.keepAliveHandlerRef\n if (ref) {\n clearInterval(ref)\n }\n this.keepAliveHandlerRef = undefined\n }\n\n publish = (topic: string, data: string | number | { raw: string }, options?: IClientPublishOptions) => {\n if (this.status !== STATUS.CONNECTED || !this.client) {\n Logger.log(\"Could not publish value, not connected to MQTT broker\")\n return\n }\n const message =\n typeof data === \"object\" && data !== null && \"raw\" in data ? data.raw : JSON.stringify({ value: data })\n\n Logger.log(`Publishing to ${topic}: ${message}`)\n\n this.client?.publish(topic, message, options ?? {})\n }\n}\n\n/**\n * Compute mean by providing existing mean, number of samples, and new sample.\n *\n * @param {number} mean current mean\n * @param {number} n number of sampled values\n * @param {number} newValue the sample\n * @returns {number} the new mean\n *\n * @example\n * addToMean(14, 5, 53); // => 20.5\n */\nfunction addToMean(mean: number, n: number, newValue: number): number {\n return mean + (newValue - mean) / (n + 1)\n}\n\nfunction initializeStore() {\n const _store = store ?? new MqttStore()\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 useMqtt() {\n return useMemo(() => initializeStore(), [])\n}\n"]}
@@ -2,5 +2,6 @@ export type ShorePowerInputId = number | null | undefined;
2
2
  export interface ShorePowerInputState {
3
3
  inputId: ShorePowerInputId;
4
4
  }
5
+ export declare function deriveInputId(acInput1: unknown, acInput2: unknown): ShorePowerInputId;
5
6
  export declare function useShorePowerInput(): ShorePowerInputState;
6
7
  //# sourceMappingURL=ShorePowerInput.provider.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"ShorePowerInput.provider.d.ts","sourceRoot":"/","sources":["src/Modules/ShorePowerInput/ShorePowerInput.provider.ts"],"names":[],"mappings":"AAGA,MAAM,MAAM,iBAAiB,GAAG,MAAM,GAAG,IAAI,GAAG,SAAS,CAAA;AAEzD,MAAM,WAAW,oBAAoB;IACnC,OAAO,EAAE,iBAAiB,CAAA;CAC3B;AAuBD,wBAAgB,kBAAkB,IAAI,oBAAoB,CAczD"}
1
+ {"version":3,"file":"ShorePowerInput.provider.d.ts","sourceRoot":"/","sources":["src/Modules/ShorePowerInput/ShorePowerInput.provider.ts"],"names":[],"mappings":"AAGA,MAAM,MAAM,iBAAiB,GAAG,MAAM,GAAG,IAAI,GAAG,SAAS,CAAA;AAEzD,MAAM,WAAW,oBAAoB;IACnC,OAAO,EAAE,iBAAiB,CAAA;CAC3B;AAOD,wBAAgB,aAAa,CAAC,QAAQ,EAAE,OAAO,EAAE,QAAQ,EAAE,OAAO,GAAG,iBAAiB,CAcrF;AAED,wBAAgB,kBAAkB,IAAI,oBAAoB,CAczD"}
@@ -1,7 +1,7 @@
1
1
  import { useMemo } from "react";
2
2
  import { useMqtt, useTopicsState } from "../Mqtt";
3
3
  import { AC_SOURCE_TYPE } from "../../utils/constants";
4
- function deriveInputId(acInput1, acInput2) {
4
+ export function deriveInputId(acInput1, acInput2) {
5
5
  if (acInput1 && (Number(acInput1) === AC_SOURCE_TYPE.SHORE || Number(acInput1) === AC_SOURCE_TYPE.GRID)) {
6
6
  return 1;
7
7
  }
@@ -1 +1 @@
1
- {"version":3,"file":"ShorePowerInput.provider.js","sourceRoot":"/","sources":["src/Modules/ShorePowerInput/ShorePowerInput.provider.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,OAAO,CAAA;AAC/B,OAAO,EAAU,OAAO,EAAE,cAAc,EAAE,MAAM,SAAS,CAAA;AACzD,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAA;AAYtD,SAAS,aAAa,CAAC,QAAiB,EAAE,QAAiB;IACzD,IAAI,QAAQ,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,cAAc,CAAC,KAAK,IAAI,MAAM,CAAC,QAAQ,CAAC,KAAK,cAAc,CAAC,IAAI,CAAC,EAAE,CAAC;QACxG,OAAO,CAAC,CAAA;IACV,CAAC;IACD,IAAI,QAAQ,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,cAAc,CAAC,KAAK,IAAI,MAAM,CAAC,QAAQ,CAAC,KAAK,cAAc,CAAC,IAAI,CAAC,EAAE,CAAC;QACxG,OAAO,CAAC,CAAA;IACV,CAAC;IACD,IAAI,QAAQ,IAAI,MAAM,CAAC,QAAQ,CAAC,KAAK,cAAc,CAAC,UAAU,EAAE,CAAC;QAC/D,OAAO,CAAC,CAAA;IACV,CAAC;IACD,IAAI,QAAQ,IAAI,MAAM,CAAC,QAAQ,CAAC,KAAK,cAAc,CAAC,UAAU,EAAE,CAAC;QAC/D,OAAO,CAAC,CAAA;IACV,CAAC;IACD,OAAO,SAAS,CAAA;AAClB,CAAC;AAED,MAAM,UAAU,kBAAkB;IAChC,MAAM,IAAI,GAAG,OAAO,EAAE,CAAA;IAEtB,MAAM,MAAM,GAAG,OAAO,CACpB,GAA0B,EAAE,CAAC,CAAC;QAC5B,QAAQ,EAAE,KAAK,IAAI,CAAC,QAAQ,2CAA2C;QACvE,QAAQ,EAAE,KAAK,IAAI,CAAC,QAAQ,2CAA2C;KACxE,CAAC,EACF,CAAC,IAAI,CAAC,QAAQ,CAAC,CAChB,CAAA;IAED,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,GAAG,cAAc,CAA2C,MAAM,CAAC,CAAA;IAE/F,OAAO,EAAE,OAAO,EAAE,aAAa,CAAC,QAAQ,EAAE,QAAQ,CAAC,EAAE,CAAA;AACvD,CAAC","sourcesContent":["import { useMemo } from \"react\"\nimport { Topics, useMqtt, useTopicsState } from \"../Mqtt\"\nimport { AC_SOURCE_TYPE } from \"../../utils/constants\"\nexport type ShorePowerInputId = number | null | undefined\n\nexport interface ShorePowerInputState {\n inputId: ShorePowerInputId\n}\n\ninterface ShorePowerInputTopics extends Topics {\n acInput1?: string\n acInput2?: string\n}\n\nfunction deriveInputId(acInput1: unknown, acInput2: unknown): ShorePowerInputId {\n if (acInput1 && (Number(acInput1) === AC_SOURCE_TYPE.SHORE || Number(acInput1) === AC_SOURCE_TYPE.GRID)) {\n return 1\n }\n if (acInput2 && (Number(acInput2) === AC_SOURCE_TYPE.SHORE || Number(acInput2) === AC_SOURCE_TYPE.GRID)) {\n return 2\n }\n if (acInput1 && Number(acInput1) !== AC_SOURCE_TYPE.NOT_IN_USE) {\n return 1\n }\n if (acInput2 && Number(acInput2) !== AC_SOURCE_TYPE.NOT_IN_USE) {\n return 2\n }\n return undefined\n}\n\nexport function useShorePowerInput(): ShorePowerInputState {\n const mqtt = useMqtt()\n\n const topics = useMemo(\n (): ShorePowerInputTopics => ({\n acInput1: `N/${mqtt.portalId}/settings/0/Settings/SystemSetup/AcInput1`,\n acInput2: `N/${mqtt.portalId}/settings/0/Settings/SystemSetup/AcInput2`,\n }),\n [mqtt.portalId]\n )\n\n const { acInput1, acInput2 } = useTopicsState<{ acInput1: unknown; acInput2: unknown }>(topics)\n\n return { inputId: deriveInputId(acInput1, acInput2) }\n}\n"]}
1
+ {"version":3,"file":"ShorePowerInput.provider.js","sourceRoot":"/","sources":["src/Modules/ShorePowerInput/ShorePowerInput.provider.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,OAAO,CAAA;AAC/B,OAAO,EAAU,OAAO,EAAE,cAAc,EAAE,MAAM,SAAS,CAAA;AACzD,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAA;AAYtD,MAAM,UAAU,aAAa,CAAC,QAAiB,EAAE,QAAiB;IAChE,IAAI,QAAQ,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,cAAc,CAAC,KAAK,IAAI,MAAM,CAAC,QAAQ,CAAC,KAAK,cAAc,CAAC,IAAI,CAAC,EAAE,CAAC;QACxG,OAAO,CAAC,CAAA;IACV,CAAC;IACD,IAAI,QAAQ,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,cAAc,CAAC,KAAK,IAAI,MAAM,CAAC,QAAQ,CAAC,KAAK,cAAc,CAAC,IAAI,CAAC,EAAE,CAAC;QACxG,OAAO,CAAC,CAAA;IACV,CAAC;IACD,IAAI,QAAQ,IAAI,MAAM,CAAC,QAAQ,CAAC,KAAK,cAAc,CAAC,UAAU,EAAE,CAAC;QAC/D,OAAO,CAAC,CAAA;IACV,CAAC;IACD,IAAI,QAAQ,IAAI,MAAM,CAAC,QAAQ,CAAC,KAAK,cAAc,CAAC,UAAU,EAAE,CAAC;QAC/D,OAAO,CAAC,CAAA;IACV,CAAC;IACD,OAAO,SAAS,CAAA;AAClB,CAAC;AAED,MAAM,UAAU,kBAAkB;IAChC,MAAM,IAAI,GAAG,OAAO,EAAE,CAAA;IAEtB,MAAM,MAAM,GAAG,OAAO,CACpB,GAA0B,EAAE,CAAC,CAAC;QAC5B,QAAQ,EAAE,KAAK,IAAI,CAAC,QAAQ,2CAA2C;QACvE,QAAQ,EAAE,KAAK,IAAI,CAAC,QAAQ,2CAA2C;KACxE,CAAC,EACF,CAAC,IAAI,CAAC,QAAQ,CAAC,CAChB,CAAA;IAED,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,GAAG,cAAc,CAA2C,MAAM,CAAC,CAAA;IAE/F,OAAO,EAAE,OAAO,EAAE,aAAa,CAAC,QAAQ,EAAE,QAAQ,CAAC,EAAE,CAAA;AACvD,CAAC","sourcesContent":["import { useMemo } from \"react\"\nimport { Topics, useMqtt, useTopicsState } from \"../Mqtt\"\nimport { AC_SOURCE_TYPE } from \"../../utils/constants\"\nexport type ShorePowerInputId = number | null | undefined\n\nexport interface ShorePowerInputState {\n inputId: ShorePowerInputId\n}\n\ninterface ShorePowerInputTopics extends Topics {\n acInput1?: string\n acInput2?: string\n}\n\nexport function deriveInputId(acInput1: unknown, acInput2: unknown): ShorePowerInputId {\n if (acInput1 && (Number(acInput1) === AC_SOURCE_TYPE.SHORE || Number(acInput1) === AC_SOURCE_TYPE.GRID)) {\n return 1\n }\n if (acInput2 && (Number(acInput2) === AC_SOURCE_TYPE.SHORE || Number(acInput2) === AC_SOURCE_TYPE.GRID)) {\n return 2\n }\n if (acInput1 && Number(acInput1) !== AC_SOURCE_TYPE.NOT_IN_USE) {\n return 1\n }\n if (acInput2 && Number(acInput2) !== AC_SOURCE_TYPE.NOT_IN_USE) {\n return 2\n }\n return undefined\n}\n\nexport function useShorePowerInput(): ShorePowerInputState {\n const mqtt = useMqtt()\n\n const topics = useMemo(\n (): ShorePowerInputTopics => ({\n acInput1: `N/${mqtt.portalId}/settings/0/Settings/SystemSetup/AcInput1`,\n acInput2: `N/${mqtt.portalId}/settings/0/Settings/SystemSetup/AcInput2`,\n }),\n [mqtt.portalId]\n )\n\n const { acInput1, acInput2 } = useTopicsState<{ acInput1: unknown; acInput2: unknown }>(topics)\n\n return { inputId: deriveInputId(acInput1, acInput2) }\n}\n"]}
@@ -1,6 +1,6 @@
1
1
  import { PortalId, Topics } from "../Mqtt";
2
2
  import { SwitchingDeviceInstanceId } from "./SwitchingDevice.provider";
3
- import { GenericInputStatus, GenericInputType, GenericInputValidTypesBitmask, SwitchableOutputStatus, SwitchableOutputType, SwitchableOutputValidTypesBitmask, SwitchableOutputVisibility } from "../../utils/constants";
3
+ import { GenericInputStatus, GenericInputType, GenericInputValidTypesBitmask, SwitchableOutputStatus, SwitchableOutputType, SwitchableOutputValidTypesBitmask, SwitchableOutputVisibility, SwitchableOutputFunction } from "../../utils/constants";
4
4
  import { HSVWColorArray } from "../../utils/hsvw";
5
5
  export declare const SWITCHABLE_OUTPUT_TREES: readonly ["system", "switch"];
6
6
  export type SwitchableOutputTree = (typeof SWITCHABLE_OUTPUT_TREES)[number];
@@ -24,6 +24,7 @@ export interface SwitchableOutputState extends SwitchingPaneItemBase {
24
24
  kind: "switchableOutput";
25
25
  type: SwitchableOutputType;
26
26
  status: SwitchableOutputStatus;
27
+ function?: SwitchableOutputFunction;
27
28
  auto: 0 | 1;
28
29
  state: 0 | 1;
29
30
  dimming?: number;
@@ -62,6 +63,7 @@ export interface SwitchableOutputTopics extends Topics {
62
63
  customName?: string;
63
64
  group?: string;
64
65
  showUIControl?: string;
66
+ function?: string;
65
67
  auto?: string;
66
68
  state?: string;
67
69
  dimming?: string;
@@ -81,6 +83,7 @@ export declare const getSwitchableOutputStateTopics: (portalId: PortalId, tree:
81
83
  customName: string;
82
84
  group: string;
83
85
  showUIControl: string;
86
+ function: string;
84
87
  auto: string;
85
88
  state: string;
86
89
  dimming: string;
@@ -1 +1 @@
1
- {"version":3,"file":"SwitchableOutput.provider.d.ts","sourceRoot":"/","sources":["src/Modules/SwitchingPane/SwitchableOutput.provider.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"SwitchableOutput.provider.d.ts","sourceRoot":"/","sources":["src/Modules/SwitchingPane/SwitchableOutput.provider.ts"],"names":[],"mappings":"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"}
@@ -21,6 +21,7 @@ export const getSwitchableOutputStateTopics = (portalId, tree, deviceId, outputI
21
21
  customName: `N/${portalId}/${tree}/${deviceId}/SwitchableOutput/${outputId}/Settings/CustomName`,
22
22
  group: `N/${portalId}/${tree}/${deviceId}/SwitchableOutput/${outputId}/Settings/Group`,
23
23
  showUIControl: `N/${portalId}/${tree}/${deviceId}/SwitchableOutput/${outputId}/Settings/ShowUIControl`,
24
+ function: `N/${portalId}/${tree}/${deviceId}/SwitchableOutput/${outputId}/Settings/Function`,
24
25
  auto: `N/${portalId}/${tree}/${deviceId}/SwitchableOutput/${outputId}/Auto`,
25
26
  state: `N/${portalId}/${tree}/${deviceId}/SwitchableOutput/${outputId}/State`,
26
27
  dimming: `N/${portalId}/${tree}/${deviceId}/SwitchableOutput/${outputId}/Dimming`,
@@ -1 +1 @@
1
- {"version":3,"file":"SwitchableOutput.provider.js","sourceRoot":"/","sources":["src/Modules/SwitchingPane/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 {\n GenericInputStatus,\n GenericInputType,\n GenericInputValidTypesBitmask,\n SwitchableOutputStatus,\n SwitchableOutputType,\n SwitchableOutputValidTypesBitmask,\n SwitchableOutputVisibility,\n} from \"../../utils/constants\"\nimport { hsvwArrayToJSON, HSVWColorArray } from \"../../utils/hsvw\"\n\nexport const SWITCHABLE_OUTPUT_TREES = [\"system\", \"switch\"] as const\nexport type SwitchableOutputTree = (typeof SWITCHABLE_OUTPUT_TREES)[number]\nexport type SwitchableOutputId = string\nexport type SwitchableOutputUnit = string | \"/Speed\" | \"/Temperature\" | \"/Volume\"\n\nexport interface SwitchingPaneItemBase {\n tree: SwitchableOutputTree\n deviceId: SwitchingDeviceInstanceId\n outputId: SwitchableOutputId\n name: string\n customName: string\n group: string\n parentDeviceName: string\n showUIControl: SwitchableOutputVisibility\n validTypes: SwitchableOutputValidTypesBitmask | GenericInputValidTypesBitmask\n unit: SwitchableOutputUnit\n decimals?: number\n // NOTE: JSON encoded string array\n labels: string\n}\n\nexport interface SwitchableOutputState extends SwitchingPaneItemBase {\n kind: \"switchableOutput\"\n type: SwitchableOutputType\n status: SwitchableOutputStatus\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 lightControls: HSVWColorArray\n}\n\nexport interface GenericInputState extends SwitchingPaneItemBase {\n kind: \"genericInput\"\n type: GenericInputType\n status: GenericInputStatus\n value?: number | null\n event?: number\n primaryLabel?: string\n rangeMin?: number\n rangeMax?: number\n invert?: 0 | 1\n digitalInputMode?: number\n}\n\nexport type SwitchingPaneItem = SwitchableOutputState | GenericInputState\n\nexport interface SwitchableOutputProvider extends SwitchableOutputState {\n updateType: (type: SwitchableOutputType) => void\n updateAuto: (auto: 0 | 1) => void\n updateState: (state: 0 | 1) => void\n updateDimming: (dimming: number) => void\n updateLightControls: (hsvwa: HSVWColorArray) => void\n}\n\nexport function switchableOutputSupportsType(\n validType: SwitchableOutputValidTypesBitmask,\n type: SwitchableOutputType\n): boolean {\n return (validType & (1 << type)) !== 0\n}\n\nexport interface SwitchableOutputTopics extends Topics {\n type?: string\n validTypes?: 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 getSwitchingPaneItemNameForDisplay = (state: SwitchingPaneItem, 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 tree: SwitchableOutputTree,\n deviceId: SwitchingDeviceInstanceId,\n outputId: SwitchableOutputId\n) => ({\n type: `N/${portalId}/${tree}/${deviceId}/SwitchableOutput/${outputId}/Settings/Type`,\n validTypes: `N/${portalId}/${tree}/${deviceId}/SwitchableOutput/${outputId}/Settings/ValidTypes`,\n status: `N/${portalId}/${tree}/${deviceId}/SwitchableOutput/${outputId}/Status`,\n name: `N/${portalId}/${tree}/${deviceId}/SwitchableOutput/${outputId}/Name`,\n customName: `N/${portalId}/${tree}/${deviceId}/SwitchableOutput/${outputId}/Settings/CustomName`,\n group: `N/${portalId}/${tree}/${deviceId}/SwitchableOutput/${outputId}/Settings/Group`,\n showUIControl: `N/${portalId}/${tree}/${deviceId}/SwitchableOutput/${outputId}/Settings/ShowUIControl`,\n auto: `N/${portalId}/${tree}/${deviceId}/SwitchableOutput/${outputId}/Auto`,\n state: `N/${portalId}/${tree}/${deviceId}/SwitchableOutput/${outputId}/State`,\n dimming: `N/${portalId}/${tree}/${deviceId}/SwitchableOutput/${outputId}/Dimming`,\n dimmingMin: `N/${portalId}/${tree}/${deviceId}/SwitchableOutput/${outputId}/Settings/DimmingMin`,\n dimmingMax: `N/${portalId}/${tree}/${deviceId}/SwitchableOutput/${outputId}/Settings/DimmingMax`,\n stepSize: `N/${portalId}/${tree}/${deviceId}/SwitchableOutput/${outputId}/Settings/StepSize`,\n measurement: `N/${portalId}/${tree}/${deviceId}/SwitchableOutput/${outputId}/Measurement`,\n unit: `N/${portalId}/${tree}/${deviceId}/SwitchableOutput/${outputId}/Settings/Unit`,\n decimals: `N/${portalId}/${tree}/${deviceId}/SwitchableOutput/${outputId}/Settings/Decimals`,\n labels: `N/${portalId}/${tree}/${deviceId}/SwitchableOutput/${outputId}/Settings/Labels`,\n lightControls: `N/${portalId}/${tree}/${deviceId}/SwitchableOutput/${outputId}/LightControls`,\n})\n\nexport const getSwitchableOutputWriteTopics = (\n portalId: PortalId,\n tree: SwitchableOutputTree,\n deviceId: SwitchingDeviceInstanceId,\n outputId: SwitchableOutputId\n) => ({\n type: `W/${portalId}/${tree}/${deviceId}/SwitchableOutput/${outputId}/Settings/Type`,\n auto: `W/${portalId}/${tree}/${deviceId}/SwitchableOutput/${outputId}/Auto`,\n state: `W/${portalId}/${tree}/${deviceId}/SwitchableOutput/${outputId}/State`,\n dimming: `W/${portalId}/${tree}/${deviceId}/SwitchableOutput/${outputId}/Dimming`,\n lightControls: `W/${portalId}/${tree}/${deviceId}/SwitchableOutput/${outputId}/LightControls`,\n})\n\nexport function useSwitchableOutput(\n tree: SwitchableOutputTree,\n deviceId: SwitchingDeviceInstanceId,\n outputId: SwitchableOutputId\n): SwitchableOutputProvider {\n const mqtt = useMqtt()\n const topics = useMemo(\n () => getSwitchableOutputStateTopics(mqtt.portalId, tree, deviceId, outputId),\n [mqtt.portalId, tree, deviceId, outputId]\n )\n const writeTopics = useMemo(\n () => getSwitchableOutputWriteTopics(mqtt.portalId, tree, deviceId, outputId),\n [mqtt.portalId, tree, deviceId, outputId]\n )\n\n const updateType = (type: SwitchableOutputType) => mqtt.publish(writeTopics.type, type)\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 const updateLightControls = (hsvwa: HSVWColorArray) =>\n mqtt.publish(writeTopics.lightControls, { raw: hsvwArrayToJSON(hsvwa) })\n\n return {\n ...useTopicsState<SwitchableOutputState>(topics),\n tree: tree,\n updateType,\n updateAuto,\n updateState,\n updateDimming,\n updateLightControls,\n }\n}\n"]}
1
+ {"version":3,"file":"SwitchableOutput.provider.js","sourceRoot":"/","sources":["src/Modules/SwitchingPane/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 {\n GenericInputStatus,\n GenericInputType,\n GenericInputValidTypesBitmask,\n SwitchableOutputStatus,\n SwitchableOutputType,\n SwitchableOutputValidTypesBitmask,\n SwitchableOutputVisibility,\n SwitchableOutputFunction,\n} from \"../../utils/constants\"\nimport { hsvwArrayToJSON, HSVWColorArray } from \"../../utils/hsvw\"\n\nexport const SWITCHABLE_OUTPUT_TREES = [\"system\", \"switch\"] as const\nexport type SwitchableOutputTree = (typeof SWITCHABLE_OUTPUT_TREES)[number]\nexport type SwitchableOutputId = string\nexport type SwitchableOutputUnit = string | \"/Speed\" | \"/Temperature\" | \"/Volume\"\n\nexport interface SwitchingPaneItemBase {\n tree: SwitchableOutputTree\n deviceId: SwitchingDeviceInstanceId\n outputId: SwitchableOutputId\n name: string\n customName: string\n group: string\n parentDeviceName: string\n showUIControl: SwitchableOutputVisibility\n validTypes: SwitchableOutputValidTypesBitmask | GenericInputValidTypesBitmask\n unit: SwitchableOutputUnit\n decimals?: number\n // NOTE: JSON encoded string array\n labels: string\n}\n\nexport interface SwitchableOutputState extends SwitchingPaneItemBase {\n kind: \"switchableOutput\"\n type: SwitchableOutputType\n status: SwitchableOutputStatus\n function?: SwitchableOutputFunction\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 lightControls: HSVWColorArray\n}\n\nexport interface GenericInputState extends SwitchingPaneItemBase {\n kind: \"genericInput\"\n type: GenericInputType\n status: GenericInputStatus\n value?: number | null\n event?: number\n primaryLabel?: string\n rangeMin?: number\n rangeMax?: number\n invert?: 0 | 1\n digitalInputMode?: number\n}\n\nexport type SwitchingPaneItem = SwitchableOutputState | GenericInputState\n\nexport interface SwitchableOutputProvider extends SwitchableOutputState {\n updateType: (type: SwitchableOutputType) => void\n updateAuto: (auto: 0 | 1) => void\n updateState: (state: 0 | 1) => void\n updateDimming: (dimming: number) => void\n updateLightControls: (hsvwa: HSVWColorArray) => void\n}\n\nexport function switchableOutputSupportsType(\n validType: SwitchableOutputValidTypesBitmask,\n type: SwitchableOutputType\n): boolean {\n return (validType & (1 << type)) !== 0\n}\n\nexport interface SwitchableOutputTopics extends Topics {\n type?: string\n validTypes?: string\n status?: string\n name?: string\n customName?: string\n group?: string\n showUIControl?: string\n function?: 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 getSwitchingPaneItemNameForDisplay = (state: SwitchingPaneItem, 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 tree: SwitchableOutputTree,\n deviceId: SwitchingDeviceInstanceId,\n outputId: SwitchableOutputId\n) => ({\n type: `N/${portalId}/${tree}/${deviceId}/SwitchableOutput/${outputId}/Settings/Type`,\n validTypes: `N/${portalId}/${tree}/${deviceId}/SwitchableOutput/${outputId}/Settings/ValidTypes`,\n status: `N/${portalId}/${tree}/${deviceId}/SwitchableOutput/${outputId}/Status`,\n name: `N/${portalId}/${tree}/${deviceId}/SwitchableOutput/${outputId}/Name`,\n customName: `N/${portalId}/${tree}/${deviceId}/SwitchableOutput/${outputId}/Settings/CustomName`,\n group: `N/${portalId}/${tree}/${deviceId}/SwitchableOutput/${outputId}/Settings/Group`,\n showUIControl: `N/${portalId}/${tree}/${deviceId}/SwitchableOutput/${outputId}/Settings/ShowUIControl`,\n function: `N/${portalId}/${tree}/${deviceId}/SwitchableOutput/${outputId}/Settings/Function`,\n auto: `N/${portalId}/${tree}/${deviceId}/SwitchableOutput/${outputId}/Auto`,\n state: `N/${portalId}/${tree}/${deviceId}/SwitchableOutput/${outputId}/State`,\n dimming: `N/${portalId}/${tree}/${deviceId}/SwitchableOutput/${outputId}/Dimming`,\n dimmingMin: `N/${portalId}/${tree}/${deviceId}/SwitchableOutput/${outputId}/Settings/DimmingMin`,\n dimmingMax: `N/${portalId}/${tree}/${deviceId}/SwitchableOutput/${outputId}/Settings/DimmingMax`,\n stepSize: `N/${portalId}/${tree}/${deviceId}/SwitchableOutput/${outputId}/Settings/StepSize`,\n measurement: `N/${portalId}/${tree}/${deviceId}/SwitchableOutput/${outputId}/Measurement`,\n unit: `N/${portalId}/${tree}/${deviceId}/SwitchableOutput/${outputId}/Settings/Unit`,\n decimals: `N/${portalId}/${tree}/${deviceId}/SwitchableOutput/${outputId}/Settings/Decimals`,\n labels: `N/${portalId}/${tree}/${deviceId}/SwitchableOutput/${outputId}/Settings/Labels`,\n lightControls: `N/${portalId}/${tree}/${deviceId}/SwitchableOutput/${outputId}/LightControls`,\n})\n\nexport const getSwitchableOutputWriteTopics = (\n portalId: PortalId,\n tree: SwitchableOutputTree,\n deviceId: SwitchingDeviceInstanceId,\n outputId: SwitchableOutputId\n) => ({\n type: `W/${portalId}/${tree}/${deviceId}/SwitchableOutput/${outputId}/Settings/Type`,\n auto: `W/${portalId}/${tree}/${deviceId}/SwitchableOutput/${outputId}/Auto`,\n state: `W/${portalId}/${tree}/${deviceId}/SwitchableOutput/${outputId}/State`,\n dimming: `W/${portalId}/${tree}/${deviceId}/SwitchableOutput/${outputId}/Dimming`,\n lightControls: `W/${portalId}/${tree}/${deviceId}/SwitchableOutput/${outputId}/LightControls`,\n})\n\nexport function useSwitchableOutput(\n tree: SwitchableOutputTree,\n deviceId: SwitchingDeviceInstanceId,\n outputId: SwitchableOutputId\n): SwitchableOutputProvider {\n const mqtt = useMqtt()\n const topics = useMemo(\n () => getSwitchableOutputStateTopics(mqtt.portalId, tree, deviceId, outputId),\n [mqtt.portalId, tree, deviceId, outputId]\n )\n const writeTopics = useMemo(\n () => getSwitchableOutputWriteTopics(mqtt.portalId, tree, deviceId, outputId),\n [mqtt.portalId, tree, deviceId, outputId]\n )\n\n const updateType = (type: SwitchableOutputType) => mqtt.publish(writeTopics.type, type)\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 const updateLightControls = (hsvwa: HSVWColorArray) =>\n mqtt.publish(writeTopics.lightControls, { raw: hsvwArrayToJSON(hsvwa) })\n\n return {\n ...useTopicsState<SwitchableOutputState>(topics),\n tree: tree,\n updateType,\n updateAuto,\n updateState,\n updateDimming,\n updateLightControls,\n }\n}\n"]}
@@ -1,2 +1,16 @@
1
+ import { SwitchingDeviceInstanceId } from "./SwitchingDevice.provider";
2
+ import { SwitchableOutputId } from "./SwitchableOutput.provider";
3
+ import { GenericInputId } from "./GenericInput.provider";
1
4
  export declare const useSwitchingPane: (gxDeviceRelaysGroupName: string) => import("./SwitchingPane.store").SwitchingPaneStore;
5
+ export declare function extractSwitchableOutputInfo(topic: string): {
6
+ tree: "system" | "switch";
7
+ deviceId: SwitchingDeviceInstanceId;
8
+ outputId: SwitchableOutputId;
9
+ };
10
+ export declare function extractGenericInputInfo(topic: string): {
11
+ tree: "system" | "switch";
12
+ deviceId: SwitchingDeviceInstanceId;
13
+ inputId: GenericInputId;
14
+ };
15
+ export declare function arraysEqual<T>(a: T[], b: T[]): boolean;
2
16
  //# sourceMappingURL=SwitchingPane.provider.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"SwitchingPane.provider.d.ts","sourceRoot":"/","sources":["src/Modules/SwitchingPane/SwitchingPane.provider.ts"],"names":[],"mappings":"AAqBA,eAAO,MAAM,gBAAgB,GAAI,yBAAyB,MAAM,uDAyR/D,CAAA"}
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;AAKpF,eAAO,MAAM,gBAAgB,GAAI,yBAAyB,MAAM,uDAyT/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"}
@@ -6,7 +6,7 @@ import { useSwitchingPaneStore } from "./SwitchingPane.store";
6
6
  import { getSwitchingDeviceStateTopics } from "./SwitchingDevice.provider";
7
7
  import { getSwitchingPaneItemNameForDisplay, getSwitchableOutputStateTopics, SWITCHABLE_OUTPUT_TREES, } from "./SwitchableOutput.provider";
8
8
  import { getGenericInputStateTopics } from "./GenericInput.provider";
9
- import { remapGenericInputType, SWITCHABLE_OUTPUT_VISIBILITY } from "../../utils/constants";
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
12
  const switchingPaneStore = useSwitchingPaneStore();
@@ -48,6 +48,10 @@ export const useSwitchingPane = (gxDeviceRelaysGroupName) => {
48
48
  const availableSwitchableOutputVisibilityFlags = availableSwitchableOutputs.map((topic) => {
49
49
  return messagesForSwitchableOutputs[`${topic.slice(0, -"/Group".length)}/ShowUIControl`];
50
50
  });
51
+ // All switchable outputs functions in array sorted by topic
52
+ const availableSwitchableOutputFunctions = availableSwitchableOutputs.map((topic) => {
53
+ return messagesForSwitchableOutputs[`${topic.slice(0, -"/Group".length)}/Function`];
54
+ });
51
55
  // All generic inputs in array sorted by topic
52
56
  const availableGenericInputs = messagesForGenericInputs
53
57
  ? Object.keys(messagesForGenericInputs)
@@ -86,75 +90,101 @@ export const useSwitchingPane = (gxDeviceRelaysGroupName) => {
86
90
  const groupAssignmentsChanged = !arraysEqual(oldAssignments, newAssignments);
87
91
  if (groupAssignmentsChanged) {
88
92
  switchingPaneStore.setCustomGroupAssignments(newAssignments);
89
- Logger.log(`Switchable outputs group assignments changed, recomputing...`);
90
93
  }
91
94
  const oldOutputTypes = switchingPaneStore.outputTypes;
92
95
  const newOutputTypes = availableSwitchableOutputTypes;
93
96
  const outputTypesChanged = !arraysEqual(oldOutputTypes, newOutputTypes);
94
97
  if (outputTypesChanged) {
95
98
  switchingPaneStore.setOutputTypes(newOutputTypes);
96
- Logger.log(`Switchable outputs types changed, recomputing...`);
97
99
  }
98
100
  const oldOutputNames = switchingPaneStore.outputNames;
99
101
  const newOutputNames = availableSwitchableOutputNames;
100
102
  const outputNamesChanged = !arraysEqual(oldOutputNames, newOutputNames);
101
103
  if (outputNamesChanged) {
102
104
  switchingPaneStore.setOutputNames(newOutputNames);
103
- Logger.log(`Switchable outputs names changed, recomputing...`);
104
105
  }
105
106
  const oldOutputVisibilityFlags = switchingPaneStore.outputVisibilityFlags;
106
107
  const newOutputVisibilityFlags = availableSwitchableOutputVisibilityFlags;
107
108
  const outputVisibilityFlagsChanged = !arraysEqual(oldOutputVisibilityFlags, newOutputVisibilityFlags);
108
109
  if (outputVisibilityFlagsChanged) {
109
110
  switchingPaneStore.setOutputVisibilityFlags(newOutputVisibilityFlags);
110
- Logger.log(`Switchable outputs visibility flags changed, recomputing...`);
111
+ }
112
+ const oldOutputFunctions = switchingPaneStore.outputFunctions;
113
+ const newOutputFunctions = availableSwitchableOutputFunctions;
114
+ const outputFunctionsChanged = !arraysEqual(oldOutputFunctions, newOutputFunctions);
115
+ if (outputFunctionsChanged) {
116
+ switchingPaneStore.setOutputFunctions(newOutputFunctions);
111
117
  }
112
118
  const oldSwitchingDevices = switchingPaneStore.switchingDevices;
113
119
  const newSwitchingDevices = availableSwitchingDevices;
114
120
  const switchingDevicesChanged = !arraysEqual(oldSwitchingDevices, newSwitchingDevices);
115
121
  if (switchingDevicesChanged) {
116
122
  switchingPaneStore.setSwitchingDevices(newSwitchingDevices);
117
- Logger.log(`Switching devices changed, recomputing...`);
118
123
  }
119
124
  const oldSwitchingDeviceNames = switchingPaneStore.switchingDeviceNames;
120
125
  const newSwitchingDeviceNames = availableSwitchingDeviceNames;
121
126
  const switchingDeviceNamesChanged = !arraysEqual(oldSwitchingDeviceNames, newSwitchingDeviceNames);
122
127
  if (switchingDeviceNamesChanged) {
123
128
  switchingPaneStore.setSwitchingDeviceNames(newSwitchingDeviceNames);
124
- Logger.log(`Switching device names changed, recomputing...`);
125
129
  }
126
130
  const oldGiAssignments = switchingPaneStore.genericInputGroupAssignments;
127
131
  const newGiAssignments = genericInputGroupAssignments;
128
132
  const giGroupAssignmentsChanged = !arraysEqual(oldGiAssignments, newGiAssignments);
129
133
  if (giGroupAssignmentsChanged) {
130
134
  switchingPaneStore.setGenericInputGroupAssignments(newGiAssignments);
131
- Logger.log(`Generic input group assignments changed, recomputing...`);
132
135
  }
133
136
  const oldGiTypes = switchingPaneStore.genericInputTypes;
134
137
  const newGiTypes = availableGenericInputTypes;
135
138
  const giTypesChanged = !arraysEqual(oldGiTypes, newGiTypes);
136
139
  if (giTypesChanged) {
137
140
  switchingPaneStore.setGenericInputTypes(newGiTypes);
138
- Logger.log(`Generic input types changed, recomputing...`);
139
141
  }
140
142
  const oldGiNames = switchingPaneStore.genericInputNames;
141
143
  const newGiNames = availableGenericInputNames;
142
144
  const giNamesChanged = !arraysEqual(oldGiNames, newGiNames);
143
145
  if (giNamesChanged) {
144
146
  switchingPaneStore.setGenericInputNames(newGiNames);
145
- Logger.log(`Generic input names changed, recomputing...`);
146
147
  }
147
148
  const oldGiVisibilityFlags = switchingPaneStore.genericInputVisibilityFlags;
148
149
  const newGiVisibilityFlags = availableGenericInputVisibilityFlags;
149
150
  const giVisibilityFlagsChanged = !arraysEqual(oldGiVisibilityFlags, newGiVisibilityFlags);
150
151
  if (giVisibilityFlagsChanged) {
151
152
  switchingPaneStore.setGenericInputVisibilityFlags(newGiVisibilityFlags);
152
- Logger.log(`Generic input visibility flags changed, recomputing...`);
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;
159
+ if (!isInitialLoad) {
160
+ if (groupAssignmentsChanged)
161
+ Logger.log(`Switchable outputs group assignments changed, recomputing...`);
162
+ if (outputTypesChanged)
163
+ Logger.log(`Switchable outputs types changed, recomputing...`);
164
+ if (outputNamesChanged)
165
+ Logger.log(`Switchable outputs names changed, recomputing...`);
166
+ if (outputVisibilityFlagsChanged)
167
+ Logger.log(`Switchable outputs visibility flags changed, recomputing...`);
168
+ if (outputFunctionsChanged)
169
+ Logger.log(`Switchable outputs functions changed, recomputing...`);
170
+ if (switchingDevicesChanged)
171
+ Logger.log(`Switching devices changed, recomputing...`);
172
+ if (switchingDeviceNamesChanged)
173
+ Logger.log(`Switching device names changed, recomputing...`);
174
+ if (giGroupAssignmentsChanged)
175
+ Logger.log(`Generic input group assignments changed, recomputing...`);
176
+ if (giTypesChanged)
177
+ Logger.log(`Generic input types changed, recomputing...`);
178
+ if (giNamesChanged)
179
+ Logger.log(`Generic input names changed, recomputing...`);
180
+ if (giVisibilityFlagsChanged)
181
+ Logger.log(`Generic input visibility flags changed, recomputing...`);
153
182
  }
154
183
  if (groupAssignmentsChanged ||
155
184
  outputTypesChanged ||
156
185
  outputNamesChanged ||
157
186
  outputVisibilityFlagsChanged ||
187
+ outputFunctionsChanged ||
158
188
  switchingDevicesChanged ||
159
189
  switchingDeviceNamesChanged ||
160
190
  giGroupAssignmentsChanged ||
@@ -174,6 +204,12 @@ export const useSwitchingPane = (gxDeviceRelaysGroupName) => {
174
204
  switchableOutput.showUIControl & SWITCHABLE_OUTPUT_VISIBILITY.VISIBLE_LOCAL_UI)) {
175
205
  return;
176
206
  }
207
+ // GX system relays: only show when Function is Manual (matching gui-v2)
208
+ if (swo.tree === "system" &&
209
+ switchableOutput.function != null &&
210
+ switchableOutput.function !== SWITCHABLE_OUTPUT_FUNCTION.MANUAL) {
211
+ return;
212
+ }
177
213
  items.push({
178
214
  groupName,
179
215
  item: Object.assign(Object.assign({}, switchableOutput), { kind: "switchableOutput", tree: swo.tree, deviceId: swo.deviceId, outputId: swo.outputId, parentDeviceName: deviceName }),
@@ -224,7 +260,7 @@ export const useSwitchingPane = (gxDeviceRelaysGroupName) => {
224
260
  ]);
225
261
  return switchingPaneStore;
226
262
  };
227
- function extractSwitchableOutputInfo(topic) {
263
+ export function extractSwitchableOutputInfo(topic) {
228
264
  var _a;
229
265
  const pattern = new RegExp(`/(${SWITCHABLE_OUTPUT_TREES.join("|")})/`);
230
266
  const match = topic.match(pattern);
@@ -236,7 +272,7 @@ function extractSwitchableOutputInfo(topic) {
236
272
  outputId: topic.substring(outputStart, topic.indexOf("/", outputStart)),
237
273
  };
238
274
  }
239
- function extractGenericInputInfo(topic) {
275
+ export function extractGenericInputInfo(topic) {
240
276
  var _a;
241
277
  const pattern = new RegExp(`/(${SWITCHABLE_OUTPUT_TREES.join("|")})/`);
242
278
  const match = topic.match(pattern);
@@ -248,7 +284,7 @@ function extractGenericInputInfo(topic) {
248
284
  inputId: topic.substring(inputStart, topic.indexOf("/", inputStart)),
249
285
  };
250
286
  }
251
- function arraysEqual(a, b) {
287
+ export function arraysEqual(a, b) {
252
288
  if (a.length !== b.length)
253
289
  return false;
254
290
  return a.every((element, index) => b[index] === element);
@@ -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 { remapGenericInputType, SWITCHABLE_OUTPUT_VISIBILITY } 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 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 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 messagesForGenericInputs[`${topic.slice(0, -\"/Group\".length)}/Type`]\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 messagesForGenericInputs[`${topic.slice(0, -\"/Group\".length)}/ShowUIInput`]\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 Logger.log(`Switchable outputs group assignments changed, recomputing...`)\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 Logger.log(`Switchable outputs types changed, recomputing...`)\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 Logger.log(`Switchable outputs names changed, recomputing...`)\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 Logger.log(`Switchable outputs visibility flags changed, recomputing...`)\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 Logger.log(`Switching devices changed, recomputing...`)\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 Logger.log(`Switching device names changed, recomputing...`)\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 Logger.log(`Generic input group assignments changed, recomputing...`)\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 Logger.log(`Generic input types changed, recomputing...`)\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 Logger.log(`Generic input names changed, recomputing...`)\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 Logger.log(`Generic input visibility flags changed, recomputing...`)\n }\n\n if (\n groupAssignmentsChanged ||\n outputTypesChanged ||\n outputNamesChanged ||\n outputVisibilityFlagsChanged ||\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 )\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 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 )\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\nfunction 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\nfunction 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\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":"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 { remapGenericInputType, SWITCHABLE_OUTPUT_FUNCTION, SWITCHABLE_OUTPUT_VISIBILITY } 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 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 // All switchable outputs functions in array sorted by topic\n const availableSwitchableOutputFunctions = availableSwitchableOutputs.map((topic) => {\n return 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 messagesForGenericInputs[`${topic.slice(0, -\"/Group\".length)}/Type`]\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 messagesForGenericInputs[`${topic.slice(0, -\"/Group\".length)}/ShowUIInput`]\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 )\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 )\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"]}
@@ -8,6 +8,7 @@ export interface SwitchingPaneState {
8
8
  outputTypes: SwitchableOutputType[];
9
9
  outputNames: string[];
10
10
  outputVisibilityFlags: (0 | 1)[];
11
+ outputFunctions: number[];
11
12
  switchingDevices: string[];
12
13
  switchingDeviceNames: string[];
13
14
  genericInputGroupAssignments: string[];
@@ -23,6 +24,7 @@ export declare class SwitchingPaneStore {
23
24
  outputTypes: SwitchableOutputType[];
24
25
  outputNames: string[];
25
26
  outputVisibilityFlags: (0 | 1)[];
27
+ outputFunctions: number[];
26
28
  switchingDevices: string[];
27
29
  switchingDeviceNames: string[];
28
30
  genericInputGroupAssignments: string[];
@@ -39,6 +41,7 @@ export declare class SwitchingPaneStore {
39
41
  setOutputTypes: (outputTypes: SwitchableOutputType[]) => SwitchableOutputType[];
40
42
  setOutputNames: (outputNames: string[]) => string[];
41
43
  setOutputVisibilityFlags: (outputVisibilityFlags: (0 | 1)[]) => (0 | 1)[];
44
+ setOutputFunctions: (outputFunctions: number[]) => number[];
42
45
  setSwitchingDevices: (switchingDevices: string[]) => string[];
43
46
  setSwitchingDeviceNames: (switchingDeviceNames: string[]) => string[];
44
47
  setGenericInputGroupAssignments: (assignments: string[]) => string[];
@@ -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,MAAM,uBAAuB,CAAA;AAI9E,MAAM,WAAW,kBAAkB;IACjC,MAAM,EAAE;QAAE,CAAC,GAAG,EAAE,MAAM,GAAG,iBAAiB,EAAE,CAAA;KAAE,CAAA;IAE9C,sBAAsB,EAAE,MAAM,EAAE,CAAA;IAEhC,WAAW,EAAE,oBAAoB,EAAE,CAAA;IAEnC,WAAW,EAAE,MAAM,EAAE,CAAA;IAErB,qBAAqB,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,CAAA;IAEhC,gBAAgB,EAAE,MAAM,EAAE,CAAA;IAE1B,oBAAoB,EAAE,MAAM,EAAE,CAAA;IAE9B,4BAA4B,EAAE,MAAM,EAAE,CAAA;IAEtC,iBAAiB,EAAE,gBAAgB,EAAE,CAAA;IAErC,iBAAiB,EAAE,MAAM,EAAE,CAAA;IAE3B,2BAA2B,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,CAAA;CACvC;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,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,CAAK;IACrC,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,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,CAAK;;IAiB3C,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,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,eAAyD;IACrH,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,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,eAA+C;CAClG;AAYD,wBAAgB,qBAAqB,uBAEpC"}
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,MAAM,uBAAuB,CAAA;AAI9E,MAAM,WAAW,kBAAkB;IACjC,MAAM,EAAE;QAAE,CAAC,GAAG,EAAE,MAAM,GAAG,iBAAiB,EAAE,CAAA;KAAE,CAAA;IAE9C,sBAAsB,EAAE,MAAM,EAAE,CAAA;IAEhC,WAAW,EAAE,oBAAoB,EAAE,CAAA;IAEnC,WAAW,EAAE,MAAM,EAAE,CAAA;IAErB,qBAAqB,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,CAAA;IAEhC,eAAe,EAAE,MAAM,EAAE,CAAA;IAEzB,gBAAgB,EAAE,MAAM,EAAE,CAAA;IAE1B,oBAAoB,EAAE,MAAM,EAAE,CAAA;IAE9B,4BAA4B,EAAE,MAAM,EAAE,CAAA;IAEtC,iBAAiB,EAAE,gBAAgB,EAAE,CAAA;IAErC,iBAAiB,EAAE,MAAM,EAAE,CAAA;IAE3B,2BAA2B,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,CAAA;CACvC;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,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,CAAK;IACrC,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,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,CAAK;;IAkB3C,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,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,eAAyD;IACrH,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,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,eAA+C;CAClG;AAYD,wBAAgB,qBAAqB,uBAEpC"}
@@ -33,6 +33,12 @@ export class SwitchingPaneStore {
33
33
  writable: true,
34
34
  value: []
35
35
  });
36
+ Object.defineProperty(this, "outputFunctions", {
37
+ enumerable: true,
38
+ configurable: true,
39
+ writable: true,
40
+ value: []
41
+ });
36
42
  Object.defineProperty(this, "switchingDevices", {
37
43
  enumerable: true,
38
44
  configurable: true,
@@ -99,6 +105,12 @@ export class SwitchingPaneStore {
99
105
  writable: true,
100
106
  value: (outputVisibilityFlags) => (this.outputVisibilityFlags = outputVisibilityFlags)
101
107
  });
108
+ Object.defineProperty(this, "setOutputFunctions", {
109
+ enumerable: true,
110
+ configurable: true,
111
+ writable: true,
112
+ value: (outputFunctions) => (this.outputFunctions = outputFunctions)
113
+ });
102
114
  Object.defineProperty(this, "setSwitchingDevices", {
103
115
  enumerable: true,
104
116
  configurable: true,
@@ -140,6 +152,7 @@ export class SwitchingPaneStore {
140
152
  setCustomGroupAssignments: action,
141
153
  setOutputTypes: action,
142
154
  setOutputVisibilityFlags: action,
155
+ setOutputFunctions: action,
143
156
  setSwitchingDevices: action,
144
157
  setSwitchingDeviceNames: action,
145
158
  setGenericInputGroupAssignments: action,
@@ -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;AA0B7B,MAAM,OAAO,kBAAkB;IAa7B;QAZA;;;;mBAAiD,EAAE;WAAA;QACnD;;;;mBAAmC,EAAE;WAAA;QACrC;;;;mBAAsC,EAAE;WAAA;QACxC;;;;mBAAwB,EAAE;WAAA;QAC1B;;;;mBAAmC,EAAE;WAAA;QACrC;;;;mBAA6B,EAAE;WAAA;QAC/B;;;;mBAAiC,EAAE;WAAA;QACnC;;;;mBAAyC,EAAE;WAAA;QAC3C;;;;mBAAwC,EAAE;WAAA;QAC1C;;;;mBAA8B,EAAE;WAAA;QAChC;;;;mBAAyC,EAAE;WAAA;QAiB3C;;;;mBAAY,CAAC,MAA8C,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;WAAA;QACtF;;;;mBAA4B,CAAC,WAAqB,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,sBAAsB,GAAG,WAAW,CAAC;WAAA;QAClG;;;;mBAAiB,CAAC,WAAmC,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,WAAW,GAAG,WAAW,CAAC;WAAA;QAC1F;;;;mBAAiB,CAAC,WAAqB,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,WAAW,GAAG,WAAW,CAAC;WAAA;QAC5E;;;;mBAA2B,CAAC,qBAAgC,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,qBAAqB,GAAG,qBAAqB,CAAC;WAAA;QACrH;;;;mBAAsB,CAAC,gBAA0B,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,gBAAgB,GAAG,gBAAgB,CAAC;WAAA;QAChG;;;;mBAA0B,CAAC,oBAA8B,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,oBAAoB,GAAG,oBAAoB,CAAC;WAAA;QAChH;;;;mBAAkC,CAAC,WAAqB,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,4BAA4B,GAAG,WAAW,CAAC;WAAA;QAC9G;;;;mBAAuB,CAAC,KAAyB,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,iBAAiB,GAAG,KAAK,CAAC;WAAA;QACtF;;;;mBAAuB,CAAC,KAAe,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,iBAAiB,GAAG,KAAK,CAAC;WAAA;QAC5E;;;;mBAAiC,CAAC,KAAgB,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,2BAA2B,GAAG,KAAK,CAAC;WAAA;QAxB/F,kBAAkB,CAAC,IAAI,EAAE;YACvB,SAAS,EAAE,MAAM;YACjB,yBAAyB,EAAE,MAAM;YACjC,cAAc,EAAE,MAAM;YACtB,wBAAwB,EAAE,MAAM;YAChC,mBAAmB,EAAE,MAAM;YAC3B,uBAAuB,EAAE,MAAM;YAC/B,+BAA+B,EAAE,MAAM;YACvC,oBAAoB,EAAE,MAAM;YAC5B,oBAAoB,EAAE,MAAM;YAC5B,8BAA8B,EAAE,MAAM;SACvC,CAAC,CAAA;IACJ,CAAC;CAaF;AAED,SAAS,eAAe;IACtB,MAAM,MAAM,GAAG,KAAK,aAAL,KAAK,cAAL,KAAK,GAAI,IAAI,kBAAkB,EAAE,CAAA;IAChD,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,qBAAqB;IACnC,OAAO,OAAO,CAAC,GAAG,EAAE,CAAC,eAAe,EAAE,EAAE,EAAE,CAAC,CAAA;AAC7C,CAAC","sourcesContent":["import { action, makeAutoObservable } from \"mobx\"\nimport { useMemo } from \"react\"\nimport { SwitchingPaneItem } from \"./SwitchableOutput.provider\"\nimport { GenericInputType, SwitchableOutputType } from \"../../utils/constants\"\n\nlet store: SwitchingPaneStore\n\nexport interface SwitchingPaneState {\n groups: { [key: string]: SwitchingPaneItem[] }\n // custom group assignments for available switchable outputs sorted by their topic path\n customGroupAssignments: string[]\n // types of switchable outputs sorted by their topic path\n outputTypes: SwitchableOutputType[]\n // custom names of switchable outputs sorted by their topic path\n outputNames: string[]\n // visibility status of switchable outputs sorted by their topic path\n outputVisibilityFlags: (0 | 1)[]\n // switching devices\n switchingDevices: string[]\n // switching devices custom names\n switchingDeviceNames: string[]\n // custom group assignments for available generic inputs sorted by their topic path\n genericInputGroupAssignments: string[]\n // types of generic inputs sorted by their topic path\n genericInputTypes: GenericInputType[]\n // custom names of generic inputs sorted by their topic path\n genericInputNames: string[]\n // visibility status of generic inputs sorted by their topic path\n genericInputVisibilityFlags: (0 | 1)[]\n}\n\nexport class SwitchingPaneStore {\n groups: { [key: string]: SwitchingPaneItem[] } = {}\n customGroupAssignments: string[] = []\n outputTypes: SwitchableOutputType[] = []\n outputNames: string[] = []\n outputVisibilityFlags: (0 | 1)[] = []\n switchingDevices: string[] = []\n switchingDeviceNames: string[] = []\n genericInputGroupAssignments: string[] = []\n genericInputTypes: GenericInputType[] = []\n genericInputNames: string[] = []\n genericInputVisibilityFlags: (0 | 1)[] = []\n\n constructor() {\n makeAutoObservable(this, {\n setGroups: action,\n setCustomGroupAssignments: action,\n setOutputTypes: action,\n setOutputVisibilityFlags: 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: (0 | 1)[]) => (this.outputVisibilityFlags = outputVisibilityFlags)\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: (0 | 1)[]) => (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"]}
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 } from \"../../utils/constants\"\n\nlet store: SwitchingPaneStore\n\nexport interface SwitchingPaneState {\n groups: { [key: string]: SwitchingPaneItem[] }\n // custom group assignments for available switchable outputs sorted by their topic path\n customGroupAssignments: string[]\n // types of switchable outputs sorted by their topic path\n outputTypes: SwitchableOutputType[]\n // custom names of switchable outputs sorted by their topic path\n outputNames: string[]\n // visibility status of switchable outputs sorted by their topic path\n outputVisibilityFlags: (0 | 1)[]\n // function of switchable outputs sorted by their topic path\n outputFunctions: number[]\n // switching devices\n switchingDevices: string[]\n // switching devices custom names\n switchingDeviceNames: string[]\n // custom group assignments for available generic inputs sorted by their topic path\n genericInputGroupAssignments: string[]\n // types of generic inputs sorted by their topic path\n genericInputTypes: GenericInputType[]\n // custom names of generic inputs sorted by their topic path\n genericInputNames: string[]\n // visibility status of generic inputs sorted by their topic path\n genericInputVisibilityFlags: (0 | 1)[]\n}\n\nexport class SwitchingPaneStore {\n groups: { [key: string]: SwitchingPaneItem[] } = {}\n customGroupAssignments: string[] = []\n outputTypes: SwitchableOutputType[] = []\n outputNames: string[] = []\n outputVisibilityFlags: (0 | 1)[] = []\n outputFunctions: number[] = []\n switchingDevices: string[] = []\n switchingDeviceNames: string[] = []\n genericInputGroupAssignments: string[] = []\n genericInputTypes: GenericInputType[] = []\n genericInputNames: string[] = []\n genericInputVisibilityFlags: (0 | 1)[] = []\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: (0 | 1)[]) => (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: (0 | 1)[]) => (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"]}
@@ -155,6 +155,10 @@ export declare const SWITCHABLE_OUTPUT_VISIBILITY: {
155
155
  readonly VISIBLE_REMOTE_UI: number;
156
156
  };
157
157
  export type SwitchableOutputVisibility = (typeof SWITCHABLE_OUTPUT_VISIBILITY)[keyof typeof SWITCHABLE_OUTPUT_VISIBILITY];
158
+ export declare const SWITCHABLE_OUTPUT_FUNCTION: {
159
+ readonly MANUAL: 2;
160
+ };
161
+ export type SwitchableOutputFunction = (typeof SWITCHABLE_OUTPUT_FUNCTION)[keyof typeof SWITCHABLE_OUTPUT_FUNCTION];
158
162
  export declare const GENERIC_INPUT_TYPE_OFFSET = 100;
159
163
  export declare const GENERIC_INPUT_TYPE: {
160
164
  readonly DISCRETE: 100;
@@ -1 +1 @@
1
- {"version":3,"file":"constants.d.ts","sourceRoot":"/","sources":["src/utils/constants.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,aAAa;;;;CAIzB,CAAA;AAED,eAAO,MAAM,sBAAsB;;CAElC,CAAA;AAGD,eAAO,MAAM,WAAW;;;;;;;;;;;;;;;CAevB,CAAA;AAGD,eAAO,MAAM,YAAY;;;;;;;;;;;;;;;;;;CAkBxB,CAAA;AAGD,eAAO,MAAM,aAAa;;;;;;;;;;;;CAYzB,CAAA;AAED,eAAO,MAAM,SAAS;;;;;;CAMrB,CAAA;AAED,eAAO,MAAM,cAAc;;;;;CAK1B,CAAA;AAED,eAAO,MAAM,YAAY;;;;CAIxB,CAAA;AAED,eAAO,MAAM,WAAW;;;;;CAKvB,CAAA;AAED,eAAO,MAAM,YAAY;;;CAGxB,CAAA;AAED,eAAO,MAAM,aAAa;;;;;CAKzB,CAAA;AAED,eAAO,MAAM,+BAA+B,QAAQ,CAAA;AAEpD,eAAO,MAAM,8BAA8B;;;CAG1C,CAAA;AAED,eAAO,MAAM,cAAc;;CAE1B,CAAA;AAED,eAAO,MAAM,oBAAoB;;;;;CAKhC,CAAA;AAGD,eAAO,MAAM,eAAe;;;;;;;;;;;;;CAa3B,CAAA;AAGD,eAAO,MAAM,sBAAsB;;;;;;;;;;;;;;;CAezB,CAAA;AAEV,MAAM,MAAM,oBAAoB,GAAG,CAAC,OAAO,sBAAsB,CAAC,CAAC,MAAM,OAAO,sBAAsB,CAAC,CAAA;AAEvG,eAAO,MAAM,qCAAqC,EAE7C,GAAG,CAAC,IAAI,MAAM,OAAO,sBAAsB,GAAG,MAAM,GAAE,CAAA;AAE3D,MAAM,MAAM,iCAAiC,GAC3C,CAAC,OAAO,qCAAqC,CAAC,CAAC,MAAM,OAAO,qCAAqC,CAAC,CAAA;AAGpG,eAAO,MAAM,wBAAwB;;;;;;;;;;;CAW3B,CAAA;AAEV,MAAM,MAAM,sBAAsB,GAAG,CAAC,OAAO,wBAAwB,CAAC,CAAC,MAAM,OAAO,wBAAwB,CAAC,CAAA;AAG7G,eAAO,MAAM,4BAA4B;;;;;CAK/B,CAAA;AAEV,MAAM,MAAM,0BAA0B,GACpC,CAAC,OAAO,4BAA4B,CAAC,CAAC,MAAM,OAAO,4BAA4B,CAAC,CAAA;AAGlF,eAAO,MAAM,yBAAyB,MAAM,CAAA;AAE5C,eAAO,MAAM,kBAAkB;;;;;CAKrB,CAAA;AAEV,MAAM,MAAM,gBAAgB,GAAG,CAAC,OAAO,kBAAkB,CAAC,CAAC,MAAM,OAAO,kBAAkB,CAAC,CAAA;AAE3F,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,MAAM,GAAG,gBAAgB,CAEvE;AAED,eAAO,MAAM,iCAAiC,EAEzC,GAAG,CAAC,IAAI,MAAM,OAAO,kBAAkB,GAAG,MAAM,GAAE,CAAA;AAEvD,MAAM,MAAM,6BAA6B,GACvC,CAAC,OAAO,iCAAiC,CAAC,CAAC,MAAM,OAAO,iCAAiC,CAAC,CAAA;AAG5F,eAAO,MAAM,oBAAoB;;;;CAIvB,CAAA;AAEV,MAAM,MAAM,kBAAkB,GAAG,CAAC,OAAO,oBAAoB,CAAC,CAAC,MAAM,OAAO,oBAAoB,CAAC,CAAA;AAEjG,eAAO,MAAM,KAAK;;;;;;;CAOjB,CAAA"}
1
+ {"version":3,"file":"constants.d.ts","sourceRoot":"/","sources":["src/utils/constants.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,aAAa;;;;CAIzB,CAAA;AAED,eAAO,MAAM,sBAAsB;;CAElC,CAAA;AAGD,eAAO,MAAM,WAAW;;;;;;;;;;;;;;;CAevB,CAAA;AAGD,eAAO,MAAM,YAAY;;;;;;;;;;;;;;;;;;CAkBxB,CAAA;AAGD,eAAO,MAAM,aAAa;;;;;;;;;;;;CAYzB,CAAA;AAED,eAAO,MAAM,SAAS;;;;;;CAMrB,CAAA;AAED,eAAO,MAAM,cAAc;;;;;CAK1B,CAAA;AAED,eAAO,MAAM,YAAY;;;;CAIxB,CAAA;AAED,eAAO,MAAM,WAAW;;;;;CAKvB,CAAA;AAED,eAAO,MAAM,YAAY;;;CAGxB,CAAA;AAED,eAAO,MAAM,aAAa;;;;;CAKzB,CAAA;AAED,eAAO,MAAM,+BAA+B,QAAQ,CAAA;AAEpD,eAAO,MAAM,8BAA8B;;;CAG1C,CAAA;AAED,eAAO,MAAM,cAAc;;CAE1B,CAAA;AAED,eAAO,MAAM,oBAAoB;;;;;CAKhC,CAAA;AAGD,eAAO,MAAM,eAAe;;;;;;;;;;;;;CAa3B,CAAA;AAGD,eAAO,MAAM,sBAAsB;;;;;;;;;;;;;;;CAezB,CAAA;AAEV,MAAM,MAAM,oBAAoB,GAAG,CAAC,OAAO,sBAAsB,CAAC,CAAC,MAAM,OAAO,sBAAsB,CAAC,CAAA;AAEvG,eAAO,MAAM,qCAAqC,EAE7C,GAAG,CAAC,IAAI,MAAM,OAAO,sBAAsB,GAAG,MAAM,GAAE,CAAA;AAE3D,MAAM,MAAM,iCAAiC,GAC3C,CAAC,OAAO,qCAAqC,CAAC,CAAC,MAAM,OAAO,qCAAqC,CAAC,CAAA;AAGpG,eAAO,MAAM,wBAAwB;;;;;;;;;;;CAW3B,CAAA;AAEV,MAAM,MAAM,sBAAsB,GAAG,CAAC,OAAO,wBAAwB,CAAC,CAAC,MAAM,OAAO,wBAAwB,CAAC,CAAA;AAG7G,eAAO,MAAM,4BAA4B;;;;;CAK/B,CAAA;AAEV,MAAM,MAAM,0BAA0B,GACpC,CAAC,OAAO,4BAA4B,CAAC,CAAC,MAAM,OAAO,4BAA4B,CAAC,CAAA;AAGlF,eAAO,MAAM,0BAA0B;;CAE7B,CAAA;AAEV,MAAM,MAAM,wBAAwB,GAAG,CAAC,OAAO,0BAA0B,CAAC,CAAC,MAAM,OAAO,0BAA0B,CAAC,CAAA;AAGnH,eAAO,MAAM,yBAAyB,MAAM,CAAA;AAE5C,eAAO,MAAM,kBAAkB;;;;;CAKrB,CAAA;AAEV,MAAM,MAAM,gBAAgB,GAAG,CAAC,OAAO,kBAAkB,CAAC,CAAC,MAAM,OAAO,kBAAkB,CAAC,CAAA;AAE3F,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,MAAM,GAAG,gBAAgB,CAEvE;AAED,eAAO,MAAM,iCAAiC,EAEzC,GAAG,CAAC,IAAI,MAAM,OAAO,kBAAkB,GAAG,MAAM,GAAE,CAAA;AAEvD,MAAM,MAAM,6BAA6B,GACvC,CAAC,OAAO,iCAAiC,CAAC,CAAC,MAAM,OAAO,iCAAiC,CAAC,CAAA;AAG5F,eAAO,MAAM,oBAAoB;;;;CAIvB,CAAA;AAEV,MAAM,MAAM,kBAAkB,GAAG,CAAC,OAAO,oBAAoB,CAAC,CAAC,MAAM,OAAO,oBAAoB,CAAC,CAAA;AAEjG,eAAO,MAAM,KAAK;;;;;;;CAOjB,CAAA"}
@@ -158,6 +158,10 @@ export const SWITCHABLE_OUTPUT_VISIBILITY = {
158
158
  VISIBLE_LOCAL_UI: 1 << 1,
159
159
  VISIBLE_REMOTE_UI: 1 << 2,
160
160
  };
161
+ // Taken from: https://github.com/victronenergy/venus/wiki/dbus#switch
162
+ export const SWITCHABLE_OUTPUT_FUNCTION = {
163
+ MANUAL: 2,
164
+ };
161
165
  // Taken from: https://github.com/victronenergy/venus/wiki/dbus#generic-input-api
162
166
  export const GENERIC_INPUT_TYPE_OFFSET = 100;
163
167
  export const GENERIC_INPUT_TYPE = {
@@ -1 +1 @@
1
- {"version":3,"file":"constants.js","sourceRoot":"/","sources":["src/utils/constants.ts"],"names":[],"mappings":"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","sourcesContent":["export const BATTERY_STATE = {\n IDLE: 0,\n CHARGING: 1,\n DISCHARGING: 2,\n}\n\nexport const DC_SOURCE_MONITOR_MODE = {\n WIND_GENERATOR: -8,\n}\n\n// Taken from: https://github.com/victronenergy/venus/wiki/dbus#vebus\nexport const VEBUS_STATE = {\n OFF: 0,\n LOW_POWER: 1,\n FAULT_CONDITION: 2,\n BULK_CHARGING: 3,\n ABSORPTION_CHARGING: 4,\n FLOAT_CHARGING: 5,\n STORAGE_MODE: 6,\n EQUALISATION_CHARGING: 7,\n PASSTHRU: 8,\n INVERTING: 9,\n ASSISTING: 10,\n POWER_SUPPLY_MODE: 11,\n SUSTAIN: 244,\n EXTERNAL_CONTROL: 252,\n}\n\n// Taken from: https://github.com/victronenergy/venus/wiki/dbus#system\nexport const SYSTEM_STATE = {\n OFF: 0,\n LOW_POWER: 1,\n FAULT_CONDITION: 2,\n BULK_CHARGING: 3,\n ABSORPTION_CHARGING: 4,\n FLOAT_CHARGING: 5,\n STORAGE_MODE: 6,\n EQUALISATION_CHARGING: 7,\n PASSTHRU: 8,\n INVERTING: 9,\n ASSISTING: 10,\n SUSTAIN: 244,\n EXTERNAL_CONTROL: 252,\n DISCHARGING: 256,\n ESS_SUSTAIN: 257,\n RECHARGE: 258,\n SCHEDULED_RECHARGE: 259,\n}\n\n// Taken from: https://github.com/victronenergy/venus/wiki/dbus#charger\nexport const CHARGER_STATE = {\n OFF: 0,\n FAULT_CONDITION: 2,\n BULK_CHARGING: 3,\n ABSORPTION_CHARGING: 4,\n FLOAT_CHARGING: 5,\n STORAGE_MODE: 6,\n EQUALISATION_CHARGING: 7,\n POWER_SUPPLY_MODE: 11,\n REPEATED_ABSORPTION: 246,\n AUTO_EQUALIZE: 247,\n BATTERY_SAFE: 248,\n}\n\nexport const AC_SOURCE = {\n NOT_AVAILABLE: 0,\n GRID: 1,\n GENSET: 2,\n SHORE: 3,\n INVERTING_ISLAND_MODE: 240,\n}\n\nexport const AC_SOURCE_TYPE = {\n NOT_IN_USE: 0,\n GRID: 1,\n GENERATOR: 2,\n SHORE: 3,\n}\n\nexport const ACTIVE_INPUT = {\n INPUT_0: 0,\n INPUT_1: 1,\n NONE: 240, // Inverting\n}\n\nexport const SYSTEM_MODE = {\n CHARGER_ONLY: 1,\n INVERTER_ONLY: 2,\n ON: 3,\n OFF: 4,\n}\n\nexport const CHARGER_MODE = {\n OFF: 4,\n ON: 1,\n}\n\nexport const INVERTER_MODE = {\n ON: 2,\n VEBUS_ON: 3, // Vebus inverters use mode 3 in stead of 2 for ON.\n OFF: 4,\n ECO: 5,\n}\n\nexport const FISCHER_PANDA_GENSET_PRODUCT_ID = 45120 /// 0xB040 VE_PROD_ID_FISCHER_PANDA_GENSET\n\nexport const FISCHER_PANDA_GENSET_AUTOSTART = {\n DISABLED: 0,\n ENABLED: 1,\n}\n\nexport const RELAY_FUNCTION = {\n GENERATOR_START_STOP: 1,\n}\n\nexport const GENERATOR_START_STOP = {\n STOP: 0,\n START: 1,\n AUTO_ON: 1,\n AUTO_OFF: 0,\n}\n\n// Taken from: https://github.com/victronenergy/venus/wiki/dbus#tank-levels\nexport const TANK_FLUID_TYPE = {\n FUEL: 0,\n FRESH_WATER: 1,\n WASTE_WATER: 2,\n LIVE_WELL: 3,\n OIL: 4,\n BLACK_WATER: 5,\n GASOLINE: 6,\n DIESEL: 7,\n LPG: 8,\n LNG: 9,\n HYDRAULIC_OIL: 10,\n RAW_WATER: 11,\n}\n\n// Taken from: https://github.com/victronenergy/venus/wiki/dbus#switch\nexport const SWITCHABLE_OUTPUT_TYPE = {\n MOMENTARY_SWITCH: 0,\n TOGGLE_SWITCH: 1,\n DIMMABLE: 2,\n TEMPERATURE_SETPOINT: 3,\n STEPPED_SWITCH: 4,\n SLAVE_MODE: 5,\n DROPDOWN: 6,\n SLIDER: 7,\n UNRANGED_SETPOINT: 8,\n THREE_STATE_SWITCH: 9,\n BILGE_PUMP_CONTROL: 10,\n RGB_COLOR_WHEEL: 11,\n CCT_COLOR_WHEEL: 12,\n RGBW_COLOR_WHEEL: 13,\n} as const\n\nexport type SwitchableOutputType = (typeof SWITCHABLE_OUTPUT_TYPE)[keyof typeof SWITCHABLE_OUTPUT_TYPE]\n\nexport const SWITCHABLE_OUTPUT_VALID_TYPES_BITMASK = Object.fromEntries(\n Object.entries(SWITCHABLE_OUTPUT_TYPE).map(([key, value]) => [key, 1 << value])\n) as { [K in keyof typeof SWITCHABLE_OUTPUT_TYPE]: number }\n\nexport type SwitchableOutputValidTypesBitmask =\n (typeof SWITCHABLE_OUTPUT_VALID_TYPES_BITMASK)[keyof typeof SWITCHABLE_OUTPUT_VALID_TYPES_BITMASK]\n\n// Taken from: https://github.com/victronenergy/venus/wiki/dbus#switch\nexport const SWITCHABLE_OUTPUT_STATUS = {\n STATUS_OFF: 0x00,\n STATUS_ON: 0x09,\n STATUS_POWERED: 0x01,\n STATUS_TRIPPED: 0x02,\n STATUS_OVER_TEMPERATURE: 0x04,\n STATUS_OUTPUT_FAULT: 0x08,\n STATUS_SHORT_FAULT: 0x10,\n STATUS_DISABLED: 0x20,\n STATUS_BYPASSED: 0x40,\n STATUS_EXT_CONTROL: 0x80,\n} as const\n\nexport type SwitchableOutputStatus = (typeof SWITCHABLE_OUTPUT_STATUS)[keyof typeof SWITCHABLE_OUTPUT_STATUS]\n\n// Taken from: https://github.com/victronenergy/venus/wiki/dbus#switch\nexport const SWITCHABLE_OUTPUT_VISIBILITY = {\n INVISIBLE: 0,\n VISIBLE: 1,\n VISIBLE_LOCAL_UI: 1 << 1,\n VISIBLE_REMOTE_UI: 1 << 2,\n} as const\n\nexport type SwitchableOutputVisibility =\n (typeof SWITCHABLE_OUTPUT_VISIBILITY)[keyof typeof SWITCHABLE_OUTPUT_VISIBILITY]\n\n// Taken from: https://github.com/victronenergy/venus/wiki/dbus#generic-input-api\nexport const GENERIC_INPUT_TYPE_OFFSET = 100\n\nexport const GENERIC_INPUT_TYPE = {\n DISCRETE: 100,\n VALUE_NO_RANGE: 101,\n VALUE_WITH_RANGE: 102,\n TEMPERATURE: 103,\n} as const\n\nexport type GenericInputType = (typeof GENERIC_INPUT_TYPE)[keyof typeof GENERIC_INPUT_TYPE]\n\nexport function remapGenericInputType(rawType: number): GenericInputType {\n return (rawType + GENERIC_INPUT_TYPE_OFFSET) as GenericInputType\n}\n\nexport const GENERIC_INPUT_VALID_TYPES_BITMASK = Object.fromEntries(\n Object.entries(GENERIC_INPUT_TYPE).map(([key, value]) => [key, 1 << (value - GENERIC_INPUT_TYPE_OFFSET)])\n) as { [K in keyof typeof GENERIC_INPUT_TYPE]: number }\n\nexport type GenericInputValidTypesBitmask =\n (typeof GENERIC_INPUT_VALID_TYPES_BITMASK)[keyof typeof GENERIC_INPUT_VALID_TYPES_BITMASK]\n\n// Taken from: https://github.com/victronenergy/venus/wiki/dbus#generic-input-api\nexport const GENERIC_INPUT_STATUS = {\n OK: 0x00,\n FAULT: 0x01,\n BATTERY_LOW: 0x02,\n} as const\n\nexport type GenericInputStatus = (typeof GENERIC_INPUT_STATUS)[keyof typeof GENERIC_INPUT_STATUS]\n\nexport const VIEWS = {\n CONNECTING: \"CONNECTING\",\n METRICS: \"METRICS\",\n INVERTER_CHARGER_INPUT_LIMIT_SELECTOR: \"INVERTER_CHARGER_INPUT_LIMIT_SELECTOR\",\n REMOTE_CONSOLE: \"REMOTE_CONSOLE\",\n MQTT_UNAVAILABLE: \"MQTT_UNAVAILABLE\",\n ERROR: \"ERROR\",\n}\n"]}
1
+ {"version":3,"file":"constants.js","sourceRoot":"/","sources":["src/utils/constants.ts"],"names":[],"mappings":"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","sourcesContent":["export const BATTERY_STATE = {\n IDLE: 0,\n CHARGING: 1,\n DISCHARGING: 2,\n}\n\nexport const DC_SOURCE_MONITOR_MODE = {\n WIND_GENERATOR: -8,\n}\n\n// Taken from: https://github.com/victronenergy/venus/wiki/dbus#vebus\nexport const VEBUS_STATE = {\n OFF: 0,\n LOW_POWER: 1,\n FAULT_CONDITION: 2,\n BULK_CHARGING: 3,\n ABSORPTION_CHARGING: 4,\n FLOAT_CHARGING: 5,\n STORAGE_MODE: 6,\n EQUALISATION_CHARGING: 7,\n PASSTHRU: 8,\n INVERTING: 9,\n ASSISTING: 10,\n POWER_SUPPLY_MODE: 11,\n SUSTAIN: 244,\n EXTERNAL_CONTROL: 252,\n}\n\n// Taken from: https://github.com/victronenergy/venus/wiki/dbus#system\nexport const SYSTEM_STATE = {\n OFF: 0,\n LOW_POWER: 1,\n FAULT_CONDITION: 2,\n BULK_CHARGING: 3,\n ABSORPTION_CHARGING: 4,\n FLOAT_CHARGING: 5,\n STORAGE_MODE: 6,\n EQUALISATION_CHARGING: 7,\n PASSTHRU: 8,\n INVERTING: 9,\n ASSISTING: 10,\n SUSTAIN: 244,\n EXTERNAL_CONTROL: 252,\n DISCHARGING: 256,\n ESS_SUSTAIN: 257,\n RECHARGE: 258,\n SCHEDULED_RECHARGE: 259,\n}\n\n// Taken from: https://github.com/victronenergy/venus/wiki/dbus#charger\nexport const CHARGER_STATE = {\n OFF: 0,\n FAULT_CONDITION: 2,\n BULK_CHARGING: 3,\n ABSORPTION_CHARGING: 4,\n FLOAT_CHARGING: 5,\n STORAGE_MODE: 6,\n EQUALISATION_CHARGING: 7,\n POWER_SUPPLY_MODE: 11,\n REPEATED_ABSORPTION: 246,\n AUTO_EQUALIZE: 247,\n BATTERY_SAFE: 248,\n}\n\nexport const AC_SOURCE = {\n NOT_AVAILABLE: 0,\n GRID: 1,\n GENSET: 2,\n SHORE: 3,\n INVERTING_ISLAND_MODE: 240,\n}\n\nexport const AC_SOURCE_TYPE = {\n NOT_IN_USE: 0,\n GRID: 1,\n GENERATOR: 2,\n SHORE: 3,\n}\n\nexport const ACTIVE_INPUT = {\n INPUT_0: 0,\n INPUT_1: 1,\n NONE: 240, // Inverting\n}\n\nexport const SYSTEM_MODE = {\n CHARGER_ONLY: 1,\n INVERTER_ONLY: 2,\n ON: 3,\n OFF: 4,\n}\n\nexport const CHARGER_MODE = {\n OFF: 4,\n ON: 1,\n}\n\nexport const INVERTER_MODE = {\n ON: 2,\n VEBUS_ON: 3, // Vebus inverters use mode 3 in stead of 2 for ON.\n OFF: 4,\n ECO: 5,\n}\n\nexport const FISCHER_PANDA_GENSET_PRODUCT_ID = 45120 /// 0xB040 VE_PROD_ID_FISCHER_PANDA_GENSET\n\nexport const FISCHER_PANDA_GENSET_AUTOSTART = {\n DISABLED: 0,\n ENABLED: 1,\n}\n\nexport const RELAY_FUNCTION = {\n GENERATOR_START_STOP: 1,\n}\n\nexport const GENERATOR_START_STOP = {\n STOP: 0,\n START: 1,\n AUTO_ON: 1,\n AUTO_OFF: 0,\n}\n\n// Taken from: https://github.com/victronenergy/venus/wiki/dbus#tank-levels\nexport const TANK_FLUID_TYPE = {\n FUEL: 0,\n FRESH_WATER: 1,\n WASTE_WATER: 2,\n LIVE_WELL: 3,\n OIL: 4,\n BLACK_WATER: 5,\n GASOLINE: 6,\n DIESEL: 7,\n LPG: 8,\n LNG: 9,\n HYDRAULIC_OIL: 10,\n RAW_WATER: 11,\n}\n\n// Taken from: https://github.com/victronenergy/venus/wiki/dbus#switch\nexport const SWITCHABLE_OUTPUT_TYPE = {\n MOMENTARY_SWITCH: 0,\n TOGGLE_SWITCH: 1,\n DIMMABLE: 2,\n TEMPERATURE_SETPOINT: 3,\n STEPPED_SWITCH: 4,\n SLAVE_MODE: 5,\n DROPDOWN: 6,\n SLIDER: 7,\n UNRANGED_SETPOINT: 8,\n THREE_STATE_SWITCH: 9,\n BILGE_PUMP_CONTROL: 10,\n RGB_COLOR_WHEEL: 11,\n CCT_COLOR_WHEEL: 12,\n RGBW_COLOR_WHEEL: 13,\n} as const\n\nexport type SwitchableOutputType = (typeof SWITCHABLE_OUTPUT_TYPE)[keyof typeof SWITCHABLE_OUTPUT_TYPE]\n\nexport const SWITCHABLE_OUTPUT_VALID_TYPES_BITMASK = Object.fromEntries(\n Object.entries(SWITCHABLE_OUTPUT_TYPE).map(([key, value]) => [key, 1 << value])\n) as { [K in keyof typeof SWITCHABLE_OUTPUT_TYPE]: number }\n\nexport type SwitchableOutputValidTypesBitmask =\n (typeof SWITCHABLE_OUTPUT_VALID_TYPES_BITMASK)[keyof typeof SWITCHABLE_OUTPUT_VALID_TYPES_BITMASK]\n\n// Taken from: https://github.com/victronenergy/venus/wiki/dbus#switch\nexport const SWITCHABLE_OUTPUT_STATUS = {\n STATUS_OFF: 0x00,\n STATUS_ON: 0x09,\n STATUS_POWERED: 0x01,\n STATUS_TRIPPED: 0x02,\n STATUS_OVER_TEMPERATURE: 0x04,\n STATUS_OUTPUT_FAULT: 0x08,\n STATUS_SHORT_FAULT: 0x10,\n STATUS_DISABLED: 0x20,\n STATUS_BYPASSED: 0x40,\n STATUS_EXT_CONTROL: 0x80,\n} as const\n\nexport type SwitchableOutputStatus = (typeof SWITCHABLE_OUTPUT_STATUS)[keyof typeof SWITCHABLE_OUTPUT_STATUS]\n\n// Taken from: https://github.com/victronenergy/venus/wiki/dbus#switch\nexport const SWITCHABLE_OUTPUT_VISIBILITY = {\n INVISIBLE: 0,\n VISIBLE: 1,\n VISIBLE_LOCAL_UI: 1 << 1,\n VISIBLE_REMOTE_UI: 1 << 2,\n} as const\n\nexport type SwitchableOutputVisibility =\n (typeof SWITCHABLE_OUTPUT_VISIBILITY)[keyof typeof SWITCHABLE_OUTPUT_VISIBILITY]\n\n// Taken from: https://github.com/victronenergy/venus/wiki/dbus#switch\nexport const SWITCHABLE_OUTPUT_FUNCTION = {\n MANUAL: 2,\n} as const\n\nexport type SwitchableOutputFunction = (typeof SWITCHABLE_OUTPUT_FUNCTION)[keyof typeof SWITCHABLE_OUTPUT_FUNCTION]\n\n// Taken from: https://github.com/victronenergy/venus/wiki/dbus#generic-input-api\nexport const GENERIC_INPUT_TYPE_OFFSET = 100\n\nexport const GENERIC_INPUT_TYPE = {\n DISCRETE: 100,\n VALUE_NO_RANGE: 101,\n VALUE_WITH_RANGE: 102,\n TEMPERATURE: 103,\n} as const\n\nexport type GenericInputType = (typeof GENERIC_INPUT_TYPE)[keyof typeof GENERIC_INPUT_TYPE]\n\nexport function remapGenericInputType(rawType: number): GenericInputType {\n return (rawType + GENERIC_INPUT_TYPE_OFFSET) as GenericInputType\n}\n\nexport const GENERIC_INPUT_VALID_TYPES_BITMASK = Object.fromEntries(\n Object.entries(GENERIC_INPUT_TYPE).map(([key, value]) => [key, 1 << (value - GENERIC_INPUT_TYPE_OFFSET)])\n) as { [K in keyof typeof GENERIC_INPUT_TYPE]: number }\n\nexport type GenericInputValidTypesBitmask =\n (typeof GENERIC_INPUT_VALID_TYPES_BITMASK)[keyof typeof GENERIC_INPUT_VALID_TYPES_BITMASK]\n\n// Taken from: https://github.com/victronenergy/venus/wiki/dbus#generic-input-api\nexport const GENERIC_INPUT_STATUS = {\n OK: 0x00,\n FAULT: 0x01,\n BATTERY_LOW: 0x02,\n} as const\n\nexport type GenericInputStatus = (typeof GENERIC_INPUT_STATUS)[keyof typeof GENERIC_INPUT_STATUS]\n\nexport const VIEWS = {\n CONNECTING: \"CONNECTING\",\n METRICS: \"METRICS\",\n INVERTER_CHARGER_INPUT_LIMIT_SELECTOR: \"INVERTER_CHARGER_INPUT_LIMIT_SELECTOR\",\n REMOTE_CONSOLE: \"REMOTE_CONSOLE\",\n MQTT_UNAVAILABLE: \"MQTT_UNAVAILABLE\",\n ERROR: \"ERROR\",\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"logger.d.ts","sourceRoot":"/","sources":["src/utils/logger.ts"],"names":[],"mappings":";mBAEsB,OAAO,EAAE;oBAGR,OAAO,EAAE;qBAGR,OAAO,EAAE;;AAIjC,wBAAmC"}
1
+ {"version":3,"file":"logger.d.ts","sourceRoot":"/","sources":["src/utils/logger.ts"],"names":[],"mappings":";mBAOsB,OAAO,EAAE;oBAGR,OAAO,EAAE;qBAGR,OAAO,EAAE;;AAIjC,wBAAmC"}
@@ -1,4 +1,5 @@
1
- const isLoggingDisabled = typeof window !== "undefined" && new URLSearchParams(window.location.search).has("nolog");
1
+ const isLoggingDisabled = (typeof process !== "undefined" && !!process.env.VITEST) ||
2
+ (typeof window !== "undefined" && new URLSearchParams(window.location.search).has("nolog"));
2
3
  const log = (...msgs) => {
3
4
  if (!isLoggingDisabled)
4
5
  console.log(...msgs);
@@ -1 +1 @@
1
- {"version":3,"file":"logger.js","sourceRoot":"/","sources":["src/utils/logger.ts"],"names":[],"mappings":"AAAA,MAAM,iBAAiB,GAAG,OAAO,MAAM,KAAK,WAAW,IAAI,IAAI,eAAe,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAA;AAEnH,MAAM,GAAG,GAAG,CAAC,GAAG,IAAe,EAAE,EAAE;IACjC,IAAI,CAAC,iBAAiB;QAAE,OAAO,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,CAAA;AAC9C,CAAC,CAAA;AACD,MAAM,IAAI,GAAG,CAAC,GAAG,IAAe,EAAE,EAAE;IAClC,IAAI,CAAC,iBAAiB;QAAE,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,CAAA;AAC/C,CAAC,CAAA;AACD,MAAM,KAAK,GAAG,CAAC,GAAG,IAAe,EAAE,EAAE;IACnC,IAAI,CAAC,iBAAiB;QAAE,OAAO,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,CAAA;AAChD,CAAC,CAAA;AAED,eAAe,EAAE,GAAG,EAAE,IAAI,EAAE,KAAK,EAAE,CAAA","sourcesContent":["const isLoggingDisabled = typeof window !== \"undefined\" && new URLSearchParams(window.location.search).has(\"nolog\")\n\nconst log = (...msgs: unknown[]) => {\n if (!isLoggingDisabled) console.log(...msgs)\n}\nconst warn = (...msgs: unknown[]) => {\n if (!isLoggingDisabled) console.warn(...msgs)\n}\nconst error = (...msgs: unknown[]) => {\n if (!isLoggingDisabled) console.error(...msgs)\n}\n\nexport default { log, warn, error }\n"]}
1
+ {"version":3,"file":"logger.js","sourceRoot":"/","sources":["src/utils/logger.ts"],"names":[],"mappings":"AAGA,MAAM,iBAAiB,GACrB,CAAC,OAAO,OAAO,KAAK,WAAW,IAAI,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC;IACxD,CAAC,OAAO,MAAM,KAAK,WAAW,IAAI,IAAI,eAAe,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAA;AAE7F,MAAM,GAAG,GAAG,CAAC,GAAG,IAAe,EAAE,EAAE;IACjC,IAAI,CAAC,iBAAiB;QAAE,OAAO,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,CAAA;AAC9C,CAAC,CAAA;AACD,MAAM,IAAI,GAAG,CAAC,GAAG,IAAe,EAAE,EAAE;IAClC,IAAI,CAAC,iBAAiB;QAAE,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,CAAA;AAC/C,CAAC,CAAA;AACD,MAAM,KAAK,GAAG,CAAC,GAAG,IAAe,EAAE,EAAE;IACnC,IAAI,CAAC,iBAAiB;QAAE,OAAO,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,CAAA;AAChD,CAAC,CAAA;AAED,eAAe,EAAE,GAAG,EAAE,IAAI,EAAE,KAAK,EAAE,CAAA","sourcesContent":["// Minimal ambient type — we avoid @types/node to prevent Node APIs leaking into this browser-targeted project\ndeclare const process: { env: Record<string, string | undefined> } | undefined\n\nconst isLoggingDisabled =\n (typeof process !== \"undefined\" && !!process.env.VITEST) ||\n (typeof window !== \"undefined\" && new URLSearchParams(window.location.search).has(\"nolog\"))\n\nconst log = (...msgs: unknown[]) => {\n if (!isLoggingDisabled) console.log(...msgs)\n}\nconst warn = (...msgs: unknown[]) => {\n if (!isLoggingDisabled) console.warn(...msgs)\n}\nconst error = (...msgs: unknown[]) => {\n if (!isLoggingDisabled) console.error(...msgs)\n}\n\nexport default { log, warn, error }\n"]}
package/package.json CHANGED
@@ -1,11 +1,12 @@
1
1
  {
2
2
  "name": "@victronenergy/mfd-modules",
3
- "version": "11.0.0",
3
+ "version": "11.1.1",
4
4
  "description": "",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
7
7
  "scripts": {
8
- "test": "echo \"Error: no test specified\" && exit 1",
8
+ "test": "vitest run",
9
+ "test:watch": "vitest",
9
10
  "build": "tsc",
10
11
  "postbuild": "es-check es2015 'dist/**/*.js' --module",
11
12
  "semantic-release": "semantic-release",
@@ -25,7 +26,7 @@
25
26
  "js-cookie": "^3.0.8",
26
27
  "localforage": "^1.10.0",
27
28
  "lodash-es": "^4.18.1",
28
- "mobx": "^6.15.4",
29
+ "mobx": "^6.16.0",
29
30
  "mobx-persist-store": "^1.1.8",
30
31
  "mobx-utils": "^6.1.1",
31
32
  "mqtt": "^4.3.8"
@@ -34,6 +35,7 @@
34
35
  "@eslint/js": "^10.0.1",
35
36
  "@semantic-release/git": "^10.0.1",
36
37
  "@semantic-release/npm": "^13.1.5",
38
+ "@testing-library/react": "^16.3.2",
37
39
  "@types/js-cookie": "^3.0.6",
38
40
  "@types/lodash-es": "^4.17.12",
39
41
  "@types/react": "^19.2.16",
@@ -43,10 +45,14 @@
43
45
  "eslint-plugin-compat": "^7.0.2",
44
46
  "eslint-plugin-prettier": "^5.5.6",
45
47
  "eslint-plugin-react-hooks": "^7.1.1",
48
+ "jsdom": "^29.1.1",
46
49
  "prettier": "^3.8.3",
50
+ "react": "^19.2.7",
51
+ "react-dom": "^19.2.7",
47
52
  "semantic-release": "^25.0.3",
48
53
  "typescript": "^6.0.3",
49
- "typescript-eslint": "^8.60.1"
54
+ "typescript-eslint": "^8.60.1",
55
+ "vitest": "^4.1.8"
50
56
  },
51
57
  "peerDependencies": {
52
58
  "react": "17 || 18 || 19"