Re: [Python] comportamento def async

2024-05-14 Per discussione Andrea D'Amore
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

2024-05-13 Per discussione Federico Fissore
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

2024-05-13 Per discussione Perini Matteo

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