def _modify_monitored_item(self, params): with self._lock: for mdata in self._monitored_items.values(): result = ua.MonitoredItemCreateResult() if mdata.monitored_item_id == params.MonitoredItemId: result.RevisedSamplingInterval = self.isub.data.RevisedPublishingInterval result.RevisedQueueSize = ua.downcast_extobject(params.RequestedParameters.QueueSize) result.FilterResult = params.RequestedParameters.Filter mdata.parameters = result return result # FIXME modify event subscriptions result = ua.MonitoredItemCreateResult() result.StatusCode(ua.StatusCodes.BadMonitoredItemIdInvalid) return result
def _create_monitored_item(self, params): with self._lock: result = ua.MonitoredItemCreateResult() result.RevisedSamplingInterval = self.isub.data.RevisedPublishingInterval result.RevisedQueueSize = params.RequestedParameters.QueueSize result.FilterResult = ua.downcast_extobject(params.RequestedParameters.Filter) self._monitored_item_counter += 1 result.MonitoredItemId = self._monitored_item_counter self.logger.debug("Creating MonitoredItem with id %s", result.MonitoredItemId) mdata = MonitoredItemData() mdata.parameters = result mdata.mode = params.MonitoringMode mdata.client_handle = params.RequestedParameters.ClientHandle mdata.monitored_item_id = result.MonitoredItemId self._monitored_items[result.MonitoredItemId] = mdata if params.ItemToMonitor.AttributeId == ua.AttributeIds.EventNotifier: self.logger.info("request to subscribe to events for node %s and attribute %s", params.ItemToMonitor.NodeId, params.ItemToMonitor.AttributeId) self._monitored_events[params.ItemToMonitor.NodeId] = result.MonitoredItemId else: self.logger.info("request to subscribe to datachange for node %s and attribute %s", params.ItemToMonitor.NodeId, params.ItemToMonitor.AttributeId) result.StatusCode, handle = self.aspace.add_datachange_callback(params.ItemToMonitor.NodeId, params.ItemToMonitor.AttributeId, self.datachange_callback) self.logger.debug("adding callback return status %s and handle %s", result.StatusCode, handle) mdata.callback_handle = handle self._monitored_datachange[handle] = result.MonitoredItemId # force data change event generation self.trigger_datachange(handle, params.ItemToMonitor.NodeId, params.ItemToMonitor.AttributeId) return result
def create_monitored_items(self, params): self.logger.info("create monitored items") with self._lock: if params.SubscriptionId not in self.subscriptions: res = [] for _ in params.ItemsToCreate: response = ua.MonitoredItemCreateResult() response.StatusCode = ua.StatusCode(ua.StatusCodes.BadSubscriptionIdInvalid) res.append(response) return res return self.subscriptions[params.SubscriptionId].monitored_item_srv.create_monitored_items(params)
def _make_monitored_item_common(self, params): result = ua.MonitoredItemCreateResult() result.RevisedSamplingInterval = self.isub.data.RevisedPublishingInterval result.RevisedQueueSize = params.RequestedParameters.QueueSize self._monitored_item_counter += 1 result.MonitoredItemId = self._monitored_item_counter self.logger.debug("Creating MonitoredItem with id %s", result.MonitoredItemId) mdata = MonitoredItemData() mdata.parameters = result mdata.mode = params.MonitoringMode mdata.client_handle = params.RequestedParameters.ClientHandle mdata.mfilter = params.RequestedParameters.Filter mdata.monitored_item_id = result.MonitoredItemId return result, mdata
def _create_monitored_item(self, params): with self._lock: result = ua.MonitoredItemCreateResult() result.RevisedSamplingInterval = self.isub.data.RevisedPublishingInterval result.RevisedQueueSize = params.RequestedParameters.QueueSize self._monitored_item_counter += 1 result.MonitoredItemId = self._monitored_item_counter self.logger.debug("Creating MonitoredItem with id %s", result.MonitoredItemId) mdata = MonitoredItemData() mdata.parameters = result mdata.mode = params.MonitoringMode mdata.client_handle = params.RequestedParameters.ClientHandle mdata.mfilter = params.RequestedParameters.Filter mdata.monitored_item_id = result.MonitoredItemId self._monitored_items[result.MonitoredItemId] = mdata if params.ItemToMonitor.AttributeId == ua.AttributeIds.EventNotifier: self.logger.info( "request to subscribe to events for node %s and attribute %s", params.ItemToMonitor.NodeId, params.ItemToMonitor.AttributeId) if self.aspace.get_attribute_value( params.ItemToMonitor.NodeId, ua.AttributeIds.EventNotifier).Value.Value != 1: result.StatusCode = ua.StatusCode( ua.StatusCodes.BadServiceUnsupported) result.FilterResult = ua.EventFilterResult() for _ in params.RequestedParameters.Filter.SelectClauses: result.FilterResult.SelectClauseResults.append( ua.StatusCode()) # FIXME: where clause result self._monitored_events[ params.ItemToMonitor.NodeId] = result.MonitoredItemId else: self.logger.info( "request to subscribe to datachange for node %s and attribute %s", params.ItemToMonitor.NodeId, params.ItemToMonitor.AttributeId) result.FilterResult = params.RequestedParameters.Filter result.StatusCode, handle = self.aspace.add_datachange_callback( params.ItemToMonitor.NodeId, params.ItemToMonitor.AttributeId, self.datachange_callback) self.logger.debug( "adding callback return status %s and handle %s", result.StatusCode, handle) mdata.callback_handle = handle self._monitored_datachange[handle] = result.MonitoredItemId if result.StatusCode.is_good(): # force data change event generation self.trigger_datachange(handle, params.ItemToMonitor.NodeId, params.ItemToMonitor.AttributeId) if not result.StatusCode.is_good(): del (self._monitored_items[result.MonitoredItemId]) self._monitored_item_counter -= 1 return result