#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!
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
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
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
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
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
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
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
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
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
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..
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
#!/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
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
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
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