#!/bin/bash


#**************************************************************************************#
#*      AUTEUR    : ian                                                               *#
#*      LANGAGE   : bash                                                              *#
#*    NOM FICHIER : domotique.sh                                                      *#
#*====================================================================================*#
#*      OBJET/BUT : Piloter la domotique depuis un PC sous Linux                      *#
#*                                                                                    *#
#*====================================================================================*#
#*        USAGE   : ./domotique.sh                                                    *#
#*                                                                                    *#
#*====================================================================================*#
#*  MODIFICATION  : 2014-02-06: pilotage des lumieres et des volets                   *#
#*                  2014-02-19: relevé de température                                 *#
#*                  2014-03-02: ajout de fonctions et variables                       *#
#*                                                                                    *#
#*====================================================================================*#
#*      REMARQUES : - Tous les parametres à modifier se trouvent uniquement dans      *#
#*                    le paragraphe  "VARIABLES"                                      *#
#*                  - Il n'y a théoriquement pas de modificaion à faire dans les      *#
#*                    fonctions sauf le height et weught des fenetres pour optimiser  *#
#*                    l'affichage                                                     *#
#*                                                                                    *#
#**************************************************************************************#



##### VARIABLES

#-- adresse IP et port du srv domotique
SRV_IP=192.168.1.95
SRV_PORT=20000

#-- fichier où seront écrits les relevés de temperature
FILE="temperature.log"

#-- liste des pièces où seront effectués les relevés de température
#-- (l'ordre est important: irespectivement adresses 1 2 3 4)
PIECE="Séjour Chambre1 Chambre2 Chambre3"

#-- adresses des lumières : ADAPTER les numéros !
#-- (important de conserver les FALSE, les \, et ne pas mettre d'espace dans le nom des pièces)
ADR_LUMIERE="FALSE 0 Toutes \
FALSE 41 Balcon \
FALSE 21 Chambre-1 \
FALSE 22 Chambre-2 \
FALSE 23 Chambre-3 \
FALSE 12 Couloir \
FALSE 15 Cuisine-1 \
FALSE 16 Cuisine-2 \
FALSE 18 Dressing \
FALSE 11 Entrée \
FALSE 33 Salle-de-bain-1 \
FALSE 34 Salle-de-bain-2 \
FALSE 17 Séjour \
FALSE 31 WC "

#-- adresses des volets : ADAPTER les numéros !
#-- (important de conserver les FALSE, les \, et ne pas mettre d'espace dans le nom des pièces)
ADR_VOLET="FALSE 0 Tous \
FALSE 51 Chambre-1G \
FALSE 61 Chambre-1D \
FALSE 52 Chambre-2 \
FALSE 53 Chambre-3 \
FALSE 56 Cuisine \
FALSE 57 Séjour-D \
FALSE 58 Séjour-M \
FALSE 59 Séjour-G \
"

if ! result_test="$(type -p 'qarma')" || [[ -z $result_test ]]; then
	UI=zenity
	HIDE_COLUMEN=2
else
	UI=qarma
	HIDE_COLUMEN=1
fi

##### FONCTIONS

function F_MENU {
	#-- menu qui liste les différentes actions
	MENU_CHOIX=$($UI --list 	\
	--title "Domotique"		\
	--text ""			\
	--width 280			\
	--height 320			\
	--cancel-label "Quitter"	\
	--radiolist			\
	--column "Choix"		\
	--column "Action"		\
	FALSE "Lumière : allumage"	\
	FALSE "Lumière : extinction"	\
	FALSE "Volet : ouverture"	\
	FALSE "Volet : fermeture"	\
	FALSE "Volet : arrêt"		\
	FALSE "Température : instantanée"\
	FALSE "Température : relevé")
	if [ "$?" = 0 ] 
		#-- si on clique sur valider, on liste les automates
		then 	echo $MENU_CHOIX
			F_AUTOMATE_LISTE
		#-- si on clique sur quitter, on quitte
		else 	exit
	fi
}


function F_AUTOMATE_LISTE {
	#-- on liste les objets à manipuler selon que "Lumière" ou "Volet" a été choisi
	#-- et association des adresses pour chaque objet
	case `echo $MENU_CHOIX | awk '{print $1}'` in
		##-- on passe en argument la variable ADR_LUMIERE : la liste des adresses
		Lumière) OBJET=$($UI --list		\
			--title "Domotique"		\
			--text ""		  	\
			--cancel-label "Menu"		\
			--checklist			\
			--width 240			\
			--height 430			\
			--column "Choix"		\
			--column "Adresse"		\
			--column "$MENU_CHOIX"		\
			--hide-column=$HIDE_COLUMEN 		\
			$ADR_LUMIERE )
			;;
		##-- on passe en argument la variable ADR_VOLET : la liste des adresses
		Volet) OBJET=$($UI --list		\
			--title "Domotique"		\
			--text ""			\
			--cancel-label "Menu"		\
			--checklist			\
			--width 240			\
			--height 320			\
			--checklist			\
			--column "Choix"		\
			--column "Adresse"		\
			--column "$MENU_CHOIX"		\
			--hide-column=$HIDE_COLUMEN			\
			$ADR_VOLET )
			;;
	esac
	if [ "$?" = 0 ]
		then 	echo $OBJET
			F_AUTOMATE_REQUETE
		else 	F_MENU
	fi
}


function F_AUTOMATE_REQUETE {
	#-- selon le choix de l'action du menu, on définit le préfixe de la commande (cf tout en bas)
	#-- et on execute le programme associé.
	case `echo $MENU_CHOIX | awk '{print $3}'` in
		allumage)	F_AUTOMATE_CMD "*1*1*"	;;
		extinction)	F_AUTOMATE_CMD "*1*0*"	;;
		ouverture)	F_AUTOMATE_CMD "*2*1*"	;;
		fermeture)	F_AUTOMATE_CMD "*2*2*"	;;
		arrêt)		F_AUTOMATE_CMD "*2*0*"	;;
		instantanée)	F_TEMPERATURE_INS	;;
		relevé)		F_TEMPERATURE_REL	;;
	esac
}


function F_AUTOMATE_CMD {
	#-- execution de la commande : concaténation du préfixe, de l'adresse, du serveur et du port
	#-- avec boucle pour les fois où il y a un choix multiple d'automate (OBJET)
	for ADDR in $(echo $OBJET | tr "|" " "); do
		CMD="echo -n \"$1$ADDR##\" | nc $SRV_IP $SRV_PORT"
		echo $CMD
		eval $CMD
	done
	#-- retour au menu
	F_MENU
}


function F_TEMPERATURE_INS {
	#-- boucle pour chaque pièce: on recupere la temperature
	#-- et on affiche les caracteres 15 à 17
	for P in $PIECE
	do
		i=`expr $i + 1`
		T=`echo -n "*#4*$i*0##" | nc $SRV_IP $SRV_PORT`
		echo -e "$P :\t ${T:15:2},${T:17:1}°"
	done | $UI ---list		\
		--title "Domotique"	\
		--text ""		\
		--column "Température"	\
		--ok-label "Rafraichir"	\
		--cancel-label "Menu"	\
		--width 240		\
		--height 280
	if [ "$?" = 0 ]
		#-- pour raffraichir, on relance la même fonction
		then	F_TEMPERATURE_INS
		else	F_MENU
	fi
}	


function F_TEMPERATURE_REL {
	#-- boucle pour faire des relevés de température toutes les XXmin 
	#-- et écrire les résultats dans un fichier

	#-- on demande la fréquence des relevés
	MIN=`$UI --scale 					\
		--title "Domotique"				\
		--text="Nombre de minutes entre les relevés :" 	\
		--value=15 --min-value=1 --max-value=60`
	if [ "$?" != 0 ]
		then	F_MENU
	fi

	#-- on crée le fichier des relevés s'il n'existe pas
	if [ ! -e $FILE ]
		then	touch $FILE
	fi

	#-- boucle infinie en tache de fond ("&") qui fait les relevés dans le fichier et patiente XXmin
	#-- et récuperation du PID de la boucle infinie pour pouvoir la stopper
	while :
	do
		D=`date +%Y-%m-%d`
		Y=`date +%H:%M`
		#-- selon le nombre de pièce, la requete sera plus longue
		case `echo $PIECE | wc -w` in
			1) T=`echo -n "*#4*1*0##" | nc $SRV_IP $SRV_PORT`
			   echo -e "$D\t$Y\t${T:15:2},${T:17:1}" >> $FILE;;
			2) T=`echo -n "*#4*1*0##*#4*2*0##" | nc $SRV_IP $SRV_PORT`
			   echo -e "$D\t$Y\t${T:15:2},${T:17:1}\t${T:35:2},${T:37:1}" >> $FILE;;
			3) T=`echo -n "*#4*1*0##*#4*2*0##*#4*3*0##" | nc $SRV_IP $SRV_PORT`
			   echo -e "$D\t$Y\t${T:15:2},${T:17:1}\t${T:35:2},${T:37:1}\t${T:55:2},${T:57:1}" >> $FILE;;
			4) T=`echo -n "*#4*1*0##*#4*2*0##*#4*3*0##*#4*4*0##" | nc $SRV_IP $SRV_PORT`
			   echo -e "$D\t$Y\t${T:15:2},${T:17:1}\t${T:35:2},${T:37:1}\t${T:55:2},${T:57:1}\t${T:75:2},${T:77:1}" >> $FILE;;
			5) T=`echo -n "*#4*1*0##*#4*2*0##*#4*3*0##*#4*4*0##*#4*5*0##" | nc $SRV_IP $SRV_PORT`
			   echo -e "$D\t$Y\t${T:15:2},${T:17:1}\t${T:35:2},${T:37:1}\t${T:55:2},${T:57:1}\t${T:75:2},${T:77:1}\t${T:95:2},${T:97:1}" >> $FILE;;
			6) T=`echo -n "*#4*1*0##*#4*2*0##*#4*3*0##*#4*4*0##*#4*5*0##*#4*6*0##" | nc $SRV_IP $SRV_PORT`
			   echo -e "$D\t$Y\t${T:15:2},${T:17:1}\t${T:35:2},${T:37:1}\t${T:55:2},${T:57:1}\t${T:75:2},${T:77:1}\t${T:95:2},${T:97:1}\t${T:115:2},${T:117:1}" >> $FILE;;
		esac
		sleep ${MIN}m
	done &
	PID_BOUCLE="$!"	
	
	#-- affichage en temps réel du contenu du fichier 
	tail -n 1 -f $FILE | $UI --text-info			\
		--title "Domotique  - Relevé de température"	\
		--ok-label "Poursuivre en arrière-plan"		\
		--cancel-label "Quitter"			\
		--width 300					\
		--height 430 
	#-- si on quitte, on stoppe la boucle infinie
	if [ "$?" = 0 ]
		then	exit
		else	kill -9 $PID_BOUCLE
			exit
	fi
}


##### PROGRAMME 

#-- on execute la fonction F_MENU qui va executer
#-- F_AUTOMATE_LISTE puis F_AUTOMATE_REQUETE 
#-- et F_AUTOMATE_CMD ou F_TEMPERATURE_INS ou F_TEMPERATURE_REL
F_MENU



##### POUR INFO :

#-- http://en.wikipedia.org/wiki/OpenWebNet

#-- liste des commandes

#Lumiere off :		echo -n "*1*0*99##" | nc $SRV_IP $SRV_PORT
#Lumiere on :		echo -n "*1*1*99##" | nc $SRV_IP $SRV_PORT
#Volets stop :		echo -n "*2*0*99##" | nc $SRV_IP $SRV_PORT
#Volets up   :		echo -n "*2*1*99##" | nc $SRV_IP $SRV_PORT
#Volets down :		echo -n "*2*2*00##" | nc $SRV_IP $SRV_PORT
#Temperature sejour :	echo -n "*#4*1*0##" | nc $SRV_IP $SRV_PORT  | cut -c 16-18
#Temperature chambre1 :	echo -n "*#4*2*0##" | nc $SRV_IP $SRV_PORT  | cut -c 16-18
#Temperature chambre2 :	echo -n "*#4*3*0##" | nc $SRV_IP $SRV_PORT  | cut -c 16-18
#Temperature chambre3 :	echo -n "*#4*4*0##" | nc $SRV_IP $SRV_PORT  | cut -c 16-18


#-- Boucle pour identifier les adresses de chaque lumière, on les teste toutes successivement

#for i in {1..99}
#do
#	echo    "adresse= $i"
#	echo -n "*1*0*$i##" | nc $SRV_IP $SRV_PORT
#	sleep 4
#done
