Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Contribute to GitLab
Sign in
Toggle navigation
P
Penguidom
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
domotika
Penguidom
Commits
eb80e75b
Commit
eb80e75b
authored
7 years ago
by
Franco (nextime) Lanza
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Map label names
parent
8722afa4
Changes
4
Expand all
Hide whitespace changes
Inline
Side-by-side
Showing
4 changed files
with
131 additions
and
144 deletions
+131
-144
mapping.py
penguidom/plugins/paradox/mapping.py
+1
-1
MG5050.py
penguidom/plugins/paradox/panels/MG5050.py
+68
-121
paradox.py
penguidom/plugins/paradox/paradox.py
+42
-19
paradox37b.py
penguidom/plugins/paradox/paradox37b.py
+20
-3
No files found.
penguidom/plugins/paradox/mapping.py
View file @
eb80e75b
...
...
@@ -155,7 +155,7 @@ class ParadoxRegisters(Singleton):
def
getzoneLabelRegister
(
self
):
return
self
.
registers
.
zoneLabel
def
getpartitionLabelRegister
():
def
getpartitionLabelRegister
(
self
):
return
self
.
registers
.
partitionLabel
def
getuserLabelRegister
(
self
):
...
...
This diff is collapsed.
Click to expand it.
penguidom/plugins/paradox/panels/MG5050.py
View file @
eb80e75b
This diff is collapsed.
Click to expand it.
penguidom/plugins/paradox/paradox.py
View file @
eb80e75b
...
...
@@ -39,10 +39,12 @@ from mapping import EVENTMAP, REGISTERS
SERIAL_PORT
=
"/dev/ttyS0"
BAUDRATE
=
9600
PKTTIMEOUT
=
2
# Seconds
REPLYTIMEOUT
=
1
# Seconds
BOARDTYPE
=
"MG5050"
# Just a default
PKTTIMEOUT
=
2
# Seconds before discard incorrect lenght packets
REPLYTIMEOUT
=
1
# Seconds before to start reply checks
SEND_INTERVAL
=
.5
# Seconds between messages sent
REPLY_INTERVAL
=
.3
# Seconds between reply checks
class
ParadoxProtocol
(
BaseProtocol
):
...
...
@@ -86,8 +88,8 @@ class ParadoxProtocol(BaseProtocol):
elif
len
(
self
.
packet
)
>
0
:
self
.
packettimeout
=
time
.
time
()
def
_queueSendData
(
self
,
data
,
callback
=
False
,
expected_reply
=
Non
e
):
self
.
sendqueue
+=
[{
'msg'
:
data
,
'cb'
:
callback
,
'try'
:
3
,
'expected_reply'
:
expected_reply
}]
def
_queueSendData
(
self
,
data
,
callback
=
False
,
expected_reply
=
False
,
callback_args
=
Fals
e
):
self
.
sendqueue
+=
[{
'msg'
:
data
,
'cb'
:
callback
,
'try'
:
3
,
'expected_reply'
:
expected_reply
,
'callback_args'
:
callback_args
}]
reactor
.
callLater
(
0
,
self
.
_processSendQueue
)
def
_processQueue
(
self
):
...
...
@@ -96,17 +98,17 @@ class ParadoxProtocol(BaseProtocol):
if
expected
:
if
isinstance
(
expected
,
(
list
,
tuple
)):
for
i
in
expected
:
if
p37b
.
checkCmd
(
replystart
,
i
):
if
p37b
.
checkCmd
(
replystart
,
i
,
nibble
=
True
):
return
True
else
:
if
p37b
.
checkCmd
(
replystart
,
expected
):
if
p37b
.
checkCmd
(
replystart
,
expected
,
nibble
=
True
):
return
True
else
:
return
True
return
False
if
len
(
self
.
queue
)
>
0
:
if
p37b
.
checkCmd
(
ord
(
self
.
queue
[
0
][
0
]),
p37b
.
CMD_EVENT
):
if
p37b
.
checkCmd
(
ord
(
self
.
queue
[
0
][
0
]),
p37b
.
CMD_EVENT
,
nibble
=
True
):
reactor
.
callLater
(
0
,
self
.
_processEvent
,
self
.
queue
[
0
])
else
:
if
len
(
self
.
replyqueue
)
>
0
:
...
...
@@ -116,7 +118,7 @@ class ParadoxProtocol(BaseProtocol):
# until the reply is received, but it would be more error
# prone that way...
if
self
.
replyqueue
[
0
][
'cb'
]
and
callable
(
self
.
replyqueue
[
0
][
'cb'
]):
reactor
.
callLater
(
0
,
self
.
replyqueue
[
0
][
'cb'
],
self
.
queue
[
0
])
reactor
.
callLater
(
0
,
self
.
replyqueue
[
0
][
'cb'
],
self
.
queue
[
0
]
,
self
.
replyqueue
[
0
][
'callback_args'
]
)
del
self
.
replyqueue
[
0
]
else
:
if
isinstance
(
self
.
replyqueue
[
0
][
'expected_reply'
],
(
list
,
tuple
)):
...
...
@@ -138,7 +140,7 @@ class ParadoxProtocol(BaseProtocol):
self
.
transport
.
write
(
packet
)
reactor
.
callLater
(
REPLYTIMEOUT
,
self
.
_checkReplies
)
else
:
reactor
.
callLater
(
.1
,
self
.
_processSendQueue
)
reactor
.
callLater
(
SEND_INTERVAL
,
self
.
_processSendQueue
)
def
_checkReplies
(
self
):
if
len
(
self
.
replyqueue
)
>
0
:
...
...
@@ -146,7 +148,7 @@ class ParadoxProtocol(BaseProtocol):
if
self
.
replyqueue
[
0
][
'try'
]
>
0
:
self
.
replyqueue
[
0
][
'try'
]
-=
1
self
.
sendqueue
+=
[
self
.
replyqueue
[
0
]]
reactor
.
callLater
(
.
1
,
self
.
_processSendQueue
,
False
)
reactor
.
callLater
(
.
3
,
self
.
_processSendQueue
,
False
)
else
:
self
.
log
.
error
(
"FAILED TO SEND MESSAGE: "
+
''
.
join
(
[
"
\\
x
%02
X"
%
ord
(
x
)
for
x
in
self
.
replyqueue
[
0
][
'msg'
]
]
)
.
strip
())
del
self
.
replyqueue
[
0
]
...
...
@@ -181,16 +183,16 @@ class ParadoxProtocol(BaseProtocol):
self
.
write
(
p37b
.
MSG_SYNC
,
self
.
_replySync
,
expected_reply
=
p37b
.
REPLY_SYNC
)
def
write
(
self
,
message
,
reply_callback
=
False
,
expected_reply
=
False
):
self
.
_queueSendData
(
p37b
.
format37ByteMessage
(
message
),
reply_callback
,
expected_reply
)
def
write
(
self
,
message
,
reply_callback
=
False
,
expected_reply
=
False
,
callback_args
=
False
):
self
.
_queueSendData
(
p37b
.
format37ByteMessage
(
message
),
reply_callback
,
expected_reply
,
callback_args
)
def
_replySync
(
self
,
reply
):
def
_replySync
(
self
,
reply
,
cbargs
):
self
.
log
.
debug
(
"REPLY SYNC RECEIVED"
)
self
.
write
(
reply
,
self
.
_endHandshacke
)
def
_endHandshacke
(
self
,
reply
=
None
):
def
_endHandshacke
(
self
,
reply
=
None
,
cbargs
=
None
):
# XXX Here things starts to get weird.
# I have no idea of what exactly those two messages do,
# but they seems to be needed for the initial handshake
...
...
@@ -199,11 +201,11 @@ class ParadoxProtocol(BaseProtocol):
#
# After the end of the handshake we proceed to map zone names,
# so, callback for last message drive the runflow in that direction.
self
.
write
(
p37b
.
MSG_UNKWNOWN_HS1
)
self
.
write
(
p37b
.
MSG_UNKWNOWN_HS2
,
self
.
mapNames
)
self
.
write
(
p37b
.
MSG_UNKWNOWN_HS1
,
expected_reply
=
p37b
.
REPLY_QUERY
)
self
.
write
(
p37b
.
MSG_UNKWNOWN_HS2
,
self
.
mapNames
,
expected_reply
=
p37b
.
REPLY_QUERY
)
def
_detectBoard
(
self
,
reply
):
def
_detectBoard
(
self
,
reply
,
cbargs
=
None
):
board
=
p37b
.
getPanelName
(
reply
)
self
.
log
.
info
(
'Detected Panel Board as '
+
board
)
if
self
.
autodetect
:
...
...
@@ -220,13 +222,34 @@ class ParadoxProtocol(BaseProtocol):
pass
def
mapNames
(
self
,
reply
=
None
):
def
_setNames
(
self
,
reply
,
item
):
if
item
in
REGISTERS
.
getsupportedItems
():
reglist
=
getattr
(
REGISTERS
,
'get'
+
item
+
'Register'
)()
setfunc
=
getattr
(
EVENTMAP
,
'set'
+
item
)
reg
=
reply
[
1
:
4
]
if
reg
in
reglist
.
keys
():
nums
=
reglist
[
reg
]
for
num
in
range
(
0
,
len
(
nums
)):
if
nums
[
num
]
is
not
None
:
label
=
reply
[
4
+
(
16
*
num
):
20
+
(
16
*
num
)]
.
strip
()
self
.
log
.
info
(
'Set label for '
+
item
+
' '
+
str
(
nums
[
num
])
+
' as
\"
'
+
label
+
'
\"
'
)
setfunc
(
nums
[
num
],
label
)
def
_mapItemNames
(
self
,
item
):
try
:
items
=
getattr
(
REGISTERS
,
'get'
+
item
+
'Register'
)()
for
i
in
items
.
keys
():
self
.
write
(
p37b
.
SEND_QUERY
+
i
,
self
.
_setNames
,
expected_reply
=
p37b
.
REPLY_QUERY
,
callback_args
=
item
)
except
:
self
.
log
.
error
(
"Cannot find item named "
+
item
+
" in registers"
)
def
mapNames
(
self
,
reply
=
None
,
cbargs
=
None
):
if
self
.
mapnames
:
self
.
log
.
info
(
"Start Mapping names..."
)
self
.
log
.
info
(
"Supported Items:"
)
for
i
in
REGISTERS
.
getsupportedItems
():
self
.
log
.
info
(
" "
+
i
)
reactor
.
callLater
(
0
,
self
.
_mapItemNames
,
i
)
class
ParadoxTCPProxy
(
Protocol
):
...
...
This diff is collapsed.
Click to expand it.
penguidom/plugins/paradox/paradox37b.py
View file @
eb80e75b
...
...
@@ -102,8 +102,17 @@ CMD_EVENT = 0xe
# 36 0xXX Checksum
def
checkCmd
(
byte
,
cmd
):
return
(
byte
>>
4
)
==
cmd
def
checkCmd
(
msg
,
cmd
,
nibble
=
False
):
if
isinstance
(
cmd
,
str
):
if
isinstance
(
msg
,
str
):
if
len
(
msg
)
>=
len
(
cmd
):
return
msg
[:
len
(
cmd
)]
==
cmd
return
False
if
isinstance
(
msg
,
str
):
msg
=
ord
(
msg
[
0
])
if
nibble
:
return
(
msg
>>
4
)
==
cmd
return
msg
==
cmd
# XXX I don't really like i don't fully understand
...
...
@@ -121,11 +130,17 @@ MSG_SYNC= '\x5F\x20\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0
MSG_UNKWNOWN_HS1
=
'
\x50\x00\x1F\xE0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4F
'
MSG_UNKWNOWN_HS2
=
'
\x50\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x50
'
# Command sent starts with
SEND_QUERY
=
'
\x50
'
SEND_CONTROL
=
'
\x40
'
# Expected replies command
REPLY_CONNECT
=
0x7
REPLY_GETSTATUS
=
[
0x5
,
0x7
]
REPLY_SYNC
=
0x0
REPLY_QUERY
=
0x5
def
checkSumCalc
(
message
):
checksum
=
0
...
...
@@ -150,3 +165,5 @@ def getPanelName(message):
return
str
(
message
[
28
:
36
])
.
strip
(
'
\x00
'
)
This diff is collapsed.
Click to expand it.
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment