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
désactivé une ligne de planning d'un bouton
-
Herve Waty
- Messages : 15
- Inscription : 14 déc. 2020, 19:48
Re: désactivé une ligne de planning d'un bouton
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...
Si convention de nommage/prefixe, wildcards possible à l'usage, par exemple pour activer plannings tous radiateurs chambres chez moi:
./scheduleMod.py -nRadiateur\ Ch* -son
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:])
./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
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¶m=disabletimer&idx=YY")
Pour passer une ligne de planification a OUI
dz.openURL("http://X.X.X.X:XXXX/json.htm?type=command¶m=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
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¶m=disabletimer&idx=YY")
Pour passer une ligne de planification a OUI
dz.openURL("http://X.X.X.X:XXXX/json.htm?type=command¶m=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
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
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