Statusdiagram över sensorer anslutna till Internet of Things IoT
En av fördelarna med att ansluta ett sensornätverk till Internet of Things är att kunna analysera den data som erhålls. Genom att grafiskt representera denna information kan en person (i motsats till ett program) mer intuitivt förstå innebörden av de övervakade storheterna, till exempel genom att jämföra dem med varandra eller följa deras utveckling över tid.
Den här artikeln inleder en serie, som består av fyra delar, som förklarar ett enkelt förslag för grafisk representation av data som erhålls av sensorer anslutna till IoT. Med samma filosofi som i andra artiklar är den föreslagna metoden perfekt funktionell även om huvudsyftet är didaktiskt. Som den tekniska profilen för allmänheten till vilken blogg polaridad.es, och den här texten handlar om elektronik och inte webbutveckling, var och en av avsnitten fungerar som en introduktion till språken eller tekniken som används: html, CSS, SVG y JavaScript.
Artiklarna i föregående serie om hur man lagrar data som erhållits av enheter anslutna till Internet of Things (IoT) De avslutade med att förklara hur man kommer åt informationen som lagras i databaserna. I exemplen i serien, för att underlätta processen, användes en webbserver som mellanhand som ansvarade för att ta emot data via POST-förfrågningar av HTTP-protokollet, lagra dem i en databas och visa dem på en webbsida.
Även om den största nackdelen med detta system är prestanda (som skulle kunna lindras med alternativ som Node.js och MongoDB, som kommer att förklaras i framtida artiklar), ger det i utbyte två stora fördelar: dess implementering är mycket enkel (inklusive tillgängligheten offentliga tjänster) och kan visa data i en webbläsare, det vill säga att den inte behöver specifika applikationer (som en app för en mobil enhet) för att presentera den lagrade informationen som skulle representera den historiska statusen för enheter som är anslutna till Internet. Saker.
Utnyttja fördelen med att enkelt kunna presentera på en webbsida informationen som har lagrats med detta system om status för enheter anslutna till IoT, förklarar den här artikeln hur man grafiskt visar denna information med formatet SVG från JavaScript för att dynamiskt generera en webbsida i html.
Det finns många bokhandlar JavaScript för att lösa den grafiska presentationen av data. Dessa artiklar har inte för avsikt att utveckla ytterligare en; Syftet med denna text är att förstå processen och kunna utveckla dina egna implementeringar; ett didaktiskt mål såväl som ett produktivt. Om du är intresserad av att använda en produkt istället för att utveckla den själv rekommenderar jag att du tar en titt på några av de utmärkta biblioteken för att skapa grafik med JavaScript med gratis licenser som Charts.js, Highcharts, Googles diagramverktyg, Epok, Raphaël, Grafico (baserat på Raphaël), dc.js, Chartist.js, d3.js (min rekommendation), C3.js (baserat på d3.js), NVD3 (återanvändbar grafik för d3.js) ...
HTML-dokumentstruktur med SVG-grafik
I denna artikels förslag att grafiskt presentera sensordata består webbsidan på vilken den visas av:
- dokumentet som fungerar som en behållare skrivs in html,
- sidans utseende definieras med kod CSS,
- ritningen av grafen görs med hjälp av språket SVG y
- Läsa data från servern och visa grafer programmeras in JavaScript
Alla element, speciellt koden html på sidan, kan genereras på servern med PHP som förklaras i artikeln om PHP programmeringsspråk från serien om datalagring från enheter anslutna till Internet of Things.
Koden CSS y JavaScript kan laddas (importeras) i kod html istället för att skrivas direkt som en del av dokumentet html. Detta har fördelen av att kunna återanvända samma dokument på flera sidor och att kunna redigera dem mer bekvämt; men kanske besväret med att det tar lite längre tid att ladda beroende på om du kan använda koden som finns i cachen (laddad vid tidigare användning) eller till och med en CDN. I produktionsfasen är det trivialt att integrera all kod från PHP och generera ett enda dokument i html med all information om du väljer detta alternativ. Genom hela denna artikelserie anses det för tydlighetens skull att vi arbetar med separata dokument.
För de syften som intresserar oss, för att använda den som en grafisk behållare, och mycket grovt, innehållet i den första nivån av strukturen för ett dokument html skulle:
1
2
3
4
5
6
7
|
<!DOCTYPE html>
<html lang=“es”> <!– El código del documento HTML está escrito en español –>
<head>
</head>
<body onload=“funcion();”>
</body>
</html>
|
Den första raden tjänar till att indikera för webbläsaren att dokumentet den läser är skrivet i html, specifikt i version 5 (känd som HTML5). Tidigare versioner av html, baserat på SGML (Standard Generalized Markup Language), inkluderade en definition av dokumenttyp (DTD) där den typ av regler som används på språket för att beskriva dokumentet deklarerades.
Den andra och sista raden innehåller koden html bland direktiven <html>
y </html>
som fungerar som öppning respektive stängning. Direktiven html De omsluter namnet och attributen mellan tecknen "mindre än" och "större än" och bildar ett slags "akut parentes"-tecken. Elementen html som bifogar innehåll har ett avslutande direktiv som inkluderar snedstrecket framför namnet som i </html>
.
Egenskaper eller attribut för element separeras med mellanslag från namnet och från varandra och uttrycks som vanlig text eller, oftare, som text (namnet på egenskapen) följt av ett likhetstecken och ett värde inom citattecken. När det gäller kodöppningsdirektivet html egendom har använts lang
med värdet es
, lang="es"
att ange att texten i dokumentet html använder spanska språket.
En kommentar har inkluderats efter öppningsdirektivet för HTML-koden. Kommentarerna i html De kan uppta flera rader och använda koden som öppningsskylt <!--
och som en avslutning -->
Koden html Den består av två block: rubriken <head>
och kroppen <body>
. Det första syftar till att informera om själva dokumentet, inklusive information om det (metainformation) och det andra är att stödja innehållet i dokumentet.
I direktivet <body>
ett evenemang har inkluderats onload
för att automatiskt utföra en funktion JavaScript när innehållet har laddats. Denna resurs låter dig starta exekveringen av koden som kommer att definiera de grafiska objekten och uppdatera dem när information laddas från servern om tillståndet för sensorerna som representerar dessa bilder.
Av all metainformation som kan inkluderas i dokumentets rubrik html, vi är särskilt intresserade av att känna till den som beskrivs av följande direktiv:
-
<title>
som tjänar till att ge en titel till handlingen. Det kommer normalt att visas i webbläsarfönstret eller på motsvarande flik och hjälper oss att identifiera grafiken som den innehåller. -
<charset>
deklarerar teckenuppsättningen som används för att koda dokumentet. Det är särskilt viktigt för "speciella" tecken som eñes eller accenter. -
<link>
gör det möjligt att upprätta en relation mellan dokumentet html nuvarande och andra externa. Det hjälper oss att ladda stilmallen i format CSS med dokumentets utseende. -
<script>
innehåller ett skript med körbar kod. Med hjälp av detta direktiv kommer vi att ladda funktionerna JavaScript för att generera eller ändra grafik SVG.
1
2
3
4
5
6
7
8
9
10
11
|
<!DOCTYPE html>
<html lang=“es”> <!– El código del documento HTML está escrito en español… –>
<head>
<meta charset=“utf-8”> <!– …y codificado en el juego de caracteres UTF-8 –>
<title>Gáfico SVG de sensores conectados a la IoT</title>
<link href=“https://polaridad.es/grafica-sensor-internet-de-las-cosas-iot/aspecto.css” type=“text/css” rel=“stylesheet” media=“all”>
<script src=“graficos.js” type=“text/javascript”></script>
</head>
<body onload=“funcion();”>
</body>
</html>
|
Som kan ses i exemplet på html ovan, namnet (och sökvägen, om tillämpligt) för dokumentet med stilen CSS anges med attributet href
, medan det gäller koden JavaScript den används src
. Båda delar ägandet type
med värdet text/css
y text/javascript
respektive.
Med avseende på innehållet i dokumentet, den del som motsvarar elementet <body>
, HTML5 Det låter dig skapa specifika strukturer för de vanligaste komponenterna på en webbsida som en sidfot, en sidosektion eller ett navigeringsfält, men det som intresserar oss är att använda dokumentet som en grafisk behållare. SVG är elementen <div>
som fungerar som oberoende block som gör det möjligt att definiera en hierarkisk struktur genom att kapsla några <div>
inom andra.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
<!DOCTYPE html>
<html lang=“es”> <!– El código del documento HTML está escrito en español… –>
<head>
<meta charset=“utf-8”> <!– …y codificado en el juego de caracteres UTF-8 –>
<title>Gáfico SVG de sensores conectados a la IoT</title>
<link href=“https://polaridad.es/grafica-sensor-internet-de-las-cosas-iot/aspecto.css” type=“text/css” rel=“stylesheet” media=“all”>
<script src=“graficos.js” type=“text/javascript”></script>
</head>
<body onload=“funcion();”>
<div id=“padre” class=“aspecto_de_padre”>
<div id=“primer_hijo” class=“aspecto_de_hijo”>
</div>
<div id=“segundo_hijo” class=“aspecto_de_hijo”>
</div>
</div>
</body>
</html>
|
I föregående exempel används ett element <div>
som innehåller två andra. Detta exempel introducerar två mycket viktiga egenskaper för den användning vi vill göra av koden. html: id
som används för att tilldela en unik identifierare till ett element html (a <div>
, i det här fallet) och class
med vilken den tilldelas en kategori som vi kommer att använda för att fastställa utseendet. Kategorien, klassen, behöver inte vara unik, i själva verket ligger mycket av dess effektivitet i att flera delar delar samma aspekt.
Elementet (eller taggen) <p>
tjänar till att definiera ett stycke som normalt innehåller text (men i html det finns ingen begränsning i detta avseende). Att göra grupperingar inom ett stycke (eller en <div>
, det finns heller inga begränsningar) taggen används <span>
. Med detta element är det till exempel möjligt att inkludera text i ett stycke för att ge det ett annat utseende som understruken eller fetstil.
Definitionen av de grafiska egenskaperna och i allmänhet beteendet som är förknippat med ett element html Att tillskriva en klass görs i koden CSS; i fallet med föregående exempel i dokumentet aspecto.css
.
För att optimera tilldelningen av egenskaper CSS det är möjligt att samma element html tillhör flera klasser och har alltså det utseende eller beteende som definieras av dem. För att göra denna uppgift, skriv namnen på de olika klasserna, separera dem med kommatecken till höger om fastigheten. class
9
10
11
12
13
14
15
16
|
<body onload=“funcion();”>
<div id=“padre” class=“aspecto_de_padre”>
<div id=“primer_hijo” class=“aspecto_de_hijo aspecto_raro tipografia_grande”>
</div>
<div id=“segundo_hijo” class=“aspecto_de_hijo”>
</div>
</div>
</body>
|
I föregående exempel, elementet <div>
som har identifierats som primer_hijo
Tre klasser har tilldelats: aspecto_de_hijo
, aspecto_raro
y tipografia_grande
, som tillsammans ska definiera elementets utseende och beteende. Som förklaras i följande artikel om Definiera IoT Sensor Graphics Web Appearance med CSS, när du använder flera klasser, om någon av egenskaperna som definierar aspekten är definierade i båda, råder den sist refererade.
Som har setts, elementen <div>
De kan innehålla andra element, inklusive andra <div>
. Ett enklare fall vore <div>
som innehöll text. Utseendet som definierar stilen CSS skulle också påverka texten i elementet.
För att optimera tilldelningen av egenskaper CSS det är möjligt att samma element html tillhör flera klasser och har alltså det utseende eller beteende som definieras av dem. För att göra denna uppgift, skriv namnen på de olika klasserna, separera dem med kommatecken till höger om fastigheten. class
9
10
11
12
13
14
15
16
17
|
<body onload=“funcion();”>
<div id=“padre” class=“aspecto_de_padre”>
<div id=“primer_hijo” class=“aspecto_de_hijo aspecto_raro tipografia_grande”>
Este hijo de aspecto raro tiene la tipografía grande
</div>
<div id=“segundo_hijo” class=“aspecto_de_hijo”>
</div>
</div>
</body>
|
I det föregående exemplet, de tre klasserna associerade med <div>
primer_hijo
De skulle definiera utseendet på elementet och texten som innehåller det, till exempel, vilket gör teckensnittet i vilket det är skrivet stort (om syftet som anges med dess namn i den sista klassen är sant)
Sedan version 5 (HTML5) är det möjligt att inkludera grafikkoden i format SVG i själva koden html som ytterligare ett element. Ur kodsynpunkt html, innehållet SVG det är ett element <svg>
som innehåller de olika grafiska elementen (linjer, cirklar, rektanglar...
9
10
11
12
13
14
15
16
17
18
19
20
|
<body onload=“funcion();”>
<div id=“padre” class=“aspecto_de_padre”>
<div id=“primer_hijo” class=“aspecto_de_hijo aspecto_raro tipografia_grande”>
Este hijo de aspecto raro tiene la tipografía grande
</div>
<div id=“segundo_hijo” class=“aspecto_de_hijo”>
<svg id=“dibujo” class=“grafico” width=“100%” height=“100%” viewBox=“0 0 100 100” preserveAspectRatio=“none”>
<circle cx=“100” cy=“200” r=“50”>
</svg>
</div>
</div>
</body>
|
Även om det har sagts att de grafiska egenskaperna hos elementen html definieras i en stil CSS och är associerade med det genom en klass, är det också möjligt att tilldela några av dem direkt till elementen på två sätt. Å ena sidan kan du använda fastigheten style
och tilldela objektets olika grafiska egenskaper som dess värde. Logiskt sett är det att föredra att använda den tidigare nämnda tekniken att tilldela aspekten till en klass, men med denna möjlighet kan du lägga till en liten korrigering till ett element (ett mycket speciellt undantag) utan att behöva skapa en ny klass.
Å andra sidan, vissa element html De låter dig använda specifika egenskaper som definierar deras utseende. I allmänhet, även om dessa egenskaper finns, är det att föredra att använda klasser, men tyvärr erbjuder inte alla element detta alternativ, vissa förväntar sig att ett visst värde indikeras direkt med de specifika egenskaperna istället för att referera till den associerade klassen. Ett av de element som har den här typen av beteende är just koden SVG, som vi måste tilldela det procentuella värdet av bredden och höjden i egenskaperna width
y height
, respektive istället för klassen.
Som kommer att framgå mer i detalj i artikel som talar om SVG-kod, för att använda den enkla metoden som föreslagits, är det tillrådligt att betrakta diagrammets dimensioner i procent. När det gäller den totala storleken på objektet, genom att ange 100 % i bredd- och höjdvärdet, kommer det att vara behållaren som anger de slutliga måtten (den <div>
med id="dibujo"
, i föregående exempel)
När det gäller de olika komponenterna i grafen SVG (linjer, cirklar, rektanglar...), ingår i ett område som mäter 100×100 (valfri enhet) och expanderar i en rektangulär form utan att bevara proportionen. Fastigheterna viewBox
y preserveAspectRatio
av elementet SVG De är ansvariga för att fastställa dessa värderingar. i det första fallet med en rektangulär vy som går från koordinatpunkten (0,0) till koordinatpunkten (100,100) och uttrycks som "0 0 100 100"
och i den andra med värdet none
.
14
15
16
17
18
|
<div id=“segundo_hijo” class=“aspecto_de_hijo”>
<svg viewBox=“0 0 100 100” preserveAspectRatio=“none” width=“100%” height=“100%” id=“dibujo” class=“grafico”>
<circle cx=“100” cy=“200” r=“50”>
</svg>
</div>
|
Med allt ovanstående kan du nu definiera en komplett kod som skulle fungera som en grafikbehållare. SVG genereras eller modifieras från JavaScript. Exemplet nedan innehåller fyra grafikblock som använder formatet html av det representationsförslag som vi ska använda.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
|
<!DOCTYPE html>
<html lang=“es”> <!– Inicio del documento HTML con el idioma –>
<head> <!– Cabecera del documento HTML –>
<meta charset=“utf-8”> <!– Se utiliza el juego de caracteres UTF8 –>
<title>Temperaturas Nave E1</title> <!– Título del documento y seguramente de la ventana del navegador –>
<link rel=“stylesheet” href=“https://polaridad.es/grafica-sensor-internet-de-las-cosas-iot/estilo.css” type=“text/css” media=“all”> <!– Cargar el estilo “https://polaridad.es/grafica-sensor-internet-de-las-cosas-iot/estilo.css” guardado en la misma carpeta que este documento HTML –>
<script type=“text/javascript” src=“graficos.js”></script> <!– Cargar el código JavaScript del documento “graficos.js” guardado en la misma carpeta que este documento HTML –>
</head> <!– Final de la cabecera del documento HTML –>
<body onload=“iniciar_graficos();”> <!– Cuerpo del documento HTML. Al cargar el contenido llama a la función JavaScript iniciar_graficos() –>
<div id=“temperatura_frigorifico_a” class=“bloque_sensor”> <!– Bloque de datos del primer sensor –>
<div id=“titulo_temperatura_frigorifico_a” class=“bloque_titulo”>Temperatura frigorífico 01A</div> <!– Título del bloque de datos del sensor –>
<div id=“descripcion_temperatura_frigorifico_a” class=“bloque_descripcion”>Media de las sondas de temperatura del frigorífico 01A</div> <!– Descripción del bloque de datos del sensor –>
<div id=“fecha_temperatura_frigorifico_a” class=“bloque_fecha”>Cargando emperaturas</div> <!– Fecha de la última lectura de datos del sensor. Por ahora vacío, luego se rellenará con la aplicación JavaScript –>
<div id=“bloque_temperatura_frigorifico_a” class=“bloque_grafico”> <!– Bloque con el gráfico –>
<svg id=“grafico_temperatura_frigorifico_a” class=“grafico” width=“100%” height=“100%” viewBox=“0 0 100 100” preserveAspectRatio=“none”>
<path id=“linea_temperatura_frigorifico_a” d=“” style=“fill:none;stroke:#205587;stroke-width:4;stroke-opacity:1;” vector-effect=“non-scaling-stroke” />
</svg> <!– Gráfico de los datos –>
</div> <!– Final del bloque que contiene el gráfico –>
</div> <!– Final del bloque de datos del primer sensor –>
<div id=“temperatura_frigorifico_b” class=“bloque_sensor”>
<div id=“titulo_temperatura_frigorifico_b” class=“bloque_titulo”>Temperatura frigorífico 01B</div>
<div id=“descripcion_temperatura_frigorifico_b” class=“bloque_descripcion”>Media de las sondas de temperatura del frigorífico 01B</div>
<div id=“fecha_temperatura_frigorifico_b” class=“bloque_fecha”>Cargando emperaturas</div>
<div id=“bloque_grafico_temperatura_frigorifico_b” class=“bloque_grafico”>
<svg id=“grafico_temperatura_frigorifico_b” class=“grafico” width=“100%” height=“100%” viewBox=“0 0 100 100” preserveAspectRatio=“none”>
<path id=“linea_temperatura_frigorifico_b” d=“” style=“fill:none;stroke:#205587;stroke-width:4;stroke-opacity:1;” vector-effect=“non-scaling-stroke” />
</svg>
</div>
</div>
<div id=“temperatura_frigorifico_c” class=“bloque_sensor”>
<div id=“titulo_temperatura_frigorifico_c” class=“bloque_titulo”>Temperatura frigorífico 01C</div>
<div id=“descripcion_temperatura_frigorifico_c” class=“bloque_descripcion”>Media de las sondas de temperatura del frigorífico 01C</div>
<div id=“fecha_temperatura_frigorifico_c” class=“bloque_fecha”>Cargando emperaturas</div>
<div id=“bloque_grafico_frigorifico_c” class=“bloque_grafico”>
<svg id=“grafico_temperatura_frigorifico_c” class=“grafico” width=“100%” height=“100%” viewBox=“0 0 100 100” preserveAspectRatio=“none”>
<path id=“linea_temperatura_frigorifico_c” d=“” style=“fill:none;stroke:#205587;stroke-width:4;stroke-opacity:1;” vector-effect=“non-scaling-stroke” />
</svg>
</div>
</div>
<div id=“temperatura_frigorifico_d” class=“bloque_sensor”>
<div id=“titulo_temperatura_frigorifico_d” class=“bloque_titulo”>Temperatura frigorífico 01D</div>
<div id=“descripcion_temperatura_frigorifico_d” class=“bloque_descripcion”>Media de las sondas de temperatura del frigorífico 01D</div>
<div id=“fecha_temperatura_frigorifico_d” class=“bloque_fecha”>Cargando emperaturas</div>
<div id=“bloque_grafico_frigorifico_d” class=“bloque_grafico”>
<svg id=“grafico_temperatura_frigorifico_d” class=“grafico” width=“100%” height=“100%” viewBox=“0 0 100 100” preserveAspectRatio=“none”>
<path id=“linea_temperatura_frigorifico_d” d=“” style=“fill:none;stroke:#205587;stroke-width:4;stroke-opacity:1;” vector-effect=“non-scaling-stroke” />
</svg>
</div>
</div>
</body> <!– Final del cuerpo del documento HTML –>
</html> <!– Final del documento HTML –>
|
Nedan kan du se hur den tidigare koden skulle se ut, formaterad med stilen CSS motsvarande, genererande med JavaScript grafiken SVG med serveravläsningar av data som lagras av sensorer anslutna till IoT. Förutom att data inte laddas från servern utan genereras slumpmässigt i klienten (din webbläsare), är resten av koden vad som kommer att användas i förslaget som definieras i denna artikelserie.
Nästa artikel i den här serien förklarar hur man definierar CSS-stilar för att ge HTML-koden som fungerar som en behållare för grafiken ett utseende SVG för att representera tillståndet för de sensorer som är anslutna till Internet of Things (IoT).
1 kommentar