Sommaire
Publication de valeur “simple”
Pour produire et publier un StateObject dans votre Constellation vous devez invoquer la méthode “pushStateObject” en spécifiant au minimum le nom du StateObject et sa valeur :
1 |
constellation.pushStateObject(name, value); |
Vous pouvez aussi spécifier “type” de votre StateObject :
1 |
constellation.pushStateObject(name, value, type); |
Notez que pour les types simples (int,bool, long, float et double) le type est spécifié implicitement. Par exemple, pour publier un StateObject dont la valeur est un chiffre :
1 |
constellation.pushStateObject("Temperature", 21); |
Vous pouvez aussi spécifier le “lifetime” de votre StateObject, c’est à dire sa durée de vie (en seconde) avant qu’il soit considéré comme “expiré”. Par exemple si votre valeur de T° (variable ‘temp’) est considérée comme valide que 60 secondes, on écrira :
1 |
constellation.pushStateObject("Temperature", temp, 60); |
En ouvrant le “StateObject Explorer” de la Console Constellation vous retrouverez votre StateObject :
Si le StateObject n’est pas mis à jour dans les 60 secondes il sera marqué comme expiré.
Publication de valeur “complexe”
Avec un “string format”
Vous pouvez publier des StateObject avec un objet complexe en utilisant la fonction “stringFormat” pour formater votre valeur en JSON. Par exemple pour publier un StateObject nommé “Lux” étant un objet contenant 3 propriétés, on pourrait écrire :
1 |
constellation.pushStateObject("Lux", stringFormat("{ 'Lux':%d, 'Broadband':%d, 'IR':%d }", lux, full, ir)); |
Avec un JsonObject
Vous pouvez également faire la même chose en créant un JsonObject de la façon suivante :
1 2 3 4 5 6 |
StaticJsonBuffer<JSON_OBJECT_SIZE(3)> jsonBuffer; JsonObject& myStateObject = jsonBuffer.createObject(); myStateObject["Lux"] = lux; myStateObject["Broadband"] = full; myStateObject["IR"] = ir; constellation.pushStateObject("Lux", myStateObject); |
Sur l’explorateur de StateObjects de la Console :
Définir la durée de vie de votre StateObject
Comme pour une valeur simple, vous pouvez également spécifier un “type” et le “lifetime” de votre StateObject. Par exemple :
1 |
constellation.pushStateObject("DemoLux", stringFormat("{ 'Lux':%d, 'Broadband':%d, 'IR':%d }", lux, full, ir), "MyLuxData", 20); |
Ou en utilisant le JsonObject “myStateObject” créé ci-dessus :
1 |
constellation.pushStateObject("DemoLux", myStateObject, "MyLuxData", 20); |
Dans les deux cas nous avons publié un StateObject nommé “DemoLux” de type “MyLuxData” avec une durée de vie de 20 secondes contenant comme valeur un objet avec trois propriétés (Lux, Broadband et IR).
Décrire ses types complexes
Lorsque vous utilisez des types personnalisés (ici “MyLuxData”) il vivement recommandé de les décrire dans le “Package Descriptor”.
Pour ce faire, au démarrage, invoquez la méthode “addStateObjectType” pour chaque type à déclarer puis appelez la méthode “declarePackageDescriptor” pour envoyer le “Package Descriptor” dans la Constellation.
Dans notre exemple nous écrirons :
1 2 3 4 5 |
// Describe your custom StateObject types constellation.addStateObjectType("MyLuxData", TypeDescriptor().setDescription("MyLuxData demo").addProperty("Broadband", "System.Int32").addProperty("IR", "System.Int32").addProperty("Lux", "System.Int32")); // Declare the package descriptor constellation.declarePackageDescriptor(); |
Vous remarquerez que le type “MyLuxData” est surligné vous permettant d’afficher le descriptif de votre StateObject :
Ajout de metadatas
Pour finir vous pouvez également ajouter des méta-données sur vos StateObjects.
Par exemple ajoutons l’ID de la puce ESP (ChipID) et le timestamp (millis) dans les méta-données de notre StateObject :
1 2 3 4 5 6 7 8 9 10 |
const int BUFFER_SIZE = JSON_OBJECT_SIZE(6); StaticJsonBuffer<BUFFER_SIZE> jsonBuffer; JsonObject& myStateObject = jsonBuffer.createObject(); myStateObject["Lux"] = lux; myStateObject["Broadband"] = full; myStateObject["IR"] = ir; JsonObject& metadatas = jsonBuffer.createObject(); metadatas["ChipId"] = ESP.getChipId(); metadatas["Timestamp"] = millis(); constellation.pushStateObject("Lux", myStateObject, "MyLuxData", 20, &metadatas); |
Note : dans ce dernier exemple vous remarquerez que nous avons défini la taille du buffer JSON (BUFFER_SIZE) à “JSON_OBJECT_SIZE(6)”, c’est à dire 6 propriétés et non 3 comme dans les exemples précédents de façon à tenir compte des propriétés JSON rajoutées par les metadatas (l’objet “Metadatas” lui même et ses deux propriétés “ChipId” et “Timestamp”). Pour plus d’info, consultez la documentation d’ArduinJson et plus particulièrement l’article concernant la gestion de la mémoire.
Démarrez la discussion sur le forum Constellation