list, dictionnaire , fonction et d'autre questions.

Python est le langage de prédilection du Raspberry Pi

Modérateurs : Francois, Manfraid

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

list, dictionnaire , fonction et d'autre questions.

Messagepar maccoa » sam. 18 nov. 2017 13:26

bonjour.

cela fait quelques semaines que je découvre python , et j'aurais quelques questions:

1° je suis sous python 2.7 , faut il passer sous python 3 ? j'aurais tendance à dire oui mais...(je n'ai qu'un script de fait pour le moment donc pas trop dure à réécrire au besoin)

2° pour les fonction ; def():
au début j'utilisais

Code : Tout sélectionner

def a04(self):
        scale=2
        return self.read_register(0,0,4)/scale

se qui me renvoie la valeur demander en modbus , puis aux grés de mes lectures et essais j'aimerais que cette fonction me renvoie son nom en plus d'ou :

Code : Tout sélectionner

def a44(self):
        d = dict();
        d['name']="Tex"
        d['v'] = self.read_register(4,0,4)/2
        return d

se qui me renvoie sous forme de dictionnaire , le nom et la valeur. j'ai aussi essayer sous forme de list.
bon la je sent que ça va etre compliquer à expliquer :lol:

-au demarage , je demande les valeurs que je veux. pour avoir une reference pour comparer plus tard.
ce code va bien tant que ma fonction envoie juste sa valeur ,

Code : Tout sélectionner

try:
    last_rec= {}
    last_rec["a40004"] = p4.a40004()#sys_state
    last_rec["a40014"] = p4.a40014()#p4_state
    last_rec["a44"] = p4.a44()#Tex
    last_rec["a04"] = p4.a04()#P4 T
    last_rec["a14"] = p4.a14()#Flue gas temperature
    last_rec["a34"] = p4.a34()#Residual oxygen content
except IOError:
    print("Failed to read from instrument")

et pour comparer j'utilise

Code : Tout sélectionner

while True:
    Val_40004=p4.40004()
    while Val_40004 != last_rec.get("40004"):
       print time.strftime("%H:%M:%S"), 'state change de:', last_rec.get("40004"), 'a:', p4.40004()
       last_rec["state"] = p4.40004()

tout aller bien jusqu'a se que je descide d'envoyer avec ma fonction nom+valeur.

vous me direz avec raison :roll: "mais pkoi tu veux que ta fonction renvoie nom+valeur puisque tu connais déja son nom comme ta demander sa valeur!!! "
ben.... j'ai envie déjà rien que pour apprendre :idea: et surtout au lieu d'avoir dans mon script pour chaque valeur que je voudrais logger ->

Code : Tout sélectionner

 while True:
        Val_a40004=p4.a40004()
        while Val_a40004 != last_rec.get("a40004"):#sys state
            con = mdb.connect(host="localhost",user="chris",passwd="1709",db="froling");
            try:
                cur = con.cursor()
                cur.execute("""INSERT INTO samples(nom , valeur) VALUES(%s , %s)""", ('sys_state', p4.a40004()))
                con.commit()
            finally:
                if con:
                    con.close()
            last_rec["a40004"] = p4.a40004()

je me dis que un truc du style :
def mysql():
con = mdb.connect(host="localhost",user="chris",passwd="1709",db="froling");
try:
cur = con.cursor()
cur.execute("""INSERT INTO nom renvoyer par la fonction( valeur) VALUES(%s)""", (valeur renoyer par la fonction)
con.commit()
finally:
if con:
con.close()

et dans le code ça donnerait quelque chose comme

Val_a40004=p4.a40004()
while Val_a40004 != last_rec.get("a40004"):#sys state
mysql()
last_rec["a40004"] = p4.a40004()



mouwais là je sent que ça devient flou la haut :oops:
en gros comment lire une valeur renvoyer par une fonction qui est dans une list ou dico , qui lui méme et dans un dico :shock:
1 je lance le script
2 je lis les valeur et leur nom que je mets dans un dico avant le while (faut bien une valeur de départ pour comparer)
3 while true (le loop ou y a tout les loops de comparaison)
4 je demande la valeur actuelle
5 le loop de comparaison de la valeur actuelle et celle du point 2
6 comme les valeur sont != on envoie ça chez mysql avec comme table le nom renvoyer par ma fonction et ça valeur
7 on remet la new valeur dans l'ancien valeur à comparer
8 on passe au loop suivant.

bon je ne sais pas si j'ai été super claire dans mes explications :?
bien sure dans la base chaque valeur à logger devra avoir sa table avec timestamp et valeur et nom plus une table "sample" avec timestamp,nom,valeur ou on envoie toutes les valeur à logger. à moin que vous me disiez non fait une seul table pour toutes les valeurs logger.

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

Re: list, dictionnaire , fonction et d'autre questions.

Messagepar maccoa » sam. 18 nov. 2017 16:08

après une pose pâtisserie

Code : Tout sélectionner

#dictionnaire creation et remplissage des valeurs pour comparaison dans les loops while et aide au premier loop
try:
    d= {}
    d["a44"] =p4.a44b()# reponse = ['nom', val]

except IOError:
    print("Failed to read from instrument")

#start loop
try:
    while True:
        x=p4.a44b()
        v=x[1]
        n=x[0]
        while v != d.get("a44"):# on compare les 2 valeurs
            print time.strftime("%H:%M:%S"), 'state change de:', d.get("a44"), 'a:', v
            d["a44"] = v# on remet la valeur actuelle
        print n, ":", v
        time.sleep(10)
except IOError:
    print("Failed to read from instrument")

et la sortie
chris@rpi3:~/script $ sudo python mosbus1.py
15:03:45 state change de: ['tex', 9] a: 9
tex : 9
tex : 9
tex : 9

il y a juste au démarage du script que ça "cloche" mais vais bien finir par trouver :lol:
edit : trouvé!!! :lol:

Code : Tout sélectionner

#Actual Values :Function: Read Input Registers(FC=04)
    def a04(self):
        str = "Tp4"
        v= self.read_register(0,0,4)/2
        return [str, v];

    def a44b(self):
        str = "tex"
        v = self.read_register(4,0,4)/2
        return [str, v];

et

Code : Tout sélectionner

#!/usr/bin/env python
#import module
import froling
froling.CLOSE_PORT_AFTER_EACH_CALL = True
import serial
import time
import MySQLdb as mdb

#serial settings
p4 = froling.Froling('/dev/ttyUSB0', 1)
p4.debug = False
p4.serial.baudrate = 57600
p4.serial.bytesize = 8
p4.serial.parity = serial.PARITY_NONE
p4.serial.stopbits = 1
p4.serial.timeout = 0.5

#dictionnaire creation et remplissage des valeurs pour comparaison dans les loops while et aide au premier loop
try:
    d= {}
    d["a44"] =p4.a44b()# reponse = ['nom', val]
    d["a04"] = p4.a04()
except IOError:
    print("Failed to read from instrument")

#start loop
try:
    while True:
        x=p4.a44b()
        v=x[1]
        n=x[0]
        while x != d.get("a44"):# on compare les 2 valeurs
            print time.strftime("%H:%M:%S"), 'state change de:', d.get("a44"), 'a:', v
            d["a44"] = x# on remet le dico avec la valeur actuelle ['nom', val]
           
        x=p4.a04()
        v=x[1]
        n=x[0]
        while x != d.get("a04"):
            print time.strftime("%H:%M:%S"), 'state change de:', d.get("a04"), 'a:', v
            d["a04"] = x
        print d.get("a04")
        time.sleep(15)
except IOError:
    print("Failed to read from instrument")


Retourner vers « Python »

Qui est en ligne

Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 1 invité