Dec.30

Choisir, installer et domotiser son système alarme: l’alarme du geek connectée au poignet et dans les nuages – 2ème partie

Après avoir installé et configuré le système Paradox et découvert le protocole de communication de la EVO192 dans la 1ère partie de cet article, nous allons maintenant découvrir quelles sont les possibilités qui s’offrent à nous en mariant alarme et domotique.

paradox

Intégration de l’alarme dans la Constellation

Pour ceux qui suivent ce blog, vous avez sans doute déjà entendu parler de ma plateforme “Constellation” qui me permet d’interconnecter tous les objets de la maison. Du miroir à Slight, en passant par l’alarme comme nous allons le voir, la domotique Z-Wave avec Vera Lite, le thermostat Nest, et j’en passe; cette plateforme est au centre de tout mon système “domotique” au sens large.

Je communiquerai prochainement sur cette plateforme mais voyons dès maintenant comment intégrer le système de sécurité Paradox dans la Constellation.

Pour faire simple la Constellation orchestre des “packages” qu’elle exécute à distance sur des “Sentinelles”. J’ai donc un package “Paradox” qui tourne sur la Sentinelle du serveur où est physiquement connecté le port USB du module PRT3 du système Paradox.

Control Center de la Constellation

Chaque package peut produire ou consommer des données d’autres packages. Cette donnée produite est appelée “StateObject” ou objet d’état. Par exemple le package Paradox produit des StateObjects pour chaque utilisateur, zone et secteur du système.

Le rôle du package Paradox est donc de “maintenir” à jour ses StateObjects diffusés dans la Constellation en relation avec le module PRT3.

L’API Constellation met à disposition une méthode “PushStateObject” pour envoyer un objet d’état dans la Constellation. Par exemple, pour synchroniser l’état de chaque zone de l’alarme dans la constellation, je peux écrire le code suivant :

A chaque changement de statut d’une zone, l’objet d’état identifié par le nom de la zone (e.Zone) sera mis à jour dans la Constellation. Bien entendu au démarrage du package des “RequestZone” sont envoyées pour récupérer l’état initial des zones.

Comme la plateforme Constellation est basée sur SignalR, il est possible de joindre la Constellation depuis une application .NET ou une simple application Javascript.

J’ai donc réalisé une application Web client-side grâce à AngularJS, jQueryMobile et la librairie Constellation JS (elle-même basée sur l’API JS de SignalR).

A la connexion au hub de la Constellation, je demande les StateObjects du package “Paradox” et je m’inscris aux modifications :

Dans mon contrôleur AngularJS j’ajoute simplement le fait d’enregistrer les StateObjects dans une variable de scope :

Et pour finir, dans mon template HTML, j’ai simplement ajouté une table jQueryMobile qui boucle sur les StateObjects avec un filtre pour n’afficher que ceux du type “ZoneInfo” (et non les UserInfo ou AreInfo que le package produit également). Pour chaque zone mon template affiche donc le nom de la zone, son état (ouvert ou fermé), si la zone est en alarme et la date du dernier changement.

Une directive (highlight-on-change) permet aussi de faire un petit effet de “HighLight” lorsque la zone change d’état afin d’attirer le regard !

Le rendu dans une page Web :

Interface Web de l'alarme

J’ai également ajouté un groupe de bouton pour indiquer le statut du secteur (armé, partiellement armé ou désarmé). Cette information est “bindée” sur le StateObjects du secteur (Area1 dans mon cas).

Ce qui est très intéressant c’est que tout est en temps réel ! Basé sur SignalR, le client Web utilise les web-sockets et l’interface se met à jour instantanément dès qu’un évènement de l’alarme est levé.

ASP.NET SignalR for real-time features

Les packages de la Constellation peuvent également s’échanger des messages entre eux ou avec les applications “Client”. Dans un package développé en C# il suffit d’ajouter un attribut sur une méthode pour l’exposer dans la Constellation.

Par exemple pour permettre à la Constellation d’armer le système j’ai tout simplement écrit dans le package Paradox :

Côté client, dans une “popup” jQueryMobile, je demande à l’utilisateur de saisir son PIN et lorsqu’il clique sur le bouton d’armement, j’appelle simplement la méthode Javascript suivante :

Le corps de la méthode envoie un message dans le Hub SignalR de la Constellation en indiquant que le message est à destination (scope) du package “Paradox” pour invoquer la méthode “AreaArm” avec l’ensemble des arguments nécessaires à l’armement de l’alarme (n° du secteur, mode d’armement et code PIN).

Contrôle de l'alarme

Ainsi avec un peu d’HTML et de JS et grâce à la Constellation (sans oublier AngularJS/JQM et SignalR), j’ai développé très rapidement une application Web de pilotage et supervision du système d’alarme en temps réel, dans une interface responsive qui s’adapte aussi bien sur un ordinateur, une tablette, un  Smartphone ou même une montre afin de pouvoir piloter mon alarme depuis n’importe où !

En tout et pour tout (code JS et HTML confondu), la page ne fait même pas 250 lignes !

Interface sur la montre connectée Omate TrueSmart

Interface sur un smartphone Android 4.4Interface sur un smartphone Android 4.4

Aller plus loin avec son alarme et la Constellation

Comme déjà vu dans ma présentation de The Mirror, il est très facile avec la Constellation d’utiliser l’état des zones de l’alarme pour entreprendre des actions grâce au “StateObjectLink” permettant de lier une propriété .NET avec un objet d’état de la Constellation.

Miroir allumes-toi …

Logo The Mirror

Par exemple, pour allumer mon miroir dès qu’il y a du mouvement dans l’entrée, j’ajoute un lien vers le StateObject “ZoneInfo12” (n° de la zone dans mon l’entrée) du package “Paradox” puis de m’abonner à l’évènement ValueChanged pour être informé dès que l’état de ce détecteur change.

Ne reste plus qu’à envoyer un message dans la Constellation à destination du package “WakeOnLan” en invoquant l’ordre de réveiller l’adresse MAC du miroir!

Je fais sensiblement la même chose avec l’éclairage de l’entrée afin d’allumer la lumière dès que la porte d’entrée s’ouvre le soir.

Ouvres-moi la lumière quand je rentre …

lighting-control-automation

La propriété IsDayLight est-elle même “bindée” vers un StateObject produit par un Raspberry qui analyse la luminosité extérieure. Lorsqu’on désactive le système d’alarme (mise à jour du S.O. du secteur : Area1) et qu’il fait nuit sans qu’on ne soit pas le matin, on  déclenche une scène de la Vera pour allumer l’ensemble des lampes du salon. S’il est entre minuit et 5h du matin, on déclenche seulement une petite lumière (celle du bar).

Pour les puristes qui souhaitent bien comprendre le code ci-dessus, j’ai dans une classe mère défini les propriétés “IsFullArmed” (armement complet), “IsStayArmed” (armement partiel pour la nuit) et “IsArmed” (l’un ou l’autre) liées au StateObject du secteur principal de l’alarme.

… et dis-moi bonjour !

Une fonctionnalité aussi amusante que surprenante est d’entendre sa maison nous saluer en rentrant chez soi !

hello

En effet, basé sur mon système audio multi-room maison nommé “S-Sound”, il est possible, toujours depuis la Constellation, de “speecher” (TTS) n’importe quel texte dans n’importe quelle pièce !

Par exemple pour me saluer en rentrant chez moi, j’attends que l’utilisateur pénètre dans la salle à manger après s’être tranquillement dévêtu dans l’entrée.

Pour personnaliser l’annonce, je regarde quel est l’utilisateur qui a désarmé l’alarme. Pour cela il suffit d’ajouter un lien vers les StateObjects de type “Paradox.UserInfo” afin de récupérer la liste des “S.O.” représentants les utilisateurs. Sur chaque utilisateur, la propriété “LastActivity” me permettra de trouver la personne qui vient juste de désarmer le système.

De manière très simple, je peux écrire :

La méthode “DoAsync” est une méthode permettant d’exécuter de manière asynchrone (dans une Task) une fonction en attendant qu’une condition soit validée. Ici, j’envoie l’ordre au package “S-Sound” de speecher dès que le détecteur de la salle à manager s’ouvre, c’est à dire, dès qu’un mouvement est détecté dans la salle à manger !

Dans la version complète, la maison prend garde à ne dire bonjour et bonsoir qu’une seule fois par jour et par personne en restant muette en pleine nuit Winking smile

Éclaires-moi en pleine nuit

flashlight

En suivant le même principe, il m’arrive de me lever alors que tout est fermé au RDC. On peut le savoir grâce à la scène Vera “Tout fermer en bas” qui est active. En descendant les escaliers je suis repéré par le capteur de la cuisine qui entreprend d’allumer immédiatement la lampe du plan de travail, petite lumière permettant de voir sans être éblouie ! Ainsi plus besoin de chercher l’interrupteur ou d’évoluer portable à la main en guise de lampe de poche !

Tout comme pour l’éclairage de l’entrée ou le miroir, un background task permet de fermer cette lumière après quelques minutes d’inactivité dans la pièce.

Ouvres-moi les volets le matin quand je me lève …

sunrise-645x250

Autre scénario facilement intégrable grâce aux inputs de l’alarme : la gestion des volets ! Lorsque l’alarme est désactivée le matin ou en journée alors qu’il fait jour, les volets (pilotés là aussi par la Vera) sont automatiquement ouvert.

Très pratique le matin, le temps de descendre les escaliers après avoir désactivé l’alarme vous arrivez dans votre salon avec tous les volets remontés Sourire

Maison, ferme tout quand je pars ou que je dors…

12314212

L’alarme pilote ainsi l’ “hibernation” de la maison. Le scénario ci-dessous permet, lorsque l’alarme est armée de fermer les volets et lumières à notre place, mais aussi l’ampli, le NUC, la TV ou encore S-Sound (système audio multi-room maison).

Dans le cas où on part se coucher à l’étage la maison ne change rien aux étages, cependant en cas de départ de la maison, l’alarme sera armée totalement et donc éteindra tout ce qu’il se trouve aux étages (TV de la chambre, lumières, etc..).

Nest, je sors …

NEST-Learning-Thermostat

Enfin pour finir, j’ai récemment changé mon thermostat par un Nest. Cependant je ne voulais pas activer le mode “auto-absence” intégré au Nest qui se base sur le détecteur de mouvement intégré. A la place, pour avoir une information beaucoup plus fiable, j’utilise l’alarme !

Si l’alarme est armée complètement, c’est que personne ne se trouve dans la résidence. Il me reste plus qu’à envoyer un message au package “Nest” dans la Constellation pour activer ou désactiver le mode “Absence”.

Cela se traduit par une ligne :

Historisation des données le Cloud avec Windows Azure Table

Comme vous l’avez compris, interconnexion des packages dans la Constellation est une tâche très facile, car native à la plateforme.

Il est alors aisé de développer un package à l’écoute des changements de State Objects pour les enregistrer dans une table afin de garder un historique des changements.

Comme j’ai beaucoup de package et que ces derniers peuvent produire beaucoup de donnée, j’ai opté pour les Windows Azure Table, un service de stockage No-SQL dans le Cloud Windows Azure.

Windows Azure

Comme je ne connais pas à l’avance la liste exacte des StateObjects, je ne vais pas utiliser des propriétés liées (les StateObjectLink) mais plutôt définir un handler sur les changements de StateObjects (peu importe lequel) et m’abonner aux packages dont je souhaite historiser les SO.

Avec l’API .NET de Constellation le package ne fait que quelques lignes :

Dans le cas ci-dessus, la valeur du StateObject sera enregistré en JSON dans une table portant le nom du package source.

En analysant ma table avec un outil comme Azure Storage Explorer :

Lecture de la table avec Azure Storage Explorer

Autre solution intéressante, étant donné que les Azure Table sont des tables No-SQL sans schéma fixe, est d’écrire les propriétés du StateObjects comme colonne de notre table nous évitant ainsi de devoir parser le JSON. Pour cela j’ai utilisé la classe “ElasticTableEntity“ (source) permettant d’injecter dans une Azure Table une entité dynamique :

Ce qui me donne dans ma table ce genre d’enregistrement :

Lecture de notre table dynamique avec Azure Storage Explorer

Bien sûr en fonction du type d’enregistrement (déclaré par le “StateObjectType”) les colonnes seront plus ou moins remplies. Les “IsOpen”, “IsTamper” ou “InAlarm” par exemple sont des propriétés propres aux statuts de zone (type “Paradox.ZoneInfo”). Leurs valeurs seront donc “NULL” pour les autres enregistrements comme les statuts de secteur (AreaInfo).

C’est donc en quelques lignes grâce à l’API .NET de la Constellation et des Azure Storage, qu’il est possible d’historiser tous les évènements de notre alarme Paradox dans le temps ou même des autres packages de la Constellation comme l’utilisation de l’ampli, de la TV, des devices Z-Wave, des infos météo de la NetAtmo, du thermostat Nest, de la balance FitBit et j’en passe ….

Analyse des habitudes avec Excel et Power Query

excel

Avec Microsoft Excel 2013 et le plugin Power Query, il devient très facile d’utiliser nos données enregistrées dans les Azure Tables. Dans le menu “Power Query”, ajoutons notre connexion vers les “Windows Azure Table Storage” :

Chargement des données dans Power Query

Nous arrivons alors vers un éditeur de requête :

Power Query

Libre à nous d’ajouter autant d’étape que l’on souhaute pour préparer la données à injecter dans notre fichier Excel. Nous pouvons filtrer, réorganiser les colonnes, ajouter du code “M”,etc.

Par exemple, cliquons sur le bouton “Expand” de mon “Content” afin d’étendre les propriétés de mon entité dans la table Azure. Dans la 1ère version de notre package, la valeur du StateObject est enregistré en JSON :

Chargement d'un document JSON

Pour étendre cela, je vais ajouter une colonne pour parser la valeur JSON :

Chargement d'un document JSON

Ma nouvelle colonne devient alors un “Record” que je peux donc “Expand” :

Power Query

Cependant pour éviter de devoir appliquer ces deux étapes à chaque ligne de notre table (charger le document JSON et éclater l’enregistrement), nous allons travailler sur le modèle de “ElasticTableEntity”.

Les étapes de base sont donc :

  1. Charger la source (Compte Azure Storage)
  2. Naviguer sur la table “Paradox”
  3. Etendre (Expand) le contenu en ne sélectionnant que les colonnes “IsOpen”, “InAlarm”, “Id”, “Type” “Name” et “LastActivity”
  4. Appliquer un filtre pour ne sélectionner que les enregistrements dont type est “ZoneInfo”
  5. Supprimer la colonne “Type”
  6. Réorganiser l’ordre des colonnes
  7. Changer le type de la colonne “LastActivity” en date/time
  8. Trier les enregistrements par date croissante

Création de la requête sous Power Query

Enfin, j’ai également ajouté une colonne “Weekday” pour indiquer le jour de la semaine :

Ajout du jour dans la requête Power Query

Une fois ma requête préparée, les données sont chargées dans une table Excel :

Données chargées dans la table Excel

Pour ma part, je voudrais également connaître le temps entre deux états pour chaque zone. C’est à dire, être capable à chaque changement d’état d’une zone, de calculer le temps écoulé entre l’état d’avant !

Je ne peux pas le faire en Power Query car on ne peut analyser les autres enregistrements ! Dans mon cas, il faut chercher la prochaine ligne qui porte le même nom que la zone en cours et dont l’état est différent afin de calculer la différence de temps.

J’ajoute donc une colonne à ma table pour entrer la formule Excel suivante :

{=INDEX(F:F;MATCH(B2;IF(C3:$C$24363 = NOT(C2); B3:$B$24363);0)+ROW(B2))-F2}

Pas évident à déchiffrer, je vous avouerai que j’ai mis un bon paquet de temps à l’écrire n’étant pas un expert d’Excel !  Il s’agit d’une formule matricielle qu’il faut exécuter avec la combinaison [Ctrl] + [Maj] + [Enter].

Dans la colonne “C” j’ai l’état de la zone en booléen ‘'(TRUE = ouverte, FALSE= fermée).  Le IF dans une formule matricielle permet de boucler sur la liste des éléments en dessous de mon enregistrement afin de trouver l’état inverse et retourne la valeur de la colonne B. Je défini ma formule sur le premier enregistrement, ligne 2. Je cherche donc l’inverse C2 dans la liste de C3 à la fin de mon document (ici en C24363) et je renvoie la valeur de la colonne B (le nom de la zone).

Cette valeur est ensuite passée dans un MATCH de type “exact” sur B2, ce qui veut dire qu’on cherche le numéro de la ligne en dessous de notre enregistrement dont le nom de la zone (colonne B) est égale à notre zone courage (ici B2). A ce stage, ma formule me renvoie le 1er de ligne en dessus de mon enregistrement où l’état de la zone a changé ! Facile Smile

La suite est plus simple, je récupère la valeur (par la fonction INDEX) de la colonne “F” (contenant la date complète de l’évènement) pour la ligne où l’état de ma zone a changé, ce qui s’obtient en additionnant le n° de la ligne obtenu par le MATCH et le n° de la ligne courante (par la fonction ROW).

Une fois la date complète de l’évènement indiquant le changement d’état de la zone courante, je n’ai plus qu’à faire une soustraction par rapport à la date de l’évènement afin de connaitre le temps écoulé ! CQFD !

Un [Ctrl] + [Maj] + [Enter] pour exécuter la formule matricielle puis je demande à >Excel d’utiliser cette formule pour chaque ligne du tableau :

Execution de la formule matricelle

Une fois mes données préparées je peux créer un Power Pivot. Par exemple, je sélectionne comme ligne le nom de mes zones, dans les colonnes les valeurs que je défini par :

  • Temps total d’ouverture comme la somme de la colonne “Duration” calculée par notre formule matricielle
  • Temps moyen d’ouverture comme la moyenne de notre “Duration”
  • Nombre d’ouverture comme le nombre de “Duration” (en gros le nombre d’enregistre pour la zone analysée)

Et en quelques clics, j’ai donc le reporting :

Power Pivot Analyse par zone

Autre rapport très facile à faire, je sélectionne dans mon Power Pivot le nom des zones comme colonne et le nom des jours de la semaine comme ligne afin d’afficher le nombre d’occurrence comme valeur.

En faisant un graphique de mon pivot, j’obtiens la répartition moyenne par semaine :

Analyse hebdomadaire

De la même façon, je peux sélectionner la “LastActivity” comme ligne puis faire un groupement par “Heures”. J’obtiens alors le nombre d’ouverture par zone pour chaque heure de la journée :

Analyse journalière

Conclusion

Comme vous avez pu le découvrir à travers ces deux articles, une alarme est une mine d’or d’information pour adapter le comportement de la maison.

Je suis donc partie prenante sur le fait qu’un système domotique ne peut assurer la fonction d’alarme ! Cette tache critique doit être déléguée exclusivement à système dédié à cela. Cependant ce système de sécurité doit pouvoir exposer les événements qu’il traite afin de d’y connecter une plateforme domotique pour l’élaboration de scénarios avancés comme nous avons pu le voir dans cet article.

N’hésitez pas à me contacter pour toutes vos questions autour des systèmes d’alarme et des extensions possibles dans le monde de la domotique.

Domotique,Alarme,Constellation
Share this Story:
  • facebook
  • twitter
  • gplus

Comments(13)

  1. Trackback: Choisir, installer et domotiser son système alarme: l’alarme du geek connectée au poignée et dans les nuages – 1ère partie | Sebastien.warin.fr

  2. Paqueuc
    le 31 mars 2015 à 22:04

    Bonjour,
    Félicitation pour ce bel article et pour le temps passé à comprendre cette alarme. Le hasard fait que j’ai la même EVO192 mais Je reconnais n’y avoir pas mis les mains du tout. J’y remonte une mise en marche et un arrêt par un contact sec mais je me suis arrêté là. J’avais regardé le PRT3 mais je n’y suis pas allé, par manque de courage et parce que l’équilibre actuel me convient (j’adresse l’équivalent de tes autres scénaris par d’autres biais). Peut-être vais-je reprendre mon courage à 2 mains avec ton article. En tout cas, c’est bien de l’avoir fait car il y a encore quelques mois, il n’y avait pas grand chose sur ce sujet sur le net.

  3. Oll
    le 25 avril 2015 à 21:15

    Merci Sébastien pour cet excellent article, je cherchais des infos sur Paradox Evo avant d’en finaliser l’achat et tes billets m’éclairent énormément sur les possibilités de cette carte.
    Une fois reçu le matériel, je me re-penche sur ton tuto.
    Encore merci (y)

  4. Trackback: S-Sound : la solution audio multi-room connectée dans la Constellation - Sebastien.warin.fr

  5. Trackback: S-Panel : une interface domotique et IoT multi-plateforme avec Cordova, AngularJS et Constellation–ou comment créer son dashboard domotique mural - Sebastien.warin.fr

  6. Trackback: S-Opener : connectez et sécurisez votre porte de garage avec la plateforme Constellation et un Raspberry Pi – La porte de garage intelligente ! - Sebastien.warin.fr

  7. Alex
    le 10 novembre 2015 à 23:23

    Nello Sebastian, can you help me, for my evo 192? Do you speak italian?
    I can to pay you
    Thanks. Alex

  8. fradcourt
    le 26 avril 2016 à 21:19

    Bonjour,

    Je possède une centrale Paradox SP7000 avec les PGM 1 à 4 déjà actives sur un petit module relais, la PGM 5 est utilisée pour une sirène.
    J’ai câblé une extension PGM4 avec actuellement le relais 1 câblé en NO et le relais 2 câblé en NC (les relais 3 et 4 sont en réserve).
    J’ai programmé ces deux nouvelles sorties PGM via Winload (relais 1 e la PGM4 en PGM 6 groupe d’évènement 9 et le relais 2 de la PGM4 en PGM7 (groupe d’évènement 10).
    Ma question est la suivante, lorsque j’active ces PGM 6 ou PGM7, via IP paradox ou le module fonction VDM3, cela ne réagit pas.
    Je suppose que je devrais pouvoir assigner chaque relais au n° de PGM choisi, mais je ne trouve pas comment faire avec Winload ??
    Nota : j’ai trouvé une doc qui indique que ces 4 relias de la carte PGM4 sont assignées automatiquement aux PGM 9, 10, 11, 12 pour la SP7000, le problème est que la fonction vocale du VDM3 ne propose que d’activer ou de désactiver les fonctions PGM de 1 à 8 ??
    Je ne sais pas si cela est clair ??
    D’avance, merci pour votre aide.

  9. Frédéric
    le 18 mai 2016 à 15:09

    Bonjour Sébastien,

    J’ai également une alarme Paradox Evo192 et je cherche une passerelle vers jeedom ou autre box domotique je compte acheter le module PRT3 mais avant j’aimerai trouver qqch qui fera le lien entre les 2.

    Merci

    Fred.

  10. Trackback: Découverte des ESP8266 : le microcontrôleur connecté par Wifi pour 2€ au potentiel phénoménal avec Constellation - Sebastien.warin.fr

  11. Trackback: S-DoorBell : connecter sa sonnette à Constellation avec un ESP8266 ou comment protéger le sommeil de son enfant, la sonnette propulsée dans Constellation ! - Sebastien.warin.fr

  12. CHARLES JOUBIN
    le 18 novembre 2017 à 21:57

    Bonsoir sébastien,

    je n’arrive pas à programmer ma centrale EVO avec clavier TM50
    pouvez vous m’aider?

    merci par avance

    Charles

  13. Unyx
    le 27 février 2019 à 07:34

    Excellent !
    Monstrueux même 😅
    Après env. 1 mois à me renseigner sur les systèmes d’alarmes, enfin un blog technique.
    D’ailleurs, j’avoue que tout ce que vous faites (prog complète, scénario alarme/domotique, remontée d’états, …) correspond en tout point à ce que j’attends de la part de tels systèmes en 2019, mais j’ai peur de ne pas avoir le tps de faire cela.
    Et les rares installateurs à qui j’ai pu expliquer mes envies semblent dépasser dès la 2 ou 3eme questions un peu pointu…
    Je vais essayer de me familiariser avec le contexte, et qui sait, profitez de vos conseils très éclairés pour meme lancer !
    En tout cas un grand bravo pour le travail réalisé !

Leave a comment

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur la façon dont les données de vos commentaires sont traitées.

Comment