Skip to content

Commit

Permalink
remove functionality to toggle relays with CCL/DCL signals.
Browse files Browse the repository at this point in the history
  • Loading branch information
izak committed Mar 15, 2021
1 parent 4d50ca3 commit 060112a
Show file tree
Hide file tree
Showing 3 changed files with 5 additions and 113 deletions.
25 changes: 1 addition & 24 deletions delegates/dvcc.py
Expand Up @@ -20,7 +20,6 @@
# message, so the update rate could be increased. For now, keep this at 3 and
# above.
ADJUST = 3
BMS_TIMEOUT = 60

VEBUS_FIRMWARE_REQUIRED = 0x422
VEDIRECT_FIRMWARE_REQUIRED = 0x129
Expand Down Expand Up @@ -611,7 +610,6 @@ def __init__(self, sc):
self._vecan_services = []
self._timer = None
self._tickcount = ADJUST
self._bmscount = BMS_TIMEOUT

def get_input(self):
return [
Expand Down Expand Up @@ -670,8 +668,6 @@ def set_sources(self, dbusmonitor, settings, dbusservice):
self._dbusservice.add_path('/Control/EffectiveChargeVoltage', value=None)
self._dbusservice.add_path('/Control/BmsParameters', value=0)
self._dbusservice.add_path('/Control/MaxChargeCurrent', value=0)
self._dbusservice.add_path('/Control/BmsPresent', value=0)
self._dbusservice.add_path('/Control/BmsService', value=None)
self._dbusservice.add_path('/Control/Dvcc', value=1)
self._dbusservice.add_path('/Debug/BatteryOperationalLimits/SolarVoltageOffset', value=0, writeable=True)
self._dbusservice.add_path('/Debug/BatteryOperationalLimits/VebusVoltageOffset', value=0, writeable=True)
Expand Down Expand Up @@ -740,27 +736,7 @@ def bms(self):
return None

def _on_timer(self):
from delegates import RelayState
bol_support = self.has_dvcc
bms_service = self.bms

# Toggle relays if so configured. Do this early because we want
# this to work even if DVCC is off.
if bms_service is None:
self._bmscount = max(self._bmscount - 1, 0)
if not self._bmscount:
self._dbusservice['/Control/BmsPresent'] = 0
self._dbusservice['/Control/BmsService'] = None
RelayState.instance.set_function(RelayState.FUNCTION_BMS_STOPCHARGE, 1)
RelayState.instance.set_function(RelayState.FUNCTION_BMS_STOPDISCHARGE, 1)
else:
self._bmscount = BMS_TIMEOUT
self._dbusservice['/Control/BmsPresent'] = 1
self._dbusservice['/Control/BmsService'] = bms_service.service
RelayState.instance.set_function(
RelayState.FUNCTION_BMS_STOPCHARGE, int(bms_service.maxchargecurrent == 0))
RelayState.instance.set_function(
RelayState.FUNCTION_BMS_STOPDISCHARGE, int(bms_service.maxdischargecurrent == 0))

self._tickcount -= 1; self._tickcount %= ADJUST

Expand Down Expand Up @@ -801,6 +777,7 @@ def _on_timer(self):
if user_max_charge_current < 0: user_max_charge_current = None

# If there is a BMS, get the charge voltage and current from it
bms_service = self.bms
max_charge_current = None
charge_voltage = None
feedback_allowed = self.feedback_allowed
Expand Down
31 changes: 4 additions & 27 deletions delegates/relaystate.py
Expand Up @@ -11,10 +11,6 @@

class RelayState(SystemCalcDelegate):
RELAY_GLOB = '/dev/gpio/relay_*'
FUNCTION_ALARM = 0
FUNCTION_MANUAL = 2
FUNCTION_BMS_STOPCHARGE = 4
FUNCTION_BMS_STOPDISCHARGE = 5

def __init__(self):
SystemCalcDelegate.__init__(self)
Expand All @@ -23,8 +19,7 @@ def __init__(self):
def get_input(self):
return [
('com.victronenergy.settings', [
'/Settings/Relay/Function',
'/Settings/Relay/1/Function'])] # Managed by the gui
'/Settings/Relay/Function'])] # Managed by the gui

def get_settings(self):
return [
Expand All @@ -37,11 +32,6 @@ def relay_function(self):
return self._dbusmonitor.get_value('com.victronenergy.settings',
'/Settings/Relay/Function')

@property
def relay1_function(self):
return self._dbusmonitor.get_value('com.victronenergy.settings',
'/Settings/Relay/1/Function')

def set_sources(self, dbusmonitor, settings, dbusservice):
SystemCalcDelegate.set_sources(self, dbusmonitor, settings, dbusservice)
relays = sorted(glob(self.RELAY_GLOB))
Expand All @@ -60,33 +50,20 @@ def set_sources(self, dbusmonitor, settings, dbusservice):

logging.info('Relays found: {}'.format(', '.join(self._relays.values())))

def set_relay(self, dbus_path, state):
self._dbusservice[dbus_path] = state
self.__on_relay_state_changed(dbus_path, state)

def set_function(self, func, state):
""" Find a relay bound to the relevant function, and set state. """
for p, r in ((self.relay_function, '/Relay/0/State'),
(self.relay1_function, '/Relay/1/State')):
if p == func and self._dbusservice[r] != state:
self.set_relay(r, state)

def _init_relay_state(self):
if self.relay_function is None:
return True # Try again on the next idle event

for dbus_path, path in self._relays.iteritems():
if dbus_path == '/Relay/0/State' and self.relay_function != self.FUNCTION_MANUAL:
if self.relay_function != 2 and dbus_path == '/Relay/0/State':
continue # Skip primary relay if function is not manual
if dbus_path == '/Relay/1/State' and self.relay1_function != self.FUNCTION_MANUAL:
continue # Skip secondary relay if function is not manual

try:
state = self._settings[dbus_path]
except KeyError:
pass
else:
self.set_relay(dbus_path, state)
self._dbusservice[dbus_path] = state
self.__on_relay_state_changed(dbus_path, state)

# Sync state back to dbus
self._update_relay_state()
Expand Down
62 changes: 0 additions & 62 deletions tests/relaystate_test.py
Expand Up @@ -36,7 +36,6 @@ def setUp(self):

self._add_device('com.victronenergy.settings', values={
'/Settings/Relay/Function': 1, # Generator
'/Settings/Relay/1/Function': 2 # Manual
})

self.gpio_dir = tempfile.mkdtemp()
Expand Down Expand Up @@ -102,8 +101,6 @@ def test_relay_init(self):

self._monitor.set_value('com.victronenergy.settings',
'/Settings/Relay/Function', 2) # Manual
self._monitor.set_value('com.victronenergy.settings',
'/Settings/Relay/1/Function', 2) # Manual

self._set_setting('/Settings/Relay/0/InitialState', 0)
self._set_setting('/Settings/Relay/1/InitialState', 1)
Expand All @@ -125,62 +122,3 @@ def test_relay_init_no_manual(self):
self._update_values(5000)
self.assertEqual(self._service['/Relay/0/State'], 1) # Unaffected
self.assertEqual(file(self.gpio1_state, 'rt').read(), '1') # Unaffected

def test_relay_bms_calls(self):
rs = RelayState()
rs.set_sources(self._monitor, self._system_calc._settings, self._service)

self._monitor.set_value('com.victronenergy.settings',
'/Settings/Relay/Function', 4) # Stop charge
self._monitor.set_value('com.victronenergy.settings',
'/Settings/Relay/1/Function', 5) # Stop discharge

rs.set_function(rs.FUNCTION_BMS_STOPCHARGE, 0)
rs.set_function(rs.FUNCTION_BMS_STOPDISCHARGE, 0)
self.assertEqual(self._service['/Relay/0/State'], 0)
self.assertEqual(self._service['/Relay/1/State'], 0)

rs.set_function(rs.FUNCTION_BMS_STOPCHARGE, 1)
rs.set_function(rs.FUNCTION_BMS_STOPDISCHARGE, 1)
self.assertEqual(self._service['/Relay/0/State'], 1)
self.assertEqual(self._service['/Relay/1/State'], 1)

def test_relay_bms_control(self):
rs = RelayState()
rs.set_sources(self._monitor, self._system_calc._settings, self._service)

self._monitor.set_value('com.victronenergy.settings',
'/Settings/Relay/Function', 4) # Stop charge
self._monitor.set_value('com.victronenergy.settings',
'/Settings/Relay/1/Function', 5) # Stop discharge

self._add_device('com.victronenergy.battery.ttyO2',
product_name='battery',
values={
'/Dc/0/Voltage': 58.1,
'/Dc/0/Current': 5.3,
'/Dc/0/Power': 65,
'/Soc': 15.3,
'/DeviceInstance': 2,
'/Info/BatteryLowVoltage': 47,
'/Info/MaxChargeCurrent': 45,
'/Info/MaxChargeVoltage': 58.2,
'/Info/MaxDischargeCurrent': 50})

self._update_values(3000)
self.assertEqual(self._service['/Relay/0/State'], 0)
self.assertEqual(self._service['/Relay/1/State'], 0)

self._monitor.set_value('com.victronenergy.battery.ttyO2',
'/Info/MaxChargeCurrent', 0.0)
self._update_values(3000)
self.assertEqual(self._service['/Relay/0/State'], 1)
self.assertEqual(self._service['/Relay/1/State'], 0)

self._monitor.set_value('com.victronenergy.battery.ttyO2',
'/Info/MaxChargeCurrent', 45.0)
self._monitor.set_value('com.victronenergy.battery.ttyO2',
'/Info/MaxDischargeCurrent', 0.0)
self._update_values(3000)
self.assertEqual(self._service['/Relay/0/State'], 0)
self.assertEqual(self._service['/Relay/1/State'], 1)

0 comments on commit 060112a

Please sign in to comment.