Projets-2015-2016-OpenSmartCampus

=Présentation du Projet=

Introduction
Le projet nommé smart Campus est un projet étudiant visant à rendre un domaine universitaire intelligent. Il a vu le jour il y a 3 ans et il a comme but principal de rendre plus pratique la vie sur le campus ainsi que la gestion de celui-ci.

Le projet en 2014-2015 : SmartCampus2014-2015 Le projet en 2013-2014 : SmartCampus2013-2014

L'équipe
RICM5 : 
 * Quentin Torck
 * Vivien Michel
 * Jérémy Hammerer
 * Rama Codazzi
 * Zhengmeng Zhang

DUT : 
 * Andréas Gillet-Pascal

Encadrants : 
 * Didier Donsez
 * Vivien Quéma

=Organisation du Projet= Dans le but de mener à bien notre projet, nous avons décider d'utiliser la méthode agile Scrum. Le projet étant à faire dans un court intervalle de temps (2 mois), nous avons décidé de faire des sprints d'une semaine chacun.

Sprint 1 (du 25 Janvier au 31 Janvier)
Matériel récupéré:
 * Gateways
 * Raspberry Pi 2 + Alimentation 5V DC
 * ZWave
 * Clé USB Sigma ZWave
 * Détecteur de présence Aeon-labs ZWave
 * Détecteur d'ouverture Zipato ZWave
 * Rfxcom
 * Récepteur RFXCom 443 MHz
 * Station WMR88
 * Sonde Oregon Hygro Baro
 * Sonde Oregon Luminosité
 * Sonde Oregon Thermo Hygro All Weather
 * enOcean
 * Digital Security Camera
 * DLink DSC 5222L PTZ, UPnP

Travail effectué:
 * Etude de l'existant
 * Etude des données de la métro de Grenoble, savoir si l'on peut leur apporter de nouvelles données ou non.

A voir
 * http://fablab.ensimag.fr/index.php/SmartCampus/FicheSuivi
 * http://air.imag.fr/index.php/PM2M/2016/TP
 * http://air.imag.fr/index.php/GrenobloisFut%C3%A9

Sprint 2 (du 1 Février au 7 Février)
Architecture réalisée avec Didier Donsez :

L'utilisation de Météor avec une base de donnée MongoDB est possible. Une alternative à explorer est Sails.js. Étant donné le caractère exploratoire de ce sprint, l'architecture peut être amenée à changer. Notamment en ce qui concerne l'utilisation de Météor ou la base de donnée MongoDB. Taches :


 * Explorer l'utilisation de Météor et de Kadira à travers des tutoriels. Installation locale pour l'instant.


 * Installer un serveur Mosquito/MQTT(S) pour les communications avec les cartes


 * Installer Node-Red sur Rasberry PI : faire flux de reception/envoie entre la carte et le serveur MQTT : Tutoriel d'installation Node-Red

Tutoriel pour connecter Node-Red avec serveur MQTT. Ceci est à adapter suivant la configuration dans settings.json

Regarder ce flux existant proposant un envoie sécurisé sur le serveur

Regarder ce flux existant pour envoyer des données reçues par la Z-Wave


 * Explorer l'utilisation de Twilio pour l'envoie de sms automatique depuis les cartes. Technologies JavaScript utilisable sur serveur Node.js

Prendre en main sa rasberry pi à distance
http://www.framboise314.fr/prenez-la-main-a-distance-sur-votre-raspberry-pi-avec-vnc/

Installation sur Rasberry Pi Wheezy
sudo apt-get remove nodered wget http://node-arm.herokuapp.com/node_archive_armhf.deb sudo dpkg -i node_archive_armhf.deb sudo apt-get install build-essential python-dev python-rpi.gpio sudo npm install -g --unsafe-perm node-red echo nmp->[OK]
 * Lancer node-red sur la rasberry-pi B+ grâce aux commandes suivantes dans un script. Sur l'OS Debian wheezy.
 * 1) !/bin/bash
 * 2) install nodered
 * 1) install Node-red

Tentatives de démarrer le serveur au boot de la carte sur l'OS Wheezy. Malgré plusieurs tentatives (utilisation de update.rc, de PM2) le serveur ne démarre pas au lancement.

Utilisation de la plateforme AWS d'Amazon

 * Création d'un compte gratuit sur Amazon d'une validité d'un an.
 * Création d'une machine virtuelle Ubuntu sur la plateforme.
 * Installation et mise en marche d'un serveur Mosquitto (broker) sur la machine virtuelle. (voir installation)

Sur l'OS Debian Jessie : Une version de node-red est pré-installée.
Pour passer de Wheezy à Jessie (solution adoptée) : installation de NOOBS puis de Debian Jessie via cet utilitaire. Il est nécessaire d'avoir une carte SD vierge ou de la formater.

Mise à jour des logiciels : sudo apt-get update sudo apt-get upgrade

le système pré-installé sur Jessie permet de lancer au démarrage et, en cas de panne, de relancer le serveur node-red grâce à nodered.service.

Pour l'activer, taper la commande : sudo systemctl enable nodered.service

Installation des noeuds RFXcom pour le récepteur 433 Mhz et du noeud pour le récepteur Zwave
Il est nécessaire d'installer npm pour ajouter des noeuds à node-red: sudo apt-get install npm

Les noeuds sont à installer dans le dossier $HOME/.node-red/ pour qu'un seul utilisateur y ai accès. La commande npm sans -g installera le noeud dans le dossier courant. Sinon avec l'option -g et les droits root dans le dossier node_module/node-red. Pour que le noeud apparaisse, il faut redémarrer node-red.

Téléchargement du noeud RFXcom
Noeud RfxCom

Installation des noeuds Zwave
Noeud Zwave

Ce noeud dépend d'une version d'Openzwave avec nodejs : node-openzave. Il faut donc installer la librairie OpenZwave.

Téléchargement de la version 1.4 OpenZwave 1.4 en zip.

Dans le répertoire décompressé. make sudo make install

La commande make, provoquant la compilation, peut mettre du temps. Il est possible qu'une librairie soit manquante et provoque une erreur.

Pour y remédier : sudo apt-get install libudev-dev

La commande make install copie les librairies openzwave dans /usr/local/lib. Si node-red n'est pas dans /usr/local/lib/node_modules/ il faut déplacer les librairies dans /usr/lib/.

Pour vérifier la bonne installation, lors de lancement de node-red, un noeud Zwave in et Zwave out sont respectivement dans Input et Output.

L'installation du noeud peut provoquer une erreur si la version de nodejs est inférieure ou égale à 0.10.29

Configuration des ports
http://www.latelierdugeek.fr/2015/02/02/domotique-partie-8-ajout-du-support-du-z-wave-dans-domoticz/

Mettre à jour nodejs
sudo apt-get remove nodered sudo apt-get remove nodejs nodejs-legacy sudo apt-get remove npm

Raspberry Pi 2
curl -sL https://deb.nodesource.com/setup_4.x | sudo bash - sudo apt-get install -y build-essential python-dev python-rpi.gpio nodejs

Raspberry Pi
wget http://node-arm.herokuapp.com/node_archive_armhf.deb sudo dpkg -i node_archive_armhf.deb sudo apt-get install build-essential python-dev python-rpi.gpio

Une fois nodejs mis à jour(nodejs -v > 0.12.x ou 4.2.x) sudo npm cache clean sudo npm install -g --unsafe-perm node-red

Remettre les scripts de lancement et de démarrage
sudo wget https://raw.githubusercontent.com/quentin74/Smartcampus/master/node-red/nodered.service -O /lib/systemd/system/nodered.service sudo wget https://raw.githubusercontent.com/node-red/raspbian-deb-package/master/resources/node-red-start -O /usr/bin/node-red-start sudo wget https://raw.githubusercontent.com/node-red/raspbian-deb-package/master/resources/node-red-stop -O /usr/bin/node-red-stop sudo chmod +x /usr/bin/node-red-st* sudo systemctl daemon-reload

Mise en place d'un VPN
Dans le but de pouvoir avancer plus facilement dans le projet, nous avons dû mettre en place un serveur VPN car les ports utilisés par MQTT sont bloqués sur le réseau de l'université. Il est donc impossible pour une Raspberry Pi de communiquer avec un serveur mosquitto basé sur la plateforme AWS sans passer par un VPN (en utilisant le réseau de l'université). L'avantage d'utiliser un VPN est aussi de sécuriser les communications entre les Raspberry pi et le serveur mosquitto. Les étapes de la mise en place de notre VPN sont les suivantes :


 * Création d'une nouvelle machine virtuelle dans le but d'installer un serveur VPN openVPN dans le cluster d'amazon (voir installation).


 * Installation d'un client VPN sur une Raspberry

Mise en place d'une base de donnée InfluxDB
Installation sur le serveur amazone d'une base InfluxDB: wget https://s3.amazonaws.com/influxdb/influxdb_0.10.1-1_amd64.deb sudo dpkg -i influxdb_0.10.1-1_amd64.deb

Installation de Grafana
Connexion avec la base InfluxDB et première visualisation de données émises par les capteurs météorologiques.

Modification du flow Node-red
Récupération d'informations depuis le récepteur RfxCom et envoie vers le broker mqtt.

Passage en MQTTS
Changement du port de configuration sur le flow node-red : 1883 -> 8883 Activation du cryptage tls/ssl et désactivation de la vérification du certificat du serveur. En effet, tous les certificats générés sont auto-signés. Afin que la connexion puisse se faire il faut, soit un certificat signé par une autorité reconnue, soit désactiver la vérification.

Pour Telegraf (voir installation ci-dessous)

Changement du port et définition de la clé et du certificat pour la communication cryptée dans le fichier de configuration.

Pour le broker mosquitto, nous avons changé le fichier config dans le but de pouvoir utiliser TLS/SSL. Le fichier config est complété comme suivant : # pid_file /var/run/mosquitto.pid #TLS require_certificate false listener 8883 cafile /etc/mosquitto/ca_certificates/ca.crt certfile /etc/mosquitto/certs/server.crt keyfile /etc/mosquitto/certs/server.key # persistence true persistence_location /var/lib/mosquitto/ log_dest file /var/log/mosquitto/mosquitto.log include_dir /etc/mosquitto/conf.d allow_anonymous true password_file /etc/mosquitto/passwd
 * 1) Place your local configuration in /etc/mosquitto/conf.d/
 * 1) A full description of the configuration file is at
 * 2) /usr/share/doc/mosquitto/examples/mosquitto.conf.example

Installation de Telegraf
La dernière release précompilée pour Ubuntu(0.10.2) ne contient pas le plugin "mqtt_consumer". Elle ne sera disponible que dans la release 0.10.3. Il faut donc l'installer depuis les sources si la version n'est pas supérieur à 0.10.3. Afin de faciliter le démarrage automatique de Telegraf, on installe via le package debian puis on remplacera l'exécutable par une version plus récente: Dernière version disponible actuellement

Installation de GO
Sur AWS, une version de go est pré-existante mais non fonctionnelle car non à jour. sudo rm /usr/bin/go

Choisir la dernière version de go : GO

Décompresser l'archive: tar -C /usr/local -xzf go$VERSION.$OS-$ARCH.tar.gz

Ajouter dans /etc/profile ou $HOME/.profile. L'exemple ci-dessous n'est fonctionnel que si vous avez décompréssé dans /usr/local: export PATH=$PATH:/usr/local/go/bin

Créer la variable GOPATH: export GOPATH=

Télécharger les sources: go get github.com/influxdata/telegraf

Aller dans le dossier de téléchargements: cd $GOPATH/src/github.com/influxdata/telegraf make sudo cp telegraf /usr/bin/

Configuration de Telegraf
Un exemple de fichier de configuration est obtenu via la commande suivante :

telegraf -sample-config -input-filter mqtt_consumer -output-filter influxdb > YOUR_FILE.conf Exemple configuration mqtt

Changez l'adresse et le port du broker mqtt et de la base influxDB. Choissez les topics auxquels souscrire, le format des données reçu de la part du broker (json,influx...)

Si vous utilisez des certificats auto-signés ne pas oublier skip_verify_ssl = true

Le fichier de configuration lu au démarrage se situe dans : /etc/telegraf

Pour renommer le fichier de configuration lu au démarrage : sudo nano /etc/init.d/telegraf

Changer la ligne avec la variable confile=/etc/telegraf/YOUR_FILE.conf

Passage d'influxDB en https
Dans le fichier /etc/influxdb/infludb.conf :

Modifier les attributs de [admin] et [http] en mettant https = true et le chemin vers la clé/certificat pour influxDB. Une subtilité est à retenir pour influxDB ssl. En effet, la clé et le certificat doivent être dans le même fichier : cat key.pem crt.pem > key_crt.pem

Ajout de Widget dans grafana integrant cartographie leaflet
Attention --> cette tache ne sera pas réalisée car sur le forum de grafana ou d'autres nous avons vu qu'intégrer de la cartographie était dans les projet à venir de grafana, par consequent il est inutile de perdre du temps sur une tache qui sera prochainement réalisée.

Mise en place d'une PKI
Une PKI (Public Key Infrastructure) permet de gérer la création, la récupération et la révocation de certificats. Nous avons, dans le cadre de la sécurisation de notre plateforme, d'en créer une dans le but de fournir des certificats à nos différentes machines. Nous avons décider de suivre le tutoriel suivant :
 * Mise en place d'une d'une PKI: http://stankiewicz.free.fr/Wikka/wikka.php?wakka=HowtoPKI

Nous avons donc commencé à travailler sur ce tutoriel. Cependant, celui-ci semble être obsolète (certaines technologies semblent avoir évoluées depuis et donc certaines actions du tutoriel ne fonctionnent plus). Nous avons perdu beaucoup de temps à essayer de résoudre ces problèmes.

Configuration d'OpenVPN, dans le but d'ajouter de nouveaux utilisateurs
Au départ, nous avions alloué une instance Amazon dédiée à OpenVPN. Plus précisément, c'était une image dans laquelle OpenVPN était préinstallé. Nous n'arrivions pas à ajouter de nouveaux utilisateurs pour ce VPN avec cette instance. Nous avons donc décidé de supprimer l'instance Amazon d'OpenVPN et de l'installer par nous même sur notre instance principale. Après avoir fait cela, nous arrivions à créer différents utilisateurs pour notre VPN. Cependant, nous avons remarqué qu'OpenVPN limite le nombre de connexions à deux utilisateurs maximum (en même temps).

Sprint 6 (du 7 Mars au 13 Mars)
Equipement des salles avec les raspberry pi, les capteurs enocean, les capteurs Zwave

Ajout de fichier de configuration dans l'application meteor, pour faciliter le déploiement. Ajout par exemple de chemins génériques.

Sprint 7 (du 14 Mars au 17 Mars)

 * Equipement des salles air et fablab avec les capteurs Zwave, Rfxcom
 * Contact des administrateurs réseaux de Polytech pour pouvoir débloquer les ports