Page 1 sur 2
Variable domoticz + python
Publié : 05 févr. 2017, 09:10
par Ness
Bonjour à tous,
J'aimerai pouvoir lire et écrire les variables présentes dans "Domoticz".
J'ai lu pas mal de topic et mais rien de concluant.
Auriez vous un tuto, ou me donner les commandes pour lire/ecrire une variable depuis python?
Merci
Re: Variable domoticz + python
Publié : 05 févr. 2017, 09:41
par vil1driver
Re: Variable domoticz + python
Publié : 05 févr. 2017, 10:25
par Ness
Bonjour,
Avant tout merci de ta réponse.
Donc si je comprends bien, je dois utiliser l'api "json" pour lire/écrire les variables domoticz depuis le script python?
Re: Variable domoticz + python
Publié : 05 févr. 2017, 10:28
par vil1driver
oui
Re: Variable domoticz + python
Publié : 05 févr. 2017, 11:00
par Ness
Violà j'arrive bien à mettre à jour ma user variable.
Je trouve cela assez lourd et j'ai quelque crainte au niveau "process" car la liste d'échange sera assez "grosse" à terme.
Pour bien comprendre, j'ai programme la com modbus sur "4000"données échangées
Donc rafraichir autant de données dans domoticz, cela risque d'être assez sport lol
Merci pour ton support. Je ferai quelque tests pour voir ce que cela donne.
Re: Variable domoticz + python
Publié : 05 févr. 2017, 17:13
par vil1driver
Sinon tu rempli via ton script python un fichier que domoticz ira lire de temps en temps
Re: Variable domoticz + python
Publié : 05 févr. 2017, 19:06
par Neutrino
Salut,
Tu peux, peut-être trouver ton bonheur ici :
http://domoticz.com/wiki/Developing_a_Python_plugin
Le but est d'offrir une interface python pour faire des plugins et prendre en charge de nouveaux hardware.
Re: Variable domoticz + python
Publié : 05 févr. 2017, 20:12
par Ness
Merci pour vos infos, je verrai ce que je peux en faire.
Je vais tester avec le json et voir si dans le temps, les performances se dégradent ou pas.
Je vais splitter ma requête en une partie "static" et une dynamique afin de réduire les erreurs de "copier" coller.
Actuellement, je regarde les différentes possibilités et je regarde s'il n'y a pas de contraintes bloquantes pour mes besoins. Ensuite je verrai ce qu'il me manque
Si au cas, je développe quelque chose, je le mettrai au service de la communauté bien entendu.
Re: Variable domoticz + python
Publié : 05 févr. 2017, 21:29
par Steph38
Perso je fait comme cela
Code : Tout sélectionner
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# les parametres de Domoticz
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
domoticz_ip='192.168.0.119'
domoticz_port='8080'
user=''
password=''
def donne_valeur_var(idx,text):
json_url1='/json.htm?type=command¶m=getuservariable&idx='
requete='http://'+domoticz_ip+':'+domoticz_port+json_url1+idx
r=requests.get (requete,auth=HTTPBasicAuth(user,password))
status=r.status_code
if status == 200:
# l'API renvoie 200 si tout est OK
def maj_var(idx,nom,type,text):
json_url1='/json.htm?type=command¶m=updateuservariable&idx='
json_url2='&vname='+nom+'&vtype='+type+'&vvalue='
requete='http://'+domoticz_ip+':'+domoticz_port+json_url1+idx+json_url2+text
r=requests.get (requete,auth=HTTPBasicAuth(user,password)) domoticzjson=r.json()
for i, v in enumerate(domoticzjson["result"]):
val= domoticzjson["result"][i][text]
return val
Re: Variable domoticz + python
Publié : 09 mars 2017, 20:53
par dba59
hello
je viens de modifier le pymoticz.py pour sortir les uservariables.
Code : Tout sélectionner
#!/usr/bin/env python
"""Usage:
pymoticz list [--host=<host>] [--names]
pymoticz test
pymoticz status <id> [--host=<host>]
pymoticz on <id> [--host=<host>]
pymoticz off <id> [--host=<host>]
pymoticz var <id> [--host=<host>]
pymoticz dim <id> <level> [--host=<host>]
"""
import requests
import json
__all__ = [ 'Pymoticz' ]
__version__ = '0.1'
class Pymoticz:
DIMMER = u'Dimmer'
ON_OFF = u'On/Off'
SWITCH_TYPES=[ DIMMER, ON_OFF ]
def __init__(self, domoticz_host='192.168.0.25:8081'):
self.host = domoticz_host
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# les parametres de Domoticz
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
domoticz_ip='192.168.0.25'
domoticz_port='8081'
user=''
password=''
def _request(self, url):
r=requests.get(url)
if r.status_code == 200:
return json.loads(r.text)
else:
raise
def list_names(self):
l=self.list()
return [device['Name'] for device in l['result']]
def list(self):
url='http://%s/json.htm?type=devices&used=true' % self.host
return self._request(url)
def turn_on(self, _id):
url='http://%s/json.htm?type=command¶m=switchlight&idx=%s&switchcmd=On' % (self.host, _id)
return self._request(url)
def turn_off(self, _id):
url='http://%s/json.htm?type=command¶m=switchlight&idx=%s&switchcmd=Off&level=0' % (self.host, _id)
return self._request(url)
def get_var(self, _id):
url='http://%s/json.htm?type=command¶m=getuservariable&idx=%s' % (self.host, _id)
return self._request(url)
def dim(self, _id, level):
d=self.get_device(_id)
if d is None:
return 'No device with that id.'
max_dim=d['MaxDimLevel']
if int(level) > max_dim or int(level) < 0:
return 'Level has to be in the range 0 to %d' % max_dim
url='http://%s/json.htm?type=command¶m=switchlight&idx=%s&switchcmd=Set Level&level=%s' % (self.host, _id, level)
return self._request(url)
def get_device(self, _id):
l=self.list()
try:
device=[i for i in l['result'] if i['idx'] == u'%s' % _id][0]
except:
return None
return device
def get_light_status(self, _id):
light = self.get_device(_id)
if light is None:
return 'No device with that id.'
if light['SwitchType'] not in self.SWITCH_TYPES:
return 'Not a light switch'
elif light['SwitchType'] == self.DIMMER:
return light['Level']
elif light['SwitchType'] == self.ON_OFF:
return light['Status']
if __name__ == '__main__':
from docopt import docopt
from pprint import pprint
args=docopt(__doc__, version=__version__)
p=None
if args['--host']:
p=Pymoticz(args['--host'])
else:
p=Pymoticz()
if args['list']:
if args['--names']:
print('\n'.join(p.list_names()))
else:
pprint(p.list())
elif args['status']:
response = p.get_light_status(args['<id>'])
print(response)
elif args['on']:
response = p.turn_on(args['<id>'])
elif args['off']:
response = p.turn_off(args['<id>'])
elif args['dim']:
response = p.dim(args['<id>'], args['<level>'])
print(response)
elif args['var']:
response = p.get_var(args['<id>'])
print (response['result'][0]['Name']+"="+response['result'][0]['Value'])