Hello,
Je vais modifier cet article pour donner d’autre exemple notamment sur la “conservation de la dernière valeur”.
Pour répondre à ta question le registerStateObjectLink est implicite en Python. Il suffit, comme le montre l’article, d’ajouter le décorateur @Constellation.StateObjectLink
sur une méthode pour la lier à un (ou plusieurs) StateObjects.
Si tu souhaites “garder” la valeur d’un SO pour pouvoir l’intérroger n’importe où dans ton code, il suffit de le sauver dans une variable.
Par exemple, dans mon système S-Opener, j’ai besoin de connaitre l’état de la porte de garage (ouverte ou fermée). Cette info je peux la connaitre par un StateObject publié par le Package de mon alarme Paradox.
De ce fait, dans mon code Python je déclare une variable globale et j’ajoute un StateObjectLink sur le SO que je veux suivre qui affectera ma variable globale. Dans mon cas je n’ai besoin que de la propriété IsOpen de la valeur de ce StateObject.
global garageDoorOpened
@Constellation.StateObjectLink(package='Paradox', name="ZoneInfo5")
def ParadoxGarageDoorStateUpdated(stateObject):
global garageDoorOpened
garageDoorOpened = stateObject.Value.IsOpen
Constellation.WriteInfo("ParadoxGarageDoor = %s" % garageDoorOpened)
Il ne faut pas oublier de déclarer la variable au niveau du script ET au niveau de la méthode du SO Link avec le mot clé “global”. Ainsi, partout dans mon code je peux me servir de la variable “garageDoorOpened” qui m’indiquera si ma porte de garage est ouverte ou fermée (propriété IsOpen de mon SO Paradox). Cette variable étant mise à jour en temps réel par le SOLink si le SO change.