345 lines
11 KiB
TeX
345 lines
11 KiB
TeX
|
|
\documentclass[a4paper,11pt]{article}
|
|
|
|
% \listfiles % pour le debug
|
|
|
|
\usepackage[french]{babel}
|
|
\usepackage[utf8]{inputenc}
|
|
\usepackage[T1]{fontenc}
|
|
% XXX \usepackage{lipsum}
|
|
\usepackage{makeidx}
|
|
\usepackage{listings}
|
|
% \usepackage{color}
|
|
% \usepackage{url}
|
|
\usepackage{xspace}
|
|
\usepackage[verbose]{layout}
|
|
|
|
\makeindex
|
|
\setlength{\parskip}{0.20cm plus 0.20cm}
|
|
|
|
% -------------------------------------------------------------------
|
|
\title{DD2 Monitoring}
|
|
\author{tTh}
|
|
|
|
\begin{document}
|
|
\maketitle
|
|
|
|
\pagebreak
|
|
|
|
% -------------------------------------------------------------------
|
|
|
|
\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.
|
|
|
|
Et comme nous sommes au Tetalab, nous allons essayer d'en faire le plus
|
|
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.
|
|
|
|
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
|
|
|
|
% -------------------------------------------------------------------
|
|
|
|
\section{Présentation générale}
|
|
|
|
\subsection{Capteurs} \index{capteurs}
|
|
|
|
Actuellement nous disposons d'un \texttt{RDing TEMPERHUM1V1.2}{} qui
|
|
semble un peu étrange à interpeller, et qui sera destiné à mesurer
|
|
l'ambiance météo du DD2\footnote{Pas de mauvais esprit, merci...}.
|
|
|
|
Par la suite, nous pourrons récupérer
|
|
(par liaison série, cf page \pageref{serial})
|
|
des données en provenance de l'automate de contrôle de l'enceinte.
|
|
Notre dd2monitor
|
|
devrait donc aussi être capable d'envoyer des alertes en cas de souci,
|
|
par exemple si des algues\footnote{ou des pleurotes.} tentent de s'échapper.
|
|
|
|
|
|
\subsection{Stockage}
|
|
|
|
Pour entreposer toutes ces valeurs numériques, il existe plusieurs
|
|
choix, et nous allons en évaluer quelques uns :
|
|
|
|
\texttt{rrdb}\index{rrdb} (page \pageref{rrdb}),
|
|
\texttt{influxdb}\index{Influxdb} (page \pageref{influxdb}),
|
|
\texttt{gnocchi}\index{Gnocchi} (page \pageref{gnocchi})
|
|
\texttt{sqlite}\index{sqlite} (page \pageref{sqlite})
|
|
|
|
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},
|
|
qui nous tartine les oreilles depuis bien trop longtemps avec son machin.js.
|
|
|
|
Mais sachez déja que l'automate sera équipé d'un minitel, pourquoi ne
|
|
pas en mettre un second sur le monitoring ?
|
|
|
|
% -------------------------------------------------------------------
|
|
\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.
|
|
|
|
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é.
|
|
|
|
|
|
\subsection{Exemples}
|
|
|
|
\textsf{Promis, on va en mettre ! Dès que ça marche\dots}
|
|
|
|
Un premier exemple avec rrdb en page \pageref{rrdb}.
|
|
Le second cause des premiers essais du LM35, capteur de
|
|
température analogique branché sur un Arduino et relié
|
|
par un port série (page \pageref{serialcode}).
|
|
|
|
\subsection{Analyses}
|
|
|
|
\textsf{Bla bla bla\dots Corrélations, Gnuplot\index{gnuplot}, toussa\dots}
|
|
|
|
Peut-être demander à Schmod777 des références de
|
|
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 ;)}
|
|
|
|
Ce qui donne qunad même à réfléchir. À se demander quel savoir
|
|
allons-nous pouvoir déduire de ces\footnote{non, c'est pas du bigdata.}
|
|
chiffres improbables.
|
|
(Re-)Découvrir les lois de l'inertie thermique ?
|
|
|
|
|
|
\subsection{Archivage} \index{archivage} \label{archivage}
|
|
|
|
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
|
|
de la mouvance détournementale de l'espionnage. Yaya\index{Yaya} ?
|
|
|
|
% -------------------------------------------------------------------
|
|
|
|
\section{Configuration} \index{configuration} \label{configuration}
|
|
|
|
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.}
|
|
de.
|
|
|
|
La syntaxe n'est pas encore fixée, mais un fichier exemple est
|
|
disponible pour des explication plus récentes, donc plus en
|
|
rapport avec la réalité du code.
|
|
|
|
% -------------------------------------------------------------------
|
|
\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 !}.
|
|
|
|
Je suis parti sur quelques scripts shell, pour créer, mettre à jour et
|
|
analyser les enregistrements d'une valeur de type \textsc{gauge}.
|
|
|
|
\subsection{Create}
|
|
|
|
\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}
|
|
|
|
\subsection{Update} \index{rrdtool}
|
|
|
|
Une fois la base créée, il faut bien la remplir.
|
|
Dans cet exemple, nous allons utiliser le \textit{load}
|
|
de notre Linux.
|
|
|
|
\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}
|
|
|
|
Nous allons essayer d'exploiter les données dûrement acquises
|
|
pendant les heures qui précèdent\dots
|
|
|
|
\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}
|
|
|
|
Il semble bien que l'utilisation de \texttt{fetch} ne soit pas
|
|
vraiment prévue pour ça, donc j'en arrive à la conclusion que
|
|
quelque chose m'échappe.
|
|
|
|
% -------------------------------------------------------------------
|
|
|
|
\section{InfluxDB} \label{influxdb}
|
|
|
|
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
|
|
|
|
Au programme : écriture d'un injecteur en Perl\index{Perl}, en suivant
|
|
plus ou moins l'exemple de rrdb..
|
|
|
|
Ceci dit, en Debian stable, on n'a que la version 1.0, qui ne
|
|
correspond plus trop à l'actualité. Et la \textit{current} est
|
|
trop fatiguante à compiler pour ce soir, ni même pour ce week-end.
|
|
|
|
% -------------------------------------------------------------------
|
|
|
|
\section{Gnocchi} \label{gnocchi} \index{Gnocchi}
|
|
|
|
\texttt{pip install gnocchi[postgresql,ceph,keystone]}, finalement,
|
|
çe ne me donne pas trop envie. C'est du genre \textit{usinagaz}.
|
|
|
|
% -------------------------------------------------------------------
|
|
\section{Sqlite} \index{sqlite} \label{sqlite}
|
|
|
|
\subsection{À regarder de près}
|
|
|
|
% -------------------------------------------------------------------
|
|
|
|
\section{Serial coms} \index{serial} \label{serial}
|
|
|
|
Il va y avoir deux liaisons série entre l'automate et le monitoring.
|
|
La première, que nous allons juste entrevoir, passera par le port
|
|
USB de la carte Arduino. La seconde passera par un port série
|
|
auxiliaire\footnote{Il y en a 4 sur le mega 2560} de celle-ci.
|
|
|
|
\subsection{Un gros souci}
|
|
|
|
\begin{lstlisting}
|
|
tcgetattr(uart0, &options);
|
|
options.c_cflag = baudbits | CS8 | CLOCAL | CREAD;
|
|
options.c_iflag = IGNPAR;
|
|
options.c_oflag = 0;
|
|
options.c_lflag = 0;
|
|
tcflush(uart0, TCIFLUSH);
|
|
tcsetattr(uart0, TCSANOW, &options);
|
|
\end{lstlisting}
|
|
|
|
Et en fait, le \texttt{read} sur le \textsl{fd} du serial device
|
|
n'est pas bloquant, \texttt{perror} annonce \emph{success}, mais
|
|
rien ne marche. L'année 2019 va commencer sur du vaudou programming%
|
|
\footnote {aka shotgun debugging.}.
|
|
|
|
\textit{29 décembre 2018} : le petit grain de magie\index{magie}
|
|
est très simple à mettre en oeuvre, mais
|
|
très difficle à spotter dans le gazillion d'options. Il semblerait
|
|
que mettre \texttt{options.c\_cc[VMIN]} à 1 permet d'avancer vers
|
|
l'étape suivante.
|
|
|
|
Laquelle étape est une tentative d'utilisation de \texttt{select(2)},
|
|
dans l'objectif de pouvoir gérer nous-même le \textit{timeout},
|
|
laquelle tentative n'est pas du tout concluante.
|
|
|
|
\subsection{Protocole} \index{protocole} \label{serialprotocol}
|
|
|
|
L'automate va avoir plusieurs types de données à envoyer.
|
|
Nous allons donc transférer ces valeurs sous forme de ligne
|
|
de texte commençant par un caractère clef (par exemple T pour
|
|
les températures) et se terminant par un \textit{newline}.
|
|
|
|
|
|
\subsection{Un peu de code} \label{serialcode}
|
|
|
|
|
|
% -------------------------------------------------------------------
|
|
|
|
\section{Détournements}
|
|
|
|
Dans le contexte myryssien, il est évident que l'aspect artistique
|
|
doit être dès le départ pris en compte.
|
|
Les possibilités ne seront limitées que par votre manque d'imagination.
|
|
|
|
Si vous voulez un petit exemple, imaginez des courbes de température
|
|
qui pilotent un \texttt{uGen} de Chuck\index{chuck} ou des algues dont
|
|
la lumière envoie du \texttt{cv/gate} en temps réel.
|
|
|
|
\subsection{Variante}
|
|
|
|
|
|
% -------------------------------------------------------------------
|
|
|
|
\section{Conclusion} \label{conclusion} \index{conclusion}
|
|
|
|
En fait, tout reste à faire. Mais ça peut être un beau projet
|
|
aux implications et usages multiples.
|
|
|
|
Un couteau suisse de la capture du monde réel, un point pivot
|
|
de nos diverses interprétations du
|
|
monde\footnote{non, la terre n'est pas plate} et des interactions
|
|
étranges entre des paramètres sans relation clairement definie.
|
|
|
|
% -------------------------------------------------------------------
|
|
\setlength{\parskip}{0.05cm plus 0.05cm}
|
|
|
|
\pagebreak \tableofcontents
|
|
|
|
\printindex
|
|
|
|
\end{document}
|
|
|
|
|