[Script] DS2438 avec sonde hygrométrie YL-69

Le bus 1-Wire, connectique, et intégration dans Domoticz
Répondre
PeM
Messages : 61
Enregistré le : 24 nov. 2016, 14:32

[Script] DS2438 avec sonde hygrométrie YL-69

Message par PeM » 30 janv. 2018, 23:34

Pour tous ceux qui veulent utiliser un ou plusieurs capteurs d'hygrométrie du sol avec le bus 1wire voici un script à améliorer mais qui fonctionne. le script peut être adapté pour toute entrée sur le DS2438 a condition de connaître ce qu'on met sur l'entrée VAD
  • Fonction :
ce script scan le bus w1 du pi et vient chercher les valeurs VAD VDD et TEMPERATURE de x capteurs DS2438 présents sur le bus il permet d'afficher en console les valeurs présentent sur chaque capteur et étant donné que les valeurs reçues ne sont pas toujours fiables il moyenne sur un nombre de valeurs reçues qui peut être paramétrable. Il envoie à Domoticz les valeurs sur les capteurs créés en dummy devices (humidité, volt,temp temp+hum)

  • À améliorer
plein de trucs sûrement, je ne suis pas un cador en shell mais au moins le calcul de l'hygrométrie du sol (qui me semble être une droite genre y=-ax+b mais je n'ai pas trouvé d'autre moyen qu'empirique pour déterminer le b et c'est plus ou moins fiable, faudrait que je me fasse un banc de test pour définir vraiment les propriétés du capteur... Par ailleurs il faudrait améliorer le moyennage aussi parceque le bus 1W confond souvent le VAD et le VDD voir la température quand on l'interroge, j'ai cru comprendre que c'était une question du reset du DS2438 mais je ne vois pas du tout comment on envoie un reset au DS2438, j'ai beau chercher jtrouve pas...

Code : Tout sélectionner

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

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


#ID DS2438 sur le bus w1
#interrogation nombre capteurs

capteur=$(mktemp /tmp/ds2438.XXX)
sudo echo `ls /sys/bus/w1/devices/|grep 26 ` >> $capteur
CAPTEUR=`cat $capteur|sed 's+ +\n+g'`
sudo rm $capteur
echo "$CAPTEUR">>$capteur
nbc=`sed -n '$=' $capteur`
echo "nombre de capteurs: $nbc 
$CAPTEUR"
echo "nombre de mesures : $nbmesure mesures"
echo "latence entre chaque mesure  : $latence1 s"
echo "latence entre l'intérrogation de chaque capteur  : $latence2 s"


idcapteur=0
#boucle sur tous les capteurs pour donner les valeurs VAD VDD et TEMPERATURE
for ligne in $(<$capteur)
do

	sleep $latence2
	CAPTEUR=`echo $ligne`
	
	tmpvad=$(mktemp /tmp/tmpvad.XXX)
	tmpvdd=$(mktemp /tmp/tmpvdd.XXX)
	tmptemp=$(mktemp /tmp/tmptemp.XXX)
	cpt=0
	
	#Récupération valeurs VAD VDD et température
		while [ $cpt -lt $nbmesure ]
		do
		sleep $latence1
		sudo echo `cat /sys/bus/w1/devices/$CAPTEUR/vad` >> $tmpvad
		sleep $latence1
		sudo echo `cat /sys/bus/w1/devices/$CAPTEUR/vdd` >> $tmpvdd
		sleep $latence1		
		sudo echo `cat /sys/bus/w1/devices/$CAPTEUR/temperature` >> $tmptemp
		cpt=$(($cpt+1))
		done
	
	#traitement VAD

	nbvad=`sed -n '$=' $tmpvad`
	vad=`awk -v first_row="1" -v last_row="$nbvad" 'NR>=first_row && NR<=last_row {S+=$1} END{print S}' < $tmpvad`
	moyvad=`echo "$vad/$nbvad"|bc -l`
	VAD=$moyvad


	#traitement VDD

	nbvdd=`sed -n '$=' $tmpvdd`
	vdd=`awk -v first_row="1" -v last_row="$nbvdd" 'NR>=first_row && NR<=last_row {S+=$1} END{print S}' < $tmpvdd`
	moyvdd=`echo "$vdd/$nbvdd"|bc -l`
	VDD=$moyvdd

	#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`
	

	#traitement TEMP

	nbtemp=`sed -n '$=' $tmptemp`
	temp=`awk -v first_row="1" -v last_row="$nbtemp" 'NR>=first_row && NR<=last_row {S+=$1} END{print S}' < $tmptemp`
	moytemp=`echo "$temp/$nbtemp"|bc -l`
	TEMP=$(cat $tmptemp)
	TEMP=`echo "$moytemp/256"|bc -l| xargs printf %.2f`
	#sudo rm $tmptemp
	#cpttemp=0
	#moytemp=0
	#nbtemp=0

	#affichage

	echo "################Résultats VAD CAPTEUR $CAPTEUR######################"
	echo "`cat $tmpvad`"	
	echo "Total vad: $vad"
	echo "nb ligne: $nbvad"
	echo "Moyenne vad:$moyvad"
	echo "##########################################################################"
	echo "################Résultats VDD CAPTEUR $CAPTEUR######################"
	echo "`cat $tmpvdd`"	
	echo "Total vdd: $vdd"
	echo "nb ligne: $nbvdd"
	echo "Moyenne vdd:$moyvdd"
	echo "##########################################################################"
	echo "################Résultats TEMP CAPTEUR $CAPTEUR######################"
	echo "`cat $tmptemp`"	
	echo "Total temp: $temp"
	echo "nb ligne: $nbtemp"
	echo "Moyenne temp:$moytemp -> temp moyenne : $TEMP"
	echo "###########################################################################"
	echo "################Résultats COMPLET CAPTEUR $CAPTEUR####################"
	echo "Hum:$HUM %"
	echo "Volts:$VOLT V"
	echo "température= $TEMP °C"
	echo "##############################################################################"
	echo $idcapteur
	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))
	#réinitialisation des variables
	sudo rm $tmpvad
	moyvad=0
	nbvad=0
	sudo rm $tmpvdd
	moyvdd=0
	nbvdd=0
	sudo rm $tmptemp
	moytemp=0
	nbtemp=0
	cpt=0




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


exit 0


Je suis parti du script pour le DHT22/11 qui fonctionne bien par ailleurs mais qui pourrait être amélioré si on en utilise plusieurs :)
Je suis preneur pour toute aide concernant l'amélioration et la fiabilité des mesures !!

EDIT : je viens de trouver une commande sympa pour le lancer :

Code : Tout sélectionner

/usr/bin/time --format='la commande a duré %e secondes' sudo bash /home/pi/domoticz/scripts/DS2438.sh
:D

EDIT2 voila un ex avec 10 mesures et du problème que j'ai :

Code : Tout sélectionner

pi@Cuisine:~/domoticz/scripts $ /usr/bin/time --format='la commande a duré %e secondes' sudo bash /home/pi/domoticz/scripts/DS2438.sh
nombre de capteurs: 3 
26-00000166f95d
26-0000017750b5
26-000001e426ae
nombre de mesures : 10 mesures
latence entre chaque mesure  : 2 s
latence entre l'intérrogation de chaque capteur  : 2 s
################Résultats VAD CAPTEUR 26-00000166f95d######################
135
134
329
133
135
133
134
135
135
329
Total vad: 1732
nb ligne: 10
Moyenne vad:173.20000000000000000000
##########################################################################
################Résultats VDD CAPTEUR 26-00000166f95d######################
133
329
329
329
133
329
329
329
329
329
Total vdd: 2898
nb ligne: 10
Moyenne vdd:289.80000000000000000000
##########################################################################
################Résultats TEMP CAPTEUR 26-00000166f95d######################
4312
4320
4320
4280
4280
4304
4304
4304
4312
4312
Total temp: 43048
nb ligne: 10
Moyenne temp:4304.80000000000000000000 -> temp moyenne : 16.82
###########################################################################
################Résultats COMPLET CAPTEUR 26-00000166f95d####################
Hum:72.97 %
Volts:2.898 V
température= 16.82 °C
##############################################################################
0
################Résultats VAD CAPTEUR 26-0000017750b5######################
329
196
197
196
197
195
195
196
196
195
Total vad: 2092
nb ligne: 10
Moyenne vad:209.20000000000000000000
##########################################################################
################Résultats VDD CAPTEUR 26-0000017750b5######################
329
197
329
329
329
329
329
196
195
195
Total vdd: 2757
nb ligne: 10
Moyenne vdd:275.70000000000000000000
##########################################################################
################Résultats TEMP CAPTEUR 26-0000017750b5######################
4288
4288
4312
4288
4312
4296
4296
4280
4296
4296
Total temp: 42952
nb ligne: 10
Moyenne temp:4295.20000000000000000000 -> temp moyenne : 16.78
###########################################################################
################Résultats COMPLET CAPTEUR 26-0000017750b5####################
Hum:45.64 %
Volts:2.757 V
température= 16.78 °C
##############################################################################
1
################Résultats VAD CAPTEUR 26-000001e426ae######################
197
196
196
329
196
197
196
329
196
329
Total vad: 2361
nb ligne: 10
Moyenne vad:236.10000000000000000000
##########################################################################
################Résultats VDD CAPTEUR 26-000001e426ae######################
329
196
329
329
329
329
329
329
196
196
Total vdd: 2891
nb ligne: 10
Moyenne vdd:289.10000000000000000000
##########################################################################
################Résultats TEMP CAPTEUR 26-000001e426ae######################
4256
4248
4248
4240
4256
4256
4240
4224
4264
4240
Total temp: 42472
nb ligne: 10
Moyenne temp:4247.20000000000000000000 -> temp moyenne : 16.59
###########################################################################
################Résultats COMPLET CAPTEUR 26-000001e426ae####################
Hum:33.31 %
Volts:2.891 V
température= 16.59 °C
##############################################################################
2
/home/pi/domoticz/scripts/DS2438.sh: ligne 159: 229/60: Aucun fichier ou dossier de ce type
le script aura duré  minutes
la commande a duré 229.35 secondes
pi@Cuisine:~/domoticz/scripts $ 
on voit bien que pour les 10 mesures sur 1 capteur vdd et vad se mélangent :

Code : Tout sélectionner

329
196
329
329
329
329
329
329
196
196
Total vdd: 2891
ici c'est vdd et ca ne devrait être qu'a 329
et la :

Code : Tout sélectionner

197
196
196
329
196
197
196
329
196
329
Total vad: 2361
idem ce qui fausse toute les mesures et ca je ne vois pas du tout comment y parer... :'(

Disable adblock

This site is supported by ads and donations.
If you see this text you are blocking our ads.
Please consider a Donation to support the site.


Répondre