Table et condition

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 <\>.
landaisbenj
Messages : 695
Inscription : 12 mars 2017, 19:24

Table et condition

Message par landaisbenj »

Bonjour a tous.

Je souhaite travailler sur une table pour raccourcir mon code.
Par exemple pour verifier que tous les contacts de ma maison sont 'Closed' je les mets tous a la suite dans ma condition:

Code : Tout sélectionner

if od['Contact Garage']=='Closed' and od['Contact Entree']=='Closed' and od['Contact Baie']=='Closed' and od['Contact Baie 2']=='Closed' then
Je souhaiterai les travailler en table, mais je ne sais pas comment traiter facilement la table derriere.
Avec une boucle ou avec une methode lua.

Si je fais une table avec le nom de mes contacts:

Code : Tout sélectionner

local contact={}
table.insert(contact,{'Contact Garage'})
table.insert(contact,{'Contact Entree'})
table.insert(contact,{'Contact Baie'})
table.insert(contact,{'Contact Baie 2'})
Comment je peux faire en gros pour dire:

Code : Tout sélectionner

if contact=='Closed' then
Merci pour vos réflexions.

[EDIT]: Je pourrai aussi faire une table avec directement la valeur des devices au lieu de leurs noms:

Code : Tout sélectionner

local contact={}
table.insert(contact,{otherdevices['Contact Garage']})
table.insert(contact,{otherdevices['Contact Entree']})
table.insert(contact,{otherdevices['Contact Baie']})
table.insert(contact,{otherdevices['Contact Baie 2']})
Rpbi3b: Domoticz + Homebridge + Monit + Freebox scripts + Shellinabox; Rpbi2: Jarvis
Domoticz: Derniere stable; RFLINK: Dernière stable; Xiaomi Gateway
Jeff
Messages : 1007
Inscription : 17 nov. 2016, 20:54
Localisation : Rennes (35)

Re: Table et condition

Message par Jeff »

Je pense que tu vas trouver ta réponse ici : https://easydomoticz.com/forum/viewtopi ... 104#p37917
Version: 2023.1 sur VM Synology, docker Zwave Js UI (Z-stick GEN5, Fibaro...), Zigbeefordomoticz. Nextion RGB Led Screen
landaisbenj
Messages : 695
Inscription : 12 mars 2017, 19:24

Re: Table et condition

Message par landaisbenj »

Jeff a écrit :Je pense que tu vas trouver ta réponse ici : https://easydomoticz.com/forum/viewtopi ... 104#p37917

A ouais un calcul j'avais pensé a cette solution. Mais je trouvais ca bien lourd juste pour verifier une table.

Je pensais plus a une autre fonction comme la boucle ou une methode lua. Mais merci pour l'info. En dernier recours je la rentrerai dans mon modules
Rpbi3b: Domoticz + Homebridge + Monit + Freebox scripts + Shellinabox; Rpbi2: Jarvis
Domoticz: Derniere stable; RFLINK: Dernière stable; Xiaomi Gateway
Jeff
Messages : 1007
Inscription : 17 nov. 2016, 20:54
Localisation : Rennes (35)

Re: Table et condition

Message par Jeff »

Je ne comprends pas ta réponse car le script parcourt un tableau avec une boucle for. Exactement ce que tu cherches !
Après il te sort le device qui a changé d'état.
Version: 2023.1 sur VM Synology, docker Zwave Js UI (Z-stick GEN5, Fibaro...), Zigbeefordomoticz. Nextion RGB Led Screen
landaisbenj
Messages : 695
Inscription : 12 mars 2017, 19:24

Re: Table et condition

Message par landaisbenj »

Oui ça me va très bien. Mais je pensai qu'il existait une méthode lua pour faire cela...

Par exemple je cherche aussi autre chose pour sortir la valeur minimum d'une table:

Normalement je devrais pouvoir faire print(math.min(table.unpack(contact, {89,684,5,2,55}))). Cela devrait retourner juste:2
Ici, c'est deux methode lua en une seule ligne: table.unpack sort toutes les valeurs de la table et math.min récupère la valeur minimum de ce retour.

Et bien je pensai qu'il existait cela dans domoticz pour chaîne. (mais évidement la méthode unpack ne fonctionne pas dans domoticz donc je galère dans mes deux problème)

En contre exemple pour ce qui m'interresse dans ce poste la, il existe une methode string.find qui permet de retourner le nombre de fois qu'un modele est transcrit. Je pensai faire unpack et ensuite faire un string.match et compter le nombre de fois ou 'closed' est ecrit. En le comparant avec le nombre de valeur de la table cela permet de savoir si la table est complètement closed ou pas. Et tout ca en deux lignes seulement!!!

Sauf que unpack ne fonctionne pas :(
Rpbi3b: Domoticz + Homebridge + Monit + Freebox scripts + Shellinabox; Rpbi2: Jarvis
Domoticz: Derniere stable; RFLINK: Dernière stable; Xiaomi Gateway
Jeff
Messages : 1007
Inscription : 17 nov. 2016, 20:54
Localisation : Rennes (35)

Re: Table et condition

Message par Jeff »

Ouh là tu m'as perdu.
@Vil1driver va te sortir une formule du chapeau :?
Version: 2023.1 sur VM Synology, docker Zwave Js UI (Z-stick GEN5, Fibaro...), Zigbeefordomoticz. Nextion RGB Led Screen
landaisbenj
Messages : 695
Inscription : 12 mars 2017, 19:24

Re: Table et condition

Message par landaisbenj »

lol désolé. J'ai presque reussi mais j'ai toujours un probleme avec unpack qui ne fonctionne pas sur domoticz.

Je sais pas pourquoi d'ailleurs...

Je continu mes investigations
Rpbi3b: Domoticz + Homebridge + Monit + Freebox scripts + Shellinabox; Rpbi2: Jarvis
Domoticz: Derniere stable; RFLINK: Dernière stable; Xiaomi Gateway
papoo
Messages : 2029
Inscription : 10 janv. 2016, 11:29
Localisation : Limoges (87)
Contact :

Re: Table et condition

Message par papoo »

je fais comme ça pour le tableau

Code : Tout sélectionner

local les_devices = {};
-- comment remplir le tableau les_devices ?  
-- device = le nom du dispositif à surveiller
-- type_device = le nom du groupe auquel appartient le device à surveiller : porte, fenetres, lumiere, TV.  
-- delai = délai particulier à n'utiliser que sur le device concerné, inhibe le délai affecté au groupe. si aucun délai particulier, nil.
-- si type_device = nil et delai = nil le délai defaut_delai sera appliqué.
-- Pour activer un ou plusieurs mode de notifications particuliers renseigner subsystem
-- les différentes valeurs de subsystem acceptées sont : gcm;http;kodi;lms;nma;prowl;pushalot;pushbullet;pushover;pushsafer
-- pour plusieurs modes de notification séparez chaque mode par un point virgule. si subsystem = nil toutes les notifications seront activées.
-- etat = état du dispositif à surveiller "On" Ou "Off"
-- les_devices[#les_devices+1] = {device="", type_device ="", delai = nil, subsystem = nil, etat = ""}
les_devices[#les_devices+1] = {device="porte entree", type_device ="portes", delai = nil, subsystem = nil, etat = "On"} -- 1er device délai en minutes
les_devices[#les_devices+1] = {device="porte cave",  type_device = "portes", delai = nil, subsystem = nil, etat = "On"} -- 2eme device
les_devices[#les_devices+1] = {device="fenetre douche",  type_device = "fenetres", delai = nil, subsystem = nil, etat = "On"} -- 3eme device
ensuite avec une boucle for je teste mes conditions

Code : Tout sélectionner

	for k,v in pairs(les_devices) do  -- On parcourt chaque device
        local Vtype = v.type_device
        local Vdelai = v.delai
        local Delai = tonumber(return_delai(Vtype, Vdelai))
        if otherdevices_lastupdate[v.device] ~= nil then
le script complet
viewtopic.php?f=17&t=5540


sinon un script dzvents va te permettre d'appeler l'ensemble de tes devices "contact" directement sans passer par la création d'une table

exemple ici avec PIR_*
https://easydomoticz.com/scripts-dzvent ... s-details/
domoticz beta/RaspBerry PI3 stretch
https://pon.fr github
landaisbenj
Messages : 695
Inscription : 12 mars 2017, 19:24

Re: Table et condition

Message par landaisbenj »

Merci Papoo c'est tres interressant comme script.
Mais je cherchais quelque chose de plus simple et surtout de plus cours pour l'integrer dans d'autre developpement.

Du coup j'ai trouvé ma solution cette nuit en dormant. Comme quoi ca fait du bien.

Et voila le code pour ma table contact du debut:

Code : Tout sélectionner

local maison = string.match(table.concat(contact),'Open')
Ici, si maison = Open alors une des occurrences de la table est ouvert. Sinon elle sera nil.
En une seule ligne c'est exactement ce que je voulais. Merci pour vos aides.

Pour ceux qui veulent tester (avec vos propres devices biensur):

Code : Tout sélectionner

local contact={
otherdevices['Contact Garage'],
otherdevices['Contact Entree'],
otherdevices['Contact Baie'],
otherdevices['Contact Baie 2'],
}
print(table.concat(contact,", "))
local maison = string.match(table.concat(contact),'Open')
if maison == 'Open' then
    print('Maison ouverte')
else
    print('Maison fermé')
end
Rpbi3b: Domoticz + Homebridge + Monit + Freebox scripts + Shellinabox; Rpbi2: Jarvis
Domoticz: Derniere stable; RFLINK: Dernière stable; Xiaomi Gateway
Jeff
Messages : 1007
Inscription : 17 nov. 2016, 20:54
Localisation : Rennes (35)

Re: Table et condition

Message par Jeff »

Sympa la fonction, ca devient complexe comme code :geek:
Version: 2023.1 sur VM Synology, docker Zwave Js UI (Z-stick GEN5, Fibaro...), Zigbeefordomoticz. Nextion RGB Led Screen
Répondre