paint-brush
Python + SNMP = Real-Time NAS Disk Temperature Monitor!🌡️ Alamin Kung Paano Ko Ito Ginawasa pamamagitan ng@support2minlog
279 mga pagbabasa

Python + SNMP = Real-Time NAS Disk Temperature Monitor!🌡️ Alamin Kung Paano Ko Ito Ginawa

sa pamamagitan ng 2minlog6m2024/10/31
Read on Terminal Reader

Masyadong mahaba; Upang basahin

Nag-set up ako ng maaasahang real-time na sistema ng pagsubaybay sa temperatura ng NAS HDD. Ang isang script ng Python ay tumatakbo sa isang kapaligiran ng Docker nang direkta sa NAS. Kinokolekta nito ang temperatura sa pamamagitan ng SNMP protocol at ipinapadala ang data sa 2minlog data visualization platform. Nakikita ko ang pag-unlad ng temperatura sa pamamagitan ng Matplotlib at ipinapakita ito sa isang Android tablet.
featured image - Python + SNMP = Real-Time NAS Disk Temperature Monitor!🌡️ Alamin Kung Paano Ko Ito Ginawa
2minlog HackerNoon profile picture
0-item
1-item
2-item

Palagi kong iniisip ang tungkol sa temperatura ng mga HDD sa aking NAS. Mayroon akong NAS sa isang saradong silid na walang airco. Bukod dito, na-disassemble ko ang NAS kanina, at talagang mainit ang mga disc... Hindi ko sinukat ang temperatura noon, ngunit nagsimula akong mag-alala. Makakahanap ka ng maraming talakayan sa temperatura ng drive ng NAS at pagsubaybay nito mula sa kapaligiran ng Linux/Python. Ngunit wala sa mga solusyon ang gumana para sa akin!


Ang gusto ko:

  • Pagsubaybay sa temperatura ng NAS HDD sa isang maaasahang, dokumentado na paraan - Hindi ko nais na basahin ang halaga mula sa ilang bahagi ng subsystem ng Linux, na maaaring magbago sa susunod na paglabas ng NAS software.
  • Gusto kong makita ang aking NAS sa bahay at ang aking backup na NAS , na nasa basement ng aking kapatid, sa isang graph.
  • Gusto kong makita ang mga halaga sa isang cool-looking graph. Gusto ko ng kabuuang flexibility sa hitsura ng graph, mas mainam na i-set up ito nang mag-isa sa Matplotlib.
  • Gusto kong makuha ang mga halaga mula sa dashboard ng NAS at magpakita ng mga graph sa real time . Mayroon akong 2minlog display na nakaupo sa aking desk. Ipinapakita na nito ang mga antas ng temperatura, halumigmig, at polusyon sa aking balkonahe at ang kasaysayan ng pagkakaroon ng aking koneksyon sa internet. Gusto kong makita ang history ng temperatura ng HDD doon.


Hakbang 1: Pagkolekta ng data ng temperatura

Mag-iipon kami ng data sa pamamagitan ng SNMP protocol sa pamamagitan ng pysnmp package.


Pag-unawa sa SNMP at MIB

Ang SNMP (Simple Network Management Protocol) ay isang malawakang ginagamit na protocol para sa pagsubaybay sa kalusugan at pagganap ng mga network device. Pinapayagan nito ang pagkolekta ng data tulad ng mga temperatura, paggamit ng CPU, at status ng disk.

Ang mga MIB (Management Information Bases) ay mga database ng impormasyon na maaaring itanong sa pamamagitan ng SNMP. Ang bawat piraso ng data ay kinikilala ng isang OID (Object Identifier), na natatanging kinikilala ang isang variable na maaaring basahin o itakda sa pamamagitan ng SNMP.


Kailangan mong tukuyin ang mga halaga ng MIB upang tipunin. Mayroon akong Synology NAS. Ini-publish nila ang MIB file sa kanilang mga pahina. Kailangan nating magtipon:

  • Pangalan ng disk: 1.3.6.1.4.1.6574.2.1.1.2
  • Modelo ng disk: 1.3.6.1.4.1.6574.2.1.1.3
  • Temperatura ng disk: 1.3.6.1.4.1.6574.2.1.1.6


Mayroong isang mahusay na chatbot sa pahina ng pysnmp. Isinulat nito ang katawan ng script ng Python para sa akin, pinangangasiwaan ang lahat ng mga paghihirap sa SNMP API at paghawak ng mga async na tawag. Ang pangunahing seksyon ay sumusunod:

 async def run(server_name, ipaddress, username, passwd, outinfo): # SNMP walk for disk name, model, and temperature oids = [ ObjectType(ObjectIdentity('1.3.6.1.4.1.6574.2.1.1.2')), # Disk name (diskID) ObjectType(ObjectIdentity('1.3.6.1.4.1.6574.2.1.1.3')), # Disk model (diskModel) ObjectType(ObjectIdentity('1.3.6.1.4.1.6574.2.1.1.6')) # Disk temperature (diskTemperature) ] errorIndication, errorStatus, errorIndex, varBinds = await bulkCmd( SnmpEngine(), UsmUserData(username, passwd, authProtocol=usmHMACSHAAuthProtocol), # Use the appropriate auth protocol await UdpTransportTarget.create((ipaddress, 161)), ContextData(), 0, 10, # Increase the max-repetitions to get more results in one request *oids # Query disk name, model, and temperature ) if errorIndication: print(f"Error: {errorIndication}") elif errorStatus: print(f"Error Status: {errorStatus.prettyPrint()} at {errorIndex and varBinds[int(errorIndex) - 1] or '?'}") else: disk_data = {} for varBind in varBinds: oid, value = varBind oid_str = str(oid) # Disk name if oid_str.startswith('1.3.6.1.4.1.6574.2.1.1.2'): index = oid_str.split('.')[-1] if index not in disk_data: disk_data[index] = {} disk_data[index]['name'] = value # Disk model elif oid_str.startswith('1.3.6.1.4.1.6574.2.1.1.3'): index = oid_str.split('.')[-1] if index not in disk_data: disk_data[index] = {} disk_data[index]['model'] = value # Disk temperature elif oid_str.startswith('1.3.6.1.4.1.6574.2.1.1.6'): index = oid_str.split('.')[-1] if index not in disk_data: disk_data[index] = {} disk_data[index]['temperature'] = value # Print out the disk information for index, info in disk_data.items(): name = info.get('name', 'Unknown') model = info.get('model', 'Unknown') temperature = info.get('temperature', 'Unknown') name = str(name) model = str(model) temperature = str(temperature) print(f"IP Address {ipaddress}, Disk {index}: Name: {name}, Model: {model}, Temperature: {temperature} °C") outinfo.append({'server_name': server_name, 'ip': ipaddress, 'disk': index, 'name': name, 'model': model, 'temperature': temperature})


Kailangan mong paganahin ang SNMP protocol sa mga setting ng Synology NAS:

Hakbang 2: I-deploy ang script at magpadala ng data para sa pagproseso

Direktang ini-deploy ko ang script sa NAS sa kapaligiran ng Docker. Dapat mong tiyakin na magsisimula muli ang lalagyan ng Docker pagkatapos ng pag-restart. Nag-set up ako ng isang simpleng docker-compose.yaml file para sa kadahilanang iyon:

 version: '3.8' services: pingchart: build: . restart: always container_name: synology-temperature

Pagkatapos ay simulan ang Docker gamit docker-compose up -d .


Ako ay kaakibat sa 2minlog - isang simpleng sistema para mangalap, magproseso, at mag-visualize ng data. Ipapadala mo ang data doon sa pamamagitan ng mga kahilingan sa HTTPS (naka-encode sa URL o sa katawan) at nag-set up ng visualization script doon. Ang mga graph ay madaling magagamit mula sa kahit saan na kailangan mo.


Maaari mong gamitin ang 2minlog. Bilang kahalili, maaari mong ipadala ang data sa isang database o lokal na file system.

Hakbang 3: Visualization ng data

Nag-set up ako ng simpleng Matplotlib script para ipakita ang graph. Sa totoo lang, hiniling ko sa ChatGPT (o1-preview) na gawin ito, at maganda ang ginawa nito. Ang script ng Python ay hindi perpekto, ngunit ito ay sapat na mabuti upang matapos ang gawain nang mabilis. Nasa ibaba ang prompt.

 Here is a csv file. Can you write a code: Split data into different graphs by combining the server name and name (eg, DS920+ / Disk 1). Each graph will show the temperature. There will be a title in each graph (eg, DS920+ / Disk 1) The graphs will have the same temperature range. The background will be black, graph background will be also black, the graph color will be from dark green (low temperatures) to light green (high temperatures). There will be two thin lines - 20 °C (blue) and 45 °C (red). Trim the data for last week with tickmarks at midnight of every day. The data are in UTC time. Convert it to Europe/Berlin time zone. The resolution of the total image is hxw 600 x 1024 pixels. Save the image to PNG. disk,ip,model,name,server_name,temperature,timestamp 0,10.0.0.9,ST4000VN008-2DR166,Disk 3,DS920+,38,2024-09-19T20:19:48.723761 1,10.0.0.9,ST16000NM000J-2TW103,Disk 4,DS920+,42,2024-09-19T20:19:49.253975 2,10.0.0.9,ST4000VX007-2DT166,Disk 1,DS920+,38,2024-09-19T20:19:49.818734 3,10.0.0.9,ST4000VX007-2DT166,Disk 2,DS920+,39,2024-09-19T20:19:50.393793 0,10.0.2.9,ST12000NM001G-2MV103,Disk 1,DS220j,28,2024-09-19T20:19:50.873142 0,10.0.0.9,ST4000VN008-2DR166,Disk 3,DS920+,38,2024-09-19T20:20:02.119583 1,10.0.0.9,ST16000NM000J-2TW103,Disk 4,DS920+,42,2024-09-19T20:20:02.596654 2,10.0.0.9,ST4000VX007-2DT166,Disk 1,DS920+,38,2024-09-19T20:20:03.101480 3,10.0.0.9,ST4000VX007-2DT166,Disk 2,DS920+,39,2024-09-19T20:20:03.697423 0,10.0.2.9,ST12000NM001G-2MV103,Disk 1,DS220j,28,2024-09-19T20:20:04.221348 0,10.0.0.9,ST4000VN008-2DR166,Disk 3,DS920+,38,2024-09-19T20:25:02.254611 1,10.0.0.9,ST16000NM000J-2TW103,Disk 4,DS920+,42,2024-09-19T20:25:02.714633 2,10.0.0.9,ST4000VX007-2DT166,Disk 1,DS920+,38,2024-09-19T20:25:03.295622 3,10.0.0.9,ST4000VX007-2DT166,Disk 2,DS920+,39,2024-09-19T20:25:03.780728 ...


Ang visualization script ay na-deploy sa loob ng 2minlog platform. Maaari mo ring patakbuhin ito nang lokal.


Available ang script sa GitHub .

Binabalot ito

Maaari kang gumamit ng ganap na pinamamahalaang 2minlog para mangalap, magproseso, at mailarawan ang data. Tingnan ang dokumentasyon . Ipinapakita ko ang mga resulta sa isang Android tablet na nakaupo sa aking mesa at umiikot sa iba't ibang mga graph na may Image Tuner . Maaari mo ring i-save ang data sa iyong lokal na file system at gawin ang parehong.


Ang solusyon ay sinubukan sa isang Synology NAS, ngunit maaaring iakma para sa iba.

Mga sanggunian:


#Synology #SynologyNAS #Temperature #Monitoring #DataVisualization #Matplotlib #SNMP #2minlog #Python #Docker