|
| 1 | +# Denver Mesh Network Node Categorization Analysis |
| 2 | + |
| 3 | +**Date**: September 18, 2024 |
| 4 | +**Data Source**: Meshtastic CLI `--nodes` command output |
| 5 | +**Total Nodes Analyzed**: 128 active nodes |
| 6 | +**Method**: Automated parsing and keyword-based categorization |
| 7 | + |
| 8 | +## Executive Summary |
| 9 | + |
| 10 | +This analysis categorizes 128 active nodes in the Denver Mesh network into 8 distinct categories based on node names, hardware types, roles, and operational characteristics. The findings will inform node classification algorithms for the Potato Mesh web platform's map visualization feature. |
| 11 | + |
| 12 | +## Categorization Methodology |
| 13 | + |
| 14 | +### Data Collection |
| 15 | +- **Source**: Meshtastic CLI output via `meshtastic --nodes > nodes_raw.txt` |
| 16 | +- **Fields Analyzed**: User name, AKA (short name), Hardware type, Role, Location data, Battery status, Last heard timestamp |
| 17 | +- **Parsing Method**: Python script parsing tabular CLI output with keyword matching |
| 18 | + |
| 19 | +### Classification Criteria |
| 20 | + |
| 21 | +Each node is categorized based on the following priority order: |
| 22 | + |
| 23 | +1. **Hardware Type** (Primary) |
| 24 | + - `T_DECK` → T-Deck Nodes |
| 25 | + - `T_ECHO` → T-Echo Nodes |
| 26 | + |
| 27 | +2. **Role-Based Classification** (Secondary) |
| 28 | + - `ROUTER`, `ROUTER_LATE` → BBS Servers |
| 29 | + |
| 30 | +3. **Keyword Analysis** (Tertiary) |
| 31 | + - Node name and AKA analyzed for category-specific keywords |
| 32 | + - Case-insensitive matching against predefined keyword lists |
| 33 | + |
| 34 | +## Node Categories & Classification Logic |
| 35 | + |
| 36 | +### 1. BBS Servers (8 nodes - 6.2%) |
| 37 | + |
| 38 | +**Classification Indicators:** |
| 39 | +- **Role**: `ROUTER`, `ROUTER_LATE` |
| 40 | +- **Keywords**: `bbs`, `station`, `repeater`, `rptr`, `postal` |
| 41 | +- **Hardware**: Primarily `STATION_G2`, `RAK4631` |
| 42 | + |
| 43 | +**Examples:** |
| 44 | +- `LRA rptr. W0XYZ` (Role: ROUTER) |
| 45 | +- `POSTAL REPEATER` (Keyword: "postal") |
| 46 | +- `Roadie-Station` (Keyword: "station") |
| 47 | + |
| 48 | +**Map Icon Recommendation**: 📡 (Antenna/Tower) |
| 49 | + |
| 50 | +### 2. Weather Stations (1 node - 0.8%) |
| 51 | + |
| 52 | +**Classification Indicators:** |
| 53 | +- **Keywords**: `weather`, `temp`, `sensor`, `environmental` |
| 54 | +- **Hardware**: `TRACKER_T1000_E` (environmental tracking device) |
| 55 | + |
| 56 | +**Examples:** |
| 57 | +- `WnQ Temp` (Keyword: "temp") |
| 58 | + |
| 59 | +**Map Icon Recommendation**: 🌡️ (Thermometer) or 🌤️ (Weather) |
| 60 | + |
| 61 | +### 3. Mobile Nodes (7 nodes - 5.5%) |
| 62 | + |
| 63 | +**Classification Indicators:** |
| 64 | +- **Keywords**: `mobile`, `car`, `vehicle`, `rover` |
| 65 | +- **Hardware**: Various (RAK4631, HELTEC_V3) |
| 66 | + |
| 67 | +**Examples:** |
| 68 | +- `KF0KIT/Patzy - Mobile Node` (Keyword: "mobile") |
| 69 | +- `Wormhole Mobile 01` (Keyword: "mobile") |
| 70 | + |
| 71 | +**Map Icon Recommendation**: 🚗 (Car) or 📱 (Mobile device) |
| 72 | + |
| 73 | +### 4. Base Stations (17 nodes - 13.3%) |
| 74 | + |
| 75 | +**Classification Indicators:** |
| 76 | +- **Keywords**: `base`, `home`, `qth`, `fixed` |
| 77 | +- **Hardware**: Various (RAK4631, HELTEC_V3, STATION_G2) |
| 78 | + |
| 79 | +**Examples:** |
| 80 | +- `GZ Home Base` (Keywords: "home", "base") |
| 81 | +- `Justin Base 9bb6` (Keyword: "base") |
| 82 | +- `NV0N QTH` (Keyword: "qth") |
| 83 | + |
| 84 | +**Map Icon Recommendation**: 🏠 (House) or 📍 (Fixed location) |
| 85 | + |
| 86 | +### 5. Solar Nodes (12 nodes - 9.4%) |
| 87 | + |
| 88 | +**Classification Indicators:** |
| 89 | +- **Keywords**: `solar`, `sun`, `☀` (solar emoji) |
| 90 | +- **Hardware**: Various with solar power capability |
| 91 | + |
| 92 | +**Examples:** |
| 93 | +- `W3OO Solar Heltec V4` (Keyword: "solar") |
| 94 | +- `NV0N Solar Node` (Keyword: "solar") |
| 95 | +- `Noland (W0DRZ) ☀️` (Emoji: "☀️") |
| 96 | + |
| 97 | +**Map Icon Recommendation**: ☀️ (Sun) or 🔋 (Solar panel) |
| 98 | + |
| 99 | +### 6. T-Deck Nodes (3 nodes - 2.3%) |
| 100 | + |
| 101 | +**Classification Indicators:** |
| 102 | +- **Hardware**: `T_DECK` (Primary indicator) |
| 103 | +- **Modern keyboard-equipped devices** |
| 104 | + |
| 105 | +**Examples:** |
| 106 | +- `trose[denvermesh.org]` (Hardware: T_DECK) |
| 107 | +- `NOT-A-RUBICON 2` (Hardware: T_DECK) |
| 108 | + |
| 109 | +**Map Icon Recommendation**: ⌨️ (Keyboard) or 🎮 (Gaming device) |
| 110 | + |
| 111 | +### 7. T-Echo Nodes (6 nodes - 4.7%) |
| 112 | + |
| 113 | +**Classification Indicators:** |
| 114 | +- **Hardware**: `T_ECHO` (Primary indicator) |
| 115 | +- **Compact handheld devices** |
| 116 | + |
| 117 | +**Examples:** |
| 118 | +- `Elm2` (Hardware: T_ECHO) |
| 119 | +- `Spacestation-13` (Hardware: T_ECHO) |
| 120 | + |
| 121 | +**Map Icon Recommendation**: 📱 (Phone) or 🔊 (Echo device) |
| 122 | + |
| 123 | +### 8. Other Nodes (74 nodes - 57.8%) |
| 124 | + |
| 125 | +**Classification Indicators:** |
| 126 | +- **Default category** for nodes not matching other criteria |
| 127 | +- **Mixed hardware types and purposes** |
| 128 | + |
| 129 | +**Map Icon Recommendation**: 📡 (Generic radio) or ⚙️ (Generic device) |
| 130 | + |
| 131 | +## Implementation Recommendations for Potato Mesh Web |
| 132 | + |
| 133 | +### 1. Classification Algorithm |
| 134 | + |
| 135 | +```python |
| 136 | +def classify_node(node_data): |
| 137 | + # Priority 1: Hardware-based classification |
| 138 | + if node_data['hardware'] == 'T_DECK': |
| 139 | + return 'tdeck' |
| 140 | + elif node_data['hardware'] == 'T_ECHO': |
| 141 | + return 'techo' |
| 142 | + |
| 143 | + # Priority 2: Role-based classification |
| 144 | + if node_data['role'] in ['ROUTER', 'ROUTER_LATE']: |
| 145 | + return 'bbs_server' |
| 146 | + |
| 147 | + # Priority 3: Keyword-based classification |
| 148 | + name_lower = (node_data['user'] + ' ' + node_data['aka']).lower() |
| 149 | + |
| 150 | + if any(kw in name_lower for kw in ['solar', 'sun', '☀']): |
| 151 | + return 'solar' |
| 152 | + elif any(kw in name_lower for kw in ['mobile', 'car', 'vehicle']): |
| 153 | + return 'mobile' |
| 154 | + elif any(kw in name_lower for kw in ['base', 'home', 'qth', 'fixed']): |
| 155 | + return 'base_station' |
| 156 | + elif any(kw in name_lower for kw in ['weather', 'temp', 'sensor']): |
| 157 | + return 'weather' |
| 158 | + elif any(kw in name_lower for kw in ['bbs', 'station', 'repeater', 'rptr']): |
| 159 | + return 'bbs_server' |
| 160 | + |
| 161 | + return 'other' |
| 162 | +``` |
| 163 | + |
| 164 | +### 2. Icon Mapping |
| 165 | + |
| 166 | +```javascript |
| 167 | +const nodeIcons = { |
| 168 | + 'bbs_server': '📡', // Antenna/Tower |
| 169 | + 'weather': '🌡️', // Thermometer |
| 170 | + 'mobile': '🚗', // Car |
| 171 | + 'base_station': '🏠', // House |
| 172 | + 'solar': '☀️', // Sun |
| 173 | + 'tdeck': '⌨️', // Keyboard |
| 174 | + 'techo': '📱', // Phone |
| 175 | + 'other': '📡' // Generic radio |
| 176 | +}; |
| 177 | +``` |
| 178 | + |
| 179 | +### 3. Database Schema Considerations |
| 180 | + |
| 181 | +```sql |
| 182 | +-- Add node classification fields |
| 183 | +ALTER TABLE nodes ADD COLUMN category VARCHAR(20); |
| 184 | +ALTER TABLE nodes ADD COLUMN classification_confidence DECIMAL(3,2); |
| 185 | +ALTER TABLE nodes ADD COLUMN classification_method VARCHAR(20); |
| 186 | +``` |
| 187 | + |
| 188 | +### 4. Map Visualization Features |
| 189 | + |
| 190 | +- **Color coding** by category |
| 191 | +- **Icon overlays** based on node type |
| 192 | +- **Filtering** by category |
| 193 | +- **Statistics** showing category distribution |
| 194 | +- **Legend** explaining category meanings |
| 195 | + |
| 196 | +## Data Quality Notes |
| 197 | + |
| 198 | +### Strengths |
| 199 | +- **High confidence** in hardware-based classifications (T-Deck, T-Echo) |
| 200 | +- **Clear role indicators** for BBS servers |
| 201 | +- **Consistent naming patterns** for solar and mobile nodes |
| 202 | + |
| 203 | +### Limitations |
| 204 | +- **Keyword matching** may miss nodes with creative naming |
| 205 | +- **Role field** not always populated consistently |
| 206 | +- **Some nodes** may serve multiple purposes (e.g., solar base stations) |
| 207 | + |
| 208 | +### Recommendations for Improvement |
| 209 | +1. **Manual review** of "Other" category nodes |
| 210 | +2. **User feedback** mechanism for category corrections |
| 211 | +3. **Machine learning** approach for better classification |
| 212 | +4. **Additional data sources** (telemetry, usage patterns) |
| 213 | + |
| 214 | +## Network Health Insights |
| 215 | + |
| 216 | +- **Strong infrastructure**: 8 BBS servers provide backbone connectivity |
| 217 | +- **Solar adoption**: 9.4% of nodes are solar-powered (good for resilience) |
| 218 | +- **Modern hardware**: 2.3% T-Deck, 4.7% T-Echo adoption |
| 219 | +- **Mobile coverage**: 5.5% mobile nodes for portable communication |
| 220 | +- **Weather monitoring**: Limited environmental sensing (0.8%) |
| 221 | + |
| 222 | +## Conclusion |
| 223 | + |
| 224 | +This categorization provides a solid foundation for the Potato Mesh web platform's node classification system. The methodology is transparent, reproducible, and can be easily implemented in the web application. The 8-category system provides sufficient granularity for meaningful map visualization while remaining manageable for users. |
| 225 | + |
| 226 | +**Next Steps:** |
| 227 | +1. Implement classification algorithm in Potato Mesh web |
| 228 | +2. Create icon set and styling for each category |
| 229 | +3. Add filtering and statistics features |
| 230 | +4. Gather user feedback for classification accuracy |
| 231 | +5. Consider expanding categories based on usage patterns |
0 commit comments