Page 1 sur 1

Intéragir avec un périphérique autrement qu'avec son nom ?

Publié : 18 sept. 2018, 23:36
par JuGuSm
Bonjour,

Je commence à écrire des scripts en lua et je me rend compte que j'utilise toujours le nom de mes périphériques pour intéragir avec.

Exemple :

Code : Tout sélectionner

commandArray['Volet séjour 1'] = "On"
Je me disais que si je renomme mon périphérique, mes scripts ne vont plus fonctionner !

Je sais qu'avec les blocky c'est mis à jour automatiquement mais avec les scripts lua non visiblement...

Est-il possible d'utiliser autre chose que le nom ?

Merci.

Re: Intéragir avec un périphérique autrement qu'avec son nom ?

Publié : 25 sept. 2018, 09:19
par david.2d
Hello,

Tu peut utiliser l'Idx

Re: Intéragir avec un périphérique autrement qu'avec son nom ?

Publié : 26 sept. 2018, 10:20
par mma13
Bonjour,

Je trouve la remarque de JuGuSm bien fondée. Comment utiliser l'idx david.2d ?
Merci

Re: Intéragir avec un périphérique autrement qu'avec son nom ?

Publié : 26 sept. 2018, 20:22
par Neutrino
Bonjour,
L'IDX est un identifiant unique pour chaque dispositif.
Ils se trouvent dans Réglages>Dispositifs
Voici quelques exemple d'utilisations avec l'Idx :

Code : Tout sélectionner

commandArray[textDeviceIdx] = { ['UpdateDevice'] = textDeviceIdx..'|0|'..'some text' }
commandArray[tempDeviceIdx] = { ['UpdateDevice'] = tempDeviceIdx..'|0|'..temp }
commandArray[tempHumDevIdx] = { ['UpdateDevice'] = tempHumDevIdx..'|0|'.. temp ..';'.. hum ..';'.. hum_stat }
Plus d'info sur le wiki : http://www.domoticz.com/wiki/Events

Re: Intéragir avec un périphérique autrement qu'avec son nom ?

Publié : 26 sept. 2018, 22:43
par vil1driver
Salut,

De mémoire cela ne fonctionne pas pour un switch, ce dernier ne voyant que sont status mis à jour mais aucun ordre n'est envoyé (sauf erreur).

Ca ne fait donc pas le taf, heureusement que l'on ne renomme pas tous les jours ;)

Re: Intéragir avec un périphérique autrement qu'avec son nom ?

Publié : 27 sept. 2018, 08:16
par jackslayter
effectivement pas possible par cette commande mais avec la commande API JSON c'est possible

Code : Tout sélectionner

os.execute('/usr/bin/curl -m 15 "http://ADRESSEIP/json.htm?type=command&param=switchlight&idx=999999&switchcmd=Off
mais c'est un peu lourd

Re: Intéragir avec un périphérique autrement qu'avec son nom ?

Publié : 27 sept. 2018, 10:34
par mma13
Merci pour les réponses en m'inspirant de https://www.domoticz.com/forum/viewtopi ... 36#p144720

J'ai fait ce script qui me permet de me servir de l'IDX d'un switch également :

Code : Tout sélectionner

-- mma13 - 26/09/2018 ----------------------------------------------------------
-- Ce script compare régulièrement la consommation d'une prise à une consigne
-- Si la consommation est inférieure à la consigne l'alimentation est coupée
--------------------------------------------------------------------------------

-- Variables locales -----------------------------------------------------------
local delai = 5         -- nombre de minutes entre deux tests
local consigne = 30     -- consigne de consomation minimale en Watt
local watt              -- reçoit la mesure en Watt
local capteurIdx = 169  -- index du device qui mesure la puissance
local priseIdx = 99     -- index du device qui pilote la prise
local devName              -- reçoit le nom du device
--------------------------------------------------------------------------------
commandArray = {}

-- Fonction getDevNameByIdx ----------------------------------------------------
-- Cette fonction retourne :
-- - Le nom d'un device à partir de son IDX s'il existe
-- - 0 si l'IDX n'existe pas
--------------------------------------------------------------------------------
function getDevNameByIdx(devIdx)
   for i, v in pairs(otherdevices_idx) do
      if v == devIdx then
         return i
      end
   end
   return 0
end
--------------------------------------------------------------------------------

time = os.date("*t")
if ((time.min) % delai) == 0 then -- toutes les 'delai' minutes 
    devName=getDevNameByIdx(capteurIdx)
    if (devName~=0) then
        print ("Gestion consommation "..devName);
        -- cherche le device concerné
        for deviceName,deviceValue in pairs(otherdevices) do
            if (deviceName==devName) then
                -- print("DeviceValue : "..deviceValue)
                watt = string.sub(deviceValue,1,4)
                watt = tonumber(watt) / 10
                if (watt <= consigne) then
                    print("Coupure prise "..devName)
                    -- Coupure à gérer
                    commandArray[getDevNameByIdx(priseIdx)] = "Off"
                else
                    print("Puissance "..devName.." : "..watt.." W")
                end
            end
        end
    end
end

return commandArray
... je débuté sur Domoticz, les scripts et LUA... mais ça fonctionne... j'ai juste fait un truc empirique :

Code : Tout sélectionner

watt = string.sub(deviceValue,1,4)
watt = tonumber(watt) / 10
parce que je récupère 2 valeurs :
device.value.JPG
device.value.JPG (10.4 Kio) Consulté 5783 fois
et je ne sais pas trop comment les traiter : en string, en tableau... je n'ai pas encore suffisamment travaillé la-dessus...

Re: Intéragir avec un périphérique autrement qu'avec son nom ?

Publié : 27 sept. 2018, 21:53
par JuGuSm
Hello,

Après quelques recherches voici une fonctions que j'utilise :

Code : Tout sélectionner

-----------------
-- IDX2DevName --
-----------------
-- Get device name from IDX
function MyFunctions.IDX2DevName(IDX)
	for i, v in pairs(otherdevices_idx)
		do if v == IDX
			then return i
		end
	end
	return 0
end
J'ai ajouté cette fonction à mon fichier de fonctions que j'appelle à chaque début de script de cette façon :

Code : Tout sélectionner

--------------------
-- LOAD FUNCTIONS --
--------------------
package.path = package.path .. ';' .. '/home/domoticz/domoticz/scripts/lua/functions.lua'
F = require('functions')
Et voici un exemple de la façon dont j'appelle ma fonction dans mes scripts :

AVANT :

Code : Tout sélectionner

commandArray['Prise_n3'] = 'On'
APRÈS :

Code : Tout sélectionner

commandArray[F.IDX2DevName(13)] = 'On'