Page 1 sur 1

JSON dans C

Publié : 30 août 2018, 20:24
par ramirez22
Bonjour à toutes et à tous.

J'ai déjà eu recours au forum afin de répondre à certaines de mes interrogations, et jusqu'à maintenant, je n'ai jamais eu besoin de poser une seule question (merci à toutes/tous :lol: )

Mais là, je sèche.
Installation : le matos
Domoticz sur raspberry 1 rev B.
MCP23017pour 12 sorties relais (sur bus I2C)
DS2482-800 pour une interface I2C - 1Wire (j'ai préféré cette solution à celle du 1-wire intégrée au kernel pour des raisons de longueur de câble)
PCF8591 pour quelques entrées analogiques (toujours sur I2C)

le soft :
Raspian Strech
Installation des librairie python qui vont bien pour la gestion du PCF8591.
Et c'est à peu près tout, de mémoire (j'oublie peut-être quelque chose, mais bon ...)

Fonctionnement souhaité : rafraichissement des valeurs analogiques régulièrement.

Donc acquisition des valeurs du PCF via script Python :

Code : Tout sélectionner

#!/usr/bin/python
# -*- coding:utf-8 -*-
import smbus
import time
import urllib
import urllib2
import requests

# Message LOG de prise en compte du script python
url = 'http://192.168.1.31:8080/json.htm?type=command&param=addlogmessage&message=Lancement%20script%20python'
try:
        request = urllib2.Request(url)
        response = urllib2.urlopen(request)
except urllib2.HTTPError, e:
        print e.code; time.sleep(60)
except urllib2.URLError, e:
        print e.args; time.sleep(60)

# Constantes
address = 0x48 # Adresse du PCF
AIN0 = 0x40     # Sortie ANA active, 4 entrées ANA séparées, pas d'auto incrément et voie 0

# AIN0 correspond au potentiometre

# Envoi requete I2C + lecture
bus = smbus.SMBus(1)
bus.write_byte(address,AIN0)
value = bus.read_byte(address)
time.sleep(0.1)
bus.write_byte(address,AIN0)
value = bus.read_byte(address)

# Mise en forme requete JSON pour écriture dans device virtuel
value = str(value)
url = 'http://192.168.1.31:8080/json.htm?type=command&param=udevice&idx=19&svalue='+value
try:
        request = urllib2.Request(url)
        response = urllib2.urlopen(request)
except urllib2.HTTPError, e:
        print e.code; time.sleep(60)
except urllib2.URLError, e:
        print e.args; time.sleep(60)
Ce script est appelé régulièrement et automatiquement par Domoticz (toutes les minutes exactement puisque le nom du script est script_time_blabla :D )

Code : Tout sélectionner

commandArray = {}
        print('Lancement du script lua d\'acquisition')
        os.execute('python /home/pi/domoticz/scripts/python/script_acquisition_luminosite.py')
return commandArray
Problèmes rencontrés :
1 - J'ai été obligé de réaliser 2 lectures à la suite dans le script Python, la première lecture était toujours la valeur précédente :shock:
2 - Le temps de réponse du couple lua-python est horriblement long (supérieur à 10 secondes, sans parler du rafraichissement de Domoticz)

Questions:
1 - Pour les spécialistes, pourquoi cette double lecture ? Y-a t'il une erreur dans mon bout de code ?
2 - Est-ce que ce temps d'acquisition est normal ?

Je pourrais coder mon script en C puis compiler le tout, peut-être que ça serait plus rapide, mais j'achoppe sur le code (je suis plutôt codeur du dimanche), sur comment intégrer l'API JSON pour que le programme en C compilé écrive directement la variable, et comment lancer le programme régulièrement (j'ai bien une idée avec cron, mais j'ai peur que mon code se disperse partout et de ne plus m'y retrouver).

Si quelqu'un avait des pistes ...

Bonne soirée !

Re: JSON dans C

Publié : 30 août 2018, 22:47
par vil1driver
Salut

S'il ne s'agit que de lancer le script python, sert toi de cron

Re: JSON dans C

Publié : 30 août 2018, 23:30
par ramirez22
Bonsoir et merci de la réponse.

Non, il ne s'agit pas de lancer le script python. En effet, je pourrais, ça serait complètement transparent. Mais je voudrais juste savoir s'il est normal qu'un script python, qui ne fait que lire et écrire sur un bus I2C (à 2 reprise, mais que je lance la lecture 1 ou 2 fois ne change pas le temps de lancement du script) et transmettre une info en JSON mette plus de 10 secondes.

J'ai fais le test sans Domoticz, en lançant un

Code : Tout sélectionner

python blabla.py
et cela ne change rien en la durée de lancement du script.

J'ai ensuite essayé de modifier le script en supprimant les requetes JSON, toujours pareil.

Par contre, j'ai essayé en supprimant les imports:

Code : Tout sélectionner

#import urllib
#import urllib2
#import requests
et là, mon script s'exécute rapidement. A croire que le temps de chargement des bibliothèque est super long et pénalise le script entier.

Y a t'il un moyen d'améliorer ça ?

Re: JSON dans C

Publié : 30 août 2018, 23:57
par vil1driver
ramirez22 a écrit : Le temps de réponse du couple lua-python est horriblement long
Excuse moi, je n'avais pas compris que le script python était lent même lancé en dehors d'un script lua.

Du coup je n'ai pas d'idée, désolé

Re: JSON dans C

Publié : 31 août 2018, 08:30
par Tonio16
ramirez22 a écrit : Par contre, j'ai essayé en supprimant les imports:

Code : Tout sélectionner

#import urllib
#import urllib2
#import requests
et là, mon script s'exécute rapidement. A croire que le temps de chargement des bibliothèque est super long et pénalise le script entier.

Y a t'il un moyen d'améliorer ça ?
Si tu importes seulement les fonctions dont le script à besoin?

Antoine

Re: JSON dans C

Publié : 02 sept. 2018, 11:53
par ramirez22
Bonjour.

Désolé si je n'ai pas répondu de suite Tonio16, mais j'ai d'abord cherché avant de bêtement poser la question qui me brule les lèvres.
Mais comme j'ai pas trouvé (ou mal chercher, ce qui est bien plus probable :lol: ), je vais passer pour un c*n est la poser, la question fatidique :

C'est comment qu'on fait-y donc :?:

Merci de votre soutien à un "vieux" qui débute :D

[Edit]
Après avoir un peu mieux regardé le script, je me suis rendu compte qu'en fait, celui-ci n'utilise que la bibliothèque urllib2.
J'ai donc supprimé

Code : Tout sélectionner

import requests
import urllib
et d'un seul coup, le script s'exécute beaucoup plus rapidement.
J'en déduis que ton intervention Tonio16 n'avait que pour but de me faire comprendre qu'il y avait des appels inutiles dans mon script.
J'ai mis le temps, mais j'y suis arrivé "presque" tout seul :lol:

Merci à tous.