Aller au contenu

Domotique X10 Rf Sur Ds110j


Messages recommandés

  • 2 mois après...
  • 3 semaines après...

Bonjor,

Pour ceux que cela intéresse, je viens de compiler un driver pour le contrôleur X10 CM19 bidirectionnel RF USB. Il sera utilisable avec le DSM 3.0 en effet la version 2.6.15 du noyau ne comporte pas les fonctions nécessaires pour la gestion des threads, je testé la compilation avec la 2.6.24 fournie par synology et ai intégré le module dans la hiérarchie du noyau.

On converse avec le driver de façon très simple :

echo +A1 > /dev/x10-cm19 met le device A1 on

echo -A1 > /dev/x10-cm19 l'éteint.......

A SUIVRE.

Cordialement.

Michel.

Dis moi, perso j'ai pas mal de domotique en X10 chez moi (volet roulant, éclairages etc.)

ils sont tous controlés par un CM15 que je n'ai jamais peu fair fonctionner sur mon DS110j bien sur .. lol et je ne suis pas le seul, est-ce que tu aurrai une solution maintenant que je suis passé en DS 3.0; Est-ce que tu aurai compilé une drivers compatible ?

De plus je ne connaissait pas le CM19 mais j'ai vue qu'il utilise la même API que le CM15 voir ici

Coté fonctionnel la différence entre le CM19 et CM15 c'est que le CM19 envoi les ordres par RF a un récepteur RF / X10 (par ex: Cm15) idem que pour une télécommande, alors que le CM15 envoi directement en X10 sur le courant puisque lui est connecté au secteur. j'ai bien compris ?

Merci de tes réponses.

A bientôt.

Lien vers le commentaire
Partager sur d’autres sites

Dis moi, perso j'ai pas mal de domotique en X10 chez moi (volet roulant, éclairages etc.)

ils sont tous controlés par un CM15 que je n'ai jamais peu fair fonctionner sur mon DS110j bien sur .. lol et je ne suis pas le seul, est-ce que tu aurrai une solution maintenant que je suis passé en DS 3.0; Est-ce que tu aurai compilé une drivers compatible ?

De plus je ne connaissait pas le CM19 mais j'ai vue qu'il utilise la même API que le CM15 voir ici

Coté fonctionnel la différence entre le CM19 et CM15 c'est que le CM19 envoi les ordres par RF a un récepteur RF / X10 (par ex: Cm15) idem que pour une télécommande, alors que le CM15 envoi directement en X10 sur le courant puisque lui est connecté au secteur. j'ai bien compris ?

Merci de tes réponses.

A bientôt.

Bonjour,

Non, je n'ai pas compilé pour le DSM 3.0 car le noyau de mon serveur de Bretagne (DS207+) reste en 2.6.15 et cela ne se compile pas avec ce noyau.

J'utilise le CM19 car je suis en triphasé et plutôt que d'acheter un coupleur de phases à un prix exorbitant, je mets un récepteur RF TM13 par phase et le tour est joué.

J'envisage de mettre un mini PC (GIADA à 220 €) sans clavier et sans écran sous windows avec le logiciel Homeseer qui est très complet et est controlable par internet.

Cordialement.

Michel.

PS : si tu souhaites une compilation, dis le moi en indiquant pour quel serveur et quel noyau et je te la ferai à l'occasion.

Lien vers le commentaire
Partager sur d’autres sites

  • 3 mois après...

Mise à jour du code support d'un type de sonde en plus, divers corrections ...


#!/usr/bin/env python2.5

# -*- coding: cp1252 -*-

#

#		Test du python par PSEIBEL

#		Essai de divers fonction

#		Auteur PSEIBEL 		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]==

	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]==

	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://localhost/ajout.php?table=capteur_00&valeur=" + S_Sonde1_1 + "&horodate=" + V_datevaleur)

		print ("http://localhost/ajout.php?table=capteur_00&valeur=" + S_Sonde1_1 + "&horodate=" + V_datevaleur)

		f = urllib.urlopen("http:/localhost/ajout.php?table=capteur_01&valeur=" + S_Sonde1_2 + "&horodate=" + V_datevaleur)

		print ("http://localhost/ajout.php?table=capteur_01&valeur=" + S_Sonde1_2 + "&horodate=" + V_datevaleur)

		f = urllib.urlopen("http://localhost/ajout.php?table=capteur_02&valeur=" + S_Sonde2_1 + "&horodate=" + V_datevaleur)

		print ("http://localhost/ajout.php?table=capteur_02&valeur=" + S_Sonde2_1 + "&horodate=" + V_datevaleur) 

		f = urllib.urlopen("http://localhost/ajout.php?table=capteur_03&valeur=" + S_Sonde2_2 + "&horodate=" + V_datevaleur)

		print ("http://localhost/ajout.php?table=capteur_03&valeur=" + S_Sonde2_1 + "&horodate=" + V_datevaleur)

		f = urllib.urlopen("http://localhost/ajout.php?table=capteur_04&valeur=" + S_CM113 + "&horodate=" + V_datevaleur)

		print ("http://localhost/ajout.php?table=capteur_04&valeur=" + S_CM113 + "&horodate=" + V_datevaleur)              		

		f = urllib.urlopen("http://localhost/ajout.php?table=capteur_05&valeur=" + S_Sonde3_1 + "&horodate=" + V_datevaleur)

		print ("http://localhost/ajout.php?table=capteur_05&valeur=" + S_Sonde3_1 + "&horodate=" + V_datevaleur) 

		f = urllib.urlopen("http://localhost/ajout.php?table=capteur_06&valeur=" + S_Sonde3_2 + "&horodate=" + V_datevaleur)

		print ("http://localhost/ajout.php?table=capteur_06&valeur=" + S_Sonde3_2 + "&horodate=" + V_datevaleur)

		f = urllib.urlopen("http://localhost/ajout.php?table=capteur_07&valeur=" + S_Sonde3_3 + "&horodate=" + V_datevaleur)

		print ("http://localhost/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

					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()



Lien vers le commentaire
Partager sur d’autres sites

  • 2 mois après...

Rejoindre la conversation

Vous pouvez publier maintenant et vous inscrire plus tard. Si vous avez un compte, connectez-vous maintenant pour publier avec votre compte.

Invité
Répondre à ce sujet…

×   Collé en tant que texte enrichi.   Coller en tant que texte brut à la place

  Seulement 75 émoticônes maximum sont autorisées.

×   Votre lien a été automatiquement intégré.   Afficher plutôt comme un lien

×   Votre contenu précédent a été rétabli.   Vider l’éditeur

×   Vous ne pouvez pas directement coller des images. Envoyez-les depuis votre ordinateur ou insérez-les depuis une URL.

×
×
  • Créer...

Information importante

Nous avons placé des cookies sur votre appareil pour aider à améliorer ce site. Vous pouvez choisir d’ajuster vos paramètres de cookie, sinon nous supposerons que vous êtes d’accord pour continuer.