iobroker.opendtu
Version:
Adapter for the OpenDTU project
561 lines (559 loc) • 14.3 kB
JavaScript
const pad2 = require('./tools').pad2;
const stateDefinition = {
reachable: {
id: 'available',
name: 'Available',
role: 'indicator.connected',
write: false,
read: true,
type: 'boolean',
def: false,
},
name: {
id: 'name',
name: 'Name as configured (WebGUI)',
role: 'info.name',
write: false,
read: true,
type: 'string',
def: '',
},
serial: {
id: 'serial',
name: 'Serial number',
role: 'info.serial',
write: false,
read: true,
type: 'string',
def: '',
},
bootloaderversion: {
id: 'bootloaderversion',
name: 'Bootloader version',
role: 'state',
write: false,
read: true,
type: 'string',
def: '',
},
fwbuildversion: {
id: 'fwbuildversion',
name: 'Firmware version',
role: 'state',
write: false,
read: true,
type: 'string',
def: '',
},
fwbuilddatetime: {
id: 'fwbuilddatetime',
name: 'Build date / time',
role: 'state',
write: false,
read: true,
type: 'string',
def: '',
},
hwpartnumber: {
id: 'hwpartnumber',
name: 'Hardware part number',
role: 'state',
write: false,
read: true,
type: 'number',
def: 0,
getter: x => Number(x),
},
hwversion: {
id: 'hwversion',
name: 'Hardware version',
role: 'state',
write: false,
read: true,
type: 'string',
def: '',
},
producing: {
id: 'producing',
name: 'Indicates whether is producing AC power',
role: 'state',
write: false,
read: true,
type: 'boolean',
def: false,
},
data_age: {
id: 'last_update',
name: 'Unix timestamp of last statistics udpate',
role: 'state',
write: false,
read: true,
type: 'string',
def: '',
getter: x => {
const date = new Date(Number(new Date()) - x * 1000);
date.setMinutes(date.getMinutes() - date.getTimezoneOffset());
return date.toISOString().replace('T', ' ').split('.')[0];
},
},
// PowerControl
limit_relative: {
id: 'power_control.current_limit_relative',
name: 'Current applied production limit',
role: 'state',
write: false,
read: true,
type: 'number',
unit: '%',
def: 0,
getter: x => Number(x),
},
limit_absolute: {
id: 'power_control.current_limit_absolute',
name: 'Current applied production limit',
role: 'state',
write: false,
read: true,
type: 'number',
unit: 'W',
min: -1,
def: -1,
getter: x => Number(x),
},
limit_persistent_relative: {
id: 'power_control.limit_persistent_relative',
name: 'Set limit as a percentage of total production capability',
role: 'state',
write: true,
read: true,
type: 'number',
unit: '%',
min: 0,
max: 100,
def: 0,
getter: x => Number(x),
},
limit_persistent_absolute: {
id: 'power_control.limit_persistent_absolute',
name: 'Set limit as a absolute value',
role: 'state',
write: true,
read: true,
type: 'number',
unit: 'W',
min: 0,
def: 0,
getter: x => Number(x),
},
limit_nonpersistent_relative: {
id: 'power_control.limit_nonpersistent_relative',
name: 'Set limit as a percentage of total production capability',
role: 'state',
write: true,
read: true,
type: 'number',
unit: '%',
min: 0,
max: 100,
def: 0,
getter: x => Number(x),
},
limit_nonpersistent_absolute: {
id: 'power_control.limit_nonpersistent_absolute',
name: 'Set limit as a absolute value',
role: 'state',
write: true,
read: true,
type: 'number',
unit: 'W',
min: 0,
def: 0,
getter: x => Number(x),
},
// 'power_switch': {
// id: 'power_control.power_switch',
// name: 'Turn the inverter on or off',
// role: 'state',
// write: true,
// read: true,
// type: 'boolean',
// def: true,
// getter: x => x == 1,
// setter: x => x ? '1' : '0',
// },
power_on: {
id: 'power_control.power_on',
name: 'Start',
role: 'button',
write: true,
read: true,
type: 'boolean',
def: true,
},
power_off: {
id: 'power_control.power_off',
name: 'Shutdown',
role: 'button',
write: true,
read: true,
type: 'boolean',
def: true,
},
restart: {
id: 'power_control.restart',
name: 'Restart (also resets YieldDay)',
role: 'button',
write: true,
read: true,
type: 'boolean',
def: true,
setter: x => (x ? '1' : '0'),
},
// AC
ac_temperature: {
id: 'temperature',
name: 'Device temperature',
role: 'value.temperature',
write: false,
read: true,
type: 'number',
unit: '°C',
def: 0,
getter: x => Number(x.v.toFixed(x.d)),
},
ac_power: {
id: 'ac.phase_%count%.power',
name: 'AC active power',
role: 'value.power',
write: false,
read: true,
type: 'number',
unit: 'W',
def: 0,
getter: x => Number(x.v.toFixed(x.d)),
},
ac_voltage: {
id: 'ac.phase_%count%.voltage',
name: 'AC voltage',
role: 'value.voltage',
write: false,
read: true,
type: 'number',
unit: 'V',
def: 0,
getter: x => Number(x.v.toFixed(x.d)),
},
ac_current: {
id: 'ac.phase_%count%.current',
name: 'AC current',
role: 'value.current',
write: false,
read: true,
type: 'number',
unit: 'A',
def: 0,
getter: x => Number(x.v.toFixed(x.d)),
},
'ac_power dc': {
id: 'ac.phase_%count%.power_dc',
name: 'DC power',
role: 'value.power',
write: false,
read: true,
type: 'number',
unit: 'W',
def: 0,
getter: x => Number(x.v.toFixed(x.d)),
},
// 'ac_yieldday': {
// id: 'ac.phase_%count%.yieldday',
// name: 'Energy converted to AC per day in watt hours',
// role: 'value.power.production',
// write: false,
// read: true,
// type: 'number',
// unit: 'Wh',
// def: 0,
// getter: x => Number(x.v.toFixed(x.d)),
// },
// 'ac_yieldtotal': {
// id: 'ac.phase_%count%.yieldtotal',
// name: 'Energy converted to AC since reset watt hours',
// role: 'value.power.production',
// write: false,
// read: true,
// type: 'number',
// unit: 'kWh',
// def: 0,
// getter: x => Number(x.v.toFixed(x.d)),
// },
// 'ac_efficiency': {
// id: 'ac.phase_%count%.efficiency',
// name: 'Ratio AC Power over DC Power in percent',
// role: 'state',
// write: false,
// read: true,
// type: 'number',
// unit: '',
// def: 0,
// getter: x => Number(x.v.toFixed(x.d)),
// },
ac_frequency: {
id: 'ac.phase_%count%.frequency',
name: 'AC frequency',
role: 'state',
write: false,
read: true,
type: 'number',
unit: 'Hz',
def: 0,
getter: x => Number(x.v.toFixed(x.d)),
},
ac_powerfactor: {
id: 'ac.phase_%count%.powerfactor',
name: 'Power factor',
role: 'state',
write: false,
read: true,
type: 'number',
unit: '',
def: 0,
getter: x => Number(x.v.toFixed(x.d)),
},
ac_reactivepower: {
id: 'ac.phase_%count%.reactivepower',
name: 'AC reactive power',
role: 'value.power.reactive',
write: false,
read: true,
type: 'number',
unit: 'var',
def: 0,
getter: x => Number(x.v.toFixed(x.d)),
},
// DC
dc_name: {
id: 'dc.input_%count%.name',
name: 'Name of the input (WebGUI)',
role: 'info.name',
write: false,
read: true,
type: 'string',
def: '',
getter: x => x.u,
},
dc_power: {
id: 'dc.input_%count%.power',
name: 'DC power',
role: 'value.power',
write: false,
read: true,
type: 'number',
unit: 'W',
def: 0,
getter: x => Number(x.v.toFixed(x.d)),
},
dc_voltage: {
id: 'dc.input_%count%.voltage',
name: 'DC voltage',
role: 'value.voltage',
write: false,
read: true,
type: 'number',
unit: 'V',
def: 0,
getter: x => Number(x.v.toFixed(x.d)),
},
dc_current: {
id: 'dc.input_%count%.current',
name: 'DC current',
role: 'value.current',
write: false,
read: true,
type: 'number',
unit: 'A',
def: 0,
getter: x => Number(x.v.toFixed(x.d)),
},
dc_yieldday: {
id: 'dc.input_%count%.yieldday',
name: 'Energy converted to AC per day',
role: 'value.power.production',
write: false,
read: true,
type: 'number',
unit: 'Wh',
def: 0,
getter: x => Number(x.v.toFixed(x.d)),
},
dc_yieldtotal: {
id: 'dc.input_%count%.yieldtotal',
name: 'Energy converted to AC since commissioning',
role: 'value.power.production',
write: false,
read: true,
type: 'number',
unit: 'kWh',
def: 0,
getter: x => Number(x.v.toFixed(x.d)),
},
dc_irradiation: {
id: 'dc.input_%count%.irradiation',
name: 'Ratio DC power over set maximum power (WebGUI)',
role: 'state',
write: false,
read: true,
type: 'number',
unit: '%',
def: 0,
getter: x => Number(x.v.toFixed(x.d)),
},
// INV
inv_temperature: {
id: 'temperature',
name: 'Device temperature',
role: 'value.temperature',
write: false,
read: true,
type: 'number',
unit: '°C',
def: 0,
getter: x => Number(x.v.toFixed(x.d)),
},
inv_yieldday: {
id: 'yieldday',
name: 'Energy converted to AC per day',
role: 'value.power.production',
write: false,
read: true,
type: 'number',
unit: 'Wh',
def: 0,
getter: x => Number(x.v.toFixed(x.d)),
},
inv_yieldtotal: {
id: 'yieldtotal',
name: 'Energy converted to AC since commissioning',
role: 'value.power.production',
write: false,
read: true,
type: 'number',
unit: 'kWh',
def: 0,
getter: x => Number(x.v.toFixed(x.d)),
},
inv_efficiency: {
id: 'efficiency',
name: 'Ratio AC power over DC power',
role: 'state',
write: false,
read: true,
type: 'number',
unit: '%',
def: 0,
getter: x => Number(x.v.toFixed(x.d)),
},
'inv_power dc': {
id: 'power_dc',
name: 'DC power',
role: 'value.power',
write: false,
read: true,
type: 'number',
unit: 'W',
def: 0,
getter: x => Number(x.v.toFixed(x.d)),
},
// Total
total_power: {
id: 'power',
name: 'Total power over all inverters',
role: 'value.power',
write: false,
read: true,
type: 'number',
unit: 'W',
def: 0,
getter: x => Number(x.v.toFixed(x.d)),
},
total_yieldday: {
id: 'yieldday',
name: 'Total energy converted to AC per day',
role: 'value.power.production',
write: false,
read: true,
type: 'number',
unit: 'Wh',
def: 0,
getter: x => Number(x.v.toFixed(x.d)),
},
total_yieldtotal: {
id: 'yieldtotal',
name: 'Total energy converted to AC since commissioning',
role: 'value.power.production',
write: false,
read: true,
type: 'number',
unit: 'kWh',
def: 0,
getter: x => Number(x.v.toFixed(x.d)),
},
// DTU
dtu_reachable: {
id: 'available',
name: 'Available',
role: 'indicator.reachable',
write: false,
read: true,
type: 'boolean',
def: false,
},
dtu_hostname: {
id: 'hostname',
name: 'Current hostname of the DTU (WebGUI)',
role: 'info.name ',
write: false,
read: true,
type: 'string',
def: '',
},
dtu_uptime: {
id: 'uptime',
name: 'Time since startup',
role: 'state',
write: false,
read: true,
type: 'string',
def: '0',
getter: x => {
const seconds = pad2(Math.trunc(x % 60));
const miutes = pad2(Math.trunc((x / 60) % 60));
const houres = pad2(Math.trunc((x / 60 / 60) % 24));
const days = Math.trunc(x / 60 / 60 / 24);
return `${days} Days ${houres}:${miutes}:${seconds}`;
},
},
dtu_sta_rssi: {
id: 'rssi',
name: 'WiFi network quality',
role: 'state',
write: false,
read: true,
unit: 'db',
type: 'number',
def: 0,
getter: x => Number(x),
},
dtu_network_ip: {
id: 'ip',
name: 'IP address of OpenDTU',
role: 'info.ip',
write: false,
read: true,
type: 'string',
def: '0.0.0.0',
},
};
module.exports = {
stateDefinition: stateDefinition,
};