Monitoring du Phytotron
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

dd2-monitoring.tex 16KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477
  1. \documentclass[a4paper,11pt]{article}
  2. % \listfiles % pour le debug
  3. \usepackage[french]{babel}
  4. \usepackage[utf8]{inputenc}
  5. \usepackage[T1]{fontenc}
  6. % XXX \usepackage{lipsum}
  7. \usepackage{makeidx}
  8. \usepackage{listings}
  9. % \usepackage{color}
  10. % \usepackage{url}
  11. \usepackage{xspace}
  12. \usepackage[verbose]{layout}
  13. \makeindex
  14. \setlength{\parskip}{0.21cm plus 0.21cm}
  15. % -------------------------------------------------------------------
  16. \title{DD2 Monitoring}
  17. \author{tTh}
  18. \begin{document}
  19. \maketitle
  20. \pagebreak
  21. % -------------------------------------------------------------------
  22. \section{Introduction}
  23. Dans le cadre du futur projet \textsl{phytotron}\index{phytotron},
  24. nous aurons besoin d'un
  25. système de surveillance de divers paramêtres, du genre la température
  26. et l'humidité de l'air ambiant ou de l'enceinte thermostatée.
  27. Et comme nous sommes au Tetalab, nous allons essayer d'en faire le plus
  28. possible nous même, tant pour l'aspect didactique que pour la possible
  29. ré-utilisation de la chose dans un contexte artistique comme nous
  30. arrivons parfois à le faire.
  31. La première étape sera donc la mise au point d'un \textsl{cadriciel}
  32. permettant d'essayer diverses options en se basant sur une conception
  33. modulaire de l'ensemble.
  34. Les valeurs à mesurer étant de diverses natures, nous aurons l'occasion
  35. de découvrir plein de capteurs différents : température, humidité,
  36. \texttt{pH}, transparence, lumière, vibrations\dots
  37. \setlength{\parskip}{0.05cm plus 0.05cm}
  38. \tableofcontents
  39. \setlength{\parskip}{0.16cm plus 0.16cm}
  40. \vspace{5cm}
  41. Bonne lecture.
  42. % -------------------------------------------------------------------
  43. % ===================================================================
  44. \pagebreak
  45. \section{Présentation générale}
  46. \subsection{Capteurs} \index{capteurs}
  47. Actuellement nous disposons d'un capteur température et
  48. humidité, le
  49. \texttt{RDing} \texttt{TEMPERHUM1V1.2}{} qui
  50. semble un peu étrange à interpeller, et qui sera destiné à mesurer
  51. l'ambiance météo du Double Dragon\footnote{Pas de mauvais esprit, merci...},
  52. l'influence humaine n'étant pas à négliger en cas d'afflux du public..
  53. Par la suite, nous pourrons récupérer
  54. (par liaison série, cf page \pageref{serial})
  55. des données diverses en provenance de l'automate de contrôle de l'enceinte.
  56. Le premier capteur de température sélectionné est le \textsc{LM35}\index{LM35}
  57. qui fournit en sortie une tension linéairement proportionnle à
  58. la température. Ils seront connectés sur l'automate qui s'en
  59. servira pour la régulation thermostatique.
  60. Il nous reste à choisir d'autres capteurs pour d'autres métriques :
  61. humidité, lumière, vibrations, perturbations psychiques\dots
  62. Notre dd2monitor
  63. devrait donc aussi être capable d'envoyer des alertes en cas de souci,
  64. par exemple si des algues\footnote{Ou des pleurotes, ou des morilles...}
  65. tentent de s'échapper.
  66. \subsection{Stockage}
  67. Pour entreposer toutes ces valeurs numériques, il existe plusieurs
  68. choix, et nous allons en évaluer quelques uns :
  69. \texttt{flatfile}\index{flatfile} (page \pageref{flatfile}),
  70. \texttt{rrdb}\index{rrdb} (page \pageref{rrdb}),
  71. \texttt{influxdb}\index{Influxdb} (page \pageref{influxdb}),
  72. \texttt{gnocchi}\index{Gnocchi} (page \pageref{gnocchi})
  73. \texttt{Sqlite}\index{sqlite} (page \pageref{sqlite})
  74. La représentation interne des valeurs reste à définir pour
  75. la plupart d'entre elles.
  76. \subsection{Affichage}
  77. Nous allons laisser un petit bac-à-sable pour Fred Fermion\index{nodejs},
  78. qui nous tartine les oreilles depuis bien trop longtemps avec son machin.js.
  79. Mais sachez déja que l'automate sera équipé d'un minitel, pourquoi ne
  80. pas en mettre un second sur le monitoring ? Après tout, un peu
  81. d'eyecandy\index{eyecandy} ne peut pas faire de mal.
  82. C'est expliqué à la page \pageref{eyecandy}\index{curses}.
  83. % -------------------------------------------------------------------
  84. % ===================================================================
  85. \section{Outils}
  86. \subsection{Simulations}
  87. Bien entendu, mettre au point un système de monitoring pour un futur
  88. phytotron pose un problème : d'où viennent les premières mesures ?
  89. C'est pour ça qu'il y a déja un générateur de \textit{fake-values} qui
  90. ne demande qu'à grandir.
  91. Nous avons également un générateur de nombres divers et incohérents
  92. qui envoie des quadruplets d'entiers 10 bits précédés d'un caractere
  93. de bonne efficacité.
  94. % -------------------------------------------------------------------
  95. \subsection{Exemples}
  96. \textsf{Promis, on va en mettre ! Dès que ça marche\dots}
  97. Un premier exemple avec rrdb en page \pageref{rrdb}.
  98. Le second cause des premiers essais du LM35\index{LM35},
  99. capteur de
  100. température analogique branché sur un Arduino Mega et relié
  101. par un port série (page \pageref{serialcode}).
  102. Pour continuer dans une démarche disruptive, des outils
  103. avancés de visualisation sont proposés dans la rubrique
  104. \ref{eyecandy} qui parle de \texttt{vt100}\label{vt100}.
  105. % -------------------------------------------------------------------
  106. \subsection{Analyses}
  107. \textsf{Bla bla bla\dots Corrélations, Gnuplot\index{gnuplot}, toussa\dots}
  108. Peut-être demander à Schmod777 des références de
  109. documents bourbakistes ? J'ai entendu parler dans \textsc{irc}
  110. de choses étranges, comme ça :
  111. \textsl{<schmod777> s/booz/booze pour la courbe qui majore les autres en moyenne serait
  112. d'une criante justesse scientifique ;)}
  113. Ce qui donne quand même à réfléchir. À se demander quel savoir
  114. allons-nous pouvoir déduire de ces\footnote{non, c'est pas du bigdata.}
  115. chiffres improbables.
  116. (Re-)Découvrir les lois de l'inertie thermique ?
  117. Générer des formes d'ondes spatialisables ?
  118. Déplacer des petites \textit{bubulles} colorées ?
  119. Une histoire pour la section \pageref{detournements} ?
  120. % -------------------------------------------------------------------
  121. \subsection{Archivage} \index{archivage} \label{archivage}
  122. \textsf{Conserver la mémoire de nos échecs.}
  123. La création de cet outil de surveillance est un long parcours
  124. pavé d'essais et d'erreurs. Tout cela peut générer beaucoup
  125. de données. À titre d'exemple, la capture de température des
  126. premier essais sort environ 800 Ko par jour.
  127. 99.99\% de ces chiffres sont inutiles, mais il peut arriver
  128. qu'on désire conserver l'historique d'une
  129. expérience réussie\footnote{En fait, c'est comme ça que la science existe}
  130. ou d'un
  131. \textit{epicfail\footnote{En fait, c'est comme ça que la science avance}}.
  132. Nous devons donc rencontrer quelqu'un qui maitrise cette partie
  133. de la mouvance détournementale de l'espionnage.
  134. Je pense que Yaya\index{Yaya} pourra nous éclairer de ses lumières,
  135. si on lui demande gentiment.
  136. % -------------------------------------------------------------------
  137. \subsection{Affichage}\index{affichage}
  138. Un exemple d'affichage avec Gnuplot\index{gnuplot} d'un fichier
  139. de température (décrit page \pageref{foo.dat}) :
  140. \begin{verbatim}
  141. DATAFILE="foo.dat"
  142. IMAGE="graphe.png"
  143. gnuplot << __EOC__
  144. set term png size 4200,640
  145. set output "${IMAGE}"
  146. set grid
  147. set title "Temperature dans le Double Dragon 2"
  148. set xdata time
  149. set timefmt "%s"
  150. set format x "%d, %H:%M:%S"
  151. set yrange [ 0.0 : 30.0]
  152. plot "${DATAFILE}" using 1:2 title " foo" with lines, \
  153. "${DATAFILE}" using 1:3 title " bar" with lines, \
  154. "${DATAFILE}" using 1:4 title "quux" with lines, \
  155. "${DATAFILE}" using 1:5 title "booz" with lines
  156. __EOC__
  157. \end{verbatim}
  158. % ===================================================================
  159. \section{Configuration} \index{configuration} \label{configuration}
  160. Pour adapter cet outil de surveillance aux variations du monde réel,
  161. nous devons nous-même lui décrire ce monde. Une description qui se
  162. fera avec des lignes de la forme '\texttt{input\_device s /dev/ttyACM0}'
  163. qui représentent des tuples
  164. \textit{clef-type-valeur}\footnote{Laissons les canards tranquilles.}
  165. de choses diverses.
  166. La syntaxe n'est pas encore vraiment fixée, mais un fichier exemple est
  167. disponible pour des explication plus récentes, donc plus en
  168. rapport avec la réalité du code. En voici un extrait :
  169. \begin{verbatim}
  170. # serial input from the control cpu
  171. input_device s /dev/ttyACM0
  172. input_speed i 9600
  173. # --------------------------------------------------
  174. # some values for the eyecandy displays
  175. eyecandy_banner s hacked by tTh
  176. \end{verbatim}
  177. Certains de ces paramètres pourront être surchargé par des options
  178. de la ligne de commande\index{cli} ou des variables d'environnement.
  179. % ===================================================================
  180. \section{Flatfile} \label{flatfile}
  181. Parfois, un fichier à plat est bien pratique, parce qu'il est facilement
  182. machinable avec des outils comme Awk\index{Awk}.
  183. Après tout, un \textsl{timestamp}\index{timestamp} et quelques valeurs
  184. numériques peuvent suffire à beaucoup de \textsl{usecases} de la
  185. vie courante.
  186. Voici un exemple, un format\label{foo.dat} d'enregistrement de
  187. température facilement exploitable avec Gnuplot :
  188. \begin{verbatim}
  189. tth@phytotron:~/DD2-monitor/doc$ tail -3 ../serial/foo.dat
  190. 1550673785 20.215054 20.107527 20.107527 20.215054
  191. 1550673811 20.215054 20.215054 20.215054 20.215054
  192. 1550673836 20.215054 20.107527 20.215054 20.215054
  193. \end{verbatim}
  194. Prochainement, dès que le premier prototype matériel fournira des
  195. données, une tentative de visualisation animée sera faite avec
  196. POVray\index{POV}.
  197. % -------------------------------------------------------------------
  198. \section{RRDB} \label{rrdb}
  199. Première tentative d'utilisation le lendemain du premier apéro 2019
  200. du Tetalab\footnote{Jean-Yves, je vous demande de vous calmer !}.
  201. Je suis parti sur quelques scripts shell, pour créer, mettre à jour et
  202. analyser les enregistrements d'une valeur de type \textsc{gauge}.
  203. \subsection{Create}
  204. \begin{lstlisting}
  205. #!/bin/bash
  206. source ./commun.sh
  207. starttime=$(date +'%s')
  208. echo creating $RRDB at ${starttime}s since epoch
  209. rrdtool create $RRDB \
  210. --start $starttime \
  211. --step 60 \
  212. DS:value:GAUGE:150:0:10 \
  213. RRA:AVERAGE:0.5:1:60
  214. \end{lstlisting}
  215. \subsection{Update} \index{rrdtool}
  216. Une fois la base créée, il faut bien la remplir.
  217. Dans cet exemple, nous allons utiliser le \textit{load}
  218. de notre Linux.
  219. \begin{lstlisting}
  220. #!/bin/bash
  221. source ./commun.sh
  222. ctime=$(date +'%s')
  223. value=$(cut -d ' ' -f 1 /proc/loadavg)
  224. # inject value in the rrdb file
  225. rrdtool update $RRDB ${ctime}:${value}
  226. \end{lstlisting}
  227. \subsection{Analyze}
  228. Nous allons essayer d'exploiter les données dûrement acquises
  229. pendant les heures qui précèdent\dots
  230. \begin{lstlisting}
  231. #!/bin/bash
  232. source ./commun.sh
  233. tmpf="somevalues.dat"
  234. rrdtool fetch $RRDB LAST |
  235. tr -d ':' |
  236. awk '
  237. (!/nan/ && NF==2) { print $1, $2 }
  238. ' \
  239. > ${tmpf}
  240. # as an example, we are gnuploting our datas
  241. gnuplot << __EOC__
  242. set term png size 800,600
  243. set output "graphe.png"
  244. set grid
  245. plot "${tmpf}" with lines
  246. __EOC__
  247. rm ${tmpf}
  248. \end{lstlisting}
  249. Il semble bien que l'utilisation de \texttt{fetch} ne soit pas
  250. vraiment prévue pour ça, donc j'en arrive à la conclusion que
  251. quelque chose m'échappe.
  252. On va laisser ça en suspens pour le moment.
  253. % -------------------------------------------------------------------
  254. \section{InfluxDB} \label{influxdb}
  255. La communication avec la bédédé se fait \textit{over HTTP}, un peu
  256. comme tous ces trucs de d'jeunz d'aujourd'hui\dots
  257. Au programme : écriture d'un injecteur en Perl\index{Perl}, en suivant
  258. plus ou moins l'exemple de rrdb..
  259. Ceci dit, en Debian stable, on n'a que la version 1.0, qui ne
  260. correspond plus trop à l'actualité. Et la \textit{current} est
  261. trop fatiguante à compiler pour ce soir, ni même pour ce week-end.
  262. % -------------------------------------------------------------------
  263. \section{Gnocchi} \label{gnocchi} \index{Gnocchi}
  264. \texttt{pip install gnocchi[postgresql,ceph,keystone]}, finalement,
  265. çe ne me donne pas trop envie. C'est du genre \textit{usinagaz}.
  266. % -------------------------------------------------------------------
  267. \section{Sqlite} \index{sqlite} \label{sqlite}
  268. \textsf{À regarder de près}
  269. Est-il possible de traiter des \textit{time series} en SQL\index{SQL} ?
  270. Peut-on utiliser Sqlite depuis un programme en Perl\index{Perl} ?
  271. Faut-il commencer à trouver un \textit{usecase} crédible ?
  272. NodeJs\index{nodejs} peut-il lire du Sqlite ?
  273. % -------------------------------------------------------------------
  274. \section{Serial coms} \index{serial} \label{serial}
  275. Il va y avoir deux liaisons série entre l'automate et le monitoring.
  276. La première, que nous allons juste entrevoir, passera par le port
  277. USB de la carte Arduino. La seconde passera par un port série
  278. auxiliaire\footnote{Il y en a 4 sur le mega 2560} de celle-ci.
  279. \subsection{Un gros souci}
  280. \begin{lstlisting}
  281. tcgetattr(uart0, &options);
  282. options.c_cflag = baudbits | CS8 | CLOCAL | CREAD;
  283. options.c_iflag = IGNPAR;
  284. options.c_oflag = 0;
  285. options.c_lflag = 0;
  286. tcflush(uart0, TCIFLUSH);
  287. tcsetattr(uart0, TCSANOW, &options);
  288. \end{lstlisting}
  289. Et en fait, le \texttt{read} sur le \textsl{fd} du serial device
  290. n'est pas bloquant, \texttt{perror} annonce \emph{success}, mais
  291. rien ne marche. L'année 2019 va commencer sur du vaudou programming%
  292. \footnote {aka shotgun debugging.}.
  293. \textit{29 décembre 2018} : le petit grain de magie\index{magie}
  294. est très simple à mettre en oeuvre, mais
  295. très difficle à spotter dans le gazillion d'options. Il semblerait
  296. que mettre \texttt{options.c\_cc[VMIN]} à 1 permet d'avancer vers
  297. l'étape suivante.
  298. Laquelle étape est une tentative d'utilisation de \texttt{select(2)},
  299. dans l'objectif de pouvoir gérer nous-même le \textit{timeout},
  300. laquelle tentative n'est pas du tout concluante.
  301. \subsection{Protocole} \index{protocole} \label{serialprotocol}
  302. L'automate va avoir plusieurs types de données à envoyer.
  303. Nous allons donc transférer ces valeurs sous forme de ligne
  304. de texte commençant par un caractère clef (par exemple T pour
  305. les températures) et se terminant par un \textit{newline}.
  306. \subsection{Un peu de code} \label{serialcode}
  307. TODO\index{TODO}
  308. % -------------------------------------------------------------------
  309. \section{Détournements} \label{detournements}
  310. Dans le contexte myryssien\index{Myrys}, il est évident que l'aspect
  311. artistique\index{Art}
  312. doit être dès le départ pris en compte.
  313. Les possibilités ne seront limitées que par votre manque d'imagination.
  314. Si vous voulez un petit exemple, imaginez des courbes de température
  315. qui pilotent un \texttt{uGen} de Chuck\index{Chuck} ou des algues dont
  316. les pulses lumineux envoie du \texttt{cv/gate} en temps réel.
  317. \subsection{Variante sonore}
  318. Un peu de \texttt{awk} pipé dans du \texttt{sox} ?
  319. Voire même l'occasion (ou un bon prétexte) de résoudre ce problème
  320. de saut de phase qui me tracasse depuis des mois ?
  321. \subsection{Eye candy}\index{eyecandy}\label{eyecandy}
  322. Pour maximiser l'impact visuel, il sera convenant de sortir du
  323. cadre pseudo-moderne des omniprésents écrans de ces
  324. smartphones\footnote{Quand les téléphones étaient attachés par
  325. un fil, les humains étaient libres.} qui nous lavent le cerveau.
  326. Sortons donc du contexte pixeliste et revenons aux fondamentaux :
  327. le caractère\index{ncurses},
  328. avec toute la simplicité de son concept sémantique.
  329. % -------------------------------------------------------------------
  330. \section{Conclusion} \label{conclusion} \index{conclusion}
  331. En fait, tout reste à faire. Mais ça peut être un beau projet
  332. aux implications et usages multiples. À condition de bien
  333. faire les choses.
  334. Un couteau suisse de la capture du monde réel, un point pivot
  335. de nos diverses interprétations de
  336. l'univers\footnote{non, la terre n'est pas plate} et des interactions
  337. étranges entre des paramètres sans relation clairement definie.
  338. % -------------------------------------------------------------------
  339. \setlength{\parskip}{0.05cm plus 0.05cm}
  340. % \pagebreak \tableofcontents
  341. \printindex
  342. \end{document}