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)
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)