Installer Thingspeak sur Ubuntu 16.04 LTS • Domotique et objets connectés à faire soi-même

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.

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 ?