Projet week-end: recevoir les notifications d’un système d’alarme DSC par SMS

Chez nous, on a un système d’alarme DSC. Même si plusieurs fournisseurs de télé-surveillance offrent en extra la notification des entrées et sorties par SMS (… et d’autres par des rapports hebdomadaires envoyés par fax), j’ai préféré une solution obscure que je pourrais patenter; une histoire de quelques heures qui augmente drastiquement le plaisir. Envie d’essayer?

Pour y arriver, on a besoin de:

  • Un système d’alarme DSC PowerSeries. L’Installer Code, que les locateurs gardent jalousement, n’est pas nécessaire pour l’opération, mais je n’aurais probablement pas tenté tout ça sans être propriétaire de mon système. En plus, c’est financièrement avantageux!
  • Un serveur Web. J’ai choisi de tout programmer en PHP, mais n’importe quel langage devrait fonctionner.
  • Idéalement, le support de routage de courriels vers un script par votre serveur de mail; dans mon cas, j’ai préféré utiliser CloudMailin.com, qui route gratuitement 200 courriels entrants vers un script PHP.
  • Un Eyez-On 2DS, qui se branche dans la carte du système d’alarme et dans un routeur. Le système le détecte comme un clavier, et lui permet donc de recevoir toutes les notifications du système. Le 2DS les envoie ensuite dans son infrastructure (sans frais mensuels!?), où on peut les traiter. Le 2DS coûte une centaine de dollars.
  • Un compte Twilio; à l’ouverture du compte, on dispose de 30$ de crédit: chaque numéro coûte 1$ par mois et chaque 100 SMS coûtent 1$. Twilio offre aussi un sandbox gratuit pour le développement. Dans une installation de production, on aura besoin d’un numéro aux États-Unis (pour le support des SMS).

Dans les faits, un système PowerSeries et un 2DS pourraient opérer seuls; on pourrait alors se brancher sur le site d’Eyez-On pour avoir l’historique des notifications, qu’on reçoit aussi par courriel (et par SMS, bien que ça ne semble pas fonctionner). J’ai préféré pousser tout ça plus loin pour que ça soit plus flexible — et le tout petit script pour y arriver est disponible un peu plus bas.

Une fois tout terminé, le comportement qu’on souhaite obtenir:

  1. Le système d’alarme détecte un événement et le communique au 2DS.
  2. Le 2DS envoie les informations de l’événement dans les nuages.
  3. Eyez-On envoie les informations de l’événement par courriel.
  4. Le courriel est intercepté par un script PHP qui détermine si l’événement est intéressant.
  5. Si l’événement est intéressant, le script envoie un SMS.

L’opération prend quelques secondes à s’achever et comporte plusieurs incertitudes. Dans un monde un peu plus idéal, le 2DS enverrait les informations directement au script du #4, ce qui réduirait la dépendance à CloudMailin.com et/ou aux courriels. Dans un monde encore plus idéal, le 2DS pourrait être contrôlé par une petite application Processing; on passerait donc du #1 au #5, éliminant la dépendance au service (gratuit…) d’Eyez-On, au courriel, au serveur Web, etc. Donc: la solution fonctionne bien, mais ne devrait pas être utilisée comme solution de sécurité, mais plutôt comme solution d’information, notamment pour savoir à quelle heure les enfants ou la femme de ménage arrivent, ou si le chat déclenche des fausses alarmes à cause de la trop grande sensibilité des détecteurs de mouvement.

Première étape: recevoir des courriels

Idéalement, configurez votre serveur Web pour intercepter les courriels et les acheminer à votre script. Dans la plupart des cas, il suffit de créer un courriel d’alias qu’on pointe à «|/home/user/www/script-qui-recoit.php». Certains hébergeurs refusent toutefois. Si vous doutez, essayez la marche à suivre (en anglais).

Sinon, solution plus simple, on peut utiliser CloudMailin.com. Il suffit de fournir l’URL de notre script pour y associer une adresse @cloudmailin.com. Dès qu’un courriel est reçu à cette adresse, son contenu est acheminé à notre script via POST. Les 200 premiers courriels par mois sont gratuits.

Pour l’instant, contentons-nous de recevoir les courriels, et de les renvoyer à notre adresse préférée.

Deuxième étape: envoyer les notifications à notre script

Pour l’instant, rien ne lie le système d’alarme au script PHP. Il faudra donc brancher le 2DS dans le port de clavier du système d’alarme (vert-vert, jaune-jaune, noir-noir, rouge-rouge…) et dans Internet. Ensuite, on l’active sur le site d’Eyez-On, puis on ajoute un contact; ce contact doit recevoir toutes les notifications (donc on coche tout!), à l’adresse courriel du script. Dans mon cas, j’ai préféré les envoyer à mon adresse à moi, et utiliser un filtre Gmail pour les transférer au script.

Désormais, votre script PHP recevra toutes les alertes, sous forme d’un courriel:

Security Event: Opening By User Code 1
Location: Casa Maison Home
Time: 2011-11-09 15:16:23
Partition: 1

Troisième étape: traiter les notifications

Maintenant qu’on reçoit les notifications, il faut les traiter. Pour garder tout simple, on peut couper le courriel par lignes, puis chaque ligne en deux parties, et placer tout ça dans un array. Dans l’exemple, on a donc 1 notification caractérisée par 4 informations.

function getEventInfo($message) {	
	$info = array();
	
	foreach(explode("\n", $message) as $line) {	
		$pieces = explode(": ", $line);
		$info[$pieces[0]] = $pieces[1];
	}
	
	return $info;	
}

Une fois le array généré, on peut facilement le traiter pour traiter différemment (ou ignorer) les notifications selon la date, l’heure ou leur nature.

Quatrième étape: envoyer un SMS

J’aime beaucoup Twilio. Pour envoyer le SMS, il suffit de faire un appel cURL avec le numéro de l’expéditeur, le numéro du destinataire, le corps du message et nos informations d’authentification. Tropo aurait aussi pu être utilisé, mais il est beaucoup plus lourd. L’envoi d’un SMS avec Twilio se fait en quelques lignes:

function sendMessage($message, $recipient) {
	$fields_string = "";
	$fields = array(
            "From"=>urlencode("+10000000000"),
            "To"=>urlencode($recipient),
            "Body"=>urlencode($message));
	
	foreach($fields as $key=>$value) { $fields_string .= $key."=".$value."&"; }
	$fields_string = rtrim($fields_string,"&");

	$ch = curl_init();
	curl_setopt($ch,CURLOPT_URL,"https://api.twilio.com/2010-04-01/Accounts/{user}/SMS/Messages");
	curl_setopt($ch,CURLOPT_POST,count($fields));
	curl_setopt($ch,CURLOPT_POSTFIELDS,$fields_string);
	curl_setopt($ch, CURLOPT_USERPWD, "{user}:{pwd}");
	curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
	$result = curl_exec($ch);
	curl_close($ch);
}

Et ça fonctionne! Mon script qui traite les courriels de CloudMailin.com et qui les renvoie sous forme de SMS via Twilio est disponible ici.

Quelques pistes d’améliorations:

  • Ça serait intéressant de pouvoir fournir un URL à Eyez-On, pour qu’ils puissent ensuite envoyer à cet URL toutes les notifications. J’ai fait la demande, et ils m’ont répondu que c’était dans la wishlist. Ça permettra éventuellement d’éliminer la dépendance aux courriels, et donc de gagner quelques secondes.
  • Mieux encore serait d’éliminer la dépendance à l’infrastructure d’Eyez-On. Ça empêcherait les mises à jour du périphérique, mais ça éliminerait la dépendance à leur serveur propriétaire. Pourquoi pas pouvoir définir sur la carte une URL à qui envoyer les notifications, en plus de les transmettre à Eyez-On?

Des idées ou des suggestions d’améliorations?

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *