log data avec pyserial vers mysql

Python est le langage de prédilection du Raspberry Pi

Modérateurs : Francois, Manfraid

nexen
Raspinaute
Messages : 175
Enregistré le : lun. 29 sept. 2014 13:58

Re: log data avec pyserial vers mysql

Message par nexen » sam. 4 nov. 2017 21:33

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 :)

maccoa
Messages : 40
Enregistré le : lun. 11 sept. 2017 17:19

Re: log data avec pyserial vers mysql

Message par maccoa » dim. 5 nov. 2017 08:19

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 ....
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 serais curieux de savoir ce que tu essaye de lire )
c'est la sortie com2 d'une chaudière à pellet froling P4 20kw .
le $ doit vouloir dire ... début de trame ....
oui
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
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.
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 :mrgreen: j'essaye avant !!

nexen
Raspinaute
Messages : 175
Enregistré le : lun. 29 sept. 2014 13:58

Re: log data avec pyserial vers mysql

Message par nexen » dim. 5 nov. 2017 08:47

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 ... ;) )

maccoa
Messages : 40
Enregistré le : lun. 11 sept. 2017 17:19

Re: log data avec pyserial vers mysql

Message par maccoa » dim. 5 nov. 2017 11:22

Quel est l’intérêt de log toutes les 5 secondes vu l'inertie de la chaudière .??
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.
Pense à mettre tout ça sur un SSD .... la carte ne supportera pas longtemps :)
c'est prévue en effet , j'ai deja flinguer une vielle sd
et par pitié ... merci de faire une table avec (id auto increment ,timestamp auto) en Primary Key :) se sera plus rapide ....
je comprend pas tout compris , mais sur un capteur pir , raccorder au gpio , et attendant de faire mieux :

Code : Tout sélectionner

try:
    cur = con.cursor()
    cur.execute("""INSERT INTO conso(conso) VALUES(%s)""", ('1'))
    con.commit()
et la table

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 		
ça me dit qu'il à fait un tour à telle heure . 1 tour = 0.024 kg
une requette sur phpmyadmin

Code : Tout sélectionner

SELECT * FROM `conso` WHERE `timestamp` > '2017-11-05 00:00:00' 
reponse 186 lignes donc 186*0.024 ~ 4.6kg
ok pas pratique j'avoue mais pour le moment je peut connaître la conso journalière :mrgreen:
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 ... ;) )
désoler moi pas encore causer chinois :lol: :lol: :lol: mais ça va venir.

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. :geek:

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)
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
ce probléme de "charactere" encodage ma peut être fait trouver une soluce.

Code : Tout sélectionner

while True:
        rcv = ser.readline().encode('hex')
        print (rcv)
et le debut d'une trame . parce que contrairement à se que je pensais il n'y a pas de fin de trame
0d1a2420
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.

maccoa
Messages : 40
Enregistré le : lun. 11 sept. 2017 17:19

Re: log data avec pyserial vers mysql

Message par maccoa » mer. 8 nov. 2017 12:16

comme je suis resté bloquer avec mon ser.readline() , j'ai essayer autre chose .

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)
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.

Répondre

Retourner vers « Python »