Opérateur MODULO et simulateur de présence

Bonjour à tous,

il y a quelques temps déjà, j’avais expliqué comment créer un petit simulateur de présence sur V5 avec des objets type Faders.

Pour créer un simulateur de présence sur IPX800 V5, nous avons d’autres ressources moins gourmandes en processeur et en traitement que les objets basés sur le temps (clignotant, fader, …)
J’ai donc cherché un moyen plus économe pour obtenir des horaires apparemment aléatoires, et cela m’a conduit à la conception de la fonction Modulo.

  1. Modulo
    Tout matheux ou développeur connait l’opérateur Modulo, bien pratique pour réduire un nombre dans un intervalle donné.

    A mod B retourne le reste de la division entière A/B.

    L’ipx800 V5 ne propose pas cet opérateur. Nous devons le construire

    Fonctionnement : un nombre quelconque est tronqué à sa partie entière (fonction plancher ou floor en anglais) par une conversion en unité RAW puis divisé par 1800.

    floor(3.7)=3

La dernière fonction détermine le reste de la division entière.

  • Modulo variable :

    Fonctionnement : Un widget Curseur permet de sélectionner la limite supérieur de l’intervalle (1800 dans notre cas). Ce nombre doit être un entier. Si ce n’est pas le cas, il suffit de l’injecter dans une autre variable analogique définie en RAW pour qu’il soit tronqué à sa partie entière.

  1. Mise en application dans un petit simulateur de présence :
    L’élément variable le plus connu sur l’IPX800, c’est bien entendu la date et l’heure du système (Timestamp). Pour obtenir un nombre variable tous les jours, il suffirait d’appliquer une simple formule arithmétique pour réduire la valeur sous forme d’un entier contraint dans un intervalle donné.
    Ce nombre sera alors additionné à l’heure souhaitée de la simulation afin de rendre la vie apparente du domicile un peu plus crédible.

    Exemple : calculons un nombre compris entre 0 et 1800.
    Notre calcul sur Timestamp (heure système de l’ipx800) est également transformé en entier puis injecté dans une division entière. Un second objet Fonction nommée Modulo calcule le reste de la division entière. Nous obtenons donc A mod B.

    Par exemple, prenons la valeur de base Timestamp / 3600 et calculons son modulo 1800.

Nous pouvons malheureusement constater que le résultat de formules arithmétiques appliquées au Timestamp sera toujours croissant et linéaire dans le temps, puis retombant à 0 avant de croître à nouveau jusqu’au point maximum. La variabilité n’est pas suffisante pour un simulateur de présence.
Nous devons utiliser des éléments beaucoup plus variables.

Amélioration de la variabilité
Parmi les nombreuses fonctionnalités disponibles sur la V5, mon choix s’est porté sur le plugin Weather.
En effet, quoi de plus changeant que la météo ? humidité, température, pression, vent, …

Nous pouvons donc calculer un nombre à partir de ces valeurs très variables et le contraindre lui aussi avec la fonction modulo.
Par exemple : (Température+pression+vent+humidité)*3.7 mod 1800

L’inconvénient du plugin météo, c’est qu’il est dépendant du cloud. En cas de perte du réseau, les valeurs ne sont plus mises à jour et la variabilité des résultats est réduite.

Nous pouvons donc joindre les 2 méthodes pour obtenir une variabilité basée à la fois sur la date et la météo. La variabilité sera bien suffisante.

Exemple : calculons un nombre dérivé de la météo et appliquons un modulo 900. Faisons de même avec le calcul basé sur le timestamp. En les additionnant, nous aurons un résultat compris entre 0 et 1800. Il suffira d’appliquer ce délai supplémentaire lors de la programmation d’une simulation pour que son heure d’exécution varie tous les jours.

Voici un exemple avec l’ouverture des volets selon un planning. Un retard variable compris entre 0 et 1800 secondes est appliqué à chaque démarrage.

Astuces :
Vous pouvez ajouter un élément variable en fonction du jour de la semaine et de l’heure en utilisant un planning analogique.
Vous pouvez en effet créer des plages horaires (14 maximum) qui feront varier la valeur de l’objet Planning AnA.
La valeur de la sortie du planning analogique pourra alors être utilisée dans les calculs du retard variable (sous forme de coefficient par exemple). Ce principe offre une faible variabilité puisque redondant toutes les semaines, mais cumulé aux autres méthodes, sont efficacité n’en sera que plus grande.

Ce n’est qu’une base de réflexion. Je vous ai présenté plusieurs méthodes pour générer des nombres pseudo-aléatoires, Je vous laisse améliorer le principe.

Bonne journée

2 « J'aime »

Bonjour @fgtoul, suite à ta suggestion sur autre fil, je rebondis sur la fonction diy « modulo ».

Je rencontre la difficulté que l’opération $A$-(X*$B$) donne un modulo incorrect. Je détaille :
Si A=5 et B=2, le modulo indique 0 au lieu de 1 (toutes valeurs paramétrées sur RAW).

Pour débugger, lorsque je paramètre le résultat final de la fonction « A modulo B » en REAL, le modulo indique 0,99, ce qui est étrange car toutes les valeurs manipulées en amont sont entières. Ensuite, le résultat est systématiquement et automatiquement arrondi à l’entier inférieur, du coup un reste de division d’entiers égal à 0,99 donne malheureusement 0 pour résultat.
Je ne vois pas comment une soustraction combinée à une multiplication de nombres entiers puissent donner comme résultat un nombre avec décimales significatives.

Version de travail : IPX v5 v5.6.0

Bonjour,
avec la dernière mise à jour de l’ipx, les fonctions ayant été refondues, le résultat devrait être correct.
Attention au format des variables en RAW.

EDIT:oups, je n’avais pas vu votre version 5.6
Bonne journée

Bonjour @Mimax,
Je n’arrive pas à reproduire l’erreur, X vaut combien dans ton cas ?

Edit : J’avais laissé la sortie en real, j’ai bien le même comportement

en théorie, X vaut 2 dans son cas vu que A=5, B=2 et X=A\B (division entière)

@Mimax : je reproduis bien le problème en mettant X à la valeur 2.
Je signale le bogue de la V5.6

1 « J'aime »

@mimax,
essaie d’utiliser l’id au lieu de faire le lien en X.

Merci pour votre retour, du coup je ne sais pas ce qui ne va pas dans mes fonctions mais bon au moins je sais que c’est pas un bug du soft IPX et que ma tisane est finalement pas à la verveine comme je le pensais …

Pourtant toutes les variables d’entrée, d’exploitation et de sortie sont bien en RAW.

La variable A :

La variable B :

La 1ère fonction pour la division entière :



La 2nde fonction pour le calcul de modulo :



EDIT : @fgtoul trop efficace, le temps que je précise mon post, tu as confirmé le bogue, merci ! Du coup, ma tisane n’a que très peu d’intérêt :sweat_smile: :innocent:

dans un premier temps, j’avais écrit la formule complète en remplaçant X par sa valeur dans la formule, du coup sans lien sur l’entrée de la fonction. Le résultat était correct.
C’est ce qui m’incite à proposer ce test :

1 « J'aime »

Merci @fgtoul pour la solution et ta réactivité.
Le palliatif fonctionne parfaitement

1 « J'aime »

Bonjour,
Dans les question ultimes : est-ce que @GCE a prévu un opérateur « modulo » au moins dans les fonctions ?