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.
Anthony PENHARD
Unregistered
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.
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
> 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
> 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
Anthony PENHARD
Unregistered
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
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
@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
Charles Delorme
Unregistered
> 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 :-)
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.
Charles Delorme
Unregistered
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...
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
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
Charles Delorme
Unregistered
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
Anthony PENHARD
Unregistered
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
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
Anthony PENHARD
Unregistered
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
On 19 mai, 19:28, Anthony PENHARD <a.penh...@gmail.com> wrote:
> du coup la suite il manque eibclient.php ...
dans Temp :-)
Anthony PENHARD
Unregistered
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 :-)
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
Anthony PENHARD
Unregistered
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
Charles Delorme
Unregistered
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 ?
@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
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
Charles Delorme
Unregistered
>> @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 :-)
|