Aller au contenu

Tuer autres instances d'une scène si...


Messages recommandés

Posté(e) (modifié)

Bonjour,

 

Aujourd'hui, je me demande s'il existe une possibilité de tuer les autres instances d'une scène à certaines conditions.

Il est effectivement possible de tuer les autres instances d'une scène automatiquement grâce à l'utilisation de %% killOtherInstances dans l'en-tête d'une scène.

 

Seulement, j'aimerais pouvoir tuer les autres instances d'une scène si certaines conditions sont vérifiées.

J'ai bien connaissance des fonctions fibaro:countScenes() et fibaro:killScene(), mais elles n'ont pas grand intérêt dans l'utilisation recherchée, puisque la seconde fonction tuera toutes les instances de la scène, y compris celle en cours.

 

Si ce n'est vraiment pas possible, je pourrai bien évidemment me débrouiller en utilisant deux scènes différentes et les fonctions citées ci-dessus, mais si une fonction existait, ce serait top!

 

Merci! :)

Modifié par J3R3M
Posté(e)

Mais il faut d'abord se poser la question pourquoi tu as plusieurs instances.,et pourquoi vouloir en tuer seulement certaines. Pour moi ce n'est pas un fonctionnement normal 

Posté(e)

Je comprends la logique, mais j'ai mené la mienne sur un autre point de vue où c'est effectivement nécessaire.

 

Je souhaite contrôler les délais de refresh de ma scène Netatmo :

  1. Si le mode absence est sur ON, refresh = 30mn
  2. Si mode absence récemment quitté et personne n'est identifié, refresh = 5s pendant 2mn (avant déclenchement alarme)
  3. Si quelqu'un est connu, refresh = 5mn

Le refresh s'effectuant via setTimeout(), la scène doit obligatoirement être redémarrée pour que la nouvelle valeur de refresh soit prise en compte.

Mon mode absence est géré par une VG et celle-ci se met automatiquement sur "ON" lorsque c'est nécessaire.

Lorsque ce mode est quitté, ma scène gérant les pièces (trigger = mouvements) met simplement à jour cette VG avec le timestamp.

Ainsi, si je mets la VG Absence en trigger, je dois pouvoir vérifier le contenu de celle-ci avant de redémarrer la scène, puisque sinon, la scène s'exécutera à chaque nouveau mouvement.

Le but étant d'optimiser l'utilisation de la NetAtmo en fonction du nombre maximum de requêtes autorisées sur l'API.

Le fait que la scène tourne toutes les 10s lorsqu'il y a personne au domicile n'a aucun intérêt. Par contre, lorsqu'une "intrusion" est détectée, il est plus important de remonter très régulièrement les informations de l'API pour une meilleure réactivité de la domotique.

Posté(e)

Je comprends mieux maintenant le pourquoi du comment. 

Mais pourquoi ne pas laisser toujours le taux de refresh maximum ?) c'est une machine qui travaille) 

Posté(e) (modifié)

Je suis tout à fait d'accord avec toi.

Si le script pouvait être exécuté toutes les 5 secondes, ça simplifierait grandement la problématique, bien que ça puisse charger quelques peu le CPU de la HC2 à mon avis.

Malheureusement, l'API NetAtmo est bridée en nombre de requêtes par heure. Netatmo annonce un délai maximal de 2000 requêtes par heure pour chaque compte.

Cependant, des tests ont démontré qu'il y avait souvent des problèmes au-dessus de 1000 requêtes par heure et le compte développeur NetAtmo était ensuite temporairement bloqué.

La scène NetAtmo faisant deux appels API par cycle, il n'est pas possible de descendre en-dessous des 8 secondes, à condition de n'utiliser que l'API de la Welcome!

 

C'est pourquoi je souhaite privilégier un petit taux de refresh lorsqu'il est nécessaire de reconnaître quelqu'un rapidement puis d'espacer ces vérifications ensuite, afin de ne surtout pas dépasser la limite imposée par NetAtmo :)

Modifié par J3R3M
Posté(e)

Merci pour ces explications, je comprends bien la problématique. 

Idée stupide (peut être). Et si tu faisais une scène par taux de refresh souhaité, et tu en as une master, qui déclenche celle que tu veux (à la fréquence souhaitée) et tue toutes les autres ? 

Posté(e)

Bonjour,

 

Je ne sais pas quel est le délai de mise à jour côté API pour la Welcome, mais pour la station Meteo c'est toutes les 10 ou 15 minutes.

 

Pour la Welcome, t'es en direct sur l'API, je sais, mais la seule limitation est donc le nombre de requetes ? PAs de limitation de mise à jour de leur côté ?

Si oui, elle me tente de plus en plus cette welcome ;-)

 

Ok, tu fais un GetGlobalmodificationTime sur ta VG Absence c'est ca ?

 

Pourquoi ne pas faire qu'avec une seule instance et jouer avec la valeur du refresh ?

 

 

Du genre
 

local refresh =  xx

if VG == ON then refresh =xx

elseif Vgmodiftime < 30 then refresh = xxx

else refresh = xxx

end

PAs possible ?

Posté(e)
Le 07/12/2018 à 17:23, jojo a dit :

Idée stupide (peut être).

Pas du tout!

Le 07/12/2018 à 17:23, jojo a dit :

Et si tu faisais une scène par taux de refresh souhaité, et tu en as une master, qui déclenche celle que tu veux (à la fréquence souhaitée) et tue toutes les autres ? 

En fait, c'est effectivement le plan B que j'ai en tête.

À vrai dire, je pensais avoir une scène en autostart et une autre avec ma VG en trigger afin que chacune puisse arrêter l'autre en fonction de la situation.

Dans un premier temps, je trouve cela dommage d'avoir deux scènes parfaitement similaires, à une condition près, mais si c'est la seule solution, je partirai pour ça!

Le 07/12/2018 à 17:24, pepite a dit :

PAs de limitation de mise à jour de leur côté ?

Ecoute, je n'en ai pas l'impression jusqu'à maintenant. Ou alors, chacune de mes vérifications était effectuée peu après la mise à jour!

Je vais voir si je trouve des informations à ce sujet, puisque je ne pense pas qu'ils différencient les comptes développeur en fonction du produit acheté, cela me semble peu probable.

Le 07/12/2018 à 17:24, pepite a dit :

Pourquoi ne pas faire qu'avec une seule instance et jouer avec la valeur du refresh ?

Ça ne fonctionnera pas pour ce que je souhaite faire, puisque la prochaine vérification de la condition n'aura lieu que lors du prochain cycle du setTimeout().

Si le Mode absence est sur ON : La scène s'éxécute toutes les 20mn. Un mouvement est détecté. Mais la prochaine vérification de la valeur n'aura lieu qu'à la fin de ce délai de 20mn. Et je cherche à ce que le délai change dès la détection d'un nouveau mouvement

  • Like 1
Posté(e)

J'ai fini par bidouiller ma scène pour qu'elle ne soit plus en autostart et qu'elle soit executée par les mouvements de mon domicile.

Ainsi, je n'ai plus besoin d'interrompre un setTimeout, j'ai simplement ajouté une condition qui vérifie le nécessaire avant d'exécuter ou tuer la scène.

 

Mais, si un jour, une personne passant par là a la solution à la question originale, ça pourrait être intéressant de nous en informer, merci :P

  • 3 semaines après...
Posté(e)

Si je peux me permettre une petite suggestion. Il suffit que ta scène tourne toutes les 5s tout le temps. Mais qu'elle ne fasse sont travail QUE selon tes critères.

 

En pseudo code :

 

i = i + 5 -- incrément d'un compteur toutes les 5 secondes

if (mode == "ON" and i => 1800) then -- 30 minutes

   refresh()

else if (connu = "ON" and i => 300) then -- 5 minutes

   refresh()

else

   ---

end

 

function refresh()

    --- son travail

    i = 0

end

  • 1 mois après...
Posté(e) (modifié)
Le 04/01/2019 à 09:26, Steven a dit :

Si je peux me permettre une petite suggestion. Il suffit que ta scène tourne toutes les 5s tout le temps. Mais qu'elle ne fasse sont travail QUE selon tes critères. 

En effet Steven, c'est ce que j'ai fini par faire.

En fait, je ne voulais pas modifier considérablement ma scène NetAtmo pour pouvoir la partager en cas de modification majeure pouvant être utile à la communauté.

Mais, finalement, c'était plus simple à gérer de directement modifier cette scène pour qu'elle gère elle-même quand elle doit se connecter à l'API, à commencer par ne pas tourner s'il n'y a pas eu de mouvement récent dans la maison, ça économise jusqu'à plusieurs milliers de connexions inutiles à l'API NetAtmo, dans ce cas précis.

 

Merci de ton retour et désolé de ce délai d'un mois pour répondre... :13:

Modifié par J3R3M
×
×
  • Créer...