Comme annoncé, ce forum est passé en lecture seule au 1er janvier 2020. Désormais nous vous invitons à vous rendre sur notre nouvelle page communauté :
Image

A très bientôt !

Manipuler les bits

Réservé à la création de scénarios dans JEEDOM
Avatar de l’utilisateur
Bebel27
Actif
Messages : 908
Inscription : 19 oct. 2014, 18:04
Localisation : Normandie

Manipuler les bits

Message par Bebel27 » 17 nov. 2014, 10:44

salut les Jeedomiens,
je récupère l'état de mes lumières en modbus en fesant une lecture d'un registre .
ce registre est de type word 16bits , et actuellement je fais ça avec un script et affiche l'état par un virtuel et pour chaque lumière( je passe en argument le bit que j'ai besoin )
pour éviter de lancer 15 scripts toutes les minutes en read , je voudrais faire ça.
lire la valeur du registre avec mon script et ensuite affecter chaque bit du word à un virtuel info . but une seule lecture gain de temps
pour ce faire j'ai créer un sénario qui démarre quand je reçois la valeur binaire du registre par mon script.
j'ai choisi action "code " et la je sais pas trop comment faire

Ma question , comment procéder pour travailler cette valeur en code et renvoyé l'état d'un bit à un virtuel .

JEEDOM (que la domotique soit avec toi )

jeanvictor4
Timide
Messages : 1
Inscription : 21 déc. 2017, 21:14

Re: Manipuler les bits

Message par jeanvictor4 » 21 déc. 2017, 21:24

j'ai trouvé une solution pour ce que ça intéresse

dans un virtuel tu met
contact 1
calcul : (#[ta variable]#&1) > 0
contact 2
calcul : (#[ta variable]#&2) > 0
contact 3
calcul : (#[ta variable]#&4) > 0
contact 4
calcul : (#[ta variable]#&16) > 0
contact 5
calcul : (#[ta variable]#&32) > 0
... 64-128-256-512-1024-2048-4096-etc.....
cela va décodé ton 16bits en 16 contact undividuel
et le tout sans script ;)

meute
Actif
Messages : 1102
Inscription : 26 août 2017, 11:07
Localisation : Belgique

Re: Manipuler les bits

Message par meute » 21 déc. 2017, 22:09

Bonjour,
mois je fais simplement :
#[variable]# & 1
#[variable]# & 2
#[variable]# & 4
#[variable]# & 8
...
#[variable]# & x

Le "> 0" n'est pas indispensable pour une info binaire, jeedom "traduit" d'office tout ce qui n'est pas égale à 0 en 1
Jeedom VM ESXI sur NUC
Ilot I/O Modbus Wago Z-Wave (11 volets,prises,présences) + RFXCom (sondes T°+RH, prises)
Pont Hue et une vingtaine d'ampoules,une flopée de Xiaomi aquara, Harmony Elite
8 Google Home et un PC tactile All-In accroché au mur

Sli3H3llFiR3
Timide
Messages : 127
Inscription : 31 juil. 2017, 22:45

Re: Manipuler les bits

Message par Sli3H3llFiR3 » 21 déc. 2017, 23:11

Ou sinon :

Code : Tout sélectionner

$registre=0b0011101101 ; // ne pas oublier le 0b pour spécifier que c'est un binaire. Ensuite tout dépend de ta données d'entrées
$valeurs= array(
  1, 2, 4, 8, 16 ,32, 64, 128
) ; // Jusqu'au bit voulu
$cpt = 1 ;
foreach ($valeurs as $valeur) {
    $result = (($registre & $valeur) == 0) ? "true" : "false"  ; // Ceci est ce que l'on appel un opérateur ternaire. Tu testes si un valeur correspond à un résultat, ici == 0, mais on aurais pu mettre > 10 dans un autre cas). le ? c'est la question en gros. C'est égal à 0 alors on fait la première action (true) si non la 2eme (false). Les action sont séparer par le :
    
    $scenario->setLog($cpt." : ".$result);
    // Application pour Jeedom avec un virtuel
    // cmd::byString('#[Virtuel][Nom Virtuel][Ampoule '.$cpt.']#')->event($result) ; tu rempli les valeurs du virtuel avec le Cpt pour le numéro du bit.
    // Exemple
    // #[Virtuel][Nom Virtuel][Ampoule 1]# sera rempli par la première itération car $cpt = 1
    $cpt++ ;
}
Après on peux perfectionner en rajoutant du code permettant de gérer l'évolution du système. Exemple, à ce jour tu dois vérifier 8 bits, et demain 9 :

Dans ce cas, tu as la possibilité de récupérer ton registre. de faire un shift droit que tu places dans une variable (registrebak dans mon exemple).
Avec une boucle while sur le résultat du shift (tant que tu as une valeur) tu vas effectuer l'opération.
Dans ce cas, il faut bien évident savoir ou on se trouve dans au niveau du bit rechercher.
Il faut utiliser un shift gauche sur l'opérande. Ca donne a peu près cela :

Code : Tout sélectionner

$registre=0b0011101101 ; 
$registrebak = $registre; // registrebak sera utiliser pour savoir si on doit continuer les calculs ou non.
$operande= 1 ;
$cpt = 1 ;

while ($registrebak != null) {
    $result = (($registre & $operande) == 0) ? "true" : "false"  ;
    $operande = $operande << 1 ; // Décalage de l'opérande à gauche (ca reviens à multiplier par 2)
	$registrebak = $registrebak >> 1 ; // On décale le registre peu à peu pour le vider, comme une queue
    $scenario->setLog($cpt." : ".$result);
    // cmd::byString('#[Virtuel][Nom Virtuel][Ampoule '.$cpt.']#')->event($result) ; tu rempli les valeurs du virtuel avec le Cpt pour le numéro du bit.
    // Exemple
    // #[Virtuel][Nom Virtuel][Ampoule 1]# sera rempli par la première itération car $cpt = 1
    $cpt++ ;
}
S'il y a des questions, surtout ne pas hésiter à demander :)

Bercolly
Actif
Messages : 956
Inscription : 20 août 2015, 22:21
Localisation : Clermont-ferrand

Re: Manipuler les bits

Message par Bercolly » 22 déc. 2017, 19:28

Pour faire simple ( si j'ai bien compris) :
Une petite fonction php:

Code : Tout sélectionner


//
// retourne la valeur du bit indiqué dans la chaine fournie
//
function bitValue($_vecteur, $bit_order)
{
	return ($_vecteur >> $bit_order) & 1;
}

//
// Exemple d'utilisation
//
$_b = 0b01101001;   // valeur binaire fournie

// Récupérer valeur de quelques bits ..
echo bitValue($_b, 0) . PHP_EOL;  // bit 0
echo bitValue($_b, 3) . PHP_EOL;  // bit 3

// Boucle pour traiter tous les bits
for($i = 0; $i < 16; $i++) {
	echo 'bit ' . $i . ' -> ' . bitValue($_vecteur, $i) . PHP_EOL;
}
A+
Bernard
jeeDom Mini+ V2.1.2
Plugins développés : Smart TvSamsung, jEditor (éditeur scénario pleine page) jEditor -> viewtopic.php?f=135&t=27181

Sli3H3llFiR3
Timide
Messages : 127
Inscription : 31 juil. 2017, 22:45

Re: Manipuler les bits

Message par Sli3H3llFiR3 » 22 déc. 2017, 23:40

Bercolly a écrit :
22 déc. 2017, 19:28
Pour faire simple ( si j'ai bien compris) :
Une petite fonction php:

Code : Tout sélectionner


//
// retourne la valeur du bit indiqué dans la chaine fournie
//
function bitValue($_vecteur, $bit_order)
{
	return ($_vecteur >> $bit_order) & 1;
}

//
// Exemple d'utilisation
//
$_b = 0b01101001;   // valeur binaire fournie

// Récupérer valeur de quelques bits ..
echo bitValue($_b, 0) . PHP_EOL;  // bit 0
echo bitValue($_b, 3) . PHP_EOL;  // bit 3

// Boucle pour traiter tous les bits
for($i = 0; $i < 16; $i++) {
	echo 'bit ' . $i . ' -> ' . bitValue($_vecteur, $i) . PHP_EOL;
}
A+
Bernard
Ça marche aussi ;)
En fait, c'est ça le top en informatique. On peux faire la même chose de plein de façon différente, et l'adapter aux besoins :)

Bercolly
Actif
Messages : 956
Inscription : 20 août 2015, 22:21
Localisation : Clermont-ferrand

Re: Manipuler les bits

Message par Bercolly » 23 déc. 2017, 00:21

Sli3H3llFiR3 a écrit :
22 déc. 2017, 23:40
Ça marche aussi ;)
En fait, c'est ça le top en informatique. On peux faire la même chose de plein de façon différente, et l'adapter aux besoins :)
C'est surtout simple, cela distingue facilement l'accès aux bits d'un octet par exemple de ce que l'on veut faire avec!

Ne dit-on pas que tous les chemins mènent à Rome ? Ce n'est qu'une question de distance !
jeeDom Mini+ V2.1.2
Plugins développés : Smart TvSamsung, jEditor (éditeur scénario pleine page) jEditor -> viewtopic.php?f=135&t=27181

Sli3H3llFiR3
Timide
Messages : 127
Inscription : 31 juil. 2017, 22:45

Re: Manipuler les bits

Message par Sli3H3llFiR3 » 23 déc. 2017, 12:32

Par contre, Quizz d'un message variable (8 puis 9 et 17bits par exemple).

Il faudrait récupérer la longueur de ton message et adapter la boucle à cette longueur. Ton code est simple mais ne va pas assez loin dans le cas où l'on souhaite couvrir le maximum de cas possible et pas un cas unique (soit 16bits dans ton exemple).
Dans le cas initial, on connais le nombre d'objet il semblerais. Cependant, quitte à donner un snippet, autant faire en sorte que ça couvre un besoins générique.

Donc pour aller à Rome c'est bien, mais si on souhaite rejoindre Madrid du coup ça marche plus :)

meute
Actif
Messages : 1102
Inscription : 26 août 2017, 11:07
Localisation : Belgique

Re: Manipuler les bits

Message par meute » 23 déc. 2017, 16:23

je vois pas trop pourquoi se gratter a écrire des fonctions PHP pour ça, on a donné des exemples tout simples ...

Pour obtenir 0 ou 1 dans une info de type numérique pour la valeur du bit 10 de "variable" qui peut être une variable ou une info d’équipement :

Code : Tout sélectionner

(#[variable]# & 1024) > 0
Si l'info de destination est de type binaire alors pas utile de faire le test > 0, si le résultat est différent de 0 l'info binaire prendra la valeur 1 :

Code : Tout sélectionner

#[variable]# & 1024
Si vous voulez vraiment utiliser le numéro de bit, le 10 ici en l’occurrence, il suffit de faire :

Code : Tout sélectionner

(#[variable]# & pow(2,10)) > 0
N'oubliez pas que les bit c'est "zero based", donc les 8 bits d'un octet sont numérotés de 0 à 7 et pour un mot c'est de 0 à 15.

Mais moi je n'aime pas utiliser des fonctions complexes comme la fonction "pow" quand ce n'est pas indispensable, un ET logique est une des instructions les plus simples et basiques à exécuter en informatique, elle est même directement exécutée nativement par le processeur en un seul cycle d'horloge par les instructions en assembleur alors que la fonction pow est consommatrice de ressources et nécessite une flopée de cycles d'horloge, alors que faire 2^X prend 2 secondes à calculer et à écrire dans la formule pour éviter au processeur de devoir la calculer à chaque fois .... et appeler une sous routine en PHP juste pour ça c'est juste une aberration aussi. Mais peut-être faut-il avoir codé un jour en assembleur pour en avoir conscience.

Si les développeurs de nos jours avaient connus l'époque où on devait se satisfaire de 4Ko de ram et de 4Mhz de fréquence d'horloge tout serait différent, windows 10 de base tournerait comme une bombe avec 256Ko de ram sur un P4 et ne prendrait pas plus de 100Mo sur le disque ... à l'époque on savait ce que c'était d'optimiser du code, de nos jour avec la débauche de puissance à notre disposition c'est tellement plus simple de ne plus trop s'en soucier car c'est souvent compliqué de faire simple ... et simple de faire compliqué.
Jeedom VM ESXI sur NUC
Ilot I/O Modbus Wago Z-Wave (11 volets,prises,présences) + RFXCom (sondes T°+RH, prises)
Pont Hue et une vingtaine d'ampoules,une flopée de Xiaomi aquara, Harmony Elite
8 Google Home et un PC tactile All-In accroché au mur

Sli3H3llFiR3
Timide
Messages : 127
Inscription : 31 juil. 2017, 22:45

Re: Manipuler les bits

Message par Sli3H3llFiR3 » 25 déc. 2017, 16:29

j'ai choisi action "code " et la je sais pas trop comment faire
Qu'on on souhaite répondre à une question, on lit l'énoncé.
Et dans l'énoncé, la personne chercher a faire avec la fonction "Code" . Donc ...... Mais pour cela, il faut savoir lire jusqu'au bout !

De plus se croire le meilleur en citant le "bon vieux temps" ça ne sert à rien vu qu'on a E V O L U É !!!!
Si tu préfères vivre dans le passer libre à toi. retourne faire du Basic sur Asmtrad (si tu as connu !!!!) et viens pas faire des leçons de moral.

Quand à l'assembleur, j'en ai fait surement avant toi sur PC1512, et 6809 !!!

Mon gars, reste dans le passé, surtout n'évolue pas, et n'écris pas non plus d'ailleurs. Car, juste pour information, avec les puissance de calcul actuel, ton discours est ..... obsolète. Comme toi surement (Les horloges ne tourne plus a 133Mghz pour info !!!! donc ton 2^x = 2 secondes * 10^-6 plutôt) !!!!

Par ailleurs, juste au cas, pour la majorité des processeur de notre temps, ils ont des "fonctionnalités" (dirons nous) dédiées qui leur permet d'effectuer des calculs de façons optimiser, de ranger des informations en buffer pour être réutilisées,le tout sans pour autant aller taper dans un registre du proc. (Ahhh l'évolution....)

Ah, j'oubliais, tu savais que les langages interprétés, sont compilés en byte code puis c'est avec de l'assembleur que ça communique ? Pour se faire la plupart des compilateurs ont des méthodes d'optimisation de grandes qualités permettant justement d'optimiser ce qui est être. (Ah min, c'est encore de l'évolution tout ça!!) Pour toi, surement une révolution ?

Aller, va faire des recherches sur l'informatique de nos jours, et puis tu reviendra quand tu en sauras plus. (il y a de bon livre noir et jaune pour les personnes dans ton cas)...

ET pour finir, oublie pas de TOUT lire dans les bouquins

Avatar de l’utilisateur
Nibb31
Actif
Messages : 2155
Inscription : 17 févr. 2015, 15:29

Re: Manipuler les bits

Message par Nibb31 » 25 déc. 2017, 20:06

C'est quoi cette agressivité ?
Jeedom: VM ProxMox sur serveur i7-2760QM, RAM 8Go
Zwave + RFXCom433E + Hue

dabou
Timide
Messages : 339
Inscription : 13 sept. 2017, 15:07

Re: Manipuler les bits

Message par dabou » 25 déc. 2017, 20:21

Tiens... Le vin a dû mal passer...

meute
Actif
Messages : 1102
Inscription : 26 août 2017, 11:07
Localisation : Belgique

Re: Manipuler les bits

Message par meute » 25 déc. 2017, 22:13

Sli3H3llFiR3 a écrit :
25 déc. 2017, 16:29
j'ai choisi action "code " et la je sais pas trop comment faire
Qu'on on souhaite répondre à une question, on lit l'énoncé.
Et dans l'énoncé, la personne chercher a faire avec la fonction "Code" . Donc ...... Mais pour cela, il faut savoir lire jusqu'au bout !

De plus se croire le meilleur en citant le "bon vieux temps" ça ne sert à rien vu qu'on a E V O L U É !!!!
Si tu préfères vivre dans le passer libre à toi. retourne faire du Basic sur Asmtrad (si tu as connu !!!!) et viens pas faire des leçons de moral.

Quand à l'assembleur, j'en ai fait surement avant toi sur PC1512, et 6809 !!!

Mon gars, reste dans le passé, surtout n'évolue pas, et n'écris pas non plus d'ailleurs. Car, juste pour information, avec les puissance de calcul actuel, ton discours est ..... obsolète. Comme toi surement (Les horloges ne tourne plus a 133Mghz pour info !!!! donc ton 2^x = 2 secondes * 10^-6 plutôt) !!!!

Par ailleurs, juste au cas, pour la majorité des processeur de notre temps, ils ont des "fonctionnalités" (dirons nous) dédiées qui leur permet d'effectuer des calculs de façons optimiser, de ranger des informations en buffer pour être réutilisées,le tout sans pour autant aller taper dans un registre du proc. (Ahhh l'évolution....)

Ah, j'oubliais, tu savais que les langages interprétés, sont compilés en byte code puis c'est avec de l'assembleur que ça communique ? Pour se faire la plupart des compilateurs ont des méthodes d'optimisation de grandes qualités permettant justement d'optimiser ce qui est être. (Ah min, c'est encore de l'évolution tout ça!!) Pour toi, surement une révolution ?

Aller, va faire des recherches sur l'informatique de nos jours, et puis tu reviendra quand tu en sauras plus. (il y a de bon livre noir et jaune pour les personnes dans ton cas)...

ET pour finir, oublie pas de TOUT lire dans les bouquins
Tu me connais ? non,
Tu sais ce que je fais dans la vie ? non,
Tu connais mes domaines de compétence ? non,
Tu connais mon niveau d'expertise dans les différents domaines que je maîtrise ? non,
T'ai-je agressé ? non,

Alors retourne cuver car tu pourrais prendre des leçons ... à tous points vue ...
Jeedom VM ESXI sur NUC
Ilot I/O Modbus Wago Z-Wave (11 volets,prises,présences) + RFXCom (sondes T°+RH, prises)
Pont Hue et une vingtaine d'ampoules,une flopée de Xiaomi aquara, Harmony Elite
8 Google Home et un PC tactile All-In accroché au mur

Anonyme
Actif
Messages : 10082
Inscription : 09 août 2014, 12:15

Re: Manipuler les bits

Message par Anonyme » 25 déc. 2017, 22:55

Contenu supprimé à la demande de son auteur

Plume
Timide
Messages : 17
Inscription : 27 juin 2017, 18:47

Re: Manipuler les bits

Message par Plume » 26 nov. 2018, 00:22

Bonjour,

Impossible pour moi de scruter au delà du 6ème bit d'un mot.... Au delà, le bit sur jeedom reste à 0 alors qu'il est à 1 sur mon automate wago.

Auriez-vous une idée du problème ?

meute
Actif
Messages : 1102
Inscription : 26 août 2017, 11:07
Localisation : Belgique

Re: Manipuler les bits

Message par meute » 26 nov. 2018, 10:58

Plume a écrit :
26 nov. 2018, 00:22
Bonjour,

Impossible pour moi de scruter au delà du 6ème bit d'un mot.... Au delà, le bit sur jeedom reste à 0 alors qu'il est à 1 sur mon automate wago.

Auriez-vous une idée du problème ?
donne peut-être la méthode que tu utilises ... comment veux-tu que quelqu'un te réponde sans savoir comment tu as essayé de le faire ?
Jeedom VM ESXI sur NUC
Ilot I/O Modbus Wago Z-Wave (11 volets,prises,présences) + RFXCom (sondes T°+RH, prises)
Pont Hue et une vingtaine d'ampoules,une flopée de Xiaomi aquara, Harmony Elite
8 Google Home et un PC tactile All-In accroché au mur

Plume
Timide
Messages : 17
Inscription : 27 juin 2017, 18:47

Re: Manipuler les bits

Message par Plume » 26 nov. 2018, 11:07

Autant pour moi j'ai fais une erreur.

J'utilise la commande suivant dans un script:
#[variable]# & 1024

Le problème venait des valeurs min max que j'avais laissé dans les option de mon mot modbus.

Plume
Timide
Messages : 17
Inscription : 27 juin 2017, 18:47

Re: Manipuler les bits

Message par Plume » 26 nov. 2018, 11:56

Quelle commande puis-je utiliser pour passer par exemple le bit 15 d'un mot à 1 avec un virtuel ?

Plume
Timide
Messages : 17
Inscription : 27 juin 2017, 18:47

Re: Manipuler les bits

Message par Plume » 29 nov. 2018, 23:30

Quelqu'un aurait-il une réponse ?

Avatar de l’utilisateur
Bebel27
Actif
Messages : 908
Inscription : 19 oct. 2014, 18:04
Localisation : Normandie

Re: Manipuler les bits

Message par Bebel27 » 30 nov. 2018, 00:35

#[variable]# & 16384 je dis ça s'en trop être sure de moi .. :oops:

JEEDOM (que la domotique soit avec toi )

Répondre

Revenir vers « Scénarios »

Qui est en ligne ?

Utilisateurs parcourant ce forum : Aucun utilisateur inscrit et 9 invités