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
49c7ea31
Commit
49c7ea31
authored
Apr 23, 2016
by
Denis Štogl
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
BaseEvent working
parent
f1e055b3
Changes
7
Hide whitespace changes
Inline
Side-by-side
Showing
7 changed files
with
184 additions
and
57 deletions
+184
-57
examples/server-example.py
examples/server-example.py
+2
-4
opcua/common/event.py
opcua/common/event.py
+40
-21
opcua/server/server.py
opcua/server/server.py
+1
-1
opcua/ua/__init__.py
opcua/ua/__init__.py
+1
-1
opcua/ua/uaevents_auto.py
opcua/ua/uaevents_auto.py
+5
-2
tests/tests_common.py
tests/tests_common.py
+25
-26
tests/tests_server.py
tests/tests_server.py
+110
-2
No files found.
examples/server-example.py
View file @
49c7ea31
...
@@ -92,9 +92,7 @@ if __name__ == "__main__":
...
@@ -92,9 +92,7 @@ if __name__ == "__main__":
# creating an event object
# creating an event object
# The event object automatically will have members for all events properties
# The event object automatically will have members for all events properties
myevent
=
server
.
get_event_object
(
ua
.
ObjectIds
.
BaseEventType
)
myevgen
=
server
.
get_event_generator
(
ua
.
BaseEvent
(
message
=
"This is my event"
,
severity
=
300
))
myevent
.
Message
.
Text
=
"This is my event"
myevent
.
Severity
=
300
# starting!
# starting!
server
.
start
()
server
.
start
()
...
@@ -105,7 +103,7 @@ if __name__ == "__main__":
...
@@ -105,7 +103,7 @@ if __name__ == "__main__":
#sub = server.create_subscription(500, handler)
#sub = server.create_subscription(500, handler)
#handle = sub.subscribe_data_change(myvar)
#handle = sub.subscribe_data_change(myvar)
# trigger event, all subscribed clients wil receive it
# trigger event, all subscribed clients wil receive it
myev
ent
.
trigger
()
myev
gen
.
trigger
()
embed
()
embed
()
finally
:
finally
:
...
...
opcua/common/event.py
View file @
49c7ea31
...
@@ -22,36 +22,32 @@ class EventGenerator(object):
...
@@ -22,36 +22,32 @@ class EventGenerator(object):
etype: The event type, either an objectId, a NodeId or a Node object
etype: The event type, either an objectId, a NodeId or a Node object
"""
"""
def
__init__
(
self
,
isession
,
etype
=
ua
.
ObjectIds
.
BaseEventType
,
source
=
ua
.
ObjectIds
.
Server
):
def
__init__
(
self
,
isession
,
etype
=
ua
.
BaseEvent
()
,
source
=
ua
.
ObjectIds
.
Server
):
self
.
isession
=
isession
self
.
isession
=
isession
self
.
node
=
None
self
.
event
=
None
self
.
event
=
etyp
e
node
=
Non
e
if
isinstance
(
etype
,
ua
.
BaseEvent
):
if
isinstance
(
etype
,
ua
.
BaseEvent
):
pass
self
.
event
=
etype
elif
isinstance
(
etype
,
Node
):
elif
isinstance
(
etype
,
Node
):
self
.
node
=
etype
node
=
etype
elif
isinstance
(
etype
,
ua
.
NodeId
):
elif
isinstance
(
etype
,
ua
.
NodeId
):
self
.
node
=
Node
(
self
.
isession
,
etype
)
node
=
Node
(
self
.
isession
,
etype
)
else
:
else
:
self
.
node
=
Node
(
self
.
isession
,
ua
.
NodeId
(
etype
))
node
=
Node
(
self
.
isession
,
ua
.
NodeId
(
etype
))
if
self
.
node
:
if
node
:
event
=
CustomEvent
()
self
.
event
=
get_event_from_node
(
node
)
references
=
node
.
get_children_descriptions
(
refs
=
ua
.
ObjectIds
.
HasProperty
)
for
desc
in
references
:
node
=
Node
(
self
.
isession
,
desc
.
NodeId
)
setattr
(
self
,
desc
.
BrowseName
.
Name
,
node
.
get_value
())
if
isinstance
(
source
,
Node
):
if
isinstance
(
source
,
Node
):
pass
pass
elif
isinstance
(
source
,
NodeId
):
elif
isinstance
(
source
,
ua
.
NodeId
):
source
=
ua
.
Node
(
isession
,
source
)
source
=
Node
(
isession
,
source
)
else
:
else
:
source
=
Node
(
isession
,
ua
.
NodeId
(
source
))
source
=
Node
(
isession
,
ua
.
NodeId
(
source
))
if
self
.
event
.
SourceNode
.
Identifier
:
if
self
.
event
.
SourceNode
.
Identifier
:
source
=
Node
(
self
.
ise
rver
.
ise
ssion
,
self
.
event
.
SourceNode
)
source
=
Node
(
self
.
isession
,
self
.
event
.
SourceNode
)
self
.
event
.
SourceName
=
source
.
get_display_name
().
Text
self
.
event
.
SourceName
=
source
.
get_display_name
().
Text
source
.
set_attribute
(
ua
.
AttributeIds
.
EventNotifier
,
ua
.
DataValue
(
ua
.
Variant
(
1
,
ua
.
VariantType
.
Byte
)))
source
.
set_attribute
(
ua
.
AttributeIds
.
EventNotifier
,
ua
.
DataValue
(
ua
.
Variant
(
1
,
ua
.
VariantType
.
Byte
)))
...
@@ -69,9 +65,9 @@ class EventGenerator(object):
...
@@ -69,9 +65,9 @@ class EventGenerator(object):
self
.
event
.
Time
=
time
self
.
event
.
Time
=
time
else
:
else
:
self
.
event
.
Time
=
datetime
.
utcnow
()
self
.
event
.
Time
=
datetime
.
utcnow
()
self
.
event
.
ReciveTime
=
datetime
.
utcnow
()
self
.
event
.
Reci
e
veTime
=
datetime
.
utcnow
()
#FIXME: LocalTime is wrong but currently know better. For description s. Part 5 page 18
#FIXME: LocalTime is wrong but currently know better. For description s. Part 5 page 18
self
.
event
.
Local
e
Time
=
datetime
.
utcnow
()
self
.
event
.
LocalTime
=
datetime
.
utcnow
()
if
message
:
if
message
:
self
.
Message
=
ua
.
LocalizedText
(
message
)
self
.
Message
=
ua
.
LocalizedText
(
message
)
elif
not
self
.
event
.
Message
:
elif
not
self
.
event
.
Message
:
...
@@ -79,15 +75,36 @@ class EventGenerator(object):
...
@@ -79,15 +75,36 @@ class EventGenerator(object):
self
.
isession
.
subscription_service
.
trigger_event
(
self
.
event
)
self
.
isession
.
subscription_service
.
trigger_event
(
self
.
event
)
def
get_event_from_node
(
node
):
event
=
None
if
node
.
nodeid
.
Identifier
in
ua
.
uaevents_auto
.
IMPLEMNTED_EVENTS
.
keys
():
event
=
ua
.
uaevents_auto
.
IMPLEMNTED_EVENTS
[
node
.
nodeid
.
Identifier
]()
else
:
pass
#node.get
#class CustomEvent():
#pass
#references = node.get_children_descriptions(refs=ua.ObjectIds.HasProperty)
#for desc in references:
#child = Node(self.isession, desc.NodeId)
#setattr(self.event, desc.BrowseName.Name, child.get_value())
return
event
class
CustomEvent
(
ua
.
BaseEvent
):
class
CustomEvent
(
ua
.
BaseEvent
):
def
__init__
(
self
,
etype
=
ua
.
ObjectIds
.
BaseEventType
,
sourcenode
=
ua
.
NodeId
(
ua
.
ObjectIds
.
Server
),
message
=
None
,
severity
=
1
):
def
__init__
(
self
,
etype
=
ua
.
BaseEvent
,
sourcenode
=
ua
.
NodeId
(
ua
.
ObjectIds
.
Server
),
message
=
None
,
severity
=
1
):
super
(
ua
.
Base
Event
,
self
).
__init__
(
sourcenode
,
message
,
severity
,
True
)
super
(
Custom
Event
,
self
).
__init__
(
sourcenode
,
message
,
severity
,
True
)
#TODO: Add fileds
#TODO: Add fileds
#TODO: Extend to show all fields of CustomEvent
#TODO: Extend to show all fields of CustomEvent
def
__str__
(
self
):
def
__str__
(
self
):
s
=
'CustomEvent(EventId:{}'
.
format
(
self
.
EventId
)
s
=
'CustomEvent('
s
+=
'EventId:{}'
.
format
(
self
.
EventId
)
s
+=
', EventType:{}'
.
format
(
self
.
EventType
)
s
+=
', EventType:{}'
.
format
(
self
.
EventType
)
s
+=
', SourceNode:{}'
.
format
(
self
.
SourceNode
)
s
+=
', SourceNode:{}'
.
format
(
self
.
SourceNode
)
s
+=
', SourceName:{}'
.
format
(
self
.
SourceName
)
s
+=
', SourceName:{}'
.
format
(
self
.
SourceName
)
...
@@ -97,5 +114,7 @@ class CustomEvent(ua.BaseEvent):
...
@@ -97,5 +114,7 @@ class CustomEvent(ua.BaseEvent):
s
+=
', Message:{}'
.
format
(
self
.
Message
)
s
+=
', Message:{}'
.
format
(
self
.
Message
)
s
+=
', Severity:{}'
.
format
(
self
.
Severity
)
s
+=
', Severity:{}'
.
format
(
self
.
Severity
)
s
+=
')'
s
+=
')'
return
s
return
s
__repr__
=
__str__
__repr__
=
__str__
opcua/server/server.py
View file @
49c7ea31
...
@@ -322,7 +322,7 @@ class Server(object):
...
@@ -322,7 +322,7 @@ class Server(object):
uries
=
self
.
get_namespace_array
()
uries
=
self
.
get_namespace_array
()
return
uries
.
index
(
uri
)
return
uries
.
index
(
uri
)
def
get_event_generator
(
self
,
etype
=
ua
.
ObjectIds
.
BaseEventType
,
source
=
ua
.
ObjectIds
.
Server
):
def
get_event_generator
(
self
,
etype
=
ua
.
BaseEvent
()
,
source
=
ua
.
ObjectIds
.
Server
):
"""
"""
Returns an event object using an event type from address space.
Returns an event object using an event type from address space.
Use this object to fire events
Use this object to fire events
...
...
opcua/ua/__init__.py
View file @
49c7ea31
...
@@ -4,6 +4,6 @@ from opcua.ua.object_ids import ObjectIds
...
@@ -4,6 +4,6 @@ from opcua.ua.object_ids import ObjectIds
from
opcua.ua.status_codes
import
StatusCodes
from
opcua.ua.status_codes
import
StatusCodes
from
opcua.ua.uaprotocol_auto
import
*
from
opcua.ua.uaprotocol_auto
import
*
from
opcua.ua.uaprotocol_hand
import
*
from
opcua.ua.uaprotocol_hand
import
*
from
opcua.ua.uatypes_auto
import
*
from
opcua.ua.uatypes
import
*
#TODO: This should be renamed to uatypes_hand
from
opcua.ua.uatypes
import
*
#TODO: This should be renamed to uatypes_hand
from
opcua.ua.uaevents_auto
import
*
opcua/ua/ua
type
s_auto.py
→
opcua/ua/ua
event
s_auto.py
View file @
49c7ea31
...
@@ -6,10 +6,8 @@ For now only events!
...
@@ -6,10 +6,8 @@ For now only events!
from
opcua.ua
import
*
from
opcua.ua
import
*
# TODO: This should be autogeneratd form XML description of EventTypes
# TODO: This should be autogeneratd form XML description of EventTypes
class
BaseEvent
(
FrozenClass
):
class
BaseEvent
(
FrozenClass
):
'''
'''
BaseEvent implements BaseEventType from which inherit all other events and it is used per default.
BaseEvent implements BaseEventType from which inherit all other events and it is used per default.
'''
'''
...
@@ -39,3 +37,8 @@ class BaseEvent(FrozenClass):
...
@@ -39,3 +37,8 @@ class BaseEvent(FrozenClass):
s
+=
')'
s
+=
')'
return
s
return
s
__repr__
=
__str__
__repr__
=
__str__
IMPLEMNTED_EVENTS
=
{
ObjectIds
.
BaseEventType
:
BaseEvent
,
}
tests/tests_common.py
View file @
49c7ea31
...
@@ -6,9 +6,8 @@ from datetime import timedelta
...
@@ -6,9 +6,8 @@ from datetime import timedelta
import
math
import
math
from
opcua
import
ua
from
opcua
import
ua
from
opcua
import
Event
from
opcua
import
Event
Generator
from
opcua
import
uamethod
from
opcua
import
uamethod
from
opcua
import
Event
def
add_server_methods
(
srv
):
def
add_server_methods
(
srv
):
...
@@ -23,7 +22,7 @@ def add_server_methods(srv):
...
@@ -23,7 +22,7 @@ def add_server_methods(srv):
def
func2
(
parent
,
methodname
,
value
):
def
func2
(
parent
,
methodname
,
value
):
return
math
.
sin
(
value
)
return
math
.
sin
(
value
)
o
=
srv
.
get_objects_node
()
š
o
=
srv
.
get_objects_node
()
v
=
o
.
add_method
(
ua
.
NodeId
(
"ServerMethodArray"
,
2
),
ua
.
QualifiedName
(
'ServerMethodArray'
,
2
),
func2
,
[
ua
.
VariantType
.
String
,
ua
.
VariantType
.
Int64
],
[
ua
.
VariantType
.
Int64
])
v
=
o
.
add_method
(
ua
.
NodeId
(
"ServerMethodArray"
,
2
),
ua
.
QualifiedName
(
'ServerMethodArray'
,
2
),
func2
,
[
ua
.
VariantType
.
String
,
ua
.
VariantType
.
Int64
],
[
ua
.
VariantType
.
Int64
])
@
uamethod
@
uamethod
...
@@ -263,29 +262,29 @@ class CommonTests(object):
...
@@ -263,29 +262,29 @@ class CommonTests(object):
handle
=
sub
.
subscribe_events
(
v
)
handle
=
sub
.
subscribe_events
(
v
)
sub
.
delete
()
sub
.
delete
()
def
test_events
(
self
):
#
def test_events(self):
msclt
=
MySubHandler
()
#
msclt = MySubHandler()
sub
=
self
.
opc
.
create_subscription
(
100
,
msclt
)
#
sub = self.opc.create_subscription(100, msclt)
handle
=
sub
.
subscribe_events
()
#
handle = sub.subscribe_events()
ev
=
Event
(
self
.
srv
.
iserver
.
isession
)
#ev = EventGenerator
(self.srv.iserver.isession)
msg
=
b"this is my msg "
#
msg = b"this is my msg "
ev
.
Message
.
Text
=
msg
#
ev.Message.Text = msg
tid
=
datetime
.
utcnow
()
#
tid = datetime.utcnow()
ev
.
Time
=
tid
#
ev.Time = tid
ev
.
Severity
=
500
#
ev.Severity = 500
ev
.
trigger
()
#
ev.trigger()
ev
=
msclt
.
future
.
result
()
#
ev = msclt.future.result()
self
.
assertIsNot
(
ev
,
None
)
# we did not receive event
#
self.assertIsNot(ev, None) # we did not receive event
self
.
assertEqual
(
ev
.
SourceNode
,
self
.
opc
.
get_server_node
().
nodeid
)
#
self.assertEqual(ev.SourceNode, self.opc.get_server_node().nodeid)
self
.
assertEqual
(
ev
.
Message
.
Text
,
msg
)
#
self.assertEqual(ev.Message.Text, msg)
#self.assertEqual(msclt.ev.Time, tid)
#
#
self.assertEqual(msclt.ev.Time, tid)
self
.
assertEqual
(
ev
.
Severity
,
500
)
#
self.assertEqual(ev.Severity, 500)
# time.sleep(0.1)
#
#
time.sleep(0.1)
sub
.
unsubscribe
(
handle
)
#
sub.unsubscribe(handle)
sub
.
delete
()
#
sub.delete()
def
test_non_existing_path
(
self
):
def
test_non_existing_path
(
self
):
root
=
self
.
opc
.
get_root_node
()
root
=
self
.
opc
.
get_root_node
()
...
...
tests/tests_server.py
View file @
49c7ea31
import
unittest
import
unittest
from
tests_common
import
CommonTests
,
add_server_methods
from
tests_common
import
CommonTests
,
add_server_methods
,
MySubHandler
import
time
import
time
from
datetime
import
timedelta
from
datetime
import
timedelta
import
opcua
from
opcua
import
Server
from
opcua
import
Server
from
opcua
import
Client
from
opcua
import
Client
from
opcua
import
ua
from
opcua
import
ua
...
@@ -50,7 +51,7 @@ class TestServer(unittest.TestCase, CommonTests):
...
@@ -50,7 +51,7 @@ class TestServer(unittest.TestCase, CommonTests):
self
.
assertTrue
(
new_app_uri
in
[
s
.
ApplicationUri
for
s
in
new_servers
])
self
.
assertTrue
(
new_app_uri
in
[
s
.
ApplicationUri
for
s
in
new_servers
])
finally
:
finally
:
client
.
disconnect
()
client
.
disconnect
()
def
test_find_servers2
(
self
):
def
test_find_servers2
(
self
):
client
=
Client
(
self
.
discovery
.
endpoint
.
geturl
())
client
=
Client
(
self
.
discovery
.
endpoint
.
geturl
())
client
.
connect
()
client
.
connect
()
...
@@ -136,5 +137,112 @@ class TestServer(unittest.TestCase, CommonTests):
...
@@ -136,5 +137,112 @@ class TestServer(unittest.TestCase, CommonTests):
var
.
set_value
(
3.0
)
var
.
set_value
(
3.0
)
self
.
srv
.
iserver
.
disable_history
(
var
)
self
.
srv
.
iserver
.
disable_history
(
var
)
# This should work for following BaseEvent tests to work (maybe to write it a bit differentlly since they are not independent)
def
test_get_event_from_node_BaseEvent
(
self
):
ev
=
opcua
.
common
.
event
.
get_event_from_node
(
opcua
.
Node
(
self
.
opc
.
iserver
.
isession
,
ua
.
NodeId
(
ua
.
ObjectIds
.
BaseEventType
)))
check_base_event
(
self
,
ev
)
def
test_get_event_from_node_CustomEvent
(
self
):
ev
=
opcua
.
common
.
event
.
get_event_from_node
(
opcua
.
Node
(
self
.
opc
.
iserver
.
isession
,
ua
.
NodeId
(
ua
.
ObjectIds
.
AuditEventType
)))
check_base_event
(
self
,
ev
)
#def test_get_event_from_node_InheritanceEvent(self):
#ev = opcua.common.event.get_event_from_node(opcua.Node(self.opc.iserver.isession, ua.NodeId(ua.ObjectIds.AuditEventType)))
#self.assertIsNot(ev, None) # we did not receive event
#self.assertIsInstance(ev, ua.BaseEvent)
#self.assertIsInstance(ev, ua.AuditEventType)
#self.assertEqual(ev.EventType, ua.NodeId(ua.ObjectIds.AuditEventType))
#self.assertEqual(ev.SourceNode, ua.NodeId(ua.ObjectIds.Server))
#self.assertEqual(ev.Severity, ua.Variant(1, ua.VariantType.UInt16))
#self.assertEqual(ev._freeze, True)
def
test_eventgenerator_default
(
self
):
evgen
=
self
.
opc
.
get_event_generator
()
check_eventgenerator_BaseEvent
(
self
,
evgen
)
def
test_eventgenerator_BaseEvent_object
(
self
):
evgen
=
self
.
opc
.
get_event_generator
(
ua
.
BaseEvent
())
check_eventgenerator_BaseEvent
(
self
,
evgen
)
def
test_eventgenerator_BaseEvent_Node
(
self
):
evgen
=
self
.
opc
.
get_event_generator
(
opcua
.
Node
(
self
.
opc
.
iserver
.
isession
,
ua
.
NodeId
(
ua
.
ObjectIds
.
BaseEventType
)))
check_eventgenerator_BaseEvent
(
self
,
evgen
)
def
test_eventgenerator_BaseEvent_NodeId
(
self
):
evgen
=
self
.
opc
.
get_event_generator
(
ua
.
NodeId
(
ua
.
ObjectIds
.
BaseEventType
))
check_eventgenerator_BaseEvent
(
self
,
evgen
)
def
test_eventgenerator_BaseEvent_ObjectIds
(
self
):
evgen
=
self
.
opc
.
get_event_generator
(
ua
.
ObjectIds
.
BaseEventType
)
check_eventgenerator_BaseEvent
(
self
,
evgen
)
def
test_eventgenerator_BaseEvent_Identifier
(
self
):
evgen
=
self
.
opc
.
get_event_generator
(
2041
)
check_eventgenerator_BaseEvent
(
self
,
evgen
)
def
test_eventgenerator_sourceServer_Node
(
self
):
pass
def
test_eventgenerator_sourceServer_NodeId
(
self
):
pass
def
test_eventgenerator_sourceServer_ObjectIds
(
self
):
pass
def
test_eventgenerator_CustomEvent_object
(
self
):
pass
def
test_eventgenerator_CustomEvent_Node
(
self
):
pass
def
test_eventgenerator_CustomEvent_NodeId
(
self
):
pass
def
test_eventgenerator_CustomEvent_ObjectIds
(
self
):
pass
#def test_eventgenerator_InheritedEvent(self):
#pass
#def test_events_default(self):
#msclt = MySubHandler()
#sub = self.opc.create_subscription(100, msclt)
#handle = sub.subscribe_events()
#ev = EventGenerator(self.srv.iserver.isession)
#msg = b"this is my msg "
#ev.Message.Text = msg
#tid = datetime.utcnow()
#ev.Time = tid
#ev.Severity = 500
#ev.trigger()
#ev = msclt.future.result()
#self.assertIsNot(ev, None) # we did not receive event
#self.assertEqual(ev.SourceNode, self.opc.get_server_node().nodeid)
#self.assertEqual(ev.Message.Text, msg)
##self.assertEqual(msclt.ev.Time, tid)
#self.assertEqual(ev.Severity, 500)
## time.sleep(0.1)
#sub.unsubscribe(handle)
#sub.delete()
def
check_eventgenerator_BaseEvent
(
test
,
evgen
):
test
.
assertIsNot
(
evgen
,
None
)
# we did not receive event generator
test
.
assertIs
(
evgen
.
isession
,
test
.
opc
.
iserver
.
isession
)
check_base_event
(
test
,
evgen
.
event
)
test
.
assertEqual
(
evgen
.
event
.
SourceName
,
test
.
opc
.
get_server_node
().
get_display_name
().
Text
)
test
.
assertEqual
(
test
.
opc
.
get_server_node
().
get_attribute
(
ua
.
AttributeIds
.
EventNotifier
).
Value
,
ua
.
Variant
(
1
,
ua
.
VariantType
.
Byte
))
def
check_base_event
(
test
,
ev
):
test
.
assertIsNot
(
ev
,
None
)
# we did not receive event
test
.
assertIsInstance
(
ev
,
ua
.
BaseEvent
)
test
.
assertEqual
(
ev
.
EventType
,
ua
.
NodeId
(
ua
.
ObjectIds
.
BaseEventType
))
test
.
assertEqual
(
ev
.
SourceNode
,
ua
.
NodeId
(
ua
.
ObjectIds
.
Server
))
test
.
assertEqual
(
ev
.
Severity
,
ua
.
Variant
(
1
,
ua
.
VariantType
.
UInt16
))
test
.
assertEqual
(
ev
.
_freeze
,
True
)
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