Page 1 sur 1

désactivé une ligne de planning d'un bouton

Publié : 07 sept. 2023, 19:42
par Herve Waty
Bonjour,
Sur changement d'état d'un bouton, je recherche a passer une ou plusieurs ligne de planning non actif ou inversement.
j'ai bien trouvé les caractéristiques de la ligne de planning que je veux modifier.
"Active": "true",
"Color": "",
"Date": "",
"Days": 512,
"DevName": "Volet Sejour avant",
"DeviceRowID": 185,
"IsThermostat": "false",
"Level": 100,
"MDay": 0,
"Month": 0,
"Occurence": 0,
"Randomness": "false",
"ScheduleDate": "2023-09-07 21:06:00",
"Time": "21:06",
"TimerCmd": 1,
"TimerID": 57,
"TimerType": 2,
"TimerTypeStr": "On Time",
"Type": "Device"
je cherche la commande du même style que pour un bouton (dz.devices(205).switchOff()).
Merci pour vos réponse

Re: désactivé une ligne de planning d'un bouton

Publié : 09 sept. 2023, 11:49
par lost
J'ai un truc dans le genre, mais pas par ligne. C'est validation/invalidation globale d'un planning.
Je m'en sers pour mes plannings radiateurs.

Ça fait un exemple en python...

Code : Tout sélectionner

#!/usr/bin/env python
# -*- coding: utf-8 -*-
#
# Schedule activation modification for device (with wildcards support)
# Date for state change, if an 'hour' parameter is given, is stored in
# a user var than can be checked by a lua time script that'll reverse current state...
#
# Changelog :
# 17/12/2016, YL, 1st version.
# 07/01/2023, Pylint checks/python3 support
# 23/06/2023, JSON API change for dmtJsonGetSched.

import getopt
import logging
import json
import sys
import datetime
from   fnmatch  import fnmatch
import requests

#####################
# EDITABLE SETTINGS #
#####################

logLevel='INFO' # DEBUG / INFO

# 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"}
dmtJsonActTimer = {"type":"command", "param":"enabledisabletimer", "idx":"999"}
dmtJsonUpdVar   = {"type":"command", "param":"updateuservariable",
                   "vname":"reverseSchedule", "vtype":2, "vvalue":0}

# Domoticz time format on LUA side:
dmtLuaTimeFmt   = "%Y-%m-%d %H:%M:%S"

#####################
def usage():
    """
    Display usage
    """

    sys.stderr.write( "Usage: ScheduleMod.py [-h] [-s<on/off>] [-t<timeInMn>] -n<device>\n")
    sys.stderr.write( "       If no 's', current state is reversed.\n")
    sys.stderr.write( "       If    't', a time for state reversal (mn) is stored for domoticz.\n")

#####################
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()

#####################
def main(argv):
    """
    Main
    """

    logging.basicConfig()
    logger = logging.getLogger()
    handler = logging.StreamHandler(sys.stdout)

    # Checks the parameters
    try:
        opts, args = getopt.getopt(argv, "h:s:n:t:",["help","state","name","time"])
    except getopt.GetoptError:
        usage()
        sys.exit(2)

    # Defaults
    SchedActivate = 'reverse'
    devName       = 'nil'
    reverseTimeMn = 0

    for o, a in opts:
        if o in ("-h", "--help"):
            usage()
            sys.exit()
        if o in ("-s", "--state" ):
            SchedActivate=('disabletimer','enabletimer')[a == 'on']
        if o in ("-n", "--name" ):
            devName=a
        if o in ("-t", "--time" ):
            reverseTimeMn=int(a)

    # Configure the logger
    handler.setFormatter(
        logging.Formatter('%(asctime)s - %(levelname)s - %(message)s'))
    logger.setLevel(logLevel)

    logger.log(logging.INFO, "Device(s)=%s, update schedules to '%s', reverse after %dmn." %(devName, SchedActivate, reverseTimeMn))

    # Get all schedules
    schedules = dmtJsonApi(dmtJurl, dmtJsonGetSched, logger)
    #logger.log(logging.DEBUG, "Schedules: [%s]" % (schedules))

    # 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)

    # Set user var to current date + time given for reversal (in mn), if any...
    if reverseTimeMn != 0:
        revDate = datetime.datetime.now() + datetime.timedelta(minutes=reverseTimeMn)
        revDate = devName + ';' + revDate.strftime(dmtLuaTimeFmt)
        logger.log(logging.DEBUG, "Reverse time stored for Domoticz : %s", revDate)
        dmtJsonUpdVar['vvalue'] = revDate
        dmtJsonApi(dmtJurl, dmtJsonUpdVar, logger)
    else:
        dmtJsonUpdVar['vvalue'] = 'nil'
        dmtJsonApi(dmtJurl, dmtJsonUpdVar, logger)

    # Happy ending!
    logger.log(logging.INFO, "DONE !")

if __name__ == "__main__":
    main(sys.argv[1:])
Si convention de nommage/prefixe, wildcards possible à l'usage, par exemple pour activer plannings tous radiateurs chambres chez moi:

./scheduleMod.py -nRadiateur\ Ch* -son

Re: désactivé une ligne de planning d'un bouton

Publié : 16 sept. 2023, 11:13
par Herve Waty
Bonjour,
Merci pour ta réponse, j'ai trouve un solution:

Pour passer une ligne de planification a NON
dz.openURL("http://X.X.X.X:XXXX/json.htm?type=command&param=disabletimer&idx=YY")

Pour passer une ligne de planification a OUI
dz.openURL("http://X.X.X.X:XXXX/json.htm?type=command&param=enabletimer&idx=YY")

Pour trouver YY
Passer la commande
http://X.X.X.X:XXXX/json.htm?type=schedules
Le résultat est:
"Active": "true",
"Color": "",
"Date": "",
"Days": 512,
"DevName": "Volet Bureau",
"DeviceRowID": 181,
"IsThermostat": "false",
"Level": 100,
"MDay": 0,
"Month": 0,
"Occurence": 0,
"Randomness": "false",
"ScheduleDate": "2023-09-17 08:16:00",
"Time": "08:16",
"TimerCmd": 0,
"TimerID": 49,
"TimerType": 2,
"TimerTypeStr": "On Time",
"Type": "Device"

Pour ID =181 YY =TimerID; est 49

Re: désactivé une ligne de planning d'un bouton

Publié : 21 sept. 2023, 23:18
par pierrotori
attention de bien aller rechercher l’id du timer actuel car si demain tu le supprimes et tu le recrées il n’aura pas le même id
j’ai fait ca pour désactiver le volet quand la porte est ouverte
c’est encore plus vrai si tu as des planning différents entre le week end et la semaine