mprinfo Posté(e) le 25 janvier 2022 Auteur Signaler Posté(e) le 25 janvier 2022 Ca c'est code qui modifie la valeur auto ou off dans la table -- si auto alors off sinon auto alors auto if POE_Profil["data"][i]["port_overrides"][POE_Port]["poe_mode"] == "auto" then POE_Profil["data"][i]["port_overrides"][POE_Port]["poe_mode"] = "off" self:trace(POE_Profil["data"][i]["ip"].." - Port POE : "..POE_Port.."/"..#POE_Profil["data"][i]["port_overrides"].." - Off") self:updateProperty("value", false) else POE_Profil["data"][i]["port_overrides"][POE_Port]["poe_mode"] = "auto" self:trace(POE_Profil["data"][i]["ip"].." - Port POE : "..POE_Port..#POE_Profil["data"][i]["port_overrides"].." - Auto") self:updateProperty("value", true) end Il faut donc faire un for do #POE_Profil["data"]["port_overrides"] Puis faire un test sur la valeur de "port_idx" = POE_Port la tu seras dans la bonne table qui contient les valeur du port et le tour est joué
mprinfo Posté(e) le 25 janvier 2022 Auteur Signaler Posté(e) le 25 janvier 2022 il y a 5 minutes, TonyC a dit : ah oui pas mal en effet, l'avais pas vu. Merci pour le tuyau. Fallait pas redémarrer ta machine, fait tard et demain y'a boulot. Bonne nuit @mprinfo et merci, y'a encore quelques coup de tourne vis à donner, mais ça va vraiment m'aider à sauver quelques bons watts mine de rien, ça consomme pas mal toutes ces cam. Le 24 POE bouffe 65w il alimente grâce au POE++ un autre switch POE sur lequel j'ai 1 cam + l'interphone. Il alimente également 2 AP + 2 autre switch non POE et toutes les autre cam. Bref en coupant le cam dans la journée lorsque onest présent c'est à dire tout le temps maintenant, pas de raison de laisser tout ce beau monde tourner pour rien. Je devrait descendre significativement la conso je pense. A Suivre Aprés si tu t'occupes des childs moi je peux te donner la valeur total de la consommation poe pour chaque ports, switch et site c'est simple a faire par contre je sais plus faire les enfants
TonyC Posté(e) le 25 janvier 2022 Signaler Posté(e) le 25 janvier 2022 Comme ça dit vite fait faire un child par port ne me semble pas insurmontable, mais ça va faire une sacré ribambelle d'enfants, faudra pas divorcer sinon je te dis pas la pension Merci l'ami pour toute ton aide, il fera jour demain le POE va attendre encore un peu Bonne fin de soirée @mprinfo 1
mprinfo Posté(e) le 25 janvier 2022 Auteur Signaler Posté(e) le 25 janvier 2022 Bonne nuitMoi je suis en rtt demain Faut que j'avance un peu niveau bois est piquets d accacia j'ai rien foutu cette hiver Envoyé de mon BLA-L29 en utilisant Tapatalk
mprinfo Posté(e) le 26 janvier 2022 Auteur Signaler Posté(e) le 26 janvier 2022 @tonyC peux-tu tester ce QA Il doit maintenant agir sur le bon port du switch j'ai mis des traces pour voire l'état des ports du switch UDM_Pro_-_POE_On_OFF_v0.31.fqa 1
TonyC Posté(e) le 27 janvier 2022 Signaler Posté(e) le 27 janvier 2022 Salut @mprinfo désolé pour ma réponse tardive, je ne touche pas le sol avec mon taff en ce moment.... Cool merci! je vais downloader ça et si j'ai le courage faire qlqs tests ce soir. Je te tiendrai au jus comme d'hab 1
TonyC Posté(e) le 30 janvier 2022 Signaler Posté(e) le 30 janvier 2022 (modifié) Salut @mprinfo, je me suis permis de refondre le QA cette version est ok mais aucune gestion d'erreur, je ferai une version un peu plus propre dès que j'ai un peu de temps. je la posterai dès que ça aura évolué. En l'état le QA ne vérifie pas encore le nombre de port ni s'ils sont POE ou pas. Donc s'il le port n'existe pas ça se croute lamentablement ... Un grand merci car sans toi et sans doc j'aurai galéré comme un fou surtout le PUT car à l'aveugle j'en ai fait quelques un avant que ça ne marche ! Je ferai une version avec childs avec remonté de la conso, il y a beaucoup de taf car il faut revoir complètement la logique, mais j'ai peut être une petite idée pour faire un truc pas jojo mais bon, à voir. je te tiendrai au jus comme d'hab POE.fqa Modifié le 30 janvier 2022 par TonyC
mprinfo Posté(e) le 30 janvier 2022 Auteur Signaler Posté(e) le 30 janvier 2022 @TonyC tu as une vieille version Le QA que j'ai posté gère les valeurs à nil Je t'avais donné la méthode avec un code brut J'ai même optimiser la taille des variables Pour les childs le plus simple c'est 1 QA par switch 1 variable QA ou tu mets les ports que tu veux actionné et ensuite tu crées les childs Sinon on va avoir trop de childs Pour la consommation je pense qu'il faut un childs avec la consommation poe du switch et la consommation du port on l'affiche dans les log J'ai donc 2 tablesUne avec les paramètres de chaque portUne qui sert pour le put L'index entre les 2 tables est port_idx Ça sert d'avoir programmé sous dbase Envoyé de mon BLA-L29 en utilisant Tapatalk 1
TonyC Posté(e) le 30 janvier 2022 Signaler Posté(e) le 30 janvier 2022 (modifié) c'était laquelle? j'ai du passé à coté. car la 0.31 je fonctionnait que sur le port 1 mais pas sur les autre. J'ai revu la logique sans passer par le port override sauf pour préparer le put. Bref pas grave ça ma occupé ce dimanche, dis moi quelle est la bonne version au pire je m'en inspirerai si besoin. Merci ! Modifié le 30 janvier 2022 par TonyC
mprinfo Posté(e) le 30 janvier 2022 Auteur Signaler Posté(e) le 30 janvier 2022 Je suis à 0.61J'ai ouvert un topics ou je partage le qa Envoyé de mon BLA-L29 en utilisant Tapatalk
TonyC Posté(e) le 30 janvier 2022 Signaler Posté(e) le 30 janvier 2022 ah, je suis reparti ce celle du dessus donc la 0.31. 1
mprinfo Posté(e) le 30 janvier 2022 Auteur Signaler Posté(e) le 30 janvier 2022 Je vais voir ta logiqueEt on fera un mixteMoi j'ai coder en prévision des childsCar j'en ai déjà fais après je ne me rappelle pas de toutJ'ai ajouté une lib pour avoir le nom du devices unifi à partir du nom courtJ'ai fait comme cela car autrement je devais me taper du xmlEnvoyé de mon BLA-L29 en utilisant Tapatalk 1
TonyC Posté(e) le 30 janvier 2022 Signaler Posté(e) le 30 janvier 2022 Génial, je sens que ça va être top tout ça !
mprinfo Posté(e) le 30 janvier 2022 Auteur Signaler Posté(e) le 30 janvier 2022 Oui j'ai un peu temps les soirsLe plus dur c'est de si mettre La banquette est tellement confortable Envoyé de mon BLA-L29 en utilisant Tapatalk
mprinfo Posté(e) le 30 janvier 2022 Auteur Signaler Posté(e) le 30 janvier 2022 Voilà pour la qahttps://www.domotique-fibaro.fr/topic/15510-quick-app-unifios-switch-port-poe-autooff/&share_tid=15510&share_fid=79825&share_type=t&link_source=appEnvoyé de mon BLA-L29 en utilisant Tapatalk
mprinfo Posté(e) le 31 janvier 2022 Auteur Signaler Posté(e) le 31 janvier 2022 @tonyC je viens de regarder ton code si j'ai bien compris ne renvoie pas la table complète des ports mais juste la table du port cela fonctionne t'il bien ? toi tu es un vrai lua men tu utilises les for pair do moi je suis basic men j'utilise for i do il y a un truc que tu as modifier dans la mainloop ------------------------------------------------------------------------------------------------------------------------ -- boucle principale ------------------------------------------------------------------------------------------------------------------------ function QuickApp:mainLoop() --[[ --- 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") ]]-- self.login = self:getVariable("login") self.password = self:getVariable("password") self.mac_switch = self:getVariable("MAC_Switch") self.controller = self:getVariable("IP_UDM_Pro") self.URL = "https://"..self.controller..":443".."/proxy/network/api/s/default/" self.http = net.HTTPClient({ timeout = 3000 }) self:loginUnifi() self:LoadProfilPorts() fibaro.setTimeout(4*1000, function() self:LoadProfilPorts() end) --fibaro.setTimeout( 10* 1000/30, function() -- end)--self.frequency end je sais pas pourquoi tu récupères les valeurs des variables du QA a chaque boucle vu qu'elles ne changent jamais je préfère les mettres dans le onInit(), on les charges un fois est cela suffit pour les boutons function QuickApp:turnOn() --self:debug("binary switch turned on") self:updateProperty("value", true) self:mainLoop() end je ne mets pas le updateProperty car c'est pas parce que tu l'as actionné que cela a fonctionné je mets cela a la fin du PUT si l'action a réussi je ne lance pas mainLoop() mais LoadProfilPorts() 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 j'ai fais comme cela avec la valeur auto ou off et pour le mainloop ------------------------------------------------------------------------------------------------------------------------ -- 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 et je récupere l'action comme cela function QuickApp:LoadProfilPorts(action) si l'action est autre que mainloop c'est a dire auto ou off on pourrait verrouiller plus d'ailleurs je fais ma demande de PUT est j'y ajoute la table et le ID_Profil if action ~= "mainLoop" then self:SaveProfilPorts(data_port_overrides, device_id, action) end voici mon oninit() 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 voila le résultat Tu remarques que maintenant je guère le Non POE Tu as l'etat de tout les ports du Switch le nombre de port actif (port qui consomme du POE) et le nombre total de ports pour la librairie unifi -- Device Unifi mise a jour le 30/01/2022 librairie = {} librairie._VERSION = 1.0 -- -- Recherche le nom du device unifi -- function librairie:DeviceUnifiName(model) local BaseNameDevice = json.decode('{"BZ2":{"base_model":"BZ2","display":"UniFi AP"},"BZ2LR":{"base_model":"BZ2","display":"UniFi AP-LR"},"S216150":{"base_model":"US24P250","display":"UniFi Switch 16 AT-150W","include_fw":"USC8"},"S224250":{"base_model":"US24P250","display":"UniFi Switch 24 AT-250W","include_fw":"USC8"},"S224500":{"base_model":"US24P250","display":"UniFi Switch 24 AT-500W","include_fw":"USC8"},"S248500":{"base_model":"US24P250","display":"UniFi Switch 48 AT-500W","include_fw":"USC8"},"S248750":{"base_model":"US24P250","display":"UniFi Switch 48 AT-750W","include_fw":"USC8"},"S28150":{"base_model":"US24P250","display":"UniFi Switch 8 AT-150W","include_fw":"USC8"},"U2HSR":{"base_model":"U2HSR","display":"UniFi AP-Outdoor+"},"U2IW":{"base_model":"U2IW","display":"UniFi AP-In Wall"},"U2Lv2":{"base_model":"U2Sv2","display":"UniFi AP-LR v2"},"U2O":{"base_model":"BZ2","display":"UniFi AP-Outdoor"},"U2Sv2":{"base_model":"U2Sv2","display":"UniFi AP v2"},"U5O":{"base_model":"BZ2","display":"UniFi AP-Outdoor 5G"},"U6ENT":{"base_model":"U6ENT","display":"U6-Enterprise"},"U6EXT":{"base_model":"U6EXT","display":"U6-Extender"},"U6IW":{"base_model":"U6IW","display":"U6-IW"},"U6M":{"base_model":"U6M","display":"U6-Mesh"},"U7E":{"base_model":"U7E","display":"UniFi AP-AC"},"U7EDU":{"base_model":"U7PG2","display":"UniFi AP-AC-EDU"},"U7Ev2":{"base_model":"U7E","display":"UniFi AP-AC v2"},"U7HD":{"base_model":"U7HD","display":"UniFi AP-HD"},"U7IW":{"base_model":"U7PG2","display":"UniFi AP-AC-In Wall"},"U7IWP":{"base_model":"U7PG2","display":"UniFi AP-AC-In Wall Pro"},"U7LR":{"base_model":"U7PG2","display":"UniFi AP-AC-LR"},"U7LT":{"base_model":"U7PG2","display":"UniFi AP-AC-Lite"},"U7MP":{"base_model":"U7PG2","display":"UniFi AP-AC-Mesh-Pro"},"U7MSH":{"base_model":"U7PG2","display":"UniFi AP-AC-Mesh"},"U7NHD":{"base_model":"U7NHD","display":"UniFi AP-nanoHD"},"U7O":{"base_model":"U7E","display":"UniFi AP-AC Outdoor"},"U7P":{"base_model":"U7P","display":"UniFi AP-Pro"},"U7PG2":{"base_model":"U7PG2","display":"UniFi AP-AC-Pro"},"U7SHD":{"base_model":"U7HD","display":"UniFi AP-SHD"},"UAE6":{"base_model":"UAE6","display":"U6-Extender-EA"},"UAIW6":{"base_model":"UAIW6","display":"U6-IW-EA"},"UAL6":{"base_model":"UAL6","display":"U6-Lite"},"UALR6":{"base_model":"UALR6","display":"U6-LR-EA"},"UALR6v2":{"base_model":"UALR6v2","display":"U6-LR"},"UALR6v3":{"base_model":"UALR6v3","display":"U6-LR"},"UAM6":{"base_model":"UAM6","display":"U6-Mesh-EA"},"UAP6":{"base_model":"UAP6","display":"U6-LR"},"UAP6MP":{"base_model":"UAP6MP","display":"U6-Pro"},"UBB":{"base_model":"UBB","display":"UniFi Building Bridge"},"UBBXG":{"base_model":"UBBXG","display":"UniFi Building-to-Building XG"},"UCK":{"base_model":"UCK","display":"UniFi Cloud Key"},"UCKG2":{"base_model":"UCKG2","display":"UniFi Cloud Key Gen2"},"UCKP":{"base_model":"UCKP","display":"UniFi Cloud Key Plus"},"UCMSH":{"base_model":"U7HD","display":"UniFi AP-MeshXG"},"UCXG":{"base_model":"U7HD","display":"UniFi AP-XG"},"UDC48X6":{"base_model":"UDC48X6","display":"UniFi Data Center 100G-48X6"},"UDM":{"base_model":"UDM","display":"UniFi Dream Machine"},"UDMB":{"base_model":"U7NHD","display":"UDM Beacon"},"UDMPRO":{"base_model":"UDMPRO","display":"UniFi Dream Machine PRO"},"UDMPROSE":{"base_model":"UDMPROSE","display":"UniFi Dream Machine PRO SE"},"UDMSE":{"base_model":"UDMSE","display":"UniFi Dream Machine SE"},"UDR":{"base_model":"UDR","display":"UniFi Dream Router"},"UDW":{"base_model":"UDW","display":"UniFi Dream Wall"},"UFLHD":{"base_model":"U7NHD","display":"UniFi Flex HD"},"UGW3":{"base_model":"UGW3","display":"UniFi Security Gateway"},"UGW4":{"base_model":"UGW4","display":"UniFi Security Gateway-Pro"},"UGWXG":{"base_model":"UGWXG","display":"UniFi Security Gateway XG-8"},"UHDIW":{"base_model":"U7NHD","display":"UniFi AP-HD-In Wall"},"ULTE":{"base_model":"ULTE","display":"UniFi AP-LTE"},"ULTEPEU":{"base_model":"ULTEPEU","display":"UniFi LTE Pro EU"},"ULTEPUS":{"base_model":"ULTEPUS","display":"UniFi LTE Pro US"},"UP1":{"base_model":"UP1","display":"UniFi Smart Power Plug"},"UP6":{"base_model":"UP6","display":"UniFi Smart Power 6-Port Power Strip"},"US16P150":{"base_model":"US24P250","display":"UniFi Switch 16 POE-150W","include_fw":"USC8"},"US24":{"base_model":"US24P250","display":"UniFi Switch 24","include_fw":"USC8"},"US24P250":{"base_model":"US24P250","display":"UniFi Switch 24 POE-250W","include_fw":"USC8"},"US24P500":{"base_model":"US24P250","display":"UniFi Switch 24 POE-500W","include_fw":"USC8"},"US24PL2":{"base_model":"US24PL2","display":"UniFi Switch 24 L2 POE"},"US24PRO":{"base_model":"US24PRO","display":"UniFi Switch Pro 24 PoE"},"US24PRO2":{"base_model":"US24PRO2","display":"UniFi Switch Pro 24"},"US48":{"base_model":"US24P250","display":"UniFi Switch 48","include_fw":"USC8"},"US48P500":{"base_model":"US24P250","display":"UniFi Switch 48 POE-500W","include_fw":"USC8"},"US48P750":{"base_model":"US24P250","display":"UniFi Switch 48 POE-750W","include_fw":"USC8"},"US48PL2":{"base_model":"US24PL2","display":"UniFi Switch 48 L2 POE"},"US48PRO":{"base_model":"US48PRO","display":"UniFi Switch Pro 48 PoE"},"US48PRO2":{"base_model":"US48PRO2","display":"UniFi Switch Pro 48"},"US624P":{"base_model":"US624P","display":"UniFi Switch Enterprise 24 PoE"},"US648P":{"base_model":"US648P","display":"UniFi Switch Enterprise 48 PoE"},"US68P":{"base_model":"US68P","display":"UniFi Switch Enterprise 8 PoE"},"US6XG150":{"base_model":"US6XG150","display":"UniFi Switch 6 XG PoE"},"US8":{"aka_by":"USC8","base_model":"US24P250","display":"UniFi Switch 8","include_fw":"USC8"},"US8P150":{"base_model":"US24P250","display":"UniFi Switch 8 POE-150W","include_fw":"USC8"},"US8P60":{"base_model":"US24P250","display":"UniFi Switch 8 POE-60W","include_fw":"USC8"},"USAGGPRO":{"base_model":"USAGGPRO","display":"Unifi Switch Pro Aggregation"},"USC8":{"base_model":"USC8P450","display":"UniFi Switch 8","hide":true,"include_fw":"US24P250"},"USC8P450":{"base_model":"USC8P450","display":"UniFi Switch Industrial"},"USF5P":{"base_model":"USF5P","display":"UniFi Switch Flex"},"USFXG":{"base_model":"USFXG","display":"UniFi Switch Flex XG"},"USL16LP":{"base_model":"USL16LP","display":"UniFi Switch Lite 16 POE"},"USL16P":{"base_model":"USL16P","display":"UniFi Switch 16 POE"},"USL24":{"base_model":"USL24","display":"UniFi Switch 24"},"USL24P":{"base_model":"USL24P","display":"UniFi Switch 24 POE"},"USL48":{"base_model":"USL48","display":"UniFi Switch 48"},"USL48P":{"base_model":"USL48P","display":"UniFi Switch 48 POE"},"USL8A":{"base_model":"USL8A","display":"UniFi Switch Aggregation"},"USL8LP":{"base_model":"USL8LP","display":"UniFi Switch Lite 8 POE"},"USL8MP":{"base_model":"USL8MP","display":"UniFi Switch Mission Critical"},"USMINI":{"base_model":"USMINI","display":"Unifi Switch Mini"},"USPPDUP":{"base_model":"USPPDUP","display":"UniFi Smart Power Power Distribution Unit Pro"},"USPRPS":{"base_model":"USF5P","display":"UniFi Smart Power Redundant Power System"},"USXG":{"base_model":"USXG","display":"UniFi Switch XG"},"USXG24":{"base_model":"USXG24","display":"UniFi Switch Enterprise XG 24"},"UXBSDM":{"base_model":"U7HD","display":"UniFi AP-BlackBaseStationXG"},"UXGPRO":{"base_model":"UXGPRO","display":"UniFi NeXt-Gen Gateway PRO"},"UXSDM":{"base_model":"U7HD","display":"UniFi AP-BaseStationXG"},"p2N":{"base_model":"p2N","display":"PicoStation M2"}}') return BaseNameDevice[model]["display"] end
TonyC Posté(e) le 1 février 2022 Signaler Posté(e) le 1 février 2022 saslut @mprinfo, dans l'odre de tes questions/remarques Il y a 18 heures, mprinfo a dit : si j'ai bien compris ne renvoie pas la table complète des ports mais juste la table du port cela fonctionne t'il bien ? Oui, je ne vois pas comment ça peut marcher autrement, puisque dans override il n'existe que les ports qui sont overridés. Dans ton QA tu parts des overrides mais puisqu'elle est vide ça ne peut pas fonctionner. Il faut faire attention, car la table d'override avec les tests se pollue et on y retrouve des enregistrements qui n'ont rien à y faire. J'ai fait un restore de l'UDM pour partir d'une table d'override vièrge. Le QA que j'ai posté, fonctionne mais n'est pas exploitable en l'état, si on ne parle pas de toutes les évolutions possibles comme échangé, mais si on se concentre que sur la partie POE. En effet la table d'override se fait overridé En gros le dernier message PUT écrase la table existante, il faudrait fetcher la table d'override tel qu'elle existe avant le PUT et lui insérer le nouvelle chaine d'override du port en question, par concaténation. J'ai essayé de trouvé une astuce pour évité que ça ne s'écrase (le port en tant identifiant unique)mais sans doc c'est pas évident. Donc je ne vois que cette methode pour l'instant. Il y a 18 heures, mprinfo a dit : pour les boutons Il y a 18 heures, mprinfo a dit : je sais pas pourquoi tu récupères les valeurs des variables du QA a chaque boucle vu qu'elles ne changent jamais je préfère les mettres dans le onInit(), on les charges un fois est cela suffit Il y a 18 heures, mprinfo a dit : il y a un truc que tu as modifier dans la mainloop Je suis reparti de ton QA en V0.31, de manière générale je n'est pas retouché le code annexe ou peu, j'ai juste revu le corps pour que le QA puisse fonctionner à minima. il reste encore beaucoup à faire pour que ça soit un vrai QA, enfin en repartant de la souche que je t'ai reposté. J'ai fait une version qui est capable d'activer/désactiver le POE des ports de mes cams qui fait en dure par concaténation des tables, mais c'est juste pas publiable car si ça marche, faut se paluché tout à la main ds le code. Si tu as des idées c'est top, sinon j'essayerai de corriger le tire ce WE si j'ai un peu de temps. On se tient au jus
mprinfo Posté(e) le 1 février 2022 Auteur Signaler Posté(e) le 1 février 2022 je te réponds ici mais normalement c'est l'autre topic Il y a 3 heures, TonyC a dit : Oui, je ne vois pas comment ça peut marcher autrement, puisque dans override il n'existe que les ports qui sont overridés. Dans ton QA tu parts des overrides mais puisqu'elle est vide ça ne peut pas fonctionner. 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
TonyC Posté(e) le 1 février 2022 Signaler Posté(e) le 1 février 2022 (modifié) @mprinfo peut être que je me trompe mais ce que j'appelle table d'override c'est celle qui est sur ton dump json : "port_overrides": [...............}, c'est la table qui est renseignée avec le PUT. Encore une fois je me trompe peut être dans mon approche, franchement c'est pas grave le tout pour moi c'était d'avancer sur comment gérer ce foutu port POE et grâce à toi c'est fait. il y a 52 minutes, mprinfo a dit : Voici le json de "port_overrides" dans le dump que tu as mis sur le port override, comme j'ai écrit sur mon message précédent, tu donnes justement l'exemple de ce que j'ai fait pour contourner la situation à savoir une concaténation dans un seul message des ports que tu veux overrider. si tu change la valeur d'un seul port, et que par la suite du veux changer la valeur d'un autre part alors la valeur prise lors du premier update se fera écraser par la deuxième, et l'UDM remettra automatiquement la valeur par défaut du 1er message. Je ne vois aucune clef dans ce fragment : "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" } ], il aurait fallu un truc dans le genre 1 étant le numéro de port: "port_overrides": [ {port_1: { "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" }, } ], car au put suivant sans la clef, comme tiré de ton exemple il y a 52 minutes, mprinfo a dit : { "autoneg": true, "op_mode": "switch", "portconf_id": "61e19e1edfde79156707c912", "name": "Port 7", "full_duplex": true, "speed": 100, "port_idx": 7, "poe_mode": "off" }, cette chaine écrsera la précédente et l'udm remettra les ports port à ON. dernier truc je ne cherche pas à avoir raison, vraiment si je me trompe je me trompe, je n'y ai passé qu'une journée, je n'ai aucune doc et j'ai un truc qui fait le job. Donc faut pas le prendre mal stp. bon il y a une mise à jour sur la HC3 en stable ! EDIT: Je viens de relire rapidement le code que tu as posté plus haut, la logique me semble bonne, comme évoqué plus haut j'étais repartie de ta souche v0.31. Ce que je lis là a en effet beaucoup évolué. Modifié le 1 février 2022 par TonyC
mprinfo Posté(e) le 1 février 2022 Auteur Signaler Posté(e) le 1 février 2022 @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 1
mprinfo Posté(e) le 1 février 2022 Auteur Signaler Posté(e) le 1 février 2022 je viens de faire un test avec plusieurs port donc plusieurs Qa cela fonctionne super bien 1
TonyC Posté(e) le 1 février 2022 Signaler Posté(e) le 1 février 2022 Y'a vraiment aucun souci @mprinfo, c'est certain qu'à 'écrit on a vite fait de ne pas se comprendre et c'est vrai avec tout le monde. nickel ça avance bien, à ce rythme je n'aurai bientôt qu'à downloader ton QA Chapeau bas l'artiste !
TonyC Posté(e) le 1 février 2022 Signaler Posté(e) le 1 février 2022 il y a 1 minute, mprinfo a dit : cela fonctionne super bien Je vais don essayer de ce pas ! enfin quand tu auras poster ta nouvelle version
mprinfo Posté(e) le 1 février 2022 Auteur Signaler Posté(e) le 1 février 2022 @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 1
TonyC Posté(e) le 1 février 2022 Signaler Posté(e) le 1 février 2022 (modifié) 0.62 ça se rapproche de la 1.00 Je download et je teste dans la foulée. Edit AÏE ça crache au démarrage [01.02.2022] [19:41:01] [TRACE] [QUICKAPP2907]: --------------------------------------------------------------------- [01.02.2022] [19:41:01] [TRACE] [QUICKAPP2907]: Demarrage du Quick App - UnifiOS Switch port POE auto/off [01.02.2022] [19:41:01] [TRACE] [QUICKAPP2907]: --------------------------------------------------------------------- [01.02.2022] [19:41:02] [TRACE] [QUICKAPP2907]: X-CSRF-Token = 7a3874ff-5cbb-4da4-9c1b-8ca06f9bf6bb [01.02.2022] [19:41:05] [ERROR] [QUICKAPP2907]: QuickApp crashed [01.02.2022] [19:41:05] [ERROR] [QUICKAPP2907]: main.lua:194: attempt to compare number with nil vu où sa crash va falloir qlqs minutes pour piger pourquoi il n'arrive pas à valoriser "poe_power". Modifié le 1 février 2022 par TonyC
Messages recommandés