Home Assistant custom integration for ABB/FIMER/Power-One PVI inverters via VSN300/VSN700 datalogger REST API.
This integration connects to VSN300 or VSN700 dataloggers to monitor ABB/FIMER/Power-One PV inverters. It communicates via the datalogger's REST API and normalizes data to SunSpec-compatible format for consistent Home Assistant entity creation.
- ✅ Automatic Discovery: Detects VSN model (VSN300/VSN700) and discovers all connected devices
- ✅ VSN300 Support: HTTP Digest authentication with X-Digest scheme
- ✅ VSN700 Support: HTTP Basic authentication
- ✅ Multi-Device: Supports inverters, meters, batteries, and storage devices
- ✅ SunSpec Normalization: VSN data mapped to SunSpec standard format
- ✅ Device Hierarchy: Proper device relationships (inverters via datalogger)
- ✅ Complete Metadata: Model, manufacturer, firmware version, serial numbers
- ✅ Smart Device Recovery: Automatic re-discovery of offline devices with repair notifications
- ✅ Configuration UI: Easy setup through Home Assistant UI
- ✅ Multi-Language: 10 European languages (EN, IT, FR, ES, PT, DE, SV, NB, FI, ET)
VSN Dataloggers:
- VSN300 (WIFI LOGGER CARD)
- VSN700 (Ethernet/WiFi datalogger)
⚠️ VSN300 firmware 2.0.0 is not supported. That firmware has a vendor bug that breaks the live data API (/v1/livedatadrops every connection), making monitoring impossible. The bug is fixed in firmware 2.0.1, and the upgrade is self-service from the datalogger's web UI: FW UPDATE tab → Remote Update → Check for FW update → Download & Update. The integration detects firmware 2.0.0 and shows a clear error during setup (or a repair issue on an existing installation) instead of generic connection failures. Firmware 1.9.x and 2.0.1+ work fine.
Inverters: (via datalogger)
- Single-phase: REACT2-3.6-TL, REACT2-5.0-TL, etc.
- Three-phase: PVI-10.0-OUTD, PVI-12.5-OUTD, etc.
Other Devices: (via datalogger)
- Energy meters
- Battery storage systems
- Open HACS in your Home Assistant instance
- Click on "Integrations"
- Click the three dots menu in the top right corner
- Select "Custom repositories"
- Add
https://github.com/alexdelprete/ha-abb-fimer-pvi-vsn-restas an Integration - Click "Download" and install the integration
- Restart Home Assistant
- Download the latest release from GitHub Releases
- Extract the
custom_components/abb_fimer_pvi_vsn_restfolder - Copy it to your Home Assistant
config/custom_components/directory - Restart Home Assistant
- VSN300 or VSN700 datalogger connected to your network
- Datalogger IP address or hostname
- Valid credentials (check your datalogger's web interface for configured users)
- Go to Settings → Devices & Services
- Click "+ Add Integration"
- Search for "ABB FIMER PVI VSN REST"
- Enter configuration:
- Host: IP address or hostname (e.g.,
192.168.1.100orabb-vsn300.local) - Username: Authentication username (commonly
guest, but check your device) - Password: Authentication password (may be empty or configured on your device)
- Host: IP address or hostname (e.g.,
- Click "Submit"
The integration will:
- Detect VSN model (VSN300 or VSN700)
- Discover all connected devices (inverters, meters, batteries)
- Create Home Assistant entities for all data points
After setup, click "Configure" on the integration card to access the options dialog. All configuration options are described below:
| Option | Default | Range | Description |
|---|---|---|---|
| Scan interval | 60 | 10-600 sec | How often to fetch data from the VSN device |
| Option | Default | Description |
|---|---|---|
| Enable runtime failure notifications | On | Notify when device becomes unreachable during normal operation |
| Enable startup failure notifications | Off | Notify when device is unreachable at Home Assistant startup |
| Failures before notification | 3 (1-10) | Consecutive failures before creating a notification |
| Recovery script | (none) | Script to execute when failures threshold is reached (e.g., script.restart_router) |
Runtime vs Startup Notifications:
- Runtime: Monitors failures during normal operation after HA is running
- Startup: Monitors failures when HA starts/restarts and can't connect to the device
Tip for solar-only systems: If your inverter is offline at night and you restart HA at night, disable "Enable startup failure notifications" to avoid unnecessary alerts.
| Option | Description |
|---|---|
| Inverter device name | Custom name for inverter devices. Leave empty for default. |
| Datalogger device name | Custom name for datalogger devices. Leave empty for default. |
| Meter device name | Custom name for meter devices. Leave empty for default. |
| Battery device name | Custom name for battery devices. Leave empty for default. |
| Regenerate entity IDs |
Note: Only device types discovered in your system will appear in the options dialog.
See Custom Device Names below for detailed examples.
The integration can notify you when the datalogger becomes unreachable and optionally execute a recovery script.
How It Works:
- When the datalogger fails to respond, the integration tracks consecutive failures
- After reaching the threshold (default: 3), a persistent notification appears
- If configured, a recovery script executes automatically (e.g.,
script.restart_router) - When connection recovers, a recovery notification shows downtime details
Recovery Script Use Cases:
- Restart router/network equipment via smart plug
- Power cycle the datalogger
- Send alerts via external services
- Trigger any Home Assistant automation
Recovery Script Variables:
When your recovery script is called, the integration passes these variables that you can use:
| Variable | Description | Example |
|---|---|---|
device_name |
Full device name | VSN300 (110033-3A16-1234) |
host |
Device hostname/IP | 192.168.1.100 |
vsn_model |
Datalogger model | VSN300 or VSN700 |
logger_sn |
Logger serial number | 110033-3A16-1234 |
failures_count |
Number of consecutive failures | 3 |
Example Script:
# scripts.yaml
power_cycle_datalogger:
alias: "Power Cycle Datalogger"
sequence:
- service: switch.turn_off
target:
entity_id: switch.datalogger_plug
- delay:
seconds: 10
- service: switch.turn_on
target:
entity_id: switch.datalogger_plug
- service: notify.mobile_app
data:
title: "Datalogger Recovery"
message: "Power cycled {{ device_name }} after {{ failures_count }} failures"In systems without battery storage, the entire system (datalogger + inverter) is powered off at night. When the sun rises, the datalogger powers up first and becomes reachable, but the inverter may take longer to come online. If Home Assistant starts or restarts during this window, the integration discovers the datalogger but not the inverter. The integration handles this gracefully:
How It Works:
- The integration maintains a known devices list that persists across restarts
- On startup, if known devices are missing from discovery, a warning notification appears listing the missing devices
- Every poll cycle (default: 60s), the integration re-discovers missing devices
- When all devices come back online, the notification clears and entities are automatically restored
- If a new device appears in the data that isn't in the known list, the integration detects it and reloads
Device Management:
- Deleting a device: Always allowed via the HA UI. The device is removed from the known list. If the device still physically exists, it will be re-discovered and re-added on the next poll cycle.
- Disabling a device: Use this if you want to hide a device permanently. Disabled devices remain in the registry but their entities stop updating.
If you need to change the hostname/IP or credentials:
- Go to the integration card
- Click the three dots menu → "Reconfigure"
- Enter new settings
The integration creates sensor entities for all available data points from your devices.
The integration uses Home Assistant's modern entity naming pattern (has_entity_name=True).
Device Names: Friendly format for beautiful UI display
- Format:
{Manufacturer} {DeviceType} {Model} ({Serial}) - Examples:
Power-One Inverter PVI-10.0-OUTD (076543-3F71-2345)ABB Datalogger VSN300 (110033-3A16-1234)FIMER Inverter REACT2-3.6-TL (123456-ABCD-5678)
Entity IDs: Automatically generated by Home Assistant from device name + translated display name
- Format:
sensor.{slugify(device_name)}_{slugify(translated_display_name)} - Examples:
sensor.power_one_inverter_pvi_10_0_outd_076543_3f71_2345_power_acsensor.abb_datalogger_vsn300_110033_3a16_1234_firmware_versionsensor.fimer_inverter_react2_3_6_tl_123456_abcd_5678_energy_ac_lifetime
Entity Friendly Names: Shown in the UI (device name + translated display name)
- Examples:
Power-One Inverter PVI-10.0-OUTD (076543-3F71-2345) Power ACABB Datalogger VSN300 (110033-3A16-1234) Firmware VersionFIMER Inverter REACT2-3.6-TL (123456-ABCD-5678) Energy AC - Lifetime
Notes:
- Entity IDs are derived from the device name and the translated display name in your HA language
- Entity IDs are stable once created — they only change if you update device names and check "Regenerate Entity IDs"
- Friendly names make entities easy to identify in the UI
- Device page groups all entities by device for easy management
You can customize device names for each device type through the integration options. This is useful if you want shorter, friendlier names for your devices.
To configure custom names:
- Go to Settings → Devices & Services
- Find the ABB/FIMER PVI VSN REST integration card
- Click Configure
- Enter custom names for any device type you want to customize
- Leave fields empty to keep default naming
Example:
| Setting | Device Name | Entity ID Example |
|---|---|---|
| No prefix (default) | Power-One Inverter PVI-10.0-OUTD (076543-3F71-2345) |
sensor.power_one_inverter_pvi_... |
| Custom: "Solar Inverter" | Solar Inverter |
sensor.solar_inverter_power_ac |
Dynamic Options Form: The configuration only shows prefix fields for device types that were actually discovered. For example, if you only have an inverter and datalogger, you won't see fields for meter or battery.
Entity ID Behavior:
| Action | Entity ID | Automations |
|---|---|---|
| Change device name only | Preserved | Keep working ✅ |
| Change name + check "Regenerate entity IDs" | Updated | Will break |
The integration includes native translations for entity names in 10 European languages:
| Language | Code | Status |
|---|---|---|
| English | en |
✅ Complete (246 sensors) |
| Italian | it |
✅ Complete (246 sensors) |
| French | fr |
✅ Complete (246 sensors) |
| Spanish | es |
✅ Complete (246 sensors) |
| Portuguese | pt |
✅ Complete (246 sensors) |
| German | de |
✅ Complete (246 sensors) |
| Swedish | sv |
✅ Complete (246 sensors) |
| Norwegian Bokmål | nb |
✅ Complete (246 sensors) |
| Finnish | fi |
✅ Complete (246 sensors) |
| Estonian | et |
✅ Complete (246 sensors) |
Automatic Language Selection: Home Assistant automatically selects the appropriate language based on your system settings. No configuration needed!
Examples:
- English:
Power-One Inverter PVI-10.0-OUTD (076543-3F71-2345) Power AC→ entity ID:sensor.power_one_inverter_..._power_ac - Italian:
Power-One Inverter PVI-10.0-OUTD (076543-3F71-2345) Potenza AC→ entity ID:sensor.power_one_inverter_..._potenza_ac - French:
Power-One Inverter PVI-10.0-OUTD (076543-3F71-2345) Puissance AC→ entity ID:sensor.power_one_inverter_..._puissance_ac - German:
Power-One Inverter PVI-10.0-OUTD (076543-3F71-2345) AC-Leistung→ entity ID:sensor.power_one_inverter_..._ac_leistung
Note: Device names (manufacturer, model, serial) remain in their original format. Only measurement names are translated.
Each device includes complete metadata:
| Field | Description | Example |
|---|---|---|
| Name | Device model + Serial | PVI-10.0-OUTD (076543-3F71-2345) |
| Manufacturer | From device data | Power-One, ABB, FIMER |
| Model | Device model | PVI-10.0-OUTD |
| Serial Number | Device S/N | 076543-3F71-2345 |
| Firmware | Device firmware | C008 |
| Configuration URL | Datalogger only | http://abb-vsn300.local |
| Via Device | Device connection | Linked to datalogger |
Production:
- AC Power (W)
- AC Current (A)
- AC Voltage (V)
- AC Frequency (Hz)
- Total Energy (Wh)
- Daily Energy (Wh)
DC Inputs (per MPPT):
- DC Voltage (V)
- DC Current (A)
- DC Power (W)
Status:
- Operating State
- Cabinet Temperature
- Isolation Resistance
VSN Datalogger
↓ (REST API)
VSN REST Client
↓ (Raw JSON)
Normalizer
↓ (SunSpec-compatible JSON)
Coordinator
↓ (Polling)
Sensor Platform
↓
Home Assistant Entities
-
Discovery Module (
discovery.py)- Detects VSN model (VSN300/VSN700)
- Discovers all connected devices
- Extracts metadata (model, manufacturer, firmware)
- Handles device identification (S/N, MAC addresses)
-
REST Client (
client.py)- Authenticates with VSN datalogger
- Fetches data from REST API endpoints
- Handles VSN300/VSN700 authentication differences
-
Normalizer (
normalizer.py)- Transforms VSN proprietary format to SunSpec standard
- Uses mapping definitions from
mapping/directory - Provides consistent data structure
-
Coordinator (
coordinator.py)- Manages periodic data polling
- Handles errors and retries
- Distributes data to sensors
-
Config Flow (
config_flow.py)- User interface for setup
- Connection validation
- Reconfiguration support
The integration automatically detects which VSN model you have and uses the appropriate authentication method.
- Send unauthenticated request to
/v1/status - Examine response:
- HTTP 401 with
WWW-Authenticate: X-Digest...→ VSN300 (auth required) - HTTP 401 without digest → Try preemptive Basic auth → VSN700 (auth required)
- HTTP 200 → Analyze status data → VSN300 or VSN700 (no auth required)
- HTTP 401 with
- Scheme: Custom HTTP Digest (X-Digest header)
- Process:
- Request challenge from endpoint
- Compute MD5 digest response:
MD5(MD5(username:realm:password):nonce:MD5(method:uri)) - Send request with
Authorization: X-Digest username="...", realm="...", nonce="...", response="..."
- Scheme: Preemptive HTTP Basic Authentication
- Process: Send
Authorization: Basic {base64(username:password)}with every request - Note: VSN700 accepts credentials immediately without requiring a challenge-response flow
Some VSN devices may have authentication disabled. The integration fully supports this:
- When the device returns HTTP 200 (no authentication required), the integration analyzes the status data structure to determine the model
- VSN300 indicators:
logger.board_model = "WIFI LOGGER CARD", serial formatXXXXXX-XXXX-XXXX, or many status keys (>10) - VSN700 indicators:
logger.loggerIdin MAC address format, or minimal status keys (≤3) - All subsequent requests are made without authentication headers
All authentication methods are handled automatically by the integration - no configuration needed!
Symptom: "Cannot connect" error during setup
Solutions:
- Verify datalogger IP/hostname is correct
- Ensure datalogger is powered on and network-accessible
- Check firewall rules allow HTTP (port 80)
- Try accessing
http://{host}/v1/statusin browser
Symptom: "Authentication failed" error
Solutions:
- Check your datalogger's web interface for valid credentials
- Check credentials in datalogger web interface
- Reset datalogger credentials if necessary
Symptom: Integration loads but no sensors appear
Solutions:
- Check Home Assistant logs for errors
- Verify inverter is connected to datalogger
- Check datalogger web interface shows inverter data
- Enable debug logging (see below)
Symptom: A lifetime total (e.g. "Energy AC - Produced Lifetime", or a battery
cycle count) is stuck on unknown, while periodic ("Today"/"Week"/"Month") and other
sensors update normally.
Cause: Lifetime totals are protected by a guard that rejects any decrease, because a true lifetime counter only ever increases and Home Assistant would otherwise read a drop as a meter reset and double-count energy. In rare cases the reference the guard compares against becomes wrong and every real reading then looks like a decrease:
- a corrupt high reading from the datalogger was accepted and is now the reference, so all subsequent (correct, lower) readings are rejected; or
- the inverter's lifetime counter was genuinely reset (factory/service reset, register overflow, or a meter reset behind a grid total).
This is by design — the guard deliberately does not auto-recover, because relaxing it would re-open the energy double-counting it prevents.
Solution: Reload the integration (Settings → Devices & Services → ABB/FIMER PVI VSN REST → ⋮ → Reload). The guard re-reads a fresh reference and the sensor recovers. If the value was a genuine reset, the lifetime total will resume from the new, lower value.
To enable debug logging for this integration, add the following to your configuration.yaml:
logger:
default: info
logs:
custom_components.abb_fimer_pvi_vsn_rest: debugAfter adding this configuration:
- Restart Home Assistant to apply the logging configuration
- Reproduce the issue you're experiencing
- Download the full logs using one of these methods:
- Go to Settings → System → Logs
- Click "Download Full Log" button in the top right
- The downloaded file contains all log entries including debug messages
If you have access to your Home Assistant configuration directory:
# The log file is located at:
config/home-assistant.log
# To filter only this integration's logs:
grep "abb_fimer_pvi_vsn_rest" home-assistant.log > integration_debug.log# View live logs filtered by integration:
ha core logs | grep "abb_fimer_pvi_vsn_rest"
# Or for Docker installations:
docker logs homeassistant 2>&1 | grep "abb_fimer_pvi_vsn_rest"When opening a GitHub issue, please include:
- Full debug log (downloaded via Method 1 above)
- Integration version (found in HACS or Settings → Devices & Services)
- Home Assistant version (Settings → About)
- VSN datalogger model (VSN300 or VSN700)
- Inverter model (e.g., PVI-10.0-OUTD, REACT2-3.6-TL)
- Steps to reproduce the issue
Privacy Note: Debug logs may contain your device's IP address and serial numbers. Review the log before sharing and redact sensitive information if needed.
If you're experiencing connection or authentication issues, you can use the standalone test script to diagnose the problem and provide detailed logs when reporting issues.
The repository includes a standalone diagnostic script that mirrors the integration's client library. It can test your VSN device without installing the integration:
-
Download the script:
wget https://raw.githubusercontent.com/alexdelprete/ha-abb-fimer-pvi-vsn-rest/master/scripts/vsn-rest-client/vsn_rest_client.py
-
Install dependencies:
pip install aiohttp
-
Run the test:
python vsn_rest_client.py --host 192.168.1.100
Replace
192.168.1.100with your datalogger's IP address. Additional options:# With credentials (if not using default guest access) python vsn_rest_client.py --host 192.168.1.100 --username admin --password mypass # With verbose output (includes raw status data) python vsn_rest_client.py --host 192.168.1.100 -v # With debug logging python vsn_rest_client.py --host 192.168.1.100 --debug # Custom timeout (default: 10s) python vsn_rest_client.py --host 192.168.1.100 --timeout 30
-
Review output:
The script performs a complete diagnostic sequence:
- Socket check - Verifies the device is reachable on port 80 (fast-fail)
- Device discovery - Detects VSN300/VSN700, finds all connected devices (inverters, meters, batteries)
- Data fetching - Retrieves status, livedata, and feeds from all REST API endpoints
- Data normalization - Maps raw VSN points to SunSpec-compatible names with Home Assistant metadata
- State translation - Translates Aurora protocol state codes to human-readable text
Output files are automatically saved in the current directory:
File Content {model}_discovery.jsonDevice discovery results (logger info, connected devices) {model}_status.jsonRaw status endpoint data {model}_livedata.jsonRaw livedata endpoint data {model}_feeds.jsonRaw feeds endpoint data {model}_normalized.jsonNormalized data with SunSpec names and HA metadata Where
{model}isvsn300orvsn700. -
When reporting issues:
- Include the console output showing device detection and any errors
- Attach the generated JSON files (especially
_discovery.jsonand_status.json) - Specify your inverter model and VSN datalogger model
Successful VSN300 detection:
[INFO] Checking socket connectivity to 192.168.1.100:80...
[INFO] Socket connection successful
[INFO] Running device discovery...
[INFO] Attempting /v1/status at http://192.168.1.100
[INFO] Got 401 - checking WWW-Authenticate header for X-Digest
[INFO] Detected VSN300 (X-Digest authentication required)
Successful VSN700 detection:
[INFO] Checking socket connectivity to 192.168.1.100:80...
[INFO] Socket connection successful
[INFO] Running device discovery...
[INFO] Attempting /v1/status at http://192.168.1.100
[INFO] No authentication required (HTTP 200)
[INFO] Detected VSN700 from status structure
Device unreachable:
[INFO] Checking socket connectivity to 192.168.1.100:80...
[ERROR] Socket connection failed: Connection timed out
If you see this, verify the device is powered on and the IP address is correct.
Authentication failure:
[ERROR] Authentication failed for VSN300: invalid credentials
If you see this, verify your credentials and ensure the device is a VSN300/VSN700 datalogger.
VSN data points are mapped to SunSpec-compatible schema using definitions in the mapping/ directory.
The mapping includes:
- Device classification (inverter type, meter, battery, etc.)
- Point name translation (VSN → SunSpec)
- Unit conversions and scaling
- Device class and state class for Home Assistant
- Proper labels and descriptions
For details, see MAPPING_NOTES.md.
The integration includes complete translations for entity names in 10 European languages:
- 🇬🇧 English (
en.json) - 246 sensors - 🇮🇹 Italian (
it.json) - 246 sensors - 🇫🇷 French (
fr.json) - 246 sensors - 🇪🇸 Spanish (
es.json) - 246 sensors - 🇵🇹 Portuguese (
pt.json) - 246 sensors - 🇩🇪 German (
de.json) - 246 sensors - 🇸🇪 Swedish (
sv.json) - 246 sensors - 🇳🇴 Norwegian (
nb.json) - 246 sensors - 🇫🇮 Finnish (
fi.json) - 246 sensors - 🇪🇪 Estonian (
et.json) - 246 sensors
The integration automatically uses the language configured in your Home Assistant instance. All UI strings, error messages, configuration flows, and entity names are fully translated.
Want to add a new language or improve existing translations? Here's how:
For Entity Names (246 sensors in entity.sensor section):
-
Fork the repository
-
Copy
translations/en.jsontotranslations/[language_code].json- Use ISO 639-1 language codes (e.g.,
nlfor Dutch,dafor Danish)
- Use ISO 639-1 language codes (e.g.,
-
Translate the
entity.sensorsection:"entity": { "sensor": { "watts": { "name": "Your Translation Here" }, "dc_voltage_1": { "name": "Your Translation Here" }, ... } }
-
Keep the
configandoptionssections fromen.json(or translate those too!) -
Test with your Home Assistant instance (set HA language to your new language)
-
Submit a pull request
Translation Tips:
- Maintain technical accuracy (e.g., "Power AC" should remain related to AC power)
- Keep translations concise (they appear in entity names)
- Preserve measurement context (e.g., distinguish "Voltage DC - String 1" from "Voltage AC")
- Review existing languages for consistency
Questions? Open a GitHub Discussion - the community is happy to help!
See translations/ for existing translations.
See CLAUDE.md for development guidelines and architecture details.
custom_components/abb_fimer_pvi_vsn_rest/
├── __init__.py # Integration entry point
├── config_flow.py # UI configuration
├── coordinator.py # Data update coordinator
├── sensor.py # Sensor platform
├── const.py # Constants and state mappings
├── manifest.json # Integration manifest
├── translations/ # Entity name translations (10 languages)
│ ├── de.json # German
│ ├── en.json # English
│ ├── es.json # Spanish
│ ├── et.json # Estonian
│ ├── fi.json # Finnish
│ ├── fr.json # French
│ ├── it.json # Italian
│ ├── nb.json # Norwegian Bokmål
│ ├── pt.json # Portuguese
│ └── sv.json # Swedish
└── abb_fimer_vsn_rest_client/ # Client library
├── __init__.py # Library exports
├── client.py # REST API client
├── auth.py # Authentication (VSN300/VSN700)
├── discovery.py # VSN model and device discovery
├── normalizer.py # VSN→SunSpec data normalization
├── mapping_loader.py # Mapping file loader
├── models.py # Data models
├── utils.py # Helper utilities
├── exceptions.py # Custom exceptions
└── data/ # Client library resources
└── vsn-sunspec-point-mapping.json # VSN→SunSpec mapping (253 points)
- ha-abb-powerone-pvi-sunspec Legacy v4.x integration (Modbus only)
- Issues: GitHub Issues
- Discussions: GitHub Discussions
This project is licensed under the MIT License - see the LICENSE file for details.
Developed by Alessandro Del Prete
SunSpec model definitions from SunSpec Models Repository (Apache-2.0 license)
Contributions are welcome! Please follow these steps:
- Fork the repository
- Create a feature branch (
git checkout -b feature/my-feature) - Make your changes
- Run linting:
pre-commit run --all-files - Commit your changes (
git commit -m "feat: add my feature") - Push to your branch (
git push origin feature/my-feature) - Open a Pull Request
Please ensure all CI checks pass before requesting a review.
If you like this integration, I'll gladly accept some quality coffee, but please don't feel obliged. :)