Sommaire
Envoyer un message
Pour envoyer un message et donc invoquer un MessageCallback depuis un package Python vous devez utiliser la méthode “Constellation.SendMessage”. Par exemple :
1 |
Constellation.SendMessage("SMS", "SendMessage", [ "+33676903634", "Bonjour Constellation" ]) |
Ici par exemple on envoi un message au package “SMS” pour invoquer le MessageCallback “SendMessage” en passant en argument deux paramètres de type string.
Le MessageCallbacks Explorer de la Console Constellation permet de lister l’ensemble des MC déclarés par les packages de votre Constellation.
Par exemple, avec le package Nest déployé dans votre Constellation, on retrouvera un MessageCallback “SetTargetTemperature” pour piloter la température de consigne d’un thermostat Nest.
Pour l’invoquer depuis notre code Python :
1 |
Constellation.SendMessage("Nest", "SetTargetTemperature", [ "thermostatId", 19 ], Constellation.MessageScope.package) |
On peut également passer en paramètre un objet complexe. Par exemple le MC “AreaArm” du package Paradox permet d’armer le système d’alarme en passant en paramètre un objet “ArmingRequestData” contenant le secteur à armer, le mode d’armement et le PIN.
Le code Python pour invoquer ce MC sera alors :
1 |
Constellation.SendMessage("Paradox", "AreaArm", { "Area":"All", "Mode":1, "PinCode":"0000" }, Constellation.MessageScope.package) |
Vous pouvez également passer plusieurs arguments à votre MC en combinant type simple et type complexe. Par exemple le MC “ShowNotification” du package Xbmc permettant d’afficher une notification sur une interface Kodi/XBMC prend deux paramètres : le nom d l’hôte XBMC (un type simple) et le détail de la notification à afficher (un type complexe) :
1 |
Constellation.SendMessage("Xbmc", "ShowNotification", [ xbmcName, { "Title":"Hello Constellation", "Message":"Hello I'm Python" } ], Constellation.MessageScope.package) |
Les exemples de message ci-dessus sont tous envoyés à un package mais vous pouvez également envoyer vos messages à différents scopes.
Par exemple pour envoyer le message “Demo” sans aucun paramètre au groupe A, on écrira :
1 |
Constellation.SendMessage("A", "Demo", {}, Constellation.MessageScope.group) |
Les scopes disponibles sont :
- group
- package
- sentinel
- others
- all
Notez par ailleurs que le paramètre “MessageScope” de la méthode “SendMessage” est optionnel. Si il n’est pas spécifié le scope par défaut est “package”.
Envoyer des messages avec réponse : les Sagas
Si le MC que vous invoquez retourne un message de réponse, vous devez envoyer votre message dans une saga. Pour cela vous pouvez utiliser la méthode “SendMessageWithSaga” dans laquelle vous devrez spécifier la fonction qui sera invoquée lors de la réception de la réponse.
Par exemple reprenons le MessageCallback “AreaArm” du package Paradox :
Comme vous le constatez, ce MessageCallback retourne un “Boolean” pour indiquer si l’armement a bien été déclenché.
On peut donc invoquer ce MC dans une saga et attacher un callback de réponse pour afficher dans le logs de notre package si l’armement a réussi :
1 2 3 |
Constellation.SendMessageWithSaga(lambda response: Constellation.WriteInfo("Arm result is %s" % response), "Paradox", "AreaArm", { "Area":"All", "Mode":1, "PinCode":"0000" }) |
Ici nous avons utilisé une fonction lambda pour simplifier la lecture mais vous pouvez également définir une fonction classique dans votre code.
Le paramètre “response” utilisé dans la fonction callback est l’objet de la réponse envoyé par le package qui a reçu votre message. Ici “response” est un “Boolean” car le MC “AreaArm” retourne un booléen mais il peut être de n’importe quel type (simple ou complexe).
Le MessageCallback Explorer de la Console Constellation vous donnera tous les détails.
Démarrez la discussion sur le forum Constellation