iotkit-sim


Nameiotkit-sim JSON
Version 1.0.0 PyPI version JSON
download
home_pageNone
SummaryA comprehensive IoT simulation and communication library
upload_time2025-10-06 08:35:12
maintainerNone
docs_urlNone
authorSatria Divo
requires_python>=3.8
licenseNone
keywords iot mqtt sensors simulation communication data logging
VCS
bugtrack_url
requirements No requirements were recorded.
Travis-CI No Travis.
coveralls test coverage No coveralls.
            # IoTKit-Sim - IoT Simulation and Communication Library

[![Python Version](https://img.shields.io/badge/python-3.7+-blue.svg)](https://python.org)
[![PyPI](https://img.shields.io/badge/pypi-iotkit--sim-orange.svg)](https://pypi.org/project/iotkit-sim)
[![License](https://img.shields.io/badge/license-MIT-green.svg)](LICENSE)

IoTKit-Sim adalah library Python yang komprehensif untuk simulasi perangkat IoT dan komunikasi data. Library ini dirancang untuk memudahkan pembelajaran dan praktikum IoT dengan menyediakan sensor virtual, komunikasi MQTT, HTTP REST API, dan logging data.

## โœจ Fitur Utama

- **๐Ÿ”ฌ Sensor Virtual**: Simulasi berbagai jenis sensor dengan mode random atau manual
- **๐Ÿ“ก MQTT Communication**: Publisher dan subscriber untuk protokol MQTT
- **๐ŸŒ HTTP REST API**: Client untuk mengirim data melalui HTTP/HTTPS
- **โšก WebSocket Support**: Real-time bidirectional communication dengan WebSocket
- **๐Ÿ“Š Data Logging**: Penyimpanan data ke file CSV atau JSON
- **โš™๏ธ Utilities**: Fungsi utilitas untuk validasi, timestamp, dan konfigurasi
- **๐Ÿ”’ Authentication**: Dukungan Bearer Token untuk HTTP
- **๐Ÿ“ฆ Batch Operations**: Operasi batch untuk efisiensi
- **๐Ÿ›ก๏ธ Exception Handling**: Penanganan error yang robust

## ๐Ÿ“ฆ Instalasi

### Instalasi dari PyPI
```bash
pip install iotkit-sim
```

### Instalasi dari Source
```bash
# Download source code dan ekstrak ke folder
cd iotkit-sim
pip install -e .
```

### Dependencies
Library ini membutuhkan dependencies berikut:
```bash
pip install paho-mqtt requests PyYAML websockets
```

Atau install dengan extras:
```bash
pip install iotkit-sim[dev]  # Untuk development
```

## ๐Ÿš€ Quick Start

### Contoh Penggunaan Dasar

```python
from iotkit import Sensor, MQTTPublisher, HTTPPublisher, WebSocketPublisher, DataLogger
import time

# Buat sensor suhu
sensor = Sensor("suhu", min_val=20, max_val=30)

# Setup komunikasi
mqtt_pub = MQTTPublisher(broker="mqtt.eclipse.org", topic="sensor/suhu")
http_pub = HTTPPublisher(url="http://localhost:5000/api/sensor")
ws_pub = WebSocketPublisher("ws://localhost:8765")
logger = DataLogger("sensor_log.csv")

# Loop pengiriman data
while True:
    data = sensor.to_dict()
    
    # Kirim via MQTT
    mqtt_pub.connect()
    mqtt_pub.publish(data)
    
    # Kirim via HTTP
    http_pub.send(data)
    
    # Kirim via WebSocket
    ws_pub.start()
    ws_pub.send(data)
    
    # Log ke file
    logger.log(data)
    
    print("Terkirim:", data)
    time.sleep(2)
```

## ๐Ÿ“š Dokumentasi Lengkap

### Sensor Virtual

#### Membuat Sensor
```python
from iotkit import Sensor

# Sensor dengan nilai random
temp_sensor = Sensor("temperature", min_val=18, max_val=35, mode="random")

# Sensor dengan nilai manual
pressure_sensor = Sensor("pressure", min_val=0, max_val=100, mode="manual")
pressure_sensor.set_value(25.5)
```

#### Membaca Data Sensor
```python
# Baca nilai sensor
value = sensor.read()
print(f"Sensor value: {value}")

# Baca dalam format dictionary (dengan timestamp)
data = sensor.to_dict()
print(data)
# Output: {'name': 'temperature', 'value': 23.5, 'timestamp': '2023-...', ...}
```

#### Koleksi Multi-Sensor
```python
from iotkit import SensorCollection

collection = SensorCollection()
collection.add_sensor(Sensor("temp", 20, 30))
collection.add_sensor(Sensor("humidity", 40, 80))

# Baca semua sensor sekaligus
all_data = collection.read_all()
```

### MQTT Communication

#### MQTT Publisher
```python
from iotkit import MQTTPublisher

# Buat publisher
publisher = MQTTPublisher(
    broker="mqtt.eclipse.org",
    topic="iotkit/sensors",
    port=1883,
    username="user",  # optional
    password="pass"   # optional
)

# Connect dan publish
publisher.connect()
publisher.publish({"temp": 25.5, "timestamp": "2023-..."})
publisher.disconnect()
```

#### MQTT Subscriber
```python
from iotkit import MQTTSubscriber

def on_message_received(topic, data):
    print(f"Received from {topic}: {data}")

# Buat subscriber
subscriber = MQTTSubscriber(
    broker="mqtt.eclipse.org",
    topic="iotkit/sensors",
    on_message=on_message_received
)

# Connect dan listen
subscriber.connect()
subscriber.start_listening()  # Blocking
# atau
subscriber.start_listening_async()  # Non-blocking
```

### WebSocket Real-time Communication

#### WebSocket Publisher
```python
from iotkit import WebSocketPublisher

# Buat WebSocket publisher
ws_publisher = WebSocketPublisher("ws://your-websocket-server.com")

# Start publisher
ws_publisher.start()

# Kirim data
data = {"temperature": 25.5, "timestamp": "2025-01-01T10:00:00Z"}
success = ws_publisher.send(data)

# Stop publisher
ws_publisher.stop()
```

#### WebSocket Subscriber
```python
from iotkit import WebSocketSubscriber

def on_message_received(data):
    print(f"Received: {data}")

# Buat subscriber
ws_subscriber = WebSocketSubscriber(
    uri="ws://your-websocket-server.com",
    on_message=on_message_received
)

# Start listening
ws_subscriber.start()

# Stop subscriber
ws_subscriber.stop()
```

#### WebSocket Server
```python
from iotkit import WebSocketServer

def on_client_message(websocket, data, client_address):
    print(f"Message from {client_address}: {data}")

def on_client_connect(websocket, client_address):
    print(f"Client connected: {client_address}")

# Buat WebSocket server
ws_server = WebSocketServer(
    host="localhost",
    port=8765,
    on_message=on_client_message,
    on_connect=on_client_connect
)

# Start server
ws_server.start()

# Broadcast ke semua client
ws_server.broadcast({"message": "Hello all clients!"})

# Stop server
ws_server.stop()
```

#### WebSocket Bridge
```python
from iotkit import WebSocketBridge

# Buat bridge untuk menghubungkan multiple WebSocket
bridge = WebSocketBridge(server_port=8766)

# Start bridge
bridge.start()

# Tambah publisher eksternal
bridge.add_publisher("external_api", "ws://external-api.com/websocket")

# Tambah subscriber eksternal
bridge.add_subscriber("data_feed", "ws://data-feed.com/stream")

# Cek status bridge
status = bridge.get_status()
print(f"Bridge status: {status}")

# Stop bridge
bridge.stop()
```

#### Streaming Sensor Data via WebSocket
```python
from iotkit import Sensor, WebSocketServer
import threading
import time

# Setup sensors
sensor = Sensor("temperature", 20, 30)

# Setup WebSocket server
ws_server = WebSocketServer("localhost", 8767)
ws_server.start()

def stream_data():
    while True:
        data = sensor.to_dict()
        ws_server.broadcast(data)
        time.sleep(2)

# Start streaming in background
stream_thread = threading.Thread(target=stream_data, daemon=True)
stream_thread.start()
```

### HTTP REST API

#### HTTP Publisher
```python
from iotkit import HTTPPublisher

# Basic HTTP client
http_client = HTTPPublisher(url="https://api.example.com/sensors")

# Dengan authentication
auth_client = HTTPPublisher(
    url="https://api.example.com/sensors",
    auth_token="your-bearer-token"
)

# Kirim data
response = http_client.send({"temp": 25.5})
print(response)
```

#### Batch Sending
```python
# Kirim multiple data sekaligus
batch_data = [
    {"temp": 25.5},
    {"temp": 26.1},
    {"temp": 24.8}
]

results = http_client.send_batch(batch_data)
```

### Data Logging

#### CSV Logger
```python
from iotkit import DataLogger

# Logger CSV
csv_logger = DataLogger("data.csv", format_type="csv")
csv_logger.log({"sensor": "temp", "value": 25.5})
```

#### JSON Logger
```python
# Logger JSON
json_logger = DataLogger("data.json", format_type="json")
json_logger.log({"sensor": "temp", "value": 25.5})
```

#### Batch Logging
```python
# Log multiple data
batch_data = [sensor.to_dict() for _ in range(10)]
success_count = logger.log_batch(batch_data)
```

#### Membaca Data Log
```python
# Baca semua data
all_data = logger.read_data()

# Baca data terbatas
recent_data = logger.read_data(limit=100)

# Statistik file
stats = logger.get_stats()
print(f"Records: {stats['record_count']}, Size: {stats['size_bytes']} bytes")
```

### Multi-Logger
```python
from iotkit import MultiLogger, DataLogger

multi = MultiLogger()
multi.add_logger("csv", DataLogger("data.csv", "csv"))
multi.add_logger("json", DataLogger("data.json", "json"))

# Log ke semua logger sekaligus
results = multi.log({"temp": 25.5})
```

## ๐Ÿ› ๏ธ Utilities

### Validasi Data
```python
from iotkit import validate_data, validate_url, validate_mqtt_topic

# Validasi data sensor
valid_data = validate_data({"name": "temp", "value": 25.5})

# Validasi URL
is_valid = validate_url("https://api.example.com")

# Validasi MQTT topic
is_valid = validate_mqtt_topic("sensors/temperature")
```

### Timestamp dan ID
```python
from iotkit import generate_timestamp, generate_device_id

# Generate timestamp
timestamp = generate_timestamp()  # ISO format
timestamp_unix = generate_timestamp("unix")

# Generate device ID
device_id = generate_device_id("sensor")  # sensor_abc123def
```

### Configuration
```python
from iotkit import config

# Get configuration
mqtt_port = config.get('mqtt.default_port')  # 1883

# Set configuration
config.set('mqtt.default_port', 1884)

# Load dari file
config.load_from_file('config.json')
```

### Buffer untuk Batch Operations
```python
from iotkit import DataBuffer

buffer = DataBuffer(max_size=10)
buffer.add({"temp": 25.5})

if buffer.is_full():
    data = buffer.get_all()  # Get and clear
    # Process batch data
```

## ๐Ÿ”ง Konfigurasi Lanjutan

### Logging Configuration
```python
from iotkit import setup_logging
import logging

# Setup logging level
logger = setup_logging(level="DEBUG")

# Custom format
logger = setup_logging(
    level="INFO",
    format_string="%(asctime)s [%(levelname)s] %(name)s: %(message)s"
)
```

### Custom Headers HTTP
```python
http_client = HTTPPublisher(
    url="https://api.example.com",
    headers={
        "X-API-Key": "your-api-key",
        "X-Custom-Header": "value"
    }
)

# Update headers
http_client.add_header("Authorization", "Bearer new-token")
http_client.remove_header("X-Custom-Header")
```

### Configuration Management
IoTKit mendukung konfigurasi melalui file YAML atau JSON untuk memudahkan pengelolaan pengaturan aplikasi.

#### Menggunakan Configuration Manager
```python
from iotkit import ConfigManager

# Load konfigurasi dari file
config = ConfigManager("config.yaml")  # atau config.json

# Akses konfigurasi menggunakan dot notation
mqtt_broker = config.get("mqtt.broker")
http_timeout = config.get("http.timeout", 30)  # dengan default value

# Update konfigurasi
config.set("mqtt.port", 1884)
config.set("sensors.default_mode", "manual")

# Simpan perubahan
config.save_config()
```

#### Contoh File Konfigurasi (YAML)
```yaml
# config.yaml
mqtt:
  broker: "mqtt.eclipseprojects.io"
  port: 1883
  topic_prefix: "iotkit"
  
http:
  base_url: "http://localhost:5000/api"
  timeout: 30
  
sensors:
  default_mode: "random"
  reading_interval: 2.0
  temperature:
    min_val: 20.0
    max_val: 30.0
    unit: "ยฐC"
    
logging:
  log_level: "INFO"
  file_format: "csv"
  auto_timestamp: true
```

#### Contoh File Konfigurasi (JSON)
```json
{
  "mqtt": {
    "broker": "mqtt.eclipseprojects.io",
    "port": 1883,
    "topic_prefix": "iotkit"
  },
  "http": {
    "base_url": "http://localhost:5000/api",
    "timeout": 30
  },
  "sensors": {
    "default_mode": "random",
    "reading_interval": 2.0,
    "temperature": {
      "min_val": 20.0,
      "max_val": 30.0,
      "unit": "ยฐC"
    }
  }
}
```

#### Menggunakan Konfigurasi dengan Komponen IoTKit
```python
from iotkit import ConfigManager, Sensor, MQTTPublisher, HTTPPublisher

# Load konfigurasi
config = ConfigManager("config.yaml")

# Buat komponen menggunakan konfigurasi
mqtt_config = config.get_mqtt_config()
mqtt_pub = MQTTPublisher(
    broker=mqtt_config["broker"],
    topic=f"{mqtt_config['topic_prefix']}/sensors",
    port=mqtt_config["port"]
)

http_config = config.get_http_config()
http_pub = HTTPPublisher(
    url=f"{http_config['base_url']}/sensors",
    timeout=http_config["timeout"]
)

# Sensor dengan konfigurasi
sensor_config = config.get("sensors.temperature")
temp_sensor = Sensor(
    "temperature",
    min_val=sensor_config["min_val"],
    max_val=sensor_config["max_val"]
)
```

#### Validasi Konfigurasi
```python
# Validasi konfigurasi sebelum digunakan
try:
    config.validate_config()
    print("Konfigurasi valid!")
except ValueError as e:
    print(f"Konfigurasi tidak valid: {e}")

# Reset ke default jika perlu
config.reset_to_defaults()
```

## ๐Ÿ“Š Contoh Aplikasi Lengkap

### Monitoring Sistem Greenhouse
```python
from iotkit import *
import time
import threading

# Setup sensors
sensors = SensorCollection()
sensors.add_sensor(Sensor("temperature", 18, 35))
sensors.add_sensor(Sensor("humidity", 40, 90))
sensors.add_sensor(Sensor("soil_moisture", 20, 80))

# Setup komunikasi
mqtt_pub = MQTTPublisher("mqtt.eclipse.org", "greenhouse/sensors")
http_pub = HTTPPublisher("https://api.greenhouse.com/data", 
                        auth_token="your-token")
ws_pub = WebSocketPublisher("ws://greenhouse-monitor.com/stream")

# Setup logging
csv_logger = DataLogger("greenhouse_data.csv")
json_logger = DataLogger("greenhouse_backup.json", "json")
multi_logger = MultiLogger()
multi_logger.add_logger("csv", csv_logger)
multi_logger.add_logger("json", json_logger)

def collect_and_send():
    while True:
        # Baca semua sensor
        all_data = sensors.read_all()
        
        for sensor_name, data in all_data.items():
            try:
                # Kirim via MQTT
                mqtt_pub.publish(data, topic=f"greenhouse/{sensor_name}")
                
                # Kirim via HTTP
                http_pub.send(data, endpoint=f"sensors/{sensor_name}")
                
                # Kirim via WebSocket
                ws_pub.send(data)
                
                # Log data
                multi_logger.log(data)
                
                print(f"โœ“ {sensor_name}: {data['value']}")
                
            except Exception as e:
                print(f"โœ— Error sending {sensor_name}: {e}")
        
        time.sleep(30)  # Kirim setiap 30 detik

# Jalankan dalam thread
mqtt_pub.connect()
ws_pub.start()
thread = threading.Thread(target=collect_and_send, daemon=True)
thread.start()

# Keep main thread alive
try:
    while True:
        time.sleep(1)
except KeyboardInterrupt:
    print("Stopping greenhouse monitoring...")
    mqtt_pub.disconnect()
    ws_pub.stop()
```

## โš ๏ธ Exception Handling

Library ini memiliki exception handling yang robust:

```python
from iotkit import *

try:
    sensor = Sensor("test", 0, 100, mode="manual")
    sensor.read()  # Will raise ValueError (no manual value set)
except ValueError as e:
    print(f"Sensor error: {e}")

try:
    mqtt_pub = MQTTPublisher("invalid-broker", "test")
    mqtt_pub.connect()
except ConnectionError as e:
    print(f"MQTT connection failed: {e}")

try:
    http_pub = HTTPPublisher("invalid-url")
    http_pub.send({"test": "data"})
except ConnectionError as e:
    print(f"HTTP request failed: {e}")
```

## ๐Ÿงช Testing

Jalankan contoh penggunaan:
```bash
python example.py
```

## ๐Ÿ“ Struktur Project

```
iotkit/
โ”œโ”€โ”€ __init__.py          # Main imports dan setup
โ”œโ”€โ”€ sensor.py            # Virtual sensors
โ”œโ”€โ”€ mqtt.py              # MQTT communication
โ”œโ”€โ”€ http.py              # HTTP REST client
โ”œโ”€โ”€ logger.py            # Data logging
โ””โ”€โ”€ utils.py             # Utilities dan helpers

example.py               # Contoh penggunaan
README.md               # Dokumentasi ini
setup.py                # Setup untuk PyPI
requirements.txt        # Dependencies
```

## ๐Ÿค Contributing

1. Fork repository
2. Buat feature branch (`git checkout -b feature/amazing-feature`)
3. Commit changes (`git commit -m 'Add amazing feature'`)
4. Push to branch (`git push origin feature/amazing-feature`)
5. Open Pull Request

## ๏ฟฝโ€๐Ÿ’ป Author

**Satria Divo**
- Email: satriadivop354@gmail.com

## ๏ฟฝ๐Ÿ“„ License

Distributed under the MIT License. See `LICENSE` for more information.

## ๐Ÿ™‹โ€โ™‚๏ธ Support

Jika ada pertanyaan atau masalah:

- Email: satriadivop354@gmail.com

## ๐Ÿš€ Roadmap

- [x] WebSocket support
- [ ] LoRaWAN integration
- [ ] Real-time dashboard
- [ ] Machine learning integration
- [ ] Cloud platform connectors (AWS IoT, Azure IoT, etc.)
- [ ] Protocol simulation (CoAP, LwM2M)
- [ ] Device management features

---

โญ Jika project ini membantu, jangan lupa untuk share ke teman-teman!

            

Raw data

            {
    "_id": null,
    "home_page": null,
    "name": "iotkit-sim",
    "maintainer": null,
    "docs_url": null,
    "requires_python": ">=3.8",
    "maintainer_email": null,
    "keywords": "iot, mqtt, sensors, simulation, communication, data logging",
    "author": "Satria Divo",
    "author_email": "satriadivop354@gmail.com",
    "download_url": "https://files.pythonhosted.org/packages/af/1c/282a3690d0ce612c33f38ea3ba7e03e0f1e305a5b6e5e0e657cfba0f8313/iotkit_sim-1.0.0.tar.gz",
    "platform": null,
    "description": "# IoTKit-Sim - IoT Simulation and Communication Library\n\n[![Python Version](https://img.shields.io/badge/python-3.7+-blue.svg)](https://python.org)\n[![PyPI](https://img.shields.io/badge/pypi-iotkit--sim-orange.svg)](https://pypi.org/project/iotkit-sim)\n[![License](https://img.shields.io/badge/license-MIT-green.svg)](LICENSE)\n\nIoTKit-Sim adalah library Python yang komprehensif untuk simulasi perangkat IoT dan komunikasi data. Library ini dirancang untuk memudahkan pembelajaran dan praktikum IoT dengan menyediakan sensor virtual, komunikasi MQTT, HTTP REST API, dan logging data.\n\n## \u2728 Fitur Utama\n\n- **\ud83d\udd2c Sensor Virtual**: Simulasi berbagai jenis sensor dengan mode random atau manual\n- **\ud83d\udce1 MQTT Communication**: Publisher dan subscriber untuk protokol MQTT\n- **\ud83c\udf10 HTTP REST API**: Client untuk mengirim data melalui HTTP/HTTPS\n- **\u26a1 WebSocket Support**: Real-time bidirectional communication dengan WebSocket\n- **\ud83d\udcca Data Logging**: Penyimpanan data ke file CSV atau JSON\n- **\u2699\ufe0f Utilities**: Fungsi utilitas untuk validasi, timestamp, dan konfigurasi\n- **\ud83d\udd12 Authentication**: Dukungan Bearer Token untuk HTTP\n- **\ud83d\udce6 Batch Operations**: Operasi batch untuk efisiensi\n- **\ud83d\udee1\ufe0f Exception Handling**: Penanganan error yang robust\n\n## \ud83d\udce6 Instalasi\n\n### Instalasi dari PyPI\n```bash\npip install iotkit-sim\n```\n\n### Instalasi dari Source\n```bash\n# Download source code dan ekstrak ke folder\ncd iotkit-sim\npip install -e .\n```\n\n### Dependencies\nLibrary ini membutuhkan dependencies berikut:\n```bash\npip install paho-mqtt requests PyYAML websockets\n```\n\nAtau install dengan extras:\n```bash\npip install iotkit-sim[dev]  # Untuk development\n```\n\n## \ud83d\ude80 Quick Start\n\n### Contoh Penggunaan Dasar\n\n```python\nfrom iotkit import Sensor, MQTTPublisher, HTTPPublisher, WebSocketPublisher, DataLogger\nimport time\n\n# Buat sensor suhu\nsensor = Sensor(\"suhu\", min_val=20, max_val=30)\n\n# Setup komunikasi\nmqtt_pub = MQTTPublisher(broker=\"mqtt.eclipse.org\", topic=\"sensor/suhu\")\nhttp_pub = HTTPPublisher(url=\"http://localhost:5000/api/sensor\")\nws_pub = WebSocketPublisher(\"ws://localhost:8765\")\nlogger = DataLogger(\"sensor_log.csv\")\n\n# Loop pengiriman data\nwhile True:\n    data = sensor.to_dict()\n    \n    # Kirim via MQTT\n    mqtt_pub.connect()\n    mqtt_pub.publish(data)\n    \n    # Kirim via HTTP\n    http_pub.send(data)\n    \n    # Kirim via WebSocket\n    ws_pub.start()\n    ws_pub.send(data)\n    \n    # Log ke file\n    logger.log(data)\n    \n    print(\"Terkirim:\", data)\n    time.sleep(2)\n```\n\n## \ud83d\udcda Dokumentasi Lengkap\n\n### Sensor Virtual\n\n#### Membuat Sensor\n```python\nfrom iotkit import Sensor\n\n# Sensor dengan nilai random\ntemp_sensor = Sensor(\"temperature\", min_val=18, max_val=35, mode=\"random\")\n\n# Sensor dengan nilai manual\npressure_sensor = Sensor(\"pressure\", min_val=0, max_val=100, mode=\"manual\")\npressure_sensor.set_value(25.5)\n```\n\n#### Membaca Data Sensor\n```python\n# Baca nilai sensor\nvalue = sensor.read()\nprint(f\"Sensor value: {value}\")\n\n# Baca dalam format dictionary (dengan timestamp)\ndata = sensor.to_dict()\nprint(data)\n# Output: {'name': 'temperature', 'value': 23.5, 'timestamp': '2023-...', ...}\n```\n\n#### Koleksi Multi-Sensor\n```python\nfrom iotkit import SensorCollection\n\ncollection = SensorCollection()\ncollection.add_sensor(Sensor(\"temp\", 20, 30))\ncollection.add_sensor(Sensor(\"humidity\", 40, 80))\n\n# Baca semua sensor sekaligus\nall_data = collection.read_all()\n```\n\n### MQTT Communication\n\n#### MQTT Publisher\n```python\nfrom iotkit import MQTTPublisher\n\n# Buat publisher\npublisher = MQTTPublisher(\n    broker=\"mqtt.eclipse.org\",\n    topic=\"iotkit/sensors\",\n    port=1883,\n    username=\"user\",  # optional\n    password=\"pass\"   # optional\n)\n\n# Connect dan publish\npublisher.connect()\npublisher.publish({\"temp\": 25.5, \"timestamp\": \"2023-...\"})\npublisher.disconnect()\n```\n\n#### MQTT Subscriber\n```python\nfrom iotkit import MQTTSubscriber\n\ndef on_message_received(topic, data):\n    print(f\"Received from {topic}: {data}\")\n\n# Buat subscriber\nsubscriber = MQTTSubscriber(\n    broker=\"mqtt.eclipse.org\",\n    topic=\"iotkit/sensors\",\n    on_message=on_message_received\n)\n\n# Connect dan listen\nsubscriber.connect()\nsubscriber.start_listening()  # Blocking\n# atau\nsubscriber.start_listening_async()  # Non-blocking\n```\n\n### WebSocket Real-time Communication\n\n#### WebSocket Publisher\n```python\nfrom iotkit import WebSocketPublisher\n\n# Buat WebSocket publisher\nws_publisher = WebSocketPublisher(\"ws://your-websocket-server.com\")\n\n# Start publisher\nws_publisher.start()\n\n# Kirim data\ndata = {\"temperature\": 25.5, \"timestamp\": \"2025-01-01T10:00:00Z\"}\nsuccess = ws_publisher.send(data)\n\n# Stop publisher\nws_publisher.stop()\n```\n\n#### WebSocket Subscriber\n```python\nfrom iotkit import WebSocketSubscriber\n\ndef on_message_received(data):\n    print(f\"Received: {data}\")\n\n# Buat subscriber\nws_subscriber = WebSocketSubscriber(\n    uri=\"ws://your-websocket-server.com\",\n    on_message=on_message_received\n)\n\n# Start listening\nws_subscriber.start()\n\n# Stop subscriber\nws_subscriber.stop()\n```\n\n#### WebSocket Server\n```python\nfrom iotkit import WebSocketServer\n\ndef on_client_message(websocket, data, client_address):\n    print(f\"Message from {client_address}: {data}\")\n\ndef on_client_connect(websocket, client_address):\n    print(f\"Client connected: {client_address}\")\n\n# Buat WebSocket server\nws_server = WebSocketServer(\n    host=\"localhost\",\n    port=8765,\n    on_message=on_client_message,\n    on_connect=on_client_connect\n)\n\n# Start server\nws_server.start()\n\n# Broadcast ke semua client\nws_server.broadcast({\"message\": \"Hello all clients!\"})\n\n# Stop server\nws_server.stop()\n```\n\n#### WebSocket Bridge\n```python\nfrom iotkit import WebSocketBridge\n\n# Buat bridge untuk menghubungkan multiple WebSocket\nbridge = WebSocketBridge(server_port=8766)\n\n# Start bridge\nbridge.start()\n\n# Tambah publisher eksternal\nbridge.add_publisher(\"external_api\", \"ws://external-api.com/websocket\")\n\n# Tambah subscriber eksternal\nbridge.add_subscriber(\"data_feed\", \"ws://data-feed.com/stream\")\n\n# Cek status bridge\nstatus = bridge.get_status()\nprint(f\"Bridge status: {status}\")\n\n# Stop bridge\nbridge.stop()\n```\n\n#### Streaming Sensor Data via WebSocket\n```python\nfrom iotkit import Sensor, WebSocketServer\nimport threading\nimport time\n\n# Setup sensors\nsensor = Sensor(\"temperature\", 20, 30)\n\n# Setup WebSocket server\nws_server = WebSocketServer(\"localhost\", 8767)\nws_server.start()\n\ndef stream_data():\n    while True:\n        data = sensor.to_dict()\n        ws_server.broadcast(data)\n        time.sleep(2)\n\n# Start streaming in background\nstream_thread = threading.Thread(target=stream_data, daemon=True)\nstream_thread.start()\n```\n\n### HTTP REST API\n\n#### HTTP Publisher\n```python\nfrom iotkit import HTTPPublisher\n\n# Basic HTTP client\nhttp_client = HTTPPublisher(url=\"https://api.example.com/sensors\")\n\n# Dengan authentication\nauth_client = HTTPPublisher(\n    url=\"https://api.example.com/sensors\",\n    auth_token=\"your-bearer-token\"\n)\n\n# Kirim data\nresponse = http_client.send({\"temp\": 25.5})\nprint(response)\n```\n\n#### Batch Sending\n```python\n# Kirim multiple data sekaligus\nbatch_data = [\n    {\"temp\": 25.5},\n    {\"temp\": 26.1},\n    {\"temp\": 24.8}\n]\n\nresults = http_client.send_batch(batch_data)\n```\n\n### Data Logging\n\n#### CSV Logger\n```python\nfrom iotkit import DataLogger\n\n# Logger CSV\ncsv_logger = DataLogger(\"data.csv\", format_type=\"csv\")\ncsv_logger.log({\"sensor\": \"temp\", \"value\": 25.5})\n```\n\n#### JSON Logger\n```python\n# Logger JSON\njson_logger = DataLogger(\"data.json\", format_type=\"json\")\njson_logger.log({\"sensor\": \"temp\", \"value\": 25.5})\n```\n\n#### Batch Logging\n```python\n# Log multiple data\nbatch_data = [sensor.to_dict() for _ in range(10)]\nsuccess_count = logger.log_batch(batch_data)\n```\n\n#### Membaca Data Log\n```python\n# Baca semua data\nall_data = logger.read_data()\n\n# Baca data terbatas\nrecent_data = logger.read_data(limit=100)\n\n# Statistik file\nstats = logger.get_stats()\nprint(f\"Records: {stats['record_count']}, Size: {stats['size_bytes']} bytes\")\n```\n\n### Multi-Logger\n```python\nfrom iotkit import MultiLogger, DataLogger\n\nmulti = MultiLogger()\nmulti.add_logger(\"csv\", DataLogger(\"data.csv\", \"csv\"))\nmulti.add_logger(\"json\", DataLogger(\"data.json\", \"json\"))\n\n# Log ke semua logger sekaligus\nresults = multi.log({\"temp\": 25.5})\n```\n\n## \ud83d\udee0\ufe0f Utilities\n\n### Validasi Data\n```python\nfrom iotkit import validate_data, validate_url, validate_mqtt_topic\n\n# Validasi data sensor\nvalid_data = validate_data({\"name\": \"temp\", \"value\": 25.5})\n\n# Validasi URL\nis_valid = validate_url(\"https://api.example.com\")\n\n# Validasi MQTT topic\nis_valid = validate_mqtt_topic(\"sensors/temperature\")\n```\n\n### Timestamp dan ID\n```python\nfrom iotkit import generate_timestamp, generate_device_id\n\n# Generate timestamp\ntimestamp = generate_timestamp()  # ISO format\ntimestamp_unix = generate_timestamp(\"unix\")\n\n# Generate device ID\ndevice_id = generate_device_id(\"sensor\")  # sensor_abc123def\n```\n\n### Configuration\n```python\nfrom iotkit import config\n\n# Get configuration\nmqtt_port = config.get('mqtt.default_port')  # 1883\n\n# Set configuration\nconfig.set('mqtt.default_port', 1884)\n\n# Load dari file\nconfig.load_from_file('config.json')\n```\n\n### Buffer untuk Batch Operations\n```python\nfrom iotkit import DataBuffer\n\nbuffer = DataBuffer(max_size=10)\nbuffer.add({\"temp\": 25.5})\n\nif buffer.is_full():\n    data = buffer.get_all()  # Get and clear\n    # Process batch data\n```\n\n## \ud83d\udd27 Konfigurasi Lanjutan\n\n### Logging Configuration\n```python\nfrom iotkit import setup_logging\nimport logging\n\n# Setup logging level\nlogger = setup_logging(level=\"DEBUG\")\n\n# Custom format\nlogger = setup_logging(\n    level=\"INFO\",\n    format_string=\"%(asctime)s [%(levelname)s] %(name)s: %(message)s\"\n)\n```\n\n### Custom Headers HTTP\n```python\nhttp_client = HTTPPublisher(\n    url=\"https://api.example.com\",\n    headers={\n        \"X-API-Key\": \"your-api-key\",\n        \"X-Custom-Header\": \"value\"\n    }\n)\n\n# Update headers\nhttp_client.add_header(\"Authorization\", \"Bearer new-token\")\nhttp_client.remove_header(\"X-Custom-Header\")\n```\n\n### Configuration Management\nIoTKit mendukung konfigurasi melalui file YAML atau JSON untuk memudahkan pengelolaan pengaturan aplikasi.\n\n#### Menggunakan Configuration Manager\n```python\nfrom iotkit import ConfigManager\n\n# Load konfigurasi dari file\nconfig = ConfigManager(\"config.yaml\")  # atau config.json\n\n# Akses konfigurasi menggunakan dot notation\nmqtt_broker = config.get(\"mqtt.broker\")\nhttp_timeout = config.get(\"http.timeout\", 30)  # dengan default value\n\n# Update konfigurasi\nconfig.set(\"mqtt.port\", 1884)\nconfig.set(\"sensors.default_mode\", \"manual\")\n\n# Simpan perubahan\nconfig.save_config()\n```\n\n#### Contoh File Konfigurasi (YAML)\n```yaml\n# config.yaml\nmqtt:\n  broker: \"mqtt.eclipseprojects.io\"\n  port: 1883\n  topic_prefix: \"iotkit\"\n  \nhttp:\n  base_url: \"http://localhost:5000/api\"\n  timeout: 30\n  \nsensors:\n  default_mode: \"random\"\n  reading_interval: 2.0\n  temperature:\n    min_val: 20.0\n    max_val: 30.0\n    unit: \"\u00b0C\"\n    \nlogging:\n  log_level: \"INFO\"\n  file_format: \"csv\"\n  auto_timestamp: true\n```\n\n#### Contoh File Konfigurasi (JSON)\n```json\n{\n  \"mqtt\": {\n    \"broker\": \"mqtt.eclipseprojects.io\",\n    \"port\": 1883,\n    \"topic_prefix\": \"iotkit\"\n  },\n  \"http\": {\n    \"base_url\": \"http://localhost:5000/api\",\n    \"timeout\": 30\n  },\n  \"sensors\": {\n    \"default_mode\": \"random\",\n    \"reading_interval\": 2.0,\n    \"temperature\": {\n      \"min_val\": 20.0,\n      \"max_val\": 30.0,\n      \"unit\": \"\u00b0C\"\n    }\n  }\n}\n```\n\n#### Menggunakan Konfigurasi dengan Komponen IoTKit\n```python\nfrom iotkit import ConfigManager, Sensor, MQTTPublisher, HTTPPublisher\n\n# Load konfigurasi\nconfig = ConfigManager(\"config.yaml\")\n\n# Buat komponen menggunakan konfigurasi\nmqtt_config = config.get_mqtt_config()\nmqtt_pub = MQTTPublisher(\n    broker=mqtt_config[\"broker\"],\n    topic=f\"{mqtt_config['topic_prefix']}/sensors\",\n    port=mqtt_config[\"port\"]\n)\n\nhttp_config = config.get_http_config()\nhttp_pub = HTTPPublisher(\n    url=f\"{http_config['base_url']}/sensors\",\n    timeout=http_config[\"timeout\"]\n)\n\n# Sensor dengan konfigurasi\nsensor_config = config.get(\"sensors.temperature\")\ntemp_sensor = Sensor(\n    \"temperature\",\n    min_val=sensor_config[\"min_val\"],\n    max_val=sensor_config[\"max_val\"]\n)\n```\n\n#### Validasi Konfigurasi\n```python\n# Validasi konfigurasi sebelum digunakan\ntry:\n    config.validate_config()\n    print(\"Konfigurasi valid!\")\nexcept ValueError as e:\n    print(f\"Konfigurasi tidak valid: {e}\")\n\n# Reset ke default jika perlu\nconfig.reset_to_defaults()\n```\n\n## \ud83d\udcca Contoh Aplikasi Lengkap\n\n### Monitoring Sistem Greenhouse\n```python\nfrom iotkit import *\nimport time\nimport threading\n\n# Setup sensors\nsensors = SensorCollection()\nsensors.add_sensor(Sensor(\"temperature\", 18, 35))\nsensors.add_sensor(Sensor(\"humidity\", 40, 90))\nsensors.add_sensor(Sensor(\"soil_moisture\", 20, 80))\n\n# Setup komunikasi\nmqtt_pub = MQTTPublisher(\"mqtt.eclipse.org\", \"greenhouse/sensors\")\nhttp_pub = HTTPPublisher(\"https://api.greenhouse.com/data\", \n                        auth_token=\"your-token\")\nws_pub = WebSocketPublisher(\"ws://greenhouse-monitor.com/stream\")\n\n# Setup logging\ncsv_logger = DataLogger(\"greenhouse_data.csv\")\njson_logger = DataLogger(\"greenhouse_backup.json\", \"json\")\nmulti_logger = MultiLogger()\nmulti_logger.add_logger(\"csv\", csv_logger)\nmulti_logger.add_logger(\"json\", json_logger)\n\ndef collect_and_send():\n    while True:\n        # Baca semua sensor\n        all_data = sensors.read_all()\n        \n        for sensor_name, data in all_data.items():\n            try:\n                # Kirim via MQTT\n                mqtt_pub.publish(data, topic=f\"greenhouse/{sensor_name}\")\n                \n                # Kirim via HTTP\n                http_pub.send(data, endpoint=f\"sensors/{sensor_name}\")\n                \n                # Kirim via WebSocket\n                ws_pub.send(data)\n                \n                # Log data\n                multi_logger.log(data)\n                \n                print(f\"\u2713 {sensor_name}: {data['value']}\")\n                \n            except Exception as e:\n                print(f\"\u2717 Error sending {sensor_name}: {e}\")\n        \n        time.sleep(30)  # Kirim setiap 30 detik\n\n# Jalankan dalam thread\nmqtt_pub.connect()\nws_pub.start()\nthread = threading.Thread(target=collect_and_send, daemon=True)\nthread.start()\n\n# Keep main thread alive\ntry:\n    while True:\n        time.sleep(1)\nexcept KeyboardInterrupt:\n    print(\"Stopping greenhouse monitoring...\")\n    mqtt_pub.disconnect()\n    ws_pub.stop()\n```\n\n## \u26a0\ufe0f Exception Handling\n\nLibrary ini memiliki exception handling yang robust:\n\n```python\nfrom iotkit import *\n\ntry:\n    sensor = Sensor(\"test\", 0, 100, mode=\"manual\")\n    sensor.read()  # Will raise ValueError (no manual value set)\nexcept ValueError as e:\n    print(f\"Sensor error: {e}\")\n\ntry:\n    mqtt_pub = MQTTPublisher(\"invalid-broker\", \"test\")\n    mqtt_pub.connect()\nexcept ConnectionError as e:\n    print(f\"MQTT connection failed: {e}\")\n\ntry:\n    http_pub = HTTPPublisher(\"invalid-url\")\n    http_pub.send({\"test\": \"data\"})\nexcept ConnectionError as e:\n    print(f\"HTTP request failed: {e}\")\n```\n\n## \ud83e\uddea Testing\n\nJalankan contoh penggunaan:\n```bash\npython example.py\n```\n\n## \ud83d\udcc1 Struktur Project\n\n```\niotkit/\n\u251c\u2500\u2500 __init__.py          # Main imports dan setup\n\u251c\u2500\u2500 sensor.py            # Virtual sensors\n\u251c\u2500\u2500 mqtt.py              # MQTT communication\n\u251c\u2500\u2500 http.py              # HTTP REST client\n\u251c\u2500\u2500 logger.py            # Data logging\n\u2514\u2500\u2500 utils.py             # Utilities dan helpers\n\nexample.py               # Contoh penggunaan\nREADME.md               # Dokumentasi ini\nsetup.py                # Setup untuk PyPI\nrequirements.txt        # Dependencies\n```\n\n## \ud83e\udd1d Contributing\n\n1. Fork repository\n2. Buat feature branch (`git checkout -b feature/amazing-feature`)\n3. Commit changes (`git commit -m 'Add amazing feature'`)\n4. Push to branch (`git push origin feature/amazing-feature`)\n5. Open Pull Request\n\n## \ufffd\u200d\ud83d\udcbb Author\n\n**Satria Divo**\n- Email: satriadivop354@gmail.com\n\n## \ufffd\ud83d\udcc4 License\n\nDistributed under the MIT License. See `LICENSE` for more information.\n\n## \ud83d\ude4b\u200d\u2642\ufe0f Support\n\nJika ada pertanyaan atau masalah:\n\n- Email: satriadivop354@gmail.com\n\n## \ud83d\ude80 Roadmap\n\n- [x] WebSocket support\n- [ ] LoRaWAN integration\n- [ ] Real-time dashboard\n- [ ] Machine learning integration\n- [ ] Cloud platform connectors (AWS IoT, Azure IoT, etc.)\n- [ ] Protocol simulation (CoAP, LwM2M)\n- [ ] Device management features\n\n---\n\n\u2b50 Jika project ini membantu, jangan lupa untuk share ke teman-teman!\n",
    "bugtrack_url": null,
    "license": null,
    "summary": "A comprehensive IoT simulation and communication library",
    "version": "1.0.0",
    "project_urls": null,
    "split_keywords": [
        "iot",
        " mqtt",
        " sensors",
        " simulation",
        " communication",
        " data logging"
    ],
    "urls": [
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "8eed4fb9022645e9ee5a3b819a6849401d1024b3d7e060161b9e9dd74b723c53",
                "md5": "d0f99a0ae541ca77edaf91e6909fc295",
                "sha256": "8f20e2ddabd48b4a26257a8dc8fd78b140c717f1c23d585ea4c01fcd2ebaa50f"
            },
            "downloads": -1,
            "filename": "iotkit_sim-1.0.0-py3-none-any.whl",
            "has_sig": false,
            "md5_digest": "d0f99a0ae541ca77edaf91e6909fc295",
            "packagetype": "bdist_wheel",
            "python_version": "py3",
            "requires_python": ">=3.8",
            "size": 28687,
            "upload_time": "2025-10-06T08:35:11",
            "upload_time_iso_8601": "2025-10-06T08:35:11.468286Z",
            "url": "https://files.pythonhosted.org/packages/8e/ed/4fb9022645e9ee5a3b819a6849401d1024b3d7e060161b9e9dd74b723c53/iotkit_sim-1.0.0-py3-none-any.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "af1c282a3690d0ce612c33f38ea3ba7e03e0f1e305a5b6e5e0e657cfba0f8313",
                "md5": "094b58c7d7b06db731dc4762a08a8cc6",
                "sha256": "93077a92e75e8dc9bdc64b55c9b87296337b5c399fe6dd0014a85bcf6fdb5688"
            },
            "downloads": -1,
            "filename": "iotkit_sim-1.0.0.tar.gz",
            "has_sig": false,
            "md5_digest": "094b58c7d7b06db731dc4762a08a8cc6",
            "packagetype": "sdist",
            "python_version": "source",
            "requires_python": ">=3.8",
            "size": 38463,
            "upload_time": "2025-10-06T08:35:12",
            "upload_time_iso_8601": "2025-10-06T08:35:12.933280Z",
            "url": "https://files.pythonhosted.org/packages/af/1c/282a3690d0ce612c33f38ea3ba7e03e0f1e305a5b6e5e0e657cfba0f8313/iotkit_sim-1.0.0.tar.gz",
            "yanked": false,
            "yanked_reason": null
        }
    ],
    "upload_time": "2025-10-06 08:35:12",
    "github": false,
    "gitlab": false,
    "bitbucket": false,
    "codeberg": false,
    "lcname": "iotkit-sim"
}
        
Elapsed time: 1.75240s