DOMOTIQUE X10 POUR MODULE CM11

cs_azerty25 Messages postés 1114 Date d'inscription jeudi 19 décembre 2002 Statut Membre Dernière intervention 6 mai 2007 - 11 nov. 2005 à 09:55
cs_JLN Messages postés 371 Date d'inscription samedi 1 juin 2002 Statut Membre Dernière intervention 17 juin 2013 - 28 avril 2008 à 08:30
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/34574-domotique-x10-pour-module-cm11

cs_JLN Messages postés 371 Date d'inscription samedi 1 juin 2002 Statut Membre Dernière intervention 17 juin 2013
28 avril 2008 à 08:30
Promis je depose ici toute info sur ce sujet.
Merci encore pour ton aide.

@+ JLN
cs_Tropic Messages postés 90 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 1 février 2011
28 avril 2008 à 07:51
Je ne sais si il y a des modules gérent cette info.
Mais tous ce que j'ai eu em main ne l'avaient pas.
Certain ce met meme en OFF quand il y a une coupure de courant.Il faut dire que j'ai eu que Xdom comme marque.

Dans le fichier texte remis avec la source, il y a la fonction 'Status Request' donc il doit bien y avoir des appareils avec ces fonctions.

Fait des recherches sur X10 sur le net!
Tien moi au courant!

bonne chance!
cs_JLN Messages postés 371 Date d'inscription samedi 1 juin 2002 Statut Membre Dernière intervention 17 juin 2013
27 avril 2008 à 15:39
Quand tu dis que tu en connais aucun ca veut dire qu'il n'y a pas de module gérant cette info ? Et qu'il ne renvoi donc pas l'info suite à l'interro ?
Je dois être un peu lourd avec mes questions, mais je débute en X10.

Merci pour ta réponse Tropic,

@+ JLN
cs_Tropic Messages postés 90 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 1 février 2011
27 avril 2008 à 15:08
Tu ne peux interroger l'état d'un appreil que si se mode est implanté. (j'en connait aucun, mais ca veut rien dire)
Par contre, tous les commandes qui circulent sur le réseau électrique, tu les recoit avec mon code:
Donc, si un interrupteur(ou autre) X10 envoit une commande, tu vas le voir.

'ICI l'adresse de l'appareil qui recoit la commande
If axbData(0) = 0 Then

Debug.Print Chr$((&H60 And axbData(1)) - 31);
Debug.Print Choose((axbData(1) - &H60) + 1, 13, 5, 3, 11, 15, 7, 1, 9, 14, 6, 4, 12, 16, 8, 2, 10)

'ICI la Fonction qu'a recu l'appareil
ElseIf axbData(0) = 1 Then

Debug.Print Hex$(axbData(1)); XCount

End If

Commentaire du 13/12/2005 07:04:32
cs_JLN Messages postés 371 Date d'inscription samedi 1 juin 2002 Statut Membre Dernière intervention 17 juin 2013
25 avril 2008 à 07:56
Quelques mois se sont passé depuis les derniers posts, mais comme je suis intéréssé au plus haut point...

i2clogin : as-tu fais un post en .Net (ou VB6), car je ne le trouve pas, peux-tu s'il te plait poster ici ta réponse, merci.

Tropic : Merci pour cette exemple, j'ai utilisé l'ocx mais pas facile d'avoir de vrais explication sur son utilisation, j'aimerai par exemple connaitre l'état d'un objet (on/off par exemple) mais je n'y arrive pas (je suis nul par moment...)

Bonne prog à tous,
JLN
toupoeira Messages postés 1 Date d'inscription vendredi 14 décembre 2007 Statut Membre Dernière intervention 14 décembre 2007
14 déc. 2007 à 18:55
J'ai un actif X homeseer, qui permet d'effacer la cm11, algen je pourrais faire une routine afin gabarlo.
Un équilibre cordiale

PD (Bouteille Albariño et percebes), il nous fera plaisir
cs_Tropic Messages postés 90 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 1 février 2011
4 mai 2006 à 11:02
i2clogin, Merci pour cette version en .Net
Mais tu devrais poster ta version ;)
i2clogin Messages postés 1 Date d'inscription lundi 21 juillet 2003 Statut Membre Dernière intervention 30 avril 2006
30 avril 2006 à 19:41
Bonjour,

J'avais réalisé une classe VB.NET pour le module CM11 si cela peut vous rendre service.
Elle doit être finalisée mais elle est fonctionnelle :


Imports Microsoft.VisualBasic
Imports System
Imports System.IO
Imports System.Xml

Public Class X10CM11

' Event
Public Event X10Event(ByVal sender As Object, ByVal House As Char, ByVal Device As Char, _
ByVal Fcr As String, ByVal Level As String)

' Protocole CM11 / PC
Public Const CM11_TX_ACK As Byte = &H0 'acquittement checksum transmition
Public Const CM11_POL As Byte = &H5A ' polling
Public Const CM11_INIT As Byte = &HA5 ' Demande d'initialisation
Public Const CM11_POL_ACK As Byte = &HC3 'acquittement polling
Public Const CM11_READY As Byte = &H55 'interface prêt

Public Const CM11_STATUS_INIT As Byte = 1
Public Const CM11_STATUS_WAITNBR As Byte = 2
Public Const CM11_STATUS_WAITMASK As Byte = 3
Public Const CM11_STATUS_WAITDATA As Byte = 4
Public Const CM11_STATUS_RECEIVED As Byte = 5

' constantes Header
'Private Const ADDR As Byte = 4
'Private Const FUNC As Byte = 6
'Private Const EXTENDED_FUNC As Byte = 7

' Constantes Functions
Const X10_ALL_UNITS_OFF As Integer = 0
Const X10_ALL_LIGHTS_ON As Integer = 1
Const X10_ON As Integer = 2
Const X10_OFF As Integer = 3
Const X10_DIM As Integer = 4
Const X10_BRIGHT As Integer = 5
Const X10_ALL_LIGHTS_OFF As Integer = 6
Const X10_EXTENDED As Integer = 7
Const X10_HAIL_REQ As Integer = 8
Const X10_HAIL_ACK As Integer = 9
Const X10_STATUS_ON As Integer = 13
Const X10_STATUS_OFF As Integer = 14
Const X10_STATUS_REQUEST As Integer = 15

' Constantes House & Device
Const X10_A1 As Byte = 6
Const X10_B2 As Byte = 14
Const X10_C3 As Byte = 2
Const X10_D4 As Byte = 10
Const X10_E5 As Byte = 1
Const X10_F6 As Byte = 9
Const X10_G7 As Byte = 5
Const X10_H8 As Byte = 13
Const X10_I9 As Byte = 7
Const X10_J10 As Byte = 15
Const X10_K11 As Byte = 3
Const X10_L12 As Byte = 11
Const X10_M13 As Byte = 0
Const X10_N14 As Byte = 8
Const X10_O15 As Byte = 4
Const X10_P16 As Byte = 12

'Private Const INIT_OK As Integer = 0
'Private Const INIT_NO_CM_FOUND As Integer = 1
'Private Const COM_PORT_ERROR As Integer = 2

Private pErreur As Boolean = False
'Public Trame As String
Public Cm11Status As Byte = CM11_STATUS_INIT
Public Cm11ReceivedCarNbr As Integer = 0
Public Cm11CalculatedCarNbr As Integer = 0
Public Cm11Mask As Byte
Public Cm11RI As Boolean = False
Public Cm11Init As Boolean = False
Public Cm11Free As Boolean = False

Public Cm11RcvDB(20) As Byte
Public Cm11RcvOK As Boolean = False

Public Cm11LenBuffer As Integer

Structure strOrdreX10
Dim House As Char
Dim Device As Char
Dim Fct As String
Dim Level As String
Dim Init As Byte
End Structure

Public X10ListeOrdre(10) As strOrdreX10
Public X10ListeInd As Integer

Private WithEvents pMSComm As AxMSCommLib.AxMSComm

Public Function Create(ByVal MSComm As AxMSCommLib.AxMSComm) As Boolean
pMSComm = MSComm
End Function

Public Sub Init()
Dim buffOut As String

BuffOut = Chr(&H9B) + Chr(&H0) + Chr(&H0) + Chr(&H0) + Chr(&H0) + Chr(&H0) + Chr(&H60)
Send(BuffOut)

End Sub


' Initialisation & Ouverture port
Public Function Open(ByVal NumPort As Integer)
Dim InBuff As String
pMSComm.CommPort = NumPort
pMSComm.Settings = ConfigPortX10
pMSComm.InputLen = 0
pMSComm.RThreshold = 1
pMSComm.PortOpen = True
InBuff = pMSComm.Input ' vide le buffer

Call ClearListeX10() ' Efface la structure de sortie

Cm11Free = True

End Function

' fermeture port
Public Function Close()
pMSComm.PortOpen = False
End Function

Public Sub Send(ByRef Trame As String)
pMSComm.Output = Trame
End Sub

Private Sub pMSComm_OnComm(ByVal sender As Object, ByVal e As System.EventArgs) Handles pMSComm.OnComm
Dim InBuff As String

pErreur = False
Select Case pMSComm.CommEvent
Case comEventBreak ' Un événement d'arrêt a été reçu.
pErreur = True
Case comEventFrame ' Erreur de trame.
pErreur = True
Case comEventOverrun ' Perte de données.
pErreur = True
Case comEventRxOver ' Dépassement de capacité du tampon de réception.
pErreur = True
Case comEventRxParity ' Erreur de parité.
pErreur = True
Case comEventTxFull ' Tampon de transmission saturé.
pErreur = True
Case comEventDCB ' Erreur inattendue lors de la récupération de DCB]
pErreur = True

' Événements
Case comEvCD ' Modification dans la ligne CD.
Case comEvCTS ' Modification dans la ligne CTS.
Case comEvDSR ' Modification dans la ligne DSR.
Case comEvRing ' Modification dans l'indicateur d'appel.
Cm11RI = True
Cm11Status = CM11_STATUS_INIT
Case comEvReceive ' Réception d'un nombre RThreshold de caractères.
InBuff = pMSComm.Input
Cm11LenBuffer = Len(InBuff)
'Trame = Trame + InBuff
Call X10ReceiveChar(AscW(InBuff), InBuff, Cm11LenBuffer)
Case comEvSend ' Un nombre Sthreshold de caractères se trouve dans le tampon de transmission.
Case comEvEOF ' Un caractère indiquant la fin du fichier (EOF) a été trouvé dans le flux d'entrée.
End Select
End Sub

Private Sub X10ReceiveChar(ByVal InChar As Byte, ByVal InBuff As String, ByVal LenBuff As Integer)
Dim i As Integer
Dim c As Byte
Dim BuffOut As String

Cm11Free = False

For i = 1 To LenBuff
c = AscW(Mid(InBuff, i, 1))
'Trame = Trame + " " + Hex(c)

Select Case Cm11Status

Case CM11_STATUS_INIT
If c = CM11_POL Then ' Reception polling CM11
Send(Chr(CM11_POL_ACK))
Cm11ReceivedCarNbr = 0
If Cm11RcvOK = True Then
Call ClearListeX10()
Cm11RcvOK = False
End If
Cm11Status = CM11_STATUS_WAITNBR
ElseIf c = CM11_INIT Then ' Demande d'initialisation
BuffOut = Chr(&H9B) + Chr(&H0) + Chr(&H0) + Chr(&H0) + Chr(&H0) + Chr(&H0) + Chr(&H60)
Send(BuffOut)
Cm11ReceivedCarNbr = 0
If Cm11RcvOK = True Then
Call ClearListeX10()
Cm11RcvOK = False
End If
Cm11Status = CM11_STATUS_WAITNBR
Cm11Init = True
End If

Case CM11_STATUS_WAITNBR ' Nbr de caractères dans le buffer
Cm11CalculatedCarNbr = CInt(c)
Cm11Status = CM11_STATUS_WAITMASK

Case CM11_STATUS_WAITMASK ' Mask Functions / Address
Cm11Mask = c
Cm11ReceivedCarNbr = Cm11ReceivedCarNbr + 1
Cm11Status = CM11_STATUS_WAITDATA

Case CM11_STATUS_WAITDATA ' Data
Cm11RcvDB(Cm11ReceivedCarNbr - 1) = c
Cm11ReceivedCarNbr = Cm11ReceivedCarNbr + 1
If (Cm11ReceivedCarNbr >= Cm11CalculatedCarNbr) Then
Call AnalyseBuffer()
Cm11Status = CM11_STATUS_RECEIVED
End If

Case CM11_STATUS_RECEIVED

End Select
Next

Cm11Free = True

End Sub

Private Sub AnalyseBuffer()
Dim i As Integer = 0
Dim Maxlen As Integer
Dim mask As Byte
Dim tempHouse, tempDevice, tempFct As Integer
Dim templevel As Byte

Maxlen = Cm11CalculatedCarNbr - 2

While i <= Maxlen
Select Case i
Case 0
mask = 1
Case 1
mask = 2
Case 2
mask = 4
Case 3
mask = 8
Case 4
mask = 16
Case 5
mask = 32
Case 6
mask = 64
Case 7
mask = 128
End Select

If (Cm11Mask And mask) = 0 Then
' Decode adresse
tempHouse = (CInt(Cm11RcvDB(i)) And 240) \ 16
tempDevice = (CInt(Cm11RcvDB(i)) And 15)
X10ListeOrdre(X10ListeInd).House = X10toHC(tempHouse)
X10ListeOrdre(X10ListeInd).Device = X10toDC(tempDevice)
X10ListeOrdre(X10ListeInd).Init = 1

Else
' Decode fonction
tempFct = (CInt(Cm11RcvDB(i)) And 15)
Select Case tempFct
Case X10_DIM, X10_BRIGHT
i += 1
templevel = CInt(Cm11RcvDB(i))
X10ListeOrdre(X10ListeInd).Level = Str(templevel)
End Select
X10ListeOrdre(X10ListeInd).Fct = X10toFct(tempFct)
X10ListeOrdre(X10ListeInd).Init = 2
X10ListeInd = X10ListeInd + 1

End If

i += 1
End While

If X10ListeOrdre(X10ListeInd - 1).Init = 2 Then
Cm11RcvOK = True

RaiseEvent X10Event(Me, X10ListeOrdre(0).House, X10ListeOrdre(0).Device, _
X10ListeOrdre(0).Fct, X10ListeOrdre(0).Level)

tempHouse = 0
tempDevice = 0
tempFct = 0
templevel = 0

Call ClearListeX10()

End If

End Sub

Private Sub ClearListeX10()
Dim i As Integer

X10ListeInd = 0

For i = 1 To 4
X10ListeOrdre(i).House = ""
X10ListeOrdre(i).Device = ""
X10ListeOrdre(i).Fct = ""
X10ListeOrdre(i).Level = 0
X10ListeOrdre(i).Init = 0
Next

For i = 0 To 19
Cm11RcvDB(i) = 0
Next i

End Sub


Private Function X10toFct(ByVal Fct As Byte) As String

Select Case Fct
Case 2
Return ("On")
Case 3
Return ("Off")
Case 4
Return ("Dim")
Case 5
Return ("Bright")
Case 6
Return ("All lights off")
Case 7
Return ("Extended")
Case 8
Return ("Hail req")
Case 9
Return ("Hail ack")
Case 13
Return ("Status on")
Case 14
Return ("Status off")
Case 15
Return ("Status request")

End Select
End Function


Private Function strToX10(ByVal s As String) As Byte
Select Case s.ToUpper
Case "A", "1"
Return (X10_A1)
Case "B", "2"
Return (X10_B2)
Case "C", "3"
Return (X10_C3)
Case "D", "4"
Return (X10_D4)
Case "E", "5"
Return (X10_E5)
Case "F", "6"
Return (X10_F6)
Case "G", "7"
Return (X10_G7)
Case "H", "8"
Return (X10_H8)
Case "I", "9"
Return (X10_I9)
Case "J", "10"
Return (X10_J10)
Case "K", "11"
Return (X10_K11)
Case "L", "12"
Return (X10_L12)
Case "M", "13"
Return (X10_M13)
Case "N", "14"
Return (X10_N14)
Case "O", "15"
Return (X10_O15)
Case "P", "16"
Return (X10_P16)
End Select
End Function

Private Function X10toHC(ByVal hc As Integer) As String
Select Case hc
Case X10_A1
Return "A"
Case X10_B2
Return "B"
Case X10_C3
Return "C"
Case X10_D4
Return "D"
Case X10_E5
Return "E"
Case X10_F6
Return "F"
Case X10_G7
Return "G"
Case X10_H8
Return "H"
Case X10_I9
Return "I"
Case X10_J10
Return "J"
Case X10_K11
Return "K"
Case X10_L12
Return "L"
Case X10_M13
Return "M"
Case X10_N14
Return "N"
Case X10_O15
Return "N"
Case X10_P16
Return "P"
Case Else
Return "?"
End Select
End Function

Private Function X10toDC(ByVal hc As Integer) As String
Select Case hc
Case X10_A1
Return "1"
Case X10_B2
Return "2"
Case X10_C3
Return "3"
Case X10_D4
Return "4"
Case X10_E5
Return "5"
Case X10_F6
Return "6"
Case X10_G7
Return "7"
Case X10_H8
Return "8"
Case X10_I9
Return "9"
Case X10_J10
Return "A"
Case X10_K11
Return "B"
Case X10_L12
Return "C"
Case X10_M13
Return "D"
Case X10_N14
Return "E"
Case X10_O15
Return "F"
Case X10_P16
Return "G"
Case Else
Return "?"
End Select
End Function
End Class
cs_Tropic Messages postés 90 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 1 février 2011
13 déc. 2005 à 07:04
Comme tu as pu remarquer, toutes les fonctions sont implantées.
C'est juste que visuellement, il n'est pas géré.


'ENCORE DU BOULOT ICI ------------
If axbData(0) = 0 Then 'ICI décode l'adresse de l'appareil
Debug.Print Chr$((&H60 And axbData(1)) - 31);
Debug.Print Choose((axbData(1) - &H60) + 1, 13, 5, 3, 11, 15, 7, 1, 9, 14, 6, 4, 12, 16, 8, 2, 10)
ElseIf axbData(0) = 1 Then 'Decodage de la Fonction recu par l'appareil(reste à faire)
Debug.Print Hex$(axbData(1)); XCount
End If
mcarbenay Messages postés 3 Date d'inscription vendredi 2 juillet 2004 Statut Membre Dernière intervention 12 décembre 2005
12 déc. 2005 à 17:30
euh, au temps pour moi : j'avais pas vu que tu avais traité l'interface poll...
mcarbenay Messages postés 3 Date d'inscription vendredi 2 juillet 2004 Statut Membre Dernière intervention 12 décembre 2005
12 déc. 2005 à 17:26
Pas mal, mais tu ne traite que les éléments simples de X10 : uniquement l'envoi d'ordre (ce qui n'est déja pas si mal en fait).

Pour pouvoir gérer vraiment des périphériques, il te faudra aussi absolument gérer le 0xA5 (un peu plus en tout cas) et le 0x5A sinon ca risque de ne pas bien se passer. Si le interface poll est simple a gérer (après tout, il s'agit juste de lire ce que l'interface t'envoi est de faire la traduction inverse des devices codes et function codes), le power fail est un peu plus compliqué. (Je sais de quoi je parle, je l'ai fait en C# y a quelques jours. bon c'est pas la mort mais j'ai du réinitialiser 2 fois mon CM11 a cause de macros incorrectes.)

En tout cas bon courage, c'est sympa de voir que je ne suis pas le seul a me battre avec ces trucs !
cs_Tropic Messages postés 90 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 1 février 2011
11 nov. 2005 à 17:50
X10 est un protocol de communication entre appareil électrique.
Cm11 est un boiter de commande relier au port RS232.
On peux le comparé à un modem(il y a plusieurs marques et références) sauf qu'il communique à travers le réseau électrique pour envoyer ces ordres.
Ce programme permet d'envoyer ces commandes, et aussi de voir les commandes circulent sur le réseau.
Ex: - ordre arrivant d'un détecteur de présence
ou d'une télécommande.
- abaisser les volets roulants.
cs_azerty25 Messages postés 1114 Date d'inscription jeudi 19 décembre 2002 Statut Membre Dernière intervention 6 mai 2007
11 nov. 2005 à 09:55
Tu pourrai peut être détailler ce qu'est un X10 et CM11 ? Tout le monde ne sais pas, et sa peut être intéressant... ;)
Rejoignez-nous