Note de ce sujet :
  • Moyenne : 0 (0 vote(s))
  • 1
  • 2
  • 3
  • 4
  • 5
Log avec linknx
#1
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
#2
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/li...ith_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
#3
> 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/li...e=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
#4
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
#5
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
#6
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
#7
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
#8
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
#9
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
>


Atteindre :


Utilisateur(s) parcourant ce sujet : 1 visiteur(s)