- CitrineOS core extracted (CSMS OCPP 2.0.1) - OpenOCPP extracted (firmware OCPP 1.6J/2.0.1) - ShapeShifter library installed (pip install -e) - ShapeShifter specification extracted - EVerest extracted TODO updated with progress
409 lines
15 KiB
Markdown
409 lines
15 KiB
Markdown
# InfyPower ACDC Power Supply Driver
|
|
|
|
Driver module for InfyPower ACDC power supplies supporting the V1.13 CAN protocol. This module can control multiple InfyPower modules (up to 60 modules theoretically, **recommended maximum 4-6 devices** for reliable operation, typically 2-6 in field installations) using either fixed addressing or automatic group discovery.
|
|
|
|
## Overview
|
|
|
|
This is an **EVerest Hardware Driver** module that implements the standardized `power_supply_DC` interface. It translates EVerest's generic power supply commands into InfyPower-specific CAN protocol messages, enabling seamless integration of InfyPower hardware into EVerest-based charging systems.
|
|
|
|
**Key Integration Points:**
|
|
- **Implements**: `power_supply_DC` interface for standardized power supply control
|
|
- **Communicates**: Via CAN bus using InfyPower V1.13 protocol
|
|
- **Provides**: Voltage/current control, telemetry, error reporting, and capability detection
|
|
- **Integrates**: With EVerest's error management, logging, and configuration systems
|
|
|
|
## Features
|
|
|
|
- **Multi-Module Support**: Control multiple InfyPower modules simultaneously with current sharing (up to 60 modules theoretically)
|
|
- **Dual Operating Modes**: Fixed address mode or automatic group discovery mode
|
|
- **Comprehensive Error Handling**: Maps all InfyPower errors to standardized power_supply_DC framework errors
|
|
- **Serial Number Identification**: Uses Command 0x0B barcode reading for unique device identification
|
|
- **Thread-Safe Operation**: Robust concurrent access protection for telemetry data
|
|
- **Automatic Recovery**: Detects and recovers from offline modules automatically
|
|
|
|
## Configuration
|
|
|
|
### Basic Configuration
|
|
|
|
```yaml
|
|
# Required: CAN interface
|
|
can_device: "can0"
|
|
|
|
# Choose ONE of the following addressing modes:
|
|
|
|
# Option 1: Fixed Address Mode (recommended for known setups)
|
|
module_addresses: "0,1,2" # Comma-separated list of module addresses
|
|
|
|
# Option 2: Group Discovery Mode (for automatic allocation)
|
|
group_address: 1 # Group number matching PSU dial settings
|
|
module_addresses: "" # Must be empty for group discovery
|
|
|
|
# Optional settings
|
|
device_connection_timeout_s: 10 # Module offline timeout
|
|
conversion_efficiency_export: 0.95 # Power conversion efficiency
|
|
controller_address: 240 # CAN controller address (0xF0)
|
|
```
|
|
|
|
### Configuration Parameters
|
|
|
|
| Parameter | Type | Default | Description |
|
|
|-----------|------|---------|-------------|
|
|
| `can_device` | string | `"can0"` | CAN interface name (e.g., "can0", "vcan0") |
|
|
| `module_addresses` | string | `""` | Fixed addresses: "0,1,2" or empty for group discovery |
|
|
| `group_address` | integer | `0` | Group number for discovery mode (matches PSU dial) |
|
|
| `device_connection_timeout_s` | integer | `15` | **CRITICAL**: Must be > 10s module timeout (see Safety Notes) |
|
|
| `conversion_efficiency_export` | number | `0.95` | Power conversion efficiency (0.0-1.0) |
|
|
| `controller_address` | integer | `240` | CAN controller address (0xF0 = 240 decimal) |
|
|
|
|
## ⚠️ Safety Notes
|
|
|
|
### Critical Timeout Configuration
|
|
|
|
**IMPORTANT**: The `device_connection_timeout_s` parameter has critical safety implications and must be configured correctly.
|
|
|
|
#### InfyPower Module Internal Timeout
|
|
Per InfyPower V1.13 protocol specification: *"If the charger module did not receive the message for 10 seconds from the controller, the charger module will off."*
|
|
|
|
This means each module has a **10-second internal timeout** and will **automatically turn OFF its power output** if it doesn't receive CAN messages within this period.
|
|
|
|
#### EVerest Driver Timeout Requirement
|
|
The EVerest `device_connection_timeout_s` **MUST be longer** than the module's internal timeout. Here's why:
|
|
|
|
**❌ DANGEROUS - Driver timeout < Module timeout:**
|
|
```
|
|
Time: 0s → 8s → 10s → 12s
|
|
Driver: ✓ → ✓ → ✗ (removes module from capabilities) → ✗
|
|
Module: ✓ → ✓ → ✓ (still delivering power!) → ✗ (finally turns off)
|
|
```
|
|
**Problem**: Driver advertises reduced capability while module still delivers full power → **overcurrent risk**
|
|
|
|
**✅ SAFE - Driver timeout > Module timeout:**
|
|
```
|
|
Time: 0s → 8s → 10s → 12s → 15s
|
|
Driver: ✓ → ✓ → ✓ (still includes in capabilities) → ✓ → ✗ (removes module)
|
|
Module: ✓ → ✓ → ✗ (safely turned off) → ✗ → ✗
|
|
```
|
|
**Result**: Driver keeps module in capabilities until certain it's OFF → **no overcurrent risk**
|
|
|
|
#### Configuration Recommendation
|
|
```yaml
|
|
# InfyPower modules have 10s internal timeout (per V1.13 protocol):
|
|
device_connection_timeout_s: 15 # Safe default: 15s > 10s module timeout ✓
|
|
device_connection_timeout_s: 11 # Minimum safe: 11s > 10s module timeout
|
|
|
|
# NEVER configure equal to or shorter than module timeout:
|
|
device_connection_timeout_s: 10 # DANGEROUS: Equal to module timeout
|
|
device_connection_timeout_s: 8 # DANGEROUS: 8s < 10s module timeout
|
|
```
|
|
|
|
#### Safety Principle
|
|
- **Overestimating capabilities is safe**: System delivers less than advertised
|
|
- **Underestimating capabilities is dangerous**: Could cause overcurrent conditions
|
|
- **Always err on the side of longer timeouts** for safety
|
|
|
|
## Operating Modes
|
|
|
|
### 1. Fixed Address Mode (Recommended)
|
|
|
|
Use when you know the exact addresses of your InfyPower modules.
|
|
|
|
**Configuration:**
|
|
```yaml
|
|
module_addresses: "0,1,2" # List specific module addresses
|
|
group_address: 0 # Ignored in this mode
|
|
```
|
|
|
|
**Advantages:**
|
|
- Predictable, deterministic addressing
|
|
- Faster startup (no discovery phase)
|
|
- Direct control over which modules are used
|
|
|
|
**Use Cases:**
|
|
- Production installations with known hardware
|
|
- Testing with specific module configurations
|
|
- When you need guaranteed addressing consistency
|
|
|
|
### 2. Group Discovery Mode
|
|
|
|
Use when modules are configured for automatic address allocation.
|
|
|
|
**Configuration:**
|
|
```yaml
|
|
module_addresses: "" # Must be empty
|
|
group_address: 1 # Must match PSU group dial setting
|
|
```
|
|
|
|
**Advantages:**
|
|
- Automatic module detection
|
|
- Hot-plugging support
|
|
- Easier setup for dynamic configurations
|
|
- Adapts to hardware changes
|
|
|
|
**Requirements:**
|
|
- PSU dial switches must be set to matching group number
|
|
- All modules in group must be powered on during discovery
|
|
|
|
**Use Cases:**
|
|
- Development and testing environments
|
|
- Field installations with variable hardware
|
|
- When module addresses may change
|
|
|
|
## CAN Protocol Details
|
|
|
|
### Protocol Specification
|
|
- **Standard**: InfyPower V1.13 CAN Communication Protocol
|
|
- **Bus Type**: CAN 2.0B Extended Frame Format (29-bit identifiers)
|
|
- **Baud Rate**: 125 kbps
|
|
- **Message Length**: 8 bytes (fixed)
|
|
- **Termination**: 120Ω resistors at both ends
|
|
|
|
### CAN ID Structure (29-bit)
|
|
```
|
|
Bits 28-26: Error Code (3 bits)
|
|
Bits 25-22: Device Number (4 bits) - 0x0A=single, 0x0B=group
|
|
Bits 21-16: Command Number (6 bits)
|
|
Bits 15-8: Destination Address (8 bits)
|
|
Bits 7-0: Source Address (8 bits) - Controller address
|
|
```
|
|
|
|
### Key Commands Used
|
|
| Command | ID | Description | Usage |
|
|
|---------|----|---------|----|
|
|
| Module Count | 0x02 | Get number of modules in group | Group discovery |
|
|
| Module VI | 0x03 | Read voltage/current | Regular telemetry |
|
|
| Module Status | 0x04 | Read status flags | Error monitoring |
|
|
| Module Capabilities | 0x0A | Read voltage/current/power limits | Capability detection |
|
|
| Module Barcode | 0x0B | Read serial number | Device identification |
|
|
| Module VI After Diode | 0x0C | Read external voltage/available current | Advanced telemetry |
|
|
| Set Module On/Off | 0x1A | Enable/disable module | Control |
|
|
| Set Module VI | 0x1C | Set voltage/current | Control |
|
|
|
|
### Communication Flow
|
|
|
|
#### Initialization
|
|
1. **Discovery** (Group mode): Send Module Count request to detect modules
|
|
2. **Capabilities**: Read max voltage/current/power from each module
|
|
3. **Serial Numbers**: Read barcode for device identification
|
|
4. **Safety**: Ensure all modules start in OFF state
|
|
|
|
#### Regular Operation (1-second intervals)
|
|
1. **Telemetry**: Read voltage, current, status from all modules
|
|
2. **Error Monitoring**: Check status flags for alarm conditions
|
|
3. **Timeout Detection**: Remove unresponsive modules from active list
|
|
4. **Recovery**: Automatically re-add modules that come back online
|
|
|
|
## Error Handling
|
|
|
|
### Error Mapping
|
|
|
|
InfyPower errors are automatically mapped to standardized power_supply_DC errors:
|
|
|
|
| InfyPower Error | power_supply_DC Error | Severity | Description |
|
|
|-----------------|----------------------|----------|-------------|
|
|
| OverVoltage | OverVoltageDC | High | Output voltage too high |
|
|
| UnderVoltage | UnderVoltageDC | High | Output voltage too low |
|
|
| OverTemperature | OverTemperature | High | Module overheating |
|
|
| OverCurrent | OverCurrentDC | High | Output current too high |
|
|
| InputVoltage | UnderVoltageAC | High | AC input voltage issues |
|
|
| InternalFault | HardwareFault | High | Internal module fault |
|
|
| InputPhaseLoss | VendorError | High | AC phase loss |
|
|
| FanFault | VendorWarning | Medium | Cooling fan failure |
|
|
| CommunicationFault | CommunicationFault | High | Lost communication |
|
|
|
|
### Error Recovery
|
|
|
|
- **Individual Module Errors**: Other modules continue operating
|
|
- **Communication Timeout**: Modules automatically removed from active list
|
|
- **Communication Recovery**: Modules automatically re-added when responding
|
|
- **System-Wide Faults**: All modules forced off for safety
|
|
|
|
### Logging Format
|
|
|
|
Error messages follow standardized format for easy identification:
|
|
```
|
|
Infy[0x00/SN_130C15A3FB06A8_V]: Module fault alarm activated
|
|
Infy[0x01]: Communication fault detected, FORCE mode to off
|
|
```
|
|
|
|
## Current Sharing
|
|
|
|
When multiple modules are active, current is automatically shared equally:
|
|
|
|
**Example with 3 modules:**
|
|
- Request: 150A total
|
|
- Per-module: 50A each
|
|
- Voltage: Same for all modules
|
|
|
|
**Load Balancing:**
|
|
- Automatic equal current distribution
|
|
- Voltage synchronized across all modules
|
|
- Individual module limits respected
|
|
- Failed modules automatically excluded
|
|
|
|
## Troubleshooting
|
|
|
|
### Common Issues
|
|
|
|
#### 0. ⚠️ SAFETY: Always check timeout configuration first
|
|
**Before troubleshooting**: Verify `device_connection_timeout_s` > module internal timeout (see Safety Notes above)
|
|
|
|
#### 1. No modules detected
|
|
**Symptoms**: "No active modules" warnings
|
|
**Causes**:
|
|
- CAN interface down: `sudo ip link set can0 up type can bitrate 125000`
|
|
- Wrong CAN device name: Check `can_device` configuration
|
|
- Modules not powered or wrong group setting
|
|
|
|
**Solutions**:
|
|
```bash
|
|
# Check CAN interface
|
|
ip link show can0
|
|
|
|
# Bring up CAN interface
|
|
sudo ip link set can0 up type can bitrate 125000
|
|
|
|
# Monitor CAN traffic
|
|
candump can0
|
|
```
|
|
|
|
#### 2. Modules going offline
|
|
**Symptoms**: "module communication expired" messages
|
|
**Causes**:
|
|
- CAN bus errors or noise
|
|
- Loose connections
|
|
- Power supply issues
|
|
|
|
**Solutions**:
|
|
- Check CAN bus termination (120Ω resistors)
|
|
- Verify all connections are secure
|
|
- Monitor for CAN errors in system logs
|
|
|
|
#### 3. Current not shared properly
|
|
**Symptoms**: Uneven current distribution
|
|
**Causes**:
|
|
- Modules have different capabilities
|
|
- Some modules in fault state
|
|
- Configuration mismatch
|
|
|
|
**Solutions**:
|
|
- Check module status in logs
|
|
- Verify all modules have same specifications
|
|
- Check for error conditions
|
|
|
|
#### 4. Group discovery not working
|
|
**Symptoms**: No modules found in group mode
|
|
**Causes**:
|
|
- Wrong group_address setting
|
|
- PSU dial switches not matching
|
|
- Modules not ready during discovery
|
|
|
|
**Solutions**:
|
|
- Verify PSU dial switch settings match group_address
|
|
- Ensure all modules powered on before starting
|
|
|
|
### Debug Information
|
|
|
|
Enable debug logging to see detailed protocol information:
|
|
```yaml
|
|
# In your EVerest configuration
|
|
logging:
|
|
InfyPower: debug
|
|
```
|
|
|
|
Monitor CAN traffic:
|
|
```bash
|
|
# Raw CAN monitoring
|
|
candump can0
|
|
|
|
# With timestamp
|
|
candump -t z can0
|
|
|
|
# Filter InfyPower traffic (controller address 0xF0)
|
|
candump can0 | grep F0
|
|
```
|
|
|
|
## Hardware Requirements
|
|
|
|
### CAN Bus Setup
|
|
- **Topology**: Linear bus with 120Ω termination at both ends
|
|
- **Cable**: Twisted pair CAN cable (CAN_H, CAN_L)
|
|
- **Max Distance**: 40m at 125 kbps
|
|
- **Max Devices**: Up to 60 InfyPower modules + 1 controller (typically 2-6 in field installations)
|
|
|
|
### PSU Configuration
|
|
- Set module addresses or group dial switches before powering on
|
|
- Ensure all modules use same firmware version
|
|
- Configure appropriate current/voltage limits
|
|
|
|
## Development Notes
|
|
|
|
### Architecture Constraints (Critical Implementation Details)
|
|
|
|
#### Single-Threaded CAN Communication
|
|
**IMPORTANT**: The entire CAN communication system operates in a single thread:
|
|
- `rx_handler()` and `poll_status_handler()` execute in the same thread
|
|
- No concurrent CAN operations - all message processing is sequential
|
|
- This design ensures deterministic message handling and eliminates race conditions
|
|
- **Implication**: Blocking operations in handlers affect entire CAN communication
|
|
|
|
#### Configuration Immutability
|
|
**CRITICAL**: Configuration is set exactly once during initialization:
|
|
- `set_config_values()` called only once at startup
|
|
- No runtime configuration changes supported
|
|
- Module addresses and operating mode cannot be changed after initialization
|
|
- **Implication**: Configuration errors require full module restart
|
|
|
|
### Security Model
|
|
|
|
#### No CAN Bus Security
|
|
**IMPORTANT**: InfyPower CAN protocol has no built-in security:
|
|
- **No encryption**: All CAN messages transmitted in plain text
|
|
- **No authentication**: No verification of message sender identity
|
|
- **No message integrity**: Only basic CRC provided by CAN hardware
|
|
- **Physical security required**: Secure the CAN bus physically
|
|
|
|
#### Message Validation Strategy
|
|
**Minimal Validation by Design**:
|
|
- **Only validation**: Controller address verification (`destination_address == controller_address`)
|
|
- **Only malformation check**: Message must be exactly 8 bytes
|
|
- **No payload validation**: Content validity checking beyond packet structure
|
|
- **Rationale**: Keep protocol simple and fast for real-time operation
|
|
|
|
### Adding New Commands
|
|
1. Define packet structure in `CanPackets.hpp`
|
|
2. Implement constructor and conversion in `CanPackets.cpp`
|
|
3. Add command handling in `InfyCanDevice::rx_handler()`
|
|
4. Add sending method if needed
|
|
|
|
### Thread Safety
|
|
- `telemetries` map: Protected by implicit single-thread access
|
|
- `active_module_addresses`: Protected by `active_modules_mutex`
|
|
- All signals are thread-safe via sigslot library
|
|
|
|
### Testing
|
|
- Use `vcan0` virtual CAN interface for development
|
|
- Mock modules can be simulated with `cansend` commands
|
|
- Unit tests recommended for packet encoding/decoding
|
|
|
|
## References
|
|
|
|
- [InfyPower V1.13 CAN Protocol Documentation](https://drive.google.com/file/d/1bZ9Pr7JD_ichvKmLmh8eVnZi0CdSr0xF/view?usp=drive_link) - Complete protocol specification
|
|
- [EVerest power_supply_DC Interface](https://everest.github.io/) - Standardized interface documentation
|
|
- [Linux SocketCAN Documentation](https://www.kernel.org/doc/html/latest/networking/can.html) - CAN bus programming guide
|
|
|
|
## Hardware Compatibility
|
|
|
|
### Supported InfyPower Models
|
|
- **REG Series**: REG1K0100G and compatible models
|
|
- **CEG Series**: CEG1K0100G and compatible models (includes MPPT mode support)
|
|
- **LRG Series**: LRG series charger modules
|
|
- **Protocol Version**: V1.13 and compatible versions
|
|
|
|
### Manufacturer Information
|
|
- **Manufacturer**: Shenzhen Infypower Co., Ltd
|
|
- **Website**: http://www.infypower.com
|
|
- **Protocol Version**: V1.13 (this driver implementation)
|
|
- **Document Reference**: "REG/CEG/LRG series Charger Module CAN Communication Protocol V1.13"
|
|
|
|
**Note**: Ensure your InfyPower modules support V1.13 protocol or compatible versions. Older protocol versions may not be fully compatible with this driver.
|