Device Profiles
What Are Device Profiles?
Device profiles are standardized interfaces that define a common set of telemetry, properties, commands, and alerts for a particular type of device. When your blueprint implements a profile, the Enapter EMS knows how to treat your device in a unified way — enabling cross-device dashboards, automation rules, and interoperability.
For example, all power inverters share common characteristics like AC voltage, current, and power output. A profile for power inverters defines these common attributes, so any inverter blueprint that implements the profile will automatically work with inverter-specific dashboards and rules.
Benefits of Using Profiles
- Unified dashboards — Devices implementing the same profile share common dashboard widgets.
- Rule engine compatibility — Automation rules can target any device implementing a specific profile, regardless of the manufacturer.
- Interoperability — Different devices that implement the same profile can be swapped without changing automation rules.
Available Profiles
Enapter profiles are published on GitHub: https://github.com/Enapter/profiles.
Using Profiles
- Choose the most suitable profile. As an example we'll take a single-phase inverter:
blueprint_spec: profile/1.0
display_name: Single-Phase Battery Inverter
description: A single-phase battery inverter profile combining all relevant capabilities
implements:
- lib.device.nameplate
- lib.energy.battery.electrical
- lib.energy.battery.nameplate
- lib.energy.battery.soc
- lib.energy.inverter.ac.1_phase
- lib.energy.inverter.ac.power
- lib.energy.inverter.grid.power
- lib.energy.inverter.load.power
- lib.energy.inverter.nameplate
- lib.energy.inverter.status
- Mention it in the
implementsfield at the top level of your manifest:
blueprint_spec: device/3.0
display_name: My Inverter
description: Battery inverter integration.
icon: enapter-inverter-battery
implements:
- enapter.battery_inverter.1_phase
runtime:
type: lua
options:
file: main.lua
# ... rest of the manifest
- Ensure that your device manifest satisfies the implemented profile
Now, you need to adjust your device manifest so that it can implement the chosen profile. Let's see how to do it looking at these two components:
blueprint_spec: profile/1.0
display_name: Device Nameplate
description: Includes typical nameplate information like vendor, model, and serial number.
properties:
serial_number:
display_name: Serial Number
type: string
description: Unique serial number of the device.
# ... rest of the component
blueprint_spec: profile/1.0
display_name: Battery State of Charge
description: Implements the state of charge for a battery.
telemetry:
battery_soc:
display_name: State of Charge
type: float
unit: "%"
description: Battery state of charge percentage.
You can either:
- directly match the profile, i.e. set the same names as in the implemented profile
- leave arbitrary names, but mention which profile component they implement
- Direct profile match
- Mapping profile component
Here names are exactly the same as in the profile.
blueprint_spec: device/3.0
display_name: My Battery Inverter
description: Battery inverter integration.
icon: enapter-inverter-battery
implements:
- enapter.battery_inverter.1_phase
runtime:
type: lua
options:
file: main.lua
properties:
serial_number:
display_name: Serial Number
type: string
description: Unique serial number of the device.
telemetry:
battery_soc:
display_name: State of Charge
type: float
unit: "%"
description: Battery state of charge percentage.
# ... rest of the manifest
Don't forget to change property/telemetry metric/command names in a corresponding Lua script.
Here arbitrary names are used among with implemented field from the profile.
blueprint_spec: device/3.0
display_name: My Battery Inverter
description: Battery inverter integration.
icon: enapter-inverter-battery
implements:
- enapter.battery_inverter.1_phase
runtime:
type: lua
options:
file: main.lua
properties:
serial_num:
display_name: Serial Number
type: string
description: Unique serial number of the device.
implements:
- lib.device.nameplate.serial_number
telemetry:
charge_state:
display_name: State of Charge
type: float
unit: "%"
description: Battery state of charge percentage.
implements:
- enapter.battery_inverter.1_phase.soc.battery_soc
# ... rest of the manifest