iobroker.sun2000
Version:
412 lines (402 loc) • 13.2 kB
JavaScript
const { deviceType, driverClasses, dataRefreshRate, dataType } = require(`${__dirname}/../types.js`);
const DriverBase = require(`${__dirname}/driver_base.js`);
class SmartLogger extends DriverBase {
constructor(stateInstance, inverter, options) {
super(stateInstance, inverter, {
name: 'smartLogger',
driverClass: driverClasses.logger,
...options,
});
//https://github.com/ioBroker/ioBroker.docs/blob/master/docs/en/dev/stateroles.md
const newFields = [
{
address: 40007,
length: 1,
info: 'Smart Logger DST State',
refresh: dataRefreshRate.low,
states: [
{
state: { id: 'slogger.DSTState', name: 'DST State', type: 'number', unit: '', role: 'value', desc: 'reg:40007, len:1' },
register: { reg: 40007, type: dataType.uint16 },
},
],
},
{
address: 40206,
length: 2,
info: 'Smart Logger running Inverters',
refresh: dataRefreshRate.low,
states: [
{
state: {
id: 'slogger.runningInverters',
name: 'Quantity of running PV inverters',
type: 'number',
unit: '',
role: 'value',
desc: 'reg:40206, len:1',
},
register: { reg: 40206, type: dataType.uint16 },
},
{
state: {
id: 'slogger.runningESSPCSs',
name: 'Quantity of running ESS PCSs',
type: 'number',
unit: 'V',
role: 'value',
desc: 'reg:40207, len:1',
},
register: { reg: 40207, type: dataType.uint16 },
},
],
},
{
address: 42256,
length: 1,
info: 'Smart Logger working mode',
refresh: dataRefreshRate.low,
states: [
{
state: { id: 'slogger.workingMode', name: 'Working Mode', type: 'number', unit: '', role: 'value', desc: 'reg:42256, len:1' },
register: { reg: 42256, type: dataType.uint16 },
},
],
},
];
this.registerFields.push.apply(this.registerFields, newFields);
//this.postUpdateHooks.push.apply(this.postUpdateHooks,newHooks);
}
}
class SmartLoggerMeter extends DriverBase {
constructor(stateInstance, inverter, options) {
super(stateInstance, inverter, {
name: 'smartLoggerMeter',
driverClass: driverClasses.loggerMeter,
...options,
});
this._testMode = false;
//this._testMode = (this._modbusId == 1);
//https://github.com/ioBroker/ioBroker.docs/blob/master/docs/en/dev/stateroles.md
const newFields = [
{
address: 32260,
length: 105,
info: 'SLogger meter info',
refresh: dataRefreshRate.high,
type: deviceType.meter,
states: [
{
state: { id: 'meter.voltageL1', name: 'Phase 1 voltage', type: 'number', unit: 'V', role: 'value.voltage', desc: 'reg:32260, len:2' },
register: { reg: 32260, type: dataType.uint32, gain: 100 },
},
{
state: { id: 'meter.voltageL2', name: 'Phase 2 voltage', type: 'number', unit: 'V', role: 'value.voltage', desc: 'reg:32262, len:2' },
register: { reg: 32262, type: dataType.uint32, gain: 100 },
},
{
state: { id: 'meter.voltageL3', name: 'Phase 3 voltage', type: 'number', unit: 'V', role: 'value.voltage', desc: 'reg:32264, len:2' },
register: { reg: 32264, type: dataType.uint32, gain: 100 },
},
{
state: { id: 'meter.currentL1', name: 'Phase 1 current', type: 'number', unit: 'A', role: 'value.current', desc: 'reg:32272, len:2' },
register: { reg: 32272, type: dataType.int32, gain: 10 },
},
{
state: { id: 'meter.currentL2', name: 'Phase 2 current', type: 'number', unit: 'A', role: 'value.current', desc: 'reg:32274, len:2' },
register: { reg: 32274, type: dataType.int32, gain: 10 },
},
{
state: { id: 'meter.currentL3', name: 'Phase 3 current', type: 'number', unit: 'A', role: 'value.current', desc: 'reg:32276, len:2' },
register: { reg: 32276, type: dataType.int32, gain: 10 },
},
{
state: {
id: 'meter.activePower',
name: 'Active power',
type: 'number',
unit: 'kW',
role: 'value.power.active',
desc: 'reg:32278, len:2 (>0: feed-in to grid. <0: supply from grid.)',
},
register: { reg: 32278, type: dataType.int32, gain: 1000 },
},
{
state: {
id: 'meter.derived.signConventionForPowerFeed-in',
name: 'Sign convention for power feed-in',
type: 'number',
unit: '',
role: 'value',
desc: '1 : positive value indicates that energy is being supplied to the grid, -1 : positive value indicates that energy is being consumed from the grid',
},
},
{
state: {
id: 'meter.derived.feed-inPower',
name: 'feed-in power',
type: 'number',
unit: 'kW',
role: 'value.power.active',
desc: 'Power to grid',
},
},
{
state: {
id: 'meter.reactivePower',
name: 'Reactive power',
type: 'number',
unit: 'VAr',
role: 'value.power.reactive',
desc: 'reg:32280, len:2',
},
register: { reg: 32280, type: dataType.int32 },
},
{
state: { id: 'meter.powerFactor', name: 'Power factor', type: 'number', unit: '', role: 'value', desc: 'reg:32284, len:1' },
register: { reg: 32284, type: dataType.int16, gain: 1000 },
},
{
state: { id: 'meter.voltageL1-L2', name: 'Voltage L1-L2', type: 'number', unit: 'V', role: 'value.voltage', desc: 'reg:32266 , len:2' },
register: { reg: 32266, type: dataType.uint32, gain: 100 },
},
{
state: {
id: 'meter.voltageL2-L3',
name: 'Voltage L2-L3',
type: 'number',
unit: 'V',
role: 'value.voltage',
desc: 'reg:32268 , len:2',
},
register: { reg: 32268, type: dataType.uint32, gain: 100 },
},
{
state: { id: 'meter.voltageL3-L1', name: 'Voltage L3-L1', type: 'number', unit: 'V', role: 'value.voltage', desc: 'reg:32270, len:2' },
register: { reg: 32270, type: dataType.uint32, gain: 100 },
},
{
state: {
id: 'meter.activePowerL1',
name: 'Active power L1',
type: 'number',
unit: 'kW',
role: 'value.power',
desc: 'reg:32335, len:2',
},
register: { reg: 32335, type: dataType.int32, gain: 1000 },
},
{
state: {
id: 'meter.activePowerL2',
name: 'Active power L2',
type: 'number',
unit: 'kW',
role: 'value.power',
desc: 'reg:32337, len:2',
},
register: { reg: 32337, type: dataType.int32, gain: 1000 },
},
{
state: {
id: 'meter.activePowerL3',
name: 'Active power L3',
type: 'number',
unit: 'kW',
role: 'value.power',
desc: 'reg:32339, len:2',
},
register: { reg: 32339, type: dataType.int32, gain: 1000 },
},
{
state: {
id: 'meter.positiveActiveEnergy',
name: 'Positive active anergy',
type: 'number',
unit: 'kWh',
role: 'value.power.consumption',
desc: 'reg:32357, len:4',
},
register: { reg: 32357, type: dataType.int64, gain: 100 },
},
{
state: {
id: 'meter.reverseActiveEnergy',
name: 'Reverse active anergy',
type: 'number',
unit: 'kWh',
role: 'value.power.consumption',
desc: 'reg:32349, len:4',
},
register: { reg: 32349, type: dataType.int64, gain: 100 },
},
{
state: {
id: 'meter.accumulatedReactivePower',
name: 'Accumulated reactive power',
type: 'number',
unit: 'kVarh',
role: 'value.power.reactive.consumption',
desc: 'reg:32361, len:4',
},
register: { reg: 32361, type: dataType.int64, gain: 100 },
},
],
postHook: () => {
this.stateCache.set(`meter.derived.signConventionForPowerFeed-in`, 1, { type: 'number' });
const activePower = this.stateCache.get('meter.activePower')?.value ?? 0;
this.stateCache.set('meter.derived.feed-inPower', activePower, { type: 'number' });
},
},
];
const newTestFields = [
{
address: 37100,
length: 38,
info: 'Test SLogger meter info',
refresh: dataRefreshRate.high,
type: deviceType.meter,
states: [
{
state: { id: 'meter.voltageL1', name: 'Phase 1 voltage', type: 'number', unit: 'V', role: 'value.voltage', desc: 'reg:37101, len:2' },
register: { reg: 37101, type: dataType.int32, gain: 10 },
},
{
state: { id: 'meter.voltageL2', name: 'Phase 2 voltage', type: 'number', unit: 'V', role: 'value.voltage', desc: 'reg:37103, len:2' },
register: { reg: 37103, type: dataType.int32, gain: 10 },
},
{
state: { id: 'meter.voltageL3', name: 'Phase 3 voltage', type: 'number', unit: 'V', role: 'value.voltage', desc: 'reg:37105, len:2' },
register: { reg: 37105, type: dataType.int32, gain: 10 },
},
{
state: { id: 'meter.currentL1', name: 'Phase 1 current', type: 'number', unit: 'A', role: 'value.current', desc: 'reg:37107, len:2' },
register: { reg: 37107, type: dataType.int32, gain: 100 },
},
{
state: { id: 'meter.currentL2', name: 'Phase 2 current', type: 'number', unit: 'A', role: 'value.current', desc: 'reg:37109, len:2' },
register: { reg: 37109, type: dataType.int32, gain: 100 },
},
{
state: { id: 'meter.currentL3', name: 'Phase 3 current', type: 'number', unit: 'A', role: 'value.current', desc: 'reg:37111, len:2' },
register: { reg: 37111, type: dataType.int32, gain: 100 },
},
{
state: {
id: 'meter.activePower',
name: 'Active power',
type: 'number',
unit: 'kW',
role: 'value.power.active',
desc: 'reg:37113, len:2 (>0: feed-in to grid. <0: supply from grid.)',
},
register: { reg: 37113, type: dataType.int32, gain: 1000 },
},
{
state: {
id: 'meter.reactivePower',
name: 'Reactive power',
type: 'number',
unit: 'VAr',
role: 'value.power.reactive',
desc: 'reg:37115, len:2',
},
register: { reg: 37115, type: dataType.int32 },
},
{
state: { id: 'meter.powerFactor', name: 'Power factor', type: 'number', unit: '', role: 'value', desc: 'reg:37117, len:1' },
register: { reg: 37117, type: dataType.int16, gain: 1000 },
},
{
state: {
id: 'meter.positiveActiveEnergy',
name: 'Positive active energy',
type: 'number',
unit: 'kWh',
role: 'value.power.consumption',
desc: 'reg:37119, len:2',
},
register: { reg: 37119, type: dataType.int32, gain: 100 },
},
{
state: {
id: 'meter.reverseActiveEnergy',
name: 'Reverse active energy',
type: 'number',
unit: 'kWh',
role: 'value.power.consumption',
desc: 'reg:37121, len:2',
},
register: { reg: 37121, type: dataType.int32, gain: 100 },
},
{
state: {
id: 'meter.accumulatedReactivePower',
name: 'Accumulated reactive power',
type: 'number',
unit: 'kVarh',
role: 'value.power.reactive.consumption',
desc: 'reg:37123, len:2',
},
register: { reg: 37123, type: dataType.int32, gain: 100 },
},
{
state: { id: 'meter.voltageL1-L2', name: 'Voltage L1-L2', type: 'number', unit: 'V', role: 'value.voltage', desc: 'reg:37126, len:2' },
register: { reg: 37126, type: dataType.int32, gain: 10 },
},
{
state: { id: 'meter.voltageL2-L3', name: 'Voltage L2-L3', type: 'number', unit: 'V', role: 'value.voltage', desc: 'reg:37128, len:2' },
register: { reg: 37128, type: dataType.int32, gain: 10 },
},
{
state: { id: 'meter.voltageL3-L1', name: 'Voltage L3-L1', type: 'number', unit: 'V', role: 'value.voltage', desc: 'reg:37130, len:2' },
register: { reg: 37130, type: dataType.int32, gain: 10 },
},
{
state: {
id: 'meter.activePowerL1',
name: 'Active power L1',
type: 'number',
unit: 'A',
role: 'value.current',
desc: 'reg:37132, len:2',
},
register: { reg: 37132, type: dataType.int32 },
},
{
state: {
id: 'meter.activePowerL2',
name: 'Active power L2',
type: 'number',
unit: 'A',
role: 'value.current',
desc: 'reg:37134, len:2',
},
register: { reg: 37134, type: dataType.int32 },
},
{
state: {
id: 'meter.activePowerL3',
name: 'Active power L3',
type: 'number',
unit: 'A',
role: 'value.current',
desc: 'reg:37136, len:2',
},
register: { reg: 37136, type: dataType.int32 },
},
],
postHook: path => {
this.stateCache.set(`${path}meter.derived.directionOfPowerFlow`, 0, { type: 'number' });
},
},
];
if (this._testMode) {
this.registerFields.push.apply(this.registerFields, newTestFields);
} else {
this.registerFields.push.apply(this.registerFields, newFields);
}
//this.postUpdateHooks.push.apply(this.postUpdateHooks,newHooks);
}
}
module.exports = { SmartLogger, SmartLoggerMeter };