Composants de page Web SVG pour IoT et Makers (Partie 1)
À propos de l'auteur
Richard Leddy écrit toutes sortes de programmes depuis ses débuts à l'université. En tant qu'assistant de recherche, il a écrit des programmes en C, C ++ et autres… Pour en savoir plus sur Richard …
L'IoT comprend de plus en plus de périphériques dotés de nombreux propriétaires. Les développeurs Web seront confrontés au problème de la recherche de moyens permettant aux propriétaires d’interagir avec leurs appareils. Mais, ce problème suscite beaucoup d’affaires. Explorons certains aspects du développement de pages Web pour l’Internet des objets (IoT) déjà demandés.
Le marché de l’IoT en est encore à ses débuts, mais il est en train de prendre de la vitesse. Nous sommes à l'aube de l'histoire de l'IdO. Les marchés quadruplent au cours des cinq dernières années, de 2015 à 2020. Pour les développeurs Web, cette croissance de l'IdO est significative. Il existe déjà une forte demande pour les techniques Web IoT.
De nombreux périphériques seront répartis géographiquement, et leurs propriétaires désireront un contrôle et une gestion à distance. Des piles Web complètes doivent être créées pour créer des canaux de téléopération. En outre, l'interaction se fera avec un ou plusieurs périphériques IoT à la fois. L'interaction doit être en temps réel du monde physique.
Cette discussion se penche sur les exigences d'interface utilisant Vue.js en tant que catalyseur et illustre une méthode de page Web permettant de communiquer avec de nombreuses substitutions.
Voici quelques-uns des objectifs planifiés pour cette discussion:
Créer une application Web SPWA d'une seule page hébergeant des groupes d'interfaces homme-machine IoT (on peut appeler ces «groupes de panneaux»);
Afficher les listes de identifiants de groupe de panneaux résultant de l'interrogation d'un serveur;
Afficher les panneaux d'un groupe sélectionné à la suite d'une requête;
Vérifiez que l'affichage des panneaux est chargé paresseusement et s'anime rapidement;
Assurez-vous que les panneaux synchroniser avec les appareils IoT.
IoT et la croissance rapide des pages Web
La présentation de graphiques pour la visualisation et le contrôle à distance du matériel ainsi que la synchronisation de pages Web avec des processus physiques en temps réel relèvent du domaine de la page Web. La résolution de problèmes inhérente à cet avenir IoT.
Nous sommes nombreux à rechercher des techniques de présentation IoT, mais il existe quelques standards Web ainsi que quelques techniques de présentation que nous pouvons commencer à utiliser maintenant. Si nous explorons ensemble ces normes et techniques, nous pourrons rejoindre cette vague IoT.
Les tableaux de bord et la visualisation de données sont en demande. De plus, la demande d'aller au-delà des pages Web qui fournissent des formulaires, des listes d'affichage ou du contenu textuel est forte. Les tableaux de bord pour l'IoT doivent être pictographiques, animés. Les animations doivent être synchronisées avec les processus physiques en temps réel afin de fournir aux utilisateurs une vue véridique de l'état de la machine. L'état de la machine, tel qu'une flamme qui brûle ou non, l'emporte sur l'état de l'application et fournit des informations cruciales aux opérateurs, voire des informations de sécurité.
Les tableaux de bord nécessitent plus que la visualisation des données. Nous devons garder à l'esprit que la partie de de l'IdO est constituée d'appareils qui ont non seulement des capteurs mais également des interfaces de contrôle. Dans les implémentations matérielles, les MCU sont étendues avec des commutateurs, des commutateurs de seuil, des paramètres, etc. Néanmoins, les pages Web peuvent prendre la place de ces composants de contrôle matériel .
Rien de nouveau. Les interfaces informatiques pour le matériel informatique existent depuis longtemps, mais la croissance rapide de l'utilisation de pages Web pour ces interfaces fait partie de notre expérience actuelle. WebRTC et Speech API sont sur une voie de développement qui a débuté en 2012. WebSockets s'est développé dans le même laps de temps.
L'IoT a été dans notre esprits depuis longtemps. L'IoT fait partie du dialogue humain depuis 1832. Mais, IoT et le sans fil, comme nous venons de le savoir, ont été imaginés par Tesla vers 1926. Forbes 2018 State of Iot nous dit la orientation actuelle du marché pour l'IoT. Cet article présente un intérêt pour les développeurs Web:
«Les utilisateurs ou les utilisateurs précoces de l'IoT hiérarchisent les tableaux de bord, les rapports et les cas d'utilisation de l'IdO qui fournissent des flux de données intégrés à l'analyse, à la visualisation avancée et à l'exploration de données».
le marché est énorme. Cet article Taille du marché donne une prévision du nombre d'appareils qui apparaîtront: 2018: 23,14 milliards ⇒ 2025: 75,44 milliards. Et, il tente de mettre un chiffre financier dessus: 2014: 2,99 milliards de dollars ⇒ 2020: 8,90 milliards de dollars. La demande en compétences IoT connaîtra la croissance la plus rapide: IoT in Demand .
Alors que nous développons des interfaces claires pour le contrôle et la surveillance des dispositifs, nous nous heurtons à un nouveau problème pour développer nos interfaces. Les nombreux milliards d'appareils appartiendront à de nombreuses personnes (ou organisations). En outre, chaque personne peut posséder un nombre illimité d'appareils. Certains dispositifs seront peut-être même partagés.
Les interfaces modernes conçues pour les commandes de machine ont souvent une structure bien définie, propre à une machine particulière ou à l'installation de quelques machines. Par exemple, dans une maison intelligente, un système haut de gamme aura un écran LCD avec des panneaux pour les appareils soigneusement placés. Cependant, à mesure que la version Web de l'IoT évoluera, il y aura un nombre indéterminé de panneaux pour un flux de périphériques dynamique et même mobile.
La gestion des panneaux pour les périphériques devient similaire à la gestion des connexions sociales sur des sites Web sociaux. 19659020] "Nos interfaces utilisateur devront gérer de manière dynamique le panneau en temps réel hautement animé qui doit être affiché à la fois pour chaque utilisateur."
Le tableau de bord est une application Web à page unique SPWA. Et, on peut imaginer une base de données de panels. Par conséquent, si un seul utilisateur souhaite accéder à un certain nombre de panneaux et de configurations pour ses périphériques éparpillés sur la planète, SPWA doit accéder aux composants de panneau à la demande. Les panneaux et certains des composants JavaScript associés devront être chargés paresseusement.
«Nos interfaces devront fonctionner avec des cadres de page Web permettant d'incorporer des liaisons de composants asynchrones sans réinitialiser leurs cadres.»
Utilisons Vue.js, WebSockets, MQTT et SVG font leur entrée sur le marché de l'IdO.
Architecture de haut niveau pour une application Web IoT
Lors de la conception de l'interface de la page Web IoT, plusieurs options sont toujours disponibles. Une option pourrait être de dédier une seule page à un seul périphérique. La page peut même être rendue côté serveur. Le serveur aurait pour tâche d'interroger le périphérique afin d'obtenir ses valeurs de capteur, puis de placer les valeurs aux emplacements appropriés de la chaîne HTML.
Nous sommes nombreux à connaître les outils permettant d'écrire des modèles HTML avec des marqueurs spéciaux qui indiquer où mettre des valeurs variables. Voir {{température}} dans un tel modèle nous indique, ainsi que le moteur de la vue de prendre la température demandée d'un périphérique et de remplacer le {{température}} symbole avec elle. Ainsi, après avoir attendu que le serveur interroge le périphérique, que le périphérique réponde, rende la page et affiche la page, l'utilisateur pourra enfin voir la température indiquée par le périphérique.
Pour cette page par architecture de périphérique, l'utilisateur peut alors souhaiter envoyer une commande à l'appareil. Pas de problème, il peut remplir un formulaire HTML et le soumettre. Le serveur peut même avoir une route juste pour le périphérique, ou peut-être un peu plus intelligemment, une route pour le type de périphérique et l'ID de périphérique. Le serveur traduirait alors les données de formulaire en un message à envoyer au périphérique, l'écrirait dans un gestionnaire de périphérique et attendrait un accusé de réception. Ensuite, le serveur peut enfin répondre à la requête de publication et dire à l'utilisateur que tout va bien pour le périphérique.
architecture pour traiter l'IdO en tant que serveur de formulaires – chercher quelque chose de mieux. ( Grand aperçu )
De nombreux CMS fonctionnent de cette manière pour mettre à jour les entrées de blog et autres. Rien ne semble étrange à ce sujet. Il semble que HTML sur HTTP ait toujours été conçu pour obtenir les pages rendues et pour envoyer les données de formulaire à gérer par le serveur Web. De plus, il existe des milliers de CMS parmi lesquels choisir. Ainsi, afin de mettre en place notre système IoT, il semble raisonnable de parcourir ces milliers de CMS afin de déterminer lequel convient le mieux. Ou bien, nous pourrions commencer par appliquer un filtre sur les CMS.
Nous devons tenir compte de la nature en temps réel de ce dont nous traitons. Ainsi, bien que le HTML dans sa forme originale convienne très bien à de nombreuses tâches d’entreprise, il a besoin d’un peu d’aide pour devenir le mécanisme de diffusion de la gestion IoT. Nous avons donc besoin d’un CMS ou d’un serveur Web personnalisé qui aide HTML à effectuer ce travail IoT. Nous pouvons également penser au serveur car nous supposons que CMS fournit les fonctionnalités du serveur. Nous devons simplement garder à l'esprit que le serveur doit fournir une animation basée sur les événements, de sorte que la page ne puisse pas être une impression statique finalisée à 100%.
Voici quelques paramètres susceptibles de guider les choix de notre page Web liée à un périphérique, choses à faire:
Recevoir les données du capteur et d'autres messages d'état du périphérique de manière asynchrone ;
Rendre les données du capteur de la page dans le client (presque corollaire à 1);
Commande de publication vers un périphérique ou un groupe de périphériques de manière asynchrone ;
Vous pouvez éventuellement envoyer des commandes via le serveur ou les contourner.
Conservez en toute sécurité la relation de propriété entre le périphérique et l'utilisateur;
Gestion du périphérique critique. ne pas interférer ou ne pas forcer le fonctionnement.
Cette liste nous vient à l’esprit lorsque l’on pense à une seule page agissant en tant qu’interface avec un périphérique sélectionné . Nous voulons pouvoir communiquer librement avec le périphérique en ce qui concerne les commandes et les données.
En ce qui concerne la page, il suffit de le demander une fois au serveur Web. Nous nous attendions à ce que le serveur Web (ou l'application associée) fournisse un chemin de communication sécurisé. Et le chemin ne doit pas nécessairement passer par le serveur, ou peut-être devrait-il éviter complètement le serveur car le serveur peut avoir des tâches plus prioritaires, autres que la communication d'une page pour les données provenant de capteurs.
peut imaginer que les données arrivent d'un capteur une fois par seconde, et nous ne nous attendons pas à ce que le serveur Web lui-même fournisse une seconde mise à jour constante pour des milliers de flux de capteurs individuels multipliés par des milliers de téléspectateurs. Bien sûr, un serveur Web peut être partitionné ou configuré dans un cadre d’équilibrage de charge, mais d’autres services sont personnalisés pour les commandes de remise de capteur et de marshaling au matériel.
Le serveur Web devra livrer un paquet afin que le Cette page peut établir des canaux de communication sécurisés avec le périphérique. Nous devons faire attention à l’envoi de messages sur des canaux qui ne permettent pas de gérer le type de messages qui passent. Il faut savoir si un périphérique se trouve dans un mode pouvant être interrompu ou si l'utilisateur peut demander à réagir si un périphérique est hors de contrôle. Ainsi, le serveur Web peut aider le client à obtenir les ressources appropriées pour en savoir plus sur le périphérique. La messagerie pourrait être faite avec quelque chose comme un serveur MQTT. De plus, certains services de préparation du serveur MQTT peuvent être lancés lorsque l'utilisateur accède à son panneau via le serveur Web.
En raison du monde physique avec ses exigences en temps réel et de considérations de sécurité supplémentaires, notre diagramme devient un peu différent de l'original.
Une application à une seule page qui communique avec un MCU. Il interagit maintenant de manière asynchrone avec la MCU indépendamment du serveur de pages Web. ( Grand aperçu )
Nous n’arrivons pas à nous arrêter ici. Configurer une seule page par périphérique, même s’il est réactif et gère bien la communication, n’est pas ce que nous avions demandé. Nous devons supposer qu'un utilisateur va se connecter à son compte et accéder à son tableau de bord. À partir de là, il demandera une liste de projets de contenu (projets sur lesquels il travaille probablement). Chaque élément de la liste fera référence à un certain nombre de ressources. Lorsqu'il sélectionne un élément en cliquant ou en tapant dessus, il aura accès à un ensemble de panneaux, chacun d'entre eux contenant des informations sur une ressource ou un périphérique IoT particulier.
N'importe quel nombre de panneaux livrés en réponse à la requête générée. à la suite de l'action d'interface de l'utilisateur peuvent être ces panneaux qui interagissent avec des périphériques en direct. Ainsi, dès qu'un panneau apparaît, il doit afficher l'activité en temps réel et pouvoir envoyer une commande à un périphérique.
Le mode d'affichage des panneaux sur la page est une décision de conception. Il peut s’agir de fenêtres flottantes ou de boîtes sur un arrière-plan déroulant. Quoi qu’il en soit, les panneaux seront marqués par le temps, la température, la pression, la vitesse du vent ou tout ce que vous pouvez imaginer. Nous nous attendons à ce que les panneaux soient animés par rapport à diverses échelles graphiques. La température peut être présentée comme un thermomètre, la vitesse comme un indicateur de vitesse semi-circulaire, le son comme une forme d'onde en continu, etc.
Le serveur Web a pour tâche de fournir les bons panneaux au bon utilisateur, en répondant à une base de données de panneaux. et étant donné que les appareils doivent être physiquement disponibles. De plus, étant donné qu’il y aura de nombreux types d’appareils, les panneaux de chaque appareil seront probablement différents. Ainsi, le serveur Web devrait pouvoir fournir les informations pictographiques nécessaires au rendu d'un panneau. Cependant, la page HTML du tableau de bord ne doit pas nécessairement être chargée avec tous les panneaux possibles.
Voici quelques paramètres qui pourraient guider les choix de notre page de tableau de bord, comme il se doit:
Présentez une manière de sélectionner des groupes de panneaux de périphériques associés;
Utilisez des mécanismes de communication de périphérique simultanés pour un certain nombre de périphériques;
Activez les panneaux de périphériques lorsque l'utilisateur le demande;
Intégrez des graphiques chargés paresseux pour des conceptions de panneau uniques;
Utilisez des jetons de sécurité et des paramètres en rapport avec
Maintenez la synchronisation avec tous les périphériques contrôlés par l'utilisateur
Une application à page unique qui communique avec plusieurs MCU, de manière asynchrone et indépendante du serveur de pages Web. ( Grand aperçu )
On peut commencer à voir comment le jeu change, mais dans le monde de la conception de tableaux de bord, le jeu change un peu ici et là depuis un certain temps. Nous devons simplement nous limiter à des outils de développement de pages actualisés et utiles pour nous mettre en route.
Commençons par la façon dont nous pouvons rendre les panneaux. Cela semble déjà être un gros travail. Nous imaginons de nombreux types de panneaux. Mais, si vous utilisiez un logiciel audio de musique, vous verriez comment ils ont utilisé les graphiques pour que les panneaux ressemblent aux périphériques analogiques utilisés par les groupes d’il ya très longtemps. Tous les panneaux de DAW sont dessinés par les plugins qui fonctionnent sur le son. En fait, beaucoup de ces plugins DAW peuvent utiliser SVG pour afficher leurs interfaces. Nous nous limitons donc à la gestion des interfaces SVG, qui peuvent à leur tour être n'importe quel graphique imaginable.
Choix de SVG pour les panneaux
Bien sûr, j'aime les DAW et l'utiliserais par exemple, mais SVG est un site Web. page standard. SVG est une norme W3C. Il s’agit de transporter des dessins au trait sur les pages Web. SVG était un citoyen de seconde classe sur la page Web, obligé de vivre dans iFrames. Mais, depuis HTML5, c'est un citoyen de première classe. Peut-être, quand SVG2 sortira, qu'il sera capable d'utiliser des éléments de formulaire. Pour l'instant, les éléments de formulaire sont des objets étrangers en SVG. Mais cela ne devrait pas nous empêcher de faire de SVG le substrat des panneaux.
SVG peut être dessiné, stocké pour l'affichage et chargé paresseux. En fait, en explorant le système de composants, nous verrons que SVG peut être utilisé pour les modèles de composants. Dans cette discussion, nous allons utiliser Vue.js pour créer des composants pour les panneaux.
Il n'est pas difficile de dessiner en SVG, car il existe de nombreux programmes de dessin de lignes faciles à obtenir. Si vous dépensez de l'argent, vous pouvez avoir Adobe Illustrator, qui exporte du SVG. Inkscape fait partie de la création de fichiers SVG depuis un certain temps. Il est open source et fonctionne bien sous Linux, mais peut également être exécuté sur Mac et Windows. Ensuite, il existe plusieurs programmes d'édition de pages Web SVG open source, ainsi que certaines versions SaaS également.
Je cherchais un éditeur SVG Web open source. Après avoir regardé autour de moi, je suis tombé sur SVG-Edit . Vous pouvez l'inclure dans vos propres pages Web, peut-être si vous créez un blog basé sur SVG ou quelque chose de ce genre.
Un schéma électrique est assez détaillé, mais nous pouvons l'obtenir facilement dans SVG et animez-le avec juste un peu de code. ( Grand aperçu )
Lorsque vous enregistrez votre travail dans un fichier, SVG-Edit le télécharge dans votre navigateur et vous permet de le récupérer dans votre répertoire de téléchargement.
L'image que j'ai dessiné montre une porte ET contrôlant un intégrateur. Ce n’est pas ce à quoi on s’attend habituellement dans un panneau pour un MCU. Le panneau pourrait avoir un bouton pour alimenter l’une des entrées de la porte ET, par exemple. Ensuite, il pourrait avoir un affichage d'un ADC qui lit la sortie de l'intégrateur. Peut-être que ce sera un graphique en courbes sur un axe temporel. La plupart des panneaux auront des graphiques qui permettent à l'utilisateur de se rapporter à ce qui se passe à l'intérieur de la MCU. Et, si notre circuit doit vivre n'importe où, il se trouvera à l'intérieur de la MCU.
Néanmoins, notre schéma électronique peut être utilisé pour discuter d'animation. Ce que nous voulons faire, c'est jeter un coup d'œil au SVG et voir où nous pouvons trouver certaines des balises DOM que nous aimerions changer d'une manière ou d'une autre. Nous pouvons ensuite animer le SVG en utilisant un peu de JavaScript vanille et une minuterie. Faisons clignoter la porte AND dans différentes couleurs.
Le SVG que nous recherchons se trouve dans la boîte de code suivante. Cela n’a pas l’air très amical pour le programmeur, même si l’utilisateur sera très heureux. Néanmoins, il y a encore des pistes à suivre pour trouver quel élément du DOM nous souhaitons opérer. Premièrement, la plupart des outils de dessin SVG permettent d’obtenir des propriétés d’objet, en particulier l’attribut id . SVG-Edit a aussi un chemin. Dans l'éditeur, sélectionnez la porte AND et observez la barre d'outils. Vous verrez également un champ pour la classe id et la classe CSS .
Si vous ne parvenez pas à accéder à un outil de montage pour une raison quelconque, vous pouvez ouvrir le fichier SVG dans un navigateur et inspecter le DOM. Dans tous les cas, nous avons constaté que notre porte avait id = “svg_1”.
Nous avons maintenant besoin d’un peu de JavaScript. Nous notons d’abord que l’attribut d’élément «fill» est présent. Ensuite, il y a juste le programme simple qui suit:
Notez que nous avons une page HTML minimale. Vous pouvez couper et coller le code dans votre éditeur préféré. Et n’oubliez pas de couper et coller le SVG pour remplacer le commentaire. Ma version de Chrome requiert que la page soit au format HTML pour que la section JavaScript soit disponible. Il s’agit donc d’un navigateur qui traite toujours SVG de manière distincte. Mais, nous sommes bien loin des jours .
Si vous faites un copier-coller parfait, vous pouvez afficher la page et voir la porte AND passer du rouge au vert encore et encore.
Nous sommes déjà sur la bonne voie pour donner vie à un seul panneau, mais si nous voulons gérer de grandes collections de panneaux de manière raisonnable, nous aurions du pain sur la planche. Ce serait particulièrement le cas si nous nous basions simplement sur notre premier exemple.
Alors que le premier exemple nous montre comment modifier de manière asynchrone une vue d'objet, il ne nous montre pas comment lier la vue à l'état d'un objet de données. encore moins celui qui gère une machine. Nous pouvons certainement comprendre comment la démonstration setInterval peut être remplacée par un gestionnaire fetch mais nous pourrions même ne pas obtenir l'état d'une machine du serveur Web servant la page contenant le SVG. De plus, lorsque nous obtenons les données, nos programmes doivent maintenant connaître la structure DOM de la page donnée.
Heureusement, les frameworks tels que Vue sont devenus populaires et peuvent nous épargner beaucoup de travail.
Il est facile de se renseigner sur Vue. La documentation de Vue est très accessible. Donc, si cette discussion prend trop d'avance, vous pourrez passer un peu de temps à apprendre à connaître Vue sur son propre site Web. Mais, il y a de très bonnes discussions au sein des pages Smashing. Krutie Patel a écrit un article remarquable sur la création d'une infographie. Souvik Sarkar nous explique comment créer un tableau de bord météo avec Vue.
Sélection de groupes de panneaux associés
Pour la première étape, nous devons nous intéresser à la recherche de groupes de panneaux. Une des raisons pour cela est d’abord que c’est au niveau de la structure de nos interactions humaines.
L’utilisateur cherche quelque chose qui l’intéresse. Peut-être s’intéresse-t-il à tous les appareils situés dans une même ville. Peut-être a-t-il de nombreux lots de produits liquides et souhaite-t-il se limiter à un type de produit, chaque lot étant régi par une petite collection de dispositifs IoT. Donc, l'utilisateur va d'abord chercher pour obtenir une petite liste.
Voici le processus:
Rechercher des groupes de panneaux par caractéristiques / paramètres.
Afficher une liste d'icônes représentant des groupes.
Sélectionner un élément icon (click / tap).
Commencez à utiliser les panneaux identifiés par l'icône lorsqu'ils apparaissent.
Une autre raison pour laquelle il s'agit d'une bonne première étape est que nous pouvons utiliser Vue dans sa forme la plus simple. Aucun outil de construction nécessaire. Nous allons simplement inclure vue.js avec une balise script en HTML. En fait, nous n’avons même pas besoin de le télécharger. Il existe un site qui sert une copie de travail de vue.js .
La balise suivante suffit:
J'ai copié la balise de script directement à partir de Documentation Vue sur l'installation.
Nous avons maintenant besoin d'une page Web capable de charger des icônes et d'en faire quelque chose de simple à utiliser. Vue rend cela très facile. En fait, je viens d'écrire une petite application pour gérer une liste Twitter à l'aide de Vue. Il ne gère que les champs de texte. Comme il est un peu plus simple qu'un SPWA utilisant des icônes, nous pouvons l'examiner, puis le modifier pour qu'il soit notre cadre d'application d'une page souhaité.
Voici une partie de l'aspect de la page. like:
Une page à base de texte à utiliser comme point de départ pour la création d'une application graphique. ( Grand aperçu )
Cela ressemble à une page assez simple. Chaque entrée numérique externe est un créneau horaire contenant un ou deux tweets. Le deuxième tweet est facultatif. Si vous modifiez un tweet, les mécanismes Vue mettent à jour un objet JavaScript. Cette page permet à l'utilisateur de cliquer sur le bouton «Mettre à jour les entrées» pour indiquer au serveur que quelque chose a changé, via sa fonction de gestionnaire de boutons.
Pour que le gestionnaire de boutons puisse relayer des données sur le serveur, il doit changer. l'objet de données Vue dans une chaîne JSON. Maintenant, vous pouvez vous demander à quel point il sera difficile de traduire un objet Vue en JSON. Il s'avère être une ligne de code. Vous pouvez trouver la ligne dans le code source suivant, mais si vous souhaitez la trouver plus rapidement, elle est mise en surbrillance dans le paragraphe situé après le code source.
La page a l'air simple. Les apparences peuvent être trompeuses. Bien sûr, la page a l'air simple, mais le code est-il simple? Oui, c'est vrai! En utilisant Vue, la page gère le contenu des champs de manière presque magique. Voici le code:
Tweet Keeper
tweets mangage
Mon moteur de tweet personnel.
Cette page accède à une page tweet personnelle appartenant à {{tweetOwner}}.
Donc, pour souligner les lignes étonnantes qui parlent de la puissance du cadre, répétons ici:
B. Ceci met les données dans Vue et affiche la mise à jour de l'écran:
twtApp.tweets = JSON.parse (text) // text est la réponse du serveur.
Il semble qu'il y aura un bon moyen d'exprimer la façon dont les données mettront à jour les panneaux pour l'IoT.
Maintenant, passons aux tweets en icônes cliquables conçues pour extraire des composants de le serveur Web.
Des tweets aux panneaux Récupération d’icônes
Les gens aiment utiliser SVG pour les icônes. Ils aiment utiliser SVG plus que d’autres choses, autant que je sache. Je ne vais que sur le nombre de sites Web qui vendent ou distribuent des icônes créées en SVG. Le point de vente est que les graphiques en ligne ont moins d'octets que les images. Et si je devais demander des listes d'images avec un comportement semblable à celui d'un bouton, j'aurais peut-être récupéré des fichiers PNG ou JPEG à l'époque où SVG était en iframes. Mais nous pouvons même trouver des bibliothèques dans les listes de contributeurs Vue qui nous aident à créer une portion d’icônes.
Nous pouvons transformer la page tweets en une liste d’icônes renvoyée comme résultat de recherche. Juste un petit code doit être changé. Bien sûr, il y a quelques points à surveiller si nous voulons que les icônes SVG soient chargées en tant que boutons. Vue fournit des mécanismes pour insérer du HTML dans l'application. Ces mécanismes doivent être utilisés ou les éléments DOM extraits du serveur ne sont pas interprétés.
Voici le type de rendu que vous pouvez obtenir si vous suivez votre première impulsion en créant un guidon . emplacement variable dans le DOM de l'application.
Vue citera le code HTML et l'insérera sous forme de texte. ( Grand aperçu )
Voici le code qui produit le résultat sur l'image:
{{icon}}
Notez que nous sommes passés de boucles en tweets à icônes en boucles. tweet in tweets a été remplacé par icon dans iconList . Notre twtApp s'accroche à l'élément du DOM #tweetAppDiv tandis que notre iconApp s'accroche à l'élément du DOM #iconAppTry . Dans l'objet d'option Vue, le sous-objet data a un tweets dans la première application et une iconList dans la seconde. Les champs sont tous deux des tableaux vides qui reçoivent des données lorsque la routine fetch fait son travail.
Mais nous avons trop imité notre application de tweet. Dans le code ci-dessus, iconList est un tableau et le serveur est censé envoyer un tableau de chaînes. Supposons donc que le serveur nous ait envoyé du code HTML et que nous le décodions correctement avec le tableau attribué à data.iconList . Ensuite, vous pouvez voir l’image ci-dessus.
Maintenant, changeons un peu le code. Dans ce code révisé, on peut voir ce qui suit:
v-html = "icon">
Vue répond à la syntaxe v-html en insérant le DOM de l'élément icon . Notez que la syntaxe est incluse après la directive de boucle en tant qu'attribut supplémentaire de la balise span
en supprimant la syntaxe du guidon et en utilisant v-html notre image passe à quelque chose de plus compréhensible:
En utilisant la directive de droite, Vue insérant DOM, générant ainsi le rendu des graphiques souhaités. (Large preview)
While v-html is a quick way to do things, the Vue team recommends using components to get the desired HTML into the page. That seems like a good idea, and we shall soon set about doing that.
But, let’s use the v-html syntax for our next example.
It’s time to set up our working example for fetching SVG icons. Let’s have those icons be responsive to a button click. Once those are working, we can get the panels associated with an icon.
Let’s suppose that the SVG required for icons is stored in a database. For our example, we can just fetch a JSON file from the server. The grown-up version of the icon server would store many such files in a database, and deliver them to the page with the same mechanisms.
Also, it’s best if the SVG arrives on the page URL encoded since we will be using JSON parse. The SVG can be decoded by calling JavaScript’s decodeURIComponent function.
In order to simulate the response to searching, we can make use of several JSON files. The page can have one button for each file. Here is the code for the page:
Search Bar
Request MCU Groups
These are groups satistfying this query: {{queryToken}}.
Here is one display of icons that have been fetched from the server:
An artistic idea suggesting how search could return icons indicating certain groups of MCU’s to interact with. (Large preview)
The data being sent is an array with the following kind of structure:
Here, svg1 is SVG taken from a file. Of course, a righteous server would have taken the structure from a database, where the SVG would be stored in the structure.
Here is a snippet from the above code. This is the code that fetches the JSON and places the array of structures into the Vue app. You can see the promise structure of fetch in use. The text is parsed, and in the next line, the encoded SVG is decoded. One more line, and Vue updates the page. The number of buttons in the button bar will be equal to the length of the JSON array.
fetch(url).then((response) => { // this is now browser native
response.text().then((text) => {
var newData = JSON.parse(text); // DATA UPDATE! Ça y est.
newData = newData.map(obj => {
obj.icon = decodeURIComponent(obj.icon);
return(obj)
});
// the page update right away with new data.
iconApp.iconList = newData;
});
});
Now, just two more snippets. The Vue app. The reader will notice that the @click directive has been included on the buttons. The data element, iconEntry.nameis passed to a method within quotes.
The method is defined within the Vue app:
Here is the snippet for the definition of methods. The methods object is added just after the data object within the app parameter object:
The reader should find the goGetPanel definition, and the use of it was pointed out for the @click handler. In our final application, the alert call can be replaced by a function that fetches panels from the server.
A Component Library For IoT Panels
We could just decide that panels that we fetch from the server can be HMTL or just SVG drawings, but if there are going to be many kinds of panels, we would hope that the job of creating panels could be simplified by having libraries of components to choose from. We can imagine that SVG editors could be improved to allow library components to be dropped onto pictures as part of editing. Then, if the SVG editor could output a version of the picture with component tags, then the use of Vue would allow the picture to be created while ensuring that the JavaScript automation and animation is neatly woven together. For our discussion, some hand editing can help us get there.
If we want to create panels out of Vue components, then we had better figure out how to make the components and then collect them together into something useful. We will have to switch to using command line tools provided by Vue and organize our workflow.
Components
The Vue documentation points out that the component data section (subobject) of the component definition needs to be a function that returns data. The reason for this is that Vue needs to keep data separate among the instances. So, in going from a Vue application initialization to a component definition there is another small code change.
In this first snippet of code a Vue application is being initialized:
var iconApp = new Vue({
el: '#iconApp',
data: { // this is the data field that can be easily updated
},
methods : {
...
}
});
In this new snippet of code, a component is being defined and registered. First, notice that instead of creating a new Vue instance, a component named iconic is being registered. Then, the data field returns custom data for any iconic instance that the Vue app makes. Finally, the template field is present at the end of the component registration. Any HTML that might have been written on the web page to display the component can be part of the template.
Vue.component('iconic',
data: () => {
var instanceData = {
// data fields named for the
// variables appearing in the template
onevar : "test"
}
return(instanceData);
},
methods : {
...
},
template: '
This appears in every instance {{onevar}}
'
});
So, we can imagine a panel with thermometers. So, if someone provided a thermometer component, we would expect a component definition somewhere in our code. As such:
Vue.component('thermometer',
data: () => {
var instanceData = {
// data fields named for the
// variables appearing in the template
temperature : 0
}
return(instanceData);
},
methods : {
...
},
template: '
Some SVG will go here
'
});
We are trying to create something that looks like this:
Animated thermometer application in Vue before exploring components. (Large preview)
The thermometer component is very similar to the first components that you will come across in the Vue tutorials. But, it’s a little tricky to figure out how to update it. There is a better way of defining the component for reactivity using properties. And, that is in the following:
Vue.component('thermometer', {
props: ['temperature'],
computed : {
y: function() {
var t = this.temperature/100;
var h = 54.724472;
var y_bar = 41.176476 // starts near the top
// pretend the scale is 1 to 100, so that the temperature is a precentage
return((1 - t)*h + y_bar)
},
height : function() {
var t = this.temperature/100;
var h = 54.724472; // as high as the whole range
var y_bar = 41.176476
// pretend the scale is 1 to 100, so that the temperature is a precentage
return(t*h)
}
},
template: '#thermometer-template'
})
So, instead of representing temperature as a data element. It is represented as a property under props. Then, there is a new section, computedthat provides variables that are functions of the property. We see this.temperature being used for both y and height. These computed variables are being used in the SVG as attributes for a rectangle.
In SVG, y grows from the top down. So, when we want the rectangle to be small at the bottom of the thermometer, the y of the red box has to be lower, and the height has to be reduced so that (y + height) stays at the thermometer zero.
Notice the template field in the definition of the components. It is in fact, a document element ID. The element being referred to is a script section with the special type: type="text/x-template". The script element is where the SVG for the thermometers is. And, the SVG makes use of Vue variables and control terms so that reactivity can be defined.
Here is some of the SVG:
The reader can find id="thermometer-template" at the top, and looking further down to the rect elements, the computed variables can be found.
Here the variable uses are separated out. The Vue shorthand syntax for v-bind is in use, with :height="height" and the same for y:
x="111.90748"
:height="height"
:y="y"
When the parent of the SVG elements sets variables that act as input to the thermometer property temperatureVue recalculates height and y. As a result, the position and height of the red box change.
It helps to have a listing of the Vue app that makes use of the thermometer.
Set Temperature
These are groups satistfying this query: {{queryToken}}.
That is the whole thing. There are three buttons which call the updateTemp method of the thermoApp Vue application. The data section has two temperature variables. And, each thermometer updates its temperature when the values change.
The code for the two thermometers called out below can be found on the HTML assigned to the Vue app.
Notice that application uses the function formalism for the method definition. Defining updateTemp this way updateTemp: function (tval1,tval2) allows for the instance variable this to be accessed.
Also, defining updateTemp this way updateTemp: (tval1,tval2) => assigns this to an internal data structure that does not react and update the view.
Assembling a Panel
Each IoT panel can be a component. Vue provides a way of defining components with subcomponents. Alternatively, there is a slot mechanism that can be used to yield a component that can wrap around any HTML content.
In the following few paragraphs, let’s look at making a panel out of subcomponents. There are two forms that follow quickly from our examples. In one case, the thermometers can be subcomponents called out in JavaScript. In another case, the components are defined independently but are mentioned in the HTML.
In both cases, the same HTML can be used for the template. Here is our panel as a template:
The only difference between the first detailing of the application is that a div element is surrounding the two thermometers. Vue will throw an error if the template is missing a top level DOM element. The div passes the Vue requirement, and the multiple elements may be included inside of it.
Now, we may see the two thermometers side by side. Passing the temperatures from the top to the final thermometer has values cascading down. At the top level, the panel joins the application when a single line is included in the application DOM.
The template for the panel, although simple, seems to indicate that panels can be easily designed in term of components. It’s as if a language for just IoT components is possible.
Now, the template definition for the panel is simple enough. Here it is with the subcomponents defined independently:
That is about as much as is required to make the panel functional. It is true that this version relies on a long list of properties for defining values to be updated as messages come into the page. But, this is a good start. Updating the data object at the top level does the job of animating the thermometers. However, as the panels become complicated, there may need to be another method for showing change.
Having made mention to the other ways of specifying subcomponents, for the panel, we should take a look at it. Here it is:
Vue.component('thermo-panel', {
props: ['temp1','temp2'],
template: '#thermo-panel-template',
components: {
// a sub component for the labels
'thermometer': {
props: {
temperature: Number,
},
template: '#thermometer-template',
computed : {
y: function() {
var t = this.temperature/100;
var h = 54.724472;
var y_bar = 41.176476 // starts near the top
// pretend the scale is 1 to 100, so that the temperature is a precentage
return((1 - t)*h + y_bar)
},
height : function() {
var t = this.temperature/100;
var h = 54.724472; // as high as the whole range
var y_bar = 41.176476
// pretend the scale is 1 to 100, so that the temperature is a precentage
return(t*h)
}
}
}
}
});
There is certainly more code, but that is because the JavaScript for the thermometer component is included within the components list of thermo-panel. The two approaches do the same job, but they offer different ways of packaging component definitions.
At the moment, my preference is for the first way. It should be considerably easier to revise panels and have them retrieved dynamically if only changing template and properties is required. To this end, the independently defined components form a component library. But, although that seems better, in the following it becomes more convenient to use the second, seemingly more verbose way.
Given that we can make responsive panels out of components in clearly defined ways, I’ll explain how we can manage them as a database that can make simple queries in the next part of my article. Stay tuned!