DD2-monitor/doc/dd2-monitoring.tex

440 lines
14 KiB
TeX
Raw Normal View History

2018-12-21 03:53:18 +11:00
\documentclass[a4paper,11pt]{article}
2018-12-09 00:35:45 +11:00
% \listfiles % pour le debug
2018-12-09 00:35:45 +11:00
\usepackage[french]{babel}
2018-12-09 00:35:45 +11:00
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
% XXX \usepackage{lipsum}
\usepackage{makeidx}
2018-12-21 03:53:18 +11:00
\usepackage{listings}
2018-12-09 00:35:45 +11:00
% \usepackage{color}
% \usepackage{url}
\usepackage{xspace}
\usepackage[verbose]{layout}
\makeindex
% \setlength{\parskip}{0.16cm plus 0.16cm}
2018-12-10 08:11:20 +11:00
2018-12-09 00:35:45 +11:00
% -------------------------------------------------------------------
\title{DD2 Monitoring}
\author{tTh}
\begin{document}
\maketitle
2018-12-10 08:11:20 +11:00
\pagebreak
2018-12-09 00:35:45 +11:00
% -------------------------------------------------------------------
\section{Introduction}
Dans le cadre du futur projet \textsl{phytotron}\index{phytotron},
nous aurons besoin d'un
système de surveillance de divers paramêtres, du genre la température
et l'humidité de l'air ambiant ou de l'enceinte thermostatée.
2018-12-09 00:35:45 +11:00
2018-12-14 05:19:24 +11:00
Et comme nous sommes au Tetalab, nous allons essayer d'en faire le plus
2018-12-09 00:35:45 +11:00
possible nous même, tant pour l'aspect didactique que pour la possible
ré-utilisation de la chose dans un contexte artistique comme nous
arrivons parfois à le faire.
2018-12-09 00:35:45 +11:00
La première étape sera donc la mise au point d'un \textsl{cadriciel}
permettant d'essayer diverses options en se basant sur une conception
modulaire de l'ensemble.
Les valeurs à mesurer étant de diverses natures, nous aurons l'occasion
de découvrir plein de capteurs différents : température, humidité,
\texttt{pH}, transparence, lumière, vibrations\dots
2018-12-09 00:35:45 +11:00
% \setlength{\parskip}{0.01cm plus 0.01cm}
2019-01-28 23:25:13 +11:00
\tableofcontents
% \setlength{\parskip}{0.16cm plus 0.16cm}
2019-01-28 23:25:13 +11:00
\vspace{4cm}
2019-01-28 23:25:13 +11:00
Bonne lecture.
2018-12-09 00:35:45 +11:00
% -------------------------------------------------------------------
2019-02-21 02:12:15 +11:00
% ===================================================================
2018-12-09 00:35:45 +11:00
2019-01-28 23:25:13 +11:00
\pagebreak
2018-12-10 08:11:20 +11:00
\section{Présentation générale}
2018-12-09 00:35:45 +11:00
2018-12-10 08:11:20 +11:00
\subsection{Capteurs} \index{capteurs}
2018-12-09 00:35:45 +11:00
2019-01-28 00:42:44 +11:00
Actuellement nous disposons d'un capteur température et
humidité, le
\texttt{RDing} \texttt{TEMPERHUM1V1.2}{} qui
semble un peu étrange à interpeller, et qui sera destiné à mesurer
2019-01-28 00:42:44 +11:00
l'ambiance météo du Double Dragon\footnote{Pas de mauvais esprit, merci...},
l'influence humaine n'étant pas à négliger en cas d'afflux du public..
2018-12-10 08:11:20 +11:00
2019-01-13 04:05:28 +11:00
Par la suite, nous pourrons récupérer
(par liaison série, cf page \pageref{serial})
2019-01-28 00:42:44 +11:00
des données diverses en provenance de l'automate de contrôle de l'enceinte.
Cet automate\index{automate} est décrit page \pageref{automate}.
2019-01-28 00:42:44 +11:00
Le premier capteur de température sélectionné est le \textsc{LM35}\index{LM35}
qui fournit en sortie une tension linéairement proportionnle à
la température. Ils seront connectés sur l'automate qui s'en
servira pour la régulation thermostatique.
Il nous reste à choisir d'autres capteurs pour d'autres métriques :
2019-02-07 09:01:48 +11:00
humidité, lumière, vibrations, perturbations psychiques\dots
2019-01-28 00:42:44 +11:00
2019-01-13 04:05:28 +11:00
Notre dd2monitor
devrait donc aussi être capable d'envoyer des alertes en cas de souci,
2019-02-07 09:01:48 +11:00
par exemple si des algues\footnote{Ou des pleurotes, ou des morilles...}
tentent de s'échapper.
2018-12-09 00:35:45 +11:00
\subsection{Stockage}
Pour entreposer toutes ces valeurs numériques, il existe plusieurs
2018-12-11 21:52:25 +11:00
choix, et nous allons en évaluer quelques uns :
2019-01-05 10:19:12 +11:00
2019-02-21 02:12:15 +11:00
\texttt{flatfile}\index{flatfile} (page \pageref{flatfile}),
2019-01-04 03:05:55 +11:00
\texttt{rrdb}\index{rrdb} (page \pageref{rrdb}),
2019-01-05 10:19:12 +11:00
\texttt{influxdb}\index{Influxdb} (page \pageref{influxdb}),
\texttt{gnocchi}\index{Gnocchi} (page \pageref{gnocchi})
2019-01-28 23:25:13 +11:00
\texttt{Sqlite}\index{sqlite} (page \pageref{sqlite})
2019-01-14 07:54:57 +11:00
La représentation interne des valeurs reste à définir pour
la plupart d'entre elles.
\subsection{Affichage}
Nous allons laisser un petit bac-à-sable pour Fred Fermion\index{nodejs},
2019-01-14 07:54:57 +11:00
qui nous tartine les oreilles depuis bien trop longtemps avec son machin.js.
2018-12-09 00:35:45 +11:00
2018-12-12 00:33:16 +11:00
Mais sachez déja que l'automate sera équipé d'un minitel, pourquoi ne
2019-01-28 00:42:44 +11:00
pas en mettre un second sur le monitoring ? Après tout, un peu
d'eyecandy\index{eyecandy} ne peut pas faire de mal.
C'est expliqué à la page \pageref{eyecandy}\index{curses}.
2018-12-12 00:33:16 +11:00
2018-12-09 00:35:45 +11:00
% -------------------------------------------------------------------
2019-02-21 02:12:15 +11:00
% ===================================================================
% nouveau 2019-02-22
\input{automate}
% ===================================================================
2018-12-10 08:11:20 +11:00
\section{Outils}
\subsection{Simulations}
Bien entendu, mettre au point un système de monitoring pour un futur
phytotron pose un problème : d'où viennent les premières mesures ?
C'est pour ça qu'il y a déja un générateur de \textit{fake-values} qui
ne demande qu'à grandir.
2018-12-30 03:45:31 +11:00
Nous avons également un générateur de nombres divers et incohérents
qui envoie des quadruplets d'entiers 10 bits précédés d'un caractere
de bonne efficacité.
2019-02-21 02:12:15 +11:00
% -------------------------------------------------------------------
2018-12-14 05:48:45 +11:00
\subsection{Exemples}
2019-01-14 07:54:57 +11:00
\textsf{Promis, on va en mettre ! Dès que ça marche\dots}
2018-12-14 05:48:45 +11:00
2019-01-14 07:54:57 +11:00
Un premier exemple avec rrdb en page \pageref{rrdb}.
2019-02-07 09:01:48 +11:00
Le second cause des premiers essais du LM35\index{LM35},
capteur de
température analogique branché sur un Arduino Mega et relié
par un port série (page \pageref{serialcode}).
2019-01-04 03:05:55 +11:00
2019-01-28 00:42:44 +11:00
Pour continuer dans une démarche disruptive, des outils
avancés de visualisation sont proposés dans la rubrique
\ref{eyecandy} qui parle de \texttt{vt100}\label{vt100}.
2019-02-21 02:12:15 +11:00
% -------------------------------------------------------------------
2019-01-28 00:42:44 +11:00
\subsection{Analyses}
2019-01-14 07:54:57 +11:00
\textsf{Bla bla bla\dots Corrélations, Gnuplot\index{gnuplot}, toussa\dots}
2018-12-14 05:48:45 +11:00
Peut-être demander à Schmod777 des références de
2019-01-14 07:54:57 +11:00
documents bourbakistes ? J'ai entendu parler dans \textsc{irc}
de choses étranges, comme ça :
\textsl{<schmod777> s/booz/booze pour la courbe qui majore les autres en moyenne serait
d'une criante justesse scientifique ;)}
2019-01-28 00:42:44 +11:00
Ce qui donne quand même à réfléchir. À se demander quel savoir
allons-nous pouvoir déduire de ces\footnote{non, c'est pas du bigdata.}
2019-01-14 07:54:57 +11:00
chiffres improbables.
(Re-)Découvrir les lois de l'inertie thermique ?
2019-01-17 20:57:12 +11:00
Générer des formes d'ondes spatialisables ?
Déplacer des petites \textit{bubulles} colorées ?
Une histoire pour la section \pageref{detournements} ?
2019-01-14 07:54:57 +11:00
2019-02-21 02:12:15 +11:00
% -------------------------------------------------------------------
2019-01-14 07:54:57 +11:00
\subsection{Archivage} \index{archivage} \label{archivage}
2019-02-07 09:01:48 +11:00
\textsf{Conserver la mémoire de nos échecs.}
2019-01-28 23:25:13 +11:00
2019-01-14 07:54:57 +11:00
La création de cet outil de surveillance est un long parcours
pavé d'essais et d'erreurs. Tout cela peut générer beaucoup
de données. À titre d'exemple, la capture de température des
premier essais sort environ 800 Ko par jour.
99.99\% de ces chiffres sont inutiles, mais il peut arriver
qu'on désire conserver l'historique d'une
expérience réussie\footnote{En fait, c'est comme ça que la science existe}
ou d'un
\textit{epicfail\footnote{En fait, c'est comme ça que la science avance}}.
Nous devons donc rencontrer quelqu'un qui maitrise cette partie
2019-01-28 00:42:44 +11:00
de la mouvance détournementale de l'espionnage.
Je pense que Yaya\index{Yaya} pourra nous éclairer de ses lumières,
si on lui demande gentiment.
2019-01-14 07:54:57 +11:00
% -------------------------------------------------------------------
2019-02-21 02:12:15 +11:00
\subsection{Affichage}\index{affichage}
Pour commencer presque simple, un exemple d'affichage avec
Gnuplot\index{gnuplot} d'un fichier plat
2019-02-21 02:12:15 +11:00
de température (décrit page \pageref{foo.dat}) :
\begin{verbatim}
DATAFILE="foo.dat"
IMAGE="graphe.png"
gnuplot << __EOC__
set term png size 4200,640
set output "${IMAGE}"
set grid
set title "Temperature dans le Double Dragon 2"
set xdata time
set timefmt "%s"
set format x "%d, %H:%M:%S"
set yrange [ 0.0 : 30.0]
plot "${DATAFILE}" using 1:2 title " foo" with lines, \
"${DATAFILE}" using 1:3 title " bar" with lines, \
"${DATAFILE}" using 1:4 title "quux" with lines, \
"${DATAFILE}" using 1:5 title "booz" with lines
__EOC__
\end{verbatim}
Prochainement, dès que le premier prototype matériel fournira des
données, une tentative de visualisation animée sera faite avec
POVray\index{POV}.
2019-02-21 02:12:15 +11:00
% ===================================================================
\section{Configuration} \index{configuration} \label{configuration}
2019-01-14 07:54:57 +11:00
Pour adapter cet outil de surveillance aux variations du monde réel,
nous devons nous-même lui décrire ce monde. Une description qui se
fera avec des lignes de la forme '\texttt{input\_device s /dev/ttyACM0}'
qui représentent des tuples
\textit{clef-type-valeur}\footnote{Laissons les canards tranquilles.}
2019-01-28 23:25:13 +11:00
de choses diverses.
2019-01-14 07:54:57 +11:00
2019-01-28 23:25:13 +11:00
La syntaxe n'est pas encore vraiment fixée, mais un fichier exemple est
disponible pour des explication plus récentes, donc plus en
2019-01-28 00:42:44 +11:00
rapport avec la réalité du code. En voici un extrait :
\begin{verbatim}
# serial input from the control cpu
input_device s /dev/ttyACM0
input_speed i 9600
# --------------------------------------------------
# some values for the eyecandy displays
eyecandy_banner s hacked by tTh
\end{verbatim}
2018-12-14 05:19:24 +11:00
2019-01-28 23:25:13 +11:00
Certains de ces paramètres pourront être surchargé par des options
de la ligne de commande\index{cli} ou des variables d'environnement.
2019-02-21 02:12:15 +11:00
% ===================================================================
\section{Flatfile} \label{flatfile}
Parfois, un fichier à plat est bien pratique, parce qu'il est facilement
machinable avec des outils comme Awk\index{Awk}.
Après tout, un \textsl{timestamp}\index{timestamp} et quelques valeurs
numériques peuvent suffire à beaucoup de \textsl{usecases} de la
vie courante.
Voici un exemple, un format\label{foo.dat} d'enregistrement de
température facilement exploitable avec Awk ou Gnuplot :
2019-02-21 02:12:15 +11:00
\begin{verbatim}
tth@phytotron:~/DD2-monitor/doc$ tail -3 ../serial/foo.dat
1550673785 20.215054 20.107527 20.107527 20.215054
1550673811 20.215054 20.215054 20.215054 20.215054
1550673836 20.215054 20.107527 20.215054 20.215054
\end{verbatim}
2019-01-28 23:25:13 +11:00
2019-01-04 02:41:02 +11:00
% -------------------------------------------------------------------
\section{RRDB} \label{rrdb}
Première tentative d'utilisation le lendemain du premier apéro 2019
du Tetalab\footnote{Jean-Yves, je vous demande de vous calmer !}.
2018-12-14 05:48:45 +11:00
2019-01-05 05:56:30 +11:00
Je suis parti sur quelques scripts shell, pour créer, mettre à jour et
2019-01-04 03:05:55 +11:00
analyser les enregistrements d'une valeur de type \textsc{gauge}.
\subsection{Create}
2019-01-05 10:19:12 +11:00
2019-01-04 03:05:55 +11:00
\begin{lstlisting}
#!/bin/bash
source ./commun.sh
starttime=$(date +'%s')
echo creating $RRDB at ${starttime}s since epoch
rrdtool create $RRDB \
--start $starttime \
--step 60 \
DS:value:GAUGE:150:0:10 \
RRA:AVERAGE:0.5:1:60
\end{lstlisting}
2019-01-05 05:56:30 +11:00
\subsection{Update} \index{rrdtool}
Une fois la base créée, il faut bien la remplir.
2019-01-05 10:19:12 +11:00
Dans cet exemple, nous allons utiliser le \textit{load}
de notre Linux.
2019-01-05 05:56:30 +11:00
2019-01-04 03:05:55 +11:00
\begin{lstlisting}
#!/bin/bash
source ./commun.sh
ctime=$(date +'%s')
value=$(cut -d ' ' -f 1 /proc/loadavg)
# inject value in the rrdb file
rrdtool update $RRDB ${ctime}:${value}
\end{lstlisting}
\subsection{Analyze}
2019-01-05 05:56:30 +11:00
Nous allons essayer d'exploiter les données dûrement acquises
pendant les heures qui précèdent\dots
2019-01-04 03:05:55 +11:00
\begin{lstlisting}
#!/bin/bash
source ./commun.sh
tmpf="somevalues.dat"
rrdtool fetch $RRDB LAST |
tr -d ':' |
awk '
(!/nan/ && NF==2) { print $1, $2 }
' \
> ${tmpf}
# as an example, we are gnuploting our datas
gnuplot << __EOC__
set term png size 800,600
set output "graphe.png"
set grid
plot "${tmpf}" with lines
__EOC__
rm ${tmpf}
\end{lstlisting}
2019-01-05 05:56:30 +11:00
Il semble bien que l'utilisation de \texttt{fetch} ne soit pas
2019-01-14 07:54:57 +11:00
vraiment prévue pour ça, donc j'en arrive à la conclusion que
quelque chose m'échappe.
2018-12-14 05:48:45 +11:00
2019-01-28 23:25:13 +11:00
On va laisser ça en suspens pour le moment.
2018-12-13 06:07:49 +11:00
% -------------------------------------------------------------------
2018-12-14 05:19:24 +11:00
\section{InfluxDB} \label{influxdb}
2019-01-04 02:41:02 +11:00
La communication avec la bédédé se fait \textit{over HTTP}, un peu
comme tous ces trucs de d'jeunz d'aujourd'hui\dots
2019-01-04 03:05:55 +11:00
Au programme : écriture d'un injecteur en Perl\index{Perl}, en suivant
plus ou moins l'exemple de rrdb..
2018-12-14 05:19:24 +11:00
2019-01-05 10:19:12 +11:00
Ceci dit, en Debian stable, on n'a que la version 1.0, qui ne
correspond plus trop à l'actualité. Et la \textit{current} semble
2019-01-13 04:05:28 +11:00
trop fatiguante à compiler pour ce soir, ni même pour ce week-end.
2019-01-05 10:19:12 +11:00
% -------------------------------------------------------------------
\section{Gnocchi} \label{gnocchi} \index{Gnocchi}
\texttt{pip install gnocchi[postgresql,ceph,keystone]}, finalement,
2019-01-13 04:05:28 +11:00
çe ne me donne pas trop envie. C'est du genre \textit{usinagaz}.
2018-12-14 05:19:24 +11:00
% -------------------------------------------------------------------
\section{Sqlite} \index{sqlite} \label{sqlite}
2019-01-28 23:25:13 +11:00
\textsf{À regarder de près}
2019-01-28 00:42:44 +11:00
Est-il possible de traiter des \textit{time series} en SQL\index{SQL} ?
2019-01-28 23:25:13 +11:00
Peut-on utiliser Sqlite depuis un programme en Perl\index{Perl} ?
Faut-il commencer à trouver un \textit{usecase} crédible ?
NodeJs\index{nodejs} peut-il lire du Sqlite ?
2019-01-28 00:42:44 +11:00
2018-12-14 05:19:24 +11:00
% -------------------------------------------------------------------
\input{serial}
2018-12-10 08:11:20 +11:00
% -------------------------------------------------------------------
2019-01-17 20:57:12 +11:00
\section{Détournements} \label{detournements}
2018-12-10 08:11:20 +11:00
2019-01-28 23:25:13 +11:00
Dans le contexte myryssien\index{Myrys}, il est évident que l'aspect
artistique\index{Art}
doit être dès le départ pris en compte.
Les possibilités ne seront limitées que par votre manque d'imagination.
2019-01-13 04:05:28 +11:00
Si vous voulez un petit exemple, imaginez des courbes de température
2019-01-28 23:25:13 +11:00
qui pilotent un \texttt{uGen} de Chuck\index{Chuck} ou des algues dont
les pulses lumineux envoie du \texttt{cv/gate} en temps réel.
2019-01-28 00:42:44 +11:00
\subsection{Variante sonore}
Un peu de \texttt{awk} pipé dans du \texttt{sox} ?
2019-01-28 23:25:13 +11:00
Voire même l'occasion (ou un bon prétexte) de résoudre ce problème
de saut de phase qui me tracasse depuis des mois ?
2019-01-28 00:42:44 +11:00
\subsection{Eye candy}\index{eyecandy}\label{eyecandy}
Pour maximiser l'impact visuel, il sera convenant de sortir du
cadre pseudo-moderne des omniprésents écrans de ces
smartphones\footnote{Quand les téléphones étaient attachés par
un fil, les humains étaient libres.} qui nous lavent le cerveau.
Sortons donc du contexte pixeliste et revenons aux fondamentaux :
2019-01-28 23:25:13 +11:00
le caractère\index{ncurses},
avec toute la simplicité de son concept sémantique.
2018-12-10 08:11:20 +11:00
% -------------------------------------------------------------------
2019-01-14 07:54:57 +11:00
\section{Conclusion} \label{conclusion} \index{conclusion}
2018-12-10 08:11:20 +11:00
En fait, tout reste à faire. Mais ça peut être un beau projet
2019-02-07 09:01:48 +11:00
aux implications et usages multiples. À condition de bien
faire les choses.
2019-01-14 07:54:57 +11:00
Un couteau suisse de la capture du monde réel, un point pivot
2019-01-23 03:23:11 +11:00
de nos diverses interprétations de
l'univers\footnote{non, la terre n'est pas plate} et des interactions
2019-01-14 07:54:57 +11:00
étranges entre des paramètres sans relation clairement definie.
2018-12-10 08:11:20 +11:00
% -------------------------------------------------------------------
\setlength{\parskip}{0.05cm plus 0.05cm}
2019-02-07 09:01:48 +11:00
% \pagebreak \tableofcontents
2018-12-09 00:35:45 +11:00
\printindex
2018-12-09 00:35:45 +11:00
\end{document}