Aller au contenu

Kana-chan

Membres confirmés
  • Compteur de contenus

    333
  • Inscription

  • Dernière visite

  • Jours gagnés

    7

Tout ce qui a été posté par Kana-chan

  1. OK ! Cool que cela fonctionne !
  2. Au sujet du compte et des mots de passe : Le compte a bien les droits d'administration ? Le mot de passe ne comporte pas des caractères trop spéciaux (éviter "!&#" et utiliser seulement "-_" pour voir) ? Avez-vous le 2FA d'activer ? Si oui, essayer en l'enlevant pour voir. Après, il faudrait voir où cela bloque exactement !
  3. Bonjour @jojo Personnellement, j'ai ceci dans les logs : [2025-05-24] [16:18:07] [TRACE] [QA_77_DS_1821P]: UIEvent: {"values":[],"eventType":"onReleased","elementName":"btn4","deviceId":77} [2025-05-24] [16:18:07] [TRACE] [QA_77_DS_1821P]: ========================================== [2025-05-24] [16:18:07] [DEBUG] [QA_77_DS_1821P]: onInit [2025-05-24] [16:18:07] [TRACE] [QA_77_DS_1821P]: Check Connect OK [2025-05-24] [16:18:07] [TRACE] [QA_77_DS_1821P]: Version API Synology OK [2025-05-24] [16:18:07] [DEBUG] [QA_77_DS_1821P]: Messages [1, 6] [2025-05-24] [16:18:08] [TRACE] [QA_77_DS_1821P]: IP Serveur Serveur connecté: 192.168.XXX.YYY:5000 [2025-05-24] [16:18:08] [TRACE] [QA_77_DS_1821P]: Température du Système: 44°C [2025-05-24] [16:18:09] [TRACE] [QA_77_DS_1821P]: Taille des Volumes: volume_1: 60.28% volume_2: 90.76% volume_3: 83.67% [2025-05-24] [16:18:09] [TRACE] [QA_77_DS_1821P]: Température des Disques: Disque 1: 42°C Disque 2: 42°C Disque 3: 37°C Disque 4: 36°C Disque 5: 36°C Disque 6: 39°C Disque 7: 39°C [2025-05-24] [16:18:09] [DEBUG] [QA_77_DS_1821P]: Messages [5, 6] [2025-05-24] [16:18:10] [TRACE] [QA_77_DS_1821P]: Memory: 15% [2025-05-24] [16:18:10] [TRACE] [QA_77_DS_1821P]: CPU: 6% [2025-05-24] [16:18:10] [TRACE] [QA_77_DS_1821P]: ========================================== [2025-05-24] [16:18:11] [DEBUG] [QA_77_DS_1821P]: Messages [6, 6] [2025-05-24] [16:18:11] [DEBUG] [QA_77_DS_1821P]: Messages [6] Fin [2025-05-24] [16:18:11] [DEBUG] [QA_77_DS_1821P]: Deconnection NB messages [0] Vous semblez boucler sur Message [2, 6]. Avez-vous comparé mon code (fournis plus haut) avec votre code ? L'adresse IP et le port sont-ils bien correct ?
  4. Bonne nouvelle !!
  5. Il faut les refaire. J'ai eu le souci aussi, pour les labels, il faut les recréer à l'identique. Pour les boutons, il faut juste les rendre visibles en cochant la case idoine.
  6. Bonjour, Voici mon code qui fonctionne : -- QuickApp Monitoring Nas Synology pour Fibaro HC3 -- Generic device type have no default actions to handle -- HISTORIQUE -- Adapté de https://www.domotique-fibaro.fr/topic/5682-synology-monitoring/ -- v2.4 (29/08/2015 - jojo) : première version -- merci à Krikroff, Lazer, Steven, mprinfo, FDP2 -- v2.41 (02/09/2015 - jojo) : slider pour double click -- V1.0 (14/05/2020) pour Home Center 3 par fredokl et Maxime pour le site www.domotique-fibaro.fr -- V1.1 (15/05/2020) pour Home Center 3 par fredokl et Maxime pour le site www.domotique-fibaro.fr -- Ajout du push pour avertir que le serveur n'est plus connecté -- V1.2 (27/05/2020) pour Home Center 3 par fredokl et Maxime pour le site www.domotique-fibaro.fr -- Transformation du QA en "com.fibaro.genericDevice" à la place de "Commutateur binaire" -- Ajout des icônes "serveur allumé" et "serveur éteint" -- V1.3 (29/05/2020) pour Home Center 3 par fredokl et Maxime pour le site www.domotique-fibaro.fr -- Ajout des boutons "Eject Disk" -- Changement rafraîchissement automatique (toute les minutes ==> Check tout le NAS et toutes les 10 secondes ==> Check les Disk USB) -- Améliorations du code -- Lien topic: https://www.domotique-fibaro.fr/topic/14308-quick-app-monitoring-serveur-nas-synology/ -- Utilisation: -- La connexion au NAS se fait par HTTP -- Créer deux variables "IPAddress" & "TCPPort" -- Renseigner votre "LOGIN" et votre "PASSWORD" -- Pour la fonction WOL, utiliser le QA WOL de Fibaro et appellé-le avec la commande: -- ==> fibaro.call(ID, "turnOn") -- Vous pouvez le modifier et l'améliorer à votre guise. ------------------------------------------------------------------------------------------- ------------------------------------------------------------------------------------------- -- PARAMÈTREs UTILISATEUR -- ------------------------------------------------------------------------------------------- -- System variables function QuickApp:onInit() __TAG = "QA_"..plugin.mainDeviceId.."_DS_1521P" self:trace("==========================================") self:debug("onInit") -- User configurable variables self.login = "xxxx" -- votre login DSM self.password = "xxxx" -- votre mot de psse DSM self.ip = self:getVariable('IPAddress'); self.port = self:getVariable('TCPPort'); self.iconON = 1018 self.iconOFF = 1013 self.variableStatus = "Syno_Masha_Status" self.http = net.HTTPClient({ timeout = 10000 }) self.API_AUTH_ERROR_CODE = { [0] = "Sans erreur.", [100] = "Erreur inconnue.", [101] = "Compte non spécifié.", [400] = "Mot de passe invalide.", [401] = "Compte désactivé.", [402] = "Permission refusée.", [403] = "Unique mot de passe non spécifié.", [404] = "Autentification erronée.", } self.API_RECORD_ERROR_CODE = { [400] = "Exécution ratée.", } self.nbmsg = 0 self.timerOn = false self.isCheckin = false self.nbCheck = 0 --self:autoCheck() self:CheckAll(4) self:updateProperty("deviceIcon", self.iconOFF) end -------------------------------------------------------------------------------------- -- WAKE ON LAN -------------------------------------------------------------------------------------- function QuickApp:uiWoLOnR() fibaro.call(22, "turnOn") end -------------------------------------------------------------------------------------- -------------------------------------------------------------------------------------- -------------------------------------------------------------------------------------- -------------------------------------------------------------------------------------- -- == NE RIEN MODIFIER À PARTIR D'ICI == -------------------------------------------------------------------------------------- -------------------------------------------------------------------------------------- -- FONCTION GETRequest: Connexion GET -------------------------------------------------------------------------------------- function QuickApp:GETRequest(payload, callBack) --self:trace("Commande GETRequest") local url = "http://" ..self.ip ..":" ..self.port ..payload --self:debug("The URL: "..url); self.http:request(url, { options= { headers= { ["Connection"] = "keep-alive", ["Accept"] = "application/json" }, method = "GET" }, success = function(response) self.nbmsg = self.nbmsg + 1 --self:debug("NB msg ["..self.nbmsg.."]") if callBack then callBack(response.data) end end, error = function(message) self:trace("error:" ..json.encode(message)) self.nbmsg = 0 self.timerOn = false end }) end -------------------------------------------------------------------------------------- -- AUTHORISATION CONNEXION NAS -------------------------------------------------------------------------------------- function QuickApp:DoAction(action, nbmsgtotal) --self:trace("Test avant ok connected") self.timerOn = true -- API & informations disponibles payload = "/webapi/query.cgi?api=SYNO.API.Info&method=Query&version=1&query=SYNO.API.Auth" self:GETRequest(payload, function (data) jsonTable = json.decode(data) self.version = jsonTable.data["SYNO.API.Auth"].maxVersion if self.version >= 2 then self:trace("Version API Synology OK") self.pathAuth = jsonTable.data["SYNO.API.Auth"].path self.cgiUsed_cpu_mem = "/entry.cgi" self.cgiUsed_sys= self.cgiUsed_cpu_mem self.cgiUsed_temp = self.cgiUsed_cpu_mem self.cgiUsed_vols = self.cgiUsed_cpu_mem self.apiUsed_cpu_mem = "SYNO.Core.System.Utilization" self.apiUsed_temp_system = "SYNO.Core.System" self.apiUsed_sys= self.apiUsed_temp_system self.apiUsed_temp_disk = self.apiUsed_temp_system self.apiUsed_vols = self.apiUsed_temp_system self.apiMethod_cpu_mem="get" self.apiMethod_temp = "info" self.apiMethod_vols = self.apiMethod_temp self.apiStorage_usb= "SYNO.Core.ExternalDevice.Storage.USB" if self.version < 6 then self.cgiUsed_cpu_mem = "/dsm/system_loading.cgi" self.cgiUsed_sys="/dsm/system.cgi" self.cgiUsed_temp = "/dsm/info.cgi" self.cgiUsed_vols = "/dsm/volume.cgi" self.apiUsed_cpu_mem = "SYNO.DSM.SystemLoading" self.apiUsed_temp_system = "SYNO.DSM.Info" self.apiUsed_temp_disk = "" self.apiUsed_vols = "SYNO.DSM.Volume" self.apiMethod_cpu_mem = "getinfo" self.apiMethod_temp = self.apiMethod_cpu_mem self.apiMethod_vols = "list" self.apiUsed_sys="SYNO.DSM.System" end end self:GetSid_Send(action) self:timer(nbmsgtotal + 2) end ) end -------------------------------------------------------------------------------------- -- FONCTION GetInfo: RÉCUPÉRATION DES DONNÉES -------------------------------------------------------------------------------------- function QuickApp:GetInfo() -- CPU info du DSM payload = "/webapi"..self.cgiUsed_cpu_mem.."?api="..self.apiUsed_cpu_mem.."&version=1&method="..self.apiMethod_cpu_mem.."&type=current&_sid="..self.SID self:GETRequest(payload, function (data) jsonTable = json.decode(data) if jsonTable.success == true then info_cpu = jsonTable.data.cpu load_mem = jsonTable.data.memory.real_usage self:trace("Memory: "..load_mem.."%") info_cpu_memory = "Memory: "..load_mem.."% " load_cpu = 0 if (self.version < 6) then load_cpu = info_cpu.user*100 else load_cpu = info_cpu.other_load+info_cpu.system_load+info_cpu.user_load end self:trace("CPU: "..load_cpu.."%") info_cpu_memory = info_cpu_memory.."CPU: "..load_cpu.."%" self:updateView("lbl3", "text", "Memoire: " ..load_mem .."% " .."CPU: " ..load_cpu .."%") self:trace("==========================================") end end ) -- Info Température Système info du DSM payload = "/webapi"..self.cgiUsed_temp.."?api="..self.apiUsed_temp_system.."&version=1&method="..self.apiMethod_temp.."&_sid="..self.SID self:GETRequest(payload, function (data) jsonTable = json.decode(data) if jsonTable.success == true then if jsonTable.data.sys_temp ~= nil then temp_system = "Température du Système: " ..jsonTable.data.sys_temp.."°C" else temp_system = "Système: N/A" end self:trace(temp_system) self:updateView("lbl4", "text", temp_system) end end ) -- Info Température des disques -- Prépare string temp_disks = ""; payload = "/webapi"..self.cgiUsed_temp.."?api="..self.apiUsed_temp_disk.."&version=2&method="..self.apiMethod_temp.."&type=storage&_sid="..self.SID self:GETRequest(payload, function (data) jsonTable = json.decode(data) if jsonTable.success == true then local disk_tab = jsonTable.data.hdd_info for nb = 1, #disk_tab do temp_disks = temp_disks..disk_tab[nb].diskno..": "..disk_tab[nb].temp.."°C " end self:trace("Température des Disques: "..temp_disks) self:updateView("lbl5", "text", temp_disks) end end ) -- Info taille des disques -- Prépare string vols_load = "" payload = "/webapi"..self.cgiUsed_vols.."?api="..self.apiUsed_vols.."&version=1&method="..self.apiMethod_vols.."&type=storage&_sid="..self.SID self:GETRequest(payload, function (data) jsonTable = json.decode(data) if jsonTable.success == true then local vols_tab = jsonTable.data.vol_info for nb = #vols_tab, 1, -1 do used_size_vol = vols_tab[nb].used_size total_size_vol = vols_tab[nb].total_size occupied_size = self:round(used_size_vol / total_size_vol * 100) vols_load = vols_load..vols_tab[nb].name..": "..occupied_size.."% " end self:trace("Taille des Volumes: "..vols_load) self:updateView("lbl6", "text", vols_load) end end ) -- Affichage IP Serveur self:trace("IP Serveur ", "Serveur connecté: " ..self.ip ..":" ..self.port) self:updateView("lbl1", "text", "Serveur connecté: " ..self.ip ..":" ..self.port) end -------------------------------------------------------------------------------------- -- FONCTION POUR ARRONDIR LES POURCENTAGES -------------------------------------------------------------------------------------- function QuickApp:round(num) local a = math.floor(num*100 + 0.5)/ 100 return a,string.format("%.2f",a) end -------------------------------------------------------------------------------------- -- DÉCONNEXION -------------------------------------------------------------------------------------- function QuickApp:Disconnect() payload = "/webapi/"..self.pathAuth.."?api=SYNO.API.Auth&method=Logout&version=6&session=DSM&_sid="..self.SID self:GETRequest(payload, function(data) jsonTable = json.decode(data) if jsonTable.success == true then self.nbmsg = 0 self:debug("Deconnection NB messages ["..self.nbmsg.."]") else self:trace("Impossible de déconnecter !") end end ) end -------------------------------------------------------------------------------------- -- TIMER -------------------------------------------------------------------------------------- function QuickApp:timer(nbmsgtotal) if self.timerOn then self:debug("Messages ["..self.nbmsg..", "..nbmsgtotal.."]") if self.nbmsg < nbmsgtotal then fibaro.setTimeout(2000, function() self:timer(nbmsgtotal) end) else self:Disconnect() self.nbmsg = 0 self.timerOn = false self.isCheckin = false self:debug("Messages ["..nbmsgtotal.."] Fin") end end end -------------------------------------------------------------------------------------- -- REFRESH -------------------------------------------------------------------------------------- function QuickApp:autoCheck() self.nbCheck = self.nbCheck + 1 self:CheckAll(4) fibaro.setTimeout(1000*3600, function() self:autoCheck() end) -- 3600 secondes end -------------------------------------------------------------------------------------- -- VÉRIFICATION DE TOUS LES ÉLÉMENTS -------------------------------------------------------------------------------------- function QuickApp:CheckAll(nbOperation) self:CheckConnect( function() if self.isCheckin == false then self.isCheckin = true self:DoAction(function () self:GetInfo() end, nbOperation) end end ) heure = os.date("%H:%M:%S") date = os.date("%d/%m") dateheure = string.format(" %s à %s", date, heure) self:updateView("lbl7", "text", "Dernière vérification: "..dateheure) end -------------------------------------------------------------------------------------- -- CRÉATION D'UN NOUVEAU SID ET ENVOI DES COMMANDES -------------------------------------------------------------------------------------- function QuickApp:GetSid_Send(callBack) payload = "/webapi/"..self.pathAuth.."?api=SYNO.API.Auth&version=6&method=Login&account="..self.login.."&passwd="..self.password.."&session=DSM&format=sid" self:GETRequest(payload, function (data) jsonTable = json.decode(data) if jsonTable.success == true then self.SID = jsonTable.data.sid callBack() end end ) end -------------------------------------------------------------------------------------- -- BOUTON RAFRAÎCHISSEMENT -------------------------------------------------------------------------------------- function QuickApp:uiCheckOnR(event) self:onInit() end -- Check Connect function QuickApp:CheckConnect(callBack) self.tcp = net.TCPSocket({timeout = 5000}) self.tcp:connect(self.ip, tonumber(self.port), { success = function() self:trace("Check Connect OK") self:updateView("lbl2", "text", "Serveur: Allumé") fibaro.setGlobalVariable(self.variableStatus, "1") self:updateProperty("deviceIcon", self.iconON) -- Mettre ici le code pour l'icone allumé self.tcp:close() if callBack then callBack() end end, error = function(message) self:trace("erreur "..message) self:updateProperty("deviceIcon", self.iconOFF) -- mettre ici le code pour l'icone éteint self:updateView("lbl1", "text", "Serveur connecté: N/A") self:updateView("lbl2", "text", "Serveur: Éteint") self:updateView("lbl3", "text", "Mémoire: N/A") self:updateView("lbl4", "text", "Température Système: NA") self:updateView("lbl5", "text", "Température diques: N/A") self:updateView("lbl6", "text", "Volume des disques: N/A") fibaro.setGlobalVariable(self.variableStatus, "0") -------------------------------------------------------------------------------------- -- ENVOI PUSH TOUTES LES DIX MINUTES -------------------------------------------------------------------------------------- if self.nbCheck%60 == 0 then fibaro.alert("push", {26}, "NAS Synology DS 718+ est éteint: " ..os.date("%H:%M:%S")) end end }) end -------------------------------------------------------------------------------------- -- REDÉMARRAGE DU DISK STATION -------------------------------------------------------------------------------------- -- Bouton Reboot function QuickApp:uiRebootOnP(event) self:CheckConnect( function() if self.isCheckin == false then self.isCheckin = true self:DoAction(function () self:Reboot() end, 1) else self:trace("Trop tot...") end end ) end -- Code Reboot function QuickApp:Reboot() self:trace("Le Disk Station Synology va redémarrer") payload = "/webapi"..self.cgiUsed_sys.."?api="..self.apiUsed_sys.."&version=1&method=reboot&_sid="..self.SID; self:GETRequest(payload, function(data) jsonTable = json.decode(data) if jsonTable.success == true then self:trace("Le Disk Station Synology a redémarré !") end end ) end -------------------------------------------------------------------------------------- -- ARRÊT DU DISK STATION -------------------------------------------------------------------------------------- -- ShutDown the disk station function QuickApp:uiShutdownOnP(event) self:CheckConnect( function() if self.isCheckin == false then self.isCheckin = true self:DoAction(function () self:ShutDown() end, 1) end end) end function QuickApp:ShutDown() self:trace("Le Disk Station va s'arrêté") payload = "/webapi"..self.cgiUsed_sys.."?api="..self.apiUsed_sys.."&version=1&method=shutdown&_sid="..self.SID; self:GETRequest(payload, function(data) jsonTable = json.decode(data) if jsonTable.success == true then self:trace("Le Disk Station s'est arrêté !") end end ) end -------------------------------------------------------------------------------------- -- FIN DU CODE -- -------------------------------------------------------------------------------------- Ce code est simplifié car je crois que j'avais enlevé la partie sur de l'USB. Le port TCP c'est le port 5000 si vous ne l'avez pas changé. C'est celui d'accès à l'interface d'administration du Synology. Le port 80 est le port utilisé pour les sites web que vous créez sur votre Synology.
  7. Bonjour, Il faut voir ce que reçoit normalement la variable self.pathAuth, qui doit être avant dans le code. Avez-vous bien renseigner les variables globales du QA ?
  8. Kana-chan

    HPE ProLiant MicroServer Gen11

    Proxmox, mouais ... J'ai des soucis avec une VM d'un Windows Serveur 2019 et il aime pas les E-Cores apparemment.
  9. Oui, j'ai moi même un DS1821+, je pense le garder le plus longtemps possible et passer sur un Ugreen qui monte, ou un Asustor. Les QNAP sont biens, mais je voudrais voir ailleurs.
  10. Je ne connais pas le script, mais il y a peut-être une résolution de l'adresse en nom. Il aurait fallu mettre l'IP local 127.0.0.1, pour que cela fonctionne avec root, je pense.
  11. Salut, Le script est au format DOS pour le retour à la ligne. Il faut le mettre au format UNIX. Pour ce faire : dos2unix </volume1/ScriptsUnix/backup_MariaDB.sh> Ou bien c'est le Shanbang qui n'est pas bon, et essayer de le remplacer par /bin/sh par exemple. Il faudrait vous connecter sur le NAS en SSH pour vérifier que vous avez bien un sh dans /bin ou /usr/bin. P.S. : dos2unix ... n'existe pas dans DSM. Sous notepad++, choisir d'enregistrer avec la norme UNIX pour le retour à la ligne, et le retransmettre au NAS ensuite.
  12. Oui, une valeur nulle car la version=1 n'est plus bonne et donc le json est vide. D'où le changement de cette entrée de la ligne payload= ...
  13. Bonjour, Avez-vous un DSM en version 7 ? Si oui, avez-vous changé la version dans le code comme c'est indiqué plus haut ?
  14. Si c'est pour domocharts, il n'y a pas de connexion avec user/password donc je ferais un appel en http vers du http et non en https vers du http, dans ton HAProxy.
  15. Bonjour Jojo, C'est dommage de ne pas utiliser le proxy inversé (HAProxy) du Synology s'il a aussi un serveur Web. Là, ton erreur c'est comme si tu avais une option qui transporte en https même si tu as demandé du http. C'est une option de ton serveur HAProxy ou de ton serveur web sur le NAS Synology.
  16. Kana-chan

    Bonne année 2025

    Bonne année 2025 à tous !
  17. Bonjour, Pareil chez moi sous Firefox. Mais c'est aussi le cas pour annonces et suggestions ... chez moi.
  18. C'est le request implémenté en LUA fibaro qui doit poser problème. Essayez avec data="password=blabla" pour voir car il n'y a pas params= pour request dans le LUA de fibaro, et adresse = "mabbox.bytel.fr" pour être dans les mêmes conditions.
  19. Je ne sais plus trop en LUA mais request doit avoir plusieurs arguments, il doit être possible de mettre data= (comme body) ou bien params= (pour mettre des ?aa=bb&cc=dd comme sur une URL) ou encore json= (avec du code JSON derrière), comme vous faite le headers=. Après, il faut trouver la forme de ces arguments, est-ce une chaine de caractères ? Je ne sais plus. Edit : Bon je viens de lire la doc de fibaro sur request et dans les options c'est bien headers=, data=, method= et timeout=. Donc essaie plutôt avec adresse = "mabbox.bytel.fr".
  20. Bonjour, Dans le header, il n'est pas utile de mettre Content-Length et Host. Après, est-ce de la data le password ? ou bien un params plutôt ?
  21. a=json.encode(response.data) fibaro:debug(a["body"]) fibaro:debug(a["body"]["1719346149"]) Un truc du genre... mais si le big numéro change alors il faut chercher un peu. Pour cela, tu as Google, et en cherchant "LUA JSON get values, get keys" tu devrais pouvoir trouver.
  22. Bonjour, Je ne crois pas que ce soit dans le header qu'il faut mettre le device_id, module_id... Je pense qu'il faut mettre cela dans un champ params = {}. Un truc du genre : http:request( "https://api.netatmo.net/api/getmeasure", { options = { method = 'GET', headers = { "Content-Type": "application/json", "Authorization": "Bearer "..accessToken, }, params={ "device_id": DeviceID, "module_id": ModuleID, "scale": "1hour", "type": "Humidity", "limit": "1", "optimize": "false", "real_time": "false", "date_End": os.date() }, success = callback, error = callback }, end, error = function(error) fibaro:debug("Failed to authenticate: " .. error) end } ) À adapter ...
  23. Mon Token a expirée cette nuit donc ... génération de nouveau et cela fonctionne à nouveau !
  24. Je me suis mal exprimé : en fait j'utilise en le stockant le refresh_token qui est récupéré avec l'access_token au moment de la demande d'authentification. Et donc si cela change, j'ai les derniers en mémoire. C'est tout.
  25. Comme Lazer, mon token fonctionne toujours, mais j'avais intégré la rotation des tokens... est-ce pour cela ? Est-ce que cela fonctionne ? Mystère.
×
×
  • Créer...