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

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 <\>.
Herve Waty
Messages : 15
Inscription : 14 déc. 2020, 19:48

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

Message 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
lost
Messages : 1511
Inscription : 12 nov. 2016, 11:01

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

Message 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
Herve Waty
Messages : 15
Inscription : 14 déc. 2020, 19:48

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

Message 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
pierrotori
Messages : 821
Inscription : 29 févr. 2016, 12:11

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

Message 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
Répondre