def _delete_bid(self, payload): transaction_id = self._get_transaction_id(payload) delete_bid_response_channel = f'{self.channel_prefix}/response/delete_bid' if not check_for_connected_and_reply( self.redis, delete_bid_response_channel, self.connected): return try: arguments = json.loads(payload["data"]) if ("bid" in arguments and arguments["bid"] is not None) and \ not self.is_bid_posted(self.market, arguments["bid"]): raise Exception( "Bid_id is not associated with any posted bid.") except Exception as e: self.redis.publish_json( delete_bid_response_channel, { "command": "bid_delete", "error": f"Incorrect delete bid request. Available parameters: (bid)." f"Exception: {str(e)}", "transaction_id": transaction_id }) else: self.pending_requests.append( IncomingRequest("delete_bid", arguments, delete_bid_response_channel))
def _offer(self, payload): transaction_id = self._get_transaction_id(payload) offer_response_channel = f'{self.channel_prefix}/response/offer' if not check_for_connected_and_reply( self.redis, offer_response_channel, self.connected): return try: arguments = json.loads(payload["data"]) assert set( arguments.keys()) == {'price', 'energy', 'transaction_id'} arguments['seller'] = self.device.name arguments['seller_origin'] = self.device.name except Exception as e: logging.error( f"Incorrect offer request. Payload {payload}. Exception {str(e)}." ) self.redis.publish_json( offer_response_channel, { "command": "offer", "error": "Incorrect offer request. Available parameters: (price, energy).", "transaction_id": transaction_id }) else: self.pending_requests.append( IncomingRequest("offer", arguments, offer_response_channel))
def _delete_offer(self, payload): transaction_id = self._get_transaction_id(payload) delete_offer_response_channel = f'{self.channel_prefix}/response/delete_offer' if not check_for_connected_and_reply( self.redis, delete_offer_response_channel, self.connected): return try: arguments = json.loads(payload["data"]) if ("offer" in arguments and arguments["offer"] is not None) and \ not self.offers.is_offer_posted(self.market.id, arguments["offer"]): raise Exception( "Offer_id is not associated with any posted offer.") except Exception as e: logging.error( f"Error when handling delete offer request. Payload {payload}. " f"Exception {str(e)}.") self.redis.publish_json( delete_offer_response_channel, { "command": "offer_delete", "error": "Incorrect delete offer request. Available parameters: (offer).", "transaction_id": transaction_id }) else: self.pending_requests.append( IncomingRequest("delete_offer", arguments, delete_offer_response_channel))
def bid(self, payload): transaction_id = self._get_transaction_id(payload) required_args = {"price", "energy", "transaction_id"} allowed_args = required_args.union( {"replace_existing", "attributes", "requirements"}) bid_response_channel = f"{self.channel_prefix}/response/bid" if not check_for_connected_and_reply(self.redis, bid_response_channel, self.connected): return try: arguments = json.loads(payload["data"]) # Check that all required arguments have been provided assert all(arg in arguments.keys() for arg in required_args) # Check that every provided argument is allowed assert all(arg in allowed_args for arg in arguments.keys()) except Exception: self.redis.publish_json( bid_response_channel, { "command": "bid", "error": ("Incorrect bid request. ", f"Required parameters: {required_args}" f"Available parameters: {allowed_args}."), "transaction_id": transaction_id }) else: self.pending_requests.append( IncomingRequest("bid", arguments, bid_response_channel))
def _list_bids(self, payload): list_bids_response_channel = f'{self.device_name}/bids/response' if not check_for_connected_and_reply( self.redis, list_bids_response_channel, self.connected): return try: filtered_bids = [{ "id": v.id, "price": v.price, "energy": v.energy } for _, v in self.market.get_bids().items() if v.buyer == self.device_name] self.redis.publish_json(list_bids_response_channel, { "status": "ready", "bid_list": filtered_bids }) except Exception as e: logging.error( f"Error when handling list bids on area {self.device_name}: " f"Exception: {str(e)}") self.redis.publish_json( list_bids_response_channel, { "status": "error", "error_message": f"Error when listing bids on area {self.device_name}." })
def _area_stats(self, payload): area_stats_response_channel = f'{self.device_name}/stats/response' if not check_for_connected_and_reply( self.redis, area_stats_response_channel, self.connected): return try: device_stats = { k: v for k, v in self.owner.stats.aggregated_stats.items() if v is not None } market_stats = { k: v for k, v in self.area.stats.aggregated_stats.items() if v is not None } self.redis.publish_json( area_stats_response_channel, { "status": "ready", "device_stats": device_stats, "market_stats": market_stats }) except Exception as e: logging.error( f"Error reporting stats for area {self.device_name}: " f"Exception: {str(e)}") self.redis.publish_json( area_stats_response_channel, { "status": "error", "error_message": f"Error reporting stats for area {self.device_name}." })
def _list_offers(self, payload): self._get_transaction_id(payload) list_offers_response_channel = f'{self.channel_prefix}/response/list_offers' if not check_for_connected_and_reply(self.redis, list_offers_response_channel, self.connected): return arguments = json.loads(payload["data"]) self.pending_requests.append( IncomingRequest("list_offers", arguments, list_offers_response_channel))
def _delete_bid(self, payload): delete_bid_response_channel = f'{self.device_name}/delete_bid/response' if not check_for_connected_and_reply( self.redis, delete_bid_response_channel, self.connected): return try: arguments = json.loads(payload["data"]) assert set(arguments.keys()) == {'bid'} except Exception: self.redis.publish_json( delete_bid_response_channel, { "error": "Incorrect delete bid request. Available parameters: (bid)." }) else: self._delete_bid_impl(arguments, delete_bid_response_channel)
def _delete_offer(self, payload): delete_offer_response_channel = f'{self.device_name}/delete_offer/response' if not check_for_connected_and_reply(self.redis, delete_offer_response_channel, self.connected): return try: arguments = json.loads(payload["data"]) assert set(arguments.keys()) == {'offer'} except Exception as e: logging.error(f"Error when handling delete offer request. Payload {payload}. " f"Exception {str(e)}.") self.redis.publish_json( delete_offer_response_channel, {"error": "Incorrect delete offer request. Available parameters: (offer)."} ) else: self._delete_offer_impl(arguments, delete_offer_response_channel)
def _bid(self, payload): bid_response_channel = f'{self.device_name}/bid/response' if not check_for_connected_and_reply(self.redis, bid_response_channel, self.connected): return try: arguments = json.loads(payload["data"]) assert set(arguments.keys()) == {'price', 'energy'} arguments['buyer_origin'] = self.device_name except Exception: self.redis.publish_json( bid_response_channel, { "error": "Incorrect bid request. Available parameters: (price, energy)." }) else: self._bid_impl(arguments, bid_response_channel)
def _offer(self, payload): offer_response_channel = f'{self.device_name}/offer/response' if not check_for_connected_and_reply(self.redis, offer_response_channel, self.connected): return try: arguments = json.loads(payload["data"]) assert set(arguments.keys()) == {'price', 'energy'} arguments['seller'] = self.device_name arguments['seller_origin'] = self.device_name except Exception as e: logging.error(f"Incorrect offer request. Payload {payload}. Exception {str(e)}.") self.redis.publish_json( offer_response_channel, {"error": "Incorrect offer request. Available parameters: (price, energy)."} ) else: self._offer_impl(arguments, offer_response_channel)
def _bid(self, payload): transaction_id = self._get_transaction_id(payload) bid_response_channel = f'{self.channel_prefix}/response/bid' if not check_for_connected_and_reply(self.redis, bid_response_channel, self.connected): return try: arguments = json.loads(payload["data"]) assert set(arguments.keys()) == {'price', 'energy', 'transaction_id'} arguments['buyer'] = self.device.name arguments['buyer_origin'] = self.device.name except Exception: self.redis.publish_json( bid_response_channel, {"command": "bid", "error": "Incorrect bid request. Available parameters: (price, energy).", "transaction_id": transaction_id}) else: self.pending_requests.append( IncomingRequest("bid", arguments, bid_response_channel))