def _make_monitored_item_request(self, node, attr, mfilter, queuesize): rv = ua.ReadValueId() rv.NodeId = node.nodeid rv.AttributeId = attr # rv.IndexRange //We leave it null, then the entire array is returned mparams = ua.MonitoringParameters() with self._lock: self._client_handle += 1 mparams.ClientHandle = self._client_handle mparams.SamplingInterval = self.parameters.RequestedPublishingInterval mparams.QueueSize = queuesize mparams.DiscardOldest = True if mfilter: mparams.Filter = mfilter mir = ua.MonitoredItemCreateRequest() mir.ItemToMonitor = rv mir.MonitoringMode = ua.MonitoringMode.Reporting mir.RequestedParameters = mparams return mir
def _subscribe(self, node, attr, mfilter=None, queuesize=0): rv = ua.ReadValueId() rv.NodeId = node.nodeid rv.AttributeId = attr # rv.IndexRange //We leave it null, then the entire array is returned mparams = ua.MonitoringParameters() self._client_handle += 1 mparams.ClientHandle = self._client_handle mparams.SamplingInterval = self.parameters.RequestedPublishingInterval mparams.QueueSize = queuesize mparams.DiscardOldest = True if mfilter: mparams.Filter = mfilter mir = ua.MonitoredItemCreateRequest() mir.ItemToMonitor = rv mir.MonitoringMode = ua.MonitoringMode.Reporting mir.RequestedParameters = mparams params = ua.CreateMonitoredItemsParameters() params.SubscriptionId = self.subscription_id params.ItemsToCreate.append(mir) params.TimestampsToReturn = ua.TimestampsToReturn.Neither with self._lock: results = self.server.create_monitored_items(params) result = results[0] result.StatusCode.check() data = SubscriptionItemData() data.client_handle = mparams.ClientHandle 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
def create_monitored_items(self, nodes, index): monitored_items = [] if not isinstance(nodes, list): nodes = [nodes] for node in nodes: # Set item to monitor rv = ua.ReadValueId() rv.NodeId = node.nodeid rv.AttributeId = ua.AttributeIds.Value # Set monitoring parameters mparams = ua.MonitoringParameters() self._client_handle += 1 mparams.ClientHandle = self._client_handle mparams.SamplingInterval = self.samplingInterval mparams.QueueSize = self.queueSize mparams.DiscardOldest = self.discardOldest # Create monitored item filter if self.dataChangeFilter: mfilter = ua.DataChangeFilter() mfilter.Trigger = ua.DataChangeTrigger(self.dataChangeTrigger) if self.deadbandType == ua.DeadbandType.Absolute: if node.get_data_value( ).Value.VariantType in self.numericTypes: mfilter.DeadbandType = self.deadbandType mfilter.DeadbandValue = self.deadbandValue # absolute float value or from 0 to 100 for percentage deadband else: self.deadbandType = ua.DeadbandType.None_ mfilter.DeadbandType = self.deadbandType elif self.deadbandType == ua.DeadbandType.Percent: has_EURange = False if node.get_type_definition( ).Identifier == ua.object_ids.ObjectIds.AnalogItemType: # Get node properties descriptions = node.get_references( ua.ObjectIds.HasProperty, ua.BrowseDirection.Forward, ua.NodeClass.Variable, False) for desc in descriptions: if desc.BrowseName.Name == "EURange" and self.get_node( desc.NodeId).get_value() is not None: has_EURange = True if has_EURange: mfilter.DeadbandType = self.deadbandType mfilter.DeadbandValue = self.deadbandValue # absolute float value or from 0 to 100 for percentage deadband else: self.deadbandType = ua.DeadbandType.None_ mfilter.DeadbandType = self.deadbandType else: mfilter = None mparams.Filter = mfilter # Create monitored item request mir = ua.MonitoredItemCreateRequest() mir.ItemToMonitor = rv mir.MonitoringMode = ua.MonitoringMode.Reporting mir.RequestedParameters = mparams # Append to list monitored_items.append(mir) sub, monitored_items_handles = self._datachange_subs[index] handles = sub.create_monitored_items(monitored_items) for i in range(len(handles)): handle = handles[i] if type(handle) == ua.StatusCode: handle.check() monitored_items_handles[nodes[i].nodeid] = handle