Complete rewrite: SnapRAID SMART logger with BackBlaze algorithm
Fetches SMART data from Scrutiny's InfluxDB and calculates failure probabilities using the exact BackBlaze tables from SnapRAID source. Key features: - Calculates both v12 (with attr 193) and v13 (without attr 193) algorithms - v12 matches SnapRAID pre-v13.0 (includes Load Cycle Count) - v13 matches modern SnapRAID v13.0+ (excludes Load Cycle Count) - Stores both values for trending and comparison - Correctly applies bit masks (16-bit for 187/188, 32-bit for others) - Annualizes monthly rates and applies Poisson distribution - Logs to PostgreSQL with device metadata Solved the mystery: SnapRAID v12 uses attribute 193 which was removed in v13.0. Load cycle count has massive impact on failure predictions for some drives (80% vs 4% difference). 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
This commit is contained in:
@@ -0,0 +1,170 @@
|
||||
# Setup Guide - Smart Logger V3
|
||||
|
||||
This version uses a **PostgreSQL devices table** for metadata instead of the Scrutiny API. Much simpler!
|
||||
|
||||
## Quick Setup
|
||||
|
||||
### 1. Create the Database Schema
|
||||
|
||||
```bash
|
||||
# Run the new schema (includes devices table)
|
||||
psql -h <your-pg-host> -U <user> -d smart_monitoring -f schema_v2.sql
|
||||
```
|
||||
|
||||
### 2. Get Your Device WWNs
|
||||
|
||||
Run the helper script to see all devices in InfluxDB:
|
||||
|
||||
```bash
|
||||
python get_device_info.py
|
||||
```
|
||||
|
||||
This will show:
|
||||
```
|
||||
Device 1:
|
||||
WWN: 0x5000c500744487c5
|
||||
Protocol: ATA
|
||||
Temperature: 24°C
|
||||
Power-On Time: 1968 days (47232 hours)
|
||||
|
||||
Device 2:
|
||||
...
|
||||
```
|
||||
|
||||
### 3. Populate Device Metadata
|
||||
|
||||
Now match each WWN with its actual device info from `snapraid smart`:
|
||||
|
||||
```
|
||||
Temp Power Error FP Size
|
||||
C OnDays Count TB Serial Device Disk
|
||||
-----------------------------------------------------------------------
|
||||
24 1968 0 81% 12.0 ZLW0A3QJ /dev/sdc d1
|
||||
25 637 0 22% 20.0 ZX22EJ3Y /dev/sdb d2
|
||||
21 1014 0 51% 12.0 ZTN1BNEZ /dev/sdd d5
|
||||
25 636 0 49% 20.0 ZX20AAMV /dev/sda parity
|
||||
25 2540 0 30% 10.0 2TJ97M6D /dev/sdg 2-parity
|
||||
28 2354 1 4% 10.0 7JJVJ65C /dev/sdh 2-parity
|
||||
32 1983 0 4% 3.0 YVGGG6EC /dev/sde -
|
||||
30 2072 0 84% 8.0 ZA1GX9F4 /dev/sdf -
|
||||
- - 0 - - 25243X801438 /dev/nvme0n1 -
|
||||
32 2074 0 84% 8.0 ZA1GW0XM /dev/sdi -
|
||||
```
|
||||
|
||||
Match the power-on days from `get_device_info.py` with the power-on days from `snapraid smart` to identify each WWN.
|
||||
|
||||
For example:
|
||||
- **WWN 0x5000c500744487c5** has **1968 days** → matches **/dev/sdc** (ZLW0A3QJ, d1)
|
||||
|
||||
### 4. Edit populate_devices.sql
|
||||
|
||||
Update `populate_devices.sql` with your actual device information:
|
||||
|
||||
```sql
|
||||
INSERT INTO devices (device_wwn, device_path, serial_number, model, manufacturer, capacity_bytes, size_tb, disk_role, notes)
|
||||
VALUES (
|
||||
'0x5000c500744487c5',
|
||||
'/dev/sdc',
|
||||
'ZLW0A3QJ',
|
||||
'WDC WD120EFAX-68FB5N0', -- Get from smartctl -i /dev/sdc
|
||||
'Western Digital',
|
||||
12000000000000,
|
||||
12.0,
|
||||
'd1',
|
||||
'Data drive 1'
|
||||
);
|
||||
```
|
||||
|
||||
Repeat for all 9 drives.
|
||||
|
||||
### 5. Load the Data
|
||||
|
||||
```bash
|
||||
psql -h <your-pg-host> -U <user> -d smart_monitoring -f populate_devices.sql
|
||||
```
|
||||
|
||||
### 6. Run the Logger!
|
||||
|
||||
```bash
|
||||
python smart_logger_v3.py
|
||||
```
|
||||
|
||||
## Expected Output
|
||||
|
||||
```
|
||||
Connecting to InfluxDB at http://cyrion.c0smere.net:8086...
|
||||
✓ Connected to InfluxDB
|
||||
Connecting to PostgreSQL...
|
||||
✓ Connected to PostgreSQL
|
||||
Loading device metadata from database...
|
||||
✓ Loaded metadata for 9 device(s)
|
||||
Querying InfluxDB for SMART data...
|
||||
✓ Found data for 9 device(s)
|
||||
|
||||
/dev/sdc
|
||||
WWN: 0x5000c500744487c5
|
||||
Serial: ZLW0A3QJ
|
||||
Model: WDC WD120EFAX
|
||||
Role: d1
|
||||
Temp: 24°C
|
||||
Power-On: 1968 days
|
||||
Size: 12.0 TB
|
||||
SMART Attrs: [5, 187, 197, 198]
|
||||
Failure Probability: 81.00%
|
||||
|
||||
...
|
||||
|
||||
================================================================================
|
||||
SnapRAID-style SMART Summary
|
||||
================================================================================
|
||||
Temp Power Error FP Size
|
||||
C OnDays Count TB Serial Device Disk
|
||||
--------------------------------------------------------------------------------
|
||||
24 1968 0 81% 12.0 ZLW0A3QJ /dev/sdc d1
|
||||
25 637 0 22% 20.0 ZX22EJ3Y /dev/sdb d2
|
||||
21 1014 0 51% 12.0 ZTN1BNEZ /dev/sdd d5
|
||||
25 636 0 49% 20.0 ZX20AAMV /dev/sda parity
|
||||
25 2540 0 30% 10.0 2TJ97M6D /dev/sdg 2-parity
|
||||
```
|
||||
|
||||
## Querying the Data
|
||||
|
||||
```sql
|
||||
-- Latest status for all drives
|
||||
SELECT * FROM smart_summary;
|
||||
|
||||
-- Historical data for a specific drive
|
||||
SELECT timestamp, temperature_celsius, failure_probability_pct
|
||||
FROM smart_metrics sm
|
||||
JOIN devices d ON sm.device_wwn = d.device_wwn
|
||||
WHERE d.device_path = '/dev/sdc'
|
||||
ORDER BY timestamp DESC
|
||||
LIMIT 100;
|
||||
|
||||
-- High-risk drives
|
||||
SELECT * FROM smart_high_risk;
|
||||
```
|
||||
|
||||
## Automation
|
||||
|
||||
Add to cron to run hourly:
|
||||
|
||||
```cron
|
||||
0 * * * * cd /home/wes/projects/snapraid_smart_logger && /home/wes/projects/snapraid_smart_logger/venv/bin/python smart_logger_v3.py >> /var/log/smart_logger.log 2>&1
|
||||
```
|
||||
|
||||
## Updating Device Info
|
||||
|
||||
If you add/remove drives, just update the `devices` table:
|
||||
|
||||
```sql
|
||||
-- Add a new drive
|
||||
INSERT INTO devices (device_wwn, device_path, serial_number, model, manufacturer, capacity_bytes, size_tb, disk_role)
|
||||
VALUES ('0xNEW_WWN', '/dev/sdj', 'NEWSERIAL', 'MODEL', 'MANUFACTURER', 12000000000000, 12.0, 'd6');
|
||||
|
||||
-- Remove a drive
|
||||
DELETE FROM devices WHERE device_wwn = '0xOLD_WWN';
|
||||
|
||||
-- Update drive role
|
||||
UPDATE devices SET disk_role = 'parity' WHERE device_path = '/dev/sda';
|
||||
```
|
||||
Reference in New Issue
Block a user