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__":
# creating an event object
# The event object automatically will have members for all events properties
myevent
=
server
.
get_event_object
(
ua
.
ObjectIds
.
BaseEventType
)
myevent
.
Message
.
Text
=
"This is my event"
myevent
.
Severity
=
300
myevgen
=
server
.
get_event_generator
(
ua
.
BaseEvent
(
message
=
"This is my event"
,
severity
=
300
))
# starting!
server
.
start
()
...
...
@@ -105,7 +103,7 @@ if __name__ == "__main__":
#sub = server.create_subscription(500, handler)
#handle = sub.subscribe_data_change(myvar)
# trigger event, all subscribed clients wil receive it
myev
ent
.
trigger
()
myev
gen
.
trigger
()
embed
()
finally
:
...
...
opcua/common/event.py
View file @
49c7ea31
...
...
@@ -22,36 +22,32 @@ class EventGenerator(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
.
node
=
None
self
.
event
=
etyp
e
self
.
event
=
None
node
=
Non
e
if
isinstance
(
etype
,
ua
.
BaseEvent
):
pass
self
.
event
=
etype
elif
isinstance
(
etype
,
Node
):
self
.
node
=
etype
node
=
etype
elif
isinstance
(
etype
,
ua
.
NodeId
):
self
.
node
=
Node
(
self
.
isession
,
etype
)
node
=
Node
(
self
.
isession
,
etype
)
else
:
self
.
node
=
Node
(
self
.
isession
,
ua
.
NodeId
(
etype
))
node
=
Node
(
self
.
isession
,
ua
.
NodeId
(
etype
))
if
self
.
node
:
event
=
CustomEvent
()
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
node
:
self
.
event
=
get_event_from_node
(
node
)
if
isinstance
(
source
,
Node
):
pass
elif
isinstance
(
source
,
NodeId
):
source
=
ua
.
Node
(
isession
,
source
)
elif
isinstance
(
source
,
ua
.
NodeId
):
source
=
Node
(
isession
,
source
)
else
:
source
=
Node
(
isession
,
ua
.
NodeId
(
source
))
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
source
.
set_attribute
(
ua
.
AttributeIds
.
EventNotifier
,
ua
.
DataValue
(
ua
.
Variant
(
1
,
ua
.
VariantType
.
Byte
)))
...
...
@@ -69,9 +65,9 @@ class EventGenerator(object):
self
.
event
.
Time
=
time
else
:
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
self
.
event
.
Local
e
Time
=
datetime
.
utcnow
()
self
.
event
.
LocalTime
=
datetime
.
utcnow
()
if
message
:
self
.
Message
=
ua
.
LocalizedText
(
message
)
elif
not
self
.
event
.
Message
:
...
...
@@ -79,15 +75,36 @@ class EventGenerator(object):
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
):
def
__init__
(
self
,
etype
=
ua
.
ObjectIds
.
BaseEventType
,
sourcenode
=
ua
.
NodeId
(
ua
.
ObjectIds
.
Server
),
message
=
None
,
severity
=
1
):
super
(
ua
.
Base
Event
,
self
).
__init__
(
sourcenode
,
message
,
severity
,
True
)
def
__init__
(
self
,
etype
=
ua
.
BaseEvent
,
sourcenode
=
ua
.
NodeId
(
ua
.
ObjectIds
.
Server
),
message
=
None
,
severity
=
1
):
super
(
Custom
Event
,
self
).
__init__
(
sourcenode
,
message
,
severity
,
True
)
#TODO: Add fileds
#TODO: Extend to show all fields of CustomEvent
def
__str__
(
self
):
s
=
'CustomEvent(EventId:{}'
.
format
(
self
.
EventId
)
s
=
'CustomEvent('
s
+=
'EventId:{}'
.
format
(
self
.
EventId
)
s
+=
', EventType:{}'
.
format
(
self
.
EventType
)
s
+=
', SourceNode:{}'
.
format
(
self
.
SourceNode
)
s
+=
', SourceName:{}'
.
format
(
self
.
SourceName
)
...
...
@@ -97,5 +114,7 @@ class CustomEvent(ua.BaseEvent):
s
+=
', Message:{}'
.
format
(
self
.
Message
)
s
+=
', Severity:{}'
.
format
(
self
.
Severity
)
s
+=
')'
return
s
__repr__
=
__str__
opcua/server/server.py
View file @
49c7ea31
...
...
@@ -322,7 +322,7 @@ class Server(object):
uries
=
self
.
get_namespace_array
()
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.
Use this object to fire events
...
...
opcua/ua/__init__.py
View file @
49c7ea31
...
...
@@ -4,6 +4,6 @@ from opcua.ua.object_ids import ObjectIds
from
opcua.ua.status_codes
import
StatusCodes
from
opcua.ua.uaprotocol_auto
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.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!
from
opcua.ua
import
*
# TODO: This should be autogeneratd form XML description of EventTypes
class
BaseEvent
(
FrozenClass
):
'''
BaseEvent implements BaseEventType from which inherit all other events and it is used per default.
'''
...
...
@@ -39,3 +37,8 @@ class BaseEvent(FrozenClass):
s
+=
')'
return
s
__repr__
=
__str__
IMPLEMNTED_EVENTS
=
{
ObjectIds
.
BaseEventType
:
BaseEvent
,
}
tests/tests_common.py
View file @
49c7ea31
...
...
@@ -6,9 +6,8 @@ from datetime import timedelta
import
math
from
opcua
import
ua
from
opcua
import
Event
from
opcua
import
Event
Generator
from
opcua
import
uamethod
from
opcua
import
Event
def
add_server_methods
(
srv
):
...
...
@@ -23,7 +22,7 @@ def add_server_methods(srv):
def
func2
(
parent
,
methodname
,
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
])
@
uamethod
...
...
@@ -263,29 +262,29 @@ class CommonTests(object):
handle
=
sub
.
subscribe_events
(
v
)
sub
.
delete
()
def
test_events
(
self
):
msclt
=
MySubHandler
()
sub
=
self
.
opc
.
create_subscription
(
100
,
msclt
)
handle
=
sub
.
subscribe_events
()
ev
=
Event
(
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 test_events(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
test_non_existing_path
(
self
):
root
=
self
.
opc
.
get_root_node
()
...
...
tests/tests_server.py
View file @
49c7ea31
import
unittest
from
tests_common
import
CommonTests
,
add_server_methods
from
tests_common
import
CommonTests
,
add_server_methods
,
MySubHandler
import
time
from
datetime
import
timedelta
import
opcua
from
opcua
import
Server
from
opcua
import
Client
from
opcua
import
ua
...
...
@@ -50,7 +51,7 @@ class TestServer(unittest.TestCase, CommonTests):
self
.
assertTrue
(
new_app_uri
in
[
s
.
ApplicationUri
for
s
in
new_servers
])
finally
:
client
.
disconnect
()
def
test_find_servers2
(
self
):
client
=
Client
(
self
.
discovery
.
endpoint
.
geturl
())
client
.
connect
()
...
...
@@ -136,5 +137,112 @@ class TestServer(unittest.TestCase, CommonTests):
var
.
set_value
(
3.0
)
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