L'année passée, Microsoft a annoncé Azure IoT Suite. Derrière ce nom un peu pompeux se cache deux exemples d'utilisation de leur cloud Azure avec des objets connectés. Nous allons voir comment utiliser des modules Yoctopuce dans un de ces exemples.
Azure est le service de cloud de Microsoft, qui permet en théorie de réaliser n'importe quel type de projet. L'utilisation du cloud Azure n'est pas très intuitive et nécessite un long apprentissage pour vraiment tirer parti de toutes ses possibilités. Pour faciliter la vie des développeurs, Microsoft propose des solutions pré-configurées qui utilisent le cloud Azure. Pour l'internet des objets, Microsoft a appelé ces solutions Azure IoT Suite.
Cette suite est en fait un wizard qui permet d'instancier sur son propre compte Azure toutes les fonctionnalités nécessaires (serveur web, base de données, etc..) pour obtenir une solution IoT complète et utilisable. L'idée est de faire gagner du temps au développeur car il n'a "plus" qu'à modifier la solution au lieu de partir d'une page blanche.
Pour l'instant, il n'y a que deux solutions disponibles: "Maintenance prédictive" et "Surveillance à distance". La solution "Surveillance à distance" permet de surveiller la température et l'humidité de différents lieux. Par défaut, cette solution simule quatre objets connectés qui envoient des valeurs fictives, mais il est aussi possible d'utiliser des vrais objets connectés. Nous allons voir comment réaliser un capteur compatible avec cette solution en utilisant un Raspberry Pi, un Yocto-Meteo et un Yocto-GPS.
Mais, avant de pouvoir ajouter nos véritables objets connectés, il faut commencer par instancier notre propre solution de surveillance à distance.
Créer une solution "Surveillance à distance"
Il faut commencer par créer un compte Microsoft Azure si vous n'en n'avez pas encore un. Azure est un service de cloud payant, mais il est possible de demander une évaluation qui permet de tester toutes les fonctionnalités.
Il faut ensuite se rendre sur la page principale de l'Azure IoT suite et créer une nouvelle solution "Surveillance à distance". Le wizard demande un nom d'application ainsi que l'abonnement Azure à utiliser pour la facturation.
Le wizard de création de la solution
L'instanciation de la solution sur votre compte Azure prend une dizaine de minutes, et une fois terminée l'application est disponible directement avec l'URL https://xxxxxxx.azurewebsites.net où xxxxxxx est le nom que vous avez défini lors de la création.
La page d'accueil de l'application
L'interface permet de suivre en temps réel les mesures des différents objets connectés et de définir des alarmes. Par défaut, quatre objets connectés virtuels sont émulés et permettent de tester les fonctionnalités de l'application.
Créer un vrai objet connecté
Pour notre objet connecté, nous allons utiliser un Raspberry Pi avec un Yocto-Meteo et un Yocto-GPS branché sur le port USB.
le matériel nécessaire pour notre objet connecté.
Avant de pouvoir utiliser notre Raspberry Pi, il faut d'abord créer un clef d’authentification pour cet objet dans la solution. La solution possède un onglet "devices" qui permet de gérer les objets.
Par défaut, on retrouve les quatre objets émulés, mais aussi un bouton qui permet d'ajouter un nouvel objet connecté. La première étape permet de choisir si on désire ajouter un autre objet simulé ou un véritable objet connecté. Le deuxième panel permet de définir l'identifiant de ce nouvel objet connecté. Une fois terminé, le wizard affiche les paramètres d'authentification pour cet objet. Copiez ces trois champs car nous allons en avoir besoin plus tard.
Le wizard d'enregistrement d'un nouvel objet connecté
Le script du Raspberry Pi
Nous avons réalisé un petit script Python qui utilise l'API REST d'Azure pour transmettre à notre solution la température, l'humidité ambiante ainsi que la position GPS de l'objet. L’intérêt d'écrire ce programme en Python est que le code est portable et qu'il est ainsi possible d'utiliser le même script sur une machine Windows, Linux ou OS X.
Le code est assez simple et s'inspire des exemples fournis par Microsoft (
https://github.com/Azure-Samples/iot-hub-python-get-started). Nous avons simplement inclus notre librairie et utilisé les objets YTemperature et YHumiditiy pour accéder aux senseurs du Yocto-Meteo.
La partie du code qui envoie la température et l'humidité toutes les 10 secondes
tempSensor = YTemperature.FirstTemperature()
humSensor = YHumidity.FirstHumidity()
if tempSensor is None or humSensor is None:
print("No Yocto-Meteo connected. Check your USB cable.")
return
while tempSensor.isOnline():
temp = tempSensor.get_currentValue()
humidity = humSensor.get_currentValue()
print('Send new value: temperature=%2.1f%s and humidity=%2.1f%s' % (
temp, tempSensor.get_unit(), humidity, humSensor.get_unit()))
value_message = json.dumps({
'DeviceID': azure_deviceId,
'Temperature': temp,
'Humidity': humidity,
})
ret = d2cMsgSender.sendD2CMsg(value_message)
if ret[1] != 204:
print("unable to contact Azure Iot Hub:" + ret[0])
return
YAPI.Sleep(10000)
Au démarrage, le script regarde si un Yocto-GPS est présent et envoie ses coordonnées GPS avec d'autres informations du système.
if YAPI.RegisterHub("usb", errmsg) != YAPI.SUCCESS:
sys.exit("init error" + errmsg.value)
latitude = 0
longitude = 0
gps = YGps.FirstGps()
if gps is not None:
if gps.get_isFixed() != YGps.ISFIXED_TRUE:
print("Wait for GPS fix."),
w = 0
while gps.get_isFixed() != YGps.ISFIXED_TRUE and w < 30:
YAPI.Sleep(1000)
w += 1
print".",
if gps.get_isFixed() == YGps.ISFIXED_TRUE:
gps_serial = gps.get_module().get_serialNumber()
ylatitude = YLatitude.FindLatitude(gps_serial + ".latitude")
ylongitude = YLongitude.FindLongitude(gps_serial + ".longitude")
latitude = ylatitude.get_currentValue() / 1000.0
longitude = ylongitude.get_currentValue() / 1000.0
else:
print("unable to get GPS fix in 30 seconds")
d2cMsgSender = D2CMsgSender(deviceid, host_name, args.AccessKey)
machine = platform.machine()
system = platform.system()
deviceMetaData = {
'ObjectType': 'DeviceInfo',
'IsSimulatedDevice': 0,
'Version': '1.0',
'DeviceProperties': {
'DeviceID': deviceid,
'HubEnabledState': 1,
'CreatedTime': '2016-12-12T20:28:55.5448990Z',
'DeviceState': 'normal',
'UpdatedTime': None,
'Manufacturer': 'Yoctopuce',
'ModelNumber': 'azure-iot-brige',
'SerialNumber': socket.gethostname(),
'FirmwareVersion': '1.0',
'Platform': system,
'Processor': machine,
'InstalledRAM': '64 MB',
'Latitude': latitude,
'Longitude': longitude
},
'Commands': [],
"Telemetry": [
{
"Name": "Temperature",
"DisplayName": "Temperature",
"Type": "double"
},
{
"Name": "Humidity",
"DisplayName": "Humidity",
"Type": "double"
}
]
}
# Send device metadata
res = d2cMsgSender.sendD2CMsg(json.dumps(deviceMetaData))
Le code source de ce petit script est disponible sur GitHub: https://github.com/yoctopuce-examples/azure-python-iot-bridge.
Avant de pouvoir utiliser ce script sur le Raspberry Pi, il faut installer notre librairie Yoctopuce à l'aide de la commande suivante:
sudo pip install yoctopuce
Le script Python prend en paramètre le deviceId, le hostname et la clef d'authentification. Par exemple, pour l'objet que nous avons créé plus haut, la commande à exécuter est la suivante:
sudo ./azure-iot-brige.py myDevice yoctoremotemonitoring30be8.azure-devices.net \ qC1LFtGOX382cHKscp1rFg==
Une fois le script lancé, on peut retourner sur l'interface web de notre solution et voir le graphique de la température et de l'humidité.
Le graphique des données de notre objet connecté
Dans le panneau de gestion des objets connectés, on peut voir les informations sur la machine qui exécute le script Python:
Les informations sur notre Raspberry Pi
Activer la géolocalisation
L'application affiche une carte avec la position des différents modules, mais par défaut cette fonctionnalité n'est pas activée et une image statique est affiché à la place. Pour activer la carte interactive, il faut créer une QueryKey pour Bing Maps et la passer à l'application web. Cette procédure est documentée dans la Faq de l'IoT suite: https://docs.microsoft.com/fr-fr/azure/iot-suite/iot-suite-faq.
Sachez toutefois qu'il est possible de passer cette QueryKey à une solution existante sans avoir à changer les sources de l'application, il faut modifier le paramètre MapApiQueryKey depuis le portail Azure.
le paramètre MapApiQueryKey peut être modifié depuis le portail Azure
Attention, la solution n'est pas prévue pour tracker en live des senseurs dans des véhicules, mais uniquement pou situer dans quel bâtiment sont placés les capteurs. Concrètement la position GPS n'est transmise que lors de l'authentification.
Conclusion
Idéalement, on aurait voulu utiliser un YoctoHub avec un callback HTTP à la place du Raspberry Pi mais à l'heure actuelle ce n'est pas possible, car l'API REST d'Azure n'est accessible qu'au travers une connexion HTTPS qui utilise une encryptions TLS 1.2
L'Azure IoT Suite est un bonne idée, car elle permet de démarrer un projet en très peu de temps et permet assez facilement d'utiliser des modules Yoctopuce. Mais à l'heure actuelle, Microsoft n'offre que deux scénarios relativement simples qui peuvent être réalisés avec d'autres solutions moins complexes et gratuites comme emoncms et notre Yocto-Cloud.
Il est possible de modifier les solutions Microsoft pour les adapter à d'autres besoins, mais tout de suite les choses deviennent plus compliquées car il faut modifier l'application écrite en C# mais aussi comprendre le fonctionnement des spécificités du cloud Azure. Dommage...