Status Bot

De Wiki LOGre
Aller à : navigation, rechercher


On veut avoir une possibilité de voir si le LOGal est ouvert sans y aller. L'idée c'est que dès qu'il y a deux personnes qui vont rester au LOG pendent une ou deux heures, d'autres gens peuvent se joindre à eux. Ainsi le LOGal ne serait pas limité a deux séances par semaine. (même si on peut emprunter une clef) :)

Le projet est assez simple, il est prévu qu'il soit réalisé en quatre parties:

  1. Un raspberry Pi qui détecte l’état du LOGal (actif/ouvert ou inactif/fermé)
  2. Une façon de transmettre chaque N minutes un timestamp et l'état détecté au serveur de web du LOG
  3. Un cronjob sur le serveur web qui prend les action en fonction des changements d’état
    • modifier un image/texte sur le site web pour qu'on peut voir l'état la-dessus (vert/rouge)
    • générer du json pour la SpaceAPI
    • tweeter pour que tout le twitterverse sait qu'ils peuvent venir
  4. Un téléphone qui sera branché la ligne fixe du log qui ne permettra pas de faire des appels. Il servira juste pour qu'on peut vérifier que le LOGal restera ouvert pendant plus que 10 minutes avant d'y aller.
  5. Bonus : il existe déjà une appli android libre qui lira ce .json


Detection de l'état du LOGal

Là on utilise un raspberry Pi et un une photo-résistance (pour l'instant). Le Pi n'a pas de convertisseur analogique-numérique, mais Gabriel a trouvé une solution. À la base, on mesure le temps qu'il faut pour décharger et charger un condensateur. Ce temps va changer en fonction de la résistance qui change en fonction de la lumière. On l'a fait tourner pendant une journée et voila ça sera probablement très facile de déterminer l’état du LOGal.

Le suivant est une copie du jupyter notebook qu'on peut aussi trouver ici: https://git.framasoft.org/black-puppydog/LOGal-statusbot

import numpy as np
import pandas as pd
from datetime import datetime
import matplotlib.pyplot as plt
%matplotlib inline

Quelques examples:

df.tail()
light_timing timestamp
1388 41.30 2016-03-25 21:36:06.547993
1389 42.15 2016-03-25 21:37:06.437228
1390 46.90 2016-03-25 21:38:06.311772
1391 44.35 2016-03-25 21:39:06.093048
1392 48.15 2016-03-25 21:40:05.775131

On fait un petit plot pour voir comment les mesures changent en fonction du temps.

plt.figure(figsize=(18, 6))
plt.plot(df.timestamp, df.light_timing, 'grey', label='mesures (moyen de 5)')
plt.plot(df.timestamp, np.convolve(df.light_timing, [1. / 10] * 10, 'same'), 'r-', label='moyen des 10 dernier mesures')
plt.text(pd.Timestamp('2016-03-24 22:40'), 95, 'Premier test (lumiere\neteindu pendant 1 min)', rotation=60)
plt.text(pd.Timestamp('2016-03-25 00:25'), 50, 'Fermeture du LOGal')
plt.text(pd.Timestamp('2016-03-25 17:10'), 80, 'Activité non identifié (Bruno?)', rotation=90)
plt.text(pd.Timestamp('2016-03-25 17:50'), 55, 'Ouverture LOGal (Amaury, Daan)')
plt.legend()
<matplotlib.legend.Legend at 0x7fe31cdc7978>
caption png

Ben, on a oublié de choisir la bonne timezone sur le Pi. Donc tout les temps sont décalés d' une heure. C'est fixé sur le pi.

On voit que le test le jeudi soir n'aurait pas eu le statusbot car

Mais qu'est-ce que c'est la à 17:00-18:00?

df1 = df[(pd.Timestamp('2016-03-25 16:30:00.0') < df.timestamp) & (df.timestamp < pd.Timestamp('2016-03-25 18:10:00.0'))]
plt.figure(figsize=(18, 6))
plt.ylim(20, 100)
plt.plot(df1.timestamp, df1.light_timing, 'grey', label='mesures (moyen de 5)')
plt.plot(df1.timestamp, np.convolve(df1.light_timing, [1. / 10] * 10, 'same'), 'r-', label='moyen des 10 dernier mesures')
[<matplotlib.lines.Line2D at 0x7fe30d5729b0>]
caption png

Apparement il y avait qn au LOGal de ~17:55 jusq'a ~17:35. Amory et moi sont arrivé a ~17:45 - on s'est juste raté. :P

Donc une moyennne sur les dernières 10 valeurs mesurées serait probablement suffisant pour déterminer l'état du LOGal.

Mais le code-la compte juste des évaluations d'une boucle. Donc tout ce-qu'il se passe sur le pi (vim, ssh, apt-get, ...) a un effet très fort sur le compteur, ainsi le bruit. Si on échange ça pour un busy wait et une différence de deux timestamps on arrive a quelque-chose beaucoup plus stable:

caption png

Là on peut bien utiliser un seul valeur mesuré. \o/