Skip to content

Commit

Permalink
Rebase PR ngardiner#220 to main
Browse files Browse the repository at this point in the history
  • Loading branch information
RichieB2B committed May 20, 2023
1 parent 23eaea2 commit 572f303
Show file tree
Hide file tree
Showing 5 changed files with 138 additions and 1 deletion.
45 changes: 45 additions & 0 deletions etc/twcmanager/config.json
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,32 @@
# wiringMaxAmpsPerTWC = 50 * 0.8 = 40 and wiringMaxAmpsAllTWCs = 40 + 40 = 80.
"wiringMaxAmpsPerTWC": 6,


# If you what to limit the power drawn from the Grid you need to set this
# maxAmpsAllowedFromGrid and extend the policy you what it to apply, i.e.:
# { "name": "Charge Now with Grid power limit",
# "match": [
# "settings.chargeNowAmps",
# "settings.chargeNowTimeEnd",
# "settings.chargeNowTimeEnd",
# ],
# "condition": ["gt", "gt", "gt"],
# "value": [0, 0, "now"],
# "background_task": "checkMaxPowerFromGrid",
# "charge_amps": "settings.chargeNowAmps",
# "charge_limit": "config.chargeNowLimit"},

# { "name": "Scheduled Charging with Grid power limit",
# "match": [ "checkScheduledCharging()" ],
# "condition": [ "eq" ],
# "value": [ 1 ],
# "background_task": "checkMaxPowerFromGrid",
# "charge_amps": "settings.scheduledAmpsMax",
# "charge_limit": "config.scheduledLimit"},

"maxAmpsAllowedFromGrid": 15,


# https://teslamotorsclub.com/tmc/threads/model-s-gen2-charger-efficiency-testing.78740/#post-1844789
# says you're using 10.85% more power (91.75/82.77=1.1085) charging at 5A vs 40A,
# 2.48% more power at 10A vs 40A, and 1.9% more power at 20A vs 40A. This is
Expand Down Expand Up @@ -294,6 +320,25 @@
#
# They should primarily be used to abort charging when necessary.
"emergency":[
{ "name": "Charge Now with Grid power limit",
"match": [
"settings.chargeNowAmps",
"settings.chargeNowTimeEnd",
"settings.chargeNowTimeEnd",
],
"condition": ["gt", "gt", "gt"],
"value": [0, 0, "now"],
"background_task": "checkMaxPowerFromGrid",
"charge_amps": "settings.chargeNowAmps",
"charge_limit": "config.chargeNowLimit"},

{ "name": "Scheduled Charging with Grid power limit",
"match": [ "checkScheduledCharging()" ],
"condition": [ "eq" ],
"value": [ 1 ],
"background_task": "checkMaxPowerFromGrid",
"charge_amps": "settings.scheduledAmpsMax",
"charge_limit": "config.scheduledLimit"},
],
# Rules in the before section here are evaluated after the Charge Now rule
"before":[
Expand Down
2 changes: 1 addition & 1 deletion lib/TWCManager/Control/themes/Default/jsrefresh.html.j2
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ $(document).ready(function() {
}
// Change the state of the Charge Now button based on Charge Policy
if (json["currentPolicy"] == "Charge Now") {
if (json["currentPolicy"] == "Charge Now" || json["currentPolicy"] == "Charge Now with Grid power limit") {
document.getElementById("start_chargenow").value = "Update Charge Now";
document.getElementById("cancel_chargenow").disabled = false;
} else {
Expand Down
30 changes: 30 additions & 0 deletions lib/TWCManager/TWCManager.py
Original file line number Diff line number Diff line change
Expand Up @@ -166,6 +166,16 @@

logging.getLogger().setLevel(logLevel)




########################################################################
# Write the PID in order to let a supervisor restart it in case of crash
PIDfile=config["config"]["settingsPath"] + "/TWCManager.pid"
PIDTWCManager=open(PIDfile,"w")
PIDTWCManager.write(str(os.getpid()))
PIDTWCManager.close()

# All TWCs ship with a random two-byte TWCID. We default to using 0x7777 as our
# fake TWC ID. There is a 1 in 64535 chance that this ID will match each real
# TWC on the network, in which case you should pick a different random id below.
Expand Down Expand Up @@ -321,6 +331,8 @@ def background_tasks_thread(master):
master.saveSettings()
elif task["cmd"] == "sunrise":
update_sunrise_sunset()
elif task["cmd"] == "checkMaxPowerFromGrid":
check_max_power_from_grid()

except:
logger.info(
Expand Down Expand Up @@ -359,6 +371,24 @@ def check_green_energy():
master.setMaxAmpsToDivideAmongSlaves(master.getMaxAmpsToDivideGreenEnergy())


def check_max_power_from_grid():
global config, hass, master

# Check solar panel generation using an API exposed by
# the HomeAssistant API.
#
# You may need to customize the sensor entity_id values
# to match those used in your environment. This is configured
# in the config section at the top of this file.
#
# Poll all loaded EMS modules for consumption and generation values
for module in master.getModulesByType("EMS"):
master.setConsumption(module["name"], module["ref"].getConsumption())
master.setGeneration(module["name"], module["ref"].getGeneration())
master.setMaxAmpsToDivideFromGrid(master.getMaxAmpsToDivideFromGrid())



def update_statuses():
# Print a status update if we are on track green energy showing the
# generation and consumption figures
Expand Down
38 changes: 38 additions & 0 deletions lib/TWCManager/TWCMaster.py
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,7 @@ class TWCMaster:
lastUpdateCheck = 0
masterTWCID = ""
maxAmpsToDivideAmongSlaves = 0
maxAmpsToDivideFromGrid = 0
modules = {}
nextHistorySnap = 0
overrideMasterHeartbeatData = b""
Expand Down Expand Up @@ -645,6 +646,27 @@ def getMaxAmpsToDivideGreenEnergy(self):
amps = max(min(newOffer, solarAmps / self.getRealPowerFactor(solarAmps)), 0)
return round(amps, 2)

def getMaxAmpsToDivideFromGrid(self):
# Calculate our current generation and consumption in watts
generationW = float(self.getGeneration())
consumptionW = float(self.getConsumption())

currentOffer = min(
self.getTotalAmpsInUse(),
self.getMaxAmpsToDivideAmongSlaves(),
)

# Calculate what we should max offer to align with max grid energy
maxAmpsAllowedFromGrid = self.config["config"]["maxAmpsAllowedFromGrid"]
amps = maxAmpsAllowedFromGrid - consumptionA + currentOffer
if consumptionA > maxAmpsAllowedFromGrid:
logger.info(f"getMaxAmpsToDivideFromGrid limited power: consumption {consumptionA:.1f}A > {maxAmpsAllowedFromGrid}A")
amps = amps / self.getRealPowerFactor(amps)
logger.debug("MaxAmpsToDivideFromGrid: +++++++++++++++: " + str(amps))

return round(amps, 2)


def getNormalChargeLimit(self, ID):
if "chargeLimits" in self.settings and str(ID) in self.settings["chargeLimits"]:
result = self.settings["chargeLimits"][str(ID)]
Expand Down Expand Up @@ -1309,6 +1331,17 @@ def setMaxAmpsToDivideAmongSlaves(self, amps):
)
amps = self.config["config"]["wiringMaxAmpsAllTWCs"]

activePolicy=str(self.getModuleByName("Policy").active_policy)
if (activePolicy == "Charge Now with Grid power limit" or \
activePolicy == "Scheduled Charging with Grid power limit") and \
amps > self.maxAmpsToDivideFromGrid:
# Never tell the slaves to draw more amps from grid than allowed
amps = self.maxAmpsToDivideFromGrid
logger.info(
"maxAmpsToDivideAmongSlaves limited to not draw more power from the grid than allowed: " + str(amps)
)


self.maxAmpsToDivideAmongSlaves = amps

self.releaseBackgroundTasksLock()
Expand All @@ -1317,6 +1350,11 @@ def setMaxAmpsToDivideAmongSlaves(self, amps):
# to console / MQTT / etc
self.queue_background_task({"cmd": "updateStatus"})

def setMaxAmpsToDivideFromGrid(self, amps):
# This is called when check_max_power_from_grid is run
# It stablished how much power we allow getting from the grid
self.maxAmpsToDivideFromGrid = amps

def setNonScheduledAmpsMax(self, amps):
self.settings["nonScheduledAmpsMax"] = amps

Expand Down
24 changes: 24 additions & 0 deletions svisorTWC.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
PROGRAM=/usr/bin/python3.5
PIDFILE=/etc/twcmanager/TWCManager.pid
TWCMANAGER_PATH=/home/pi/TWCManager

while true
do

if [ -f $PIDFILE ]; then
read PID <$PIDFILE
echo $PID
if [ -d /proc/$PID ] && [ "$(readlink -f /proc/$PID/exe)" = "$PROGRAM" ]; then
echo "done."
else
echo "PID not found, Starting..."
screen -dm -S TWCManager $TWCMANAGER_PATH/TWCManager.py
fi
else
echo "PID file not found "; echo $PIDFILE; echo ", Starting..."
screen -dm -S TWCManager $TWCMANAGER_PATH/TWCManager.py
fi
sleep 30
done


0 comments on commit 572f303

Please sign in to comment.