Note de ce sujet :
  • Moyenne : 0 (0 vote(s))
  • 1
  • 2
  • 3
  • 4
  • 5
Lecture de GA et affichage décimal en PHP
#1
Bonjour,

J'essaye d'afficher une lecture de GA (température) en PHP.
J'ai retrouvé le post de Roby & Pascal à propos de la conversion:
https://groups.google.com/group/domotiqu...bb309d38d7

Je me demande si quelqu'un a déjà une routine toute faite en PHP ?
(dans le sens ETS->décimal)

Merci d'avance.
Répondre
#2
Bonjour,

> J'essaye d'afficher une lecture de GA (température) en PHP.
> J'ai retrouvé le post de Roby & Pascal à propos de la conversion:
> https://groups.google.com/group/domotiqu...bb309d38d7
>
> Je me demande si quelqu'un a déjà une routine toute faite en PHP ?
> (dans le sens ETS->décimal)

ça te va si c'est en javascript ?

il est possible "d'extraire" le code de la page :
http://www.tapko.de/Tools.31.0.html

@+
Anthony.
Répondre
#3
On 17 mai, 16:30, "Anthony PENHARD" <a.penh...@gmail.com> wrote:
> a te va si c'est en javascript ?
Mes talents de programmeur sont très limités.
Merci quand même

> il est possible "d'extraire" le code de la page :http://www.tapko.de/Tools.31.0.html
J'avais vu la page avec l'outil, mais pas vu qu'on pouvait extraire le
code.

Entretemps, j'ai trouvé une routine PHP sur le forum allemand.... je
teste

Merci
Répondre
#4
> Entretemps, j'ai trouvé une routine PHP sur le forum allemand...
Je bloque sur un problème incompréhensible.

J'utilise la fonction GroupRead pour lire le contenu d'un GA, çà
fonctionne pour d'aures applications (également en PHP)

La fonction de conversion fonctionne aussi. Lorsque je force une
valeur à l'entrée i.e. 1902 il me sort bien 20,64°

Les 2 ensembles donnent des résultats irrationnels.
eibd tourne sur un NAS QNAP avec PHP5, il n'y a pas lieu de les
soupçonner car d'autres appli fonctionnent (affichage KNX sur l'écran
tactile d'un tf Cisco
Je joins un extrait du code

$value = GroupRead("127.0.0.1","0/6/38");
....
$eis5 = hexdec($value);
$wert = ($eis5 & 0x07ff);
if (($eis5 & 0x08000) != 0)
{
$wert = $wert | 0xfffff800;
$wert = $wert *-1;
}
$wert = $wert << (($eis5 & 0x07800) >> 11);
if (($eis5 & 0x08000) != 0)
{
$wert = $wert * -1;
}
$val = $wert/100;
......
$string = "Temp: " . $val . "°C";



Si quelqu'un à une idée concrète, je suis preneur
Répondre
#5
> Entretemps, j'ai trouvé une routine PHP sur le forum allemand...
Il se pourrais que ce ne soit pas la bonne fonction de conversion.
On m'a tuyauté vers les librairies eibd client, effectivement, il y a
2 fonctions de conversion
J'ai essayé
function f2_decode($val)
{
$exp = ($val[0] & 0x78) >> 3;
$sign = ($val[0] & 0x80) >> 7;
$mant = ($val[0] & 0x07) << 8 | $val[1];
if ($sign)
$sign = -1 << 11;
else
$sign = 0;
$val = ($mant | $sign) * pow (2, $exp) * 0.01;
return $val;
}
qui ne donne pas le bon résultat et
function f2_encode($val)
{
if($val<0)
{
$sign = 1;
$val = - $val;
}
else
$sign = 0;
$val = $val * 100.0;
$exp = 0;
while ($val > 2047)
{
$exp ++;
$val = $val / 2;
}
if ($sign)
$val = - $val;
$val = $val & 0x7ff;

return array(($sign << 7) | (($exp & 0x0f)<<3)| (($val >> 8)&0x07),
($val& 0xff));
}
qui semble être la bonne, mais que je n'arrive pas à faire marcher, ou
bien je ne sais pas m'en servir avec cet array
Répondre
#6
essaye : print_r( f2_encode($val) );
pour voir ce que cela te donne

il doit y avoir 2 valeurs je pense
ou alors
$tab = f2_encode($val);
echo "valeur1 $tab[0] valeur2 $tab[1] ";




Le 18 mai 2011 20:43, marc.assin <raymond@warichet.com> a écrit :

> > Entretemps, j'ai trouvé une routine PHP sur le forum allemand...
> Il se pourrais que ce ne soit pas la bonne fonction de conversion.
> On m'a tuyauté vers les librairies eibd client, effectivement, il y a
> 2 fonctions de conversion
> J'ai essayé
> function f2_decode($val)
> {
> $exp = ($val[0] & 0x78) >> 3;
> $sign = ($val[0] & 0x80) >> 7;
> $mant = ($val[0] & 0x07) << 8 | $val[1];
> if ($sign)
> $sign = -1 << 11;
> else
> $sign = 0;
> $val = ($mant | $sign) * pow (2, $exp) * 0.01;
> return $val;
> }
> qui ne donne pas le bon résultat et
> function f2_encode($val)
> {
> if($val<0)
> {
> $sign = 1;
> $val = - $val;
> }
> else
> $sign = 0;
> $val = $val * 100.0;
> $exp = 0;
> while ($val > 2047)
> {
> $exp ++;
> $val = $val / 2;
> }
> if ($sign)
> $val = - $val;
> $val = $val & 0x7ff;
>
> return array(($sign << 7) | (($exp & 0x0f)<<3)| (($val >> 8)&0x07),
> ($val& 0xff));
> }
> qui semble être la bonne, mais que je n'arrive pas à faire marcher, ou
> bien je ne sais pas m'en servir avec cet array
Répondre
#7
Salut Raymond,

La fonction f2_decode effectue la bonne conversion. Je pense que le
problème se trouve dans ce que tu lui fournis.
A première vue, cette fonction s'attend à recevoir en entrée un Array
de 2 valeurs correspondant aux 2 octets de données transmis sur le
bus.
Essaie d'afficher ce que tu fournis à la fonction hexdec et ce qu'elle
retourne, tu trouveras peut-être quelque chose d'intéressant.
En fait, le premier example que tu donnais me paraît bon, surtout que
tu dis que ça fonctionne avec "1902". Es-tu certain que la fonction
GroupRead retourne bien une chaine de caractères?

Jean-François

On 18 mai, 20:43, "marc.assin" <raym...@warichet.com> wrote:
> > Entretemps, j'ai trouvé une routine PHP sur le forum allemand...
>
> Il se pourrais que ce ne soit pas la bonne fonction de conversion.
> On m'a tuyauté vers les librairies eibd client, effectivement, il y a
> 2 fonctions de conversion
> J'ai essayé
> function f2_decode($val)
> {
>   $exp = ($val[0] & 0x78) >> 3;
>   $sign = ($val[0] & 0x80) >> 7;
>   $mant = ($val[0] & 0x07) << 8 | $val[1];
>   if ($sign)
>     $sign = -1 << 11;
>   else
>     $sign = 0;
>   $val = ($mant | $sign) * pow (2, $exp) * 0.01;
>  return $val;}
>
> qui ne donne pas le bon résultat et
> function f2_encode($val)
> {
>   if($val<0)
>     {
>       $sign = 1;
>       $val = - $val;
>     }
>   else
>     $sign = 0;
>   $val = $val * 100.0;
>   $exp = 0;
>   while ($val > 2047)
>     {
>       $exp ++;
>       $val = $val / 2;
>     }
>   if ($sign)
>     $val = - $val;
>   $val = $val & 0x7ff;
>
>   return array(($sign << 7) | (($exp & 0x0f)<<3)| (($val >> 8)&0x07),
> ($val& 0xff));}
>
> qui semble être la bonne, mais que je n'arrive pas à faire marcher, ou
> bien je ne sais pas m'en servir avec cet array
Répondre
#8
@Anthony
> essaye : print_r( f2_encode($val) );
OK, merci pour le tuyau, je vais essayer

@Jean-François
> La fonction f2_decode effectue la bonne conversion.
OK
> Je pense que le problème se trouve dans ce que tu lui fournis.
Je suis (péniblement) arrivé à la même conclusion.

>A première vue, cette fonction s'attend à recevoir en entrée un Array
de 2 valeurs correspondant aux 2 octets de données transmis sur le
bus.
OK

>Es-tu certain que la fonction GroupRead retourne bien une chaine
de caractères?
Non, je n'en suis par sûr, en fait je patauge lamentablement.
Mis à part GroupRead, je ne vois pas d'autre fonction de lecture de GA
dans eibd.
Là aussi, il y a peut-être erreur, en ce sens que GroupRead fourni
bien la bonne valeur, mais pas forcément au format escompté (je n'ai
rien vu dans la doc).
Je crois que j'ai fait une erreur depuis le départ.
Je me suis basé sur ETS et Bus Monitor, lorsqu'on lance un Read sur le
GA concerné, ETS montre 2 valeurs: la valeur Hex et la valeur décimale
correspondante.
Lorsque je force cette valeur Hex dans la conversion, elle donne bien
le bon résultat, mais peut-être que tout le raisonnement est à côté de
la plaque

Merci pour votre aide précieuse
Répondre
#9
> Lorsque je force cette valeur Hex dans la conversion, elle donne bien
> le bon résultat, mais peut-être que tout le raisonnement est à côté de
> la plaque

Alors commence par faire un print_r de ce que te renvoi
GroupRead("127.0.0.1","0/6/38"). Après tout, c'est là le point de départ :-)
Répondre
#10
On 19 mai, 09:14, Charles Delorme <charles.delo...@suricat.net> wrote:
> Alors commence par faire un print_r de ce que te renvoi
> GroupRead("127.0.0.1","0/6/38").
Mis à part qu'il s'agit d'une application pour téléphone Cisco où les
info sont manipulées par des
imagecreatetruecolor, imagecolorallocate, imagefttext
et que le print_r ne marche pas tel-quel.
Il faut à chaque petit test faire une nouveau script PHP
Je ne cherches pas d'excuses, juste que ce n'est pas toujours
simple... surtout pour un non-programmeur.
Répondre
#11
Le 19/05/2011 10:02, marc.assin a écrit :
> On 19 mai, 09:14, Charles Delorme<charles.delo...@suricat.net> wrote:
>> Alors commence par faire un print_r de ce que te renvoi
>> GroupRead("127.0.0.1","0/6/38").
> Mis à part qu'il s'agit d'une application pour téléphone Cisco où les
> info sont manipulées par des
> imagecreatetruecolor, imagecolorallocate, imagefttext
> et que le print_r ne marche pas tel-quel.
> Il faut à chaque petit test faire une nouveau script PHP
> Je ne cherches pas d'excuses, juste que ce n'est pas toujours
> simple... surtout pour un non-programmeur.
ouch.... ah oui, ok...

Bon courage...
Répondre
#12
J'ai donc suivi vos conseils. Voici le résultat
Il semblerais que f2_encode donne une info exploitable, mais comment

pour GA 0/6/38
La valeur réelle dans ETS: 1905 | 20,9°

print_r (5);
5
print_r(decode(5))
0.05
print_r( f2_encode(5))
Array
(
[0] => 1
[1] => 244
)

print_r( f2_decode(5))
0
Répondre
#13
Est-ce que quelqu'un ayant eibd, php et un thermostat pourrais faire
un test ?
J'ai déposé le fichier Test3b.php dans "Temp"
Juste éditer la ligne
$ga2 = "0/6/38"; pour y mettre le GA de la temp réelle du thermostat

J'ai p'têt un problème d'environnement...php.ini, NAS, etc
Répondre
#14
Le 19/05/2011 16:51, marc.assin a écrit :
>
> Est-ce que quelqu'un ayant eibd, php et un thermostat pourrais faire
> un test ?
Oui, je peux. Ce soir pas avant, je vais essayer de ne pas oublier,
sinon ce sera la semaine prochaine :-(

> J'ai déposé le fichier Test3b.php dans "Temp"
https://sites.google.com/site/domotiquee...hiers/temp
(juste pour ne pas oublier l'url)

> Juste éditer la ligne
> $ga2 = "0/6/38"; pour y mettre le GA de la temp réelle du thermostat
>
> J'ai p'têt un problème d'environnement...php.ini, NAS, etc
Répondre
#15
tu aurais GroupRead.php quelque part ?


Le 19 mai 2011 16:51, marc.assin <raymond@warichet.com> a écrit :

>
> Est-ce que quelqu'un ayant eibd, php et un thermostat pourrais faire
> un test ?
> J'ai déposé le fichier Test3b.php dans "Temp"
> Juste éditer la ligne
> $ga2 = "0/6/38"; pour y mettre le GA de la temp réelle du thermostat
>
> J'ai p'têt un problème d'environnement...php.ini, NAS, etc
Répondre
#16
On 19 mai, 19:06, Anthony PENHARD <a.penh...@gmail.com> wrote:
> tu aurais GroupRead.php quelque part ?
Ouups
Je l'ai mis dans temp https://sites.google.com/site/domotiquee...hiers/temp

Merci
Répondre
#17
du coup la suite il manque eibclient.php ...

Le 19 mai 2011 19:11, marc.assin <raymond@warichet.com> a écrit :

> On 19 mai, 19:06, Anthony PENHARD <a.penh...@gmail.com> wrote:
> > tu aurais GroupRead.php quelque part ?
> Ouups
> Je l'ai mis dans temp
> https://sites.google.com/site/domotiquee...hiers/temp
>
> Merci
Répondre
#18
On 19 mai, 19:28, Anthony PENHARD <a.penh...@gmail.com> wrote:
> du coup la suite il manque eibclient.php ...
dans Temp :-)
Répondre
#19
alors le résultat c'est :
-print (158); 158 -print_r (158); 158 -print_r(decode(158)); 3.44 -print_r(
f2_encode(158)); Array ( [0] => 31 [1] => 183 ) -print_r( f2_decode(158)); 0

et la valeur de est de "19.5" c'est une température de type "9.xxx"=EIS5

Le 19 mai 2011 19:43, marc.assin <raymond@warichet.com> a écrit :

> On 19 mai, 19:28, Anthony PENHARD <a.penh...@gmail.com> wrote:
> > du coup la suite il manque eibclient.php ...
> dans Temp :-)
Répondre
#20
On 19 mai, 19:56, Anthony PENHARD <a.penh...@gmail.com> wrote:
> alors le résultat c'est :
> -print (158); 158 -print_r (158); 158 -print_r(decode(158)); 3.44 -print_r(
> f2_encode(158)); Array ( [0] => 31 [1] => 183 ) -print_r( f2_decode(158)); 0

> et la valeur de est de "19.5" c'est une température de type "9.xxx"=EIS5

Mais ?!? on ne trouve aucune trace de 19.5 dans les output du
script ?!?
C'est donc le même problème que chez moi ?

Merci pour le test
Répondre
#21
de rien

le problème viens de GroupRead a priori
parce que si j'enlève les printf dans la fonction j'ai bien la valeur 079E
qui apparaît et qui correspond bien à 19.5 :

-print (079E); 079E -print_r (079E); 079E -print_r(decode(079E)); 19.5
-print_r( f2_encode(079E)); Array ( [0] => 23 [1] => 183 ) -print_r(
f2_decode(079E)); 0.07

a creuser ...


Le 19 mai 2011 20:01, marc.assin <raymond@warichet.com> a écrit :

> On 19 mai, 19:56, Anthony PENHARD <a.penh...@gmail.com> wrote:
> > alors le résultat c'est :
> > -print (158); 158 -print_r (158); 158 -print_r(decode(158)); 3.44
> -print_r(
> > f2_encode(158)); Array ( [0] => 31 [1] => 183 ) -print_r(
> f2_decode(158)); 0
>
> > et la valeur de est de "19.5" c'est une température de type "9.xxx"=EIS5
>
> Mais ?!? on ne trouve aucune trace de 19.5 dans les output du
> script ?!?
> C'est donc le même problème que chez moi ?
>
> Merci pour le test
Répondre
#22
Le 19/05/2011 20:23, Anthony PENHARD a écrit :
> de rien
>
> le problème viens de GroupRead a priori
> parce que si j'enlève les printf dans la fonction j'ai bien la valeur
> 079E qui apparaît et qui correspond bien à 19.5 :
>
> -print (079E); 079E -print_r (079E); 079E -print_r(decode(079E)); 19.5
> -print_r( f2_encode(079E)); Array ( [0] => 23 [1] => 183 ) -print_r(
> f2_decode(079E)); 0.07
Ouais, donc je fais pas le test chez moi ou tu le veux tout de meme ?
Répondre
#23
@Anthony
> le problème viens de GroupRead a priori
> parce que si j'enlève les printf dans la fonction j'ai bien la valeur 079E
> qui apparaît et qui correspond bien à 19.5 :
J'ai pas compris
Dans quelle fonction as-tu enlevé le printf ? et qui fait tout
marcher ?

@Charles
> donc je fais pas le test chez moi
Je pense que ce n'est plus nécessaire.
Merci Charles
Répondre
#24
Salut,

Effectivement, quand on a tout le code, c'est beaucoup plus facile de
trouver le problème.
C'est la fonction GroupRead qui n'est pas conçue pour retourner une
valeur sur 2 bytes. Comme le commentaire à la fin le laisse penser:
"// return the EIB status, 0=Off, 1=On, xx-dimmer value"

En remplaçant:
for ($i=3; $i<=$len; $i++)
/* printf ("%02X", $buf[$i]);
printf ("\n");
*/
$return=$buf[$i]; // $return=$return.$buf[$i];
par:
if ($len == 3)
$return=$buf[$i];
else
$return=array_slice($buf, 3);

Ca pourrait aller mieux. Ensuite tu peux passer directement le
résultat de GroupRead à la fonction f2_decode.

Je suppose que tu n'utilises pas la fonction GroupRead dans d'autres
scripts pour lire des valeurs sur plusieurs bytes. Vu que dans l'état
actuel elle ne retourne que le dernier byte et oublie purement et
simplement les autres.

A+

Jean-François

On 19 mai, 20:53, "marc.assin" <raym...@warichet.com> wrote:
> @Anthony> le problème viens de GroupRead a priori
> > parce que si j'enlève les printf dans la fonction j'ai bien la valeur 079E
> > qui apparaît et qui correspond bien à 19.5 :
>
> J'ai pas compris
> Dans quelle fonction as-tu enlevé le printf ? et qui fait tout
> marcher ?
>
> @Charles> donc je fais pas le test chez moi
>
> Je pense que ce n'est plus nécessaire.
> Merci Charles
Répondre
#25
>> @Charles> donc je fais pas le test chez moi
>>
>> Je pense que ce n'est plus nécessaire.
>> Merci Charles

Avec le dev sous la main, c'est sûr :-)
Répondre


Atteindre :


Utilisateur(s) parcourant ce sujet : 1 visiteur(s)