The Context
Northeast India presents unique challenges for IoT deployments. The region's terrain—ranging from flood plains to hill stations—combined with inconsistent power supply and limited cellular coverage, makes traditional IoT approaches impractical.
When a government-funded smart agriculture initiative asked us to deploy soil and weather monitoring across 80,000 hectares, we knew we needed a different approach.
Why LoRaWAN?
After evaluating cellular IoT (NB-IoT, LTE-M), satellite, and mesh networking options, we chose LoRaWAN for several reasons:
- Range: 10-15km line-of-sight, critical for covering large agricultural areas
- Power efficiency: Sensors can run for 2+ years on battery power
- Cost: No per-message charges, unlike cellular options
- Terrain tolerance: Better penetration through vegetation and hills
Network Architecture
We designed a hub-and-spoke architecture:
[Field Sensors] → [Village Gateway] → [District Hub] → [Cloud Platform]
↓ ↓ ↓
LoRaWAN Cellular/WiFi Fiber/4G
(battery) (solar+battery) (grid power)
Field Sensors
Each sensor node monitors:
- Soil moisture (capacitive sensors at 3 depths)
- Soil temperature
- Ambient temperature and humidity
- Rainfall (tipping bucket)
Power budget was critical. We achieved 3-year battery life by:
- Transmitting only on change thresholds
- Using deep sleep between measurements
- Scheduling transmissions to avoid collisions
Village Gateways
The village-level gateways were the critical innovation. We partnered with local entrepreneurs to host and maintain them:
- Solar-powered with 3-day battery backup
- Dual uplink: cellular primary, WiFi backup
- Local data caching for connectivity gaps
- Remote firmware updates via LoRaWAN
Handling Connectivity Gaps
Intermittent connectivity was our biggest challenge. Here's how we addressed it:
Store and Forward
class GatewayBuffer:
def __init__(self, max_size_mb=100):
self.buffer = PersistentQueue(max_size_mb)
def receive_sensor_data(self, data):
self.buffer.enqueue(data)
self.try_upload()
def try_upload(self):
if not self.has_connectivity():
return
while not self.buffer.empty():
batch = self.buffer.peek_batch(100)
if self.upload(batch):
self.buffer.remove_batch(100)
else:
break
Intelligent Compression
Raw sensor data would overwhelm limited bandwidth. We implemented:
- Delta encoding (send changes, not absolute values)
- Temporal compression (aggregate stable readings)
- Priority queuing (alerts before routine data)
Deployment Challenges
Monsoon Season
The first monsoon tested everything. We learned:
- Waterproofing ratings don't account for sustained tropical rainfall
- Solar panels need steeper angles for self-cleaning
- Battery chemistry matters—lithium iron phosphate outperformed standard lithium-ion
Wildlife
Yes, wildlife. Elephants knocked over three gateway poles. Monkeys chewed through cables. We redesigned mounts and added protective conduit.
Community Engagement
The most valuable lesson: involve farmers from day one. When farmers understood the system's benefits, they became its best advocates and first line of support.
Results
After 18 months of operation:
- 99.2% uptime across the network
- 847 sensors deployed and operational
- 3.2M data points collected monthly
- 23% water savings through optimized irrigation scheduling
What We'd Do Differently
-
Start smaller. Our initial rollout was too ambitious. A phased approach would have caught issues earlier.
-
Invest more in training. Local technicians needed more hands-on time before independent operations.
-
Build redundancy earlier. Single points of failure caused preventable outages in the first few months.
IoT at scale in challenging environments is as much about logistics, relationships, and resilience as it is about technology.