homebridge-enphase-envoy 9.19.2-beta.21 → 9.19.2-beta.23
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +10 -0
- package/index.js +1 -1
- package/package.json +2 -2
- package/src/envoydevice.js +559 -81
package/CHANGELOG.md
CHANGED
|
@@ -5,6 +5,16 @@ All notable changes to this project will be documented in this file.
|
|
|
5
5
|
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
|
|
6
6
|
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
|
7
7
|
|
|
8
|
+
## [9.19.2] - (xx.06.2025)
|
|
9
|
+
|
|
10
|
+
## Changes
|
|
11
|
+
|
|
12
|
+
- stability and performance improvements
|
|
13
|
+
- dependencies updated
|
|
14
|
+
- added devicesdata to thr RESTFul
|
|
15
|
+
- redme updated
|
|
16
|
+
- cleanup
|
|
17
|
+
|
|
8
18
|
## [9.19.0] - (04.06.2025)
|
|
9
19
|
|
|
10
20
|
## Changes
|
package/index.js
CHANGED
|
@@ -117,7 +117,7 @@ class EnvoyPlatform {
|
|
|
117
117
|
const emitLog = disableLogInfo ? false : log.info(`Device: ${host} ${deviceName}, ${info}.`);
|
|
118
118
|
})
|
|
119
119
|
.on('debug', (debug, data) => {
|
|
120
|
-
const emitLog =
|
|
120
|
+
const emitLog = enableDebugMode ? false : log.info(`Device: ${host} ${deviceName}, debug: ${data ? `${debug} ${JSON.stringify(data, null, 2)}` : `${debug}.`}`);
|
|
121
121
|
})
|
|
122
122
|
.on('warn', (warn) => {
|
|
123
123
|
const emitLog = disableLogWarn ? false : log.warn(`Device: ${host} ${deviceName}, ${warn}.`);
|
package/package.json
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
"private": false,
|
|
3
3
|
"displayName": "Enphase Envoy",
|
|
4
4
|
"name": "homebridge-enphase-envoy",
|
|
5
|
-
"version": "9.19.2-beta.
|
|
5
|
+
"version": "9.19.2-beta.23",
|
|
6
6
|
"description": "Homebridge plugin for Photovoltaic Energy System manufactured by Enphase.",
|
|
7
7
|
"license": "MIT",
|
|
8
8
|
"author": "grzegorz914",
|
|
@@ -32,7 +32,7 @@
|
|
|
32
32
|
],
|
|
33
33
|
"engines": {
|
|
34
34
|
"homebridge": "^1.9.0 || ^2.0.0 || ^2.0.0-beta.29",
|
|
35
|
-
"node": "^18.20.4 || ^20.15.1 || ^22.7.0 || ^23.2.0"
|
|
35
|
+
"node": "^18.20.4 || ^20.15.1 || ^22.7.0 || ^23.2.0 || ^24.0.0"
|
|
36
36
|
},
|
|
37
37
|
"dependencies": {
|
|
38
38
|
"async-mqtt": "^2.6.3",
|
package/src/envoydevice.js
CHANGED
|
@@ -697,7 +697,12 @@ class EnvoyDevice extends EventEmitter {
|
|
|
697
697
|
enabled: false,
|
|
698
698
|
voltageDivide: 1
|
|
699
699
|
},
|
|
700
|
-
|
|
700
|
+
consumptionNet: {
|
|
701
|
+
supported: false,
|
|
702
|
+
enabled: false,
|
|
703
|
+
voltageDivide: 1
|
|
704
|
+
},
|
|
705
|
+
consumptionTotal: {
|
|
701
706
|
supported: false,
|
|
702
707
|
enabled: false,
|
|
703
708
|
voltageDivide: 1
|
|
@@ -718,6 +723,11 @@ class EnvoyDevice extends EventEmitter {
|
|
|
718
723
|
count: 0
|
|
719
724
|
}
|
|
720
725
|
},
|
|
726
|
+
metersReports: {
|
|
727
|
+
supported: false,
|
|
728
|
+
installed: false,
|
|
729
|
+
count: 0,
|
|
730
|
+
},
|
|
721
731
|
devicesData: {
|
|
722
732
|
supported: false,
|
|
723
733
|
pcus: {
|
|
@@ -880,7 +890,8 @@ class EnvoyDevice extends EventEmitter {
|
|
|
880
890
|
meters: {
|
|
881
891
|
data: [],
|
|
882
892
|
production: {},
|
|
883
|
-
|
|
893
|
+
consumptionNet: {},
|
|
894
|
+
consumptionTotal: {},
|
|
884
895
|
acBatterie: {}
|
|
885
896
|
},
|
|
886
897
|
production: {
|
|
@@ -1889,16 +1900,16 @@ class EnvoyDevice extends EventEmitter {
|
|
|
1889
1900
|
const debug = this.enableDebugMode ? this.emit('debug', `Requesting meters info`) : false;
|
|
1890
1901
|
try {
|
|
1891
1902
|
const response = await this.axiosInstance(ApiUrls.InternalMeterInfo);
|
|
1892
|
-
const
|
|
1893
|
-
const debug = this.enableDebugMode ? this.emit('debug', `Meters:`,
|
|
1903
|
+
const responseData = response.data;
|
|
1904
|
+
const debug = this.enableDebugMode ? this.emit('debug', `Meters:`, responseData) : false;
|
|
1894
1905
|
|
|
1895
1906
|
//meters count
|
|
1896
|
-
const metersSupported =
|
|
1907
|
+
const metersSupported = responseData.length > 0;
|
|
1897
1908
|
if (metersSupported) {
|
|
1898
1909
|
|
|
1899
1910
|
//meters
|
|
1900
1911
|
const arr = [];
|
|
1901
|
-
|
|
1912
|
+
responseData.forEach((meter, index) => {
|
|
1902
1913
|
const measurementType = ApiCodes[meter.measurementType];
|
|
1903
1914
|
const obj = {
|
|
1904
1915
|
eid: meter.eid,
|
|
@@ -1911,66 +1922,97 @@ class EnvoyDevice extends EventEmitter {
|
|
|
1911
1922
|
phaseCount: meter.phaseCount ?? 1,
|
|
1912
1923
|
meteringStatus: ApiCodes[meter.meteringStatus],
|
|
1913
1924
|
statusFlags: (Array.isArray(meter.statusFlags) && (meter.statusFlags).length > 0) ? ((meter.statusFlags).map(a => ApiCodes[a] || a).join(', ')).substring(0, 64) : 'No status',
|
|
1914
|
-
voltageDivide: meter.phaseMode !== 'Split' ? meter.phaseCount : 1
|
|
1915
|
-
readings: {}
|
|
1925
|
+
voltageDivide: meter.phaseMode !== 'Split' ? meter.phaseCount : 1
|
|
1916
1926
|
};
|
|
1917
|
-
//add meter to array
|
|
1918
|
-
arr.push(obj);
|
|
1919
1927
|
|
|
1920
1928
|
//production
|
|
1921
1929
|
const production = measurementType === 'Production';
|
|
1922
1930
|
if (production) {
|
|
1931
|
+
arr.push(obj);
|
|
1923
1932
|
this.pv.meters.production = obj;
|
|
1924
1933
|
this.feature.meters.production.supported = true;
|
|
1925
1934
|
this.feature.meters.production.enabled = obj.state;
|
|
1926
1935
|
this.feature.meters.production.voltageDivide = obj.phaseMode !== 'Split' ? obj.phaseCount : 1;
|
|
1936
|
+
|
|
1937
|
+
//update characteristics
|
|
1938
|
+
this.metersProductionServices
|
|
1939
|
+
?.updateCharacteristic(Characteristic.MeterState, obj.state)
|
|
1940
|
+
.updateCharacteristic(Characteristic.MeterPhaseMode, obj.phaseMode)
|
|
1941
|
+
.updateCharacteristic(Characteristic.MeterPhaseCount, obj.phaseCount)
|
|
1942
|
+
.updateCharacteristic(Characteristic.MeterMeteringStatus, obj.meteringStatus)
|
|
1943
|
+
.updateCharacteristic(Characteristic.MeterStatusFlags, obj.statusFlags);
|
|
1927
1944
|
}
|
|
1928
1945
|
|
|
1929
|
-
//consumption
|
|
1930
|
-
const
|
|
1931
|
-
if (
|
|
1932
|
-
|
|
1933
|
-
this.
|
|
1934
|
-
this.feature.meters.
|
|
1935
|
-
this.feature.meters.
|
|
1946
|
+
//consumption net
|
|
1947
|
+
const consumptionNet = measurementType === 'Consumption Net';
|
|
1948
|
+
if (consumptionNet) {
|
|
1949
|
+
arr.push(obj);
|
|
1950
|
+
this.pv.meters.consumptionNet = obj;
|
|
1951
|
+
this.feature.meters.consumptionNet.supported = true;
|
|
1952
|
+
this.feature.meters.consumptionNet.enabled = obj.state;
|
|
1953
|
+
this.feature.meters.consumptionNet.voltageDivide = obj.phaseMode !== 'Split' ? obj.phaseCount : 1;
|
|
1954
|
+
|
|
1955
|
+
//update characteristics
|
|
1956
|
+
this.metersConsumptionNetServices
|
|
1957
|
+
?.updateCharacteristic(Characteristic.MeterState, obj.state)
|
|
1958
|
+
.updateCharacteristic(Characteristic.MeterPhaseMode, obj.phaseMode)
|
|
1959
|
+
.updateCharacteristic(Characteristic.MeterPhaseCount, obj.phaseCount)
|
|
1960
|
+
.updateCharacteristic(Characteristic.MeterMeteringStatus, obj.meteringStatus)
|
|
1961
|
+
.updateCharacteristic(Characteristic.MeterStatusFlags, obj.statusFlags);
|
|
1962
|
+
}
|
|
1963
|
+
|
|
1964
|
+
//consumption total
|
|
1965
|
+
const consumptionTotal = measurementType === 'Consumption Total';
|
|
1966
|
+
if (consumptionTotal) {
|
|
1967
|
+
arr.push(obj);
|
|
1968
|
+
this.pv.meters.consumptionTotal = obj;
|
|
1969
|
+
this.feature.meters.consumptionTotal.supported = true;
|
|
1970
|
+
this.feature.meters.consumptionTotal.enabled = obj.state;
|
|
1971
|
+
this.feature.meters.consumptionTotal.voltageDivide = obj.phaseMode !== 'Split' ? obj.phaseCount : 1;
|
|
1972
|
+
|
|
1973
|
+
//update characteristics
|
|
1974
|
+
this.metersConsumptionTotalServices
|
|
1975
|
+
?.updateCharacteristic(Characteristic.MeterState, obj.state)
|
|
1976
|
+
.updateCharacteristic(Characteristic.MeterPhaseMode, obj.phaseMode)
|
|
1977
|
+
.updateCharacteristic(Characteristic.MeterPhaseCount, obj.phaseCount)
|
|
1978
|
+
.updateCharacteristic(Characteristic.MeterMeteringStatus, obj.meteringStatus)
|
|
1979
|
+
.updateCharacteristic(Characteristic.MeterStatusFlags, obj.statusFlags);
|
|
1936
1980
|
}
|
|
1937
1981
|
|
|
1938
1982
|
//acBatterie
|
|
1939
1983
|
const acBatterie = measurementType === 'Storage';
|
|
1940
1984
|
if (acBatterie) {
|
|
1985
|
+
arr.push(obj);
|
|
1941
1986
|
this.pv.meters.acBatterie = obj;
|
|
1942
1987
|
this.feature.meters.acBatterie.supported = true;
|
|
1943
1988
|
this.feature.meters.acBatterie.enabled = obj.state;
|
|
1944
1989
|
this.feature.meters.acBatterie.voltageDivide = obj.phaseMode !== 'Split' ? obj.phaseCount : 1;
|
|
1945
|
-
}
|
|
1946
|
-
|
|
1947
|
-
//update characteristics
|
|
1948
|
-
this.metersServices?.[index]
|
|
1949
|
-
?.updateCharacteristic(Characteristic.MeterState, obj.state)
|
|
1950
|
-
.updateCharacteristic(Characteristic.MeterPhaseMode, obj.phaseMode)
|
|
1951
|
-
.updateCharacteristic(Characteristic.MeterPhaseCount, obj.phaseCount)
|
|
1952
|
-
.updateCharacteristic(Characteristic.MeterMeteringStatus, obj.meteringStatus)
|
|
1953
|
-
.updateCharacteristic(Characteristic.MeterStatusFlags, obj.statusFlags);
|
|
1954
|
-
|
|
1955
1990
|
|
|
1991
|
+
//update characteristics
|
|
1992
|
+
this.metersStorageServices
|
|
1993
|
+
?.updateCharacteristic(Characteristic.MeterState, obj.state)
|
|
1994
|
+
.updateCharacteristic(Characteristic.MeterPhaseMode, obj.phaseMode)
|
|
1995
|
+
.updateCharacteristic(Characteristic.MeterPhaseCount, obj.phaseCount)
|
|
1996
|
+
.updateCharacteristic(Characteristic.MeterMeteringStatus, obj.meteringStatus)
|
|
1997
|
+
.updateCharacteristic(Characteristic.MeterStatusFlags, obj.statusFlags);
|
|
1998
|
+
}
|
|
1956
1999
|
});
|
|
1957
|
-
//add ct meters to pv meters
|
|
1958
2000
|
this.pv.meters.data = arr;
|
|
1959
2001
|
|
|
1960
2002
|
//meters installed
|
|
1961
2003
|
const metersInstalled = arr.some(meter => meter.state);
|
|
1962
2004
|
this.feature.meters.installed = metersInstalled;
|
|
1963
|
-
this.feature.meters.count =
|
|
2005
|
+
this.feature.meters.count = responseData.length;
|
|
1964
2006
|
}
|
|
1965
2007
|
|
|
1966
2008
|
//meters supported
|
|
1967
2009
|
this.feature.meters.supported = metersSupported;
|
|
1968
2010
|
|
|
1969
2011
|
//restFul
|
|
1970
|
-
const restFul = this.restFulConnected ? this.restFul1.update('meters',
|
|
2012
|
+
const restFul = this.restFulConnected ? this.restFul1.update('meters', responseData) : false;
|
|
1971
2013
|
|
|
1972
2014
|
//mqtt
|
|
1973
|
-
const mqtt = this.mqttConnected ? this.mqtt1.emit('publish', 'Meters',
|
|
2015
|
+
const mqtt = this.mqttConnected ? this.mqtt1.emit('publish', 'Meters', responseData) : false;
|
|
1974
2016
|
return true;
|
|
1975
2017
|
} catch (error) {
|
|
1976
2018
|
throw new Error(`Update meters error: ${error}`);
|
|
@@ -1981,15 +2023,15 @@ class EnvoyDevice extends EventEmitter {
|
|
|
1981
2023
|
const debug = this.enableDebugMode ? this.emit('debug', `Requesting meters reading`) : false;
|
|
1982
2024
|
try {
|
|
1983
2025
|
const response = await this.axiosInstance(ApiUrls.InternalMeterReadings);
|
|
1984
|
-
const
|
|
1985
|
-
const debug = this.enableDebugMode ? this.emit('debug', `Meters reading:`,
|
|
2026
|
+
const responseData = response.data;
|
|
2027
|
+
const debug = this.enableDebugMode ? this.emit('debug', `Meters reading:`, responseData) : false;
|
|
1986
2028
|
|
|
1987
2029
|
//meters reading count
|
|
1988
|
-
const metersReadingSupported =
|
|
2030
|
+
const metersReadingSupported = responseData.length > 0;
|
|
1989
2031
|
if (metersReadingSupported) {
|
|
1990
|
-
const metersInstalled = metersReading.slice(0, this.pv.meters.data.length); //limit to meters installed
|
|
1991
2032
|
|
|
1992
2033
|
//meters reading summary data
|
|
2034
|
+
const metersInstalled = responseData.slice(0, this.pv.meters.data.length); //limit to meters installed
|
|
1993
2035
|
metersInstalled.forEach((meter, index) => {
|
|
1994
2036
|
const measurementType = this.pv.meters.data[index].measurementType;
|
|
1995
2037
|
const voltageDivide = this.pv.meters.data[index].voltageDivide;
|
|
@@ -2011,9 +2053,6 @@ class EnvoyDevice extends EventEmitter {
|
|
|
2011
2053
|
actEnergyDlvd: meter.actEnergyDlvd,
|
|
2012
2054
|
actEnergyRcvd: meter.actEnergyRcvd,
|
|
2013
2055
|
apparentEnergy: meter.apparentEnergy,
|
|
2014
|
-
reactEnergyLagg: meter.reactEnergyLagg,
|
|
2015
|
-
reactEnergyLead: meter.reactEnergyLead,
|
|
2016
|
-
instantaneousDemand: meter.instantaneousDemand,
|
|
2017
2056
|
channels: meter.channels ?? []
|
|
2018
2057
|
};
|
|
2019
2058
|
//add meter to pv object
|
|
@@ -2022,31 +2061,67 @@ class EnvoyDevice extends EventEmitter {
|
|
|
2022
2061
|
//production
|
|
2023
2062
|
const production = measurementType === 'Production';
|
|
2024
2063
|
if (production) {
|
|
2025
|
-
this.pv.meters.production
|
|
2064
|
+
this.pv.meters.production = { ...this.pv.meters.production, ...obj };
|
|
2065
|
+
|
|
2066
|
+
//update chaaracteristics
|
|
2067
|
+
this.metersProductionServices
|
|
2068
|
+
?.updateCharacteristic(Characteristic.MeterReadingTime, obj.readingTime)
|
|
2069
|
+
.updateCharacteristic(Characteristic.MeterActivePower, obj.powerKw)
|
|
2070
|
+
.updateCharacteristic(Characteristic.MeterApparentPower, obj.apparentPowerKw)
|
|
2071
|
+
.updateCharacteristic(Characteristic.MeterReactivePower, obj.reactivePowerKw)
|
|
2072
|
+
.updateCharacteristic(Characteristic.MeterPwrFactor, obj.pwrFactor)
|
|
2073
|
+
.updateCharacteristic(Characteristic.MeterVoltage, obj.voltage)
|
|
2074
|
+
.updateCharacteristic(Characteristic.MeterCurrent, obj.current)
|
|
2075
|
+
.updateCharacteristic(Characteristic.MeterFrequency, obj.frequency);
|
|
2026
2076
|
}
|
|
2027
2077
|
|
|
2028
2078
|
//consumption
|
|
2029
2079
|
const consumption = measurementType === 'Consumption Net';
|
|
2030
2080
|
if (consumption) {
|
|
2031
|
-
this.pv.meters.
|
|
2081
|
+
this.pv.meters.consumptionNet = { ...this.pv.meters.consumptionNet, ...obj };
|
|
2082
|
+
|
|
2083
|
+
this.metersConsumptionNetServices
|
|
2084
|
+
?.updateCharacteristic(Characteristic.MeterReadingTime, obj.readingTime)
|
|
2085
|
+
.updateCharacteristic(Characteristic.MeterActivePower, obj.powerKw)
|
|
2086
|
+
.updateCharacteristic(Characteristic.MeterApparentPower, obj.apparentPowerKw)
|
|
2087
|
+
.updateCharacteristic(Characteristic.MeterReactivePower, obj.reactivePowerKw)
|
|
2088
|
+
.updateCharacteristic(Characteristic.MeterPwrFactor, obj.pwrFactor)
|
|
2089
|
+
.updateCharacteristic(Characteristic.MeterVoltage, obj.voltage)
|
|
2090
|
+
.updateCharacteristic(Characteristic.MeterCurrent, obj.current)
|
|
2091
|
+
.updateCharacteristic(Characteristic.MeterFrequency, obj.frequency);
|
|
2092
|
+
}
|
|
2093
|
+
|
|
2094
|
+
//consumption total
|
|
2095
|
+
const consumptionTotal = measurementType === 'Consumption Total';
|
|
2096
|
+
if (consumptionTotal) {
|
|
2097
|
+
this.pv.meters.consumptionTotal = { ...this.pv.meters.consumptionTotal, ...obj };
|
|
2098
|
+
|
|
2099
|
+
this.metersConsumptionTotalServices
|
|
2100
|
+
?.updateCharacteristic(Characteristic.MeterReadingTime, obj.readingTime)
|
|
2101
|
+
.updateCharacteristic(Characteristic.MeterActivePower, obj.powerKw)
|
|
2102
|
+
.updateCharacteristic(Characteristic.MeterApparentPower, obj.apparentPowerKw)
|
|
2103
|
+
.updateCharacteristic(Characteristic.MeterReactivePower, obj.reactivePowerKw)
|
|
2104
|
+
.updateCharacteristic(Characteristic.MeterPwrFactor, obj.pwrFactor)
|
|
2105
|
+
.updateCharacteristic(Characteristic.MeterVoltage, obj.voltage)
|
|
2106
|
+
.updateCharacteristic(Characteristic.MeterCurrent, obj.current)
|
|
2107
|
+
.updateCharacteristic(Characteristic.MeterFrequency, obj.frequency);
|
|
2032
2108
|
}
|
|
2033
2109
|
|
|
2034
2110
|
//acBatterie
|
|
2035
2111
|
const acBatterie = measurementType === 'Storage';
|
|
2036
2112
|
if (acBatterie) {
|
|
2037
|
-
this.pv.meters.acBatterie
|
|
2113
|
+
this.pv.meters.acBatterie = { ...this.pv.meters.acBatterie, ...obj };
|
|
2114
|
+
|
|
2115
|
+
this.metersacBatterieServices
|
|
2116
|
+
?.updateCharacteristic(Characteristic.MeterReadingTime, obj.readingTime)
|
|
2117
|
+
.updateCharacteristic(Characteristic.MeterActivePower, obj.powerKw)
|
|
2118
|
+
.updateCharacteristic(Characteristic.MeterApparentPower, obj.apparentPowerKw)
|
|
2119
|
+
.updateCharacteristic(Characteristic.MeterReactivePower, obj.reactivePowerKw)
|
|
2120
|
+
.updateCharacteristic(Characteristic.MeterPwrFactor, obj.pwrFactor)
|
|
2121
|
+
.updateCharacteristic(Characteristic.MeterVoltage, obj.voltage)
|
|
2122
|
+
.updateCharacteristic(Characteristic.MeterCurrent, obj.current)
|
|
2123
|
+
.updateCharacteristic(Characteristic.MeterFrequency, obj.frequency);
|
|
2038
2124
|
}
|
|
2039
|
-
|
|
2040
|
-
//update chaaracteristics
|
|
2041
|
-
this.metersServices?.[index]
|
|
2042
|
-
?.updateCharacteristic(Characteristic.MeterReadingTime, obj.readingTime)
|
|
2043
|
-
.updateCharacteristic(Characteristic.MeterActivePower, obj.powerKw)
|
|
2044
|
-
.updateCharacteristic(Characteristic.MeterApparentPower, obj.apparentPowerKw)
|
|
2045
|
-
.updateCharacteristic(Characteristic.MeterReactivePower, obj.reactivePowerKw)
|
|
2046
|
-
.updateCharacteristic(Characteristic.MeterPwrFactor, obj.pwrFactor)
|
|
2047
|
-
.updateCharacteristic(Characteristic.MeterVoltage, obj.voltage)
|
|
2048
|
-
.updateCharacteristic(Characteristic.MeterCurrent, obj.current)
|
|
2049
|
-
.updateCharacteristic(Characteristic.MeterFrequency, obj.frequency);
|
|
2050
2125
|
});
|
|
2051
2126
|
|
|
2052
2127
|
//meters readings installed
|
|
@@ -2058,16 +2133,146 @@ class EnvoyDevice extends EventEmitter {
|
|
|
2058
2133
|
this.feature.metersReading.supported = metersReadingSupported;
|
|
2059
2134
|
|
|
2060
2135
|
//restFul
|
|
2061
|
-
const restFul = this.restFulConnected ? this.restFul1.update('metersreading',
|
|
2136
|
+
const restFul = this.restFulConnected ? this.restFul1.update('metersreading', responseData) : false;
|
|
2062
2137
|
|
|
2063
2138
|
//mqtt
|
|
2064
|
-
const mqtt = this.mqttConnected ? this.mqtt1.emit('publish', 'Meters Reading',
|
|
2139
|
+
const mqtt = this.mqttConnected ? this.mqtt1.emit('publish', 'Meters Reading', responseData) : false;
|
|
2065
2140
|
return true;
|
|
2066
2141
|
} catch (error) {
|
|
2067
2142
|
throw new Error(`Update meters reading error: ${error}`);
|
|
2068
2143
|
}
|
|
2069
2144
|
}
|
|
2070
2145
|
|
|
2146
|
+
async updateMetersReports() {
|
|
2147
|
+
const debug = this.enableDebugMode ? this.emit('debug', `Requesting meters reports`) : false;
|
|
2148
|
+
try {
|
|
2149
|
+
const response = await this.axiosInstance(ApiUrls.InternalMetersReports);
|
|
2150
|
+
const responseData = response.data;
|
|
2151
|
+
const debug = !this.enableDebugMode ? this.emit('debug', `Meters reports:`, responseData) : false;
|
|
2152
|
+
|
|
2153
|
+
//meters reading count
|
|
2154
|
+
const arr = [];
|
|
2155
|
+
const metersReportsSupported = responseData.length > 0;
|
|
2156
|
+
if (metersReportsSupported) {
|
|
2157
|
+
|
|
2158
|
+
//meters reading summary data
|
|
2159
|
+
responseData.forEach((meter, index) => {
|
|
2160
|
+
meter = meter.cumulative;
|
|
2161
|
+
const measurementType = ApiCodes[meter.reportType];
|
|
2162
|
+
const voltageDivide = this.pv.meters.data[0].voltageDivide;
|
|
2163
|
+
const obj = {
|
|
2164
|
+
type: meter.reportType,
|
|
2165
|
+
activeCount: 1,
|
|
2166
|
+
measurementType: measurementType,
|
|
2167
|
+
readingTime: new Date().toLocaleString(),
|
|
2168
|
+
power: meter.actPower,
|
|
2169
|
+
powerKw: meter.actPower / 1000,
|
|
2170
|
+
apparentPower: meter.apprntPwr,
|
|
2171
|
+
apparentPowerKw: meter.apprntPwr / 1000,
|
|
2172
|
+
reactivePower: meter.reactPwr,
|
|
2173
|
+
reactivePowerKw: meter.reactPwr / 1000,
|
|
2174
|
+
current: meter.rmsCurrent,
|
|
2175
|
+
voltage: meter.rmsVoltage / voltageDivide,
|
|
2176
|
+
pwrFactor: meter.pwrFactor,
|
|
2177
|
+
frequency: meter.freqHz,
|
|
2178
|
+
actEnergyDlvd: meter.whDlvdCum,
|
|
2179
|
+
actEnergyRcvd: meter.whRcvdCum,
|
|
2180
|
+
apparentEnergy: meter.vahCum,
|
|
2181
|
+
channels: meter.lines ?? []
|
|
2182
|
+
};
|
|
2183
|
+
|
|
2184
|
+
//production
|
|
2185
|
+
const production = measurementType === 'Production';
|
|
2186
|
+
if (production) {
|
|
2187
|
+
this.pv.meters.production = obj;
|
|
2188
|
+
this.feature.meters.production.supported = true;
|
|
2189
|
+
|
|
2190
|
+
//update chaaracteristics
|
|
2191
|
+
this.metersProductionServices
|
|
2192
|
+
?.updateCharacteristic(Characteristic.MeterReadingTime, obj.readingTime)
|
|
2193
|
+
.updateCharacteristic(Characteristic.MeterActivePower, obj.powerKw)
|
|
2194
|
+
.updateCharacteristic(Characteristic.MeterApparentPower, obj.apparentPowerKw)
|
|
2195
|
+
.updateCharacteristic(Characteristic.MeterReactivePower, obj.reactivePowerKw)
|
|
2196
|
+
.updateCharacteristic(Characteristic.MeterPwrFactor, obj.pwrFactor)
|
|
2197
|
+
.updateCharacteristic(Characteristic.MeterVoltage, obj.voltage)
|
|
2198
|
+
.updateCharacteristic(Characteristic.MeterCurrent, obj.current)
|
|
2199
|
+
.updateCharacteristic(Characteristic.MeterFrequency, obj.frequency);
|
|
2200
|
+
}
|
|
2201
|
+
|
|
2202
|
+
//consumption total
|
|
2203
|
+
const consumptionTotal = measurementType === 'Consumption Total';
|
|
2204
|
+
if (consumptionTotal) {
|
|
2205
|
+
this.pv.meters.consumptionTotal = obj;
|
|
2206
|
+
this.feature.meters.consumptionTotal.supported = true;
|
|
2207
|
+
|
|
2208
|
+
//update chaaracteristics
|
|
2209
|
+
this.metersConsumptionNetServices
|
|
2210
|
+
?.updateCharacteristic(Characteristic.MeterReadingTime, obj.readingTime)
|
|
2211
|
+
.updateCharacteristic(Characteristic.MeterActivePower, obj.powerKw)
|
|
2212
|
+
.updateCharacteristic(Characteristic.MeterApparentPower, obj.apparentPowerKw)
|
|
2213
|
+
.updateCharacteristic(Characteristic.MeterReactivePower, obj.reactivePowerKw)
|
|
2214
|
+
.updateCharacteristic(Characteristic.MeterPwrFactor, obj.pwrFactor)
|
|
2215
|
+
.updateCharacteristic(Characteristic.MeterVoltage, obj.voltage)
|
|
2216
|
+
.updateCharacteristic(Characteristic.MeterCurrent, obj.current)
|
|
2217
|
+
.updateCharacteristic(Characteristic.MeterFrequency, obj.frequency);
|
|
2218
|
+
}
|
|
2219
|
+
|
|
2220
|
+
//consumption net
|
|
2221
|
+
const consumptionNet = measurementType === 'Consumption Net';
|
|
2222
|
+
if (consumptionNet) {
|
|
2223
|
+
this.pv.meters.consumptionNet = obj;
|
|
2224
|
+
this.feature.meters.consumptionNet.supported = true;
|
|
2225
|
+
|
|
2226
|
+
//update chaaracteristics
|
|
2227
|
+
this.metersConsumptionTotalServices
|
|
2228
|
+
?.updateCharacteristic(Characteristic.MeterReadingTime, obj.readingTime)
|
|
2229
|
+
.updateCharacteristic(Characteristic.MeterActivePower, obj.powerKw)
|
|
2230
|
+
.updateCharacteristic(Characteristic.MeterApparentPower, obj.apparentPowerKw)
|
|
2231
|
+
.updateCharacteristic(Characteristic.MeterReactivePower, obj.reactivePowerKw)
|
|
2232
|
+
.updateCharacteristic(Characteristic.MeterPwrFactor, obj.pwrFactor)
|
|
2233
|
+
.updateCharacteristic(Characteristic.MeterVoltage, obj.voltage)
|
|
2234
|
+
.updateCharacteristic(Characteristic.MeterCurrent, obj.current)
|
|
2235
|
+
.updateCharacteristic(Characteristic.MeterFrequency, obj.frequency);
|
|
2236
|
+
}
|
|
2237
|
+
|
|
2238
|
+
//acBatterie
|
|
2239
|
+
const acBatterie = measurementType === 'Storage';
|
|
2240
|
+
if (acBatterie) {
|
|
2241
|
+
this.pv.meters.acBatterie.readings = obj;
|
|
2242
|
+
this.feature.meters.acBatterie.supported = true;
|
|
2243
|
+
|
|
2244
|
+
//update chaaracteristics
|
|
2245
|
+
this.metersacBatterieServices
|
|
2246
|
+
?.updateCharacteristic(Characteristic.MeterReadingTime, obj.readingTime)
|
|
2247
|
+
.updateCharacteristic(Characteristic.MeterActivePower, obj.powerKw)
|
|
2248
|
+
.updateCharacteristic(Characteristic.MeterApparentPower, obj.apparentPowerKw)
|
|
2249
|
+
.updateCharacteristic(Characteristic.MeterReactivePower, obj.reactivePowerKw)
|
|
2250
|
+
.updateCharacteristic(Characteristic.MeterPwrFactor, obj.pwrFactor)
|
|
2251
|
+
.updateCharacteristic(Characteristic.MeterVoltage, obj.voltage)
|
|
2252
|
+
.updateCharacteristic(Characteristic.MeterCurrent, obj.current)
|
|
2253
|
+
.updateCharacteristic(Characteristic.MeterFrequency, obj.frequency);
|
|
2254
|
+
}
|
|
2255
|
+
});
|
|
2256
|
+
|
|
2257
|
+
//meters reports installed
|
|
2258
|
+
this.feature.metersReports.installed = true;
|
|
2259
|
+
this.feature.metersReports.count = responseData.length;
|
|
2260
|
+
}
|
|
2261
|
+
|
|
2262
|
+
//meters reports installed
|
|
2263
|
+
this.feature.metersReports.supported = metersReportsSupported;
|
|
2264
|
+
|
|
2265
|
+
//restFul
|
|
2266
|
+
const restFul = this.restFulConnected ? this.restFul1.update('metersreports', responseData) : false;
|
|
2267
|
+
|
|
2268
|
+
//mqtt
|
|
2269
|
+
const mqtt = this.mqttConnected ? this.mqtt1.emit('publish', 'Meters Reports', responseData) : false;
|
|
2270
|
+
return true;
|
|
2271
|
+
} catch (error) {
|
|
2272
|
+
throw new Error(`Update meters reports error: ${error}`);
|
|
2273
|
+
}
|
|
2274
|
+
}
|
|
2275
|
+
|
|
2071
2276
|
async updateProduction() {
|
|
2072
2277
|
const debug = this.enableDebugMode ? this.emit('debug', `Requesting production`) : false;
|
|
2073
2278
|
try {
|
|
@@ -2296,7 +2501,7 @@ class EnvoyDevice extends EventEmitter {
|
|
|
2296
2501
|
const debug = this.enableDebugMode ? this.emit('debug', `Production ct:`, productionCtData) : false;
|
|
2297
2502
|
|
|
2298
2503
|
//get enabled devices
|
|
2299
|
-
const metersConsumptionEnabled = this.feature.meters.
|
|
2504
|
+
const metersConsumptionEnabled = this.feature.meters.consumptionNet.enabled;
|
|
2300
2505
|
const acBatteriesInstalled = this.feature.inventory.acbs.installed;
|
|
2301
2506
|
const voltageDivide = this.pv.meters.data[0].voltageDivide;
|
|
2302
2507
|
|
|
@@ -2387,7 +2592,7 @@ class EnvoyDevice extends EventEmitter {
|
|
|
2387
2592
|
current: consumption.rmsCurrent,
|
|
2388
2593
|
voltage: consumption.rmsVoltage / voltageDivide,
|
|
2389
2594
|
pwrFactor: consumption.pwrFactor,
|
|
2390
|
-
frequency: this.pv.meters.
|
|
2595
|
+
frequency: this.pv.meters.consumptionNet.readings.frequency
|
|
2391
2596
|
};
|
|
2392
2597
|
//push to array
|
|
2393
2598
|
arr.push(obj);
|
|
@@ -2521,7 +2726,7 @@ class EnvoyDevice extends EventEmitter {
|
|
|
2521
2726
|
}
|
|
2522
2727
|
|
|
2523
2728
|
//meters data
|
|
2524
|
-
if (this.feature.meters.production.enabled || this.feature.meters.
|
|
2729
|
+
if (this.feature.meters.production.enabled || this.feature.meters.consumptionNet.enabled) {
|
|
2525
2730
|
this.pv.meters.data.forEach((meter, index) => {
|
|
2526
2731
|
const device = devicesData[meter.eid];
|
|
2527
2732
|
if (!device) {
|
|
@@ -2733,14 +2938,14 @@ class EnvoyDevice extends EventEmitter {
|
|
|
2733
2938
|
this.feature.productionData.production.supported = true;
|
|
2734
2939
|
|
|
2735
2940
|
//consumption
|
|
2736
|
-
const metersConsumptionEnabled = this.feature.meters.
|
|
2941
|
+
const metersConsumptionEnabled = this.feature.meters.consumptionNet.enabled;
|
|
2737
2942
|
if (metersConsumptionEnabled) {
|
|
2738
2943
|
const arr = [];
|
|
2739
2944
|
const consumptions = this.pv.productionCt.consumption ?? [];
|
|
2740
2945
|
for (const [index, consumption] of consumptions.entries()) {
|
|
2741
2946
|
const energyPdmConsumptionSupported = this.feature.energyPdm.consumption.supported;
|
|
2742
2947
|
const isNet = consumption.measurementType === 'Consumption Net';
|
|
2743
|
-
const consumptionSourcePower = isNet ? this.pv.meters.
|
|
2948
|
+
const consumptionSourcePower = isNet ? this.pv.meters.consumptionNet.readings : consumption;
|
|
2744
2949
|
const consumptionSourceEnergy = isNet && energyPdmConsumptionSupported ? this.pv.energyPdm.consumption.eim : consumption;
|
|
2745
2950
|
const consumptionSourceMeter = isNet ? consumptionSourcePower : consumption;
|
|
2746
2951
|
const debug7 = this.enableDebugMode ? this.emit('debug', `Production all consumption power:`, consumptionSourcePower) : false;
|
|
@@ -4103,8 +4308,8 @@ class EnvoyDevice extends EventEmitter {
|
|
|
4103
4308
|
const pushPvTypeToArray = this.feature.meters.installed && this.feature.meters.production.enabled ? activeDeviceTypes.push({ type: 'PV', meter: liveDataMeters.pv }) : false;
|
|
4104
4309
|
const pushStorageTypeToArray = this.feature.meters.installed && this.feature.meters.acBatterie.enabled ? activeDeviceTypes.push({ type: 'AC Batterie', meter: liveDataMeters.storage }) : false;
|
|
4105
4310
|
const pushEnchargeTypeToArray = this.feature.meters.installed && this.feature.encharges.installed ? activeDeviceTypes.push({ type: 'Encharge', meter: liveDataMeters.storage }) : false;
|
|
4106
|
-
const pushGridTypeToArray = this.feature.meters.installed && this.feature.meters.
|
|
4107
|
-
const pushLoadTypeToArray = this.feature.meters.installed && this.feature.meters.
|
|
4311
|
+
const pushGridTypeToArray = this.feature.meters.installed && this.feature.meters.consumptionNet.enabled ? activeDeviceTypes.push({ type: 'Grid', meter: liveDataMeters.grid }) : false;
|
|
4312
|
+
const pushLoadTypeToArray = this.feature.meters.installed && this.feature.meters.consumptionNet.enabled ? activeDeviceTypes.push({ type: 'Load', meter: liveDataMeters.load }) : false;
|
|
4108
4313
|
const pushGeneratorTypeToArray = this.feature.meters.installed && this.feature.generators.installed ? activeDeviceTypes.push({ type: 'Generator', meter: liveDataMeters.generator }) : false;
|
|
4109
4314
|
|
|
4110
4315
|
//iterate over active meters
|
|
@@ -4423,7 +4628,7 @@ class EnvoyDevice extends EventEmitter {
|
|
|
4423
4628
|
const displayLine = displayLog || displayLog0 || displayLog1 || displayLog2 ? this.emit('devInfo', `--------------------------------`) : false;
|
|
4424
4629
|
const displayMeters = this.feature.meters.installed ? this.emit('devInfo', `Meters: Yes`) : false;
|
|
4425
4630
|
const displayLog4 = displayMeters && this.feature.meters.production.supported ? this.emit('devInfo', `Production: ${this.feature.meters.production.enabled ? `Enabled` : `Disabled`}`) : false;
|
|
4426
|
-
const displayLog5 = displayMeters && this.feature.meters.
|
|
4631
|
+
const displayLog5 = displayMeters && this.feature.meters.consumptionNet.supported ? this.emit('devInfo', `Consumption: ${this.feature.meters.consumptionNet.enabled ? `Enabled` : `Disabled`}`) : false;
|
|
4427
4632
|
const displayLog6 = displayMeters && this.feature.meters.acBatterie.supported ? this.emit('devInfo', `Storage: ${this.feature.meters.acBatterie.enabled ? `Enabled` : `Disabled`}`) : false;
|
|
4428
4633
|
const displayLine1 = displayMeters ? this.emit('devInfo', `--------------------------------`) : false;
|
|
4429
4634
|
const displayEnsemble = this.feature.enpowers.installed || this.feature.encharges.installed || this.feature.dryContacts.installed || this.feature.generators.installed ? this.emit('devInfo', `Ensemble: Yes`) : false;
|
|
@@ -4822,7 +5027,9 @@ class EnvoyDevice extends EventEmitter {
|
|
|
4822
5027
|
const ensemblesInstalled = this.feature.inventory.esubs.installed;
|
|
4823
5028
|
const metersInstalled = this.feature.meters.installed;
|
|
4824
5029
|
const metersProductionEnabled = this.feature.meters.production.enabled;
|
|
4825
|
-
const
|
|
5030
|
+
const metersConsumptionNetEnabled = this.feature.meters.consumptionNet.enabled;
|
|
5031
|
+
const metersConsumptionTotalEnabled = this.feature.meters.consumptionTotal.enabled;
|
|
5032
|
+
const metersStorageEnabled = this.feature.meters.acBatterie.enabled;
|
|
4826
5033
|
const productionDataSupported = this.feature.productionData.supported;
|
|
4827
5034
|
const productionDataProductionSupported = this.feature.productionData.production.supported;
|
|
4828
5035
|
const productionDataConsumptionSupported = this.feature.productionData.consumption.supported;
|
|
@@ -5922,93 +6129,364 @@ class EnvoyDevice extends EventEmitter {
|
|
|
5922
6129
|
|
|
5923
6130
|
//meters
|
|
5924
6131
|
if (metersInstalled) {
|
|
5925
|
-
|
|
5926
|
-
|
|
6132
|
+
//production
|
|
6133
|
+
if (metersProductionEnabled) {
|
|
6134
|
+
const meter = this.pv.meters.production;
|
|
5927
6135
|
const measurementType = meter.measurementType;
|
|
5928
6136
|
const debug = this.enableDebugMode ? this.emit('debug', `Prepare Meter ${measurementType} Service`) : false;
|
|
5929
|
-
const
|
|
5930
|
-
|
|
5931
|
-
|
|
6137
|
+
const meterProductionService = accessory.addService(Service.MeterService, `Meter ${measurementType}`, `meterProductionService${measurementType}`);
|
|
6138
|
+
meterProductionService.setCharacteristic(Characteristic.ConfiguredName, `Meter ${measurementType}`);
|
|
6139
|
+
meterProductionService.getCharacteristic(Characteristic.MeterState)
|
|
5932
6140
|
.onGet(async () => {
|
|
5933
6141
|
const value = meter.state;
|
|
5934
6142
|
const info = this.disableLogInfo ? false : this.emit('info', `Meter: ${measurementType}, state: ${value ? 'Enabled' : 'Disabled'}`);
|
|
5935
6143
|
return value;
|
|
5936
6144
|
});
|
|
5937
|
-
|
|
6145
|
+
meterProductionService.getCharacteristic(Characteristic.MeterPhaseMode)
|
|
5938
6146
|
.onGet(async () => {
|
|
5939
6147
|
const value = meter.phaseMode;
|
|
5940
6148
|
const info = this.disableLogInfo ? false : this.emit('info', `Meter: ${measurementType}, phase mode: ${value}`);
|
|
5941
6149
|
return value;
|
|
5942
6150
|
});
|
|
5943
|
-
|
|
6151
|
+
meterProductionService.getCharacteristic(Characteristic.MeterPhaseCount)
|
|
5944
6152
|
.onGet(async () => {
|
|
5945
6153
|
const value = meter.phaseCount;
|
|
5946
6154
|
const info = this.disableLogInfo ? false : this.emit('info', `Meter: ${measurementType}, phase count: ${value}`);
|
|
5947
6155
|
return value;
|
|
5948
6156
|
});
|
|
5949
|
-
|
|
6157
|
+
meterProductionService.getCharacteristic(Characteristic.MeterMeteringStatus)
|
|
5950
6158
|
.onGet(async () => {
|
|
5951
6159
|
const value = meter.meteringStatus;
|
|
5952
6160
|
const info = this.disableLogInfo ? false : this.emit('info', `Meter: ${measurementType}, metering status: ${value}`);
|
|
5953
6161
|
return value;
|
|
5954
6162
|
});
|
|
5955
|
-
|
|
6163
|
+
meterProductionService.getCharacteristic(Characteristic.MeterStatusFlags)
|
|
5956
6164
|
.onGet(async () => {
|
|
5957
6165
|
const value = meter.statusFlags;
|
|
5958
6166
|
const info = this.disableLogInfo ? false : this.emit('info', `Meter: ${measurementType}, status flag: ${value}`);
|
|
5959
6167
|
return value;
|
|
5960
6168
|
});
|
|
5961
6169
|
if (meter.state) {
|
|
5962
|
-
|
|
6170
|
+
meterProductionService.getCharacteristic(Characteristic.MeterActivePower)
|
|
5963
6171
|
.onGet(async () => {
|
|
5964
6172
|
const value = meter.readings.powerKw;
|
|
5965
6173
|
const info = this.disableLogInfo ? false : this.emit('info', `Meter: ${measurementType}, active power: ${value} kW`);
|
|
5966
6174
|
return value;
|
|
5967
6175
|
});
|
|
5968
|
-
|
|
6176
|
+
meterProductionService.getCharacteristic(Characteristic.MeterApparentPower)
|
|
5969
6177
|
.onGet(async () => {
|
|
5970
6178
|
const value = meter.readings.apparentPowerKw;
|
|
5971
6179
|
const info = this.disableLogInfo ? false : this.emit('info', `Meter: ${measurementType}, apparent power: ${value} kVA`);
|
|
5972
6180
|
return value;
|
|
5973
6181
|
});
|
|
5974
|
-
|
|
6182
|
+
meterProductionService.getCharacteristic(Characteristic.MeterReactivePower)
|
|
5975
6183
|
.onGet(async () => {
|
|
5976
6184
|
const value = meter.readings.reactivePowerKw;
|
|
5977
6185
|
const info = this.disableLogInfo ? false : this.emit('info', `Meter: ${measurementType}, reactive power: ${value} kVAr`);
|
|
5978
6186
|
return value;
|
|
5979
6187
|
});
|
|
5980
|
-
|
|
6188
|
+
meterProductionService.getCharacteristic(Characteristic.MeterCurrent)
|
|
5981
6189
|
.onGet(async () => {
|
|
5982
6190
|
const value = meter.readings.current;
|
|
5983
6191
|
const info = this.disableLogInfo ? false : this.emit('info', `Meter: ${measurementType}, current: ${value} A`);
|
|
5984
6192
|
return value;
|
|
5985
6193
|
});
|
|
5986
|
-
|
|
6194
|
+
meterProductionService.getCharacteristic(Characteristic.MeterVoltage)
|
|
5987
6195
|
.onGet(async () => {
|
|
5988
6196
|
const value = meter.readings.voltage;
|
|
5989
6197
|
const info = this.disableLogInfo ? false : this.emit('info', `Meter: ${measurementType}, voltage: ${value} V`);
|
|
5990
6198
|
return value;
|
|
5991
6199
|
});
|
|
5992
|
-
|
|
6200
|
+
meterProductionService.getCharacteristic(Characteristic.MeterFrequency)
|
|
5993
6201
|
.onGet(async () => {
|
|
5994
6202
|
const value = meter.readings.frequency;
|
|
5995
6203
|
const info = this.disableLogInfo ? false : this.emit('info', `Meter: ${measurementType}, frequency: ${value} Hz`);
|
|
5996
6204
|
return value;
|
|
5997
6205
|
});
|
|
5998
|
-
|
|
6206
|
+
meterProductionService.getCharacteristic(Characteristic.MeterPwrFactor)
|
|
5999
6207
|
.onGet(async () => {
|
|
6000
6208
|
const value = meter.readings.pwrFactor;
|
|
6001
6209
|
const info = this.disableLogInfo ? false : this.emit('info', `Meter: ${measurementType}, power factor: ${value} cos φ`);
|
|
6002
6210
|
return value;
|
|
6003
6211
|
});
|
|
6004
|
-
|
|
6212
|
+
meterProductionService.getCharacteristic(Characteristic.MeterReadingTime)
|
|
6005
6213
|
.onGet(async () => {
|
|
6006
6214
|
const value = meter.readings.readingTime;
|
|
6007
6215
|
const info = this.disableLogInfo ? false : this.emit('info', `Meter: ${measurementType}, last report: ${value}`);
|
|
6008
6216
|
return value;
|
|
6009
6217
|
});
|
|
6010
6218
|
}
|
|
6011
|
-
this.
|
|
6219
|
+
this.metersProductionServices = (meterProductionService);
|
|
6220
|
+
}
|
|
6221
|
+
|
|
6222
|
+
//consumption net
|
|
6223
|
+
if (metersConsumptionNetEnabled) {
|
|
6224
|
+
const meter = this.pv.meters.consumptionNet;
|
|
6225
|
+
const measurementType = meter.measurementType;
|
|
6226
|
+
const debug = this.enableDebugMode ? this.emit('debug', `Prepare Meter ${measurementType} Service`) : false;
|
|
6227
|
+
const meterConsumptionNetService = accessory.addService(Service.MeterService, `Meter ${measurementType}`, `meterConsumptionNetService${measurementType}`);
|
|
6228
|
+
meterConsumptionNetService.setCharacteristic(Characteristic.ConfiguredName, `Meter ${measurementType}`);
|
|
6229
|
+
meterConsumptionNetService.getCharacteristic(Characteristic.MeterState)
|
|
6230
|
+
.onGet(async () => {
|
|
6231
|
+
const value = meter.state;
|
|
6232
|
+
const info = this.disableLogInfo ? false : this.emit('info', `Meter: ${measurementType}, state: ${value ? 'Enabled' : 'Disabled'}`);
|
|
6233
|
+
return value;
|
|
6234
|
+
});
|
|
6235
|
+
meterConsumptionNetService.getCharacteristic(Characteristic.MeterPhaseMode)
|
|
6236
|
+
.onGet(async () => {
|
|
6237
|
+
const value = meter.phaseMode;
|
|
6238
|
+
const info = this.disableLogInfo ? false : this.emit('info', `Meter: ${measurementType}, phase mode: ${value}`);
|
|
6239
|
+
return value;
|
|
6240
|
+
});
|
|
6241
|
+
meterConsumptionNetService.getCharacteristic(Characteristic.MeterPhaseCount)
|
|
6242
|
+
.onGet(async () => {
|
|
6243
|
+
const value = meter.phaseCount;
|
|
6244
|
+
const info = this.disableLogInfo ? false : this.emit('info', `Meter: ${measurementType}, phase count: ${value}`);
|
|
6245
|
+
return value;
|
|
6246
|
+
});
|
|
6247
|
+
meterConsumptionNetService.getCharacteristic(Characteristic.MeterMeteringStatus)
|
|
6248
|
+
.onGet(async () => {
|
|
6249
|
+
const value = meter.meteringStatus;
|
|
6250
|
+
const info = this.disableLogInfo ? false : this.emit('info', `Meter: ${measurementType}, metering status: ${value}`);
|
|
6251
|
+
return value;
|
|
6252
|
+
});
|
|
6253
|
+
meterConsumptionNetService.getCharacteristic(Characteristic.MeterStatusFlags)
|
|
6254
|
+
.onGet(async () => {
|
|
6255
|
+
const value = meter.statusFlags;
|
|
6256
|
+
const info = this.disableLogInfo ? false : this.emit('info', `Meter: ${measurementType}, status flag: ${value}`);
|
|
6257
|
+
return value;
|
|
6258
|
+
});
|
|
6259
|
+
if (meter.state) {
|
|
6260
|
+
meterConsumptionNetService.getCharacteristic(Characteristic.MeterActivePower)
|
|
6261
|
+
.onGet(async () => {
|
|
6262
|
+
const value = meter.powerKw;
|
|
6263
|
+
const info = this.disableLogInfo ? false : this.emit('info', `Meter: ${measurementType}, active power: ${value} kW`);
|
|
6264
|
+
return value;
|
|
6265
|
+
});
|
|
6266
|
+
meterConsumptionNetService.getCharacteristic(Characteristic.MeterApparentPower)
|
|
6267
|
+
.onGet(async () => {
|
|
6268
|
+
const value = meter.apparentPowerKw;
|
|
6269
|
+
const info = this.disableLogInfo ? false : this.emit('info', `Meter: ${measurementType}, apparent power: ${value} kVA`);
|
|
6270
|
+
return value;
|
|
6271
|
+
});
|
|
6272
|
+
meterConsumptionNetService.getCharacteristic(Characteristic.MeterReactivePower)
|
|
6273
|
+
.onGet(async () => {
|
|
6274
|
+
const value = meter.reactivePowerKw;
|
|
6275
|
+
const info = this.disableLogInfo ? false : this.emit('info', `Meter: ${measurementType}, reactive power: ${value} kVAr`);
|
|
6276
|
+
return value;
|
|
6277
|
+
});
|
|
6278
|
+
meterConsumptionNetService.getCharacteristic(Characteristic.MeterCurrent)
|
|
6279
|
+
.onGet(async () => {
|
|
6280
|
+
const value = meter.current;
|
|
6281
|
+
const info = this.disableLogInfo ? false : this.emit('info', `Meter: ${measurementType}, current: ${value} A`);
|
|
6282
|
+
return value;
|
|
6283
|
+
});
|
|
6284
|
+
meterConsumptionNetService.getCharacteristic(Characteristic.MeterVoltage)
|
|
6285
|
+
.onGet(async () => {
|
|
6286
|
+
const value = meter.voltage;
|
|
6287
|
+
const info = this.disableLogInfo ? false : this.emit('info', `Meter: ${measurementType}, voltage: ${value} V`);
|
|
6288
|
+
return value;
|
|
6289
|
+
});
|
|
6290
|
+
meterConsumptionNetService.getCharacteristic(Characteristic.MeterFrequency)
|
|
6291
|
+
.onGet(async () => {
|
|
6292
|
+
const value = meter.frequency;
|
|
6293
|
+
const info = this.disableLogInfo ? false : this.emit('info', `Meter: ${measurementType}, frequency: ${value} Hz`);
|
|
6294
|
+
return value;
|
|
6295
|
+
});
|
|
6296
|
+
meterConsumptionNetService.getCharacteristic(Characteristic.MeterPwrFactor)
|
|
6297
|
+
.onGet(async () => {
|
|
6298
|
+
const value = meter.pwrFactor;
|
|
6299
|
+
const info = this.disableLogInfo ? false : this.emit('info', `Meter: ${measurementType}, power factor: ${value} cos φ`);
|
|
6300
|
+
return value;
|
|
6301
|
+
});
|
|
6302
|
+
meterConsumptionNetService.getCharacteristic(Characteristic.MeterReadingTime)
|
|
6303
|
+
.onGet(async () => {
|
|
6304
|
+
const value = meter.readingTime;
|
|
6305
|
+
const info = this.disableLogInfo ? false : this.emit('info', `Meter: ${measurementType}, last report: ${value}`);
|
|
6306
|
+
return value;
|
|
6307
|
+
});
|
|
6308
|
+
}
|
|
6309
|
+
this.metersConsumptionNetServices = (meterConsumptionNetService);
|
|
6310
|
+
}
|
|
6311
|
+
|
|
6312
|
+
//consumption total
|
|
6313
|
+
if (metersConsumptionTotalEnabled) {
|
|
6314
|
+
const meter = this.pv.meters.consumptionTotal;
|
|
6315
|
+
const measurementType = meter.measurementType;
|
|
6316
|
+
const debug = this.enableDebugMode ? this.emit('debug', `Prepare Meter ${measurementType} Service`) : false;
|
|
6317
|
+
const meterConsumptionTotalService = accessory.addService(Service.MeterService, `Meter ${measurementType}`, `meterConsumptionTotalService${measurementType}`);
|
|
6318
|
+
meterConsumptionTotalService.setCharacteristic(Characteristic.ConfiguredName, `Meter ${measurementType}`);
|
|
6319
|
+
meterConsumptionTotalService.getCharacteristic(Characteristic.MeterState)
|
|
6320
|
+
.onGet(async () => {
|
|
6321
|
+
const value = meter.state;
|
|
6322
|
+
const info = this.disableLogInfo ? false : this.emit('info', `Meter: ${measurementType}, state: ${value ? 'Enabled' : 'Disabled'}`);
|
|
6323
|
+
return value;
|
|
6324
|
+
});
|
|
6325
|
+
meterConsumptionTotalService.getCharacteristic(Characteristic.MeterPhaseMode)
|
|
6326
|
+
.onGet(async () => {
|
|
6327
|
+
const value = meter.phaseMode;
|
|
6328
|
+
const info = this.disableLogInfo ? false : this.emit('info', `Meter: ${measurementType}, phase mode: ${value}`);
|
|
6329
|
+
return value;
|
|
6330
|
+
});
|
|
6331
|
+
meterConsumptionTotalService.getCharacteristic(Characteristic.MeterPhaseCount)
|
|
6332
|
+
.onGet(async () => {
|
|
6333
|
+
const value = meter.phaseCount;
|
|
6334
|
+
const info = this.disableLogInfo ? false : this.emit('info', `Meter: ${measurementType}, phase count: ${value}`);
|
|
6335
|
+
return value;
|
|
6336
|
+
});
|
|
6337
|
+
meterConsumptionTotalService.getCharacteristic(Characteristic.MeterMeteringStatus)
|
|
6338
|
+
.onGet(async () => {
|
|
6339
|
+
const value = meter.meteringStatus;
|
|
6340
|
+
const info = this.disableLogInfo ? false : this.emit('info', `Meter: ${measurementType}, metering status: ${value}`);
|
|
6341
|
+
return value;
|
|
6342
|
+
});
|
|
6343
|
+
meterConsumptionTotalService.getCharacteristic(Characteristic.MeterStatusFlags)
|
|
6344
|
+
.onGet(async () => {
|
|
6345
|
+
const value = meter.statusFlags;
|
|
6346
|
+
const info = this.disableLogInfo ? false : this.emit('info', `Meter: ${measurementType}, status flag: ${value}`);
|
|
6347
|
+
return value;
|
|
6348
|
+
});
|
|
6349
|
+
if (meter.state) {
|
|
6350
|
+
meterConsumptionTotalService.getCharacteristic(Characteristic.MeterActivePower)
|
|
6351
|
+
.onGet(async () => {
|
|
6352
|
+
const value = meter.powerKw;
|
|
6353
|
+
const info = this.disableLogInfo ? false : this.emit('info', `Meter: ${measurementType}, active power: ${value} kW`);
|
|
6354
|
+
return value;
|
|
6355
|
+
});
|
|
6356
|
+
meterConsumptionTotalService.getCharacteristic(Characteristic.MeterApparentPower)
|
|
6357
|
+
.onGet(async () => {
|
|
6358
|
+
const value = meter.apparentPowerKw;
|
|
6359
|
+
const info = this.disableLogInfo ? false : this.emit('info', `Meter: ${measurementType}, apparent power: ${value} kVA`);
|
|
6360
|
+
return value;
|
|
6361
|
+
});
|
|
6362
|
+
meterConsumptionTotalService.getCharacteristic(Characteristic.MeterReactivePower)
|
|
6363
|
+
.onGet(async () => {
|
|
6364
|
+
const value = meter.reactivePowerKw;
|
|
6365
|
+
const info = this.disableLogInfo ? false : this.emit('info', `Meter: ${measurementType}, reactive power: ${value} kVAr`);
|
|
6366
|
+
return value;
|
|
6367
|
+
});
|
|
6368
|
+
meterConsumptionTotalService.getCharacteristic(Characteristic.MeterCurrent)
|
|
6369
|
+
.onGet(async () => {
|
|
6370
|
+
const value = meter.current;
|
|
6371
|
+
const info = this.disableLogInfo ? false : this.emit('info', `Meter: ${measurementType}, current: ${value} A`);
|
|
6372
|
+
return value;
|
|
6373
|
+
});
|
|
6374
|
+
meterConsumptionTotalService.getCharacteristic(Characteristic.MeterVoltage)
|
|
6375
|
+
.onGet(async () => {
|
|
6376
|
+
const value = meter.voltage;
|
|
6377
|
+
const info = this.disableLogInfo ? false : this.emit('info', `Meter: ${measurementType}, voltage: ${value} V`);
|
|
6378
|
+
return value;
|
|
6379
|
+
});
|
|
6380
|
+
meterConsumptionTotalService.getCharacteristic(Characteristic.MeterFrequency)
|
|
6381
|
+
.onGet(async () => {
|
|
6382
|
+
const value = meter.frequency;
|
|
6383
|
+
const info = this.disableLogInfo ? false : this.emit('info', `Meter: ${measurementType}, frequency: ${value} Hz`);
|
|
6384
|
+
return value;
|
|
6385
|
+
});
|
|
6386
|
+
meterConsumptionTotalService.getCharacteristic(Characteristic.MeterPwrFactor)
|
|
6387
|
+
.onGet(async () => {
|
|
6388
|
+
const value = meter.pwrFactor;
|
|
6389
|
+
const info = this.disableLogInfo ? false : this.emit('info', `Meter: ${measurementType}, power factor: ${value} cos φ`);
|
|
6390
|
+
return value;
|
|
6391
|
+
});
|
|
6392
|
+
meterConsumptionTotalService.getCharacteristic(Characteristic.MeterReadingTime)
|
|
6393
|
+
.onGet(async () => {
|
|
6394
|
+
const value = meter.readingTime;
|
|
6395
|
+
const info = this.disableLogInfo ? false : this.emit('info', `Meter: ${measurementType}, last report: ${value}`);
|
|
6396
|
+
return value;
|
|
6397
|
+
});
|
|
6398
|
+
}
|
|
6399
|
+
this.metersConsumptionTotalServices = (metersConsumptionTotalServices);
|
|
6400
|
+
}
|
|
6401
|
+
|
|
6402
|
+
//storage
|
|
6403
|
+
if (metersStorageEnabled) {
|
|
6404
|
+
const meter = this.pv.meters.acBatterie;
|
|
6405
|
+
const measurementType = meter.measurementType;
|
|
6406
|
+
const debug = this.enableDebugMode ? this.emit('debug', `Prepare Meter ${measurementType} Service`) : false;
|
|
6407
|
+
const meterStorageService = accessory.addService(Service.MeterService, `Meter ${measurementType}`, `meterStorageService${measurementType}`);
|
|
6408
|
+
meterStorageService.setCharacteristic(Characteristic.ConfiguredName, `Meter ${measurementType}`);
|
|
6409
|
+
meterStorageService.getCharacteristic(Characteristic.MeterState)
|
|
6410
|
+
.onGet(async () => {
|
|
6411
|
+
const value = meter.state;
|
|
6412
|
+
const info = this.disableLogInfo ? false : this.emit('info', `Meter: ${measurementType}, state: ${value ? 'Enabled' : 'Disabled'}`);
|
|
6413
|
+
return value;
|
|
6414
|
+
});
|
|
6415
|
+
meterStorageService.getCharacteristic(Characteristic.MeterPhaseMode)
|
|
6416
|
+
.onGet(async () => {
|
|
6417
|
+
const value = meter.phaseMode;
|
|
6418
|
+
const info = this.disableLogInfo ? false : this.emit('info', `Meter: ${measurementType}, phase mode: ${value}`);
|
|
6419
|
+
return value;
|
|
6420
|
+
});
|
|
6421
|
+
meterStorageService.getCharacteristic(Characteristic.MeterPhaseCount)
|
|
6422
|
+
.onGet(async () => {
|
|
6423
|
+
const value = meter.phaseCount;
|
|
6424
|
+
const info = this.disableLogInfo ? false : this.emit('info', `Meter: ${measurementType}, phase count: ${value}`);
|
|
6425
|
+
return value;
|
|
6426
|
+
});
|
|
6427
|
+
meterStorageService.getCharacteristic(Characteristic.MeterMeteringStatus)
|
|
6428
|
+
.onGet(async () => {
|
|
6429
|
+
const value = meter.meteringStatus;
|
|
6430
|
+
const info = this.disableLogInfo ? false : this.emit('info', `Meter: ${measurementType}, metering status: ${value}`);
|
|
6431
|
+
return value;
|
|
6432
|
+
});
|
|
6433
|
+
meterStorageService.getCharacteristic(Characteristic.MeterStatusFlags)
|
|
6434
|
+
.onGet(async () => {
|
|
6435
|
+
const value = meter.statusFlags;
|
|
6436
|
+
const info = this.disableLogInfo ? false : this.emit('info', `Meter: ${measurementType}, status flag: ${value}`);
|
|
6437
|
+
return value;
|
|
6438
|
+
});
|
|
6439
|
+
if (meter.state) {
|
|
6440
|
+
meterStorageService.getCharacteristic(Characteristic.MeterActivePower)
|
|
6441
|
+
.onGet(async () => {
|
|
6442
|
+
const value = meter.powerKw;
|
|
6443
|
+
const info = this.disableLogInfo ? false : this.emit('info', `Meter: ${measurementType}, active power: ${value} kW`);
|
|
6444
|
+
return value;
|
|
6445
|
+
});
|
|
6446
|
+
meterStorageService.getCharacteristic(Characteristic.MeterApparentPower)
|
|
6447
|
+
.onGet(async () => {
|
|
6448
|
+
const value = meter.apparentPowerKw;
|
|
6449
|
+
const info = this.disableLogInfo ? false : this.emit('info', `Meter: ${measurementType}, apparent power: ${value} kVA`);
|
|
6450
|
+
return value;
|
|
6451
|
+
});
|
|
6452
|
+
meterStorageService.getCharacteristic(Characteristic.MeterReactivePower)
|
|
6453
|
+
.onGet(async () => {
|
|
6454
|
+
const value = meter.reactivePowerKw;
|
|
6455
|
+
const info = this.disableLogInfo ? false : this.emit('info', `Meter: ${measurementType}, reactive power: ${value} kVAr`);
|
|
6456
|
+
return value;
|
|
6457
|
+
});
|
|
6458
|
+
meterStorageService.getCharacteristic(Characteristic.MeterCurrent)
|
|
6459
|
+
.onGet(async () => {
|
|
6460
|
+
const value = meter.current;
|
|
6461
|
+
const info = this.disableLogInfo ? false : this.emit('info', `Meter: ${measurementType}, current: ${value} A`);
|
|
6462
|
+
return value;
|
|
6463
|
+
});
|
|
6464
|
+
meterStorageService.getCharacteristic(Characteristic.MeterVoltage)
|
|
6465
|
+
.onGet(async () => {
|
|
6466
|
+
const value = meter.voltage;
|
|
6467
|
+
const info = this.disableLogInfo ? false : this.emit('info', `Meter: ${measurementType}, voltage: ${value} V`);
|
|
6468
|
+
return value;
|
|
6469
|
+
});
|
|
6470
|
+
meterStorageService.getCharacteristic(Characteristic.MeterFrequency)
|
|
6471
|
+
.onGet(async () => {
|
|
6472
|
+
const value = meter.frequency;
|
|
6473
|
+
const info = this.disableLogInfo ? false : this.emit('info', `Meter: ${measurementType}, frequency: ${value} Hz`);
|
|
6474
|
+
return value;
|
|
6475
|
+
});
|
|
6476
|
+
meterStorageService.getCharacteristic(Characteristic.MeterPwrFactor)
|
|
6477
|
+
.onGet(async () => {
|
|
6478
|
+
const value = meter.pwrFactor;
|
|
6479
|
+
const info = this.disableLogInfo ? false : this.emit('info', `Meter: ${measurementType}, power factor: ${value} cos φ`);
|
|
6480
|
+
return value;
|
|
6481
|
+
});
|
|
6482
|
+
meterStorageService.getCharacteristic(Characteristic.MeterReadingTime)
|
|
6483
|
+
.onGet(async () => {
|
|
6484
|
+
const value = meter.readingTime;
|
|
6485
|
+
const info = this.disableLogInfo ? false : this.emit('info', `Meter: ${measurementType}, last report: ${value}`);
|
|
6486
|
+
return value;
|
|
6487
|
+
});
|
|
6488
|
+
}
|
|
6489
|
+
this.metersStorageServices = (metersStorageServices);
|
|
6012
6490
|
}
|
|
6013
6491
|
}
|
|
6014
6492
|
|