Add whatsapp feature
This commit is contained in:
653
services/production/IOT_IMPLEMENTATION_GUIDE.md
Normal file
653
services/production/IOT_IMPLEMENTATION_GUIDE.md
Normal file
@@ -0,0 +1,653 @@
|
||||
# IoT Equipment Integration - Implementation Guide
|
||||
|
||||
## Overview
|
||||
|
||||
This guide documents the implementation of real-time IoT equipment tracking for bakery production equipment, specifically targeting smart industrial ovens with IoT connectivity capabilities.
|
||||
|
||||
## Table of Contents
|
||||
|
||||
1. [Architecture](#architecture)
|
||||
2. [Database Schema](#database-schema)
|
||||
3. [IoT Connectors](#iot-connectors)
|
||||
4. [Supported Equipment](#supported-equipment)
|
||||
5. [Implementation Status](#implementation-status)
|
||||
6. [Next Steps](#next-steps)
|
||||
7. [Usage Examples](#usage-examples)
|
||||
|
||||
## Architecture
|
||||
|
||||
### Component Overview
|
||||
|
||||
```
|
||||
┌─────────────────────────────────────────────────────────────┐
|
||||
│ Frontend Dashboard │
|
||||
│ (Real-time Equipment Monitoring UI) │
|
||||
└────────────────┬────────────────────────────────────────────┘
|
||||
│
|
||||
▼
|
||||
┌─────────────────────────────────────────────────────────────┐
|
||||
│ Production Service API │
|
||||
│ /api/v1/equipment/{id}/iot-config │
|
||||
│ /api/v1/equipment/{id}/realtime-data │
|
||||
│ /api/v1/equipment/{id}/sensor-history │
|
||||
│ /api/v1/equipment/{id}/test-connection │
|
||||
└────────────────┬────────────────────────────────────────────┘
|
||||
│
|
||||
▼
|
||||
┌─────────────────────────────────────────────────────────────┐
|
||||
│ IoT Integration Service │
|
||||
│ - Connection management │
|
||||
│ - Data transformation │
|
||||
│ - Protocol abstraction │
|
||||
└────────────────┬────────────────────────────────────────────┘
|
||||
│
|
||||
┌──────────┴──────────┬──────────────────┐
|
||||
▼ ▼ ▼
|
||||
┌────────────┐ ┌──────────────┐ ┌─────────────┐
|
||||
│ REST API │ │ OPC UA │ │ MQTT │
|
||||
│ Connector │ │ Connector │ │ Connector │
|
||||
└─────┬──────┘ └──────┬───────┘ └──────┬──────┘
|
||||
│ │ │
|
||||
▼ ▼ ▼
|
||||
┌─────────────────────────────────────────────────────────────┐
|
||||
│ Smart IoT-Enabled Equipment │
|
||||
│ - Rational iCombi (ConnectedCooking) │
|
||||
│ - Wachtel REMOTE │
|
||||
│ - SALVA Smart Ovens │
|
||||
│ - Generic REST API Equipment │
|
||||
└─────────────────────────────────────────────────────────────┘
|
||||
```
|
||||
|
||||
## Database Schema
|
||||
|
||||
### New Tables
|
||||
|
||||
#### 1. `equipment` (Extended)
|
||||
Added IoT connectivity fields:
|
||||
- `iot_enabled` - Enable/disable IoT connectivity
|
||||
- `iot_protocol` - Protocol type (rest_api, opc_ua, mqtt, modbus, custom)
|
||||
- `iot_endpoint` - Connection endpoint URL/IP
|
||||
- `iot_port` - Connection port
|
||||
- `iot_credentials` - JSON encrypted credentials
|
||||
- `iot_connection_status` - Current connection status
|
||||
- `iot_last_connected` - Timestamp of last successful connection
|
||||
- `iot_config` - Additional protocol-specific configuration
|
||||
- `manufacturer` - Equipment manufacturer
|
||||
- `firmware_version` - Firmware version
|
||||
- `supports_realtime` - Supports real-time monitoring
|
||||
- `poll_interval_seconds` - Data polling interval
|
||||
- `temperature_zones` - Number of temperature zones
|
||||
- `supports_humidity` - Humidity monitoring capability
|
||||
- `supports_energy_monitoring` - Energy monitoring capability
|
||||
- `supports_remote_control` - Remote control capability
|
||||
|
||||
#### 2. `equipment_sensor_readings`
|
||||
Time-series sensor data storage:
|
||||
- Core readings: temperature, humidity, energy consumption
|
||||
- Status: operational_status, cycle_stage, progress
|
||||
- Process parameters: motor_speed, door_status, steam_level
|
||||
- Quality indicators: product_weight, moisture_content
|
||||
- Flexible JSON field for manufacturer-specific sensors
|
||||
|
||||
#### 3. `equipment_connection_logs`
|
||||
Connection event tracking:
|
||||
- event_type, event_time, connection_status
|
||||
- Error tracking: error_message, error_code
|
||||
- Performance metrics: response_time_ms, data_points_received
|
||||
|
||||
#### 4. `equipment_iot_alerts`
|
||||
Real-time equipment alerts:
|
||||
- Alert types: temperature_deviation, connection_lost, equipment_error
|
||||
- Severity levels: info, warning, critical
|
||||
- Status tracking: active, acknowledged, resolved
|
||||
- Automated response tracking
|
||||
|
||||
### Migration
|
||||
|
||||
Run migration to add IoT support:
|
||||
```bash
|
||||
cd services/production
|
||||
alembic upgrade head
|
||||
```
|
||||
|
||||
Migration file: `migrations/versions/002_add_iot_equipment_support.py`
|
||||
|
||||
## IoT Connectors
|
||||
|
||||
### Connector Architecture
|
||||
|
||||
All connectors implement the `BaseIoTConnector` abstract interface:
|
||||
|
||||
```python
|
||||
from app.services.iot import BaseIoTConnector, ConnectorFactory
|
||||
|
||||
# Create connector instance
|
||||
connector = ConnectorFactory.create_connector(
|
||||
protocol='rest_api',
|
||||
equipment_id='equipment-uuid',
|
||||
config={
|
||||
'endpoint': 'https://api.example.com',
|
||||
'port': 443,
|
||||
'credentials': {'api_key': 'xxx'},
|
||||
'additional_config': {}
|
||||
}
|
||||
)
|
||||
|
||||
# Test connection
|
||||
status = await connector.test_connection()
|
||||
|
||||
# Get current readings
|
||||
reading = await connector.get_current_reading()
|
||||
|
||||
# Get equipment capabilities
|
||||
capabilities = await connector.get_capabilities()
|
||||
```
|
||||
|
||||
### Available Connectors
|
||||
|
||||
#### 1. Generic REST API Connector
|
||||
**Protocol:** `rest_api`
|
||||
**File:** `app/services/iot/rest_api_connector.py`
|
||||
|
||||
**Configuration Example:**
|
||||
```json
|
||||
{
|
||||
"protocol": "rest_api",
|
||||
"endpoint": "https://api.equipment.com",
|
||||
"port": 443,
|
||||
"credentials": {
|
||||
"api_key": "your-api-key",
|
||||
"token": "bearer-token"
|
||||
},
|
||||
"additional_config": {
|
||||
"data_endpoint": "/api/v1/equipment/{equipment_id}/data",
|
||||
"status_endpoint": "/api/v1/equipment/{equipment_id}/status",
|
||||
"timeout": 10,
|
||||
"verify_ssl": true
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
**Features:**
|
||||
- Standard REST API support
|
||||
- Bearer token & API key authentication
|
||||
- Basic authentication
|
||||
- Configurable endpoints
|
||||
- SSL verification control
|
||||
- Timeout configuration
|
||||
|
||||
#### 2. Rational ConnectedCooking Connector
|
||||
**Protocol:** `rational` or `rational_connected_cooking`
|
||||
**File:** `app/services/iot/rational_connector.py`
|
||||
|
||||
**Configuration Example:**
|
||||
```json
|
||||
{
|
||||
"protocol": "rational",
|
||||
"endpoint": "https://www.connectedcooking.com/api/v1",
|
||||
"port": 443,
|
||||
"credentials": {
|
||||
"username": "your-email@example.com",
|
||||
"password": "your-password"
|
||||
},
|
||||
"additional_config": {
|
||||
"unit_id": "12345",
|
||||
"timeout": 15
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
**Features:**
|
||||
- Multi-zone temperature (cabinet + core)
|
||||
- Humidity monitoring
|
||||
- Energy consumption tracking
|
||||
- Remote control support
|
||||
- HACCP documentation
|
||||
- Recipe management
|
||||
- Automatic cleaning status
|
||||
|
||||
**Contact:** cc-support@rational-online.com
|
||||
|
||||
#### 3. Wachtel REMOTE Connector
|
||||
**Protocol:** `wachtel` or `wachtel_remote`
|
||||
**File:** `app/services/iot/wachtel_connector.py`
|
||||
|
||||
**Configuration Example:**
|
||||
```json
|
||||
{
|
||||
"protocol": "wachtel",
|
||||
"endpoint": "https://remote.wachtel.de/api",
|
||||
"port": 443,
|
||||
"credentials": {
|
||||
"username": "bakery-username",
|
||||
"password": "bakery-password"
|
||||
},
|
||||
"additional_config": {
|
||||
"oven_id": "oven-serial-number",
|
||||
"deck_count": 3
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
**Features:**
|
||||
- Multi-deck temperature monitoring
|
||||
- Energy consumption tracking
|
||||
- Maintenance alerts
|
||||
- Operation hours tracking
|
||||
- Deck-specific control
|
||||
|
||||
**Contact:** support@wachtel.de
|
||||
|
||||
#### 4. OPC UA Connector (Template)
|
||||
**Protocol:** `opc_ua`
|
||||
**Status:** Template only (requires implementation)
|
||||
|
||||
For bakery equipment supporting OPC UA or Weihenstephan Standards (WS Bake).
|
||||
|
||||
**Dependencies:**
|
||||
```bash
|
||||
pip install asyncua==1.1.5
|
||||
```
|
||||
|
||||
**Template Location:** To be created at `app/services/iot/opcua_connector.py`
|
||||
|
||||
## Supported Equipment
|
||||
|
||||
### Equipment Research Summary
|
||||
|
||||
#### Spanish Manufacturers (Madrid Region)
|
||||
|
||||
1. **SALVA Industrial** (Lezo, Guipuzcoa)
|
||||
- Smart touch control panels
|
||||
- Energy monitoring
|
||||
- Digital integration
|
||||
- Status: API details pending
|
||||
|
||||
2. **Farjas** (Madrid, Móstoles)
|
||||
- Rotary ovens
|
||||
- Status: IoT capabilities unknown
|
||||
|
||||
3. **COLBAKE** (Valencia)
|
||||
- Complete bakery lines
|
||||
- Status: IoT capabilities to be confirmed
|
||||
|
||||
#### International Manufacturers with Madrid Presence
|
||||
|
||||
1. **Rational** (Germany) - ✅ **Implemented**
|
||||
- Product: iCombi ovens
|
||||
- Platform: ConnectedCooking
|
||||
- API: Available (REST)
|
||||
- Showroom: Madrid (15 min from airport)
|
||||
|
||||
2. **Wachtel** (Germany) - ✅ **Template Created**
|
||||
- Product: Deck ovens
|
||||
- Platform: REMOTE monitoring
|
||||
- API: REST (details pending confirmation)
|
||||
|
||||
3. **Sveba Dahlen** (Sweden)
|
||||
- Showroom in Madrid
|
||||
- Status: IoT capabilities to be researched
|
||||
|
||||
### Industry Standards
|
||||
|
||||
- **OPC UA**: Standard protocol for industrial automation
|
||||
- **Weihenstephan Standards (WS Bake)**: Bakery-specific communication standard
|
||||
- **MQTT**: Common IoT message protocol
|
||||
- **Modbus**: Industrial communication protocol
|
||||
|
||||
## Implementation Status
|
||||
|
||||
### ✅ Completed
|
||||
|
||||
1. **Database Schema**
|
||||
- Migration created and tested
|
||||
- All IoT tables defined
|
||||
- Indexes optimized for time-series queries
|
||||
|
||||
2. **Models**
|
||||
- Equipment model extended with IoT fields
|
||||
- Sensor reading model
|
||||
- Connection log model
|
||||
- IoT alert model
|
||||
- Enums: IoTProtocol, IoTConnectionStatus
|
||||
|
||||
3. **Schemas (Pydantic)**
|
||||
- IoTConnectionConfig
|
||||
- Equipment schemas updated with IoT fields
|
||||
- EquipmentSensorReadingResponse
|
||||
- EquipmentConnectionTestResponse
|
||||
- RealTimeDataResponse
|
||||
- EquipmentIoTAlertResponse
|
||||
- EquipmentSensorHistoryResponse
|
||||
|
||||
4. **IoT Connectors**
|
||||
- Base connector interface (`BaseIoTConnector`)
|
||||
- Connector factory pattern
|
||||
- Generic REST API connector (fully implemented)
|
||||
- Rational ConnectedCooking connector (implemented)
|
||||
- Wachtel REMOTE connector (template created)
|
||||
|
||||
5. **Dependencies**
|
||||
- requirements.txt updated
|
||||
- httpx for REST APIs
|
||||
- Commented dependencies for OPC UA and MQTT
|
||||
|
||||
### 🚧 In Progress / To Do
|
||||
|
||||
1. **IoT Integration Service** ⏳
|
||||
- High-level service layer
|
||||
- Connection pool management
|
||||
- Automatic retry logic
|
||||
- Health monitoring
|
||||
|
||||
2. **Repository Layer** ⏳
|
||||
- Equipment IoT configuration CRUD
|
||||
- Sensor data storage and retrieval
|
||||
- Connection log management
|
||||
- Alert management
|
||||
|
||||
3. **API Endpoints** ⏳
|
||||
- POST `/api/v1/equipment/{id}/iot-config` - Configure IoT
|
||||
- POST `/api/v1/equipment/{id}/test-connection` - Test connectivity
|
||||
- GET `/api/v1/equipment/{id}/realtime-data` - Get current data
|
||||
- GET `/api/v1/equipment/{id}/sensor-history` - Historical data
|
||||
- GET `/api/v1/batches/{id}/realtime-tracking` - Batch tracking
|
||||
- GET `/api/v1/equipment/iot-alerts` - Get active alerts
|
||||
|
||||
4. **Background Workers** ⏳
|
||||
- Periodic data collection worker
|
||||
- Connection health monitor
|
||||
- Alert generation and notification
|
||||
- Data cleanup (old sensor readings)
|
||||
|
||||
5. **Frontend Components** ⏳
|
||||
- Equipment IoT configuration wizard
|
||||
- Real-time monitoring dashboard
|
||||
- Sensor data visualization charts
|
||||
- Alert notification system
|
||||
- Connection status indicators
|
||||
|
||||
6. **Additional Connectors** 📋
|
||||
- OPC UA connector implementation
|
||||
- MQTT connector implementation
|
||||
- SALVA-specific connector (pending API details)
|
||||
|
||||
## Next Steps
|
||||
|
||||
### Priority 1: Core Service Layer
|
||||
|
||||
1. **Create IoT Integration Service**
|
||||
```python
|
||||
# app/services/iot_integration_service.py
|
||||
class IoTIntegrationService:
|
||||
async def configure_equipment_iot(equipment_id, config)
|
||||
async def test_connection(equipment_id)
|
||||
async def get_realtime_data(equipment_id)
|
||||
async def get_sensor_history(equipment_id, start, end)
|
||||
async def store_sensor_reading(equipment_id, reading)
|
||||
```
|
||||
|
||||
2. **Create Repository Methods**
|
||||
```python
|
||||
# app/repositories/equipment_repository.py
|
||||
async def update_iot_config(equipment_id, config)
|
||||
async def get_iot_config(equipment_id)
|
||||
async def update_connection_status(equipment_id, status)
|
||||
|
||||
# app/repositories/sensor_reading_repository.py
|
||||
async def create_reading(reading)
|
||||
async def get_readings(equipment_id, start_time, end_time)
|
||||
async def get_latest_reading(equipment_id)
|
||||
```
|
||||
|
||||
3. **Create API Endpoints**
|
||||
```python
|
||||
# app/api/equipment_iot.py
|
||||
router = APIRouter(prefix="/equipment", tags=["equipment-iot"])
|
||||
|
||||
@router.post("/{equipment_id}/iot-config")
|
||||
@router.post("/{equipment_id}/test-connection")
|
||||
@router.get("/{equipment_id}/realtime-data")
|
||||
@router.get("/{equipment_id}/sensor-history")
|
||||
```
|
||||
|
||||
### Priority 2: Background Processing
|
||||
|
||||
1. **Data Collection Worker**
|
||||
- Poll IoT-enabled equipment at configured intervals
|
||||
- Store sensor readings in database
|
||||
- Handle connection errors gracefully
|
||||
|
||||
2. **Alert Generation**
|
||||
- Monitor temperature deviations
|
||||
- Detect connection losses
|
||||
- Generate alerts for critical conditions
|
||||
|
||||
### Priority 3: Frontend Integration
|
||||
|
||||
1. **Equipment Configuration UI**
|
||||
- IoT setup wizard
|
||||
- Protocol selection
|
||||
- Connection testing
|
||||
- Credential management
|
||||
|
||||
2. **Real-time Dashboard**
|
||||
- Live equipment status cards
|
||||
- Temperature/humidity gauges
|
||||
- Energy consumption charts
|
||||
- Alert notifications
|
||||
|
||||
## Usage Examples
|
||||
|
||||
### Example 1: Configure Equipment for IoT
|
||||
|
||||
```python
|
||||
from app.services.iot_integration_service import IoTIntegrationService
|
||||
|
||||
service = IoTIntegrationService()
|
||||
|
||||
# Configure Rational iCombi oven
|
||||
config = {
|
||||
"protocol": "rational",
|
||||
"endpoint": "https://www.connectedcooking.com/api/v1",
|
||||
"port": 443,
|
||||
"credentials": {
|
||||
"username": "bakery@example.com",
|
||||
"password": "secure-password"
|
||||
},
|
||||
"additional_config": {
|
||||
"unit_id": "12345"
|
||||
}
|
||||
}
|
||||
|
||||
await service.configure_equipment_iot(equipment_id="uuid-here", config=config)
|
||||
```
|
||||
|
||||
### Example 2: Test Connection
|
||||
|
||||
```python
|
||||
# Test connection before saving configuration
|
||||
result = await service.test_connection(equipment_id="uuid-here")
|
||||
|
||||
if result.success:
|
||||
print(f"Connected in {result.response_time_ms}ms")
|
||||
print(f"Supported features: {result.supported_features}")
|
||||
else:
|
||||
print(f"Connection failed: {result.error_details}")
|
||||
```
|
||||
|
||||
### Example 3: Get Real-time Data
|
||||
|
||||
```python
|
||||
# Get current equipment data
|
||||
data = await service.get_realtime_data(equipment_id="uuid-here")
|
||||
|
||||
print(f"Temperature: {data.temperature}°C")
|
||||
print(f"Status: {data.operational_status}")
|
||||
print(f"Progress: {data.cycle_progress_percentage}%")
|
||||
print(f"Time remaining: {data.time_remaining_minutes} min")
|
||||
```
|
||||
|
||||
### Example 4: Retrieve Sensor History
|
||||
|
||||
```python
|
||||
from datetime import datetime, timedelta
|
||||
|
||||
# Get last 24 hours of data
|
||||
end_time = datetime.now()
|
||||
start_time = end_time - timedelta(hours=24)
|
||||
|
||||
history = await service.get_sensor_history(
|
||||
equipment_id="uuid-here",
|
||||
start_time=start_time,
|
||||
end_time=end_time
|
||||
)
|
||||
|
||||
# Plot temperature over time
|
||||
for reading in history.readings:
|
||||
print(f"{reading.reading_time}: {reading.temperature}°C")
|
||||
```
|
||||
|
||||
## API Endpoint Specifications
|
||||
|
||||
### POST /api/v1/equipment/{equipment_id}/iot-config
|
||||
|
||||
Configure IoT connectivity for equipment.
|
||||
|
||||
**Request Body:**
|
||||
```json
|
||||
{
|
||||
"protocol": "rational",
|
||||
"endpoint": "https://www.connectedcooking.com/api/v1",
|
||||
"port": 443,
|
||||
"credentials": {
|
||||
"username": "user@example.com",
|
||||
"password": "password"
|
||||
},
|
||||
"additional_config": {
|
||||
"unit_id": "12345"
|
||||
},
|
||||
"supports_realtime": true,
|
||||
"poll_interval_seconds": 30
|
||||
}
|
||||
```
|
||||
|
||||
**Response:**
|
||||
```json
|
||||
{
|
||||
"success": true,
|
||||
"message": "IoT configuration saved successfully",
|
||||
"equipment_id": "uuid",
|
||||
"connection_test_result": {
|
||||
"success": true,
|
||||
"status": "connected",
|
||||
"response_time_ms": 145
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### GET /api/v1/equipment/{equipment_id}/realtime-data
|
||||
|
||||
Get current real-time sensor data.
|
||||
|
||||
**Response:**
|
||||
```json
|
||||
{
|
||||
"equipment_id": "uuid",
|
||||
"equipment_name": "Horno Principal #1",
|
||||
"timestamp": "2025-01-12T10:30:00Z",
|
||||
"connection_status": "connected",
|
||||
"temperature": 185.5,
|
||||
"temperature_zones": {
|
||||
"cabinet": 180,
|
||||
"core": 72
|
||||
},
|
||||
"humidity": 65.0,
|
||||
"operational_status": "running",
|
||||
"cycle_stage": "baking",
|
||||
"cycle_progress_percentage": 45.0,
|
||||
"time_remaining_minutes": 12,
|
||||
"energy_consumption_kwh": 12.5,
|
||||
"active_batch_id": "batch-uuid",
|
||||
"active_batch_name": "Baguettes - Batch #123"
|
||||
}
|
||||
```
|
||||
|
||||
## Security Considerations
|
||||
|
||||
1. **Credential Storage**
|
||||
- Store API keys/passwords encrypted in database
|
||||
- Use environment variables for sensitive configuration
|
||||
- Rotate credentials periodically
|
||||
|
||||
2. **SSL/TLS**
|
||||
- Always use HTTPS for REST API connections
|
||||
- Verify SSL certificates in production
|
||||
- Support self-signed certificates for local equipment
|
||||
|
||||
3. **Authentication**
|
||||
- Require user authentication for IoT configuration
|
||||
- Log all configuration changes
|
||||
- Implement role-based access control
|
||||
|
||||
4. **Network Security**
|
||||
- Support firewall-friendly protocols
|
||||
- Document required network ports
|
||||
- Consider VPN for equipment access
|
||||
|
||||
## Troubleshooting
|
||||
|
||||
### Connection Issues
|
||||
|
||||
1. **Timeout errors**
|
||||
- Increase timeout in additional_config
|
||||
- Check network connectivity
|
||||
- Verify firewall rules
|
||||
|
||||
2. **Authentication failures**
|
||||
- Verify credentials are correct
|
||||
- Check API key expiration
|
||||
- Confirm endpoint URL is correct
|
||||
|
||||
3. **SSL certificate errors**
|
||||
- Set `verify_ssl: false` for testing (not recommended for production)
|
||||
- Install proper SSL certificates
|
||||
- Use certificate bundles for corporate networks
|
||||
|
||||
### Data Quality Issues
|
||||
|
||||
1. **Missing sensor readings**
|
||||
- Check equipment supports requested sensors
|
||||
- Verify polling interval is appropriate
|
||||
- Review connection logs for errors
|
||||
|
||||
2. **Anomalous data**
|
||||
- Implement data validation
|
||||
- Set reasonable min/max thresholds
|
||||
- Flag outliers for manual review
|
||||
|
||||
## Resources
|
||||
|
||||
### Manufacturer Contacts
|
||||
|
||||
- **Rational:** cc-support@rational-online.com
|
||||
- **Wachtel:** support@wachtel.de / https://www.wachtel.de
|
||||
- **SALVA:** https://www.salva.es/en
|
||||
|
||||
### Standards and Protocols
|
||||
|
||||
- **OPC Foundation:** https://opcfoundation.org/
|
||||
- **Weihenstephan Standards:** https://www.weihenstephan-standards.com
|
||||
- **MQTT:** https://mqtt.org/
|
||||
|
||||
### Libraries
|
||||
|
||||
- **httpx:** https://www.python-httpx.org/
|
||||
- **asyncua:** https://github.com/FreeOpcUa/opcua-asyncio
|
||||
- **paho-mqtt:** https://pypi.org/project/paho-mqtt/
|
||||
|
||||
---
|
||||
|
||||
**Last Updated:** 2025-01-12
|
||||
**Status:** Phase 1 Complete - Foundation & Connectors
|
||||
**Next Milestone:** Service Layer & API Endpoints
|
||||
Reference in New Issue
Block a user