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 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 = !enableDebugMode ? false : log.info(`Device: ${host} ${deviceName}, debug: ${data ? `${debug} ${JSON.stringify(data, null, 2)}` : `${debug}.`}`);
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.21",
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",
@@ -697,7 +697,12 @@ class EnvoyDevice extends EventEmitter {
697
697
  enabled: false,
698
698
  voltageDivide: 1
699
699
  },
700
- consumption: {
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
- consumption: {},
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 meters = response.data;
1893
- const debug = this.enableDebugMode ? this.emit('debug', `Meters:`, meters) : false;
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 = meters.length > 0;
1907
+ const metersSupported = responseData.length > 0;
1897
1908
  if (metersSupported) {
1898
1909
 
1899
1910
  //meters
1900
1911
  const arr = [];
1901
- meters.forEach((meter, index) => {
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 consumption = measurementType === 'Consumption Net';
1931
- if (consumption) {
1932
- this.pv.meters.consumption = obj;
1933
- this.feature.meters.consumption.supported = true;
1934
- this.feature.meters.consumption.enabled = obj.state;
1935
- this.feature.meters.consumption.voltageDivide = obj.phaseMode !== 'Split' ? obj.phaseCount : 1;
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 = meters.length;
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', meters) : false;
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', meters) : false;
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 metersReading = response.data;
1985
- const debug = this.enableDebugMode ? this.emit('debug', `Meters reading:`, metersReading) : false;
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 = metersReading.length > 0;
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.readings = obj;
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.consumption.readings = obj;
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.readings = obj;
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', metersReading) : false;
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', metersReading) : false;
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.consumption.enabled;
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.consumption.readings.frequency
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.consumption.enabled) {
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.consumption.enabled;
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.consumption.readings : consumption;
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.consumption.enabled ? activeDeviceTypes.push({ type: 'Grid', meter: liveDataMeters.grid }) : false;
4107
- const pushLoadTypeToArray = this.feature.meters.installed && this.feature.meters.consumption.enabled ? activeDeviceTypes.push({ type: 'Load', meter: liveDataMeters.load }) : false;
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.consumption.supported ? this.emit('devInfo', `Consumption: ${this.feature.meters.consumption.enabled ? `Enabled` : `Disabled`}`) : false;
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 metersConsumptionEnabled = this.feature.meters.consumption.enabled;
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
- this.metersServices = [];
5926
- for (const meter of this.pv.meters.data) {
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 meterService = accessory.addService(Service.MeterService, `Meter ${measurementType}`, `meterService${measurementType}`);
5930
- meterService.setCharacteristic(Characteristic.ConfiguredName, `Meter ${measurementType}`);
5931
- meterService.getCharacteristic(Characteristic.MeterState)
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
- meterService.getCharacteristic(Characteristic.MeterPhaseMode)
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
- meterService.getCharacteristic(Characteristic.MeterPhaseCount)
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
- meterService.getCharacteristic(Characteristic.MeterMeteringStatus)
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
- meterService.getCharacteristic(Characteristic.MeterStatusFlags)
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
- meterService.getCharacteristic(Characteristic.MeterActivePower)
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
- meterService.getCharacteristic(Characteristic.MeterApparentPower)
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
- meterService.getCharacteristic(Characteristic.MeterReactivePower)
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
- meterService.getCharacteristic(Characteristic.MeterCurrent)
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
- meterService.getCharacteristic(Characteristic.MeterVoltage)
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
- meterService.getCharacteristic(Characteristic.MeterFrequency)
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
- meterService.getCharacteristic(Characteristic.MeterPwrFactor)
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
- meterService.getCharacteristic(Characteristic.MeterReadingTime)
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.metersServices.push(meterService);
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