DZVents : Supervision d'un nas Synology avec SNMP

Vous avez crée un script lua dont vous êtes fier, un .sh génial, un programme python hors du commun, un tuto , c'est ici que vous pouvez les partager.
Soyez précis quant aux prérequis, les manips à faire pour que votre bijou fonctionne (des chmod ?, un apt-get à faire ...)
Décrivez précisément son fonctionnement
Placez votre code entre [Quote] et {/Quote]
Kyrille
Messages : 47
Enregistré le : 23 juin 2019, 16:12

Re: DZVents : Supervision d'un nas Synology avec SNMP

Message par Kyrille »

Je me réponds grâce au lien suivant : http://oid-info.com/get/1.3.6.1.2.1.2.2.1. Après avoir tâtonné, il est possible de comprendre un peu mieux comment les OID sont organisés (IF-MIB = iso.org.dod.internet.mgmt.mib-2.interfaces = 1.3.6.1.2.1.2).

Au final, pour mon NAS, les 3 valeurs à utiliser pour l'interface ethernet eth0 sont :

Code : Tout sélectionner

snmpget -v 2c -c password -O qv nas_ip 1.3.6.1.2.1.2.2.1.2.2
"eth0"
 
snmpget -v 2c -c password -O qv nas_ip 1.3.6.1.2.1.2.2.1.10.2
655252339

snmpget -v 2c -c password -O qv nas_ip 1.3.6.1.2.1.2.2.1.16.2
136934901
Par contre, les valeurs ifHCInOctets et ifHCOutOctets sont des nombres absolus d'octets qui sont entrés ou sortis depuis l'initialisation de l'interface. Du coup, pour avoir une vitesse d'upload ou de download, il faut comparer deux valeurs d'octets et diviser la différence par la durée entre les deux mesures.

Dit autrement, avec :

Code : Tout sélectionner

date; snmpget -v 2c -c password -O qv nas_ip 1.3.6.1.2.1.2.2.1.10.2
lundi 16 décembre 2019, 21:11:40 (UTC+0100)
949581351
puis :

Code : Tout sélectionner

date; snmpget -v 2c -c password -O qv nas_ip 1.3.6.1.2.1.2.2.1.10.2
lundi 16 décembre 2019, 21:11:50 (UTC+0100)
957211986
la vitesse de téléchargement par ethernet à cet instant là vaut alors : (957211986 octets - 949581351 octets ) / 10 secondes = 763 063 octets/seconde = 745ko/s, ce qui correspond à ce que rapporte le gestionnaire de ressources de mon NAS.

Ne reste plus qu'à écrire le script qui fait ce calcul toutes les minutes pour le remonter dans Domoticz...

Hope it helps.
Raspberry Pi 3B+ (buster) / Conbee II / Z-Stick Gen 5 / RFXCOM 433 XL / Domoticz 2020.02

papoo
Messages : 2009
Enregistré le : 10 janv. 2016, 11:29
Localisation : Limoges (87)
Contact :

Re: DZVents : Supervision d'un nas Synology avec SNMP

Message par papoo »

j'y travaille
2019-12-16 23_39_10-Domoticz.png
2019-12-16 23_39_10-Domoticz.png (4.28 Kio) Vu 1801 fois
la suite demain vais me coucher
domoticz beta/RaspBerry PI3 stretch
https://pon.fr github

Kyrille
Messages : 47
Enregistré le : 23 juin 2019, 16:12

Re: DZVents : Supervision d'un nas Synology avec SNMP

Message par Kyrille »

papoo a écrit :j'y travaille
2019-12-16 23_39_10-Domoticz.png
la suite demain vais me coucher
Génial !

Petite remarque au passage: je crois que le nombre d'octets repart de zéro quand la valeur a atteint 2^32 (soit 4Go de données transférées). Il faudra certainement faire un petit test pour vérifier que la nouvelle valeur n'est pas plus petite que la précédente ou quelque chose du genre, afin d'éviter des valeurs un peu bizarres dans les historiques.

Merci Papoo !

Envoyé depuis mon téléphone en utilisant Tapatalk

Raspberry Pi 3B+ (buster) / Conbee II / Z-Stick Gen 5 / RFXCOM 433 XL / Domoticz 2020.02

denis_brasseur
Messages : 473
Enregistré le : 24 déc. 2018, 17:05
Localisation : (26)

Re: DZVents : Supervision d'un nas Synology avec SNMP

Message par denis_brasseur »

papoo a écrit :
16 déc. 2019, 23:40
j'y travaille
2019-12-16 23_39_10-Domoticz.png
la suite demain vais me coucher
J'avais repris le script de papoo afin de l'adapter à un nas QNAP, en récupérant PacketsReceived et PacketsSent.

Ca donne ceci dans mon script (attention, les OID sont valable pour un QNAP) :

Code : Tout sélectionner

local OID_PacketsReceived =	'1.3.6.1.4.1.24681.1.2.9.1.3.1' -- Counter32: 26675439 						--PacketsReceived
local OID_PacketsSent =		'1.3.6.1.4.1.24681.1.2.9.1.4.1' -- Counter32: 11390075 						--PacketsSent

Code : Tout sélectionner

data    =   {   
		PacketsReceived = { history = true, maxItems = 1 },
		PacketsSent = { history = true, maxItems = 1 },
	},

Code : Tout sélectionner

local command = 'snmpget -v 2c -c '..CommunityPassword..' -O qv '..NasIp..' '..OID_HDtemp1..' '..OID_CPUtemp..' '..OID_CPUusage..' '..OID_Total_memory..' '..OID_Free_memory..' '..OID_System_uptime..' '..OID_HDTotal..' '..OID_HDUsed..' '..OID_PacketsReceived..' '..OID_PacketsSent

Code : Tout sélectionner

if results[8] then PacketsReceived = results[8] end
if PacketsReceived then 
	--dz.log("PacketsReceived : "..PacketsReceived,dz.LOG_DEBUG)
	if dz.data.PacketsReceived ~= nil then
		local ExPacketsReceived = dz.data.PacketsReceived.getLatest().data
		--print(ExPacketsReceived)
		lastUpdateVar = dz.data.PacketsReceived.getLatest().time.secondsAgo
		NewPacketsReceived = dz.utils.round(((PacketsReceived - ExPacketsReceived) / lastUpdateVar),2)
		dz.data.PacketsReceived.add(PacketsReceived)       
		if NewPacketsReceived >= 0 then 
			--dz.devices(NAS_Packets_Received).update(0,NewPacketsReceived)
			if tostring(dz.devices(NAS_Packets_Received).state) ~= tostring(NewPacketsReceived) then dz.devices(NAS_Packets_Received).update(0,NewPacketsReceived) end
			dz.log("NewPacketsReceived : "..NewPacketsReceived,dz.LOG_DEBUG)
		end
	end
end

if results[9] then PacketsSent = results[9] end
if PacketsSent then 
	--dz.log("PacketsSent : "..PacketsSent,dz.LOG_DEBUG)
	if dz.data.PacketsSent ~= nil then
		local ExPacketsSent = dz.data.PacketsSent.getLatest().data
		lastUpdateVar = dz.data.PacketsSent.getLatest().time.secondsAgo
		NewPacketsSent = dz.utils.round(((PacketsSent - ExPacketsSent) / lastUpdateVar),2)
		dz.data.PacketsSent.add(PacketsSent)     
		if NewPacketsSent >= 0 then
			--dz.devices(NAS_Packets_Sent).update(0,NewPacketsSent)
			if tostring(dz.devices(NAS_Packets_Sent).state) ~= tostring(NewPacketsSent) then dz.devices(NAS_Packets_Sent).update(0,NewPacketsSent) end
			dz.log("NewPacketsSent : "..NewPacketsSent,dz.LOG_DEBUG)
		end
	end
end
Capture.PNG
Capture.PNG (16.25 Kio) Vu 1792 fois
Pi3 + DD PiDrive + RFXtrx433 + AEON Labs ZW090
7 Modules fil pilote ZMNHJD1
2 détecteur fumées CHACON 34131
5 Bresser Capteur thermo/hygro
1 contacteur porte Philio PST02-1A Z
OWL Micro+ CM180
D2L LINKY
FGR-223 "Roller Shutter 3"

papoo
Messages : 2009
Enregistré le : 10 janv. 2016, 11:29
Localisation : Limoges (87)
Contact :

Re: DZVents : Supervision d'un nas Synology avec SNMP

Message par papoo »

2019-12-17 18_28_11-Window.png
2019-12-17 18_28_11-Window.png (4.16 Kio) Vu 1751 fois
quelqu'un veut tester et me faire un retour SVP?
pour moi les OID sont 1.3.6.1.2.1.2.2.1.10.3 et 1.3.6.1.2.1.2.2.1.16.3

Code : Tout sélectionner

--[[
name : synology2.lua
auteur : papoo
creation : 17/02/2019
mise à  jour : 16/12/2019

https://pon.fr/dzvents-supervision-dun-nas-synology-avec-snmp/
https://github.com/papo-o/domoticz_scripts/blob/master/dzVents/scripts/synology2.lua
https://easydomoticz.com/forum/viewtopic.php?f=17&t=7022
https://www.domoticz.com/forum/viewtopic.php?f=59&t=24618

For this script to work you need to enable SNMP on your synology NAS and install SNMP on your Raspberry Pi

Enable SNMP on your synology NAS
 
Go toMain Menu>Control Panel >SNMP to enable SNMP service, which allows users to monitor
Synology DiskStation network flow with the network management software.

You can use V1/V2
And set a password (Community)

Install SNMP on Raspberry Pi
Log in to you Raspberry Pi and issue:

sudo apt-get install snmpd
sudo apt-get install snmp

Reboot your Pi:
sudo reboot

Check if SNMP is up and running, issue:
snmpget -v 2c -c PASSWORD -O qv NASIPADDRESS 1.3.6.1.4.1.6574.1.5.1.0

Replace PASSWORD with the Community name you entered while setting up your NAS
Replace NASIPADDRESS with the ip address of your NAS
You should get something like this:
"DS218+" which corresponds to your Synology Model

how to choose disk capacity to monitor?

snmpwalk -v 2c -c PASSWORD NASIPADDRESS 1.3.6.1.2.1.25.2.3.1.3
results of my DS218 :

HOST-RESOURCES-MIB::hrStorageDescr.1 = STRING: Physical memory
HOST-RESOURCES-MIB::hrStorageDescr.3 = STRING: Virtual memory
HOST-RESOURCES-MIB::hrStorageDescr.6 = STRING: Memory buffers
HOST-RESOURCES-MIB::hrStorageDescr.7 = STRING: Cached memory
HOST-RESOURCES-MIB::hrStorageDescr.8 = STRING: Shared memory
HOST-RESOURCES-MIB::hrStorageDescr.10 = STRING: Swap space
HOST-RESOURCES-MIB::hrStorageDescr.31 = STRING: /
HOST-RESOURCES-MIB::hrStorageDescr.36 = STRING: /tmp
HOST-RESOURCES-MIB::hrStorageDescr.37 = STRING: /run
HOST-RESOURCES-MIB::hrStorageDescr.38 = STRING: /dev/shm
HOST-RESOURCES-MIB::hrStorageDescr.39 = STRING: /sys/fs/cgroup
HOST-RESOURCES-MIB::hrStorageDescr.40 = STRING: /run/cgmanager/fs
HOST-RESOURCES-MIB::hrStorageDescr.51 = STRING: /volume1
HOST-RESOURCES-MIB::hrStorageDescr.54 = STRING: /volume1/@docker/btrfs


then modify     OID_HDUnit, OID_HDTotal, OID_HDUsed variables with your last number choice (.38 on DSM 5.1, .41 on DSM 6.0+ or .51 on my new DS218)

if you have à DS2XX model, uncomment     -- local OID_HDtemp2='1.3.6.1.4.1.6574.2.1.1.6.1'  to show the hdd2 temperature
Then create:
1 device Switch
1 temperature device
3 percent devices
x meter device   
--]]
--------------------------------------------
-------------Fonctions----------------------
-------------------------------------------- 
function format(str)
   if (str) then
      str = string.gsub (str, " Bytes", "")
      str = string.gsub (str, " kB", "")

   end
   return str   
end

-------------------------------------------
-------------Fin Fonctions-----------------
-------------------------------------------

    local NasIp = "diskstation2"                            -- NAS IP Address
    local CommunityPassword = "synology"                    -- SNMP Password
    local NAS = "Synology"                                  -- NAS Switch
    local NAS_TEMP = "Synology Temp"
    local NAS_CPU = "Synology Utilisation CPU"              -- NAS CPU 
    local NAS_MEM = "Synology Utilisation RAM"              -- NAS MEM 
    local NAS_HD_SPACE_PERC = "Synology Occupation Disque"  -- NAS HD Space  in %
    local NAS_HD_SPACE = "Synology Espace Disponible"       -- NAS HD Space  in Go (custom sensor)
    local NAS_HDD1_TEMP = "Synology HDD1 Temp"              -- NAS HD1 Temp, nil if unused 
    local NAS_HDD2_TEMP = nil                               -- NAS HD2 Temp, nil if unused
    local NAS_HDD3_TEMP = nil                               -- NAS HD3 Temp, nil if unused
    local NAS_HDD4_TEMP = nil                               -- NAS HD4 Temp, nil if unused
	local NAS_UPLOAD    = nil                               -- NAS upload in ko/s, nil if unused
	local NAS_DOWNLOAD   = nil                               -- NAS download in ko/s, nil if unused
    local OID_NAS_TEMP = '1.3.6.1.4.1.6574.1.2.0'
    local OID_HDUnit = '1.3.6.1.2.1.25.2.3.1.4.51'          -- OID HD Unit Change OID to .38 on DSM 5.1 or .41 on DSM 6.0+ or .51 on my DS218
    local OID_HDTotal = '1.3.6.1.2.1.25.2.3.1.5.51'         -- OID Total space volume in Go Change OID to .38 on DSM 5.1 or .41 on DSM 6.0+ or .51 on my DS218
    local OID_HDUsed = '1.3.6.1.2.1.25.2.3.1.6.51'          -- OID Space used volume in Go Change OID to .38 on DSM 5.1 or .41 on DSM 6.0+ or .51 on my DS218
    local OID_CpuUser = '1.3.6.1.4.1.2021.11.9.0'           -- OID CPU user
    local OID_CpuSystem = '1.3.6.1.4.1.2021.11.10.0'        -- OID CPU System
    local OID_MemAvailable = '1.3.6.1.4.1.2021.4.13.0'      -- OID Free Memory Available
    local OID_MemTotalSwap = '1.3.6.1.4.1.2021.4.3.0'       -- OID MemTotalSwap
    local OID_MemTotalReal = '1.3.6.1.4.1.2021.4.5.0'       -- OID MemTotalReal
    local OID_MemTotalFree = '1.3.6.1.4.1.2021.4.11.0'      -- OID MemTotalFree
    local OID_HDtemp1 = '1.3.6.1.4.1.6574.2.1.1.6.0'        -- OID Temperature HDD1   
    local OID_HDtemp2 = '1.3.6.1.4.1.6574.2.1.1.6.1'        -- OID Temperature HDD2 
    local OID_HDtemp3 = '1.3.6.1.4.1.6574.2.1.1.6.2'        -- OID Temperature HDD3
    local OID_HDtemp4 = '1.3.6.1.4.1.6574.2.1.1.6.3'        -- OID Temperature HDD4
	local OID_ifHCOutOctets = '1.3.6.1.2.1.2.2.1.16.3'		-- OID ifHCOutOctets if not work try 1.3.6.1.2.1.2.2.1.16.1 or 1.3.6.1.2.1.2.2.1.16.2
	local OID_ifHCInOctets = '1.3.6.1.2.1.2.2.1.10.3'		-- OID ifHCInOctets if not work try 1.3.6.1.2.1.2.2.1.10.1 or 1.3.6.1.2.1.2.2.1.10.2
    --local OID_Raid_Status = '1.3.6.1.4.1.6574.3.1.1.3.0'        -- OID Raid Status
    --local OID_Physical_Memory_Units = '1.3.6.1.2.1.25.2.3.1.4.1'
    --local OID_Physical_Memory_Size = '1.3.6.1.2.1.25.2.3.1.5.1'
    --local OID_Physical_Memory_Used = '1.3.6.1.2.1.25.2.3.1.6.1'
    --local OID_system_memory_total = '1.3.6.1.4.1.2021.4.5.0'
    --local OID_system_memory_free = '1.3.6.1.4.1.2021.4.6.0'
    --local OID_system_vsmemory_shared = '1.3.6.1.4.1.2021.4.13.0'
    --local OID_system_vsmemory_buffer = '1.3.6.1.4.1.2021.4.14.0'

   
return {
    active = true,
    on = {
    timer = {'every minute'}
    },    
   -- on = { devices = { "your trigger device" }},
        
  logging =   {    level    =    domoticz.LOG_DEBUG,                                             -- Seulement un niveau peut être actif; commenter les autres
                -- level    =   domoticz.LOG_INFO,                                            -- Only one level can be active; comment others
                -- level    =   domoticz.LOG_ERROR,
                -- level    =   domoticz.LOG_MODULE_EXEC_INFO,
                   marker    =   "Synology Monitor v1.40 "      },
 	data = {
 		ifHCInOctets =  { history = true, initial = '0', maxItems = 1 },
		ifHCOutOctets = { history = true, initial = '0', maxItems = 1 },
	},
    execute = function(dz)
	local lastIfHCInOctets, lastIfHCOutOctets, ifHCInSecondsAgo, IfHCOutSecondsAgo, upload, download
	local round = dz.utils.round
	
	if dz.data.ifHCOutOctets.get(1).data ~= nil then lastIfHCOutOctets = dz.data.ifHCOutOctets.get(1).data end
 	if dz.data.ifHCOutOctets.get(1).time.secondsAgo ~= nil then ifHCOutSecondsAgo = dz.data.ifHCOutOctets.get(1).time.secondsAgo end
	if dz.data.ifHCInOctets.get(1).data ~= nil then lastIfHCInOctets = dz.data.ifHCInOctets.get(1).data	end
	if dz.data.ifHCInOctets.get(1).time.secondsAgo ~= nil then ifHCInSecondsAgo = dz.data.ifHCInOctets.get(1).time.secondsAgo end	
	dz.log("last ifHCOutOctets : "..tostring(lastIfHCOutOctets).." at "..tostring(ifHCOutSecondsAgo).." seconds ago",dz.LOG_DEBUG) 	
	dz.log("last ifHCInOctets : "..tostring(lastIfHCInOctets).." at "..tostring(ifHCInSecondsAgo).." seconds ago",dz.LOG_DEBUG) 

        local i = 0
        local results = {}
        local command = 'snmpget -v 2c -c '..CommunityPassword..' -O qv '..NasIp..' '..OID_NAS_TEMP..' '..OID_HDUnit..' '..OID_HDTotal..' '..OID_HDUsed..' '..OID_CpuUser..' '..OID_CpuSystem..' '
			..OID_MemAvailable ..' '.. OID_MemTotalSwap ..' '..OID_MemTotalReal..' '..OID_MemTotalFree..' '..OID_HDtemp1..' '..OID_HDtemp2..' '..OID_HDtemp3..' '..OID_HDtemp4..' '..OID_ifHCOutOctets..' '
			..OID_ifHCInOctets --..' '..OID_Physical_Memory_Units ..' '..OID_Physical_Memory_Used..' '..OID_Physical_Memory_Size ..' '..OID_system_memory_total ..' '..OID_system_memory_free ..' '.. OID_system_vsmemory_shared ..' '.. OID_system_vsmemory_buffer 
        local handle = assert(io.popen(command))
        for line in handle:lines() do
            results[i] =  format(line)
            i = i + 1
        end
        handle:close()
        if results[0] then
            dz.log("NASTemp : "..results[0],dz.LOG_DEBUG)
            if NAS_TEMP then dz.devices(NAS_TEMP).update(0,results[0]) end
            end
        if results[1] then dz.log("HDUnit : "..results[1],dz.LOG_DEBUG) end
        if results[2] then dz.log("HDTotal : "..results[2],dz.LOG_DEBUG) end
        if results[3] then dz.log("HDUsed : "..results[3],dz.LOG_DEBUG) end
        if results[4] then dz.log("CpuUser : "..results[4],dz.LOG_DEBUG) end
        if results[5] then dz.log("CpuSystem : "..results[5],dz.LOG_DEBUG) end
        
        if results[1] and results[2] then

           HDTotalGo = dz.utils.round((results[2] *  results[1] / 1024 / 1024 / 1024/1024),2)
           dz.log("HDTotalGo : "..HDTotalGo,dz.LOG_DEBUG)
        end
         if results[1] and results[3] then
           HDUsedGo = dz.utils.round(((results[3]) *  results[1] / 1024 / 1024 / 1024/1024), 2)
        end       

        if results[1] and results[2] and results[3] then
            HDFreeGo = dz.utils.round(((results[2] - results[3]) *  results[1] / 1024 / 1024 / 1024/1024),2)
        end
        if HDFreeGo then 
            dz.log("HDFreeGo : "..HDFreeGo,dz.LOG_DEBUG) 
            dz.devices(NAS_HD_SPACE).update(0,HDFreeGo)
            end 
        if results[2] and results[3] then         
            HDFreePerc = dz.utils.round(((results[3] * 100) / results[2]), 0)
        end
        if HDFreePerc then 
            dz.log("HDFreePercent : "..HDFreePerc,dz.LOG_DEBUG)
            dz.devices(NAS_HD_SPACE_PERC).update(0,HDFreePerc)
            end
        if results[4] and results[5] then
            CpuUsed = (results[4] + results[5])
        end
        if CpuUsed then 
            dz.log("CpuUsed : "..CpuUsed,dz.LOG_DEBUG)
            dz.devices(NAS_CPU).update(0,CpuUsed)
            end

        if results[7] then
            dz.log("memTotalSwap: "..tostring(results[7]),dz.LOG_DEBUG)
        end
        if results[8] then
            dz.log("memTotalReal: "..tostring(results[8]),dz.LOG_DEBUG)
        end
        if results[9] then
            dz.log("memTotalFree: "..tostring(results[9]),dz.LOG_DEBUG)
        end

        if results[7] and results[8] and results[9] then
            MemUsedPerc = dz.utils.round(100-results[9]*100/(results[7]+results[8]), 0)
        end
        if MemUsedPerc then 
            dz.log("MemUsedPercent : "..MemUsedPerc,dz.LOG_DEBUG)
            dz.devices(NAS_MEM).update(0,MemUsedPerc)
        end

        if results[10] then 
            dz.log("HDTemp1 : "..tostring(results[10]),dz.LOG_DEBUG) 
            if NAS_HDD1_TEMP ~= nil then dz.devices(NAS_HDD1_TEMP).update(0,results[10]) end
        end
        if results[11] then 
            dz.log("HDTemp2 : "..tostring(results[11]),dz.LOG_DEBUG) 
            if NAS_HDD2_TEMP ~= nil then dz.devices(NAS_HDD2_TEMP).update(0,results[11]) end
        end
        if results[12] then 
            dz.log("HDTemp3 : "..tostring(results[12]),dz.LOG_DEBUG) 
            if NAS_HDD3_TEMP ~= nil then dz.devices(NAS_HDD3_TEMP).update(0,results[12]) end
        end
        if results[13] then 
            dz.log("HDTemp4 : "..tostring(results[13]),dz.LOG_DEBUG) 
            if NAS_HDD4_TEMP ~= nil then dz.devices(NAS_HDD4_TEMP).update(0,results[13]) end
        end

        if results[14] then 
            dz.log("ifHCOutOctets : "..tostring(results[14]),dz.LOG_DEBUG) 
			dz.data.ifHCOutOctets.add(tostring(results[14]))
			if tonumber(lastIfHCOutOctets) > 0 and tonumber(results[14]) > tonumber(lastIfHCOutOctets) then upload = round(((tonumber(results[14]) - tonumber(lastIfHCOutOctets)) / tonumber(ifHCOutSecondsAgo) / 1024)) end
			if NAS_UPLOAD ~= nil then dz.devices(NAS_UPLOAD).update(0,tostring(upload)) end
		end
        if results[15] then 
            dz.log("ifHCInOctets : "..tostring(results[15]),dz.LOG_DEBUG) 
			dz.data.ifHCInOctets.add(tostring(results[15]))	
			if tonumber(lastIfHCInOctets) > 0 and tonumber(results[15]) > tonumber(lastIfHCInOctets) then download = round(((tonumber(results[15]) - tonumber(lastIfHCInOctets)) / tonumber(ifHCInSecondsAgo) / 1024)) end
			if NAS_DOWNLOAD ~= nil then dz.devices(NAS_DOWNLOAD).update(0,tostring(download)) end		
		end


	dz.log("Upload : "..tostring(upload).."ko/s, Download : "..tostring(download).."ko/s",dz.LOG_DEBUG) 




        if results[0] and results[5] and results[6] then
                dz.log("Requete SNMP correcte ",dz.LOG_DEBUG)
                dz.devices(NAS).switchOn().checkFirst()
            else
                dz.log("Requete SNMP incorrecte ",dz.LOG_DEBUG)
                dz.devices(NAS).switchOff().checkFirst()
            end

        --RAID Status :
        --OK(1), Repairing(2), Migrating(3), Expanding(4), Deleting(5), Creating(6), RaidSyncing(7), RaidParityChecking(8), RaidAssembling(9), Canceling(10), Degraded(11), Creashed(12)
    end
}
domoticz beta/RaspBerry PI3 stretch
https://pon.fr github

Kyrille
Messages : 47
Enregistré le : 23 juin 2019, 16:12

Re: DZVents : Supervision d'un nas Synology avec SNMP

Message par Kyrille »

Merci à vous !

@papoo, malheureusement, j'ai ça :

Code : Tout sélectionner

2019-12-17 23:13:00.303 Status: dzVents: Info: Synology Monitor v1.40 : ------ Start external script: synology2.lua:, trigger: every minute
2019-12-17 23:13:00.304 Status: dzVents: Error (2.4.19): Synology Monitor v1.40 : An error occured when calling event handler synology2
2019-12-17 23:13:00.304 Status: dzVents: Error (2.4.19): Synology Monitor v1.40 : /home/pi/domoticz/scripts/dzVents/scripts/synology2.lua:145: attempt to index a nil value
La ligne 145 correspond à :

Code : Tout sélectionner

if dz.data.ifHCOutOctets.get(1).data ~= nil then lastIfHCOutOctets = dz.data.ifHCOutOctets.get(1).data end
Normalement, j'ai renseigné les bonnes valeurs pour les nouveaux OID, ainsi que les noms de mes custom sensors. Il n'y a rien d'autre dans le log, malgré le mode debug (à part que ça revient chaque minute, évidemment).
Raspberry Pi 3B+ (buster) / Conbee II / Z-Stick Gen 5 / RFXCOM 433 XL / Domoticz 2020.02

papoo
Messages : 2009
Enregistré le : 10 janv. 2016, 11:29
Localisation : Limoges (87)
Contact :

Re: DZVents : Supervision d'un nas Synology avec SNMP

Message par papoo »

cela devrait fonctionner avec la v1.41

Code : Tout sélectionner

--[[
name : synology2.lua
auteur : papoo
creation : 17/02/2019
mise à  jour : 18/12/2019

https://pon.fr/dzvents-supervision-dun-nas-synology-avec-snmp/
https://github.com/papo-o/domoticz_scripts/blob/master/dzVents/scripts/synology2.lua
https://easydomoticz.com/forum/viewtopic.php?f=17&t=7022
https://www.domoticz.com/forum/viewtopic.php?f=59&t=24618

For this script to work you need to enable SNMP on your synology NAS and install SNMP on your Raspberry Pi

Enable SNMP on your synology NAS
 
Go toMain Menu>Control Panel >SNMP to enable SNMP service, which allows users to monitor
Synology DiskStation network flow with the network management software.

You can use V1/V2
And set a password (Community)

Install SNMP on Raspberry Pi
Log in to you Raspberry Pi and issue:

sudo apt-get install snmpd
sudo apt-get install snmp

Reboot your Pi:
sudo reboot

Check if SNMP is up and running, issue:
snmpget -v 2c -c PASSWORD -O qv NASIPADDRESS 1.3.6.1.4.1.6574.1.5.1.0

Replace PASSWORD with the Community name you entered while setting up your NAS
Replace NASIPADDRESS with the ip address of your NAS
You should get something like this:
"DS218+" which corresponds to your Synology Model

how to choose disk capacity to monitor?

snmpwalk -v 2c -c PASSWORD NASIPADDRESS 1.3.6.1.2.1.25.2.3.1.3
results of my DS218 :

HOST-RESOURCES-MIB::hrStorageDescr.1 = STRING: Physical memory
HOST-RESOURCES-MIB::hrStorageDescr.3 = STRING: Virtual memory
HOST-RESOURCES-MIB::hrStorageDescr.6 = STRING: Memory buffers
HOST-RESOURCES-MIB::hrStorageDescr.7 = STRING: Cached memory
HOST-RESOURCES-MIB::hrStorageDescr.8 = STRING: Shared memory
HOST-RESOURCES-MIB::hrStorageDescr.10 = STRING: Swap space
HOST-RESOURCES-MIB::hrStorageDescr.31 = STRING: /
HOST-RESOURCES-MIB::hrStorageDescr.36 = STRING: /tmp
HOST-RESOURCES-MIB::hrStorageDescr.37 = STRING: /run
HOST-RESOURCES-MIB::hrStorageDescr.38 = STRING: /dev/shm
HOST-RESOURCES-MIB::hrStorageDescr.39 = STRING: /sys/fs/cgroup
HOST-RESOURCES-MIB::hrStorageDescr.40 = STRING: /run/cgmanager/fs
HOST-RESOURCES-MIB::hrStorageDescr.51 = STRING: /volume1
HOST-RESOURCES-MIB::hrStorageDescr.54 = STRING: /volume1/@docker/btrfs


then modify     OID_HDUnit, OID_HDTotal, OID_HDUsed variables with your last number choice (.38 on DSM 5.1, .41 on DSM 6.0+ or .51 on my new DS218)

if you have à DS2XX model, uncomment     -- local OID_HDtemp2='1.3.6.1.4.1.6574.2.1.1.6.1'  to show the hdd2 temperature
Then create:
1 device Switch
1 temperature device
3 percent devices
x meter device   
--]]
--------------------------------------------
-------------Fonctions----------------------
-------------------------------------------- 
function format(str)
   if (str) then
      str = string.gsub (str, " Bytes", "")
      str = string.gsub (str, " kB", "")

   end
   return str   
end

-------------------------------------------
-------------Fin Fonctions-----------------
-------------------------------------------

    local NasIp = "diskstation2"                            -- NAS IP Address
    local CommunityPassword = "synology"                    -- SNMP Password
    local NAS = "Synology"                                  -- NAS Switch
    local NAS_TEMP = "Synology Temp"
    local NAS_CPU = "Synology Utilisation CPU"              -- NAS CPU 
    local NAS_MEM = "Synology Utilisation RAM"              -- NAS MEM 
    local NAS_HD_SPACE_PERC = "Synology Occupation Disque"  -- NAS HD Space  in %
    local NAS_HD_SPACE = "Synology Espace Disponible"       -- NAS HD Space  in Go (custom sensor)
    local NAS_HDD1_TEMP = "Synology HDD1 Temp"              -- NAS HD1 Temp, nil if unused 
    local NAS_HDD2_TEMP = nil                               -- NAS HD2 Temp, nil if unused
    local NAS_HDD3_TEMP = nil                               -- NAS HD3 Temp, nil if unused
    local NAS_HDD4_TEMP = nil                               -- NAS HD4 Temp, nil if unused
	local NAS_UPLOAD    = nil                               -- NAS upload in ko/s, nil if unused
	local NAS_DOWNLOAD   = nil                               -- NAS download in ko/s, nil if unused
    local OID_NAS_TEMP = '1.3.6.1.4.1.6574.1.2.0'
    local OID_HDUnit = '1.3.6.1.2.1.25.2.3.1.4.51'          -- OID HD Unit Change OID to .38 on DSM 5.1 or .41 on DSM 6.0+ or .51 on my DS218
    local OID_HDTotal = '1.3.6.1.2.1.25.2.3.1.5.51'         -- OID Total space volume in Go Change OID to .38 on DSM 5.1 or .41 on DSM 6.0+ or .51 on my DS218
    local OID_HDUsed = '1.3.6.1.2.1.25.2.3.1.6.51'          -- OID Space used volume in Go Change OID to .38 on DSM 5.1 or .41 on DSM 6.0+ or .51 on my DS218
    local OID_CpuUser = '1.3.6.1.4.1.2021.11.9.0'           -- OID CPU user
    local OID_CpuSystem = '1.3.6.1.4.1.2021.11.10.0'        -- OID CPU System
    local OID_MemAvailable = '1.3.6.1.4.1.2021.4.13.0'      -- OID Free Memory Available
    local OID_MemTotalSwap = '1.3.6.1.4.1.2021.4.3.0'       -- OID MemTotalSwap
    local OID_MemTotalReal = '1.3.6.1.4.1.2021.4.5.0'       -- OID MemTotalReal
    local OID_MemTotalFree = '1.3.6.1.4.1.2021.4.11.0'      -- OID MemTotalFree
    local OID_HDtemp1 = '1.3.6.1.4.1.6574.2.1.1.6.0'        -- OID Temperature HDD1   
    local OID_HDtemp2 = '1.3.6.1.4.1.6574.2.1.1.6.1'        -- OID Temperature HDD2 
    local OID_HDtemp3 = '1.3.6.1.4.1.6574.2.1.1.6.2'        -- OID Temperature HDD3
    local OID_HDtemp4 = '1.3.6.1.4.1.6574.2.1.1.6.3'        -- OID Temperature HDD4
	local OID_ifHCOutOctets = '1.3.6.1.2.1.2.2.1.16.3'		-- OID ifHCOutOctets if not work try 1.3.6.1.2.1.2.2.1.16.1 or 1.3.6.1.2.1.2.2.1.16.2
	local OID_ifHCInOctets = '1.3.6.1.2.1.2.2.1.10.3'		-- OID ifHCInOctets if not work try 1.3.6.1.2.1.2.2.1.10.1 or 1.3.6.1.2.1.2.2.1.10.2
    --local OID_Raid_Status = '1.3.6.1.4.1.6574.3.1.1.3.0'        -- OID Raid Status
    --local OID_Physical_Memory_Units = '1.3.6.1.2.1.25.2.3.1.4.1'
    --local OID_Physical_Memory_Size = '1.3.6.1.2.1.25.2.3.1.5.1'
    --local OID_Physical_Memory_Used = '1.3.6.1.2.1.25.2.3.1.6.1'
    --local OID_system_memory_total = '1.3.6.1.4.1.2021.4.5.0'
    --local OID_system_memory_free = '1.3.6.1.4.1.2021.4.6.0'
    --local OID_system_vsmemory_shared = '1.3.6.1.4.1.2021.4.13.0'
    --local OID_system_vsmemory_buffer = '1.3.6.1.4.1.2021.4.14.0'

   
return {
    active = true,
    on = {
    timer = {'every minute'}
    },    
   -- on = { devices = { "your trigger device" }},
        
  logging =   {    level    =    domoticz.LOG_DEBUG,                                             -- Seulement un niveau peut être actif; commenter les autres
                -- level    =   domoticz.LOG_INFO,                                            -- Only one level can be active; comment others
                -- level    =   domoticz.LOG_ERROR,
                -- level    =   domoticz.LOG_MODULE_EXEC_INFO,
                   marker    =   "Synology Monitor v1.41 "      },
 	data = {
 		ifHCInOctets =  { history = true, maxItems = 2 },
		ifHCOutOctets = { history = true, maxItems = 2 },
	},
    execute = function(dz)
		local i, lastIfHCInOctets, lastIfHCOutOctets, ifHCInSecondsAgo, IfHCOutSecondsAgo, upload, download, round, results = 0, 0, 0, 0, 0, 0, 0, dz.utils.round, {}
		dz.data.ifHCOutOctets.add('0')
		dz.data.ifHCInOctets.add('0')
	
		if dz.data.ifHCOutOctets.getOldest() ~= nil then 
			lastIfHCOutOctets = dz.data.ifHCOutOctets.getOldest().data 
			ifHCOutSecondsAgo = dz.data.ifHCOutOctets.getOldest().time.secondsAgo
		end
		if dz.data.ifHCInOctets.getOldest() ~= nil then 
			lastIfHCInOctets = dz.data.ifHCInOctets.getOldest().data
			ifHCInSecondsAgo = dz.data.ifHCInOctets.getOldest().time.secondsAgo 
		end	
		dz.log("last ifHCOutOctets : "..tostring(lastIfHCOutOctets).." at "..tostring(ifHCOutSecondsAgo).." seconds ago",dz.LOG_DEBUG) 	
		dz.log("last ifHCInOctets : "..tostring(lastIfHCInOctets).." at "..tostring(ifHCInSecondsAgo).." seconds ago",dz.LOG_DEBUG) 
		
		
		
        local command = 'snmpget -v 2c -c '..CommunityPassword..' -O qv '..NasIp..' '..OID_NAS_TEMP..' '..OID_HDUnit..' '..OID_HDTotal..' '..OID_HDUsed..' '..OID_CpuUser..' '..OID_CpuSystem..' '
			..OID_MemAvailable ..' '.. OID_MemTotalSwap ..' '..OID_MemTotalReal..' '..OID_MemTotalFree..' '..OID_HDtemp1..' '..OID_HDtemp2..' '..OID_HDtemp3..' '..OID_HDtemp4..' '..OID_ifHCOutOctets..' '
			..OID_ifHCInOctets --..' '..OID_Physical_Memory_Units ..' '..OID_Physical_Memory_Used..' '..OID_Physical_Memory_Size ..' '..OID_system_memory_total ..' '..OID_system_memory_free ..' '.. OID_system_vsmemory_shared ..' '.. OID_system_vsmemory_buffer 
        local handle = assert(io.popen(command))
        for line in handle:lines() do
            results[i] =  format(line)
            i = i + 1
        end
        handle:close()
        if results[0] then
            dz.log("NASTemp : "..results[0],dz.LOG_DEBUG)
            if NAS_TEMP then dz.devices(NAS_TEMP).update(0,results[0]) end
            end
        if results[1] then dz.log("HDUnit : "..results[1],dz.LOG_DEBUG) end
        if results[2] then dz.log("HDTotal : "..results[2],dz.LOG_DEBUG) end
        if results[3] then dz.log("HDUsed : "..results[3],dz.LOG_DEBUG) end
        if results[4] then dz.log("CpuUser : "..results[4],dz.LOG_DEBUG) end
        if results[5] then dz.log("CpuSystem : "..results[5],dz.LOG_DEBUG) end
        
        if results[1] and results[2] then

           HDTotalGo = dz.utils.round((results[2] *  results[1] / 1024 / 1024 / 1024/1024),2)
           dz.log("HDTotalGo : "..HDTotalGo,dz.LOG_DEBUG)
        end
         if results[1] and results[3] then
           HDUsedGo = dz.utils.round(((results[3]) *  results[1] / 1024 / 1024 / 1024/1024), 2)
        end       

        if results[1] and results[2] and results[3] then
            HDFreeGo = dz.utils.round(((results[2] - results[3]) *  results[1] / 1024 / 1024 / 1024/1024),2)
        end
        if HDFreeGo then 
            dz.log("HDFreeGo : "..HDFreeGo,dz.LOG_DEBUG) 
            dz.devices(NAS_HD_SPACE).update(0,HDFreeGo)
            end 
        if results[2] and results[3] then         
            HDFreePerc = dz.utils.round(((results[3] * 100) / results[2]), 0)
        end
        if HDFreePerc then 
            dz.log("HDFreePercent : "..HDFreePerc,dz.LOG_DEBUG)
            dz.devices(NAS_HD_SPACE_PERC).update(0,HDFreePerc)
            end
        if results[4] and results[5] then
            CpuUsed = (results[4] + results[5])
        end
        if CpuUsed then 
            dz.log("CpuUsed : "..CpuUsed,dz.LOG_DEBUG)
            dz.devices(NAS_CPU).update(0,CpuUsed)
            end

        if results[7] then
            dz.log("memTotalSwap: "..tostring(results[7]),dz.LOG_DEBUG)
        end
        if results[8] then
            dz.log("memTotalReal: "..tostring(results[8]),dz.LOG_DEBUG)
        end
        if results[9] then
            dz.log("memTotalFree: "..tostring(results[9]),dz.LOG_DEBUG)
        end

        if results[7] and results[8] and results[9] then
            MemUsedPerc = dz.utils.round(100-results[9]*100/(results[7]+results[8]), 0)
        end
        if MemUsedPerc then 
            dz.log("MemUsedPercent : "..MemUsedPerc,dz.LOG_DEBUG)
            dz.devices(NAS_MEM).update(0,MemUsedPerc)
        end

        if results[10] then 
            dz.log("HDTemp1 : "..tostring(results[10]),dz.LOG_DEBUG) 
            if NAS_HDD1_TEMP ~= nil then dz.devices(NAS_HDD1_TEMP).update(0,results[10]) end
        end
        if results[11] then 
            dz.log("HDTemp2 : "..tostring(results[11]),dz.LOG_DEBUG) 
            if NAS_HDD2_TEMP ~= nil then dz.devices(NAS_HDD2_TEMP).update(0,results[11]) end
        end
        if results[12] then 
            dz.log("HDTemp3 : "..tostring(results[12]),dz.LOG_DEBUG) 
            if NAS_HDD3_TEMP ~= nil then dz.devices(NAS_HDD3_TEMP).update(0,results[12]) end
        end
        if results[13] then 
            dz.log("HDTemp4 : "..tostring(results[13]),dz.LOG_DEBUG) 
            if NAS_HDD4_TEMP ~= nil then dz.devices(NAS_HDD4_TEMP).update(0,results[13]) end
        end

        if results[14] then 
            dz.log("ifHCOutOctets : "..tostring(results[14]),dz.LOG_DEBUG) 
			dz.data.ifHCOutOctets.add(tostring(results[14]))
			if tonumber(lastIfHCOutOctets) > 0 and tonumber(results[14]) > tonumber(lastIfHCOutOctets) then upload = round(((tonumber(results[14]) - tonumber(lastIfHCOutOctets)) / tonumber(ifHCOutSecondsAgo) / 1024)) end
			if NAS_UPLOAD ~= nil then dz.devices(NAS_UPLOAD).update(0,tostring(upload)) end
		end
        if results[15] then 
            dz.log("ifHCInOctets : "..tostring(results[15]),dz.LOG_DEBUG) 
			dz.data.ifHCInOctets.add(tostring(results[15]))	
			if tonumber(lastIfHCInOctets) > 0 and tonumber(results[15]) > tonumber(lastIfHCInOctets) then download = round(((tonumber(results[15]) - tonumber(lastIfHCInOctets)) / tonumber(ifHCInSecondsAgo) / 1024)) end
			if NAS_DOWNLOAD ~= nil then dz.devices(NAS_DOWNLOAD).update(0,tostring(download)) end		
		end

		dz.log("Upload : "..tostring(upload).."ko/s, Download : "..tostring(download).."ko/s",dz.LOG_DEBUG) 


        if results[0] and results[5] and results[6] then
                dz.log("Requete SNMP correcte ",dz.LOG_DEBUG)
                dz.devices(NAS).switchOn().checkFirst()
            else
                dz.log("Requete SNMP incorrecte ",dz.LOG_DEBUG)
                dz.devices(NAS).switchOff().checkFirst()
            end

        --RAID Status :
        --OK(1), Repairing(2), Migrating(3), Expanding(4), Deleting(5), Creating(6), RaidSyncing(7), RaidParityChecking(8), RaidAssembling(9), Canceling(10), Degraded(11), Creashed(12)
    end
}
domoticz beta/RaspBerry PI3 stretch
https://pon.fr github

Kyrille
Messages : 47
Enregistré le : 23 juin 2019, 16:12

Re: DZVents : Supervision d'un nas Synology avec SNMP

Message par Kyrille »

Je confirme, ça marche nickel, merci !

L'ajout de "NAS Download" et "NAS Upload" :

Image

Et un log associé :

Image

Encore merci !
Raspberry Pi 3B+ (buster) / Conbee II / Z-Stick Gen 5 / RFXCOM 433 XL / Domoticz 2020.02

papoo
Messages : 2009
Enregistré le : 10 janv. 2016, 11:29
Localisation : Limoges (87)
Contact :

Re: DZVents : Supervision d'un nas Synology avec SNMP

Message par papoo »

cool, merci du retour
domoticz beta/RaspBerry PI3 stretch
https://pon.fr github

titis14
Messages : 138
Enregistré le : 22 juin 2018, 14:09

Re: DZVents : Supervision d'un nas Synology avec SNMP

Message par titis14 »

Merci papoo pour cette mise à jour sympathique, fonctionne pour moi aussi sur un RS814+ par contre des fois il me mets 0Ko/s en en download alors qu'il y a toujours de l'activité (6 caméras sur surveillance station)
Il n'a pas l'air de le refaire le temps de faire ce message.
Image

Répondre