[RESOLU] Lecture sonde depuis interface php

Vous venez de déballer votre Raspberry Pi et vous vous posez des questions ? C'est ici que ça se passe !

Modérateur : Francois

lawfix
Messages : 66
Enregistré le : mer. 24 sept. 2014 10:02

Re: Lecture sonde depuis interface php

Message par lawfix » mer. 21 janv. 2015 23:55

Bonsoir,

Alors j'ai vérifié les droits, www-data n'avait pas accès à ce répertoire, mais par contre il avait bien accès au répertoire du programme suivant :

Code : Tout sélectionner


#!/usr/bin/python
# -*- coding: utf-8 -*-
tfile = open("/sys/bus/w1/devices/28-00141312f0ff/w1_slave")#

# Read all of the text in the file.
text = tfile.read()
# Close the file now that the text has been read.
tfile.close()
# Split the text with new lines (\n) and select the second line.
secondline = text.split("\n")[1]
# Split the line into words, referring to the spaces, and select the 10th word $
temperaturedata = secondline.split(" ")[9]
# The first two characters are "t=", so get rid of those and convert the temper$
temperature = float(temperaturedata[2:])
# Put the decimal point in the right place and display it.
temperature = temperature / 1000
print temperature
En exécutant ce code, cela permet d'afficher la t° sans ligne ou fioritures.

Le problème reste entier car on reste à zéro...

J'ai bien entendu remodifié les droits sur le bus pour qu'il accède au capteur et pareil même soucis...

Merci pour l'aide :)

Avatar du membre
vague nerd
Modérateur
Messages : 1473
Enregistré le : mar. 14 oct. 2014 11:42
Localisation : France !

Re: Lecture sonde depuis interface php

Message par vague nerd » jeu. 22 janv. 2015 15:38

Bonjour.

Je vous propose de vérifier en premier si c'est la mise en forme du résultat qui fait '0' ou le capteur qui retourne '0'.
(Ma piste : la valeur récupérée en local est en utf-8 par exemple, et le serveur http en iso-latin, toujours par exemple, la conversion posant problème dans les calculs).

Je vous propose de passer en mode de débug old school. Je vous propose de lancer le script suivant (c'est le votre, on se contente d'imprimer les valeurs des variables temporaires)
dans un terminal puis au travers d'une page php hébergée par votre serveur, et de comparer les résultats.
L'idée est de diagnostiquer si le problème vient de la valeur retournée par le capteur ou de la conversion.

Code : Tout sélectionner

#!/usr/bin/python
# -*- coding: utf-8 -*-
tfile = open("/sys/bus/w1/devices/28-00141312f0ff/w1_slave")#

# Read all of the text in the file.
text = tfile.read()
# Close the file now that the text has been read.
tfile.close()
# Split the text with new lines (\n) and select the second line.
print text
print "\n"
secondline = text.split("\n")[1]
# Split the line into words, referring to the spaces, and select the 10th word $
temperaturedata = secondline.split(" ")[9]
print temperaturedata 
print "\n"
# The first two characters are "t=", so get rid of those and convert the temper$
temperature = float(temperaturedata[2:])
# Put the decimal point in the right place and display it.
temperature = temperature / 1000
print temperature
Si text est vide, le capteur n'a rien retourné. Sinon si temperature contient '0', c'est la conversion qui pose problème.

Que vaut text dans les deux cas (php et shell) ? (en shell, c'est remplis, en php ça ne l'est pas ? les deux résultats différents ?)
Si text vaut '0' ou est vide en php et est valorisé en shell, ça ressemble toujours à un problème de droits.
Que vaut temperature dans les deux cas ? (une valeur correcte en shell, '0' en php ?)
Cordialement,

Vague Nerd

Avatar du membre
vague nerd
Modérateur
Messages : 1473
Enregistré le : mar. 14 oct. 2014 11:42
Localisation : France !

Re: Lecture sonde depuis interface php

Message par vague nerd » jeu. 22 janv. 2015 15:47

Question subsidiaire : selon le script dont on parle, vous 'vous connectez' au résultat de deux manières.

Code : Tout sélectionner

$temp = shell_exec('cat /sys/bus/w1/devices/28-00141312f0ff#');

Code : Tout sélectionner

tfile = open("/sys/bus/w1/devices/28-00141312f0ff/w1_slave")#
Pourquoi les chemins diffèrent-ils ('/w1_slave') ?

Dans un terminal utilisateur standard, que retourne

Code : Tout sélectionner

cat /sys/bus/w1/devices/28-00141312f0ff#
et

Code : Tout sélectionner

cat /sys/bus/w1/devices/28-00141312f0ff/w1_slave
?
Cordialement,

Vague Nerd

lawfix
Messages : 66
Enregistré le : mer. 24 sept. 2014 10:02

Re: Lecture sonde depuis interface php

Message par lawfix » ven. 23 janv. 2015 10:35

Bonjour,

Ayant eu quelques soucis hier soir je n'ai pu effectuer les tests.

Pour autant je préfère prévenir.

Je reviens assez vite pour vous donner le résultats de vos conseils !

Merci beaucoup

lawfix
Messages : 66
Enregistré le : mer. 24 sept. 2014 10:02

Re: Lecture sonde depuis interface php

Message par lawfix » sam. 24 janv. 2015 16:32

vague nerd a écrit :Question subsidiaire : selon le script dont on parle, vous 'vous connectez' au résultat de deux manières.

Code : Tout sélectionner

$temp = shell_exec('cat /sys/bus/w1/devices/28-00141312f0ff#');

Code : Tout sélectionner

tfile = open("/sys/bus/w1/devices/28-00141312f0ff/w1_slave")#
Pourquoi les chemins diffèrent-ils ('/w1_slave') ?

Dans un terminal utilisateur standard, que retourne

Code : Tout sélectionner

cat /sys/bus/w1/devices/28-00141312f0ff#
et

Code : Tout sélectionner

cat /sys/bus/w1/devices/28-00141312f0ff/w1_slave
?
vague nerd a écrit :Bonjour.

Je vous propose de vérifier en premier si c'est la mise en forme du résultat qui fait '0' ou le capteur qui retourne '0'.
(Ma piste : la valeur récupérée en local est en utf-8 par exemple, et le serveur http en iso-latin, toujours par exemple, la conversion posant problème dans les calculs).

Je vous propose de passer en mode de débug old school. Je vous propose de lancer le script suivant (c'est le votre, on se contente d'imprimer les valeurs des variables temporaires)
dans un terminal puis au travers d'une page php hébergée par votre serveur, et de comparer les résultats.
L'idée est de diagnostiquer si le problème vient de la valeur retournée par le capteur ou de la conversion.

Code : Tout sélectionner

#!/usr/bin/python
# -*- coding: utf-8 -*-
tfile = open("/sys/bus/w1/devices/28-00141312f0ff/w1_slave")#

# Read all of the text in the file.
text = tfile.read()
# Close the file now that the text has been read.
tfile.close()
# Split the text with new lines (\n) and select the second line.
print text
print "\n"
secondline = text.split("\n")[1]
# Split the line into words, referring to the spaces, and select the 10th word $
temperaturedata = secondline.split(" ")[9]
print temperaturedata 
print "\n"
# The first two characters are "t=", so get rid of those and convert the temper$
temperature = float(temperaturedata[2:])
# Put the decimal point in the right place and display it.
temperature = temperature / 1000
print temperature
Si text est vide, le capteur n'a rien retourné. Sinon si temperature contient '0', c'est la conversion qui pose problème.

Que vaut text dans les deux cas (php et shell) ? (en shell, c'est remplis, en php ça ne l'est pas ? les deux résultats différents ?)
Si text vaut '0' ou est vide en php et est valorisé en shell, ça ressemble toujours à un problème de droits.
Que vaut temperature dans les deux cas ? (une valeur correcte en shell, '0' en php ?)
Alors le script python lancé depuis le terminal donne ce résultat :

Code : Tout sélectionner


root@raspberrypi:/var/fx# python temp.sh
1d 01 55 00 7f ff 0c 10 e0 : crc=e0 YES
1d 01 55 00 7f ff 0c 10 e0 t=17812



t=17812


17.812
c'est un copier collé du terminal.

Alors en mettant le shell exec avec le code python que vous m'avez communiqué, j'ai toujours 0 comme retour...

Pour les questions subsidiaires, effectivement j'avais mal recopié le code, le bon est bien $temp = shell_exec('cat /sys/bus/w1/devices/28-00141312f0ff/w1_slave');

Je l'avais rechangé depuis, mais ça ne change rien :\

Avatar du membre
vague nerd
Modérateur
Messages : 1473
Enregistré le : mar. 14 oct. 2014 11:42
Localisation : France !

Re: Lecture sonde depuis interface php

Message par vague nerd » sam. 24 janv. 2015 16:49

Bonjour.
j'ai toujours 0 comme retour...
C'est bien le capteur qui retourne '0' (et non la conversion) ? (Qu'avez vous sur la page ? Blanche ? 0,0,0 ?)
Dans ce cas, ça ressemble à un problème de droits, de nouveau...

Sinon, on est sûr que la conf du php est bonne ? Le php est bien interprété ? (Par exemple, créez une page appelant php.info() )
j'avais mal recopié le code, le bon est bien $temp = shell_exec('cat /sys/bus/w1/devices/28-00141312f0ff/w1_slave');
En plus des droits
Le user www-data a-t-il le droit de lire dans /sys/bus/w1/devices ?
Dans /sys/bus/w1/devices/28-00141312f0ff# ?
(Sinon, même opération que dans le tuto pour changer les droits)
il faut aussi les droits sur /sys/bus/w1/devices/28-00141312f0ff/w1_slave...

Que retourne

Code : Tout sélectionner

ls -las /sys/bus/w1/devices/28-00141312f0ff/w1_slave
? www-data peut piocher dedant ?

Enfin, juste pour les tests, pouvez-vous faire un

Code : Tout sélectionner

shell_exec('sudo cat /sys/bus/w1/devices/28-00141312f0ff/w1_slave')
à la place de

Code : Tout sélectionner

shell_exec('cat /sys/bus/w1/devices/28-00141312f0ff/w1_slave')
?

Cdt.
Cordialement,

Vague Nerd

lawfix
Messages : 66
Enregistré le : mer. 24 sept. 2014 10:02

Re: Lecture sonde depuis interface php

Message par lawfix » sam. 24 janv. 2015 17:21

Bonjour,

Alors le capteur retourne bien la température en mode terminal.

C'est une fois en php que je me retrouve avec 0.

Le code python que vous m'avez donné je l'ai enregistré sous temp.sh et j'ai remplacé dans la formule shell_exec.

J'ai également tenté de rajouter sudo, que ce soit pour l'exécution du cat ou du du code python.

J'avoue ne pas trop saisir...

Si je vérifie les droits de w1 :

Code : Tout sélectionner

root@raspberrypi:/sys/bus/w1/devices/28-00141312f0ff# ls -las /sys/bus/w1/devices/28-00141312f0ff/w1_slave
0 -rwxr--r-- 1 www-data www-data 4096 janv. 24 16:08 /sys/bus/w1/devices/28-00141312f0ff/w1_slave
le user www-data a bien les droits :\

lawfix
Messages : 66
Enregistré le : mer. 24 sept. 2014 10:02

Re: Lecture sonde depuis interface php

Message par lawfix » sam. 24 janv. 2015 18:05

Je reviens à la charge :

Je pense qu'il y a un soucis dans mon code / script php.

J'ai utilisé ce code php :

Code : Tout sélectionner

<?php
//File to read
$file = '/sys/devices/w1_bus_master1/28-00141312f0ff/w1_slave';

//Read the file line by line
$lines = file($file);

//Get the temp from second line 
$temp = explode('=', $lines[1]);

//Setup some nice formatting (i.e. 21,3)
$temp = number_format($temp[1] / 1000, 1, ',', '');

//And echo that temp
echo $temp . " °C";
?>
la température s'affiche normalement...

Avatar du membre
vague nerd
Modérateur
Messages : 1473
Enregistré le : mar. 14 oct. 2014 11:42
Localisation : France !

Re: Lecture sonde depuis interface php

Message par vague nerd » sam. 24 janv. 2015 18:17

J'ai bien compris ?
tfile = open("/sys/bus/w1/devices/28-00141312f0ff/w1_slave")
text = tfile.read()
tfile.close()
text contient '0' quand exécuté en python/lighttpd et
$file = '/sys/devices/w1_bus_master1/28-00141312f0ff/w1_slave';
$lines = file($file);
$lines contient quelquechose dans les mêmes conditions ?

PS : les droits sur le script python lui-même sont ok ?
Cordialement,

Vague Nerd

lawfix
Messages : 66
Enregistré le : mer. 24 sept. 2014 10:02

Re: Lecture sonde depuis interface php

Message par lawfix » sam. 24 janv. 2015 19:43

La j'avoue ne pas saisir la réponse par rapport à l'exécution du code python et le php

Le code python que j'ai mis en place grâce à vous est celui ci :

Code : Tout sélectionner

#!/usr/bin/python
# -*- coding: utf-8 -*-
tfile = open("/sys/bus/w1/devices/28-00141312f0ff/w1_slave")#

# Read all of the text in the file.
text = tfile.read()
# Close the file now that the text has been read.
tfile.close()
# Split the text with new lines (\n) and select the second line.
print text
print "\n"
secondline = text.split("\n")[1]
# Split the line into words, referring to the spaces, and select the 10th word $
temperaturedata = secondline.split(" ")[9]
print temperaturedata 
print "\n"
# The first two characters are "t=", so get rid of those and convert the temper$
temperature = float(temperaturedata[2:])
# Put the decimal point in the right place and display it.
temperature = temperature / 1000
print temperature
ce code a été enregistré dans un fichier temp sur le pi.

J'ai exécuté le code en utilisant shell_exec sur les lignes de commandes php du serveur web.

mais par contre je ne vois pas comment analyser ce qui se passe lorsque je demande au serveur de lancer la commande, je n'ai pas le détail ligne par ligne de ce qu'exécute le soft !



J'ai poursuivi avec l'autre code.

J'ai inséré l'autre code php dans une autre page temp.php qui défini la valeur $temp

J'ai édité ma page de code principale communiquée en premier lieu, j'ai retiré les deux ligne sur le $temp
j'ai rajouté un include 'temp.php';

Et après quelques bidouillages sur la conversion du nombre, cela s'affiche correctement.

Dès lors je me suis aperçu de deux choses :
- lorsque le script qui génère les jauges ne dispose pas d'une valeur correcte, il ne renvoi pas 0, la jauge n'apparait tout simplement pas du tout
- en déduction, si avant j'avais 0 avec ma commande cat, c'est tout simplement parce que 0 est la valeur que la commande renvoi.

Par conséquent, il faut forcément passer par un programme pyhthon pour qu'il ressorte une ligne de température en valeur brute sans des virgules ou autres.

Je vais donc voir comment faire pour utiliser la commande cat sur la sonde afin d'ajouter des lignes de code dans le php pour qu'il ne prenne pas n'importe quelle valeur, mais la 2e ligne en brut.

Répondre

Retourner vers « Débutants »