Skriptausführung

Javascript/Blockly Skriptausführung für ioBroker

Aktueller Release
10.4.8
Entwickler
bluefox, hobbyquaker, Apollon77, AlCalzone, Matthias Kleine
Lizenz
MIT
ioBroker.javascript

ioBroker.javascript

Inhaltsverzeichnis

KI-Codegenerator - Unterstützung eigener API-Endpunkte

Der integrierte KI-Codegenerator unterstützt nicht nur die OpenAI-API, sondern auch jeden OpenAI-kompatiblen API-Endpunkt. So können alternative Anbieter genutzt werden, z.B.:

  • Google Gemini (kostenlos verfügbar, empfohlen)
  • DeepSeek (sehr günstig)
  • OpenRouter (Multi-Provider-Gateway)
  • Ollama (lokale LLMs)
  • LM Studio (lokale LLMs)
  • Anthropic (über OpenAI-kompatiblen Proxy)
  • Jeder andere Anbieter mit einem OpenAI-kompatiblen /v1/chat/completions-Endpunkt

Empfohlene Anbieter

Google Gemini (kostenlos, empfohlen)

Google bietet ein großzügiges kostenloses Kontingent mit einem OpenAI-kompatiblen Endpunkt — ideal für die ioBroker-Skript-Generierung:

ModellAnfragen/MinAnfragen/TagQualität
Gemini 2.5 Flash10500Sehr gut für Code
Gemini 2.5 Pro525Ausgezeichnet
Gemini 2.0 Flash151500Gut

Einrichtung:

  1. Kostenlosen API-Key holen: https://aistudio.google.com/apikey
  2. Base-URL auf https://generativelanguage.googleapis.com/v1beta/openai setzen
  3. Ein Gemini-Modell wählen (z.B. gemini-2.5-flash)

DeepSeek (sehr günstig)

DeepSeek bietet hervorragende Code-Generierung zu sehr niedrigen Kosten (~0,001€ pro Anfrage):

Lokale Modelle (Ollama / LM Studio)

Lokale Modelle laufen auf eigener Hardware ohne Internet.

Mindestanforderung: 14B-Parameter-Modelle (z.B. qwen2.5-coder:14b). Kleinere Modelle (7B/9B) erzeugen unzuverlässigen Code mit falschen API-Aufrufen. Eine GPU mit mindestens 12GB VRAM (z.B. RTX 3060) wird für 14B-Modelle empfohlen.

Getestete und empfohlene Modelle:

  • qwen2.5-coder:14b - Gute Codequalität, läuft auf 12GB VRAM
  • qwen2.5-coder:32b - Bessere Qualität, erfordert 24GB+ VRAM

Einrichtung:

  • Ollama: Base-URL auf http://localhost:11434/v1 setzen, API-Key leer lassen
  • LM Studio: Base-URL auf http://localhost:1234/v1 setzen, API-Key leer lassen

Hinweis: Die kostenlose Version der OpenAI-API (ChatGPT) bietet keinen API-Zugang mehr für Code-Generierung. Google Gemini (kostenlos) oder DeepSeek (sehr günstig) sind empfohlene Alternativen.

Konfiguration

In den Adapter-Einstellungen unter "KI-Einstellungen" befinden sich API-Key-Felder für jeden Anbieter:

EinstellungBeschreibung
ChatGPT API-SchlüsselAPI-Key für OpenAI (platform.openai.com)
Anthropic API-SchlüsselAPI-Key für Claude (console.anthropic.com)
Gemini API-SchlüsselAPI-Key für Google Gemini (aistudio.google.com)
DeepSeek API-SchlüsselAPI-Key für DeepSeek (platform.deepseek.com)
Eigene API Base-URLBase-URL für eigene Anbieter (z.B. http://localhost:11434/v1 für Ollama)
Eigener API-SchlüsselOptionaler API-Key für eigene Anbieter (Ollama benötigt keinen)

Alle API-Key-Felder werden als Passwortfelder dargestellt (maskiert). Es müssen nur die Keys der gewünschten Anbieter eingetragen werden. Jeder Anbieter hat einen eigenen Test-Button.

Sicherheit der API-Schlüssel

Die API-Keys werden durch zwei von der ioBroker-Plattform bereitgestellte Schutzebenen abgesichert:

  1. encryptedNative — Die Keys werden vor dem Schreiben in die Object-Datenbank automatisch mit dem System-Secret verschlüsselt. Datenbank-Dumps oder Object-Backups enthalten die Keys nicht mehr im Klartext.
  2. protectedNative — Die Keys werden niemals an Admin-Oberflächen oder fremde Adapter übertragen. Nur die javascript-Instanz selbst kann sie über this.config lesen (die ioBroker-Runtime liefert sie dort transparent entschlüsselt).

Daraus folgt: Das KI-Chat-Panel, die Inline-Completion und alle anderen Frontend-Komponenten greifen nicht mehr direkt auf die Keys zu. Stattdessen wird jede KI-Anfrage per sendTo an den Adapter geschickt, und das Backend setzt den passenden Key ein:

Frontend                      Backend (this.config, entschlüsselt)
────────                      ─────────────────────────────────────
sendTo('chatCompletion', {    →   wählt Provider → nimmt gptKey/claudeKey/…
    provider: 'openai',           → schickt HTTP-Request an Anbieter
    model: 'gpt-4o',              → liefert Antwort zurück
    messages: [...]
})

Für die Anzeige steht ein eigener sendTo-Befehl zur Verfügung:

BefehlPayloadAntwort
getAvailableAiProviders{}{ providers: [{ provider: 'openai' }, { provider: 'custom', baseUrl: '…' }, …] }

Die Antwort teilt dem Frontend nur mit, welche Provider konfiguriert sind — der eigentliche Schlüssel ist darin nie enthalten. So lassen sich im Editor die richtigen Provider-Icons anzeigen und das Modell-Dropdown korrekt befüllen, ohne Secrets in den Browser zu laden.

Hinweis zum Upgrade: Nach dem Upgrade von einer älteren Version bleiben vorhandene (unverschlüsselte) Keys so lange gültig, bis die Adapter-Einstellungen das erste Mal gespeichert werden. Beim Speichern verschlüsselt die Runtime die Werte. Sollte ein Schlüssel nach dem Upgrade leer erscheinen, genügt es, ihn einmal neu einzutragen und zu speichern.

API-Verbindung testen

Jeder Anbieter hat einen eigenen Test-Button neben seinem API-Key-Feld. Es werden zwei Fälle unterschieden:

  1. Test mit Formular-Wert — Unmittelbar nach dem Eintragen oder Ändern eines Keys im Einstellungsdialog nutzt der Test-Button den aktuellen Formularwert (der liegt vor dem Speichern noch lokal im Browser). So kann ein neuer Key vor dem Persistieren geprüft werden.
  2. Test mit gespeichertem Schlüssel — Wird der Test aus Kontexten ohne Formular-Wert aufgerufen (z.B. beim Modell-Abruf im Skript-Editor), löst das Backend den Key über this.config anhand des gewählten Providers auf.

Der Test:

  • Verbindet sich mit dem API-Endpunkt des Anbieters
  • Validiert den API-Schlüssel
  • Gibt die Anzahl der verfügbaren Chat-Modelle zurück

Die Icons der Test-Buttons sind als Inline-SVG-Data-URIs mit fill="currentColor" eingebettet. Dadurch folgt ihre Farbe automatisch dem aktiven Theme (Light/Dark-Mode).

Dynamisches Laden der Modelle

Beim Öffnen des KI-Codegenerator-Dialogs im Skript-Editor werden die verfügbaren Modelle automatisch von jedem konfigurierten Provider abgerufen. Das Modell-Dropdown wird dynamisch befüllt — es gibt keine fest hinterlegte Modellliste.

Filter für nicht-Chat-Modelle

Die Modelllisten, die OpenAI, Anthropic, Gemini, DeepSeek und Custom-Endpunkte (Ollama/LM Studio/OpenRouter) zurückliefern, enthalten viele Modelle, die nicht für Chat-Completion geeignet sind. Der Adapter filtert diese automatisch heraus, sodass im Dropdown nur Modelle erscheinen, die für die ioBroker-Skript-Generierung taugen.

Folgende Kategorien werden ausgeschlossen:

KategorieBeispiel-Schlüsselwörter
Embeddingsembedding, text-embedding, embeddinggemma, bge-, nomic-embed, mxbai-embed, arctic-embed, all-minilm, voyage-, gecko, paraphrase-multilingual
Bild-Generierung / -Bearbeitungdall-e, gpt-image, image-edit, -image-preview, -image-latest, flash-image, nano-banana, stable-diffusion, sdxl, midjourney, flux-, imagen
Video-Generierungsora, veo-, cogvideo, runway-, lumiere
Musik-Generierunglyria
Audio / Sprache / Transkription / Realtimewhisper, tts-, -tts, speech-, audio-preview, -transcribe, native-audio, flash-live, gpt-audio, realtime, bark-, xtts, voicebox
Moderation / Safety-Klassifikatorenmoderation, omni-moderation, llama-guard, shieldgemma, prompt-guard, -guardian, safeguard
Rerankerrerank, reranker
Legacy-Completion (OpenAI GPT-3-Ära)babbage-, davinci-, curie-, text-davinci, instructgpt, code-davinci, code-cushman, -turbo-instruct
Web-Suche / Browsing-Endpoints-search-preview, -search-api
Legacy-Suche / Similaritycode-search, text-search, similarity-
Spezial / Single-Taskcomputer-use-preview, deep-research, robotics, aqa, reader-lm (HTML→Markdown), -nsql (Text-zu-SQL), minicheck (Fact-Check), claude-1, claude-instant

Der Filter verwendet eine Substring-Prüfung ohne Beachtung der Groß-/Kleinschreibung. Wenn ein Provider künftig eine weitere Nicht-Chat-Familie einführt, lässt sich die Liste in src-editor/src/AiChat/AiChatService.ts (NON_CHAT_KEYWORDS) erweitern.

Fehlerbehandlung

Wenn der API-Endpunkt nicht erreichbar ist oder einen Fehler zurückgibt, werden benutzerfreundliche Meldungen angezeigt:

  • Verbindungsfehler (Endpunkt nicht erreichbar)
  • Ungültiger API-Schlüssel (401)
  • Zugriff verweigert (403)
  • Modell nicht gefunden (404)

Bei fehlgeschlagenem Modellabruf wird ein Erneut versuchen-Button angezeigt, sodass ein erneuter Versuch ohne Schließen des Dialogs möglich ist.

Changelog

WORK IN PROGRESS

  • (@GermanBluefox) Added: OpenRouter, if it is chosen in the system-wide AI settings of admin (@iobroker/ai-core 0.0.6, @iobroker/ai-gui 0.0.5)

10.4.8 (2026-10-27)

  • (GermanBluefox) Fixed: setting scriptEnabled to true restarts an already running script again (#2417)
  • (@GermanBluefox) Fixed: a script that stopped itself with stopScript() (or was restarted with runScript()) kept running and scriptEnabled stayed true
  • (@GermanBluefox) Added: the AI uses the AI settings of the system that are set up once in admin (System settings → AI) - for new instances and for instances without own keys
  • (@GermanBluefox) Fixed: a script started via the execute message wrote scriptEnabled.__execute_<n> without object, when the instance stopped or the setState limit stopped the script before the output was collected

10.4.7 (2026-10-23)

  • (@GermanBluefox) Fixed: the AI chat did not see the open script when it was a Blockly script, and an outdated version of it after unsaved edits; the open script is now always the context when no other script is mentioned
  • (@GermanBluefox) Fixed: the code mode of the AI chat ignored the open script and wrote an unrelated new script for a request like "turn on the logs in the script"

10.4.6 (2026-10-19)

  • (@GermanBluefox) Fixed: false "Cannot redeclare block-scoped variable" (TS2451) warnings for consts that are declared in several scripts
  • (@GermanBluefox) Fixed: subscribeObject()/onObject() and the rule trigger "On object change" never fired for a pattern with *
  • (@GermanBluefox) Fixed: a change of a TypeScript script could be ignored after its compilation result could not be stored

10.4.5 (2026-10-18)

  • (@GermanBluefox) Fixed: a script that did not handle a rejected setStateAsync (e.g. of a missing state) or another asynchronous function terminated the adapter
  • (@agross) Fixed: TypeScript scripts that import the same module as a global script failed with "Identifier has already been declared"
  • (@GermanBluefox) Fixed: the @-mention list of the AI chat showed only the first 13 scripts
  • (@GermanBluefox) Fixed: selection of state if predefined

10.4.4 (2026-10-16)

  • (@GermanBluefox) Fixed: a script that did not handle a rejected setStateAsync (e.g. of a missing state) or another asynchronous function terminated the adapter
  • (@GermanBluefox) Fixed: instances of different versions
  • (@GermanBluefox) Fixed: the AI chat stopped with "m.default is not a constructor"

License

The MIT License (MIT)

Copyright (c) 2014-2026 bluefox dogafox@gmail.com
Copyright (c) 2014 hobbyquaker

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.