Automate Bash K8055

Script de gestion automatique de la carte K8055 en bash

Encore une fois je n’ai pas la prétention d’être un dieu en programmation mais j’essaye toujours de livrer du code fonctionnel il est toujours essayé chez moi sur 2 ou 3 machines (virtuelle ou non).

Je vous fait profiter de mon automate en bash seulement pour le moment il s’étoffera surement d’une version en interaction avec une base de donnée mysql et une interface web, c’est actuellement en cour de développement.

Le script gère à l’heure actuelle les cycle horaire 09h00 – 22h00 modifiable à votre guise, les températures et le taux d’humidité.
Tout est géré automatiquement aucun bug pour ma part en 3 semaines de test en conditions réelle (les habitants du terrarium n’étant pas là avant minimum 2 semaines).

Je vous fait donc profiter de mon script copiez-le ou vous désirez et modifiez les champs nécessaires.
N’oubliez pas de faire un chmod u+x sur votre fichier.
Personnellement je lui ai assigné une exécution toute les 5 minutes.

Faites un crontab -e et assignez le script toute les 5 minutes exemple pour moi :

# m h dom mon dow command
*/5 * * * * /home/totone/automate.sh

Code de l’automate

#!/bin/bash
##############################################
# Script d'automatisation par Antonin Bollin #
# http://www.totone.fr #
# Script en Version 1.1 #
##############################################

# Utilisateur lancant le script
user=totone

# Fichier automate
automate="/home/totone/automate"

# Emplacement du fichier de log
logr="/home/totone/"

# Nom du fichier de log
logf="log-automate.log"

# Répertoire d'Archive des logs
olog="/home/totone/old-log/"

# Emplacement du fichier verrou
# Ce fichier verrou est déstiné à protéger l'execution du script.

verrou="/home/totone/mesure-en-cours"

# Vérification de l'existence de l'utilisateur à qui on demande d'éxécuter le script.

egrep "^$user" /etc/passwd >/dev/null
if [ $? -eq 0 ]; then
echo "L'utilisateur $user existe la sauvegarde va donc continuer"
else
echo "L'utilisateur $user n'existe pas merci d'utiliser un utilisateur existant ou de le créer." >> $logr/$logf
exit 0
fi

# Incrémentation en mémoire de l'UID de l'utilisateur de la sauvegarde.

us=$(id -u $user)

# Vérification que c'est bien l'utilisateur demandé qui lance le script

if [ "$(id -u $(whoami))" == "$us" ]; then
echo "C'est OK vous êtes bien $user"
else
echo "Désolé seulement l'utilisateur $user peut éxécuter ce Script" >> $logr/$logf
exit 0
fi

# mise en mémoire des valeurs de l'automate à l'instant t=0
k8055 > $automate

# Mise en mémoire des valeurs de l'automate
auto=$(cat $automate)

# Les valeurs renvoyés par la K8055 sont de type 65;0;172;152;0;0
# Les valeurs qui nous interressent sont donc 172 pour l'entrée analogique 1 et 152 pour l'entrée analogique 2

# Mise en mémoire de la température
temp=$(echo $auto | cut -d ';' -f 3)

# Mise en mémoire de l'humidité
hygro=$(echo $auto | cut -d ';' -f 4)

# Mise en mémoire des valeurs de températures et d'humidité dont nous avons besoin
# Température nocturne ~24°C => 121/255
tn=121
tn2=24
# Humidité Nocturne ~95% => 222/255
hn=222
hn2=95
# Température dans la journée ~33°C => 167/255
tj=167
tj2=33
# Humidité dans la journée ~80% => 187/255
hj=187
hj2=80

# Définition de l'heure qu'il est afin de savoir ce qu'on allume ou éteint
heure=$(date +%H)
# a partir de quelle heure on est le jour
heurej=9
# a partir de quelle heure on est la nuit
heuren=22

# Indexation des logs tout les soirs à 00h00
# Comme ça nous avons un fichier de log par jour
if [ $(date +%H%M) == 0000 ]; then
if [ -d $olog ]; then
echo "Le dossier existe on ne le crée donc pas"
else
mkdir $olog
fi

cp $logr/$logf $olog/$logf && mv $olog/$logf $olog/log-du-$(date +%A --date '1 day ago')-$(date +%d --date '1 day ago')-$(date +%B)-$(date +%Y).txt
rm $logr/$logf
fi
# Attendons 5s la fin de la copie/suppression/renommage par sécurité.
sleep 5

# Inscription dans le fichier de log
echo "" >> $logr/$logf
echo "=============================================================================================================================" >> $logr/$logf
echo "Execution du script le $(date +%A) $(date +%d) $(date +%B) $(date +%Y) à $(date +%H)h et $(date +%M)min" >> $logr/$logf

# Test si le fichier verrou est là sinon on le crée

if [ -f $verrou ]; then
echo "Impossible de mesurer quoi que ce soit une mesure est déjà en cours" >> $logr/$logf
exit 0
else
echo "Une mesure est en cours" > $verrou
echo "Si ce fichier existe c'est qu'une mesure est en cours" >> $verrou
echo "Ce fichier sera automatiquement détruit à la fin de la mesure" >> $verrou
fi

# Attente de 3s avant de continuer histoire que le fichier soit bien crée etc... en cas de surchage de la machine ou autre ...
sleep 3

# Annonce de la température
echo "Température actuelle de $temp sur 255 donc $(( $(($tj2 *$temp)) /$tj)) °C " >> $logr/$logf

# Annonce du taux d'humidité
echo "Humidité actuelle de $hygro sur 255 donc $(( $(($hj2 *$hygro)) /$hj)) % " >> $logr/$logf

# Adressage des composants :
# Port n°1 = Lampe chauffante = valeur 1
# Port n°2 = Néons UV = valeur 2
# Port n°3 = Hygrométre = valeur 4
# Port n°4 = Pompe = valeur 8
# Port n°5 = Plancher Chauffant = valeur 16

# Nous sommes la nuit on traite le cas particulier 22h 23h
# Si l'heure est strictement supérieur à 21h alors on execute cette partie.

if [ $heure -gt $(($heuren -1)) ] ; then
echo "Nous sommes la nuit avant minuit puisqu'il est $(date +%H)h et $(date +%M)min" >> $logr/$logf

# Si il fait moins de 24°C (121/255) et qu'il y à moins de 95% (222/255) d'humidité on chauffe et humidifie

if [ $temp -le $tn -a $hygro -le $hn ]; then
echo "Il fait froid et sec la nuit avant minuit alors on chauffe et humidifie" >> $logr/$logf
k8055 -d:20
fi

if [ $temp -gt $tn -a $hygro -gt $hn ]; then
echo "Il fait chaud et humide la nuit donc on éteint tout" >> $logr/$logf
k8055 -d:0
fi

if [ $temp -le $tn -a $hygro -gt $hn ]; then
echo "il fait froid et humide avant minuit donc on chauffe seulement" >> $logr/$logf
k8055 -d:16
fi

if [ $temp -gt $tn -a $hygro -le $hn ]; then
echo "Il fait chaud mais sec avant minuit donc on humidifie seulement" >> $logr/$logf
k8055 -d:4
fi
fi

# Nous sommes la nuit entre 00h00 et 09h00
# Si l'heure est supérieur ou égal à minuit mais si et seulement si elle est strictement inférieur à 09h00 alors on execute

if [ $heure -ge 00 -a $heure -lt $heurej ]; then
echo "Nous sommes la nuit avant 09h00 puisqu'il est $(date +%H)h et $(date +%M)min" >> $logr/$logf

# Si il fait moins de 24 (121/255) et qu'il y à moins de 95% (222/255) d'humidité on chauffe et humidifie

if [ $temp -le $tn -a $hygro -le $hn ]; then
echo "Il fait froid et sec la nuit avant minuit alors on chauffe et humidifie" >> $logr/$logf
k8055 -d:20
fi

if [ $temp -gt $tn -a $hygro -gt $hn ]; then
echo "Il fait chaud et humide la nuit donc on éteint tout" >> $logr/$logf
k8055 -d:0
fi

if [ $temp -le $tn -a $hygro -gt $hn ]; then
echo "il fait froid et humide avant minuit donc on chauffe seulement" >> $logr/$logf
k8055 -d:16
fi

if [ $temp -gt $tn -a $hygro -le $hn ]; then
echo "Il fait chaud mais sec avant minuit donc on humidifie seulement" >> $logr/$logf
k8055 -d:4
fi
fi

# Nous sommes le jour donc il est 09h00 ou plus mais moins de 22h00
# Si l'heure est supérieur ou égal à 09h00 et si et seulement si elle est supérieur à minuit et si et seulement si elle est strictement inférieur à 22h00 alors on est en journée.
# Nous incrémenterons tout les allumage des sorties : pompe+néons+lampe chauffante
# Ce qui nous fait ajouter :
# Pompe = 8
# Néons UV = 2
# Lampe Chauffante = 1

if [ $heure -ge $heurej -a $heure -gt 00 -a $heure -lt $heuren ]; then
echo "Nous sommes le jour après 09h00 puisqu'il est $(date +%H)h et $(date +%M)min" >> $logr/$logf

# Si il fait moins de 33 (167/255) et qu'il y à moins de 80% (187/255) d'humidité on chauffe et humidifie

if [ $temp -le $tj -a $hygro -le $hj ]; then
echo "Il fait froid et sec alors on chauffe et humidifie puisqu'on est le jour on ajoute la pompe les néons et la lampe chauffante" >> $logr/$logf
k8055 -d:31
fi

if [ $temp -gt $tj -a $hygro -gt $hj ]; then
echo "Il fait chaud et humide donc on éteint tout sauf la pompe et les néons " >> $logr/$logf
k8055 -d:10
fi

if [ $temp -le $tj -a $hygro -gt $hj ]; then
echo "il fait froid et humide donc on chauffe avec la lampe chauffante et le tapis on laisse bien sur les néons allumés" >> $logr/$logf
k8055 -d:27
fi

if [ $temp -gt $tj -a $hygro -le $hj ]; then
echo "Il fait chaud mais sec donc on humidifie seulement et on laisse allumé la pompe et les néons." >> $logr/$logf
k8055 -d:14
fi
fi

echo "=============================================================================================================================" >> $logr/$logf

# Attente de 5s avant de supprimer et de terminer le script
sleep 5

# Suppression du fichier verrou
rm $verrou

# Suppresion du fichier automate
rm $automate

# Sortie Du script
exit 0