def __init__(self): self.status = None self.ipprocc = False self.especial = False self.veu = ControladorVeu() self.telegram = ControladorTelegram() self.events = None self.entrada = None self.missatge = None self.spoticanso = None self.ultimissatge = None self.domoconfig = False self.clientmongo = pymongo.MongoClient("localhost", 27017) self.db = self.clientmongo['ProjectDB'] self.funcions = self.db['Funcions'].find(no_cursor_timeout=True).sort("id", 1) self.inici()
class Processador: def __init__(self): self.status = None self.ipprocc = False self.especial = False self.veu = ControladorVeu() self.telegram = ControladorTelegram() self.events = None self.entrada = None self.missatge = None self.spoticanso = None self.ultimissatge = None self.domoconfig = False self.clientmongo = pymongo.MongoClient("localhost", 27017) self.db = self.clientmongo['ProjectDB'] self.funcions = self.db['Funcions'].find(no_cursor_timeout=True).sort("id", 1) self.inici() def on_message(self, entrada, e): e.wait() self.entrada = entrada if entrada == 1: self.missatge = self.veu.missatge elif entrada == 2: self.missatge = self.telegram.missatge self.setEvents(entrada) if self.especial: self.especial = False else: self.processarparaula() def on_whats(self, selfwhats, missatge, sender): self.entrada = 3 self.selfwhats = selfwhats self.missatge = missatge self.sender = sender self.processarparaula() def inici(self): self.veu.start() self.telegram.start() self.setEvents(1) self.setEvents(2) def setEvents(self, entrada): if entrada == 1: threading.Thread(target=self.on_message, args=(1, self.veu.missatgeready)).start() elif entrada == 2: threading.Thread(target=self.on_message, args=(2, self.telegram.missatgeready)).start() def contestarVeu(self, missatge): self.updateStatus("Parlan") funciona = False while funciona == False: try: v = pyvona.create_voice("GDNAIOIEYJ4TLER6BWMQ", "0keM4rjAabbuEsVXMM9+/C+Ewn8af/ZokV5/BzwI") v.speak(missatge) time.sleep(0.5) funciona = True except: time.sleep(1) if not self.veu.playing: self.updateStatus(False) else: self.updateStatus(True) def enviarTelegram(self, missatge): self.telegram.contestarTelegram(missatge) def contestar(self, missatge): if self.entrada == 1: self.updateStatus("Parlan") self.contestarVeubackground(missatge) if not self.veu.playing: self.updateStatus(False) else: self.updateStatus(True) elif self.entrada == 2: self.enviarTelegram(missatge) elif self.entrada == 3: enviarWhats(missatge, self.sender, self.selfwhats) def contestarVeubackground(self,missatge): process = subprocess.Popen(["python","/home/pi/AleixDomo/pyvonabackground.py",missatge]) process.wait() def getParaula(self): self.especial = True self.db['BotoStatus'].update({'id': None}, {'status': True}, upsert=True) missatgeantic = self.missatge while missatgeantic == self.missatge: time.sleep(0.5) return self.missatge ###########################Funcions############################ def conversa(self): if self.entrada == 2 or self.entrada == 3: self.contestar("Hola! Para saber un poco mas sobre mi escribe Ayuda") elif self.entrada == 1: self.contestarVeu("Hola, como estas?") def multimedia(self): Musica = True if not self.spoticanso: self.spoticanso = Spotipy() self.veu.spoticanso = self.spoticanso if 'lista' in self.missatge.split(): llista = self.missatge.split('lista ')[1] self.updateStatus(True) if self.entrada == 2 or self.entrada == 3: self.contestar('Poniendo musica...') if not self.spoticanso.playPlaylist(llista): self.contestar('No se ha encontrado su lista') self.updateStatus(False) else: missatge = self.missatge.split(' ', 1)[1].replace('un poco ', '').replace('lo mejor ', '') if "de" in missatge.split(): missatge = re.sub(r'\bde\b','', missatge) self.updateStatus(True) if self.entrada == 2 or self.entrada == 3: self.contestar('Poniendo musica...') if not self.spoticanso.play(missatge): self.contestar('No he podido econtrar su lista') Musica = False if not Musica: self.updateStatus(False) def setupDomo(self): try: self.db['ConfigDomo'].drop() except: pass try: passar = False passar2 = False while not passar: try: self.contestar('En que posiciones del rele has conectado tus dispositivos? Di el numero de cada uno.') preNumero = self.getParaula() print preNumero numero = re.findall('\d+', preNumero) for i in xrange(len(numero)): if len(numero[i]) > 1: numero[i] = list(numero[i]) self.contestar('Son estas tus posiciones del rele? ' + '...'.join(numero)) while not passar2: try: resposta = self.getParaula() if "si" in resposta: passar = True passar2 = True else: self.contestar('Parece que hemos empezado con mal pie, mejor si volvemos a empezar.') passar2 = True except: self.contestar('Vuelve a decirlo') except: self.contestar('Ha habido un error, volvamos a empezar') p = {} for i in numero: passar = False while not passar: try: self.contestar('Que has conectado en el rele ' + str(i) + ' ?') cosaconectada = self.getParaula() if len(cosaconectada.split(' ',1)[0]) <= 3: cosaconectada = cosaconectada.split(' ',1)[1] p[cosaconectada] = int(i) - 1 passar = True except: pass self.db['ConfigDomo'].insert(p) self.contestar('Domotica configurada correctamente') except: self.contestar('Ha habido un error, vuelva a empezar.') def chisteAleatorio(self): req = urllib2.Request("http://pagina-del-dia.euroresidentes.es/chiste-del-dia/gadget-chiste-del-dia.php?modo=2") response = urllib2.urlopen(req) the_page = response.read() the_page = the_page.split('<td colspan="4" bgcolor="#FFFFFF">')[1].split('</td>')[0] if "<br>" in the_page: the_page = the_page.replace("<br>", "...") return the_page def guardarSerie(self, serie): file = open("/home/pi/AleixDomo/txt/seriemobils.txt", "w") file.write(serie) file.close() def checkCapitul(self, serie, TV3): serietrobada = 0 if TV3 == True: Dades = [line.rstrip('\n') for line in open('/home/pi/AleixDomo/txt/seriestv3.txt', 'r')] else: Dades = [line.rstrip('\n') for line in open('/home/pi/AleixDomo/txt/series.txt', 'r')] for i in Dades: i = i.split("/") if serie in i[0]: if TV3 == True: subprocess.Popen(["python","/home/pi/AleixDomo/Series/tv3.py", serie]) else: subprocess.Popen(["python","/home/pi/AleixDomo/Series/obtenirseriesflv.py", serie]) serietrobada = 1 break if serietrobada != 1: if TV3 == True: self.contestar("No has visto nunca esta serie, que capitulo quieres ver?") if self.entrada == 1: self.db['BotoStatus'].update({'id': None}, {'status': True}, upsert=True) self.guardarSerie(serie) else: self.contestar("No has visto nunca esta serie, que temporada y que capitulo quieres ver?") if self.entrada == 1: self.db['BotoStatus'].update({'id': None}, {'status': True}, upsert=True) self.guardarSerie(serie) return True else: return True def checkSerieTV3(self, serie): seriestv3 = [['39+1', '/tv3/alacarta/39mes1/'], ['Amb C maj\xc3\xbascula', '/tv3/alacarta/amb-c-majuscula/'], ['Arr\xc3\xb2s covat', '/tv3/alacarta/arroscovat/'], ['Being human', '/tv3/alacarta/being-human/'], ['Bola de Drac', '/tv3/alacarta/bola-de-drac/'], ['Bola de Drac GT', '/tv3/alacarta/un-mite-de-lanime/'], ['Bola de drac Z', '/tv3/alacarta/bola-de-drac-z/fitxa-programa/49176/'], ['Boulevard du Palais', '/tv3/alacarta/boulevard-du-palais/'], ['Cites', '/tv3/alacarta/cites/'], ['Dues dones divines', '/tv3/alacarta/divines/'], ['El crac', '/tv3/alacarta/el-crac/'], ['El Faro, cru\xc3\xaflla de camins', '/tv3/alacarta/el-faro-cruilla-de-camins/'], ['Infidels', '/tv3/alacarta/infidels/'], ['John Adams', '/tv3/alacarta/john-adams/'], ['Julie Lescaut', '/tv3/alacarta/julie-lescaut/'], ['Kubala, Moreno i Manch\xc3\xb3n', '/tv3/alacarta/kubala-moreno-i-manchon/'], ['La mem\xc3\xb2ria dels Cargols', '/tv3/alacarta/lamemoriadelscargols/'], ['La Riera', '/tv3/alacarta/la-riera/'], ['Merli', '/tv3/alacarta/merli/'], ['One piece', '/tv3/alacarta/one-piece/fitxa-programa/201374971/'], ['Pere i J\xc3\xbalia', '/tv3/alacarta/pere-i-julia/'], ['Pop R\xc3\xa0pid', '/tv3/alacarta/pop-rapid/'], ['Riviera', '/tv3/alacarta/riviera/'], ['Sitges', '/tv3/alacarta/sitges/'], ["Unitat d'investigaci\xc3\xb3", '/tv3/alacarta/unitat-investigacio/'], ['Vent del pla', '/tv3/alacarta/ventdelpla/'], ['Xooof', '/tv3/alacarta/xooof/']] seriefinal = False for i in xrange(len(seriestv3)): serieactual = seriestv3[i][0].lower() serieactual = serieactual.decode('utf-8') #ho passa de ASCII A utf-8 perque no doni error. serieactual = unicodedata.normalize('NFKD', serieactual).encode('ASCII', 'ignore') # li treu els accents i ho guarda com a ASCII if serie in serieactual: seriefinal = serieactual break return seriefinal def serie(self): missatgesplit = self.missatge.split() try: serie = missatgesplit[1:] serie = ' '.join(serie) if serie == "marley": serie = "merli" if len(serie) <= 3: self.contestar("Ha habido un error con la serie, porfavor, prueba otra vez.") return False except: self.contestar("Ha habido un error con la serie, porfaor, prueba otra vez.") return False if self.checkSerieTV3(serie) != False: checkCapitulx = self.checkCapitul(serie, True) else: if self.checkSerie(serie) == True: checkCapitulx = self.checkCapitul(serie, False) def checkSerie(self, serie): if serie == "los simpsons": serie = "los simpson" url = 'http://www.seriesflv.net/api/search' values = {'q' : serie} headers = { 'User-Agent' : "Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/43.0.2357.134 Safari/537.36" } r = requests.get(url, params = values, headers= headers).text soup = BeautifulSoup("".join(r)) urlfinallist = soup.findAll('a', href=re.compile('/serie/')) try: urlfinallist = str(urlfinallist[0]).split('href="')[1] return True except: subprocess.Popen(["python","/home/pi/AleixDomo/Series/obtenirtorrent.py", serie]) file = open("/home/pi/AleixDomo/txt/escoltar.txt", "w") file.write("1") file.close() return False def pararMusica(self): if self.spoticanso: self.spoticanso.stop() os.system("sudo pkill -f mostrarimatges.py") os.system("kill `pgrep omxplayer`") os.system('sudo sh -c "TERM=linux setterm -foreground black -clear >/dev/tty0"') if self.entrada == 2 or self.entrada == 3: self.contestar('Parando...') def siguienteMusica(self): if self.spoticanso: self.spoticanso.siguiente() def pausaMusica(self): if self.spoticanso: self.spoticanso.pause() def reanudarMusica(self): if self.spoticanso: self.spoticanso.resume() def agregarLlistaMusica(self): if len(self.missatge.split('lista')[1]) > 0: nomllista = self.missatge.split('lista ')[1] if "de" in nomllista.split(): nomllista = re.sub(r'\bde\b','', nomllista) else: nomllista = False if self.spoticanso: if self.spoticanso.llistaAgregar(nomllista): self.contestar('Agregado correctamente') else: self.contestar('Ha habido un error con su lista') def updateStatus(self, playing): if playing == True or playing == False: self.veu.playing = playing self.updateLog(playing) def domoControl(self): if self.ipprocc == False: try: self.ipprocc = self.db['Config'].find_one()['ip'] except: pass if self.ipprocc == False: self.contestar('No puedo encontrar la otra Raspberry, compruebe las conexiones.') else: numerorele = False if self.domoconfig == False: self.domoconfig = self.db['ConfigDomo'].find_one() if 'temperatura' in self.missatge or 'temperatura' in self.ultimissatge: for i in self.domoconfig: if 'caldera' in i or 'termostato' in i or 'calentador' in i: numerorele = self.domoconfig[i] break if numerorele != False: numero = False numero = int(re.search(r'\d+', self.missatge).group()) if numero != False: if numero < 15: client = pymongo.MongoClient(self.ipprocc, 27017) db = client['ProjectDB'] dblog = db['HLog'] temperatura = dblog.find({"type": 'temperature'}).sort("_id", -1).limit(1)[0]['data']['temperature'] if 'sube' in self.missatge: numero = int(temperatura) + numero elif 'baja' in self.missatge: numero = int(temperatura) - numero self.temperaturaSet(numerorele, numero) else: self.contestar('No se ha especificado una temperatura') else: if "enciende" in self.missatge: status = "1" missatge = 'Encendiendo ' elif "apaga" in self.missatge: status = "0" missatge = 'Apagando ' elif self.missatge == "apaga todo": status = "2" missatge = 'Apagando todos los aparatos.' for i in self.domoconfig: for x in self.missatge.split(): if i == x: objecte = i numerorele = self.domoconfig[i] if numerorele != False: self.encendreRele(numerorele, status) self.contestar(missatge + objecte) def encendreRele(self, numerorele, status): data = {"numerorele": numerorele, "status": status} resp = requests.get('http://' + self.ipprocc + '/control.php', params=data).text if resp != 'Ok': self.contestar('Ha habido un error.') def temperaturaSet(self, numerorele, temp): try: client = pymongo.MongoClient(self.ipprocc, 27017) db = client['ProjectDB'] db['DomoConfig'].update_one({"id": None },{"$set": {"reletemp": numerorele}}) db['DomoConfig'].update_one({"id": None },{"$set": {"temperatura": temp}}) self.contestar('De acuerdo.') self.contestar('Temperatura actual: ' + str(temp) + ' Grados.') except: self.contestar('Ha habido un error.') def updateLog(self, playing): p = {} p['playing'] = playing p['timestamp'] = datetime.datetime.now() p['missatge'] = self.missatge try: p['accio'] = self.accio except: pass try: p['ultimissatge'] = self.ultimissatge except: pass self.db['Status'].insert(p) def processarfuncions(self): i = self.accioid if i == 0: self.conversa() elif i == 1: self.multimedia() self.updateStatus(False) elif i == 2: self.missatge = self.missatge.replace("?", "") if "en" in self.missatge.split(): lloc = self.missatge.split()[-1] self.contestar(geolocation.TempsUbicacio(lloc, self.missatge)) else: requested = self.missatge.split()[-1] self.contestar(geolocation.AconseguirTemps(requested)) elif i == 3: self.pararMusica() self.updateStatus(False) elif i == 4: self.siguienteMusica() elif i == 5: self.missatge = self.missatge.replace("?", "") self.contestar(recordatoris.ComprobarDia(self.missatge)) elif i == 6: if recordatoris.AfegirRecordatori(self.missatge) == True: self.contestar("De acuerdo, me lo apunto.") else: self.contestar("No has configurado aun las tareas, para mas informacion, diga, o, escriba: ayuda tareas" ) elif i == 7: self.domoControl() elif i == 8: usuari = self.missatgesplit[1] contrassenya = self.missatgesplit[2] if recordatoris.RegistrarUsuari(usuari,contrassenya) == True: resposta = "Usuario registrado correctamente, ya puede usar las tareas, pruebe con recuerdame, y lo que quiera que le recuerde." self.contestar(resposta) else: resposta = "No se ha podido autenticar, compruebe su contraseña y usuario" self.contestar(resposta) elif i == 9: if self.ipprocc == False: try: self.ipprocc = self.db['Config'].find_one()['ip'] except: pass self.contestar(TemperaturaActual(self.ipprocc)) elif i == 10: self.contestar(self.chisteAleatorio()) elif i == 11: missatge = self.missatge.split('video')[1] subprocess.Popen(["python", "/home/pi/AleixDomo/Videos/youtube.py",missatge]) elif i == 12: contrassenya = open('/home/pi/AleixDomo/txt/contrassenya.txt', 'r').read() contrassenya = "... ".join(list(contrassenya)) self.contestarVeu("Mi contraseña es... " + contrassenya) self.contestarVeu(contrassenya) elif i == 13: self.updateStatus(True) self.reanudarMusica() elif i == 14: self.updateStatus(False) self.pausaMusica() elif i == 15: self.agregarLlistaMusica() elif i == 16: if "en que ano fue uno mas uno" in self.missatge or "en que ano fue 1 + 1" in self.missatge: resposta = "La respuesta es: el fantastico Ralph!" else: if "define" in self.missatge: self.missatge = self.missatge.split("define")[1] resposta = aconseguirResposta(self.missatge) self.contestar(resposta) elif i == 17: self.setupDomo() elif i == 18: resposta = "Registrese en https://todoist.com/Users/showRegister" resposta1 = "Y luego, envie su usuario i contraseña del siguiente modo, Tareas X Y Donde X es su usuario y Y su contraseña" if self.entrada == 2 or self.entrada == 3: self.contestar(resposta) self.contestar(resposta1) else: self.contestar("Para usar el modulo de tareas, debe crearse una cuenta en todoist, una vez creada debe enviarla por Whatsapp o Telegram, para mas informacion, escriba ayuda tareas en el movil.") elif i == 19: self.serie() def processarparaula(self): try: print self.ultimissatge except: pass if "tareas" not in self.missatge.lower(): self.missatge = self.missatge.lower() ielegida = False try: self.missatge = self.missatge.decode('utf8') self.missatge = unicodedata.normalize('NFKD', self.missatge).encode('ASCII', 'ignore') # li treu els accents i ho guarda com a ASCII except: pass self.missatgesplit = self.missatge.split() self.funcions.rewind() for i in self.funcions: try: if not ielegida: for x in i['paraules']: if x[1] >= 0: if i['in']: if x[0] in self.missatgesplit[x[1]]: ielegida = i break else: if x[0] == self.missatgesplit[x[1]]: ielegida = i break else: if i['in']: if x[0] in self.missatge: ielegida = i break else: if x[0] == self.missatge: ielegida = i break else: break except: pass if ielegida: self.accio = ielegida['nom'] self.accioid = ielegida['id'] self.processarfuncions() else: if "temporada" in self.missatgesplit[0]: processador1.temporada(self.missatge) elif "capitulo" in self.missatgesplit[0]: processador1.capitulo(self.missatge) else: if self.entrada == 2 or self.entrada == 3: self.contestar("Comando erronio, si necesita ayuda, escriba: Ayuda.") elif self.entrada == 1: self.contestarVeu(self.missatge + " " + "no existe, pruebe otra vez") self.ultimissatge = self.missatge