Vous connaissez très certainement le service en ligne ThingSpeak qui permet de collecter des données en provenance d’objets connectés et de créer des Dashboards. ThingSpeak est un projet Open Source dont les sources sont disponibles sur GitHub (page du projet). Rien ne nous interdit de l’installer sur une machine locale pour créer un Dashboard sans passer par un service en ligne. ThingSpeak a été développé avec le langage Ruby (page française du projet). Pour écrire ce tutoriel, j’ai utilisé un mini PC équipé d’un microprocesseur Intel Atom fonctionnant sous Ubuntu 16.04 LTS.
Sommaire
Préparer le serveur Ubuntu 16.04 LTS
Avant de nous lancer dans l’installation de ThingSpeak, le mieux de de s’assurer qu’Ubuntu est à jour. Exécutez les commandes suivantes. Vous avez le temps d’aller vous faire chauffer un café…
sudo apt-get update sudo apt-get upgrade sudo apt-get dist-upgrade sudo apt-get autoremove sudo apt-get clean
Installation de l’environnement Ruby
Ruby est le langage de programmation, ou disons plutôt l’environnement de développement utilisé pour développer ThingSpeak. Pour faire fonctionner ThingSpeak, nous allons avoir besoin de RVM (Ruby Version Control) qui est l’outil en ligne de commande (CLI pour Command-Line Tool) de Ruby qui permet d’installer, gérer les librairies (gems dont le jargon Ruby). Avant de pouvoir installer RVM, exécutez ces trois commandes :
gpg --keyserver hkp://keys.gnupg.net --recv-keys D39DC0E3 \curl -sSL https://get.rvm.io | bash -s stable source ~/.rvm/scripts/rvm
On peut maintenant installer la version 2.1.0 nécessaire pour faire fonctionner ThingSpeak.
rvm install 2.1.0 rvm use 2.1.0 –default
Installer la base de données MySQL
ThingSpeak utilise la base de données MySQL pour fonctionner et stocker les données en provenance des objets connectés. C’est une base de données bien plus robuste qui va permettre de stocker une plus grande quantité de données que la base sqllite utilisée habituellement dans les projets Ruby.
sudo apt-get install mysql-server mysql-client libmysqlclient-dev
Durant l’installation, vous devriez avoir une fenêtre vous demandant de saisir votre mot de passe utilisateur (root). Si ce n’est pas le cas, à la fin de l’installation, lancez le CLI de MySQL. Au démarrage, MySQL va vous demander de créer un mot de passe root. Saisissez le puis quittez le CLI avec la commande exit.
Installer ThingSpeak
L’installation est assez simple puisqu’il suffit de récupérer les sources depuis GitHub. Avant de commencer, vérifiez que la commande git est installée sur votre système
sudo apt-get install git
Maintenant on peut télécharger les sources
git clone https://github.com/iobridge/thingspeak.git
Entrez dans le répertoire du projet et exécutez les commandes suivantes pour installer les dépendances (gem) nécessaires au projet.
cd thingspeak gem install bundler bundle install
Configurer la base de données
C’est à cette étape que les problèmes peuvent se poser. Heureusement, le blog cnx-software a travaillé sur le sujet et trouvé comment faire.
Pour commencer, faisons une copie des scripts par défaut qui vont servir à configurer les tables de la base de données.
cp config/database.yml.example config/database.yml
Il est préférable de changer les mots de passe. ThingSpeak va créer trois tables : test, development et production. Vous pouvez définir un utilisateur et un mot de passe pour chaque mode de fonctionnement.
On lance maintenant la configuration de la base de données
rake db:create
Le premier qui vous devriez rencontrer concerne le connecteur mysql2
$ rake db:create rake aborted! Bundler::GemRequireError: There was an error while trying to load the gem 'mysql2'. Gem Load Error is: uninitialized constant Mysql2::Client::SECURE_CONNECTION
Editez le fichier Gemfile qui se trouve à la racine du projet en indiquant la version minimale à utiliser
gem 'mysql2', '~> 0.3.18'
Enregistrez avec CTRL+X puis O.
Il faut actualiser les dépendances
bundle update mysql2
Vérifions que tout est bon
christophe@atom:~/thingspeak$ bundle show mysql2 /home/christophe/.rvm/gems/ruby-2.1.0@thingspeak/gems/mysql2-0.3.21
Tout est bon, on peut recommencer la création de la base de données.
$ rake db:create thingspeak_development already exists Mysql2::Error: Access denied for user 'thing'@'localhost' to database 'thingspeak_test': CREATE DATABASE `thingspeak_test` DEFAULT CHARACTER SET `utf8` COLLATE `utf8_unicode_ci`
Nouveau problème, la base existe déjà mais on ne possède pas les droits adéquats ! Ouvrons le shell de MySQL avec la commande mysql -u root -p . Une fois connecté, nous allons créer une table thingspeak_test et lui attribuer les droits nécessaires.
$ mysql -u root -p Enter password: Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 15 Server version: 5.7.16-0ubuntu0.16.04.1 (Ubuntu) Copyright (c) 2000, 2016, Oracle and/or its affiliates. All rights reserved. Oracle is a registered trademark of Oracle Corporation and/or its affiliates. Other names may be trademarks of their respective owners. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. mysql> show databases; +------------------------+ | Database | +------------------------+ | information_schema | | mysql | | performance_schema | | sys | | thingspeak_development | +------------------------+ 5 rows in set (0,05 sec) mysql> CREATE DATABASE thingspeak_test DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci; Query OK, 1 row affected (0,00 sec) mysql> GRANT ALL PRIVILEGES ON thingspeak_test.* TO thing@localhost; Query OK, 0 rows affected (0,01 sec) mysql> FLUSH PRIVILEGES; Query OK, 0 rows affected (0,67 sec) mysql> exit Bye
On peut relancer la configuration des tables
christophe@atom:~/thingspeak$ rake db:create thingspeak_development already exists thingspeak_test already exists
Cette fois, tout est bon !
Passons au schémas
christophe@atom:~/thingspeak$ rake db:schema:load -- create_table("active_admin_comments", {:force=>true}) rake aborted!
Nouveau problème. Encore une fois, on peut remercier notre amis de cnx-software qui a passé du temps pour identifier et trouver la solution. Il semble que le problème vienne de la version MySQL 5.7 utilisée par Ubuntu 16.04 qui n’autorise pas les clés nulles (NULL key). La solution consiste à créer un fichier de configuration config/initializers/abstract_mysql2_adapter.rb contenant la classe suivante :
class ActiveRecord::ConnectionAdapters::Mysql2Adapter NATIVE_DATABASE_TYPES[:primary_key] = "int(11) auto_increment PRIMARY KEY" end
Ensuite, il faut ajouter cette ligne dans le fichier de configuration config/environment.db
require File.expand_path('../../config/initializers/abstract_mysql2_adapter', __FILE__)
On peut relancer la création des schémas
rake db:schema:load
L’installation est terminée !
Démarrer ThingSpeak
Il ne reste plus qu’à démarrer le serveur. Pour arrêter le serveur, utilisez la combinaison CTRL+C.
rails server webrick => Booting WEBrick => Rails 4.0.5 application starting in development on http://0.0.0.0:3000 => Run `rails server -h` for more startup options => Ctrl-C to shutdown server [2016-12-09 10:15:36] INFO WEBrick 1.3.1 [2016-12-09 10:15:36] INFO ruby 2.1.0 (2013-12-25) [x86_64-linux] [2016-12-09 10:15:36] INFO WEBrick::HTTPServer#start: pid=15584 port=3000 Started GET "/" for 127.0.0.1 at 2016-12-09 10:15:47 +0100 Processing by PagesController#home as HTML Geokit is using the domain: localhost Rendered layouts/_flash.html.erb (3.1ms) Rendered pages/_contact_form.html.erb (48.0ms) Rendered pages/home.html.erb within layouts/home (1364.0ms) Rendered layouts/_header.html.erb (2591.1ms) Rendered layouts/_nav.html.erb (30.4ms) Rendered layouts/_footer.html.erb (2.5ms) Completed 200 OK in 4164ms (Views: 4096.8ms | ActiveRecord: 0.0ms)
On accède à l’interface web depuis un navigateur à l’adresse http://localhost:3000 .
Mettre à jour ThingSpeak
Pour mettre ThingSpeak à jour, placez vous dans le répertoire du projet et exécutez les commandes suivantes
git pull origin master bundle install rake db:migrate
Dans le prochain tutoriel, nous découvrirons les possibilités offertes par cette plateforme.
Avez-vous aimé cet article ? [Total: 0 Moyenne: 0]