Créer votre première application
Ce guide présente le flux de travail typique pour construire une application IronFlock qui collecte des données depuis des appareils edge et les affiche sur des tableaux de bord en temps réel. À la fin, vous disposerez d’un modèle de données, d’une logique edge, d’un formulaire de configuration destiné aux utilisateurs et de graphiques en direct — le tout relié par la base de données du projet.
1. Concevoir le modèle de données
Commencez dans le fichier .ironflock/data-template.yml. Pensez à deux catégories de tables :
- Tables d’entités — suivent l’état actuel des choses (appareils, machines, connexions). Les lignes sont ajoutées à chaque changement ;
maintainLatestFlagFordéclare quelles colonnes identifient une entité, afin que la ligne la plus récente de chaque entité puisse être relue à la demande. - Tables de séries temporelles — collectent des mesures dans le temps (relevés de capteurs, métriques). Chaque ligne est un nouveau point de données avec un horodatage.
data:
tables:
# Entity table: one row per device, latest state always queryable
- 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 table: user-configured Modbus servers
- 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
# Time-series table: periodic readings from connected hardware
- tablename: readings
columns:
- id: tsp
dataType: timestamp
- id: server_id
dataType: string
- id: metric
dataType: string
- id: value
dataType: numeric2. Configurer un environnement de test
Pour tester votre application, vous avez besoin d’un environnement de développement dans un projet avec au moins un appareil en ligne :
- Cliquez sur Développer sur la page de détail de l’application pour ouvrir l’IDE cloud.
- Choisissez un appareil en ligne depuis n’importe quel projet auquel vous avez accès.
- Cliquez sur Créer un backend dans le panneau latéral pour créer un environnement de développement dans la base de données de ce projet.
Les tables définies dans votre data-template.yml sont alors instanciées dans la base de données du projet. Vous pouvez les examiner dans la vue Fleet Database du projet.
L’IDE cloud vous offre un environnement VS Code complet avec un explorateur de fichiers, un éditeur, un terminal et le panneau de développement edge pour construire votre application et la déployer sur votre appareil.
3. Écrire le code edge
Votre conteneur Docker s’exécute sur l’appareil et utilise le SDK IronFlock pour interagir avec la base de données du projet.
Enregistrer l’appareil au démarrage
Au démarrage du composant edge, ajoutez une ligne à la table d’entités devices afin que le tableau de bord sache que l’appareil est en ligne :
Python
import asyncio
import os
from datetime import datetime, timezone
from ironflock import IronFlock
async def main():
# Register this device as online
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
})
# ... rest of your logic
flock = IronFlock(mainFunc=main)
flock.run()Comme devices utilise maintainLatestFlagFor: ['device_key'], la ligne de statut précédente de cet appareil est automatiquement supplantée. Les widgets dont le filtre latest est activé affichent toujours l’état actuel.
Réagir à la configuration des utilisateurs
Les utilisateurs peuvent ajouter des serveurs Modbus via un formulaire sur le board (voir l’étape 4). Votre code edge s’abonne à la table modbus_servers et traite les nouvelles entrées :
Python
async def main():
# ... device registration ...
# Read existing Modbus servers
existing = await flock.getHistory("modbus_servers", {
"limit": 1000,
"filterAnd": [
# "latest": True returns only the newest row per server_id
{"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)
# React to new servers in real time
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)Collecter des données de séries temporelles
Une fois la connexion Modbus établie, interrogez périodiquement le serveur et écrivez les relevés dans la table readings :
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)Chaque ligne a besoin d’un horodatage tsp : le backend de données abandonne silencieusement une ligne publiée qui n’en a pas, et seule une entrée dans la table error-logs de l’application en garde la trace.
4. Construire le board
Ouvrez l’éditeur de board et ajoutez des widgets connectés à vos tables de backend de données.
Afficher le statut des appareils
Ajoutez un widget Tableau connecté à la table devices. Activez le commutateur latest dans les paramètres de filtre du widget pour qu’il affiche toujours l’état actuel de chaque appareil. Le tableau se met à jour automatiquement lorsqu’un appareil passe en ligne ou hors ligne.
Permettre aux utilisateurs de configurer des serveurs Modbus
Ajoutez un widget Formulaire connecté à la table modbus_servers. Configurez des champs pour host et port. Lorsqu’un utilisateur remplit et soumet le formulaire, une nouvelle ligne est automatiquement insérée dans la table modbus_servers — aucun code backend n’est nécessaire pour traiter la soumission du formulaire.
Votre code edge récupère la nouvelle ligne via subscribeToTable (voir l’étape 3) et établit la connexion Modbus.
Visualiser les données de séries temporelles
Ajoutez un widget Graphique linéaire connecté à la table readings. Mappez tsp sur l’axe X et value sur l’axe Y. Le graphique se met à jour en temps réel à mesure que de nouveaux relevés arrivent des appareils — pas de polling ni de rafraîchissement manuel.
Comment tout s’assemble
┌─────────────────────────────────────────────────────────┐
│ Board (Dashboard) │
│ ┌──────────┐ ┌──────────────┐ ┌───────────────────┐ │
│ │ Table │ │ Form │ │ Line Chart │ │
│ │ devices │ │ modbus_servers │ │ readings │ │
│ └────┬─────┘ └──────┬───────┘ └────────┬──────────┘ │
│ │ │ │ │
└───────┼───────────────┼───────────────────┼─────────────┘
│ │ │
┌────▼───────────────▼───────────────────▼────┐
│ Project Database │
│ devices │ modbus_servers │ readings │
└────▲───────────────▲───────────────────▲────┘
│ │ │
┌────┴───────────────┴───────────────────┴────┐
│ Edge Code (on device) │
│ register device → read config → poll data │
└─────────────────────────────────────────────┘La base de données du projet est la source unique de vérité. Le code edge y écrit, le board la lit en temps réel et les actions des utilisateurs via les formulaires y écrivent en retour. Votre code edge peut s’abonner à ces changements pour boucler la boucle — sans endpoints d’API personnalisés.
Conseils
- Commencez par les tables d’entités. Faites fonctionner l’enregistrement des appareils et une table de statut avant d’ajouter la collecte de séries temporelles.
- Utilisez
maintainLatestFlagForsur toute table dont vous devez interroger l’état actuel. Il vous permet d’ajouter de l’historique et de relire la ligne la plus récente de chaque entité — avec le commutateur latest d’un widget ou{"latest": true}dans un filtre du SDK (ironflock.Latest()en Go) — sans code supplémentaire. - Ajoutez une colonne
deletedaux tables d’entités que les utilisateurs gèrent via des formulaires, afin que les enregistrements puissent être supprimés logiquement tout en préservant l’historique. - Utilisez
appendToTablepour les écritures qui nécessitent une confirmation (par ex. l’enregistrement initial de l’appareil). UtilisezpublishToTablepour la télémétrie à haute fréquence, lorsque le mode « fire-and-forget » est acceptable. - Gardez des tables de séries temporelles simples. Un horodatage, un identifiant de la source et les valeurs mesurées. Utilisez des tables de transformation pour l’agrégation.
Prochaines étapes
Si votre matériel expose une IHM ou une interface de configuration web, vous pouvez l’intégrer directement dans votre board IronFlock à l’aide du widget Intégration et des tunnels d’appareil. Consultez Intégration d’IHM externes pour plus de détails.