× Benvenuti sul nostro forum su Sint Wind PI!

Postate qui domande o segnalate problemi / bug che riscontrate,

map-pin SWPI Plugins

Di più
11 Anni 7 Mesi fa - 11 Anni 7 Mesi fa #411 da tony
SWPI Plugins è stato creato da tony
Seguendo l'idea di Sandro ( anche di altri che mi hanno contattato per applicazioni particolari ) ho implementato a partire dalla versione 01.18.31 un semplice plugin manager per SWPI.

Praticamente troverete una sottocartella in più ("plugins") nella quale potere mettere i vostri moduli personalizzati che verranno caricati da SWPI.

Nella sotto-cartella troverete anche un esempio ( che non viene caricato ) . L'uso è molto banale :

Seguendo l'esigenza di Sandro con le tende da sole supponiamo di averle collegate al pin GPIO 4. Ogni 5 minuti il pluging controllerà l'intensità del vento e alzerà o abbasserà le tende di conseguenza.

E' solo un esempio e ovviamente và ottimizzato ma spero dia una idea dell'uso dei plugin:

class swpi_plugin(threading.Thread):  #  do not change the name of the class
    
    def __init__(self,cfg):
        self.cfg = cfg
        threading.Thread.__init__(self)
        

        ###################### Plugin Initialization ################
        GPIO.setmode(GPIO.BCM)
        GPIO.setwarnings(False)
        GPIO.setup(4, GPIO.OUT)   
        GPIO.output(4, 0)
        ###################### End Initialization ##################
        
        
    def run(self):
        log("Starting plugin : %s" % sys.modules[__name__])
   
        while 1:
            ###################### Plugin run
            if globalvars.meteo_data.wind_ave > 15: 
                GPIO.output(4, 1)
            else:
                GPIO.output(4, 0)
            ###################### end of Plugin run
            
            time.sleep(300)


Python è un linguaggio molto semplice da imparare ( non lo conoscevo prima di iniziare a lavorare su SWPI ) .
Per iniziare fatevi una copia del file di esempio chiamandolo per esempio tende.py e a quel punto verrà caricato
Modificate il codice tra le righe con i cancelletti per inizializzare e per gestire il loop principale
Ultima Modifica 11 Anni 7 Mesi fa da tony.
Ringraziano per il messaggio: alegrechi

Si prega Accedi a partecipare alla conversazione.

  • tetox
  • Avatar di tetox
  • Visitatori
  • Visitatori
11 Anni 7 Mesi fa #418 da tetox
Risposta da tetox al topic SWPI Plugins
Ciao Tony ...buona sera ...
Utilizzando il plugin spiegato sopra ...invece di controllare il vento , o altro evento ...non si pottrebbe controllare "l'avvenuto scatto della Cam" , e far scattare un qualsiasi gpio?? .
Che interrogazione dovrei fare per sapere che lo "scatto " e' appena avvenuto ??.(mi riallaccio alla mia richiesta fatta qualche tempo fa' )
Grazie Tony ...
Stefano

Si prega Accedi a partecipare alla conversazione.

Di più
11 Anni 7 Mesi fa #419 da tony
Risposta da tony al topic SWPI Plugins
Stefano,

Non con questa versione che è asincrona rispetto al ciclo di scatto. Dovresti implementare un pooling.
Vedo magari di aggiungerne uno fisso ma di tipo sincrono.

Si prega Accedi a partecipare alla conversazione.

  • tetox
  • Avatar di tetox
  • Visitatori
  • Visitatori
11 Anni 7 Mesi fa #423 da tetox
Risposta da tetox al topic SWPI Plugins
Grazie Tony...
aspettero' fiducioso il tuo intervento...
Ciao ciao
Stefano

ps:quando hai 5 minuti di relax pensa anche a come implementare la possibilita' di mandare i dati al CWOP
byeeee

Si prega Accedi a partecipare alla conversazione.

Di più
11 Anni 7 Mesi fa - 11 Anni 7 Mesi fa #424 da tony
Risposta da tony al topic SWPI Plugins
ora nella 01.18.48 c'è anche il plugin sincrono.

Nella cartella pugins c'è il file di esempio :

sync_plugin.py.example

per attivarlo basta rinomnarlo in sync_plugin.py eliminando example :
mv sync_plugin.py.example sync_plugin.py


A quel punto verrà caricato. Per personalizzarlo al solito và modificato il codice tra i cancelletti in tre punti:

Il primo per inizializzare eventuali variabili
il secondo è il codice che viene eseguito prima dell'inizio de ciclo principale
Il terzo viene eseguito dopo il ciclo principale
        
        ###################### Plugin Initialization ################
        log("Intitializing sync_plug-in " )
 #       GPIO.setmode(GPIO.BCM)
 #       GPIO.setwarnings(False)
 #       GPIO.setup(4, GPIO.OUT)   
 #       GPIO.output(4, 0)
        ###################### End Initialization ##################
        
        
    def run_before(self):
        log("Running sync plugin [run_before]..")
        ###################### Plugin run
        
#        if globalvars.meteo_data.wind_ave > 15: 
#            GPIO.output(4, 1)
#        else:
#            GPIO.output(4, 0)
        ###################### end of Plugin run


    def run_after(self):
        log("Running sync plugin [run_after]..")

        ###################### Plugin run
  #      if globalvars.meteo_data.wind_ave > 15: 
  #          GPIO.output(4, 0)
  #      else:
  #          GPIO.output(4, 1)
        ###################### end of Plugin run
Ultima Modifica 11 Anni 7 Mesi fa da tony.
Ringraziano per il messaggio: alegrechi

Si prega Accedi a partecipare alla conversazione.

  • tetox
  • Avatar di tetox
  • Visitatori
  • Visitatori
11 Anni 7 Mesi fa #425 da tetox
Risposta da tetox al topic SWPI Plugins
Grazie tony...
appena rientro in italia (sabato/domenica)provero' immediatamente
il plugin ...entro la prossima settimana riferiro' .
grazie ancora
stefano

Si prega Accedi a partecipare alla conversazione.

Di più
11 Anni 7 Mesi fa #427 da pfeifer
Risposta da pfeifer al topic SWPI Plugins
Che dire Tony,
sei stato velocissimo.
Non resta che provare :-)
Grazie mille
Sandro

Si prega Accedi a partecipare alla conversazione.

  • tetox
  • Avatar di tetox
  • Visitatori
  • Visitatori
11 Anni 7 Mesi fa - 11 Anni 7 Mesi fa #433 da tetox
Risposta da tetox al topic SWPI Plugins
Sera a tutti..
Non ho resistito e ho provato subito il plugin ..
purtroppo a me' blocca l'esecuzione sia dell'invio dati , sia lo scatto cam.
Disattivato il plugin tutto e' ritornato ok , ho notato che nella cartella Plugin c'e' il file __init__.py che e' vuoto , valore 0 (zero) e' giusto cosi' ???
Dai Tony ..che se funzionera' questa cosa ...aprira' un mondo di giochi !!
Ciao Stefano
Ultima Modifica 11 Anni 7 Mesi fa da tetox.

Si prega Accedi a partecipare alla conversazione.

Di più
11 Anni 7 Mesi fa - 11 Anni 7 Mesi fa #434 da tony
Risposta da tony al topic SWPI Plugins
ok. do una occhiata quanto prima

__init__.py deve essere vuoto e non lo rimuovere.
Posta il codice del tuo plugin
Ultima Modifica 11 Anni 7 Mesi fa da tony.

Si prega Accedi a partecipare alla conversazione.

Di più
11 Anni 7 Mesi fa - 11 Anni 7 Mesi fa #436 da tony
Risposta da tony al topic SWPI Plugins
Giusto un esempio di plugin asincrono:

Per la stazione in montagna avevo la necessità di svincolare l'invio dei dati a WeatherUndergraund dagli scatti della camera. Volevo l'aggiornamento dei dati a 1 minuto ma non volevo scattare foto ogni minuto per non bruciare prematuramente il CCD. Ecco il plugin. Sono solo 2 righe di codice da inserire tra i cancelletti dell'esempio fornito.
time.sleep(60-datetime.datetime.now().second) 
logDataToWunderground(self.cfg.WeatherUnderground_ID,self.cfg.WeatherUnderground_password)
La prima riga attende lo scoccare del minuto mentre la seconda invia i dati. A questo punto ho disattivato l'invio tramite ciclo principale.
Sotto il file completo


Allegato wunderground.rar non trovato

Allegati:
Ultima Modifica 11 Anni 7 Mesi fa da tony.

Si prega Accedi a partecipare alla conversazione.

  • tetox
  • Avatar di tetox
  • Visitatori
  • Visitatori
11 Anni 7 Mesi fa #438 da tetox
Risposta da tetox al topic SWPI Plugins
Buon giorno Tony..
Io ho attivato il plugin modificando solamente questo :
###########################################################################
#     Sint Wind PI
#     Copyright 2012 by Tonino Tarsi <tony.tarsi@gmail.com>
#   
#     USB comunication based pywws by 'Jim Easterbrook' <jim@jim-easterbrook.me.uk>
#     Please refer to the LICENSE file for conditions 
#     Visit http://www.vololiberomontecucco.it
# 
##########################################################################

"""example plugin."""

import threading
import random
import datetime
import sqlite3
import sys
import subprocess
import sys 
import os
import thread
import time

import globalvars
import meteodata
from TTLib import  *
import RPi.GPIO as GPIO



class swpi_sync_plugin(object):  #  do not change the name of the class
    
    def __init__(self,cfg):
        self.cfg = cfg

        
        ###################### Plugin Initialization ################
        log("Intitializing sync_plug-in " )
        GPIO.setmode(GPIO.BCM)
        GPIO.setwarnings(False)
        GPIO.setup(4, GPIO.OUT)   
        GPIO.output(4, 0)
T =0.5

        ###################### End Initialization ##################
        
        
    def run_before(self):
        log("Running sync plugin [run_before]..")
        ###################### Plugin run
        
#        if globalvars.meteo_data.wind_ave > 15: 
#            GPIO.output(4, 1)
#        else:
#            GPIO.output(4, 0)
        ###################### end of Plugin run


    def run_after(self):
        log("Running sync plugin [run_after]..")

        ###################### Plugin run
  #      if globalvars.meteo_data.wind_ave > 15: 
  #          GPIO.output(4, 0)
  #      else:
  #          GPIO.output(4, 1)

 GPIO.output(4, 1)
  time.sleep(T)
   GPIO.output(4, 0)

        ###################### end of Plugin run

in pratica dopo il def run_after(self):
mi dovrebbe attivare il gpio 4 per mezzo secondo .
Comunque nel pomeriggio lo riprovo di nuovo , perche' mi sembra di non aver fatto nulla di strano.
Buon pranzo Tony ..alla prossima
Stefano

Si prega Accedi a partecipare alla conversazione.

  • tetox
  • Avatar di tetox
  • Visitatori
  • Visitatori
11 Anni 7 Mesi fa #439 da tetox
Risposta da tetox al topic SWPI Plugins
Arieccomi !!
Riprovando il plugin e controllando da terminale esce questo errore :
10.....9.....8.....7.....6.....5.....4.....3.....2.....1.....
[28/04/2013-15:36:42] Checking internet connetion ...
[28/04/2013-15:36:42] Starting sensor reading - Sensor type is : WM918
[28/04/2013-15:36:42] Thread started
[28/04/2013-15:36:42] Opening serial port
[28/04/2013-15:36:42] Serial port open
[28/04/2013-15:36:42] Internet ok
[28/04/2013-15:36:42] Checking internet connetion ...
[28/04/2013-15:36:42] Internet ok
[28/04/2013-15:36:43] Connected with IP : 2.32.18.128
[28/04/2013-15:36:43] Local IP :192.168.1.99 Public IP :  2.32.18.128
[28/04/2013-15:36:43] Config Server running on port 80
[28/04/2013-15:36:43] Starting General WatchDog
dom 28 apr 2013, 15.36.43, CEST
[28/04/2013-15:36:43] System time adjusted from NPT server : europe.pool.ntp.org
[28/04/2013-15:36:46] Mail sent to :tetotex@gmail.com
[28/04/2013-15:36:46] Calculating Meteo data and statistics
[28/04/2013-15:36:48] Deleting file from Canon PowerShot S45 (normal mode)
[28/04/2013-15:36:49] loading plugins
[28/04/2013-15:36:49] Loading sync plugin
Traceback (most recent call last):
  File "swpi.py", line 662, in <module>
    import plugins.sync_plugin as pls
  File "/home/pi/swpi/plugins/sync_plugin.py", line 48
    def run_before(self):
    ^
IndentationError: unexpected indent

alla linea 48 c'e' questo:
def run_before(self):
        log("Running sync plugin [run_before]..")

Per ora e' tutto..
Stefano

Si prega Accedi a partecipare alla conversazione.

Di più
11 Anni 7 Mesi fa - 11 Anni 7 Mesi fa #440 da tony
Risposta da tony al topic SWPI Plugins
Solito problema con gli indent di python.
Python non ha parentesi o altro per delimitare i blocchi di codice ma usa l'indentazione che deve sempre esser la stessa su tutto il modulo.

Il codice corretto è :
###########################################################################
#     Sint Wind PI
#     Copyright 2012 by Tonino Tarsi <tony.tarsi@gmail.com>
#   
#     USB comunication based pywws by 'Jim Easterbrook' <jim@jim-easterbrook.me.uk>
#     Please refer to the LICENSE file for conditions 
#     Visit http://www.vololiberomontecucco.it
# 
##########################################################################

"""example plugin."""

import threading
import random
import datetime
import sqlite3
import sys
import subprocess
import sys 
import os
import thread
import time

import globalvars
import meteodata
from TTLib import  *
import RPi.GPIO as GPIO



class swpi_sync_plugin(object):  #  do not change the name of the class

    def __init__(self,cfg):
        self.cfg = cfg
        ###################### Plugin Initialization ################
        log("Intitializing sync_plug-in " )
        GPIO.setmode(GPIO.BCM)
        GPIO.setwarnings(False)
        GPIO.setup(4, GPIO.OUT)   
        GPIO.output(4, 0)
        selt.T = 0.5

        ###################### End Initialization ##################
        
        
    def run_before(self):
        log("Running sync plugin [run_before]..")


    def run_after(self):
        log("Running sync plugin [run_after]..")
        GPIO.output(4, 1)
        time.sleep(self.T)
        GPIO.output(4, 0)

        ###################### end of Plugin run
Ultima Modifica 11 Anni 7 Mesi fa da tony.

Si prega Accedi a partecipare alla conversazione.

  • tetox
  • Avatar di tetox
  • Visitatori
  • Visitatori
11 Anni 7 Mesi fa #441 da tetox
Risposta da tetox al topic SWPI Plugins
Tony ...
Non gli e' piaciuto neanche questa volta !!
[28/04/2013-18:42:37] Calculating Meteo data and statistics
[28/04/2013-18:42:38] Deleting file from Canon PowerShot S45 (normal mode)
[28/04/2013-18:42:39] loading plugins
[28/04/2013-18:42:39] Loading sync plugin
[28/04/2013-18:42:39] Intitializing sync_plug-in
Traceback (most recent call last):
  File "swpi.py", line 663, in <module>
    plugin_sync = pls.swpi_sync_plugin(cfg)
  File "/home/pi/swpi/plugins/sync_plugin.py", line 41, in __init__
    selt.T = 0.5
NameError: global name 'selt' is not defined
[28/04/2013-18:42:42] Logging data to Database
[28/04/2013-18:42:42] Dir: E - Spd: 7.92 - Gst: 9.36 - T: 22.6 - P: 1013.4 - U: 27 - R: 0 - CB: 2494
^C^C
Per l'indentazione errata ...mi son tirato le orecchie da solo !! :sick:
logicamente questa prova l'ho fatta con l'ultimo codice postato da te.
Bye
Stefano

Si prega Accedi a partecipare alla conversazione.

  • tetox
  • Avatar di tetox
  • Visitatori
  • Visitatori
11 Anni 7 Mesi fa #442 da tetox
Risposta da tetox al topic SWPI Plugins
Tonyyyy..!!!
ho rimediato ....a modo mio ..sic!!!
ho tolto selt.T = 0.5
e ho messo direttamente time.sleep(0.5)
lo so' che e' poco elegante maa funzionaaa!!
Tony ..mettiti in posa ...che ti facciamo un monumento ..
grazie grazie
Stefano

Si prega Accedi a partecipare alla conversazione.

Di più
11 Anni 7 Mesi fa - 11 Anni 7 Mesi fa #443 da tony
Risposta da tony al topic SWPI Plugins
si .. avevo sbagliato a scrivere "self" in "selt" ma và benissimo anche come hai fatto tu :-)
Ultima Modifica 11 Anni 7 Mesi fa da tony.

Si prega Accedi a partecipare alla conversazione.

  • tetox
  • Avatar di tetox
  • Visitatori
  • Visitatori
11 Anni 7 Mesi fa #479 da tetox
Risposta da tetox al topic SWPI Plugins
Ciao ..
Sto' cercando di aggiungere al sync_plugin (che funziona alla perfezione !!)
questo ulteriore comando
def run(self):
        log("Starting plugin : %s" % sys.modules[__name__])
   
        while 1:
            ###################### Plugin run
            if globalvars.meteo_data.temp_in > 20: 
                SendMail(self.cfg, "Temperatura", "La temperatura ha superato i 20 gradi", None):
            ###################### end of Plugin run
Purtroppo mi restituisce un "errore di sintassi "
..ma dove sara' questo errore ??
Grazie Tony ..
Stefano

Si prega Accedi a partecipare alla conversazione.

Di più
11 Anni 7 Mesi fa #480 da tony
Risposta da tony al topic SWPI Plugins
Stefano,
C'è un ":" di troppo alla fine dell'istruzione SendMail.
I ":" vanno solo messi alla fine delle istruzioni di controllo (if,else,while,for....)

Si prega Accedi a partecipare alla conversazione.

  • tetox
  • Avatar di tetox
  • Visitatori
  • Visitatori
11 Anni 6 Mesi fa #490 da tetox
Risposta da tetox al topic SWPI Plugins
Grazie Tony ...come sempre gentile e paziente ..
Solo che' tolti i ":" l'errore e' sparito , pero' lo script sembra non funzionare .io ho provato a fare cosi' :
cut....
cut...
def run_after(self):
        log("Running sync plugin [run_after]..")

        ###################### Plugin run
  
        GPIO.output(4, 1)
        time.sleep(0.5)
        GPIO.output(4, 0)
        
        time.sleep(10)

    def run(self):
        log("Starting plugin : %s" % sys.modules[__name__])
        while 1:        
            if globalvars.meteo_data.temp_in > 18: 
                SendMail(self.cfg, "Temperatura", "La temperatura ha superato i 18 gradi", None)

        ###################### end of Plugin run
Non parte nessuna email , (logicamente la temperatura e' superiore ai 18 gradi) , poi ho provato cosi:
def run_after(self):
        log("Running sync plugin [run_after]..")

        ###################### Plugin run
  
        GPIO.output(4, 1)
        time.sleep(0.5)
        GPIO.output(4, 0)
        time.sleep(10)
        
        if globalvars.meteo_data.temp_in > 18: 
             SendMail(self.cfg, "Temperatura", "La temperatura ha superato i 18 gradi", None)

        ###################### end of Plugin run
In questa maniera mi da questo errore :
[04/05/2013-16:40:59] ERROR sending mail
Exeption coercing to Unicode: need string or buffer, NoneType found

Quale e' la giusta sequenza??
Stefano

Si prega Accedi a partecipare alla conversazione.

Di più
11 Anni 6 Mesi fa #493 da tony
Risposta da tony al topic SWPI Plugins
Ha sempre ragione lui :-)

il comando corretto è :

SendMail(self.cfg, "Temperatura", "La temperatura ha superato i 18 gradi", "")

Togli io None metti una stringa vuota come attachment ""

Si prega Accedi a partecipare alla conversazione.

  • Mario201303
  • Avatar di Mario201303
  • Visitatori
  • Visitatori
11 Anni 6 Mesi fa #901 da Mario201303
Risposta da Mario201303 al topic SWPI Plugins
Salve, prima di tutto vi ringrazio per le risposte date.
Volevo sapere se si può fare un plugins che ad una certa velocità del vento e direzione chiama un numero di cellulare, grazie

Si prega Accedi a partecipare alla conversazione.

Di più
11 Anni 5 Mesi fa #1160 da Roberto Vaccaro
Risposta da Roberto Vaccaro al topic SWPI Plugins
Ciao Tony
sto provando questo plugin:
###########################################################################
#     Sint Wind PI
#     Copyright 2012 by Tonino Tarsi <tony.tarsi@gmail.com>
#   
#     USB comunication based pywws by 'Jim Easterbrook' <jim@jim-easterbrook.me.uk>
#     Please refer to the LICENSE file for conditions 
#     Visit http://www.vololiberomontecucco.it
# 
##########################################################################

"""example plugin."""

import threading
import random
import datetime
import sqlite3
import sys
import subprocess
import sys 
import os
import thread
import time

import globalvars
import meteodata
from TTLib import  *
import RPi.GPIO as GPIO



class swpi_sync_plugin(object):  #  do not change the name of the class
    
    def __init__(self,cfg):
        self.cfg = cfg

        
        ###################### Plugin Initialization ################
        log("Intitializing sync_plug-in " )
 #       GPIO.setmode(GPIO.BCM)
 #       GPIO.setwarnings(False)
 #       GPIO.setup(4, GPIO.OUT)   
 #       GPIO.output(4, 0)
        ###################### End Initialization ##################
        
        
    def run_before(self):
        log("Running sync plugin [run_before]..")
        ###################### Plugin run
        
#        if globalvars.meteo_data.wind_ave > 15: 
#            GPIO.output(4, 1)
#        else:
#            GPIO.output(4, 0)
        ###################### end of Plugin run


    def run_after(self):
        log("Running sync plugin [run_after]..")

        ###################### Plugin run
  #      if globalvars.meteo_data.wind_ave > 15: 
  #          GPIO.output(4, 0)
  #      else:
  #          GPIO.output(4, 1)

	 
        
        if globalvars.meteo_data.temp_in > 18: 
             SendMail(self.cfg, "Temperatura", "La temperatura ha superato i 18 gradi","")

        ###################### end of Plugin run
vedo da log che viene caricato senza errori ma non ricevo nessuna e-mail, ovviamente la temperatura interna è superiore ai 18°.

Un'altra domanda il tuo plugin "AllLogger" funziona solo su wunderground o anche sull'invio del file meteo.txt ?

Si prega Accedi a partecipare alla conversazione.

Di più
11 Anni 5 Mesi fa #1161 da Roberto Vaccaro
Risposta da Roberto Vaccaro al topic SWPI Plugins
:) Tutto risolto!

Si prega Accedi a partecipare alla conversazione.

Di più
11 Anni 5 Mesi fa #1162 da tony
Risposta da tony al topic SWPI Plugins
Bene :-)

Postalo come allegato ( ho abilitato l'upload dei .py ) . Un pluging che invia mail al superamento di una certa temperatura può essere utile ad altri.

Si prega Accedi a partecipare alla conversazione.

Di più
11 Anni 5 Mesi fa #1163 da Roberto Vaccaro
Risposta da Roberto Vaccaro al topic SWPI Plugins
Volentieri, ma è quello che aveva fatto tetox

Si prega Accedi a partecipare alla conversazione.

Di più
11 Anni 5 Mesi fa #1165 da tony
Risposta da tony al topic SWPI Plugins
ok :-)

Si prega Accedi a partecipare alla conversazione.

Di più
11 Anni 4 Mesi fa #1366 da Elia
Risposta da Elia al topic SWPI Plugins
Salve ho configurato la mia centralina Come da guida e volevo sapere se per far si che venga eseguito un plugin basta solo posizionare uno script dentro la cartella plugin grazie

Si prega Accedi a partecipare alla conversazione.

Di più
11 Anni 4 Mesi fa #1369 da Roberto Vaccaro
Risposta da Roberto Vaccaro al topic SWPI Plugins
Si certamente
Ovviamente il plugin deve essere scritto correttamente.
Ringraziano per il messaggio: Mario201303

Si prega Accedi a partecipare alla conversazione.

Di più
11 Anni 4 Mesi fa #1374 da Elia
Risposta da Elia al topic SWPI Plugins
Salve, volevo sapere come mai mi da questo errore se uso un plugins grazie:
[10/07/2013-22:22:31] Trying to get time from WH1080. Please wait ...
Exception happened during processing of request from ('78.13.144.194', 50045)
mer 10 lug 2013, 22.23.00, CEST

Si prega Accedi a partecipare alla conversazione.

Di più
11 Anni 4 Mesi fa #1375 da Elia
Risposta da Elia al topic SWPI Plugins
Salve, forse ho trovato l'errore, volevo chiedervi se sono presenti le librerie urlib2, httplib e urlib grazie

Si prega Accedi a partecipare alla conversazione.

Tempo creazione pagina: 0.964 secondi