Bonjour,
Je ne comprend pas la logique entre nb de données et enregistrement toutes les x minutes ... Tu auras toujours autant de lignes sauf si tu n'enregistre pas tout ....
(Je serais curieux de savoir ce que tu essaye de lire )
le $ doit vouloir dire ... début de trame ....
sinon tu lance toutes les 5 minutes dans ta crontab, tu lit et tu oublie toutes les trames at,t que tu n'a pas ton fameux '$ Pr�t 0019 1 zst'... dés que tu l'obtient tu enregistre ...
ce qui fait :
# On elimine ceux d'avant
do
lecture serial
split de x
while valeur != 'Pr�t' and index != '0019'
# On enregistre ceux d’après ...
do
lecture serial
split de x
enregistrement mysql
while valeur != 'Pr�t' and index != '0019'
et hop c'est fait
log data avec pyserial vers mysql
Modérateurs : Francois, Manfraid
Re: log data avec pyserial vers mysql
les données arrivent en continue , en boucle . si j'enregistre tout, tout le temps , ça va faire beaucoup. ou passer par une table temporaire pour avoir un historique sur 24h et ensuite exporte les données vers une autre "moins charger".Je ne comprend pas la logique entre nb de données et enregistrement toutes les x minutes ... Tu auras toujours autant de lignes sauf si tu n'enregistre pas tout ....
c'est la sortie com2 d'une chaudière à pellet froling P4 20kw .(Je serais curieux de savoir ce que tu essaye de lire )
ouile $ doit vouloir dire ... début de trame ....
suis pas sur que crontab soit la bonne solution pour le future de mon idee. suivant la valeur de index 1 , j'ai envie de changer le delais.inon tu lance toutes les 5 minutes dans ta crontab, tu lit et tu oublie toutes les trames at,t que tu n'a pas ton fameux '$ Pr�t 0019 1 zst'... dés que tu l'obtient tu enregistre
exemple :
index1= 0019 > log toutes les 6min
index1= 0001 , 0002 > log toutes les 5sec de certains index .
mais avant y'a bien autre chose à faire
en voulant répondre à ton bout de code , j'ai peut être percuter j'essaye avant !!
Re: log data avec pyserial vers mysql
Hello et merci de me confirmer que c'est du pellet
Quel est l’intérêt de log toutes les 5 secondes vu l'inertie de la chaudière .??
Un log par minute suffit largement ....(et encore tu flood ..)
Pense à mettre tout ça sur un SSD .... la carte ne supportera pas longtemps
et par pitié ... merci de faire une table avec (id auto increment ,timestamp auto) en Primary Key se sera plus rapide ....
Sinon si tu insiste .... tu pourrais faire avec un modulo sur un unix timestamp et tu change ton diviseur en fonction de ta fréquence d'enregistrement (Oups je t'ai peut être perdu ... )
Quel est l’intérêt de log toutes les 5 secondes vu l'inertie de la chaudière .??
Un log par minute suffit largement ....(et encore tu flood ..)
Pense à mettre tout ça sur un SSD .... la carte ne supportera pas longtemps
et par pitié ... merci de faire une table avec (id auto increment ,timestamp auto) en Primary Key se sera plus rapide ....
Sinon si tu insiste .... tu pourrais faire avec un modulo sur un unix timestamp et tu change ton diviseur en fonction de ta fréquence d'enregistrement (Oups je t'ai peut être perdu ... )
Re: log data avec pyserial vers mysql
juste par moment , lors de la phase d’allumage et juste sur certains index ( o2, t fumées) , c'est plus pour du fun que autre chose , puis ça apprend le langage surtout.Quel est l’intérêt de log toutes les 5 secondes vu l'inertie de la chaudière .??
c'est prévue en effet , j'ai deja flinguer une vielle sdPense à mettre tout ça sur un SSD .... la carte ne supportera pas longtemps
je comprend pas tout compris , mais sur un capteur pir , raccorder au gpio , et attendant de faire mieux :et par pitié ... merci de faire une table avec (id auto increment ,timestamp auto) en Primary Key se sera plus rapide ....
Code : Tout sélectionner
try:
cur = con.cursor()
cur.execute("""INSERT INTO conso(conso) VALUES(%s)""", ('1'))
con.commit()
Code : Tout sélectionner
# Nom Type Interclassement Attributs Null Valeur par défaut Commentaires Extra
1 timestamp timestamp Non CURRENT_TIMESTAMP
2 conso int(1) Non Aucune
une requette sur phpmyadmin
Code : Tout sélectionner
SELECT * FROM `conso` WHERE `timestamp` > '2017-11-05 00:00:00'
ok pas pratique j'avoue mais pour le moment je peut connaître la conso journalière
désoler moi pas encore causer chinois mais ça va venir.Sinon si tu insiste .... tu pourrais faire avec un modulo sur un unix timestamp et tu change ton diviseur en fonction de ta fréquence d'enregistrement (Oups je t'ai peut être perdu ... )
le but finale?
une station météo/jardin/arrosage/logdata P4 .
bonus pour voir l'arrivé des data https://youtu.be/FLjk8N0N2rw
edit:
comme je suis un peut bloquer sur la récupération d'une trame , j'ai tester d'autre choses.
Code : Tout sélectionner
#!/usr/bin/python
# -*- coding: utf-8 -*-
import serial
import MySQLdb as mdb
#import datetime
import time
ser = serial.Serial('/dev/ttyUSB0', 57600)
def storeFunction(channel):
con = mdb.connect(host="localhost",user="chris",passwd="1709",db="datalog");
try:
cur = con.cursor()
cur.execute("""INSERT INTO p4(valeur, id) VALUES(%s, s%)""", (valeur, index))
con.commit()
except mdb.Error, e:
logger.error(e)
finally:
if con:
con.close()
while True:
#time.sleep(2)
data_in = ser.readline().decode('latin-1') # latin-1 pour avoir les bon characteres
data_in = data_in.strip('\n\r')
data = data_in.split(";")
nom= data[0]
valeur= data[1]
index= data[2]
div= data[3]
unite= data[4]
print index,nom,valeur,div,unite
storeFunction(2)
ce probléme de "charactere" encodage ma peut être fait trouver une soluce.chris@rpi3:~/script $ sudo python dbserial.py
1 $ Prêt 0019 1 zst
Traceback (most recent call last):
File "dbserial.py", line 33, in <module>
storeFunction(2)
File "dbserial.py", line 13, in storeFunction
cur.execute("""INSERT INTO p4(valeur, id) VALUES(%s, s%)""", (valeur, index))
File "/usr/lib/python2.7/dist-packages/MySQLdb/cursors.py", line 210, in execute
query = query % args
ValueError: unsupported format character ')' (0x29) at index 40
Code : Tout sélectionner
while True:
rcv = ser.readline().encode('hex')
print (rcv)
donc avec un readline qui prend en compte "0d1a2420" comme fin de ligne j'aurais toutes la trame en prenant l'avant dernière reçue.0d1a2420
Re: log data avec pyserial vers mysql
comme je suis resté bloquer avec mon ser.readline() , j'ai essayer autre chose .
pour le moment j'ai bien un log toutes les 5min quand la chaudiere ne fait rien . plus qu'à voir si au changement de state elle fera un log toutes les 5sec.
Code : Tout sélectionner
def storeFunction(channel):
con = mdb.connect(host="localhost",user="chris",passwd="xxxx",db="datalog");
try:
cur = con.cursor()
cur.execute("""INSERT INTO p4(valeur, id) VALUES(%s, %s)""", (int(valeur), int(index)))
con.commit()
except mdb.Error, e:
logger.error(e)
finally:
if con:
con.close()
while True:
data_in = ser.readline().decode('latin-1')
data_in = data_in.strip('\n\r')
data = data_in.split(";")
nom= data[0]
valeur= data[1]
index= data[2]
div= data[3]
unite= data[4]
if int(index) == 1 and int(valeur) == 19:
print ("prêt")
storeFunction(2)
time.sleep(300)
elif int(index) == 1 and int(valeur) == 2:
print ("pre_chauffage")
storeFunction(2)
time.sleep(5)