iobroker.proscenic 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (46) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +93 -0
  3. package/admin/i18n/de.json +9 -0
  4. package/admin/i18n/en.json +9 -0
  5. package/admin/i18n/es.json +9 -0
  6. package/admin/i18n/fr.json +9 -0
  7. package/admin/i18n/it.json +9 -0
  8. package/admin/i18n/nl.json +9 -0
  9. package/admin/i18n/pl.json +9 -0
  10. package/admin/i18n/pt.json +9 -0
  11. package/admin/i18n/ru.json +9 -0
  12. package/admin/i18n/uk.json +9 -0
  13. package/admin/i18n/zh-cn.json +9 -0
  14. package/admin/jsonConfig.json +85 -0
  15. package/admin/proscenic-m7-pro.png +0 -0
  16. package/admin/proscenic.png +0 -0
  17. package/build/domain/commands.js +129 -0
  18. package/build/domain/commands.js.map +7 -0
  19. package/build/domain/consumables.js +63 -0
  20. package/build/domain/consumables.js.map +7 -0
  21. package/build/domain/live-map.js +829 -0
  22. package/build/domain/live-map.js.map +7 -0
  23. package/build/domain/maintenance-message.js +128 -0
  24. package/build/domain/maintenance-message.js.map +7 -0
  25. package/build/domain/map.js +58 -0
  26. package/build/domain/map.js.map +7 -0
  27. package/build/domain/reconnect-policy.js +45 -0
  28. package/build/domain/reconnect-policy.js.map +7 -0
  29. package/build/domain/status.js +108 -0
  30. package/build/domain/status.js.map +7 -0
  31. package/build/main.js +529 -0
  32. package/build/main.js.map +7 -0
  33. package/build/objects/object-definitions.js +214 -0
  34. package/build/objects/object-definitions.js.map +7 -0
  35. package/build/objects/projector.js +231 -0
  36. package/build/objects/projector.js.map +7 -0
  37. package/build/protocol/crypto.js +81 -0
  38. package/build/protocol/crypto.js.map +7 -0
  39. package/build/protocol/gateway-client.js +136 -0
  40. package/build/protocol/gateway-client.js.map +7 -0
  41. package/build/protocol/rest-client.js +184 -0
  42. package/build/protocol/rest-client.js.map +7 -0
  43. package/build/protocol/types.js +17 -0
  44. package/build/protocol/types.js.map +7 -0
  45. package/io-package.json +125 -0
  46. package/package.json +80 -0
@@ -0,0 +1,214 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+ var object_definitions_exports = {};
20
+ __export(object_definitions_exports, {
21
+ CHANNEL_DEFINITIONS: () => CHANNEL_DEFINITIONS,
22
+ STATE_DEFINITIONS: () => STATE_DEFINITIONS,
23
+ extendAdapterObjects: () => extendAdapterObjects
24
+ });
25
+ module.exports = __toCommonJS(object_definitions_exports);
26
+ var import_commands = require("../domain/commands");
27
+ const CHANNEL_DEFINITIONS = [
28
+ channel("device", "Selected device"),
29
+ channel("connection", "Connection"),
30
+ channel("capabilities", "Capabilities"),
31
+ channel("consumables", "Consumables"),
32
+ channel("consumables.filter", "Filter"),
33
+ channel("consumables.sideBrush", "Side brush"),
34
+ channel("consumables.mainBrush", "Main brush"),
35
+ channel("consumables.sensors", "Sensors"),
36
+ channel("status", "Status"),
37
+ channel("status.clean", "Cleaning"),
38
+ channel("status.battery", "Battery"),
39
+ channel("status.water", "Water"),
40
+ channel("status.mop", "Mop"),
41
+ channel("status.fan", "Fan"),
42
+ channel("status.error", "Error"),
43
+ channel("status.features", "Features"),
44
+ channel("status.maintenance", "Maintenance"),
45
+ channel("status.maintenance.history", "Maintenance message history"),
46
+ channel("map", "Map metadata"),
47
+ channel("map.live", "Experimental live map"),
48
+ channel("commands", "Commands"),
49
+ channel("commands.fan", "Fan commands")
50
+ ];
51
+ const STATE_DEFINITIONS = [
52
+ state("device.code", "Device code", "string", "info.name"),
53
+ state("device.model", "Device model", "string", "info.name"),
54
+ state("device.online", "Device online", "boolean", "indicator.reachable"),
55
+ state("device.image", "Device image", "string", "text"),
56
+ state("connection.cloud", "Cloud connected", "boolean", "indicator.connected"),
57
+ state("connection.gateway", "Gateway connected", "boolean", "indicator.connected"),
58
+ state("connection.lastError", "Last redacted error", "string", "text"),
59
+ state("connection.lastStatusEvent", "Last status event", "string", "date"),
60
+ state("capabilities.statusRead", "Read status", "boolean", "indicator"),
61
+ state("capabilities.commands", "Commands exposed", "boolean", "indicator"),
62
+ state("capabilities.maps", "Maps exposed", "boolean", "indicator"),
63
+ state("capabilities.consumables", "Consumables exposed", "boolean", "indicator"),
64
+ state("capabilities.maintenanceMessages", "Maintenance messages exposed", "boolean", "indicator"),
65
+ ...consumableStates("consumables.filter", "Filter"),
66
+ ...consumableStates("consumables.sideBrush", "Side brush"),
67
+ ...consumableStates("consumables.mainBrush", "Main brush"),
68
+ ...consumableStates("consumables.sensors", "Sensors"),
69
+ state("consumables.updated", "Last consumables update", "string", "date"),
70
+ state("consumables.lastReadResult", "Last consumables read result", "string", "text"),
71
+ state("consumables.lastError", "Last consumables read error", "string", "text"),
72
+ state("status.mode", "Mode", "string", "state"),
73
+ state("status.subMode", "Sub mode", "string", "state"),
74
+ state("status.clean.area", "Cleaning area", "number", "value", { unit: "m\xB2", min: 0 }),
75
+ state("status.clean.time", "Cleaning time", "number", "value", { unit: "s", min: 0 }),
76
+ state("status.clean.totalArea", "Total cleaning area", "number", "value", { min: 0 }),
77
+ state("status.clean.totalTime", "Total cleaning time", "number", "value", { unit: "s", min: 0 }),
78
+ state("status.battery.percent", "Battery", "number", "value.battery", { unit: "%", min: 0, max: 100 }),
79
+ state("status.battery.rawPercent", "Raw battery", "number", "value.battery", { unit: "%", min: 0, max: 100 }),
80
+ state("status.water.level", "Water level", "number", "level", { min: 0 }),
81
+ state("status.mop.mode", "Mop mode", "number", "state", { min: 0 }),
82
+ state("status.fan.mode", "Fan mode", "string", "state"),
83
+ state("status.error.rawCount", "Raw error count", "number", "value", { min: 0 }),
84
+ state("status.maintenance.hasWarning", "Has maintenance warning", "boolean", "indicator"),
85
+ state("status.maintenance.warningCount", "Maintenance warning count", "number", "value", { min: 0 }),
86
+ state("status.maintenance.code", "Last maintenance event code", "number", "value"),
87
+ state("status.maintenance.level", "Last maintenance event level", "number", "value", { min: 0 }),
88
+ state("status.maintenance.message", "Maintenance message", "string", "text"),
89
+ state("status.maintenance.details", "Maintenance details", "string", "text"),
90
+ state("status.maintenance.eventCount", "Maintenance event count", "number", "value", { min: 0 }),
91
+ state("status.maintenance.updated", "Last maintenance event update", "string", "date"),
92
+ state("status.maintenance.history.items", "Maintenance message history", "string", "json"),
93
+ state("status.maintenance.history.count", "Maintenance message history count", "number", "value", { min: 0 }),
94
+ state("status.maintenance.history.totalCount", "Total maintenance message count", "number", "value", { min: 0 }),
95
+ state("status.maintenance.history.latestCode", "Latest maintenance history code", "number", "value"),
96
+ state("status.maintenance.history.latestLevel", "Latest maintenance history level", "number", "value", { min: 0 }),
97
+ state("status.maintenance.history.latestMessage", "Latest maintenance history message", "string", "text"),
98
+ state("status.maintenance.history.latestEventTime", "Latest maintenance history event time", "string", "date"),
99
+ state("status.maintenance.history.updated", "Last maintenance message history update", "string", "date"),
100
+ state(
101
+ "status.maintenance.history.lastReadResult",
102
+ "Last maintenance message history read result",
103
+ "string",
104
+ "text"
105
+ ),
106
+ state("status.maintenance.history.lastError", "Last maintenance message history read error", "string", "text"),
107
+ state("status.features.autoBoost", "Auto boost", "boolean", "indicator"),
108
+ state("status.features.cleanComponents", "Clean components", "boolean", "indicator"),
109
+ state("map.available", "Map data available", "boolean", "indicator"),
110
+ state("map.id", "Map ID", "number", "value", { min: 0 }),
111
+ state("map.pathId", "Path ID", "number", "value", { min: 0 }),
112
+ state("map.width", "Map width", "number", "value", { min: 0 }),
113
+ state("map.height", "Map height", "number", "value", { min: 0 }),
114
+ state("map.resolution", "Map resolution", "number", "value", { min: 0 }),
115
+ state("map.areaCount", "Map area count", "number", "value", { min: 0 }),
116
+ state("map.compressedBytes", "Compressed map bytes", "number", "value", { unit: "B", min: 0 }),
117
+ state("map.encodedBytes", "Encoded map bytes", "number", "value", { unit: "B", min: 0 }),
118
+ state("map.updated", "Last map metadata update", "string", "date"),
119
+ state("map.live.image", "Experimental live map image", "string", "text"),
120
+ state("map.live.areas", "Experimental live map areas", "string", "json"),
121
+ state("map.live.updated", "Last live map image update", "string", "date"),
122
+ state("map.live.orientation", "Live map orientation", "string", "state"),
123
+ state("map.live.poseCount", "Live map pose count", "number", "value", { min: 0 }),
124
+ state("map.live.rawPoseCount", "Raw live map pose count", "number", "value", { min: 0 }),
125
+ state("map.live.pathLineSegments", "Live map path line segments", "number", "value", { min: 0 }),
126
+ state("map.live.skippedPathSegments", "Skipped live map path segments", "number", "value", { min: 0 }),
127
+ state("map.live.currentAreaCount", "Current live map area count", "number", "value", { min: 0 }),
128
+ state("map.live.cachedAreaCount", "Cached live map area count", "number", "value", { min: 0 }),
129
+ state("map.live.renderedForbiddenAreaCount", "Rendered forbidden area count", "number", "value", { min: 0 }),
130
+ state("map.live.renderedRoomAreaCount", "Rendered room area count", "number", "value", { min: 0 }),
131
+ state("map.live.hasCachedStaticOverlays", "Has cached static live map overlays", "boolean", "indicator"),
132
+ state("map.live.renderReason", "Last live map render reason", "string", "state"),
133
+ state("map.live.lastPathId", "Last live map path ID", "number", "value", { min: 0 }),
134
+ state("map.live.pathResetCount", "Live map path reset count", "number", "value", { min: 0 }),
135
+ state("map.live.lastPoseUpdated", "Last live map pose update", "string", "date"),
136
+ state("map.live.decompressedBytes", "Live map decompressed bytes", "number", "value", { unit: "B", min: 0 }),
137
+ ...import_commands.COMMAND_DEFINITIONS.map((definition) => commandButton(definition)),
138
+ state("commands.lastCommand", "Last command", "string", "text"),
139
+ state("commands.lastResult", "Last command result", "string", "text"),
140
+ state("commands.lastError", "Last command error", "string", "text"),
141
+ state("commands.lastExecution", "Last command execution", "string", "date")
142
+ ];
143
+ async function extendAdapterObjects(adapter) {
144
+ for (const definition of CHANNEL_DEFINITIONS) {
145
+ await adapter.setObjectNotExistsAsync(definition.id, definition.object);
146
+ }
147
+ for (const definition of STATE_DEFINITIONS) {
148
+ await adapter.setObjectNotExistsAsync(definition.id, definition.object);
149
+ }
150
+ }
151
+ function channel(id, name) {
152
+ return {
153
+ id,
154
+ object: {
155
+ _id: id,
156
+ type: "channel",
157
+ common: {
158
+ name
159
+ },
160
+ native: {}
161
+ }
162
+ };
163
+ }
164
+ function state(id, name, type, role, options = {}) {
165
+ return {
166
+ id,
167
+ object: {
168
+ _id: id,
169
+ type: "state",
170
+ common: {
171
+ name,
172
+ type,
173
+ role,
174
+ read: true,
175
+ write: false,
176
+ ...options
177
+ },
178
+ native: {}
179
+ }
180
+ };
181
+ }
182
+ function consumableStates(prefix, name) {
183
+ return [
184
+ state(`${prefix}.usedSeconds`, `${name} used seconds`, "number", "value", { unit: "s", min: 0 }),
185
+ state(`${prefix}.intervalHours`, `${name} interval`, "number", "value", { unit: "h", min: 0 }),
186
+ state(`${prefix}.remainingPercent`, `${name} remaining`, "number", "value", { unit: "%" }),
187
+ state(`${prefix}.overdueHours`, `${name} overdue`, "number", "value", { unit: "h", min: 0 })
188
+ ];
189
+ }
190
+ function commandButton(definition) {
191
+ return {
192
+ id: definition.id,
193
+ object: {
194
+ _id: definition.id,
195
+ type: "state",
196
+ common: {
197
+ name: definition.command,
198
+ type: "boolean",
199
+ role: "button",
200
+ read: true,
201
+ write: true,
202
+ def: false
203
+ },
204
+ native: {}
205
+ }
206
+ };
207
+ }
208
+ // Annotate the CommonJS export names for ESM import in node:
209
+ 0 && (module.exports = {
210
+ CHANNEL_DEFINITIONS,
211
+ STATE_DEFINITIONS,
212
+ extendAdapterObjects
213
+ });
214
+ //# sourceMappingURL=object-definitions.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/objects/object-definitions.ts"],
4
+ "sourcesContent": ["import type { CommandDefinition } from \"../domain/commands\";\nimport { COMMAND_DEFINITIONS } from \"../domain/commands\";\n\nexport interface StateDefinition {\n\tid: string;\n\tobject: ioBroker.StateObject;\n}\n\nexport interface ChannelDefinition {\n\tid: string;\n\tobject: ioBroker.ChannelObject;\n}\n\nexport const CHANNEL_DEFINITIONS: readonly ChannelDefinition[] = [\n\tchannel(\"device\", \"Selected device\"),\n\tchannel(\"connection\", \"Connection\"),\n\tchannel(\"capabilities\", \"Capabilities\"),\n\tchannel(\"consumables\", \"Consumables\"),\n\tchannel(\"consumables.filter\", \"Filter\"),\n\tchannel(\"consumables.sideBrush\", \"Side brush\"),\n\tchannel(\"consumables.mainBrush\", \"Main brush\"),\n\tchannel(\"consumables.sensors\", \"Sensors\"),\n\tchannel(\"status\", \"Status\"),\n\tchannel(\"status.clean\", \"Cleaning\"),\n\tchannel(\"status.battery\", \"Battery\"),\n\tchannel(\"status.water\", \"Water\"),\n\tchannel(\"status.mop\", \"Mop\"),\n\tchannel(\"status.fan\", \"Fan\"),\n\tchannel(\"status.error\", \"Error\"),\n\tchannel(\"status.features\", \"Features\"),\n\tchannel(\"status.maintenance\", \"Maintenance\"),\n\tchannel(\"status.maintenance.history\", \"Maintenance message history\"),\n\tchannel(\"map\", \"Map metadata\"),\n\tchannel(\"map.live\", \"Experimental live map\"),\n\tchannel(\"commands\", \"Commands\"),\n\tchannel(\"commands.fan\", \"Fan commands\"),\n];\n\nexport const STATE_DEFINITIONS: readonly StateDefinition[] = [\n\tstate(\"device.code\", \"Device code\", \"string\", \"info.name\"),\n\tstate(\"device.model\", \"Device model\", \"string\", \"info.name\"),\n\tstate(\"device.online\", \"Device online\", \"boolean\", \"indicator.reachable\"),\n\tstate(\"device.image\", \"Device image\", \"string\", \"text\"),\n\tstate(\"connection.cloud\", \"Cloud connected\", \"boolean\", \"indicator.connected\"),\n\tstate(\"connection.gateway\", \"Gateway connected\", \"boolean\", \"indicator.connected\"),\n\tstate(\"connection.lastError\", \"Last redacted error\", \"string\", \"text\"),\n\tstate(\"connection.lastStatusEvent\", \"Last status event\", \"string\", \"date\"),\n\tstate(\"capabilities.statusRead\", \"Read status\", \"boolean\", \"indicator\"),\n\tstate(\"capabilities.commands\", \"Commands exposed\", \"boolean\", \"indicator\"),\n\tstate(\"capabilities.maps\", \"Maps exposed\", \"boolean\", \"indicator\"),\n\tstate(\"capabilities.consumables\", \"Consumables exposed\", \"boolean\", \"indicator\"),\n\tstate(\"capabilities.maintenanceMessages\", \"Maintenance messages exposed\", \"boolean\", \"indicator\"),\n\t...consumableStates(\"consumables.filter\", \"Filter\"),\n\t...consumableStates(\"consumables.sideBrush\", \"Side brush\"),\n\t...consumableStates(\"consumables.mainBrush\", \"Main brush\"),\n\t...consumableStates(\"consumables.sensors\", \"Sensors\"),\n\tstate(\"consumables.updated\", \"Last consumables update\", \"string\", \"date\"),\n\tstate(\"consumables.lastReadResult\", \"Last consumables read result\", \"string\", \"text\"),\n\tstate(\"consumables.lastError\", \"Last consumables read error\", \"string\", \"text\"),\n\tstate(\"status.mode\", \"Mode\", \"string\", \"state\"),\n\tstate(\"status.subMode\", \"Sub mode\", \"string\", \"state\"),\n\tstate(\"status.clean.area\", \"Cleaning area\", \"number\", \"value\", { unit: \"m\u00B2\", min: 0 }),\n\tstate(\"status.clean.time\", \"Cleaning time\", \"number\", \"value\", { unit: \"s\", min: 0 }),\n\tstate(\"status.clean.totalArea\", \"Total cleaning area\", \"number\", \"value\", { min: 0 }),\n\tstate(\"status.clean.totalTime\", \"Total cleaning time\", \"number\", \"value\", { unit: \"s\", min: 0 }),\n\tstate(\"status.battery.percent\", \"Battery\", \"number\", \"value.battery\", { unit: \"%\", min: 0, max: 100 }),\n\tstate(\"status.battery.rawPercent\", \"Raw battery\", \"number\", \"value.battery\", { unit: \"%\", min: 0, max: 100 }),\n\tstate(\"status.water.level\", \"Water level\", \"number\", \"level\", { min: 0 }),\n\tstate(\"status.mop.mode\", \"Mop mode\", \"number\", \"state\", { min: 0 }),\n\tstate(\"status.fan.mode\", \"Fan mode\", \"string\", \"state\"),\n\tstate(\"status.error.rawCount\", \"Raw error count\", \"number\", \"value\", { min: 0 }),\n\tstate(\"status.maintenance.hasWarning\", \"Has maintenance warning\", \"boolean\", \"indicator\"),\n\tstate(\"status.maintenance.warningCount\", \"Maintenance warning count\", \"number\", \"value\", { min: 0 }),\n\tstate(\"status.maintenance.code\", \"Last maintenance event code\", \"number\", \"value\"),\n\tstate(\"status.maintenance.level\", \"Last maintenance event level\", \"number\", \"value\", { min: 0 }),\n\tstate(\"status.maintenance.message\", \"Maintenance message\", \"string\", \"text\"),\n\tstate(\"status.maintenance.details\", \"Maintenance details\", \"string\", \"text\"),\n\tstate(\"status.maintenance.eventCount\", \"Maintenance event count\", \"number\", \"value\", { min: 0 }),\n\tstate(\"status.maintenance.updated\", \"Last maintenance event update\", \"string\", \"date\"),\n\tstate(\"status.maintenance.history.items\", \"Maintenance message history\", \"string\", \"json\"),\n\tstate(\"status.maintenance.history.count\", \"Maintenance message history count\", \"number\", \"value\", { min: 0 }),\n\tstate(\"status.maintenance.history.totalCount\", \"Total maintenance message count\", \"number\", \"value\", { min: 0 }),\n\tstate(\"status.maintenance.history.latestCode\", \"Latest maintenance history code\", \"number\", \"value\"),\n\tstate(\"status.maintenance.history.latestLevel\", \"Latest maintenance history level\", \"number\", \"value\", { min: 0 }),\n\tstate(\"status.maintenance.history.latestMessage\", \"Latest maintenance history message\", \"string\", \"text\"),\n\tstate(\"status.maintenance.history.latestEventTime\", \"Latest maintenance history event time\", \"string\", \"date\"),\n\tstate(\"status.maintenance.history.updated\", \"Last maintenance message history update\", \"string\", \"date\"),\n\tstate(\n\t\t\"status.maintenance.history.lastReadResult\",\n\t\t\"Last maintenance message history read result\",\n\t\t\"string\",\n\t\t\"text\",\n\t),\n\tstate(\"status.maintenance.history.lastError\", \"Last maintenance message history read error\", \"string\", \"text\"),\n\tstate(\"status.features.autoBoost\", \"Auto boost\", \"boolean\", \"indicator\"),\n\tstate(\"status.features.cleanComponents\", \"Clean components\", \"boolean\", \"indicator\"),\n\tstate(\"map.available\", \"Map data available\", \"boolean\", \"indicator\"),\n\tstate(\"map.id\", \"Map ID\", \"number\", \"value\", { min: 0 }),\n\tstate(\"map.pathId\", \"Path ID\", \"number\", \"value\", { min: 0 }),\n\tstate(\"map.width\", \"Map width\", \"number\", \"value\", { min: 0 }),\n\tstate(\"map.height\", \"Map height\", \"number\", \"value\", { min: 0 }),\n\tstate(\"map.resolution\", \"Map resolution\", \"number\", \"value\", { min: 0 }),\n\tstate(\"map.areaCount\", \"Map area count\", \"number\", \"value\", { min: 0 }),\n\tstate(\"map.compressedBytes\", \"Compressed map bytes\", \"number\", \"value\", { unit: \"B\", min: 0 }),\n\tstate(\"map.encodedBytes\", \"Encoded map bytes\", \"number\", \"value\", { unit: \"B\", min: 0 }),\n\tstate(\"map.updated\", \"Last map metadata update\", \"string\", \"date\"),\n\tstate(\"map.live.image\", \"Experimental live map image\", \"string\", \"text\"),\n\tstate(\"map.live.areas\", \"Experimental live map areas\", \"string\", \"json\"),\n\tstate(\"map.live.updated\", \"Last live map image update\", \"string\", \"date\"),\n\tstate(\"map.live.orientation\", \"Live map orientation\", \"string\", \"state\"),\n\tstate(\"map.live.poseCount\", \"Live map pose count\", \"number\", \"value\", { min: 0 }),\n\tstate(\"map.live.rawPoseCount\", \"Raw live map pose count\", \"number\", \"value\", { min: 0 }),\n\tstate(\"map.live.pathLineSegments\", \"Live map path line segments\", \"number\", \"value\", { min: 0 }),\n\tstate(\"map.live.skippedPathSegments\", \"Skipped live map path segments\", \"number\", \"value\", { min: 0 }),\n\tstate(\"map.live.currentAreaCount\", \"Current live map area count\", \"number\", \"value\", { min: 0 }),\n\tstate(\"map.live.cachedAreaCount\", \"Cached live map area count\", \"number\", \"value\", { min: 0 }),\n\tstate(\"map.live.renderedForbiddenAreaCount\", \"Rendered forbidden area count\", \"number\", \"value\", { min: 0 }),\n\tstate(\"map.live.renderedRoomAreaCount\", \"Rendered room area count\", \"number\", \"value\", { min: 0 }),\n\tstate(\"map.live.hasCachedStaticOverlays\", \"Has cached static live map overlays\", \"boolean\", \"indicator\"),\n\tstate(\"map.live.renderReason\", \"Last live map render reason\", \"string\", \"state\"),\n\tstate(\"map.live.lastPathId\", \"Last live map path ID\", \"number\", \"value\", { min: 0 }),\n\tstate(\"map.live.pathResetCount\", \"Live map path reset count\", \"number\", \"value\", { min: 0 }),\n\tstate(\"map.live.lastPoseUpdated\", \"Last live map pose update\", \"string\", \"date\"),\n\tstate(\"map.live.decompressedBytes\", \"Live map decompressed bytes\", \"number\", \"value\", { unit: \"B\", min: 0 }),\n\t...COMMAND_DEFINITIONS.map(definition => commandButton(definition)),\n\tstate(\"commands.lastCommand\", \"Last command\", \"string\", \"text\"),\n\tstate(\"commands.lastResult\", \"Last command result\", \"string\", \"text\"),\n\tstate(\"commands.lastError\", \"Last command error\", \"string\", \"text\"),\n\tstate(\"commands.lastExecution\", \"Last command execution\", \"string\", \"date\"),\n];\n\nexport async function extendAdapterObjects(adapter: ioBroker.Adapter): Promise<void> {\n\tfor (const definition of CHANNEL_DEFINITIONS) {\n\t\tawait adapter.setObjectNotExistsAsync(definition.id, definition.object);\n\t}\n\n\tfor (const definition of STATE_DEFINITIONS) {\n\t\tawait adapter.setObjectNotExistsAsync(definition.id, definition.object);\n\t}\n}\n\nfunction channel(id: string, name: string): ChannelDefinition {\n\treturn {\n\t\tid,\n\t\tobject: {\n\t\t\t_id: id,\n\t\t\ttype: \"channel\",\n\t\t\tcommon: {\n\t\t\t\tname,\n\t\t\t},\n\t\t\tnative: {},\n\t\t},\n\t};\n}\n\nfunction state(\n\tid: string,\n\tname: string,\n\ttype: ioBroker.CommonType,\n\trole: string,\n\toptions: Partial<ioBroker.StateCommon> = {},\n): StateDefinition {\n\treturn {\n\t\tid,\n\t\tobject: {\n\t\t\t_id: id,\n\t\t\ttype: \"state\",\n\t\t\tcommon: {\n\t\t\t\tname,\n\t\t\t\ttype,\n\t\t\t\trole,\n\t\t\t\tread: true,\n\t\t\t\twrite: false,\n\t\t\t\t...options,\n\t\t\t},\n\t\t\tnative: {},\n\t\t},\n\t};\n}\n\nfunction consumableStates(prefix: string, name: string): StateDefinition[] {\n\treturn [\n\t\tstate(`${prefix}.usedSeconds`, `${name} used seconds`, \"number\", \"value\", { unit: \"s\", min: 0 }),\n\t\tstate(`${prefix}.intervalHours`, `${name} interval`, \"number\", \"value\", { unit: \"h\", min: 0 }),\n\t\tstate(`${prefix}.remainingPercent`, `${name} remaining`, \"number\", \"value\", { unit: \"%\" }),\n\t\tstate(`${prefix}.overdueHours`, `${name} overdue`, \"number\", \"value\", { unit: \"h\", min: 0 }),\n\t];\n}\n\nfunction commandButton(definition: CommandDefinition): StateDefinition {\n\treturn {\n\t\tid: definition.id,\n\t\tobject: {\n\t\t\t_id: definition.id,\n\t\t\ttype: \"state\",\n\t\t\tcommon: {\n\t\t\t\tname: definition.command,\n\t\t\t\ttype: \"boolean\",\n\t\t\t\trole: \"button\",\n\t\t\t\tread: true,\n\t\t\t\twrite: true,\n\t\t\t\tdef: false,\n\t\t\t},\n\t\t\tnative: {},\n\t\t},\n\t};\n}\n"],
5
+ "mappings": "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",
6
+ "names": []
7
+ }
@@ -0,0 +1,231 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+ var projector_exports = {};
20
+ __export(projector_exports, {
21
+ projectConsumables: () => projectConsumables,
22
+ projectDevice: () => projectDevice,
23
+ projectLiveMapImage: () => projectLiveMapImage,
24
+ projectMaintenanceHistory: () => projectMaintenanceHistory,
25
+ projectMaintenanceMessage: () => projectMaintenanceMessage,
26
+ projectMapMetadata: () => projectMapMetadata,
27
+ projectStatus: () => projectStatus,
28
+ redactedErrorMessage: () => redactedErrorMessage,
29
+ setConnectionState: () => setConnectionState,
30
+ setConsumablesReadFailure: () => setConsumablesReadFailure,
31
+ setInitialCapabilityStates: () => setInitialCapabilityStates,
32
+ setLastError: () => setLastError,
33
+ setMaintenanceHistoryReadFailure: () => setMaintenanceHistoryReadFailure
34
+ });
35
+ module.exports = __toCommonJS(projector_exports);
36
+ var import_node_fs = require("node:fs");
37
+ var import_node_path = require("node:path");
38
+ async function setInitialCapabilityStates(adapter) {
39
+ await adapter.setStateAsync("capabilities.statusRead", { val: true, ack: true });
40
+ await adapter.setStateAsync("capabilities.commands", { val: false, ack: true });
41
+ await adapter.setStateAsync("capabilities.maps", { val: false, ack: true });
42
+ await adapter.setStateAsync("capabilities.consumables", { val: false, ack: true });
43
+ await adapter.setStateAsync("capabilities.maintenanceMessages", { val: false, ack: true });
44
+ }
45
+ async function projectDevice(adapter, device) {
46
+ await setIfDefined(adapter, "device.code", displayDeviceCode(device.code));
47
+ await setIfDefined(adapter, "device.model", device.model);
48
+ await setIfDefined(adapter, "device.online", device.status);
49
+ await adapter.setStateAsync("device.image", { val: deviceImageDataUrl(device), ack: true });
50
+ }
51
+ async function projectStatus(adapter, status) {
52
+ await setIfDefined(adapter, "status.mode", status.mode);
53
+ await setIfDefined(adapter, "status.subMode", status.subMode);
54
+ await setIfDefined(adapter, "status.clean.area", status.cleanArea);
55
+ await setIfDefined(adapter, "status.clean.time", status.cleanTime);
56
+ await setIfDefined(adapter, "status.clean.totalArea", status.totalArea);
57
+ await setIfDefined(adapter, "status.clean.totalTime", status.totalTime);
58
+ await setIfDefined(adapter, "status.battery.percent", status.batteryPercent);
59
+ await setIfDefined(adapter, "status.battery.rawPercent", status.batteryRawPercent);
60
+ await setIfDefined(adapter, "status.water.level", status.waterLevel);
61
+ await setIfDefined(adapter, "status.mop.mode", status.mopMode);
62
+ await setIfDefined(adapter, "status.fan.mode", status.fanMode);
63
+ await setIfDefined(adapter, "status.error.rawCount", status.errorRawCount);
64
+ await setIfDefined(adapter, "status.maintenance.hasWarning", status.maintenanceWarning);
65
+ await setIfDefined(adapter, "status.maintenance.warningCount", status.maintenanceWarningCount);
66
+ await setIfDefined(adapter, "status.maintenance.message", status.maintenanceMessage);
67
+ await setIfDefined(adapter, "status.maintenance.details", status.maintenanceDetails);
68
+ await setIfDefined(adapter, "status.features.autoBoost", status.autoBoost);
69
+ await setIfDefined(adapter, "status.features.cleanComponents", status.cleanComponents);
70
+ await adapter.setStateAsync("connection.lastStatusEvent", { val: (/* @__PURE__ */ new Date()).toISOString(), ack: true });
71
+ }
72
+ async function projectMaintenanceMessage(adapter, message, eventCount) {
73
+ var _a, _b;
74
+ await setIfDefined(adapter, "status.maintenance.code", message.code);
75
+ await setIfDefined(adapter, "status.maintenance.level", message.level);
76
+ await setIfDefined(adapter, "status.maintenance.message", (_b = (_a = message.message) != null ? _a : message.title) != null ? _b : "");
77
+ await adapter.setStateAsync("status.maintenance.details", { val: message.details, ack: true });
78
+ await adapter.setStateAsync("status.maintenance.eventCount", { val: eventCount, ack: true });
79
+ await adapter.setStateAsync("status.maintenance.updated", { val: (/* @__PURE__ */ new Date()).toISOString(), ack: true });
80
+ }
81
+ async function projectMaintenanceHistory(adapter, history) {
82
+ var _a, _b;
83
+ const latest = history.messages[0];
84
+ if (latest) {
85
+ await setIfDefined(adapter, "status.maintenance.history.latestCode", latest.code);
86
+ await setIfDefined(adapter, "status.maintenance.history.latestLevel", latest.level);
87
+ await setIfDefined(adapter, "status.maintenance.history.latestMessage", (_b = (_a = latest.message) != null ? _a : latest.title) != null ? _b : "");
88
+ await setIfDefined(adapter, "status.maintenance.history.latestEventTime", latest.eventTime);
89
+ }
90
+ await adapter.setStateAsync("status.maintenance.history.items", {
91
+ val: JSON.stringify(history.messages.map(historyMessageItem)),
92
+ ack: true
93
+ });
94
+ await adapter.setStateAsync("status.maintenance.history.count", { val: history.messages.length, ack: true });
95
+ await setIfDefined(adapter, "status.maintenance.history.totalCount", history.totalElements);
96
+ await adapter.setStateAsync("status.maintenance.history.updated", { val: (/* @__PURE__ */ new Date()).toISOString(), ack: true });
97
+ await adapter.setStateAsync("status.maintenance.history.lastReadResult", { val: "ok", ack: true });
98
+ await adapter.setStateAsync("status.maintenance.history.lastError", { val: "", ack: true });
99
+ await adapter.setStateAsync("capabilities.maintenanceMessages", { val: true, ack: true });
100
+ }
101
+ async function projectConsumables(adapter, consumables) {
102
+ for (const [component, state] of Object.entries(consumables)) {
103
+ const prefix = `consumables.${component}`;
104
+ await adapter.setStateAsync(`${prefix}.usedSeconds`, { val: state.usedSeconds, ack: true });
105
+ await adapter.setStateAsync(`${prefix}.intervalHours`, { val: state.intervalHours, ack: true });
106
+ await adapter.setStateAsync(`${prefix}.remainingPercent`, { val: state.remainingPercent, ack: true });
107
+ await adapter.setStateAsync(`${prefix}.overdueHours`, { val: state.overdueHours, ack: true });
108
+ }
109
+ await adapter.setStateAsync("consumables.updated", { val: (/* @__PURE__ */ new Date()).toISOString(), ack: true });
110
+ await adapter.setStateAsync("consumables.lastReadResult", { val: "ok", ack: true });
111
+ await adapter.setStateAsync("consumables.lastError", { val: "", ack: true });
112
+ await adapter.setStateAsync("capabilities.consumables", { val: true, ack: true });
113
+ }
114
+ async function setConsumablesReadFailure(adapter, error) {
115
+ await adapter.setStateAsync("consumables.lastReadResult", { val: "failed", ack: true });
116
+ await adapter.setStateAsync("consumables.lastError", { val: redactedErrorMessage(error), ack: true });
117
+ }
118
+ async function setMaintenanceHistoryReadFailure(adapter, error) {
119
+ await adapter.setStateAsync("status.maintenance.history.lastReadResult", { val: "failed", ack: true });
120
+ await adapter.setStateAsync("status.maintenance.history.lastError", {
121
+ val: redactedErrorMessage(error),
122
+ ack: true
123
+ });
124
+ }
125
+ async function projectMapMetadata(adapter, map) {
126
+ await setIfDefined(adapter, "map.available", map.available);
127
+ await setIfDefined(adapter, "map.id", map.mapId);
128
+ await setIfDefined(adapter, "map.pathId", map.pathId);
129
+ await setIfDefined(adapter, "map.width", map.width);
130
+ await setIfDefined(adapter, "map.height", map.height);
131
+ await setIfDefined(adapter, "map.resolution", map.resolution);
132
+ await setIfDefined(adapter, "map.areaCount", map.areaCount);
133
+ await setIfDefined(adapter, "map.compressedBytes", map.compressedBytes);
134
+ await setIfDefined(adapter, "map.encodedBytes", map.encodedBytes);
135
+ await adapter.setStateAsync("map.updated", { val: (/* @__PURE__ */ new Date()).toISOString(), ack: true });
136
+ await adapter.setStateAsync("capabilities.maps", { val: true, ack: true });
137
+ }
138
+ function historyMessageItem(message) {
139
+ return {
140
+ ...message.code !== void 0 ? { code: message.code } : {},
141
+ ...message.level !== void 0 ? { level: message.level } : {},
142
+ ...message.title !== void 0 ? { title: message.title } : {},
143
+ ...message.message !== void 0 ? { message: message.message } : {},
144
+ ...message.eventTime !== void 0 ? { eventTime: message.eventTime } : {}
145
+ };
146
+ }
147
+ async function projectLiveMapImage(adapter, image, diagnostics) {
148
+ var _a;
149
+ await adapter.setStateAsync("map.live.image", { val: image.dataUrl, ack: true });
150
+ await adapter.setStateAsync("map.live.areas", { val: JSON.stringify(image.areas), ack: true });
151
+ await adapter.setStateAsync("map.live.updated", { val: (/* @__PURE__ */ new Date()).toISOString(), ack: true });
152
+ await adapter.setStateAsync("map.live.orientation", { val: image.orientation, ack: true });
153
+ await adapter.setStateAsync("map.live.poseCount", { val: image.poseCount, ack: true });
154
+ await adapter.setStateAsync("map.live.rawPoseCount", { val: image.rawPoseCount, ack: true });
155
+ await adapter.setStateAsync("map.live.pathLineSegments", { val: image.pathLineSegments, ack: true });
156
+ await adapter.setStateAsync("map.live.skippedPathSegments", { val: image.skippedPathSegments, ack: true });
157
+ await adapter.setStateAsync("map.live.currentAreaCount", { val: diagnostics.currentAreaCount, ack: true });
158
+ await adapter.setStateAsync("map.live.cachedAreaCount", { val: diagnostics.cachedAreaCount, ack: true });
159
+ await adapter.setStateAsync("map.live.renderedForbiddenAreaCount", {
160
+ val: image.renderedForbiddenAreaCount,
161
+ ack: true
162
+ });
163
+ await adapter.setStateAsync("map.live.renderedRoomAreaCount", { val: image.renderedRoomAreaCount, ack: true });
164
+ await adapter.setStateAsync("map.live.hasCachedStaticOverlays", {
165
+ val: diagnostics.hasCachedStaticOverlays,
166
+ ack: true
167
+ });
168
+ await adapter.setStateAsync("map.live.renderReason", { val: diagnostics.renderReason, ack: true });
169
+ await setIfDefined(adapter, "map.live.lastPathId", diagnostics.lastPathId);
170
+ await adapter.setStateAsync("map.live.pathResetCount", { val: diagnostics.pathResetCount, ack: true });
171
+ await adapter.setStateAsync("map.live.lastPoseUpdated", { val: (_a = diagnostics.lastPoseUpdated) != null ? _a : "", ack: true });
172
+ await adapter.setStateAsync("map.live.decompressedBytes", { val: image.decompressedBytes, ack: true });
173
+ await adapter.setStateAsync("capabilities.maps", { val: true, ack: true });
174
+ }
175
+ async function setConnectionState(adapter, id, connected) {
176
+ await adapter.setStateAsync(`connection.${id}`, { val: connected, ack: true });
177
+ if (id === "cloud") {
178
+ await adapter.setStateAsync("info.connection", { val: connected, ack: true });
179
+ }
180
+ }
181
+ async function setLastError(adapter, error) {
182
+ await adapter.setStateAsync("connection.lastError", { val: redactedErrorMessage(error), ack: true });
183
+ }
184
+ function redactedErrorMessage(error) {
185
+ const message = error instanceof Error ? error.message : String(error);
186
+ return message.replace(/[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,}/gu, "<redacted-email>").replace(/\b\d{1,3}(?:\.\d{1,3}){3}(?::\d{1,5})?\b/gu, "<redacted-address>").replace(/\b[a-z0-9.-]+\.[a-z]{2,}(?::\d{1,5})?\b/giu, "<redacted-host>");
187
+ }
188
+ async function setIfDefined(adapter, id, value) {
189
+ if (value !== void 0) {
190
+ await adapter.setStateAsync(id, { val: value, ack: true });
191
+ }
192
+ }
193
+ let cachedM7ProImageDataUrl;
194
+ function deviceImageDataUrl(device) {
195
+ if (device.code !== "M7_PRO" || device.model !== "811_LDS") {
196
+ return "";
197
+ }
198
+ cachedM7ProImageDataUrl != null ? cachedM7ProImageDataUrl : cachedM7ProImageDataUrl = readAssetDataUrl("proscenic-m7-pro.png");
199
+ return cachedM7ProImageDataUrl;
200
+ }
201
+ function displayDeviceCode(code) {
202
+ return code ? `PROSCENIC ${code}` : void 0;
203
+ }
204
+ function readAssetDataUrl(fileName) {
205
+ for (const candidate of [
206
+ (0, import_node_path.join)(__dirname, "..", "admin", fileName),
207
+ (0, import_node_path.join)(__dirname, "..", "..", "admin", fileName)
208
+ ]) {
209
+ if ((0, import_node_fs.existsSync)(candidate)) {
210
+ return `data:image/png;base64,${(0, import_node_fs.readFileSync)(candidate).toString("base64")}`;
211
+ }
212
+ }
213
+ return "";
214
+ }
215
+ // Annotate the CommonJS export names for ESM import in node:
216
+ 0 && (module.exports = {
217
+ projectConsumables,
218
+ projectDevice,
219
+ projectLiveMapImage,
220
+ projectMaintenanceHistory,
221
+ projectMaintenanceMessage,
222
+ projectMapMetadata,
223
+ projectStatus,
224
+ redactedErrorMessage,
225
+ setConnectionState,
226
+ setConsumablesReadFailure,
227
+ setInitialCapabilityStates,
228
+ setLastError,
229
+ setMaintenanceHistoryReadFailure
230
+ });
231
+ //# sourceMappingURL=projector.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/objects/projector.ts"],
4
+ "sourcesContent": ["import { existsSync, readFileSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport type { ConsumableStates } from \"../domain/consumables\";\nimport type { MaintenanceHistory, MaintenanceMessage } from \"../domain/maintenance-message\";\nimport type { MapMetadata } from \"../domain/map\";\nimport type { LiveMapImage } from \"../domain/live-map\";\nimport type { RobotStatus } from \"../domain/status\";\nimport type { DeviceRecord } from \"../protocol/types\";\n\nexport interface LiveMapProjectionDiagnostics {\n\trenderReason: \"map\" | \"pose\";\n\tlastPathId?: number;\n\tpathResetCount: number;\n\tlastPoseUpdated?: string;\n\tcurrentAreaCount: number;\n\tcachedAreaCount: number;\n\thasCachedStaticOverlays: boolean;\n}\n\nexport async function setInitialCapabilityStates(adapter: ioBroker.Adapter): Promise<void> {\n\tawait adapter.setStateAsync(\"capabilities.statusRead\", { val: true, ack: true });\n\tawait adapter.setStateAsync(\"capabilities.commands\", { val: false, ack: true });\n\tawait adapter.setStateAsync(\"capabilities.maps\", { val: false, ack: true });\n\tawait adapter.setStateAsync(\"capabilities.consumables\", { val: false, ack: true });\n\tawait adapter.setStateAsync(\"capabilities.maintenanceMessages\", { val: false, ack: true });\n}\n\nexport async function projectDevice(adapter: ioBroker.Adapter, device: DeviceRecord): Promise<void> {\n\tawait setIfDefined(adapter, \"device.code\", displayDeviceCode(device.code));\n\tawait setIfDefined(adapter, \"device.model\", device.model);\n\tawait setIfDefined(adapter, \"device.online\", device.status);\n\tawait adapter.setStateAsync(\"device.image\", { val: deviceImageDataUrl(device), ack: true });\n}\n\nexport async function projectStatus(adapter: ioBroker.Adapter, status: RobotStatus): Promise<void> {\n\tawait setIfDefined(adapter, \"status.mode\", status.mode);\n\tawait setIfDefined(adapter, \"status.subMode\", status.subMode);\n\tawait setIfDefined(adapter, \"status.clean.area\", status.cleanArea);\n\tawait setIfDefined(adapter, \"status.clean.time\", status.cleanTime);\n\tawait setIfDefined(adapter, \"status.clean.totalArea\", status.totalArea);\n\tawait setIfDefined(adapter, \"status.clean.totalTime\", status.totalTime);\n\tawait setIfDefined(adapter, \"status.battery.percent\", status.batteryPercent);\n\tawait setIfDefined(adapter, \"status.battery.rawPercent\", status.batteryRawPercent);\n\tawait setIfDefined(adapter, \"status.water.level\", status.waterLevel);\n\tawait setIfDefined(adapter, \"status.mop.mode\", status.mopMode);\n\tawait setIfDefined(adapter, \"status.fan.mode\", status.fanMode);\n\tawait setIfDefined(adapter, \"status.error.rawCount\", status.errorRawCount);\n\tawait setIfDefined(adapter, \"status.maintenance.hasWarning\", status.maintenanceWarning);\n\tawait setIfDefined(adapter, \"status.maintenance.warningCount\", status.maintenanceWarningCount);\n\tawait setIfDefined(adapter, \"status.maintenance.message\", status.maintenanceMessage);\n\tawait setIfDefined(adapter, \"status.maintenance.details\", status.maintenanceDetails);\n\tawait setIfDefined(adapter, \"status.features.autoBoost\", status.autoBoost);\n\tawait setIfDefined(adapter, \"status.features.cleanComponents\", status.cleanComponents);\n\tawait adapter.setStateAsync(\"connection.lastStatusEvent\", { val: new Date().toISOString(), ack: true });\n}\n\nexport async function projectMaintenanceMessage(\n\tadapter: ioBroker.Adapter,\n\tmessage: MaintenanceMessage,\n\teventCount: number,\n): Promise<void> {\n\t// 20003 also contains ordinary events. Level 1 is shared by informational\n\t// and warning messages; receipt alone must not set or clear an active alarm.\n\tawait setIfDefined(adapter, \"status.maintenance.code\", message.code);\n\tawait setIfDefined(adapter, \"status.maintenance.level\", message.level);\n\tawait setIfDefined(adapter, \"status.maintenance.message\", message.message ?? message.title ?? \"\");\n\tawait adapter.setStateAsync(\"status.maintenance.details\", { val: message.details, ack: true });\n\tawait adapter.setStateAsync(\"status.maintenance.eventCount\", { val: eventCount, ack: true });\n\tawait adapter.setStateAsync(\"status.maintenance.updated\", { val: new Date().toISOString(), ack: true });\n}\n\nexport async function projectMaintenanceHistory(adapter: ioBroker.Adapter, history: MaintenanceHistory): Promise<void> {\n\tconst latest = history.messages[0];\n\tif (latest) {\n\t\tawait setIfDefined(adapter, \"status.maintenance.history.latestCode\", latest.code);\n\t\tawait setIfDefined(adapter, \"status.maintenance.history.latestLevel\", latest.level);\n\t\tawait setIfDefined(adapter, \"status.maintenance.history.latestMessage\", latest.message ?? latest.title ?? \"\");\n\t\tawait setIfDefined(adapter, \"status.maintenance.history.latestEventTime\", latest.eventTime);\n\t}\n\tawait adapter.setStateAsync(\"status.maintenance.history.items\", {\n\t\tval: JSON.stringify(history.messages.map(historyMessageItem)),\n\t\tack: true,\n\t});\n\tawait adapter.setStateAsync(\"status.maintenance.history.count\", { val: history.messages.length, ack: true });\n\tawait setIfDefined(adapter, \"status.maintenance.history.totalCount\", history.totalElements);\n\tawait adapter.setStateAsync(\"status.maintenance.history.updated\", { val: new Date().toISOString(), ack: true });\n\tawait adapter.setStateAsync(\"status.maintenance.history.lastReadResult\", { val: \"ok\", ack: true });\n\tawait adapter.setStateAsync(\"status.maintenance.history.lastError\", { val: \"\", ack: true });\n\tawait adapter.setStateAsync(\"capabilities.maintenanceMessages\", { val: true, ack: true });\n}\n\nexport async function projectConsumables(adapter: ioBroker.Adapter, consumables: ConsumableStates): Promise<void> {\n\tfor (const [component, state] of Object.entries(consumables)) {\n\t\tconst prefix = `consumables.${component}`;\n\t\tawait adapter.setStateAsync(`${prefix}.usedSeconds`, { val: state.usedSeconds, ack: true });\n\t\tawait adapter.setStateAsync(`${prefix}.intervalHours`, { val: state.intervalHours, ack: true });\n\t\tawait adapter.setStateAsync(`${prefix}.remainingPercent`, { val: state.remainingPercent, ack: true });\n\t\tawait adapter.setStateAsync(`${prefix}.overdueHours`, { val: state.overdueHours, ack: true });\n\t}\n\tawait adapter.setStateAsync(\"consumables.updated\", { val: new Date().toISOString(), ack: true });\n\tawait adapter.setStateAsync(\"consumables.lastReadResult\", { val: \"ok\", ack: true });\n\tawait adapter.setStateAsync(\"consumables.lastError\", { val: \"\", ack: true });\n\tawait adapter.setStateAsync(\"capabilities.consumables\", { val: true, ack: true });\n}\n\nexport async function setConsumablesReadFailure(adapter: ioBroker.Adapter, error: unknown): Promise<void> {\n\tawait adapter.setStateAsync(\"consumables.lastReadResult\", { val: \"failed\", ack: true });\n\tawait adapter.setStateAsync(\"consumables.lastError\", { val: redactedErrorMessage(error), ack: true });\n}\n\nexport async function setMaintenanceHistoryReadFailure(adapter: ioBroker.Adapter, error: unknown): Promise<void> {\n\tawait adapter.setStateAsync(\"status.maintenance.history.lastReadResult\", { val: \"failed\", ack: true });\n\tawait adapter.setStateAsync(\"status.maintenance.history.lastError\", {\n\t\tval: redactedErrorMessage(error),\n\t\tack: true,\n\t});\n}\n\nexport async function projectMapMetadata(adapter: ioBroker.Adapter, map: MapMetadata): Promise<void> {\n\tawait setIfDefined(adapter, \"map.available\", map.available);\n\tawait setIfDefined(adapter, \"map.id\", map.mapId);\n\tawait setIfDefined(adapter, \"map.pathId\", map.pathId);\n\tawait setIfDefined(adapter, \"map.width\", map.width);\n\tawait setIfDefined(adapter, \"map.height\", map.height);\n\tawait setIfDefined(adapter, \"map.resolution\", map.resolution);\n\tawait setIfDefined(adapter, \"map.areaCount\", map.areaCount);\n\tawait setIfDefined(adapter, \"map.compressedBytes\", map.compressedBytes);\n\tawait setIfDefined(adapter, \"map.encodedBytes\", map.encodedBytes);\n\tawait adapter.setStateAsync(\"map.updated\", { val: new Date().toISOString(), ack: true });\n\tawait adapter.setStateAsync(\"capabilities.maps\", { val: true, ack: true });\n}\n\nfunction historyMessageItem(message: MaintenanceMessage): Record<string, string | number> {\n\treturn {\n\t\t...(message.code !== undefined ? { code: message.code } : {}),\n\t\t...(message.level !== undefined ? { level: message.level } : {}),\n\t\t...(message.title !== undefined ? { title: message.title } : {}),\n\t\t...(message.message !== undefined ? { message: message.message } : {}),\n\t\t...(message.eventTime !== undefined ? { eventTime: message.eventTime } : {}),\n\t};\n}\n\nexport async function projectLiveMapImage(\n\tadapter: ioBroker.Adapter,\n\timage: LiveMapImage,\n\tdiagnostics: LiveMapProjectionDiagnostics,\n): Promise<void> {\n\tawait adapter.setStateAsync(\"map.live.image\", { val: image.dataUrl, ack: true });\n\tawait adapter.setStateAsync(\"map.live.areas\", { val: JSON.stringify(image.areas), ack: true });\n\tawait adapter.setStateAsync(\"map.live.updated\", { val: new Date().toISOString(), ack: true });\n\tawait adapter.setStateAsync(\"map.live.orientation\", { val: image.orientation, ack: true });\n\tawait adapter.setStateAsync(\"map.live.poseCount\", { val: image.poseCount, ack: true });\n\tawait adapter.setStateAsync(\"map.live.rawPoseCount\", { val: image.rawPoseCount, ack: true });\n\tawait adapter.setStateAsync(\"map.live.pathLineSegments\", { val: image.pathLineSegments, ack: true });\n\tawait adapter.setStateAsync(\"map.live.skippedPathSegments\", { val: image.skippedPathSegments, ack: true });\n\tawait adapter.setStateAsync(\"map.live.currentAreaCount\", { val: diagnostics.currentAreaCount, ack: true });\n\tawait adapter.setStateAsync(\"map.live.cachedAreaCount\", { val: diagnostics.cachedAreaCount, ack: true });\n\tawait adapter.setStateAsync(\"map.live.renderedForbiddenAreaCount\", {\n\t\tval: image.renderedForbiddenAreaCount,\n\t\tack: true,\n\t});\n\tawait adapter.setStateAsync(\"map.live.renderedRoomAreaCount\", { val: image.renderedRoomAreaCount, ack: true });\n\tawait adapter.setStateAsync(\"map.live.hasCachedStaticOverlays\", {\n\t\tval: diagnostics.hasCachedStaticOverlays,\n\t\tack: true,\n\t});\n\tawait adapter.setStateAsync(\"map.live.renderReason\", { val: diagnostics.renderReason, ack: true });\n\tawait setIfDefined(adapter, \"map.live.lastPathId\", diagnostics.lastPathId);\n\tawait adapter.setStateAsync(\"map.live.pathResetCount\", { val: diagnostics.pathResetCount, ack: true });\n\tawait adapter.setStateAsync(\"map.live.lastPoseUpdated\", { val: diagnostics.lastPoseUpdated ?? \"\", ack: true });\n\tawait adapter.setStateAsync(\"map.live.decompressedBytes\", { val: image.decompressedBytes, ack: true });\n\tawait adapter.setStateAsync(\"capabilities.maps\", { val: true, ack: true });\n}\n\nexport async function setConnectionState(\n\tadapter: ioBroker.Adapter,\n\tid: \"cloud\" | \"gateway\",\n\tconnected: boolean,\n): Promise<void> {\n\tawait adapter.setStateAsync(`connection.${id}`, { val: connected, ack: true });\n\tif (id === \"cloud\") {\n\t\tawait adapter.setStateAsync(\"info.connection\", { val: connected, ack: true });\n\t}\n}\n\nexport async function setLastError(adapter: ioBroker.Adapter, error: unknown): Promise<void> {\n\tawait adapter.setStateAsync(\"connection.lastError\", { val: redactedErrorMessage(error), ack: true });\n}\n\nexport function redactedErrorMessage(error: unknown): string {\n\tconst message = error instanceof Error ? error.message : String(error);\n\treturn message\n\t\t.replace(/[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,}/gu, \"<redacted-email>\")\n\t\t.replace(/\\b\\d{1,3}(?:\\.\\d{1,3}){3}(?::\\d{1,5})?\\b/gu, \"<redacted-address>\")\n\t\t.replace(/\\b[a-z0-9.-]+\\.[a-z]{2,}(?::\\d{1,5})?\\b/giu, \"<redacted-host>\");\n}\n\nasync function setIfDefined(\n\tadapter: ioBroker.Adapter,\n\tid: string,\n\tvalue: string | number | boolean | undefined,\n): Promise<void> {\n\tif (value !== undefined) {\n\t\tawait adapter.setStateAsync(id, { val: value, ack: true });\n\t}\n}\n\nlet cachedM7ProImageDataUrl: string | undefined;\n\nfunction deviceImageDataUrl(device: DeviceRecord): string {\n\tif (device.code !== \"M7_PRO\" || device.model !== \"811_LDS\") {\n\t\treturn \"\";\n\t}\n\n\tcachedM7ProImageDataUrl ??= readAssetDataUrl(\"proscenic-m7-pro.png\");\n\treturn cachedM7ProImageDataUrl;\n}\n\nfunction displayDeviceCode(code: string | undefined): string | undefined {\n\treturn code ? `PROSCENIC ${code}` : undefined;\n}\n\nfunction readAssetDataUrl(fileName: string): string {\n\tfor (const candidate of [\n\t\tjoin(__dirname, \"..\", \"admin\", fileName),\n\t\tjoin(__dirname, \"..\", \"..\", \"admin\", fileName),\n\t]) {\n\t\tif (existsSync(candidate)) {\n\t\t\treturn `data:image/png;base64,${readFileSync(candidate).toString(\"base64\")}`;\n\t\t}\n\t}\n\treturn \"\";\n}\n"],
5
+ "mappings": "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",
6
+ "names": []
7
+ }
@@ -0,0 +1,81 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+ var crypto_exports = {};
20
+ __export(crypto_exports, {
21
+ FRAME_DELIMITER: () => FRAME_DELIMITER,
22
+ decryptGatewayPayload: () => decryptGatewayPayload,
23
+ gatewayHandshake: () => gatewayHandshake,
24
+ md5Hex: () => md5Hex,
25
+ parseJsonObject: () => parseJsonObject,
26
+ splitFrames: () => splitFrames
27
+ });
28
+ module.exports = __toCommonJS(crypto_exports);
29
+ var import_node_crypto = require("node:crypto");
30
+ const FRAME_DELIMITER = "# #";
31
+ function md5Hex(value) {
32
+ return (0, import_node_crypto.createHash)("md5").update(value, "utf8").digest("hex");
33
+ }
34
+ function gatewayHandshake(token, serial) {
35
+ return JSON.stringify({
36
+ data: {
37
+ token,
38
+ sn: serial
39
+ },
40
+ infoType: 70001
41
+ }) + FRAME_DELIMITER;
42
+ }
43
+ function splitFrames(buffer) {
44
+ const frames = [];
45
+ let rest = buffer;
46
+ for (; ; ) {
47
+ const index = rest.indexOf(FRAME_DELIMITER);
48
+ if (index === -1) {
49
+ return { frames, rest };
50
+ }
51
+ frames.push(rest.slice(0, index));
52
+ rest = rest.slice(index + FRAME_DELIMITER.length);
53
+ }
54
+ }
55
+ function decryptGatewayPayload(base64Payload, token) {
56
+ const key = Buffer.from(token, "utf8");
57
+ if (![16, 24, 32].includes(key.length)) {
58
+ throw new Error("Unsupported AES key length");
59
+ }
60
+ const decipher = (0, import_node_crypto.createDecipheriv)(`aes-${key.length * 8}-ecb`, key, null);
61
+ decipher.setAutoPadding(true);
62
+ const decrypted = Buffer.concat([decipher.update(Buffer.from(base64Payload, "base64")), decipher.final()]);
63
+ return decrypted.toString("utf8").replace(/\0+$/u, "");
64
+ }
65
+ function parseJsonObject(text) {
66
+ const parsed = JSON.parse(text);
67
+ if (parsed === null || typeof parsed !== "object" || Array.isArray(parsed)) {
68
+ throw new Error("Expected JSON object");
69
+ }
70
+ return parsed;
71
+ }
72
+ // Annotate the CommonJS export names for ESM import in node:
73
+ 0 && (module.exports = {
74
+ FRAME_DELIMITER,
75
+ decryptGatewayPayload,
76
+ gatewayHandshake,
77
+ md5Hex,
78
+ parseJsonObject,
79
+ splitFrames
80
+ });
81
+ //# sourceMappingURL=crypto.js.map