Pour consommer des StateObjects vous pouvez simplement déclarer une méthode acceptant en paramètre un StateObject et rajouter sur cette méthode le décorateur “Constellation.StateObjectLink” en spécifiant le lien vers le ou les StateObjects.
Par exemple si vous voulez récupérer en temps réel le StateObject correspondant à un thermostat Nest (partant de l’hypothèse où le package Nest est déployé dans votre Constellation).
Via le StateObjects Explorer de la Console Constellation, on retrouvera le StateObject ici nommé “Living Room” publié par le package Nest qui représente l’état du thermostat du salon :
On peut donc écrire une méthode qui sera liée à ce StateObject pour afficher un message de log à chaque fois que l’état du thermostat sera mis à jour :
1 2 3 |
@Constellation.StateObjectLink(package = "Nest", name = "Living Room") def OnNestTargetTemperatureChanged(stateObject): Constellation.WriteInfo("The Nest target temperature has changed to : %s°C" % stateObject.Value.target_temperature_c) |
Le décorateur “StateObjectLink” accepte les paramètres suivants : “sentinel”, “package”, “name” et “type”. Tous ces paramètres sont optionnels et par défaut défini à “*”, c’est à dire qu’aucun filtre n’est appliqué !
Une méthode décorée “StateObjectLink” doit accepter qu’un seul argument : le StateObject.
Un StateObject contient les propriétés suivantes :
- SentinelName : nom de la sentinelle qui a produit le StateObject
- PackageName : nom du package qui a produit le StateObject
- Name : le nom du StateObject
- UniqueId : identifiant unique du StateObject dans la Constellation (concaténation des 3 propriétés ci-dessus)
- Type : type du StateObject
- Lifetime : durée de vie en seconde du StateObject avant d’être considéré “expiré” (0 si infini)
- LastUpdate : date de la dernière publication du StateObject
- IsExpired : indique si le StateObject est expiré (c’est à dire que DateTime.Now > LastUpdate + Lifetime si et seulement si Lifetime > 0)
- Metadatas : dictionnaire de clé / valeur
- Value : la valeur du StateObject (peut être un type simple ou un objet complexe)
Important : la méthode sur laquelle est appliquée cet attribut sera invoquée au démarrage de votre package avec la valeur actuelle du ou des StateObjects (Request) puis à chaque mise à jour des StateObjects (Subscribe).
Autre exemple, affichons dans les logs de notre package Python la consommation des CPU de l’ensemble des sentinelles Windows connectées dans notre Constellation en utilisant le package HWMonitor :
1 2 3 |
@Constellation.StateObjectLink(package = "HWMonitor", name = "/intelcpu/0/load/0") def CPUUpdated(stateobject): Constellation.WriteInfo("CPU on %s is currently %s %" % (stateobject.SentinelName, stateobject.Value.Value)) |
Dans le cas où vous souhaiterez conserver la valeur de votre StateObject dans une variable de votre script Python pour pouvoir vous en servir dans d’autre méthode, il suffit tout simplement d’affecter le StateObject dans une variable globale depuis un StateObjectLink.
Reprenons l’exemple du thermostat Nest ci-dessus. Commençons par déclarer cette variable globale au niveau de notre script :
1 |
global nestThermostat |
Puis ajoutons un StateObjectLink vers le StateObject du thermostat Nest pour mettre à jour notre variable globale :
1 2 3 4 |
@Constellation.StateObjectLink(package = "Nest", name = "Living Room") def OnNestThermostatChanged(stateObject): global nestThermostat nestThermostat = stateObject.Value |
Ainsi la variable « nestThermostat » contiendra la dernière valeur du StateObject représentant le thermostat Nest. Vous pourrez y accéder depuis n’importe quel endroit de votre script.
Démarrez la discussion sur le forum Constellation