Page 1 sur 1

[Résolu]-DZVENTS- compréhension - préambule du script et data persistantes

Publié : 27 mai 2024, 19:13
par AchilleTalon
Bonjour à tous,

J'utilise domoticz et les scripts dzvents depuis déjà un bon moment, jusqu'à présent avec très peu de soucis ou de limitations (je ne suis pas allergique au code, quel que soit le langage).

Je me retrouve embêté par un cas d'application peut-être trop tordu, et peut-être même qu'il existe une meilleure solution, mais je me lance dans ma description.

Pour simplifier la gestion des plans, des devices, des matériels, j'utilise beaucoup de devices virtuels définis une fois pour toutes (InterrupteurSalon) et j'utilise un script pour associer chaque dummy avec un vrai device (exemple: Shelly1PM-Cuisine). Je m'en sers pour beaucoup de devices de types et d'origines différents : interrupteurs (beaucoup de Shelly, mais aussi des devices zigbee), détecteurs de mouvement (zigbee ou issus de mes caméras), ...

Vu le nombre et la variété de devices, j'utilise des tables de correspondance, j'y reviens juste après.

Pour que le script fonctionne, j'ai besoin de la liste de tous les devices (virtuels ou vrais), de leur statut ("virtuel" ou "vrai") mais aussi de leur association).

Voici à quoi ressemble mon script, avec pas mal de travail dans le préambule du script :

Code : Tout sélectionner

PairesVirtuels = {
-- les associations uniques
 ['InterrupteurCuisine']    = "Shelly1PM-Cuisine",
 ['LEDSalon']                     = "Zigbee-LED1",
-- etc
}

-- association spécifiques aux caméras : deux devices par caméra
for i, alias in pairs( {
  ['1']  = 'Entree',
  ['2'] = 'Garage', 
  -- etc
  } ) do
    for _, accessoire in ipairs( {'ModeConfidentiel-', 'Detecteur-'}) do
      PairesVirtuels[accessoire.. alias] = 'VRAI-'.. accessoire .. i
    end
end

-- les différents tables de correspondance :
isReal = {}
AllDevices = {}
for k,v in pairs(PairesVirtuels) do
    table.insert(AllDevices, k)
    table.insert(AllDevices, v)
    isReal[v] = True
    isReal[k] = False
end

-- symmetrisation de la table pour avoir la correspondance dans les deux sens
for k,v in pairs(PairesVirtuels) do
    PairesVirtuels[v] = k
end


return {
    on = { devices = AllDevices }
    execute = function(domoticz, trigger)
       -- traitements generiques pour assurer la synchro
       -- j'utilise PairesVirtuels pour retrouver le "jumeau" et isReal pour savoir qui est le vrai device
    end
}

Mon problème :
parfois, certains devices se retrouvent dans la liste des triggers, mais ne sont plus dans les tables de correspondance. Le script plante en me disant que la valeur correspondante dans la table est nil (en gros, clé pas trouvée dans la table), et je ne peux plus accéder

J'ai essayé d'utiliser des data persistantes, sans problème de mise en oeuvre mais sans succès (même problème au final).

D'où mes questions :
- quand et combien de fois est exécuté le préambule des scripts dzvents ?
- comment gérer ce problème de data persistantes définies dans le préambule ?
- y a-t-il un meilleur moyen de générer ces données, sachant que je veux éviter de devoir répéter des infos à plusieurs endroits ?

J'ai regardé du côté des devices esclaves, mais il m'a semblé que ça ne pouvait pas m'aider.

Désolé si je n'arrive pas à expliquer mieux mon soucis. N'hésitez pas à poser des questions si vous pensez pouvoir m'aider là-dessus, j'ai toujours réussi à intéresser assez de personnes pour m'aider à résoudre mes soucis, ce qui me rend encore plus attaché à domoticz, tout ce qui tourne autour mais aussi ce forum.

Par avance, merci pour votre aide

Re: [DZVENTS] compréhension - préambule du script et data persistantes

Publié : 27 mai 2024, 20:59
par Keros
J'ai fait une gestion similaire en définissant directement un tableau :

Code : Tout sélectionner

action['Btn 1'] = {} 
action['Btn 2'] = {}
action['Btn 3'] = {'Prise 3', 'Prise 4'}
action['Btn 4'] = {}
action['Btn 5'] = {}
action['Btn 6'] = {'Prise 1', 'Prise 2'}
action['Btn 7'] = {'Lampe 1', 'Lampe 3'}
            
on = {
		devices = {'Btn *', }
	},
C'est peut-être trop simpliste par rapport à ton besoin, mais il me semble que je n'ai jamais eu de raté.

Re: [DZVENTS] compréhension - préambule du script et data persistantes

Publié : 28 mai 2024, 08:01
par AchilleTalon
Merci pour ta réponse.

Par rapport à ton exemple, ce que j'essaie de faire me paraît un peu plus complexe : j'essaie d'avoir une correspondance dans les deux sens (virtuel <-> réel) pour garder la synchro entre les deux (l'action peut avoir été initiée d'un côté ou de l'autre).

***
UPDATE :
***
Lorsque j'affiche mon tableau PairesVirtuels, il n'est pas toujours le même ! Parfois 30 entrées, parfois 36, parfois jusqu'à 49. Ca ressemble donc bien à une question d'initialisation, de data persistante, ... dans les dzvents.

Comment initialiser correctement ces tableaux, conserver leurs valeurs, ... ? De façon efficace mais aussi fonctionnelle ?
Comment créer des données "globales" puis les utiliser dans les scripts dzvents, notamment pour les triggers ?

Re: [DZVENTS] compréhension - préambule du script et data persistantes

Publié : 28 mai 2024, 12:48
par Keros
Regarde du coté des gobal data pour partager des choses entre scripts. Je l'utilise pour des fonctions (envoi de notification par exemple) mais ça doit être aussi possible d'y mettre des persistant data et les récupérer dans tes scripts.

Re: [DZVENTS] compréhension - préambule du script et data persistantes

Publié : 29 mai 2024, 09:18
par AchilleTalon
J'ai trouvé : erreur de ma part. On ne peut pas modifier une table sur laquelle on est en train de boucler.


Ce bout de code génère un comportement aléatoire :

Code : Tout sélectionner

-- symmetrisation de la table pour avoir la correspondance dans les deux sens
for k,v in pairs(PairesVirtuels) do
    PairesVirtuels[v] = k
end
En symmétrisant la table différemment (sans boucler sur la table elle-même), tout fonctionne.

Au final, j'ai également testé les data globales, les helpers, ... et tout ça me permet également de faire ce que je veux, à un détail près : seuls les helpers peuvent être utilisés dans la définition des trigger (partie "on = { devices = ...").

Merci pour votre aide, vos suggestions. J'ai corrigé mon problème et j'ai encore appris un peu plus.