Update flask_server.py

This commit is contained in:
MacRimi
2026-04-16 14:45:47 +02:00
parent 0b94acf7f6
commit eea765300e

View File

@@ -2814,38 +2814,48 @@ def get_smart_data(disk_name):
elif attr_id == 199: # UDMA_CRC_Error_Count elif attr_id == 199: # UDMA_CRC_Error_Count
smart_data['crc_errors'] = raw_value smart_data['crc_errors'] = raw_value
elif attr_id == 230: # Media_Wearout_Indicator (WD/SanDisk) # --- SSD/NVMe wear & lifetime — NAME-based detection ---
# normalized_value = endurance used % (0=new, 100=fully worn) # Same SMART ID means different things on different manufacturers.
smart_data['media_wearout_indicator'] = normalized_value # Always check attr name to avoid cross-manufacturer misinterpretation.
smart_data['ssd_life_left'] = max(0, 100 - normalized_value) elif attr_id in (177, 202, 230, 231, 233, 241):
attr_name = attr.get('name', '').lower()
elif attr_id == 233: # Media_Wearout_Indicator (Intel/Samsung SSD) # --- Wear / Life indicators ---
# Normalized: 100=new, 0=worn → invert to get wear used % if attr_id == 230 and ('wearout' in attr_name or 'media' in attr_name):
smart_data['media_wearout_indicator'] = 100 - normalized_value # WD/SanDisk Media_Wearout_Indicator: value = endurance used %
smart_data['media_wearout_indicator'] = normalized_value
smart_data['ssd_life_left'] = max(0, 100 - normalized_value)
elif attr_id == 177: # Wear_Leveling_Count elif attr_id == 233 and ('wearout' in attr_name or 'media' in attr_name):
# Normalized: 100=new, 0=worn → invert to get wear used % # Intel/Samsung Media_Wearout_Indicator: value = life remaining %
smart_data['wear_leveling_count'] = 100 - normalized_value # Skip if already set by ID 230 (prevents overwrite)
if smart_data.get('media_wearout_indicator') is None:
smart_data['media_wearout_indicator'] = 100 - normalized_value
elif attr_id == 202: # Percentage_Lifetime_Remain elif attr_id == 177 and ('wear' in attr_name or 'leveling' in attr_name):
# Normalized: 100=new, 0=worn → value IS life remaining # Samsung/Crucial Wear_Leveling_Count: value = life remaining %
smart_data['ssd_life_left'] = normalized_value smart_data['wear_leveling_count'] = 100 - normalized_value
elif attr_id == 231: # SSD_Life_Left elif attr_id == 202 and ('lifetime' in attr_name or 'life' in attr_name):
# Normalized: value IS life remaining % # Micron/Crucial Percent_Lifetime_Remain: value = life remaining %
smart_data['ssd_life_left'] = normalized_value smart_data['ssd_life_left'] = normalized_value
elif attr_id == 241: # Total_LBAs_Written / Host_Writes_GiB
attr_name = attr.get('name', '') elif attr_id == 231 and ('life' in attr_name):
if 'gib' in attr_name.lower() or '_gb' in attr_name.lower(): # Kingston/Phison SSD_Life_Left: value = life remaining %
# WD/Kingston: raw value already in GiB smart_data['ssd_life_left'] = normalized_value
smart_data['total_lbas_written'] = round(raw_value, 2)
else: # --- Data written ---
# Standard: raw value in LBA sectors (512 bytes each) elif attr_id == 241:
try: if 'gib' in attr_name or '_gb' in attr_name or 'writes_g' in attr_name:
total_gb = (raw_value * 512) / (1024 * 1024 * 1024) # WD/Kingston: raw value already in GiB
smart_data['total_lbas_written'] = round(total_gb, 2) smart_data['total_lbas_written'] = round(raw_value, 2)
except (ValueError, TypeError): elif 'lba' in attr_name or 'written' in attr_name:
pass # Seagate/Standard: raw value in LBA sectors (512 bytes)
try:
total_gb = (raw_value * 512) / (1024 * 1024 * 1024)
smart_data['total_lbas_written'] = round(total_gb, 2)
except (ValueError, TypeError):
pass
# If we got good data, break out of the loop # If we got good data, break out of the loop
if smart_data['model'] != 'Unknown' and smart_data['serial'] != 'Unknown': if smart_data['model'] != 'Unknown' and smart_data['serial'] != 'Unknown':
@@ -2984,63 +2994,40 @@ def get_smart_data(disk_name):
smart_data['crc_errors'] = int(raw_value) smart_data['crc_errors'] = int(raw_value)
# print(f"[v0] CRC Errors: {smart_data['crc_errors']}") # print(f"[v0] CRC Errors: {smart_data['crc_errors']}")
pass pass
elif attr_id == '230': # --- SSD wear & data written (text path) — NAME-based ---
try: elif attr_id in ('177', '202', '230', '231', '233', '241'):
wear_used = None a_name = parts[1].lower() if len(parts) > 1 else ''
raw_str = str(raw_value).strip() nv = int(parts[3]) if len(parts) > 3 else 100
if raw_str.startswith("0x") and len(raw_str) >= 8: if attr_id == '230' and ('wearout' in a_name or 'media' in a_name):
# WD/SanDisk: value = endurance used %
smart_data['media_wearout_indicator'] = nv
smart_data['ssd_life_left'] = max(0, 100 - nv)
wear_hex = raw_str[4:8] elif attr_id == '233' and ('wearout' in a_name or 'media' in a_name):
wear_used = int(wear_hex, 16) # Intel/Samsung: value = life remaining %
else: if smart_data.get('media_wearout_indicator') is None:
wear_used = int(raw_str) smart_data['media_wearout_indicator'] = 100 - nv
if wear_used is None or wear_used < 0 or wear_used > 100: elif attr_id == '177' and ('wear' in a_name or 'leveling' in a_name):
normalized_value = int(parts[3]) if len(parts) > 3 else 100 smart_data['wear_leveling_count'] = 100 - nv
wear_used = max(0, min(100, 100 - normalized_value))
smart_data['media_wearout_indicator'] = wear_used elif attr_id == '202' and ('lifetime' in a_name or 'life' in a_name):
smart_data['ssd_life_left'] = max(0, 100 - wear_used) smart_data['ssd_life_left'] = nv
# print(f"[v0] Media Wearout Indicator (ID 230): {wear_used}% used, {smart_data['ssd_life_left']}% life left")
pass elif attr_id == '231' and 'life' in a_name:
except Exception as e: smart_data['ssd_life_left'] = nv
# print(f"[v0] Error parsing Media_Wearout_Indicator (ID 230): {e}")
pass elif attr_id == '241':
elif attr_id == '233': # Media_Wearout_Indicator (Intel/Samsung SSD) try:
# Valor normalizado: 100 = nuevo, 0 = gastado raw_int = int(raw_value.replace(',', ''))
# Invertimos para mostrar desgaste: 0% = nuevo, 100% = gastado if 'gib' in a_name or '_gb' in a_name or 'writes_g' in a_name:
normalized_value = int(parts[3]) if len(parts) > 3 else 100 smart_data['total_lbas_written'] = round(raw_int, 2)
smart_data['media_wearout_indicator'] = 100 - normalized_value elif 'lba' in a_name or 'written' in a_name:
# print(f"[v0] Media Wearout Indicator (ID 233): {smart_data['media_wearout_indicator']}% used") total_gb = (raw_int * 512) / (1024 * 1024 * 1024)
pass smart_data['total_lbas_written'] = round(total_gb, 2)
elif attr_id == '177': # Wear_Leveling_Count except ValueError:
# Valor normalizado: 100 = nuevo, 0 = gastado pass
normalized_value = int(parts[3]) if len(parts) > 3 else 100
smart_data['wear_leveling_count'] = 100 - normalized_value
# print(f"[v0] Wear Leveling Count (ID 177): {smart_data['wear_leveling_count']}% used")
pass
elif attr_id == '202': # Percentage_Lifetime_Remain (algunos fabricantes)
# Valor normalizado: 100 = nuevo, 0 = gastado
normalized_value = int(parts[3]) if len(parts) > 3 else 100
smart_data['ssd_life_left'] = normalized_value
# print(f"[v0] SSD Life Left (ID 202): {smart_data['ssd_life_left']}%")
pass
elif attr_id == '231': # SSD_Life_Left (algunos fabricantes)
normalized_value = int(parts[3]) if len(parts) > 3 else 100
smart_data['ssd_life_left'] = normalized_value
# print(f"[v0] SSD Life Left (ID 231): {smart_data['ssd_life_left']}%")
pass
elif attr_id == '241': # Total_LBAs_Written
# Convertir a GB (raw_value es en sectores de 512 bytes)
try:
raw_int = int(raw_value.replace(',', ''))
total_gb = (raw_int * 512) / (1024 * 1024 * 1024)
smart_data['total_lbas_written'] = round(total_gb, 2)
# print(f"[v0] Total LBAs Written (ID 241): {smart_data['total_lbas_written']} GB")
pass
except ValueError:
pass
except (ValueError, IndexError) as e: except (ValueError, IndexError) as e:
# print(f"[v0] Error parsing attribute line '{line}': {e}") # print(f"[v0] Error parsing attribute line '{line}': {e}")