Esempio n. 1
0
    def _parents_available(self):
        """Indicates whether a state action can be performed;
        checks if parent nodes are up & running and all OIDs indicate 'on' status

        Returns:
            bool: True if parents are available
        """

        asset_keys, oid_keys = GraphReference.get_parent_keys(
            self._graph_ref.get_session(), self._asset_key
        )

        # if wall-powered, check the mains
        if not asset_keys and not ISystemEnvironment.power_source_available():
            return False

        state_managers = list(map(self.get_state_manager_by_key, asset_keys))
        min_volt_value = self.min_voltage_prop()

        # check if power is present
        enough_voltage = len(
            list(filter(lambda sm: sm.output_voltage > min_volt_value, state_managers))
        )
        parent_assets_up = len(list(filter(lambda sm: sm.status, state_managers)))

        oid_clause = (
            lambda rvalue, rkey: rvalue.split(b"|")[1].decode()
            == oid_keys[rkey]["switchOff"]
        )
        oids_on = self._check_parents(oid_keys.keys(), oid_clause)

        return (parent_assets_up and enough_voltage and oids_on) or (not asset_keys)
Esempio n. 2
0
    def set_parent_oid_states(self, state):
        """Bulk-set parent oid values

        Args:
            state(OutletState): new parent(s) state
        """
        with self._graph_ref.get_session() as session:
            _, oids = GraphReference.get_parent_keys(session, self._asset_key)

        oid_keys = oids.keys()
        parents_new_states = {}
        parent_values = StateManager.get_store().mget(oid_keys)

        for rkey, rvalue in zip(oid_keys, parent_values):
            #  datatype -> {} | {} <- value
            parents_new_states[rkey] = "{}|{}".format(
                rvalue.split(b"|")[0].decode(), oids[rkey][state.name])

        StateManager.get_store().mset(parents_new_states)