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
Lettura S0 - script python
Re: Lettura S0 - script python
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.
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.
Re: Lettura S0 - script python
@ 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.
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.
Re: Lettura S0 - script python
Riposto lo script countS0.py ultima versione :
questa è la copia del mio che sta funzionando senza problemi.
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.
Re: Lettura S0 - script python
Ma il file meternxx.txt che proprietario deve avere?
Re: Lettura S0 - script python
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
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.
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
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.
Re: Lettura S0 - script python
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".
Re: Lettura S0 - script python
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.
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.
Re: Lettura S0 - script python
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 :
lo script initcounter.sh è il seguente:
infine il codice di countS0.py :
quanto sopra presuppone che ci siano i symlink:
1)
ritorni:
lrwxrwxrwx 1 root root 8 set 30 19:50 /run/shm -> /dev/shm
2)
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.
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 3 ospiti