@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