Skip to Content
Développement d'applications IoTCréer votre première application

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 ; maintainLatestFlagFor dé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: numeric

2. 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 :

  1. Cliquez sur Développer sur la page de détail de l’application pour ouvrir l’IDE cloud.
Page de détail de l'application montrant le bouton Développer
  1. Choisissez un appareil en ligne depuis n’importe quel projet auquel vous avez accès.
Sélecteur d'appareils montrant les appareils disponibles dans les projets
  1. 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.
Panneau latéral avec les contrôles de développement edge et le bouton Créer un backend

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.

IDE cloud avec l'éditeur de code et le panneau de développement edge

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 :

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 :

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 :

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 maintainLatestFlagFor sur 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 deleted aux 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 appendToTable pour les écritures qui nécessitent une confirmation (par ex. l’enregistrement initial de l’appareil). Utilisez publishToTable pour 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.

Last updated on