NEEO-Treiber mit meta
meta (jac459/meta) ist eine Node.js-Engine, die JSON-Gerätedateien aus ihrem active/-Ordner liest und jede einzelne in einen NEEO SDK-Treiber umwandelt, der beim lokalen NEEO Brain registriert wird. Sie beschreiben das Gerät in JSON; Sie schreiben kein JavaScript (außer kleinen DYNAMIK-Ausdrücken).
Sprache: Schreiben Sie den Benutzer in dessen Sprache. JSON-Schlüssel, Engine-Schlüsselwörter, Schaltflächennamen und Log-Zeichenfolgen bleiben exakt wie hier dokumentiert (Englisch).
Umfang: Nur das NEEO SDK vor der Übernahme, das lokale Brain und meta sind relevant. Ignorieren Sie Control4-Material und die NEEO-Cloud (abgeschaltet).
Grundregeln (niemals überspringen)
- Erfinden Sie niemals einen JSON-Schlüssel oder Befehlstyp. Wenn ein Feature nicht in den Referenzen enthalten ist, sagen Sie dies und bieten Sie eine Alternative an: einen Begleitdienst (Node-RED + MQTT oder eine kleine lokale REST-Brücke, siehe
references/companion-services.md), einencli-Befehl oder eine versteckte Schaltflächenkette. - Reines JSON: keine Kommentare, keine nachgestellten Kommas, doppelte Anführungszeichen. Validieren Sie mit
python3 -m json.tool datei.jsonundpython3 scripts/check_driver.py datei.json. - Befehlstypen unterscheiden zwischen Groß- und Kleinschreibung:
http-get,http-rest,http-post,http-get-soap,static,cli,repl,webSocket,socketIO,jsontcp,mqtt,wol,mDNS,android. - Erhöhen Sie
version, sobald eine sichtbare Komponente hinzugefügt wird. Der Brain fügt nur Komponenten hinzu; das Umbenennen oder Entfernen einer Komponente erfordert das Löschen und erneute Hinzufügen des Geräts in der NEEO-App (Rezepte und Verknüpfungen müssen neu erstellt werden). Selbst eine Erhöhung reicht bei einem installierten Gerät manchmal nicht aus: Überprüfen Sie das Brain (references/debugging.md). - Namen (Schlüssel) von Beschriftungen, Schaltern, Schiebereglern, Bildern und Sensoren: nur Buchstaben und Ziffern. Ein Leerzeichen oder Sonderzeichen unterbricht den Sensor-Link (
"sensor": nullim Brain) und die Fernbedienung stürzt beim Synchronisieren ab, sobald die Komponente als Verknüpfung verwendet wird. Der angezeigtelabel-Text ist frei. Schaltflächennamen dürfen Leerzeichen enthalten, vermeiden Sie jedoch+und Akzente (DISNEY PLUS, LabelDisney+). - Schreiben Sie niemals
""in eine Variable, die an eine Beschriftung gebunden ist: Wenn bei meta v1.2.0 eine Beschriftung von einem Text zurück zu""wechselt, stoppt meta. Schreiben Sie" "(oder einen lesbaren Fallback). Initialisieren Sie Beschriftungsvariablen aus Gewohnheit ebenfalls mit" ". - Bereinigen Sie jeden externen Text, bevor er eine Beschriftung erreicht:
"->',\->/, Steuerzeichen -> Leerzeichen,$->$(vollbreit). Führen Sie dies im Treiber und an der Quelle durch. - Listener starten einmal pro Sitzung, durch den
ListenerOn-Guard + versteckter__LISTEN-Schaltfläche, die mit jedem sichtbaren Steuerelement verdrahtet ist. Verlassen Sie sich niemals allein aufPOWER ON, und rufen Sie niemals__CLEANUPbei einemmqtt-Listener auf (references/listeners-and-state.md). - Ereignisse vor Abfragen (
webSocket,socketIO,mqtt). Bei Abfragen giltpooltime>=3000. $Resultist immer ein String,"undefined"bei Fehlschlag: Schützen Sie jedenJSON.parse. Eine Schaltfläche erhält einen Skalar (ok); ein Verzeichnis-Aktions-Feeder erhält["ok"].- Variablennamen: Verwenden Sie niemals einen Namen, der ein Präfix eines anderen ist;
$Varan Buchstaben geklebt wird als andere Variable gelesen. - Sicherheit:
DYNAMIKundcliführen Code auf dem Meta-Host aus. Keine Geheimnisse fest codiert in einem Treiber, der weitergegeben werden soll; meta darf nicht als root/admin ausgeführt werden. - Irreversible Änderungen benötigen Zustimmung: Das Hinzufügen sichtbarer Komponenten (z. B.
DIGIT 0-9) kann nicht ohne Neuinstallation des Geräts rückgängig gemacht werden. Fragen Sie zuerst. - Getrennte Liefergegenstände: Ein Meta-Treiber ist ein JSON-Objekt (beginnt mit
{, niemals-flowin seinem Namen, wird inactive/abgelegt); ein Node-RED-Flow ist eine JSON-Liste (beginnt mit[, immer*-flow.jsongenannt, in Node-RED importiert). - In
templatesinddynamicnameunddynamicidobligatorisch;dynamicidmuss stabil sein (MAC-Adresse oder Hardware-ID anstelle einer DHCP-IP).
Arbeitsablauf
- Sammeln Sie, was Sie benötigen (stellen Sie höchstens 3 gezielte Fragen auf einmal): exaktes Gerätemodell; dessen Steuerungsprotokoll oder API (HTTP/REST, WebSocket, Raw-TCP, MQTT, nur IR, Android TV ...); feste IP oder nicht und eine stabile ID (MAC); was gesteuert werden muss und welcher Zustand angezeigt werden muss; Meta-Version und wo Meta läuft (Pi mit pm2, Docker ...); ob ein MQTT-Broker und Node-RED verfügbar sind. Suchen Sie nach der offiziellen API-Dokumentation des Geräts, falls vorhanden.
- Wählen Sie den NEEO-Typ (
references/driver-anatomy.md, Abschnitt Typen und erkannte Schaltflächen) und das Erkennungsmuster (references/discovery.md): statisches Einzelgerät, benutzereingegebene IP, mDNS oder Hub. - Beginnen Sie mit einem Skelett in
assets/:skeleton-static.json(ein Gerät, feste Adresse) oderskeleton-register-ip.json(der Benutzer gibt die IP ein). Verwenden Sie bewährte Muster ausreferences/patterns.md. - Entscheiden Sie, wo die Logik lebt. Einfaches HTTP- oder WebSocket-Gerät: alles im Treiber. Binäres oder zustandsbehaftetes Protokoll (Raw-TCP, dauerhafte Sitzungen, Pairing, bursty State): Platzieren Sie einen Begleitdienst dazwischen mit schnellen HTTP-Befehlen und per MQTT-Nachricht (
references/companion-services.md). - Überprüfen Sie vor der Auslieferung:
python3 -m json.tool treiber.jsondannpython3 scripts/check_driver.py treiber.json(Namen, leere Label-Werte, Typen, Version, Guard, Abfrage ...);node scripts/simulate_guard.js treiber.jsonwenn der Treiber Listener hat (zählt__INITIALISE/__CLEANUPüber Sitzungen);- Bewerten Sie knifflige
DYNAMIK-Ausdrücke in Node mit den tatsächlichen Substitutionsregeln (references/logic-and-commands.md); - Lesen Sie erneut
references/pitfalls.md.
- Liefern Sie aus in dieser Reihenfolge: Zusammenfassung (Gerät, Protokoll, NEEO-Typ, Erkennungsmuster, abgedeckt / nicht abgedeckt); die vollständige validierte JSON-Datei mit einem expliziten Dateinamen; Bereitstellungsschritte (Kopieren nach
active/, Neustart von meta, Gerät in der NEEO-App hinzufügen, Rezept-Sichtbarkeit und Verknüpfungen erstellen); Testplan (zu testende Schaltflächen, erwartetes Ergebnis, zu suchende Log-Zeilen); nicht am echten Gerät verifizierte Annahmen; nächste Iteration. Bei Multi-Datei-Projekten (Treiber + Flow + Dienst): Reihenfolge der Vorgänge, ein Versionsmarker in jedem Liefergegenstand und wie überprüft werden kann, welche Version installiert ist. Sagen Sie immer, was nicht am echten Gerät getestet wurde.
Referenzkarte (lesen Sie nur, was die Aufgabe benötigt)
| Datei | Lesen, wenn ... |
|---|---|
references/meta-engine.md | Architektur, Installation, Ordner, Neustart, Log-Level, von meta bereitgestellte MQTT-Themen, Docker/NAS-Hosting, bekannte Meta-v1.2.0-Fehler |
references/driver-anatomy.md | Top-Level-Schlüssel, NEEO-Gerätetypen und erkannte Schaltflächennamen, Variablen, $-Substitution, DYNAMIK, UI-Komponenten |
references/logic-and-commands.md | evalwrite, evaldo, evalnext, spezielle Schaltflächen, jeder Befehlstyp, queryresult / JSONPath |
references/listeners-and-state.md | Listener, der ListenerOn-Guard, MQTT-Listener-Verhalten, bursty State-Quellen, Instanz-Neuerstellungen |
references/discovery.md | discover, register, template, initcommandset, mDNS, IP-Eingabe, Hubs, Pairing |
references/directories.md | Listen, Feeder, item*-Felder, Aktionen, mehrstufige Navigation |
references/patterns.md | Bewährte Rezepte: Lautstärke, Stromversorgung, Statusleiste, Persistenz, Ketten, Schleifen, Fallback-Pfad, App-Launcher, Artwork-Bild |
references/pitfalls.md | Obligatorisches erneutes Lesen vor der Auslieferung |
references/debugging.md | Lesen von Meta-, Mosquitto- und Brain-Daten, Log-Signaturen, Isolieren eines Links, Sandbox-Tests |
references/companion-services.md | Node-RED- und MQTT-Brücken, lokale REST-Brücken, Apple TV / pyatv-Lektionen |
references/community-drivers.md | Referenztreiber zum Nachahmen, SDK <-> Meta-Zuordnung, Quellen |
Evidenz-Tags, die in den Referenzen verwendet werden
[code v1.2.0] im Meta-Quellcode gelesen (Branch Release); [observed] in echten Treibern oder echten Installationen gesehen; [to verify] noch nicht getestete Schlussfolgerung. Wenn ein Verhalten wichtig ist und nicht getaggt wurde, überprüfen Sie den Meta-Code (git clone --depth 1 --branch Release https://github.com/jac459/meta) anstatt zu raten und geben Sie an, was Sie getan haben.