paint-brush
Python + SNMP = ቅጽበታዊ NAS ዲስክ የሙቀት መቆጣጠሪያ!🌡️ እንዴት እንዳደረኩት ይወቁ@support2minlog
279 ንባቦች

Python + SNMP = ቅጽበታዊ NAS ዲስክ የሙቀት መቆጣጠሪያ!🌡️ እንዴት እንዳደረኩት ይወቁ

2minlog6m2024/10/31
Read on Terminal Reader

በጣም ረጅም፤ ማንበብ

አስተማማኝ የእውነተኛ ጊዜ NAS HDD የሙቀት መቆጣጠሪያ ስርዓት አዘጋጅቻለሁ። የ Python ስክሪፕት በ Docker አካባቢ በቀጥታ በ NAS ላይ ይሰራል። የሙቀት መጠኑን በ SNMP ፕሮቶኮል ይሰበስባል እና ውሂቡን ወደ 2minlog data visualization platform ይልካል። የሙቀት እድገቱን በ Matplotlib በኩል አይቻለሁ እና በአንድሮይድ ጡባዊ ላይ አሳይቻለሁ።
featured image - Python + SNMP = ቅጽበታዊ NAS ዲስክ የሙቀት መቆጣጠሪያ!🌡️ እንዴት እንዳደረኩት ይወቁ
2minlog HackerNoon profile picture
0-item
1-item
2-item

በእኔ NAS ውስጥ ስላለው የኤችዲዲዎች ሙቀት ሁሌም አስብ ነበር። አየርኮ በሌለበት በተዘጋ ክፍል ውስጥ NAS አለኝ። በተጨማሪም፣ ከተወሰነ ጊዜ በፊት NAS ን ፈታሁት፣ እና ዲስኮች በጣም ሞቃት ነበሩ… በዛን ጊዜ የሙቀት መጠኑን አልለካሁም፣ ግን መጨነቅ ጀመርኩ። በ NAS ድራይቭ ሙቀት ላይ ብዙ ውይይቶችን ማግኘት እና ከሊኑክስ/ፓይቶን አካባቢ መከታተል ይችላሉ። ግን አንዱም መፍትሔ አልሰራልኝም!


የምፈልገው፡-

  • የ NAS HDD የሙቀት ቁጥጥር በአስተማማኝ ፣ በሰነድ የተቀመጠ መንገድ - ከአንዳንድ የሊኑክስ ንዑስ ስርዓት እሴቱን ማንበብ አልፈለግሁም ፣ ይህም የሚቀጥለውን የ NAS ሶፍትዌር ልቀት ሊለውጥ ይችላል።
  • በወንድሜ ምድር ቤት ውስጥ የሚገኘውን ቤቴ NAS እና መጠባበቂያዬን NAS በአንድ ግራፍ ውስጥ ማየት ፈልጌ ነበር።
  • አሪፍ በሚመስል ግራፍ ውስጥ እሴቶቹን ለማየት ፈልጌ ነበር። በግራፍ እይታ ውስጥ አጠቃላይ ተለዋዋጭነትን እፈልግ ነበር፣ በተለይም በማትፕሎትሊብ ውስጥ በራሴ ማዋቀር።
  • እሴቶቹን ከ NAS ዳሽቦርድ ማውጣት እና ግራፎችን በእውነተኛ ጊዜ ማሳየት መቻል እፈልጋለሁ። ጠረጴዛዬ ላይ የ 2minlog ማሳያ ተቀምጫለሁ። በረንዳዬ ላይ ያለውን የሙቀት፣ የእርጥበት መጠን እና የብክለት ደረጃዎች እና የበይነመረብ ግንኙነት ተገኝነትን ታሪክ አስቀድሞ ያሳያል። የኤችዲዲ የሙቀት መጠን ታሪክን እዚያ ማየት እፈልጋለሁ።


ደረጃ 1: የሙቀት መረጃን መሰብሰብ

መረጃን በ SNMP ፕሮቶኮልpysnmp ጥቅል በኩል እንሰበስባለን ።


SNMP እና MIBsን መረዳት

SNMP (ቀላል የአውታረ መረብ አስተዳደር ፕሮቶኮል) የኔትወርክ መሳሪያዎችን ጤና እና አፈፃፀም ለመቆጣጠር በሰፊው ጥቅም ላይ የዋለ ፕሮቶኮል ነው። እንደ ሙቀት፣ የሲፒዩ አጠቃቀም እና የዲስክ ሁኔታ ያሉ መረጃዎችን ለመሰብሰብ ያስችላል።

MIBs (የአስተዳደር መረጃ ቤዝ) በ SNMP በኩል ሊጠየቁ የሚችሉ የመረጃ ቋቶች ናቸው። እያንዳንዱ የውሂብ ክፍል በኦአይዲ (ነገር መለያ) ተለይቷል፣ እሱም በልዩ ሁኔታ በ SNMP ሊነበብ ወይም ሊዘጋጅ የሚችል ተለዋዋጭ ይለያል።


ለመሰብሰብ የ MIB እሴቶችን መግለጽ ያስፈልግዎታል። ሲኖሎጂ NAS አለኝ። የ MIB ፋይልን በገጾቻቸው ላይ ያትማሉ ። መሰብሰብ አለብን:

  • የዲስክ ስም፡ 1.3.6.1.4.1.6574.2.1.1.2
  • የዲስክ ሞዴል፡ 1.3.6.1.4.1.6574.2.1.1.3
  • የዲስክ ሙቀት: 1.3.6.1.4.1.6574.2.1.1.6


በ pysnmp ገጽ ላይ በጣም ጥሩ የቻትቦት አለ። ሁሉንም ችግሮች በ SNMP API እና ያልተመሳሰሉ ጥሪዎችን በማስተናገድ የፓይዘንን ስክሪፕት አካል ጽፎልኛል። ዋናው ክፍል እንደሚከተለው ነው-

 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})


በSynology NAS መቼቶች ውስጥ የ SNMP ፕሮቶኮልን ማንቃት አለቦት፡-

ደረጃ 2፡ ስክሪፕቱን አሰማር እና ውሂብን ለማስኬድ ይላኩ።

በ Docker አካባቢ ውስጥ ስክሪፕቱን በቀጥታ በ NAS ላይ አሰማርቻለሁ። የዶከር ኮንቴይነሩ በመጨረሻ እንደገና ከተጀመረ በኋላ እንደገና መጀመሩን ማረጋገጥ አለብዎት። ለዛ ምክንያት ቀላል docker-compose.yaml ፋይል አዘጋጅቻለሁ፡-

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

ከዚያ ዶከርን በ docker-compose up -d ይጀምሩ።


2minlog ጋር ግንኙነት አለኝ - መረጃን ለመሰብሰብ ፣ ለማካሄድ እና ለመሳል ቀላል ስርዓት። ውሂቡን በኤችቲቲፒኤስ ጥያቄዎች (በዩአርኤል ውስጥ ወይም በሰውነት ውስጥ በኮድ ውስጥ) ይልካሉ እና የእይታ ስክሪፕት እዚያ ያዘጋጃሉ። ስዕሎቹ ከሚፈልጉት ቦታ ሆነው በቀላሉ ይገኛሉ።


2minlog መጠቀም ይችላሉ። በአማራጭ, ውሂቡን ወደ የውሂብ ጎታ ወይም የአካባቢ የፋይል ስርዓት መላክ ይችላሉ.

ደረጃ 3፡ የውሂብ እይታ

ግራፉን ለማሳየት ቀላል የማትፕሎትሊብ ስክሪፕት አዘጋጅቻለሁ። በእውነቱ፣ ChatGPT (o1-preview) እንዲሰራ ጠየኩት፣ እና በጣም ጥሩ ነበር። የ Python ስክሪፕት ፍጹም አልነበረም፣ ነገር ግን ስራውን በፍጥነት ለመጨረስ በቂ ነበር። መጠየቂያው ከዚህ በታች ነው።

 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 ...


የእይታ ስክሪፕቱ በ2minlog መድረክ ውስጥ ተዘርግቷል። በአገር ውስጥም ማስኬድ ይችላሉ።


ስክሪፕቱ በ GitHub ላይ ይገኛል።

በመጠቅለል ላይ

ውሂቡን ለመሰብሰብ፣ ለማስኬድ እና ለማየት ሙሉ በሙሉ የሚተዳደር 2minlog መጠቀም ይችላሉ። ሰነዶቹን ይመልከቱ. ውጤቶቹን በአንድሮይድ ታብሌቴ ላይ በጠረጴዛዬ ላይ ተቀምጦ እና ዑደት ላይ በተለያዩ ግራፎች በምስል መቃኛ አሳይቻለሁ። እንዲሁም ውሂቡን በአካባቢዎ የፋይል ስርዓት ላይ ማስቀመጥ እና ተመሳሳይ ነገር ማድረግ ይችላሉ.


መፍትሄው በSynology NAS ላይ ተፈትኗል፣ ግን ለሌሎች ሊስማማ ይችላል።

ዋቢዎች፡-


#Synology #SynologyNAS #ሙቀት #ክትትል #ዳታ ቪዥዋልላይዜሽን #Matplotlib #SNMP #2minlog #Python #Docker