Commit 41d35625 authored by Olivier R-D's avatar Olivier R-D

eventing works between server and client

parent 443e4508
...@@ -60,6 +60,7 @@ if __name__ == "__main__": ...@@ -60,6 +60,7 @@ if __name__ == "__main__":
#creating an event object #creating an event object
myevent = server.get_event_object(ObjectIds.BaseEventType) myevent = server.get_event_object(ObjectIds.BaseEventType)
myevent.Message.Text = "This is my event"
print("My event is", myevent) print("My event is", myevent)
# starting! # starting!
......
...@@ -10,6 +10,13 @@ from opcua import ua ...@@ -10,6 +10,13 @@ from opcua import ua
from opcua import Node from opcua import Node
from opcua import ObjectIds from opcua import ObjectIds
from opcua import AttributeIds 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(): class SubscriptionItemData():
...@@ -65,15 +72,34 @@ class Subscription(object): ...@@ -65,15 +72,34 @@ class Subscription(object):
def _call_datachange(self, datachange): def _call_datachange(self, datachange):
for item in datachange.MonitoredItems: for item in datachange.MonitoredItems:
data = self._monitoreditems_map[item.ClientHandle] 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): def _call_event(self, eventlist):
print(eventlist) for event in eventlist.Events:
self.logger.warn("Not implemented") 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): def _call_status(self, status):
print(status) try:
self.logger.warn("Not implemented") 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): def subscribe_data_change(self, node, attr=ua.AttributeIds.Value):
return self._subscribe(node, attr) return self._subscribe(node, attr)
...@@ -101,6 +127,7 @@ class Subscription(object): ...@@ -101,6 +127,7 @@ class Subscription(object):
def subscribe_events(self, sourcenode=ObjectIds.Server, evtype=ObjectIds.BaseEventType): def subscribe_events(self, sourcenode=ObjectIds.Server, evtype=ObjectIds.BaseEventType):
sourcenode = self._get_node(sourcenode) sourcenode = self._get_node(sourcenode)
evfilter = self._get_filter_from_event_type(evtype) evfilter = self._get_filter_from_event_type(evtype)
print("EVFILTER is ", evfilter)
return self._subscribe(sourcenode, AttributeIds.EventNotifier, evfilter) return self._subscribe(sourcenode, AttributeIds.EventNotifier, evfilter)
def _subscribe(self, node, attr, mfilter=None): def _subscribe(self, node, attr, mfilter=None):
...@@ -136,6 +163,7 @@ class Subscription(object): ...@@ -136,6 +163,7 @@ class Subscription(object):
data.node = node data.node = node
data.attribute = attr data.attribute = attr
data.server_handle = result.MonitoredItemId data.server_handle = result.MonitoredItemId
data.mfilter = ua.downcast_extobject(result.FilterResult)
self._monitoreditems_map[mparams.ClientHandle] = data self._monitoreditems_map[mparams.ClientHandle] = data
return result.MonitoredItemId return result.MonitoredItemId
......
...@@ -373,8 +373,9 @@ class InternalSubscription(object): ...@@ -373,8 +373,9 @@ class InternalSubscription(object):
def trigger_event(self, event): def trigger_event(self, event):
with self._lock: with self._lock:
if not event.SourceNode in self._monitored_events: if not event.SourceNode in self._monitored_events:
self.logger.debug("%s has not 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 return False
self.logger.debug("%s has subscription for events %s from node: %s", self, event, event.SourceNode)
mid = self._monitored_events[event.SourceNode] mid = self._monitored_events[event.SourceNode]
if not mid in self._monitored_items: 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) 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): ...@@ -382,6 +383,7 @@ class InternalSubscription(object):
item = self._monitored_items[mid] item = self._monitored_items[mid]
fieldlist = ua.EventFieldList() fieldlist = ua.EventFieldList()
fieldlist.ClientHandle = item.client_handle fieldlist.ClientHandle = item.client_handle
print("filter is ", item.parameters.FilterResult, " event is ", event)
fieldlist.EventFields = self._get_event_fields(item.parameters.FilterResult, event) fieldlist.EventFields = self._get_event_fields(item.parameters.FilterResult, event)
self._triggered_events.append(fieldlist) self._triggered_events.append(fieldlist)
return True return True
...@@ -389,6 +391,7 @@ class InternalSubscription(object): ...@@ -389,6 +391,7 @@ class InternalSubscription(object):
def _get_event_fields(self, evfilter, event): def _get_event_fields(self, evfilter, event):
fields = [] fields = []
for sattr in evfilter.SelectClauses: for sattr in evfilter.SelectClauses:
print("looking at sattrs", sattr)
try: try:
if not sattr.BrowsePath: if not sattr.BrowsePath:
val = getattr(event, ua.AttributeIdsInv[sattr.Attribute]) val = getattr(event, ua.AttributeIdsInv[sattr.Attribute])
......
...@@ -587,12 +587,18 @@ class Variant(object): ...@@ -587,12 +587,18 @@ class Variant(object):
return VariantType.ByteString return VariantType.ByteString
elif type(val) == datetime: elif type(val) == datetime:
return VariantType.DateTime return VariantType.DateTime
elif type(val) == ExtensionObject:
return VariantType.ExtensionObject
elif type(val) == Variant:
return VariantType.Variant
else: 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): def __str__(self):
return "Variant(val:{},type:{})".format(self.Value, self.VariantType) return "Variant(val:{},type:{})".format(self.Value, self.VariantType)
......
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