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 03/02/2018, à 19:20

pem1664

nommer dynamiquement un tableau et le remplir dynamiquement

Bonjour je bute sur la création de plusieurs tableaux dynamiques imbriqués.
je souhaiterai associer un numéro de tableau dynamiquement et chaque tableau serait rempli dynamiquement.
j'ai une chaine de X capteurs qui quand elle est interrogée renvoie 3 valeurs : vad, vdd et température.
Je voudrais interroger ma chaine Y fois pour avoir plusieurs valeurs de vad, vdd et temp par capteur, en gros avoir :
capteur1 ('vad1('xxx' 'yyy' 'zzz' )'  'vdd1('xxx' 'yyy' 'zzz' )'  'temp1 ('xxx' 'yyy' 'zzz' )')
.
.
.
capteurX ('vadX('xxx' 'yyy' 'zzz' )'  'vddX('xxx' 'yyy' 'zzz' )'  'tempX ('xxx' 'yyy' 'zzz' )')

j'ai bien tenté ca mais ca ne fonctionne pas... :'(

fonctionrecupvaleurs(){
		echo "nombre de mesures : $nbmesure"
		numcapt=0
		for j in ${capteur[@]}
		do
			cpt=0
			cpt2=1
			#vad=`echo "vad$numcapt"`
			#vdd=`echo "vdd$numcapt"`
			#temp=`echo "temp$numcapt"`
			sleep $latence2
			while [ $cpt -lt $nbmesure ]
			do
				vad[$cpt]=$(sudo cat /sys/bus/w1/devices/$j/vad)
				sleep $latence1
				vdd[$cpt]=$(sudo cat /sys/bus/w1/devices/$j/vdd)
				sleep $latence1
				temp[$cpt]=$(sudo cat /sys/bus/w1/devices/$j/temperature)
				if [[ "$valimmin" -le "${vdd[$cpt]}" && "${vdd[$cpt]}" -le "$valimmax" ]]
				then
					echo "boucle1 VDD ok  : ${vdd[$cpt]}"
					while [ ${vad[$cpt]} -ge ${vdd[$cpt]} ]
					do 
					echo "erreur capteur : $j vad >= vdd ${vad[$cpt]}>=${vdd[$cpt]} ...nouvelle mesure..."
					sleep $latence1
					vad[$cpt]=$(sudo cat /sys/bus/w1/devices/$j/vad)
					done
					echo "mesure capteur $cpt2/$nbmesure : $j OK! VAD$numcapt=${vad[$cpt]} VDD$numcapt=${vdd[$cpt]}"
					
				elif [ "${vdd[$cpt]}" -lt "$valimmin" ]
					then
					echo "boucle 2 VDD erreur  : ${vdd[$cpt]}"
					while [ "${vdd[$cpt]}" -lt "$valimmin" ]
					do	
					echo "erreur capteur : $j vdd < valimmin ${vdd[$cpt]}<$valimmin ...nouvelle mesure..."
					sleep $latence1
					vdd[$cpt]=$(sudo cat /sys/bus/w1/devices/$j/vdd)
					done
					echo "mesure capteur $cpt2/$nbmesure : $j OK! VAD$numcapt=${vad[$cpt]} VDD$numcapt=${vdd[$cpt]}"
									
				else 
					while [ "${vad[$cpt]}" -ge "${vdd[$cpt]}" ]
					do
					echo "erreur capteur : $j vad >= vdd ${vad[$cpt]}>=${vdd[$cpt]} ...nouvelle mesure..."
					sleep $latence1
					vad[$cpt]=$(sudo cat /sys/bus/w1/devices/$j/vad)
					done
					echo "mesure capteur $cpt2/$nbmesure : $j OK! VAD$numcapt=${vad[$cpt]} VDD$numcapt=${vdd[$cpt]}"

				fi
				cpt=$(($cpt+1))
				cpt2=$(($cpt2+1))
			done
		echo "${vad0[*]}"
		numcapt=$(($numcapt+1))
		done
	

}

vous savez comment faire? est ce que c'est possible?

Dernière modification par pem1664 (Le 03/02/2018, à 19:35)


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

Hors ligne

#2 Le 03/02/2018, à 20:42

Watael

Re : nommer dynamiquement un tableau et le remplir dynamiquement

salut,
(
a priori, les fichiers sous /sys/ sont lisibles par tout le monde, non ?
alors, sudo est inutile.

pour ton "problème" : un tableau associatif

declare -A
capteur="capteur_1"
assAr["$capteur"]="$vdd $vad $temp"
capteur="capteur_2"
assAr["$capteur"]="$vdd $vad $temp"

je n'ai pas implémenté de boucle pour itérer sur les capteurs, à titre d'exemple.

si l'une des valeurs vdd vad ou temp peut contenir un espace, choisis un autre séparateur

ce sera lu ainsi

for i in "${!assAr[@]}"
do
   read -a ar <<<"${assAr["$i"]}"
   echo "$i : vdd = ${ar[0]}; vad = ${ar[1]}..."
done

pas testé, mais c'est le principe.


Connected \o/
Welcome to sHell. · eval is evil.

Hors ligne

#3 Le 04/02/2018, à 02:27

pem1664

Re : nommer dynamiquement un tableau et le remplir dynamiquement

Salut! merci pour ta réponse smile

Watael a écrit :

salut,
a priori, les fichiers sous /sys/ sont lisibles par tout le monde, non ?
alors, sudo est inutile.

tu as tout a fait raison! je ne me suis meme pas posé la question de pkoi je passe en sudo

je vais tester ta méthode mais si je comprend bien je suis obligé de déclarer mes tableaux associatifs au départ ? je ne pourrais pas tout grouper? 

Watael a écrit :

declare -A
capteur="capteur_1"
assAr["$capteur"]="$vdd $vad $temp"
capteur="capteur_2"
assAr["$capteur"]="$vdd $vad $temp"

alors que dans l'idée je ne sais pas combien il peut y en avoir et dans mes variables vad, vdd et temp il peut y avoir de 1 à y valeurs pour moyenner
en fait je voudrais plutot un

capteur="capteur_$nbcapteur"
assAr["$capteur_$nbcapteur"]="$vdd[] $vad[] $temp[]"

C'est possible ca? tout ce que j'ai pu essayer ne fonctionne pas... en passant par un fichier tmp je vois comment faire mais en n'utilisant que des tableaux dynamique je bute..

Dernière modification par pem1664 (Le 04/02/2018, à 03:19)


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

Hors ligne

#4 Le 04/02/2018, à 03:55

Watael

Re : nommer dynamiquement un tableau et le remplir dynamiquement

non, ce n'est pas possible; pas comme ça.

prem_ind=( a b c )
deuxiM_ind=( d e f )
declare -A assAr=(
   ["${prem_ind[0]}_${deuxiM_ind[0]}"]="1;2;3"
   ["${prem_ind[1]}_${deuxiM_ind[1]}"]="4;5;6"
   ["${prem_ind[2]}_${deuxiM_ind[2]}"]="7;8;9"
)

for ((i=0;i<${#prem_ind[*]};i++))
do
   IFS=';' read -r -a temp <<< "${assAr["${prem_ind[$i]}_${deuxiM_ind[$i]}"]}"
   echo "MoyN ${deuxiM_ind[i]} = $(IFS='+'; echo $(((${temp[*]})/${#temp[*]})) )"
done

prem_ind serait le nom du fichier (sans le chemin), et deuxiM_ind le nom du capteur.

mais t'es sûr que c'est nécessaire ?
tu peux nous montrer les informations dont tu disposes pour deux ou trois capteurs (la hiérarchie des fichiers, les données contenues...), et le résultat attendu correspondant ?

Dernière modification par Watael (Le 04/02/2018, à 03:56)


Connected \o/
Welcome to sHell. · eval is evil.

Hors ligne

#5 Le 04/02/2018, à 12:24

pem1664

Re : nommer dynamiquement un tableau et le remplir dynamiquement

Oui bien sûr!

pi@Cuisine:~ $ ls -l /sys/bus/w1/devices/
total 0
lrwxrwxrwx 1 root root 0 févr.  4 10:40 26-00000101178f -> ../../../devices/w1_bus_master1/26-00000101178f
lrwxrwxrwx 1 root root 0 févr.  4 10:53 26-00000166f95d -> ../../../devices/w1_bus_master1/26-00000166f95d
lrwxrwxrwx 1 root root 0 févr.  4 10:53 26-0000017750b5 -> ../../../devices/w1_bus_master1/26-0000017750b5
lrwxrwxrwx 1 root root 0 févr.  4 10:54 26-000001e426ae -> ../../../devices/w1_bus_master1/26-000001e426ae
lrwxrwxrwx 1 root root 0 févr.  4 10:37 28-000004cc339e -> ../../../devices/w1_bus_master1/28-000004cc339e
lrwxrwxrwx 1 root root 0 févr.  4 10:37 28-000004cceabf -> ../../../devices/w1_bus_master1/28-000004cceabf
lrwxrwxrwx 1 root root 0 févr.  4 10:37 w1_bus_master1 -> ../../../devices/w1_bus_master1
pi@Cuisine:~ $ ls -l /sys/bus/w1/devices/26-00000101178f/
total 0
lrwxrwxrwx 1 root root    0 févr.  4 10:57 driver -> ../../../bus/w1/drivers/w1_slave_driver
-rw-rw-r-- 1 root root    1 févr.  4 10:57 iad
-r--r--r-- 1 root root 4096 févr.  4 10:57 id
-r--r--r-- 1 root root 4096 févr.  4 10:57 name
-r--r--r-- 1 root root    8 févr.  4 10:57 page0
drwxr-xr-x 2 root root    0 févr.  4 10:57 power
lrwxrwxrwx 1 root root    0 févr.  4 10:57 subsystem -> ../../../bus/w1
-r--r--r-- 1 root root    0 févr.  4 10:40 temperature
-rw-r--r-- 1 root root 4096 févr.  4 10:37 uevent
-r--r--r-- 1 root root    0 févr.  4 10:40 vad
-r--r--r-- 1 root root    0 févr.  4 10:40 vdd
pi@Cuisine:~ $ cat /sys/bus/w1/devices/26-00000101178f/vad
329
pi@Cuisine:~ $ cat /sys/bus/w1/devices/26-00000101178f/vdd
329
pi@Cuisine:~ $ cat /sys/bus/w1/devices/26-00000101178f/temperature 
3648
pi@Cuisine:~ 

le problème c'est que le bus one wire n'est pas fiable quand tu interroge plusieurs capteurs à la suite :

pi@Cuisine:~ $ cat /sys/bus/w1/devices/26-000001*/vad 
268
142
211
317
pi@Cuisine:~ $ cat /sys/bus/w1/devices/26-000001*/vdd
328
142     // ICI mauvais reset sur le bus, vdd=vad 
211    // idem ici
317    // et là

ici les valeurs de vad sont correctes mais les valeurs de vdd ne le sont pas, elles devraient toute etre aux alentour de 329 (3,29V) d'ou l'idée de faire plusieurs mesures d'une même valeur sur le capteur pour ensuite moyenner. J'ai besoin de vdd car il rentre dans le calcul pour transformer vad (en volt) en humidité (en %)

	#calcul hygrométrie sol et de la tension d'alimentation

	HUM=`echo "-100/($VDD-130)*$VAD-$VDD*(-100/($VDD-130))"|bc -l| xargs printf %.2f` #a améliorer je crois... 
	VOLT=`echo "$VDD/100"|bc -l| xargs printf %.3f`
	

Avec mon script même si j'ai encore quelques couacs j'ai des valeurs vad et vdd plus fiables : (ici je ne te donne qu'une boucle pour 1 capteur)

pi@Cuisine:~ $ /usr/bin/time --format='la commande a duré %e secondes' sudo bash /home/pi/domoticz/scripts/ds2438-2.sh
nombre de capteurs trouvés : 4 : 26-00000101178f 26-00000166f95d 26-0000017750b5 26-000001e426ae
nombre de mesures : 5
boucle1 VDD ok  : 329
mesure capteur 1/5 : 26-00000101178f OK! VAD0=269 VDD0=329
VAD capteur 269
boucle 2 VDD erreur  : 269
erreur capteur : 26-00000101178f vdd < valimmin 269<327 ...nouvelle mesure...
mesure capteur 2/5 : 26-00000101178f OK! VAD0=269 VDD0=329
VAD capteur 269
VAD capteur 269
boucle1 VDD ok  : 328
mesure capteur 3/5 : 26-00000101178f OK! VAD0=269 VDD0=328
VAD capteur 269
VAD capteur 269
VAD capteur 269
boucle1 VDD ok  : 328
erreur capteur : 26-00000101178f vad >= vdd 329>=328 ...nouvelle mesure...
mesure capteur 4/5 : 26-00000101178f OK! VAD0=269 VDD0=328
VAD capteur 269
VAD capteur 269
VAD capteur 269
VAD capteur 269
boucle1 VDD ok  : 329
mesure capteur 5/5 : 26-00000101178f OK! VAD0=269 VDD0=329
le script aura duré 1 minutes et 19 secondes 
la commande a duré 79.70 secondes

je pourrais simplifier en prenant vdd=329  mais j'ai remarqué qu'il peut varier entre 331 et 327  et sans chercher une précision à 0,5% avoir la valeur réelle de vdd affine le % de humidité. Par ailleurs dans la doc  vad peut varier de 130 à vdd (130-> 100% vdd->0%) et lorsque vad>vdd je me retrouve avec des valeurs aberrantes comme hum=1568%  big_smile Ensuite j'envoie les données à domoticz.
De plus le ds2438 ici je m'en sert comme CAN pour un capteur d'hygrométrie mais j'aimerai m'en servir par la suite aussi pour mesurer des variations lumineuses, la tension d'une batterie, d'un panneau solaire etc.. bref tout ce qui est analogique et qui ne peut etre lu directement par le pi en w1.
Enfin dans un souci de préserver le plus possible la carte SD du pi je préférerai travailler le plus possible en ram (donc tableau).
Ici j'ai fais un script qui passe par des fichiers temporaires et mis a part les tests que je n'ai pas encore fait le script fonctionne mais il ne me plait pas trop...
voila mon script complet pour l'instant :

#!/bin/bash
BEFORE=$SECONDS
export LC_NUMERIC=C

# Domoticz server
SERVER="127.0.0.1:8080"
SERVER1="192.168.70.1:8080"

# DS2438  IDX
# le numéro de l IDX dans la liste des peripheriques
DS2438HUM=('6' '3' '7')
DS2438VOLT=('5' '8' '9')
DS2438TEMP=('10' '12' '14')
DS2438TEMPHUM=('11' '13' '15')

#DS2438 SERVER
DS2438IDXSERVEUR="54"

#variables
valimmax="331"
valimmin="327"
VAD=0
VDD=0
cpt=0
nb=0
moy=0

nbmesure=10 #nombre de mesures pour faire la moyenne
latence1=2 #latence entre l'intérrogation des différentes mesures vad vcc et temp
latence2=2 #latence entre l'intérrogation des différents DS2438 sur le bus



#ID DS2438 sur le bus w1
#interrogation nombre capteurs
fonctioncapteur()
{
capteur=''
nbcapt=0
for i in $(sudo echo `ls /sys/bus/w1/devices/| grep 26`) 
do 
capteur[$nbcapt]=$i 
nbcapt=$(($nbcapt+1)) 
done
echo "nombre de capteurs trouvés : $nbcapt : ${capteur[*]}" 
}

fonctionrecupvaleurs(){
		echo "nombre de mesures : $nbmesure"
		numcapt=0
		for j in ${capteur[@]}
		do
			cpt=0
			cpt2=1
			vad=`echo "vad$numcapt"`
			vdd=`echo "vdd$numcapt"`
			temp=`echo "temp$numcapt"`
			sleep $latence2
			while [ $cpt -lt $nbmesure ]
			do
				vad[$cpt]=$(sudo cat /sys/bus/w1/devices/$j/vad)
				sleep $latence1
				vdd[$cpt]=$(sudo cat /sys/bus/w1/devices/$j/vdd)
				sleep $latence1
				temp[$cpt]=$(sudo cat /sys/bus/w1/devices/$j/temperature)
				if [[ "$valimmin" -le "${vdd[$cpt]}" && "${vdd[$cpt]}" -le "$valimmax" ]]
				then
					echo "boucle1 VDD ok  : ${vdd[$cpt]}"
					while [ ${vad[$cpt]} -ge ${vdd[$cpt]} ]
					do 
					echo "erreur capteur : $j vad >= vdd ${vad[$cpt]}>=${vdd[$cpt]} ...nouvelle mesure..."
					sleep $latence1
					vad[$cpt]=$(cat /sys/bus/w1/devices/$j/vad)
					done
					echo "mesure capteur $cpt2/$nbmesure : $j OK! VAD$numcapt=${vad[$cpt]} VDD$numcapt=${vdd[$cpt]}"
					
				elif [ "${vdd[$cpt]}" -lt "$valimmin" ]
					then
					echo "boucle 2 VDD erreur  : ${vdd[$cpt]}"
					while [[ "${vdd[$cpt]}" -lt "$valimmin" ]]
					do	
					echo "erreur capteur : $j vdd < valimmin ${vdd[$cpt]}<$valimmin ...nouvelle mesure..."
					sleep $latence1
					vdd[$cpt]=$(cat /sys/bus/w1/devices/$j/vdd)
					done
					echo "mesure capteur $cpt2/$nbmesure : $j OK! VAD$numcapt=${vad[$cpt]} VDD$numcapt=${vdd[$cpt]}"
									
				else 
					while [ "${vad[$cpt]}" -ge "${vdd[$cpt]}" ]
					do
					echo "erreur capteur : $j vad >= vdd ${vad[$cpt]}>=${vdd[$cpt]} ...nouvelle mesure..."
					sleep $latence1
					vad[$cpt]=$(cat /sys/bus/w1/devices/$j/vad)
					done
					echo "mesure capteur $cpt2/$nbmesure : $j OK! VAD$numcapt=${vad[$cpt]} VDD$numcapt=${vdd[$cpt]}"

				fi
				cpt=$(($cpt+1))
				cpt2=$(($cpt2+1))

			for i in ${vad[@]}
			do	
			echo "VAD capteur $i"		 

			done
			done
		
		numcapt=$(($numcapt+1))
		done
	

}

fonctioncalcul(){


for i in ${capteur[@]}
do
	numcapt=0
	for numcapt in ${vad$(echo $numcapt)[@]}
	do	
		echo "VAD capteur $i : ${vad[$numcapt]}"
		numcapt=$(($numcapt+1))}
		 

	done

done
}

fonctionaffiche(){
count=0
for i in ${capteur[@]}
do

echo "mesure capteur :${capteur[$count]} Ok! VAD : ${tmpvad[$count]} VDD : ${tmpvdd[$count]}"

count=$(($count+1))
done

}

fonctionenvoidomoticz(){
	idcapteur=0
	dshum=$(echo ${DS2438HUM[$idcapteur]})
	dsvolt=$(echo ${DS2438VOLT[$idcapteur]})
	dstemp=$(echo ${DS2438TEMP[$idcapteur]})
	dstemphum=$(echo ${DS2438TEMPHUM[$idcapteur]})
	#ENVOI DONNEES SUR DOMOTICZ 
	#capteur1
	curl -s -i -H "Accept: application/json" "http://$SERVER/json.htm?type=command&param=udevice&idx=$dshum&nvalue=$HUM&svalue="> /var/null
	curl -s -i -H "Accept: application/json" "http://$SERVER/json.htm?type=command&param=udevice&idx=$dsvolt&nvalue=0&svalue=$VOLT"> /var/null
	curl -s -i -H "Accept: application/json" "http://$SERVER/json.htm?type=command&param=udevice&idx=$dstemphum&nvalue=&svalue=$TEMP;$HUM;2"> /var/null
	curl -s -i -H "Accept: application/json" "http://$SERVER/json.htm?type=command&param=udevice&idx=$dstemp&nvalue=&svalue=$TEMP"> /var/null
	idcapteur=$(($idcapteur+1))
}


fonctioncapteur""
fonctionrecupvaleurs""
#fonctionaffiche""
#fonctioncalcul""




ELAPSED=$(($SECONDS-$BEFORE))
minutes=$(($ELAPSED/60|bc))
secondes=$(($ELAPSED-$minutes*60))
echo "le script aura duré $minutes minutes et $secondes secondes "


exit 0

Seules les fonctions : fonctioncapteur() et fonctionrecupvaleurs() fonctionnent pour le moment je  ne sais pas si je vais me servir de fonctioncalcul() et fonctionaffichage() si ca se trouve je vais devoir faire les calculs à chaque incrément de numéro de capteur dans la fonction fonctionrecupvaleurs().
De même la fonction fonctionenvoidomoticz() n'est pas encore adapté à ce script c'est pour l'instant juste un copier/coller du script précédent qui utilise les fichiers

Voila je crois que tu sais tout mais si tu as d'autre questions pas de soucis et merci pour ton aide ! smile

Dernière modification par pem1664 (Le 04/02/2018, à 13:21)


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

Hors ligne

#6 Le 04/02/2018, à 13:34

Watael

Re : nommer dynamiquement un tableau et le remplir dynamiquement

la fonction capteur n'est pas bien faite : l'emploi de ls peut être problématique et générateur d'erreurs.
pour être tranquille, on utilise les globs (motifs génériques) du shell :

#bash
dir="/sys/bus/w1/devices"
shopt -s nullglob
for f in "$dir"/26-* # on peut affiner, voire utiliser une négation (tous les fichiers sauf...)
do
   Capteurs+=( "${f##*/}" )
done

ensuite, tu utilises toujours les mêmes fichiers, c'est donc eux qu'on utilisera pour nommer les tableaux associatifs

#bash
nbMsr=5
latence=2
declare -A vdd vad temp
for capteur in "${Capteurs[@]}"
do
   for ((i=0;i<nbMsr;i++))
   do
      vdd["$capteur"]+="$(<"$dir/$capteur/vdd");" # $(< nomFichier) est équivalent à $(cat nomFichier)
      vad["$capteur"]+="$(<"$dir/$capteur/vad");"
      temp["$capteur"]+="$(<"$dir/$capteur/temperature");"
      sleep $latence
   done
done

j'ai montré dans mon message précédent comment parcourir un tableau associatif dont les valeurs sont au format CSV pour effectuer des calculs.

tant que les valeurs ne te correspondent pas, il n'est pas nécessaire d'utiliser un tableau.
des variables temporaires sont suffisantes.
quand les valeurs seront correctes, les variables seront concaténées au tableau du capteur.

j'ai "un peu" simplifié. j'espère que ça te mettra sur la voie.

Dernière modification par Watael (Le 04/02/2018, à 13:35)


Connected \o/
Welcome to sHell. · eval is evil.

Hors ligne

#7 Le 04/02/2018, à 13:49

pem1664

Re : nommer dynamiquement un tableau et le remplir dynamiquement

Ok, je crois que j'ai compris smile merci pour ton aide, je recommence en utilisant ta méthode. Merci 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

#8 Le 04/02/2018, à 14:17

pem1664

Re : nommer dynamiquement un tableau et le remplir dynamiquement

Héhéhé Super! merci Watael ! je crois que ca fonctionne impec! il ne me reste plus qu'a intégrer les test !

#!/bin/bash
BEFORE=$SECONDS
export LC_NUMERIC=C

# Domoticz server
SERVER="127.0.0.1:8080"
SERVER1="192.168.70.1:8080"

# DS2438  IDX
# le numéro de l IDX dans la liste des peripheriques
DS2438HUM=('6' '3' '7')
DS2438VOLT=('5' '8' '9')
DS2438TEMP=('10' '12' '14')
DS2438TEMPHUM=('11' '13' '15')

#DS2438 SERVER
DS2438IDXSERVEUR="54"

#variables
valimmax="331"
valimmin="327"
VAD=0
VDD=0
cpt=0
nb=0
moy=0

nbmesure=5 #nombre de mesures pour faire la moyenne
latence1=2 #latence entre l'intérrogation des différentes mesures vad vcc et temp
latence2=2 #latence entre l'intérrogation des différents DS2438 sur le bus


dir="/sys/bus/w1/devices"
declare -A vdd vad temp

#ID DS2438 sur le bus w1
#interrogation nombre capteurs
fonctioncapteur()
{
shopt -s nullglob
for f in "$dir"/26-* # on peut affiner, voire utiliser une négation (tous les fichiers sauf...)
do
	Capteurs+=( "${f##*/}" )
	nbcapt=$(echo "${#Capteurs[@]}")	
done
echo "nombre de capteurs trouvés : $nbcapt : ${Capteurs[@]}"
}

fonctionrecupvaleurs(){

for capteur in "${Capteurs[@]}"
do
	echo $capteur
   for ((i=0;i<nbmesure;i++))
   do
	echo $i
	vdd["$capteur"]+="$(<"$dir/$capteur/vdd");" # $(< nomFichier) est équivalent à $(cat nomFichier)
	sleep $latence1
	vad["$capteur"]+="$(<"$dir/$capteur/vad");"
	sleep $latence1
	temp["$capteur"]+="$(<"$dir/$capteur/temperature");"
	sleep $latence1
   done
done
}

fonctionaffiche(){
for capteur in "${Capteurs[@]}"
do
	echo "VAD $capteur=${vad[$capteur]}"
done
}

fonctioncapteur""
fonctionrecupvaleurs""
fonctionaffiche""
#fonctioncalcul""




ELAPSED=$(($SECONDS-$BEFORE))
minutes=$(($ELAPSED/60|bc))
secondes=$(($ELAPSED-$minutes*60))
echo "le script aura duré $minutes minutes et $secondes secondes "


exit 0
pi@Cuisine:~ $ /usr/bin/time --format='la commande a duré %e secondes' sudo bash /home/pi/domoticz/scripts/ds2438.sh
nombre de capteurs trouvés : 4 : 26-00000101178f 26-00000166f95d 26-0000017750b5 26-000001e426ae
26-00000101178f
0
1
2
3
4
26-00000166f95d
0
1
2
3
4
26-0000017750b5
0
1
2
3
4
26-000001e426ae
0
1
2
3
4
VAD 26-00000101178f=270;328;328;270;270;
VAD 26-00000166f95d=144;143;144;144;143;
VAD 26-0000017750b5=329;213;213;213;213;
VAD 26-000001e426ae=317;317;317;318;317;
le script aura duré 2 minutes et 15 secondes 
la commande a duré 134.49 secondes
pi@Cuisine:~ $ 

Par contre pour faire les mêmes mesures je passe de 132s avec les test et donc des mesures supplémentaires  à 134s sans tests une idée de pourquoi?

EDIT  mais avec cette méthode je ne peux pas tester en temps réel la valeur récupérée, je suis obligé de faire mes tests une fois que le tableau au format csv est fini non?

Dernière modification par pem1664 (Le 04/02/2018, à 14:42)


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

Hors ligne

#9 Le 04/02/2018, à 15:21

Watael

Re : nommer dynamiquement un tableau et le remplir dynamiquement

echo "nombre de capteurs trouvés : ${#Capteurs[*]} : ${Capteurs[@]}"

effectivement, je ne l'ai pas montré dans l'exemple, c'est les variables temporaires auxquelles il faut assigner les valeurs des fichiers à tester.
quand les valeurs sont "stabilisées" en accords avec les tests, elles sont concaténées aux tableaux.

TZ=europe/paris printf 'le script a duré %(%-H heures %-M minutes %-S secondes)T\n' $SECONDS

un script s'exécutant dans un sous-shell (c'est-à-dire dans un nouveau contexte différent du shell courant/parent) SECONDS est initialisée à zéro au début du script.

2 secondes d'écart me semblent insignifiantes.


Connected \o/
Welcome to sHell. · eval is evil.

Hors ligne

#10 Le 04/02/2018, à 15:38

pem1664

Re : nommer dynamiquement un tableau et le remplir dynamiquement

Watael a écrit :

2 secondes d'écart me semblent insignifiantes.

Oui quand on regarde juste le côté temps/instructions, sauf que dans ce script les valeurs vad, vdd et temp ne sont pas testées pour savoir si elles sont cohérentes ou pas alors que dans le mien elles l'étaient avec la même latence et qu'il y avait 9 mesures en plus avec une latence de 2s (je viens de compter dans l'historique du terminal.. tongue)


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

Hors ligne

#11 Le 04/02/2018, à 16:27

Watael

Re : nommer dynamiquement un tableau et le remplir dynamiquement

ça prend rien de temps, les tests.
ce qui prend du temps, c'est les affichages, et les lectures.

mais là, je ne vois pas ce qui justifie un temps d'exécution plus long.

ajoute un echo $SECONDS entre l'exécution des fonctions, pour voir ce que chacune dure.
recupValeurs ne devrait pas durer plus de deux minutes, et le reste ne devrait pas mettre 30 secondes. sad


Connected \o/
Welcome to sHell. · eval is evil.

Hors ligne

#12 Le 04/02/2018, à 17:20

pem1664

Re : nommer dynamiquement un tableau et le remplir dynamiquement

en faisant ce que tu m'as conseillé ca vient de la facon de récupérer les valeurs

pi@Cuisine:~ $ /usr/bin/time --format='la commande a duré %e secondes' sudo bash /home/pi/domoticz/scripts/ds2438-2.sh
nombre de capteurs trouvés : 4 : 26-00000101178f 26-00000166f95d 26-0000017750b5 26-000001e426ae
nombre de mesures : 5
boucle1 VDD ok  : 328
mesure capteur 1/5 : 26-00000101178f OK! VAD0=271 VDD0=328
secondes boucles : 8
VAD capteur 26-00000101178f : 271 mV
boucle1 VDD ok  : 329
mesure capteur 2/5 : 26-00000101178f OK! VAD0=271 VDD0=329
secondes boucles : 13
VAD capteur 26-00000101178f : 271 mV
VAD capteur 26-00000101178f : 271 mV
boucle1 VDD ok  : 329
mesure capteur 3/5 : 26-00000101178f OK! VAD0=271 VDD0=329
secondes boucles : 18
VAD capteur 26-00000101178f : 271 mV
VAD capteur 26-00000101178f : 271 mV
VAD capteur 26-00000101178f : 271 mV
boucle1 VDD ok  : 328
mesure capteur 4/5 : 26-00000101178f OK! VAD0=271 VDD0=328
secondes boucles : 23
VAD capteur 26-00000101178f : 271 mV
VAD capteur 26-00000101178f : 271 mV
VAD capteur 26-00000101178f : 271 mV
VAD capteur 26-00000101178f : 271 mV
boucle1 VDD ok  : 328
mesure capteur 5/5 : 26-00000101178f OK! VAD0=271 VDD0=328
secondes boucles : 29
VAD capteur 26-00000101178f : 271 mV
VAD capteur 26-00000101178f : 271 mV
VAD capteur 26-00000101178f : 271 mV
VAD capteur 26-00000101178f : 271 mV
VAD capteur 26-00000101178f : 271 mV
boucle1 VDD ok  : 329
mesure capteur 1/5 : 26-00000166f95d OK! VAD1=143 VDD1=329
secondes boucles : 36
VAD capteur 26-00000166f95d : 143 mV
VAD capteur 26-00000166f95d : 271 mV
VAD capteur 26-00000166f95d : 271 mV
VAD capteur 26-00000166f95d : 271 mV
VAD capteur 26-00000166f95d : 271 mV
boucle1 VDD ok  : 329
mesure capteur 2/5 : 26-00000166f95d OK! VAD1=143 VDD1=329
secondes boucles : 41
VAD capteur 26-00000166f95d : 143 mV
VAD capteur 26-00000166f95d : 143 mV
VAD capteur 26-00000166f95d : 271 mV
VAD capteur 26-00000166f95d : 271 mV
VAD capteur 26-00000166f95d : 271 mV
boucle1 VDD ok  : 329
mesure capteur 3/5 : 26-00000166f95d OK! VAD1=143 VDD1=329
secondes boucles : 46
VAD capteur 26-00000166f95d : 143 mV
VAD capteur 26-00000166f95d : 143 mV
VAD capteur 26-00000166f95d : 143 mV
VAD capteur 26-00000166f95d : 271 mV
VAD capteur 26-00000166f95d : 271 mV
boucle1 VDD ok  : 329
mesure capteur 4/5 : 26-00000166f95d OK! VAD1=143 VDD1=329
secondes boucles : 52
VAD capteur 26-00000166f95d : 143 mV
VAD capteur 26-00000166f95d : 143 mV
VAD capteur 26-00000166f95d : 143 mV
VAD capteur 26-00000166f95d : 143 mV
VAD capteur 26-00000166f95d : 271 mV
boucle1 VDD ok  : 329
mesure capteur 5/5 : 26-00000166f95d OK! VAD1=143 VDD1=329
secondes boucles : 57
VAD capteur 26-00000166f95d : 143 mV
VAD capteur 26-00000166f95d : 143 mV
VAD capteur 26-00000166f95d : 143 mV
VAD capteur 26-00000166f95d : 143 mV
VAD capteur 26-00000166f95d : 143 mV
boucle1 VDD ok  : 329
mesure capteur 1/5 : 26-0000017750b5 OK! VAD2=215 VDD2=329
secondes boucles : 64
VAD capteur 26-0000017750b5 : 215 mV
VAD capteur 26-0000017750b5 : 143 mV
VAD capteur 26-0000017750b5 : 143 mV
VAD capteur 26-0000017750b5 : 143 mV
VAD capteur 26-0000017750b5 : 143 mV
boucle1 VDD ok  : 329
erreur capteur : 26-0000017750b5 vad >= vdd 329>=329 ...nouvelle mesure...
mesure capteur 2/5 : 26-0000017750b5 OK! VAD2=214 VDD2=329
secondes boucles : 72
VAD capteur 26-0000017750b5 : 215 mV
VAD capteur 26-0000017750b5 : 214 mV
VAD capteur 26-0000017750b5 : 143 mV
VAD capteur 26-0000017750b5 : 143 mV
VAD capteur 26-0000017750b5 : 143 mV
boucle1 VDD ok  : 329
mesure capteur 3/5 : 26-0000017750b5 OK! VAD2=215 VDD2=329
secondes boucles : 77
VAD capteur 26-0000017750b5 : 215 mV
VAD capteur 26-0000017750b5 : 214 mV
VAD capteur 26-0000017750b5 : 215 mV
VAD capteur 26-0000017750b5 : 143 mV
VAD capteur 26-0000017750b5 : 143 mV
boucle1 VDD ok  : 329
mesure capteur 4/5 : 26-0000017750b5 OK! VAD2=215 VDD2=329
secondes boucles : 82
VAD capteur 26-0000017750b5 : 215 mV
VAD capteur 26-0000017750b5 : 214 mV
VAD capteur 26-0000017750b5 : 215 mV
VAD capteur 26-0000017750b5 : 215 mV
VAD capteur 26-0000017750b5 : 143 mV
boucle1 VDD ok  : 329
mesure capteur 5/5 : 26-0000017750b5 OK! VAD2=215 VDD2=329
secondes boucles : 87
VAD capteur 26-0000017750b5 : 215 mV
VAD capteur 26-0000017750b5 : 214 mV
VAD capteur 26-0000017750b5 : 215 mV
VAD capteur 26-0000017750b5 : 215 mV
VAD capteur 26-0000017750b5 : 215 mV
boucle1 VDD ok  : 329
mesure capteur 1/5 : 26-000001e426ae OK! VAD3=317 VDD3=329
secondes boucles : 94
VAD capteur 26-000001e426ae : 317 mV
VAD capteur 26-000001e426ae : 214 mV
VAD capteur 26-000001e426ae : 215 mV
VAD capteur 26-000001e426ae : 215 mV
VAD capteur 26-000001e426ae : 215 mV
boucle1 VDD ok  : 329
mesure capteur 2/5 : 26-000001e426ae OK! VAD3=328 VDD3=329
secondes boucles : 100
VAD capteur 26-000001e426ae : 317 mV
VAD capteur 26-000001e426ae : 328 mV
VAD capteur 26-000001e426ae : 215 mV
VAD capteur 26-000001e426ae : 215 mV
VAD capteur 26-000001e426ae : 215 mV
boucle1 VDD ok  : 328
erreur capteur : 26-000001e426ae vad >= vdd 329>=328 ...nouvelle mesure...
erreur capteur : 26-000001e426ae vad >= vdd 328>=328 ...nouvelle mesure...
mesure capteur 3/5 : 26-000001e426ae OK! VAD3=317 VDD3=328
secondes boucles : 109
VAD capteur 26-000001e426ae : 317 mV
VAD capteur 26-000001e426ae : 328 mV
VAD capteur 26-000001e426ae : 317 mV
VAD capteur 26-000001e426ae : 215 mV
VAD capteur 26-000001e426ae : 215 mV
boucle1 VDD ok  : 328
mesure capteur 4/5 : 26-000001e426ae OK! VAD3=317 VDD3=328
secondes boucles : 115
VAD capteur 26-000001e426ae : 317 mV
VAD capteur 26-000001e426ae : 328 mV
VAD capteur 26-000001e426ae : 317 mV
VAD capteur 26-000001e426ae : 317 mV
VAD capteur 26-000001e426ae : 215 mV
boucle 2 VDD erreur  : 317
erreur capteur : 26-000001e426ae vdd < valimmin 317<327 ...nouvelle mesure...
mesure capteur 5/5 : 26-000001e426ae OK! VAD3=317 VDD3=329
secondes boucles : 122
VAD capteur 26-000001e426ae : 317 mV
VAD capteur 26-000001e426ae : 328 mV
VAD capteur 26-000001e426ae : 317 mV
VAD capteur 26-000001e426ae : 317 mV
VAD capteur 26-000001e426ae : 317 mV
secondes : 122
le script aura duré 2 minutes et 2 secondes 
la commande a duré 122.12 secondes
pi@Cuisine:~ $ 
pi@Cuisine:~ $ /usr/bin/time --format='la commande a duré %e secondes' sudo bash /home/pi/domoticz/scripts/ds2438.sh
nombre de capteurs trouvés : 4 : 26-00000101178f 26-00000166f95d 26-0000017750b5 26-000001e426ae
26-00000101178f
0
1
2
3
4
26-00000166f95d
0
1
2
3
4
26-0000017750b5
0
1
2
3
4
26-000001e426ae
0
1
2
3
4
secondes boucles: 136
VAD 26-00000101178f=271;271;329;271;329;
VDD 26-00000101178f=329;328;271;329;329;
TEMP 26-00000101178f=4152;4152;4144;4160;4152;
VAD 26-00000166f95d=143;143;143;329;143;
VDD 26-00000166f95d=329;329;329;329;329;
TEMP 26-00000166f95d=4256;4240;4232;4240;4240;
VAD 26-0000017750b5=215;329;215;214;215;
VDD 26-0000017750b5=329;329;329;329;329;
TEMP 26-0000017750b5=4256;4248;4264;4272;4256;
VAD 26-000001e426ae=317;329;317;317;328;
VDD 26-000001e426ae=328;329;329;317;328;
TEMP 26-000001e426ae=4176;4192;4192;4200;4216;
26-00000166f95d : vdd = 143;143;143;329;143;; vad = ...
26-000001e426ae : vdd = 317;329;317;317;328;; vad = ...
26-00000101178f : vdd = 271;271;329;271;329;; vad = ...
26-0000017750b5 : vdd = 215;329;215;214;215;; vad = ...
secondes : 136
le script aura duré 2 minutes et 16 secondes 
la commande a duré 135.93 secondes

122s pour les boucles issues de mon script contre 136, étrange non?


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

Hors ligne

#13 Le 04/02/2018, à 18:53

Watael

Re : nommer dynamiquement un tableau et le remplir dynamiquement

je ne peux pas le justifier a priori.

on pourrait penser que c'est la lecture des fichiers, mais je viens de faire un test comparatif entre $(<) et $(cat), et sur un fichier de 500 caractères redirigé 100000 fois vers devNull, l'écart est d'une minute à la défaveur de cat.

'comprends pas sad


Connected \o/
Welcome to sHell. · eval is evil.

Hors ligne