Variable domoticz + python

Forum dédié aux problématiques concernant les scripts pour DomoticZ.
Entourez votre code et les logs avec les balises nommées code grâce au bouton <\>.
Ness
Messages : 11
Inscription : 01 févr. 2017, 12:51

Variable domoticz + python

Message 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
Dernière modification par Ness le 05 févr. 2017, 10:23, modifié 1 fois.
vil1driver
Messages : 5661
Inscription : 30 janv. 2015, 11:07
Localisation : Rennes (35)

Re: Variable domoticz + python

Message par vil1driver »

MAJ = VIDER LE CACHE(<-Clicable)
/!\Les mises à jour de Domoticz sont souvent sources de difficultés, ne sautez pas dessus
modules.lua

Un ex domoticzien
Ness
Messages : 11
Inscription : 01 févr. 2017, 12:51

Re: Variable domoticz + python

Message 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?
vil1driver
Messages : 5661
Inscription : 30 janv. 2015, 11:07
Localisation : Rennes (35)

Re: Variable domoticz + python

Message par vil1driver »

oui
MAJ = VIDER LE CACHE(<-Clicable)
/!\Les mises à jour de Domoticz sont souvent sources de difficultés, ne sautez pas dessus
modules.lua

Un ex domoticzien
Ness
Messages : 11
Inscription : 01 févr. 2017, 12:51

Re: Variable domoticz + python

Message 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.
vil1driver
Messages : 5661
Inscription : 30 janv. 2015, 11:07
Localisation : Rennes (35)

Re: Variable domoticz + python

Message par vil1driver »

Sinon tu rempli via ton script python un fichier que domoticz ira lire de temps en temps
MAJ = VIDER LE CACHE(<-Clicable)
/!\Les mises à jour de Domoticz sont souvent sources de difficultés, ne sautez pas dessus
modules.lua

Un ex domoticzien
Neutrino
Messages : 2662
Inscription : 10 juil. 2015, 15:42
Localisation : Les Herbiers(85)

Re: Variable domoticz + python

Message 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.
Ma maison à plein d'IP ! :mrgreen:
SAV Bonjour. Vous avez vidé le cache ?
Ness
Messages : 11
Inscription : 01 févr. 2017, 12:51

Re: Variable domoticz + python

Message 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.
Steph38
Messages : 44
Inscription : 12 août 2015, 18:13

Re: Variable domoticz + python

Message 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&param=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&param=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


dba59
Messages : 10
Inscription : 12 sept. 2015, 13:50

Re: Variable domoticz + python

Message 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&param=switchlight&idx=%s&switchcmd=On' % (self.host, _id)
        return self._request(url)

    def turn_off(self, _id):
        url='http://%s/json.htm?type=command&param=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&param=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&param=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'])


Répondre