kumiki

Lua auf Kumiki.

Ein Code-Widget besteht aus widget.json und main.lua. Seine Funktionen laufen direkt auf dem ESP32, auch ohne geöffneten Browser. Du brauchst Firmware 0.9.0 oder neuer.

Dein erstes Programm

{
  "schema": 2, "id": "mira.zaehler", "name": "Mein Zähler", "version": "1.0.0",
  "entry": "main.lua", "display": {"source":"script"},
  "buttons": [{"label":"+1"}],
  "settings": [{"key":"start","label":"Startwert","type":"number","default":0}]
}
local n = 0

function on_start()
  n = kumiki.get("start") or 0
  kumiki.show(tostring(n))
end

function on_button(i)
  if i == 1 then n = n + 1; kumiki.show(tostring(n)) end
end

Ändere beide Dateien in der Werkstatt oder mit deinem Editor. Lokal packst du sie mit node pack.mjs mein-widget mein-widget.zip. Lade die ZIP auf der Geräteseite unter Widgets hoch. Öffne dort Einstellungen, speichere deine Werte und aktiviere das Widget.

Auf das Displaydesign reagieren

Mit Firmware 0.11.0 übernehmen Widgets das helle und dunkle Gerätedesign, wenn du in widget.json das Feld "theme": "system" setzt. lightAccent kann zusätzlich eine eigene Akzentfarbe für Hell festlegen. Ohne Theme-Angabe bleibt deine Seite dunkel.

local function anzeigen(mode)
  kumiki.show(mode == "light" and "Helles Display" or "Dunkles Display")
end

function on_start()
  anzeigen(kumiki.theme())
end

function on_theme(mode)
  anzeigen(mode)
end

Beim Start liefert kumiki.theme() den aktuellen Modus. Danach bekommt ein laufendes Programm on_theme(mode) bei jedem Wechsel seines wirksamen Designs. Lokale Variablen bleiben erhalten. Die automatische Farbwahl funktioniert auch ohne Handler. Vorlage in der Werkstatt öffnen

Einstellen und verbinden

Ein Widget kann bis zu acht Felder anlegen: text, number mit optionalen Grenzen, boolean, select mit Auswahlliste und secret für Zugangsdaten. Jedes Feld hat einen key und ein lesbares label. Die Firmware baut daraus die eigene Einstellungsseite des Widgets.

"permissions": {"hosts": ["api.todoist.com"]},
"settings": [{"key":"token","label":"API-Token","type":"secret"}]
function on_button()
  local key = kumiki.get("token")
  if not key then kumiki.show("Bitte Token eintragen"); return end
  local ok = kumiki.request("GET", "https://api.todoist.com/api/v1/tasks?limit=1",
    "", {Authorization = "Bearer " .. key})
  if not ok then kumiki.show("Netzfreigabe prüfen") end
end

function on_http(status, body, err)
  if err or status ~= 200 then kumiki.show("Abruf fehlgeschlagen"); return end
  local tasks = kumiki.json(body)
  kumiki.show(tasks and tasks.results and tasks.results[1]
    and "Aufgabe vorhanden" or "Nichts offen")
end

Bei einem Geheimfeld erhält dein Code einen Platzhalter. Erst beim Senden an einen freigegebenen HTTPS-Host setzt das Gerät den Token in den Header ein. Trage echte Tokens auf der lokalen Geräteseite in deinem vertrauenswürdigen WLAN ein. Nach einer Änderung an Manifest oder Code überprüfst du die Freigaben und trägst Tokens neu ein.

Geräte-API

Ereignisse
on_start(), on_config(), on_tick() (etwa jede Sekunde) und on_button(i) (ab 1). Nutze Zeitstempel aus kumiki.millis() für eigene Intervalle.
Display
kumiki.show(text) zeigt bis 96 UTF-8-Bytes. kumiki.plot({4,5,3}) zeichnet eine Kurve aus bis zu 32 Messpunkten; eine leere Liste blendet sie aus.
HTTPS
kumiki.request(method,url,body,headers) startet eine asynchrone Anfrage. GET, POST, PUT, PATCH und DELETE sind möglich. Binäre Inhalte kannst du mit kumiki.base64() bzw. kumiki.unbase64() für JSON-APIs umwandeln. Die Antwort kommt in on_http(status,body,err). JSON verarbeitest du mit kumiki.json() und kumiki.encode(), URL-Parameter mit kumiki.urlencode().
Mikrofon
kumiki.record(ms) zeichnet 50–1000 ms auf. on_record(pcm,level,err) erhält PCM-Audio und den RMS-Pegel. Das Manifest braucht "microphone":true unter permissions und der Nutzer erteilt die Mikrofonfreigabe.
Lautsprecher
kumiki.play(pcm) spielt den Audiopuffer ab. kumiki.tone(hz,ms) erzeugt einen Ton. on_play(err) meldet den Abschluss. Erforderlich ist "speaker":true mit Freigabe.
Speicher und Transport
PCM ist 16 kHz, mono, signed 16-bit little-endian. Eine Sekunde belegt 32.000 Bytes. HTTPS akzeptiert je bis zu 32 KiB für Anfragen und Antworten; Aufträge können mit nil, fehler abgelehnt werden. Code und Manifest liegen in einer ZIP bis 32 KiB. Große KI-Modelle oder lange Audioverarbeitung können auf einem eigenen HTTPS-Backend laufen.

Ein Widget hat einen eigenen Interpreter mit begrenztem Speicher und Rechenbudget pro Ereignis. Code aus einer ZIP läuft ohne Zugriff auf Betriebssystem, fremde Widgets oder beliebige GPIOs. Wenn ein Programm anhält, prüfe den Status auf seiner Einstellungsseite.

Vollständige Referenz und alle Beispiele im Dev-Kit ↓

Ausprobieren

Wetter mit eigenem Ort · Todoist mit Token · Aufnehmen und abspielen