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 11KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347
  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.20cm plus 0.20cm}
  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. % -------------------------------------------------------------------
  38. \section{Présentation générale}
  39. \subsection{Capteurs} \index{capteurs}
  40. Actuellement nous disposons d'un \texttt{RDing TEMPERHUM1V1.2}{} qui
  41. semble un peu étrange à interpeller, et qui sera destiné à mesurer
  42. l'ambiance météo du DD2\footnote{Pas de mauvais esprit, merci...}.
  43. Par la suite, nous pourrons récupérer
  44. (par liaison série, cf page \pageref{serial})
  45. des données en provenance de l'automate de contrôle de l'enceinte.
  46. Notre dd2monitor
  47. devrait donc aussi être capable d'envoyer des alertes en cas de souci,
  48. par exemple si des algues\footnote{ou des pleurotes.} tentent de s'échapper.
  49. \subsection{Stockage}
  50. Pour entreposer toutes ces valeurs numériques, il existe plusieurs
  51. choix, et nous allons en évaluer quelques uns :
  52. \texttt{rrdb}\index{rrdb} (page \pageref{rrdb}),
  53. \texttt{influxdb}\index{Influxdb} (page \pageref{influxdb}),
  54. \texttt{gnocchi}\index{Gnocchi} (page \pageref{gnocchi})
  55. \texttt{sqlite}\index{sqlite} (page \pageref{sqlite})
  56. La représentation interne des valeurs reste à définir pour
  57. la plupart d'entre elles.
  58. \subsection{Affichage}
  59. Nous allons laisser un petit bac-à-sable pour Fred Fermion\index{nodejs},
  60. qui nous tartine les oreilles depuis bien trop longtemps avec son machin.js.
  61. Mais sachez déja que l'automate sera équipé d'un minitel, pourquoi ne
  62. pas en mettre un second sur le monitoring ?
  63. % -------------------------------------------------------------------
  64. \section{Outils}
  65. \subsection{Simulations}
  66. Bien entendu, mettre au point un système de monitoring pour un futur
  67. phytotron pose un problème : d'où viennent les premières mesures ?
  68. C'est pour ça qu'il y a déja un générateur de \textit{fake-values} qui
  69. ne demande qu'à grandir.
  70. Nous avons également un générateur de nombres divers et incohérents
  71. qui envoie des quadruplets d'entiers 10 bits précédés d'un caractere
  72. de bonne efficacité.
  73. \subsection{Exemples}
  74. \textsf{Promis, on va en mettre ! Dès que ça marche\dots}
  75. Un premier exemple avec rrdb en page \pageref{rrdb}.
  76. Le second cause des premiers essais du LM35, capteur de
  77. température analogique branché sur un Arduino et relié
  78. par un port série (page \pageref{serialcode}).
  79. \subsection{Analyses}
  80. \textsf{Bla bla bla\dots Corrélations, Gnuplot\index{gnuplot}, toussa\dots}
  81. Peut-être demander à Schmod777 des références de
  82. documents bourbakistes ? J'ai entendu parler dans \textsc{irc}
  83. de choses étranges, comme ça :
  84. \textsl{<schmod777> s/booz/booze pour la courbe qui majore les autres en moyenne serait
  85. d'une criante justesse scientifique ;)}
  86. Ce qui donne qunad même à réfléchir. À se demander quel savoir
  87. allons-nous pouvoir déduire de ces\footnote{non, c'est pas du bigdata.}
  88. chiffres improbables.
  89. (Re-)Découvrir les lois de l'inertie thermique ?
  90. Générer des formes d'ondes spatialisables ?
  91. Déplacer des petites \textit{bubulles} colorées ?
  92. Une histoire pour la section \pageref{detournements} ?
  93. \subsection{Archivage} \index{archivage} \label{archivage}
  94. La création de cet outil de surveillance est un long parcours
  95. pavé d'essais et d'erreurs. Tout cela peut générer beaucoup
  96. de données. À titre d'exemple, la capture de température des
  97. premier essais sort environ 800 Ko par jour.
  98. 99.99\% de ces chiffres sont inutiles, mais il peut arriver
  99. qu'on désire conserver l'historique d'une
  100. expérience réussie\footnote{En fait, c'est comme ça que la science existe}
  101. ou d'un
  102. \textit{epicfail\footnote{En fait, c'est comme ça que la science avance}}.
  103. Nous devons donc rencontrer quelqu'un qui maitrise cette partie
  104. de la mouvance détournementale de l'espionnage. Yaya\index{Yaya} ?
  105. % -------------------------------------------------------------------
  106. \section{Configuration} \index{configuration} \label{configuration}
  107. Pour adapter cet outil de surveillance aux variations du monde réel,
  108. nous devons nous-même lui décrire ce monde. Une description qui se
  109. fera avec des lignes de la forme '\texttt{input\_device s /dev/ttyACM0}'
  110. qui représentent des tuples
  111. \textit{clef-type-valeur}\footnote{Laissons les canards tranquilles.}
  112. de.
  113. La syntaxe n'est pas encore fixée, mais un fichier exemple est
  114. disponible pour des explication plus récentes, donc plus en
  115. rapport avec la réalité du code.
  116. % -------------------------------------------------------------------
  117. \section{RRDB} \label{rrdb}
  118. Première tentative d'utilisation le lendemain du premier apéro 2019
  119. du Tetalab\footnote{Jean-Yves, je vous demande de vous calmer !}.
  120. Je suis parti sur quelques scripts shell, pour créer, mettre à jour et
  121. analyser les enregistrements d'une valeur de type \textsc{gauge}.
  122. \subsection{Create}
  123. \begin{lstlisting}
  124. #!/bin/bash
  125. source ./commun.sh
  126. starttime=$(date +'%s')
  127. echo creating $RRDB at ${starttime}s since epoch
  128. rrdtool create $RRDB \
  129. --start $starttime \
  130. --step 60 \
  131. DS:value:GAUGE:150:0:10 \
  132. RRA:AVERAGE:0.5:1:60
  133. \end{lstlisting}
  134. \subsection{Update} \index{rrdtool}
  135. Une fois la base créée, il faut bien la remplir.
  136. Dans cet exemple, nous allons utiliser le \textit{load}
  137. de notre Linux.
  138. \begin{lstlisting}
  139. #!/bin/bash
  140. source ./commun.sh
  141. ctime=$(date +'%s')
  142. value=$(cut -d ' ' -f 1 /proc/loadavg)
  143. # inject value in the rrdb file
  144. rrdtool update $RRDB ${ctime}:${value}
  145. \end{lstlisting}
  146. \subsection{Analyze}
  147. Nous allons essayer d'exploiter les données dûrement acquises
  148. pendant les heures qui précèdent\dots
  149. \begin{lstlisting}
  150. #!/bin/bash
  151. source ./commun.sh
  152. tmpf="somevalues.dat"
  153. rrdtool fetch $RRDB LAST |
  154. tr -d ':' |
  155. awk '
  156. (!/nan/ && NF==2) { print $1, $2 }
  157. ' \
  158. > ${tmpf}
  159. # as an example, we are gnuploting our datas
  160. gnuplot << __EOC__
  161. set term png size 800,600
  162. set output "graphe.png"
  163. set grid
  164. plot "${tmpf}" with lines
  165. __EOC__
  166. rm ${tmpf}
  167. \end{lstlisting}
  168. Il semble bien que l'utilisation de \texttt{fetch} ne soit pas
  169. vraiment prévue pour ça, donc j'en arrive à la conclusion que
  170. quelque chose m'échappe.
  171. % -------------------------------------------------------------------
  172. \section{InfluxDB} \label{influxdb}
  173. La communication avec la bédédé se fait \textit{over HTTP}, un peu
  174. comme tous ces trucs de d'jeunz d'aujourd'hui\dots
  175. Au programme : écriture d'un injecteur en Perl\index{Perl}, en suivant
  176. plus ou moins l'exemple de rrdb..
  177. Ceci dit, en Debian stable, on n'a que la version 1.0, qui ne
  178. correspond plus trop à l'actualité. Et la \textit{current} est
  179. trop fatiguante à compiler pour ce soir, ni même pour ce week-end.
  180. % -------------------------------------------------------------------
  181. \section{Gnocchi} \label{gnocchi} \index{Gnocchi}
  182. \texttt{pip install gnocchi[postgresql,ceph,keystone]}, finalement,
  183. çe ne me donne pas trop envie. C'est du genre \textit{usinagaz}.
  184. % -------------------------------------------------------------------
  185. \section{Sqlite} \index{sqlite} \label{sqlite}
  186. \subsection{À regarder de près}
  187. % -------------------------------------------------------------------
  188. \section{Serial coms} \index{serial} \label{serial}
  189. Il va y avoir deux liaisons série entre l'automate et le monitoring.
  190. La première, que nous allons juste entrevoir, passera par le port
  191. USB de la carte Arduino. La seconde passera par un port série
  192. auxiliaire\footnote{Il y en a 4 sur le mega 2560} de celle-ci.
  193. \subsection{Un gros souci}
  194. \begin{lstlisting}
  195. tcgetattr(uart0, &options);
  196. options.c_cflag = baudbits | CS8 | CLOCAL | CREAD;
  197. options.c_iflag = IGNPAR;
  198. options.c_oflag = 0;
  199. options.c_lflag = 0;
  200. tcflush(uart0, TCIFLUSH);
  201. tcsetattr(uart0, TCSANOW, &options);
  202. \end{lstlisting}
  203. Et en fait, le \texttt{read} sur le \textsl{fd} du serial device
  204. n'est pas bloquant, \texttt{perror} annonce \emph{success}, mais
  205. rien ne marche. L'année 2019 va commencer sur du vaudou programming%
  206. \footnote {aka shotgun debugging.}.
  207. \textit{29 décembre 2018} : le petit grain de magie\index{magie}
  208. est très simple à mettre en oeuvre, mais
  209. très difficle à spotter dans le gazillion d'options. Il semblerait
  210. que mettre \texttt{options.c\_cc[VMIN]} à 1 permet d'avancer vers
  211. l'étape suivante.
  212. Laquelle étape est une tentative d'utilisation de \texttt{select(2)},
  213. dans l'objectif de pouvoir gérer nous-même le \textit{timeout},
  214. laquelle tentative n'est pas du tout concluante.
  215. \subsection{Protocole} \index{protocole} \label{serialprotocol}
  216. L'automate va avoir plusieurs types de données à envoyer.
  217. Nous allons donc transférer ces valeurs sous forme de ligne
  218. de texte commençant par un caractère clef (par exemple T pour
  219. les températures) et se terminant par un \textit{newline}.
  220. \subsection{Un peu de code} \label{serialcode}
  221. % -------------------------------------------------------------------
  222. \section{Détournements} \label{detournements}
  223. Dans le contexte myryssien, il est évident que l'aspect artistique
  224. doit être dès le départ pris en compte.
  225. Les possibilités ne seront limitées que par votre manque d'imagination.
  226. Si vous voulez un petit exemple, imaginez des courbes de température
  227. qui pilotent un \texttt{uGen} de Chuck\index{chuck} ou des algues dont
  228. la lumière envoie du \texttt{cv/gate} en temps réel.
  229. \subsection{Variante}
  230. % -------------------------------------------------------------------
  231. \section{Conclusion} \label{conclusion} \index{conclusion}
  232. En fait, tout reste à faire. Mais ça peut être un beau projet
  233. aux implications et usages multiples.
  234. Un couteau suisse de la capture du monde réel, un point pivot
  235. de nos diverses interprétations de
  236. l'univers\footnote{non, la terre n'est pas plate} et des interactions
  237. étranges entre des paramètres sans relation clairement definie.
  238. % -------------------------------------------------------------------
  239. \setlength{\parskip}{0.05cm plus 0.05cm}
  240. \pagebreak \tableofcontents
  241. \printindex
  242. \end{document}