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.
Files changed (186) hide show
  1. package/README.md +10 -21
  2. package/admin/assets/AiChatPanel-CpY4Bun-.js +27 -0
  3. package/admin/assets/{AiChatService-Bsp_rhVx.js → AiChatService-QKcpW4jQ.js} +1 -1
  4. package/admin/assets/AiDiffView-DscPfZ38.js +1 -0
  5. package/admin/assets/{AiInlineProvider-BxOW88xU.js → AiInlineProvider-DTSPKoXG.js} +1 -1
  6. package/admin/assets/BlocklyEditor-BZyoN1JE.js +301 -0
  7. package/admin/assets/Compile-B0uHjrBE.css +1 -0
  8. package/admin/assets/Compile-Oss28m_f.js +165 -0
  9. package/admin/assets/Debugger-teJTIU-2.js +15 -0
  10. package/admin/assets/Documentation-uz4Ut9pT.js +4339 -0
  11. package/admin/assets/ExpandMore-V5Ix1QB1.js +1 -0
  12. package/admin/assets/FbEditor-B8S-mCvc.css +1 -0
  13. package/admin/assets/FbEditor-aOZ-RpPV.js +15 -0
  14. package/admin/assets/Import-BIC5Ee9z.js +1 -0
  15. package/admin/assets/NotificationsActive-BdzH44gp.js +1 -0
  16. package/admin/assets/RulesEditor-CcDVthPa.js +1 -0
  17. package/admin/assets/{ScriptEditor-BCGahS47.js → ScriptEditor-CviB6Hif.js} +2 -2
  18. package/admin/assets/ScriptEditorVanillaMonaco-ByuXwybM.js +3 -0
  19. package/admin/assets/Send-Mdo32jMb.js +1 -0
  20. package/admin/assets/_virtual_mf-localSharedImportMap___mfe_internal__iobroker_javascript__mf_owner__1-BnL93BgK.js +1 -0
  21. 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
  22. 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
  23. package/admin/assets/aiPromptBuilder-yTB6N2VT.js +1 -0
  24. package/admin/assets/blocklyTheme-CGhU3cEO.js +1 -0
  25. package/admin/assets/blocks_action-BQ4O7NRE.js +1 -0
  26. package/admin/assets/{blocks_convert-CLb0DLyc.js → blocks_convert-0VBjfhqQ.js} +1 -1
  27. package/admin/assets/blocks_logic-DAo99xDr.js +1 -0
  28. package/admin/assets/blocks_number-C--e19NU.js +1 -0
  29. package/admin/assets/blocks_object-D0TPhdzg.js +1 -0
  30. package/admin/assets/blocks_procedures-DgTxgXdB.js +3 -0
  31. package/admin/assets/{blocks_sendto-BxCMg9X4.js → blocks_sendto-CRIrtOUc.js} +1 -1
  32. package/admin/assets/blocks_switch-b_GYfF0n.js +2 -0
  33. package/admin/assets/blocks_system-BdkUdSsc.js +1 -0
  34. package/admin/assets/blocks_text-DSFhEVOf.js +1 -0
  35. package/admin/assets/blocks_time-CqALAiJp.js +1 -0
  36. package/admin/assets/blocks_timeout-yrOD2pZp.js +1 -0
  37. package/admin/assets/{blocks_trigger-XivsIDE5.js → blocks_trigger-DeAYXpSS.js} +1 -1
  38. package/admin/assets/{cronHoverProvider-BZMOFHO_.js → cronHoverProvider-DoO2_tpG.js} +1 -1
  39. package/admin/assets/{field_cron-CxKi__cX.js → field_cron-D3Ts_s9M.js} +1 -1
  40. package/admin/assets/{field_oid-CJIYiGxY.js → field_oid-BRNXredg.js} +1 -1
  41. package/admin/assets/{field_script-CehplM7L.js → field_script-3X6ousg7.js} +1 -1
  42. package/admin/assets/helpers-BTGaTdnT.js +1 -0
  43. package/admin/assets/{hostInit-Bs-bStPF.js → hostInit-2h2Cbsaw.js} +1 -1
  44. package/admin/assets/iconLibraryData-B5fiyl1C.js +1 -0
  45. package/admin/assets/index-BHhhebRG.css +1 -0
  46. package/admin/assets/index-CbQlIKB_.js +156 -0
  47. package/admin/assets/{inlineChatWidget-NIvdRGmU.js → inlineChatWidget-BwQVCPkx.js} +1 -1
  48. package/admin/assets/{inlineDiffController-Qh402KhK.js → inlineDiffController-BsDDsDHn.js} +1 -1
  49. package/admin/assets/loadBlocks-RpqM7PwO.js +117 -0
  50. package/admin/assets/loadMonaco-BVOEahNw.js +1 -0
  51. package/admin/assets/{mf-entry-bootstrap-0-019228a5.js → mf-entry-bootstrap-0-0deef484.js} +3 -3
  52. package/admin/assets/{pendingShares-B3t6ewri.js → pendingShares-BaAadIDv.js} +1 -1
  53. package/admin/assets/reactour.esm-DX9ZgYlx.js +137 -0
  54. package/admin/assets/stateHoverProvider-BEadnSXp.js +11 -0
  55. package/admin/assets/tileFbd-CWAy7R7m.svg +85 -0
  56. package/admin/custom/assets/Components-FkGDIlId.js +1 -0
  57. package/admin/custom/assets/_virtual_mf-localSharedImportMap___mfe_internal__ConfigCustomJavascriptSet__mf_owner__1-Cs88NUCd.js +1 -0
  58. 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
  59. 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
  60. 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
  61. 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
  62. 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
  63. package/admin/custom/assets/_virtual_mf___mfe_internal__ConfigCustomJavascriptSet__mf_owner__37453319418803__loadShare__date_mf_2_fns__loadShare__.js-CnhNjamd.js +1 -0
  64. 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
  65. 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
  66. 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
  67. package/admin/custom/assets/_virtual_mf___mfe_internal__ConfigCustomJavascriptSet__mf_owner__37453319418803__prebuild__leaflet__prebuild__-xPcBaiTQ.js +1 -0
  68. 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
  69. 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
  70. package/admin/custom/assets/{hostInit-IJMNq3h7.js → hostInit-6oh4UY2k.js} +1 -1
  71. package/admin/custom/assets/iconLibraryData-B5fiyl1C.js +1 -0
  72. package/admin/custom/assets/index-BrlyEy6J.js +1 -0
  73. package/admin/custom/assets/lib-BmDlTzq2.js +3 -0
  74. package/admin/custom/assets/{mf-entry-bootstrap-0-f149bc46.js → mf-entry-bootstrap-0-ad1cd7d0.js} +3 -3
  75. package/admin/custom/assets/pendingShares-kV2kwejX.js +1 -0
  76. package/admin/custom/assets/rolldown-runtime-Dqfqb5bO.js +1 -0
  77. package/admin/custom/customComponents.js +3 -2
  78. package/admin/custom/i18n/en.json +39 -39
  79. package/admin/custom/i18n/es.json +1 -1
  80. package/admin/custom/i18n/fr.json +2 -2
  81. package/admin/custom/i18n/it.json +1 -1
  82. package/admin/custom/i18n/nl.json +2 -2
  83. package/admin/custom/i18n/pt.json +2 -2
  84. package/admin/custom/i18n/ru.json +2 -2
  85. package/admin/custom/i18n/uk.json +1 -1
  86. package/admin/custom/i18n/zh-cn.json +1 -1
  87. package/admin/i18n/de.json +1 -1
  88. package/admin/i18n/en.json +115 -115
  89. package/admin/i18n/fr.json +115 -115
  90. package/admin/i18n/it.json +115 -115
  91. package/admin/i18n/nl.json +115 -115
  92. package/admin/i18n/pl.json +1 -1
  93. package/admin/i18n/pt.json +115 -115
  94. package/admin/i18n/ru.json +115 -115
  95. package/admin/i18n/uk.json +115 -115
  96. package/admin/i18n/zh-cn.json +115 -115
  97. package/admin/mf-manifest.json +1 -1
  98. package/admin/mf-stats.json +1 -1
  99. package/admin/remoteEntry.js +2 -2
  100. package/admin/tab.html +3 -7
  101. package/build/lib/fb/analyze.js +288 -0
  102. package/build/lib/fb/analyze.js.map +1 -0
  103. package/build/lib/fb/blocks.js +605 -0
  104. package/build/lib/fb/blocks.js.map +1 -0
  105. package/build/lib/fb/generate.js +326 -0
  106. package/build/lib/fb/generate.js.map +1 -0
  107. package/build/lib/fb/graph.js +240 -0
  108. package/build/lib/fb/graph.js.map +1 -0
  109. package/build/lib/fb/index.js +57 -0
  110. package/build/lib/fb/index.js.map +1 -0
  111. package/build/lib/fb/js.js +33 -0
  112. package/build/lib/fb/js.js.map +1 -0
  113. package/build/lib/fb/layout.js +205 -0
  114. package/build/lib/fb/layout.js.map +1 -0
  115. package/build/lib/fb/library.js +657 -0
  116. package/build/lib/fb/library.js.map +1 -0
  117. package/build/lib/fb/runtime.js +793 -0
  118. package/build/lib/fb/runtime.js.map +1 -0
  119. package/build/lib/fb/time.js +76 -0
  120. package/build/lib/fb/time.js.map +1 -0
  121. package/build/lib/fb/types.js +19 -0
  122. package/build/lib/fb/types.js.map +1 -0
  123. package/build/lib/fb/user.js +78 -0
  124. package/build/lib/fb/user.js.map +1 -0
  125. package/build/lib/javascript.d.ts +17 -17
  126. package/build/lib/mirror.js +4 -0
  127. package/build/lib/mirror.js.map +1 -1
  128. package/build/lib/sandbox.js +44 -0
  129. package/build/lib/sandbox.js.map +1 -1
  130. package/build/main.js +66 -1
  131. package/build/main.js.map +1 -1
  132. package/build/types.d.ts +9 -1
  133. package/docs/de/README.md +1 -1
  134. package/docs/de/fbd.md +274 -0
  135. package/docs/de/javascript.md +2167 -0
  136. package/docs/en/fbd.md +260 -0
  137. package/docs/en/javascript.md +28 -30
  138. package/io-package.json +52 -28
  139. package/package.json +8 -8
  140. package/admin/assets/AiChatPanel-AZko1BsN.js +0 -27
  141. package/admin/assets/AiDiffView-Cri2QFh1.js +0 -1
  142. package/admin/assets/Debugger-CVDh3kgz.js +0 -15
  143. package/admin/assets/Error-Ch2nx5uC.js +0 -1
  144. package/admin/assets/Import-XKVP-nRT.js +0 -1
  145. package/admin/assets/RulesEditor-DsO4cKIk.js +0 -1
  146. package/admin/assets/ScriptEditorVanillaMonaco-BDAw2Bw6.js +0 -3
  147. package/admin/assets/_virtual_mf-localSharedImportMap___mfe_internal__iobroker_javascript__mf_owner__1-BMAFQFoH.js +0 -1
  148. 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
  149. 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
  150. package/admin/assets/aiPromptBuilder-aJfHa-eU.js +0 -1
  151. package/admin/assets/blocks_action-DS28sNfo.js +0 -1
  152. package/admin/assets/blocks_logic-Dpp2fwlu.js +0 -1
  153. package/admin/assets/blocks_number-N4IfHvYD.js +0 -1
  154. package/admin/assets/blocks_object-uK7FHVhS.js +0 -1
  155. package/admin/assets/blocks_procedures-C_KD0Bm6.js +0 -3
  156. package/admin/assets/blocks_switch-C8Rls5pK.js +0 -2
  157. package/admin/assets/blocks_system-CEQnj5fY.js +0 -1
  158. package/admin/assets/blocks_text-BDEWxu0P.js +0 -1
  159. package/admin/assets/blocks_time-aHQQK1Uz.js +0 -1
  160. package/admin/assets/blocks_timeout-C2L93TLJ.js +0 -1
  161. package/admin/assets/helpers-DiwtLpXM.js +0 -1
  162. package/admin/assets/index-B0FfAYMN.js +0 -871
  163. package/admin/assets/index-CXaeqPRy.css +0 -1
  164. package/admin/assets/stateHoverProvider-BkW15VMN.js +0 -9
  165. package/admin/assets/virtualExposes-DgGB-18P.js +0 -1
  166. package/admin/assets/virtual_mf-REMOTE_ENTRY_ID___mfe_internal__iobroker_javascript__remoteEntry_js-CiidVc0O.js +0 -1
  167. package/admin/assets/virtual_mf-exposes___mfe_internal__iobroker_javascript__remoteEntry_js-ChiJXsfH.js +0 -1
  168. package/admin/custom/assets/Components-SGnA-3W_.js +0 -1
  169. package/admin/custom/assets/_virtual_mf-localSharedImportMap___mfe_internal__ConfigCustomJavascriptSet__mf_owner__1-Bx3X6TLB.js +0 -1
  170. 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
  171. 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
  172. 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
  173. 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
  174. 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
  175. package/admin/custom/assets/_virtual_mf___mfe_internal__ConfigCustomJavascriptSet__mf_owner__136440932828998__loadShare__date_mf_2_fns__loadShare__.js-DKIvPDPX.js +0 -1
  176. 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
  177. 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
  178. package/admin/custom/assets/_virtual_mf___mfe_internal__ConfigCustomJavascriptSet__mf_owner__136440932828998__prebuild__leaflet__prebuild__-BUDmnAcx.js +0 -1
  179. 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
  180. package/admin/custom/assets/index-7r4VklMp.js +0 -1
  181. package/admin/custom/assets/lib-DDU2Oe48.js +0 -3
  182. package/admin/custom/assets/pendingShares-DarGQhyO.js +0 -1
  183. package/admin/custom/assets/rolldown-runtime-BcKkbAw3.js +0 -1
  184. package/admin/custom/assets/virtualExposes-C0IqMANQ.js +0 -1
  185. package/admin/custom/assets/virtual_mf-REMOTE_ENTRY_ID___mfe_internal__ConfigCustomJavascriptSet__customComponents_js-CqKvh5Xu.js +0 -1
  186. 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](../en/javascript.md) (nur auf Englisch verfügbar)
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.