log data avec pyserial vers mysql

Python est le langage de prédilection du Raspberry Pi

Modérateurs : Francois, Manfraid

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

log data avec pyserial vers mysql

Message par maccoa » mer. 1 nov. 2017 18:41

bonjour.

j'essaye de logger les données qui arrivent sur un port rs232 . dans un terminale si tape :

Code : Tout sélectionner

sudo stty -F /dev/ttyUSB0 sane
sudo stty -F /dev/ttyUSB0 57600 cs8 -parenb -cstopb -hupcl -echo
sudo cat /dev/ttyUSB0 57600,cs8,-parenb,-cstopb,-hupcl,-echo
j'obtient
$ Feuer Aus;0005;1;1;zst;
Kesseltemp.;0139;2;2;�C;
Abgastemp.;0064;3;1;�C;
Abgastemp S;0196;11;1;�C;
Kesselstrg ;0100;4;1;%;
Prim�rluft ;0100;5;1;%;
Rest O2 ist;0040;6;10;%;
O2 Regler ;0100;7;1;%;
Sekund�rluft;0000;8;1;%;
Saugzug Soll;0000;9;1;%;
Saugzug Ist;0000;10;1;U;
Einschub Ist;0000;12;1;%;
O2 Regler Pell ;0100;13;1;
la fin d'une trame se termine par "\r\n"

avec un uno j'avais réussi à logger les données dans un fichier .csv , mais avec pyserial ... je n'arrive à rien !

auriez vous quelques conseils ou tutos sur le sujet?
merci.

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

Re: log data avec pyserial vers mysql

Message par nexen » jeu. 2 nov. 2017 11:38

hello,

Réponse rapide car je n'utilise pas pyserial mais si je regarde les divers exemples :

Code : Tout sélectionner

import serial
ser = serial.Serial('/dev/ttyUSB0', 9600)
x = ser.readline()
 
print "x=", x
 
ser.close()
affiche la trame, Pour le reste c'est une 'simple' insertion dans une base mysql...

Code : Tout sélectionner

import MySQLdb as my
 
db = my.connect(host="127.0.0.1",
user="root",
passwd="",
db="world"
)
 
cursor = db.cursor()
 
name = "Some new city"
country_code = 'PSE'
district = 'Someyork'
population = 10008
 
sql = "insert into city VALUES(null, '%s', '%s', '%s', %d)" % \
 (name, country_code , district, population)
 
number_of_rows = cursor.execute(sql)
db.commit()
 
db.close()
J'avoue ne pas comprendre la question (elle est assez vague ..)

Nexen

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

Re: log data avec pyserial vers mysql

Message par maccoa » jeu. 2 nov. 2017 21:31

en fait , je ne comprend pas trop comment récupérer les infos.
la trame commence par SUB$ et se termine par \r\n
je voudrais être sur d'avoir la trame complète , on commence à lire au $ et on fini au \r\n ou on attend un \r\n pour commencer à lire.

dans la chaine reçue ,
nom;valeur;index;diviseur;unité
comment connaître l'index et la valeur de chaque ligne ?
dans ma petite tête , je me dis que se n'est plus avec serial mais une autre fonction qui fait se type de chose , io.text ??
merci

mike913
Raspinaute
Messages : 246
Enregistré le : mar. 7 oct. 2014 09:46
Localisation : Morsang / Orge - Essonne
Contact :

Re: log data avec pyserial vers mysql

Message par mike913 » ven. 3 nov. 2017 09:09

Bonjour

déjà pour commencer, fait ce que t'as dit nexen:
exécute le code suivant:

Code : Tout sélectionner

#!/usr/bin/env python
# coding=UTF-8
# ---------------------------------------
import serial
ser = serial.Serial('/dev/ttyUSB0', 9600)
while 1:
	x = ser.readline()
	print "x=", x
et dis nous ce qui s' affiche.
DS712+ 2x Western Digital WD10EADS-00L 1000 GB (SHR) - Firmware: DSM 6.1.6-15266
Raspberry - RFXTRX433 - Aeon Labs ZStick V2 - Domoticz
FreeBox v6
https://meteo.folcke.net
https://wiki.folcke.net

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

Re: log data avec pyserial vers mysql

Message par nexen » ven. 3 nov. 2017 15:04

dans la chaine reçue ,
nom;valeur;index;diviseur;unité
comment connaître l'index et la valeur de chaque ligne ?
dans ma petite tête , je me dis que se n'est plus avec serial mais une autre fonction qui fait se type de chose , io.text ??

avec un split ....

Code : Tout sélectionner

x = ‘blue,red,green’
x.split(“,”)
 
[‘blue’, ‘red’, ‘green’]
ce qui donnerais pour toi :

Code : Tout sélectionner

import serial
ser = serial.Serial('/dev/ttyUSB0', 9600)
x = ser.readline()
 
print "x=", x
x.split(';')
['Kesseltemp.','0139','2','2','�C']
ser.close()
Enfin je pense .... c'est de tête que j'écris ça ...

nexen

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

Re: log data avec pyserial vers mysql

Message par maccoa » sam. 4 nov. 2017 15:31

merci pour vos réponses ! surtout la fonction split.

Code : Tout sélectionner

#!/usr/bin/python
# -*- coding: utf-8 -*-
import serial

ser = serial.Serial('/dev/ttyUSB0', 57600)

while True:
    data_in = ser.readline()
    data_in = data_in.strip('\r\n')
    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
résulta
1 $ Pr�t 0019 1 zst
2 Kesseltemp. 0058 2 �C
3 Abgastemp. 0031 1 �C
11 Abgastemp S 0041 1 �C
4 Kesselstrg 0049 1 %
5 Prim�rluft 0000 1 %
6 Rest O2 ist 0000 10 %
7 O2 Regler 0100 1 %
8 Sekund�rluft 0000 1 %
9 Saugzug Soll 0000 1 %
10 Saugzug Ist 0000 1 U
12 Einschub Ist 0000 1 %
13 O2 Regler Pell 0030 1 %
14 F�llstand: 20700 207 %
15 Ansauggeschw. 0454 100 m/s
16 Strom Austrags 0659 1000 A
17 F�hler 1 0068 2 �C
18 Kesselsoll 0084 2 �C
20 Pufferoben 0000 2 �C
21 Pufferunten 0000 2 �C
22 Pufferpumpe 8192 1 %
23 Boiler 1 0122 2 �C
24 Vorlauf 1 0035 2 �C
25 Vorlauf 2 0034 2 �C
26 HK Pumpe 1 0000 1
27 HK Pumpe 2 0000 1
28 Aussentemp 0028 2 �C
29 Kollektortemp 0000 2 �C
30 Betriebsstunden 16641 1 h
99 Fehler Kein Fehler 1
maintenant que ça c'est ok j'ai d'autres questions.

les données arrivent en boucle , et je ne voudrais pas logger toutes les données sinon je vais me retrouver avec des milliers de ligne en peut de temps.
j aimerais attendre
$ Pr�t 0019 1 zst
pour commencer le traitement et toutes les xxmin.
je continue mes recherches.

mike913
Raspinaute
Messages : 246
Enregistré le : mar. 7 oct. 2014 09:46
Localisation : Morsang / Orge - Essonne
Contact :

Re: log data avec pyserial vers mysql

Message par mike913 » sam. 4 nov. 2017 18:12

Bonjour

Pour un traitement toutes les 5 minutes:

Code : Tout sélectionner

#!/usr/bin/python
# -*- coding: utf-8 -*-

import serial
import datetime
import time

ser = serial.Serial('/dev/ttyUSB0', 57600)

while True:
	data_in = ser.readline()
	minute = eval(time.strftime('%-M'))
	if minute in [0,5,10,15 ---- ]:
		ici ton traitement
tu as aussi la possibilité d'utiliser crontab en supprimant le while true dans ton script
DS712+ 2x Western Digital WD10EADS-00L 1000 GB (SHR) - Firmware: DSM 6.1.6-15266
Raspberry - RFXTRX433 - Aeon Labs ZStick V2 - Domoticz
FreeBox v6
https://meteo.folcke.net
https://wiki.folcke.net

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

Re: log data avec pyserial vers mysql

Message par maccoa » sam. 4 nov. 2017 20:03

je viens de tester ton code
hris@rpi3:~/script $ sudo python pyserial.py
File "pyserial.py", line 11
if minute in [0,5,10,15 ---- ]:
^
SyntaxError: invalid syntax
alors j'ai essayer

Code : Tout sélectionner

time.sleep(10)
du coup j'ai une ligne toutes les 10 sec .
pour l'instant mon plus gros soucis , c'est d'etre sur d'avoir la trame complète avant de lancer le traitement.

comme je comprenais pas trop le $ au départ , j'ai voulue voir à quoi ça ressembler en hexa
chris@rpi3:~/script $ sudo stty -F /dev/ttyUSB0 sane
chris@rpi3:~/script $ sudo stty -F /dev/ttyUSB0 57600 cs8 -parenb -cstopb -hupcl -echo
chris@rpi3:~/script $ sudo cat /dev/ttyUSB0 57600,cs8,-parenb,-cstopb,-hupcl,-echo | xxd -p
46fc686c657220313b303137363b31373b323bb0433b0a0a4b657373656c
736f6c6c203b303038343b31383b323bb0433b0a0a5075666665726f6265
6e203b303030303b32303b323bb0433b0a0a507566666572756e74656e20
3b303030303b32313b323bb0433b0a0a50756666657270756d7065203b38
3139323b32323b313b253b0a0a426f696c657220313b303131373b32333b
323bb0433b0a0a566f726c61756620313b303037303b32343b323bb0433b
0a0a566f726c61756620323b303037313b32353b323bb0433b0a0a484b20
50756d706520313b303030313b32363b313b203b0a0a484b2050756d7065
20323b303030313b32373b313b203b0a0a41757373656e74656d703b3030
32343b32383b323bb0433b0a0a4b6f6c6c656b746f7274656d703b303030
303b32393b323bb0433b0a0a42657472696562737374756e64656e3b3136

mike913
Raspinaute
Messages : 246
Enregistré le : mar. 7 oct. 2014 09:46
Localisation : Morsang / Orge - Essonne
Contact :

Re: log data avec pyserial vers mysql

Message par mike913 » sam. 4 nov. 2017 20:18

mon code fonctionne chez moi.

if minute in [0,5,10,15 ---- ]:

les points de suspension sont a remplacer par des chiffres
if minute in [0,5,10,15,20,25,30]:
DS712+ 2x Western Digital WD10EADS-00L 1000 GB (SHR) - Firmware: DSM 6.1.6-15266
Raspberry - RFXTRX433 - Aeon Labs ZStick V2 - Domoticz
FreeBox v6
https://meteo.folcke.net
https://wiki.folcke.net

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

Re: log data avec pyserial vers mysql

Message par maccoa » sam. 4 nov. 2017 20:58

je viens de retester , pas d'erreur mais aucune données.

Répondre

Retourner vers « Python »