def on_message_from_mycroft(self, message=None): # forward internal messages to clients if they are the target if isinstance(message, dict): message = json.dumps(message) if isinstance(message, str): message = Message.deserialize(message) LOG.debug("Missatge de mycroft rebut: {0}".format(message.serialize())) message.context = message.context or {} if message.msg_type == "speak": payload = { "msg_type": "speak", "utterance": message.data["utterance"] } elif message.msg_type == "ona:recognized": payload = { "msg_type": "recognized", "utterance": message.data["utterance"] } elif message.msg_type == "ona:hotword_start": payload = { "msg_type": "waiting_for_hotword", } elif message.msg_type == "ona:hotword_detected": payload = { "msg_type": "listening", } elif message.msg_type == "play:status": payload = {"msg_type": "play", "data": message.data} elif message.msg_type == "mycroft.stop": payload = {"msg_type": "stop"} else: return peers = message.context.get("destination") or [] if not isinstance(peers, list): peers = [peers] for peer in peers: if peer and peer in self.clients: client = self.clients[peer].get("instance") if payload["msg_type"] == "speak": tts_engine = self.clients[peer].get("tts_engine") tts_voice = self.clients[peer].get("tts_voice") self.audio_source_queue.put( (payload, client, tts_engine, tts_voice)) else: self.interface.send(payload, client)
def handle_outgoing_mycroft(self, message=None): if isinstance(message, dict): message = json.dumps(message) if isinstance(message, str): message = Message.deserialize(message) if message.msg_type == "complete_intent_failure": message.msg_type = "hive.complete_intent_failure" message.context = message.context or {} peer = message.context.get("destination") # if msg_type namespace is node_red # if message is for a node red connection, forward if message.msg_type.startswith("node_red."): self.nodered_send(message) elif peer and peer in self.clients: self.nodered_send(message) return