rscp-client v0.1.2
rscp-client - a NodeJS client library for E3/DC devices using the RSCP protocol
Query and control your E3/DC device using the RSCP protocol. A low-level and a high-level interface are provided. The low-level interface is powerful but requires knowledge of the individual RSCP tags. The high-level interface is easier to use, but only a limited subset of the functionality is supported.
Usage
A simple session to query the device's serial number using the high-level interface could look like this:
import { RscpClient } from 'rscp-client';
const client = await RscpClient.connect({
host: '192.168.227.220', // IP address (or hostname) of the E3/DC device
aes_password: 'rscp_password', // RSCP password as configured in the E3/DC device
});
const auth_level = await client.authenticate(
'portaluser@example.com', // user name as used in E3/DC portal
'portal_password', // associated password
);
const serial_number = await client.getSerialNumber();
await client.close();
The auth_level
is either 0, if the authentication failed, or 10, if the authentication was
successful for a normal user. (Users with advanced priviledges will get an even higher
auth_level
.)
The same could be achieved using the low level interface:
import {
RscpClient,
RscpTag,
RscpContainerValue,
RscpNoneValue,
RscpStringValue,
} from 'rscp-client';
const client = await RscpClient.connect({
host: '192.168.227.220', // IP address (or hostname) of the E3/DC device
aes_password: 'rscp_password', // RSCP password as configured in the E3/DC device
});
const auth_result = await client.send([
new RscpContainerValue(RscpTag.RSCP_REQ_AUTHENTICATION, [
new RscpStringValue(RscpTag.RSCP_AUTHENTICATION_USER, 'portaluser@example.com'),
new RscpStringValue(RscpTag.RSCP_AUTHENTICATION_PASSWORD, 'portal_password'),
]),
]);
const auth_level = auth_result[0].value;
const serial_number_result = await client.send([
new RscpNoneValue(RscpTag.INFO_REQ_SERIAL_NUMBER),
]);
const serial_number = serial_number_result[0].value;
await client.close();
Note that the raw results obtained from client.send
should be checked to have the expected
length, tag, and type; see below.
High-level and low-level operations can be mixed freely, so that supported operations can (and should) use the high-level interface, while operations not (yet) supported can be accessed using the low-level interface.
Reference
Connection management
RscpClient.connect({ host: string, aes_password: string }): Promise<RscpClient>
Connects to the E3/DC device host
(IP address or hostname) and uses aes_password
(configured as RSCP password in the E3/DC device) for encryption. Returns a promise
that resolves to an RscpClient
instance or rejects if no connection could be established.
Note that a wrong aes_password
will not result in an error at this stage as no data
is actually transferred, yet.
client.close(): Promise<void>
Closes the connection. No requests are possbile after calling close
. Note that not
calling close
will keep the node process from terminating.
High-level requests
client.authenticate(user: string, password: string): Promise<number>
Send an autnetication request using the given user name and password. (The same as used to log in to the portal.) Resolves to the obtained user level: 0 for failed authentication, 10 for normal user, higher numbers for users with elevated privileges (e.g. installer).
client.getPVPower(): Promise<number>
Requests and resolves to the power (in Watt) currently delivered by the PV.
client.getBatteryChargePower(): Promise<number>
Requests and resolves to the power (in Watt) the battery in currently charged at. Negative values indicate discharging.
client.getHomeConsumptionPower(): Promise<number>
Requests and resolves to the power (in Watt) currently consumed, excluding wallboxes.
client.getFromGridPower(): Promise<number>
Requests and resolves to the power (in Watt) currently withdrawn from the grid. Negative values indicate feeding into the grid.
client.getAdditionalPower(): Promise<number>
Requests and resolves to the power (in Watt) currently delivered by additional sources.
client.getAutarkyPercentage(): Promise<number>
Requests and resolves to current autarky level in percent.
client.getSelfConsumptionPercentage(): Promise<number>
Requests and resolves to current percentage of produced power consumed instead of fed into the grid.
client.getBatterySOCPercentage(): Promise<number>
Requests and resolves to current battery state of charge in percent.
client.getWallboxPower(): Promise<number>
Requests and resolves to the power (in Watt) currently delivered to the wallbox.
client.getWallboxSolarPower(): Promise<number>
Requests and resolves to solar part of the power (in Watt) currently delivered to the wallbox.
client.getSerialNumber(): Promise<string>
Requests and resolves to the device's serial number.
client.getProductionDate(): Promise<string>
Requests and resolves to the device's production date.
client.getModuleSoftwareVersions(): Promise<{ module: string; version: string }[]>
Requests and resolves to the versions of the device's individual software modules.
client.getIPAddress(): Promise<string>
Requests and resolves to the device's IP address, which should usually equal the IP address used when connecting.
client.getSubnetMask(): Promise<string>
Requests and resolves to the device's subnet mask.
client.getMACAddress(): Promise<string>
Requests and resolves to the device's MAC address.
client.getGateway(): Promise<string>
Requests and resolves to the IP address of the standard network gateway used by the device.
client.getDNS(): Promise<string>
Requests and resolves to the IP address of the DNS server used by the device.
client.getDHCPStatus(): Promise<boolean>
Resolves to true
if the device's network is configured via DHCP, false
otherwise.
client.getTime(): Promise<Temporal.PlainDateTime>
Requests and resolves to the current local date and time of the device. The time has to be
interpreted in the time zone returned by client.getTimeZone()
.
client.getUTCTime(): Promise<Temporal.ZonedDateTime>
Requests and resolves to the current UTC date and time of the device.
client.getTimeZone(): Promise<string>
Requests and resolves to the time zone used by the device.
client.getSoftwareRelease(): Promise<string>
Requests and resolves to the device's software release.
Low-level requests
client.send(values: RscpValue<any>[]): Promise<RscpValue<any>[]>
Sends the provided values
(an array of RscpValue
s) in a single frame and resolves to
the response received (also an array of RscpValue
s).
RscpValue
abstract class RscpValue<ValueType> {
tag: RscpTag;
value: ValueType;
constructor(tag: RscpTag, value: ValueType);
}
Subclasses of RscpValue
combine an RSCP type, a tag, and a value. The type is
encoded in the concrete subclass, which also determines ValueType
, while
the tag and value are available as properties with these names. Unless otherwise
noted, all subclasses share the same constructor
signature. The following subclasses
are available:
subclass | RSCP type | ValueType |
---|---|---|
RscpNoneValue | None | void |
RscpBoolValue | Bool | boolean |
RscpChar8Value | Char8 | number |
RscpUChar8Value | UChar8 | number |
RscpInt16Value | Int16 | number |
RscpUInt16Value | UInt16 | number |
RscpInt32Value | Int32 | number |
RscpUInt32Value | UInt32 | number |
RscpInt64Value | Int64 | bigint |
RscpUInt64Value | UInt64 | bigint |
RscpFloat32Value | Float32 | number |
RscpDouble64Value | Double64 | number |
RscpBitfieldValue | Bitfield | Buffer |
RscpStringValue | String | string |
RscpContainerValue | Container | RscpValue<any>[] |
RscpTimestampValue | Timestamp | { seconds: bigint; nanos: number } |
RscpByteArrayValue | ByteArray | Uint8Array |
RscpErrorValue | Error | RscpError |
The RscpInt64Value
and RscpUInt64Value
constructors accept a bigint
or a number
for
value
. The RscpTimestampValue
constructor also accepts a Date
or the number of
milliseconds in the epoch as a number
.
RscpTag
An enum
of all (as of March 2016) RSCP tags (without the leading TAG_
), e.g. RscpTag.RSCP_REQ_AUTHENTICATION
.
See the RSCP specification.
RscpError
An enum
of the RSCP error codes that can occur in an RscpErrorValue
:
RscpError entry | error code |
---|---|
NOT_HANDLED | 0x01 |
ACCESS_DENIED | 0x02 |
FORMAT | 0x03 |
AGAIN | 0x04 |