Page 1 sur 1

Problème avec l'API Json avec la nouvelle syntaxe getschedules

Publié : 13 févr. 2024, 08:27
par petzoom
Bonjour,
Il semble que cette fonction ne marche plus :http://127.0.0.1:8080/json.htm?type=com ... s&[u]idx=3[/u]
Le filtre sur le device (ici idx=3) ne filtre pas,
de plus si on ignore ce paramètre pour obtenir toutes les planifications, la donnée TimerCmd ne reflète pas l'état programmé dans l'interface quand le device est off.

Edit : Evidemment, la commande dont je parle et qui me pose problème est bien celle-ci :
/json.htm?type=command&param=getschedules&idx=3

Re: Problème avec l'API Json avec la nouvelle syntaxe getschedules

Publié : 14 févr. 2024, 12:17
par lost
petzoom a écrit : 13 févr. 2024, 08:27 la commande dont je parle et qui me pose problème est bien celle-ci :
/json.htm?type=command&param=getschedules&idx=3
Bonjour,

Je ne crois pas que cette commande ait un jour fonctionné avec un idx (ou de manière non documentée?). Je l'ai utilisé dans les 2 versions et c'était toujours sans. D'ailleurs, getschedules est au pluriel sans doute pas sans raison.

Pour ma part, je l'utilise pour invalider temporairement tous les plannings de chauffe quand je me chauffe au bois avec mon insert. S'il y avait eu moyen de filtrer direct sur les idx des switch attachés aux contrôles individualisés de tous mes radiateurs cela m'aurait simplifié l'affaire!

C'est pour ma part un petit script python qui gère cela avec les commandes/paramètres formatés en json. On a ici l'ancienne version (en commentaire) et la nouvelle:

Code : Tout sélectionner

# Domoticz json API url
dmtJurl         = 'http://127.0.0.1:8080/json.htm?'

# Command parameters in json format (only change if API change!)
#dmtJsonGetSched = {"type":"schedules"}
dmtJsonGetSched = {"type":"command", "param":"getschedules"}
Depuis le 23 juin dernier, j'utilise {"type":"command", "param":"getschedules"}au lieu de {"type":"schedules"} sans problème: L'hiver vu l'utilisation je m'en serais rendu compte :)

Vu mon usage, j'utilise aussi cette commande (en modifiant la partie idx avant utilisation, cette commande le supportant avec les idx timer, paramètre enabledisabletimer ici logiquement au singulier):

Code : Tout sélectionner

dmtJsonActTimer = {"type":"command", "param":"enabledisabletimer", "idx":"999"}
Utilisé par la fonction d'appel d'API HTTP/JSON générique suivante (utilise les modules python request et json):

Code : Tout sélectionner

def dmtJsonApi(url, jsonApiCmd, logger):
    """
    Send Domoticz json command
    """

    try:
        # Connect to Domoticz via JSON API and send data
        dmtRget=requests.get(url, params=jsonApiCmd)
    except requests.exceptions.RequestException as dmtErr:
        logger.log(logging.ERROR, "Unable to connect with URL=%s \nGet requests error %s" % (dmtRget.url, dmtErr))
    finally:
        logger.log(logging.DEBUG, "Sent data: [%s]" % (dmtRget.url))

    return dmtRget.json()
Exemple d'appel pour récupérer l'ensemble des plannings attachés à tous ses switch dans le timer-plan sélectionné (si on en a plusieurs):

Code : Tout sélectionner

    # Get all schedules
    schedules = dmtJsonApi(dmtJurl, dmtJsonGetSched, logger)
Et ensuite, faut filtrer la réponse sur le nom du device visé (pour ma part je me simplifie la tâche avec une convention de préfixe de nommage et gère les wildcards/*) vu que pas de support filtrage/idx. Ici je change juste l'activation de tous les timers attachés à un switch (ou plusieurs si *, genre "radiateur*"), qui ne sont hélas pas non plus gérables globalement:

Code : Tout sélectionner

    # Modify active setting for dev name...
    schedNb=len(schedules['result'])
    logger.log(logging.DEBUG, "Found %d schedules, extract those for %s" % (schedNb, devName))

    # Change schedule(s) for device(s) matching name (wildcard support):
    for sched in schedules['result']:
        if fnmatch(sched['DevName'], devName):
            logger.log(logging.DEBUG, 'Found : %s , state=%s, idx=%d',
                       sched['DevName'],
                       sched['Active'],
                       sched['TimerID'])

            curState = ('disabletimer','enabletimer')[sched['Active'] == 'true']
            revState = ('enabletimer','disabletimer')[sched['Active'] == 'true']

            if curState != SchedActivate:
                # Update domoticz request parameters
                dmtJsonActTimer['param'] = (SchedActivate, revState)[SchedActivate == 'reverse']
                dmtJsonActTimer['idx']   = sched['TimerID']

                # Send request...
                dmtJsonApi(dmtJurl, dmtJsonActTimer, logger)
On peut bien entendu tester via son navigateur préféré:

http://192.168.XXX.YYY:8080/json.htm?ty ... tschedules