Aller au contenu
fdp2

Arreter Ou Rebooter Votre Synology Avec La Hc2

Recommended Posts

Salut les experts.

J'ai également un Syno 5.2, mais plus de HC2 (donc je ne sais pas importer le VD partagé).

Mais je serais SUPER intéressé par le code des différentes API (pour pouvoir le traduire dans ma LD).

Faites au plus simple pour vous :

  • vous postez le code de l'entièreté du VD
  • ou juste les différentes URL de l'api.

MERCI !

Partager ce message


Lien à poster
Partager sur d’autres sites
Le 21/7/2017 à 00:42, domo a dit :

Capture d’écran 2017-07-21 à 00.42.03.png

Pour ton info, sur mac tu peux faire très simplement une capture d'écran avec l'appli Aperçu (en sélectionnant une partie de ton écran, puis export au format png) :P

Partager ce message


Lien à poster
Partager sur d’autres sites

faut que je regarde ça de plus pres ;) merci pour l'info 

Partager ce message


Lien à poster
Partager sur d’autres sites

impeccable ça fonctionne c'est validée pour moi:60: merci beaucoup Kana-chan :13:

Partager ce message


Lien à poster
Partager sur d’autres sites

@jojo :

Voici le code du VD pour récupérer les infos :

--------------------------------------------------
-- Synology DSM
-- Reboot the disk station
-- janvier 2015
--------------------------------------------------

-- User configurable variables
local login = fibaro:getGlobal("LoginNAS");
local password = fibaro:getGlobal("MdpNAS");

-- System variables
local selfID = fibaro:getSelfId();
local ip = fibaro:get(selfID, 'IPAddress');
local port = fibaro:get(selfID, 'TCPPort');
local nameNAS = fibaro:getName(selfID);
local Synology = Net.FHttp(ip, tonumber(port));
local 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."
};
local API_RECORD_ERROR_CODE = {
	[400] = "Exécution ratée.",
};
local OK_connected = false;

-- Test connection
tcpSocket = Net.FTcpSocket(ip, tonumber(port));
bytes, errorCode = tcpSocket:write("Test");
fibaro:log("Détection");
if errorCode == 0 then
  OK_connected = true;
  fibaro:log(nameNAS.." ON");
  fibaro:call(selfID, "setProperty", "currentIcon", "52");
  --fibaro:call(175, "sendDefinedPushNotification", "Ping ReseauHome OK");
else
  fibaro:log(nameNAS.." OFF");
  fibaro:call(selfID, "setProperty", "currentIcon", "53");
  --fibaro:call(175, "sendDefinedPushNotification", "Ping ReseauHome OFF");
end
tcpSocket:disconnect();

-- Round function to display percentages
round = function(num)
  local a = math.floor(num*100+0.5)/100;
  return a,string.format("%.2f",a);
end

if OK_connected then
  -- Discover available APIs and corresponding information
  payload = "/webapi/query.cgi?api=SYNO.API.Info&method=Query&version=1&query=SYNO.API.Auth";
  response, status, errorCode = Synology:GET(payload);
  if tonumber(status) == 200 then
    jsonTable = json.decode(response);
    version = jsonTable.data["SYNO.API.Auth"].maxVersion;
    if version >= 2 then
      fibaro:debug("Version API Synology OK");
      pathAuth = jsonTable.data["SYNO.API.Auth"].path;
      fibaro:debug("Chemin API Synology = "..pathAuth);
      cgiUsed_cpu_mem = "/entry.cgi";
      cgiUsed_temp = cgiUsed_cpu_mem;
      cgiUsed_temp_disk = cgiUsed_cpu_mem;
      cgiUsed_vols = cgiUsed_cpu_mem;
      apiUsed_cpu_mem = "SYNO.Core.System.Utilization";
      apiUsed_temp_system = "SYNO.Core.System";
      apiUsed_temp_disk = apiUsed_temp_system;
      apiUsed_vols = apiUsed_temp_system;
      apiMethod_cpu_mem="get";
      apiMethod_temp = "info";
      apiMethod_temp_disk = apiMethod_temp;
      apiMethod_vols = apiMethod_temp;
      if version < 6 then
        cgiUsed_cpu_mem = "/dsm/system_loading.cgi";
        cgiUsed_temp = "/dsm/info.cgi";
        cgiUsed_temp_disk = "/entry.cgi";
        cgiUsed_vols = "/dsm/volume.cgi";
        apiUsed_cpu_mem = "SYNO.DSM.SystemLoading";
        apiUsed_temp_system = "SYNO.DSM.Info";
        apiUsed_temp_disk = "SYNO.Core.System";
        apiUsed_vols = "SYNO.DSM.Volume";
        apiMethod_cpu_mem = "getinfo";
        apiMethod_temp = apiMethod_cpu_mem;
        apiMethod_temp_disk = "info";
        apiMethod_vols = "list";
      end
      
      -- Create new login session
      payload = "/webapi/"..pathAuth.."?api=SYNO.API.Auth&method=Login&version=2&account="..login.."&passwd="..password.."&session=DSM&format=sid";
      response, status, errorCode = Synology:GET(payload);
      if tonumber(status) == 200 then
        jsonTable = json.decode(response);
        if jsonTable.success == true then
          SID = jsonTable.data.sid;
          fibaro:debug("SID API Synology = ["..SID.."]");
          
          -- Prepare string
          local info_cpu_memory = "";
          
          -- CPU info from the disk station
          payload = "/webapi"..cgiUsed_cpu_mem.."?api="..apiUsed_cpu_mem.."&version=1&method="..apiMethod_cpu_mem.."&type=current&_sid="..SID;
          response, status, errorCode = Synology:GET(payload);
          if tonumber(status) == 200 then
            jsonTable = json.decode(response);
            if jsonTable.success == true then
              info_cpu = jsonTable.data.cpu;
              info_mem = jsonTable.data.memory;
              load_cpu = 0;
              load_mem = 0;
              if (version < 6) then
                load_cpu = round(info_cpu.user*100);
                load_mem = round((info_mem.total-(info_mem.buffer+info_mem.cached+info_mem.free))/info_mem.total*100);
              else
                load_cpu = round(info_cpu.other_load+info_cpu.system_load+info_cpu.user_load);
                load_mem = round(info_mem.real_usage);
              end
              fibaro:debug("Memory: "..load_mem.."%");
              info_cpu_memory = "Memory: "..load_mem.."% ";
              fibaro:debug("CPU: "..load_cpu.."%");
              info_cpu_memory = info_cpu_memory.."CPU: "..load_cpu.."%";
              fibaro:call(selfID, "setProperty", "ui.CPULoad.value", info_cpu_memory);
            end
          else
            fibaro:log("Erreur");
            fibaro:debug('<span style="color:red;">Erreur : '..API_AUTH_ERROR_CODE[tonumber(errorCode)]..'</span>');
          end
          
          -- Temp info from the disk station
          payload = "/webapi"..cgiUsed_temp.."?api="..apiUsed_temp_system.."&version=1&method="..apiMethod_temp.."&_sid="..SID;
          response, status, errorCode = Synology:GET(payload);
          if tonumber(status) == 200 then
            jsonTable = json.decode(response);
            if jsonTable.success == true then
              temp_system = "System: N/A";
              if (version < 6) then
                if jsonTable.data.temperature ~= "undefined" then
                  temp_system = "System: "..round(jsonTable.data.temperature).."°C";
                end
              else
                if jsonTable.data.sys_temp ~= nil then
                  temp_system = "System: "..round(jsonTable.data.sys_temp).."°C";
                end
              end
              fibaro:debug("Temperature "..temp_system);
              fibaro:call(selfID, "setProperty", "ui.SYSTEMTemp.value", temp_system);
            end
          else
            fibaro:log("Erreur");
            fibaro:debug('<span style="color:red;">Erreur : '..API_AUTH_ERROR_CODE[tonumber(errorCode)]..'</span>');
          end
          
          -- Prepare string
          local temp_disks = "";
          
          -- Temp info from the disk station
          payload = "/webapi"..cgiUsed_temp_disk.."?api="..apiUsed_temp_disk.."&version=1&method="..apiMethod_temp_disk.."&type=storage&_sid="..SID;
          response, status, errorCode = Synology:GET(payload);
          if tonumber(status) == 200 then
            jsonTable = json.decode(response);
            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..": "..round(disk_tab[nb].temp).."°C ";
              end
              fibaro:debug("Disks temperature: "..temp_disks);
              fibaro:call(selfID, "setProperty", "ui.DISKSTemp.value", temp_disks);
            end
          else
            fibaro:log("Erreur");
            fibaro:debug('<span style="color:red;">Erreur : '..API_AUTH_ERROR_CODE[tonumber(errorCode)]..'</span>');
          end
          
          -- Prepare string
          local vols_load = "";
          
          -- Temp info from the disk station
          payload = "/webapi"..cgiUsed_vols.."?api="..apiUsed_vols.."&version=1&method="..apiMethod_vols.."&type=storage&_sid="..SID;
          response, status, errorCode = Synology:GET(payload);
          if tonumber(status) == 200 then
            jsonTable = json.decode(response);
            if jsonTable.success == true then
              local vols_tab = 0;
              if (version < 6) then
                vols_tab = jsonTable.data.volumes;
              else
                vols_tab = jsonTable.data.vol_info;
              end
              for nb = #vols_tab, 1, -1 do
                if (version < 6) then
                  used_size_vol = vols_tab[nb].used;
                  total_size_vol = vols_tab[nb].total;
                else
                  used_size_vol = vols_tab[nb].used_size;
                  total_size_vol = vols_tab[nb].total_size;
                end
                occupied_size = round(used_size_vol/total_size_vol*100);
                if (version < 6) then
                  vols_load = vols_load..vols_tab[nb].id..": "..occupied_size.."% ";
                else
                  vols_load = vols_load..vols_tab[nb].name..": "..occupied_size.."% ";
                end
              end
              fibaro:debug("Volumes Load: "..vols_load);
              fibaro:call(selfID, "setProperty", "ui.VOLSLoad.value", vols_load);
            end
          else
            fibaro:log("Erreur");
            fibaro:debug('<span style="color:red;">Erreur : '..API_AUTH_ERROR_CODE[tonumber(errorCode)]..'</span>');
          end
          
          -- Destroy current login session
          payload = "/webapi/"..pathAuth.."?api=SYNO.API.Auth&method=Logout&version=2&session=DSM&_sid="..SID;
          response, status, errorCode = Synology:GET(payload);
          fibaro:debug("Déconnexion: "..status);
        else
          fibaro:log("Erreur");
          fibaro:debug('<span style="color:red;">Erreur : '..API_AUTH_ERROR_CODE[tonumber(jsonTable.error.code)]..'</span>');
        end
      else
        fibaro:log("Erreur");
        fibaro:debug('<span style="color:red;">Erreur : Authentification API ratée</span>');
      end
    else
      fibaro:log("Erreur");
      fibaro:debug('<span style="color:red;">Erreur : Version API Synology trop vieille : <b>DSM 4.0-2251</b> est requise</span>');
    end
  else
    fibaro:log("Erreur");
    fibaro:debug('<span style="color:red;">Erreur : Impossible de se connecter au Disk Station Synology</span>');
  end
else
  fibaro:call(selfID, "setProperty", "ui.CPULoad.value", "Memory: N/A % CPU: N/A %");
  fibaro:call(selfID, "setProperty", "ui.SYSTEMTemp.value", "System: N/A °C");
  fibaro:call(selfID, "setProperty", "ui.DISKSTemp.value", "Disk: N/A °C");
end

 

Modifié par Kana-chan
  • Upvote 2

Partager ce message


Lien à poster
Partager sur d’autres sites

@Kana-chan,

Merci pour ton code.

Je suis en DSM 5.2-5967

Toutes tes URL fonctionnent chez moi, sauf celle-ci, pour la température des disques

!! -- Disks temp info from the disk station
payload = "/webapi"..cgiUsed_temp_disk.."?api="..apiUsed_temp_disk.."&version=1&method="..apiMethod_temp_disk.."&type=storage&_sid="..SID;
http://xxx.xxx.xxx.xxx:yyyy/webapi/entry.cgi?api=SYNO.Core.System&version=1&method=info&type=storage&_sid=zzzzzzzzzzz
{"error":{"code":105},"success":false}

où est mon erreur ?

Partager ce message


Lien à poster
Partager sur d’autres sites

j'ai cette erreur (pour cette url seulement) avec un utilisateur qui appartient au groupe standard admin.

Avec l'utilisateur admin que j'ai créé à la création de mon DSM, cela fonctionne.

Donc c'est un problème de droits, je continue d'investiguer.

Partager ce message


Lien à poster
Partager sur d’autres sites

après génération d'un nouvel sid, ça à fonctionné : les mystères de l'informatique

Partager ce message


Lien à poster
Partager sur d’autres sites

Bonjour jojo,

 

Je pense que c'est le cache du navigateur (ou du système) qui a dû jouer des tours. :D

 

Voilà ... :P

 

Partager ce message


Lien à poster
Partager sur d’autres sites

En tout cas, merci @kana-chan pour ton aide. M'autorises-tu (quand je serai prêt...) à faire un petit tuto sur le forum Lifedomus (et faisant pointer mes sources ici) pour expliquer la solution ?

Envoyé de mon Nexus 5 en utilisant Tapatalk

Partager ce message


Lien à poster
Partager sur d’autres sites

Top, faudra que je mette à jour ma version.

Partager ce message


Lien à poster
Partager sur d’autres sites

Salut @Kana-chan !!! :D

Pourrais tu me donner cette syntaxe :

http://<adresse_ip_nas:port_dsm>/webapi/auth.cgi?api=SYNO.API.Auth&method=Login&version=2&account=<login_admin>&passwd=<password_admin>&session=DSM&format=sid

pour DSM6.1 ?

 

En te remerciant d'avance !!! ;)

 

Edit : Mille excuses, ça marche !!!! :60:

Je suis aller trop vite !!! ;)

Modifié par Talwayseb
Mille excuses, ça marche !!!!

Partager ce message


Lien à poster
Partager sur d’autres sites
Le 22/07/2017 à 12:02, Kana-chan a dit :

Bonjour domo,

 

Voici la dernière (je l'espère !! :D) version avec la prise en charge de la température des disques dur.

Pouvez-vous tester de votre coté ?

 

Merci ... :P

 

Synology_NAS.vfib

 

 

Bonjour Kana Chan, 

 

Voilà tous d'abord merci mille fois de te pencher avec succès sur cette problématique .

 

En effet cela m'intéresse beaucoup de pouvoir allumer ou éteindre mes NAS directement depuis la HC2 cela évitera de lancer une énième apps sur le GSM juste pour faire le WOL puis de me connecter en mode web pour l'éteindre ;)

 

 

J'ai donc utilisé le dernier fichier vifb que tu as fourni datant du 22 juillet.

 

Je suis sous le DSM 6.1.3-15152 Update 4 avec un premier NAS DS1511+.

 

J'ai donc importé le module virtuel,

Puis dans général j'ai modifié le nom, la pièce , l'ip en x.x.x.x , le port ( j'ai utilisé celui que je voie dans mon navigateur internet ) 

 

Ensuite je suis allez sur la page avancée :

 

ici dans chaque bouton ( redémarrer / arrêter / état )

J'ai modifié comme suit les 2 premières lignes :

local login = fibaro:getGlobal("xxx");
local password = fibaro:getGlobal("yyy");

 

 

 

Puis j'ai modifié les icônes pour que ce soit joli.

 

Je suis sortie pour revenir dans la page pièces , je suis allez sur le module, et j'ai essayé le bouton réveillé.

 

Rien ne se passe.

 

J'ai allumer le NAS via l'apps de mon GSM oui j’ai essayé redémarrer oui 2 min après arrêter et la aussi rien en ce passe.

 

Voilà c'est mon premier module virtuel certainement que j'ai oublié une modification a faire, mais j'ai beau relire le Topic je ne comprends pas ou .

 

Merci de ton aide .

 

 

 

 

 

Modifié par Gandalf

Partager ce message


Lien à poster
Partager sur d’autres sites

Bonjour Gandalf,

 

En fait, il ne faut pas changer les valeurs dans les fonctions fibaro:getGlobal("LoginNAS") et fibaro:getGlobal("MdpNAS").

Il faut créer des variables globales LoginNAS, MdpNAS, MacNAS et BcastNAS dans le panneau de la HC2 pour que les boutons Arrêter, Redémarrer et Etat fonctionnent.

 

Comme vous avez plusieurs NAS, soit vous utilisez le même compte pour les deux (donc LoginNAS et MdpNAS), soit vous utilisez des noms de variables globales différents (LoginNAS1, MdpNAS1, MacNAS1,...).

 

D'ailleurs, pour créer ces variables, il faut créer une scène spéciale pour cela :

--[[
%% properties
%% events
%% globals
--]]

-- NAS General
fibaro:setGlobal("BcastNAS", "ici_adresse_de_broadcast_sur_votre_réseau_finissant_par_.255");
fibaro:setGlobal("LoginNAS1", "ici_compte_admin");
fibaro:setGlobal("MdpNAS1", "ici_mot_de_passe");
fibaro:setGlobal("MacNAS1", "ici_adresse_mac_syno1");
fibaro:setGlobal("LoginNAS2", "ici_compte_admin");
fibaro:setGlobal("MdpNAS2", "ici_mot_de_passe");
fibaro:setGlobal("MacNAS2", "ici_adresse_mac_syno2");

Exécutez cette scène une fois seulement et vous créerez les variables globales avec leur contenu.

 

Enfin, il faut le VD devrait fonctionner.

 

Voilà ... :D

 

 

Partager ce message


Lien à poster
Partager sur d’autres sites

Bonjour,

 

Houlla je crois que j'ai compris 50% LoL

 

Pour faire propre je vais reprendre a 0 ;)

 

Je vais donc supprimer le VD ( Virtual Device ? ) que j'ai créé avec ton/votre ? Fichier Synology_NAS.vfib .

 

ET vu que j'ai beaucoup de NAS je vais en créer autant que j'ai de NAS .

 

Je vais renommer dans chaque VD les variables globales LoginNAS, MdpNAS, MacNAS et BcastNAS en  LoginNAS, MdpNAS, MacNAS1 et BcastNAS le second en LoginNAS, MdpNAS, MacNAS2 et BcastNAS ect..

 

Sachant que j'ai créé un USER spécifique avec le même login et le même MdP sur chaque NAS, mais que l'adresse MAC change et le Bcast lui c'est le même pour tous .

 

Puis il faut que je crée une scène LUA que je copie ton code dedans et que je le change pour chaque NAS 

 

 

--[[
%% properties
%% events
%% globals
--]]

-- NAS General
fibaro:setGlobal("BcastNAS", "10.10.10.255");
fibaro:setGlobal("LoginNAS", "Login");
fibaro:setGlobal("MdpNAS", "password");
fibaro:setGlobal("MacNAS1", "00:09:08:07:06:05");
fibaro:setGlobal("MacNAS2", "00:09:08:07:06:04");
fibaro:setGlobal("MacNAS3", "00:09:08:07:06:03");
fibaro:setGlobal("MacNAS4", "00:09:08:07:06:02");

 

 

Puis j'exécute une fois cette scène puis je retourne voir chaque NAS si les infos remontent bien et/ou si les boutons sont OK ?

 

 

Pardon pour ce récapitulatif, mais j'aime bien être sûr d'avoir compris ;)

 

Merci

 

 

Partager ce message


Lien à poster
Partager sur d’autres sites

Bonjour,

 

Oui c'est bien cela !

Mais n'oubliez pas de les créer dans le panneau des variables avant d'exécuter la scène, car je crois qu'il faut qu'elles existent pour être remplies.

 

Voilà ... :D

 

Partager ce message


Lien à poster
Partager sur d’autres sites

Hiiiiiiiiii

 

 

Marche po :(

 

 

Je m'explique .

 

Phase 1 : Créer les 5 modules virtuels

Phase 2 : Modifier les 5 modules virtuels ( Nom / pièces / IP / Port et dans le Code le MACNAS )

Phase 3 : Créer la scène LUA , copier le code , modifier pour qu'elle ne ce lance que manuellement et une seule fois.

Phase 4 : Lancer la Scène .. Et la rien ....

Bon ok je retourne voir les modules et l’aussi rien .....

 

 

Bon je fouille sur la box et je trouve le panneau variable

 

Je regarde dedans vide , aucune info concernant la scène ne crée .

 

Je teste en ajoutant a la main Bcast, Login, password .

 

Je retourne sur un module ... MAGIE LoL ... Les infos remontent. ;)

 

Alors au final ça marche si je les rentre a la main via le panneau qui semble dédié aux variables .... mais pourquoi j'ai 2 mains gauches quand il sage de créé un script :( même un copy/past ne fonctionne pas :(

 

 

Ps :  j'ai bien fait attention dans l’éditeur de texte de remettre les " avants et après et coller aux informations données , j'ai aussi vérifié les espaces .

 

PS2 : J'ai noté que dans les script le bouton états avait ne commentaire :

 

-- Synology DSM
-- Reboot the disk station
-- janvier 2015
--------------------------------------------------

 

 

Ce n'est pas un reboot si ?

 

PS3 : au final donc tous fonctionnent, mais est-il possible d'avoir l'affichage des HDD sur 1 ligne par HDD ? 

 

Vue GSM

mini_4137746CB3B42CB83B4C50B7C1358B1DFFB

 

Vue Web

mini_451653996CBE8EFAA44EEF8624973D870CE

 

 

Merci a toi .

 

 

 

Partager ce message


Lien à poster
Partager sur d’autres sites

Cool ça fonctionne !!

 

Je n'ai pas trouvé comment avoir sur une seule ligne un seul disque.

Et c'est une erreur de commentaire, le Reboot dans le bouton Etat.

 

Voilà ... :D

 

Partager ce message


Lien à poster
Partager sur d’autres sites

Pas d'idée pourquoi avec le script ça ne crée pas les variable global ?

 

Juste pour m'endormir main C0N ce soir ;)

 

Allez je crée les autre mac en global ;)

Partager ce message


Lien à poster
Partager sur d’autres sites
Il y a 1 heure, Kana-chan a dit :

Bonjour,

 

Oui c'est bien cela !

Mais n'oubliez pas de les créer dans le panneau des variables avant d'exécuter la scène, car je crois qu'il faut qu'elles existent pour être remplies.

 

Voilà ... :D

 

Comme je l'ai dit plus haut, il faut créer les variables dans le panneau des variables AVANT de faire la scène.

Car de faire fibaro:setGlobal("TOTO", "TITI") ne créera pas la variable.

 

Voilà ... :D

 

Partager ce message


Lien à poster
Partager sur d’autres sites

Haaaa 

 

Bay j'avais complètement pas compris ça XD

 

 

Mais alor sla scène elle sert a quoi ? ( je sens la grosse question conne :( )

 

EDIt : Ok je dosi cree les variable masi les laisser vide puis lancer la scène pour les remplir.

 

Mais moi je les ait remplie a la mains LoL

 

Bon je peut supprimer la scène maintenant. LoL

 

En tous cas merci pour ce beau script ;)

 

 

 

 

Modifié par Gandalf

Partager ce message


Lien à poster
Partager sur d’autres sites

En fait, dans le panneau des variables, on ne peut entrer que des nombres...

Donc pour entrer des caractères alphanumériques, il faut passer par une scène.

 

Voilà ... :D

 

Partager ce message


Lien à poster
Partager sur d’autres sites

×