Aller au contenu

Quick App - Monitoring UDM Pro SE et Pro


mprinfo

Messages recommandés

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é

Lien vers le commentaire
Partager sur d’autres sites

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 :D

Lien vers le commentaire
Partager sur d’autres sites

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

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

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é par TonyC
Lien vers le commentaire
Partager sur d’autres sites

@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 tables

Une avec les paramètres de chaque port

Une 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

 

 

 

 

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

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é par TonyC
Lien vers le commentaire
Partager sur d’autres sites

Je vais voir ta logique
Et on fera un mixte
Moi j'ai coder en prévision des childs
Car j'en ai déjà fais après je ne me rappelle pas de tout

J'ai ajouté une lib pour avoir le nom du devices unifi à partir du nom court

J'ai fait comme cela car autrement je devais me taper du xml

Envoyé de mon BLA-L29 en utilisant Tapatalk

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

@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 :D

 

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

1.jpg.1234967b42a7b353aef4e82b37e09951.jpg

 

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

 

Lien vers le commentaire
Partager sur d’autres sites

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

 

Lien vers le commentaire
Partager sur d’autres sites

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

 

Lien vers le commentaire
Partager sur d’autres sites

@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é par TonyC
Lien vers le commentaire
Partager sur d’autres sites

@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.jpg

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

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 :unsure:

[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é par TonyC
Lien vers le commentaire
Partager sur d’autres sites

×
×
  • Créer...