IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Python Discussion :

Enregistrer des données Compteurs avec pyModbusTCP dans MySQL


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Dessinateur industriel
    Inscrit en
    Février 2021
    Messages
    90
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Dessinateur industriel
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2021
    Messages : 90
    Par défaut Enregistrer des données Compteurs avec pyModbusTCP dans MySQL
    Bonjour,
    Je fait un applicatif de suivi de consommations de compteurs d'eau qui va tourner sur un serveur local Linux (RPI ou équivalent).
    J'ai découvert le PHP et réalisé l'interface utilisateur et jusqu'à maintenant j'ai simulé des index compteurs manuellement dans MySQL. J'aimerai donc passer à la partie la plus importante : Communiquer avec le matériel (compteurs) et récupérer leurs valeurs d' "index".
    Ces index compteurs sont dans un automate programmable qui est client Modbus TCP et me permet de lire les valeurs (Ce que je fait sans soucis depuis mon PC avec ModbusDoctor)

    La fréquence "d'acquisition" est définie par l'utilisateur 15, 30, 45 min et stockée dans une table MySQL.
    L'adresse IP, le port de l'automate et le registre Modbus du compteur 1 sont eux aussi défini par l'utilisateur et stockés dans une table.
    Il y a même plusieurs compteurs, donc à chaque fois IP, Port, Registre... Chaque compteur à un ID unique

    Pour la partie communication, j'ai trouvé la librairie pyModbus :
    Exemple lecture de registres : https://pymodbustcp.readthedocs.io/e..._register.html
    Exemple Tache cyclique : https://pymodbustcp.readthedocs.io/e..._schedule.html
    Et un dernier adapté à mon besoin mais fait pour une application de domotique : https://github.com/DomoticX/domoticz-modbus
    mais je n'ai aucune idée de comment adapter ces exemples à mon projet :

    1. 1) Lire la "fréquence d'acquisition" dans la base de données.
    2. 2) Se connecter aux équipements et récupérer les index dans les bons registres
    3. 3) Insérer les valeurs dans MySQL en lien avec leur ID.
    4. 4) Faire en sorte que cela tourne en tache de fond pour se reproduire à la bonne fréquence d'acquisition


    Je part de 0, je ne suis pas du métier (dessinateur industriel / automaticien), j'ai découvert html, php et mysql sur ce projet, j'en arrive à Python mais cette fois j'ai besoin d'un (gros) coup de pouce pour me montrer le bon chemin à suivre.
    Merci de votre aide.

  2. #2
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 743
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 743
    Par défaut
    Salut,

    Citation Envoyé par makimax Voir le message
    Je part de 0, je ne suis pas du métier (dessinateur industriel / automaticien), j'ai découvert html, php et mysql sur ce projet, j'en arrive à Python mais cette fois j'ai besoin d'un (gros) coup de pouce pour me montrer le bon chemin à suivre.
    Si on ne dispose pas des équipements, on ne pourra pas tester...

    Si on ne peut pas tester, on devra se contenter de faire une lecture (intelligente à défaut d'active) des différents articles trouvés ici ou là et des documentations et vous pousser du code à tester.

    Et si vous ne savez pas trop programmer, ça ne va pas être facile de récupérer les informations pertinentes pour comprendre ce qu'il se passe (parce qu'on ne se déplace pas!).

    Le mieux serait de trouver un club d'informatique dans votre localité pour échanger de vive voix avec des qui pourront se déplacer au cas où...

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  3. #3
    Membre confirmé
    Homme Profil pro
    Dessinateur industriel
    Inscrit en
    Février 2021
    Messages
    90
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Dessinateur industriel
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2021
    Messages : 90
    Par défaut
    Citation Envoyé par wiztricks Voir le message
    Salut,
    Si on ne dispose pas des équipements, on ne pourra pas tester... - W
    Il n'y a pas nécessairement besoin d'équipement, moi même j'avance dans mon projet sans le matériel, j'ai juste un Apache + MySQL et un Simulateur Modbus.

    Si on ne peut pas tester, on devra se contenter de faire une lecture (intelligente à défaut d'active) des différents articles trouvés ici ou là et des documentations et vous pousser du code à tester.
    C'est justement cela que je cherche, des propositions de morceaux de code d'ici ou là.

    Et si vous ne savez pas trop programmer, ça ne va pas être facile ...
    Je suis assez débrouillard, la preuve en ayant fait le frontend en partant de 0 et ne connaissant ni html, ni php, ni mySQL.

    Je sais qu'il faut que je commence par un script qui se lance au démarrage, qui se connecte à la base de données et qui fait un SELECT des paramètres pour l'étape suivante (récupérer la fréquence d'acquisition et les différentes adresses des compteurs à récupérer).
    Déjà si quelqu'un peut me guider comment commencer cela. La connexion à la base, je le fait pour l'utilisateur dans un fichier php, j'imagine qu'il faut reprendre cette partie. Et ensuite les requêtes de SELECT, je saurais les faire puisque j'en ai aussi en PDO en PHP, mais j'imagine que ce n'est pas écrit de la même façon.

    Ensuite, cela sera l'étape de connexion, je m'inspirerai des exemples cités.

  4. #4
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 835
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 835
    Billets dans le blog
    1
    Par défaut
    Bonjour
    Citation Envoyé par makimax Voir le message
    Déjà si quelqu'un peut me guider comment commencer cela. La connexion à la base, je le fait pour l'utilisateur dans un fichier php, j'imagine qu'il faut reprendre cette partie. Et ensuite les requêtes de SELECT, je saurais les faire puisque j'en ai aussi en PDO en PHP, mais j'imagine que ce n'est pas écrit de la même façon.
    Les mécanismes d'interrogation d'une bdd MySQL (ou Postgres ou n'importe quelle autre) se font toujours de la même façon
    • on crée une instance connexion à partir d'une librairie dédiée à interfacer le langage. Cette instance reçoit les divers paramètres comme le nom de la bdd, le login, le mot de passe, etc.
    • cette instance (un objet) une fois connectée possède une fonction de création de curseur. Un curseur c'est l'outil dédié au requêtage SQL. Donc on crée le curseur (c'est bien souvent curs=connect.cursor(), "connect" étant l'instance de connexion). Et ce curseur pourra ensuite envoyer des requêtes SQL (curs.execute(requete)). Et pour la sélection, ce sera un curs.execute("select ...") suivi d'un res=curs.fetchone() si la requête ne renvoie qu'un résultat ou res=curs.fetchall() si elle en renvoie plusieurs. Certaines librairies bdd possèdent même parfois des outils où la requête est claquée dans un dictionnaire (si la table contient "nom", "prenom" alors le résultat est claqué dans un dico contenant une clef "nom" et une clef "prenom" ce qui est ensuite assez pratique pour le manipuler)
    • quand on a fini de manipuler, on ferme le curseur et quand on a fini de travailler sur la bdd on ferme la connexion


    Bon le souci c'est que je suis plus spécialisé dans Postgres donc je ne connais pas trop les librairies Python/MySQL (il y a souvent beaucoup de librairies dédiées à une même technologie donc il faut essayer de taper dans celle destinée à survivre) mais j'ai trouvé cette page qui parle de pymysql avec différents exemples. Et comme on peut voir "python36" dans certaines copies d'écran cela signifie que le truc n'est pas super vieux.

    En fait, Python c'est un peu comme une grosse pieuve. D'un côté un tentacule pour modbus, un autre tentacule pour MySQL et lui au centre il récupère tout ça et fait sa salade. Puis il renvoie le résultat soit sur un autre support (mail, fichier, etc) soit ça repart dans MySQL. Avec possibilité ensuite d'enrichissement. Si par exemple tu inclus le module configparser (qui permet de lire et d'écrire un fichier type ".ini") alors tu pourras y mettre tes paramètres de connexion ce qui t'évite de le mettre en dur dans ton code. Donc un 3° tentacule qui commence par récupérer les infos du ini et qui sont alors utilisées par le tentacule MySQL etc etc etc.
    Plus tu sépares bien les choses plus ça sera pratique à maintenir et à faire évoluler si demain les technos changent...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  5. #5
    Membre confirmé
    Homme Profil pro
    Dessinateur industriel
    Inscrit en
    Février 2021
    Messages
    90
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Dessinateur industriel
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2021
    Messages : 90
    Par défaut
    Merci Sve@r, je vais tenter de ce côté ! je ne pensait pas qu'il fallait une librairie pour mySQL, donc PyMySQL dans un premier temps et suivre les exemples pour lire une valeur dans une table.
    claqué dans un dico contenant une clef "nom" et une clef "prenom" ce qui est ensuite assez pratique pour le manipuler
    Cela ressemble énormément au php, avec le FetchAll(FETCH ASSOC) qui "claque" la réponse dans un Array, donc très pratique.

    Merci pour le conseil de bien dissocier les étapes, je suis dans cette optique aussi, encore faut-il que je réussisse chacune individuellement ^^.

    Citation Envoyé par wiztricks Voir le message
    Salut,
    Le mieux serait de trouver un club d'informatique dans votre localité pour échanger de vive voix avec des qui pourront se déplacer au cas où...
    J'ai un FabLab à proximité mais je n'y ai jamais mis les pieds, je ne sais pas si c'est le genre de projet qui peut être aborder. Je vais essayer de les contacter.

  6. #6
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 835
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 835
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par makimax Voir le message
    Merci pour le conseil de bien dissocier les étapes, je suis dans cette optique aussi, encore faut-il que je réussisse chacune individuellement ^^.
    Python possède un mécanisme assez intéressant permettant de tester ses propres modules individuellement afin de les valider : la variable "__name__".

    Un module c'est un truc qui fait un travail et que l'on peut importer ensuite dans son programme. On a alors accès à la (ou les) fonctions du module. Ce module ça peut-être un simple script ou même un dossier.

    Imaginons que tu veuilles créer un module de math que tu appelles "math.py" dont le code pourrait être le suivant
    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    #!/usr/bin/env python3
    # coding: utf-8
     
    def carre(n): return n*n

    Tu veux maintenant vérifier que ton script "math.py" et surtout sa fonction "carre" fonctionne. Tu pourrais rajouter en fin de script print(carre(5)).
    Le souci, c'est que dès que ton module "math.py" sera importé, le print() sera exécuté ce qui est au minimum dérangeant.

    Pour éviter ce souci tout en voulant garder ton test unitaire, tu rajoutes en fin de script
    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    if __name__ == "__main__":
    	print(carre(5))
    	... (tes autres tests éventuels)
    # if

    Cette variable interne Python "__name__" a un comportement différent selon l'utilisation du script. Si le script est importé, alors elle prend le nom de l'import comme contenu. Mais si le script est directement exécuté, alors elle prend la string "__main__".
    Donc tu veux tester ton module, tu appelles python3 math.py et tu verras tous tes tests se faire et tu pourras corriger ce qui ne va pas. Puis ton module étant fiabilsé, il peut alors être importé dans ton programme sans souci et sans que les tests ne soient fait de nouveau.

    Et pour l'utilisation de ton module, te suffit de mettre import math dans un programme pour que ce programme ait accès à la fonction "carre()" sous le nom math.carre(). Ou alors from math import carre ou même from math import * et là les fonctions du fichier "math.py" sont directement importées dans l'espace de nom de ton code donc "carre()" se nomme alors directement carre() (plus attrayant mais aussi plus dangereux si plusieurs modules distincts ont des fonctions de même nom). Et là enfin le projet commence à s'articuler...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  7. #7
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 743
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 743
    Par défaut
    Citation Envoyé par makimax Voir le message
    Il n'y a pas nécessairement besoin d'équipement, moi même j'avance dans mon projet sans le matériel, j'ai juste un Apache + MySQL et un Simulateur Modbus.
    Vous croyez que tout le monde a ce genre de trucs installé sur son PC et sait s'en servir juste parce qu'il sait programmer avec Python?

    Citation Envoyé par makimax Voir le message
    Je suis assez débrouillard, la preuve en ayant fait le frontend en partant de 0 et ne connaissant ni html, ni php, ni mySQL.

    Je sais qu'il faut que je commence par un script qui se lance au démarrage, qui se connecte à la base de données et qui fait un SELECT des paramètres pour l'étape suivante
    Mouais, si vous aviez pris l'initiative de chercher avec les mots clefs "python mysql" vous auriez trouvé la documentation de bibliothèques qui permettent de... et les exemples qui vont avec.

    En général, l'utilisation des bases de données depuis Python se fait avec une interface assez homogène basée sur la bibliothèque sqlite3 (qui est standard).
    Tous les bons tutos ont un chapitre qui explique comment çà marche.

    Citation Envoyé par makimax Voir le message
    C'est justement cela que je cherche, des propositions de morceaux de code d'ici ou là.
    Il y en a plein sur Internet! (et vous en avez trouvé).

    Après le soucis est de comprendre ce qu'ils font et de voir en quoi ils sont intéressants pour faire ce que vous voulez vous (et on n'est pas dans votre tête donc on ne sait pas vraiment trier).

    Je sais qu'il faut que je commence par un script qui se lance au démarrage, qui se connecte à la base de données et qui fait un SELECT des paramètres pour l'étape suivante (récupérer la fréquence d'acquisition et les différentes adresses des compteurs à récupérer).

    Citation Envoyé par makimax Voir le message
    Déjà si quelqu'un peut me guider comment commencer cela. La connexion à la base, je le fait pour l'utilisateur dans un fichier php, j'imagine qu'il faut reprendre cette partie. Et ensuite les requêtes de SELECT, je saurais les faire puisque j'en ai aussi en PDO en PHP, mais j'imagine que ce n'est pas écrit de la même façon.

    Ensuite, cela sera l'étape de connexion, je m'inspirerai des exemples cités.
    Si vous n'avez que la connexion à la base comme problème, vous savez qu'il n'est pas insoluble. Vous pouvez commencer le reste en simulant la récupération de l'identifiant par une simple saisie clavier... et revisiter l'aspect BDD plus tard.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

Discussions similaires

  1. sauvegarde des données d'un formulaire dans mysql avec php
    Par MC BAO dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 28/07/2017, 16h31
  2. Réponses: 8
    Dernier message: 17/02/2016, 17h14
  3. Réponses: 2
    Dernier message: 23/04/2009, 11h16
  4. Enregistrement des données d'un formulaire dans SharePoint
    Par fanfan49 dans le forum SharePoint
    Réponses: 1
    Dernier message: 06/06/2007, 23h12
  5. Réponses: 2
    Dernier message: 14/05/2007, 09h40

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo