dayintararas

Kode Modifikasi Hands On MongoDB

Oct 1st, 2025
84
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 7.17 KB | None | 0 0
  1. import pymongo
  2. import random
  3. import time
  4. from datetime import datetime, timedelta
  5. import json
  6.  
  7. # Connection ke MongoDB
  8. client = pymongo.MongoClient("mongodb://iot_user:iot_password@localhost:27017/iot_db")
  9. db = client.iot_db
  10.    
  11. def generate_temperature_data(device_id):
  12.     """Generate data sensor suhu dan kelembaban"""
  13.     return {
  14.         'device_id': device_id,
  15.         'timestamp': datetime.utcnow(),
  16.         'sensor_type': 'temperature_humidity',
  17.         'data': {
  18.             'temperature': round(random.uniform(20.0, 35.0), 2),
  19.             'humidity': round(random.uniform(40.0, 80.0), 2),
  20.             'heat_index': round(random.uniform(25.0, 40.0), 2)
  21.         },
  22.         'location': 'Living Room',
  23.         'battery_level': random.randint(60, 100),
  24.         'signal_strength': random.randint(-80, -30)
  25.     }
  26.  
  27. def generate_motion_data(device_id):
  28.     """Generate data sensor gerak"""
  29.     return {
  30.         'device_id': device_id,
  31.         'timestamp': datetime.utcnow(),
  32.         'sensor_type': 'motion',
  33.         'data': {
  34.             'motion_detected': random.choice([True, False]),
  35.             'motion_intensity': random.randint(1, 10) if random.choice([True, False]) else 0
  36.         },
  37.         'location': 'Bedroom',
  38.         'battery_level': random.randint(70, 100),
  39.         'signal_strength': random.randint(-75, -35)
  40.     }
  41.  
  42. def generate_light_data(device_id):
  43.     """Generate data sensor cahaya"""
  44.     return {
  45.         'device_id': device_id,
  46.         'timestamp': datetime.utcnow(),
  47.         'sensor_type': 'light',
  48.         'data': {
  49.             'light_intensity': random.randint(0, 1000),
  50.             'uv_index': round(random.uniform(0, 11), 1)
  51.         },
  52.         'location': 'Garden',
  53.         'battery_level': random.randint(50, 100),
  54.         'signal_strength': random.randint(-70, -40)
  55.     }
  56.  
  57. def generate_soil_moisture_data(device_id):
  58.     """Generate data sensor kelembaban tanah"""
  59.     return {
  60.         'device_id': device_id,
  61.         'timestamp': datetime.utcnow(),
  62.         'sensor_type': 'soil_moisture',
  63.         'data': {
  64.             'soil_moisture': round(random.uniform(0, 100), 2),
  65.             'soil_temperature': round(random.uniform(15.0, 30.0), 2),
  66.             'ph_level': round(random.uniform(5.5, 8.0), 2)
  67.         },
  68.         'location': 'Greenhouse',
  69.         'battery_level': random.randint(40, 100),
  70.         'signal_strength': random.randint(-85, -40)
  71.     }
  72.  
  73. def generate_air_quality_data(device_id):
  74.     """Generate data sensor kualitas udara"""
  75.     return {
  76.         'device_id': device_id,
  77.         'timestamp': datetime.utcnow(),
  78.         'sensor_type': 'air_quality',
  79.         'data': {
  80.             'pm2_5': round(random.uniform(0, 500), 2),
  81.             'pm10': round(random.uniform(0, 500), 2),
  82.             'co2_level': round(random.uniform(400, 5000), 2)
  83.         },
  84.         'location': 'Office',
  85.         'battery_level': random.randint(50, 100),
  86.         'signal_strength': random.randint(-80, -35)
  87.     }
  88.  
  89. def generate_alert(device_id, alert_type, message):
  90.     """Generate alert jika ada kondisi tertentu"""
  91.     return {
  92.         'device_id': device_id,
  93.         'timestamp': datetime.utcnow(),
  94.         'alert_type': alert_type,
  95.         'severity': random.choice(['low', 'medium', 'high']),
  96.         'message': message,
  97.         'acknowledged': False,
  98.         'created_at': datetime.utcnow()
  99.     }
  100.  
  101. def main():
  102.     print("Starting IoT Data Generator...")
  103.    
  104.     try:
  105.         while True:
  106.             # Generate data untuk setiap device
  107.             temp_data = generate_temperature_data('ESP32_001')
  108.             motion_data = generate_motion_data('ESP32_002')
  109.             light_data = generate_light_data('ESP32_003')
  110.             soil_data = generate_soil_moisture_data('ESP32_004')
  111.             air_quality_data = generate_air_quality_data('ESP32_005')
  112.            
  113.             # Insert data ke MongoDB
  114.             db.sensor_data.insert_one(temp_data)
  115.             db.sensor_data.insert_one(motion_data)
  116.             db.sensor_data.insert_one(light_data)
  117.             db.sensor_data.insert_one(soil_data)
  118.             db.sensor_data.insert_one(air_quality_data)
  119.            
  120.             # Generate alerts berdasarkan kondisi tertentu
  121.             if temp_data['data']['temperature'] > 30:
  122.                 alert = generate_alert(
  123.                     'ESP32_001',
  124.                     'high_temperature',
  125.                     f"High temperature detected: {temp_data['data']['temperature']}°C"
  126.                 )
  127.                 db.alerts.insert_one(alert)
  128.                
  129.             if motion_data['data']['motion_detected'] and motion_data['data']['motion_intensity'] > 7:
  130.                 alert = generate_alert(
  131.                     'ESP32_002',
  132.                     'motion_detected',
  133.                     f"High motion intensity detected: {motion_data['data']['motion_intensity']}"
  134.                 )
  135.                 db.alerts.insert_one(alert)
  136.                
  137.             if light_data['data']['light_intensity'] < 100:
  138.                 alert = generate_alert(
  139.                     'ESP32_003',
  140.                     'low_light',
  141.                     f"Low light detected: {light_data['data']['light_intensity']} lux"
  142.                 )
  143.                 db.alerts.insert_one(alert)
  144.  
  145.             if soil_data['data']['soil_moisture'] > 90:
  146.                 alert = generate_alert(
  147.                     'ESP32_004',
  148.                     'high_soil_moisture',
  149.                     f"High soil moisture detected: {soil_data['data']['soil_moisture']}%"
  150.                 )
  151.                 db.alerts.insert_one(alert)
  152.  
  153.             if soil_data['data']['ph_level'] < 6.0 or soil_data['data']['ph_level'] > 7.5:
  154.                 alert = generate_alert(
  155.                     'ESP32_004',
  156.                     'abnormal_soil_ph',
  157.                     f"Abnormal soil pH detected: {soil_data['data']['ph_level']}"
  158.                 )
  159.                 db.alerts.insert_one(alert)
  160.  
  161.             if air_quality_data['data']['co2_level'] > 1000:
  162.                 alert = generate_alert(
  163.                     'ESP32_005',
  164.                     'high_co2',
  165.                     f"High CO₂ level detected: {air_quality_data['data']['co2_level']} ppm"
  166.                 )
  167.                 db.alerts.insert_one(alert)
  168.  
  169.             if air_quality_data['data']['pm2_5'] > 150:
  170.                 alert = generate_alert(
  171.                     'ESP32_005',
  172.                     'high_pm2_5',
  173.                     f"High PM2.5 level detected: {air_quality_data['data']['pm2_5']} µg/m³"
  174.                 )
  175.                 db.alerts.insert_one(alert)
  176.  
  177.             if air_quality_data['data']['pm10'] > 200:
  178.                 alert = generate_alert(
  179.                     'ESP32_005',
  180.                     'high_pm10',
  181.                     f"High PM10 level detected: {air_quality_data['data']['pm10']} µg/m³"
  182.                 )
  183.                 db.alerts.insert_one(alert)
  184.                
  185.             print(f"Data inserted at {datetime.now().strftime('%Y-%m-%d %H:%M:%S')}")
  186.             time.sleep(2)  # Generate data setiap 2 detik
  187.            
  188.     except KeyboardInterrupt:
  189.         print("\nData generator stopped.")
  190.     finally:
  191.         client.close()
  192.  
  193. if __name__ == "__main__":
  194.     main()
Advertisement
Add Comment
Please, Sign In to add comment