654 lines
19 KiB
Markdown
654 lines
19 KiB
Markdown
# 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
|