Sommaire
Découverte de Tizen
La Samsung Gear S2 tourne sous Tizen. Cet OS a été initié par Samsung sous le nom LiMo (Linux Mobile) avant d’être renommé en 2011 par Tizen lorsque qu’Intel a rejoint le projet en abandonnant MeeGo. Depuis 2012, Tizen est développé par la “Tizen Association” qui regroupe entre autres Samsung et Intel mais aussi Huawei, Fujitsu, NEC, Panasonic, Orange, NTT DoCoMo ou encore Vodafone.
Dans ses premières versions toutes les applications Tizen étaient des applications HTML/JS permettant de garantir une portabilité entre les différents équipements. Depuis la version 2.0 sortie en 2013, il est également possible de développer des applications natives. C’est également à cette date que Samsung a annoncé l’abandon de son précédent système Bada pour se consacrer exclusivement à Tizen.
On retrouve Tizen dans plusieurs équipements de la marque : des smartphones (série Samsung Z), tablettes ou PC aux wearables (série Gear) en passant par les TV comme la dernière UN65H8000AF ou les appareils photos (comme le NX1). Cet OS a pour objectif d’équiper une multitude équipement dont des produits électroménagers (micro-onde, lave-linge, réfrigérateur), des voitures, des imprimantes, etc…
Hello World Tizen
Pour commencer, rendez-vous sur le site développeur Samsung pour télécharger le SDK Tizen.
Une fois la base installée, il faudra lancer l’Update Manager afin de sélectionner les composants dont vous avez besoin.
Dans notre cas, nous allons télécharger le Framework “Wearable” 2.3.1 pour développer des applications pour la Gear S2 ainsi que les outils du SDK Tizen (dont l’Emulateur Manager) mais surtout, dans la catégorie “Extras”, les extensions “Tizen Wearable” et le Certification Manager.
Pour développer une application Tizen Wearable, on peut soit faire une application “Web” en utilisant HTML5/CSS/JavaScript, soit une application native C/C++ ou soit une application hydride (Web + native).
Ces applications Wearables peuvent être rangées dans deux catégories :
- “Standalone” : fonctionne sur votre montre de manière autonome
- “Companion” : est liée à une application “host” qui tourne sur un mobile (Tizen ou Android)
Lançons donc l’IDE Tizen, un IDE basé sur Eclipse. Nous pouvons alors créer un nouveau projet à partir de template ou d’exemple prêt à l’emploi.
Ici la page HTML est un simple Hello World avec quelques lignes de JS pour changer le contenu d’une div au clic et gérer le bouton « back ».
Pour tester votre application, vous disposez du « Emulator Manager » vous permettant de créer des VM pour émuler votre Gear S2 et tester vos applications en local :
Comme pour le développement d’une application Cordova/Ionic sur Android, vous disposez de l’inspecteur Chrome intégré :
Bien entendu, vous pouvez également déployer et debugger directement sur votre montre. La première chose à faire est d’activer le débogage dans les paramètres de votre Gear S2 et de la connecter sur votre réseau Wifi.
Depuis le “Connection Explorer” de l’IDE Tizen, vous pourrez alors ajouter un nouveau “Remote Device” en spécifiant l’IP de votre Gear :
Vous devrez alors approuver la connexion sur votre montre :
Après quoi elle sera connectée dans l’IDE Tizen de la même manière que l’émulateur :
Nous pouvons alors relancer l’application en mode “Run” ou “Debug” :
Avec toujours avec la possibilité de faire du “Remote Debug” avec l’inspecteur Chrome directement sur la montre !
Créer une application Tizen connectée à Constellation
Comme il s’agit d’une application Web/Javascript, nous pouvons simplement utiliser la librairie JavaScript de Constellation. Et pour simplifier d’avantage le code, utilisons AngularJS et son module Constellation.
Créons donc un nouveau projet Tizen Wearable :
Puis ajoutons les libraires Constellation dans le dossier « js » :
Après avoir référencé ces libraires dans la page « index.html », éditons le fichier « app.js » à la racine pour créer un contrôleur AngularJS en y injectant le module Constellation.
Nous initialiserons le client Constellation avec l’URI de votre Constellation et une clé d’accès :
1 2 3 4 5 6 7 |
var swatch = angular.module('swatch', ['ngConstellation']) .controller('MainController', ['$scope', 'constellationConsumer', function ($scope, constellation) { constellation.initializeClient("https://monServerConstellation.com/constellation", "MonAccessKey", "SWatch"); constellation.connect(); }]); |
Pour chaque StateObject reçu de la Constellation, stockons-le dans une variable de notre scope Angular ce qui nous permettra de les exploiter dans le template HTML :
1 2 3 4 5 6 7 8 |
constellation.onUpdateStateObject(function (message) { $scope.$apply(function () { if ($scope[message.PackageName] == undefined) { $scope[message.PackageName] = {}; } $scope[message.PackageName][message.Name] = message; }); }); |
Enfin, lorsque que nous sommes connecté à Constellation abonnons-nous aux StateObjects des différents packages de notre Constellation que nous souhaitons intégrer dans notre application Tizen.
Pour ma part je demande les StateObjects du thermostat Nest, des caméras de sécurité connectés à ZoneMinder, de mon système home-made de monitoring des ressources énergétiques S-Energy (basé sur un Raspberry) et S-Opener (gestion de la porte de garage), des capteurs NetAtmo et Oregon via un RFXCOM, de la domotique Z-Wave via une Vera, des media-centers Xbmc/Kodi, de mon ampli Pioneer, des onduleurs, de l’alarme (Paradox), des capteurs de luminosité home-made (à base de Raspberry et ESP8266), des capteurs hardware via WMI et ceux du routeur DD-WRT et également les StateObjects du package Tesla présentés dans l’article précédent.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
constellation.onConnectionStateChanged(function (change) { if (change.newState === $.signalR.connectionState.connected) { constellation.requestSubscribeStateObjects("*", "tesla", "*", "*"); constellation.requestSubscribeStateObjects("*", "ZoneMinder", "*", "ZoneMinder.Monitor"); constellation.requestSubscribeStateObjects("*", "SEnergy", "*", "*"); constellation.requestSubscribeStateObjects("*", "SOpener", "*", "*"); constellation.requestSubscribeStateObjects("*", "NetAtmo", "*", "*"); constellation.requestSubscribeStateObjects("*", "rfxcom", "*", "*"); constellation.requestSubscribeStateObjects("*", "Vera", "*", "*"); constellation.requestSubscribeStateObjects("*", "Nest", "*", "*"); constellation.requestSubscribeStateObjects("*", "Xbmc", "*", "*"); constellation.requestSubscribeStateObjects("*", "Pioneer", "*", "*"); constellation.requestSubscribeStateObjects("*", "BatteryChecker", "*", "*"); constellation.requestSubscribeStateObjects("*", "Paradox", "*", "*"); constellation.requestSubscribeStateObjects("*", "LightSensor", "Lux", "*"); constellation.requestSubscribeStateObjects("CEREBRUM", "HWMonitor", "*", "*"); constellation.requestSubscribeStateObjects("*", "ddwrt", "RouterAJS.WAN", "*"); constellation.requestSubscribeStateObjects("*", "ddwrt", "RouterAJS.WAN.Stats", "*"); } }); |
Pas besoin de plus de code, on peut dès maintenant éditer la page HTML pour créer notre interface.
Par exemple pour afficher la température et l’humidité captées par les sondes NetAtmo, il me suffira dans le template HTML d’ajouter le code suivant :
1 2 3 4 |
<p>Salon : {{NetAtmo['Salon.Temperature'].Value}}°C | {{NetAtmo['Salon.Humidity'].Value}}%</p> <p>Jardin : {{NetAtmo['Jardin.Temperature'].Value}}°C | {{NetAtmo['Jardin.Humidity'].Value}}%</p> <p>Chambre1 : {{NetAtmo['Chambre1.Temperature'].Value}}°C | {{NetAtmo['Chambre1.Humidity'].Value}}%</p> <p>Chambre2 : {{NetAtmo['Chambre2.Temperature'].Value}}°C | {{NetAtmo['Chambre2.Humidity'].Value}}%</p> |
Tizen propose des classes CSS prêtes à l’emploi que nous pouvons directement appliquer sur nos balises HTML pour rendre le visuel plus agréable :
De plus grâce à la notion de StateObjects de Constellation, nous pouvons sans trop d’effort afficher tout type de donnée peu importe la source. Par exemple, ici nous affichons la température de 3 pièces différentes captées par trois technologies différentes (NetAtmo, RFXCOM et Z-WAve)
1 2 3 |
<p>Chambre (Netatmo) : {{NetAtmo['Chambre1.Temperature'].Value}}°C</p> <p>Bureau (RFXCOM/Oregon) : {{rfxcom['Capteur Bureau'].Value.Temperature}}°C</p> <p>Cave (Vera/Z-WAve) : {{Vera['Temperature Cave'].Value.Temperature}}°C</p> |
La librairie Tizen fournit également quelques contrôles Javascript. Par exemple utilisons le « tau.widget.CircleProgressBar » qui nous attachons sur un élément « progressbar » lié au StateObject « Nest » :
1 2 3 4 5 |
<div class="ui-content"> <div>Consigne: <span id="nestTarget">{{ Nest['Living Room'].Value.target_temperature_c }}</span>°C</div> <div>Actuelle: {{Nest['Living Room'].Value.ambient_temperature_c}}°C</div> </div> <progress class="ui-circle-progress" id="nestProgress" value="{{(Nest['Living Room'].Value.target_temperature_c}}" min="9" max="32"></progress> |
Ainsi il devient alors possible de contrôler son thermostat en tournant le cadran rotatif de la montre :
Pour envoyer la température de consigne, il me suffit d’invoquer le MessageCallback « SetTargetTemperature » au package Nest par la ligne :
1 |
constellation.sendMessage({ Scope: 'Package', Args: [ 'Nest' ] }, 'SetTargetTemperature', [ deviceid, temperature ]) |
Pour reprendre l’exemple de la sonnette connectée à Constellation par un ESP8266, on peut facilement ajouter le contrôle du mode « muet » sur notre montre. Il suffit d’ajouter une checkbox dont l’état est coché si notre StateObject « IsMute » est vrai :
1 2 3 4 |
<div class="ui-toggleswitch ui-toggleswitch-large"> <input type="checkbox" class="ui-switch-input" ng-checked="DoorBell.IsMute" ng-click="SetMute(!DoorBell.IsMute)"> <div class="ui-switch-button"></div> </div> |
Et lorsque l’on clique sur la checkbox, on invoque le MessageCallback « SetMute » en passant l’état inverse de notre StateObject :
1 2 3 |
$scope.SetMute = function(isMute) { constellation.sendMessage({ Scope: 'Package', Args: [ 'DoorBell' ] }, 'SetMute', isMute); }; |
De quoi contrôler notre sonnette à n’importe quel moment depuis son poignet :
On peut aussi très facilement contrôler toute notre domotique Z-Wave. Pour ce faire, créons une listview (<ul>) pour tous nos StateObjects du package « Vera » afin d’afficher une checkbox liée à l’état de notre module Z-Wave en utilisant un « ng-repeat ».
Et comme pour la sonnette, lorsque l’on clique dessus, on envoie un message au package Vera pour définir le nouvel état :
1 2 3 4 5 6 7 8 9 10 11 |
<ul class="ui-listview"> <li class="li-has-multiline li-has-toggle" ng-repeat="device in Vera"> <label>{{device.Name}} <span class="li-text-sub ui-li-sub-text">{{device.Metadatas.Room}}</span> <div class="ui-toggleswitch"> <input type="checkbox" class="ui-switch-input" ng-click="SwitchVeraDevice(device)" ng-checked="device.Value.Status"> <div class="ui-switch-button"></div> </div> </label> </li> </ul> |
Et là encore, juste avec ces quelques lignes de code HTML on obtient une interface de contrôle de tous nos équipements Z-Wave (lumières, appliances, volets) sur notre poignet :
De ce fait, chaque objet, service ou programme connecté dans Constellation peut être facilement intégré dans vos applications Javascript, que ce soit une page Web, une application mobile Cordova/Ionic ou bien comme ici une application Tizen pour votre montre !
Au final avec à peine 150 lignes de Javascript et 350 de code HTML, cette application me permet au quotidien de garder un œil sur mes serveurs, ma consommation énergétique et les différents capteurs météo de la maison, voir en temps réel mes caméras de sécurité, piloter mon système d’alarme, les lampes et volets de la maison, le thermostat, l’ampli ou encore porte ma porte de garage.
Démarrez la discussion sur le forum Constellation