Example #1
0
    def get_stat(self, name, type=None):
        results = []
        # sum(value) as value, name, type, round(bucket / %s) * %s AS bucket
        find_name = name.replace("%", "#")
        if type is None or type is "counter":
            for bucket in self._counters:
                for stat in pattern_search(find_name, self._counters[bucket]):
                    too_add = self._counters[bucket][stat]
                    new_result = {"name": stat, "value": too_add["value"], "type": "counter", "bucket": bucket}
                    results.append(new_result)

        if type is None or type is "average":
            for bucket in self._averages:
                for stat in pattern_search(find_name, self._averages[bucket]):
                    too_add = self._averages[bucket][stat]
                    new_result = {"name": stat, "value": too_add["value"], "type": "average", "bucket": bucket}
                    results.append(new_result)

        if type is None or type is "datapoint":
            for bucket in self._datapoints:
                for stat in pattern_search(find_name, self._datapoints[bucket]):
                    too_add = self._datapoints[bucket][stat]
                    new_result = {"name": stat, "value": too_add["value"], "type": "datapoint", "bucket": bucket}
                    results.append(new_result)

        return results
Example #2
0
    def get(self, key=None, human=None, full=None):
        """
        Get the value of a given state (key).

        :param key: Name of state to get.
        :return: Value of state
        """
        logger.debug('states:get: {key} = {value}', key=key)
        if key is None:
            raise YomboWarning("Key cannot be none")

        self._Statistics.increment("lib.atoms.get", bucket_time=15, anon=True)

        search_chars = ['#', '+']
        if any(s in key for s in search_chars):
            results = pattern_search(key, self.__States)
            if len(results) > 1:
                values = {}
                for item in results:
                    values[item] = self.__States[item]
                return values
            else:
                raise KeyError("Searched for atoms, none found.")
        if human is True:
            return self.__States[key]['value']
        elif full is True:
            return self.__States[key]
        else:
            return self.__States[key]['value_human']
Example #3
0
    def get(
        self,
        key,
        human=None,
        full=None,
        gateway_id=None,
        default='eEryLOZESKJf7cqQZv2bFlh04Hrf3NxLazV5KEuvyXFtkgxpq70vWsIz9xwr'
    ):
        """
        Get the value of a given state (key).

        :raises YomboWarning: Raised when request is malformed.
        :raises KeyError: Raised when request is not found.
        :param key: Name of state to get.
        :type key: string
        :param human: If true, returns a state for human consumption.
        :type human: bool
        :param full: If true, Returns all data about the state. If false, just the value.
        :type full: bool
        :param gateway_id: The gateway id to lookup. If 'self', will be converted to local gateway ID.
        :param default: If set, will return a this value if it's not set. Otherwise, will raise KeyError if not set.
        :type default: str
        :return: Value of state
        """
        # logger.debug("states:get: {key} = {value}", key=key)
        if gateway_id is None or gateway_id.lower() == 'self':
            gateway_id = self.gateway_id

        if self._Loader.operating_mode != "run":
            gateway_id = "local"

        self._Statistics.increment("lib.states.get", bucket_size=15, anon=True)
        search_chars = ["#", "+"]
        if any(s in key for s in search_chars):
            if gateway_id not in self.states:
                return {}
            results = pattern_search(key, self.states[gateway_id])
            if len(results) > 1:
                values = {}
                for item in results:
                    if human is True:
                        values[item] = self.states[gateway_id][item][
                            "value_human"]
                    elif full is True:
                        values[item] = self.states[gateway_id][item]
                    else:
                        values[item] = self.states[gateway_id][item]["value"]
                return values
            else:
                raise KeyError("Searched for atoms, none found.")

        # print(f"States get...... gateway_id: {gateway_id}")
        # print(f"States key: {key}")
        # print(self.states)
        if human is True:
            return self.states[gateway_id][key]["value_human"]
        elif full is True:
            return self.states[gateway_id][key]
        else:
            return self.states[gateway_id][key]["value"]
Example #4
0
    def get_stat(self, bucket_name, bucket_type=None):
        results = []
        # sum(value) as value, bucket_name, type, round(bucket / %s) * %s AS bucket
        find_name = bucket_name.replace('%', '#')
        if bucket_type is None or bucket_type is 'counter':
            for bucket in self._counters:
                for stat in pattern_search(find_name, self._counters[bucket]):
                    too_add = self._counters[bucket][stat]
                    new_result = {
                        'name': stat,
                        'value': too_add['value'],
                        'type': 'counter',
                        'bucket': bucket,
                    }
                    results.append(new_result)

        if bucket_type is None or bucket_type is 'average':
            for bucket in self._averages:
                for stat in pattern_search(find_name, self._averages[bucket]):
                    too_add = self._averages[bucket][stat]
                    new_result = {
                        'name': stat,
                        'value': too_add['value'],
                        'type': 'average',
                        'bucket': bucket,
                    }
                    results.append(new_result)

        if bucket_type is None or bucket_type is 'datapoint':
            for bucket in self._datapoints:
                for stat in pattern_search(find_name,
                                           self._datapoints[bucket]):
                    too_add = self._datapoints[bucket][stat]
                    new_result = {
                        'name': stat,
                        'value': too_add['value'],
                        'type': 'datapoint',
                        'bucket': bucket,
                    }
                    results.append(new_result)

        return results
    def get_stat(self, bucket_name, bucket_type=None):
        results = []
        # sum(value) as value, bucket_name, type, round(bucket / %s) * %s AS bucket
        find_name = bucket_name.replace("%", "#")
        if bucket_type is None or bucket_type is "counter":
            for bucket in self._counters:
                for stat in pattern_search(find_name, self._counters[bucket]):
                    too_add = self._counters[bucket][stat]
                    new_result = {
                        "name": stat,
                        "value": too_add["value"],
                        "type": "counter",
                        "bucket": bucket,
                    }
                    results.append(new_result)

        if bucket_type is None or bucket_type is "average":
            for bucket in self._averages:
                for stat in pattern_search(find_name, self._averages[bucket]):
                    too_add = self._averages[bucket][stat]
                    new_result = {
                        "name": stat,
                        "value": too_add["value"],
                        "type": "average",
                        "bucket": bucket,
                    }
                    results.append(new_result)

        if bucket_type is None or bucket_type is "datapoint":
            for bucket in self._datapoints:
                for stat in pattern_search(find_name,
                                           self._datapoints[bucket]):
                    too_add = self._datapoints[bucket][stat]
                    new_result = {
                        "name": stat,
                        "value": too_add["value"],
                        "type": "datapoint",
                        "bucket": bucket,
                    }
                    results.append(new_result)

        return results
Example #6
0
    def get(self, key, human=None, full=None, gateway_id=None):
        """
        Get the value of a given state (key).

        :raises YomboWarning: Raised when request is malformed.
        :raises KeyError: Raised when request is not found.
        :param key: Name of state to get.
        :type key: string
        :param human: If true, returns a state for human consumption.
        :type human: bool
        :param full: If true, Returns all data about the state. If false, just the value.
        :type full: bool
        :return: Value of state
        """
        # logger.debug('states:get: {key} = {value}', key=key)
        if gateway_id is None:
            gateway_id = self.gateway_id

        self._Statistics.increment("lib.states.get", bucket_size=15, anon=True)
        search_chars = ['#', '+']
        if any(s in key for s in search_chars):
            if gateway_id not in self.__States:
                return {}
            results = pattern_search(key, self.__States[gateway_id])
            if len(results) > 1:
                values = {}
                for item in results:
                    values[item] = self.__States[gateway_id][item]
                return values
            else:
                raise KeyError("Searched for atoms, none found.")
        if human is True:
            return self.__States[gateway_id][key]['value_human']
        elif full is True:
            return self.__States[gateway_id][key]
        else:
            return self.__States[gateway_id][key]['value']
Example #7
0
    def get(self,
            item_requested: str,
            default: Optional[Any] = SENTINEL,
            gateway_id: Optional[str] = None,
            instance: Optional[bool] = None):
        """
        Get the value of a given data item (key).

        :raises KeyError: Raised when request is not found.
        :param item_requested: Name of data item to retrieve.
        :param default: Default value to return in a data instance if the requested item is missing.
        :param gateway_id: The gateway_id to reference.
        :param instance: If True, returns the object (atom/state), versus just the value.
        """
        if gateway_id is None or gateway_id.lower() == 'self':
            gateway_id = self._gateway_id

        # if self._Loader.operating_mode != "run":
        #     gateway_id = self._gateway_id

        data = getattr(self, self._storage_attribute_name)

        if gateway_id not in data:
            raise KeyError(
                f"gateway_id '{gateway_id}' not found in '{self._storage_attribute_name}'"
            )

        self._Statistics.increment(f"lib.{self._storage_attribute_name}.get",
                                   bucket_size=15,
                                   anon=True)
        if any(s in item_requested for s in ["#", "+"]):
            if gateway_id not in data:
                return {}
            results = pattern_search(item_requested, data[gateway_id])
            if len(results) > 1:
                values = {}
                for item in results:
                    if instance is True:
                        values[item] = data[gateway_id][item]
                    else:
                        values[item] = data[gateway_id][item].value
                return values
            else:
                raise KeyError(
                    f"Searched for {self._storage_attribute_name}, none found: {item_requested}"
                )

        if item_requested in data[gateway_id]:
            data[gateway_id][item_requested].update(
                {"last_access_at": int(time())})
            if instance is True:
                return data[gateway_id][item_requested]
            else:
                return data[gateway_id][item_requested].value
        elif default is SENTINEL:
            raise KeyError(
                f"'{item_requested}' not found in '{self._storage_label_name}'"
            )
        else:
            if instance is True:
                raise KeyError(
                    f"'{item_requested}' not found in '{self._storage_label_name}',"
                    f" cannot return instance using a default value.")
            else:
                return default