TizianoL
Posts: 19
Joined: Tue May 26, 2020 8:11 am

Problema script python stazione meteo

Tue May 26, 2020 8:25 am

Salve a tutti,
mi chiamo Tiziano e mi sono appena iscritto.
Mi sono avvicinato ad un raspberry pi 4 qualche mese fa interessato a mettere in piedi una stazione meteo.
Mi sono documentato molto anche in questo spazio e la stazione è funzionante ma ha qualche problema e vorrei riuscire ad ottimizzarla, se possibile, con il vostro aiuto.
A grandi linee il sistema è composto dal Rasp che raccoglie i dati tramite uno script python e li spedisce a una pagina php che li inserisce in un db per poi essere visualizzati in un sito web.
I problemi principali sono due:
- A volte capita che lo script smetta di girare per un errore di rete e non riparte più;
- Ho provato a schedulare la partenza dello script con cronbat al boot del sistema ma non sempre funziona.

Il sistema lo raggiungo sia con putty che con vnc, ma forse mi sfugge qualche concetto base di funzionamento del Rasp in quanto, quando mi accorgo che lo script è fermo, sia se faccio il reboot da putty che da vnc sembra non ripartire.
Adesso sono 4 giorni che è fermo e non c'è stato verso. Anche staccando l'alimentazione niente.
Cosa posso fare per risolvere questi problemi dato che prima o poi vorrei installare sul sito definitivo il sistema e dovrei controllarlo da remoto senza possibilità di accesso?

Grazie a tutti quelli che avranno la pazienza di leggere tutto e darmi una mano,
Tiziano.

_Marco_
Posts: 19
Joined: Thu Apr 02, 2020 1:18 pm
Location: some island, south mediterranean

Re: Problema script python stazione meteo

Wed May 27, 2020 1:15 pm

Ciao Tiziano.

Bello il progetto, anche io ne ho fatto uno simile, ma senza il terminale php.
Hai provato ad aggiungere il file python nella lista di quelli che devono essere eseguiti all'avvio?
Io nel mio caso, imponevo che il mio file python (sovra-)scrivesse di continuo su un file di testo l'ultimo timestamp disponibile. Un secondo script lo leggeva. Se, per qualche motivo, passavano (per esempio), piu' di 10 minuti tra la ora/data del file di testo e quella attuale, facevo ripartire il sistema (sudo reboot), dopo aver mandato una email di imminente riavvio. Al risveglio, dopo qualche secondo, lo scrip ripartiva senza problemi.

Prova a dare uno sguardo qui:
viewtopic.php?t=46125

Spero di esserti stato utile, fammi sapere se funziona.
Ciao
Marco
https://www.youtube.com/watch?v=bukPjk5zdLc

nicolap8
Posts: 576
Joined: Mon Mar 13, 2017 9:45 pm

Re: Problema script python stazione meteo

Wed May 27, 2020 4:33 pm

TizianoL wrote:
Tue May 26, 2020 8:25 am
Salve a tutti,
mi chiamo Tiziano e mi sono appena iscritto.
Ciao
A grandi linee il sistema è composto dal Rasp che raccoglie i dati tramite uno script python e li spedisce a una pagina php che li inserisce in un db per poi essere visualizzati in un sito web.
Una curiosità: perché non li inserisci nel db direttamente da Python?

I problemi principali sono due:
- A volte capita che lo script smetta di girare per un errore di rete e non riparte più;
Errore? Messaggio?? Log???
Il "watchdog" proposto da @_marco_ è un sistema interessante ma prima devi fare un controllo degli errori serio e robusto.

- Ho provato a schedulare la partenza dello script con cronbat al boot del sistema ma non sempre funziona.
Per far partire un programma al boot io non ho mai usato "crontab", anche se ci sono esempi in proposito https://www.raspberrypi.org/documentati ... ge/cron.md
Preferisco inserire il comando in /etc/rc.local

Comunque se vuoi aiuto devi fornire maggiori dettagli "tecnici"!

TizianoL
Posts: 19
Joined: Tue May 26, 2020 8:11 am

Re: Problema script python stazione meteo

Wed May 27, 2020 10:55 pm

Ciao Marco
_Marco_ wrote: Hai provato ad aggiungere il file python nella lista di quelli che devono essere eseguiti all'avvio?
La schedulazione l'ho fatta in crontab, ma prima l'avevo provata anche in rc.local e il problema era sempre lo stesso. Dopo un pò si fermava e non ne voleva più sapere di ripartire, nemmeno con reboot. Ripartiva solo se collegavo fisicamente il rasp a un monitor e facevo il reboot da li.
Io nel mio caso, imponevo che il mio file python (sovra-)scrivesse di continuo su un file di testo l'ultimo timestamp disponibile. Un secondo script lo leggeva. Se, per qualche motivo, passavano (per esempio), piu' di 10 minuti tra la ora/data del file di testo e quella attuale, facevo ripartire il sistema (sudo reboot), dopo aver mandato una email di imminente riavvio. Al risveglio, dopo qualche secondo, lo scrip ripartiva senza problemi.
Potrebbe essere un'idea ma vorrei seguirla proprio come ultima scelta perchè l'idea di avere due script che girano per poterne far lavorare uno mi sembra troppo. Non è una critica alla tua soluzione, ma credo che ci sia un metodo più "elegante".

Ciao nicolap8
nicolap8 wrote: Una curiosità: perché non li inserisci nel db direttamente da Python?
L'host che uso, se non ho capito male, non permette l'accesso al db da applicazioni esterne.
Errore? Messaggio?? Log???
Il "watchdog" proposto da @_marco_ è un sistema interessante ma prima devi fare un controllo degli errori serio e robusto.
In questo momento non ho più disponibile l'errore ma ricordo che era riferito a una mancata connessione alla pagina php a cui spedisco i dati.
Ho inserito un try catch nel codice che dovrebbe loggare gli errori riscontrati e in effetti lo fa, ma se faccio il reboot oltre a non ripartire lo script spesso sparisce anche il file di log.
Per far partire un programma al boot io non ho mai usato "crontab", anche se ci sono esempi in proposito https://www.raspberrypi.org/documentati ... ge/cron.md
Preferisco inserire il comando in /etc/rc.local
Comunque se vuoi aiuto devi fornire maggiori dettagli "tecnici"!
Avevo provato anche io a inserire tutto in rc.local ma anche li avevo gli stessi problemi. Se lo script si fermava poi non ripartiva più.
Che dettagli tecnici ti servono?
Chiedi e proverò a risponderti nel modo più chiaro possibile considerando la mia inesperienza su questi sistemi.

Ciao e grazie ad entrambi
Tiziano

nicolap8
Posts: 576
Joined: Mon Mar 13, 2017 9:45 pm

Re: Problema script python stazione meteo

Thu May 28, 2020 8:48 am

TizianoL wrote:
Wed May 27, 2020 10:55 pm
Ciao Marco
_Marco_ wrote: Hai provato ad aggiungere il file python nella lista di quelli che devono essere eseguiti all'avvio?
La schedulazione l'ho fatta in crontab, ma prima l'avevo provata anche in rc.local e il problema era sempre lo stesso. Dopo un pò si fermava e non ne voleva più sapere di ripartire, nemmeno con reboot. Ripartiva solo se collegavo fisicamente il rasp a un monitor e facevo il reboot da li.
Io nel mio caso, imponevo che il mio file python (sovra-)scrivesse di continuo su un file di testo l'ultimo timestamp disponibile. Un secondo script lo leggeva. Se, per qualche motivo, passavano (per esempio), piu' di 10 minuti tra la ora/data del file di testo e quella attuale, facevo ripartire il sistema (sudo reboot), dopo aver mandato una email di imminente riavvio. Al risveglio, dopo qualche secondo, lo scrip ripartiva senza problemi.
Potrebbe essere un'idea ma vorrei seguirla proprio come ultima scelta perchè l'idea di avere due script che girano per poterne far lavorare uno mi sembra troppo. Non è una critica alla tua soluzione, ma credo che ci sia un metodo più "elegante".
Confondi il problema della partenza automatica con il "watchdog". Sono cose ben distinte. https://it.wikipedia.org/wiki/Watchdog

nicolap8 wrote: Una curiosità: perché non li inserisci nel db direttamente da Python?
L'host che uso, se non ho capito male, non permette l'accesso al db da applicazioni esterne.
Attento: questa informazione non ce l'hai data prima! Non avevi detto che i dati sono pubblicati su un'altra macchina. Questo genere di dettagli è fondamentale, non preoccuparti di dare troppe informazioni, meglio che troppo poche!

Errore? Messaggio?? Log???
Il "watchdog" proposto da @_marco_ è un sistema interessante ma prima devi fare un controllo degli errori serio e robusto.
In questo momento non ho più disponibile l'errore ma ricordo che era riferito a una mancata connessione alla pagina php a cui spedisco i dati.
Ho inserito un try catch nel codice che dovrebbe loggare gli errori riscontrati e in effetti lo fa, ma se faccio il reboot oltre a non ripartire lo script spesso sparisce anche il file di log.
Linux non fa sparire i file dell'utente, quindi lo fa il tuo programma: correggilo! E posta il log.

Per far partire un programma al boot io non ho mai usato "crontab", anche se ci sono esempi in proposito https://www.raspberrypi.org/documentati ... ge/cron.md
Preferisco inserire il comando in /etc/rc.local
Comunque se vuoi aiuto devi fornire maggiori dettagli "tecnici"!
Avevo provato anche io a inserire tutto in rc.local ma anche li avevo gli stessi problemi. Se lo script si fermava poi non ripartiva più.
Quindi sono più problemi diversi:
1) autoesecuzione
2) errore del programma
3) strano lockup del Raspberry

Per il n. 1 la soluzione migliore è la più semplice: rc.local.

Per il 2, bisogna vedere il messaggio di errore...

Il 3 mi preoccupa di più! Naturalmente e probabilmente dipende dal 2. Per capire dovresti testare separatamente i diversi moduli del programma: acquisizione e trasmissione.
Ciao
N

TizianoL
Posts: 19
Joined: Tue May 26, 2020 8:11 am

Re: Problema script python stazione meteo

Thu May 28, 2020 1:11 pm

Ciao Nicola e grazie per la risposta.

Allora facciamo che parto da un log decente dello script.
In rete avevo trovato qualcosa sulla libreria "logging" dove c'era anche un esempio.
Ho preso il codice e l'ho inserito nello script. Il codice è il seguente:

Code: Select all

import logging
logging.basicConfig(filename='/tmp/rc_test.log', level=logging.DEBUG, 
                    format='%(asctime)s %(levelname)s %(name)s %(message)s')
logger=logging.getLogger(__name__)
Lo script è composto da un loop infinito (while true) che legge i valori dei sensori e li spedisce.
All'interno del ciclo c'è un try/except .
Di seguito l'except :

Code: Select all

    except Exception as e:
        logger.error(e)
E' una soluzione valida?
Consigli di loggare in modo diverso?
Sono nelle tue mani ;)

Grazie
Tiziano

nicolap8
Posts: 576
Joined: Mon Mar 13, 2017 9:45 pm

Re: Problema script python stazione meteo

Thu May 28, 2020 1:40 pm

TizianoL wrote:
Thu May 28, 2020 1:11 pm
Allora facciamo che parto da un log decente dello script.
In rete avevo trovato qualcosa sulla libreria "logging" dove c'era anche un esempio.
Ho preso il codice e l'ho inserito nello script. Il codice è il seguente:

Code: Select all

import logging
logging.basicConfig(filename='/tmp/rc_test.log', level=logging.DEBUG, 
                    format='%(asctime)s %(levelname)s %(name)s %(message)s')
logger=logging.getLogger(__name__)
Lo script è composto da un loop infinito (while true) che legge i valori dei sensori e li spedisce.
All'interno del ciclo c'è un try/except .
Di seguito l'except :

Code: Select all

    except Exception as e:
        logger.error(e)
1) il file di log non lo metterei in /tmp e farei in modo di dargli un nome che dipende dalla data e ora di start del programma.
2) non uso Python quindi non conosco i dettagli delle eccezioni ma a seconda dell'errore potrebbe essere necessario fare qualcosa per reimpostare l'acquisizione o la trasmissione, etc.
3) se una funzione può ritornare un codice di errore, questo non va ignorato ma almeno loggato!
4) posta tutto il codice che puoi...

TizianoL
Posts: 19
Joined: Tue May 26, 2020 8:11 am

Re: Problema script python stazione meteo

Thu May 28, 2020 2:02 pm

Posto il listato di tutto il codice non ho problemi e ti ringrazio per l'aiuto.
Elimino solo alcuni commenti e l'indirizzo del sito a cui spedisco i dati, non si sa mai chi incappa in questi post :D

Code: Select all

#!/usr/bin/env python
import logging
logging.basicConfig(filename='/tmp/rc_test.log', level=logging.DEBUG, 
                    format='%(asctime)s %(levelname)s %(name)s %(message)s')
logger=logging.getLogger(__name__)

import time
import datetime
import requests
import board
import busio
import adafruit_bme280
i2c = busio.I2C(board.SCL, board.SDA)

import adafruit_ads1x15.ads1015 as ADS
from adafruit_ads1x15.analog_in import AnalogIn

import RPi.GPIO as GPIO

bme = adafruit_bme280.Adafruit_BME280_I2C(i2c)
ads = ADS.ADS1015(i2c)
ads.gain = 1


interval = 900  #How long we want to wait between loops (seconds)
windTick = 0   #Used to count the number of times the wind speed input is triggered
rainTick = 0   #Used to count the number of times the rain input is triggered

#Set GPIO pins to use BCM pin numbers
GPIO.setmode(GPIO.BCM)

#Set digital pin 17 to an input and enable the pullup
GPIO.setup(17, GPIO.IN, pull_up_down=GPIO.PUD_UP)

#Set digital pin 23 to an input and enable the pullup
GPIO.setup(23, GPIO.IN, pull_up_down=GPIO.PUD_UP)

#Event to detect wind (4 ticks per revolution)
GPIO.add_event_detect(17, GPIO.BOTH)

def windtrig(self):
    global windTick
    windTick += 1

GPIO.add_event_callback(17, windtrig)

#Event to detect rainfall tick
GPIO.add_event_detect(23, GPIO.FALLING)

def raintrig(self):
    global rainTick
    rainTick += 1

GPIO.add_event_callback(23, raintrig)

while True:
    try:
        time.sleep(interval)

        #Pull temperature from BME280
        case_temp = bme.temperature

        #Pull pressure from BME280 Sensor & convert to kPa
        pressure_pa = bme.pressure
        pressure = pressure_pa / 10

        #Pull humidity from BME280
        humidity = bme.humidity

        #Calculate wind direction based on ADC reading
        chan = AnalogIn(ads, ADS.P0)
        val = chan.value
        logger.info(val)

        windDir = "NC"
        windDeg = 999

        if 20000 <= val <= 20500:
            windDir = "N"
            windDeg = 0

        if 10000 <= val <= 10500:
            windDir = "NNE"
            windDeg = 22.5

        if 11500 <= val <= 12000:
            windDir = "NE"
            windDeg = 45

        if 2000 <= val <= 2250:
            windDir = "ENE"
            windDeg = 67.5

        if 2300 <= val <= 2500:
            windDir = "E"
            windDeg = 90

        if 1500 <= val <= 1950:
            windDir = "ESE"
            windDeg = 112.5

        if 4500 <= val <= 4900:
            windDir = "SE"
            windDeg = 135

        if 3000 <= val <= 3500:
            windDir = "SSE"
            windDeg = 157.5

        if 7000 <= val <= 7500:
            windDir = "S"
            windDeg = 180

        if 6000 <= val <= 6500:
            windDir = "SSW"
            windDeg = 202.5

        if 16000 <= val <= 16500:
            windDir = "SW"
            windDeg = 225

        if 15000 <= val <= 15500:
            windDir = "WSW"
            windDeg = 247.5

        if 24000 <= val <= 24500:
            windDir = "W"
            windDeg = 270

        if 21000 <= val <= 21500:
            windDir = "WNW"
            windDeg = 292.5

        if 22500 <= val <= 23000:
            windDir = "NW"
            windDeg = 315

        if 17500 <= val <= 18500:
            windDir = "NNW"
            windDeg = 337.5

        #Calculate average windspeed over the last 15 seconds
        windSpeed = (windTick * 1.2) / interval
        windTick = 0

        #Calculate accumulated rainfall over the last 15 seconds
        rainFall = rainTick * 0.2794
        rainTick = 0

        i = datetime.datetime.now()

        year=str(i.year)

        if i.month < 10:
            month='0'+str(i.month)
        else:
            month=str(i.month)

        if i.day < 10:
            day='0'+str(i.day)
        else:
            day=str(i.day)

        if i.hour < 10:
            hour='0'+str(i.hour)
        else:
            hour=str(i.hour)

        if i.minute < 10:
            minute='0'+str(i.minute)
        else:
            minute=str(i.minute)

        if i.second < 10:
            second='0'+str(i.second)
        else:
            second=str(i.second)

        dataNow = year+'-'+month+'-'+day+';'+hour+':'+minute+':'+second
        		parametri=dataNow+';'+str(case_temp)+';'+str(humidity)+';'+str(pressure)+';'+str(windDir)+';'+str(windDeg)+';'+str(windSpeed)+';'+str(rainFall)

        url = 'http://***************.php'

        myobj = {'param': parametri}

        x = requests.post(url, data = myobj)

    except Exception as e:
        logger.error(e)

nicolap8
Posts: 576
Joined: Mon Mar 13, 2017 9:45 pm

Re: Problema script python stazione meteo

Thu May 28, 2020 2:15 pm

Una piccola nota: di sicuro esiste una funzione per formattare come vuoi tu data e ora, senza dover fare tutt quel casino ;)

Code: Select all

x = requests.post(url, data = myobj)
"x" cos'è? A che serve? Che valori può avere?
Temo che tu non possa ignorare e basta.

Ogni quanto tempo si pianta? Giorni, ore, minuti?
Se il tempo è abbastanza breve, proverei a togliere l'invio e vedere se si blocca ancora.
Invece che inviare puoi stampare a video la stringa dati.

La seconda possibilità è di inviare sempre gli stessi dati, costanti, senza fare acquisizione.

Hai verificato che "time.sleep(interval)" sia utilizzabile senza problemi per tempi così linghi?

Schema elettrico? Link?

TizianoL
Posts: 19
Joined: Tue May 26, 2020 8:11 am

Re: Problema script python stazione meteo

Thu May 28, 2020 2:43 pm

nicolap8 wrote:
Thu May 28, 2020 2:15 pm
Una piccola nota: di sicuro esiste una funzione per formattare come vuoi tu data e ora, senza dover fare tutt quel casino ;)
Probabile ma per quanto ho cercato in rete quella è l'unica soluzione che ho trovato...brutta!
"x" cos'è? A che serve? Che valori può avere?
Temo che tu non possa ignorare e basta.
Contiene la risposta del server alla request fatta. In realtà in questo contesto non mi serve perchè non mi interessa (per il momento almeno) valutare la risposta del server. Oltretutto l'errore, che dovrebbe generarsi proprio qui, si perde in quanto la mancata connessione non è una risposta del server.
Ogni quanto tempo si pianta? Giorni, ore, minuti?
Se il tempo è abbastanza breve, proverei a togliere l'invio e vedere se si blocca ancora.
Tempo variabile.
Ha girato bene per qualche giorno e poi è caduto. Poi sono riuscito, con non poche difficoltà a farlo ripartire, ed è caduto dopo poche ore.
Invece che inviare puoi stampare a video la stringa dati.
La seconda possibilità è di inviare sempre gli stessi dati, costanti, senza fare acquisizione.
Questa parte di codice dovrebbe funzionare. Il sito è online e ho raccolto un bel pò di rilevazioni. Dal 28/4 al 22/5 tra up e down ho raccolto 1800 rilevazioni quasi.
Hai verificato che "time.sleep(interval)" sia utilizzabile senza problemi per tempi così linghi?
Direi di si in base a quanto sopra.
Schema elettrico? Link?
Non c'è un vero e proprio schema ellettrico. Ho comprato un kit e ho seguito la guida presente in https://www.bc-robotics.com/tutorials/r ... on-part-1/ (sono 4 parti).
Questo è il link alla pagina che "graficizza" i dati raccolti: http://meteotiziano.altervista.org/meteo.php

macca
Posts: 152
Joined: Tue Oct 16, 2012 9:14 am

Re: Problema script python stazione meteo

Thu May 28, 2020 3:18 pm

Qualche suggerimento:

1. Il log in /tmp è veramente una pessima idea, anche perchè se non ricordo male, la directory viene cancellata al boot (forse è per questo che il log "sparisce"). C'è la directory /var/log per questo oppure lo puoi scrivere direttamente un /user/pi (o qualunque sia il tuo user).

2. Prima di imbarcarsi in un loop infinito è meglio verificare che tutto funzioni come deve. Elimina tutto il loop, log, try/catch e lancia lo script da linea di comando. Se ci sono errori li vedi immediatamente.

3. Sempre in tema di loop infinito (che ritengo comunque una pessima idea), il tuo script, se interpreto correttamente, rimane 900 secondi a "dormire" prima di fare qualcosa, cioè 15 minuti a occupare tempo cpu e memoria per niente. Usa cron che esiste per questo, fai in modo che lanci il tuo script ogni 15 minuti e ti risparmi un sacco di grattacapi. Questo naturalmente quando sei sicuro che tutto funzioni correttamente.

Spero che questo aiuti.

TizianoL
Posts: 19
Joined: Tue May 26, 2020 8:11 am

Re: Problema script python stazione meteo

Thu May 28, 2020 3:26 pm

macca wrote:
Thu May 28, 2020 3:18 pm
Qualche suggerimento:

1. Il log in /tmp è veramente una pessima idea, anche perchè se non ricordo male, la directory viene cancellata al boot (forse è per questo che il log "sparisce"). C'è la directory /var/log per questo oppure lo puoi scrivere direttamente un /user/pi (o qualunque sia il tuo user).

2. Prima di imbarcarsi in un loop infinito è meglio verificare che tutto funzioni come deve. Elimina tutto il loop, log, try/catch e lancia lo script da linea di comando. Se ci sono errori li vedi immediatamente.

3. Sempre in tema di loop infinito (che ritengo comunque una pessima idea), il tuo script, se interpreto correttamente, rimane 900 secondi a "dormire" prima di fare qualcosa, cioè 15 minuti a occupare tempo cpu e memoria per niente. Usa cron che esiste per questo, fai in modo che lanci il tuo script ogni 15 minuti e ti risparmi un sacco di grattacapi. Questo naturalmente quando sei sicuro che tutto funzioni correttamente.

Spero che questo aiuti.
Ciao macca,
sicuramente ogni osservazione è utile.
Ti rispondo per punti.
1. Cambierò sicuramente cartella (come suggeriva anche nicolap8), soprattutto dopo che mi dici che il log viene cancellato al reboot...
2. Il programma l'ho testato in debug e ho verificato il funzionamento di tutto. Per un pò l'ho fatto girare "a regime" in casa e da un mesetto su un terrazzo. Il problema è che finchè stava in casa collegato a un monitor non avevo questi problemi, ora invece è un casino.
3. il loop infinito è brutto ma in questo caso è necessario. Se vedi infatti alcuni sensori (velocità del vento e pluviomentro) conteggiano i tick con degli eventi e in base a questi tick vengono calcolati quei valori. Non c'è altro modo di sapere quanta acqua è piovuta in un lasso di tempo o la velocità del vento...

macca
Posts: 152
Joined: Tue Oct 16, 2012 9:14 am

Re: Problema script python stazione meteo

Thu May 28, 2020 3:47 pm

TizianoL wrote:
Thu May 28, 2020 3:26 pm
2. Il programma l'ho testato in debug e ho verificato il funzionamento di tutto. Per un pò l'ho fatto girare "a regime" in casa e da un mesetto su un terrazzo. Il problema è che finchè stava in casa collegato a un monitor non avevo questi problemi, ora invece è un casino.
Ok, ma in questa fase di test non ti è mai capitato un errore di rete come quello che descrivi ? E nel caso, lo script si riprendeva correttamente ? Mi sembra molto strano che uno script non riparta al boot.
3. il loop infinito è brutto ma in questo caso è necessario. Se vedi infatti alcuni sensori (velocità del vento e pluviomentro) conteggiano i tick con degli eventi e in base a questi tick vengono calcolati quei valori. Non c'è altro modo di sapere quanta acqua è piovuta in un lasso di tempo o la velocità del vento...
Ah, ok, non ho esperienza di stazioni meteo e non avevo considerato gli eventi.

A questo punto è fondamentale sapere che errore viene fuori, sia mentre lo script è in esecuzione che quando tenti di farlo ripartire. La mia idea è che qualcosa rimane "appeso" e deve essere reinizializzato, per esempio se non sbaglio i sensori sono I2C e 1wire (quello della temporatura) quindi magari in caso di errore rimangono in uno stato "indeterminato" e richiedono un reset (bisogna studiarsi i datasheet per sapere come fare).

nicolap8
Posts: 576
Joined: Mon Mar 13, 2017 9:45 pm

Re: Problema script python stazione meteo

Thu May 28, 2020 4:40 pm

macca wrote:
Thu May 28, 2020 3:47 pm
TizianoL wrote:
Thu May 28, 2020 3:26 pm
2. Il programma l'ho testato in debug e ho verificato il funzionamento di tutto. Per un pò l'ho fatto girare "a regime" in casa e da un mesetto su un terrazzo. Il problema è che finchè stava in casa collegato a un monitor non avevo questi problemi, ora invece è un casino.
Ok, ma in questa fase di test non ti è mai capitato un errore di rete come quello che descrivi ? E nel caso, lo script si riprendeva correttamente ? Mi sembra molto strano che uno script non riparta al boot.
Qua c'è un'importante distinzione da fare:
1) cold boot: l'alimentazione viene staccata per almeno 15/20 secondi
2) warm boot: un semplice "reboot"
Se il non ripartire si presenta anche nel caso 1 sarei propenso anche a difetti hardware.
Se dopo un cold boot riparte sempre allora è un problema software, probabilmente di inizializzazione.

3. il loop infinito è brutto ma in questo caso è necessario. Se vedi infatti alcuni sensori (velocità del vento e pluviomentro) conteggiano i tick con degli eventi e in base a questi tick vengono calcolati quei valori. Non c'è altro modo di sapere quanta acqua è piovuta in un lasso di tempo o la velocità del vento...
TizianoL wrote:
Hai verificato che "time.sleep(interval)" sia utilizzabile senza problemi per tempi così linghi?
Direi di si in base a quanto sopra.
No! Prima si verifica leggendo la documentazione :-)
https://docs.python.org/3.0/library/time.html
Io avrei fatto in modo completamente diverso ma direi che funziona anche così.
In quella stessa pagina trovi la funzione time.strftime per formattare il tempo.

Comunque, usando la regola "divide et impera" togli dal programma l'invio dei dati e riduci l'intervallo da 15 minuti a 3 secondi, fa stampare la stringa sul display e fallo girare un po'.

Nel frattempo in un secondo terminale fai andare solo l'invio dei dati, sempre con un intervallo di 2/3 secondi...

Inoltre puoi usare due distinti try/except: uno per l'acquisizione ed uno per l'invio.
Attendiamo un po' di log ;-)
N

nicolap8
Posts: 576
Joined: Mon Mar 13, 2017 9:45 pm

Re: Problema script python stazione meteo

Thu May 28, 2020 4:41 pm

Leggendo le istruzioni https://www.bc-robotics.com/tutorials/r ... on-part-2/
ci sono dei comandi per testare semplicemente i singoli sensori: dopo che si è bloccato e non riparte puoi provare a leggere i sensori e determinare quale sia che rompe.
N

TizianoL
Posts: 19
Joined: Tue May 26, 2020 8:11 am

Re: Problema script python stazione meteo

Thu May 28, 2020 4:56 pm

Vi ringrazio per le indicazioni.
Inizierò a fare qualche test più dettagliato per vedere cosa succede.
Per il log, oltre a spostare il file in un'altra cartella, cosa consigliate di fare?
Vorrei tracciare su file ma la libreria logging non l'ho capita molto bene e preferirei fare qualcosa di più gestibile per conto mio.
Se la gestione della scrittura su file me la faccio da solo? Controindicazioni?

Un altro dubbio che mi è venuto, ma magari non c'entra nulla ed è solo ignoranza mia in fatto linux, è sui permessi impostati allo script.
Il file ha questi permessi:
-rwxrwxrwx 1 root root

Il fatto che utente e proprietario siano root è un problema se non viene eseguito con sudo? :?

nicolap8
Posts: 576
Joined: Mon Mar 13, 2017 9:45 pm

Re: Problema script python stazione meteo

Thu May 28, 2020 5:14 pm

TizianoL wrote:
Thu May 28, 2020 4:56 pm
Vi ringrazio per le indicazioni.
Inizierò a fare qualche test più dettagliato per vedere cosa succede.
Per il log, oltre a spostare il file in un'altra cartella, cosa consigliate di fare?
Vorrei tracciare su file ma la libreria logging non l'ho capita molto bene e preferirei fare qualcosa di più gestibile per conto mio.
Se la gestione della scrittura su file me la faccio da solo? Controindicazioni?
È maggior lavoro... e un buon esercizio!

Un altro dubbio che mi è venuto, ma magari non c'entra nulla ed è solo ignoranza mia in fatto linux, è sui permessi impostati allo script.
Il file ha questi permessi:
-rwxrwxrwx 1 root root

Il fatto che utente e proprietario siano root è un problema se non viene eseguito con sudo? :?
Eccome! Tieni conto che, molto spesso, i programmi che devono accedere all'hardware direttamente devono farlo come root.
Ma, se non sei root, dovresti avere un messaggione di errore, ben comprensibile!
N

TizianoL
Posts: 19
Joined: Tue May 26, 2020 8:11 am

Re: Problema script python stazione meteo

Thu May 28, 2020 5:34 pm

nicolap8 wrote:Un altro dubbio che mi è venuto, ma magari non c'entra nulla ed è solo ignoranza mia in fatto linux, è sui permessi impostati allo script.
Il file ha questi permessi:
-rwxrwxrwx 1 root root

Il fatto che utente e proprietario siano root è un problema se non viene eseguito con sudo? :?
Eccome! Tieni conto che, molto spesso, i programmi che devono accedere all'hardware direttamente devono farlo come root.
Ma, se non sei root, dovresti avere un messaggione di errore, ben comprensibile!
N
Quindi vediamo un pò.
Ho notato che se lancio crontab con sudo vedo una cosa, se lo lancio senza ne vedo un'altra.
Ora io ho impostato in crontab (lanciato senza sudo) questa stringa:

Code: Select all

@reboot sleep 300 python3 /home/pi/meteo_sensori.py &
Sarà qui una parte dei problemi?

nicolap8
Posts: 576
Joined: Mon Mar 13, 2017 9:45 pm

Re: Problema script python stazione meteo

Thu May 28, 2020 5:40 pm

TizianoL wrote:
Thu May 28, 2020 5:34 pm
Sarà qui una parte dei problemi?
Se tutti (solo due ma tutti) ti dicono di non usare crontab, ci sarà un motivo!
Come scrivevo nel messaggio precedente, di solito, i programmi che fanno accesso diretto all'hardware devono usare sudo.
N

TizianoL
Posts: 19
Joined: Tue May 26, 2020 8:11 am

Re: Problema script python stazione meteo

Thu May 28, 2020 6:30 pm

Ok, allora riprovo con rc.local.
E' che non mi sono ancora chiare le dinamiche che si creano con i vari utenti.
rc.local lo devo editare senza sudo, ma il comando per lo script lo lancio con sudo...giusto? :oops:

TizianoL
Posts: 19
Joined: Tue May 26, 2020 8:11 am

Re: Problema script python stazione meteo

Fri May 29, 2020 8:36 am

Buongiorno
Abbiamo qualche sviluppo....

Ho lanciato lo script a mano ieri dall'ambiente di sviluppo e l'ho lasciato girare.
Questa mattina è andato in errore.
L'errore loggato è il seguente:
2020-05-29 05:10:00,041 ERROR __main__ HTTPConnectionPool(host='meteotiziano.altervista.org', port=80): Max retries exceeded with url: /******.php (Caused by NewConnectionError('<urllib3.connection.HTTPConnection object at 0xb4e3b630>: Failed to establish a new connection: [Errno -3] Temporary failure in name resolution'))

Ho letto che è possibile impostare il numero di tentativi da codice, potrei provare a farlo e vedere se risolve.
Una cosa che vorrei fare però è quella di non bloccare lo script in caso di errore di questo tipo ma farlo continuare a lavorare.
Ho provato come segue ma evidentemente non ha portato a nulla (ho letto in rete che era possibile fare una cosa del genere):

Code: Select all

except Exception as e:
    logger.error(e)
    raise e
Cosa mi consigliate?
Grazie a tutti

EDIT: Ho modificato l'except togliendo il raise che in effetti non risolveva nulla.
Ora è:

Code: Select all

except Exception as e:
    logger.error(e)
    sys.exc_clear()
    pass
In teoria questo dovrebbe cancellare l'ultimo errore generato e proseguire.
Che ne dite? Nel frattempo ho rilanciato lo script.

nicolap8
Posts: 576
Joined: Mon Mar 13, 2017 9:45 pm

Re: Problema script python stazione meteo

Fri May 29, 2020 8:55 am

TizianoL wrote:
Fri May 29, 2020 8:36 am
L'errore loggato è il seguente:
2020-05-29 05:10:00,041 ERROR __main__ HTTPConnectionPool(host='meteotiziano.altervista.org', port=80): Max retries exceeded with url: /******.php (Caused by NewConnectionError('<urllib3.connection.HTTPConnection object at 0xb4e3b630>: Failed to establish a new connection: [Errno -3] Temporary failure in name resolution'))

Ho letto che è possibile impostare il numero di tentativi da codice, potrei provare a farlo e vedere se risolve.
Una cosa che vorrei fare però è quella di non bloccare lo script in caso di errore di questo tipo ma farlo continuare a lavorare.
Ho provato come segue ma evidentemente non ha portato a nulla (ho letto in rete che era possibile fare una cosa del genere):

Code: Select all

except Exception as e:
    logger.error(e)
    raise e
Cosa mi consigliate?
Un consiglio è questo: non "leggere" in giro a caso, è pieno di gentaglia senza testa che spara a caso giusto per collezionare click.
Prima di tutto studia la documentazione ufficiale, es. https://docs.python.org/3.8/tutorial/errors.html
e https://requests.readthedocs.io/en/master/
Questa non può venir sostituita da nient'altro (solo da un corso, serio).
Per programmare non ci sono scorciatoie.
N

macca
Posts: 152
Joined: Tue Oct 16, 2012 9:14 am

Re: Problema script python stazione meteo

Fri May 29, 2020 9:02 am

TizianoL wrote:
Fri May 29, 2020 8:36 am
L'errore loggato è il seguente:
2020-05-29 05:10:00,041 ERROR __main__ HTTPConnectionPool(host='meteotiziano.altervista.org', port=80): Max retries exceeded with url: /******.php (Caused by NewConnectionError('<urllib3.connection.HTTPConnection object at 0xb4e3b630>: Failed to establish a new connection: [Errno -3] Temporary failure in name resolution'))

Ho letto che è possibile impostare il numero di tentativi da codice, potrei provare a farlo e vedere se risolve.
Non risolve, chiaramente è un problema di DNS (temporary failure in name resolution), devi attendere che torni in linea.
Una cosa che vorrei fare però è quella di non bloccare lo script in caso di errore di questo tipo ma farlo continuare a lavorare.
Ho provato come segue ma evidentemente non ha portato a nulla (ho letto in rete che era possibile fare una cosa del genere):

Code: Select all

except Exception as e:
    logger.error(e)
    raise e
Togli il raise, altrimenti è inutile. La linea except intrappola l'errore ma il raise lo risputa fuori causando il termine dello script.

Prova questo, dovrebbe darti più o meno lo stesso errore ma continua ad andare. Il tuo problema è quasi certamente un altro.

Code: Select all

#!/usr/bin/python

import time
import requests

while True:
    print("Attesa");
    time.sleep(2)
    try:
        print("Connessione");
        requests.post("http://assdcascdasc.com/abcdefg")
    except Exception as e:
        print("ERRORE!!!")
        print(e)
Una cosa importante: l'indentazione in Python è importante, non ho controllato il tuo sorgente ma assicurati che ogni linea sia indentata opportunamente altrimenti una parte del codice potrebbe non essere eseguita come ti aspetti.

nicolap8
Posts: 576
Joined: Mon Mar 13, 2017 9:45 pm

Re: Problema script python stazione meteo

Fri May 29, 2020 9:09 am

macca wrote:
Fri May 29, 2020 9:02 am
Prova questo, dovrebbe darti più o meno lo stesso errore ma continua ad andare. Il tuo problema è quasi certamente un altro.

Code: Select all

#!/usr/bin/python

import time
import requests

while True:
    print("Attesa");
    time.sleep(2)
    try:
        print("Connessione");
        requests.post("http://assdcascdasc.com/abcdefg")
    except Exception as e:
        print("ERRORE!!!")
        print(e)
Scusa ma mi pare un pessimo esempio.
Il ciclo non deve essere infinito ma avere un limite di tentativi e se riesce uscire con un risultato di conferma. Se fallisce deve uscire con un risultato di errore (cioè una variabile...).

Devi quindi decidere cosa fare dei dati non "spediti": buttarli o metterli da parte per dopo.,
Il tempo perso nei tentativi va a inficiare la durata dell'intervallo: non sarà mai molto preciso, tienine conto!
N

macca
Posts: 152
Joined: Tue Oct 16, 2012 9:14 am

Re: Problema script python stazione meteo

Fri May 29, 2020 9:21 am

nicolap8 wrote:
Fri May 29, 2020 9:09 am
Scusa ma mi pare un pessimo esempio.
Il ciclo non deve essere infinito ma avere un limite di tentativi e se riesce uscire con un risultato di conferma. Se fallisce deve uscire con un risultato di errore (cioè una variabile...).
E' appunto un esempio per dimostrare che il try/except funziona come dovrebbe.
Se leggi gli altri post poi è stato chiarito che lo script deve continuare all'infinito a causa del modo in cui alcuni sensori (vento e pioggia se non ricordo male) devono essere trattati. Forse c'è un modo migliore ma al momento ritengo più importante far funzionare tutto.
Devi quindi decidere cosa fare dei dati non "spediti": buttarli o metterli da parte per dopo.,
Il tempo perso nei tentativi va a inficiare la durata dell'intervallo: non sarà mai molto preciso, tienine conto!
Questo sarà un suo problema quando lo script funzionerà correttamente.
Procediamo un passo alla volta.

Return to “Italiano”