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
Пример #3
0
 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
Пример #5
0
    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