Erstelle deine erste App
Diese Anleitung führt durch den typischen Workflow zum Erstellen einer IronFlock-App, die Daten von Edge-Geräten sammelt und auf Echtzeit-Dashboards anzeigt. Am Ende hast du ein Datenmodell, Edge-Logik, ein Konfigurationsformular für Benutzer und Live-Diagramme — alles verbunden über die Projektdatenbank.
1. Datenmodell entwerfen
Beginne in der Datei .ironflock/data-template.yml. Denke an zwei Kategorien von Tabellen:
- Entity-Tabellen — verfolgen den aktuellen Zustand von Dingen (Geräte, Maschinen, Verbindungen). Zeilen werden bei jeder Änderung angehängt;
maintainLatestFlagFordeklariert, welche Spalten eine Entität identifizieren, sodass die neueste Zeile pro Entität bei Bedarf gelesen werden kann. - Zeitreihentabellen — sammeln Messwerte über die Zeit (Sensorwerte, Metriken). Jede Zeile ist ein neuer Datenpunkt mit Zeitstempel.
data:
tables:
# Entity-Tabelle: eine Zeile pro Gerät, aktueller Zustand immer abfragbar
- tablename: devices
maintainLatestFlagFor: ['device_key']
columns:
- id: tsp
dataType: timestamp
- id: device_key
dataType: string
- id: status
dataType: string
- id: device_name
dataType: string
- id: deleted
dataType: boolean
# Entity-Tabelle: benutzerkonfigurierte Modbus-Server
- tablename: modbus_servers
maintainLatestFlagFor: ['server_id']
columns:
- id: tsp
dataType: timestamp
- id: server_id
dataType: string
- id: host
dataType: string
- id: port
dataType: numeric
- id: deleted
dataType: boolean
# Zeitreihentabelle: periodische Messwerte von verbundener Hardware
- tablename: readings
columns:
- id: tsp
dataType: timestamp
- id: server_id
dataType: string
- id: metric
dataType: string
- id: value
dataType: numeric2. Testumgebung einrichten
Um deine App zu testen, brauchst du eine Entwicklungsumgebung in einem Projekt mit mindestens einem Online-Gerät:
- Klicke auf Develop auf der App-Detailseite, um die Cloud IDE zu öffnen.
- Wähle ein Online-Gerät aus einem beliebigen Projekt, auf das du Zugriff hast.
- Klicke auf Create Backend im Seitenpanel, um eine Entwicklungsumgebung in der Projektdatenbank zu erstellen.
Dadurch werden die in deiner data-template.yml definierten Tabellen in der Projektdatenbank angelegt. Du kannst sie in der Fleet-Database-Ansicht des Projekts einsehen.
Die Cloud IDE bietet dir eine vollständige VS Code Umgebung mit Datei-Explorer, Editor, Terminal und dem Edge Development Panel zum Erstellen und Bereitstellen auf deinem Gerät.
3. Edge-Code schreiben
Dein Docker-Container läuft auf dem Gerät und nutzt das IronFlock SDK, um mit der Projektdatenbank zu interagieren.
Gerät beim Start registrieren
Wenn die Edge-Komponente startet, füge eine Zeile in die devices-Entity-Tabelle ein, damit das Dashboard weiß, dass das Gerät online ist:
Python
import asyncio
import os
from datetime import datetime, timezone
from ironflock import IronFlock
async def main():
# Dieses Gerät als online registrieren
await flock.append_to_table("devices", {
"device_key": os.environ.get('DEVICE_KEY'),
"tsp": datetime.now(timezone.utc).isoformat(),
"status": "online",
"device_name": os.environ.get('DEVICE_NAME'),
"deleted": False
})
# ... restliche Logik
flock = IronFlock(mainFunc=main)
flock.run()Da devices maintainLatestFlagFor: ['device_key'] verwendet, wird die vorherige Statuszeile für dieses Gerät automatisch abgelöst. Widgets mit aktiviertem latest-Filter zeigen immer den aktuellen Zustand an.
Auf Benutzerkonfiguration reagieren
Benutzer können Modbus-Server über ein Formular auf dem Board hinzufügen (siehe Schritt 4). Dein Edge-Code abonniert die modbus_servers-Tabelle und reagiert auf neue Einträge:
Python
async def main():
# ... Geräteregistrierung ...
# Bestehende Modbus-Server lesen
existing = await flock.getHistory("modbus_servers", {
"limit": 1000,
"filterAnd": [
# "latest": True gibt nur die neueste Zeile pro server_id zurück
{"latest": True},
# deleted IS NULL OR deleted = false
{"combinator": "OR", "filters": [
{"column": "deleted", "operator": "IS NULL"},
{"column": "deleted", "operator": "=", "value": False}
]}
]
})
for server in existing:
create_modbus_connection(server)
# In Echtzeit auf neue Server reagieren
def on_server_change(*args, **kwargs):
server = args[0] if args else kwargs
if server.get("deleted"):
delete_modbus_connection(server["server_id"])
else:
create_modbus_connection(server)
await flock.subscribe_to_table("modbus_servers", on_server_change)Zeitreihendaten sammeln
Sobald eine Modbus-Verbindung hergestellt ist, frage regelmäßig Messwerte ab und schreibe sie in die readings-Tabelle:
Python
async def modbus_poll_loop(server_id, client):
while True:
values = client.read_registers()
tsp = datetime.now(timezone.utc).isoformat()
for metric, value in values.items():
await flock.publish_to_table("readings", {
"tsp": tsp,
"server_id": server_id,
"metric": metric,
"value": value
})
await asyncio.sleep(5)Jede Zeile braucht einen tsp-Zeitstempel: Das Data Backend weist eine Zeile ohne ihn ab, und der Schreibvorgang schlägt mit einem Fehler fehl, der das meldet.
4. Board erstellen
Öffne den Board Editor und füge Widgets hinzu, die mit deinen Data-Backend-Tabellen verbunden sind.
Gerätestatus anzeigen
Füge ein Table-Widget hinzu, das mit der devices-Tabelle verbunden ist. Aktiviere den latest-Schalter in den Filtereinstellungen des Widgets, damit immer der aktuelle Zustand jedes Geräts angezeigt wird. Die Tabelle aktualisiert sich automatisch, wenn ein Gerät online oder offline geht.
Benutzer Modbus-Server konfigurieren lassen
Füge ein Form-Widget hinzu, das mit der modbus_servers-Tabelle verbunden ist. Konfiguriere Felder für host und port. Wenn ein Benutzer das Formular ausfüllt und absendet, wird automatisch eine neue Zeile in die modbus_servers-Tabelle eingefügt — kein Backend-Code nötig, um die Formularübermittlung zu verarbeiten.
Dein Edge-Code nimmt die neue Zeile über subscribeToTable auf (siehe Schritt 3) und stellt die Modbus-Verbindung her.
Zeitreihendaten visualisieren
Füge ein Line Chart-Widget hinzu, das mit der readings-Tabelle verbunden ist. Ordne tsp der X-Achse und value der Y-Achse zu. Das Diagramm aktualisiert sich in Echtzeit, wenn neue Messwerte von den Geräten eintreffen — kein Polling oder manuelles Aktualisieren nötig.
So fügt sich alles zusammen
┌─────────────────────────────────────────────────────────┐
│ Board (Dashboard) │
│ ┌──────────┐ ┌──────────────┐ ┌───────────────────┐ │
│ │ Table │ │ Form │ │ Line Chart │ │
│ │ devices │ │ modbus_servers │ │ readings │ │
│ └────┬─────┘ └──────┬───────┘ └────────┬──────────┘ │
│ │ │ │ │
└───────┼───────────────┼───────────────────┼──────────────┘
│ │ │
┌────▼───────────────▼───────────────────▼────┐
│ Projektdatenbank │
│ devices │ modbus_servers │ readings │
└────▲───────────────▲───────────────────▲────┘
│ │ │
┌────┴───────────────┴───────────────────┴────┐
│ Edge-Code (auf dem Gerät) │
│ Gerät registrieren → Konfig lesen → Daten │
└──────────────────────────────────────────────┘Die Projektdatenbank ist die einzige Quelle der Wahrheit. Der Edge-Code schreibt hinein, das Board liest in Echtzeit daraus, und Benutzeraktionen über Formulare schreiben zurück. Dein Edge-Code kann diese Änderungen abonnieren, um den Kreislauf zu schließen — keine eigenen API-Endpunkte erforderlich.
Tipps
- Beginne mit Entity-Tabellen. Bringe zuerst die Geräteregistrierung und eine Statustabelle zum Laufen, bevor du Zeitreihenerfassung hinzufügst.
- Verwende
maintainLatestFlagForbei jeder Tabelle, in der du den aktuellen Zustand abfragen musst. So kannst du Verlaufsdaten anhängen und die neueste Zeile pro Entität ohne zusätzlichen Code zurücklesen — mit dem latest-Schalter an einem Widget oder mit{"latest": true}in einem SDK-Filter (ironflock.Latest()in Go). - Füge eine
deleted-Spalte zu Entity-Tabellen hinzu, die Benutzer über Formulare verwalten, damit Einträge weich gelöscht werden können und der Verlauf erhalten bleibt. - Bündle Hochfrequenz-Telemetrie mit
publishRowsToTable, statt für jeden Messwert einzeln zu schreiben.publishToTableundappendToTablewarten beide auf eine Bestätigung, überbrücken einen Plattform-Neustart und melden eine abgelehnte Zeile. - Halte Zeitreihentabellen einfach. Ein Zeitstempel, eine Kennung für die Quelle und die Messwerte. Verwende Transform-Tabellen für Aggregationen.
Nächste Schritte
Wenn deine Hardware eine webbasierte HMI oder Konfigurationsoberfläche bietet, kannst du sie direkt in dein IronFlock-Board einbetten — mit dem Embed-Widget und Geräte-Tunneln. Siehe Externe HMIs einbetten für Details.