Skip to content

Commit fe441e1

Browse files
authored
emeter-index for ShellyEM
add a specific emeter-index for ShellyEM
1 parent 174cf0b commit fe441e1

3 files changed

Lines changed: 24 additions & 11 deletions

File tree

CHANGELOG.md

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,13 +5,16 @@
55
* support Home Assistant over HTTPS (https://github.com/reserve85/HoymilesZeroExport/issues/178)
66
* Support login credentials for Tasmota (https://github.com/reserve85/HoymilesZeroExport/issues/159)
77
* update.sh supports custom branch, for example to update to dev path. usage: ./update.sh dev
8-
* option to disable a inverter
8+
* option to disable a inverter (@tester277)
9+
* option to specify a specific emeter-index for ShellyEM [possible values: 0...1]. (https://github.com/reserve85/HoymilesZeroExport/issues/181)
910
### config
1011
* add `[HOMEASSISTANT]`: `HA_HTTPS`
1112
* add `[INTERMEDIATE_HOMEASSISTANT]`: `HA_HTTPS_INTERMEDIATE`
1213
* add `[TASMOTA]`: `USER` and `PASS`
1314
* add `[TASMOTA_INTERMEDIATE]`: `USER_INTERMEDIATE` and `PASS_INTERMEDIATE`
1415
* add `[INVERTER_x]`: `ENABLED`
16+
* add `[SHELLY]`: `EMETER_INDEX`
17+
* add `[INTERMEDIATE_SHELLY]`: `EMETER_INDEX`
1518

1619
## V1.90
1720
### script

HoymilesZeroExport.py

Lines changed: 16 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -656,10 +656,11 @@ def GetPowermeterWatts(self):
656656
return CastToInt(input - ouput)
657657

658658
class Shelly(Powermeter):
659-
def __init__(self, ip: str, user: str, password: str):
659+
def __init__(self, ip: str, user: str, password: str, emeterindex: str):
660660
self.ip = ip
661661
self.user = user
662662
self.password = password
663+
self.emeterindex = emeterindex
663664

664665
def GetJson(self, path):
665666
url = f'http://{self.ip}{path}'
@@ -684,7 +685,10 @@ def GetPowermeterWatts(self):
684685

685686
class ShellyEM(Shelly):
686687
def GetPowermeterWatts(self):
687-
return sum(CastToInt(emeter['power']) for emeter in self.GetJson('/status')['emeters'])
688+
if self.emeterindex:
689+
return CastToInt(self.GetJson(f'/emeter/{self.emeterindex}')['power'])
690+
else:
691+
return sum(CastToInt(emeter['power']) for emeter in self.GetJson('/status')['emeters'])
688692

689693
class Shelly3EM(Shelly):
690694
def GetPowermeterWatts(self):
@@ -1119,12 +1123,13 @@ def CreatePowermeter() -> Powermeter:
11191123
shelly_ip = config.get('SHELLY', 'SHELLY_IP')
11201124
shelly_user = config.get('SHELLY', 'SHELLY_USER')
11211125
shelly_pass = config.get('SHELLY', 'SHELLY_PASS')
1126+
shelly_emeterindex = config.get('SHELLY', 'EMETER_INDEX')
11221127
if config.getboolean('SELECT_POWERMETER', 'USE_SHELLY_EM'):
1123-
return ShellyEM(shelly_ip, shelly_user, shelly_pass)
1128+
return ShellyEM(shelly_ip, shelly_user, shelly_pass, shelly_emeterindex)
11241129
elif config.getboolean('SELECT_POWERMETER', 'USE_SHELLY_3EM'):
1125-
return Shelly3EM(shelly_ip, shelly_user, shelly_pass)
1130+
return Shelly3EM(shelly_ip, shelly_user, shelly_pass, shelly_emeterindex)
11261131
elif config.getboolean('SELECT_POWERMETER', 'USE_SHELLY_3EM_PRO'):
1127-
return Shelly3EMPro(shelly_ip, shelly_user, shelly_pass)
1132+
return Shelly3EMPro(shelly_ip, shelly_user, shelly_pass, shelly_emeterindex)
11281133
elif config.getboolean('SELECT_POWERMETER', 'USE_TASMOTA'):
11291134
return Tasmota(
11301135
config.get('TASMOTA', 'TASMOTA_IP'),
@@ -1189,6 +1194,7 @@ def CreateIntermediatePowermeter(dtu: DTU) -> Powermeter:
11891194
shelly_ip = config.get('INTERMEDIATE_SHELLY', 'SHELLY_IP_INTERMEDIATE')
11901195
shelly_user = config.get('INTERMEDIATE_SHELLY', 'SHELLY_USER_INTERMEDIATE')
11911196
shelly_pass = config.get('INTERMEDIATE_SHELLY', 'SHELLY_PASS_INTERMEDIATE')
1197+
shelly_emeterindex = config.get('INTERMEDIATE_SHELLY', 'EMETER_INDEX')
11921198
if config.getboolean('SELECT_INTERMEDIATE_METER', 'USE_TASMOTA_INTERMEDIATE'):
11931199
return Tasmota(
11941200
config.get('INTERMEDIATE_TASMOTA', 'TASMOTA_IP_INTERMEDIATE'),
@@ -1202,15 +1208,15 @@ def CreateIntermediatePowermeter(dtu: DTU) -> Powermeter:
12021208
config.getboolean('INTERMEDIATE_TASMOTA', 'TASMOTA_JSON_POWER_CALCULATE_INTERMEDIATE', fallback=False)
12031209
)
12041210
elif config.getboolean('SELECT_INTERMEDIATE_METER', 'USE_SHELLY_EM_INTERMEDIATE'):
1205-
return ShellyEM(shelly_ip, shelly_user, shelly_pass)
1211+
return ShellyEM(shelly_ip, shelly_user, shelly_pass, shelly_emeterindex)
12061212
elif config.getboolean('SELECT_INTERMEDIATE_METER', 'USE_SHELLY_3EM_INTERMEDIATE'):
1207-
return Shelly3EM(shelly_ip, shelly_user, shelly_pass)
1213+
return Shelly3EM(shelly_ip, shelly_user, shelly_pass, shelly_emeterindex)
12081214
elif config.getboolean('SELECT_INTERMEDIATE_METER', 'USE_SHELLY_3EM_PRO_INTERMEDIATE'):
1209-
return Shelly3EMPro(shelly_ip, shelly_user, shelly_pass)
1215+
return Shelly3EMPro(shelly_ip, shelly_user, shelly_pass, shelly_emeterindex)
12101216
elif config.getboolean('SELECT_INTERMEDIATE_METER', 'USE_SHELLY_1PM_INTERMEDIATE'):
1211-
return Shelly1PM(shelly_ip, shelly_user, shelly_pass)
1217+
return Shelly1PM(shelly_ip, shelly_user, shelly_pass, shelly_emeterindex)
12121218
elif config.getboolean('SELECT_INTERMEDIATE_METER', 'USE_SHELLY_PLUS_1PM_INTERMEDIATE'):
1213-
return ShellyPlus1PM(shelly_ip, shelly_user, shelly_pass)
1219+
return ShellyPlus1PM(shelly_ip, shelly_user, shelly_pass, shelly_emeterindex)
12141220
elif config.getboolean('SELECT_INTERMEDIATE_METER', 'USE_ESPHOME_INTERMEDIATE'):
12151221
return ESPHome(
12161222
config.get('INTERMEDIATE_ESPHOME', 'ESPHOME_IP_INTERMEDIATE'),

HoymilesZeroExport_Config.ini

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,8 @@ SHELLY_IP = xxx.xxx.xxx.xxx
7878
# if you restricted the web login enter your username and password, for Shelly "Generation 2" devices the username is always "admin" (e.g. Shelly pro 3EM)
7979
SHELLY_USER =
8080
SHELLY_PASS =
81+
# you can specify a specific emeter-index [possible values: 0...1] (if you have a Shelly-EM). If not defined, totalpower is calculated over all inputs.
82+
EMETER_INDEX =
8183

8284
[SHRDZM]
8385
# --- defines for SHRDZM Smartmeter Modul ---
@@ -170,6 +172,8 @@ SHELLY_IP_INTERMEDIATE = xxx.xxx.xxx.xxx
170172
# if you restricted the web login enter your username and password, for Shelly "Generation 2" devices the username is always "admin" (e.g. Shelly pro 3EM)
171173
SHELLY_USER_INTERMEDIATE =
172174
SHELLY_PASS_INTERMEDIATE =
175+
# you can specify a specific emeter-index [possible values: 0...1] (if you have a Shelly-EM). If not defined, totalpower is calculated over all inputs.
176+
EMETER_INDEX =
173177

174178
[INTERMEDIATE_ESPHOME]
175179
ESPHOME_IP_INTERMEDIATE = xxx.xxx.xxx.xxx

0 commit comments

Comments
 (0)