Raspberry Pi : envoyer des SMS sans 3G et gratuitement

Raspberry Pi : envoyer des SMS sans 3G et gratuitement

Pour un projet, j’ai besoin d’envoyer des SMS lorsque certaines conditions sont réunies. Les tutoriels sur l’envoi de SMS par Raspberry Pi prévoient l’utilisation d’une clé 3G et une carte SD d’un opérateur mobile pour que le Pi dispose d’un numéro de téléphone mobile et puisse envoyer des SMS.

J’ai finalement trouvé 3 solutions :

  • lorsque le destinataire du SMS dispose d’un abonnement FREE, on utilise l’API de notification SMS FREE. C’est la solution la plus simple.
  • Sinon, on peut utiliser IFTTT pour envoyer des SMS lorsque certains événements se produisent. Je l’ai fait pendant longtemps. Le gros inconvénient est que IFTTT n’est pas fiable. Il arrive qu’on ne reçoive le SMS que le lendemain. Cà n’est pas acceptable lorsqu’on veut pouvoir alerter.
  • Enfin, on peut utiliser un agenda google, y créer un événement dès que les conditions prévues sont réunies. Si on a correctement paramétré l’agenda, il enverra un SMS à un destinataire.

Je présente ici les 3 solutions, avec un script PHP placé sur un Raspberry Pi.

Avant de commencer : installer PHP sur le Raspberry Pi

Pour savoir si PHP est installé :

php -v

Si il n’est pas installé :

apt-get update
apt-get upgrade
sudo apt-get install php5 libapache2-mod-php5 -y

Et si curl n’est pas installé :

apt-get install php5-curl

La solution pour un mobile Free

Cette solution très simple ne fonctionne que pour envoyer un SMS à un téléphone FREE.

Obtenir les identifiants de l’API Free

On suit les instructions de « Nouvelle option « Notifications par SMS » chez Free Mobile » pour activer l’option (gratuite) et obtenir une clé d’identification au service. On note aussi notre identifiant d’utilisateur Free Mobile. On obtient les informations suivantes (fausses évidemment mais ressemblantes) :

Utilisateur 12345678
Clé d’Identification KZuaj37069LOSn

Tester l’envoi de SMS via un navigateur

Mettre l’url suivante dans un navigateur internet :

https://smsapi.free-mobile.fr/sendmsg?user=12345678&pass=KZuaj37069LOSn&msg=Bonjour%20Monde%20!

Je reçois un SMS avec « Bonjour Monde ! » comme contenu.

Créer un script PHP pour envoyer le SMS à partir d’un Pi

Créer un fichier test-free-sms.php, avec droits 744 contenant le code suivant :

#!/usr/bin/php

<?php

/* MODIFIER VOS INFORMATIONS ici */
$free_mobile_id = 'YOUR_ID' ;
$free_mobile_key = 'YOUR_KEY' ;

$message = "Bonjour à vous !" ;

$sms_free = al_pi_send_free_mobile_sms( $free_mobile_id, $free_mobile_key, $message  ) ; 

print_r( $sms_free ) ;


function al_pi_send_free_mobile_sms( $id, $key, $txt) {

	/* on doit constituer une url du type
	* https://smsapi.free-mobile.fr/sendmsg?user=12345678&pass=KZuaj37069LOSn&msg=Bonjour%20Monde%20!
	*/
	$url = 'https://smsapi.free-mobile.fr/sendmsg?user=' ;
	$url .= $id ;
	$url .= '&pass=' ;
	$url .= $key ;
	$url .= '&msg=' ;
	$url .= rawurlencode( $txt ) ;

	// envoyer l'url avec une commande CURL
	$ch = curl_init( $url )  ;   
	$timeout = 5;
	
	curl_setopt( $ch, CURLOPT_URL,$url );
	curl_setopt( $ch, CURLOPT_RETURNTRANSFER, 1 );			// return web page = true	
	curl_setopt($ch, CURLOPT_VERBOSE, 1);
	curl_setopt( $ch, CURLOPT_CONNECTTIMEOUT, $timeout );  	// time-out on connect
	curl_setopt( $ch, CURLOPT_CONNECTTIMEOUT, 120 );		// time-out on response

	$data = curl_exec( $ch );
	
	// vérifier que tout s'est bien passé 
	// http://php.net/manual/fr/function.curl-getinfo.php
	if(!curl_errno($ch)) {
		$info = curl_getinfo($ch);
		print_r( $info ) ;
	}	
	
	curl_close( $ch );
	return $info;

}

Avant d’exécuter le code, placer vos identifiants en haut du code. Puis, dans le Pi, en ligne de commande, exécuter :

./test-free-sms.php

Je reçois un SMS dans lequel le « à » a disparu si j’ai oublié d’encoder le fichier en utf8.

Et le contenu de $sms_free est :

On pourra donc créer un message selon le résultat en ajoutant :

if ( $sms_free['http_code'] === 200 ) {
	echo "success \r\n" ; 
} else {
	echo "echec \r\n" ; 
}

Et voilà pour cette solution simple.

La solution avec IFTTT

Pour que les recettes IFTTT fonctionnent, il faut les créer : bouton « create recipe » puis :

  1. cliquer sur « THIS »
  2. Choose trigger channel : ‘maker’ (noter la clé de maker)
  3. Cliquer sur receive a web request
  4. event name = ‘Pi_Manquant’ puis “create trigger”.
  5. cliquer sur “THAT”
  6. Channel ‘Android SMS’ puis cliquer sur “send an SMS” et indiquer le numéro de mobile (avec le code 33 pour la france avant, sans le 0, 33611111111) puis définir les paramètres, en particulier comment utiliser value1, value2 et value3.

Ensuite il « suffit » d’envoyer la requête sous la forme suivante pour que l’événement soit déclenché et la recette IFTTT se réalise !

http://maker.ifttt.com/trigger/Pi_Manquant/with/key/YOUR_KEY?value1=fuel&value2=%22Sunday%2004%2010%202015%2006:20:01%20CEST%22&value3=2400

Noter aussi qu’IFTTT permet de faire plein de choses, comme nous prévenir qu’il va pleuvoir demain ou, plus utile, envoyer un mail lorsque notre mobile reçoit un SMS.

On crée un fichier test-ifttt.php contenant :

#!/usr/bin/php

<?php

/* MODIFIER VOS INFORMATIONS ici */
$maker_channel_key = 'VOTRE_CLE' ;

$event = 'pi_missing' ;
$value1 = "Pi hostname" ;
$value2 = "VALEUR 2" ;
$value3 = "valeur 3" ;

$ifttt = al_pi_send_ifttt( $maker_channel_key, $event, $value1, $value2, $value3  ) ; 

if ( $ifttt['http_code'] === 200 ) {
	echo "success \r\n" ; 
} else {
	echo "echec \r\n" ; 
}


function al_pi_send_ifttt( $key, $event, $val1, $val2, $val3 ) {

	/* on doit constituer une url du type
	* http://maker.ifttt.com/trigger/Pi_Manquant/with/key/YOUR_KEY?value1=fuel&value2=%22Sunday%2004%2010%202015%2006:20:01%20CEST%22&value3=2400
	*/

	// encoder les valeurs
	$data = '?value1=' ;
	$data .= urlencode( $val1 );
	$data .= "&value2='";
	$data .= urlencode( $val2 );
	$data .= "'&value3=";
	$data .= urlencode( $val3 );
		
	// encoder l'url complète
	$url = 'http://maker.ifttt.com/trigger/' ;
	$url .= rawurlencode( $event ) ;
	$url .='/with/key/';
	$url .= rawurlencode( $key ) ;
	$url .= $data ;

	// envoyer l'url avec une commande CURL
	$ch = curl_init( $url )  ;   
	$timeout = 5;
	
	curl_setopt( $ch, CURLOPT_URL,$url );
	curl_setopt( $ch, CURLOPT_RETURNTRANSFER, 1 );			// return web page = true	
	curl_setopt($ch, CURLOPT_VERBOSE, 1);
	curl_setopt( $ch, CURLOPT_CONNECTTIMEOUT, $timeout );  	// time-out on connect
	curl_setopt( $ch, CURLOPT_CONNECTTIMEOUT, 120 );		// time-out on response

	$data = curl_exec( $ch );
	
	// vérifier que tout s'est bien passé 
	// http://php.net/manual/fr/function.curl-getinfo.php
	if(!curl_errno($ch)) {
		$info = curl_getinfo($ch);
		// print_r( $info ) ;
	}	
	
	curl_close( $ch );
	return $info;

}

Ensuite dans la ligne de commande du Pi :

./test-ifttt.php

Et on déclenche l’événement

Sur ifttt.com, on peut voir le log de chaque « recette ». Par exemple j’ai vu que l’événement Maker Event « pi_missing » s’est bien déclenché. Mais le SMS arrivera quand IFTTT voudra bien… (c’est gratuit, on ne doit pas se plaindre).

Je trouve par contre que IFTTT fonctionne très bien avec la chaîne GMAIL et envoie des mails immédiatement. Mais si on doit envoyer un message à quelqu’un qui n’a pas de forfait de données sur son téléphone, IFTTT peut quand même être utile, même s’il n’est pas fiable.

La solution avec un agenda Google

Créer un calendrier « spécial Pi » sur google agenda

Dans mon agenda Google, dans la barre latérale de gauche, cliquer sur la flèche à droite de « Mes agendas » et choisir « créer un agenda ». Donner un nom à l’agenda (par exemple « Pi Nautilus ») puis « Créer ». L’agenda est maintenant visible sur le côté gauche, dans la liste des agendas.

Modifier les notifications

Cliquer sur la flèche à droite de l’agenda « Pi Nautilus » et choisir « paramètres » puis aller dans l’onglet « modifier les notifications ».

Agenda Google : régler pour notifier par SMS

Si on veut définir un autre numéro de téléphone comme destinataire du SMS, on clique sur le lien « configuration du mobile ».

A ce stade, si quelqu’un crée ou modifie un événement, le téléphone défini reçoit un SMS.

On peut créer des événements automatiquement par un programme. Cette solution, dans laquelle un Pi crée un événement, lorsque certaines conditions sont réunies, est expliquée dans l’article Interagir avec L&rsquo;agenda Google via l&rsquo;API (OAuth 2.0) .

Et maintenant ?

Vivement que tous les opérateurs de téléphonie mobile fassent comme Free et proposent une API d’envoi de SMS !

Plesk, un site avec des fichiers html ou php, sans CMS

Plesk, un site avec des fichiers html ou php, sans CMS

J’hébergeais sur OVH un site assez simple, qui suit le bon fonctionnement de mes Raspberry Pi. Comme j’ai migré l’hébergement OVH sur un VPS OVH avec Plesk, j’ai également dû déplacer ce site.

J’explique donc ici comment installer un site composé de fichiers php et css dans un hébergement Plesk. Ce site n’a pas de base de données et n’utilise pas de gestionnaire de contenus type WordPress.

Créer un sous-domaine et y transférer les fichiers

J’ai ajouté un sous-domaine dans mon compte Plesk, par exemple domicile.mon-domaine.com.

J’y ai transféré les fichiers de l’hébergement initial en ftp. J’ai placé les fichiers dans un répertoire temporaire ‘temp-al’.

Placer les fichiers au bon endroit

Dans Plesk, tel qu’il est paramétré, les fichiers doivent être rangés comme suit :

  • css dans le répertoire domicile.mon-domaine.com/css
  • php ou html directement dans domicile.mon-domaine.com/
  • favicon.ico à la racine (image 256x256px)
NOTA : mon VPS Plesk étant sous linux, les fichiers doivent tous être avec des fins de ligne en mode linux, et pas windows. Sinon ça ne fonctionne pas. 

Donner l’accès au site

Lorsque le sous-domaine a été créé, Plesk y a placé un fichier index.html. Pour que ce soit index.php qui soit exécuté, il suffit de supprimer le fichier index.html.

Et maintenant, dans un navigateur, http://domicile.mon-domaine.com ouvre bien sur un site défini par le contenu de index.php.

Afficher les erreurs

En tant qu’administrateur, on peut modifier les paramètres PHP du sous-domaine et régler « display_error » sur « on ».

Et voilà !

Plesk, accéder en FTP aux hébergements

Plesk, accéder en FTP aux hébergements

Nous allons voir ici comment se connecter en FTP à un hébergement Plesk, avec des outils comme net2ftp ou filezilla. La documentation Plesk (Accès FTP au site Web) est complète, j’indique juste ici quels sont les paramètres de connexion dans net2ftp ou Filezilla.

Utiliser net2ftp

Attention, il ne faut utiliser que des net2ftp sécurisés et fiables, comme ceux qui sont proposés par les hébergements OVH (ou aussi par un hébergement Plesk si on actionne le service).

Les identifiants et mots de passe FTP des hébergements Plesk sont définis comme indiqué dans ce document Plesk. Le serveur est simplement le nom de domaine concerné sans rien devant (domaine1.com par exemple)

Utiliser Filezilla

Voici le paramétrage (plesk-id et le mot de passe ont été définis dans comptes FTP du domaine mon-domaine.com) :

ftp-vers-site-plesk

Et maintenant

On peut lire d’autres articles de cette série ici :

Hébergement Plesk, sauvegarde des paramètres et sites

Hébergement Plesk, sauvegarde des paramètres et sites

Comme sur un hébergement OVH, il faut sauvegarder régulièrement les bases de données et les fichiers des sites hébergés. Avec un VPS équipé de « Plesk-resellers », il faut également sauvegarder les paramètres liés aux clients, abonnements, packs de service. Nous allons voir comment.

Sauvegarder tout ou partie des données Plesk

Cette partie n’est accessible qu’aux administrateurs du compte Plesk resellers.

Documentation Plesk : Sauvegarder et restaurer les données.

Dans « outils et utilitaires » > « Gestionnaire de sauvegardes », on peut définir les paramètres de sauvagarde, faire des sauvegardes unitaires ou des sauvegardes planifiées.

Qu’est-ce qui est sauvegardé ?

Selon la documentation Plesk Sauvegarder et restaurer les données :

Contenu de la sauvegarde Données incluses
Configuration du revendeur
  • Paramètres personnels du revendeur
  • Packs de services et abonnements
  • Paramètres et configuration du compte client, sites, bases de données, boîtes mails, listes de diffusion
  • Certificats SSL
  • Informations sur les DNS
Configuration et contenu du revendeur Toutes les options ci-dessus, plus :

  • Contenu des sites Web
  • Contenu des mails
  • Contenu des listes de diffusion
  • Contenu des bases de données
  • Logs et statistiques
  • Pages d’erreurs personnalisées

Définir les paramètres de sauvegarde

On peut définir un hébérgement OVH (pro ou perso) comme destination des sauvegardes.

Les paramètres sont définis comme suit (on obtient le nom d’hôte, le nom d’utilisateur FTP et son mot de passe dans le compte OVH de l’hébergement cible) :

Plesk : paramétrage du stockage FTP

Plesk : paramétrage du stockage FTP

 

Attention, la seule difficulté (que je n’ai résolue qu’après plusieurs échanges avec des techniciens OVH), est que Plesk doit pouvoir écrire sur la « racine » de la cible pour vérifier le bon fonctionnement avant de transférer la sauvegarde.

Donc le champ « répertoire » doit obligatoirement contenir quelque chose et le répertoire défini doit déjà exister dans le compte FTP cible. 

Pour une sauvegarde unitaire :

Dans « stocker sous »,

  • le stockage FTP proposé est celui qui a été défini dans les paramètres de sauvegarde.
  • Je ne me souviens pas si j’ai défini le lieu de stockage du serveur.
Plesk : sauvegarder pour le "revendeur"

Plesk : sauvegarder pour le « revendeur »

Planifier des sauvegardes

Voici les réglages que j’ai fait.

Plesk : planifier des sauvegardes

Plesk : planifier des sauvegardes

Sauvegarder le compte et les sites web (client)

Le client a accès à un menu « compte » dans lequel on trouve les boutons « Sauvegarder le compte et les sites Web » et « Sauvegarder les sites Web ».

Documentation Plesk : (Avancé) Sauvegarder et restaurer les sites Web

le fonctionnement est semblable à celui des sauvegardes de l’ensemble de Plesk.

Copier / cloner un site web (client)

Documentation Plesk : Utiliser un site provisoire.

Cette option « copier du site web » est accessible aux clients, selon les réglages de leur abonnement. Attention, cette option ne copie pas la base de données.

Lorsque le client clique sur « copie du site web », il peut choisir ses options :

Plesk : copie de site web

Plesk : copie de site web

On peut utiliser cette fonction pour copier un site vers un autre (le cloner), mais cet autre est OBLIGATOIREMENT un élément du même domaine. Par exemple si je copie « knowledge.parcours-performance.com , je ne peux le copier que vers parcours-performance.com ou un de ses sous-domaines.

Et maintenant ?

Il reste à vérifier que je parviens à restaurer les données sauvagardées si nécessaire.

Cet article fait partie de la série .

Check-list de vérification sécurité et SEO d’un site WordPress

Check-list de vérification sécurité et SEO d’un site WordPress

A la création d’un site, il est indispensable de vérifier la sécurité et l’indexabilité du site WordPress. C’est également indispensable après le transfert d’un site vers un nouvel hébergement. Cette check_list contient des éléments applicables à tout site WordPress et des actions spécifiques au transfert vers un hébergement d’un VPS Plesk. Cet article fait partie de la série .

Vérification de la sécurité

(1) sécuriser tout ce qui peut l’être avec WordPress Toolkit.

Avec Plesk, on dispose du WordPress Toolkit.

Sécuriser un site avec le WordPress Toolkit de Plesk

Sécuriser un site avec le WordPress Toolkit de Plesk

Après avoir cliqué sur « analyser la sécurité », je donne l’autorisation de sécuriser tout ce qui ne l’est pas.

Nota : selon cet article sur Devblog.Plesk, les changements ne sont pas faits en modifiant .htaccess (et n’en lit même pas le contenu pour définir le statut de sécurité). C’est la configuration du serveur web qui est modifiée. Toute modification du .htaccess va remplacer la configuration serveur correspondante.

(2) utiliser toutes les fonctionnalités de Sucuri

J’utilise l’extension gratuite « Sucuri Security – Auditing, Malware Scanner and Hardening » pour la sécurité du site. Les modifications qui suivent sont réalisées avec cette extension.

  • Exécuter tous les « hardening » proposés sauf  « website firewall protection » (pas dans la version gratuite de sucuri) et « error logs » qui « can not be determined ». Attention, je n’ai jamais essayé de voir si Sucuri peut changer correctement le préfixe de base de données. J’ai procédé comme indiqué dans l’article Changer le préfixe de base de données WordPress.
  • Dans Settings / Général (ou par une console d’erreur comme Query Monitor), j’ai eu une erreur indiquant que Sucuri n’a plus l’autorisation de stocker les données de Sucuri dans /home/parcoursz/www/wp-content/uploads/sucuri. Au final pour corriger le problème, il suffit de désactiver Sucuri, supprimer les fichiers stockés dans wp-content/uploads/sucuri puis réactiver Sucuri.

(3) Modifier wp-config.php

  • Vérifier que Sucuri a ajouté define( ‘DISALLOW_FILE_EDIT’, true );  pour interdire la modification de fichiers à partir du tableau de bord WordPress ;
  • En profiter pour ajouter une instruction pour limiter le nombre de versions stockées pour un article ou une page : define( ‘WP_POST_REVISIONS’, 5 );

(4) Ajuster .hataccess

Normalement c’est inutile pour un site monosite. Pour un site multisite, il faudra l’ajuster, mais ce sera l’objet d’un autre article.

Vérification pour le SEO

Après la création d’un site ou son transfert, il faut vérifier quelques points essentiels pour que le site reste correctement indexé par les moteurs de recherche :

(5) Google analytics

  • Vérifier que l’identifiant google analytics du site est toujours correctement défini. Pour moi c’est dans le menu « Insight » puisque j’utilise l’extension « Google Analytics par MonsterInsights« 
  • Vérifier que Google Analytics et Google for Webmasters nous considèrent toujours comme propriétaire du site : j’ai laissé un enregistrement TXT contenant un code de vérification Google dans les enregistrements DNS sur OVH (cf l’article Réglages DNS d&rsquo;un hébergement tiers à domaines gérés par OVH). En principe il n’y a pas de problème mais il vaut mieux vérifier car on peut avoir oublié de transférer un fichier html de vérification ou ne pas avoir défini l’enregistrement TXT.

(6) Yoast SEO

  • Vérifier que les réglages de l’extension sont correctement faits ;
  • Vérifier que la connexion à la search console est faite correctement ;
  • Si les sitemaps dans google for webmasters ne sont pas récents, les soumettre à nouveau ;
  • Dans Google for Webmasters, regarder les erreurs d’exploration et les corriger (redirection) ;
  • Dans un site nouvellement créé, on vérifiera aussi que l’on a correctement rempli les extraits SEO pour l’ensemble des contenus.

(7) vitesse du site

  • Tester le site avec Google Test My Site puis corriger les défauts éventuels. Ce site teste l’ergonomie sur appareil mobile, la vitesse sur mobile et la vitesse sur ordinateur.