Log avec linknx - Version imprimable +- Forum KNX francophone / English KNX forum (https://www.knx-fr.com) +-- Forum : Français (https://www.knx-fr.com/forumdisplay.php?fid=3) +--- Forum : Archives eib-domotique (https://www.knx-fr.com/forumdisplay.php?fid=8) +--- Sujet : Log avec linknx (/showthread.php?tid=1403) |
Log avec linknx - sprint95 - 24/01/2011 Bonjour à tous, Je suis en train de me poser une question sur le fonctionnement des log avec linknx. Si je m'en réfère aux fichiers de log que j'ai à ce jour, le log se fait lors d'un changement de valeur de la donnée loggée, me tompais je ? J'aimerai faire des enregistrements de certaines data à intervalles fixes, quelqu'un a t il un script permettant d'interroger une la valeur d'une donnée (T° par ex) et de l'enregistrer dans une table sql qui sera déclarée autrement que dans linknx (je n'ai pas possibilité de le faire sur mon NAS) ? Merci de votre retour Thierry Log avec linknx - Frédéric - 24/01/2011 Le lundi 24 janvier 2011, sprint95 a écrit : > J'aimerai faire des enregistrements de certaines data à intervalles > fixes, quelqu'un a t il un script permettant d'interroger une la > valeur d'une donnée (T° par ex) et de l'enregistrer dans une table sql > qui sera déclarée autrement que dans linknx (je n'ai pas possibilité > de le faire sur mon NAS) ? Il te suffit d'envoyer la bonne commande à linknx, depuis un script¹, script activé régulièrement par un cron. Charge à ce script de stocker la réponse dans un fichier, une base, etc... Cf : http://sourceforge.net/apps/mediawiki/linknx/index.php?title=Interacting_with_Linknx ¹ Le script peut être en shell, en python, en Perl, en Tcl, en java ou en n'importe quoi d'autre. Tu peux égalementcompiler un programme C, C++, Pascal... -- Frédéric Log avec linknx - sprint95 - 24/01/2011 > Il te suffit d'envoyer la bonne commande à linknx, depuis un script¹, script > activé régulièrement par un cron. Charge à ce script de stocker la réponse > dans un fichier, une base, etc... Je suis désolé pour la question qui va suivre et qui est surement très simple mais : comment ??? Il y a bien longtemps que je n'ai pas mis les mains dans le cambouis d'où ma question : comment j'envoie cette commande à linknx ? > http://sourceforge.net/apps/mediawiki/linknx/index.php?title=Interact... J'ai regardé mais je ne comprends pas mieux > ¹ Le script peut être en shell, en python, en Perl, en Tcl, en java ou en > n'importe quoi d'autre. Tu peux également compiler un programme C, C++, > Pascal... Le C n'est peut etre pas le plus optimal mais c'est tout ce qu'il me reste en mémoire .... Va falloir reviser la programmation.... Merci Log avec linknx - Frédéric - 24/01/2011 Le lundi 24 janvier 2011, a.penhard@gmail.com a écrit : > 1 - gérer les log de linknx directement dans mysql au lieu d'un fichier > 2 - solution de Frédéric appel via un script, de linknx via tache cron > pour récupérer les valeures > 3 - creer un petit script bash, qui tourne en tache Cron toutes les 5 > minutes, pour exploiter les fichiers "persist" et écrire dans une base > mysql Le problème c'est que parser les logs ne permet pas de déclencher une mesure, ce que veut faire sprint95. Il faut vraiment faire un read sur linknx. J'essaierai de pondre un petit exemple en Python... -- Frédéric Log avec linknx - Frédéric - 24/01/2011 Le lundi 24 janvier 2011, Frédéric a écrit : > J'essaierai de pondre un petit exemple en Python... Voili (non testé). C'est basique ; il est possible de lire plusieurs valeurs d'un coup, mais il faut ensuite parser plus finement le résultat. Je te laisse te reporter aux diverses doc des modules python utilisés. -----------------------------8<----------------------------------- #/bin/sh python # -*- coding: utf-8 -*- import socket import xml.etree.ElementTree import MySQLdb import MySQLdb.cursors HOST = "localhost" PORT = 1028 # defined in the <xmlserver> 'port' attribute of the <services> section EOF = 0x04 MYSQL_USER = "mysql_user" MYSQL_PASSWD = "mysql_passwd" MYSQL_DB = "mysql_db" # Open a socket to communicate with linknx sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) sock.connect((HOST, PORT)) # Send a read command sock.send("<read><object id=\"temp_bureau\"/></read>" + EOF) # Read answer ("<read status='success'>20.2</read>") ans = sock.read() # Decode answer(xml) elem = xml.etree.ElementTree.XML(ans) status = elem.attrib.get("status") if status == "success": value = float(elem.text) # Store in MySQL database conn = MySQLdb.Connect(host=HOST, user=MYSQL_USER, passwd=MYSQL_PASSWD, db=MYSQL_DB) cursor = conn.cursor(cursorclass=MySQLdb.cursors.DictCursor) request = "INSERT INTO %(db)s temp_bureau VALUES %(temp_bureau)f" d = {'db': MYSQL_DB, 'temp_bureau': value} cursor.execute(request % d) conn.commit() -----------------------------8<----------------------------------- -- Frédéric Log avec linknx - jef2000 - 24/01/2011 Salut, Juste une petite question pour préciser ce que tu veux faire exactement. Est-ce que tu veux: 1) enregistrer, a intervalle régulier, la dernière valeur que le capteur a envoyée, 2) envoyer a intervalle régulier une requète de lecture de la valeur sur le bus pour obliger le capteur a envoyer sa valeur actuelle, et enregistrer cette dernière. Pour la 1ère, voir les réponses ci-dessus La 2ème solution n'est pas possible avec la dernière release de linknx. J'ai ajouté le code permettant de faire ça (forcer l'envoi d'une requète de lecture sur le bus) dans CVS dernièrement. Bien à vous, Jean-François On 24 jan, 13:00, Frédéric <f...@gbiloba.org> wrote: > Le lundi 24 janvier 2011, Frédéric a écrit : > > > J'essaierai de pondre un petit exemple en Python... > > Voili (non testé). C'est basique ; il est possible de lire plusieurs valeurs > d'un coup, mais il faut ensuite parser plus finement le résultat. Je te > laisse te reporter aux diverses doc des modules python utilisés. > > -----------------------------8<----------------------------------- > #/bin/sh python > # -*- coding: utf-8 -*- > > import socket > import xml.etree.ElementTree > > import MySQLdb > import MySQLdb.cursors > > HOST = "localhost" > PORT = 1028 # defined in the <xmlserver> 'port' attribute of the <services> > section > EOF = 0x04 > MYSQL_USER = "mysql_user" > MYSQL_PASSWD = "mysql_passwd" > MYSQL_DB = "mysql_db" > > # Open a socket to communicate with linknx > sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) > sock.connect((HOST, PORT)) > > # Send a read command > sock.send("<read><object id=\"temp_bureau\"/></read>" + EOF) > > # Read answer ("<read status='success'>20.2</read>") > ans = sock.read() > > # Decode answer(xml) > elem = xml.etree.ElementTree.XML(ans) > status = elem.attrib.get("status") > if status == "success": > value = float(elem.text) > > # Store in MySQL database > conn = MySQLdb.Connect(host=HOST, user=MYSQL_USER, > passwd=MYSQL_PASSWD, db=MYSQL_DB) > cursor = conn.cursor(cursorclass=MySQLdb.cursors.DictCursor) > request = "INSERT INTO %(db)s temp_bureau VALUES %(temp_bureau)f" > d = {'db': MYSQL_DB, 'temp_bureau': value} > cursor.execute(request % d) > conn.commit() > -----------------------------8<----------------------------------- > > -- > Frédéric Log avec linknx - Frédéric - 24/01/2011 Le lundi 24 janvier 2011, jef2000 a écrit : > 2) envoyer a intervalle régulier une requète de lecture de la valeur > sur le bus pour obliger le capteur a envoyer sa valeur actuelle, et > enregistrer cette dernière. > Pour la 1ère, voir les réponses ci-dessus > La 2ème solution n'est pas possible avec la dernière release de > linknx. J'ai ajouté le code permettant de faire ça (forcer l'envoi > d'une requète de lecture sur le bus) dans CVS dernièrement. Ah, un read ne fait que retourner ce que linknx a en mémoire, donc ? Du coup, mon code ne sert à rien. Il faudra l'adapter avec la nouvelle fonctionalité. D'ailleurs, comment est-ce que ça fonctionne ? C'est toujours un read ? Ou y a-t-il une autre commande ? -- Frédéric Log avec linknx - Sprint - 24/01/2011 Salut Jef, En ce qui me concerne, c'est l'option 1 qui m'interesse afin de tracer des evolutions de T° a intervalle régulier par ex. Je ne pense pas qu'il soit tres utile de forcer une nouvelle lecture de la variable avant de l'enregistrer puisque normalement, si j'ai bien suivi, toute modif de cette variable est actualisé non ? Thierry Le 24 janv. 2011 à 13:25, jef2000 a écrit : > Salut, > > Juste une petite question pour préciser ce que tu veux faire > exactement. > Est-ce que tu veux: > 1) enregistrer, a intervalle régulier, la dernière valeur que le > capteur a envoyée, > 2) envoyer a intervalle régulier une requète de lecture de la valeur > sur le bus pour obliger le capteur a envoyer sa valeur actuelle, et > enregistrer cette dernière. > Pour la 1ère, voir les réponses ci-dessus > La 2ème solution n'est pas possible avec la dernière release de > linknx. J'ai ajouté le code permettant de faire ça (forcer l'envoi > d'une requète de lecture sur le bus) dans CVS dernièrement. > > Bien à vous, > > Jean-François > > > On 24 jan, 13:00, Frédéric <f...@gbiloba.org> wrote: >> Le lundi 24 janvier 2011, Frédéric a écrit : >> >>> J'essaierai de pondre un petit exemple en Python... >> >> Voili (non testé). C'est basique ; il est possible de lire plusieurs valeurs >> d'un coup, mais il faut ensuite parser plus finement le résultat. Je te >> laisse te reporter aux diverses doc des modules python utilisés. >> >> -----------------------------8<----------------------------------- >> #/bin/sh python >> # -*- coding: utf-8 -*- >> >> import socket >> import xml.etree.ElementTree >> >> import MySQLdb >> import MySQLdb.cursors >> >> HOST = "localhost" >> PORT = 1028 # defined in the <xmlserver> 'port' attribute of the <services> >> section >> EOF = 0x04 >> MYSQL_USER = "mysql_user" >> MYSQL_PASSWD = "mysql_passwd" >> MYSQL_DB = "mysql_db" >> >> # Open a socket to communicate with linknx >> sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) >> sock.connect((HOST, PORT)) >> >> # Send a read command >> sock.send("<read><object id=\"temp_bureau\"/></read>" + EOF) >> >> # Read answer ("<read status='success'>20.2</read>") >> ans = sock.read() >> >> # Decode answer(xml) >> elem = xml.etree.ElementTree.XML(ans) >> status = elem.attrib.get("status") >> if status == "success": >> value = float(elem.text) >> >> # Store in MySQL database >> conn = MySQLdb.Connect(host=HOST, user=MYSQL_USER, >> passwd=MYSQL_PASSWD, db=MYSQL_DB) >> cursor = conn.cursor(cursorclass=MySQLdb.cursors.DictCursor) >> request = "INSERT INTO %(db)s temp_bureau VALUES %(temp_bureau)f" >> d = {'db': MYSQL_DB, 'temp_bureau': value} >> cursor.execute(request % d) >> conn.commit() >> -----------------------------8<----------------------------------- >> >> -- >> Frédéric Log avec linknx - sprint95 - 24/01/2011 En me relisant, ca me fait penser que comme j'utilise une varuna et que je diffuse sur le réseau KNX, toutes les minutes, les températures des pièces, c'est peut etre pour ca que j'ai autant d'info dans mon log..... Thierry On 24 jan, 13:35, Sprint <sprint...@free.fr> wrote: > Salut Jef, > > En ce qui me concerne, c'est l'option 1 qui m'interesse afin de tracer des evolutions de T° a intervalle régulier par ex. Je ne pense pas qu'il soit tres utile de forcer une nouvelle lecture de la variable avant de l'enregistrer puisque normalement, si j'ai bien suivi, toute modif de cette variable est actualisé non ? > > Thierry > |