iobroker.statechart 0.1.1 → 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -21
- package/README.md +59 -438
- package/admin/build/tab.js +133 -130
- package/admin/statechart.png +0 -0
- package/admin/{style.css → tab.css} +0 -2
- package/admin/tab_m.html +1 -1
- package/build/lib/chart-analysis.js +367 -0
- package/build/lib/chart-analysis.js.map +7 -0
- package/build/lib/chart-codegen.js +405 -0
- package/build/lib/chart-codegen.js.map +7 -0
- package/build/lib/chart-helpers.js +102 -0
- package/build/lib/chart-helpers.js.map +7 -0
- package/build/lib/chart-model.js +477 -0
- package/build/lib/chart-model.js.map +7 -0
- package/build/lib/chart-runtime.js +1521 -0
- package/build/lib/chart-runtime.js.map +7 -0
- package/build/lib/chart-structure.js +172 -0
- package/build/lib/chart-structure.js.map +7 -0
- package/build/lib/chart-validation.js +372 -0
- package/build/lib/chart-validation.js.map +7 -0
- package/build/main.js +638 -0
- package/build/main.js.map +7 -0
- package/io-package.json +31 -34
- package/package.json +21 -17
- package/admin/i18n/de.json +0 -4
- package/admin/i18n/en.json +0 -4
- package/admin/i18n/es.json +0 -4
- package/admin/i18n/fr.json +0 -4
- package/admin/i18n/it.json +0 -4
- package/admin/i18n/nl.json +0 -4
- package/admin/i18n/pl.json +0 -4
- package/admin/i18n/pt.json +0 -4
- package/admin/i18n/ru.json +0 -4
- package/admin/i18n/uk.json +0 -4
- package/admin/i18n/zh-cn.json +0 -4
- package/admin/jsonConfig.json +0 -19
- package/admin/statechart.svg +0 -38
- package/lib/adapter-config.d.ts +0 -19
- package/lib/chart-codegen.js +0 -436
- package/lib/chart-codegen.test.js +0 -132
- package/lib/chart-helpers.js +0 -74
- package/lib/chart-helpers.test.js +0 -38
- package/lib/chart-model.js +0 -577
- package/lib/chart-model.test.js +0 -189
- package/lib/chart-runtime.js +0 -797
- package/lib/chart-runtime.test.js +0 -699
- package/lib/chart-structure.js +0 -106
- package/lib/chart-validation.js +0 -328
- package/lib/chart-validation.test.js +0 -149
- package/main.js +0 -279
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/main.ts"],
|
|
4
|
+
"sourcesContent": ["/*\n * Created with @iobroker/create-adapter v3.1.5\n */\n\n// The adapter-core module gives you access to the core ioBroker functions\n// you need to create an adapter\nimport * as utils from \"@iobroker/adapter-core\";\nimport type { Chart } from \"./lib/chart-model\";\nimport { ChartRuntime } from \"./lib/chart-runtime\";\nimport type { HistoryEntry, Location } from \"./lib/chart-runtime\";\n\n/** Maximum number of entries in the history of a chart (state charts.<chart>.history) */\nconst HISTORY_LENGTH = 200;\n\n/** A simulation ends when the editor did not send a message for this time, e.g. because it was closed */\nconst SIMULATION_TIMEOUT_MS = 2 * 60 * 1000;\n\n/** States of each chart which control it, written by vis, scripts etc. (without ack) */\nconst CONTROLS = [\"enabled\", \"reset\", \"event\"] as const;\ntype Control = (typeof CONTROLS)[number];\n\nclass Statechart extends utils.Adapter {\n /** running charts by chart ID */\n private runtimes = new Map<string, ChartRuntime>();\n /** foreign states we are subscribed to */\n private subscribedInputs = new Set<string>();\n /** chart (re)starts are executed one after another */\n private chartQueue = Promise.resolve();\n /** for the astro helper functions */\n private location: Location | null = null;\n /** the last events of each chart by chart ID, newest last, also stored in charts.<chart>.history */\n private histories = new Map<string, HistoryEntry[]>();\n /** charts which run as simulation (their runtime is in runtimes), with the timer which ends the simulation */\n private simulations = new Map<string, ioBroker.Timeout | undefined>();\n\n public constructor(options: Partial<utils.AdapterOptions> = {}) {\n super({\n ...options,\n name: \"statechart\",\n });\n this.on(\"ready\", this.onReady.bind(this));\n this.on(\"stateChange\", this.onStateChange.bind(this));\n this.on(\"objectChange\", this.onObjectChange.bind(this));\n this.on(\"message\", this.onMessage.bind(this));\n this.on(\"unload\", this.onUnload.bind(this));\n }\n\n /**\n * Is called when databases are connected and adapter received configuration.\n */\n private async onReady(): Promise<void> {\n await this.setObjectNotExistsAsync(\"charts\", {\n type: \"folder\",\n common: { name: \"Charts\" },\n native: {},\n });\n await this.loadLocation();\n\n const objects = await this.getForeignObjectsAsync(`${this.namespace}.charts.*`, \"channel\");\n for (const [id, obj] of Object.entries(objects)) {\n const chartId = this.getChartId(id);\n if (chartId) {\n // continue where the chart was before the adapter stopped\n await this.startChart(chartId, obj, true);\n }\n }\n\n // the editor saves charts as objects, restart a chart (in its initial state) whenever it changes\n this.subscribeObjects(\"charts.*\");\n // the editor clears the history by writing to it\n this.subscribeStates(\"charts.*.history\");\n for (const control of CONTROLS) {\n this.subscribeStates(`charts.*.${control}`);\n }\n }\n\n /**\n * Reads the location of the ioBroker system settings, used by isDaytime() and astroTime()\n */\n private async loadLocation(): Promise<void> {\n const config = await this.getForeignObjectAsync(\"system.config\");\n const latitude = parseFloat(String(config?.common?.latitude ?? \"\"));\n const longitude = parseFloat(String(config?.common?.longitude ?? \"\"));\n if (Number.isFinite(latitude) && Number.isFinite(longitude)) {\n this.location = { latitude, longitude };\n } else {\n this.log.info(\"No location configured in the system settings, isDaytime() and astroTime() do not work\");\n }\n }\n\n /**\n * Extracts the chart ID from the ID of a chart object\n *\n * @param id Object ID\n * @returns undefined if the ID is no chart object\n */\n private getChartId(id: string): string | undefined {\n const prefix = `${this.namespace}.charts.`;\n if (!id.startsWith(prefix)) {\n return undefined;\n }\n const chartId = id.substring(prefix.length);\n return chartId.includes(\".\") ? undefined : chartId;\n }\n\n /**\n * @param id State ID\n * @returns the chart ID and the name of the state if it is a state of a chart, e.g. \"history\"\n */\n private parseChartStateId(id: string): { chartId: string; name: string } | undefined {\n const match = /^charts\\.([^.]+)\\.([^.]+)$/.exec(id.substring(this.namespace.length + 1));\n return id.startsWith(`${this.namespace}.`) && match ? { chartId: match[1], name: match[2] } : undefined;\n }\n\n /**\n * @param chartId Chart ID\n * @param obj Chart object\n * @param restore Continue with the persisted state instead of the initial state\n */\n private async startChart(chartId: string, obj: ioBroker.Object | null | undefined, restore = false): Promise<void> {\n const chart: Chart | undefined = obj?.type === \"channel\" ? obj.native?.chart : undefined;\n if (!chart) {\n // e.g. the chart was deleted\n this.histories.delete(chartId);\n return;\n }\n\n await this.createChartStates(chartId);\n await this.loadHistory(chartId);\n await this.setState(`charts.${chartId}.enabled`, chart.enabled !== false, true);\n await this.setState(`charts.${chartId}.simulation`, false, true);\n await this.setState(`charts.${chartId}.simulationStatus`, \"\", true);\n // e.g. a new chart, which was just created in the editor: nothing to execute, but no error either\n const empty = !chart.states?.length;\n if (!chart.enabled || empty) {\n if (empty) {\n this.log.warn(`Chart \"${chart.name}\" has no states, it is not started`);\n } else {\n this.log.info(`Chart \"${chart.name}\" is paused`);\n }\n // no state is active, so the editor does not highlight the last active state anymore\n await this.setState(`charts.${chartId}.activeState`, \"\", true);\n await this.setState(`charts.${chartId}.activeStateIds`, \"[]\", true);\n // the editor shows no values of a chart which does not run\n await this.setState(`charts.${chartId}.values`, \"{}\", true);\n return;\n }\n\n const runtime = this.createRuntime(chartId, chart);\n try {\n await runtime.start({ restore });\n } catch (err) {\n this.log.error(`Cannot start chart \"${chart.name}\": ${err.message}`);\n return;\n }\n this.runtimes.set(chartId, runtime);\n this.updateSubscriptions();\n this.log.info(`Chart \"${chart.name}\" started`);\n }\n\n /**\n * @param chartId Chart ID\n * @param chart The chart\n * @param simulated Run it as simulation, see ChartRuntime\n */\n private createRuntime(chartId: string, chart: Chart, simulated = false): ChartRuntime {\n return new ChartRuntime(\n chartId,\n chart,\n {\n readState: async id => (await this.getForeignStateAsync(id))?.val ?? null,\n getState: id => this.getForeignStateAsync(id),\n writeState: async (id, val, ack = false) => {\n await this.setForeignStateAsync(id, val, ack);\n },\n sendTo: (instance, command, message) => this.sendTo(instance, command, message),\n getLocation: () => this.location,\n onActiveChange: ({ names, ids }) => {\n void this.setState(`charts.${chartId}.activeState`, names, true);\n void this.setState(`charts.${chartId}.activeStateIds`, JSON.stringify(ids), true);\n },\n persist: data => {\n void this.setState(`charts.${chartId}.snapshot`, JSON.stringify(data), true);\n },\n onValues: values => {\n void this.setState(`charts.${chartId}.values`, JSON.stringify(values), true);\n },\n onHistory: entries => this.addHistory(chartId, entries),\n onSimulationStatus: status => {\n void this.setState(`charts.${chartId}.simulationStatus`, JSON.stringify(status), true);\n },\n loadPersisted: async () => {\n const state = await this.getStateAsync(`charts.${chartId}.snapshot`);\n return typeof state?.val === \"string\" && state.val ? JSON.parse(state.val) : null;\n },\n log: this.log,\n // the timers of the adapter are cleared when it is unloaded\n setTimeout: (callback, ms) => this.setTimeout(callback, ms),\n clearTimeout: handle => this.clearTimeout(handle as ioBroker.Timeout | undefined),\n },\n simulated,\n );\n }\n\n /**\n * Stops the chart and runs the given version of it as simulation, see ChartRuntime\n *\n * @param chartId Chart ID\n * @param chart The chart as shown in the editor, may have unsaved changes\n * @param breakpoints IDs of the states and transitions with a breakpoint\n */\n private async startSimulation(chartId: string, chart: Chart, breakpoints: string[] = []): Promise<void> {\n if (!chart?.states?.length) {\n throw new Error(\"The chart has no states\");\n }\n this.stopChart(chartId);\n this.endSimulationTimer(chartId);\n const runtime = this.createRuntime(chartId, chart, true);\n // also for the initial states\n runtime.breakpoints = new Set(breakpoints);\n // registered before the start, so the start can be cancelled like a running simulation\n this.simulations.set(\n chartId,\n this.setTimeout(() => this.onSimulationTimeout(chartId), SIMULATION_TIMEOUT_MS),\n );\n try {\n await runtime.start();\n } catch (err) {\n this.endSimulationTimer(chartId);\n await this.restartChart(chartId);\n throw err;\n }\n this.runtimes.set(chartId, runtime);\n this.updateSubscriptions();\n await this.setState(`charts.${chartId}.simulation`, true, true);\n this.log.info(`Chart \"${chart.name}\" runs as simulation, its outputs are not written`);\n }\n\n /**\n * Ends the simulation of a chart, the real chart continues where it was before\n *\n * @param chartId Chart ID\n */\n private async stopSimulation(chartId: string): Promise<void> {\n if (!this.simulations.has(chartId)) {\n return;\n }\n this.endSimulationTimer(chartId);\n this.stopChart(chartId);\n this.log.info(`Simulation of chart ${chartId} ended`);\n await this.restartChart(chartId, true);\n }\n\n /**\n * @param chartId Chart ID\n */\n private endSimulationTimer(chartId: string): void {\n this.clearTimeout(this.simulations.get(chartId));\n this.simulations.delete(chartId);\n }\n\n /**\n * @param chartId Chart ID\n */\n private onSimulationTimeout(chartId: string): void {\n this.log.info(`Simulation of chart ${chartId} ended, the editor did not answer anymore`);\n this.chartQueue = this.chartQueue\n .then(() => this.stopSimulation(chartId))\n .catch(err => this.log.error(`Cannot end the simulation of chart ${chartId}: ${err.message}`));\n }\n\n /**\n * Starts a chart with the stored version\n *\n * @param chartId Chart ID\n * @param restore Continue with the persisted state instead of the initial state\n */\n private async restartChart(chartId: string, restore = false): Promise<void> {\n await this.startChart(chartId, await this.getObjectAsync(`charts.${chartId}`), restore);\n }\n\n /**\n * Messages of the editor, for the simulation\n *\n * @param obj The message\n */\n private onMessage(obj: ioBroker.Message): void {\n if (typeof obj !== \"object\" || !obj.command) {\n return;\n }\n const message = (obj.message || {}) as {\n chartId?: string;\n chart?: Chart;\n name?: string;\n value?: any;\n breakpoints?: string[];\n ms?: number;\n };\n const chartId = String(message.chartId || \"\");\n const reply = (response: Record<string, any>): void => {\n if (obj.callback) {\n this.sendTo(obj.from, obj.command, response, obj.callback);\n }\n };\n const simulating = this.simulations.has(chartId);\n if (simulating) {\n // every message of the editor keeps the simulation alive\n this.clearTimeout(this.simulations.get(chartId));\n this.simulations.set(\n chartId,\n this.setTimeout(() => this.onSimulationTimeout(chartId), SIMULATION_TIMEOUT_MS),\n );\n }\n const runtime = this.runtimes.get(chartId);\n switch (obj.command) {\n case \"simulationStart\":\n this.chartQueue = this.chartQueue\n .then(() => this.startSimulation(chartId, message.chart as Chart, message.breakpoints))\n .then(() => reply({ ok: true }))\n .catch(err => reply({ error: err.message }));\n return;\n case \"simulationStop\":\n this.chartQueue = this.chartQueue\n .then(() => this.stopSimulation(chartId))\n .then(() => reply({ ok: true }))\n .catch(err => reply({ error: err.message }));\n return;\n case \"simulationInput\":\n if (!simulating || !runtime) {\n reply({ error: \"No simulation is running\" });\n } else if (!runtime.simulateInput(String(message.name), message.value)) {\n reply({ error: `Unknown input \"${message.name}\"` });\n } else {\n reply({ ok: true });\n }\n return;\n case \"simulationEvent\":\n if (!simulating || !runtime) {\n reply({ error: \"No simulation is running\" });\n } else if (!runtime.handleEvent(String(message.name))) {\n reply({ error: `Unknown input \"${message.name}\"` });\n } else {\n reply({ ok: true });\n }\n return;\n case \"simulationPing\":\n reply({ ok: simulating });\n return;\n case \"simulationBreakpoints\":\n case \"simulationPause\":\n case \"simulationResume\":\n case \"simulationStep\":\n case \"simulationAdvance\":\n if (!simulating || !runtime) {\n reply({ error: \"No simulation is running\" });\n return;\n }\n if (obj.command === \"simulationBreakpoints\") {\n runtime.breakpoints = new Set(Array.isArray(message.breakpoints) ? message.breakpoints : []);\n } else if (obj.command === \"simulationPause\") {\n runtime.pauseSimulation();\n } else if (obj.command === \"simulationResume\") {\n runtime.resumeSimulation();\n } else if (obj.command === \"simulationStep\") {\n runtime.stepSimulation();\n } else if (typeof message.ms === \"number\" && message.ms > 0) {\n runtime.advanceTime(message.ms);\n } else {\n // without a time: to the next timer\n runtime.advanceToNextTimer();\n }\n reply({ ok: true });\n return;\n default:\n reply({ error: `Unknown command \"${obj.command}\"` });\n }\n }\n\n /**\n * Reads the stored history of a chart, if it is not known yet\n *\n * @param chartId Chart ID\n */\n private async loadHistory(chartId: string): Promise<void> {\n if (this.histories.has(chartId)) {\n return;\n }\n let history: HistoryEntry[] = [];\n try {\n const state = await this.getStateAsync(`charts.${chartId}.history`);\n const parsed = typeof state?.val === \"string\" && state.val ? JSON.parse(state.val) : [];\n history = Array.isArray(parsed) ? parsed : [];\n } catch {\n // an invalid history is replaced by a new one\n }\n this.histories.set(chartId, history);\n }\n\n /**\n * Appends events to the history of a chart and stores it\n *\n * @param chartId Chart ID\n * @param entries The new events\n */\n private addHistory(chartId: string, entries: HistoryEntry[]): void {\n const history = [...(this.histories.get(chartId) || []), ...entries].slice(-HISTORY_LENGTH);\n this.histories.set(chartId, history);\n void this.setState(`charts.${chartId}.history`, JSON.stringify(history), true);\n }\n\n /**\n * @param chartId Chart ID\n */\n private stopChart(chartId: string): void {\n const runtime = this.runtimes.get(chartId);\n if (runtime) {\n runtime.stop();\n this.runtimes.delete(chartId);\n this.updateSubscriptions();\n }\n }\n\n /**\n * Creates the states which show the current status of a chart\n *\n * @param chartId Chart ID\n */\n private async createChartStates(chartId: string): Promise<void> {\n await this.setObjectNotExistsAsync(`charts.${chartId}.activeState`, {\n type: \"state\",\n common: {\n name: \"Active state\",\n type: \"string\",\n role: \"text\",\n read: true,\n write: false,\n },\n native: {},\n });\n await this.setObjectNotExistsAsync(`charts.${chartId}.snapshot`, {\n type: \"state\",\n common: {\n name: \"Stored state of the chart, restored after a restart of the adapter\",\n type: \"string\",\n role: \"json\",\n read: true,\n write: false,\n },\n native: {},\n });\n await this.setObjectNotExistsAsync(`charts.${chartId}.activeStateIds`, {\n type: \"state\",\n common: {\n name: \"IDs of all active states\",\n type: \"string\",\n role: \"json\",\n read: true,\n write: false,\n },\n native: {},\n });\n await this.setObjectNotExistsAsync(`charts.${chartId}.values`, {\n type: \"state\",\n common: {\n name: \"Current values of all variables\",\n type: \"string\",\n role: \"json\",\n read: true,\n write: false,\n },\n native: {},\n });\n await this.setObjectNotExistsAsync(`charts.${chartId}.history`, {\n type: \"state\",\n common: {\n name: `Last ${HISTORY_LENGTH} events: starts and transitions taken, write anything to clear it`,\n type: \"string\",\n role: \"json\",\n read: true,\n write: true,\n },\n native: {},\n });\n await this.setObjectNotExistsAsync(`charts.${chartId}.enabled`, {\n type: \"state\",\n common: {\n name: \"Chart runs: false pauses it, true starts it in its initial state\",\n type: \"boolean\",\n role: \"switch.enable\",\n read: true,\n write: true,\n },\n native: {},\n });\n await this.setObjectNotExistsAsync(`charts.${chartId}.reset`, {\n type: \"state\",\n common: {\n name: \"Restart the running chart in its initial state\",\n type: \"boolean\",\n role: \"button\",\n read: false,\n write: true,\n },\n native: {},\n });\n await this.setObjectNotExistsAsync(`charts.${chartId}.simulation`, {\n type: \"state\",\n common: {\n name: \"The chart runs as simulation from the editor, its outputs are not written\",\n type: \"boolean\",\n role: \"indicator\",\n read: true,\n write: false,\n },\n native: {},\n });\n await this.setObjectNotExistsAsync(`charts.${chartId}.simulationStatus`, {\n type: \"state\",\n common: {\n name: \"Status of the simulation as JSON: paused, time offset, queued wakeups, next timer, breakpoint\",\n type: \"string\",\n role: \"json\",\n read: true,\n write: false,\n },\n native: {},\n });\n await this.setObjectNotExistsAsync(`charts.${chartId}.event`, {\n type: \"state\",\n common: {\n name: \"Name of an input: wakes up the chart with this event, without changing the value of the input\",\n type: \"string\",\n role: \"text\",\n read: true,\n write: true,\n },\n native: {},\n });\n }\n\n /**\n * Executes a command written to a control state of a chart\n *\n * @param chartId Chart ID\n * @param control Name of the state\n * @param val The written value\n */\n private async handleControl(chartId: string, control: Control, val: ioBroker.StateValue): Promise<void> {\n const id = `charts.${chartId}.${control}`;\n const obj = await this.getObjectAsync(`charts.${chartId}`);\n const chart: Chart | undefined = obj?.type === \"channel\" ? obj.native?.chart : undefined;\n if (!chart) {\n return;\n }\n if (control === \"enabled\") {\n const enabled = val === true || val === \"true\" || val === 1;\n if (enabled === (chart.enabled !== false)) {\n await this.setState(id, enabled, true);\n return;\n }\n // like the button in the editor: the change of the object stops or restarts the chart, which also\n // confirms the state, see startChart()\n await this.extendObjectAsync(`charts.${chartId}`, { native: { chart: { enabled } } });\n return;\n }\n const runtime = this.runtimes.get(chartId);\n if (control === \"reset\") {\n if (this.simulations.has(chartId)) {\n this.log.info(`Chart \"${chart.name}\" is not reset, it runs as simulation`);\n } else if (runtime) {\n this.log.info(`Chart \"${chart.name}\" is reset`);\n this.chartQueue = this.chartQueue\n .then(async () => {\n this.stopChart(chartId);\n await this.startChart(chartId, obj);\n })\n .catch(err => this.log.error(`Cannot reset chart ${chartId}: ${err.message}`));\n await this.chartQueue;\n } else {\n this.log.info(`Chart \"${chart.name}\" is not reset, it does not run`);\n }\n await this.setState(id, false, true);\n return;\n }\n // event\n const name = String(val ?? \"\").trim();\n if (!runtime) {\n this.log.info(`Event \"${name}\" ignored, chart \"${chart.name}\" does not run`);\n } else if (!runtime.handleEvent(name)) {\n this.log.warn(`Chart \"${chart.name}\": unknown event \"${name}\", use the name of an input`);\n }\n await this.setState(id, name, true);\n }\n\n /**\n * Subscribes to all inputs of the running charts and unsubscribes from the ones no longer used\n */\n private updateSubscriptions(): void {\n const needed = new Set([...this.runtimes.values()].flatMap(runtime => runtime.subscribedStateIds));\n for (const id of needed) {\n if (!this.subscribedInputs.has(id)) {\n this.subscribeForeignStates(id);\n }\n }\n for (const id of this.subscribedInputs) {\n if (!needed.has(id)) {\n this.unsubscribeForeignStates(id);\n }\n }\n this.subscribedInputs = needed;\n }\n\n /**\n * Is called when adapter shuts down - callback has to be called under any circumstances!\n *\n * @param callback Callback function\n */\n private onUnload(callback: () => void): void {\n try {\n for (const timer of this.simulations.values()) {\n this.clearTimeout(timer);\n }\n this.simulations.clear();\n for (const runtime of this.runtimes.values()) {\n runtime.stop();\n }\n this.runtimes.clear();\n callback();\n } catch (error) {\n this.log.error(`Error during unloading: ${error.message}`);\n callback();\n }\n }\n\n /**\n * Is called if a subscribed object changes\n *\n * @param id Object ID\n * @param obj Object\n */\n private onObjectChange(id: string, obj: ioBroker.Object | null | undefined): void {\n const chartId = this.getChartId(id);\n if (!chartId) {\n return;\n }\n this.chartQueue = this.chartQueue\n .then(async () => {\n // e.g. saved in the editor: a simulation ends, the new version starts\n this.endSimulationTimer(chartId);\n this.stopChart(chartId);\n await this.startChart(chartId, obj);\n })\n .catch(err => this.log.error(`Cannot restart chart ${chartId}: ${err.message}`));\n }\n\n /**\n * Is called if a subscribed state changes\n *\n * @param id State ID\n * @param state State object\n */\n private onStateChange(id: string, state: ioBroker.State | null | undefined): void {\n if (!state) {\n return;\n }\n const own = this.parseChartStateId(id);\n if (own?.name === \"history\") {\n // written by the editor (\"clear\"), the adapter's own updates are acknowledged\n if (!state.ack) {\n this.histories.set(own.chartId, []);\n void this.setState(`charts.${own.chartId}.history`, \"[]\", true);\n }\n return;\n }\n if (own && CONTROLS.includes(own.name as Control)) {\n // commands only, the adapter confirms them with ack\n if (!state.ack) {\n this.handleControl(own.chartId, own.name as Control, state.val).catch(err =>\n this.log.error(`Cannot execute ${id}: ${err.message}`),\n );\n }\n return;\n }\n for (const runtime of this.runtimes.values()) {\n runtime.handleStateChange(id, state);\n }\n }\n}\n\nif (require.main !== module) {\n // Export the constructor in compact mode\n module.exports = (options: Partial<utils.AdapterOptions> | undefined) => new Statechart(options);\n} else {\n // otherwise start the instance directly\n (() => new Statechart())();\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
package/io-package.json
CHANGED
|
@@ -1,8 +1,34 @@
|
|
|
1
1
|
{
|
|
2
2
|
"common": {
|
|
3
3
|
"name": "statechart",
|
|
4
|
-
"version": "0.
|
|
4
|
+
"version": "0.3.0",
|
|
5
5
|
"news": {
|
|
6
|
+
"0.3.0": {
|
|
7
|
+
"en": "simulation: the chart runs in the editor without switching anything, the inputs are set by hand, advance the time, pause, single steps and breakpoints on states and transitions\nparallel states (AND) with an execution order, and history junctions: entering a state returns to its last active sub state\nmore temporal logic: `before`, `at`, `every`, counting the wakeups by an input (`after(3, button)`), `after(5, min, condition)`, `elapsed()`, `duration()`, and every day at a time or astro event (`at(\"22:30\")`, `at(\"sunset\", -30)`)\n`getState(\"id\")` reads any state in conditions and actions, control states per chart: `enabled`, `reset` and `event`\nstatic check of the chart: states which never become active or are never left, transitions which are never taken, conditions which are never true, unused variables\neditor: color of each state (every second level of nested states darker), right-angled transitions as option, snap to the grid, align and distribute, labels of transitions can be moved\neditor: toolbar grouped by tasks with new buttons to cut and delete, collapsible side panels, colors and icons for each kind of element, variables grouped by kind with a search\neditor: transitions are black, their labels have no background\nexport of the whole chart as PNG image\nfixed: labels of transitions inside a superstate were hidden, labels of several transitions between the same states and the line to a moved label covered text, self transitions on the top or right side were drawn twisted",
|
|
8
|
+
"de": "Simulation: Das Chart läuft im Editor, ohne etwas zu schalten, die Eingänge werden von Hand gesetzt, Zeit vorspulen, Pause, Einzelschritte und Haltepunkte auf Zuständen und Übergängen\nParallele Zustände (UND) mit Ausführungsreihenfolge und History-Junction: Beim Betreten eines Zustands geht es in den zuletzt aktiven Unterzustand zurück\nMehr Zeitlogik: `before`, `at`, `every`, Zählen des Aufweckens durch einen Eingang (`after(3, button)`), `after(5, min, condition)`, `elapsed()`, `duration()` und jeden Tag zu einer Uhrzeit oder einem Astro-Ereignis (`at(\"22:30\")`, `at(\"sunset\", -30)`)\n`getState(\"id\")` liest beliebige Datenpunkte in Bedingungen und Aktionen, Steuer-Datenpunkte pro Chart: `enabled`, `reset`, `event`\nStatische Prüfung des Charts: Zustände, die nie aktiv oder nie verlassen werden, Übergänge, die nie genommen werden, Bedingungen, die nie wahr sind, ungenutzte Variablen\nEditor: Farbe pro Zustand (jede zweite Ebene verschachtelter Zustände dunkler), rechtwinklige Übergänge als Option, Einrasten am Raster, Ausrichten und Verteilen, verschiebbare Beschriftungen von Übergängen\nEditor: Werkzeugleiste nach Aufgaben gruppiert mit neuen Knöpfen zum Ausschneiden und Löschen, einklappbare Seitenspalten, Farben und Symbole für jede Art von Element, Variablen nach Art gruppiert mit Suche\nEditor: Übergänge sind schwarz, ihre Beschriftungen haben keinen Hintergrund\nExport des ganzen Charts als PNG-Bild\nBehoben: Beschriftungen von Übergängen in einem Superstate waren verdeckt, Beschriftungen mehrerer Übergänge zwischen denselben Zuständen und die Linie zu einer verschobenen Beschriftung überdeckten Text, Selbstübergänge oben oder rechts wurden verdreht gezeichnet",
|
|
9
|
+
"ru": "Симуляция: диаграмма выполняется в редакторе, ничего не переключая, входы задаются вручную, перемотка времени, пауза, пошаговое выполнение и точки останова на состояниях и переходах\nПараллельные состояния (И) с порядком выполнения и узел истории: при входе в состояние возвращается последнее активное подсостояние\nБольше временной логики: `before`, `at`, `every`, подсчёт пробуждений по входу (`after(3, button)`), `after(5, min, condition)`, `elapsed()`, `duration()`, а также каждый день в заданное время или по астрособытию (`at(\"22:30\")`, `at(\"sunset\", -30)`)\n`getState(\"id\")` читает любые состояния в условиях и действиях, управляющие состояния для каждой диаграммы: `enabled`, `reset`, `event`\nСтатическая проверка диаграммы: состояния, которые никогда не становятся активными или не покидаются, переходы, которые никогда не выполняются, условия, которые никогда не истинны, неиспользуемые переменные\nРедактор: цвет каждого состояния (каждый второй уровень вложенных состояний темнее), прямоугольные переходы как опция, привязка к сетке, выравнивание и распределение, перемещаемые подписи переходов\nРедактор: панель инструментов сгруппирована по задачам, новые кнопки «Вырезать» и «Удалить», сворачиваемые боковые панели, цвета и значки для каждого вида элементов, переменные сгруппированы по виду и с поиском\nРедактор: переходы чёрные, их подписи без фона\nЭкспорт всей диаграммы как изображения PNG\nИсправлено: подписи переходов внутри суперсостояния были скрыты, подписи нескольких переходов между одними и теми же состояниями и линия к перемещённой подписи перекрывали текст, переходы в себя сверху или справа рисовались перекрученными",
|
|
10
|
+
"pt": "Simulação: o gráfico é executado no editor sem acionar nada, as entradas são definidas manualmente, avançar o tempo, pausa, passos individuais e pontos de interrupção em estados e transições\nEstados paralelos (E) com ordem de execução e junção de histórico: ao entrar num estado, volta ao último subestado ativo\nMais lógica temporal: `before`, `at`, `every`, contagem dos despertares por uma entrada (`after(3, button)`), `after(5, min, condition)`, `elapsed()`, `duration()` e todos os dias a uma hora ou num evento astronómico (`at(\"22:30\")`, `at(\"sunset\", -30)`)\n`getState(\"id\")` lê qualquer estado em condições e ações, estados de controlo por gráfico: `enabled`, `reset`, `event`\nVerificação estática do gráfico: estados que nunca ficam ativos ou nunca são deixados, transições que nunca são tomadas, condições que nunca são verdadeiras, variáveis não utilizadas\nEditor: cor de cada estado (cada segundo nível de estados aninhados mais escuro), transições em ângulo reto como opção, ajustar à grade, alinhar e distribuir, rótulos de transições podem ser movidos\nEditor: barra de ferramentas agrupada por tarefas com novos botões para cortar e eliminar, painéis laterais recolhíveis, cores e ícones para cada tipo de elemento, variáveis agrupadas por tipo com pesquisa\nEditor: as transições são pretas, os seus rótulos não têm fundo\nExportação do gráfico inteiro como imagem PNG\nCorrigido: os rótulos de transições dentro de um superestado ficavam ocultos, os rótulos de várias transições entre os mesmos estados e a linha para um rótulo movido sobrepunham-se ao texto, as auto-transições em cima ou à direita eram desenhadas torcidas",
|
|
11
|
+
"nl": "Simulatie: de grafiek draait in de editor zonder iets te schakelen, de ingangen worden handmatig ingesteld, tijd vooruitspoelen, pauze, enkele stappen en breekpunten op toestanden en overgangen\nParallelle toestanden (EN) met uitvoeringsvolgorde en geschiedenisknooppunt: bij het betreden van een toestand keert die terug naar de laatst actieve subtoestand\nMeer tijdslogica: `before`, `at`, `every`, het tellen van het wekken door een ingang (`after(3, button)`), `after(5, min, condition)`, `elapsed()`, `duration()` en elke dag op een tijdstip of astronomische gebeurtenis (`at(\"22:30\")`, `at(\"sunset\", -30)`)\n`getState(\"id\")` leest elke status in voorwaarden en acties, besturingsstatussen per grafiek: `enabled`, `reset`, `event`\nStatische controle van de grafiek: toestanden die nooit actief worden of nooit worden verlaten, overgangen die nooit worden genomen, voorwaarden die nooit waar zijn, ongebruikte variabelen\nEditor: kleur van elke toestand (elk tweede niveau van geneste toestanden donkerder), rechthoekige overgangen als optie, uitlijnen op het raster, uitlijnen en verdelen, verplaatsbare labels van overgangen\nEditor: werkbalk gegroepeerd per taak met nieuwe knoppen om te knippen en te verwijderen, inklapbare zijpanelen, kleuren en pictogrammen voor elk soort element, variabelen gegroepeerd per soort met zoekfunctie\nEditor: overgangen zijn zwart, hun labels hebben geen achtergrond\nExport van de hele grafiek als PNG-afbeelding\nOpgelost: labels van overgangen binnen een supertoestand waren verborgen, labels van meerdere overgangen tussen dezelfde toestanden en de lijn naar een verplaatst label bedekten tekst, zelfovergangen boven of rechts werden gedraaid getekend",
|
|
12
|
+
"fr": "Simulation : le graphique s'exécute dans l'éditeur sans rien commuter, les entrées sont réglées à la main, avance du temps, pause, pas à pas et points d'arrêt sur les états et les transitions\nÉtats parallèles (ET) avec ordre d'exécution et jonction d'historique : en entrant dans un état, on revient à son dernier sous-état actif\nPlus de logique temporelle : `before`, `at`, `every`, comptage des réveils par une entrée (`after(3, button)`), `after(5, min, condition)`, `elapsed()`, `duration()` et chaque jour à une heure ou à un événement astronomique (`at(\"22:30\")`, `at(\"sunset\", -30)`)\n`getState(\"id\")` lit n'importe quel état dans les conditions et les actions, états de contrôle par graphique : `enabled`, `reset`, `event`\nVérification statique du graphique : états qui ne deviennent jamais actifs ou ne sont jamais quittés, transitions jamais prises, conditions jamais vraies, variables inutilisées\nÉditeur : couleur de chaque état (un niveau sur deux d'états imbriqués plus foncé), transitions à angle droit en option, aimantation à la grille, aligner et répartir, étiquettes des transitions déplaçables\nÉditeur : barre d'outils groupée par tâches avec de nouveaux boutons pour couper et supprimer, panneaux latéraux repliables, couleurs et icônes pour chaque type d'élément, variables groupées par type avec recherche\nÉditeur : les transitions sont noires, leurs étiquettes n'ont pas de fond\nExport du graphique entier en image PNG\nCorrigé : les étiquettes des transitions dans un super-état étaient masquées, les étiquettes de plusieurs transitions entre les mêmes états et la ligne vers une étiquette déplacée recouvraient le texte, les auto-transitions en haut ou à droite étaient dessinées tordues",
|
|
13
|
+
"it": "Simulazione: il grafico viene eseguito nell'editor senza commutare nulla, gli ingressi si impostano a mano, avanzamento del tempo, pausa, passi singoli e punti di interruzione su stati e transizioni\nStati paralleli (AND) con ordine di esecuzione e giunzione di cronologia: entrando in uno stato si torna all'ultimo sottostato attivo\nPiù logica temporale: `before`, `at`, `every`, conteggio dei risvegli da un ingresso (`after(3, button)`), `after(5, min, condition)`, `elapsed()`, `duration()` e ogni giorno a un'ora o a un evento astronomico (`at(\"22:30\")`, `at(\"sunset\", -30)`)\n`getState(\"id\")` legge qualsiasi stato in condizioni e azioni, stati di controllo per grafico: `enabled`, `reset`, `event`\nVerifica statica del grafico: stati che non diventano mai attivi o non vengono mai lasciati, transizioni mai eseguite, condizioni mai vere, variabili inutilizzate\nEditor: colore di ogni stato (ogni secondo livello di stati annidati più scuro), transizioni ad angolo retto come opzione, aggancio alla griglia, allineare e distribuire, etichette delle transizioni spostabili\nEditor: barra degli strumenti raggruppata per attività con nuovi pulsanti per tagliare ed eliminare, pannelli laterali comprimibili, colori e icone per ogni tipo di elemento, variabili raggruppate per tipo con ricerca\nEditor: le transizioni sono nere, le loro etichette non hanno sfondo\nEsportazione dell'intero grafico come immagine PNG\nCorretto: le etichette delle transizioni all'interno di un superstato erano nascoste, le etichette di più transizioni tra gli stessi stati e la linea verso un'etichetta spostata coprivano il testo, le auto-transizioni in alto o a destra erano disegnate attorcigliate",
|
|
14
|
+
"es": "Simulación: el gráfico se ejecuta en el editor sin conmutar nada, las entradas se ajustan a mano, avanzar el tiempo, pausa, pasos individuales y puntos de interrupción en estados y transiciones\nEstados paralelos (Y) con orden de ejecución y unión de historial: al entrar en un estado se vuelve a su último subestado activo\nMás lógica temporal: `before`, `at`, `every`, contar los despertares por una entrada (`after(3, button)`), `after(5, min, condition)`, `elapsed()`, `duration()` y cada día a una hora o en un evento astronómico (`at(\"22:30\")`, `at(\"sunset\", -30)`)\n`getState(\"id\")` lee cualquier estado en condiciones y acciones, estados de control por gráfico: `enabled`, `reset`, `event`\nComprobación estática del gráfico: estados que nunca se activan o nunca se abandonan, transiciones que nunca se toman, condiciones que nunca son verdaderas, variables sin usar\nEditor: color de cada estado (cada segundo nivel de estados anidados más oscuro), transiciones en ángulo recto como opción, ajustar a la cuadrícula, alinear y distribuir, etiquetas de transiciones desplazables\nEditor: barra de herramientas agrupada por tareas con nuevos botones para cortar y eliminar, paneles laterales plegables, colores e iconos para cada tipo de elemento, variables agrupadas por tipo con búsqueda\nEditor: las transiciones son negras, sus etiquetas no tienen fondo\nExportación del gráfico completo como imagen PNG\nCorregido: las etiquetas de transiciones dentro de un superestado estaban ocultas, las etiquetas de varias transiciones entre los mismos estados y la línea hacia una etiqueta desplazada tapaban el texto, las autotransiciones arriba o a la derecha se dibujaban retorcidas",
|
|
15
|
+
"pl": "Symulacja: wykres działa w edytorze bez przełączania czegokolwiek, wejścia ustawia się ręcznie, przewijanie czasu, pauza, pojedyncze kroki i punkty przerwania na stanach i przejściach\nStany równoległe (AND) z kolejnością wykonywania i węzłem historii: po wejściu do stanu następuje powrót do ostatnio aktywnego podstanu\nWięcej logiki czasowej: `before`, `at`, `every`, liczenie wybudzeń przez wejście (`after(3, button)`), `after(5, min, condition)`, `elapsed()`, `duration()` oraz codziennie o określonej godzinie lub zdarzeniu astronomicznym (`at(\"22:30\")`, `at(\"sunset\", -30)`)\n`getState(\"id\")` odczytuje dowolny stan w warunkach i akcjach, stany sterujące dla każdego wykresu: `enabled`, `reset`, `event`\nStatyczna kontrola wykresu: stany, które nigdy nie stają się aktywne lub nigdy nie są opuszczane, przejścia, które nigdy nie są wykonywane, warunki, które nigdy nie są prawdziwe, nieużywane zmienne\nEdytor: kolor każdego stanu (co drugi poziom zagnieżdżonych stanów ciemniejszy), przejścia pod kątem prostym jako opcja, przyciąganie do siatki, wyrównywanie i rozmieszczanie, przesuwane etykiety przejść\nEdytor: pasek narzędzi pogrupowany według zadań z nowymi przyciskami wycinania i usuwania, zwijane panele boczne, kolory i ikony dla każdego rodzaju elementu, zmienne pogrupowane według rodzaju z wyszukiwaniem\nEdytor: przejścia są czarne, ich etykiety nie mają tła\nEksport całego wykresu jako obrazu PNG\nNaprawiono: etykiety przejść wewnątrz superstanu były ukryte, etykiety kilku przejść między tymi samymi stanami i linia do przesuniętej etykiety zasłaniały tekst, przejścia do samego siebie u góry lub z prawej były rysowane skręcone",
|
|
16
|
+
"uk": "Симуляція: діаграма виконується в редакторі, нічого не перемикаючи, входи задаються вручну, перемотування часу, пауза, покрокове виконання та точки зупинки на станах і переходах\nПаралельні стани (І) з порядком виконання та вузол історії: під час входу в стан повертається останній активний підстан\nБільше часової логіки: `before`, `at`, `every`, підрахунок пробуджень входом (`after(3, button)`), `after(5, min, condition)`, `elapsed()`, `duration()`, а також щодня в заданий час або за астроподією (`at(\"22:30\")`, `at(\"sunset\", -30)`)\n`getState(\"id\")` читає будь-які стани в умовах і діях, керувальні стани для кожної діаграми: `enabled`, `reset`, `event`\nСтатична перевірка діаграми: стани, які ніколи не стають активними або ніколи не залишаються, переходи, які ніколи не виконуються, умови, які ніколи не є істинними, невикористані змінні\nРедактор: колір кожного стану (кожен другий рівень вкладених станів темніший), прямокутні переходи як опція, прив'язка до сітки, вирівнювання та розподіл, переміщувані підписи переходів\nРедактор: панель інструментів згрупована за завданнями, нові кнопки «Вирізати» та «Видалити», бічні панелі згортаються, кольори та значки для кожного виду елементів, змінні згруповані за видом і з пошуком\nРедактор: переходи чорні, їхні підписи без фону\nЕкспорт усієї діаграми як зображення PNG\nВиправлено: підписи переходів усередині суперстану були приховані, підписи кількох переходів між тими самими станами та лінія до переміщеного підпису перекривали текст, переходи в себе зверху або праворуч малювалися перекрученими",
|
|
17
|
+
"zh-cn": "模拟:图表在编辑器中运行而不切换任何设备,输入可手动设置,可快进时间、暂停、单步执行,并可在状态和转换上设置断点\n并行状态(AND)及执行顺序,以及历史连接点:进入状态时返回其上次活动的子状态\n更多时间逻辑:`before`, `at`, `every`,按输入唤醒次数计数(`after(3, button)`),`after(5, min, condition)`, `elapsed()`, `duration()`,以及每天在指定时间或天文事件触发(`at(\"22:30\")`, `at(\"sunset\", -30)`)\n`getState(\"id\")` 可在条件和动作中读取任意状态,每个图表的控制状态:`enabled`, `reset`, `event`\n图表静态检查:从不激活或从不离开的状态、从不执行的转换、从不为真的条件、未使用的变量\n编辑器:每个状态可设颜色(嵌套状态每隔一层颜色更深),可选直角转换线,对齐网格,对齐与分布,转换标签可移动\n编辑器:工具栏按任务分组,新增剪切和删除按钮,侧边栏可折叠,每种元素都有颜色和图标,变量按类型分组并可搜索\n编辑器:转换为黑色,其标签无背景\n将整个图表导出为 PNG 图片\n修复:超状态内转换的标签被遮挡;同一对状态之间多个转换的标签以及指向移动后标签的连线遮挡文字;位于状态上方或右侧的自转换绘制为扭曲形状"
|
|
18
|
+
},
|
|
19
|
+
"0.2.0": {
|
|
20
|
+
"en": "the adapter and the editor are written in TypeScript now, no changes of the behavior\nlive values of the variables in the editor\ntaken transitions light up in the editor\nhistory of the starts and the transitions taken (tab \"History\", state `charts.<chart>.history`)\na chart wakes up once right after the start, so transitions without label are taken without waiting for a change of an input\nchart option \"super step\": take transitions until none is valid anymore\nthe arrows of transitions start and end where the states face each other (floating edges), their ends can be dragged along the border of the states or onto another state to move the transition there\nchange detection: `hasChanged`, `hasChangedFrom` and `hasChangedTo`, e.g. `hasChangedTo(button, true)` for edges\nsuncalc 2: `isDaytime()` is true all day during the midnight sun, `astroTime()` reports events which do not happen on a day (polar regions)",
|
|
21
|
+
"de": "Adapter und Editor sind jetzt in TypeScript geschrieben, das Verhalten bleibt gleich\nLive-Werte der Variablen im Editor\nGenommene Übergänge leuchten im Editor auf\nVerlauf der Starts und der genommenen Übergänge (Reiter „Verlauf“, Datenpunkt `charts.<chart>.history`)\nEin Chart wacht direkt nach dem Start einmal auf, Übergänge ohne Beschriftung werden also genommen, ohne auf die Änderung eines Eingangs zu warten\nChart-Option „Super-Step“: weiterschalten, bis kein Übergang mehr gilt\nDie Pfeile der Übergänge beginnen und enden dort, wo sich die Zustände gegenüberliegen (Floating Edges). Ihre Enden lassen sich am Rand der Zustände verschieben oder auf einen anderen Zustand ziehen, um den Übergang dorthin zu verlegen\nÄnderungserkennung: `hasChanged`, `hasChangedFrom` und `hasChangedTo`, z.B. `hasChangedTo(taster, true)` für Flanken\nsuncalc 2: `isDaytime()` ist während der Mitternachtssonne den ganzen Tag wahr, `astroTime()` meldet Ereignisse, die an einem Tag nicht stattfinden (Polargebiete)",
|
|
22
|
+
"ru": "адаптер и редактор теперь написаны на TypeScript, никаких изменений в поведении\nживые значения переменных в редакторе\nснятые переходы загораются в редакторе\nистория стартов и сделанных переходов (вкладка «История», состояние `графики). <chart>.история`)\nграфик просыпается один раз сразу после старта, поэтому переходы без метки выполняются, не дожидаясь изменения входных данных\nопция диаграммы «super step»: делайте переходы до тех пор, пока ни один из них не станет действительным\nстрелки переходов начинаются и заканчиваются там, где состояния обращены друг к другу (плавающие ребра), их концы можно перетащить вдоль границы состояний или в другое состояние, чтобы переместить переход туда\nобнаружение изменений: «изменилось», «изменилось с» и «изменилось на», например, «изменилось на» (кнопка, истина) для ребер\nsuncalc 2: `isDaytime () `действует весь день при полуночном солнце, `AstroTime ()` сообщает о событиях, которые не происходят в один день (полярные регионы)",
|
|
23
|
+
"pt": "o adaptador e o editor agora são escritos em TypeScript, sem mudanças\nvalores reais das variáveis no editor\ntransições feitas acendem no editor\nhistórico dos inícios e transições (aba “Histórico”, estado `charts. <chart>.história`)\num gráfico acorda uma vez logo após o início, então transições sem rótulo são feitas sem a troca de uma entrada\nopção de gráfico “super step”: faça transições até não valer mais\nas setas das transições começam e terminam onde os estados se enfrentam (bordas flutuantes) e podem ser arrastadas pela borda dos estados ou para outro estado para mover a transição até lá\ndetecção de mudanças: `hasChanged`, `hasChangedFrom` e `hasChangedTo`, ex: `hasChangedTo (button, true) `para bordas\nsuncalc 2: `isDayTime () `vale todo o dia do sol da meia-noite, `astroTime ()` relata eventos que não ocorrem em um dia (polares)",
|
|
24
|
+
"nl": "de adapter en de editor zijn nu in TypeScript geschreven, geen wijzigingen in het gedrag\nactuele waarden van de variabelen in de editor\ngenomen overgangen lichten op in de editor\ngeschiedenis van de starts en de gemaakte overgangen (tab „Geschiedenis”, status `diagrammen. <chart>.geschiedenis`)\neen grafiek wordt één keer wakker, direct na de start, zodat overgangen zonder label worden gemaakt zonder te wachten op een wijziging van een invoer\ngrafiekoptie „superstap”: overgangen uitvoeren tot ze niet meer geldig zijn\nde pijlen van overgangen beginnen en eindigen waar de staten tegenover elkaar staan (zwevende randen), waarvan de uiteinden langs de rand van de staten kunnen worden gesleept of naar een andere staat om de overgang daarheen te verplaatsen\ndetectie van wijzigingen: `HasChanged`, `HasChangedFrom` en `HasChangedTo`, bijvoorbeeld `HasChangedTo (button, true) `voor randen\nsuncalc 2: `IsDaytime () `geldt de hele dag tijdens de middernacht; `AstroTime ()` rapporteert gebeurtenissen die zich niet op een dag voordoen (poolgebieden)",
|
|
25
|
+
"fr": "l'adaptateur et l'éditeur sont écrits en TypeScript maintenant, rien à voir\nvaleurs en direct des variables en éditeur\nles transitions prises s'allument\nhistorique des départs et des transitions (onglet « Historique », état « charts »). <chart>.history`)\nun graphique apparaît juste après le début, donc les transitions sans étiquette se font sans attendre de modification\noption graphique « super étape » : faites des transitions jusqu'à ce que rien ne soit valide\nles flèches des transitions commencent et se terminent là où les états se font face (bords flottants), leur fin peut être glissée le long de la frontière des états ou sur un autre état pour y déplacer la transition\ndétection des changements : hasChanged`, `hasChangedFrom` et `hasChangedTo`, par exemple `hasChangedTo (button, true) `pour les bords\nsuncalc 2 : `isDaytime () `est vrai toute la journée à minuit, `AstroTime ()` signale des événements qui ne se produisent pas un jour (régions polaires)",
|
|
26
|
+
"it": "l'adattatore e l'editor sono scritti in TypeScript ora, nessun cambio\nvalori live delle variabili in editor\nle transizioni prese si accendono\ncronologia delle partenze e transizioni (scheda «Cronologia», «grafici»). <chart>.storia`)\nun grafico si attiva subito dopo l'inizio, quindi le transizioni senza etichetta avvengono senza cambiare input\nopzione grafica «super step»: transizioni finché non è più valida\nle frecce iniziano e finiscono dove gli stati si fronteggiano (bordi mobili), le loro estremità possono essere trascinate lungo i confini degli stati o in un altro stato\nrilevamento modifiche: `hasChanged`, `hasChangedFrom` e `hasChangedTo (button, true) `per i bordi\nsuncalc 2: `isDayTime () `è vero tutto il giorno a mezzanotte, `astroTime ()` segnala eventi non diurni (regioni polari)",
|
|
27
|
+
"es": "el adaptador y el editor ahora están escritos en TypeScript, sin cambios de comportamiento\nvalores en vivo de las variables en el editor\nlas transiciones tomadas se iluminan en el editor\nhistorial de los inicios y las transiciones tomadas (pestaña «Historia»), listas estatales. <chart>.historia`)\nun gráfico se activa una vez al principio, por lo que las transiciones sin etiqueta se hacen sin esperar a que se cambie la entrada\nopción de gráfico «superpaso»: haga transiciones hasta que ninguna sea válida\nlas flechas de las transiciones comienzan y terminan donde los estados están uno frente al otro (bordes flotantes), sus extremos se pueden arrastrar a lo largo de la frontera de los estados o a otro estado para moverla\ndetección de cambios: `HasChanged`, `HasChangedFrom` y `HasChangedTo`, p. ej., `hasChangedTo (button, true) `para bordes\nsuncalc 2: `isDaytime () `dura todo el día durante el sol de medianoche, `AstroTime ()` informa de eventos que no ocurren en un día (regiones polares)",
|
|
28
|
+
"pl": "adapter i edytor są teraz zapisane w TypeScript, bez zmian zachowania\nwartości na żywo zmiennych w edytorze\nwykonane przejścia świecą się w edytorze\nhistoria startów i wykonanych przejść (zakładka „Historia”, wykresy stanów. <chart>.historia`)\nwykres budzi się raz zaraz po rozpoczęciu, więc przejścia bez etykiety są wykonywane bez czekania na zmianę danych wejściowych\nopcja wykresu „super krok”: wykonuj przejścia, dopóki żaden nie będzie już ważny\nstrzałki przejść zaczynają się i kończą tam, gdzie stany są zwrócone do siebie (pływające krawędzie), ich końce można przeciągnąć wzdłuż granicy stanów lub do innego stanu, aby przenieść tam przejście\nwykrywanie zmian: `hasChanged`, `HasChangedFrom` i `HasChangedTo`, np. `HasChangedTo (przycisk, true) `dla krawędzi\nsuncalc 2: `IsDaytime () `jest prawdziwy przez cały dzień podczas słońca o północy, `AstroTime ()` zgłasza zdarzenia, które nie zdarzają się w ciągu dnia (regiony polarne)",
|
|
29
|
+
"uk": "адаптер і редактор тепер написані в TypeScript, ніяких змін у поведінці\nживі значення змінних в редакторі\nзроблені переходи загоряються в редакторі\nісторія стартів і пройдених переходів (вкладка «Історія», діаграми стану. <chart>.історія`)\nдіаграма прокидається один раз відразу після початку, тому переходи без мітки приймаються без очікування зміни вхідних даних\nпараметр діаграми «суперкрок»: робіть переходи, поки жоден більше не буде дійсним\nстрілки переходів починаються і закінчуються там, де стани звернені один до одного (плаваючі краї), їх кінці можна перетягнути вздовж кордону станів або в інший стан, щоб переміщати перехід туди\nвиявлення змін: `hasChanged`, `hasChangedFrom` і `hasChangedTo`, наприклад `hasChangedTo (кнопка, true) `для країв\nsuncalc 2: `isDaytime () `вірний цілий день під час опівнічного сонця, `AstroTime ()` повідомляє про події, які не відбуваються в день (полярні регіони)",
|
|
30
|
+
"zh-cn": "适配器和编辑器现在是用 TypeScript 编写的,行为没有变化\n编辑器中变量的实时值\n已拍摄的过渡效果在编辑器中亮起\n开始和过渡的历史记录(“历史” 选项卡,显示 “图表”。<chart>.history`)\n图表在开始后立即醒来一次,因此无需等待输入更改即可进行没有标签的过渡\n图表选项 “超级步骤”:进行过渡,直到所有选项都不再有效\n过渡的箭头在状态相互面对的地方(浮动边缘)开始和结束,它们的末端可以沿着状态的边界拖动或拖到另一个状态上以将过渡移动到那里\n变化检测:`hasChanged`、`hasChangedFrom` 和 `hasChangedTo`,例如用于边缘的 `hasChangedTo (button, true) `\nsuncalc 2: `isDayTime () `在午夜阳光下整天都是正确的,`AstroTime () `报告一天不发生的事件(极地区域)"
|
|
31
|
+
},
|
|
6
32
|
"0.1.1": {
|
|
7
33
|
"en": "renamed from \"state-machine\" to \"statechart\", because npm does not accept the old name (too similar to an existing package)",
|
|
8
34
|
"de": "umbenannt von „state-machine“ in „statechart“, weil npm den alten Namen nicht akzeptiert (zu ähnlich einem Paket)",
|
|
@@ -15,32 +41,6 @@
|
|
|
15
41
|
"pl": "zmieniono nazwę z „statemachine” na „statechart”, ponieważ npm nie akceptuje starej nazwy (zbyt podobnej do istniejącego pakietu)",
|
|
16
42
|
"uk": "перейменовано з «state-machine» на «statechart», оскільки npm не приймає старе ім'я (занадто схоже на існуючий пакет)",
|
|
17
43
|
"zh-cn": "从 “状态机” 重命名为 “状态图”,因为 npm 不接受旧名称(与现有包太相似)"
|
|
18
|
-
},
|
|
19
|
-
"0.1.0": {
|
|
20
|
-
"en": "initial release\ngraphical chart editor in the admin side bar: states, transitions, nested states, function blocks, notes\ntransition labels in Stateflow syntax event[condition]{action}, timers with after(n, unit)\nexecution with Stateflow semantics (outer before inner transitions, inner transitions)\ncharts continue in their state after a restart of the adapter\nper input: wake up on updates or changes, filter by ack, debounce\nhelper functions: setState, setStateDelayed, sendTo, isTimeBetween, isDaytime, astroTime\ncode editor with syntax highlighting, error checks and completion, generated code view\nundo/redo, copy/paste, import/export of charts as JSON",
|
|
21
|
-
"de": "erste Version\nGrafikeditor in der Admin-Seitenleiste: Zustände, Übergänge, Funktionsblöcke, Notizen\nÜbergangslabel in Stateflow-Syntax event [condition] {action}, Timer mit after (n, unit)\nAusführung mit Stateflow-Semantik (außen vor inneren, inneren Übergängen)\nCharts bleiben auch nach einem Adapter-Neustart\npro Eingabe: Bei Änderungen wecken, nach Ack filtern, entprellen\nHilfsfunktionen: setState, setStateDelayed, sendTo, isTimeBetween, isDaytime, astroTime\nCode-Editor mit Syntaxhervorhebung, Fehlerprüfung und -vervollständigung\nUndo/Redo, Copy/Paste, Import/Export von Charts als JSON",
|
|
22
|
-
"ru": "первоначальный релиз\nграфический редактор диаграмм в боковой панели администратора: состояния, переходы, вложенные состояния, функциональные блоки, заметки\nметки переходов в синтаксическом событии Stateflow [условие] {action}, таймеры со значением после (n, единица измерения)\nвыполнение с использованием семантики Stateflow (внешний вид перед внутренними переходами, внутренние переходы)\nграфики остаются в своем состоянии после перезапуска адаптера\nза каждый вход: отслеживание обновлений или изменений, фильтрация по пакету, отмена\nвспомогательные функции: setState, setStateDelayed, SendTo, isTimeBetween, isDaytime, AstroTime\nредактор кода с подсветкой синтаксиса, проверкой и заполнением ошибок, сгенерированным представлением кода\nотмена/повтор, копирование/вставка, импорт/экспорт диаграмм в формате JSON",
|
|
23
|
-
"pt": "versão inicial\neditor gráfico na barra de administração: estados, transições, blocos de funções, notas\nrótulos de transição na sintaxe Stateflow event [condition] {action}, timers com after (n, unit)\nexecução com semântica Stateflow (externa antes da interna, interna)\nos gráficos continuam após o reinício do adaptador\npor entrada: ativar atualizações, filtrar por ack, debater\nfunções auxiliares: setState, setStateDelayed, sendTo, isTimeBetween, isDaytime\neditor de código com realce de sintaxe, verificação e conclusão de erros, código gerado\nundo/redo, copie/cole, importe gráficos em JSON",
|
|
24
|
-
"nl": "eerste uitgave\ngrafische grafiekeditor in de zijbalk van de beheerder: staten, overgangen, geneste staten, functieblokken, notities\novergangslabels in de syntaxisgebeurtenis van Stateflow [conditie] {action}, timers met after (n, unit)\nuitvoering met Stateflow-semantiek (externe voor innerlijke overgangen, innerlijke overgangen)\nde kaarten blijven in hun staat na een herstart van de adapter\nper ingang: wakker worden bij updates of wijzigingen, filteren op ack, debounce\nhulpfuncties: setState, setState Delayed, SendTo, iTime Between, IsDaytime, AstroTime\ncode-editor met syntaxisaccentuering, foutcontroles en -aanvulling, gegenereerde codeweergave\ngrafieken ongedaan maken/opnieuw uitvoeren, kopiëren/plakken, importeren/exporteren als JSON",
|
|
25
|
-
"fr": "sortie initiale\néditeur de graphiques dans la barre d'administration : états, transitions, états imbriqués, blocs de fonctions, notes\nlibellés de transition dans Stateflow Syntax Event [condition] {action}, minuteurs après (n, unit)\nexécution avec la sémantique Stateflow (transitions extérieures avant intérieures)\nles cartes restent en l'état après le redémarrage de l'adaptateur\npar entrée : réveil en cas de mise à jour, filtre par ack, rebond\nfonctions auxiliaires : SetState, SetStateDelayed, SendTo, IsTimeBetween, IsDaytime, AstroTime\néditeur de code avec surlignage syntaxique, vérification des erreurs et saisie, vue du code généré\nannuler/rétablir, copier/coller, importer/exporter des graphiques au JSON",
|
|
26
|
-
"it": "prima versione\neditor grafico nella barra admin: stati, transizioni, stati annidati, blocchi funzione, note\netichette di transizione in sintassi Stateflow [condizione] {azione}, timer con dopo (n, unità)\nesecuzione con semantica Stateflow (esterna prima delle transizioni interne)\ni grafici restano così dopo il riavvio dell'adattatore\nper input: attiva le modifiche, filtra per ack, debounce\nfunzioni ausiliarie: setState, setStateDelayed, sendTo, isTimeBetween, isDayTime\neditor di codice con evidenziazione della sintassi, errori e vista generata\nannulla/redo, copia/incolla, import/export grafici in JSON",
|
|
27
|
-
"es": "versión inicial\neditor gráfico de gráficos en la barra de administración: estados, transiciones, anidados, bloques de funciones, notas\netiquetas de transición en Stateflow sintaxis event [condition] {action}, temporizadores con after (n, unit)\nejecución con la semántica de Stateflow (exterior antes que transiciones interiores)\nlos gráficos siguen en su estado tras reiniciar el adaptador\npor entrada: despertarse con cambios, filtrar por ack, rebote\nfunciones auxiliares: setState, setStateDelayed, sendTo, isTimeBetween, isDaytime, astroTime\neditor de código con resaltado de sintaxis, comprobación y finalización de errores, vista de código generada\ndeshacer, copiar y pegar, importar y exportar gráficos como JSON",
|
|
28
|
-
"pl": "wstępne wydanie\ngraficzny edytor wykresów na pasku bocznym administratora: stany, przejścia, stany zagnieżdżone, bloki funkcyjne, notatki\netykiety przejścia w zdarzeniu składni Stateflow [warunek] {action}, timery z after (n, unit)\nwykonanie z semantyką Stateflow (przejścia zewnętrzne przed wewnętrznymi, przejścia wewnętrzne)\nwykresy są kontynuowane w swoim stanie po ponownym uruchomieniu adaptera\nna wejście: budzić się przy aktualizacjach lub zmianach, filtrować według ack, rozbić\nfunkcje pomocnicze: setState, setStateDelayed, sendTo, istimeBetween, IsDaytime, AstroTime\nedytor kodu z podświetleniem składni, sprawdzaniem błędów i uzupełnianiem, generowanym widokiem kodu\ncofnij/powtórz, kopiuj/wklej, importu/eksportuj wykresy jako JSON",
|
|
29
|
-
"uk": "первинний випуск\nграфічний редактор діаграм в бічній панелі адміністратора: стани, переходи, вкладені стани, функціональні блоки, примітки\nмітки переходу в події синтаксису Stateflow [умова] {дія}, таймери з після (n, одиниця)\nвиконання з семантикою Stateflow (зовнішні перед внутрішніми переходами, внутрішні переходи)\nграфіки продовжуються в своєму стані після перезавантаження адаптера\nза вхід: прокидатися від оновлень або змін, фільтрувати за ack, debounce\nдопоміжні функції: setState, setStateLayed, SendTo, IsBetween, IsDaytime, AstroTime\nредактор коду з підсвічуванням синтаксису, перевіркою помилок і завершенням, переглядом згенерованого коду\nскасування/повторити, копіювати/вставити, імпорту/експортувати діаграми як JSON",
|
|
30
|
-
"zh-cn": "初始版本\n管理员侧栏中的图形图表编辑器:状态、过渡、嵌套状态、功能块、注释\nStateflow 语法中的过渡标签 event [condition] {action},带有 after (n,单位) 的计时器\n使用 Stateflow 语义执行(内部过渡之前的外层,内部过渡)\n重新启动适配器后,图表继续保持其状态\n每个输入:更新或更改时唤醒,按 ack 过滤,去抖动\n辅助函数:setState、setStateDelayed、sendTo、isTimeBetween、isDayTime、AstroTime\n具有语法突出显示、错误检查和完成功能、生成的代码视图的代码编辑器\n撤消/重做、复制/粘贴、将图表导入/导出为 JSON"
|
|
31
|
-
},
|
|
32
|
-
"0.0.1": {
|
|
33
|
-
"en": "initial release",
|
|
34
|
-
"de": "Erstveröffentlichung",
|
|
35
|
-
"ru": "Начальная версия",
|
|
36
|
-
"pt": "lançamento inicial",
|
|
37
|
-
"nl": "Eerste uitgave",
|
|
38
|
-
"fr": "Première version",
|
|
39
|
-
"it": "Versione iniziale",
|
|
40
|
-
"es": "Versión inicial",
|
|
41
|
-
"pl": "Pierwsze wydanie",
|
|
42
|
-
"uk": "Початкова версія",
|
|
43
|
-
"zh-cn": "首次出版"
|
|
44
44
|
}
|
|
45
45
|
},
|
|
46
46
|
"titleLang": {
|
|
@@ -73,7 +73,6 @@
|
|
|
73
73
|
"Igge <mail@igge.org>"
|
|
74
74
|
],
|
|
75
75
|
"keywords": [
|
|
76
|
-
"ioBroker",
|
|
77
76
|
"state machine",
|
|
78
77
|
"statechart",
|
|
79
78
|
"automation",
|
|
@@ -91,12 +90,13 @@
|
|
|
91
90
|
"loglevel": "info",
|
|
92
91
|
"tier": 3,
|
|
93
92
|
"mode": "daemon",
|
|
93
|
+
"messagebox": true,
|
|
94
94
|
"type": "logic",
|
|
95
95
|
"compact": true,
|
|
96
96
|
"connectionType": "local",
|
|
97
97
|
"dataSource": "poll",
|
|
98
98
|
"adminUI": {
|
|
99
|
-
"config": "
|
|
99
|
+
"config": "none",
|
|
100
100
|
"tab": "materialize"
|
|
101
101
|
},
|
|
102
102
|
"adminTab": {
|
|
@@ -113,14 +113,11 @@
|
|
|
113
113
|
],
|
|
114
114
|
"globalDependencies": [
|
|
115
115
|
{
|
|
116
|
-
"admin": ">=7.6.
|
|
116
|
+
"admin": ">=7.6.20"
|
|
117
117
|
}
|
|
118
118
|
]
|
|
119
119
|
},
|
|
120
|
-
"native": {
|
|
121
|
-
"option1": true,
|
|
122
|
-
"option2": "42"
|
|
123
|
-
},
|
|
120
|
+
"native": {},
|
|
124
121
|
"objects": [],
|
|
125
122
|
"instanceObjects": []
|
|
126
123
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "iobroker.statechart",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.3.0",
|
|
4
4
|
"description": "Statecharts (hierarchical state machines) with a graphical editor for ioBroker",
|
|
5
5
|
"author": {
|
|
6
6
|
"name": "Igge",
|
|
@@ -27,22 +27,22 @@
|
|
|
27
27
|
"@iobroker/adapter-core": "^3.4.3",
|
|
28
28
|
"acorn": "^8.19.0",
|
|
29
29
|
"acorn-walk": "^8.3.5",
|
|
30
|
-
"suncalc": "^1.
|
|
31
|
-
"xstate": "^5.33.
|
|
30
|
+
"suncalc": "^2.1.1",
|
|
31
|
+
"xstate": "^5.33.3"
|
|
32
32
|
},
|
|
33
33
|
"devDependencies": {
|
|
34
34
|
"@alcalzone/release-script": "^5.2.1",
|
|
35
35
|
"@alcalzone/release-script-plugin-iobroker": "^5.2.0",
|
|
36
36
|
"@alcalzone/release-script-plugin-license": "^5.2.2",
|
|
37
37
|
"@alcalzone/release-script-plugin-manual-review": "^5.2.0",
|
|
38
|
-
"@codemirror/autocomplete": "^6.20.
|
|
38
|
+
"@codemirror/autocomplete": "^6.20.4",
|
|
39
39
|
"@codemirror/commands": "^6.11.1",
|
|
40
40
|
"@codemirror/lang-javascript": "^6.2.5",
|
|
41
|
-
"@codemirror/language": "^6.
|
|
41
|
+
"@codemirror/language": "^6.13.1",
|
|
42
42
|
"@codemirror/lint": "^6.9.7",
|
|
43
43
|
"@codemirror/state": "^6.7.6",
|
|
44
44
|
"@codemirror/theme-one-dark": "^6.1.3",
|
|
45
|
-
"@codemirror/view": "^6.43.
|
|
45
|
+
"@codemirror/view": "^6.43.15",
|
|
46
46
|
"@emotion/react": "^11.14.0",
|
|
47
47
|
"@emotion/styled": "^11.14.1",
|
|
48
48
|
"@iobroker/adapter-dev": "^1.5.0",
|
|
@@ -58,39 +58,43 @@
|
|
|
58
58
|
"@types/react": "^18.3.31",
|
|
59
59
|
"@types/react-dom": "^18.3.7",
|
|
60
60
|
"@xyflow/react": "^12.12.0",
|
|
61
|
+
"html-to-image": "^1.11.11",
|
|
61
62
|
"patch-package": "^8.0.1",
|
|
62
63
|
"react": "^18.3.1",
|
|
63
64
|
"react-dom": "^18.3.1",
|
|
65
|
+
"tsx": "^4.23.15",
|
|
64
66
|
"typescript": "~5.9.3"
|
|
65
67
|
},
|
|
66
|
-
"main": "main.js",
|
|
68
|
+
"main": "build/main.js",
|
|
67
69
|
"files": [
|
|
68
70
|
"admin{,/!(src)/**}/!(tsconfig|tsconfig.*|.eslintrc).{json,json5}",
|
|
69
71
|
"admin{,/!(src)/**}/*.{html,css,png,svg,jpg,js}",
|
|
70
72
|
"admin/build/*.{js,css}",
|
|
71
|
-
"
|
|
73
|
+
"build/",
|
|
72
74
|
"www/",
|
|
73
75
|
"io-package.json",
|
|
74
|
-
"LICENSE"
|
|
75
|
-
"main.js"
|
|
76
|
+
"LICENSE"
|
|
76
77
|
],
|
|
77
78
|
"scripts": {
|
|
78
|
-
"prebuild": "rimraf admin/build",
|
|
79
|
-
"build": "build-adapter
|
|
80
|
-
"watch": "build-adapter
|
|
79
|
+
"prebuild": "rimraf build admin/build",
|
|
80
|
+
"build": "build-adapter all --typescriptCompileTarget node22",
|
|
81
|
+
"watch": "build-adapter all --watch --typescriptCompileTarget node22",
|
|
82
|
+
"prebuild:ts": "rimraf build",
|
|
83
|
+
"build:ts": "build-adapter ts --typescriptCompileTarget node22",
|
|
84
|
+
"watch:ts": "build-adapter ts --watch --typescriptCompileTarget node22",
|
|
81
85
|
"prebuild:react": "rimraf admin/build",
|
|
82
86
|
"build:react": "build-adapter react",
|
|
83
87
|
"watch:react": "build-adapter react --watch",
|
|
84
|
-
"test:
|
|
88
|
+
"test:ts": "mocha --config test/mocharc.custom.json \"{src,admin/src}/**/*.test.ts\"",
|
|
85
89
|
"test:package": "mocha test/package --exit",
|
|
86
90
|
"test:integration": "mocha test/integration --exit",
|
|
87
|
-
"test": "npm run test:
|
|
88
|
-
"check": "tsc --noEmit -p tsconfig.
|
|
91
|
+
"test": "npm run test:ts && npm run test:package",
|
|
92
|
+
"check": "tsc --noEmit && tsc --noEmit -p admin/tsconfig.json",
|
|
89
93
|
"lint": "eslint -c eslint.config.mjs .",
|
|
90
94
|
"translate": "translate-adapter",
|
|
91
95
|
"release": "release-script",
|
|
92
96
|
"dev-server": "patch-package && dev-server",
|
|
93
|
-
"upload:tab": "npm run build && node tools/upload-admin.js"
|
|
97
|
+
"upload:tab": "npm run build:react && node tools/upload-admin.js"
|
|
94
98
|
},
|
|
95
99
|
"bugs": {
|
|
96
100
|
"url": "https://github.com/IggePop/ioBroker.statechart/issues"
|
package/admin/i18n/de.json
DELETED
package/admin/i18n/en.json
DELETED
package/admin/i18n/es.json
DELETED
package/admin/i18n/fr.json
DELETED
package/admin/i18n/it.json
DELETED
package/admin/i18n/nl.json
DELETED
package/admin/i18n/pl.json
DELETED
package/admin/i18n/pt.json
DELETED
package/admin/i18n/ru.json
DELETED
package/admin/i18n/uk.json
DELETED
package/admin/i18n/zh-cn.json
DELETED
package/admin/jsonConfig.json
DELETED
|
@@ -1,19 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"i18n": true,
|
|
3
|
-
"type": "panel",
|
|
4
|
-
"items": {
|
|
5
|
-
"option1": {
|
|
6
|
-
"type": "checkbox",
|
|
7
|
-
"label": "option1",
|
|
8
|
-
"sm": 12
|
|
9
|
-
},
|
|
10
|
-
"option2": {
|
|
11
|
-
"type": "text",
|
|
12
|
-
"label": "option2",
|
|
13
|
-
"newLine": true,
|
|
14
|
-
"sm": 12,
|
|
15
|
-
"md": 6,
|
|
16
|
-
"lg": 4
|
|
17
|
-
}
|
|
18
|
-
}
|
|
19
|
-
}
|
package/admin/statechart.svg
DELETED
|
@@ -1,38 +0,0 @@
|
|
|
1
|
-
<svg xmlns="http://www.w3.org/2000/svg" width="320" height="320" viewBox="0 0 320 320">
|
|
2
|
-
<defs>
|
|
3
|
-
<linearGradient id="bg" x1="0" y1="0" x2="1" y2="1">
|
|
4
|
-
<stop offset="0" stop-color="#1e3a8a"/>
|
|
5
|
-
<stop offset="1" stop-color="#0f766e"/>
|
|
6
|
-
</linearGradient>
|
|
7
|
-
<marker id="arr" viewBox="0 0 10 10" refX="8" refY="5" markerWidth="5" markerHeight="5" orient="auto-start-reverse">
|
|
8
|
-
<path d="M0,0 L10,5 L0,10 z" fill="#e2e8f0"/>
|
|
9
|
-
</marker>
|
|
10
|
-
<marker id="arrA" viewBox="0 0 10 10" refX="8" refY="5" markerWidth="5" markerHeight="5" orient="auto-start-reverse">
|
|
11
|
-
<path d="M0,0 L10,5 L0,10 z" fill="#fbbf24"/>
|
|
12
|
-
</marker>
|
|
13
|
-
</defs>
|
|
14
|
-
|
|
15
|
-
<rect x="0" y="0" width="320" height="320" rx="64" fill="url(#bg)"/>
|
|
16
|
-
|
|
17
|
-
<!-- start indicator -->
|
|
18
|
-
<circle cx="44" cy="96" r="9" fill="#e2e8f0"/>
|
|
19
|
-
<path d="M55 96 L82 96" stroke="#e2e8f0" stroke-width="6" fill="none" marker-end="url(#arr)"/>
|
|
20
|
-
|
|
21
|
-
<!-- transitions -->
|
|
22
|
-
<path d="M128 78 Q 172 40 212 78" stroke="#fbbf24" stroke-width="7" fill="none" stroke-linecap="round" marker-end="url(#arrA)"/>
|
|
23
|
-
<path d="M232 138 L 192 210" stroke="#e2e8f0" stroke-width="7" fill="none" stroke-linecap="round" marker-end="url(#arr)"/>
|
|
24
|
-
<path d="M138 222 L 108 140" stroke="#e2e8f0" stroke-width="7" fill="none" stroke-linecap="round" marker-end="url(#arr)"/>
|
|
25
|
-
<path d="M212 116 Q 172 140 132 116" stroke="#e2e8f0" stroke-width="5" fill="none" stroke-linecap="round" stroke-dasharray="2 10" marker-end="url(#arr)"/>
|
|
26
|
-
|
|
27
|
-
<!-- states -->
|
|
28
|
-
<circle cx="104" cy="98" r="30" fill="#f8fafc"/>
|
|
29
|
-
<circle cx="236" cy="98" r="30" fill="#fbbf24"/>
|
|
30
|
-
<circle cx="236" cy="98" r="38" fill="none" stroke="#fbbf24" stroke-width="4" opacity="0.55"/>
|
|
31
|
-
<circle cx="168" cy="244" r="30" fill="#f8fafc"/>
|
|
32
|
-
<circle cx="168" cy="244" r="22" fill="none" stroke="#0f766e" stroke-width="4"/>
|
|
33
|
-
|
|
34
|
-
<!-- state labels -->
|
|
35
|
-
<text x="104" y="107" font-family="DejaVu Sans, Arial, sans-serif" font-size="26" font-weight="700" fill="#1e3a8a" text-anchor="middle">A</text>
|
|
36
|
-
<text x="236" y="107" font-family="DejaVu Sans, Arial, sans-serif" font-size="26" font-weight="700" fill="#1e3a8a" text-anchor="middle">B</text>
|
|
37
|
-
<text x="168" y="253" font-family="DejaVu Sans, Arial, sans-serif" font-size="22" font-weight="700" fill="#1e3a8a" text-anchor="middle">C</text>
|
|
38
|
-
</svg>
|
package/lib/adapter-config.d.ts
DELETED
|
@@ -1,19 +0,0 @@
|
|
|
1
|
-
// This file extends the AdapterConfig type from "@iobroker/types"
|
|
2
|
-
// using the actual properties present in io-package.json
|
|
3
|
-
// in order to provide typings for adapter.config properties
|
|
4
|
-
|
|
5
|
-
import { native } from "../io-package.json";
|
|
6
|
-
|
|
7
|
-
type _AdapterConfig = typeof native;
|
|
8
|
-
|
|
9
|
-
// Augment the globally declared type ioBroker.AdapterConfig
|
|
10
|
-
declare global {
|
|
11
|
-
namespace ioBroker {
|
|
12
|
-
interface AdapterConfig extends _AdapterConfig {
|
|
13
|
-
// Do not enter anything here!
|
|
14
|
-
}
|
|
15
|
-
}
|
|
16
|
-
}
|
|
17
|
-
|
|
18
|
-
// this is required so the above AdapterConfig is found by TypeScript / type checking
|
|
19
|
-
export {};
|