Aller au contenu

mprinfo

Membres confirmés
  • Compteur de contenus

    14 385
  • Inscription

  • Dernière visite

  • Jours gagnés

    249

Tout ce qui a été posté par mprinfo

  1. voila ce que cela donne avec le pooling
  2. Pour ton switch ta as 24 poe et 2 non poe les sfp [emoji12] Simple à vérifier #table des ports je suis sur que tu auras 26 Pour l udm c'est différent les 3 ports non poe sont des ports wan Envoyé de mon BLA-L29 en utilisant Tapatalk
  3. J'ai pas fais la modif que je t'avais donné Chez moi j'ai juste l udm en poe Donc si un port est non poe la valeur et nil est ça crache Demain je m'occupe soit du poling soit de la gestion des enfants Je réfléchis pour comment faire avec le moins de ressources Je tag chaque child avec une variable qui et un numéro de port du switch Envoyé de mon BLA-L29 en utilisant Tapatalk
  4. Je t'ai posté une nouvelle version dans le topic dédié Envoyé de mon BLA-L29 en utilisant Tapatalk
  5. @tonyC tu peux me tester ce QA stp Attention il n'y a aucune protection donc il faut faire cela métodiquement tu dois mettre les port que tu veux switcher comme ceci 1, 8, 14, 10 etc... Tu clic sur création et tu auras autant de boutons que tu as mis de port Si tu veux modifier un port je te conseil de supprimer les childs ou de modifier a la main le chiils ou les chids Cela fonctionne bien chez moi attention il n'y a pas de pooling donc les ports ne sont pas mis a jour automatiquement pour le moment voici le qa : test_sensor.fqa
  6. Oui mais@Krikroff fais ça sieste à cette heure ci. Il vaut mieux attendre [emoji23] Envoyé de mon BLA-L29 en utilisant Tapatalk
  7. Ils font tout pour que l'on ne migre pas sur hc3 [emoji16] Envoyé de mon BLA-L29 en utilisant Tapatalk
  8. @lazer pour le probléme lors de la création des childs if camera.id > 0 and camera.status == 1 then -- Normal if childDevicesMap[camera.id] then self:debug('Child device #<b>' .. tostring(childDevicesMap[camera.id].id or "<i>nil</i>") .. '</b> "<b>' .. (childDevicesMap[camera.id].name or "<i>nil</i>") .. '</b>" already exists for camera #<b>' .. tostring(camera.id) .. '</b> "<b>' .. (camera.name or camera.newName or "<i>nil</i>") .. '</b>"') else local child = { name = camera.name or camera.newName or "Camera " .. tostring(camera.id), type = "com.fibaro.binarySwitch", class = MyChild, properties = { --deviceControlType = 20, deviceControlType = 2, categories = {"other"}, manufacturer = camera.vendor, model = camera.model, }, variables = { {name = "cameraID", value = camera.id} }, } if not tools.createChild(self, child) then self:error("Error : child creation failed") end end else self:warning("Camera #" .. (camera.id or "<i>nil</i>"), camera.name or camera.newName or "<i>nil</i>", "is not enabled => excluded") end le probléme ce situe ici deviceControlType = 20, je sais pas a quoi cela correspond, j'ai modifier la valeur à 2 et cela fonctionne après je ne sais pas ce que cela modifie
  9. Quelqu'un peu me dire si surveillance station fonctionne ? Car avec les bêta la création des childs plantaient Envoyé de mon BLA-L29 en utilisant Tapatalk
  10. mprinfo

    HC2 Freeze 4 LEDs allumées

    Alors tu la trouve comment cette hc3 ? Envoyé de mon BLA-L29 en utilisant Tapatalk
  11. Depuis le début je ne fais que modifier la valeur dans la table La raison est que j'ai regardé comment cela ce passe via l'interface unifi est l'on voit bien qu'il procède de cette façon Il y a une solution temporaire avant que cela avance pour n'avoir qu'un qa La solution n'est pas propre mais cela fonctionnera Il faut récupérer la table Tu crées en dur avec la position auto/off Tu fais autant de table que du position Pour un explication plus claire Table 1 = 1 à auto 2 à auto 3 à off etc.. Table 2 = 1 à off 2 à auto 3 à auto etc.. Ensuite tu n'as plus qu'à récupérer la table que tu as besoin et faire le PUT Envoyé de mon BLA-L29 en utilisant Tapatalk
  12. mprinfo

    HC2 Freeze 4 LEDs allumées

    Pour quelqu'un de pas motivé à passé sur hc3 tu chôme pas Encore un peu de taf une nouvelle mise à jour est disponible [emoji16] Envoyé de mon BLA-L29 en utilisant Tapatalk
  13. Pour notre histoire de table avec port_overrides je crois que j'ai l'explication est c'est logique Au départ tu es en profil par défault donc la valeur de port_overrides ne sert a rien ou plutôt égal au profil si tu envois une modification pour un port cela va fonctionner il aura la table pour l’exception du port si tu envois a nouveau une table d'un port cela va fonctionner pour ce port mais cela va effacer l'ancienne table et la remettre en profil par défault donc la solution c'est de garder la table port_overrides de modifier le auto/off du bon port et de renvoyer la valeur il faut donc que la table garde l'ensemble des ports et la tu n'auras plus de probléme on pourrait aussi modifier plusieurs port avant de faire le PUT
  14. essaie ceci if tonumber(data_port_table[i]["poe_power"]) > 0 and data_port_table[i]["poe_power"]~= nil then je pense que tu as un switch avec des ports non poe Aprés je n'ai que l'udm pour tester
  15. @tonyC j'ai voulu t'envoyer un MP mais a priori c'est pas possible voici la dernière version Switch_POE_UnifiOS_v0.62b.fqa
  16. je viens de faire un test avec plusieurs port donc plusieurs Qa cela fonctionne super bien
  17. @TonyC je cherche pas a avoir raison ou tord mais juste de comprendre la partie PUT en fait je suis dans l'inconnu Excuse moi si j'ai semblé vouloir imposé mon idée ce n'est pas le car j’essaie juste de comprendre de plus je n'ai testé qu'avec un port POE Je suis nul en rédactionnelle donc on j'ai souvent du mal a me faire comprendre surtout par écrit Je suis content a mon age j'arrive a faire des enfants mais la gestion n'est pas simple pour moi la en bidouillant c'est loin d'être propre j'arrive a faire un enfant pour le poe du port et 1 pour le poe total du switch
  18. En général c'est pour les 2 donc on verra bien [emoji16] Envoyé de mon BLA-L29 en utilisant Tapatalk
  19. @Cardane tu peux modifier le titre comme ceci STP merci HC3 & HCL3 - v 5:100:22 stable- 22/12/2021
  20. je te réponds ici mais normalement c'est l'autre topic Faux la table override exit elle n'est pas vide voila comment ce compose le json d'un device unifi Pour trouver le device il faut faire une boucle car l'index est numérique Une fois le switch trouvé on est a ce json { "_id": "61e19e28dfde79156707c91c", "ip": "xxx.xxx.xxx.xxx", "mac": "xx:xx:xx:xx:xx:xx", "model": "UDMPROSE", "model_in_lts": false, "model_in_eol": false, "type": "udm", "version": "2.3.11.6510", "adopted": true, "site_id": "61e19e12dfde79156707c8f9", "x_authkey": "d054b00830d5dfed3cd7f3b4551e445a", "cfgversion": "e3a334c32ec746bc", "syslog_key": "e1e9d7b703f3b0a5d7ab2c99e651aa0be21692fee6c45ca97b9171f8ebf98d3b", "config_network": {........}, "setup_id": "ae4268e1-908e-4e02-9258-86d3eae422ff", "jumboframe_enabled": false, "flowctrl_enabled": false, "stp_version": "rstp", "stp_priority": "32768", "dot1x_portctrl_enabled": false, "power_source_ctrl_enabled": false, "license_state": "registered", "unsupported": false, "unsupported_reason": 0, "inform_url": "http://localhost:8080/inform", "inform_ip": "127.0.0.1", "x_aes_gcm": true, "config_network_lan": {...............}, "required_version": "1.0.15", "kernel_version": "4.19.152-ui-alpine", "architecture": "aarch64", "board_rev": 19, "manufacturer_id": 4, "model_incompatible": false, "ethernet_table": [ "port_table": {...............}, "ethernet_overrides": {...............}, "usg_caps": 3008508, "has_speaker": false, "has_eth1": false, "fw_caps": 1659805231, "hw_caps": 24, "wifi_caps": 22986461, "lcm_brightness": 80, "lcm_night_mode_enabled": true, "lcm_night_mode_begins": "22:00", "lcm_night_mode_ends": "08:00", "switch_caps": {...............}, "has_fan": false, "has_temperature": false, "temperatures": [...............}, "storage": [...............}, "ruleset_interfaces": [...............}, "connected_at": 1643545087, "provisioned_at": 1643649915, "name": "UDM Pro SE", "hostname": "UDM-Pro-SE", "setup_provision_completed": true, "setup_provision_tracking": false, "device_domain": "784558ca594d06260985066e59a40617a14f9.id.ui.direct", "port_overrides": [...............}, "two_phase_adopt": false, "serial": "784xxxxxxx", "hash_id": "a41f1116852aaxxx", "anon_id": "3a177196-e62c-418a-841f-1116852aae86", "device_id": "61e19e28dfde79156707c91c", "state": 1, "start_disconnected_millis": 1643545085249, "last_seen": 1643730722, "min_inform_interval_seconds": 1, "upgradable": false, "adoptable_when_upgraded": false, "rollupgrade": false, "known_cfgversion": "e3a334c32ec746bc", "uptime": 185721, "_uptime": 185721, "locating": false, "start_connected_millis": 1643545087388, "next_interval": 26, "sys_stats": {...............}, "system-stats": {...............}, A ce niveau on peut récuperer quelques info pour l'affichage Pour la mise a jour de l'affichage j'utilise la table "port_table" Pour le PUT recupérer la valeur de "port_overrides" "port_overrides" et une table avec index numérique qui contient des objets sous forme de table (1 table) par port Voici le json de "port_overrides" "port_overrides": [ { "autoneg": true, "poe_mode": "auto", "port_security_mac_address": [], "full_duplex": false, "port_idx": 1, "portconf_id": "61e19e1edfde79156707c912", "name": "Port 1", "speed": 10, "op_mode": "switch" }, { "autoneg": false, "portconf_id": "61e19e1edfde79156707c912", "poe_mode": "auto", "name": "Port 2", "port_security_mac_address": [], "full_duplex": true, "port_idx": 2, "speed": 1000 }, { "autoneg": true, "op_mode": "switch", "portconf_id": "61e19e1edfde79156707c912", "name": "Port 3", "full_duplex": true, "speed": 1000, "port_idx": 3, "poe_mode": "auto" }, { "autoneg": true, "op_mode": "switch", "portconf_id": "61e19e1edfde79156707c912", "name": "Port 4", "full_duplex": true, "speed": 1000, "port_idx": 4, "poe_mode": "auto" }, { "autoneg": true, "op_mode": "switch", "portconf_id": "61e19e1edfde79156707c912", "name": "Port 5", "full_duplex": true, "speed": 100, "port_idx": 5, "poe_mode": "auto" }, { "autoneg": true, "op_mode": "switch", "portconf_id": "61e19e1edfde79156707c912", "name": "Port 6", "full_duplex": true, "speed": 100, "port_idx": 6, "poe_mode": "auto" }, { "autoneg": true, "op_mode": "switch", "portconf_id": "61e19e1edfde79156707c912", "name": "Port 7", "full_duplex": true, "speed": 100, "port_idx": 7, "poe_mode": "auto" }, { "autoneg": true, "poe_mode": "auto", "port_security_mac_address": [], "full_duplex": true, "port_idx": 8, "portconf_id": "61e19e1edfde79156707c912", "name": "Port 8", "speed": 100, "op_mode": "switch" }, { "autoneg": true, "op_mode": "switch", "name": "Port 9", "speed": 1000, "full_duplex": true, "port_idx": 9, "portconf_id": "61e19e1edfde79156707c912" }, { "autoneg": true, "op_mode": "switch", "name": "SFP+ 1", "speed": 1000, "full_duplex": true, "port_idx": 10, "portconf_id": "61e19e1edfde79156707c912" }, { "autoneg": true, "op_mode": "switch", "name": "SFP+ 2", "speed": 1000, "full_duplex": true, "port_idx": 11, "portconf_id": "61e19e1edfde79156707c912" } ], la configuration d'un port et donc comme ceci { "autoneg": true, "op_mode": "switch", "portconf_id": "61e19e1edfde79156707c912", "name": "Port 7", "full_duplex": true, "speed": 100, "port_idx": 7, "poe_mode": "auto" }, si j'ai bien compris ton code tu crées une table temporaire du port pour le PUT cela ne sert a rien puisque elle existe il faut juste la récupere c'est pour cela que je préfère utiliser pour lire une table avec index numérique le j me donne le numéro d'index de la table for j=1,#data_port_overrides do Après tu fais le PUT juste avec la table du port et c'est la que je comprends pas il faudrait que je fasse des tests, si tu injectes la tables du port dans table ("port_overrides") comment peux tu êtres sur qu'elle modifira la bonne table du port vu que tu ne donne pas l'index, c'est peut être possible en lua ? Moi je récupere la table "port_overrides" je cherche la table du port "port_idx" et je modifie la valeur "poe_mode" de cette table Ensuite je fais un PUT de la table complète Comme cela je suis sur que "port_overrides" aura la bonne valeur et je ne serai pas obliger de faire une restauration Voila le code que j'utilise -- By MPRInfo -- Version v0.62b -- UDM Pro SE et UDM Pro gestion des ports POE -- Date 30/01/2022 à 15:00 -- https://www.domotique-fibaro.fr ------------------------------------------------------------------------------------------------------------------------ -- Gestion du bouton du QA ------------------------------------------------------------------------------------------------------------------------ function QuickApp:turnOn() self:debug("binary switch turned on") --self:updateProperty("value", true) self:LoadProfilPorts("auto") end function QuickApp:turnOff() self:debug("binary switch turned off") --self:updateProperty("value", false) self:LoadProfilPorts("off") end ------------------------------------------------------------------------------------------------------------------------ -- connection au controleueur et recupération du cookie ------------------------------------------------------------------------------------------------------------------------ function QuickApp:loginUnifi() if self.cookie == nil then self.http:request("https://"..self.controller..":443/api/auth/login", { options = { checkCertificate = false, method = 'POST', headers = { ["content-type"] = "application/json", }, data = json.encode({ ['username'] = self.login, ['password'] = self.password }) }, success = function(response) --print("status = ", response.status) --print("response",json.encode(response.data)) --print("['Set-Cookie'] = ", response.headers['Set-Cookie']) --print("['X-CSRF-Token'] = ", response.headers['X-CSRF-Token']) if response.status == 200 then self.cookie = response.headers['Set-Cookie'] self.CSRF = response.headers['X-CSRF-Token'] self:trace("X-CSRF-Token = ", self.CSRF) self:updateView("label6", "text", "X-CSRF-Token = "..self.CSRF) --self:debug("loginUnifi() Connecté") --self:debug("Cookie = ", self.cookie) end end, error = function(error) self:error("loginUnifi() Erreur: ", json.encode(error)) end }) end end ------------------------------------------------------------------------------------------------------------------------ -- Mise a jour du profil des ports ------------------------------------------------------------------------------------------------------------------------ function QuickApp:SaveProfilPorts(data_port_overrides, device_id, action) --print("-----------------------------------------------------------SaveProfilPorts()") ---------------------------------------------------------------------------------------------- -- Traitement de la table [data_port_overrides] -- modificaton variable "poe_mode" avec la valeur auto ou off -- cette table servira pour le PUT qui va allumer ou eteindre le port POE ---------------------------------------------------------------------------------------------- local port = 0 local EtatPort = "erreur" for j=1,#data_port_overrides do --if data_port_overrides[j]["poe_mode"] == nil then -- self:trace("port : "..data_port_overrides[j]["port_idx"].." - Status : Non POE") --else -- self:trace("port : "..data_port_overrides[j]["port_idx"].." - Status : "..data_port_overrides[j]["poe_mode"]) --end -- Si le port_idx et egal a la variable POE_Port if data_port_overrides[j]["port_idx"] == tonumber(self:getVariable("Port_POE")) then port = j -- si auto alors off sinon auto alors auto self:trace("Port "..j.." : "..data_port_overrides[j]["poe_mode"]) if (data_port_overrides[j]["poe_mode"] == "auto" and action == "off") or (data_port_overrides[j]["poe_mode"] == "off" and action == "auto") then if data_port_overrides[j]["poe_mode"] == "auto" then data_port_overrides[j]["poe_mode"] = "off" EtatPort = "Auto vers Off" self:updateProperty("value", false) --self:updateView("label4", "text", "Nouveau Etat Port "..j.." : "..data_port_overrides[j]["poe_mode"]) else data_port_overrides[j]["poe_mode"] = "auto" EtatPort = "Off vers Auto" self:updateProperty("value", true) --self:trace("Port "..j.." : Nouveau Status - Auto") end else return end --break end end local dataProfil = {["port_overrides"] = data_port_overrides} if self.cookie ~= nil then self.http:request(self.URL.."rest/device/"..device_id, { options = { checkCertificate = false, --method = 'POST', method = 'PUT', headers = { ["content-type"] = "application/json", ["Accept"] = "application/json", ['Cookie'] = self.cookie, ['X-CSRF-Token']=self.CSRF }, data = json.encode(dataProfil) }, success = function(response) --self:trace("response.status = ", response.status) --print("sucess", json.encode(response)) --print("response.status", response.status) self:trace("Nouveau Etat Port : "..EtatPort) self:updateView("label4", "text", "Nouveau Etat Port : "..port.." - "..EtatPort.." - Status : Ok") return end, error = function(error) self.cookie = nil self:updateView("label4", "text", "Nouveau Etat Port : Echec...") self:error("SaveProfilPorts() échoué: ", json.encode(error)) end }) end end ------------------------------------------------------------------------------------------------------------------------ -- Recupération du profil des ports POE controleur unifi ------------------------------------------------------------------------------------------------------------------------ function QuickApp:LoadProfilPorts(action) --print("----------------------------------------------------------- LoadProfilPorts()") if self.cookie ~= nil then self.http:request(self.URL.."stat/device", { options = { checkCertificate = false, method = 'GET', headers = { ["content-type"] = "application/json", ["Accept"] = "application/json", ['Cookie'] = self.cookie } }, success = function(response) --self:trace("response.status = ", response.status) --self:trace(json.encode(response.data)) local data = json.decode(response.data) if response.status == 200 then if data['meta']['rc'] == "ok" then -- Si reponse OK local POE_Port = tonumber(self:getVariable("Port_POE")) local data = json.decode(response.data) local data_port_table = nil -- Table de la configuration des ports du switch local data_port_overrides = nil -- Table des ports du switch a modifier pour faire le PUT local device_id = "" -- id du switch qui va servir pour l'url du PUT local NonSwitch = "" --self:trace("Nombres devices UNIFI : "..#data["data"]) self:updateView("label1", "text", "Nombres devices UNIFI : "..#data["data"]) for i=1,#data["data"] do -- Scan des devices UNIFI --Liste des device UNIFI avec leurs adresses MAC --self:trace("Mac : "..data["data"][i]["mac"].." - "..librairie.DeviceUnifiName("model", data["data"][i]["model"])) -- Recherche du profil du Switch avec la MAC if data["data"][i]["mac"] == self:getVariable("MAC_Switch") then -- Recherche du profil du Switch avec la MAC -- ID du profile du switch utilisé pour la création de l'url du PUT device_id = data["data"][i]["device_id"] --Recupartion de la table [port_table] information complete du switch data_port_table = data["data"][i]["port_table"] --Recupartion de la table [port_override] Table a modifier qui va servir pour le put data_port_overrides = data["data"][i]["port_overrides"] -- Mise a jour du label NonSwitch = librairie.DeviceUnifiName("model", data["data"][i]["model"]).." - IP :"..data["data"][i]["ip"] --self:updateView("label2", "text", NonSwitch.." : "..#data_port_overrides.." Ports - IP :"..data["data"][i]["ip"]) --self:trace("Switch :".."Table N°("..i..") - MAC : "..data["data"][i]["mac"].." - IP : "..data["data"][i]["ip"]) data = nil break-- Switch trouvé on peut donc arrété la recherche end end if data_port_overrides == nil then self:error("la Mac ne correspond a aucun Switch sur ce controleur") return end ---------------------------------------------------------------------------------------------- -- Traitement de la table [data_port_table] -- Table contenant toute la config des ports du switch -- dans cette exemple je vais récuperer la consommation éléctrique d'un port ---------------------------------------------------------------------------------------------- local consommation = 0 local labelPort = "" local portActif = 0 for i=1,#data_port_table do if tonumber(data_port_table[i]["poe_power"]) > 0 then portActif = portActif + 1 end if data_port_table[i]["port_idx"] == tonumber(self:getVariable("Port_POE")) then self:updateProperty("log", data_port_table[i]["poe_power"].."w") --print("Port "..data_port_table[i]["port_idx"].." : "..data_port_table[i]["poe_power"].."w - Status : "..data_port_table[i]["poe_mode"]) self:updateView("label4", "text", "Port "..data_port_table[i]["port_idx"].." : "..data_port_table[i]["poe_power"].."w - Status : "..data_port_table[i]["poe_mode"]) if data_port_table[i]["poe_mode"] == "auto" then self:updateProperty("value", true) else self:updateProperty("value", false) end end consommation = consommation + data_port_table[i]["poe_power"] if data_port_table[i]["poe_mode"] == nil then labelPort = labelPort.."#"..data_port_table[i]["port_idx"].." : Non POE - " else labelPort = labelPort.."#"..data_port_table[i]["port_idx"].." : "..data_port_table[i]["poe_mode"].." - " end end self:updateView("label2", "text", NonSwitch) self:updateView("label5", "text", labelPort) self:updateView("label3", "text", "POE Actif : "..portActif.."/"..#data_port_table.." - Consommation Total POE : "..consommation.."w") self:trace(NonSwitch.." Consommation POE : "..consommation.."w") if action ~= "mainLoop" then self:SaveProfilPorts(data_port_overrides, device_id, action) end else self.cookie = nil end end end, error = function(error) self.cookie = nil self:error("LoadProfilPorts() échoué: ", json.encode(error)) end }) end end ------------------------------------------------------------------------------------------------------------------------ -- boucle principale ------------------------------------------------------------------------------------------------------------------------ function QuickApp:mainLoop() self:loginUnifi() fibaro.setTimeout(3*1000, function() self:LoadProfilPorts("mainLoop") end) fibaro.setTimeout(self.frequency * 1000, function() self:mainLoop("mainLoop") end) end --------------------------------------------------------------------------------------------------------------------- -- Initialisation du QA --------------------------------------------------------------------------------------------------------------------- function QuickApp:onInit() self:trace("---------------------------------------------------------------------") self:trace("Demarrage du Quick App - UnifiOS Switch port POE auto/off ") self:trace("---------------------------------------------------------------------") -- __TAG = "QA_UDM_Pro_POE_" .. plugin.mainDeviceId --self:updateProperty("log", "Port: "..self:getVariable("Port_POE")) --- frequency self.frequency = self:getVariable("frequency") assert(self.frequency ~= "", "la fréquence n'est pas définie") self.frequency = tonumber(self.frequency) assert(self.frequency ~= nil, "la fréquence n'est pas un nombre") --- login self.login = self:getVariable("login") --- password self.password = self:getVariable("password") --- IP URL self.controller = self:getVariable("IP_UDM_Pro") self.URL = "https://"..self.controller..":443".."/proxy/network/api/s/default/" self.http = net.HTTPClient({ timeout = 2000 }) self:mainLoop() end
  21. mprinfo

    HC2 Freeze 4 LEDs allumées

    Effectivement si tu comptes rester chez fibaro la garder serait judicieux Cela te permettra de te faire la main tranquillement. Moi j'attends que le moteur zwave 3 soit stable avant de peut-être migrer. Par contre tout mes QA sont prêts j'ai juste à inclure les modules le jours où je ferai la migration Envoyé de mon BLA-L29 en utilisant Tapatalk
  22. mprinfo

    HC2 Freeze 4 LEDs allumées

    Tu as 14 jours pour retourner la hc3. Pour madame je sais pas [emoji23] Envoyé de mon BLA-L29 en utilisant Tapatalk
  23. On va arrêter de polluer le typic de Christophe je vais me faire tuer [emoji16] Envoyé de mon BLA-L29 en utilisant Tapatalk
  24. Normalement au premier démarrage tu as la question avant de faire la configuration Après ta box avait peut être un vieux firmware qui ne propose pas le zwave 3 Envoyé de mon BLA-L29 en utilisant Tapatalk
  25. Tu as bien pris le moteur zwave2 j'espère Car le zwave 3 est en bêta Envoyé de mon BLA-L29 en utilisant Tapatalk
×
×
  • Créer...