cs_azerty25
Messages postés1114Date d'inscriptionjeudi 19 décembre 2002StatutMembreDernière intervention 6 mai 2007
-
11 nov. 2005 à 09:55
cs_JLN
Messages postés371Date d'inscriptionsamedi 1 juin 2002StatutMembreDernière intervention17 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.
cs_JLN
Messages postés371Date d'inscriptionsamedi 1 juin 2002StatutMembreDernière intervention17 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és90Date d'inscriptionlundi 16 décembre 2002StatutMembreDerniè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és371Date d'inscriptionsamedi 1 juin 2002StatutMembreDernière intervention17 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és90Date d'inscriptionlundi 16 décembre 2002StatutMembreDerniè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
'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és371Date d'inscriptionsamedi 1 juin 2002StatutMembreDernière intervention17 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és1Date d'inscriptionvendredi 14 décembre 2007StatutMembreDernière intervention14 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és90Date d'inscriptionlundi 16 décembre 2002StatutMembreDerniè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és1Date d'inscriptionlundi 21 juillet 2003StatutMembreDernière intervention30 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
' 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
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és90Date d'inscriptionlundi 16 décembre 2002StatutMembreDerniè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és3Date d'inscriptionvendredi 2 juillet 2004StatutMembreDernière intervention12 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és3Date d'inscriptionvendredi 2 juillet 2004StatutMembreDernière intervention12 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és90Date d'inscriptionlundi 16 décembre 2002StatutMembreDerniè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és1114Date d'inscriptionjeudi 19 décembre 2002StatutMembreDerniè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... ;)
28 avril 2008 à 08:30
Merci encore pour ton aide.
@+ JLN
28 avril 2008 à 07:51
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!
27 avril 2008 à 15:39
Je dois être un peu lourd avec mes questions, mais je débute en X10.
Merci pour ta réponse Tropic,
@+ JLN
27 avril 2008 à 15:08
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
25 avril 2008 à 07:56
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
14 déc. 2007 à 18:55
Un équilibre cordiale
PD (Bouteille Albariño et percebes), il nous fera plaisir
4 mai 2006 à 11:02
Mais tu devrais poster ta version ;)
30 avril 2006 à 19:41
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
13 déc. 2005 à 07:04
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
12 déc. 2005 à 17:30
12 déc. 2005 à 17:26
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 !
11 nov. 2005 à 17:50
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.
11 nov. 2005 à 09:55