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

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 <\>.
JuGuSm
Messages : 20
Inscription : 16 sept. 2018, 15:00

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

Message 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.
david.2d
Messages : 21
Inscription : 25 avr. 2017, 14:15

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

Message par david.2d »

Hello,

Tu peut utiliser l'Idx
mma13
Messages : 18
Inscription : 15 sept. 2018, 15:59

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

Message par mma13 »

Bonjour,

Je trouve la remarque de JuGuSm bien fondée. Comment utiliser l'idx david.2d ?
Merci
Raspberry Pi 3B - Raspbian GNU/Linux 9.4 (stretch)
Domodicz 4.9700 - RFLink USB 433,42 MHz - RFLink Wifi 433,92 MHz (V1.1 - R48)
Stores SOMFY - AVR-X4100W DENON - OTIO EHS-5050 - ESPEasy mega-20180517 (plusieurs types)
Neutrino
Messages : 2662
Inscription : 10 juil. 2015, 15:42
Localisation : Les Herbiers(85)

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

Message 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
Ma maison à plein d'IP ! :mrgreen:
SAV Bonjour. Vous avez vidé le cache ?
vil1driver
Messages : 5661
Inscription : 30 janv. 2015, 11:07
Localisation : Rennes (35)

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

Message 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 ;)
MAJ = VIDER LE CACHE(<-Clicable)
/!\Les mises à jour de Domoticz sont souvent sources de difficultés, ne sautez pas dessus
modules.lua

Un ex domoticzien
jackslayter
Messages : 1040
Inscription : 30 sept. 2014, 14:40
Localisation : Isère (38)

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

Message 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
Raspberry Pi + RFLink + Domoticz Beta
Oregon - 3x Thgr122Nx / Chacon - micromodule 200w, télécommande 3b et 16b, 2x module 1000w, détecteur de fumée, contact de porte, 2x prise 3500w / OWL - CM180 / TRC02 v2 RGB 3M / Cheap - PIR, contact de porte
mma13
Messages : 18
Inscription : 15 sept. 2018, 15:59

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

Message 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é 5779 fois
et je ne sais pas trop comment les traiter : en string, en tableau... je n'ai pas encore suffisamment travaillé la-dessus...
Raspberry Pi 3B - Raspbian GNU/Linux 9.4 (stretch)
Domodicz 4.9700 - RFLink USB 433,42 MHz - RFLink Wifi 433,92 MHz (V1.1 - R48)
Stores SOMFY - AVR-X4100W DENON - OTIO EHS-5050 - ESPEasy mega-20180517 (plusieurs types)
JuGuSm
Messages : 20
Inscription : 16 sept. 2018, 15:00

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

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