ioBroker.javascript
Inhaltsverzeichnis
- Blockly
- Benutzung
- JavaScript-Referenz
- Upgrade-Anleitung (nur auf Englisch verfügbar)
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:
| Modell | Anfragen/Min | Anfragen/Tag | Qualität |
|---|---|---|---|
| Gemini 2.5 Flash | 10 | 500 | Sehr gut für Code |
| Gemini 2.5 Pro | 5 | 25 | Ausgezeichnet |
| Gemini 2.0 Flash | 15 | 1500 | Gut |
Einrichtung:
- Kostenlosen API-Key holen: https://aistudio.google.com/apikey
- Base-URL auf
https://generativelanguage.googleapis.com/v1beta/openaisetzen - 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):
- API-Key holen: https://platform.deepseek.com/
- Base-URL auf
https://api.deepseek.com/v1setzen - Empfohlenes Modell:
deepseek-chat
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 VRAMqwen2.5-coder:32b- Bessere Qualität, erfordert 24GB+ VRAM
Einrichtung:
- Ollama: Base-URL auf
http://localhost:11434/v1setzen, API-Key leer lassen - LM Studio: Base-URL auf
http://localhost:1234/v1setzen, 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:
| Einstellung | Beschreibung |
|---|---|
| ChatGPT API-Schlüssel | API-Key für OpenAI (platform.openai.com) |
| Anthropic API-Schlüssel | API-Key für Claude (console.anthropic.com) |
| Gemini API-Schlüssel | API-Key für Google Gemini (aistudio.google.com) |
| DeepSeek API-Schlüssel | API-Key für DeepSeek (platform.deepseek.com) |
| Eigene API Base-URL | Base-URL für eigene Anbieter (z.B. http://localhost:11434/v1 für Ollama) |
| Eigener API-Schlüssel | Optionaler 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:
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.protectedNative— Die Keys werden niemals an Admin-Oberflächen oder fremde Adapter übertragen. Nur diejavascript-Instanz selbst kann sie überthis.configlesen (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:
| Befehl | Payload | Antwort |
|---|---|---|
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:
- 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. - 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.configanhand 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:
| Kategorie | Beispiel-Schlüsselwörter |
|---|---|
| Embeddings | embedding, text-embedding, embeddinggemma, bge-, nomic-embed, mxbai-embed, arctic-embed, all-minilm, voyage-, gecko, paraphrase-multilingual |
| Bild-Generierung / -Bearbeitung | dall-e, gpt-image, image-edit, -image-preview, -image-latest, flash-image, nano-banana, stable-diffusion, sdxl, midjourney, flux-, imagen |
| Video-Generierung | sora, veo-, cogvideo, runway-, lumiere |
| Musik-Generierung | lyria |
| Audio / Sprache / Transkription / Realtime | whisper, tts-, -tts, speech-, audio-preview, -transcribe, native-audio, flash-live, gpt-audio, realtime, bark-, xtts, voicebox |
| Moderation / Safety-Klassifikatoren | moderation, omni-moderation, llama-guard, shieldgemma, prompt-guard, -guardian, safeguard |
| Reranker | rerank, 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 / Similarity | code-search, text-search, similarity- |
| Spezial / Single-Task | computer-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-core0.0.6,@iobroker/ai-gui0.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 withrunScript()) kept running andscriptEnabledstayedtrue - (@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
executemessage wrotescriptEnabled.__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.