Accueil > Projet Made by Sp@r0, Synology > Domotique sur syno : MAJ

Domotique sur syno : MAJ

11/01/2011

il s’agit plus un script de test qu’autre chose, c’est pas super propre, ça manque de contrôles de cohérences et cela pourrait être mieux codé. On va dire que c’est une base de travail !!!

Le principe :
Utilisé des équipements standard en X10 RF (sonde de température, de consommation electrique, prises télécommandées …..) pour afficher tous sa sur un site web avec une base mysql pour historisé.

Prérequis pour utiliser le script :
- un récepteur RFXCOM USB (dispo chez domadoo.fr ou directement chez le fabricant)
- une sonde de témpérateure oregon
- une sonde de consomation d’electricité OWL CM113
- un DS110J ou compatible
- les dirvers du convertisseurs USB/série => Cf section téléchargement (usbserial.ko et ftdi.ko) et ICI
- ipkg fonctionnelle (avec python et le module pyserial)
- un peu de temps

Ce que fait le script :
- Décoder les trames du RFXCOM
- Les envoyées dans une base mysql (en fait pour simplifier le travail j’envoie une requête HTML au serveur php avec les données à insérer dans la base)
- Faire parler mon nabaztag (pour dire la température extérieure)

?View Code PYTHON
#!/usr/bin/env python2.5
# -*- coding: cp1252 -*-
#
#		Test du python par Sp@r0
#		Essai de divers fonction
#		Auteur Sp@r0 		le 17 01 10
#
 
#
#	Paramétrage du script
#	Capteur_00 : Temp intérieur
#	Capteur_01 : Hygro intérieur
#	Capteur_02 : Temp extérieur
#	Capteur_03 : Consommation électrique
#
 
 
# import des modules
import serial
import urllib
import datetime
 
# Fonction qui décripte a qui cela appartient
def Cherche_Sonde (trame):
	# Init de la réponse
	type_sonde = "nada"
	# Contrôle oregon type 1
	if len(trame) == 20:
		if trame[:8] == [1, 10, 2, 13, 1, 0, 14, 14]:
			type_sonde = "THGR228_00"
	if len(trame) == 20:
		if trame[:8] == [1, 10, 2, 13, 2, 0, 3, 7]:
			type_sonde = "THGR228_01"
	if len(trame) == 24:
		if trame[:8] == [5, 10, 6, 13, 0, 0, 0, 13]:
			type_sonde = "THR918_00"
	if len(trame) == 8:
		if trame == [6, 0, 9, 15, 0, 0, 15, 15]:
			type_sonde = "X10_001"
	if len(trame) == 8:
		if trame == [6, 0, 9, 15, 2, 0, 13, 15]:
			type_sonde = "X10_000"
	if len(trame) == 30:
		if trame[:2] == [14, 10]:
			if trame[4:6] == [8, 7]:
				type_sonde = "CM113_00"
	return type_sonde
 
# Décodage THGR228
def THGR228 (trame):
	temp_sign = (trame[13]==8)
	V_temp = (((trame[10]*100)+(trame[11]*10)+trame[8])/10.0)*(pow(-1,temp_sign))
	V_hygro = (trame[15]*10)+trame[12]
	print V_temp
	print V_hygro
	return V_temp, V_hygro
 
# Décodage THR918N
def THR918N (trame):
	temp_sign = (trame[13]==8)
	V_temp = (((trame[10]*100)+(trame[11]*10)+trame[8])/10.0)*(pow(-1,temp_sign))
	V_hygro = (trame[15]*10)+trame[12]
	V_press = (trame[16]*16)+trame[17]+856
	print V_temp
	print V_hygro
	print V_press
	return V_temp, V_hygro, V_press
 
# Décodage CM113_00
def CM113 (trame):
	V_puissance = ((trame[8]*pow(16,3))+(trame[9]*pow(16,2))+(trame[6]*16)+trame[7])*24
	print V_puissance
	return V_puissance
 
# Ecriture SQL
def Ecriture_SQL():
	try:
		V_datevaleur = V_maintenant.strftime("%Y-%m-%d%%20%H:%M:00")
		f = urllib.urlopen("http://www.sparo.net/domo/ajout.php?table=capteur_00&valeur=" + S_Sonde1_1 + "&horodate=" + V_datevaleur)
		print ("http://www.sparo.net/domo/ajout.php?table=capteur_00&valeur=" + S_Sonde1_1 + "&horodate=" + V_datevaleur)
		f = urllib.urlopen("http://www.sparo.net/domo/ajout.php?table=capteur_01&valeur=" + S_Sonde1_2 + "&horodate=" + V_datevaleur)
		print ("http://www.sparo.net/domo/ajout.php?table=capteur_01&valeur=" + S_Sonde1_2 + "&horodate=" + V_datevaleur)
		f = urllib.urlopen("http://www.sparo.net/domo/ajout.php?table=capteur_02&valeur=" + S_Sonde2_1 + "&horodate=" + V_datevaleur)
		print ("http://www.sparo.net/domo/ajout.php?table=capteur_02&valeur=" + S_Sonde2_1 + "&horodate=" + V_datevaleur) 
		f = urllib.urlopen("http://www.sparo.net/domo/ajout.php?table=capteur_03&valeur=" + S_Sonde2_2 + "&horodate=" + V_datevaleur)
		print ("http://www.sparo.net/domo/ajout.php?table=capteur_03&valeur=" + S_Sonde2_1 + "&horodate=" + V_datevaleur)
		f = urllib.urlopen("http://www.sparo.net/domo/ajout.php?table=capteur_04&valeur=" + S_CM113 + "&horodate=" + V_datevaleur)
		print ("http://www.sparo.net/domo/ajout.php?table=capteur_04&valeur=" + S_CM113 + "&horodate=" + V_datevaleur)                  	
		f = urllib.urlopen("http://www.sparo.net/domo/ajout.php?table=capteur_05&valeur=" + S_Sonde3_1 + "&horodate=" + V_datevaleur)
		print ("http://www.sparo.net/domo/ajout.php?table=capteur_05&valeur=" + S_Sonde3_1 + "&horodate=" + V_datevaleur) 
		f = urllib.urlopen("http://www.sparo.net/domo/ajout.php?table=capteur_06&valeur=" + S_Sonde3_2 + "&horodate=" + V_datevaleur)
		print ("http://www.sparo.net/domo/ajout.php?table=capteur_06&valeur=" + S_Sonde3_2 + "&horodate=" + V_datevaleur)
		f = urllib.urlopen("http://www.sparo.net/domo/ajout.php?table=capteur_07&valeur=" + S_Sonde3_3 + "&horodate=" + V_datevaleur)
		print ("http://www.sparo.net/domo/ajout.php?table=capteur_07&valeur=" + S_Sonde3_3 + "&horodate=" + V_datevaleur)
		f.close()
	except:
		print "Envoi KO"
	return
 
# Initialisation du port série si pas de trame
def init_port_serie():
	# Fermeture de liaison série
	ser.close()
	# Initilisation de la liaison serie
	ser = serial.Serial('/dev/ttyUSB0', 4800, timeout=0.25)
	return
 
#-------------------------------------------
#   Boucle principal
#-------------------------------------------
 
# Initilisation de la liaison serie
ser = serial.Serial('/dev/ttyUSB0', 4800, timeout=0.25)
 
# Initilisation du tableau de valeur des capteurs
V_H_CM113 = []
V_H_Sonde1_1 = []
V_H_Sonde1_2 = []
V_H_Sonde2_1 = []
V_H_Sonde2_2 = []
V_H_Sonde3_1 = []
V_H_Sonde3_2 = []
V_H_Sonde3_3 = []
V_H_Sonde3_4 = []
S_CM113 = "0"
S_Sonde1_1 = "0"
S_Sonde1_2 = "0"
S_Sonde2_1 = "0"
S_Sonde2_2 = "0"
S_Sonde3_1 = "0"
S_Sonde3_2 = "0"
S_Sonde3_3 = "0"
S_Sonde3_4 = "0"
 
deja_ecrit = False
 
 
# Boucle de lecture sur la liaison
V_boucle = 0
V_infini = 0
try:
	while (V_infini < 2):
		while (V_boucle < 3600):
			V_tramebrute = ser.readline()
 
			# copie de la trame dans un tableau dynamique
			V_trametableau = []
			for V_i in range(0,len(V_tramebrute),1):
				V_trametableau.append(ord(V_tramebrute[V_i])/16)
				V_trametableau.append(ord(V_tramebrute[V_i])%16)       
 
			# Vérification validité trame
			if len(V_trametableau) > 2:
				print V_trametableau
				V_longtheorie = (V_trametableau[0]*16+V_trametableau[1])/8
				V_longreel = len(V_tramebrute) - 2
				if (V_longreel > 2) and (V_longreel > 2):
					V_boucle = 0
					print "Trame Valide"
					V_trameutile = V_trametableau[2:(2*V_longtheorie+2)] 
					print V_trameutile
					# Recherche du type de la sonde
					V_typesonde = Cherche_Sonde(V_trameutile)
					print V_typesonde
					if V_typesonde == "THGR228_00":
						V_poubelle = THGR228(V_trameutile)
						V_H_Sonde1_1.append (V_poubelle[0])
						V_H_Sonde1_2.append (V_poubelle[1])
						V_Sonde1_1 = 0
						V_Sonde1_2 = 0						
						for V_i in range(0,len(V_H_Sonde1_1),1):
							V_Sonde1_1 = V_Sonde1_1 + V_H_Sonde1_1[V_i]  
							V_Sonde1_2 = V_Sonde1_2 + V_H_Sonde1_2[V_i]
						V_Sonde1_1 = V_Sonde1_1 / len(V_H_Sonde1_1)
						V_Sonde1_2 = V_Sonde1_2 / len(V_H_Sonde1_2)
						S_Sonde1_1 = "%.1f" % V_Sonde1_1
						S_Sonde1_2 = "%.1f" % V_Sonde1_2
						print V_H_Sonde1_1
						print S_Sonde1_1
						print V_H_Sonde1_2
						print S_Sonde1_2
					if V_typesonde == "THGR228_01":
						V_poubelle = THGR228(V_trameutile)
						V_H_Sonde2_1.append (V_poubelle[0])
						V_H_Sonde2_2.append (V_poubelle[1])
						V_Sonde2_1 = 0
						V_Sonde2_2 = 0						
						for V_i in range(0,len(V_H_Sonde2_1),1):
							V_Sonde2_1 = V_Sonde2_1 + V_H_Sonde2_1[V_i]  
							V_Sonde2_2 = V_Sonde2_2 + V_H_Sonde2_2[V_i]  
						V_Sonde2_1 = V_Sonde2_1 / len(V_H_Sonde2_1)
						V_Sonde2_2 = V_Sonde2_2 / len(V_H_Sonde2_2)
						S_Sonde2_1 = "%.1f" % V_Sonde2_1
						S_Sonde2_2 = "%.1f" % V_Sonde2_2
						print V_H_Sonde2_1
						print S_Sonde2_1
						print V_H_Sonde2_2
						print S_Sonde2_2
					if V_typesonde == "THR918_00":
						V_poubelle = THR918N(V_trameutile)
						V_H_Sonde3_1.append (V_poubelle[0])
						V_H_Sonde3_2.append (V_poubelle[1])
						V_H_Sonde3_3.append (V_poubelle[2])
						V_Sonde3_1 = 0
						V_Sonde3_2 = 0
						V_Sonde3_3 = 0						
						for V_i in range(0,len(V_H_Sonde3_1),1):
							V_Sonde3_1 = V_Sonde3_1 + V_H_Sonde3_1[V_i]  
							V_Sonde3_2 = V_Sonde3_2 + V_H_Sonde3_2[V_i]
							V_Sonde3_3 = V_Sonde3_3 + V_H_Sonde3_3[V_i]
						V_Sonde3_1 = V_Sonde3_1 / len(V_H_Sonde3_1)
						V_Sonde3_2 = V_Sonde3_2 / len(V_H_Sonde3_2)
						V_Sonde3_3 = V_Sonde3_3 / len(V_H_Sonde3_3)
						S_Sonde3_1 = "%.1f" % V_Sonde3_1
						S_Sonde3_2 = "%.0f" % V_Sonde3_2
						S_Sonde3_3 = "%.0f" % V_Sonde3_3
						print V_H_Sonde3_1
						print S_Sonde3_1
						print V_H_Sonde3_2
						print S_Sonde3_2
						print V_H_Sonde3_3
						print S_Sonde3_3
					if V_typesonde == "CM113_00":
						V_poubelle = CM113(V_trameutile)
						V_H_CM113.append (V_poubelle)
						V_CM113 = 0
						for V_i in range(0,len(V_H_CM113),1):
							V_CM113 = V_CM113 + V_H_CM113[V_i]  
						V_CM113 = V_CM113 / len(V_H_CM113)
						S_CM113 = "%.0f" % V_CM113
						print V_H_CM113
						print S_CM113
					if V_typesonde == "X10_001":
						f = urllib.urlopen("http://api.nabaztag.com/vl/FR/api.jsp?sn=001D92105E42&token=1198627985&tts=%22la%20temperature%20exterieure%20est%20de%22" + V_lecture_capteurs[0] + "%20degre")
						print ("http://api.nabaztag.com/vl/FR/api.jsp?sn=001D92105E42&token=1198627985&tts=%22la%20temperature%20exterieure%20est%20de%22" + V_lecture_capteurs[0] + "%20degre")
					if V_typesonde == "X10_000":
						f = urllib.urlopen("http://api.nabaztag.com/vl/FR/api.jsp?sn=001D92105E42&token=1198627985&tts=%22l%27hygrometrie%20exterieure%20est%20de%20" + V_lecture_capteurs[1] + "%20pour%20100%22")
						print ("http://api.nabaztag.com/vl/FR/api.jsp?sn=001D92105E42&token=1198627985&tts=%22l%27hygrometrie%20exterieure%20est%20de%20" + V_lecture_capteurs[1] + "%20pour%20100%22")
					print "--------------"
				else:
					print "Trame ko"
					print "--------------"
 
			# Ecriture des données toutes les 5 minutes
			V_maintenant = datetime.datetime.now()
			V_minutestr = V_maintenant.strftime("%M")
			if ((V_minutestr[len(V_minutestr)-1] == "5") or (V_minutestr[len(V_minutestr)-1] == "0")):
				if not deja_ecrit:
					Ecriture_SQL()
					V_H_CM113 = []
					V_H_Sonde1_1 = []
					V_H_Sonde1_2 = []
					V_H_Sonde2_1 = []
					V_H_Sonde2_2 = []
					V_H_Sonde3_1 = []
					V_H_Sonde3_2 = []
					V_H_Sonde3_3 = []
					V_H_Sonde3_4 = []
					deja_ecrit = True
			else:
				deja_ecrit = False
			V_boucle = V_boucle + 1
		init_port_serie() 
except KeyboardInterrupt:
	# Fermeture de liaison série
	ser.close()
Categories: Projet Made by Sp@r0, Synology Tags:
  1. Tibo
    02/09/2011 à 14:30 | #1

    Salut Sparo,

    Juste une question: comment faire pour qu’après insmod, et redémarrage, les drivers (.ko) restent actifs et montés ? Je suis contraint à chaque redémarrage de refaire la procédure et ca m’ennuie…. Une idée ?

    Merci !

Les commentaires sont fermés.