comment comparer une valeur avec elle meme ?

Python est le langage de prédilection du Raspberry Pi

Modérateurs : Francois, Manfraid

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

comment comparer une valeur avec elle meme ?

Message par maccoa » dim. 12 nov. 2017 17:03

bonjour.
j'essaye de comparer une valeur avec elle même , pour détecter un changement d’état.

Code : Tout sélectionner

def csp4():
 state = p4.read_register(4001,0,04) # p4 state
 return state

while True:
 ts1 = 10 # temps entre 2 verif de l'etat
 ts2 = 5 # mini
 last_rec= {} # init dictionnaire
 last_rec["state"] = csp4() # ajoute def state  à la cle state du dico
 if csp4() != last_rec.get("state"): #si different
   print 'state change detect'
 if csp4() == 11:
    print (time.strftime("%H:%M:%S"),"csp4=", csp4(), "state=", last_rec.get("state"))
    time.sleep(ts1)
 else:
     time.sleep(ts2)
     print (time.strftime("%H:%M:%S"),"csp4=", csp4(), "state=", last_rec.get("state"))

en sortie on voit bien que se n'est pas ça :!:
('16:46:34', 'csp4=', 11, 'state=', 11)
('16:46:50', 'csp4=', 13, 'state=', 13)
je m'attendais plus à un truc du genre
('16:46:50', 'csp4=', 13, 'state=', 111)
auriez vous une idée ou piste à suivre ?
merci.

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

Re: comment comparer une valeur avec elle meme ?

Message par nexen » dim. 12 nov. 2017 17:48

tu vas trop vite dans ton code :)

si je lit en français ton code :
tant que vrai (boucle infinie)
ts1 = 10
ts2 =5
Init de mon tableau
j'enregiste mon etat dans mon tableau
je lit mon état (tout de suite après c'est à dire la microseconde suivante) et je la compare avec mon état d'avant
si (la valeur que je relis dans mon registre) = 11 alors j'affiche la valeur que je rerelis dans mon registre et je dors 10 secondes
sinon je dors 5 secondes et j'affiche la valeur que je rerelis dans mon registre ....

Donc :
On défini et initialise des valeurs en dehors de la boucle infini .... surtout pour ton dico car je pense que tu veux suivre tes états :)

ts1=10
ts2=5
Init de mon tableau
j'enregiste mon etat dans mon tableau (Init du tableau pour aider au premier passage de boucle)
tant que
Val_Registre = Cps4()
si Val_Registre != Mon dernier etat
Alors j'affiche
"Changement .... date val_registre , dernier etat
si Val_registre =11
je dors 10
sinon
je dors 5
j’enregistre mon Val_registre dans tableau
fin de boucle

PS : Quand une ligne est répétée dans un if et un else ... c'est qu'elle n'a pas besoins d'y être ... on la sort donc ;)

PS2 : mon code est pas du tout optmisé d'ailleur ;)


Nexen

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

Re: comment comparer une valeur avec elle meme ?

Message par maccoa » mer. 15 nov. 2017 14:12

merci pour cette aide précieuse :!:
le fait d’écrire ce que l'on veut faire en langage "compréhensible" (comme ta réponse) ma beaucoup aider.

donc maintenant j'envoie bien sur ma table juste les changement d’état de la chaudière.
avec la doc de minimalmodbus , il y'a des exemples pour créer un driver spécifique.

le *.py du driver à importer dans le script

Code : Tout sélectionner

#!/usr/bin/env python

import minimalmodbus

class Froling( minimalmodbus.Instrument ):
    def __init__(self, portname, slaveaddress):
        minimalmodbus.Instrument.__init__(self, portname, slaveaddress)

#System- and Boiler State
#Function: Read Input Registers (FC=04)
#Address Range: 34001-34002

    def p4_state(self):
        """34001 System state"""
        return self.read_register(4001,0,04)
    def system_state(self):
        """34001 System state"""
        return seflf.read_register(4000,0,04)

#Digital Outputs
#Function: Read Coil Status (FC=01)
#Address Range: 00001-00158"""
    def cir1(self):
        """Heating circuit pump 1"""
        return selfread_bit(0,1)
    def cir2(self):
        """Heating circuit pump 2"""
        return self.read_bit(1,1)
    def cir0(self):
        """Ecs circuit pump 0"""
        return self.read_bit(8,1)

#Actual Values
#Function: Read Input Registers(FC=04)
#Address Range: 30001-30272"""
    def Tp4(self):
        scale=2
        return self.read_register(0,0,04)/scale
    def Tfume(self):
        scale=1
        return self.read_register(1,0,04)/scale
    def o2r(self):
        scale=10
        return self.read_register(4,0,04)/scale
    def Tex(self):
        scale=2
        return self.read_float(4,04,2)/scale
    def fan_speed(self):
        scale=1
        return self.read_register(7,0,04)/scale
    def Tc1(self):
        scale=2
        return self.read_register(21,0,04)/scale
    def Cc1(self):
        scale=2
        return self.read_register(22,0,04)/scale
et le script

Code : Tout sélectionner

#!/usr/bin/env python

import froling
froling.CLOSE_PORT_AFTER_EACH_CALL = True
import serial
import time
import MySQLdb as mdb

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

def mdb_state():
  con = mdb.connect(host="localhost",user="chris",passwd="xxxx",db="froling");

  try:
    cur = con.cursor()
    cur.execute("""INSERT INTO samples(nom , valeur) VALUES(%s , %s)""", ('state_p4', p4.p4_state()))
    con.commit()

  finally:
    if con:
      con.close()

last_rec= {}
last_rec["state"] = p4.p4_state()
start = time.time()
mdb_state()

while p4.p4_state() != 5 :
    Val_Registre=p4.p4_state()
    if Val_Registre == last_rec.get("state"):
     end = time.time()
     print 'no state change since:', (end - start), 'last state:', last_rec.get("state")
     time.sleep(60)
    else:
        start = time.time()
        mdb_state()
        print time.strftime("%H:%M:%S"), 'state change de:', last_rec.get("state"), 'a:', p4.p4_state()
        last_rec["state"] = p4.p4_state()
        time.sleep(15)
un ptit aperçue dans la console
no state change since: 0.163349866867 last state: 19
no state change since: 60.2425758839 last state: 19
no state change since: 120.302088022 last state: 19
no state change since: 180.364240885 last state: 19
no state change since: 240.438768864 last state: 19
no state change since: 300.517911911 last state: 19
13:44:05 state change de: 19 a: 7
no state change since: 15.1373958588 last state: 7
no state change since: 75.2105090618 last state: 7
no state change since: 135.272527933 last state: 7
13:47:20 state change de: 7 a: 2
no state change since: 15.1364610195 last state: 2
13:48:35 state change de: 2 a: 8
no state change since: 15.0895550251 last state: 8
no state change since: 75.1751000881 last state: 8
no state change since: 135.237360001 last state: 8
no state change since: 195.30065012 last state: 8
13:52:51 state change de: 8 a: 9
no state change since: 15.1329770088 last state: 9
13:54:06 state change de: 9 a: 3
no state change since: 15.0914077759 last state: 3
no state change since: 75.1783699989 last state: 3
encore merci

Répondre

Retourner vers « Python »