diff --git a/IOB-PI/readParallela_12.py b/IOB-PI/readParallela_12.py new file mode 100644 index 0000000..669253b --- /dev/null +++ b/IOB-PI/readParallela_12.py @@ -0,0 +1,796 @@ +#!/usr/bin/python +# -*- coding: utf-8 -*- + +# readParallela v. 2.5.2 12 Ingressi +# - single instance timer +# - invio multiplo x send eventi accodati +# - gestione segnali BLINKING +# - gestione INVERSIONE segnali cv 10-VII-2018 +# - gestione FILTRAGGIO segnali brevi cv 23-VII-2018 +# - (2.3) gestione 12 bit cv 14-I-2020 +# - (2.4) fix ingressi e conf apertura parallela + gestione vari bit filtraggio x nuovi ingressi + update conf con 12 parametri bit SEL 15-I-2020 +# - (2.4.8) versione adatta a raspberry PI vecchia generazione (GPIO corto, 8bit) +# - (2.5) Fix (hope) ciclo "wait send to complete", gestione timeout (rety infinito se IO riparte in modo anomalo) +# - (2.5.1) Fix numero versione 18.05.2023 +# - (2.5.2) Fix gestione eccezioni con report dettagliato + +#--------------------------------------------------------------- +# levare locking +# timer semplificata +# GPIO global + + +import time +import sys + + +from datetime import datetime + +import urllib +import ConfigParser +import os, sys + +import logging +import logging.handlers +import threading +import Queue + +from array import * + +#-------------------------------------------------------------- + +# COSTANTI +MSGLEN = 9 +TIMEOUTSERIALE = 10 +MAXRETRY = 10 + +# numero campioni filtraggio segnale ballerino +MAX_COUNTER_BLINK = 10 + +PROGRAM_NAME ="ReadPar IOB-pi v.2.5.2" + +# DA FILE CONF +idxMacchina = "1001" +SAMPLETIME = 0.1 +TIMEOUTSHORT = (SAMPLETIME*20) +TIMEOUTLONG = (SAMPLETIME*600) +SENDURLTIME = 0.08 +NMAXSEND = 5 # numero massimo di invii per singolo ciclo di svuotamento + +# VAR +to_enable = False +to_short = TIMEOUTSHORT +to_long = TIMEOUTLONG +to_serial = TIMEOUTSERIALE +to_retry = MAXRETRY +errormsglen = 0 + +# VAR + +out_0 = 24 +out_1 = 26 + +in_0 = 11 +in_1 = 12 +in_2 = 13 +in_3 = 15 +in_4 = 16 +in_5 = 18 +in_6 = 22 +in_7 = 7 +in_8 = 29 +in_9 = 31 +in_10 = 32 +in_11 = 36 + +# contatore: serve x match tra accoda ed invia x possibile controllo a posteriori... ogni volta che accodo incremento di 1, va da 0 a 9999 +cont = '0' + +# variabile stato online/offline della macchina +onLine = '1' + +# variabile stato seinding/waiting x la parte invio URL +sending = '0' + +# variabile stato timer thread busy +timer_busy = False + +# +# array per ingressi filtrati + +i_counters = array ( 'i',[0,0,0,0,0,0,0,0,0,0,0,0]) +B_blinking = array ( 'B',[0,0,0,0,0,0,0,0,0,0,0,0]) +B_previous = array ( 'B',[0,0,0,0,0,0,0,0,0,0,0,0]) +B_input = array ( 'B',[0,0,0,0,0,0,0,0,0,0,0,0]) +B_output = array ( 'B',[0,0,0,0,0,0,0,0,0,0,0,0]) + +B_inverting = array ( 'B',[0,0,0,0,0,0,0,0,0,0,0,0]) + +B_filter = array ( 'B',[0,0,0,0,0,0,0,0,0,0,0,0]) +B_filter_prev = array ( 'B',[0,0,0,0,0,0,0,0,0,0,0,0]) +B_temp = array ( 'B',[0,0,0,0,0,0,0,0,0,0,0,0]) +i_filter_counters = array ( 'i',[0,0,0,0,0,0,0,0,0,0,0,0]) + +#-------------------------------------------------------------- +# Gestione coda (condivisa) x registrazione eventi ed invio URL +#print "Creazione coda illimitata" + +Coda = Queue.Queue(0) + +#queueLock = threading.Lock() + +#--------------------------------------------------------------- +# lettura parallela +# ritorna il byte letto pulito ( due char hex ) + +def readParallelaFiltrata(): + + global in_0 + global in_1 + global in_2 + global in_3 + global in_4 + global in_5 + global in_6 + global in_7 + + global in_8 + global in_9 + global in_10 + global in_11 + + + global GPIO + + current = '' + + + try: + + if GPIO.input(in_0): + B_input[0] = 0 + else: + B_input[0] = 1 + + if GPIO.input(in_1): + B_input[1] = 0 + else: + B_input[1] = 1 + + if GPIO.input(in_2): + B_input[2] = 0 + else: + B_input[2] = 1 + + if GPIO.input(in_3): + B_input[3] = 0 + else: + B_input[3] = 1 + + if GPIO.input(in_4): + B_input[4] = 0 + else: + B_input[4] = 1 + + if GPIO.input(in_5): + B_input[5] = 0 + else: + B_input[5] = 1 + + if GPIO.input(in_6): + B_input[6] = 0 + else: + B_input[6] = 1 + + if GPIO.input(in_7): + B_input[7] = 0 + else: + B_input[7] = 1 + + + if GPIO.input(in_8): + B_input[8] = 0 + else: + B_input[8] = 1 + + if GPIO.input(in_9): + B_input[9] = 0 + else: + B_input[9] = 1 + + if GPIO.input(in_10): + B_input[10] = 0 + else: + B_input[10] = 1 + + if GPIO.input(in_11): + B_input[11] = 0 + else: + B_input[11] = 1 + + + + + + + #ciclo per ogni segnale + for i in xrange(12) : + #print (i) + + # v2.1 gestione inversione bit ingresso + + if ( B_inverting[i] == 1 ) : + if ( B_input[i] == 0 ) : + B_input[i] = 1 + else : + B_input[i] = 0 + + # v2.2 gestione filtro segnali brevi + + if ( B_filter[i] == 1 ) : + + # fronte 0 -> 1 + if ( B_input[i] == 1 ) and ( B_filter_prev [i] == 0 ) : + if ( i_filter_counters[i] == 0 ) : + # vero fronte 0 -> 1 + i_filter_counters[i] = MAX_COUNTER_FILTER + B_temp[i] = 0 # tengo l' ingresso a 0 + #logPro.info("START spike 0->1 on bit " + `i` ) + else : + # fine disturbo breve di uno stato 1 + i_filter_counters[i] = 0 + B_temp[i] = 1 # tengo l' ingresso a 1 + logPro.info("END spike 0->1 on bit " + `i` ) + + # stabile 1 -> 1 + if ( B_input[i] == 1 ) and ( B_filter_prev [i] == 1 ) : + if ( i_filter_counters[i] == 0 ) : + # segnale stabile a 1 + B_temp[i] = 1 # tengo l' ingresso a 1 + else : + # poco dopo il fronte + i_filter_counters[i] = i_filter_counters[i] - 1 + B_temp[i] = 0 # tengo l' ingresso a 0 + + # fronte 1 -> 0 + if ( B_input[i] == 0 ) and ( B_filter_prev [i] == 1 ) : + if ( i_filter_counters[i] == 0 ) : + # vero fronte 1 -> 0 + i_filter_counters[i] = MAX_COUNTER_FILTER + B_temp[i] = 1 # tengo l' ingresso a 1 + #logPro.info("START spike 1->0 on bit " + `i` ) + else : + # fine disturbo breve di uno stato 0 + i_filter_counters[i] = 0 + B_temp[i] = 0 # tengo l' ingresso a 0 + logPro.info("END spike 1->0 on bit " + `i` ) + + # stabile 0 -> 0 + if ( B_input[i] == 0 ) and ( B_filter_prev [i] == 0 ) : + if ( i_filter_counters[i] == 0 ) : + # segnale stabile a 0 + B_temp[i] = 0 # tengo l' ingresso a 0 + else : + # poco dopo il fronte + i_filter_counters[i] = i_filter_counters[i] - 1 + B_temp[i] = 1 # tengo l' ingresso a 1 + + B_filter_prev [i] = B_input[i] + B_input[i] = B_temp[i] + + # fine gestione filtro segnali brevi + + + # se non blinking, copia ingresso + if ( B_blinking[i] == 0 ) : + B_output[i] = B_input[i] + else: + # gestione segnale blinking + # se fronte del segnale + if ( B_previous[i] != B_input[i] ) : + B_previous[i] = B_input[i] + # se fronte di salita + if ( B_input[i] == 1 ) : + # subito uscita = 1 + B_output[i] = 1 + i_counters[i] = MAX_COUNTER_BLINK + #else : + # # loggo che ho rilevato un blink... + # logPro.info("Blink down on bit " + `i`) + else: + # no , segnale eguale a prima + # se input a 0 + if ( B_input[i] == 0 ) : + # E CONTEGGIO IN CORSO + if ( i_counters[i] > 0 ) : + i_counters[i] = i_counters[i] -1 + if ( i_counters[i] == 0 ) : + B_output[i] = 0 + logPro.info("END Blink on bit " + `i` ) + + #Rimettiamo insieme i bit + new_value = 0 + + if ( B_output[0] == 1 ) : + new_value = new_value + 1 + if ( B_output[1] == 1 ) : + new_value = new_value + 2 + if ( B_output[2] == 1 ) : + new_value = new_value + 4 + if ( B_output[3] == 1 ) : + new_value = new_value + 8 + if ( B_output[4] == 1 ) : + new_value = new_value + 16 + if ( B_output[5] == 1 ) : + new_value = new_value + 32 + if ( B_output[6] == 1 ) : + new_value = new_value + 64 + if ( B_output[7] == 1 ) : + new_value = new_value + 128 + + if ( B_output[8] == 1 ) : + new_value = new_value + 256 + if ( B_output[9] == 1 ) : + new_value = new_value + 512 + if ( B_output[10] == 1 ) : + new_value = new_value + 1024 + if ( B_output[11] == 1 ) : + new_value = new_value + 2048 + + + current = hex( new_value ).replace ( "0x" , "" ).upper() + + except Exception as e: + print "Errore in readParallelaFiltrata \n\n" + print str(e) + pass + + return current + +#--------------------------------------------------------------- +#Funzione di scrittura su coda con try-except + +def accoda(): + + try: + dtEve = datetime.utcnow().strftime('%Y%m%d%H%M%S%f')[:-3] + Coda.put(dtEve + '#' + value + '#' + cont) + + except Queue.Full: + logPro.error( "Queue full" + `dtEve` + '#' + `value` + '#' + `cont` ) + except Exception as e: + logPro.error( "NETWORK:Errore http-no com rete-timeout" + url ) + logPro.error(str(e)) + +#-------------------------------------------------------------- +# svuotaCoda x invio dati al server +def svuota_coda(): + + global onLine + global sending + global timer_busy + global NMAXSEND + + #print "start timer " + + if ( timer_busy == False ): + timer_busy = True + #print "start timer ok " + + try: + if not Coda.empty(): + #print "coda da svuotare!" + response = urllib.urlopen(URLALIVE) + answ = response.read() + if answ == 'OK': + #print "OK alive" + response2 = urllib.urlopen(URLENABLED + idxMacchina) + answ2 = response2.read() + if answ2 == 'OK': + # aggiorno stato ad online + if onLine == '0': + logPro.info("IOB ONLINE!") + #print("IOB ONLINE") + + onLine = '1' # imposto comunque online + else: + if onLine == '1': + logPro.error("IOB offline") + #print("IOB offline") + + onLine = '0' + else: + if onLine == '1': + logPro.error("Server offline") + #print("Server offline") + + onLine = '0' + + # ora verifico SE si possa inviare (ovvero sia online server e NON ci siano altri send attivi...) + if onLine == '1': + if sending == '0': + #segnalo che sono in sending! + sending = '1' + + # SAM 2016.12.23: modifica x invio FINO A nMaxSend ELEMENTI ad ogni ciclo di svuotamento + i = NMAXSEND + + while i >= 0: + if not Coda.empty(): + + # formatto dataOra corrente + dtCurr = datetime.utcnow().strftime('%Y%m%d%H%M%S%f')[:-3] + + #prendo primo elemento dalla coda + resp = Coda.get() + + # recupero valori da elemento coda! + dtEve = resp.split("#")[0] + value = resp.split("#")[1] + cnt = resp.split("#")[2] + url = URLBASE + idxMacchina + URLADV1 + value + url = url + '&dtCurr=' + dtCurr + '&dtEve=' + dtEve + '&cnt=' + cnt + # CHIAMO URL + response3 = urllib.urlopen ( url ) + answ3 = response3.read() + #print(url) + + # log valore inviato! + logSnd.info( value + ' ['+ cnt +']' + ' R:' + answ3 ) + #print "Valore smaltito dalla coda" + + # tolgo 1 al contatore + i -= 1 + + # completato invio, riporto sending a zero! + sending = '0' + else: + if to_retry > 0: + to_retry -= 1 + logPro.info("WAIT active send to complete") + else: + sending = '0' + to_retry = MAXRETRY + logPro.info("END WAIT, reset to_retry var") + + else: + pass + + else: + pass + + except Exception as e: + if onLine == '1': + logPro.error("Server Non raggiungibile") + logPro.error(str(e)) + #print "Non raggiungibile" + + onLine = '0' + + # in ogni caso + + timer_busy = False + #print "end timer ok" + + + #print "end timer " + + +#--------------------------------------------------------------- +# funzione timer thread +#--------------------------------------------------------------- +def do_every (interval, worker_func, iterations = 0): + if iterations != 1: + threading.Timer ( + interval, + do_every, [interval, worker_func, 0 if iterations == 0 else iterations-1] + ).start (); + + worker_func (); + +#--------------------------------------------------------------- +# gestione contatore +#--------------------------------------------------------------- +def contatore(): + + try: + global cont + ctr = int(cont) + ctr +=1 + ctr = ctr % 10000 # round robin 10000 eventi x track + cont = str(ctr) + except Exception as e: + print("errore incremento contatore \n\n") + print(str(e)) + +#--------------------------------------------------------------- +# avvia porta parallela +#--------------------------------------------------------------- +def avviaParallela(): + + global in_0 + global in_1 + global in_2 + global in_3 + global in_4 + global in_5 + global in_6 + global in_7 + global in_8 + global in_9 + global in_10 + global in_11 + + global GPIO + + try: + + GPIO.setmode(GPIO.BOARD) + + GPIO.setwarnings(False) + + #GPIO.setup(out_0, GPIO.OUT) # output 0 + #GPIO.setup(out_1, GPIO.OUT) # output 1 + + GPIO.setup(in_0, GPIO.IN) # input 0 + GPIO.setup(in_1, GPIO.IN) # input 1 + GPIO.setup(in_2, GPIO.IN) # input 2 + GPIO.setup(in_3, GPIO.IN) # input 3 + GPIO.setup(in_4, GPIO.IN) # input 4 + GPIO.setup(in_5, GPIO.IN) # input 5 + GPIO.setup(in_6, GPIO.IN) # input 6 + GPIO.setup(in_7, GPIO.IN) # input 7 + GPIO.setup(in_8, GPIO.IN) # input 8 + GPIO.setup(in_9, GPIO.IN) # input 9 + GPIO.setup(in_10, GPIO.IN) # input 10 + GPIO.setup(in_11, GPIO.IN) # input 11 + + except Exception as e: + print( "\n\n" + PROGRAM_NAME + " - Error 3 on RPi.GPIO ! \n\n") + print str(e) + sys.exit(1) + + + print( "\n\n" + PROGRAM_NAME + " - init ok \n\n") + + +#--------------------------------------------------------------- +#--------------------------------------------------------------- +# MAIN + +try: + config = ConfigParser.RawConfigParser() + config.read ( 'IOB.cfg' ) + + SAMPLETIME = config.getfloat ( 'time' , 'SAMPLETIME' ) + TIMEOUTSHORT = config.getfloat ( 'time' , 'TIMEOUTSHORT' ) + TIMEOUTLONG = config.getfloat ( 'time' , 'TIMEOUTLONG' ) + SENDURLTIME = config.getfloat ( 'time' , 'SENDURLTIME' ) + NMAXSEND = config.getint ( 'time' , 'NMAXSEND' ) + + idxMacchina = config.get ( 'id' , 'idxMacchina' ) + + + URLBASE = config.get ( 'web' , 'URLBASE' ) + URLENABLED = config.get('web' , 'URLENABLED') + URLALIVE = config.get ('web' , 'URLALIVE') + URLADV1 = config.get ( 'web' , 'URLADV1' ) + + LOGFILE = config.get ( 'log' , 'LOGFILE' ) + LOGLEVEL = config.get ( 'log' , 'LOGLEVEL' ) + + B_blinking[0] = config.getint ( 'blink' , 'bit0' ) + B_blinking[1] = config.getint ( 'blink' , 'bit1' ) + B_blinking[2] = config.getint ( 'blink' , 'bit2' ) + B_blinking[3] = config.getint ( 'blink' , 'bit3' ) + B_blinking[4] = config.getint ( 'blink' , 'bit4' ) + B_blinking[5] = config.getint ( 'blink' , 'bit5' ) + B_blinking[6] = config.getint ( 'blink' , 'bit6' ) + B_blinking[7] = config.getint ( 'blink' , 'bit7' ) + B_blinking[8] = config.getint ( 'blink' , 'bit8' ) + B_blinking[9] = config.getint ( 'blink' , 'bit9' ) + B_blinking[10] = config.getint ( 'blink' , 'bit10' ) + B_blinking[11] = config.getint ( 'blink' , 'bit11' ) + + MAX_COUNTER_BLINK = config.getint ( 'blink' , 'MAX_COUNTER_BLINK' ) + + # cv 2.1 se bit = 1 allora inverto segnale in ingresso... + + B_inverting[0] = config.getint ( 'invert' , 'bit0' ) + B_inverting[1] = config.getint ( 'invert' , 'bit1' ) + B_inverting[2] = config.getint ( 'invert' , 'bit2' ) + B_inverting[3] = config.getint ( 'invert' , 'bit3' ) + B_inverting[4] = config.getint ( 'invert' , 'bit4' ) + B_inverting[5] = config.getint ( 'invert' , 'bit5' ) + B_inverting[6] = config.getint ( 'invert' , 'bit6' ) + B_inverting[7] = config.getint ( 'invert' , 'bit7' ) + B_inverting[8] = config.getint ( 'invert' , 'bit8' ) + B_inverting[9] = config.getint ( 'invert' , 'bit9' ) + B_inverting[10] = config.getint ( 'invert' , 'bit10' ) + B_inverting[11] = config.getint ( 'invert' , 'bit11' ) + + # cv 2.2 se bit = 1 allora filtro segnali brevi ... + + B_filter[0] = config.getint ( 'filter' , 'bit0' ) + B_filter[1] = config.getint ( 'filter' , 'bit1' ) + B_filter[2] = config.getint ( 'filter' , 'bit2' ) + B_filter[3] = config.getint ( 'filter' , 'bit3' ) + B_filter[4] = config.getint ( 'filter' , 'bit4' ) + B_filter[5] = config.getint ( 'filter' , 'bit5' ) + B_filter[6] = config.getint ( 'filter' , 'bit6' ) + B_filter[7] = config.getint ( 'filter' , 'bit7' ) + B_filter[8] = config.getint ( 'filter' , 'bit8' ) + B_filter[9] = config.getint ( 'filter' , 'bit9' ) + B_filter[10] = config.getint ( 'filter' , 'bit10' ) + B_filter[11] = config.getint ( 'filter' , 'bit11' ) + + MAX_COUNTER_FILTER = config.getint ( 'filter' , 'MAX_COUNTER_FILTER' ) + + +except Exception as e: + print "\n\n" + PROGRAM_NAME + ' - Error 4 - in config file ' 'IOB.cfg' + print str(e) + sys.exit(1) + +#-------------------------------------------- +# oggetto Logger +#-------------------------------------------- +try: + logging.basicConfig(level=logging.DEBUG, + format='%(asctime)s %(name)-8s %(levelname)-8s %(message)s', + datefmt='%Y-%m-%d %H:%M:%S', + filename=LOGFILE, + filemode='a' + ) + + # aggiungo 2 logger specifici x queue e send... + logQue = logging.getLogger('queue') + logSnd = logging.getLogger('sendUrl') + logPro = logging.getLogger('program') + +except Exception as e: + # manda mail o simili - FARE!!! + print "LOG: Impossibile creare file log con nome" + print (LOGFILE) + print "\n\n" + print str(e) +#-------------------------------------------- + + +print "\n\n" + PROGRAM_NAME + "\n\n" + +global startstatus +startstatus = 1 + +if startstatus == 1: + logPro.info("Avvio Programma" + PROGRAM_NAME) + +## Verifica l'OS e di conseguenza carica il file relativo con metodo di lockfile appropriato + check singola istanza +if os.name == 'posix': + import unix +else: + import win + +logPro.info( "Start " + PROGRAM_NAME ) + + +# lettura file configurazione + +# [id] +# idxMacchina = 2001 +# [time] +# SAMPLETIME = 0.1 +# TIMEOUTSHORT = 200 +# TIMEOUTLONG = 6000 + + +print ( ' idxMacchina = %s' % ( idxMacchina ) ) +print ( ' SAMPLETIME = %4.2f' % ( SAMPLETIME ) ) +print ( ' TIMEOUTSHORT = %4.2f' % ( TIMEOUTSHORT ) ) +print ( ' TIMEOUTLONG = %4.2f' % ( TIMEOUTLONG ) ) +print ( ' SENDURLTIME = %4.2f' % ( SENDURLTIME ) ) +print ( ' URLBASE = %s' % ( URLBASE ) ) +print ( ' URLADV1 = %s' % ( URLADV1 ) ) +print ( ' LOGFILE = %s' % ( LOGFILE ) ) +print ( ' LOGLEVEL = %s' % ( LOGLEVEL ) ) + +# -sys.stdout.write ( 'idxMacchina ?' + idxMacchina + '\n') + +to_short = TIMEOUTSHORT +to_long = TIMEOUTLONG + + +#-------------------------------------------------------------- +# apertura parallela + +try: + import RPi.GPIO as GPIO +except RuntimeError: + print( "\n\n" + PROGRAM_NAME + " - Error 1 - you need superuser privileges") +except Exception as e: + print( "\n\n" + PROGRAM_NAME + " - Error 2 - you need superuser privileges. USE 'sudo' to run your script\n\n") + print str(e) + sys.exit(1) + + +avviaParallela() + + +#-------------------------------------------------------------- +# MARCO: qui inserire avvio thread di "svuotaCoda" + +# avviaSvuotaCoda +#print "Avvia svuota coda" + +do_every ( SENDURLTIME , svuota_coda ); + +#--------------------------------------------------------------- +# ciclo forever and ever + +old = '' + +#print "Avvio ciclo" +logPro.info("Avvio loop principale") +while 1: + + try: + time.sleep (SAMPLETIME) + except Exception as e: + logPro.info("First_SLEEP: errore attesa sampletime") + logPro.error(str(e)) + + # lettura dati da IOB + value = readParallelaFiltrata() + + if ( value != '' ) : + if value != old : + #loggo e invio dati + try: + logQue.info( value + ' ['+ cont +']') + errormsglen = 0 + accoda() + contatore() + except Exception as e: + logPro.error("URLBROWSER: errore registrazione valore e accoda") + logPro.error(str(e)) + pass + #enable e reset timer + to_enable = True + to_short = TIMEOUTSHORT + to_long = TIMEOUTLONG + + old = value + + + # gestione timeout breve + if ( to_enable ) : + to_short = to_short - SAMPLETIME + if to_short <= 0: + #loggo e invio dati + try: + logQue.info( '>' + value + ' ['+ cont +']') + errormsglen = 0 + accoda() + contatore() + except Exception as e: + logPro.error("URLBROWSER: errore registrazione valore e accoda TO_short") + logPro.error(str(e)) + pass + to_short = TIMEOUTSHORT + to_enable = False # dopo un colpo il timer breve viene disabilitato + to_long = TIMEOUTLONG + + # gestione timeout lungo + to_long = to_long - SAMPLETIME + if to_long <= 0: + #loggo e invio dati + try: + logQue.info( '>>' + value + ' ['+ cont +']') + errormsglen = 0 + accoda() + contatore() + except Exception as e: + logPro.error("URLBROWSER: errore registrazione valore e accoda TO_long") + logPro.error(str(e)) + pass + to_long = TIMEOUTLONG diff --git a/IOB-PI/readParallela_8.py b/IOB-PI/readParallela_8.py new file mode 100644 index 0000000..4513b4d --- /dev/null +++ b/IOB-PI/readParallela_8.py @@ -0,0 +1,733 @@ +#!/usr/bin/python +# -*- coding: utf-8 -*- + +# readParallela v. 2.5.2 8 Ingressi +# - single instance timer +# - invio multiplo x send eventi accodati +# - gestione segnali BLINKING +# - gestione INVERSIONE segnali cv 10-VII-2018 +# - gestione FILTRAGGIO segnali brevi cv 23-VII-2018 +# - (2.3) gestione 12 bit cv 14-I-2020 +# - (2.4) fix ingressi e conf apertura parallela + gestione vari bit filtraggio x nuovi ingressi + update conf con 12 parametri bit SEL 15-I-2020 +# - (2.4.8) versione adatta a raspberry PI vecchia generazione (GPIO corto, 8bit) +# - (2.5) Fix (hope) ciclo "wait send to complete", gestione timeout (rety infinito se IO riparte in modo anomalo) +# - (2.5.1) Fix numero versione 18.05.2023 +# - (2.5.2) Fix gestione eccezioni con report dettagliato + +#--------------------------------------------------------------- +# levare locking +# timer semplificata +# GPIO global + + +import time +import sys + + +from datetime import datetime + +import urllib +import ConfigParser +import os, sys + +import logging +import logging.handlers +import threading +import Queue + +from array import * + +#-------------------------------------------------------------- + +# COSTANTI +MSGLEN = 9 +TIMEOUTSERIALE = 10 +MAXRETRY = 10 + +# numero campioni filtraggio segnale ballerino +MAX_COUNTER_BLINK = 10 + +PROGRAM_NAME ="ReadPar IOB-pi v.2.5.2" + +# DA FILE CONF +idxMacchina = "1001" +SAMPLETIME = 0.1 +TIMEOUTSHORT = (SAMPLETIME*20) +TIMEOUTLONG = (SAMPLETIME*600) +SENDURLTIME = 0.08 +NMAXSEND = 5 # numero massimo di invii per singolo ciclo di svuotamento + +# VAR +to_enable = False +to_short = TIMEOUTSHORT +to_long = TIMEOUTLONG +to_serial = TIMEOUTSERIALE +to_retry = MAXRETRY +errormsglen = 0 + +# VAR + +out_0 = 24 +out_1 = 26 + +in_0 = 11 +in_1 = 12 +in_2 = 13 +in_3 = 15 +in_4 = 16 +in_5 = 18 +in_6 = 22 +in_7 = 7 + +# contatore: serve x match tra accoda ed invia x possibile controllo a posteriori... ogni volta che accodo incremento di 1, va da 0 a 9999 +cont = '0' + +# variabile stato online/offline della macchina +onLine = '1' + +# variabile stato seinding/waiting x la parte invio URL +sending = '0' + +# variabile stato timer thread busy +timer_busy = False + +# +# array per ingressi filtrati + +i_counters = array ( 'i',[0,0,0,0,0,0,0,0]) +B_blinking = array ( 'B',[0,0,0,0,0,0,0,0]) +B_previous = array ( 'B',[0,0,0,0,0,0,0,0]) +B_input = array ( 'B',[0,0,0,0,0,0,0,0]) +B_output = array ( 'B',[0,0,0,0,0,0,0,0]) + +B_inverting = array ( 'B',[0,0,0,0,0,0,0,0]) + +B_filter = array ( 'B',[0,0,0,0,0,0,0,0]) +B_filter_prev = array ( 'B',[0,0,0,0,0,0,0,0]) +B_temp = array ( 'B',[0,0,0,0,0,0,0,0]) +i_filter_counters = array ( 'i',[0,0,0,0,0,0,0,0]) + +#-------------------------------------------------------------- +# Gestione coda (condivisa) x registrazione eventi ed invio URL +#print "Creazione coda illimitata" + +Coda = Queue.Queue(0) + +#queueLock = threading.Lock() + +#--------------------------------------------------------------- +# lettura parallela +# ritorna il byte letto pulito ( due char hex ) + +def readParallelaFiltrata(): + + global in_0 + global in_1 + global in_2 + global in_3 + global in_4 + global in_5 + global in_6 + global in_7 + + global GPIO + + current = '' + + + try: + + if GPIO.input(in_0): + B_input[0] = 0 + else: + B_input[0] = 1 + + if GPIO.input(in_1): + B_input[1] = 0 + else: + B_input[1] = 1 + + if GPIO.input(in_2): + B_input[2] = 0 + else: + B_input[2] = 1 + + if GPIO.input(in_3): + B_input[3] = 0 + else: + B_input[3] = 1 + + if GPIO.input(in_4): + B_input[4] = 0 + else: + B_input[4] = 1 + + if GPIO.input(in_5): + B_input[5] = 0 + else: + B_input[5] = 1 + + if GPIO.input(in_6): + B_input[6] = 0 + else: + B_input[6] = 1 + + if GPIO.input(in_7): + B_input[7] = 0 + else: + B_input[7] = 1 + + + + #ciclo per ogni segnale + for i in xrange(8) : + #print (i) + + # v2.1 gestione inversione bit ingresso + + if ( B_inverting[i] == 1 ) : + if ( B_input[i] == 0 ) : + B_input[i] = 1 + else : + B_input[i] = 0 + + # v2.2 gestione filtro segnali brevi + + if ( B_filter[i] == 1 ) : + + # fronte 0 -> 1 + if ( B_input[i] == 1 ) and ( B_filter_prev [i] == 0 ) : + if ( i_filter_counters[i] == 0 ) : + # vero fronte 0 -> 1 + i_filter_counters[i] = MAX_COUNTER_FILTER + B_temp[i] = 0 # tengo l' ingresso a 0 + #logPro.info("START spike 0->1 on bit " + `i` ) + else : + # fine disturbo breve di uno stato 1 + i_filter_counters[i] = 0 + B_temp[i] = 1 # tengo l' ingresso a 1 + logPro.info("END spike 0->1 on bit " + `i` ) + + # stabile 1 -> 1 + if ( B_input[i] == 1 ) and ( B_filter_prev [i] == 1 ) : + if ( i_filter_counters[i] == 0 ) : + # segnale stabile a 1 + B_temp[i] = 1 # tengo l' ingresso a 1 + else : + # poco dopo il fronte + i_filter_counters[i] = i_filter_counters[i] - 1 + B_temp[i] = 0 # tengo l' ingresso a 0 + + # fronte 1 -> 0 + if ( B_input[i] == 0 ) and ( B_filter_prev [i] == 1 ) : + if ( i_filter_counters[i] == 0 ) : + # vero fronte 1 -> 0 + i_filter_counters[i] = MAX_COUNTER_FILTER + B_temp[i] = 1 # tengo l' ingresso a 1 + #logPro.info("START spike 1->0 on bit " + `i` ) + else : + # fine disturbo breve di uno stato 0 + i_filter_counters[i] = 0 + B_temp[i] = 0 # tengo l' ingresso a 0 + logPro.info("END spike 1->0 on bit " + `i` ) + + # stabile 0 -> 0 + if ( B_input[i] == 0 ) and ( B_filter_prev [i] == 0 ) : + if ( i_filter_counters[i] == 0 ) : + # segnale stabile a 0 + B_temp[i] = 0 # tengo l' ingresso a 0 + else : + # poco dopo il fronte + i_filter_counters[i] = i_filter_counters[i] - 1 + B_temp[i] = 1 # tengo l' ingresso a 1 + + B_filter_prev [i] = B_input[i] + B_input[i] = B_temp[i] + + # fine gestione filtro segnali brevi + + + # se non blinking, copia ingresso + if ( B_blinking[i] == 0 ) : + B_output[i] = B_input[i] + else: + # gestione segnale blinking + # se fronte del segnale + if ( B_previous[i] != B_input[i] ) : + B_previous[i] = B_input[i] + # se fronte di salita + if ( B_input[i] == 1 ) : + # subito uscita = 1 + B_output[i] = 1 + i_counters[i] = MAX_COUNTER_BLINK + #else : + # # loggo che ho rilevato un blink... + # logPro.info("Blink down on bit " + `i`) + else: + # no , segnale eguale a prima + # se input a 0 + if ( B_input[i] == 0 ) : + # E CONTEGGIO IN CORSO + if ( i_counters[i] > 0 ) : + i_counters[i] = i_counters[i] -1 + if ( i_counters[i] == 0 ) : + B_output[i] = 0 + logPro.info("END Blink on bit " + `i` ) + + #Rimettiamo insieme i bit + new_value = 0 + + if ( B_output[0] == 1 ) : + new_value = new_value + 1 + if ( B_output[1] == 1 ) : + new_value = new_value + 2 + if ( B_output[2] == 1 ) : + new_value = new_value + 4 + if ( B_output[3] == 1 ) : + new_value = new_value + 8 + if ( B_output[4] == 1 ) : + new_value = new_value + 16 + if ( B_output[5] == 1 ) : + new_value = new_value + 32 + if ( B_output[6] == 1 ) : + new_value = new_value + 64 + if ( B_output[7] == 1 ) : + new_value = new_value + 128 + + + current = hex( new_value ).replace ( "0x" , "" ).upper() + + except Exception as e: + print "Errore in readParallelaFiltrata \n\n" + print str(e) + pass + + return current + +#--------------------------------------------------------------- +#Funzione di scrittura su coda con try-except + +def accoda(): + + try: + dtEve = datetime.utcnow().strftime('%Y%m%d%H%M%S%f')[:-3] + Coda.put(dtEve + '#' + value + '#' + cont) + + except Queue.Full: + logPro.error( "Queue full" + `dtEve` + '#' + `value` + '#' + `cont` ) + except Exception as e: + logPro.error( "NETWORK:Errore http-no com rete-timeout" + url ) + logPro.error(str(e)) + +#-------------------------------------------------------------- +# svuotaCoda x invio dati al server +def svuota_coda(): + + global onLine + global sending + global timer_busy + global NMAXSEND + + #print "start timer " + + if ( timer_busy == False ): + timer_busy = True + #print "start timer ok " + + try: + if not Coda.empty(): + #print "coda da svuotare!" + response = urllib.urlopen(URLALIVE) + answ = response.read() + if answ == 'OK': + #print "OK alive" + response2 = urllib.urlopen(URLENABLED + idxMacchina) + answ2 = response2.read() + if answ2 == 'OK': + # aggiorno stato ad online + if onLine == '0': + logPro.info("IOB ONLINE!") + #print("IOB ONLINE") + + onLine = '1' # imposto comunque online + else: + if onLine == '1': + logPro.error("IOB offline") + #print("IOB offline") + + onLine = '0' + else: + if onLine == '1': + logPro.error("Server offline") + #print("Server offline") + + onLine = '0' + + # ora verifico SE si possa inviare (ovvero sia online server e NON ci siano altri send attivi...) + if onLine == '1': + if sending == '0': + #segnalo che sono in sending! + sending = '1' + + # SAM 2016.12.23: modifica x invio FINO A nMaxSend ELEMENTI ad ogni ciclo di svuotamento + i = NMAXSEND + + while i >= 0: + if not Coda.empty(): + + # formatto dataOra corrente + dtCurr = datetime.utcnow().strftime('%Y%m%d%H%M%S%f')[:-3] + + #prendo primo elemento dalla coda + resp = Coda.get() + + # recupero valori da elemento coda! + dtEve = resp.split("#")[0] + value = resp.split("#")[1] + cnt = resp.split("#")[2] + url = URLBASE + idxMacchina + URLADV1 + value + url = url + '&dtCurr=' + dtCurr + '&dtEve=' + dtEve + '&cnt=' + cnt + # CHIAMO URL + response3 = urllib.urlopen ( url ) + answ3 = response3.read() + #print(url) + + # log valore inviato! + logSnd.info( value + ' ['+ cnt +']' + ' R:' + answ3 ) + #print "Valore smaltito dalla coda" + + # tolgo 1 al contatore + i -= 1 + + # completato invio, riporto sending a zero! + sending = '0' + else: + if to_retry > 0: + to_retry -= 1 + logPro.info("WAIT active send to complete") + else: + sending = '0' + to_retry = MAXRETRY + logPro.info("END WAIT, reset to_retry var") + + else: + pass + + else: + pass + + except Exception as e: + if onLine == '1': + logPro.error("Server Non raggiungibile") + logPro.error(str(e)) + #print "Non raggiungibile" + + onLine = '0' + + # in ogni caso + + timer_busy = False + #print "end timer ok" + + + #print "end timer " + + +#--------------------------------------------------------------- +# funzione timer thread +#--------------------------------------------------------------- +def do_every (interval, worker_func, iterations = 0): + if iterations != 1: + threading.Timer ( + interval, + do_every, [interval, worker_func, 0 if iterations == 0 else iterations-1] + ).start (); + + worker_func (); + +#--------------------------------------------------------------- +# gestione contatore +#--------------------------------------------------------------- +def contatore(): + + try: + global cont + ctr = int(cont) + ctr +=1 + ctr = ctr % 10000 # round robin 10000 eventi x track + cont = str(ctr) + except Exception as e: + print("errore incremento contatore \n\n") + print(str(e)) + +#--------------------------------------------------------------- +# avvia porta parallela +#--------------------------------------------------------------- +def avviaParallela(): + + global in_0 + global in_1 + global in_2 + global in_3 + global in_4 + global in_5 + global in_6 + global in_7 + + global GPIO + + try: + + GPIO.setmode(GPIO.BOARD) + + GPIO.setwarnings(False) + + #GPIO.setup(out_0, GPIO.OUT) # output 0 + #GPIO.setup(out_1, GPIO.OUT) # output 1 + + GPIO.setup(in_0, GPIO.IN) # input 0 + GPIO.setup(in_1, GPIO.IN) # input 1 + GPIO.setup(in_2, GPIO.IN) # input 2 + GPIO.setup(in_3, GPIO.IN) # input 3 + GPIO.setup(in_4, GPIO.IN) # input 4 + GPIO.setup(in_5, GPIO.IN) # input 5 + GPIO.setup(in_6, GPIO.IN) # input 6 + GPIO.setup(in_7, GPIO.IN) # input 7 + + except Exception as e: + print( "\n\n" + PROGRAM_NAME + " - Error 3 on RPi.GPIO ! \n\n") + print str(e) + sys.exit(1) + + + print( "\n\n" + PROGRAM_NAME + " - init ok \n\n") + + +#--------------------------------------------------------------- +#--------------------------------------------------------------- +# MAIN + +try: + config = ConfigParser.RawConfigParser() + config.read ( 'IOB.cfg' ) + + SAMPLETIME = config.getfloat ( 'time' , 'SAMPLETIME' ) + TIMEOUTSHORT = config.getfloat ( 'time' , 'TIMEOUTSHORT' ) + TIMEOUTLONG = config.getfloat ( 'time' , 'TIMEOUTLONG' ) + SENDURLTIME = config.getfloat ( 'time' , 'SENDURLTIME' ) + NMAXSEND = config.getint ( 'time' , 'NMAXSEND' ) + + idxMacchina = config.get ( 'id' , 'idxMacchina' ) + + + URLBASE = config.get ( 'web' , 'URLBASE' ) + URLENABLED = config.get('web' , 'URLENABLED') + URLALIVE = config.get ('web' , 'URLALIVE') + URLADV1 = config.get ( 'web' , 'URLADV1' ) + + LOGFILE = config.get ( 'log' , 'LOGFILE' ) + LOGLEVEL = config.get ( 'log' , 'LOGLEVEL' ) + + B_blinking[0] = config.getint ( 'blink' , 'bit0' ) + B_blinking[1] = config.getint ( 'blink' , 'bit1' ) + B_blinking[2] = config.getint ( 'blink' , 'bit2' ) + B_blinking[3] = config.getint ( 'blink' , 'bit3' ) + B_blinking[4] = config.getint ( 'blink' , 'bit4' ) + B_blinking[5] = config.getint ( 'blink' , 'bit5' ) + B_blinking[6] = config.getint ( 'blink' , 'bit6' ) + B_blinking[7] = config.getint ( 'blink' , 'bit7' ) + + MAX_COUNTER_BLINK = config.getint ( 'blink' , 'MAX_COUNTER_BLINK' ) + + # cv 2.1 se bit = 1 allora inverto segnale in ingresso... + + B_inverting[0] = config.getint ( 'invert' , 'bit0' ) + B_inverting[1] = config.getint ( 'invert' , 'bit1' ) + B_inverting[2] = config.getint ( 'invert' , 'bit2' ) + B_inverting[3] = config.getint ( 'invert' , 'bit3' ) + B_inverting[4] = config.getint ( 'invert' , 'bit4' ) + B_inverting[5] = config.getint ( 'invert' , 'bit5' ) + B_inverting[6] = config.getint ( 'invert' , 'bit6' ) + B_inverting[7] = config.getint ( 'invert' , 'bit7' ) + + # cv 2.2 se bit = 1 allora filtro segnali brevi ... + + B_filter[0] = config.getint ( 'filter' , 'bit0' ) + B_filter[1] = config.getint ( 'filter' , 'bit1' ) + B_filter[2] = config.getint ( 'filter' , 'bit2' ) + B_filter[3] = config.getint ( 'filter' , 'bit3' ) + B_filter[4] = config.getint ( 'filter' , 'bit4' ) + B_filter[5] = config.getint ( 'filter' , 'bit5' ) + B_filter[6] = config.getint ( 'filter' , 'bit6' ) + B_filter[7] = config.getint ( 'filter' , 'bit7' ) + + MAX_COUNTER_FILTER = config.getint ( 'filter' , 'MAX_COUNTER_FILTER' ) + + +except Exception as e: + print "\n\n" + PROGRAM_NAME + ' - Error 4 - in config file ' 'IOB.cfg' + print str(e) + sys.exit(1) + +#-------------------------------------------- +# oggetto Logger +#-------------------------------------------- +try: + logging.basicConfig(level=logging.DEBUG, + format='%(asctime)s %(name)-8s %(levelname)-8s %(message)s', + datefmt='%Y-%m-%d %H:%M:%S', + filename=LOGFILE, + filemode='a' + ) + + # aggiungo 2 logger specifici x queue e send... + logQue = logging.getLogger('queue') + logSnd = logging.getLogger('sendUrl') + logPro = logging.getLogger('program') + +except Exception as e: + # manda mail o simili - FARE!!! + print "LOG: Impossibile creare file log con nome" + print (LOGFILE) + print "\n\n" + print str(e) +#-------------------------------------------- + + +print "\n\n" + PROGRAM_NAME + "\n\n" + +global startstatus +startstatus = 1 + +if startstatus == 1: + logPro.info("Avvio Programma" + PROGRAM_NAME) + +## Verifica l'OS e di conseguenza carica il file relativo con metodo di lockfile appropriato + check singola istanza +if os.name == 'posix': + import unix +else: + import win + +logPro.info( "Start " + PROGRAM_NAME ) + + +# lettura file configurazione + +# [id] +# idxMacchina = 2001 +# [time] +# SAMPLETIME = 0.1 +# TIMEOUTSHORT = 200 +# TIMEOUTLONG = 6000 + + +print ( ' idxMacchina = %s' % ( idxMacchina ) ) +print ( ' SAMPLETIME = %4.2f' % ( SAMPLETIME ) ) +print ( ' TIMEOUTSHORT = %4.2f' % ( TIMEOUTSHORT ) ) +print ( ' TIMEOUTLONG = %4.2f' % ( TIMEOUTLONG ) ) +print ( ' SENDURLTIME = %4.2f' % ( SENDURLTIME ) ) +print ( ' URLBASE = %s' % ( URLBASE ) ) +print ( ' URLADV1 = %s' % ( URLADV1 ) ) +print ( ' LOGFILE = %s' % ( LOGFILE ) ) +print ( ' LOGLEVEL = %s' % ( LOGLEVEL ) ) + +# -sys.stdout.write ( 'idxMacchina ?' + idxMacchina + '\n') + +to_short = TIMEOUTSHORT +to_long = TIMEOUTLONG + + +#-------------------------------------------------------------- +# apertura parallela + +try: + import RPi.GPIO as GPIO +except RuntimeError: + print( "\n\n" + PROGRAM_NAME + " - Error 1 - you need superuser privileges") +except Exception as e: + print( "\n\n" + PROGRAM_NAME + " - Error 2 - you need superuser privileges. USE 'sudo' to run your script\n\n") + print str(e) + sys.exit(1) + + +avviaParallela() + + +#-------------------------------------------------------------- +# MARCO: qui inserire avvio thread di "svuotaCoda" + +# avviaSvuotaCoda +#print "Avvia svuota coda" + +do_every ( SENDURLTIME , svuota_coda ); + +#--------------------------------------------------------------- +# ciclo forever and ever + +old = '' + +#print "Avvio ciclo" +logPro.info("Avvio loop principale") +while 1: + + try: + time.sleep (SAMPLETIME) + except Exception as e: + logPro.info("First_SLEEP: errore attesa sampletime") + logPro.error(str(e)) + + # lettura dati da IOB + value = readParallelaFiltrata() + + if ( value != '' ) : + if value != old : + #loggo e invio dati + try: + logQue.info( value + ' ['+ cont +']') + errormsglen = 0 + accoda() + contatore() + except Exception as e: + logPro.error("URLBROWSER: errore registrazione valore e accoda") + logPro.error(str(e)) + pass + #enable e reset timer + to_enable = True + to_short = TIMEOUTSHORT + to_long = TIMEOUTLONG + + old = value + + + # gestione timeout breve + if ( to_enable ) : + to_short = to_short - SAMPLETIME + if to_short <= 0: + #loggo e invio dati + try: + logQue.info( '>' + value + ' ['+ cont +']') + errormsglen = 0 + accoda() + contatore() + except Exception as e: + logPro.error("URLBROWSER: errore registrazione valore e accoda TO_short") + logPro.error(str(e)) + pass + to_short = TIMEOUTSHORT + to_enable = False # dopo un colpo il timer breve viene disabilitato + to_long = TIMEOUTLONG + + # gestione timeout lungo + to_long = to_long - SAMPLETIME + if to_long <= 0: + #loggo e invio dati + try: + logQue.info( '>>' + value + ' ['+ cont +']') + errormsglen = 0 + accoda() + contatore() + except Exception as e: + logPro.error("URLBROWSER: errore registrazione valore e accoda TO_long") + logPro.error(str(e)) + pass + to_long = TIMEOUTLONG diff --git a/IOB-PI/sendReboot.py b/IOB-PI/sendReboot.py new file mode 100644 index 0000000..7ca636d --- /dev/null +++ b/IOB-PI/sendReboot.py @@ -0,0 +1,135 @@ +#!/usr/bin/python +# -*- coding: utf-8 -*- + +# sendReboot v. 1.8 +# - (2.5.2) Fix gestione eccezioni con report dettagliato +#--------------------------------------------------------------- + + +import time +import sys + + +from datetime import datetime + +import urllib +import ConfigParser +import os, sys + +import logging + +import time + +#--------------------------------------------------------------- + +# COSTANTI +SR_PROG_NAME = "SendReboot IOB-pi v.2.5.2" + +# DA FILE CONF +idxMacchina = "99" + +# registro se ho fatto chiamata +global numTry +numTry = 1 + + +#--------------------------------------------------------------- +#Funzione di scrittura su url con try-except +#--------------------------------------------------------------- + +def chiamaUrl(numTry): + + try: + urllib.urlopen ( url ) + numTry = numTry + 10 + + except Exception as e: + print("Errore in chiamaUrl") + print(str(e)) + logging.info ( str(e) ) + + print("Url chiamato: " , url) + return numTry + + +#--------------------------------------------------------------- +# Funzione di recupero mac address per poterlo inviare a MPIO +#--------------------------------------------------------------- +def getMAC(interface): + # Return the MAC address of interface + try: + str = open('/sys/class/net/' + interface + '/address').read() + except: + str = "00:00:00:00:00:00" + return str[0:17] + +#--------------------------------------------------------------- +# MAIN +#--------------------------------------------------------------- + +try: + config = ConfigParser.RawConfigParser() + config.read ( 'IOB.cfg' ) + + idxMacchina = config.get ( 'id' , 'idxMacchina' ) + + + URLREBO = config.get ( 'web' , 'URLREBO' ) + + LOGFILE = config.get ( 'log' , 'LOGREBO' ) +except Exception as e: + print("\n\n" + SR_PROG_NAME + ' - Error 4 - in config file ' 'IOB.cfg') + print(str(e)) + sys.exit(1) + + +#-------------------------------------------- +# oggetto Logger +#-------------------------------------------- +try: +# log = Logger(LOGFILE) + logging.basicConfig(level=logging.DEBUG, + format='%(asctime)s %(name)-8s %(levelname)-8s %(message)s', + datefmt='%Y-%m-%d %H:%M:%S', + filename=LOGFILE, + filemode='a') + +except Exception as e: + # manda mail o simili - FARE!!! + print("LOG: Impossibile creare file log con nome ") + print(LOGFILE) + print(str(e)) +#-------------------------------------------- + + +print("\n\n" + SR_PROG_NAME + "\n\n") + +global startstatus +startstatus = 1 + +if startstatus == 1: + logging.info("Avvio Programma " + SR_PROG_NAME) + + +# lettura file configurazione +print ( ' idxMacchina = %s' % ( idxMacchina ) ) +print ( ' URLREBO = %s' % ( URLREBO ) ) +print ( ' LOGFILE = %s' % ( LOGFILE ) ) + +# lettura mac address +myMac = getMAC('eth0') +print ( ' MAC Address = %s' % ( myMac ) ) + +# configuro URL da inviare +url = URLREBO + idxMacchina + "&mac=" + myMac + +# modifica: cerco se ho inviato segnale altrimenti ritento invio... +while (numTry < 11): + logging.info("Tentativo invio URL: $numTry" ) + numTry = chiamaUrl(numTry) + time.sleep(3) + numTry = numTry + 1 + + +# registro che ho inviato! +logging.info("Inviato segnale di reboot!: " + url ) diff --git a/IOB-PI/update_2.5.sh b/IOB-PI/update_2.5.sh new file mode 100644 index 0000000..6947ed1 --- /dev/null +++ b/IOB-PI/update_2.5.sh @@ -0,0 +1,248 @@ +#!/bin/bash + +# script per update IOB-PI (filre readParallela) secondo la tipologia del raspberry tra 8 e 12 ingressi + +revNum=`awk '/^Revision/ {sub("^1000", "", $3); print $3}' /proc/cpuinfo` +anno=2000 +model='na' +ram=0 + +# decodifica da questa tabella: https://elinux.org/RPi_HardwareHistory e https://ozzmaker.com/check-raspberry-software-hardware-version-command-line +case $revNum in + + 0002 | 0003 | 0004 | 0005 | 0006) + anno='2012' + model='B' + ram=256 + ;; + + 0007 | 0008 | 0009) + anno='2013' + model='A' + ram=256 + ;; + + 000d | 000e | 000f) + anno='2012' + model='B' + ram=512 + ;; + + 0010) + anno='2014' + model='B+' + ram=512 + ;; + + 0011) + anno='2014' + model='CM1' + ram=512 + ;; + + 0012) + anno='2014' + model='A+' + ram=256 + ;; + + 0013) + anno='2015' + model='B+' + ram=512 + ;; + + 0014) + anno='2014' + model='CM1' + ram=512 + ;; + + 0015) + anno='2014' + model='A+' + ram=512 + ;; + + a01040 | a01041 | a21042) + anno='2015' + model='2 Model B' + ram=1024 + ;; + + a22042) + anno='2016' + model='2 Model B' + ram=1024 + ;; + + 900021) + anno='2016' + model='A+' + ram=512 + ;; + + 900032) + anno='2016' + model='B+' + ram=512 + ;; + + 900092) + anno='2015' + model='Zero' + ram=512 + ;; + + 900093 | 920093) + anno='2016' + model='Zero' + ram=512 + ;; + + 9000c1) + anno='2017' + model='Zero W' + ram=512 + ;; + + a02082 | a22082 | a22082 | a32082) + anno='2016' + model='3 Model B' + ram=1024 + ;; + + a020a0) + anno='2017' + model='CM3' + ram=1024 + ;; + + a020d3) + anno='2018' + model='3 Model B+' + ram=1024 + ;; + + 9020e0) + anno='2018' + model='3 Model A+' + ram=512 + ;; + + a02100) + anno='2019' + model='CM3' + ram=1024 + ;; + + a03111) + anno='2019' + model='4 Model B' + ram=1024 + ;; + + b03111 | b03112) + anno='2019' + model='4 Model B' + ram=2048 + ;; + + b03114) + anno='2020' + model='4 Model B' + ram=2048 + ;; + + b03115) + anno='2022' + model='4 Model B' + ram=2048 + ;; + + c03111 | c03112) + anno='2019' + model='4 Model B' + ram=4096 + ;; + + c03114) + anno='2020' + model='4 Model B' + ram=4096 + ;; + + c03115) + anno='2022' + model='4 Model B' + ram=2048 + ;; + + d03114) + anno='2020' + model='4 Model B' + ram=8192 + ;; + + d03115) + anno='2022' + model='4 Model B' + ram=8192 + ;; + + + 902120) + anno='2021' + model='Zero 2 W' + ram=512 + ;; + + *) + anno='2000' + model='Unknown' + ram=128 + ;; +esac + +echo "RPI $anno | model $model | RAM $ram" +echo "Revisione: $revNum" + +# default a 8 IN... +selIn=8 +# verifico anno/ram, se almeno 2014 e 1gb --> 12 bit... +if [ $anno -gt 2015 ] && [ $ram -gt 512 ]; then + selIn=12 +fi + +echo "Scelta versione $selIn ingressi" + + +# fermo esecuzione... +/etc/init.d/MapoIOB stop +echo "Arrestato servizio..." + +# mv file readParallela.py corrente... +mv readParallela.py readParallela_$(date -d "today" +"%Y%m%d").py + +# secondo tipo copio il file corretto +if [ $selIn -eq 8 ]; then + cp -f readParallela_8.py readParallela.py +else + cp -f readParallela_12.py readParallela.py +fi + +# fix permessi +chown pi: * +chmod +x readP* + +# riavvio esecuzione... +/etc/init.d/MapoIOB restart +echo "Modifiche effettuate..." + +echo "Attenzione: verificare effettiva partenza servizio, per farlo digitare il comando" +echo "/etc/init.d/MapoIOB restart" +echo "--------------------------------" +echo "In particolare il file IOB.cfg deve contenere NMAXSEND = 5 nella sezione [time]" +echo "--------------------------------" +echo "Inoltre verificare presenza sezioni [blink] [invert] [filter]" +echo "--------------------------------" diff --git a/IOB-PI/vers2.5 12bit/readParallela.py b/IOB-PI/vers2.5 12bit/readParallela.py index 799265a..669253b 100644 --- a/IOB-PI/vers2.5 12bit/readParallela.py +++ b/IOB-PI/vers2.5 12bit/readParallela.py @@ -1,7 +1,7 @@ #!/usr/bin/python # -*- coding: utf-8 -*- -# readParallela v. 2.5.1 +# readParallela v. 2.5.2 12 Ingressi # - single instance timer # - invio multiplo x send eventi accodati # - gestione segnali BLINKING @@ -12,6 +12,7 @@ # - (2.4.8) versione adatta a raspberry PI vecchia generazione (GPIO corto, 8bit) # - (2.5) Fix (hope) ciclo "wait send to complete", gestione timeout (rety infinito se IO riparte in modo anomalo) # - (2.5.1) Fix numero versione 18.05.2023 +# - (2.5.2) Fix gestione eccezioni con report dettagliato #--------------------------------------------------------------- # levare locking @@ -46,7 +47,7 @@ MAXRETRY = 10 # numero campioni filtraggio segnale ballerino MAX_COUNTER_BLINK = 10 -PROGRAM_NAME ="ReadPar IOB-pi v.2.5.1" +PROGRAM_NAME ="ReadPar IOB-pi v.2.5.2" # DA FILE CONF idxMacchina = "1001" @@ -214,7 +215,7 @@ def readParallelaFiltrata(): #ciclo per ogni segnale for i in xrange(12) : - # print (i) + #print (i) # v2.1 gestione inversione bit ingresso @@ -339,7 +340,9 @@ def readParallelaFiltrata(): current = hex( new_value ).replace ( "0x" , "" ).upper() - except: + except Exception as e: + print "Errore in readParallelaFiltrata \n\n" + print str(e) pass return current @@ -355,10 +358,9 @@ def accoda(): except Queue.Full: logPro.error( "Queue full" + `dtEve` + '#' + `value` + '#' + `cont` ) - except: + except Exception as e: logPro.error( "NETWORK:Errore http-no com rete-timeout" + url ) - #print "Url aforte" , url - + logPro.error(str(e)) #-------------------------------------------------------------- # svuotaCoda x invio dati al server @@ -450,16 +452,17 @@ def svuota_coda(): sending = '0' to_retry = MAXRETRY logPro.info("END WAIT, reset to_retry var") - + else: pass else: pass - except: + except Exception as e: if onLine == '1': logPro.error("Server Non raggiungibile") + logPro.error(str(e)) #print "Non raggiungibile" onLine = '0' @@ -496,8 +499,9 @@ def contatore(): ctr +=1 ctr = ctr % 10000 # round robin 10000 eventi x track cont = str(ctr) - except: - print("errore incremento contatore") + except Exception as e: + print("errore incremento contatore \n\n") + print(str(e)) #--------------------------------------------------------------- # avvia porta parallela @@ -541,8 +545,9 @@ def avviaParallela(): GPIO.setup(in_10, GPIO.IN) # input 10 GPIO.setup(in_11, GPIO.IN) # input 11 - except: - print( "\n\n" + PROGRAM_NAME + " - Error 3 on RPi.GPIO ! \n\n") + except Exception as e: + print( "\n\n" + PROGRAM_NAME + " - Error 3 on RPi.GPIO ! \n\n") + print str(e) sys.exit(1) @@ -598,7 +603,7 @@ try: B_inverting[4] = config.getint ( 'invert' , 'bit4' ) B_inverting[5] = config.getint ( 'invert' , 'bit5' ) B_inverting[6] = config.getint ( 'invert' , 'bit6' ) - B_inverting[7] = config.getint ( 'invert' , 'bit7' ) + B_inverting[7] = config.getint ( 'invert' , 'bit7' ) B_inverting[8] = config.getint ( 'invert' , 'bit8' ) B_inverting[9] = config.getint ( 'invert' , 'bit9' ) B_inverting[10] = config.getint ( 'invert' , 'bit10' ) @@ -613,7 +618,7 @@ try: B_filter[4] = config.getint ( 'filter' , 'bit4' ) B_filter[5] = config.getint ( 'filter' , 'bit5' ) B_filter[6] = config.getint ( 'filter' , 'bit6' ) - B_filter[7] = config.getint ( 'filter' , 'bit7' ) + B_filter[7] = config.getint ( 'filter' , 'bit7' ) B_filter[8] = config.getint ( 'filter' , 'bit8' ) B_filter[9] = config.getint ( 'filter' , 'bit9' ) B_filter[10] = config.getint ( 'filter' , 'bit10' ) @@ -622,8 +627,9 @@ try: MAX_COUNTER_FILTER = config.getint ( 'filter' , 'MAX_COUNTER_FILTER' ) -except: +except Exception as e: print "\n\n" + PROGRAM_NAME + ' - Error 4 - in config file ' 'IOB.cfg' + print str(e) sys.exit(1) #-------------------------------------------- @@ -642,10 +648,12 @@ try: logSnd = logging.getLogger('sendUrl') logPro = logging.getLogger('program') -except: +except Exception as e: # manda mail o simili - FARE!!! - print "LOG: Impossibile creare file log con nome " + print "LOG: Impossibile creare file log con nome" print (LOGFILE) + print "\n\n" + print str(e) #-------------------------------------------- @@ -699,8 +707,9 @@ try: import RPi.GPIO as GPIO except RuntimeError: print( "\n\n" + PROGRAM_NAME + " - Error 1 - you need superuser privileges") -except: +except Exception as e: print( "\n\n" + PROGRAM_NAME + " - Error 2 - you need superuser privileges. USE 'sudo' to run your script\n\n") + print str(e) sys.exit(1) @@ -726,8 +735,9 @@ while 1: try: time.sleep (SAMPLETIME) - except: - logPro.info("First_SLEEP: errore attesa sampletime") + except Exception as e: + logPro.info("First_SLEEP: errore attesa sampletime") + logPro.error(str(e)) # lettura dati da IOB value = readParallelaFiltrata() @@ -740,8 +750,9 @@ while 1: errormsglen = 0 accoda() contatore() - except: + except Exception as e: logPro.error("URLBROWSER: errore registrazione valore e accoda") + logPro.error(str(e)) pass #enable e reset timer to_enable = True @@ -761,8 +772,9 @@ while 1: errormsglen = 0 accoda() contatore() - except: + except Exception as e: logPro.error("URLBROWSER: errore registrazione valore e accoda TO_short") + logPro.error(str(e)) pass to_short = TIMEOUTSHORT to_enable = False # dopo un colpo il timer breve viene disabilitato @@ -777,7 +789,8 @@ while 1: errormsglen = 0 accoda() contatore() - except: + except Exception as e: logPro.error("URLBROWSER: errore registrazione valore e accoda TO_long") + logPro.error(str(e)) pass to_long = TIMEOUTLONG diff --git a/IOB-PI/vers2.5 12bit/sendReboot.py b/IOB-PI/vers2.5 12bit/sendReboot.py index 021c400..7ca636d 100644 --- a/IOB-PI/vers2.5 12bit/sendReboot.py +++ b/IOB-PI/vers2.5 12bit/sendReboot.py @@ -2,7 +2,7 @@ # -*- coding: utf-8 -*- # sendReboot v. 1.8 - +# - (2.5.2) Fix gestione eccezioni con report dettagliato #--------------------------------------------------------------- @@ -23,7 +23,7 @@ import time #--------------------------------------------------------------- # COSTANTI -PROGRAM_NAME = "SendReboot IOB-pi v.1.8" +SR_PROG_NAME = "SendReboot IOB-pi v.2.5.2" # DA FILE CONF idxMacchina = "99" @@ -39,44 +39,48 @@ numTry = 1 def chiamaUrl(numTry): - try: - urllib.urlopen ( url ) - numTry = numTry + 10 - except Exception, e: - print e - logging.info ( e ) - print "Url aforte" , url - return numTry + try: + urllib.urlopen ( url ) + numTry = numTry + 10 + + except Exception as e: + print("Errore in chiamaUrl") + print(str(e)) + logging.info ( str(e) ) + + print("Url chiamato: " , url) + return numTry #--------------------------------------------------------------- # Funzione di recupero mac address per poterlo inviare a MPIO #--------------------------------------------------------------- def getMAC(interface): - # Return the MAC address of interface - try: - str = open('/sys/class/net/' + interface + '/address').read() - except: - str = "00:00:00:00:00:00" - return str[0:17] + # Return the MAC address of interface + try: + str = open('/sys/class/net/' + interface + '/address').read() + except: + str = "00:00:00:00:00:00" + return str[0:17] #--------------------------------------------------------------- # MAIN #--------------------------------------------------------------- try: - config = ConfigParser.RawConfigParser() - config.read ( 'IOB.cfg' ) + config = ConfigParser.RawConfigParser() + config.read ( 'IOB.cfg' ) - idxMacchina = config.get ( 'id' , 'idxMacchina' ) + idxMacchina = config.get ( 'id' , 'idxMacchina' ) - URLREBO = config.get ( 'web' , 'URLREBO' ) + URLREBO = config.get ( 'web' , 'URLREBO' ) - LOGFILE = config.get ( 'log' , 'LOGREBO' ) -except: - print "\n\n" + PROGRAM_NAME + ' - Error 4 - in config file ' 'IOB.cfg' - sys.exit(1) + LOGFILE = config.get ( 'log' , 'LOGREBO' ) +except Exception as e: + print("\n\n" + SR_PROG_NAME + ' - Error 4 - in config file ' 'IOB.cfg') + print(str(e)) + sys.exit(1) #-------------------------------------------- @@ -84,26 +88,27 @@ except: #-------------------------------------------- try: # log = Logger(LOGFILE) - logging.basicConfig(level=logging.DEBUG, - format='%(asctime)s %(name)-8s %(levelname)-8s %(message)s', - datefmt='%Y-%m-%d %H:%M:%S', - filename=LOGFILE, - filemode='a') + logging.basicConfig(level=logging.DEBUG, + format='%(asctime)s %(name)-8s %(levelname)-8s %(message)s', + datefmt='%Y-%m-%d %H:%M:%S', + filename=LOGFILE, + filemode='a') -except: - # manda mail o simili - FARE!!! - print "LOG: Impossibile creare file log con nome " - print (LOGFILE) +except Exception as e: + # manda mail o simili - FARE!!! + print("LOG: Impossibile creare file log con nome ") + print(LOGFILE) + print(str(e)) #-------------------------------------------- -print "\n\n" + PROGRAM_NAME + "\n\n" +print("\n\n" + SR_PROG_NAME + "\n\n") global startstatus startstatus = 1 if startstatus == 1: - logging.info("Avvio Programma " + PROGRAM_NAME) + logging.info("Avvio Programma " + SR_PROG_NAME) # lettura file configurazione @@ -120,7 +125,7 @@ url = URLREBO + idxMacchina + "&mac=" + myMac # modifica: cerco se ho inviato segnale altrimenti ritento invio... while (numTry < 11): - logging.info("Tentativo invio URL: " + `numTry` ) + logging.info("Tentativo invio URL: $numTry" ) numTry = chiamaUrl(numTry) time.sleep(3) numTry = numTry + 1 diff --git a/IOB-PI/vers2.5 8bit/MapoIOB b/IOB-PI/vers2.5 8bit/MapoIOB index 1213dc7..1d8f821 100644 --- a/IOB-PI/vers2.5 8bit/MapoIOB +++ b/IOB-PI/vers2.5 8bit/MapoIOB @@ -1,8 +1,8 @@ #! /bin/bash ### BEGIN INIT INFO # Provides: MapoIOB: script Steamware per avvio driver IOB -# Required-Start: $remote_fs $syslog ramlog -# Required-Stop: $remote_fs $syslog ramlog +# Required-Start: $remote_fs $syslog +# Required-Stop: $remote_fs $syslog # Default-Start: 2 3 4 5 # Default-Stop: 0 1 6 # Short-Description: Steamware's MapoIOB driver diff --git a/IOB-PI/vers2.5 8bit/readParallela.py b/IOB-PI/vers2.5 8bit/readParallela.py index 8ee538d..4513b4d 100644 --- a/IOB-PI/vers2.5 8bit/readParallela.py +++ b/IOB-PI/vers2.5 8bit/readParallela.py @@ -1,7 +1,7 @@ #!/usr/bin/python # -*- coding: utf-8 -*- -# readParallela v. 2.5.1 +# readParallela v. 2.5.2 8 Ingressi # - single instance timer # - invio multiplo x send eventi accodati # - gestione segnali BLINKING @@ -12,6 +12,7 @@ # - (2.4.8) versione adatta a raspberry PI vecchia generazione (GPIO corto, 8bit) # - (2.5) Fix (hope) ciclo "wait send to complete", gestione timeout (rety infinito se IO riparte in modo anomalo) # - (2.5.1) Fix numero versione 18.05.2023 +# - (2.5.2) Fix gestione eccezioni con report dettagliato #--------------------------------------------------------------- # levare locking @@ -46,7 +47,7 @@ MAXRETRY = 10 # numero campioni filtraggio segnale ballerino MAX_COUNTER_BLINK = 10 -PROGRAM_NAME ="ReadPar IOB-pi v.2.5.1" +PROGRAM_NAME ="ReadPar IOB-pi v.2.5.2" # DA FILE CONF idxMacchina = "1001" @@ -296,7 +297,9 @@ def readParallelaFiltrata(): current = hex( new_value ).replace ( "0x" , "" ).upper() - except: + except Exception as e: + print "Errore in readParallelaFiltrata \n\n" + print str(e) pass return current @@ -312,10 +315,9 @@ def accoda(): except Queue.Full: logPro.error( "Queue full" + `dtEve` + '#' + `value` + '#' + `cont` ) - except: + except Exception as e: logPro.error( "NETWORK:Errore http-no com rete-timeout" + url ) - #print "Url aforte" , url - + logPro.error(str(e)) #-------------------------------------------------------------- # svuotaCoda x invio dati al server @@ -414,9 +416,10 @@ def svuota_coda(): else: pass - except: + except Exception as e: if onLine == '1': logPro.error("Server Non raggiungibile") + logPro.error(str(e)) #print "Non raggiungibile" onLine = '0' @@ -453,8 +456,9 @@ def contatore(): ctr +=1 ctr = ctr % 10000 # round robin 10000 eventi x track cont = str(ctr) - except: - print("errore incremento contatore") + except Exception as e: + print("errore incremento contatore \n\n") + print(str(e)) #--------------------------------------------------------------- # avvia porta parallela @@ -490,8 +494,9 @@ def avviaParallela(): GPIO.setup(in_6, GPIO.IN) # input 6 GPIO.setup(in_7, GPIO.IN) # input 7 - except: - print( "\n\n" + PROGRAM_NAME + " - Error 3 on RPi.GPIO ! \n\n") + except Exception as e: + print( "\n\n" + PROGRAM_NAME + " - Error 3 on RPi.GPIO ! \n\n") + print str(e) sys.exit(1) @@ -543,7 +548,7 @@ try: B_inverting[4] = config.getint ( 'invert' , 'bit4' ) B_inverting[5] = config.getint ( 'invert' , 'bit5' ) B_inverting[6] = config.getint ( 'invert' , 'bit6' ) - B_inverting[7] = config.getint ( 'invert' , 'bit7' ) + B_inverting[7] = config.getint ( 'invert' , 'bit7' ) # cv 2.2 se bit = 1 allora filtro segnali brevi ... @@ -554,13 +559,14 @@ try: B_filter[4] = config.getint ( 'filter' , 'bit4' ) B_filter[5] = config.getint ( 'filter' , 'bit5' ) B_filter[6] = config.getint ( 'filter' , 'bit6' ) - B_filter[7] = config.getint ( 'filter' , 'bit7' ) + B_filter[7] = config.getint ( 'filter' , 'bit7' ) MAX_COUNTER_FILTER = config.getint ( 'filter' , 'MAX_COUNTER_FILTER' ) -except: +except Exception as e: print "\n\n" + PROGRAM_NAME + ' - Error 4 - in config file ' 'IOB.cfg' + print str(e) sys.exit(1) #-------------------------------------------- @@ -579,10 +585,12 @@ try: logSnd = logging.getLogger('sendUrl') logPro = logging.getLogger('program') -except: +except Exception as e: # manda mail o simili - FARE!!! - print "LOG: Impossibile creare file log con nome " + print "LOG: Impossibile creare file log con nome" print (LOGFILE) + print "\n\n" + print str(e) #-------------------------------------------- @@ -636,8 +644,9 @@ try: import RPi.GPIO as GPIO except RuntimeError: print( "\n\n" + PROGRAM_NAME + " - Error 1 - you need superuser privileges") -except: +except Exception as e: print( "\n\n" + PROGRAM_NAME + " - Error 2 - you need superuser privileges. USE 'sudo' to run your script\n\n") + print str(e) sys.exit(1) @@ -663,8 +672,9 @@ while 1: try: time.sleep (SAMPLETIME) - except: - logPro.info("First_SLEEP: errore attesa sampletime") + except Exception as e: + logPro.info("First_SLEEP: errore attesa sampletime") + logPro.error(str(e)) # lettura dati da IOB value = readParallelaFiltrata() @@ -677,8 +687,9 @@ while 1: errormsglen = 0 accoda() contatore() - except: + except Exception as e: logPro.error("URLBROWSER: errore registrazione valore e accoda") + logPro.error(str(e)) pass #enable e reset timer to_enable = True @@ -698,8 +709,9 @@ while 1: errormsglen = 0 accoda() contatore() - except: + except Exception as e: logPro.error("URLBROWSER: errore registrazione valore e accoda TO_short") + logPro.error(str(e)) pass to_short = TIMEOUTSHORT to_enable = False # dopo un colpo il timer breve viene disabilitato @@ -714,7 +726,8 @@ while 1: errormsglen = 0 accoda() contatore() - except: + except Exception as e: logPro.error("URLBROWSER: errore registrazione valore e accoda TO_long") + logPro.error(str(e)) pass to_long = TIMEOUTLONG diff --git a/IOB-PI/vers2.5 8bit/sendReboot.py b/IOB-PI/vers2.5 8bit/sendReboot.py index 021c400..7ca636d 100644 --- a/IOB-PI/vers2.5 8bit/sendReboot.py +++ b/IOB-PI/vers2.5 8bit/sendReboot.py @@ -2,7 +2,7 @@ # -*- coding: utf-8 -*- # sendReboot v. 1.8 - +# - (2.5.2) Fix gestione eccezioni con report dettagliato #--------------------------------------------------------------- @@ -23,7 +23,7 @@ import time #--------------------------------------------------------------- # COSTANTI -PROGRAM_NAME = "SendReboot IOB-pi v.1.8" +SR_PROG_NAME = "SendReboot IOB-pi v.2.5.2" # DA FILE CONF idxMacchina = "99" @@ -39,44 +39,48 @@ numTry = 1 def chiamaUrl(numTry): - try: - urllib.urlopen ( url ) - numTry = numTry + 10 - except Exception, e: - print e - logging.info ( e ) - print "Url aforte" , url - return numTry + try: + urllib.urlopen ( url ) + numTry = numTry + 10 + + except Exception as e: + print("Errore in chiamaUrl") + print(str(e)) + logging.info ( str(e) ) + + print("Url chiamato: " , url) + return numTry #--------------------------------------------------------------- # Funzione di recupero mac address per poterlo inviare a MPIO #--------------------------------------------------------------- def getMAC(interface): - # Return the MAC address of interface - try: - str = open('/sys/class/net/' + interface + '/address').read() - except: - str = "00:00:00:00:00:00" - return str[0:17] + # Return the MAC address of interface + try: + str = open('/sys/class/net/' + interface + '/address').read() + except: + str = "00:00:00:00:00:00" + return str[0:17] #--------------------------------------------------------------- # MAIN #--------------------------------------------------------------- try: - config = ConfigParser.RawConfigParser() - config.read ( 'IOB.cfg' ) + config = ConfigParser.RawConfigParser() + config.read ( 'IOB.cfg' ) - idxMacchina = config.get ( 'id' , 'idxMacchina' ) + idxMacchina = config.get ( 'id' , 'idxMacchina' ) - URLREBO = config.get ( 'web' , 'URLREBO' ) + URLREBO = config.get ( 'web' , 'URLREBO' ) - LOGFILE = config.get ( 'log' , 'LOGREBO' ) -except: - print "\n\n" + PROGRAM_NAME + ' - Error 4 - in config file ' 'IOB.cfg' - sys.exit(1) + LOGFILE = config.get ( 'log' , 'LOGREBO' ) +except Exception as e: + print("\n\n" + SR_PROG_NAME + ' - Error 4 - in config file ' 'IOB.cfg') + print(str(e)) + sys.exit(1) #-------------------------------------------- @@ -84,26 +88,27 @@ except: #-------------------------------------------- try: # log = Logger(LOGFILE) - logging.basicConfig(level=logging.DEBUG, - format='%(asctime)s %(name)-8s %(levelname)-8s %(message)s', - datefmt='%Y-%m-%d %H:%M:%S', - filename=LOGFILE, - filemode='a') + logging.basicConfig(level=logging.DEBUG, + format='%(asctime)s %(name)-8s %(levelname)-8s %(message)s', + datefmt='%Y-%m-%d %H:%M:%S', + filename=LOGFILE, + filemode='a') -except: - # manda mail o simili - FARE!!! - print "LOG: Impossibile creare file log con nome " - print (LOGFILE) +except Exception as e: + # manda mail o simili - FARE!!! + print("LOG: Impossibile creare file log con nome ") + print(LOGFILE) + print(str(e)) #-------------------------------------------- -print "\n\n" + PROGRAM_NAME + "\n\n" +print("\n\n" + SR_PROG_NAME + "\n\n") global startstatus startstatus = 1 if startstatus == 1: - logging.info("Avvio Programma " + PROGRAM_NAME) + logging.info("Avvio Programma " + SR_PROG_NAME) # lettura file configurazione @@ -120,7 +125,7 @@ url = URLREBO + idxMacchina + "&mac=" + myMac # modifica: cerco se ho inviato segnale altrimenti ritento invio... while (numTry < 11): - logging.info("Tentativo invio URL: " + `numTry` ) + logging.info("Tentativo invio URL: $numTry" ) numTry = chiamaUrl(numTry) time.sleep(3) numTry = numTry + 1