Commit 49c7ea31 authored by Denis Štogl's avatar Denis Štogl

BaseEvent working

parent f1e055b3
......@@ -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
myevent.trigger()
myevgen.trigger()
embed()
finally:
......
......@@ -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 = etype
self.event = None
node = None
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.iserver.isession, 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.RecieveTime = datetime.utcnow()
#FIXME: LocalTime is wrong but currently know better. For description s. Part 5 page 18
self.event.LocaleTime = 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.BaseEvent, self).__init__(sourcenode, message, severity, True)
def __init__(self, etype=ua.BaseEvent, sourcenode=ua.NodeId(ua.ObjectIds.Server), message=None, severity=1):
super(CustomEvent, 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__
......@@ -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
......
......@@ -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 *
......@@ -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,
}
......@@ -6,9 +6,8 @@ from datetime import timedelta
import math
from opcua import ua
from opcua import Event
from opcua import EventGenerator
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()
......
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)
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment