diff --git a/etc/dbus-serialbattery/battery.py b/etc/dbus-serialbattery/battery.py index 3963d6ad..998666fb 100644 --- a/etc/dbus-serialbattery/battery.py +++ b/etc/dbus-serialbattery/battery.py @@ -36,6 +36,7 @@ def __init__(self, port, baud): self.role = 'battery' self.type = 'Generic' self.poll_interval = 1000 + self.online = True self.hardware_version = None self.voltage = None diff --git a/etc/dbus-serialbattery/dbus-serialbattery.py b/etc/dbus-serialbattery/dbus-serialbattery.py index baa591af..826cf3eb 100644 --- a/etc/dbus-serialbattery/dbus-serialbattery.py +++ b/etc/dbus-serialbattery/dbus-serialbattery.py @@ -80,7 +80,7 @@ def get_port(): # exit if no battery could be found if battery is None: logger.error("ERROR >>> No battery connection at " + port) - return + sys.exit(1) # Have a mainloop, so we can send/receive asynchronous calls to and from dbus DBusGMainLoop(set_as_default=True) @@ -92,7 +92,7 @@ def get_port(): helper = DbusHelper(battery) if not helper.setup_vedbus(): logger.error("ERROR >>> Problem with battery set up at " + port) - return + sys.exit(1) logger.warning('Battery connected to dbus from ' + port) diff --git a/etc/dbus-serialbattery/dbushelper.py b/etc/dbus-serialbattery/dbushelper.py index f83fab92..480f7ffd 100755 --- a/etc/dbus-serialbattery/dbushelper.py +++ b/etc/dbus-serialbattery/dbushelper.py @@ -43,13 +43,13 @@ def get_role_instance(self): def handle_changed_setting(self, setting, oldvalue, newvalue): if setting == 'instance': self.battery.role, self.instance = self.get_role_instance() - self._dbusservice['/DeviceInstance'] = self.instance logger.debug("DeviceInstance = %d", self.instance) return def setup_vedbus(self): # Set up dbus service and device instance # and notify of all the attributes we intend to update + # This is only called once when a battery is initiated self.setup_instance() logger.debug("%s" % ("com.victronenergy.battery." + self.battery.port[self.battery.port.rfind('/') + 1:])) @@ -135,11 +135,29 @@ def setup_vedbus(self): return True def publish_battery(self, loop): + # This is called every battery.poll_interval milli second as set up per battery type to read and update the data try: - self.battery.refresh_data() + error_count = 0 + # Call the battery's refresh_data function + success = self.battery.refresh_data() + if success: + error_count = 0 + self.battery.online = True + else: + error_count += 1 + # If the battery is offline for more than 10 polls (polled every second for most batteries) + if error_count >= 10: + self.battery.online = False + + + + + # This is to mannage CCCL self.battery.manage_charge_current() - # self.battery.manage_control_charging(max_voltage, min_voltage, total_voltage, balance) + + # publish all the data fro the battery object to dbus self.publish_dbus() + except: traceback.print_exc() loop.quit() @@ -172,6 +190,8 @@ def publish_dbus(self): (self.battery.charge_fet and self.battery.control_allow_charge) else 1 self._dbusservice['/System/NrOfModulesBlockingDischarge'] = 0 if self.battery.discharge_fet is None \ or self.battery.discharge_fet else 1 + self._dbusservice['/System/NrOfModulesOnline'] = 1 if self.battery.online else 0 + self._dbusservice['/System/NrOfModulesOffline'] = 0 if self.battery.online else 1 self._dbusservice['/System/MinCellTemperature'] = self.battery.get_min_temp() self._dbusservice['/System/MaxCellTemperature'] = self.battery.get_max_temp() diff --git a/etc/dbus-serialbattery/utils.py b/etc/dbus-serialbattery/utils.py index 638539a9..23c8a6c3 100644 --- a/etc/dbus-serialbattery/utils.py +++ b/etc/dbus-serialbattery/utils.py @@ -12,7 +12,7 @@ # Constants - Need to dynamically get them in future DRIVER_VERSION = 0.9 -DRIVER_SUBVERSION = '' +DRIVER_SUBVERSION = '.1' zero_char = chr(48) degree_sign = u'\N{DEGREE SIGN}' # Cell min/max voltages - used with the cell count to get the min/max battery voltage