iobroker.javascript 10.2.4 → 10.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/README.md +10 -21
- package/admin/assets/AiChatPanel-CpY4Bun-.js +27 -0
- package/admin/assets/{AiChatService-Bsp_rhVx.js → AiChatService-QKcpW4jQ.js} +1 -1
- package/admin/assets/AiDiffView-DscPfZ38.js +1 -0
- package/admin/assets/{AiInlineProvider-BxOW88xU.js → AiInlineProvider-DTSPKoXG.js} +1 -1
- package/admin/assets/BlocklyEditor-BZyoN1JE.js +301 -0
- package/admin/assets/Compile-B0uHjrBE.css +1 -0
- package/admin/assets/Compile-Oss28m_f.js +165 -0
- package/admin/assets/Debugger-teJTIU-2.js +15 -0
- package/admin/assets/Documentation-uz4Ut9pT.js +4339 -0
- package/admin/assets/ExpandMore-V5Ix1QB1.js +1 -0
- package/admin/assets/FbEditor-B8S-mCvc.css +1 -0
- package/admin/assets/FbEditor-aOZ-RpPV.js +15 -0
- package/admin/assets/Import-BIC5Ee9z.js +1 -0
- package/admin/assets/NotificationsActive-BdzH44gp.js +1 -0
- package/admin/assets/RulesEditor-CcDVthPa.js +1 -0
- package/admin/assets/{ScriptEditor-BCGahS47.js → ScriptEditor-CviB6Hif.js} +2 -2
- package/admin/assets/ScriptEditorVanillaMonaco-ByuXwybM.js +3 -0
- package/admin/assets/Send-Mdo32jMb.js +1 -0
- package/admin/assets/_virtual_mf-localSharedImportMap___mfe_internal__iobroker_javascript__mf_owner__1-BnL93BgK.js +1 -0
- package/admin/assets/_virtual_mf___mfe_internal__iobroker_javascript__mf_owner__180366418666083__loadShare___mf_0_iobroker_mf_1_gui_mf_2_components__loadShare__.js-NI-3Uv4e.js +1217 -0
- package/admin/assets/_virtual_mf___mfe_internal__iobroker_javascript__mf_owner__180366418666083__loadShare__react_mf_2_dom_mf_1_client__loadShare__.js-DVaMIZyC.js +9 -0
- package/admin/assets/aiPromptBuilder-yTB6N2VT.js +1 -0
- package/admin/assets/blocklyTheme-CGhU3cEO.js +1 -0
- package/admin/assets/blocks_action-BQ4O7NRE.js +1 -0
- package/admin/assets/{blocks_convert-CLb0DLyc.js → blocks_convert-0VBjfhqQ.js} +1 -1
- package/admin/assets/blocks_logic-DAo99xDr.js +1 -0
- package/admin/assets/blocks_number-C--e19NU.js +1 -0
- package/admin/assets/blocks_object-D0TPhdzg.js +1 -0
- package/admin/assets/blocks_procedures-DgTxgXdB.js +3 -0
- package/admin/assets/{blocks_sendto-BxCMg9X4.js → blocks_sendto-CRIrtOUc.js} +1 -1
- package/admin/assets/blocks_switch-b_GYfF0n.js +2 -0
- package/admin/assets/blocks_system-BdkUdSsc.js +1 -0
- package/admin/assets/blocks_text-DSFhEVOf.js +1 -0
- package/admin/assets/blocks_time-CqALAiJp.js +1 -0
- package/admin/assets/blocks_timeout-yrOD2pZp.js +1 -0
- package/admin/assets/{blocks_trigger-XivsIDE5.js → blocks_trigger-DeAYXpSS.js} +1 -1
- package/admin/assets/{cronHoverProvider-BZMOFHO_.js → cronHoverProvider-DoO2_tpG.js} +1 -1
- package/admin/assets/{field_cron-CxKi__cX.js → field_cron-D3Ts_s9M.js} +1 -1
- package/admin/assets/{field_oid-CJIYiGxY.js → field_oid-BRNXredg.js} +1 -1
- package/admin/assets/{field_script-CehplM7L.js → field_script-3X6ousg7.js} +1 -1
- package/admin/assets/helpers-BTGaTdnT.js +1 -0
- package/admin/assets/{hostInit-Bs-bStPF.js → hostInit-2h2Cbsaw.js} +1 -1
- package/admin/assets/iconLibraryData-B5fiyl1C.js +1 -0
- package/admin/assets/index-BHhhebRG.css +1 -0
- package/admin/assets/index-CbQlIKB_.js +156 -0
- package/admin/assets/{inlineChatWidget-NIvdRGmU.js → inlineChatWidget-BwQVCPkx.js} +1 -1
- package/admin/assets/{inlineDiffController-Qh402KhK.js → inlineDiffController-BsDDsDHn.js} +1 -1
- package/admin/assets/loadBlocks-RpqM7PwO.js +117 -0
- package/admin/assets/loadMonaco-BVOEahNw.js +1 -0
- package/admin/assets/{mf-entry-bootstrap-0-019228a5.js → mf-entry-bootstrap-0-0deef484.js} +3 -3
- package/admin/assets/{pendingShares-B3t6ewri.js → pendingShares-BaAadIDv.js} +1 -1
- package/admin/assets/reactour.esm-DX9ZgYlx.js +137 -0
- package/admin/assets/stateHoverProvider-BEadnSXp.js +11 -0
- package/admin/assets/tileFbd-CWAy7R7m.svg +85 -0
- package/admin/custom/assets/Components-FkGDIlId.js +1 -0
- package/admin/custom/assets/_virtual_mf-localSharedImportMap___mfe_internal__ConfigCustomJavascriptSet__mf_owner__1-Cs88NUCd.js +1 -0
- package/admin/custom/assets/_virtual_mf___mfe_internal__ConfigCustomJavascriptSet__mf_owner__37453319418803__loadShare___mf_0_emotion_mf_1_react__loadShare__.js-P-8ffWXw.js +1 -0
- package/admin/custom/assets/_virtual_mf___mfe_internal__ConfigCustomJavascriptSet__mf_owner__37453319418803__loadShare___mf_0_emotion_mf_1_styled__loadShare__.js-ZVuRAEo5.js +1 -0
- package/admin/custom/assets/_virtual_mf___mfe_internal__ConfigCustomJavascriptSet__mf_owner__37453319418803__loadShare___mf_0_iobroker_mf_1_gui_mf_2_components__loadShare__.js-DVb0ZZ1Q.js +1217 -0
- package/admin/custom/assets/_virtual_mf___mfe_internal__ConfigCustomJavascriptSet__mf_owner__37453319418803__loadShare___mf_0_iobroker_mf_1_json_mf_2_config__loadShare__.js-Dna3WF04.js +1 -0
- package/admin/custom/assets/_virtual_mf___mfe_internal__ConfigCustomJavascriptSet__mf_owner__37453319418803__loadShare___mf_0_mui_mf_1_x_mf_2_date_mf_2_pickers__loadShare__.js-DcjdCGAx.js +1 -0
- package/admin/custom/assets/_virtual_mf___mfe_internal__ConfigCustomJavascriptSet__mf_owner__37453319418803__loadShare__date_mf_2_fns__loadShare__.js-CnhNjamd.js +1 -0
- package/admin/custom/assets/{_virtual_mf___mfe_internal__ConfigCustomJavascriptSet__mf_owner__136440932828998__loadShare__leaflet__loadShare__.js-im3edKNs.js → _virtual_mf___mfe_internal__ConfigCustomJavascriptSet__mf_owner__37453319418803__loadShare__leaflet__loadShare__.js-Dz7BFJqH.js} +1 -1
- package/admin/custom/assets/_virtual_mf___mfe_internal__ConfigCustomJavascriptSet__mf_owner__37453319418803__loadShare__react_mf_2_dom_mf_1_client__loadShare__.js-B0olko2J.js +1 -0
- package/admin/custom/assets/_virtual_mf___mfe_internal__ConfigCustomJavascriptSet__mf_owner__37453319418803__prebuild___mf_0_iobroker_mf_1_json_mf_2_config__prebuild__-CzN4reh_.js +122 -0
- package/admin/custom/assets/_virtual_mf___mfe_internal__ConfigCustomJavascriptSet__mf_owner__37453319418803__prebuild__leaflet__prebuild__-xPcBaiTQ.js +1 -0
- package/admin/custom/assets/{_virtual_mf___mfe_internal__ConfigCustomJavascriptSet__mf_owner__136440932828998__prebuild__react_mf_1_jsx_mf_2_runtime__prebuild__-Byvr2uOb.js → _virtual_mf___mfe_internal__ConfigCustomJavascriptSet__mf_owner__37453319418803__prebuild__react_mf_1_jsx_mf_2_runtime__prebuild__-CXpyx8Vy.js} +1 -1
- package/admin/custom/assets/_virtual_mf___mfe_internal__ConfigCustomJavascriptSet__mf_owner__37453319418803__prebuild__react_mf_2_dom_mf_1_client__prebuild__-DuFBE5fh.js +9 -0
- package/admin/custom/assets/{hostInit-IJMNq3h7.js → hostInit-6oh4UY2k.js} +1 -1
- package/admin/custom/assets/iconLibraryData-B5fiyl1C.js +1 -0
- package/admin/custom/assets/index-BrlyEy6J.js +1 -0
- package/admin/custom/assets/lib-BmDlTzq2.js +3 -0
- package/admin/custom/assets/{mf-entry-bootstrap-0-f149bc46.js → mf-entry-bootstrap-0-ad1cd7d0.js} +3 -3
- package/admin/custom/assets/pendingShares-kV2kwejX.js +1 -0
- package/admin/custom/assets/rolldown-runtime-Dqfqb5bO.js +1 -0
- package/admin/custom/customComponents.js +3 -2
- package/admin/custom/i18n/en.json +39 -39
- package/admin/custom/i18n/es.json +1 -1
- package/admin/custom/i18n/fr.json +2 -2
- package/admin/custom/i18n/it.json +1 -1
- package/admin/custom/i18n/nl.json +2 -2
- package/admin/custom/i18n/pt.json +2 -2
- package/admin/custom/i18n/ru.json +2 -2
- package/admin/custom/i18n/uk.json +1 -1
- package/admin/custom/i18n/zh-cn.json +1 -1
- package/admin/i18n/de.json +1 -1
- package/admin/i18n/en.json +115 -115
- package/admin/i18n/fr.json +115 -115
- package/admin/i18n/it.json +115 -115
- package/admin/i18n/nl.json +115 -115
- package/admin/i18n/pl.json +1 -1
- package/admin/i18n/pt.json +115 -115
- package/admin/i18n/ru.json +115 -115
- package/admin/i18n/uk.json +115 -115
- package/admin/i18n/zh-cn.json +115 -115
- package/admin/mf-manifest.json +1 -1
- package/admin/mf-stats.json +1 -1
- package/admin/remoteEntry.js +2 -2
- package/admin/tab.html +3 -7
- package/build/lib/fb/analyze.js +288 -0
- package/build/lib/fb/analyze.js.map +1 -0
- package/build/lib/fb/blocks.js +605 -0
- package/build/lib/fb/blocks.js.map +1 -0
- package/build/lib/fb/generate.js +326 -0
- package/build/lib/fb/generate.js.map +1 -0
- package/build/lib/fb/graph.js +240 -0
- package/build/lib/fb/graph.js.map +1 -0
- package/build/lib/fb/index.js +57 -0
- package/build/lib/fb/index.js.map +1 -0
- package/build/lib/fb/js.js +33 -0
- package/build/lib/fb/js.js.map +1 -0
- package/build/lib/fb/layout.js +205 -0
- package/build/lib/fb/layout.js.map +1 -0
- package/build/lib/fb/library.js +657 -0
- package/build/lib/fb/library.js.map +1 -0
- package/build/lib/fb/runtime.js +793 -0
- package/build/lib/fb/runtime.js.map +1 -0
- package/build/lib/fb/time.js +76 -0
- package/build/lib/fb/time.js.map +1 -0
- package/build/lib/fb/types.js +19 -0
- package/build/lib/fb/types.js.map +1 -0
- package/build/lib/fb/user.js +78 -0
- package/build/lib/fb/user.js.map +1 -0
- package/build/lib/javascript.d.ts +17 -17
- package/build/lib/mirror.js +4 -0
- package/build/lib/mirror.js.map +1 -1
- package/build/lib/sandbox.js +44 -0
- package/build/lib/sandbox.js.map +1 -1
- package/build/main.js +66 -1
- package/build/main.js.map +1 -1
- package/build/types.d.ts +9 -1
- package/docs/de/README.md +1 -1
- package/docs/de/fbd.md +274 -0
- package/docs/de/javascript.md +2167 -0
- package/docs/en/fbd.md +260 -0
- package/docs/en/javascript.md +28 -30
- package/io-package.json +52 -28
- package/package.json +8 -8
- package/admin/assets/AiChatPanel-AZko1BsN.js +0 -27
- package/admin/assets/AiDiffView-Cri2QFh1.js +0 -1
- package/admin/assets/Debugger-CVDh3kgz.js +0 -15
- package/admin/assets/Error-Ch2nx5uC.js +0 -1
- package/admin/assets/Import-XKVP-nRT.js +0 -1
- package/admin/assets/RulesEditor-DsO4cKIk.js +0 -1
- package/admin/assets/ScriptEditorVanillaMonaco-BDAw2Bw6.js +0 -3
- package/admin/assets/_virtual_mf-localSharedImportMap___mfe_internal__iobroker_javascript__mf_owner__1-BMAFQFoH.js +0 -1
- package/admin/assets/_virtual_mf___mfe_internal__iobroker_javascript__mf_owner__113183188387379__loadShare___mf_0_iobroker_mf_1_gui_mf_2_components__loadShare__.js-D-gi6Mty.js +0 -1217
- package/admin/assets/_virtual_mf___mfe_internal__iobroker_javascript__mf_owner__113183188387379__loadShare__react_mf_2_dom_mf_1_client__loadShare__.js-CDctpiPx.js +0 -9
- package/admin/assets/aiPromptBuilder-aJfHa-eU.js +0 -1
- package/admin/assets/blocks_action-DS28sNfo.js +0 -1
- package/admin/assets/blocks_logic-Dpp2fwlu.js +0 -1
- package/admin/assets/blocks_number-N4IfHvYD.js +0 -1
- package/admin/assets/blocks_object-uK7FHVhS.js +0 -1
- package/admin/assets/blocks_procedures-C_KD0Bm6.js +0 -3
- package/admin/assets/blocks_switch-C8Rls5pK.js +0 -2
- package/admin/assets/blocks_system-CEQnj5fY.js +0 -1
- package/admin/assets/blocks_text-BDEWxu0P.js +0 -1
- package/admin/assets/blocks_time-aHQQK1Uz.js +0 -1
- package/admin/assets/blocks_timeout-C2L93TLJ.js +0 -1
- package/admin/assets/helpers-DiwtLpXM.js +0 -1
- package/admin/assets/index-B0FfAYMN.js +0 -871
- package/admin/assets/index-CXaeqPRy.css +0 -1
- package/admin/assets/stateHoverProvider-BkW15VMN.js +0 -9
- package/admin/assets/virtualExposes-DgGB-18P.js +0 -1
- package/admin/assets/virtual_mf-REMOTE_ENTRY_ID___mfe_internal__iobroker_javascript__remoteEntry_js-CiidVc0O.js +0 -1
- package/admin/assets/virtual_mf-exposes___mfe_internal__iobroker_javascript__remoteEntry_js-ChiJXsfH.js +0 -1
- package/admin/custom/assets/Components-SGnA-3W_.js +0 -1
- package/admin/custom/assets/_virtual_mf-localSharedImportMap___mfe_internal__ConfigCustomJavascriptSet__mf_owner__1-Bx3X6TLB.js +0 -1
- package/admin/custom/assets/_virtual_mf___mfe_internal__ConfigCustomJavascriptSet__mf_owner__136440932828998__loadShare___mf_0_emotion_mf_1_react__loadShare__.js-Cc7MmJgr.js +0 -1
- package/admin/custom/assets/_virtual_mf___mfe_internal__ConfigCustomJavascriptSet__mf_owner__136440932828998__loadShare___mf_0_emotion_mf_1_styled__loadShare__.js-CdvEvX5z.js +0 -1
- package/admin/custom/assets/_virtual_mf___mfe_internal__ConfigCustomJavascriptSet__mf_owner__136440932828998__loadShare___mf_0_iobroker_mf_1_gui_mf_2_components__loadShare__.js-D5NaoeJi.js +0 -1217
- package/admin/custom/assets/_virtual_mf___mfe_internal__ConfigCustomJavascriptSet__mf_owner__136440932828998__loadShare___mf_0_iobroker_mf_1_json_mf_2_config__loadShare__.js-Cbgw_a3f.js +0 -1
- package/admin/custom/assets/_virtual_mf___mfe_internal__ConfigCustomJavascriptSet__mf_owner__136440932828998__loadShare___mf_0_mui_mf_1_x_mf_2_date_mf_2_pickers__loadShare__.js-CMr75K5w.js +0 -1
- package/admin/custom/assets/_virtual_mf___mfe_internal__ConfigCustomJavascriptSet__mf_owner__136440932828998__loadShare__date_mf_2_fns__loadShare__.js-DKIvPDPX.js +0 -1
- package/admin/custom/assets/_virtual_mf___mfe_internal__ConfigCustomJavascriptSet__mf_owner__136440932828998__loadShare__react_mf_2_dom_mf_1_client__loadShare__.js-D50aYKgD.js +0 -1
- package/admin/custom/assets/_virtual_mf___mfe_internal__ConfigCustomJavascriptSet__mf_owner__136440932828998__prebuild___mf_0_iobroker_mf_1_json_mf_2_config__prebuild__-CEzQFX7o.js +0 -122
- package/admin/custom/assets/_virtual_mf___mfe_internal__ConfigCustomJavascriptSet__mf_owner__136440932828998__prebuild__leaflet__prebuild__-BUDmnAcx.js +0 -1
- package/admin/custom/assets/_virtual_mf___mfe_internal__ConfigCustomJavascriptSet__mf_owner__136440932828998__prebuild__react_mf_2_dom_mf_1_client__prebuild__-D_1oh1WH.js +0 -9
- package/admin/custom/assets/index-7r4VklMp.js +0 -1
- package/admin/custom/assets/lib-DDU2Oe48.js +0 -3
- package/admin/custom/assets/pendingShares-DarGQhyO.js +0 -1
- package/admin/custom/assets/rolldown-runtime-BcKkbAw3.js +0 -1
- package/admin/custom/assets/virtualExposes-C0IqMANQ.js +0 -1
- package/admin/custom/assets/virtual_mf-REMOTE_ENTRY_ID___mfe_internal__ConfigCustomJavascriptSet__customComponents_js-CqKvh5Xu.js +0 -1
- package/admin/custom/assets/virtual_mf-exposes___mfe_internal__ConfigCustomJavascriptSet__customComponents_js-DrBN_S5o.js +0 -2
package/build/types.d.ts
CHANGED
|
@@ -8,6 +8,8 @@ import type { EventObj } from './lib/eventObj';
|
|
|
8
8
|
import type { PatternEventCompareFunction } from './lib/patternCompareFunctions';
|
|
9
9
|
import type { AstroEvent } from './lib/consts';
|
|
10
10
|
import type { Secrets } from './lib/secrets';
|
|
11
|
+
import type { FbDebugCommand, FbDebugStatus } from './lib/fb/types';
|
|
12
|
+
import type { FbDebugSettings } from './lib/fb/runtime';
|
|
11
13
|
|
|
12
14
|
/** ECMAScript version the user scripts are compiled for */
|
|
13
15
|
export type TsTarget = 'es2018' | 'es2019' | 'es2020' | 'es2021' | 'es2022' | 'es2023' | 'es2024' | 'es2025' | 'esnext';
|
|
@@ -129,7 +131,7 @@ export type JavascriptTimer = {
|
|
|
129
131
|
scriptName: string;
|
|
130
132
|
};
|
|
131
133
|
|
|
132
|
-
export type ScriptType = 'TypeScript/ts' | 'Blockly' | 'Rules' | 'Javascript/js';
|
|
134
|
+
export type ScriptType = 'TypeScript/ts' | 'Blockly' | 'Rules' | 'FBD' | 'Javascript/js';
|
|
133
135
|
|
|
134
136
|
export type TimeRule = {
|
|
135
137
|
time: string | { hour: number; minute: number };
|
|
@@ -811,6 +813,12 @@ export interface JavascriptContext {
|
|
|
811
813
|
prepareStateObject: (id: string, state: ioBroker.SettableState | null) => ioBroker.State;
|
|
812
814
|
debugMode: string | undefined;
|
|
813
815
|
rulesOpened: string | null; // opened rules
|
|
816
|
+
/** Function block diagrams shown online in an editor: until when, and which viewer asked last */
|
|
817
|
+
fbdWatch: Map<string, { until: number; viewer: number; paths?: Map<string, number> }>;
|
|
818
|
+
/** The runtimes of the running diagrams take the commands of the online view here, by script */
|
|
819
|
+
fbdDebug: Map<string, (command: FbDebugCommand) => FbDebugStatus>;
|
|
820
|
+
/** Forced values and breakpoints of the online view, kept while a diagram starts again */
|
|
821
|
+
fbdDebugSettings: Map<string, FbDebugSettings>;
|
|
814
822
|
language: ioBroker.Languages;
|
|
815
823
|
getAbsoluteDefaultDataDir: () => string;
|
|
816
824
|
logError: (scriptName: string, msg: string, e: Error, offs?: number) => void;
|
package/docs/de/README.md
CHANGED
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
|
|
7
7
|
- [Blockly](blockly.md)
|
|
8
8
|
- [Benutzung](usage.md)
|
|
9
|
-
- [JavaScript-Referenz](
|
|
9
|
+
- [JavaScript-Referenz](javascript.md)
|
|
10
10
|
- [Upgrade-Anleitung](../en/upgrade-guide.md) (nur auf Englisch verfügbar)
|
|
11
11
|
|
|
12
12
|
## KI-Codegenerator - Unterstützung eigener API-Endpunkte
|
package/docs/de/fbd.md
ADDED
|
@@ -0,0 +1,274 @@
|
|
|
1
|
+
# Funktionspläne (FBD)
|
|
2
|
+
|
|
3
|
+
Ein Funktionsplan ist Logik aus Bausteinen, so wie eine SPS in CFC programmiert wird: Timer, Flipflops, Vergleiche
|
|
4
|
+
und Arithmetik, verbunden mit ioBroker-Datenpunkten. Er ist für Logik gedacht, die dauerhaft läuft - Verzögerungen,
|
|
5
|
+
Selbsthaltungen, Schwellwerte - und für Nutzer, die diese Art aus der SPS-Welt kennen. Wer auf ein einzelnes Ereignis
|
|
6
|
+
reagieren will, ist mit Blockly oder Rules meist einfacher unterwegs.
|
|
7
|
+
|
|
8
|
+
Beim Speichern wird der Plan in JavaScript übersetzt und läuft wie jedes andere Skript dieses Adapters.
|
|
9
|
+
|
|
10
|
+
## Einen Plan anlegen
|
|
11
|
+
|
|
12
|
+
Ein neues Skript hinzufügen und **Funktionsplan** wählen. Der Editor hat drei Bereiche:
|
|
13
|
+
|
|
14
|
+
- **Palette** (links), mit einer Suche und drei Reitern:
|
|
15
|
+
- **Blöcke**: die Bausteine nach Kategorien - auf die Fläche ziehen oder anklicken. Eine Kategorie klappt mit
|
|
16
|
+
einem Klick auf ihren Namen auf und zu.
|
|
17
|
+
- **Variablen**: die Datenpunkte, die der Plan liest und schreibt; ein Klick zeigt den Baustein.
|
|
18
|
+
- **Favoriten**: die Bausteine, die mit dem Stern markiert sind - er erscheint, wenn die Maus über einem Baustein
|
|
19
|
+
steht.
|
|
20
|
+
- **Fläche**: einen Ausgang (rechts am Baustein) mit einem Eingang (links) verbinden. Nur passende Typen lassen
|
|
21
|
+
sich verbinden - die Farbe eines Anschlusses zeigt seinen Typ; wird eine Verbindung auf einem unpassenden
|
|
22
|
+
Anschluss losgelassen, steht oben, warum. Ein Eingang nimmt genau eine Verbindung. `Entf` löscht das Ausgewählte.
|
|
23
|
+
- **Eigenschaften** (rechts): **Eigenschaften** zeigt die Einstellungen des gewählten Bausteins in Abschnitten, die
|
|
24
|
+
auf- und zuklappen - Allgemein (Instanzname, Typ, ein Kommentar), Parameter, Eingänge und bei Timern, Flipflops,
|
|
25
|
+
Flanken und Regelungsbausteinen eine **Vorschau**: ein Zeitdiagramm des Bausteins mit seinen Werten.
|
|
26
|
+
**Dokumentation** beschreibt den Baustein und seine Anschlüsse. Ist nichts gewählt: die Einstellungen des Plans
|
|
27
|
+
und die Tastenkürzel.
|
|
28
|
+
|
|
29
|
+
Ein Baustein zeigt das Wichtige direkt in sich: den Datenpunkt, den er liest oder schreibt, den Wert eines `CONST`
|
|
30
|
+
und die Werte der Eingänge, die nicht verbunden sind - sie lassen sich gleich dort ändern: Ein Klick schaltet ein
|
|
31
|
+
BOOL um, alles andere wird eingetippt und mit `Enter` übernommen. Im Kopf eines Bausteins zeigt das Zahnrad seine
|
|
32
|
+
Eigenschaften, das Menü `⋮` dupliziert oder löscht ihn (online auch: Haltepunkt; bei einem eigenen Baustein:
|
|
33
|
+
Innenansicht).
|
|
34
|
+
|
|
35
|
+
Probleme stehen unten auf der Fläche; ein Klick wählt den Baustein aus. Ein Plan mit Fehlern lässt sich speichern,
|
|
36
|
+
sein Skript läuft aber nicht, sondern meldet die Fehler im Protokoll.
|
|
37
|
+
|
|
38
|
+
Der Knopf **FBD → JS** zeigt den erzeugten Code.
|
|
39
|
+
|
|
40
|
+
Bearbeiten geht wie gewohnt: `Strg+Z` / `Strg+Y` (oder die Knöpfe der Werkzeugleiste) machen rückgängig und
|
|
41
|
+
wiederholen, `Strg+C`, `Strg+X` und `Strg+V` kopieren, schneiden aus und fügen die ausgewählten Bausteine samt der
|
|
42
|
+
Verbindungen zwischen ihnen ein - auch in einen anderen Plan. Eingefügte Bausteine bekommen neue IDs und, wo der
|
|
43
|
+
alte Name vergeben ist, neue Namen.
|
|
44
|
+
|
|
45
|
+
Die Leiste über der Fläche zeigt den Plan (und den Pfad in eine Instanz hinein) und hat die Werkzeuge:
|
|
46
|
+
|
|
47
|
+
- den Zoom: kleiner, der Zoom (ein Klick: 100 %), größer
|
|
48
|
+
- **Automatisch anordnen** stellt die Bausteine in Spalten entlang des Datenflusses auf: Eingänge links, Ausgänge
|
|
49
|
+
rechts, jeder Baustein auf der Höhe der Bausteine, mit denen er verbunden ist. Kommentare bleiben, wo sie sind.
|
|
50
|
+
`Strg+Z` nimmt es zurück.
|
|
51
|
+
- **Im Plan suchen** (`Strg+F`) findet Bausteine nach Instanzname, Typ, Datenpunkt oder anderem Parameter, Kommentare
|
|
52
|
+
nach ihrem Text. `Enter` geht zum nächsten Treffer, `Umschalt+Enter` zum vorigen, `Esc` schließt die Suche.
|
|
53
|
+
- **Raster** an oder aus (mit Raster rasten die Bausteine ein), und Verbindungen als Kurven oder rechtwinklig wie in
|
|
54
|
+
CFC - beides merkt sich der Browser, nicht der Plan
|
|
55
|
+
- rechts die Onlineansicht, siehe unten
|
|
56
|
+
|
|
57
|
+
**Verbindungsmarken**: Eine Verbindung quer durch den Plan lässt sich statt als Linie als Marke an beiden Enden
|
|
58
|
+
zeigen - Verbindung auswählen und in ihren Eigenschaften **Als Verbindungsmarke zeigen** einschalten. Beide Marken
|
|
59
|
+
zeigen den Namen des Bausteins, von dem die Verbindung kommt, oder einen eigenen. Ein Doppelklick auf eine Marke
|
|
60
|
+
springt zum anderen Ende. Nur die Darstellung ändert sich, die Verbindung wirkt wie zuvor.
|
|
61
|
+
|
|
62
|
+
## Onlineansicht
|
|
63
|
+
|
|
64
|
+
**Online** (rechts in der Leiste über der Fläche) zeigt die Werte des laufenden Plans: an jedem Ausgang,
|
|
65
|
+
BOOL-Leitungen grün (`TRUE`) oder grau (`FALSE`), andere Leitungen mit ihrem Wert in der Mitte. Neben oder unter dem
|
|
66
|
+
Knopf stehen:
|
|
67
|
+
|
|
68
|
+
- der Zykluszähler - er bleibt stehen, wenn der Plan nicht mehr rechnet
|
|
69
|
+
- eine Warnung, wenn keine Daten kommen (das Skript läuft nicht, oder seine Instanz ist gestoppt)
|
|
70
|
+
- ein Hinweis, wenn der Plan nach dem Speichern geändert wurde: Die Werte gehören zur gespeicherten Fassung
|
|
71
|
+
|
|
72
|
+
Schlägt ein Zyklus fehl, wird der Baustein, dessen Code fehlschlug, rot umrandet und der Fehler unten links
|
|
73
|
+
aufgeführt; auch das Protokoll nennt den Baustein (`Error in the function block diagram in block b7: ...`).
|
|
74
|
+
|
|
75
|
+
Die Werte fließen nur, solange ein Editor den Plan online zeigt: Der Editor fragt alle 10 s beim Adapter an, nach
|
|
76
|
+
30 s ohne Anfrage hört der Plan auf zu senden. Es kommen höchstens vier Aktualisierungen pro Sekunde, jede nur mit den
|
|
77
|
+
geänderten Werten. Ein Plan, der vor dieser Version gespeichert wurde, zeigt den Zykluszähler, aber keine Werte -
|
|
78
|
+
einmal speichern.
|
|
79
|
+
|
|
80
|
+
### In eine Instanz hinein
|
|
81
|
+
|
|
82
|
+
Ein Doppelklick auf eine Instanz eines eigenen Bausteins (oder **Innenansicht** in ihren Eigenschaften) zeigt den
|
|
83
|
+
Plan des Bausteins - so, wie dieser Plan ihn mitführt, nur lesbar - und online mit den Werten genau dieser Instanz.
|
|
84
|
+
Eine Instanz darin öffnet sich genauso; der Pfad oben links führt zurück, ebenso `Esc`. Werte im Inneren lassen sich
|
|
85
|
+
erzwingen; Haltepunkte werden im Plan selbst gesetzt. Die Werte im Inneren brauchen einen Plan, der mit dieser
|
|
86
|
+
Version gespeichert wurde.
|
|
87
|
+
|
|
88
|
+
### Werte erzwingen, Haltepunkte, Einzelschritte
|
|
89
|
+
|
|
90
|
+
Solange der Plan online gezeigt wird, lässt er sich steuern:
|
|
91
|
+
|
|
92
|
+
- **Erzwingen**: einen Baustein (oder eine Verbindung) auswählen - die Eigenschaften zeigen seine Ausgänge mit ihren
|
|
93
|
+
Werten. **TRUE** / **FALSE** oder ein Wert und **Erzwingen** halten den Ausgang auf diesem Wert, gleich was der
|
|
94
|
+
Baustein rechnet; die Bausteine dahinter und die Datenpunkte, die der Plan schreibt, bekommen den erzwungenen Wert.
|
|
95
|
+
Ein erzwungener Wert ist orange umrandet; **Freigeben** lässt ihn los.
|
|
96
|
+
- **Haltepunkte**: der Punkt oben links an einem Baustein, `F9` oder **Haltepunkt** in seinen Eigenschaften. Der
|
|
97
|
+
Plan hält vor diesem Baustein an; der Baustein, der als nächster läuft, ist gelb umrandet, und die Werte zeigen, wie
|
|
98
|
+
weit der Zyklus kam.
|
|
99
|
+
- Die Knöpfe links von **Online**: **Anhalten** / **Fortsetzen** (`F8`), **Ein Zyklus** und **Ein Baustein** (`F10`).
|
|
100
|
+
Solange der Plan wartet, warten auch die Änderungen seiner Eingänge. Ein Zyklus von Hand rechnet mit einer
|
|
101
|
+
Zykluszeit als vergangener Zeit - Timer verhalten sich so, wie sie es täten, egal wie lange der Plan wartete.
|
|
102
|
+
|
|
103
|
+
Das alles endet mit der Onlineansicht: Schaltet der Editor sie aus, wird er geschlossen oder verschwindet er (30 s
|
|
104
|
+
ohne Anfrage), gibt die Laufzeit die erzwungenen Werte frei, entfernt die Haltepunkte und läuft weiter - und
|
|
105
|
+
protokolliert das. Beim Speichern des Plans bleiben erzwungene Werte und Haltepunkte erhalten, solange die
|
|
106
|
+
Onlineansicht offen ist. Haltepunkte und Einzelschritte brauchen einen Plan, der mit dieser Version gespeichert
|
|
107
|
+
wurde; ein älterer lässt sich schon erzwingen und anhalten.
|
|
108
|
+
|
|
109
|
+
**Vorsicht:** Ein erzwungener Wert wirkt auf echte Geräte - der Plan schreibt seine Datenpunkte damit.
|
|
110
|
+
|
|
111
|
+
## Bausteine
|
|
112
|
+
|
|
113
|
+
| Kategorie | Bausteine |
|
|
114
|
+
|------------|------------------------------------------------------------------|
|
|
115
|
+
| ioBroker | `STATE_IN`, `STATE_OUT`, `CONST` |
|
|
116
|
+
| Logik | `AND`, `OR`, `XOR`, `NOT` |
|
|
117
|
+
| Speicher | `RS`, `SR`, `R_TRIG`, `F_TRIG` |
|
|
118
|
+
| Zeit | `TON`, `TOF`, `TP`, `BLINK` |
|
|
119
|
+
| Zähler | `CTU`, `CTD`, `CTUD` |
|
|
120
|
+
| Vergleich | `GT`, `GE`, `LT`, `LE`, `EQ`, `NE` |
|
|
121
|
+
| Arithmetik | `ADD`, `SUB`, `MUL`, `DIV`, `MIN`, `MAX`, `ROUND` |
|
|
122
|
+
| Umwandlung | `TO_BOOL`, `TO_INT`, `TO_REAL`, `TO_TIME`, `TO_STRING`, `CONCAT` |
|
|
123
|
+
| Regelung | `HYST`, `RAMP`, `PT1`, `PID` |
|
|
124
|
+
| Kalender | `CLOCK`, `TIMEWINDOW`, `SCHEDULE`, `ASTRO` |
|
|
125
|
+
| Meldungen | `LOG`, `NOTIFY`, `SENDTO` |
|
|
126
|
+
| Experte | `JS` |
|
|
127
|
+
|
|
128
|
+
Namen und Verhalten folgen IEC 61131-3. `AND`, `OR`, `XOR`, `ADD`, `MUL`, `MIN`, `MAX` und `CONCAT` haben 2 bis 16
|
|
129
|
+
Eingänge. Zeiten werden wie `500ms`, `2s`, `1m30s` oder `T#2s` eingegeben, Uhrzeiten wie `08:30`.
|
|
130
|
+
|
|
131
|
+
Die Regelungsbausteine:
|
|
132
|
+
|
|
133
|
+
- `HYST` - Zweipunktschalter: `Q` geht an, wenn `IN` über `HIGH` steigt, und aus, wenn `IN` unter `LOW` fällt;
|
|
134
|
+
dazwischen bleibt `Q`, wie es ist. Eine Heizung, die unter `LOW` einschaltet, nimmt `Q` invertiert (`NOT` oder
|
|
135
|
+
ein invertierter Eingang).
|
|
136
|
+
- `RAMP` - `OUT` folgt `IN`, ändert sich aber um höchstens `UP` pro Sekunde aufwärts und `DOWN` pro Sekunde abwärts;
|
|
137
|
+
`0` begrenzt nicht. Sie beginnt bei `IN`.
|
|
138
|
+
- `PT1` - Tiefpass erster Ordnung: `OUT` folgt `IN` mit der Zeitkonstante `T` (nach `T` sind 63 % eines Sprungs
|
|
139
|
+
erreicht). Glättet einen unruhigen Wert; er beginnt bei `IN`.
|
|
140
|
+
- `PID` - PID-Regler: Sollwert `SP`, Istwert `PV`, Stellgröße `Y` zwischen `YMIN` und `YMAX`. `KP` ist die
|
|
141
|
+
Verstärkung, `TN` die Nachstellzeit des I-Anteils, `TV` die Vorhaltzeit; `TN` oder `TV` gleich `0` lässt den Anteil
|
|
142
|
+
weg. Steht `Y` an einer Grenze, wächst der I-Anteil nicht weiter (Anti-Windup); der D-Anteil wird aus `PV` gebildet,
|
|
143
|
+
ein neuer Sollwert gibt also keinen Stoß. `RST` löscht den I-Anteil.
|
|
144
|
+
|
|
145
|
+
`RAMP`, `PT1` und `PID` hängen von der Zeit ab: Ein Plan mit ihnen läuft zyklisch.
|
|
146
|
+
|
|
147
|
+
Blinker und Zähler:
|
|
148
|
+
|
|
149
|
+
- `BLINK` - solange `EN` wahr ist, ist `Q` für `TH` wahr und für `TL` falsch, beginnend mit wahr.
|
|
150
|
+
- `CTU` zählt die steigenden Flanken an `CU`; `R` setzt `CV` auf 0 zurück, `Q` ist wahr, sobald `CV` `PV` erreicht
|
|
151
|
+
hat. `CTD` zählt bei `CD` herunter, `LD` lädt `PV`, `Q` ist bei 0 und darunter wahr. `CTUD` kann beides; `R` geht
|
|
152
|
+
vor `LD`, und Flanken an `CU` und `CD` im selben Zyklus heben sich auf. Ein Eingang, der beim Start des Skripts
|
|
153
|
+
schon wahr ist, ist keine Flanke. Der Zählerstand bleibt über einen Neustart des Skripts nicht erhalten.
|
|
154
|
+
|
|
155
|
+
Umwandlung: `TO_BOOL`, `TO_INT`, `TO_REAL`, `TO_TIME` und `TO_STRING` nehmen jeden Typ. `TO_INT` rundet, ein
|
|
156
|
+
Dezimalkomma gilt als Punkt, und was keine Zahl ist, ergibt 0; `TO_TIME` liest eine Zahl als ms und einen Text wie
|
|
157
|
+
`2s` oder `08:30`. `CONCAT` fügt seine Eingänge zu einem Text zusammen - Zahlen so, wie sie sind, also vorher mit
|
|
158
|
+
`ROUND` runden (`DIGITS` Nachkommastellen, 0 bis 10).
|
|
159
|
+
|
|
160
|
+
Der Kalender:
|
|
161
|
+
|
|
162
|
+
- `CLOCK` - die Ortszeit: `TOD` (Uhrzeit), `HOUR`, `MIN`, `WDAY` (1 Montag ... 7 Sonntag), `DAY`, `MONTH`, `YEAR`.
|
|
163
|
+
- `TIMEWINDOW` - `Q` ist von `START` bis `END` an den gewählten Tagen wahr (jeden Tag, Montag bis Freitag, Samstag
|
|
164
|
+
und Sonntag). Ein Fenster über Mitternacht wie `22:00` bis `06:00` gehört zu dem Tag, an dem es beginnt: Bei
|
|
165
|
+
Montag bis Freitag reicht es von Freitagnacht bis Samstagmorgen, aber nicht von Sonntagnacht in den Montag.
|
|
166
|
+
- `SCHEDULE` - `Q` ist einen Zyklus lang wahr, wenn die Zeit des Cron-Musters kommt, etwa `0 8 * * 1-5` für 8:00 von
|
|
167
|
+
Montag bis Freitag, oder mit Sekunden vorne `*/5 * * * * *` für alle 5 Sekunden. Der Knopf neben dem Feld öffnet den Dialog für das Muster.
|
|
168
|
+
- `ASTRO` - `Q` ist von einem Sonnenereignis bis zu einem anderen wahr, etwa von `sunset` bis `sunrise`, jeweils mit
|
|
169
|
+
einem Versatz in Minuten. `START` und `END` sind die Zeiten der beiden Ereignisse heute. Die Position ist die aus den
|
|
170
|
+
Einstellungen des Adapters; ohne sie gibt es keine Zeiten, und `Q` bleibt falsch.
|
|
171
|
+
|
|
172
|
+
`CLOCK`, `TIMEWINDOW` und `ASTRO` lassen einen Plan zyklisch laufen. `SCHEDULE` nicht: Wenn seine Zeit kommt, läuft
|
|
173
|
+
der Plan sofort, und gleich danach noch einmal, um den Impuls zu beenden.
|
|
174
|
+
|
|
175
|
+
- `STATE_IN` liest einen Datenpunkt und wandelt ihn in den gewählten Typ (`BOOL`, `INT`, `REAL`, `STRING`). Ein
|
|
176
|
+
Wert, der sich nicht wandeln lässt, wird einmal im Protokoll gemeldet und als 0 gelesen. Ändert sich die ID des
|
|
177
|
+
Datenpunkts - im Dialog gewählt oder eingetippt -, wird der Typ aus seinem Objekt übernommen, und ein Baustein,
|
|
178
|
+
der noch seinen ersten Namen hat, bekommt den Namen des Datenpunkts. Den Typ kann man danach anders setzen; neu
|
|
179
|
+
übernommen wird er erst mit der nächsten ID.
|
|
180
|
+
- `STATE_OUT` schreibt einen Datenpunkt nur, wenn sich der Wert ändert. `Mindestzeit zwischen zwei
|
|
181
|
+
Schreibvorgängen` begrenzt, wie oft er schreibt; der letzte Wert wird geschrieben, wenn die Zeit um ist.
|
|
182
|
+
- `CONST` ist ein Wert des gewählten Typs. Mit einem Eingang anderen Typs verbunden, übernimmt er dessen Typ und
|
|
183
|
+
behält seinen Wert, soweit es geht (`"0"` wird für eine `TIME` zu 0 ms) - außer er speist schon andere Eingänge,
|
|
184
|
+
die den neuen Typ nicht nehmen.
|
|
185
|
+
|
|
186
|
+
Die Meldungen:
|
|
187
|
+
|
|
188
|
+
- `LOG` schreibt eine Zeile ins ioBroker-Protokoll, mit der gewählten Stufe (`info`, `warn`, `error`, `debug`):
|
|
189
|
+
bei steigender Flanke an `TRIG` oder wann immer sich `IN` ändert. `%s` im Text ist der Wert von `IN`. Höchstens
|
|
190
|
+
20 Zeilen pro Minute - ein Plan, der alle 200 ms läuft, würde das Protokoll sonst fluten; die 20. Zeile sagt das.
|
|
191
|
+
- `NOTIFY` sendet den Text als ioBroker-Benachrichtigung - als Meldung oder als Alarm -, `SENDTO` an einen Adapter
|
|
192
|
+
wie `telegram.0`, `pushover.0` oder `email.0`, als `{ text, message, title, subject }` mit dem gewählten Befehl
|
|
193
|
+
(`send`). Beide senden, wenn `LOG` schreiben würde, höchstens 5-mal pro Minute; das Protokoll sagt, wenn mehr
|
|
194
|
+
ausgelassen wurden.
|
|
195
|
+
|
|
196
|
+
Der Expertenbaustein `JS` führt eigenen Code aus. Der Code ist der Rumpf einer Funktion, die die Eingänge `IN1` ...
|
|
197
|
+
`INn` (0 bis 8, beliebiger Typ) bekommt, dazu `dt` (ms seit dem letzten Zyklus), `firstScan` und `state` - ein Objekt,
|
|
198
|
+
das von einem Zyklus zum nächsten erhalten bleibt. Er gibt den Wert von `OUT1` zurück oder ein Feld
|
|
199
|
+
`[OUT1, OUT2, ...]` für mehr Ausgänge (1 bis 8); wo er `undefined` liefert, behält ein Ausgang seinen Wert. Die
|
|
200
|
+
Ausgänge dürfen an Eingänge jedes Typs, der Code muss also liefern, was diese erwarten.
|
|
201
|
+
|
|
202
|
+
```js
|
|
203
|
+
// zählt, wie oft IN1 über IN2 gestiegen ist
|
|
204
|
+
if (IN1 > IN2 && !state.above) {
|
|
205
|
+
state.count = (state.count || 0) + 1;
|
|
206
|
+
}
|
|
207
|
+
state.above = IN1 > IN2;
|
|
208
|
+
return state.count || 0;
|
|
209
|
+
```
|
|
210
|
+
|
|
211
|
+
Der Code läuft im Skript des Plans, er kann also Funktionen der Skripte wie `log()` aufrufen - er sollte aber auf
|
|
212
|
+
nichts warten: Der nächste Baustein braucht seine Ausgänge sofort. Ein Syntaxfehler wird schon vor dem Speichern
|
|
213
|
+
angezeigt, ein Fehler beim Ausführen am Baustein.
|
|
214
|
+
|
|
215
|
+
Signaltypen: `BOOL`, `INT`, `REAL`, `TIME`, `STRING`. Ein `INT` darf an einen `REAL`-Eingang; andere Umwandlungen
|
|
216
|
+
geschehen nicht von selbst.
|
|
217
|
+
|
|
218
|
+
## Eigene Bausteine
|
|
219
|
+
|
|
220
|
+
Ein Plan kann selbst ein Baustein sein, den andere Pläne beliebig oft einsetzen - wie ein Funktionsbaustein in der
|
|
221
|
+
SPS. Dazu in den Einstellungen des Plans **Dieser Plan ist ein Baustein** einschalten und dem Baustein einen Namen
|
|
222
|
+
und eine Beschreibung geben.
|
|
223
|
+
|
|
224
|
+
- Die Eingänge des Bausteins sind `FB_IN`-Bausteine, seine Ausgänge `FB_OUT`-Bausteine (Kategorie **Schnittstelle**,
|
|
225
|
+
nur im Plan eines Bausteins angeboten). Der Anschlussname ist der Name des Ein- oder Ausgangs am Baustein; `FB_IN`
|
|
226
|
+
hat außerdem einen Typ und den Wert, den der Eingang hat, wenn er nicht verbunden ist.
|
|
227
|
+
- Ein Baustein greift nicht auf Datenpunkte zu: `STATE_IN` und `STATE_OUT` sind in ihm nicht erlaubt, `CONST`
|
|
228
|
+
schon. Er darf andere eigene Bausteine verwenden, aber nicht sich selbst.
|
|
229
|
+
- Jede Instanz hat ihren eigenen Zustand - zwei Instanzen eines Bausteins mit einem Timer laufen unabhängig.
|
|
230
|
+
- Das Skript eines Bausteins tut nichts, wenn es läuft; der Baustein arbeitet nur in den Plänen, die ihn einsetzen.
|
|
231
|
+
|
|
232
|
+
Die Bausteine aller Pläne stehen in der Palette unter **Eigene Bausteine**. Der Plan, der einen Baustein einsetzt,
|
|
233
|
+
speichert eine Kopie davon und damit die Version: Jede gespeicherte Änderung eines Bausteins ist eine neue Version.
|
|
234
|
+
Pläne mit einer älteren arbeiten mit ihr weiter und zeigen einen Hinweis - **Aktualisieren** in den Eigenschaften
|
|
235
|
+
einer Instanz übernimmt die neue Version in den Plan, **Baustein öffnen** öffnet den Plan des Bausteins.
|
|
236
|
+
Verbindungen zu Ein- oder Ausgängen, die es nicht mehr gibt, entfernt das Aktualisieren.
|
|
237
|
+
|
|
238
|
+
Weil die Kopie im Plan steht, läuft ein Plan weiter, wenn der Baustein gelöscht wird, und lässt sich allein
|
|
239
|
+
exportieren und importieren. Beim Kopieren von Instanzen in einen anderen Plan kommt der Baustein mit.
|
|
240
|
+
|
|
241
|
+
Ein Fehler in einem Baustein wird an der Instanz gemeldet, die ihn ausgeführt hat, im Editor und im Protokoll.
|
|
242
|
+
|
|
243
|
+
## Ausführung
|
|
244
|
+
|
|
245
|
+
Die Bausteine laufen in der Reihenfolge des Datenflusses; die Zahl in der Ecke jedes Bausteins ist seine Position.
|
|
246
|
+
Was gleichzeitig laufen könnte, läuft von links nach rechts, dann von oben nach unten.
|
|
247
|
+
|
|
248
|
+
- **Ereignisgesteuert**: Hängt kein Baustein von der Zeit ab, läuft der Plan, sobald sich ein Eingang ändert.
|
|
249
|
+
Änderungen innerhalb von 20 ms laufen gemeinsam in einem Zyklus.
|
|
250
|
+
- **Zyklisch**: Sobald der Plan einen Timer enthält, läuft er alle 200 ms (50 ms bis 10 s, siehe Einstellungen des
|
|
251
|
+
Plans) und zusätzlich direkt nach der Änderung eines Eingangs.
|
|
252
|
+
|
|
253
|
+
Die Betriebsart wird automatisch gewählt oder in den Einstellungen des Plans festgelegt.
|
|
254
|
+
|
|
255
|
+
Eine Rückkopplung ist nur über einen speichernden Baustein erlaubt (Timer, Zähler, Flipflop, Flanke, Regelungsbaustein,
|
|
256
|
+
`JS`, eigener Baustein): Die zurückführende
|
|
257
|
+
Verbindung liest, was dieser Baustein im vorigen Zyklus ausgegeben hat, und wird als Doppelstrich gezeichnet. Eine
|
|
258
|
+
Rückkopplung ohne einen solchen Baustein ist ein Fehler.
|
|
259
|
+
|
|
260
|
+
Ein Timer zählt ab dem Zyklus, in dem er die Änderung seines Eingangs sieht. Er läuft also nie vor seiner Zeit ab,
|
|
261
|
+
höchstens einen Zyklus später.
|
|
262
|
+
|
|
263
|
+
## Grenzen
|
|
264
|
+
|
|
265
|
+
- Nicht für sicherheitsgerichtete Funktionen. Ein Plan läuft in einem ioBroker-Skript, ohne Echtzeitgarantien.
|
|
266
|
+
- Der Zustand der Bausteine bleibt über einen Neustart des Skripts nicht erhalten.
|
|
267
|
+
- Noch nicht vorhanden: Haltepunkte in einem eigenen Baustein, eine manuelle Ausführungsreihenfolge, Verbindungen,
|
|
268
|
+
die um Bausteine herum geführt werden.
|
|
269
|
+
|
|
270
|
+
## Ablage
|
|
271
|
+
|
|
272
|
+
Der Plan steht im Skript selbst, als letzte Zeile von `common.source` (`//#fbd:{...}`); darüber steht der erzeugte
|
|
273
|
+
Code. Der Plan enthält die Kopien der eigenen Bausteine, die er einsetzt. Die Bausteine der Bibliothek sind im Modul `@iobroker/fb-runtime` umgesetzt, das mit dem Adapter kommt, und werden nicht in
|
|
274
|
+
jedes Skript kopiert.
|