Page 3 sur 4

Re: Activer un planning avec un script ?

Publié : 02 nov. 2016, 16:49
par n1c0l45
Oula! Merci pour toutes ces reponses! en plus avec le script qui va bien! c'est top !
Merci

Re: Activer un planning avec un script ?

Publié : 02 nov. 2016, 21:46
par papoo
@deennoo
je pense que j'ai rédigé mon exemple un peu vite, il doit te manquer des ' de chaque coté de ta timerID
je ne vois que cette différence par rapport à mon script complet qui fonctionne correctement

Code : Tout sélectionner

--[[
name : script_time_tous_les_volets.lua
auteur : papoo
version : 1.20
date de création : 08/08/2016
Date de mise à jour : 30/10/16
Principe : permet d'automatiser la gestion des volets roulants 
en fonction de l'heure de levé et couché du soleil
 et forte luminosité (fonction désactivée dans l'attente d'un capteur lux physique)
]]--

---------------------------------------------------------------------------
-- Les différents états d'un volet Stopped Open Closed
---------------------------------------------------------------------------
--------------------------------------------
------------ Variables à éditer ------------
-------------------------------------------- 

local debugging = true  			-- true pour voir les logs dans la console log Dz ou false pour ne pas les voir
local ip = '192.168.10.240:8080'   -- user:pass@ip:port de domoticz
local sonde_ext = 'Temperature exterieure' -- nom de la sonde de température extérieure
--local lumiere =  tonumber(otherdevices_svalues['Lux']) -- nom du bloc Lux de wheather underground
--local lux_max = tonumber(90000) -- seuil à parti duquel on ferme les volets en pleine journée
local delai_apres_leve_soleil = tonumber(75) -- delai en minutes pour l'ouverture des volets après levé du soleil
local delai_apres_couche_soleil = tonumber(45) -- delai en minutes pour la fermeture des volets après couché du soleil
local inter_vacances = ' Vacances' --Penser à créer un interrupteur Vacances valeur 'On' pour en vacances
local timerID ='2' -- id du timer douche
---------------------------------------------------------------------------
-- Tableau des volets
---------------------------------------------------------------------------
local les_volets = {};
-- 1ere volet : nom du device volet 1
les_volets[1] = {volet="Salon sur Rue", idx=361, Type="somfy"} -- Possibilité d'ajouter des équipements en relation, comme température piece, etat ouverture fenetre, etc (séparé par une  virgule)
-- 2eme volet : nom du device volet 2 
les_volets[2] = {volet="Salon sur Jardin", idx=362, Type="somfy"} -- exemple {volet="Salon sur Jardin", temperature="Temperature Salon", fenetre="Fenetre Salon sur Jardin"}
-- 3eme volet : nom du device volet 3
les_volets[3] = {volet="Cuisine", idx=363, Type="somfy"} -- La déclaration de l'idx {idx=xxx} ne sert qu'en cas d'utilisation de la commande via json, (ligne à décommenter)
-- 4eme volet : nom du device volet 4 
les_volets[4] = {volet="Chambre Parents", idx=364, Type="somfy"}
-- 5eme volet : nom du device volet 5 
les_volets[5] = {volet="Chambre 2", idx=365, Type="somfy"}
-- 6eme volet : nom du device volet 6 
les_volets[6] = {volet="Chambre 3", idx=473, Type="velux"}


--------------------------------------------
----------- Fin variables à éditer ---------
--------------------------------------------
local indexArray=0	
--------------------------------------------
---------------- Fonctions -----------------
-------------------------------------------- 
function voir_les_logs (s, debugging)
    if (debugging) then 
		if s ~= nil then
        print ("<font color='#f3031d'>".. s .."</font>")
		else
		print ("<font color='#f3031d'>aucune valeur affichable</font>")
		end
    end
end	
--------------------------------------------
-------------- Fin Fonctions ---------------
--------------------------------------------

commandArray = {}

if ( otherdevices['Vacances'] == 'On')	then
--activation du planning volet douche
commandArray[indexArray]={['OpenURL']=ip..'/json.htm?type=command&param=enabletimer&idx='.. timerID}
indexArray=indexArray+1
time=os.time()
local minutes=tonumber(os.date('%M',time))
local hours=tonumber(os.date('%H',time))
local NowInMinutes = hours * 60 + minutes;
if (minutes<10) then minutes='0'..minutes..'' end
if (hours<10) then hours='0'..hours..'' end

local now=''..hours..':'..minutes
local temperature_exterieure = otherdevices_temperature[sonde_ext]

print ("=========== Gestion Des Volets (v1.0) ===========")
voir_les_logs("--- --- --- Heure actuelle : "..now.."("..NowInMinutes..")",debugging)
voir_les_logs('--- --- --- Température extérieure : '..temperature_exterieure,debugging)
voir_les_logs("--- --- --- Heure de couché du soleil en minutes : "..timeofday['SunsetInMinutes'],debugging);
voir_les_logs("--- --- --- Heure de fermeture des stores en minutes : "..timeofday['SunsetInMinutes']+ delai_apres_couche_soleil,debugging)
voir_les_logs("--- --- --- Heure de levé du soleil en minutes : "..timeofday['SunriseInMinutes'],debugging);
voir_les_logs("--- --- --- Heure d'ouverture des stores en minutes : "..timeofday['SunriseInMinutes'] + delai_apres_leve_soleil,debugging)
--voir_les_logs("--- --- --- Lux : "..lumiere,debugging);

	for k,v in pairs(les_volets) do-- On parcourt chaque volet
voir_les_logs('--- --- ---',debugging);
 print ('--- --- --- Gestion du volet : '..v.volet)

voir_les_logs('--- --- --- Position du volet : '..otherdevices[v.volet],debugging)
-- Pendant la Journée
		if (tonumber(NowInMinutes) > timeofday['SunriseInMinutes'] + delai_apres_leve_soleil and tonumber(NowInMinutes) < timeofday['SunsetInMinutes'] + delai_apres_couche_soleil) then --Pendant la journée
voir_les_logs('--- --- --- Apres le levé du soleil',debugging)

			if ( otherdevices[v.volet]=='Closed' or otherdevices[v.volet]=='Stopped' )	then
				voir_les_logs ('--- --- --- Le volet : "'..v.volet..'" doit être ouvert',debugging)
				voir_les_logs ('--- --- --- Le volet dont l\'idx est : "'..v.idx..'" doit être Ouvert',debugging)
				 print('--- --- --- Le volet est Fermé ==> Ouverture');
				 --oss = "curl 'http://127.0.0.1:8080/json.htm?type=command&param=switchlight&idx='..v.idx..'&switchcmd=Off'
				 --os.execute(oss)
				
						if ( v.Type == "somfy") then
						commandArray[v.volet]='Off'
						else
						commandArray[v.volet]='On'
						end
				
			end
				--[[if ( lumiere > lux_max  )	then
				voir_les_logs ('--- --- --- Le volet : "'..v.volet..'" doit être fermé',debugging)
				-- voir_les_logs ('--- --- --- Le volet idx : "'..v.volet.idx..'" doit être fermé',debugging)
				 print('--- --- --- Le volet est ouvert ==> fermeture');
				--oss = "curl 'http://127.0.0.1:8080/json.htm?type=command&param=switchlight&idx='..v.idx..'&switchcmd=On'
				--os.execute(oss)
			
						if ( v.Type == "somfy") then
						commandArray[v.volet]='On'
						else
						commandArray[v.volet]='Off'
						end
							
				end]]--
		end
				
-- Pendant la Nuit	
		if (tonumber(NowInMinutes) < timeofday['SunriseInMinutes'] + delai_apres_leve_soleil or tonumber(NowInMinutes) > timeofday['SunsetInMinutes'] + delai_apres_couche_soleil) then --Pendant la nuit
voir_les_logs('--- --- --- Apres le couché du soleil',debugging)

			if ( otherdevices[v.volet]=='Open' or otherdevices[v.volet]=='Stopped' ) then
				voir_les_logs ('--- --- --- Le volet : "'..v.volet..'" doit être fermé',debugging)
				voir_les_logs ('--- --- --- Le volet dont l\'idx est : "'..v.idx..'" doit être Fermé',debugging)
				 print('--- --- ---Le volet est ouvert ==> fermeture')
				--oss = "curl 'http://127.0.0.1:8080/json.htm?type=command&param=switchlight&idx='..v.idx..'&switchcmd=On'
				--os.execute(oss)

						if ( v.Type == "somfy") then
						commandArray[v.volet]='On'
						else
						commandArray[v.volet]='Off'
						end

			end
		end
	end -- end For
voir_les_logs('--- --- ---',debugging);
print ("=========== Fin de gestion des volets ===========")
else
--désactivation du planning volet douche
commandArray[indexArray]={['OpenURL']=ip..'/json.htm?type=command&param=disabletimer&idx='.. timerID}
indexArray=indexArray+1
end -- if vacances

return commandArray 
n’hésite pas à me dire ce que tu ne comprend pas

Re: Activer un planning avec un script ?

Publié : 02 nov. 2016, 22:03
par papoo
Pourquoi le volet douche n'est pas actionné comme les autres me direz vous?
mon alim pilotant mes deux velux via un module IP VRT n'est pas assez puissante pour commander les deux volets en même temps. J'ai donc mis un planning sur ce volet pour la fermeture qui est actif toute l'année.
mais ma femme n'aime pas que le volet s'ouvre alors que nous ne somme pas levé. Ses horaires d'embauche variants souvent, difficile de "coller" avec ses horaires et plus sympa pour elle d'ouvrir lorsqu'elle le souhaite. mais du coup en mode vacances pas de planning d'ouverture. d'où cette fonction très utile pour n'activer le planning ouverture qu'en mode vacances hors de la maison. c'est un peu capillotracté comme résonnement mais cela me donne entière satisfaction. je compte encore améliorer mon script pour ajouter la gestion de la lumière extérieure via un capteur lux physique (quand je l'aurais fabriqué) ainsi qu'une future gestion d'actions manuelles pendant le mode vacances. exemple si quelqu'un passe arroser les plantes et souhaite ouvrir les volets alors qu'ils sont fermés via le script, actuellement ils vont se refermer en moins d'une minute. mais c'est pour plus tard, j'ai d'autres priorités et les vacances sont finies :?
vous noterez aussi que la commande de mes volets somfy est inversée par rapport à celle de mes velux, si vous souhaitez utiliser mon script prenez en compte cette particularité

Re: Activer un planning avec un script ?

Publié : 12 nov. 2016, 11:12
par lost
Bonjour,

Je m'inscris, débutant sous domoticz, car c'est aussi un truc qui me pose pb...

J'ai aussi ce problème d'activation/désactivation d'un planning complet par device. Bien vu l'API JSON qui permettrait de faire cela, mais le hic c'est qu'il s'agit de 6 radiateurs pilotés finement pour optimiser selon présence/optimiser l'usage heures creuses.
Et comme c'est un idx de timer par entrée de planning, c'est vraiment difficile (je dois en avoir une bonne dizaine par switch)! Pas question de faire un truc statique en prime, car les plannings peuvent être édités et les idx bouger.
Bref, sans doute possible en scriptant mais d'une je ne connais pas encore LUA et puis c'est quand même un manque dans l'API json que de ne pas pouvoir invalider cela par device.
Il y a bien le planning normal/vacances, mais c'est insuffisant. Plus de plannings alternatifs seraient sans doute une autre manière de faire d'ailleurs.

Sur le forum en anglais, j'ai posé aussi la question... et vu un manip tapant directement dans la BD de domoticz mais pas sain de le faire dans son dos. D'ailleurs, je pense que domoticz a un cacha de cette BD (pour de temps en temps écrire les données de graphe etc) car parfois, toutes les invalidations en direct via la BD se retrouvent ré-activées!

Bref, s'il y a une solution à laquelle je n'ai pas pensé... merci de m'en faire part!

Cdt

Re: Activer un planning avec un script ?

Publié : 17 janv. 2017, 01:01
par Damsee
Merci Papoo ! Ton exemple de script m'a bien aidé pour la gestion de mon mode "Vacances" ;)

Je vous pose mon adaptation du script si cela peut intéresser qqun.
Par contre et pour répondre à lost, mes plannings et idx sont fixes mais cela me convient car je ne les change par tous les jours

Code : Tout sélectionner

-- script_device_Vacances.lua

---------------
-- Variables --
---------------
local ip = '127.0.0.1:8080'
local indexArray = 0
commandArray = {}
local schedules = {};
schedules[1] = {name="Radiateur Salon", idx=16, time="07.30"}
schedules[2] = {name="Radiateur Salon", idx=17, time="09.30"}
schedules[3] = {name="Radiateur Salon", idx=18, time="17.00"}
schedules[4] = {name="Radiateur Salon", idx=19, time="23.30"}
schedules[5] = {name="Radiateur Salon", idx=20, time="08.30"}
schedules[6] = {name="Radiateur SDB", idx=21, time="07.00"}
schedules[7] = {name="Radiateur SDB", idx=22, time="09.00"}
schedules[8] = {name="Radiateur SDB", idx=23, time="08.30"}
schedules[9] = {name="Radiateur SDB", idx=24, time="10.30"}


if devicechanged['Vacances'] == 'On' then
 for k,v in pairs(schedules) do
  commandArray[indexArray]={['OpenURL']=ip..'/json.htm?type=command&param=disabletimer&idx='.. v.idx}
  indexArray=indexArray+1
  print("Disabling timer for ".. v.name .." at ".. v.time)
 end
elseif devicechanged['Vacances'] == 'Off' then
 for k,v in pairs(schedules) do
  commandArray[indexArray]={['OpenURL']=ip..'/json.htm?type=command&param=enabletimer&idx='.. v.idx}
  indexArray=indexArray+1
  print("Enabling timer for ".. v.name .." at ".. v.time)
 end
end

return commandArray

Re: Activer un planning avec un script ?

Publié : 17 janv. 2017, 09:44
par lost
Damsee a écrit : Par contre et pour répondre à lost, mes plannings et idx sont fixes mais cela me convient car je ne les change par tous les jours
Hello,

Depuis j'avais fait ceci:
http://www.domoticz.com/forum/viewtopic ... 05#p109305

L'avantage, c'est que c'est générique. La liste des IDX timer, par périphérique sous planning, est construite dynamiquement. Donc les plannings peuvent changer, tant que le nom du périh ne change pas cela continuera à fonctionner.

En plus, si on a une convention de nommage, les wildcards dans les noms étant acceptés on peut grouper et par exemple valider/invalider les plannings "radiateur*" en 1 seule commande.

J'ai rajouté un peu de complexité, pas forcément utile à tous et qui peut se supprimer le cas échéant, pour ré-activation automatique (perfectible, sans doute que je ferais évoluer cela pour que tout soit dans le script python et non séparé dans un time lua).

En, fait j'utilise ceci via un switch sélecteur qui invalide les plannings et arrête les radiateurs pour des durées de 3/6/9/12h. Ce qui me sert quand je mets la cheminée en route.

Re: Activer un planning avec un script ?

Publié : 17 janv. 2017, 22:06
par papoo
:D

Re: Activer un planning avec un script ?

Publié : 06 févr. 2017, 16:40
par JRCondat
Y'a pas comme un bug dans l'API Json ?
Lorsque je fais :

Code : Tout sélectionner

http://chezmoi.com/json.htm?type=schedules
La réponse est :

Code : Tout sélectionner

{
   "result" : [
      {
         "Active" : "true",
         "Date" : "",
         "Days" : 128,
         "DevName" : "Fermeture des volets",
         "DeviceRowID" : 1,
         "Hue" : 0,
         "IsThermostat" : "false",
         "Level" : 100,
         "MDay" : 0,
         "Month" : 0,
         "Occurence" : 0,
         "Randomness" : "false",
         "ScheduleDate" : "2017-02-06 18:29:00",
         "Time" : "00:30",
         "TimerCmd" : 0,
         "TimerID" : 2,
         "TimerType" : 4,
         "TimerTypeStr" : "After Sunset",
         "Type" : "Scene"
      },
      {
         "Active" : "true",
         "Date" : "",
         "Days" : 27,
         "DevName" : "Ouverture des volets",
         "DeviceRowID" : 3,
         "Hue" : 0,
         "IsThermostat" : "false",
         "Level" : 100,
         "MDay" : 0,
         "Month" : 0,
         "Occurence" : 0,
         "Randomness" : "false",
         "ScheduleDate" : "2017-02-07 08:35:00",
         "Time" : "08:35",
         "TimerCmd" : 0,
         "TimerID" : 4,
         "TimerType" : 2,
         "TimerTypeStr" : "On Time",
         "Type" : "Scene"
      },
      {
         "Active" : "false",
         "Date" : "",
         "Days" : 128,
         "DevName" : "Ouverture des volets SIMULATEUR",
         "DeviceRowID" : 2,
         "Hue" : 0,
         "IsThermostat" : "false",
         "Level" : 100,
         "MDay" : 0,
         "Month" : 0,
         "Occurence" : 0,
         "Randomness" : "true",
         "ScheduleDate" : "",
         "Time" : "08:30",
         "TimerCmd" : 0,
         "TimerID" : 1,
         "TimerType" : 2,
         "TimerTypeStr" : "On Time",
         "Type" : "Scene"
      }
   ],
   "status" : "OK",
   "title" : "Schedules"
}
Et donc quand je veux désactiver un planning dans le cas présent le 4, je fais :

Code : Tout sélectionner

http://chezmoi.com/json.htm?type=command&param=disabletimer&idx=4
En retour j'ai ce qu'il y a ci-dessous mais le planning ne passe pas à false pour autant :(

Code : Tout sélectionner

{
   "status" : "OK",
   "title" : "DisableTimer"
}

Re: Activer un planning avec un script ?

Publié : 08 févr. 2017, 09:54
par lost
JRCondat a écrit :Y'a pas comme un bug dans l'API Json ?
(...)
Et donc quand je veux désactiver un planning dans le cas présent le 4, je fais :

Code : Tout sélectionner

http://chezmoi.com/json.htm?type=command&param=disabletimer&idx=4
En retour j'ai ce qu'il y a ci-dessous mais le planning ne passe pas à false pour autant :(

Code : Tout sélectionner

{
   "status" : "OK",
   "title" : "DisableTimer"
}
Pourtant, ca semble correct et le switch "Ouverture des volets" devrait voir sa ligne de planning de 8h35 invalidée (et elle seule, attention: 1 ligne planning=1 idx timer).
Maintenant, je n'utilises pas de scenes et gère tous les matériels séparément. Donc si bug il y a c'est peut-être lié à cette particularité?

Re: Activer un planning avec un script ?

Publié : 09 mars 2018, 16:27
par Poirs
Bonjour,
J'ai configuré ma commande:
"http://192.168.200.21:8080/json.htm?typ ... mer&idx=16"
elle fonctionne très bien, par contre j'ai configuré un interrupteur ça ne fonctionne pas
Capture.JPG
Capture.JPG (40.76 Kio) Consulté 8582 fois
Une idée?
Merci