Aller au contenu

Module Virtuel - Entrées/sorties Ipx800 - V3


Syris

Messages recommandés

Bonjour,

 

 

Petit partage d'un VD qui permet de récupérer les valeurs des 8 entrées et des 8 sorties d'une ipx800 afin de les exploiter ou dans des VDs, ou dans GEA :-

 

 

Il faut donc 8 variables globales pour les entrées :

 

IPX_IN1

IPX_IN2

etc jusqu'à  IPX_IN8

 

 

Il faut 8 variables globales pour les sorties :

 

RELAIS1

RELAIS 2

etc jusqu'à  RELAIS8

 

Deux boutons de MAJ et 16 labels.

 

 

Certains libellés dans ce VD sont adapté à  mon utilisation, modifiez les! (Pensez également à  changer l'adresse ip, chez moi 192.168.1.60)

 

 

Suite aux remarques (très intéressante) de ce fil, voilà  la nouvelle version :

 

 

VERSION 3 (MAJ du 28/11/15)

 

- Permet d'utiliser le PUSH de l'ipx (et donc ne faire qu'une requête lors d'un changement d'état d'une entrée) - A configurer dans l'ipx (appuie sur le BP Maj de ce VD)

- Code plus simple

- Permet la mise à  jour des VDs qui changent les icônes. 

- Permet de gérer les sorties avec le retour d'info

 

 

A reconfigurer pour votre usage :

 

Pour les entrées :

Variable local VD_nom (juste pour se rappeler sur quoi c'est branché :))

Variable local VD_ID_IPX (L'id des VD à  mettre à  jour) - Mettre nil si aucune action voulu

Variable local VD_BP_IPX (Le BP a appuyer pour la MAJ du Vd en question) - Mettre nil si aucune action voulu

Variable local VariablesIPX (qui correspond au variables globales a modifier en fonction des entrées)

 

Pour les sorties :

local VD_NOM_SORTIES (Toujours pour se rappeler sur quoi c'est branché  :))
local VD_ID_IPX_SORTIES (L'id des VD à  mettre à  jour) - Mettre nil si aucune action voulu
local VD_BP_IPX_SORTIES (Le BP a appuyer pour la MAJ du Vd en question) - Mettre nil si aucune action voulu
local VD_LABEL_SORTIES (les valeurs des labels à  modifier)

 

 

 

Supprimer les lignes de debug après mise en place :)

 

 

Coté IPX : On configure le push sur les entrées afin d'appuyer sur le BP MAJ Entrée et on configure le push sur les sorties afin d'appuyer sur le BP MAJ Sorties.

 

Exemple pour les entrées : /api/callAction?deviceID=104&name=pressButton&arg1=9

104 étant l'id du VD MAJ et 9 étant le bouton à  appuyer pour la maj des entrées

 

Exemple pour les sorties : /api/callAction?deviceID=104&name=pressButton&arg1=18

 

104 étant l'id du VD MAJ et 18 étant le bouton à  appuyer pour la maj des sorties

 

 

Bouton de MAJ Entrées :

HC2 = Net.FHttp("192.168.1.60")
response = HC2:GET("/api/xdevices.json?cmd=10")

response = json.decode(response)

local i = 1
local TotalEntrees = 8 + 1
local Rvar = {response.IN1,response.IN2,response.IN3,response.IN4,response.IN5,response.IN6,response.IN7,response.IN8}
local VariablesIPX = {"IPX_IN1","IPX_IN2","IPX_IN3","IPX_IN4","IPX_IN5","IPX_IN6","IPX_IN7","IPX_IN8"}

local VD_NOM = {"IR","Libre","Etat AL","En Al","Courrier","Scene3","Scene2","Scene1"} -- Juste pour Aide
local VD_ID_IPX = {nil,nil,88,88,92,nil,nil,nil} -- ID des VD à  mettre à  jour
local VD_BP_IPX = {nil,nil,3,3,2,nil,nil,nil} -- Numéro des boutons de MAJ des VD
 
DateHeure = os.date("%Y-%m-%d %H:%M:%S", os.time())
fibaro:log(DateHeure.."")
fibaro:debug(DateHeure)
 
 
while i < TotalEntrees do
 
  fibaro:debug(i)
  fibaro:setGlobal(VariablesIPX[i], Rvar[i])
  fibaro:call(fibaro:getSelfId(), "setProperty", "ui.Label"..i..".value", Rvar[i]);
  fibaro:debug("Reponse entrée IPX : " ..i.." = " ..Rvar[i])
  fibaro:debug("Nom du module = " ..VD_NOM[i])
  
  if VD_ID_IPX[i] == nil then
  	fibaro:debug("VD non configuré, rien à  faire.")
  else
      fibaro:debug("Il faut appuyer sur le bouton : " ..VD_BP_IPX[i].. " de la VD id : " ..VD_ID_IPX[i])
      fibaro:call(VD_ID_IPX[i], "pressButton", VD_BP_IPX[i]) 
  end
  
  i = i + 1
end

Bouton de Maj Sorties :

HC2 = Net.FHttp("192.168.1.60")
response = HC2:GET("/api/xdevices.json?cmd=20")

response = json.decode(response)


local i = 1
local TotalSorties = 8 + 1
local RvarSorties = {response.OUT1,response.OUT2,response.OUT3,response.OUT4,response.OUT5,response.OUT6,response.OUT7,response.OUT8}
local VariablesIPXSorties = {"RELAIS1","RELAIS2","RELAIS3","RELAIS4","RELAIS5","RELAIS6","RELAIS7","RELAIS8"}

local VD_NOM_SORTIES = {"VanneEAU","SecheServiette","ECL-EXT","Arrosage","PAC-Piscine","Filtration-Piscine","ECL-Piscine","Ventilation"} -- Juste pour Aide
local VD_ID_IPX_SORTIES = {nil,85,84,nil,95,94,93,74} -- ID des VD à  mettre à  jour
local VD_BP_IPX_SORTIES = {nil,4,4,nil,4,4,4,4} -- Numéro des boutons de MAJ des VD
local VD_LABEL_SORTIES = {9,10,11,12,13,14,15,16} -- Label  pour affichage des sorties
 
DateHeure = os.date("%Y-%m-%d %H:%M:%S", os.time())
fibaro:log(DateHeure.."")
fibaro:debug(DateHeure)

 
while i < TotalSorties do
 
  fibaro:debug(i)
  fibaro:setGlobal(VariablesIPXSorties[i], RvarSorties[i])
  fibaro:call(fibaro:getSelfId(), "setProperty", "ui.Label"..VD_LABEL_SORTIES[i]..".value", RvarSorties[i]);
  fibaro:debug("Reponse Sortie IPX : " ..i.." = " ..RvarSorties[i])
  fibaro:debug("Nom du module = " ..VD_NOM_SORTIES[i])
  
  if VD_ID_IPX_SORTIES[i] == nil then
  	fibaro:debug("VD non configuré, rien à  faire.")
  else
      fibaro:debug("Il faut appuyer sur le bouton : " ..VD_BP_IPX_SORTIES[i].. " de la VD id : " ..VD_ID_IPX_SORTIES[i])
      fibaro:call(VD_ID_IPX_SORTIES[i], "pressButton", VD_BP_IPX_SORTIES[i]) 
  end
  
  i = i + 1
end

Exemples de VD Entrée :

 

1 label, 1 bouton de MAJ

local icone = {
  ["DETECTION"] = 100,     --numéro icone à  renseigner
  ["PASDETECTION"] = 99,
}

  
if  fibaro:getGlobalValue("IPX_IN1") == '1' then
	fibaro:call(fibaro:getSelfId(),"setProperty","ui.Label1.value", "Non")
	fibaro:call(fibaro:getSelfId(), "setProperty", "currentIcon", icone["PASDETECTION"])
else
	fibaro:call(fibaro:getSelfId(),"setProperty","ui.Label1.value", "Oui")
	fibaro:call(fibaro:getSelfId(), "setProperty", "currentIcon", icone["DETECTION"])
    fibaro:log("Mouvement!!")
end

Exemple de Vd pour contrôle sortie 7 (et retour d'info) :

 

1 label, deux bouton ON/OFF, un bouton Maj

 

Bouton on : Simplement mettre "Set071" en chaine et cochant "en attente de réponse du périphérique"

Bouton off : "Set070" en chaine et cochant "en attente de réponse du périphérique"

 

 

Bouton Maj :

local icone = {
  ["ECLPON"] = 90,     --numéro icone à  renseigner
  ["ECLPOFF"] = 89,
}

  
if  fibaro:getGlobalValue("RELAIS7") == '1' then
	fibaro:call(fibaro:getSelfId(),"setProperty","ui.Label1.value", "On")
	fibaro:call(fibaro:getSelfId(), "setProperty", "currentIcon", icone["ECLPON"])
		fibaro:log("Eclairage ON")
else
	fibaro:call(fibaro:getSelfId(),"setProperty","ui.Label1.value", "Off")
	fibaro:call(fibaro:getSelfId(), "setProperty", "currentIcon", icone["ECLPOFF"])
  		fibaro:log("Eclairage OFF")
end

ANCIENNE VERSION 1 (Plus lourde, bcp de requêtes et ne met pas les VD d'état additionnel à  jour)

 

Coté bouton de MAJ : 

HC2 = Net.FHttp("192.168.1.60")
response = HC2:GET("/api/xdevices.json?cmd=10")

response = json.decode(response)

fibaro:setGlobal("IPX_IN1", response.IN1)
fibaro:setGlobal("IPX_IN2", response.IN2)
fibaro:setGlobal("IPX_IN3", response.IN3)
fibaro:setGlobal("IPX_IN4", response.IN4)
fibaro:setGlobal("IPX_IN5", response.IN5)
fibaro:setGlobal("IPX_IN6", response.IN6)
fibaro:setGlobal("IPX_IN7", response.IN7)
fibaro:setGlobal("IPX_IN8", response.IN8)

DateHeure = os.date("%Y-%m-%d %H:%M:%S", os.time())
fibaro:log(DateHeure.."")
fibaro:debug(DateHeure)

local relais1 = fibaro:getGlobalValue("IPX_IN1")
local relais2 = fibaro:getGlobalValue("IPX_IN2")
local relais3 = fibaro:getGlobalValue("IPX_IN3")
local relais4 = fibaro:getGlobalValue("IPX_IN4")
local relais5 = fibaro:getGlobalValue("IPX_IN5")
local relais6 = fibaro:getGlobalValue("IPX_IN6")
local relais7 = fibaro:getGlobalValue("IPX_IN7")
local relais8 = fibaro:getGlobalValue("IPX_IN8")


if (relais1 == '0') then
	fibaro:call(fibaro:getSelfId(),"setProperty","ui.Label1.value", "Oui")
else
  fibaro:call(fibaro:getSelfId(),"setProperty","ui.Label1.value", "Non")
end

if (relais2 == '0') then
	fibaro:call(fibaro:getSelfId(),"setProperty","ui.Label2.value", "Actif")
else
  fibaro:call(fibaro:getSelfId(),"setProperty","ui.Label2.value", "Off")
end

if (relais3 == '1') then
	fibaro:call(fibaro:getSelfId(),"setProperty","ui.Label3.value", "Armé")
else
  fibaro:call(fibaro:getSelfId(),"setProperty","ui.Label3.value", "Désarmé")
end

if (relais4 == '1') then
	fibaro:call(fibaro:getSelfId(),"setProperty","ui.Label4.value", "En Alarme!")
else
  fibaro:call(fibaro:getSelfId(),"setProperty","ui.Label4.value", "RAS")
end

if (relais5 == '1') then
	fibaro:call(fibaro:getSelfId(),"setProperty","ui.Label5.value", "Oui")
else
  fibaro:call(fibaro:getSelfId(),"setProperty","ui.Label5.value", "Non")
end

if (relais6 == '1') then
	fibaro:call(fibaro:getSelfId(),"setProperty","ui.Label6.value", "On")
else
  fibaro:call(fibaro:getSelfId(),"setProperty","ui.Label6.value", "Off")
end

if (relais7 == '1') then
	fibaro:call(fibaro:getSelfId(),"setProperty","ui.Label7.value", "On")
else
  fibaro:call(fibaro:getSelfId(),"setProperty","ui.Label7.value", "Off")
end

if (relais8 == '1') then
	fibaro:call(fibaro:getSelfId(),"setProperty","ui.Label8.value", "On")
else
  fibaro:call(fibaro:getSelfId(),"setProperty","ui.Label8.value", "Off")
end

Boucle principal :

local myDeviceID = fibaro:getSelfId() 
if type(n) == "nil" then
n1 = tonumber(os.time())
fibaro:call(myDeviceID, "pressButton", "1")
n = 1
end
if tonumber(os.time()) > n1 + (4) then
 fibaro:call(myDeviceID, "pressButton", "1")
 n1 = tonumber(os.time())
end

Eclairage_Piscine.vfib

IPX800_E-S.vfib

post-2984-0-31359400-1448721092_thumb.png

post-2984-0-79210000-1448721095_thumb.png

post-2984-0-36252700-1448721101_thumb.png

post-2984-0-75173900-1448721106_thumb.png

Lien vers le commentaire
Partager sur d’autres sites

De mon côté, J'ai préféré que chaque changement d'une Input de l'IPX via un push actionne un module virtuel dont l'objectif est de lire (dans l'ex ci-dessous)  les 10 premières inputs, et en fonction de leur état mettre à  jour un VD par Input (icône Ouvert ou fermé).

 

Pour rajouter des Inputs ou des actions différentes sur les modules virtuels, j'ai crée une table à  4 entrées avec la structure suivante  suivant tuto de JOJO  http://www.domotique-fibaro.fr/index.php/topic/4149-afficher-les-valeurs-dune-variable-dans-un-vd-sour-hc2/

--     Champ 1  --> nom de la variable globale entre " "
--     Champ 2 -->  ID du VD qui affichera l'icon en fonction de l'état de la VG ci-dessus
--    Champs  3 et 4 --> N° du bouton du VD ci-avant qui sera actionné, bouton1 = icône "fermé", bouton2 =icône "Ouvert"

 

--[[
%% properties
%% globals

--]]


-- interrogations des 10 Inputs de l'IPX800, retour d'un JSON suivant la syntaxe ci-dessous
-- {"product":"IPX800_V3","IN1":1,"IN2":1,"IN3":1,"IN4":1,"IN5":0,"IN6":0,"IN7":0,"IN8":0,"IN9":0,"IN10":0,"IN11":0,"IN12":0,"IN13":0,"IN14":1,"IN15":0,"IN16":0,"IN17":0,"IN18":0,"IN19":0,"IN20":0,"IN21":1,"IN22":0,"IN23":0,"IN24":0,"IN25":0,"IN26":0,"IN27":0,"IN28":0,"IN29":0,"IN30":1,"IN31":0,"IN32":0}

    HC2 = Net.FHttp("192.168.x.yyy")
    response = HC2:GET("/api/xdevices.json?cmd=10")

-- -----------------------------------------------------------------------------------------------------------------------------------
 
-- enregistrement du retour de l API dans une table
    response = json.decode(response)

-- ETAPE 2 : les 10 Variables globales ci-après ont été crées manuellement 
--"IPX_Porte_Entree", "IPX_SDB_WC_Buand", "IPX_Portail_Garage", "IPX_Fen_Cuisine", "IPX_Fen_Salle_Jeux", "IPX_Fen_SaM", "IPX_Baie_SaM", "IPX_Baie_Salon", "IPX_Baie_Salon_TV", "IPX_Porte_Appart" 


-- écriture des valeurs (0 ou 1) des variables gobales avec les valeurs lue dans le JSON de l'IPX champs IN1 à  10
fibaro:setGlobal("IPX_Porte_Entree", response.IN1)
fibaro:setGlobal("IPX_SDB_WC_Buand", response.IN2)
fibaro:setGlobal("IPX_Portail_Garage", response.IN3)
fibaro:setGlobal("IPX_Fen_Cuisine", response.IN4)
fibaro:setGlobal("IPX_Fen_Salle_Jeux", response.IN5)
fibaro:setGlobal("IPX_Fen_SaM", response.IN6)
fibaro:setGlobal("IPX_Baie_SaM", response.IN7)
fibaro:setGlobal("IPX_Baie_Salon", response.IN8)
fibaro:setGlobal("IPX_Baie_Salon_TV", response.IN9)
fibaro:setGlobal("IPX_Porte_Appart", response.IN10)

 -- ---------------------------------------------------------------------------------------------------------------------------------------- 
 -- ETAPE 3  test des VG et action sur bouton 1 ou 2 d'un VD par VG pour affichage de l'Icone Ouvert ou Fermé
 
 -- Tous les ID des VD sont remplacés par un string, tuto de tchery  http://www.domotique-fibaro.fr/index.php/topic/5669-se-passer-des-id-dans-vos-scenes-et-vd/ 
-- de la variable contenant tous les identifiants notamment PUSH RFID=310
local idALL=json.decode((fibaro:getGlobal('idTable')));

-- Création d'une Table avec la structure suivante  suivant tuto de JOJO http://www.domotique-fibaro.fr/index.php/topic/4149-afficher-les-valeurs-dune-variable-dans-un-vd-sour-hc2/

--     1/ nom de la variable globale entre "
--     2/ ID du VD qui affichera l'icon en fonction de l'état de la VG ci-dessus
--     3 et 4 N° du bouton du VD ci-avant qui sera actionné, bouton1 = icône "fermé", bouton2 =icône "Ouvert" 

local Table = { "IPX_Porte_Entree",   idALL["PORTE_ENTREE"],		 1, 2,
				"IPX_SDB_WC_Buand",   idALL["FENETRE_SDB_WC_BUAND"], 1, 2,
				"IPX_Portail_Garage", idALL["PEORTAIL_GARAGE"],  	 1, 2,
				"IPX_Fen_Cuisine",    idALL["FENETRE_CUISINE"], 	 1, 2,
				"IPX_Fen_Salle_Jeux", idALL["FENETRE_BUREAU"],  	 1, 2,
				"IPX_Fen_SaM",        idALL["FENETRE_SALLE_MANGER"], 1, 2,
				"IPX_Baie_SaM",       idALL["BAIE_SALLE_MANGER"], 	 1, 2,
				"IPX_Baie_Salon",     idALL["BAIE_SALON"],     		 1, 2,
				"IPX_Baie_Salon_TV",  idALL["BAIE_SALON_TV"], 		 1, 2,
				"IPX_Porte_Appart",  idALL["PORTE_APPARTEMENT"], 	 1, 2,
				}


----------------------------------

-- DO not change bellow this line

----------------------------------
local i = 1
while Table[i] ~= nil do
   local VG_Nom = tostring(Table[i])
   fibaro:debug("----------------------------")
   fibaro:debug("Nom de la variable Globale = " ..VG_Nom)
   local VD_id = tostring(Table[i+1])
  local Btn_1 = tonumber(Table[i+2])
   local Btn_2 = tonumber(Table[i+3])
        fibaro:debug(VD_id.. "   "..Btn_1.."   "..Btn_2)
   
  VG_Val = tonumber(fibaro:getGlobalValue(VG_Nom))
  --VG_Val = tonumber(fibaro:getGlobalValue(VG_Nom))
   fibaro:debug('Valeur de la variable Globale = ' ..VG_Val)
   if VG_Val == 1
  then
     Btn= Btn_1
     fibaro:call(VD_id, "pressButton", Btn)
	 fibaro:debug("Appui sur le bouton : " ..Btn.. " de la VD_id " ..VD_id)
  else
     Btn= Btn_2
     fibaro:call(VD_id, "pressButton", Btn)
	 fibaro:debug("Appui sur le bouton : " ..Btn.. " de la VD_id " ..VD_id)
  end
  
   i = i + 4
   
   
end 

 

post-150-0-49399900-1447451952_thumb.jpg

  • Upvote 1
Lien vers le commentaire
Partager sur d’autres sites

Il y a un autre truc aussi, au lieu de faire une VG par entrée on peut stocker l'ensemble dans une VG sous forme binaire %10110011 ou hexa $B3. Puis si la VG change on la lit dans chaque VD pour update en fonction de la valeur. Bien sur chaque changement de relais sur l'ipx actionne cette scène comme tu le fais ici.

Lien vers le commentaire
Partager sur d’autres sites

Effectivement les 10 lignes de "setGlobal" (10 dans le cas présent, mais ce pourrait être jusqu'à  32) ne sont pas satisfaisantes, le remplissage par une boucle ( for  ou while) à  partir du json.decode(response) d'une table avec le label de la VG associée à  l'ouvrant  et sa valeur 0 ou 1 serait plus pro et plus générique.;

J'utilise actuellement ces variables pour le traitement de l'échec d'activation ou non de mon alarme si un ouvrant n'est pas fermé,et intrusion (en doublon d'une vielle alarme non communiquante)  mais aussi en prévision pour d'autres process, notamment la gestion du chauffage pièce par pièce.

Toute aide serait la bien venue.

Lien vers le commentaire
Partager sur d’autres sites

Moi pour pas avoir de polling j'ai 2 scènes qui sont activées sur push relais et/ou entrée. Ça évité de schecker àchaque fois l'IPX et de tout surcharger pour rien ! Chacune des scènes me permettent de stocker en variable globale l'état des relais/entrées ou alors de mettre àjour des icones sur des VD.

Lien vers le commentaire
Partager sur d’autres sites

De même, je n'utilise de polling, c'est l'IPX qui informe par un push du changement d'état des ses INPUT dans le cas présent.

Je considère que l'IPX V3 (produit très intéressant) est cependant un périphérique esclave de la box HC2, et donc sa programmation doit être la plus simple possible.

Question de point de vue, mais je préfère le push unique dans l'IPX plutôt qu'au max 64 push personnalisés (32 entrées et 2 états) et réserver àla HC2, le traitement de ce push.

Lien vers le commentaire
Partager sur d’autres sites

Moi j'ai privilégié 2 pushs un pour toutes les entrées et un pour toutes les sorties ça évite d'avoir la lecture de toutes les entrées si seulement une sortie c'est mise àjour (ça évite de surcharger pour rien) mais après chacun fait sa sauce, l'essentiel étant que ça marche. Pour moi c'est une V4 au passage :)

Lien vers le commentaire
Partager sur d’autres sites

@BenjyNet, nous sommes en phase, tu as bien un push unique commun àtoutes tes entrées, dans mon post je ne parlais pas des Output et j'ai de même un push unique commun àtoutes les sorties.

En résumé un push pour toutes les INPUTS pointant vers un module virtuel de la HC2 et en charge de l'analyse de l'INPUT ayant provoqué le push ( response = HC2:GET("/api/xdevices.json?cmd=10") )puis l'action, cette fois ci, personnalisée àeffectuer.

Et de même pour les OUTPUTS avec un autre MV quasi similaire (response = HC2:GET("/api/xdevices.json?cmd=20")).

Lien vers le commentaire
Partager sur d’autres sites

Le coup du push, c'est une excellente idée !

 

 

Ma réflection concernant la réduction du code m'a amené a sa :

local i = 1
local TotalEntrees = 8 + 1
local Rvar = {response.IN1,response.IN2,response.IN3,response.IN4,response.IN5,response.IN6,response.IN7,response.IN8}
local VariablesIPX = {"IPX_IN1","IPX_IN2","IPX_IN3","IPX_IN4","IPX_IN5","IPX_IN6","IPX_IN7","IPX_IN8"}

while i < TotalEntrees do
  fibaro:debug(i)
  fibaro:setGlobal(VariablesIPX[i], Rvar[i])
  fibaro:debug(Rvar[i])
  i = i + 1
end

Mais sa revient presque au même ^^

Lien vers le commentaire
Partager sur d’autres sites

Maj du jour, bonjour : 

local i = 1
local TotalEntrees = 8 + 1
local Rvar = {response.IN1,response.IN2,response.IN3,response.IN4,response.IN5,response.IN6,response.IN7,response.IN8}
local VariablesIPX = "IPX_IN"..i..""


DateHeure = os.date("%Y-%m-%d %H:%M:%S", os.time())
fibaro:log(DateHeure.."")
fibaro:debug(DateHeure)


while i < TotalEntrees do

  fibaro:debug(i)
  fibaro:setGlobal(VariablesIPX, Rvar[i])
  fibaro:call(fibaro:getSelfId(), "setProperty", "ui.Label"..i..".value", Rvar[i]);
  fibaro:debug(Rvar[i])
  i = i + 1
end

- Réductions d'écriture pour les variables globales EDIT : Ne fonctionne pas de cette forme, si qqn a une idée? (surement une erreur de syntaxe?)

- Rajout de la MAJ des labels concernés

 

- Me manque plus qu'a créer un tableau pour faire les maj de mes VD icônes associés :)

Lien vers le commentaire
Partager sur d’autres sites

Punaise, ça me semble d'un compliqué ta gestion avec tous ces VD et leurs boutons On/Off/MaJ.... mais pourquoi pas.

Par contre, rajoute un mot sur ce qu'il faut mettre dans le push pour ceux qui ne connaissent pas bien l'IPX parce que sinon c'est inutilisable.

Modifié par BenjyNet
Lien vers le commentaire
Partager sur d’autres sites

  • 1 mois après...
×
×
  • Créer...