DD2-monitor/doc/dd2-monitoring.tex

283 lines
8.4 KiB
TeX
Raw Normal View History

2018-12-08 14:35:45 +01:00
2018-12-20 17:53:18 +01:00
\documentclass[a4paper,11pt]{article}
2018-12-08 14:35:45 +01:00
% \listfiles % pour le debug
2018-12-08 14:35:45 +01:00
\usepackage[french]{babel}
2018-12-08 14:35:45 +01:00
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
% XXX \usepackage{lipsum}
\usepackage{makeidx}
2018-12-20 17:53:18 +01:00
\usepackage{listings}
2018-12-08 14:35:45 +01:00
% \usepackage{color}
% \usepackage{url}
\usepackage{xspace}
\usepackage[verbose]{layout}
\makeindex
\setlength{\parskip}{0.25cm plus 0.25cm}
2018-12-09 22:11:20 +01:00
2018-12-08 14:35:45 +01:00
% -------------------------------------------------------------------
\title{DD2 Monitoring}
\author{tTh}
\begin{document}
\maketitle
2018-12-09 22:11:20 +01:00
\pagebreak
2018-12-08 14:35:45 +01: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-08 14:35:45 +01:00
2018-12-13 19:19:24 +01:00
Et comme nous sommes au Tetalab, nous allons essayer d'en faire le plus
2018-12-08 14:35:45 +01: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-08 14:35:45 +01: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-08 14:35:45 +01:00
% -------------------------------------------------------------------
2018-12-09 22:11:20 +01:00
\section{Présentation générale}
2018-12-08 14:35:45 +01:00
2018-12-09 22:11:20 +01:00
\subsection{Capteurs} \index{capteurs}
2018-12-08 14:35:45 +01:00
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...}.
2018-12-09 22:11:20 +01:00
2019-01-12 18:05:28 +01:00
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.
2018-12-08 14:35:45 +01:00
\subsection{Stockage}
Pour entreposer toutes ces valeurs numériques, il existe plusieurs
2018-12-11 11:52:25 +01:00
choix, et nous allons en évaluer quelques uns :
2019-01-05 00:19:12 +01:00
2019-01-03 17:05:55 +01:00
\texttt{rrdb}\index{rrdb} (page \pageref{rrdb}),
2019-01-05 00:19:12 +01:00
\texttt{influxdb}\index{Influxdb} (page \pageref{influxdb}),
\texttt{gnocchi}\index{Gnocchi} (page \pageref{gnocchi})
\subsection{Affichage}
Nous allons laisser un petit bac-à-sable pour Fred Fermion\index{nodejs},
qui nous tartine les oreilles depuis trop longtemps avec son machinjs.
2018-12-08 14:35:45 +01:00
2018-12-11 14:33:16 +01:00
Mais sachez déja que l'automate sera équipé d'un minitel, pourquoi ne
pas en mettre un second sur le monitoring ?
2018-12-08 14:35:45 +01:00
% -------------------------------------------------------------------
2018-12-09 22:11:20 +01: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-29 17:45:31 +01: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é.
2018-12-13 19:48:45 +01:00
\subsection{Exemples}
2018-12-20 17:53:18 +01:00
Promis, on va en mettre ! Dès que ça marche\dots
2018-12-13 19:48:45 +01:00
2019-01-03 17:05:55 +01:00
Premier exemple avec rrdb en page \pageref{rrdb}.
\subsection{Analyses}
2019-01-12 18:05:28 +01:00
Bla bla bla\dots Corrélations, Gnuplot\index{gnuplot}, toussa\dots
2018-12-13 19:48:45 +01:00
Peut-être demander à Schmod777 des références de
2018-12-13 19:19:24 +01:00
documents bourbakistes ?
2019-01-03 16:41:02 +01: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-13 19:48:45 +01:00
2019-01-04 19:56:30 +01:00
Je suis parti sur quelques scripts shell, pour créer, mettre à jour et
2019-01-03 17:05:55 +01:00
analyser les enregistrements d'une valeur de type \textsc{gauge}.
\subsection{Create}
2019-01-05 00:19:12 +01:00
2019-01-03 17:05:55 +01: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-04 19:56:30 +01:00
\subsection{Update} \index{rrdtool}
Une fois la base créée, il faut bien la remplir.
2019-01-05 00:19:12 +01:00
Dans cet exemple, nous allons utiliser le \textit{load}
de notre Linux.
2019-01-04 19:56:30 +01:00
2019-01-03 17:05:55 +01: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-04 19:56:30 +01:00
Nous allons essayer d'exploiter les données dûrement acquises
pendant les heures qui précèdent\dots
2019-01-03 17:05:55 +01: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-04 19:56:30 +01:00
Il semble bien que l'utilisation de \texttt{fetch} ne soit pas
vraiment prévue pour ça...
2018-12-13 19:48:45 +01:00
2018-12-12 20:07:49 +01:00
% -------------------------------------------------------------------
2018-12-13 19:19:24 +01:00
\section{InfluxDB} \label{influxdb}
2019-01-03 16:41:02 +01: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-03 17:05:55 +01:00
Au programme : écriture d'un injecteur en Perl\index{Perl}, en suivant
plus ou moins l'exemple de rrdb..
2018-12-13 19:19:24 +01:00
2019-01-05 00:19:12 +01: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} est
2019-01-12 18:05:28 +01:00
trop fatiguante à compiler pour ce soir, ni même pour ce week-end.
2019-01-05 00:19:12 +01:00
% -------------------------------------------------------------------
\section{Gnocchi} \label{gnocchi} \index{Gnocchi}
\texttt{pip install gnocchi[postgresql,ceph,keystone]}, finalement,
2019-01-12 18:05:28 +01:00
çe ne me donne pas trop envie. C'est du genre \textit{usinagaz}.
2018-12-13 19:19:24 +01:00
% -------------------------------------------------------------------
2019-01-04 19:56:30 +01:00
\section{Serial coms} \index{serial} \label{serial}
2018-12-13 19:19:24 +01:00
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
2018-12-29 17:45:31 +01:00
auxiliaire\footnote{Il y en a 4 sur le mega 2560} de celle-ci.
2019-01-12 18:05:28 +01:00
\subsection{Un gros souci}
2018-12-20 17:53:18 +01:00
\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
2019-01-04 19:56:30 +01:00
rien ne marche. L'année 2019 va commencer sur du vaudou programming%
\footnote {aka shotgun debugging.}.
2018-12-09 22:11:20 +01:00
2018-12-29 17:45:31 +01:00
\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.
2019-01-03 16:41:02 +01:00
Laquelle étape est une tentative d'utilisation de \texttt{select(2)},
dans l'objectif de pouvoir gérer nous-même le \textit{timeout},
2019-01-04 19:56:30 +01:00
laquelle tentative n'est pas du tout concluante.
2019-01-03 16:41:02 +01:00
2019-01-12 18:05:28 +01:00
\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}.
2018-12-09 22:11:20 +01:00
% -------------------------------------------------------------------
\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.
2019-01-12 18:05:28 +01:00
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.
Le tout en n'utilisant que des circuits\index{ampli op} analogiques.
2018-12-09 22:11:20 +01:00
% -------------------------------------------------------------------
\section{Conclusion}\label{conclusion}\index{conclusion}
En fait, tout reste à faire. Mais ça peut être un beau projet
aux implications et usages multiples.
2018-12-09 22:11:20 +01:00
% -------------------------------------------------------------------
\setlength{\parskip}{0.05cm plus 0.05cm}
2018-12-08 14:35:45 +01:00
\pagebreak \tableofcontents
\printindex
2018-12-08 14:35:45 +01:00
\end{document}