Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 05/12/2013, à 11:53

pem1664

raspberry pi et thermomètre 1-wire

Bonjour à tous,
je suis en train d'installer des capteurs de températures (DS18B20) sur tous les raspberry que j'ai chez moi, et j'aimerai récuperer toutes les valeurs de ces différents thermomètre dans un fichier que je pourrais utiliser après pour une interface web.
J'avais dans l'idée de faire un script lancé par crontab qui interroge chaque raspi en ssh (donc avec une authentification par clé) et récupère la valeur donnée puis la stock dans un fichier.
J'arrive à récupérer la température mais je ne sais pas comment mettre la "," au bon endroit..

pi@salon ~ $ cat /sys/bus/w1/devices/28-0000051d7e76/w1_slave
a3 01 4b 46 7f ff 0d 10 ce : crc=ce YES
a3 01 4b 46 7f ff 0d 10 ce t=26187
pi@salon ~ $ cat /sys/bus/w1/devices/28-0000051d7e76/w1_slave | grep '[0-9]' | cut -d "=" -f2 | cut -d "S" -f2

26125

C'est pas propre, mais je ne comprends pas grand chose aux sed, awk etc..
Quelqu'un aurait la bonté de me donner une ligne plus propre qui rajouterai la "," en plus? Et si cette personne avait aussi la bonté de me l'expliquer ca serait top!
D'avance merci!
smile


Pas de problème sans solutions, mettre [résolu] dans son premier post permet de rechercher plus facilement une solution... ;)

Hors ligne

#2 Le 05/12/2013, à 11:56

Postmortem

Re : raspberry pi et thermomètre 1-wire

Salut,
Tu veux la rajouter où ??


Mot' a dit : « Un Hellfest sans Slayer, c'est comme une galette-saucisse sans saucisse ! »

Hors ligne

#3 Le 05/12/2013, à 12:21

pingouinux

Re : raspberry pi et thermomètre 1-wire

Bonjour,
Si c'est pour changer 26187 en 261,87 :

cat /sys/bus/w1/devices/28-0000051d7e76/w1_slave | sed -nr 's/.* t=([0-9]+)([0-9]{2})/\1,\2/p'

Hors ligne

#4 Le 05/12/2013, à 12:54

pem1664

Re : raspberry pi et thermomètre 1-wire

Salut a vous! merci smile
C'est pour changer 26187 en 26,187
donc ca donne ca :

 cat /sys/bus/w1/devices/28-0000051d7e76/w1_slave | sed -nr 's/.* t=([0-9]+)([0-9]{3})/\1,\2/p'

vachement plus propre que mes 2 cut à la suite...
Par contre j'ai bien compris que le {3} c'était pour définir ou mettre la "," mais le reste de l’expression régulière... c'est du chinois..
Merci en tout cas
smile


Pas de problème sans solutions, mettre [résolu] dans son premier post permet de rechercher plus facilement une solution... ;)

Hors ligne

#5 Le 05/12/2013, à 13:08

pingouinux

Re : raspberry pi et thermomètre 1-wire

sed -nr 's/.* t=([0-9]+)([0-9]{3})/\1,\2/p'
  • .* t= : un nombre quelconque de caractères, suivis d'un espace et de t=

  • [0-9]+ : un ou plusieurs chiffres décimaux

  • [0-9]{3} : 3 chiffres décimaux

  • \1,\2 : et on remplace tout ça par le contenu du premier couple de parenthèses, une virgule, et le contenu du second couple de parenthèses

Voir man sed.

Hors ligne

#6 Le 05/12/2013, à 13:11

pem1664

Re : raspberry pi et thermomètre 1-wire

Merci pingouinux pour ton explication j'ai bien essayé ca :  http://abs.traduc.org/abs-5.0-fr/apc.html
mais franchement j'y comprend pas grand chose.. faut pratiquer je crois..
merci en tout cas pour ton aide smile


Pas de problème sans solutions, mettre [résolu] dans son premier post permet de rechercher plus facilement une solution... ;)

Hors ligne

#7 Le 05/12/2013, à 13:11

Epehj

Re : raspberry pi et thermomètre 1-wire

Salut,

Tu peux aussi jeter un œil ici tuto adafruit


Linux user #447629 - Ubuntu user # 21770
C'est en sciant que Léonard devint scie

Hors ligne

#8 Le 05/12/2013, à 13:19

pem1664

Re : raspberry pi et thermomètre 1-wire

Hello, merci pour le lien, je ne le connaissais pas. ca donne un exemple pour le faire en python et avoir plusieurs ds18b20 sur le meme raspi.
Mon cas est un peu différent, je voudrais centraliser les températures des différentes pièces ou y'a des raspb pour avoir d'un coup d'oeil une vision globale des températures et je voudrais aussi les enregistrer pour voir l'évolution des températures en fonction du temps pièce par pièce.


Pas de problème sans solutions, mettre [résolu] dans son premier post permet de rechercher plus facilement une solution... ;)

Hors ligne

#9 Le 05/12/2013, à 14:01

Epehj

Re : raspberry pi et thermomètre 1-wire

En fait c'était pour pointer du doigt la manière de récupérer la température :

 temp_c = float(temp_string) / 1000.0

avec temp_string le nombre après t=

Le code sed est bon, mais on place la virgule toujours au même endroit, du coup ça peu induire en erreur (est ce que la sonde donne 09 ou 9 degrés par exemple).
Vaut mieux diviser par 1000 je pense, histoire d'être sûr.
Du coup tu récup ton chiffre, et avec quelque chose du genre echo "monChiffre/1000" | bc -l  tu auras ton résultat (c'est un L minuscule)


Linux user #447629 - Ubuntu user # 21770
C'est en sciant que Léonard devint scie

Hors ligne

#10 Le 05/12/2013, à 14:10

pingouinux

Re : raspberry pi et thermomètre 1-wire

Epehj #9 a écrit :

Le code sed est bon, mais on place la virgule toujours au même endroit

Le sed donné en #5 laisse 3 chiffres après la virgule, quel que soit le nombre de chiffres total.

Hors ligne

#11 Le 05/12/2013, à 15:10

Epehj

Re : raspberry pi et thermomètre 1-wire

Ah oui tiens, je sais pas pourquoi j'étais passé à coté.
Bon ben on à qu'à dire que j'aime faire des contributions pas forcément utiles big_smile


Linux user #447629 - Ubuntu user # 21770
C'est en sciant que Léonard devint scie

Hors ligne

#12 Le 05/12/2013, à 16:39

pem1664

Re : raspberry pi et thermomètre 1-wire

ca avance smile
Mais j'ai encore un souci.. voici ce que j'ai fait :

#!/bin/bash
sortie="essai"
date=$(date "+%Y-%m-%d %H:%M")
ipcuisine='192.168.70.110'
ipsalon='192.168.70.102'
ipchambre='192.168.70.105'
ippasserelle='10.10.1.1'

chambre=$(ssh pi@$ipchambre -t  cat /sys/bus/w1/devices/28*/w1_slave | sed -nr 's/.* t=([0-9]+)([0-9]{3})/\1,\2/p')
salon=$(ssh pi@$ipsalon -t  cat /sys/bus/w1/devices/28*/w1_slave | sed -nr 's/.* t=([0-9]+)([0-9]{3})/\1,\2/p')
cuisine=$(ssh pi@$ipcuisine -t  cat /sys/bus/w1/devices/28*/w1_slave | sed -nr 's/.* t=([0-9]+)([0-9]{3})/\1,\2/p')
passerelle=$(ssh pi@$ippasserelle -t  cat /sys/bus/w1/devices/28*/w1_slave | sed -nr 's/.* t=([0-9]+)([0-9]{3})/\1,\2/p')

echo "${date}, ${chambre}, ${salon}, ${cuisine}, ${passerelle}" |tr -d '\n'>>$sortie 

et voici ce que ca donne :

2013-12-05 15:33, 24,812
, 23,187
, 28,500
, 10,312
4,250

donc j'ai 2 problèmes en fait, déjà je ne comprend pas pourquoi  alors que je demande explicitement par le 

tr -d '\n'

de supprimer les sauts de ligne avant d'ecrire dans le fichier, il ne le fait pas..?
Et le 2eme souci c'est que quand j'interroge la passerelle j'ai 2 thermomètres dessus donc il me renvoie 2 valeurs comment je pourrais intercaler une "," entre ses 2 valeurs?
J'aimerai avoir un fichier comme ca :

2013-12-05 15:33, 24,812, 23,187, 28,500, 10,312, 4,250
2013-12-05 15:33, 24,812, 23,187, 28,500, 10,312, 4,250
2013-12-05 15:33, 24,812, 23,187, 28,500, 10,312, 4,250

Que je puisse m'en servir comme fichier csv... par exemple...


Pas de problème sans solutions, mettre [résolu] dans son premier post permet de rechercher plus facilement une solution... ;)

Hors ligne

#13 Le 05/12/2013, à 17:02

Postmortem

Re : raspberry pi et thermomètre 1-wire

Salut,
Je ne peux pas tester mais l'option '-t' est-elle obligatoire dans tes commandes ssh ? (peut-être que c'est ça qui rajoute un retour à la ligne ? )
Tu pourrais essayer de lancer les ssh ainsi :

chambre=$(ssh pi@$ipchambre "sed -nr 's/.* t=([0-9]+)([0-9]{3})/\1,\2/p' /sys/bus/w1/devices/28*/w1_slave")

Sinon, si tu souhaites traiter tes fichiers plus tard, peut-être faudrait-il mieux prendre un autre séparateur que ',' (virgule) étant donné que la virgule apparaît dans tes températures.

Pour enlever le retour à la ligne dans la variable passerelle et le remplacer par un point-virgule :

passerelle=${passerelle/$'\n'/;}

Mot' a dit : « Un Hellfest sans Slayer, c'est comme une galette-saucisse sans saucisse ! »

Hors ligne

#14 Le 05/12/2013, à 17:13

pem1664

Re : raspberry pi et thermomètre 1-wire

Salut!
Merci pour cette remarque, je n'y avais pas pensé donc déjà remplacer le séparateur par un point virgule wink
concernant l'option '-t' en fait ça renvoi la même chose :

pem@PeM-ZenBooK:~$ ssh pi@10.10.1.1 "sed -nr 's/.* t=([0-9]+)([0-9]{3})/\1,\2/p' /sys/bus/w1/devices/28*/w1_slave"
9,312
4,250
pem@PeM-ZenBooK:~$ ssh pi@10.10.1.1 -t cat /sys/bus/w1/devices/28*/w1_slave | sed -nr 's/.* t=([0-9]+)([0-9]{3})/\1,\2/p'
9,437
4,250
Connection to 10.10.1.1 closed.
pem@PeM-ZenBooK:~$ 

mais ta ligne est plus rapide d’exécution je remarque, donc je vais changer aussi smile


Pas de problème sans solutions, mettre [résolu] dans son premier post permet de rechercher plus facilement une solution... ;)

Hors ligne

#15 Le 05/12/2013, à 17:22

pem1664

Re : raspberry pi et thermomètre 1-wire

Super Postmortem! Ca fonctionne presque :

#!/bin/bash


sortie="essai"
temp="temp"
date=$(date "+%Y-%m-%d %H:%M")
ipcuisine='192.168.70.110'
ipsalon='192.168.70.102'
ipchambre='192.168.70.105'
ippasserelle='10.10.1.1'

chambre=$(ssh pi@$ipchambre "sed -nr 's/.* t=([0-9]+)([0-9]{3})/\1,\2/p' /sys/bus/w1/devices/28*/w1_slave")
salon=$(ssh pi@$ipsalon "sed -nr 's/.* t=([0-9]+)([0-9]{3})/\1,\2/p' /sys/bus/w1/devices/28*/w1_slave")
cuisine=$(ssh pi@$ipcuisine "sed -nr 's/.* t=([0-9]+)([0-9]{3})/\1,\2/p' /sys/bus/w1/devices/28*/w1_slave")
passerelle=$(ssh pi@$ippasserelle "sed -nr 's/.* t=([0-9]+)([0-9]{3})/\1,\2/p' /sys/bus/w1/devices/28*/w1_slave")
passerelle=${passerelle/$'\n'/;}

echo "${date}; ${chambre}; ${salon}; ${cuisine}; ${passerelle}" >>$sortie 

sauf que pour la variable passerelle il ne garde que la 2eme expression

2013-12-05 16:19; 26,187; 22,875; 30,687; 4,250

..?


Pas de problème sans solutions, mettre [résolu] dans son premier post permet de rechercher plus facilement une solution... ;)

Hors ligne

#16 Le 05/12/2013, à 17:23

pem1664

Re : raspberry pi et thermomètre 1-wire

Et c'est en tout cas bien plus rapide qu'avec l'option '-t'..? je comprend pas trop pourquoi..?
merci en tout cas smile


Pas de problème sans solutions, mettre [résolu] dans son premier post permet de rechercher plus facilement une solution... ;)

Hors ligne

#17 Le 05/12/2013, à 17:26

Postmortem

Re : raspberry pi et thermomètre 1-wire

Si tu rajoutes ce genre de ligne juste avant le passerelle=${passerelle/$'\n'/;} pour voir ce que vaut la variable passerelle avant de la modifier, ça donne quoi ?

echo "passerelle vaut : #$passerelle#"

Edit : l'option '-t', dans le man que j'ai trouvé sur internet, parle de forcer l'allocation d'un pseudo terminal... Je sais pas trop à quoi ça correspond mais je me suis dit que dans le cas présent, ça ne servait à rien !

Dernière modification par Postmortem (Le 05/12/2013, à 17:29)


Mot' a dit : « Un Hellfest sans Slayer, c'est comme une galette-saucisse sans saucisse ! »

Hors ligne

#18 Le 05/12/2013, à 17:29

pem1664

Re : raspberry pi et thermomètre 1-wire

pem@PeM-ZenBooK:~$ bash essai.sh
passerelle vaut : #10,125
4,250#
pem@PeM-ZenBooK:~$

donc y'a bien les 2 valeurs à la base avec un saut de ligne.. hmm
edit : Ah? l'option '-t' sert a ca? je croyais que c'était pour envoyer une commande et couper la connexion..

Dernière modification par pem1664 (Le 05/12/2013, à 17:30)


Pas de problème sans solutions, mettre [résolu] dans son premier post permet de rechercher plus facilement une solution... ;)

Hors ligne

#19 Le 05/12/2013, à 17:30

Postmortem

Re : raspberry pi et thermomètre 1-wire

A tout hasard, essaie comme ça :

passerelle=${passerelle//$'\n'/;}

(rajout d'un slash)
Edit : non en fait, soit ça va rien changer, soit t'auras autant de ';' qu'il y avait de saut de lignes...

Re-edit : j'ai répondu dans mon précédent message pour l'option -t

Dernière modification par Postmortem (Le 05/12/2013, à 17:33)


Mot' a dit : « Un Hellfest sans Slayer, c'est comme une galette-saucisse sans saucisse ! »

Hors ligne

#20 Le 05/12/2013, à 17:35

pem1664

Re : raspberry pi et thermomètre 1-wire

Ah! nikel, Merci smile

#!/bin/bash


sortie="essai"
temp="temp"
date=$(date "+%Y-%m-%d %H:%M")
ipcuisine='192.168.70.110'
ipsalon='192.168.70.102'
ipchambre='192.168.70.105'
ippasserelle='10.10.1.1'

chambre=$(ssh pi@$ipchambre "sed -nr 's/.* t=([0-9]+)([0-9]{3})/\1,\2/p' /sys/bus/w1/devices/28*/w1_slave")
salon=$(ssh pi@$ipsalon "sed -nr 's/.* t=([0-9]+)([0-9]{3})/\1,\2/p' /sys/bus/w1/devices/28*/w1_slave")
cuisine=$(ssh pi@$ipcuisine "sed -nr 's/.* t=([0-9]+)([0-9]{3})/\1,\2/p' /sys/bus/w1/devices/28*/w1_slave")
passerelle=$(ssh pi@$ippasserelle "sed -nr 's/.* t=([0-9]+)([0-9]{3})/\1,\2/p' /sys/bus/w1/devices/28*/w1_slave")
passerelle=${passerelle//$'\n'/;}
echo "${date};${chambre};${salon};${cuisine};${passerelle}" >>$sortie 
 

donne ca :

2013-12-05 16:34;26,812;22,437;30,437;9,500;4,250

Parfait!
Merci beaucoup!
j'ai plus qu'a faire le crontab et laisser tourner smile


Pas de problème sans solutions, mettre [résolu] dans son premier post permet de rechercher plus facilement une solution... ;)

Hors ligne

#21 Le 05/12/2013, à 17:40

Postmortem

Re : raspberry pi et thermomètre 1-wire

Franchement, je ne comprends pas que passerelle=${passerelle//$'\n'/;} fonctionne alors que passerelle=${passerelle/$'\n'/;} ne fonctionne pas !
Enfin bon, si ça roule, c'est le principal !


Mot' a dit : « Un Hellfest sans Slayer, c'est comme une galette-saucisse sans saucisse ! »

Hors ligne

#22 Le 06/12/2013, à 10:22

pem1664

Re : raspberry pi et thermomètre 1-wire

Bonjour à vous!
Le script fonctionne assez bien mais après l'avoir laissé tourné toute la nuit je me rend compte qu'il y manque des données régulièrement :

2013-12-06 06:40;20,562;22,687;24,312;9,187;3,437
2013-12-06 06:45;20,562;21,937;24,250;9,187;3,375
2013-12-06 06:50;20,500;21,937;24,187;9,687;3,375
2013-12-06 06:55;20,437;22,375;24,250;3,375
2013-12-06 07:00;20,500;22,687;24,250;8,812
2013-12-06 07:05;20,562;22,875;24,250;9,187;3,375
2013-12-06 07:10;20,437;22,687;24,250;8,687;3,437
2013-12-06 07:15;20,500;22,937;24,125;10,000;3,437
2013-12-06 07:20;20,500;23,000;24,187;3,375
2013-12-06 07:25;;22,687;24,187;3,437
2013-12-06 07:30;20,500;22,687;24,125;3,500
2013-12-06 07:35;20,500;22,875;24,187;9,562;3,500
2013-12-06 07:40;;22,812;24,125;9,250;3,500
2013-12-06 07:45;20,500;22,687;24,125;9,687;3,500
2013-12-06 07:50;20,437;22,625;24,062;8,687;3,500
2013-12-06 07:55;;22,687;24,125;9,312;3,500
2013-12-06 08:00;;22,625;24,062;9,687;3,500
2013-12-06 08:05;;22,875;24,062;3,500
2013-12-06 08:10;20,312;22,500;24,062;8,812;3,500
2013-12-06 08:15;20,375;22,562;24,062;3,500
2013-12-06 08:20;20,375;22,562;24,062;10,375;3,437
2013-12-06 08:25;20,437;23,125;24,187;8,812;3,500
2013-12-06 08:30;20,312;22,812;24,312;8,687;3,500
2013-12-06 08:35;20,250;23,000;24,125;3,562
2013-12-06 08:40;20,437;22,937;23,750;10,000;3,500
2013-12-06 08:45;20,500;23,000;24,312;8,500;3,562
2013-12-06 08:50;;23,125;24,312;3,562
2013-12-06 08:55;20,500;23,125;24,312;9,687;3,562
2013-12-06 09:00;20,500;23,125;24,375;3,625
2013-12-06 09:05;20,312;22,875;23,625;9,375
2013-12-06 09:10;20,312;22,812;24,250;3,687
2013-12-06 09:15;20,437;23,125;24,375;9,750;3,812
2013-12-06 09:20;20,500;23,125;24,312;3,875

Comment je pourrais faire pour y inclure des test pour que les valeurs ne se chevauchent/s'échangent pas s'il en manque une?   
D'avance merci pour vos réponses avisées smile
edit : en observant mieux le fichier, les valeurs ne se chevauchent que lorsque qu'il manque une valeur dans la variable passerelle.. sinon pour les autres ca à l'air d'aller étant donné que le séparateur est rajouté dans le echo
Pour l'instant y'a que 5 valeurs, mais j'aimerai bien en rajouter et utiliser le bus 1-wire d'un raspberry pour en mettre plus que 2 ou 3 hmm

Dernière modification par pem1664 (Le 06/12/2013, à 10:28)


Pas de problème sans solutions, mettre [résolu] dans son premier post permet de rechercher plus facilement une solution... ;)

Hors ligne

#23 Le 06/12/2013, à 10:30

pingouinux

Re : raspberry pi et thermomètre 1-wire

Bonjour,
Ceci peut-il faire l'affaire ?

echo "date=${date};chambre=${chambre};salon=${salon};cuisine=${cuisine};passerelle=${passerelle}" >>$sortie 

Ajouté :
Ou bien

echo "(${date});(${chambre});(${salon});(${cuisine});(${passerelle})" >>$sortie 

Dernière modification par pingouinux (Le 06/12/2013, à 10:35)

Hors ligne

#24 Le 06/12/2013, à 10:59

pem1664

Re : raspberry pi et thermomètre 1-wire

Bonjour, ben non ca ne marche pas parceque c'est surtout sur les 2 dernières valeurs qu'il y a un problème étant donné que la variable passerelle doit (devrait) renvoyer 2 valeurs, pour les autres, si c'est vide, il y a toujours le point-virgule en séparateur, donc j'ai une case vide, mais pour passerelle, s'il manque une valeur, (souvent la première, je ne sais pas pourquoi..?) et bien la 2eme vient se mettre en lieu et place de la première et l'avant dernière colonne est faussée..


Pas de problème sans solutions, mettre [résolu] dans son premier post permet de rechercher plus facilement une solution... ;)

Hors ligne

#25 Le 06/12/2013, à 11:44

pingouinux

Re : raspberry pi et thermomètre 1-wire

À quoi ressemble la sortie de

cat /sys/bus/w1/devices/28-0000051d7e76/w1_slave

lorsque toutes les températures y sont, et lorsqu'il en manque ?

Hors ligne