Re: [Python] comportamento def async
On Mon, 13 May 2024 at 22:19, Perini Matteo wrote: > vorrei leggere lo stato di un dispositivo ewelink (sonoff) tramite script ma > ricevo un comportamento che non capisco. > Se faccio uno script isolato […] > ottengo esattamente quello che voglio ovvero il print mi dice se il > dispositivo è on, off o offline. In questo script dove richiami `ask_status()`? > Come posso fare per forzare l'esecuzione di ask_status ogni volta che > richiamo la funzione check? In genere con le parentesi dopo il nome funzione async def check(update: Update, context: ContextTypes.DEFAULT_TYPE): await context.bot.send_message( chat_id=update.effective_chat.id, text=ask_status(the_client) ) Nota che dovresti restituire la stringa in `ask_status` piuttosto che stamparla su stdout @ewelink.login("Password", "em...@email.eu") async def ask_status(client: Client) -> str: device = client.get_device("1") try: return str(device.state.value) except DeviceOffline: return "Device is offline!" -- Andrea D'Amore ___ Python mailing list Python@lists.python.it https://lists.python.it/mailman/listinfo/python
Re: [Python] comportamento def async
Sicuro che il problema sia che ask_status non viene eseguita?Prova a mettere un print(datetime.now(UTC)) e vedi se e quante volte stampa la dataFederico On 13 May 2024, at 22:19, Perini Matteo wrote: Ciao, vorrei leggere lo stato di un dispositivo ewelink (sonoff) tramite script ma ricevo un comportamento che non capisco. Se faccio uno script isolato import ewelinkfrom ewelink import Client, DeviceOffline@ewelink.login('Password', 'em...@email.eu')async def ask_status(client: Client): device = client.get_device('1') try: print(device.state.value) except DeviceOffline: print("Device is offline!") ottengo esattamente quello che voglio ovvero il print mi dice se il dispositivo è on, off o offline. ho provato ad integrare la stessa funzione in uno script un po' più articolato per comunicare con un bot telegram. from telegram import Updatefrom telegram.ext import ApplicationBuilder, ContextTypes, CommandHandler, MessageHandler, filtersfrom credentials import TOKENimport ewelinkfrom ewelink import Client, DeviceOffline @ewelink.login('Password', 'em...@email.eu')async def ask_status(client: Client): device = client.get_device('1') try: print(device.state.value) except DeviceOffline: print("Device is offline!") async def start(update: Update, context: ContextTypes.DEFAULT_TYPE): await context.bot.send_message(chat_id=update.effective_chat.id, text="I'm a bot, please talk to me!") async def check(update: Update, context: ContextTypes.DEFAULT_TYPE): await context.bot.send_message(chat_id=update.effective_chat.id, text=ask_status) if __name__ == '__main__': application = ApplicationBuilder().token(TOKEN).build() start_handler = CommandHandler('start', start) check_handler = CommandHandler('check', check) application.add_handler(start_handler) application.add_handler(check_handler) application.run_polling() Il bot funziona (è un po' più complicato di così) ma quando chiamo "ask_status" mi restituisce sempre lo stato che aveva il dispositivo quando faccio partire il bot. Come posso fare per forzare l'esecuzione di ask_status ogni volta che richiamo la funzione check? Cosa mi sto perdendo? Grazie a chi mi può dare un suggerimento Matteo ___Python mailing listPython@lists.python.ithttps://lists.python.it/mailman/listinfo/python___ Python mailing list Python@lists.python.it https://lists.python.it/mailman/listinfo/python
[Python] comportamento def async
Ciao, vorrei leggere lo stato di un dispositivo ewelink (sonoff) tramite script ma ricevo un comportamento che non capisco. Se faccio uno script isolato importewelink fromewelinkimportClient, DeviceOffline @ewelink.login('Password', 'em...@email.eu') asyncdefask_status(client: Client): device= client.get_device('1') try: print(device.state.value) exceptDeviceOffline: print("Device is offline!") ottengo esattamente quello che voglio ovvero il print mi dice se il dispositivo è on, off o offline. ho provato ad integrare la stessa funzione in uno script un po' più articolato per comunicare con un bot telegram. fromtelegramimportUpdate fromtelegram.extimportApplicationBuilder, ContextTypes, CommandHandler, MessageHandler, filters fromcredentialsimportTOKEN importewelink fromewelinkimportClient, DeviceOffline @ewelink.login('Password', 'em...@email.eu') asyncdefask_status(client: Client): device= client.get_device('1') try: print(device.state.value) exceptDeviceOffline: print("Device is offline!") asyncdefstart(update: Update, context: ContextTypes.DEFAULT_TYPE): awaitcontext.bot.send_message(chat_id=update.effective_chat.id, text="I'm a bot, please talk to me!") asyncdefcheck(update: Update, context: ContextTypes.DEFAULT_TYPE): awaitcontext.bot.send_message(chat_id=update.effective_chat.id, text=ask_status) if__name__== '__main__': application= ApplicationBuilder().token(TOKEN).build() start_handler= CommandHandler('start', start) check_handler= CommandHandler('check', check) application.add_handler(start_handler) application.add_handler(check_handler) application.run_polling() Il bot funziona (è un po' più complicato di così) ma quando chiamo "ask_status" mi restituisce sempre lo stato che aveva il dispositivo quando faccio partire il bot. Come posso fare per forzare l'esecuzione di ask_status ogni volta che richiamo la funzione check? Cosa mi sto perdendo? Grazie a chi mi può dare un suggerimento Matteo ___ Python mailing list Python@lists.python.it https://lists.python.it/mailman/listinfo/python