Request State Objects imbriqué

Bonjour c’est encore moi,

 

J’ai créé un package pour la partie “scénario” de mon installation. Grosso modo au lancement je souscris à différent package et grâce à “PackageHost.StateObjectUpdated += (s, e) =>” je lance des actions selon les données mises à jour.

Dans une de ses actions, je veux récupérer un state object. Du coup j’ai rajouté naïvement :

                        PackageHost.StateObjectUpdated += (s, e) =>
                        {
                            PackageHost.WriteInfo("{0}", e.StateObject.Value);
                        };
                        PackageHost.RequestStateObjects(package: "Brain", name: Sujet);

Sauf que bien sûr ce code se met à jour quand les souscriptions du début sont utilisées. Du coup comment récupérer des states objects quand on a déjà des souscriptions en cours ?

Voici un bout de mon code :

 

            PackageHost.StateObjectUpdated += (s, e) =>
            {
                if (e.StateObject.PackageName == "Chambre-Sensor")
                {
                    if(e.StateObject.Name == "Temperature")
                    {
                        PackageHost.CreateMessageProxy("Mysql").Insert("Temperature" as System.String, "'','" + e.StateObject.Value + "','2',NULL" as System.String);

                    }else if(e.StateObject.Name == "Humidity")
                    {
                        PackageHost.CreateMessageProxy("Mysql").Insert("Humidity" as System.String, "'','" + e.StateObject.Value + "','2',NULL" as System.String);
                    }
                    else
                    {
                        PackageHost.CreateMessageProxy("Mysql").Insert("Luminosity" as System.String, "'','" + e.StateObject.DynamicValue.Lux + "','" + e.StateObject.DynamicValue.Broadband + "','" + e.StateObject.DynamicValue.IR + "','2',NULL" as System.String);
                    }

                }else if (e.StateObject.PackageName == "Salon-Sensor")
                {
                    if (e.StateObject.Name == "Temperature")
                    {
                        PackageHost.CreateMessageProxy("Mysql").Insert("Temperature" as System.String, "'','" + e.StateObject.Value + "','1',NULL" as System.String);

                    }
                    else if (e.StateObject.Name == "Humidity")
                    {
                        PackageHost.CreateMessageProxy("Mysql").Insert("Humidity" as System.String, "'','" + e.StateObject.Value + "','1',NULL" as System.String);
                    }
                    else
                    {
                        PackageHost.CreateMessageProxy("Mysql").Insert("Luminosity" as System.String, "'','" + e.StateObject.DynamicValue.Lux + "','" + e.StateObject.DynamicValue.Broadband + "','" + e.StateObject.DynamicValue.IR + "','1',NULL" as System.String);
                    }
                }
                else if(e.StateObject.PackageName == "Cuisine-Sensor")
                {
                    if (e.StateObject.Name == "Temperature")
                    {
                        PackageHost.CreateMessageProxy("Mysql").Insert("Temperature" as System.String, "'','" + e.StateObject.Value + "','3',NULL" as System.String);

                    }
                    else if (e.StateObject.Name == "Humidity")
                    {
                        PackageHost.CreateMessageProxy("Mysql").Insert("Humidity" as System.String, "'','" + e.StateObject.Value + "','3',NULL" as System.String);
                    }
                    else
                    {
                        PackageHost.CreateMessageProxy("Mysql").Insert("Luminosity" as System.String, "'','" + e.StateObject.DynamicValue.Lux + "','" + e.StateObject.DynamicValue.Broadband + "','" + e.StateObject.DynamicValue.IR + "','3',NULL" as System.String);
                    }
                }
                else
                {
                    foreach (dynamic hw in this.Email)
                    {
                        DateTime myDate1 = hw.Start;
                        DateTime myDate2 = DateTime.Now;
                        TimeSpan ts = myDate1 - myDate2;
                        string Sujet = hw.Subject;
                        PackageHost.StateObjectUpdated += (s1, e1) =>
                        {
                            PackageHost.WriteInfo("{0}", e1.StateObject.Value);
                        };
                        PackageHost.RequestStateObjects(package: "Brain", name: Sujet);
                        Traffic(Sujet,hw.Location,ts.TotalMinutes);
                    }
                }

            };
            PackageHost.SubscribeStateObjects(sentinel: "ESP8266");
            PackageHost.SubscribeStateObjects(package: "Exchange");

 

Merci, en espérant que j’ai bien expliqué.

Hello Hydro,

L’événement StateObjectUpdated est le point d’entrée pour la réception des StateObjects dans un package. Le « Request » te permet de demander l’état d’un ou plusieurs SO au moment de la demande et le Subscribe pour t’abonner aux updates.

Bien évidement, comme il s’agit d’un event, il sera levé à chaque request ou update ! Alors pour résoudre ton besoin tu peux très bien créer une variable locale que tu affectes à la valeur du SO dès que tu le reçois (StateObjectUpdated). Ainsi tu peux à chaque réception, remplacer ta variable par la dernière valeur de ton SO et dans ton code tu exploites ta variable locale qui contient alors la dernière valeur de ton SO !

Mais tout ce travail à déjà été réalisé : c’est ce qu’on appelle les StateObjectLinks ! Ceux sont des attributs que tu poses sur des propriétés .NET et qui permettent de lier des propriétés .NET à des StateObjects !

Ainsi dans ton code, tu exploites des simples propriétés .NET, elles mêmes bindées à des SO de ta Constellation.

Tout est expliqué dans cet article que je te recommande de lire entièrement.

A+