Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
O
opcua-asyncio
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
1
Merge Requests
1
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Analytics
Analytics
CI / CD
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
Nikola Balog
opcua-asyncio
Commits
41d35625
Commit
41d35625
authored
Apr 16, 2015
by
Olivier R-D
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
eventing works between server and client
parent
443e4508
Changes
4
Hide whitespace changes
Inline
Side-by-side
Showing
4 changed files
with
49 additions
and
11 deletions
+49
-11
example-server.py
example-server.py
+1
-0
opcua/subscription.py
opcua/subscription.py
+33
-5
opcua/subscription_server.py
opcua/subscription_server.py
+4
-1
opcua/uatypes.py
opcua/uatypes.py
+11
-5
No files found.
example-server.py
View file @
41d35625
...
...
@@ -60,6 +60,7 @@ if __name__ == "__main__":
#creating an event object
myevent
=
server
.
get_event_object
(
ObjectIds
.
BaseEventType
)
myevent
.
Message
.
Text
=
"This is my event"
print
(
"My event is"
,
myevent
)
# starting!
...
...
opcua/subscription.py
View file @
41d35625
...
...
@@ -10,6 +10,13 @@ from opcua import ua
from
opcua
import
Node
from
opcua
import
ObjectIds
from
opcua
import
AttributeIds
from
opcua
import
Event
class
EventResult
():
def
__str__
(
self
):
return
"EventResult({})"
.
format
([
str
(
k
)
+
":"
+
str
(
v
)
for
k
,
v
in
self
.
__dict__
.
items
()])
__repr__
=
__str__
class
SubscriptionItemData
():
...
...
@@ -65,15 +72,34 @@ class Subscription(object):
def
_call_datachange
(
self
,
datachange
):
for
item
in
datachange
.
MonitoredItems
:
data
=
self
.
_monitoreditems_map
[
item
.
ClientHandle
]
self
.
_handler
.
data_change
(
data
.
server_handle
,
data
.
node
,
item
.
Value
.
Value
.
Value
,
data
.
attribute
)
try
:
self
.
_handler
.
data_change
(
data
.
server_handle
,
data
.
node
,
item
.
Value
.
Value
.
Value
,
data
.
attribute
)
except
Exception
:
self
.
logger
.
exception
(
"Exception calling data change handler"
)
def
_call_event
(
self
,
eventlist
):
print
(
eventlist
)
self
.
logger
.
warn
(
"Not implemented"
)
for
event
in
eventlist
.
Events
:
data
=
self
.
_monitoreditems_map
[
event
.
ClientHandle
]
try
:
#fields = {}
result
=
EventResult
()
for
idx
,
sattr
in
enumerate
(
data
.
mfilter
.
SelectClauses
):
if
len
(
sattr
.
BrowsePath
)
==
0
:
#fields[ua.AttributeIdsInv[sattr.AttributeId]] = event.EventFields[idx].Value
setattr
(
result
,
ua
.
AttributeIdsInv
[
sattr
.
AttributeId
],
event
.
EventFields
[
idx
].
Value
)
else
:
setattr
(
result
,
sattr
.
BrowsePath
[
0
].
Name
,
event
.
EventFields
[
idx
].
Value
)
#self._handler.event(data.server_handle, fields)
self
.
_handler
.
event
(
data
.
server_handle
,
result
)
except
Exception
:
self
.
logger
.
exception
(
"Exception calling event handler"
)
def
_call_status
(
self
,
status
):
print
(
status
)
self
.
logger
.
warn
(
"Not implemented"
)
try
:
self
.
_handler
.
status_change
(
status
.
Status
)
except
Exception
:
self
.
logger
.
exception
(
"Exception calling status change handler"
)
def
subscribe_data_change
(
self
,
node
,
attr
=
ua
.
AttributeIds
.
Value
):
return
self
.
_subscribe
(
node
,
attr
)
...
...
@@ -101,6 +127,7 @@ class Subscription(object):
def
subscribe_events
(
self
,
sourcenode
=
ObjectIds
.
Server
,
evtype
=
ObjectIds
.
BaseEventType
):
sourcenode
=
self
.
_get_node
(
sourcenode
)
evfilter
=
self
.
_get_filter_from_event_type
(
evtype
)
print
(
"EVFILTER is "
,
evfilter
)
return
self
.
_subscribe
(
sourcenode
,
AttributeIds
.
EventNotifier
,
evfilter
)
def
_subscribe
(
self
,
node
,
attr
,
mfilter
=
None
):
...
...
@@ -136,6 +163,7 @@ class Subscription(object):
data
.
node
=
node
data
.
attribute
=
attr
data
.
server_handle
=
result
.
MonitoredItemId
data
.
mfilter
=
ua
.
downcast_extobject
(
result
.
FilterResult
)
self
.
_monitoreditems_map
[
mparams
.
ClientHandle
]
=
data
return
result
.
MonitoredItemId
...
...
opcua/subscription_server.py
View file @
41d35625
...
...
@@ -373,8 +373,9 @@ class InternalSubscription(object):
def
trigger_event
(
self
,
event
):
with
self
.
_lock
:
if
not
event
.
SourceNode
in
self
.
_monitored_events
:
self
.
logger
.
debug
(
"%s has no
t subscription for events from node: %s"
,
self
,
event
.
SourceNode
)
self
.
logger
.
debug
(
"%s has no
subscription for events %s from node: %s"
,
self
,
event
,
event
.
SourceNode
)
return
False
self
.
logger
.
debug
(
"%s has subscription for events %s from node: %s"
,
self
,
event
,
event
.
SourceNode
)
mid
=
self
.
_monitored_events
[
event
.
SourceNode
]
if
not
mid
in
self
.
_monitored_items
:
self
.
logger
.
debug
(
"Could not find monitored items for id %s for event %s in subscription %s"
,
mid
,
event
,
self
)
...
...
@@ -382,6 +383,7 @@ class InternalSubscription(object):
item
=
self
.
_monitored_items
[
mid
]
fieldlist
=
ua
.
EventFieldList
()
fieldlist
.
ClientHandle
=
item
.
client_handle
print
(
"filter is "
,
item
.
parameters
.
FilterResult
,
" event is "
,
event
)
fieldlist
.
EventFields
=
self
.
_get_event_fields
(
item
.
parameters
.
FilterResult
,
event
)
self
.
_triggered_events
.
append
(
fieldlist
)
return
True
...
...
@@ -389,6 +391,7 @@ class InternalSubscription(object):
def
_get_event_fields
(
self
,
evfilter
,
event
):
fields
=
[]
for
sattr
in
evfilter
.
SelectClauses
:
print
(
"looking at sattrs"
,
sattr
)
try
:
if
not
sattr
.
BrowsePath
:
val
=
getattr
(
event
,
ua
.
AttributeIdsInv
[
sattr
.
Attribute
])
...
...
opcua/uatypes.py
View file @
41d35625
...
...
@@ -587,12 +587,18 @@ class Variant(object):
return
VariantType
.
ByteString
elif
type
(
val
)
==
datetime
:
return
VariantType
.
DateTime
elif
type
(
val
)
==
ExtensionObject
:
return
VariantType
.
ExtensionObject
elif
type
(
val
)
==
Variant
:
return
VariantType
.
Variant
else
:
raise
Exception
(
"Could not guess UA type of {} with type {}, specify UA type"
.
format
(
val
,
type
(
val
)))
if
isinstance
(
val
,
object
):
code
=
"VariantType.{}"
.
format
(
val
.
__class__
.
__name__
)
return
eval
(
code
)
else
:
#elif type(val) == ExtensionObject:
#return VariantType.ExtensionObject
#elif type(val) == Variant:
#return VariantType.Variant
#else:
raise
Exception
(
"Could not guess UA type of {} with type {}, specify UA type"
.
format
(
val
,
type
(
val
)))
def
__str__
(
self
):
return
"Variant(val:{},type:{})"
.
format
(
self
.
Value
,
self
.
VariantType
)
...
...
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