iobroker.javascript 9.2.1 → 9.2.3

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 (84) hide show
  1. package/README.md +10 -16
  2. package/admin/assets/{AiChatPanel-Cc1KscBJ.js → AiChatPanel-C4zUsNmN.js} +15 -15
  3. package/admin/assets/{ScriptEditor-6qrtvwPL.js → ScriptEditor-C6W68ya0.js} +1 -1
  4. package/admin/assets/ScriptEditorVanillaMonaco-DYTcDqp_.js +3 -0
  5. package/admin/assets/cronHoverProvider-Bg0Vz-1E.js +2 -0
  6. package/admin/assets/index-45IwpC7_.js +1 -0
  7. package/admin/assets/{index-BZxCaQhO.js → index-BXfqctma.js} +1 -1
  8. package/admin/assets/{index-CYbVtccs.js → index-CUau9-il.js} +83 -83
  9. package/admin/assets/{index-DsW7vBcg.js → index-crBQrXKG.js} +1 -1
  10. package/admin/assets/{index-CexrwGGC.js → index-qoSy77Bg.js} +41 -37
  11. package/admin/assets/{localSharedImportMap-BCwqnmn4.js → localSharedImportMap-CVlAGiIu.js} +1 -1
  12. package/admin/assets/stateHoverProvider-BYBqzJuX.js +9 -0
  13. package/admin/assets/{virtual_mf-REMOTE_ENTRY_ID_iobroker_javascript__remoteEntry_js-DNrEsMrg.js → virtual_mf-REMOTE_ENTRY_ID_iobroker_javascript__remoteEntry_js-CeYV4czE.js} +2 -2
  14. package/admin/custom/assets/Components-jfkoGyES.js +1 -0
  15. package/admin/custom/assets/ConfigCustomJavascriptSet__loadShare___mf_0_emotion_mf_1_react__loadShare__.mjs-sg07E3QA.js +1 -0
  16. package/admin/custom/assets/ConfigCustomJavascriptSet__loadShare___mf_0_emotion_mf_1_styled__loadShare__.mjs-CwjI4A-J.js +1 -0
  17. package/admin/custom/assets/{ConfigCustomJavascriptSet__loadShare__react__loadShare__.mjs-0SjJESw9.js → ConfigCustomJavascriptSet__loadShare__react__loadShare__.mjs-BW9Qbxx5.js} +1 -1
  18. package/admin/custom/assets/{ConfigCustomJavascriptSet__loadShare__react__loadShare__.mjs_commonjs-proxy-CInLgMWW.js → ConfigCustomJavascriptSet__loadShare__react__loadShare__.mjs_commonjs-proxy-2W2BYT2K.js} +1 -1
  19. package/admin/custom/assets/{ConfigCustomJavascriptSet__loadShare__react_mf_2_dom__loadShare__.mjs_commonjs-proxy-CorOEig8.js → ConfigCustomJavascriptSet__loadShare__react_mf_2_dom__loadShare__.mjs_commonjs-proxy-D8zcZsJo.js} +1 -1
  20. package/admin/custom/assets/DefaultPropsProvider-CfKHPa-G.js +1 -0
  21. package/admin/custom/assets/{TextField-DNzklBSl.js → TextField-CxPfV5Sr.js} +12 -12
  22. package/admin/custom/assets/{ThemeProvider-B4G3jidj.js → ThemeProvider-DSTCckLJ.js} +4 -4
  23. package/admin/custom/assets/{createSvgIcon-ZdrQ8zSU.js → createSvgIcon-b2B2NI3g.js} +1 -1
  24. package/admin/custom/assets/createTheme-MsdB8zt7.js +8 -0
  25. package/admin/custom/assets/defaultTheme-CmVP-QNF.js +1 -0
  26. package/admin/custom/assets/emotion-cache.browser.esm-BgJfNZJN.js +1 -0
  27. package/admin/custom/assets/emotion-react.browser.esm-chZAeh_-.js +1 -0
  28. package/admin/custom/assets/emotion-serialize.esm-BUa21YfQ.js +1 -0
  29. package/admin/custom/assets/emotion-styled.browser.esm-Yi13plpH.js +1 -0
  30. package/admin/custom/assets/emotion-use-insertion-effect-with-fallbacks.browser.esm-CEPeBbh9.js +1 -0
  31. package/admin/custom/assets/extends-CF3RwP-h.js +1 -0
  32. package/admin/custom/assets/index-17vbGv00.js +1 -0
  33. package/admin/custom/assets/{index-iRHaQfi-.js → index-B5DqCD_a.js} +1 -1
  34. package/admin/custom/assets/{index-DNKzDki_.js → index-CS_GBN2m.js} +159 -159
  35. package/admin/custom/assets/{index-NItS-TWp.js → index-ChQotUCl.js} +1 -1
  36. package/admin/custom/assets/{index-YBvFYuP6.js → index-CzRngQHl.js} +1 -1
  37. package/admin/custom/assets/index-DLNtxshy.js +1 -0
  38. package/admin/custom/assets/{index-Dp7A3XHd.js → index-DV76KW3-.js} +4 -4
  39. package/admin/custom/assets/{index-D0iTiVVG.js → index-DlQbqHom.js} +1 -1
  40. package/admin/custom/assets/{index-BptSiKBK.js → index-FTmk0JJx.js} +5 -5
  41. package/admin/custom/assets/index-qs6J40Tp.js +964 -0
  42. package/admin/custom/assets/{jsx-runtime-DfVU3AZG.js → jsx-runtime-BplTyRFk.js} +1 -1
  43. package/admin/custom/assets/localSharedImportMap-BeObsVNc.js +1 -0
  44. package/admin/custom/assets/useTheme-BV4xOYIL.js +1 -0
  45. package/admin/custom/assets/useTheme-ldICnlmf.js +1 -0
  46. package/admin/custom/assets/{virtualExposes-jSvr-kK3.js → virtualExposes-wYe_Np-4.js} +1 -1
  47. package/admin/custom/assets/{virtual_mf-REMOTE_ENTRY_ID_ConfigCustomJavascriptSet__customComponents_js-Br3IlnqO.js → virtual_mf-REMOTE_ENTRY_ID_ConfigCustomJavascriptSet__customComponents_js-BcRVut8U.js} +2 -2
  48. package/admin/custom/customComponents.js +1 -1
  49. package/admin/google-blockly/own/blocks_system.js +34 -0
  50. package/admin/google-blockly/own/blocks_words.js +4 -0
  51. package/admin/google-blockly/own/field_oid.js +151 -2
  52. package/admin/mf-manifest.json +1 -1
  53. package/admin/remoteEntry.js +1 -1
  54. package/admin/tab.html +10 -8
  55. package/build/lib/eventObj.js +21 -12
  56. package/build/lib/eventObj.js.map +1 -1
  57. package/build/lib/sandbox.js +168 -58
  58. package/build/lib/sandbox.js.map +1 -1
  59. package/build/lib/scheduler.js +18 -13
  60. package/build/lib/scheduler.js.map +1 -1
  61. package/build/main.js +224 -135
  62. package/build/main.js.map +1 -1
  63. package/build/types.d.ts +14 -6
  64. package/docs/de/README.md +2 -0
  65. package/docs/de/blockly.md +669 -8
  66. package/docs/en/blockly.md +33 -0
  67. package/io-package.json +27 -1
  68. package/package.json +1 -1
  69. package/admin/assets/ScriptEditorVanillaMonaco-bJua4sm1.js +0 -3
  70. package/admin/assets/index-SHs7_wDh.js +0 -1
  71. package/admin/assets/stateHoverProvider-CGChzV5W.js +0 -3
  72. package/admin/custom/assets/Components-B9ZyjeRI.js +0 -1
  73. package/admin/custom/assets/DefaultPropsProvider-CGb21NGY.js +0 -1
  74. package/admin/custom/assets/createTheme-Wd4QxQE0.js +0 -8
  75. package/admin/custom/assets/defaultTheme-F2iJF2G2.js +0 -1
  76. package/admin/custom/assets/index-AZB1OHDH.js +0 -1
  77. package/admin/custom/assets/index-C0RmLaAj.js +0 -1
  78. package/admin/custom/assets/index-sozs10Ij.js +0 -960
  79. package/admin/custom/assets/localSharedImportMap-BxT0VwTO.js +0 -1
  80. package/admin/custom/assets/useTheme-BfhDdtAr.js +0 -1
  81. package/admin/custom/assets/useTheme-DWZ6jNyq.js +0 -1
  82. /package/admin/custom/assets/{index-huvZQhZw.js → index-D_5kZmfw.js} +0 -0
  83. /package/admin/custom/assets/{index-CmJ8HzSc.js → index-DpJ18x6R.js} +0 -0
  84. /package/admin/custom/assets/{leaflet-src-k2rCV-Ix.js → leaflet-src-B472P7Y1.js} +0 -0
@@ -570,6 +570,13 @@ Im Gegensatz zu dem vorherigen Beispiel wird der Zustand von "Licht" in dem folg
570
570
  ```
571
571
 
572
572
 
573
+  
574
+ ### State umschalten
575
+ ![Toggle state](img/system_toggle_en.png)
576
+
577
+ Dieser Block ähnelt dem [Steuere-State-Block](#steuere-state), schaltet den Wert aber jeweils um — von `true` auf `false` und umgekehrt.
578
+
579
+
573
580
   
574
581
  ### Aktualisiere State
575
582
  ![Update state](img/system_update_en.png)
@@ -820,6 +827,42 @@ Typische Anwendung dieses Blocks:
820
827
   
821
828
 
822
829
 
830
+ ### Datenpunkt vorhanden
831
+
832
+ Dieser Block liefert einen Boolean (`true` / `false`) und gibt zurück, ob der angegebene Datenpunkt aktuell überhaupt einen Wertdatensatz in der State-DB besitzt. Die OID wird über einen Value-Input geliefert — sie kann aus dem OID-Auswahlblock (`Objekt ID`), einer String-Variable oder jedem anderen Block kommen, der eine State-ID liefert.
833
+
834
+ **Wozu das Ganze?** ioBroker speichert **Objekte** (Metadaten) und **States** (Werte) getrennt. Ein Adapter kann das *Objekt* eines Datenpunkts anlegen — die ID erscheint dann im OID-Auswahldialog —, ohne jemals einen *Wert* zu schreiben. In diesem Fall führt `getState(...)` zu einer Warnung im Log:
835
+
836
+ ```
837
+ warn getState "zigbee.0.187a3efffee9e4e8.load_power" not found (3)
838
+ ```
839
+
840
+ Auch eine Prüfung wie `Wert von Objekt-ID … != null` löst diese Warnung aus, weil sie bereits *während* des `getState`-Aufrufs entsteht — also bevor der Vergleich überhaupt ausgewertet wird.
841
+
842
+ Der Block **Datenpunkt vorhanden** verwendet intern `existsStateAsync(...)`. Diese Funktion prüft den Cache stillschweigend und schreibt nichts ins Log, falls der State fehlt. Das ist der saubere Weg, einen `getState`-Aufruf abzusichern, wenn ein Adapter Datenpunkte vorab anlegt, aber nicht sofort befüllt (z. B. Zigbee, Tuya).
843
+
844
+ Typische Anwendung — einen Lese-Vorgang gegen fehlende State-Datensätze absichern:
845
+
846
+ ```
847
+ wenn [Datenpunkt vorhanden [Objekt ID "zigbee.0.…load_power"]]
848
+ setze [leistung] auf [Wert von Objekt-ID "zigbee.0.…load_power"]
849
+ log [leistung]
850
+ ```
851
+
852
+ Der erzeugte JavaScript-Code:
853
+
854
+ ```javascript
855
+ if ((await existsStateAsync('zigbee.0.187a3efffee9e4e8.load_power'))) {
856
+ let leistung = getState('zigbee.0.187a3efffee9e4e8.load_power').val;
857
+ console.log(leistung);
858
+ }
859
+ ```
860
+
861
+ **Hinweis:** Mit der Adapter-Einstellung *„Beim Start nicht alle Zustände abonnieren"* lässt sich `existsState` nicht synchron auswerten. Der Block erzeugt deshalb die asynchrone Form (`await existsStateAsync(...)`), die in beiden Modi korrekt funktioniert.
862
+
863
+
864
+  
865
+
823
866
  ## Aktionsblöcke
824
867
 
825
868
  ### Exec - Kommando
@@ -1224,6 +1267,10 @@ If you start value with "{" it will be interpreted as JSON string. Use double qu
1224
1267
 
1225
1268
 
1226
1269
   
1270
+ ### An anderes Skript senden
1271
+ ![An anderes Skript senden](img/sendto_otherscript_1_en.png)
1272
+
1273
+ Mit diesem Block kannst du eine Nachricht an ein anderes Skript senden. Die Nachricht kann dort durch den Block [Ereignis – Nachricht empfangen](#trigger-on-script-event) verarbeitet werden.
1227
1274
 
1228
1275
 
1229
1276
   
@@ -1947,8 +1994,55 @@ Mit diesem Block können Sie Veranstaltungen per Dateiaktualisierung abbestellen
1947
1994
 
1948
1995
  **Wichtig**: Diese Funktionalität ist nur mit js-controller@4.1.x oder neuer verfügbar.
1949
1996
 
1997
+ ### Trigger auf Skript-Ereignis
1998
+ ![Trigger auf Skript-Ereignis](img/trigger_onScript_en.png)
1999
+
2000
+ Mit diesem Block kannst du dich auf skriptübergreifende Ereignisse abonnieren und beim Empfang eine Aktion ausführen.
2001
+
1950
2002
  ## Timeouts
1951
2003
 
2004
+ ### Warten/Pause
2005
+ Mit diesem einfachen Block lässt sich die Ausführung von Blöcken pausieren.
2006
+ Achtung: Wird `pause` innerhalb einer Block-Kette verwendet, werden alle in diesem Skript darunter liegenden Blöcke ebenfalls verzögert:
2007
+ ![Beispiel 1](img/wait1.png)
2008
+ Generierter Code:
2009
+ ```
2010
+ console.log('"Independent" block'); // Wird nicht verzögert
2011
+
2012
+ console.log('Before pause');
2013
+ await wait(5000);
2014
+ console.log('After pause');
2015
+ ```
2016
+
2017
+ Log-Ausgabe:
2018
+ ```
2019
+ 15:48:21.807 info javascript.0 (7304) script.js.Skript_1: "Independent" block
2020
+ 15:48:21.807 info javascript.0 (7304) script.js.Skript_1: Before pause
2021
+ 15:48:21.807 info javascript.0 (7304) script.js.Skript_1: registered 0 subscriptions and 0 schedules
2022
+ 15:48:26.810 info javascript.0 (7304) script.js.Skript_1: After pause
2023
+ ```
2024
+
2025
+ ![Beispiel 2](img/wait2.png)
2026
+
2027
+ Generierter Code:
2028
+ ```
2029
+ console.log('Before pause');
2030
+ await wait(5000);
2031
+ console.log('After pause');
2032
+
2033
+ console.log('"Independent" block'); // Wird um 5 Sekunden verzögert
2034
+ ```
2035
+
2036
+ Ausgabe:
2037
+
2038
+ ```
2039
+ 15:52:03.289 info javascript.0 (7304) script.js.Skript_1: Before pause
2040
+ 15:52:03.290 info javascript.0 (7304) script.js.Skript_1: registered 0 subscriptions and 0 schedules
2041
+ 15:52:08.296 info javascript.0 (7304) script.js.Skript_1: After pause
2042
+ 15:52:08.297 info javascript.0 (7304) script.js.Skript_1: "Independent" block
2043
+ ```
2044
+
2045
+
1952
2046
  ### Delayed execution
1953
2047
  ![Delayed execution](img/timeouts_timeout_en.png)
1954
2048
 
@@ -2333,25 +2427,592 @@ Inside these blocks variable "value" yet exist, but anyway to read their values
2333
2427
 
2334
2428
   
2335
2429
 
2336
- ## Functions
2430
+ ## Funktionen
2431
+
2432
+ ### Funktion aus Blöcken erstellen (ohne Rückgabewert)
2433
+ ![Funktion aus Blöcken erstellen ohne Rückgabewert](img/functions_function_en.png)
2434
+
2435
+ Mit diesem Block kannst du wiederkehrende Block-Sequenzen zu einer Funktion zusammenfassen und diese Funktion anschließend an beliebigen Stellen im aktuellen Blockly-Skript verwenden.
2436
+
2437
+ Hier ein Beispiel für eine Funktion, die nur die aktuelle Uhrzeit ins Log schreibt:
2438
+
2439
+ ![Funktion aus Blöcken erstellen ohne Rückgabewert](img/functions_function_2_en.png)
2440
+
2441
+ ```xml
2442
+ <xml xmlns="http://www.w3.org/1999/xhtml">
2443
+ <block type="comment" id=";LE@QUg[hpGG!Ed6(?Hf" x="463" y="88">
2444
+ <field name="COMMENT">Print current time</field>
2445
+ </block>
2446
+ <block type="procedures_defnoreturn" id="zz#oL]VPR)s}NMK9htHa" x="463" y="113">
2447
+ <field name="NAME">printTime</field>
2448
+ <comment pinned="false" h="80" w="160">Describe this function...</comment>
2449
+ <statement name="STACK">
2450
+ <block type="debug" id="ak(`[aJB-AH@Hvc;B,[D">
2451
+ <field name="Severity">log</field>
2452
+ <value name="TEXT">
2453
+ <shadow type="text" id="aGuA=^(ge/)=lXes9f]?">
2454
+ <field name="TEXT">test</field>
2455
+ </shadow>
2456
+ <block type="time_get" id="M}z9(p(melE7BbTGqczO">
2457
+ <mutation format="false" language="false"></mutation>
2458
+ <field name="OPTION">hh:mm:ss.sss</field>
2459
+ </block>
2460
+ </value>
2461
+ </block>
2462
+ </statement>
2463
+ </block>
2464
+ </xml>
2465
+ ```
2466
+
2467
+ Nachdem die Funktion erstellt wurde, kann sie folgendermaßen verwendet werden:
2468
+
2469
+ ![Funktion aus Blöcken erstellen ohne Rückgabewert](img/functions_function_3_en.png)
2470
+
2471
+ ```xml
2472
+ <block xmlns="http://www.w3.org/1999/xhtml" type="timeouts_setinterval" id="hp;?}l3uStXhm+a2s!9t" x="62.99999999999943" y="112.99999999999994">
2473
+ <field name="NAME">interval</field>
2474
+ <field name="INTERVAL">1000</field>
2475
+ <statement name="STATEMENT">
2476
+ <block type="procedures_callnoreturn" id="(/)MPv+z_|516CuG%[XD">
2477
+ <mutation name="printTime"></mutation>
2478
+ </block>
2479
+ </statement>
2480
+ </block>
2481
+ ```
2482
+
2483
+ Die neu erstellte Funktion erscheint im Block-Menü:
2484
+
2485
+ ![Funktion aus Blöcken erstellen ohne Rückgabewert](img/functions_function_4_en.png)
2486
+
2487
+ Zusätzlich lassen sich über den Konfigurationsdialog Argumente für die Funktion festlegen. Im selben Dialog können auch die Namen der Argumente bearbeitet werden.
2488
+
2489
+ ![Funktion aus Blöcken erstellen ohne Rückgabewert](img/functions_function_1_en.png)
2490
+
2491
+ Hier ein Beispiel für eine Funktion, die die Summe des ersten und des zweiten Arguments ausgibt:
2492
+
2493
+ ![Funktion aus Blöcken erstellen ohne Rückgabewert](img/functions_function_5_en.png)
2494
+
2495
+ ```xml
2496
+ <xml xmlns="http://www.w3.org/1999/xhtml">
2497
+ <block type="comment" id=";LE@QUg[hpGG!Ed6(?Hf" x="463" y="88">
2498
+ <field name="COMMENT">Print sum of a and b</field>
2499
+ </block>
2500
+ <block type="procedures_defnoreturn" id="zz#oL]VPR)s}NMK9htHa" x="463" y="113">
2501
+ <mutation>
2502
+ <arg name="a"></arg>
2503
+ <arg name="b"></arg>
2504
+ </mutation>
2505
+ <field name="NAME">printSum</field>
2506
+ <comment pinned="false" h="80" w="160">Describe this function...</comment>
2507
+ <statement name="STACK">
2508
+ <block type="debug" id="ak(`[aJB-AH@Hvc;B,[D">
2509
+ <field name="Severity">log</field>
2510
+ <value name="TEXT">
2511
+ <shadow type="text" id="aGuA=^(ge/)=lXes9f]?">
2512
+ <field name="TEXT">test</field>
2513
+ </shadow>
2514
+ <block type="math_arithmetic" id="qUGc!b+U]:yE!I+3I+Lp">
2515
+ <field name="OP">ADD</field>
2516
+ <value name="A">
2517
+ <shadow type="math_number" id="OqjQ{@*pgO,~Xd(ef)9~">
2518
+ <field name="NUM">1</field>
2519
+ </shadow>
2520
+ <block type="variables_get" id="]dC)!=A3{(5?9hJ:1gET">
2521
+ <field name="VAR">a</field>
2522
+ </block>
2523
+ </value>
2524
+ <value name="B">
2525
+ <shadow type="math_number" id="aDp|:rn#.wve0]WKi(D[">
2526
+ <field name="NUM">1</field>
2527
+ </shadow>
2528
+ <block type="variables_get" id="5];ao,?ce{;GJ;OOW~S4">
2529
+ <field name="VAR">b</field>
2530
+ </block>
2531
+ </value>
2532
+ </block>
2533
+ </value>
2534
+ </block>
2535
+ </statement>
2536
+ </block>
2537
+ </xml>
2538
+ ```
2539
+
2540
+ Die Argumente erscheinen im Variablen-Menü:
2541
+
2542
+ ![Funktion aus Blöcken erstellen ohne Rückgabewert](img/functions_function_6_en.png)
2543
+
2544
+ Die Funktion lässt sich dann so verwenden:
2545
+
2546
+ ![Funktion aus Blöcken erstellen ohne Rückgabewert](img/functions_function_7_en.png)
2547
+
2548
+ ```xml
2549
+ <block xmlns="http://www.w3.org/1999/xhtml" type="procedures_callnoreturn" id="(-G|y+Y7AC]w2CTQGjYC" x="138" y="188">
2550
+ <mutation name="printSum">
2551
+ <arg name="a"></arg>
2552
+ <arg name="b"></arg>
2553
+ </mutation>
2554
+ <value name="ARG0">
2555
+ <block type="math_number" id="!.UT=[{Xkz-*wlPh)sYn">
2556
+ <field name="NUM">5</field>
2557
+ </block>
2558
+ </value>
2559
+ <value name="ARG1">
2560
+ <block type="math_number" id="EMhKM9Cn#;DjMZ#Ko%EN">
2561
+ <field name="NUM">6</field>
2562
+ </block>
2563
+ </value>
2564
+ </block>
2565
+ ```
2566
+
2567
+ ### Funktion aus Blöcken erstellen (mit Rückgabewert)
2568
+ ![Funktion aus Blöcken erstellen mit Rückgabewert](img/functions_function_ret_en.png)
2569
+
2570
+ Dieser Block funktioniert wie der vorherige, kann aber zusätzlich ein Ergebnis zurückgeben, das anschließend in anderen Blöcken weiterverwendet werden kann.
2571
+
2572
+ ![Funktion aus Blöcken erstellen mit Rückgabewert](img/functions_function_ret_2_en.png)
2573
+
2574
+ ```xml
2575
+ <block xmlns="http://www.w3.org/1999/xhtml" type="procedures_defreturn" id="4)|}1YzV}e6YUvVV^sY{" x="413" y="138">
2576
+ <mutation statements="false">
2577
+ <arg name="a"></arg>
2578
+ <arg name="b"></arg>
2579
+ </mutation>
2580
+ <field name="NAME">do something</field>
2581
+ <comment pinned="false" h="80" w="160">Return sum of a and b</comment>
2582
+ <value name="RETURN">
2583
+ <block type="math_arithmetic" id="qUGc!b+U]:yE!I+3I+Lp">
2584
+ <field name="OP">ADD</field>
2585
+ <value name="A">
2586
+ <shadow type="math_number" id="OqjQ{@*pgO,~Xd(ef)9~">
2587
+ <field name="NUM">1</field>
2588
+ </shadow>
2589
+ <block type="variables_get" id="]dC)!=A3{(5?9hJ:1gET">
2590
+ <field name="VAR">a</field>
2591
+ </block>
2592
+ </value>
2593
+ <value name="B">
2594
+ <shadow type="math_number" id="aDp|:rn#.wve0]WKi(D[">
2595
+ <field name="NUM">1</field>
2596
+ </shadow>
2597
+ <block type="variables_get" id="5];ao,?ce{;GJ;OOW~S4">
2598
+ <field name="VAR">b</field>
2599
+ </block>
2600
+ </value>
2601
+ </block>
2602
+ </value>
2603
+ </block>
2604
+ ```
2605
+
2606
+ Die Verwendung ist analog zu den anderen Funktionsblöcken:
2607
+
2608
+ ![Funktion aus Blöcken erstellen mit Rückgabewert](img/functions_function_ret_3_en.png)
2609
+
2610
+ ```xml
2611
+ <xml xmlns="http://www.w3.org/1999/xhtml">
2612
+ <block type="debug" id="zgr7b0g)}uMe1ySGYL7X" x="163" y="137">
2613
+ <field name="Severity">log</field>
2614
+ <value name="TEXT">
2615
+ <shadow type="text" id="q-]m1ptAzK4Rq20wWRBq">
2616
+ <field name="TEXT">test</field>
2617
+ </shadow>
2618
+ <block type="procedures_callreturn" id="0RX?V1j|FZHK@*Lw3W-g">
2619
+ <mutation name="sum">
2620
+ <arg name="a"></arg>
2621
+ <arg name="b"></arg>
2622
+ </mutation>
2623
+ <value name="ARG0">
2624
+ <block type="math_number" id="Xd52^_Qp83=ah2RTWzSU">
2625
+ <field name="NUM">5</field>
2626
+ </block>
2627
+ </value>
2628
+ <value name="ARG1">
2629
+ <block type="math_number" id="-M9A9EhrgJSRc*4(X^[;">
2630
+ <field name="NUM">6</field>
2631
+ </block>
2632
+ </value>
2633
+ </block>
2634
+ </value>
2635
+ </block>
2636
+ <block type="procedures_defreturn" id="4)|}1YzV}e6YUvVV^sY{" x="413" y="138">
2637
+ <mutation statements="false">
2638
+ <arg name="a"></arg>
2639
+ <arg name="b"></arg>
2640
+ </mutation>
2641
+ <field name="NAME">sum</field>
2642
+ <comment pinned="false" h="80" w="160">Return sum of a and b</comment>
2643
+ <value name="RETURN">
2644
+ <block type="math_arithmetic" id="qUGc!b+U]:yE!I+3I+Lp">
2645
+ <field name="OP">ADD</field>
2646
+ <value name="A">
2647
+ <shadow type="math_number" id="OqjQ{@*pgO,~Xd(ef)9~">
2648
+ <field name="NUM">1</field>
2649
+ </shadow>
2650
+ <block type="variables_get" id="]dC)!=A3{(5?9hJ:1gET">
2651
+ <field name="VAR">a</field>
2652
+ </block>
2653
+ </value>
2654
+ <value name="B">
2655
+ <shadow type="math_number" id="aDp|:rn#.wve0]WKi(D[">
2656
+ <field name="NUM">1</field>
2657
+ </shadow>
2658
+ <block type="variables_get" id="5];ao,?ce{;GJ;OOW~S4">
2659
+ <field name="VAR">b</field>
2660
+ </block>
2661
+ </value>
2662
+ </block>
2663
+ </value>
2664
+ </block>
2665
+ </xml>
2666
+ ```
2337
2667
 
2338
- ### Create function from blocks with no return value
2668
+ Für jede Funktion lässt sich ein Kommentar bzw. eine Beschreibung hinzufügen.
2339
2669
 
2340
- ### Create function from blocks with return value
2670
+ ![Funktion aus Blöcken erstellen mit Rückgabewert](img/functions_function_ret_1_en.png)
2671
+
2672
+ Im Funktionsblock kann zusätzlich ein spezielles Return-Element verwendet werden:
2673
+
2674
+ ![Funktion aus Blöcken erstellen mit Rückgabewert](img/functions_function_ret_4_en.png)
2675
+
2676
+ ![Funktion aus Blöcken erstellen mit Rückgabewert](img/functions_function_ret_5_en.png)
2677
+
2678
+ ```xml
2679
+ <xml xmlns="http://www.w3.org/1999/xhtml">
2680
+ <block type="debug" id="zgr7b0g)}uMe1ySGYL7X" x="63" y="12">
2681
+ <field name="Severity">log</field>
2682
+ <value name="TEXT">
2683
+ <shadow type="text" id="q-]m1ptAzK4Rq20wWRBq">
2684
+ <field name="TEXT">test</field>
2685
+ </shadow>
2686
+ <block type="procedures_callreturn" id="0RX?V1j|FZHK@*Lw3W-g">
2687
+ <mutation name="numberToDay">
2688
+ <arg name="day"></arg>
2689
+ </mutation>
2690
+ <value name="ARG0">
2691
+ <block type="math_number" id="Xd52^_Qp83=ah2RTWzSU">
2692
+ <field name="NUM">5</field>
2693
+ </block>
2694
+ </value>
2695
+ </block>
2696
+ </value>
2697
+ </block>
2698
+ <block type="debug" id="@i@bdG^90dp,cJ#W*[nB" x="12" y="188">
2699
+ <field name="Severity">log</field>
2700
+ <value name="TEXT">
2701
+ <shadow type="text" id="8:/`}T!:6Wz.d/;)jpHl">
2702
+ <field name="TEXT">test</field>
2703
+ </shadow>
2704
+ <block type="procedures_callreturn" id="hvzS!O_Q=FlccQR@*%tk">
2705
+ <mutation name="numberToDay">
2706
+ <arg name="day"></arg>
2707
+ </mutation>
2708
+ <value name="ARG0">
2709
+ <block type="time_get" id=":A,Ba,yrW_QgiX*cs9zh">
2710
+ <mutation format="false" language="false"></mutation>
2711
+ <field name="OPTION">wd</field>
2712
+ </block>
2713
+ </value>
2714
+ </block>
2715
+ </value>
2716
+ </block>
2717
+ <block type="procedures_defreturn" id="4)|}1YzV}e6YUvVV^sY{" x="588" y="163">
2718
+ <mutation>
2719
+ <arg name="day"></arg>
2720
+ </mutation>
2721
+ <field name="NAME">numberToDay</field>
2722
+ <comment pinned="false" h="80" w="160">Return sum of a and b</comment>
2723
+ <statement name="STACK">
2724
+ <block type="procedures_ifreturn" id="/qJjm#cr-naS}joAL0eT">
2725
+ <mutation value="1"></mutation>
2726
+ <value name="CONDITION">
2727
+ <block type="logic_compare" id="cbxuAYxF,ptMi.`E/nB.">
2728
+ <field name="OP">EQ</field>
2729
+ <value name="A">
2730
+ <block type="variables_get" id="`mWQWp).?qDuD=)NX2dA">
2731
+ <field name="VAR">day</field>
2732
+ </block>
2733
+ </value>
2734
+ <value name="B">
2735
+ <block type="math_number" id="s,20+9X6bB/2nL{v?g:/">
2736
+ <field name="NUM">0</field>
2737
+ </block>
2738
+ </value>
2739
+ </block>
2740
+ </value>
2741
+ <value name="VALUE">
2742
+ <block type="text" id="iI)V7P`3YP]{-S-7HcO1">
2743
+ <field name="TEXT">Sunday</field>
2744
+ </block>
2745
+ </value>
2746
+ <next>
2747
+ <block type="procedures_ifreturn" id="3=FBSCS{jzu[}2L5Spi[">
2748
+ <mutation value="1"></mutation>
2749
+ <value name="CONDITION">
2750
+ <block type="logic_compare" id="V[;S84AH5cf93^5/[AN^">
2751
+ <field name="OP">EQ</field>
2752
+ <value name="A">
2753
+ <block type="variables_get" id=";ShgVu*+:nn9WSzbm[fA">
2754
+ <field name="VAR">day</field>
2755
+ </block>
2756
+ </value>
2757
+ <value name="B">
2758
+ <block type="math_number" id="jY?Wj8lC1-~SiIHa*I)0">
2759
+ <field name="NUM">1</field>
2760
+ </block>
2761
+ </value>
2762
+ </block>
2763
+ </value>
2764
+ <value name="VALUE">
2765
+ <block type="text" id="=aVg_FatldZUUsS(8G`;">
2766
+ <field name="TEXT">Monday</field>
2767
+ </block>
2768
+ </value>
2769
+ <next>
2770
+ <block type="procedures_ifreturn" id="(g_VE2e?U^J-nhk,bP|0">
2771
+ <mutation value="1"></mutation>
2772
+ <value name="CONDITION">
2773
+ <block type="logic_compare" id="M;B+SSw[Mc.iu;fUjvcV">
2774
+ <field name="OP">EQ</field>
2775
+ <value name="A">
2776
+ <block type="variables_get" id="yT{.UQ)qXY8-@2XzpxQo">
2777
+ <field name="VAR">day</field>
2778
+ </block>
2779
+ </value>
2780
+ <value name="B">
2781
+ <block type="math_number" id="Q-JC5_JZ=i{[+~:^|BpU">
2782
+ <field name="NUM">2</field>
2783
+ </block>
2784
+ </value>
2785
+ </block>
2786
+ </value>
2787
+ <value name="VALUE">
2788
+ <block type="text" id="9`665+j*i_?3BCZWODGt">
2789
+ <field name="TEXT">Tuesday</field>
2790
+ </block>
2791
+ </value>
2792
+ <next>
2793
+ <block type="procedures_ifreturn" id="{+9IT6E:N-a+Y.cFNMsw">
2794
+ <mutation value="1"></mutation>
2795
+ <value name="CONDITION">
2796
+ <block type="logic_compare" id="B}D{JSK|}=bk|-|D#/_h">
2797
+ <field name="OP">EQ</field>
2798
+ <value name="A">
2799
+ <block type="variables_get" id="s{Zxm|sBbEGA1#~Tv3EE">
2800
+ <field name="VAR">day</field>
2801
+ </block>
2802
+ </value>
2803
+ <value name="B">
2804
+ <block type="math_number" id="f!3KoyGu4bWpxdaJY`JI">
2805
+ <field name="NUM">3</field>
2806
+ </block>
2807
+ </value>
2808
+ </block>
2809
+ </value>
2810
+ <value name="VALUE">
2811
+ <block type="text" id="yS4pn;Fdg9JT[MjvPu,4">
2812
+ <field name="TEXT">Wednesday</field>
2813
+ </block>
2814
+ </value>
2815
+ <next>
2816
+ <block type="procedures_ifreturn" id="g*VMz;jyw4,@;Qb*/8TN">
2817
+ <mutation value="1"></mutation>
2818
+ <value name="CONDITION">
2819
+ <block type="logic_compare" id="(^azMqi{:`?S.tJ@y7-m">
2820
+ <field name="OP">EQ</field>
2821
+ <value name="A">
2822
+ <block type="variables_get" id="P*CAI!ug.Xl*BM2v/kpb">
2823
+ <field name="VAR">day</field>
2824
+ </block>
2825
+ </value>
2826
+ <value name="B">
2827
+ <block type="math_number" id="YN@VzF~X=BOcWm+P]c3i">
2828
+ <field name="NUM">4</field>
2829
+ </block>
2830
+ </value>
2831
+ </block>
2832
+ </value>
2833
+ <value name="VALUE">
2834
+ <block type="text" id="H`yzv!j_GjSw|@f7Gap8">
2835
+ <field name="TEXT">Thursday</field>
2836
+ </block>
2837
+ </value>
2838
+ <next>
2839
+ <block type="procedures_ifreturn" id=")htNPjBWw1J/gp-Y5#Kg">
2840
+ <mutation value="1"></mutation>
2841
+ <value name="CONDITION">
2842
+ <block type="logic_compare" id="nFZ;s`3ij0v|.wQqw`AB">
2843
+ <field name="OP">EQ</field>
2844
+ <value name="A">
2845
+ <block type="variables_get" id="Q^3OKKD]aGa0/qxWf%*g">
2846
+ <field name="VAR">day</field>
2847
+ </block>
2848
+ </value>
2849
+ <value name="B">
2850
+ <block type="math_number" id="#brnWNXj0_dx[JwHjgh0">
2851
+ <field name="NUM">5</field>
2852
+ </block>
2853
+ </value>
2854
+ </block>
2855
+ </value>
2856
+ <value name="VALUE">
2857
+ <block type="text" id="Y1-{3UJxFrpq{uJp6DkB">
2858
+ <field name="TEXT">Friday</field>
2859
+ </block>
2860
+ </value>
2861
+ <next>
2862
+ <block type="procedures_ifreturn" id="K2~CLXTJ5b=T+=/6%m=~">
2863
+ <mutation value="1"></mutation>
2864
+ <value name="CONDITION">
2865
+ <block type="logic_compare" id="Cjh^D.y[m3YQn},sC1(0">
2866
+ <field name="OP">EQ</field>
2867
+ <value name="A">
2868
+ <block type="variables_get" id="|uXT]6-.XcdAG-6HtffC">
2869
+ <field name="VAR">day</field>
2870
+ </block>
2871
+ </value>
2872
+ <value name="B">
2873
+ <block type="math_number" id="N@!AqGy7OCz9:zhv@f?K">
2874
+ <field name="NUM">6</field>
2875
+ </block>
2876
+ </value>
2877
+ </block>
2878
+ </value>
2879
+ <value name="VALUE">
2880
+ <block type="text" id="omKlSmgS{[5T:v{9(j}?">
2881
+ <field name="TEXT">Saturday</field>
2882
+ </block>
2883
+ </value>
2884
+ <next>
2885
+ <block type="procedures_ifreturn" id=".XFx#9RZIGl!joSiMNyq">
2886
+ <mutation value="1"></mutation>
2887
+ <value name="CONDITION">
2888
+ <block type="logic_compare" id="aqkbbBOzUTv/%JlX)V}S">
2889
+ <field name="OP">EQ</field>
2890
+ <value name="A">
2891
+ <block type="variables_get" id="qrl+C-GvBF7QzLz8?@:u">
2892
+ <field name="VAR">day</field>
2893
+ </block>
2894
+ </value>
2895
+ <value name="B">
2896
+ <block type="math_number" id="_[;I?)){=vm_jnSYHumL">
2897
+ <field name="NUM">7</field>
2898
+ </block>
2899
+ </value>
2900
+ </block>
2901
+ </value>
2902
+ <value name="VALUE">
2903
+ <block type="text" id="MCTQyN!}ig#3~)B[r#q[">
2904
+ <field name="TEXT">Sunday</field>
2905
+ </block>
2906
+ </value>
2907
+ </block>
2908
+ </next>
2909
+ </block>
2910
+ </next>
2911
+ </block>
2912
+ </next>
2913
+ </block>
2914
+ </next>
2915
+ </block>
2916
+ </next>
2917
+ </block>
2918
+ </next>
2919
+ </block>
2920
+ </next>
2921
+ </block>
2922
+ </statement>
2923
+ <value name="RETURN">
2924
+ <block type="text" id="revjgT`{%j^1mn*-SJ1a">
2925
+ <field name="TEXT">Invalid day</field>
2926
+ </block>
2927
+ </value>
2928
+ </block>
2929
+ </xml>
2930
+ ```
2931
+
2932
+ ### Wert in Funktion zurückgeben
2933
+ ![Wert in Funktion zurückgeben](img/functions_return_en.png)
2934
+
2935
+ Siehe Verwendung dieses Blocks unter [Funktion aus Blöcken erstellen (mit Rückgabewert)](#funktion-aus-blöcken-erstellen-mit-rückgabewert).
2936
+
2937
+ Dieser Block ist nur dort verwendbar und dient dazu, mitten in der Funktion einen Wert zurückzugeben.
2938
+
2939
+ ### Eigene Funktion erstellen (ohne Rückgabewert)
2940
+ ![Eigene Funktion erstellen ohne Rückgabewert](img/functions_function_ex_en.png)
2941
+
2942
+ Manchmal reichen die vorhandenen Blöcke nicht aus, um eine bestimmte Aufgabe zu lösen. Mit diesem Block kannst du einen eigenen Block als Funktion definieren, der Parameter entgegennimmt und beliebige Aktionen ausführt.
2943
+ Um eine solche Funktion zu schreiben, sind JavaScript-Kenntnisse nötig. Innerhalb der Funktion stehen alle Funktionen zur Verfügung, die auch im normalen JavaScript-Skript verfügbar sind.
2944
+
2945
+ Um den Code zu schreiben, klickst du auf das `...` am Ende des Blocks, woraufhin sich der Editor-Dialog öffnet.
2946
+
2947
+ ![Eigene Funktion erstellen ohne Rückgabewert](img/functions_function_ex_1_en.png)
2948
+
2949
+ Ansonsten ist die Verwendung dieses Blocks analog zu den Standard-Funktionsblöcken, etwa [Funktion aus Blöcken erstellen (mit Rückgabewert)](#funktion-aus-blöcken-erstellen-mit-rückgabewert) oder [Funktion aus Blöcken erstellen (ohne Rückgabewert)](#funktion-aus-blöcken-erstellen-ohne-rückgabewert).
2950
+
2951
+ ### Eigene Funktion erstellen (mit Rückgabewert)
2952
+ ![Eigene Funktion erstellen mit Rückgabewert](img/functions_function_ex_ret_en.png)
2953
+
2954
+ Dieser eigene Funktionsblock kann Werte zurückgeben. Um ein Ergebnis aus der Funktion zurückzugeben, schreibst du:
2955
+
2956
+ ```
2957
+ return 'dein Ergebnis';
2958
+ ```
2959
+
2960
+ Wie hier:
2961
+
2962
+ ![Eigene Funktion erstellen mit Rückgabewert](img/functions_function_ex_ret_1_en.png)
2963
+
2964
+ ```xml
2965
+ <xml xmlns="http://www.w3.org/1999/xhtml">
2966
+ <block type="procedures_defcustomreturn" id="mG^pXm=MO7vPl!c^/.Px" x="163" y="63">
2967
+ <mutation statements="false">
2968
+ <arg name="a"></arg>
2969
+ <arg name="b"></arg>
2970
+ </mutation>
2971
+ <field name="NAME">sum</field>
2972
+ <field name="SCRIPT">cmV0dXJuIGEgKyBiOw==</field>
2973
+ <comment pinned="false" h="80" w="160">Summarise a and b</comment>
2974
+ </block>
2975
+ <block type="debug" id="U6pI-lE0VS#G):ELrQ(0" x="163" y="138">
2976
+ <field name="Severity">log</field>
2977
+ <value name="TEXT">
2978
+ <shadow type="text" id="PBg^5*vuC?Isr)]pqx/u">
2979
+ <field name="TEXT">test</field>
2980
+ </shadow>
2981
+ <block type="procedures_callcustomreturn" id="XuhUUF65jRZGB#YE(GTC">
2982
+ <mutation name="sum">
2983
+ <arg name="a"></arg>
2984
+ <arg name="b"></arg>
2985
+ </mutation>
2986
+ <value name="ARG0">
2987
+ <block type="math_number" id="h_[^zH{ILtnHrsxY0j~z">
2988
+ <field name="NUM">5</field>
2989
+ </block>
2990
+ </value>
2991
+ <value name="ARG1">
2992
+ <block type="math_number" id="iIoph|b.?suX;)R=d|),">
2993
+ <field name="NUM">6</field>
2994
+ </block>
2995
+ </value>
2996
+ </block>
2997
+ </value>
2998
+ </block>
2999
+ </xml>
3000
+ ```
2341
3001
 
2342
- ### Return value in function
3002
+ ### Funktion aufrufen
3003
+ ![Funktion aufrufen](img/functions_call_ex_en.png)
2343
3004
 
2344
- ### Create custom function with no return value
3005
+ ![Funktion aufrufen](img/functions_call_ex_ret_en.png)
2345
3006
 
2346
- ### Create custom function with return value
3007
+ Für jede angelegte Funktion erscheint im Menü ein zusätzlicher Block mit dem Namen dieser Funktion.
2347
3008
 
2348
- ### Call function
3009
+ Du kannst ihn wie jeden anderen Block in deinen Skripten verwenden.
2349
3010
 
2350
3011
  ## AI Chat für Blockly
2351
3012
 
2352
3013
  Das AI-Chat-Panel ist jetzt auch für Blockly-Scripts verfügbar. Klicke auf den AI-Button (Zauberstab-Symbol) in der Toolbar, um das Chat-Panel neben dem Blockly-Editor zu öffnen.
2353
3014
 
2354
- ### Funktionen
3015
+ ### Funktionsumfang
2355
3016
 
2356
3017
  - **Chat-Modus**: Stelle Fragen zu deinem Blockly-Script. Die KI sieht den generierten JavaScript-Code als Kontext.
2357
3018
  - **Code-Modus**: Beschreibe eine Automatisierungsaufgabe und die KI generiert Blockly-XML-Blöcke in einem Zwei-Schritt-Prozess (Plan, dann Blöcke).