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) undon_button(i)(ab 1). Nutze Zeitstempel auskumiki.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 mitkumiki.base64()bzw.kumiki.unbase64()für JSON-APIs umwandeln. Die Antwort kommt inon_http(status,body,err). JSON verarbeitest du mitkumiki.json()undkumiki.encode(), URL-Parameter mitkumiki.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":trueunterpermissionsund 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":truemit 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, fehlerabgelehnt 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.
Ausprobieren
Wetter mit eigenem Ort · Todoist mit Token · Aufnehmen und abspielen