Lettura S0 - script python

Discussioni relative all'uso di contatori ad impulsi S0
Avatar utente
Flane
Messaggi: 2460
Iscritto il: 16/01/2016, 15:02

Re: Lettura S0 - script python

Messaggioda Flane » 27/09/2018, 12:03

Ottimo max, ma che succede se riavvii il raspberrypi visto che lo script non riprende l'ultimo valore salvato dell'energia?

Inviato dal mio FEVER utilizzando Tapatalk


Avatar utente
maxsemp
Messaggi: 85
Iscritto il: 13/04/2018, 11:44

Re: Lettura S0 - script python

Messaggioda maxsemp » 28/09/2018, 8:37

Ciao Flane.
Effettivamente al riavvio del raspy, la potenza viene ancora rilevata, ma l'energia non viene calcolata.
Secondo te si può rimediare?

Immagine

Avatar utente
fuzero
Messaggi: 39
Iscritto il: 27/04/2017, 22:00

Re: Lettura S0 - script python

Messaggioda fuzero » 30/09/2018, 19:57

Grande max !!
mi congratulo con te, il nome del file che scrive è inserito nelle prime righe del file, se vuoi puoi cambiarlo li.

@flane: il valore ultimo lo leggo dal file quando parte lo script e lo assegna a counter.

Avatar utente
Flane
Messaggi: 2460
Iscritto il: 16/01/2016, 15:02

Re: Lettura S0 - script python

Messaggioda Flane » 30/09/2018, 21:06

@ fuzero
scusa ma lo script postato non legge valori dal file csv.
Di quale script parli?

Forse è meglio che postiate lo script completo e funzionante per essere chiari con altri utenti che vogliono utilizzarlo.

Avatar utente
fuzero
Messaggi: 39
Iscritto il: 27/04/2017, 22:00

Re: Lettura S0 - script python

Messaggioda fuzero » 30/09/2018, 21:19

Riposto lo script countS0.py ultima versione :

Codice: Seleziona tutto

#!/usr/bin/python

pin_gpio = 4
metern_id = 2
file = '/run/shm/metern'+str(metern_id)+'.txt'
import time
import RPi.GPIO as GPIO
GPIO.setmode(GPIO.BCM)
GPIO.setup(pin_gpio, GPIO.IN, pull_up_down = GPIO.PUD_DOWN)

counter = 0
fold = open('/run/shm/consumi2.txt','r')
dato = fold.read()
c1 = dato.find('(') + 1
c2 = dato.find('*')
counter = int(dato[c1:c2])
tpulse0 =0
while True:
    GPIO.wait_for_edge(pin_gpio, GPIO.RISING)
    tpulse1 = time.time()
    deltat = tpulse1 - tpulse0
    counter += 1
#    print str(metern_id) + '(' + str(counter) + '*Wh)'
#    print "diff T ",deltat
#    print "power is ",3600/deltat
#    print str(metern_id) + '(' + str(int(round(3600/deltat))) +'*W)'
    energy = str(metern_id) + '(' + str(counter) + '*Wh)\n'
    power = str(metern_id) + '(' + str(int(round(3600/deltat))) +'*W)\n'
    fp = open(file,'w')
# agg. 25/06/17 prima energy e poi power
#
    fp.write(energy)
    fp.write(power)
    fp.close()
    tpulse0 = tpulse1
    GPIO.wait_for_edge(pin_gpio, GPIO.FALLING)

GPIO.cleanup()


questa è la copia del mio che sta funzionando senza problemi. :D :D

Avatar utente
maxsemp
Messaggi: 85
Iscritto il: 13/04/2018, 11:44

Re: Lettura S0 - script python

Messaggioda maxsemp » 30/09/2018, 21:31

Ma il file meternxx.txt che proprietario deve avere?

Avatar utente
Flane
Messaggi: 2460
Iscritto il: 16/01/2016, 15:02

Re: Lettura S0 - script python

Messaggioda Flane » 30/09/2018, 21:38

essendo uno script in Python ed essendo quindi importantissima l'indentatura, per non perdere la formattazione e per fare in modo che utenti poco pratici caschino in questi semplici errori di sintassi, quando postate del codice usante SEMPRE IL TAG CODICE :!:
Questa volta l'ho messo io.

In questa versione dello script vedo che prelevi l'ultima lettura dell'energia dal file consumi2.txt (fra l'altro adesso la cartella dei file temporanei è /dev/shm e non più /run/shm anche se funziona lo stesso per via di un symlink)

Questo file viene creato da poolerconsumi ogni 5 minuti, ma che succede se all'avvio del raspberry lo script countS0.py parte prima di poolerconsumi ? :?:

Si dovrebbe aggiungere un controllo che se non esiste il file consumi2.txt va a prendere il dato dall'ultimo valore scritto nel csv, oppure soluzione migliore sarebbe quella di prelevare sempre la lettura direttamente dal csv e non da file scritti da altri script che magari qualcuno potrebbe anche non utilizzare :idea:

Lo script sicuramente funziona ma è un pò "acerbo" e manca di una serie di controlli che sono indispensabili per garantire un funzionamento regolare in tute le condizioni.

Avatar utente
maxsemp
Messaggi: 85
Iscritto il: 13/04/2018, 11:44

Re: Lettura S0 - script python

Messaggioda maxsemp » 01/10/2018, 17:32

Flane ha scritto:...
Questo file viene creato da poolerconsumi ogni 5 minuti, ma che succede se all'avvio del raspberry lo script countS0.py parte prima di poolerconsumi ?
...


succede che lo script countS0.py non parte più. Almeno a me succede questo.
Tra l'altro non capisco perché il file txt da lui creato (nel mio caso pulse.txt) ha come proprietario "root".

Immagine

Avatar utente
Flane
Messaggi: 2460
Iscritto il: 16/01/2016, 15:02

Re: Lettura S0 - script python

Messaggioda Flane » 01/10/2018, 18:41

se lo avvi come servizio ovviamente il proprietario sarà root.
Se lo avvi da MeterN con config_daemon.php il proprietario sarà www-data

Comunque il proprietario non inficia il funzionamento perchè eventuali altri utenti devono solo leggerlo il file e non scriverlo.

Avatar utente
fuzero
Messaggi: 39
Iscritto il: 27/04/2017, 22:00

Re: Lettura S0 - script python

Messaggioda fuzero » 01/10/2018, 22:49

Riassumendo io ho risolto in questo modo:
all'avvio preparo i dati per evitare i problemi sollevati da flane.
questo è il file /etc/rc.local :

Codice: Seleziona tutto

#!/bin/sh -e
#
# rc.local
#
# This script is executed at the end of each multiuser runlevel.
# Make sure that the script will "exit 0" on success or any other
# value on error.
#
# In order to enable or disable this script just change the execution
# bits.
#
# By default this script does nothing.

# Print the IP address
_IP=$(hostname -I) || true
if [ "$_IP" ]; then
  printf "My IP address is %s\n" "$_IP"
fi
stty -F /dev/ttyUSB0 19200 # imposta la velocita della seriale a 19200
#sudo java -cp /opt/pi4j/lib/pi4j-core.jar:/var/www/comapps/bin/:. pv.PoolServer -g 7 -pv 1 &
echo "set contatore"
/var/www/comapps/initcounter.sh
sudo sleep 2
echo "avvio countS0"
/usr/bin/python /usr/bin/countS0.py &
sudo sleep 4
poolerconsumi 2 energy
poolerconsumi 2 power
#sudo /usr/bin/curl http://localhost/metern/scripts/bootmn.php &
exit 0



lo script initcounter.sh è il seguente:

Codice: Seleziona tutto

#!/bin/bash
#
FILEOUTPUT=/run/shm/consumi2.txt
LASTFIL=`ls /var/www/metern/data/csv/ | tail -1`
LASTROW=`cat /var/www/metern/data/csv/$LASTFIL | tail -1`
#echo $LASTROW
CP2=`echo $LASTROW | cut -d, -f3 | cut -d, -f1`
echo '2('$CP2'*Wh)' > /run/shm/consumi2.txt



infine il codice di countS0.py :

Codice: Seleziona tutto

#!/usr/bin/python

pin_gpio = 4
metern_id = 2
file = '/run/shm/metern'+str(metern_id)+'.txt'
import time
import RPi.GPIO as GPIO
GPIO.setmode(GPIO.BCM)
GPIO.setup(pin_gpio, GPIO.IN, pull_up_down = GPIO.PUD_DOWN)

counter = 0
fold = open('/run/shm/consumi2.txt','r')
dato = fold.read()
c1 = dato.find('(') + 1
c2 = dato.find('*')
counter = int(dato[c1:c2])
tpulse0 =0
while True:
    GPIO.wait_for_edge(pin_gpio, GPIO.RISING)
    tpulse1 = time.time()
    deltat = tpulse1 - tpulse0
    counter += 1
#    print str(metern_id) + '(' + str(counter) + '*Wh)'
#    print "diff T ",deltat
#    print "power is ",3600/deltat
#    print str(metern_id) + '(' + str(int(round(3600/deltat))) +'*W)'
    energy = str(metern_id) + '(' + str(counter) + '*Wh)\n'
    power = str(metern_id) + '(' + str(int(round(3600/deltat))) +'*W)\n'
    fp = open(file,'w')
# agg. 25/06/17 prima energy e poi power
#
    fp.write(energy)
    fp.write(power)
    fp.close()
    tpulse0 = tpulse1
    GPIO.wait_for_edge(pin_gpio, GPIO.FALLING)

GPIO.cleanup()


quanto sopra presuppone che ci siano i symlink:
1)

Codice: Seleziona tutto

 ls -l /run/shm

ritorni:
lrwxrwxrwx 1 root root 8 set 30 19:50 /run/shm -> /dev/shm

2)

Codice: Seleziona tutto

 ls -l /usr/bin/countS0.py

ritorni:
lrwxrwxrwx 1 root root 27 apr 27 2017 /usr/bin/countS0.py -> /var/www/comapps/countS0.py

So di non aver inserito molti commenti e spiegazioni, appena ho tempo li aggiorno per renderli più chiari per tutti.
Nel frattempo spero di aver dato un aiuto a chi cerca soluzioni con i lettori di impulsi.
;) ;)


Torna a “Contatori ad impulsi”

Chi c’è in linea

Visitano il forum: Nessuno e 5 ospiti