Skip to content

Commit 4678ad8

Browse files
authored
add powermeter_min_point
## V1.94 ### script * add script functionality for a super high priority limit change if your powermeter falls below POWERMETER_MIN_POINT (#197) ### config * add `[CONTROL]`: `POWERMETER_MIN_POINT` * add `[COMMON]`: `ON_GRID_FEED_JUMP_TO_LIMIT_PERCENT`
1 parent b3c8efa commit 4678ad8

4 files changed

Lines changed: 60 additions & 4 deletions

File tree

CHANGELOG.md

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,12 @@
11
# Changelog
22

3+
## V1.94
4+
### script
5+
* add script functionality for a super high priority limit change if your powermeter falls below POWERMETER_MIN_POINT (https://github.com/reserve85/HoymilesZeroExport/issues/197)
6+
### config
7+
* add `[CONTROL]`: `POWERMETER_MIN_POINT`
8+
* add `[COMMON]`: `ON_GRID_FEED_JUMP_TO_LIMIT_PERCENT`
9+
310
## V1.93
411
### script
512
* support script for intermediate meter (https://github.com/reserve85/HoymilesZeroExport/issues/197)

HoymilesZeroExport.py

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@
1515
# along with this program. If not, see <http://www.gnu.org/licenses/>.
1616

1717
__author__ = "Tobias Kraft"
18-
__version__ = "1.93"
18+
__version__ = "1.94"
1919

2020
import requests
2121
import time
@@ -1435,8 +1435,10 @@ def CreateDTU() -> DTU:
14351435
while True:
14361436
CONFIG_PROVIDER.update()
14371437
on_grid_usage_jump_to_limit_percent = CONFIG_PROVIDER.on_grid_usage_jump_to_limit_percent()
1438+
on_grid_feed_jump_to_limit_percent = CONFIG_PROVIDER.on_grid_feed_jump_to_limit_percent()
14381439
powermeter_target_point = CONFIG_PROVIDER.get_powermeter_target_point()
14391440
powermeter_max_point = CONFIG_PROVIDER.get_powermeter_max_point()
1441+
powermeter_min_point = CONFIG_PROVIDER.get_powermeter_min_point()
14401442
powermeter_tolerance = CONFIG_PROVIDER.get_powermeter_tolerance()
14411443
if powermeter_max_point < (powermeter_target_point + powermeter_tolerance):
14421444
powermeter_max_point = powermeter_target_point + powermeter_tolerance + 50
@@ -1464,6 +1466,19 @@ def CreateDTU() -> DTU:
14641466
if RemainingDelay > 0:
14651467
time.sleep(RemainingDelay)
14661468
break
1469+
elif powermeterWatts < powermeter_min_point:
1470+
if on_grid_feed_jump_to_limit_percent > 0:
1471+
newLimitSetpoint = CastToInt(GetMaxInverterWattFromAllInverters() * on_grid_feed_jump_to_limit_percent / 100)
1472+
if (newLimitSetpoint >= PreviousLimitSetpoint) and (on_grid_feed_jump_to_limit_percent != 100):
1473+
newLimitSetpoint = PreviousLimitSetpoint + powermeterWatts - powermeter_target_point
1474+
else:
1475+
newLimitSetpoint = PreviousLimitSetpoint + powermeterWatts - powermeter_target_point
1476+
newLimitSetpoint = ApplyLimitsToSetpoint(newLimitSetpoint)
1477+
SetLimit(newLimitSetpoint)
1478+
RemainingDelay = CastToInt((LOOP_INTERVAL_IN_SECONDS / POLL_INTERVAL_IN_SECONDS - x) * POLL_INTERVAL_IN_SECONDS)
1479+
if RemainingDelay > 0:
1480+
time.sleep(RemainingDelay)
1481+
break
14671482
else:
14681483
time.sleep(POLL_INTERVAL_IN_SECONDS)
14691484

HoymilesZeroExport_Config.ini

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,8 +19,7 @@
1919
# ---------------------------------------------------------------------
2020

2121
[VERSION]
22-
VERSION = 1.93
23-
22+
VERSION = 1.94
2423
[SELECT_DTU]
2524
# --- define your DTU (only one) ---
2625
USE_AHOY = false
@@ -268,6 +267,9 @@ POLL_INTERVAL_IN_SECONDS = 1
268267
# if your powermeter exceeds POWERMETER_MAX_POINT: immediatelly set the limit to predefined percent of HOY_MAX_WATT (if you have more than one inverter it´s the sum of all HOY_MAX_WATT)
269268
# value = 0 disables the feature. Values are possible from [0 to 100]
270269
ON_GRID_USAGE_JUMP_TO_LIMIT_PERCENT = 100
270+
# if your powermeter falls below POWERMETER_MIN_POINT: immediatelly set the limit to predefined percent of HOY_MAX_WATT (if you have more than one inverter it´s the sum of all HOY_MAX_WATT)
271+
# value = 0 disables the feature. Values are possible from [0 to 100]
272+
ON_GRID_FEED_JUMP_TO_LIMIT_PERCENT = 0
271273
# max difference between Limit and real output power in % of HOY_MAX_WATT (100 = disabled)
272274
MAX_DIFFERENCE_BETWEEN_LIMIT_AND_OUTPUTPOWER = 100
273275
# enable logging to file
@@ -299,6 +301,10 @@ POWERMETER_TOLERANCE = 25
299301
# if your powermeter jumps over this point, the limit will be increased instantly. it is like a "super high priority limit change".
300302
# if you defined ON_GRID_USAGE_JUMP_TO_LIMIT_PERCENT > 0, then the limit will jump to the defined percent when reaching this point.
301303
POWERMETER_MAX_POINT = 0
304+
# POWERMETER_MIN_POINT is the minimum power of your powermeter for the normal "regulation loop".
305+
# if your powermeter jumps under this point, the limit will be reduced instantly. it is like a "super high priority limit change".
306+
# if you defined ON_GRID_FEED_JUMP_TO_LIMIT_PERCENT > 0, then the limit will jump to the defined percent when it is lower than this point.
307+
POWERMETER_MIN_POINT = -600
302308

303309
# List of INVERTERS, based on COMMON/COUNT
304310
[INVERTER_1]

config_provider.py

Lines changed: 29 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,12 +25,26 @@ def get_powermeter_max_point(self):
2525
If you defined ON_GRID_USAGE_JUMP_TO_LIMIT_PERCENT > 0, then the limit will jump to the defined percent when reaching this point.
2626
"""
2727
pass
28+
29+
def get_powermeter_min_point(self):
30+
"""
31+
The minimum power of your powermeter for the normal "regulation loop".
32+
if your powermeter jumps under this point, the limit will be reduced instantly. it is like a "super high priority limit change".
33+
if you defined ON_GRID_FEED_JUMP_TO_LIMIT_PERCENT > 0, then the limit will jump to the defined percent when it is lower than this point.
34+
"""
35+
pass
2836

2937
def on_grid_usage_jump_to_limit_percent(self):
3038
"""
3139
If the powermeter jumps over the max point, the limit will be increased to this percent of the powermeter value.
3240
"""
3341
pass
42+
43+
def on_grid_feed_jump_to_limit_percent(self):
44+
"""
45+
If the powermeter falls below the min point, the limit will be increased to this percent of the powermeter value.
46+
"""
47+
pass
3448

3549
def get_powermeter_tolerance(self):
3650
"""
@@ -85,12 +99,18 @@ def get_powermeter_target_point(self):
8599

86100
def get_powermeter_max_point(self):
87101
return self.config.getint('CONTROL', 'POWERMETER_MAX_POINT')
102+
103+
def get_powermeter_min_point(self):
104+
return self.config.getint('CONTROL', 'POWERMETER_MIN_POINT')
88105

89106
def get_powermeter_tolerance(self):
90107
return self.config.getint('CONTROL', 'POWERMETER_TOLERANCE')
91108

92109
def on_grid_usage_jump_to_limit_percent(self):
93110
return self.config.getint('COMMON', 'ON_GRID_USAGE_JUMP_TO_LIMIT_PERCENT')
111+
112+
def on_grid_feed_jump_to_limit_percent(self):
113+
return self.config.getint('COMMON', 'ON_GRID_FEED_JUMP_TO_LIMIT_PERCENT')
94114

95115
def get_min_wattage_in_percent(self, inverter_idx):
96116
return self.config.getint('INVERTER_' + str(inverter_idx + 1), 'HOY_MIN_WATT_IN_PERCENT')
@@ -152,7 +172,7 @@ def cast_value(is_inverter_value, key, value):
152172
else:
153173
logger.error(f"Unknown inverter key {key}")
154174
else:
155-
if key in ['powermeter_target_point', 'powermeter_max_point', 'powermeter_tolerance', 'on_grid_usage_jump_to_limit_percent']:
175+
if key in ['powermeter_target_point', 'powermeter_max_point', 'powermeter_min_point', 'powermeter_tolerance', 'on_grid_usage_jump_to_limit_percent', 'on_grid_feed_jump_to_limit_percent']:
156176
return int(value)
157177
else:
158178
logger.error(f"Unknown common key {key}")
@@ -185,11 +205,17 @@ def get_powermeter_target_point(self):
185205
def get_powermeter_max_point(self):
186206
return self.common_config.get('powermeter_max_point')
187207

208+
def get_powermeter_min_point(self):
209+
return self.common_config.get('powermeter_min_point')
210+
188211
def get_powermeter_tolerance(self):
189212
return self.common_config.get('powermeter_tolerance')
190213

191214
def on_grid_usage_jump_to_limit_percent(self):
192215
return self.common_config.get('on_grid_usage_jump_to_limit_percent')
216+
217+
def on_grid_feed_jump_to_limit_percent(self):
218+
return self.common_config.get('on_grid_feed_jump_to_limit_percent')
193219

194220
def get_min_wattage_in_percent(self, inverter_idx):
195221
if inverter_idx >= len(self.inverter_config):
@@ -226,8 +252,10 @@ def __init__(self, mqtt_broker, mqtt_port, client_id, mqtt_username, mqtt_passwo
226252
self.reset_topic = reset_topic
227253
self.target_point = None
228254
self.max_point = None
255+
self.min_point = None
229256
self.tolerance = None
230257
self.on_grid_usage_jump_to_limit_percent = None
258+
self.on_grid_feed_jump_to_limit_percent = None
231259
self.min_wattage_in_percent = []
232260
self.normal_wattage = []
233261
self.reduce_wattage = []

0 commit comments

Comments
 (0)